Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 17 from a total of 17 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| New Public Pool | 12544315 | 1743 days ago | IN | 0 ETH | 0.0613686 | ||||
| New Pool | 12300781 | 1781 days ago | IN | 0 ETH | 0.09432105 | ||||
| New Public Pool | 12300074 | 1781 days ago | IN | 0 ETH | 0.1630664 | ||||
| New Pool | 12299963 | 1781 days ago | IN | 0 ETH | 0.10584226 | ||||
| New Public Pool | 12299920 | 1781 days ago | IN | 0 ETH | 0.17113548 | ||||
| New Pool | 12216302 | 1794 days ago | IN | 0 ETH | 0.10197518 | ||||
| New Public Pool | 12119630 | 1808 days ago | IN | 0 ETH | 0.20853343 | ||||
| New Public Pool | 11961611 | 1833 days ago | IN | 0 ETH | 0.16858868 | ||||
| New Public Pool | 11958801 | 1833 days ago | IN | 0 ETH | 0.18089215 | ||||
| New Public Pool | 11678886 | 1876 days ago | IN | 0 ETH | 0.12241823 | ||||
| New Pool | 11531533 | 1899 days ago | IN | 0 ETH | 0.11145333 | ||||
| New Public Pool | 11518391 | 1901 days ago | IN | 0 ETH | 0.08308227 | ||||
| New Pool | 11518359 | 1901 days ago | IN | 0 ETH | 0.0506774 | ||||
| New Public Pool | 11507091 | 1903 days ago | IN | 0 ETH | 0.10115178 | ||||
| New Public Pool | 11500639 | 1904 days ago | IN | 0 ETH | 0.09881968 | ||||
| Transfer | 11499366 | 1904 days ago | IN | 0 ETH | 0.000651 | ||||
| New Public Pool | 11499079 | 1904 days ago | IN | 0 ETH | 0.0928648 |
Latest 16 internal transactions
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| - | 12544315 | 1743 days ago | Contract Creation | 0 ETH | |||
| - | 12300781 | 1781 days ago | Contract Creation | 0 ETH | |||
| - | 12300074 | 1781 days ago | Contract Creation | 0 ETH | |||
| - | 12299963 | 1781 days ago | Contract Creation | 0 ETH | |||
| - | 12299920 | 1781 days ago | Contract Creation | 0 ETH | |||
| - | 12216302 | 1794 days ago | Contract Creation | 0 ETH | |||
| - | 12119630 | 1808 days ago | Contract Creation | 0 ETH | |||
| - | 11961611 | 1833 days ago | Contract Creation | 0 ETH | |||
| - | 11958801 | 1833 days ago | Contract Creation | 0 ETH | |||
| - | 11678886 | 1876 days ago | Contract Creation | 0 ETH | |||
| - | 11531533 | 1899 days ago | Contract Creation | 0 ETH | |||
| - | 11518391 | 1901 days ago | Contract Creation | 0 ETH | |||
| - | 11518359 | 1901 days ago | Contract Creation | 0 ETH | |||
| - | 11507091 | 1903 days ago | Contract Creation | 0 ETH | |||
| - | 11500639 | 1904 days ago | Contract Creation | 0 ETH | |||
| - | 11499079 | 1904 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
QPoolFactory
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2020-12-21
*/
// File: @openzeppelin/contracts/math/SafeMath.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
// File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router01.sol
pragma solidity >=0.6.2;
interface IUniswapV2Router01 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountA, uint amountB);
function removeLiquidityETHWithPermit(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountToken, uint amountETH);
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}
// File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol
pragma solidity >=0.6.2;
interface IUniswapV2Router02 is IUniswapV2Router01 {
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
}
// File: contracts/QPool.sol
pragma solidity ^ 0.6.6;
contract QPool {
using SafeMath for uint256;
address public creator;
string public poolName;
address[] private tokens;
uint[] private amounts;
address private uniswapFactoryAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
IUniswapV2Router02 public uniswapRouter;
event TradeCompleted(uint256[] acquired);
event DepositProcessed(uint256 amount);
event WithdrawalProcessed(uint256 amount);
constructor(
string memory _poolName,
address[] memory _tokens,
uint[] memory _amounts,
address _creator
) public {
uint _total = 0;
for (uint i = 0; i < _amounts.length; i++) {
_total += _amounts[i];
}
require(_total == 100);
creator = _creator;
poolName = _poolName;
tokens = _tokens;
amounts = _amounts;
uniswapRouter = IUniswapV2Router02(uniswapFactoryAddress);
}
fallback() external payable {
require(msg.sender == creator);
require(msg.data.length == 0);
processDeposit();
}
receive() external payable {
require(msg.sender == creator);
require(msg.data.length == 0);
processDeposit();
}
function close() external {
require(msg.sender == creator);
withdrawEth(100);
selfdestruct(msg.sender);
}
function processDeposit() public payable {
require(msg.sender == creator);
require(msg.value > 10000000000000000, "Minimum deposit amount is 0.01 ETH");
address[] memory _path = new address[](2);
_path[0] = uniswapRouter.WETH();
for (uint256 i = 0; i < tokens.length; i++) {
uint256 time = now + 15 + i;
_path[1] = tokens[i];
uint256 _amountEth = msg.value.mul(amounts[i]).div(100);
uint256[] memory _expected = uniswapRouter.getAmountsOut(_amountEth, _path);
uint256[] memory _output = uniswapRouter.swapExactETHForTokens.value(_expected[0])(_expected[1], _path, address(this), time);
emit TradeCompleted(_output);
}
emit DepositProcessed(msg.value);
}
function withdrawEth(uint256 _percent) public {
require(msg.sender == creator, "Only the creator can withdraw ETH.");
require(_percent > 0 && _percent <= 100, "Percent must be between 0 and 100.");
address[] memory _path = new address[](2);
uint256 total = 0;
for (uint i = 0; i < tokens.length; i++) {
IERC20 _token = IERC20(tokens[i]);
uint256 _addressBalance = _token.balanceOf(address(this));
uint256 _amountOut = _addressBalance.mul(_percent).div(100);
require(_amountOut > 0, "Amount out is 0.");
require(_token.approve(address(uniswapRouter), _amountOut), "Approval failed");
_path[0] = tokens[i];
_path[1] = uniswapRouter.WETH();
uint256[] memory _expected = uniswapRouter.getAmountsOut(_amountOut, _path);
require(_expected[1] > 1000000, "Amount is too small to transfer");
uint256 _time = now + 15 + i;
uint256[] memory _output = uniswapRouter.swapExactTokensForETH(_expected[0], _expected[1], _path, creator, _time);
total += _output[1];
emit TradeCompleted(_output);
}
emit WithdrawalProcessed(total);
}
function totalValue() public view returns (uint256) {
uint256 _totalValue = 0;
address[] memory _path = new address[](2);
for (uint i = 0; i < tokens.length && i <= 5; i++) {
IERC20 _token = IERC20(tokens[i]);
uint256 _totalBalance = _token.balanceOf(address(this));
if (_totalBalance == 0) return 0;
_path[0] = tokens[i];
_path[1] = uniswapRouter.WETH();
uint256[] memory _ethValue = uniswapRouter.getAmountsOut(_totalBalance, _path);
_totalValue += _ethValue[1];
}
return _totalValue;
}
function withdrawTokens() public {
require(msg.sender == creator, "Only the creator can withdraw tokens");
for (uint i = 0; i < tokens.length; i++) {
IERC20 _token = IERC20(tokens[i]);
uint256 _tokenBalance = _token.balanceOf(address(this));
_token.transfer(creator, _tokenBalance);
}
}
function getTokens() public view returns (address[] memory) {
return tokens;
}
function getAmounts() public view returns (uint[] memory) {
return amounts;
}
function isPublic() public pure returns (bool _isPublic) {
return false;
}
}
// File: @openzeppelin/contracts/GSN/Context.sol
pragma solidity >=0.6.0 <0.8.0;
/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with GSN meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
// File: @openzeppelin/contracts/token/ERC20/ERC20.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
* For a generic mechanism see {ERC20PresetMinterPauser}.
*
* TIP: For a detailed writeup see our guide
* https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* We have followed general OpenZeppelin guidelines: functions revert instead
* of returning `false` on failure. This behavior is nonetheless conventional
* and does not conflict with the expectations of ERC20 applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
* functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}.
*/
contract ERC20 is Context, IERC20 {
using SafeMath for uint256;
mapping (address => uint256) private _balances;
mapping (address => mapping (address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
uint8 private _decimals;
/**
* @dev Sets the values for {name} and {symbol}, initializes {decimals} with
* a default value of 18.
*
* To select a different value for {decimals}, use {_setupDecimals}.
*
* All three of these values are immutable: they can only be set once during
* construction.
*/
constructor (string memory name_, string memory symbol_) public {
_name = name_;
_symbol = symbol_;
_decimals = 18;
}
/**
* @dev Returns the name of the token.
*/
function name() public view returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5,05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
* called.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view returns (uint8) {
return _decimals;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view override returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `recipient` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public virtual override returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20}.
*
* Requirements:
*
* - `sender` and `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
* - the caller must have allowance for ``sender``'s tokens of at least
* `amount`.
*/
function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
_approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
return true;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
return true;
}
/**
* @dev Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
return true;
}
/**
* @dev Moves tokens `amount` from `sender` to `recipient`.
*
* This is internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* Requirements:
*
* - `sender` cannot be the zero address.
* - `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
*/
function _transfer(address sender, address recipient, uint256 amount) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(sender, recipient, amount);
_balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
_balances[recipient] = _balances[recipient].add(amount);
emit Transfer(sender, recipient, amount);
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* Requirements:
*
* - `to` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply = _totalSupply.add(amount);
_balances[account] = _balances[account].add(amount);
emit Transfer(address(0), account, amount);
}
/**
* @dev Destroys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
_balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
_totalSupply = _totalSupply.sub(amount);
emit Transfer(account, address(0), amount);
}
/**
* @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*/
function _approve(address owner, address spender, uint256 amount) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* @dev Sets {decimals} to a value other than the default one of 18.
*
* WARNING: This function should only be called from the constructor. Most
* applications that interact with token contracts will not expect
* {decimals} to ever change, and may work incorrectly if it does.
*/
function _setupDecimals(uint8 decimals_) internal {
_decimals = decimals_;
}
/**
* @dev Hook that is called before any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* will be to transferred to `to`.
* - when `from` is zero, `amount` tokens will be minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}
// File: @openzeppelin/contracts/token/ERC20/ERC20Burnable.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Extension of {ERC20} that allows token holders to destroy both their own
* tokens and those that they have an allowance for, in a way that can be
* recognized off-chain (via event analysis).
*/
abstract contract ERC20Burnable is Context, ERC20 {
using SafeMath for uint256;
/**
* @dev Destroys `amount` tokens from the caller.
*
* See {ERC20-_burn}.
*/
function burn(uint256 amount) public virtual {
_burn(_msgSender(), amount);
}
/**
* @dev Destroys `amount` tokens from `account`, deducting from the caller's
* allowance.
*
* See {ERC20-_burn} and {ERC20-allowance}.
*
* Requirements:
*
* - the caller must have allowance for ``accounts``'s tokens of at least
* `amount`.
*/
function burnFrom(address account, uint256 amount) public virtual {
uint256 decreasedAllowance = allowance(account, _msgSender()).sub(amount, "ERC20: burn amount exceeds allowance");
_approve(account, _msgSender(), decreasedAllowance);
_burn(account, amount);
}
}
// File: @openzeppelin/contracts/utils/ReentrancyGuard.sol
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
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;
}
}
// File: contracts/QPoolPublic.sol
pragma solidity ^ 0.6.6;
contract QPoolPublic is ERC20, ERC20Burnable, ReentrancyGuard {
using SafeMath for uint256;
string public poolName;
address[] private tokens;
uint256[] private amounts;
address public creator;
address private uniswapFactoryAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
IUniswapV2Router02 public uniswapRouter;
address[] private depositors;
mapping(address => uint) private deposits;
event TradeCompleted(uint256[] acquired);
event DepositProcessed(uint256 amount);
event WithdrawalProcessed(uint256 amount);
constructor (
string memory _poolName,
address[] memory _tokens,
uint256[] memory _amounts,
address _creator
) ERC20 ("QPoolDepositToken", "QPDT") public {
uint256 _total = 0;
require(tokens.length <= 5 && tokens.length == amounts.length);
for (uint256 i = 0; i < _amounts.length && i <= 5; i++) {
_total += _amounts[i];
}
require(_total == 100);
poolName = _poolName;
tokens = _tokens;
amounts = _amounts;
creator = _creator;
uniswapRouter = IUniswapV2Router02(uniswapFactoryAddress);
}
fallback() external payable nonReentrant {
require(msg.data.length == 0);
processDeposit();
}
receive() external payable nonReentrant {
require(msg.data.length == 0);
processDeposit();
}
function processDeposit() public payable nonReentrant {
uint256 _newIssuance = calculateShare();
if (deposits[msg.sender] == 0) addDepositor(msg.sender);
deposits[msg.sender] = deposits[msg.sender].add(msg.value);
require(makeExchange());
_mint(msg.sender, _newIssuance);
emit DepositProcessed(msg.value);
}
function makeExchange() private returns (bool) {
address[] memory _path = new address[](2);
for (uint256 i = 0; i < tokens.length && i<= 5; i++) {
_path[0] = uniswapRouter.WETH();
_path[1] = tokens[i];
uint256 _time = now + 15 + i;
uint256 _amountEth = msg.value.mul(amounts[i]).div(100);
uint256[] memory _expected = uniswapRouter.getAmountsOut(_amountEth, _path);
uint256[] memory _output = uniswapRouter.swapExactETHForTokens.value(_expected[0])(_expected[1], _path, address(this), _time);
emit TradeCompleted(_output);
}
return true;
}
function totalValue() public view returns (uint256) {
uint256 _totalValue = 0;
address[] memory _path = new address[](2);
for (uint i = 0; i < tokens.length && i <= 5; i++) {
ERC20 _token = ERC20(tokens[i]);
uint256 _totalBalance = _token.balanceOf(address(this));
if (_totalBalance == 0) return 0;
_path[0] = tokens[i];
_path[1] = uniswapRouter.WETH();
uint256[] memory _ethValue = uniswapRouter.getAmountsOut(_totalBalance, _path);
_totalValue += _ethValue[1];
}
return _totalValue;
}
function calculateShare() private view returns (uint256) {
if (totalSupply() == 0) {
return 1000000000000000000000;
} else {
uint256 _totalValue = totalValue();
uint256 _tmp = 100;
uint256 _poolShare = _tmp.mul(msg.value).div(_totalValue);
uint256 _mintAmount = totalSupply().mul(_poolShare).div(100);
return _mintAmount;
}
}
function withdrawEth(uint256 _percent) public nonReentrant {
require(_percent > 0);
uint256 _userShare = balanceOf(msg.sender);
uint256 _burnAmount = _userShare.mul(_percent).div(100);
uint256 _tmp = 100;
uint256 _poolShare = _tmp.mul(_userShare).div(totalSupply());
require(balanceOf(msg.sender) >= _burnAmount);
require(approve(address(this), _burnAmount));
_burn(msg.sender, _burnAmount);
deposits[msg.sender] = deposits[msg.sender].sub((deposits[msg.sender]).mul(_percent).div(100));
if (deposits[msg.sender] == 0) removeDepositor(msg.sender);
(bool success, uint256 total) = sellTokens(_poolShare, _percent);
require(success);
emit WithdrawalProcessed(total);
}
function sellTokens(uint256 _poolShare, uint256 _percent) private returns (bool, uint256) {
uint256 total = 0;
address[] memory _path = new address[](2);
for (uint256 i = 0; i < tokens.length && i <= 5; i++) {
ERC20 _token = ERC20(tokens[i]);
uint256 _addressBalance = _token.balanceOf(address(this));
uint256 _amountOut = _addressBalance.mul(_poolShare).mul(_percent).div(10000);
require(_amountOut > 0);
require(_token.approve(address(uniswapRouter), _amountOut));
_path[0] = tokens[i];
_path[1] = uniswapRouter.WETH();
uint256[] memory _expected = uniswapRouter.getAmountsOut(_amountOut, _path);
require(_expected[1] > 1000000);
uint256 _time = now + 15 + i;
uint256[] memory _output = uniswapRouter.swapExactTokensForETH(_expected[0], _expected[1], _path, msg.sender, _time);
total += _output[1];
emit TradeCompleted(_output);
}
return (true, total);
}
function withdrawTokens() public nonReentrant {
uint256 _userShare = balanceOf(msg.sender);
uint256 _poolShare = _userShare.div(totalSupply()).mul(100);
_burn(msg.sender, _userShare);
removeDepositor(msg.sender);
for (uint256 i = 0; i < tokens.length; i++) {
ERC20 _token = ERC20(tokens[i]);
uint256 _addressBalance = _token.balanceOf(address(this));
uint256 _amountOut = _addressBalance.mul(_poolShare).div(100);
require(_token.approve(msg.sender, _amountOut));
require(_token.transfer(msg.sender, _amountOut));
}
}
function isDepositor(address _address) public view returns (bool, uint256) {
for (uint256 i = 0; i < depositors.length; i++) {
if (_address == depositors[i]) return (true, i);
}
return (false, 0);
}
function totalDeposits() public view returns (uint256) {
uint256 _totalDeposits = 0;
for (uint256 i = 0; i < depositors.length; i++) {
_totalDeposits = _totalDeposits.add(deposits[depositors[i]]);
}
return _totalDeposits;
}
function addDepositor(address _depositor) private {
(bool _isDepositor, ) = isDepositor(_depositor);
if(!_isDepositor) depositors.push(_depositor);
}
function removeDepositor(address _depositor) private {
(bool _isDepositor, uint256 i) = isDepositor(_depositor);
if (_isDepositor) {
depositors[i] = depositors[depositors.length - 1];
depositors.pop();
}
}
function getTokens() public view returns (address[] memory) {
return tokens;
}
function getAmounts() public view returns (uint[] memory) {
return amounts;
}
function isPublic() public pure returns (bool _isPublic) {
return true;
}
}
// File: contracts/QPoolFactory.sol
pragma solidity ^ 0.6.6;
contract QPoolFactory {
address[] private privatePools;
address[] private publicPools;
mapping(address => bool) private isPool;
event PoolCreated(QPool pool);
event PublicPoolCreated(QPoolPublic pool);
function getPrivatePools() public view returns (address[] memory) {
return privatePools;
}
function getPublicPools() public view returns (address[] memory) {
return publicPools;
}
function checkPool(address _poolAddress) public view returns (bool) {
return isPool[_poolAddress];
}
function newPool(string memory _name, address[] memory _tokens, uint[] memory _amounts)
public returns (address) {
QPool pool = new QPool(_name, _tokens, _amounts, msg.sender);
emit PoolCreated(pool);
privatePools.push(address(pool));
isPool[address(pool)] = true;
return address(pool);
}
function newPublicPool(string memory _name, address[] memory _tokens, uint[] memory _amounts)
public returns (address) {
QPoolPublic pool = new QPoolPublic(_name, _tokens, _amounts, msg.sender);
emit PublicPoolCreated(pool);
publicPools.push(address(pool));
isPool[address(pool)] = true;
}
}
// File: contracts/Migrations.sol
pragma solidity >=0.4.22 <0.8.0;
contract Migrations {
address public owner = msg.sender;
uint public last_completed_migration;
modifier restricted() {
require(
msg.sender == owner,
"This function is restricted to the contract's owner"
);
_;
}
function setCompleted(uint completed) public restricted {
last_completed_migration = completed;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract QPool","name":"pool","type":"address"}],"name":"PoolCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract QPoolPublic","name":"pool","type":"address"}],"name":"PublicPoolCreated","type":"event"},{"inputs":[{"internalType":"address","name":"_poolAddress","type":"address"}],"name":"checkPool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrivatePools","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPublicPools","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"newPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"newPublicPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b50615498806100206000396000f3fe60806040523480156200001157600080fd5b50600436106200005e5760003560e01c8063232898b0146200006357806330b9d2a714620002335780634ae26ea114620002705780635ef87ff714620002cc578063b95a23b714620002d6575b600080fd5b62000217600480360360608110156200007b57600080fd5b810190602081018135600160201b8111156200009657600080fd5b820183602082011115620000a957600080fd5b803590602001918460018302840111600160201b83111715620000cb57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156200011e57600080fd5b8201836020820111156200013157600080fd5b803590602001918460208302840111600160201b831117156200015357600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115620001a357600080fd5b820183602082011115620001b657600080fd5b803590602001918460208302840111600160201b83111715620001d857600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506200048a945050505050565b604080516001600160a01b039092168252519081900360200190f35b6200025c600480360360208110156200024b57600080fd5b50356001600160a01b031662000670565b604080519115158252519081900360200190f35b6200027a6200068e565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015620002b85781810151838201526020016200029e565b505050509050019250505060405180910390f35b6200027a620006f2565b6200021760048036036060811015620002ee57600080fd5b810190602081018135600160201b8111156200030957600080fd5b8201836020820111156200031c57600080fd5b803590602001918460018302840111600160201b831117156200033e57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156200039157600080fd5b820183602082011115620003a457600080fd5b803590602001918460208302840111600160201b83111715620003c657600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156200041657600080fd5b8201836020820111156200042957600080fd5b803590602001918460208302840111600160201b831117156200044b57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955062000754945050505050565b600080848484336040516200049f9062000939565b80806020018060200180602001856001600160a01b03168152602001848103845288818151815260200191508051906020019080838360005b83811015620004f2578181015183820152602001620004d8565b50505050905090810190601f168015620005205780820380516001836020036101000a031916815260200191505b508481038352875181528751602091820191808a01910280838360005b83811015620005575781810151838201526020016200053d565b50505050905001848103825286818151815260200191508051906020019060200280838360005b83811015620005985781810151838201526020016200057e565b50505050905001975050505050505050604051809103906000f080158015620005c5573d6000803e3d6000fd5b50604080516001600160a01b038316815290519192507f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc919081900360200190a160008054600180820183557f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56390910180546001600160a01b0319166001600160a01b038516908117909155825260026020526040909120805460ff19169091179055949350505050565b6001600160a01b031660009081526002602052604090205460ff1690565b60606001805480602002602001604051908101604052809291908181526020018280548015620006e857602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311620006c9575b5050505050905090565b60606000805480602002602001604051908101604052809291908181526020018280548015620006e8576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311620006c9575050505050905090565b60008084848433604051620007699062000947565b80806020018060200180602001856001600160a01b03168152602001848103845288818151815260200191508051906020019080838360005b83811015620007bc578181015183820152602001620007a2565b50505050905090810190601f168015620007ea5780820380516001836020036101000a031916815260200191505b508481038352875181528751602091820191808a01910280838360005b838110156200082157818101518382015260200162000807565b50505050905001848103825286818151815260200191508051906020019060200280838360005b838110156200086257818101518382015260200162000848565b50505050905001975050505050505050604051809103906000f0801580156200088f573d6000803e3d6000fd5b50604080516001600160a01b038316815290519192507f2c2e694640d4ce6b9d094e9b2ed610b706e48282c787a83013a9cd587c0aa5cc919081900360200190a16001805480820182557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b039093166001600160a01b031990931683179055600091825260026020526040909120805460ff191690911790559392505050565b611cda806200095683390190565b612e3380620026308339019056fe6080604052600480546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d1790553480156200003757600080fd5b5060405162001cda38038062001cda833981810160405260808110156200005d57600080fd5b81019080805160405193929190846401000000008211156200007e57600080fd5b9083019060208201858111156200009457600080fd5b8251640100000000811182820188101715620000af57600080fd5b82525081516020918201929091019080838360005b83811015620000de578181015183820152602001620000c4565b50505050905090810190601f1680156200010c5780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200013057600080fd5b9083019060208201858111156200014657600080fd5b82518660208202830111640100000000821117156200016457600080fd5b82525081516020918201928201910280838360005b838110156200019357818101518382015260200162000179565b5050505090500160405260200180516040519392919084640100000000821115620001bd57600080fd5b908301906020820185811115620001d357600080fd5b8251866020820283011164010000000082111715620001f157600080fd5b82525081516020918201928201910280838360005b838110156200022057818101518382015260200162000206565b50505050919091016040525060200151915060009050805b835181101562000269578381815181106200024f57fe5b602002602001015182019150808060010191505062000238565b50806064146200027857600080fd5b600080546001600160a01b0319166001600160a01b0384161790558451620002a890600190602088019062000303565b508351620002be90600290602087019062000388565b508251620002d4906003906020860190620003ee565b5050600454600580546001600160a01b0319166001600160a01b03909216919091179055506200046392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200034657805160ff191683800117855562000376565b8280016001018555821562000376579182015b828111156200037657825182559160200191906001019062000359565b50620003849291506200042b565b5090565b828054828255906000526020600020908101928215620003e0579160200282015b82811115620003e057825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620003a9565b506200038492915062000442565b8280548282559060005260206000209081019282156200037657916020028201828111156200037657825182559160200191906001019062000359565b5b808211156200038457600081556001016200042c565b5b80821115620003845780546001600160a01b031916815560010162000443565b61186780620004736000396000f3fe6080604052600436106100a05760003560e01c80638f70bfa0116100645780638f70bfa0146100c7578063aa6ca808146101bd578063c311d049146101d2578063d4c3eea0146101fc578063dc9a153514610223578063f3466dfa1461024c576100d1565b806302d05d3f146100e85780633d370b4e1461011957806343d726d61461017e578063735de9f7146101935780638d8f2adb146101a8576100d1565b366100d1576000546001600160a01b031633146100bc57600080fd5b36156100c757600080fd5b6100cf6102d6565b005b6000546001600160a01b031633146100bc57600080fd5b3480156100f457600080fd5b506100fd61085c565b604080516001600160a01b039092168252519081900360200190f35b34801561012557600080fd5b5061012e61086b565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561016a578181015183820152602001610152565b505050509050019250505060405180910390f35b34801561018a57600080fd5b506100cf6108c4565b34801561019f57600080fd5b506100fd6108e8565b3480156101b457600080fd5b506100cf6108f7565b3480156101c957600080fd5b5061012e610a73565b3480156101de57600080fd5b506100cf600480360360208110156101f557600080fd5b5035610ad4565b34801561020857600080fd5b50610211611275565b60408051918252519081900360200190f35b34801561022f57600080fd5b506102386115b3565b604080519115158252519081900360200190f35b34801561025857600080fd5b506102616115b8565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561029b578181015183820152602001610283565b50505050905090810190601f1680156102c85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000546001600160a01b031633146102ed57600080fd5b662386f26fc1000034116103325760405162461bcd60e51b81526004018080602001828103825260228152602001806117a96022913960400191505060405180910390fd5b60408051600280825260608083018452926020830190803683375050600554604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c464892506004808301926020929190829003018186803b15801561039657600080fd5b505afa1580156103aa573d6000803e3d6000fd5b505050506040513d60208110156103c057600080fd5b5051815182906000906103cf57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b6002548110156108255760008142600f010190506002828154811061041357fe5b9060005260206000200160009054906101000a90046001600160a01b03168360018151811061043e57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506000610495606461048f6003868154811061047557fe5b90600052602060002001543461164590919063ffffffff16565b906116a7565b6005546040805163d06ca61f60e01b815260048101848152602482019283528851604483015288519495506060946001600160a01b039094169363d06ca61f9387938b93926064909101906020808601910280838360005b838110156105055781810151838201526020016104ed565b50505050905001935050505060006040518083038186803b15801561052957600080fd5b505afa15801561053d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561056657600080fd5b8101908080516040519392919084600160201b82111561058557600080fd5b90830190602082018581111561059a57600080fd5b82518660208202830111600160201b821117156105b657600080fd5b82525081516020918201928201910280838360005b838110156105e35781810151838201526020016105cb565b5050505090500160405250505090506060600560009054906101000a90046001600160a01b03166001600160a01b0316637ff36ab58360008151811061062557fe5b60200260200101518460018151811061063a57fe5b60200260200101518930896040518663ffffffff1660e01b81526004018085815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156106af578181015183820152602001610697565b50505050905001955050505050506000604051808303818588803b1580156106d657600080fd5b505af11580156106ea573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052602081101561071457600080fd5b8101908080516040519392919084600160201b82111561073357600080fd5b90830190602082018581111561074857600080fd5b82518660208202830111600160201b8211171561076457600080fd5b82525081516020918201928201910280838360005b83811015610791578181015183820152602001610779565b5050505090500160405250505090507f0c0be0458d81eb4d49ad60cf18809971d496be3c9a7293dbf6b1e759b0e95957816040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156108025781810151838201526020016107ea565b505050509050019250505060405180910390a15050600190920191506103f29050565b506040805134815290517f357e8ecb8719d1ea2362a4920bb1093bb9cde925b4984697817115eb99c23a5c9181900360200190a150565b6000546001600160a01b031681565b606060038054806020026020016040519081016040528092919081815260200182805480156108b957602002820191906000526020600020905b8154815260200190600101908083116108a5575b505050505090505b90565b6000546001600160a01b031633146108db57600080fd5b6108e56064610ad4565b33ff5b6005546001600160a01b031681565b6000546001600160a01b031633146109405760405162461bcd60e51b81526004018080602001828103825260248152602001806117ec6024913960400191505060405180910390fd5b60005b600254811015610a705760006002828154811061095c57fe5b6000918252602080832090910154604080516370a0823160e01b815230600482015290516001600160a01b03909216945084926370a0823192602480840193829003018186803b1580156109af57600080fd5b505afa1580156109c3573d6000803e3d6000fd5b505050506040513d60208110156109d957600080fd5b5051600080546040805163a9059cbb60e01b81526001600160a01b0392831660048201526024810185905290519394509085169263a9059cbb92604480840193602093929083900390910190829087803b158015610a3657600080fd5b505af1158015610a4a573d6000803e3d6000fd5b505050506040513d6020811015610a6057600080fd5b5050600190920191506109439050565b50565b606060028054806020026020016040519081016040528092919081815260200182805480156108b957602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610aad575050505050905090565b6000546001600160a01b03163314610b1d5760405162461bcd60e51b81526004018080602001828103825260228152602001806118106022913960400191505060405180910390fd5b600081118015610b2e575060648111155b610b695760405162461bcd60e51b81526004018080602001828103825260228152602001806117876022913960400191505060405180910390fd5b60408051600280825260608083018452926020830190803683370190505090506000805b60025481101561123c57600060028281548110610ba657fe5b6000918252602080832090910154604080516370a0823160e01b815230600482015290516001600160a01b03909216945084926370a0823192602480840193829003018186803b158015610bf957600080fd5b505afa158015610c0d573d6000803e3d6000fd5b505050506040513d6020811015610c2357600080fd5b505190506000610c38606461048f848a611645565b905060008111610c82576040805162461bcd60e51b815260206004820152601060248201526f20b6b7bab73a1037baba1034b990181760811b604482015290519081900360640190fd5b6005546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810184905290519185169163095ea7b3916044808201926020929091908290030181600087803b158015610cd857600080fd5b505af1158015610cec573d6000803e3d6000fd5b505050506040513d6020811015610d0257600080fd5b5051610d47576040805162461bcd60e51b815260206004820152600f60248201526e105c1c1c9bdd985b0819985a5b1959608a1b604482015290519081900360640190fd5b60028481548110610d5457fe5b600091825260208220015487516001600160a01b03909116918891610d7557fe5b6001600160a01b03928316602091820292909201810191909152600554604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015610dc957600080fd5b505afa158015610ddd573d6000803e3d6000fd5b505050506040513d6020811015610df357600080fd5b5051865187906001908110610e0457fe5b6001600160a01b039283166020918202929092018101919091526005546040805163d06ca61f60e01b815260048101868152602482019283528b5160448301528b51606096949094169463d06ca61f9488948e949092606490910191858201910280838360005b83811015610e83578181015183820152602001610e6b565b50505050905001935050505060006040518083038186803b158015610ea757600080fd5b505afa158015610ebb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610ee457600080fd5b8101908080516040519392919084600160201b821115610f0357600080fd5b908301906020820185811115610f1857600080fd5b82518660208202830111600160201b82111715610f3457600080fd5b82525081516020918201928201910280838360005b83811015610f61578181015183820152602001610f49565b505050509050016040525050509050620f424081600181518110610f8157fe5b602002602001015111610fdb576040805162461bcd60e51b815260206004820152601f60248201527f416d6f756e7420697320746f6f20736d616c6c20746f207472616e7366657200604482015290519081900360640190fd5b6005548151428701600f01916060916001600160a01b03909116906318cbafe590859060009061100757fe5b60200260200101518560018151811061101c57fe5b60200260200101518c60008054906101000a90046001600160a01b0316876040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156110aa578181015183820152602001611092565b505050509050019650505050505050600060405180830381600087803b1580156110d357600080fd5b505af11580156110e7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561111057600080fd5b8101908080516040519392919084600160201b82111561112f57600080fd5b90830190602082018581111561114457600080fd5b82518660208202830111600160201b8211171561116057600080fd5b82525081516020918201928201910280838360005b8381101561118d578181015183820152602001611175565b505050509050016040525050509050806001815181106111a957fe5b6020026020010151880197507f0c0be0458d81eb4d49ad60cf18809971d496be3c9a7293dbf6b1e759b0e95957816040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156112175781810151838201526020016111ff565b505050509050019250505060405180910390a1505060019094019350610b8d92505050565b506040805182815290517ffe58aa1cb04799cee89507f6618d46acbbc3d11551df3122cd67b9ee273ea7769181900360200190a1505050565b60408051600280825260608083018452600093849391929060208301908036833701905050905060005b600254811080156112b1575060058111155b156115ab576000600282815481106112c557fe5b6000918252602080832090910154604080516370a0823160e01b815230600482015290516001600160a01b03909216945084926370a0823192602480840193829003018186803b15801561131857600080fd5b505afa15801561132c573d6000803e3d6000fd5b505050506040513d602081101561134257600080fd5b5051905080611359576000955050505050506108c1565b6002838154811061136657fe5b600091825260208220015485516001600160a01b0390911691869161138757fe5b6001600160a01b03928316602091820292909201810191909152600554604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156113db57600080fd5b505afa1580156113ef573d6000803e3d6000fd5b505050506040513d602081101561140557600080fd5b505184518590600190811061141657fe5b6001600160a01b039283166020918202929092018101919091526005546040805163d06ca61f60e01b81526004810186815260248201928352895160448301528951606096949094169463d06ca61f9488948c949092606490910191858201910280838360005b8381101561149557818101518382015260200161147d565b50505050905001935050505060006040518083038186803b1580156114b957600080fd5b505afa1580156114cd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156114f657600080fd5b8101908080516040519392919084600160201b82111561151557600080fd5b90830190602082018581111561152a57600080fd5b82518660208202830111600160201b8211171561154657600080fd5b82525081516020918201928201910280838360005b8381101561157357818101518382015260200161155b565b5050505090500160405250505090508060018151811061158f57fe5b602002602001015186019550505050808060010191505061129f565b509091505090565b600090565b60018054604080516020600284861615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561163d5780601f106116125761010080835404028352916020019161163d565b820191906000526020600020905b81548152906001019060200180831161162057829003601f168201915b505050505081565b600082611654575060006116a1565b8282028284828161166157fe5b041461169e5760405162461bcd60e51b81526004018080602001828103825260218152602001806117cb6021913960400191505060405180910390fd5b90505b92915050565b600061169e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250600081836117705760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561173557818101518382015260200161171d565b50505050905090810190601f1680156117625780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161177c57fe5b049594505050505056fe50657263656e74206d757374206265206265747765656e203020616e64203130302e4d696e696d756d206465706f73697420616d6f756e7420697320302e303120455448536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f6e6c79207468652063726561746f722063616e20776974686472617720746f6b656e734f6e6c79207468652063726561746f722063616e207769746864726177204554482ea26469706673582212209b5164b130713fc012fa9052ca6102d3939a205b8490cb8f47da56b11151eaa264736f6c634300060c00336080604052600b80546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d1790553480156200003757600080fd5b5060405162002e3338038062002e33833981810160405260808110156200005d57600080fd5b81019080805160405193929190846401000000008211156200007e57600080fd5b9083019060208201858111156200009457600080fd5b8251640100000000811182820188101715620000af57600080fd5b82525081516020918201929091019080838360005b83811015620000de578181015183820152602001620000c4565b50505050905090810190601f1680156200010c5780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200013057600080fd5b9083019060208201858111156200014657600080fd5b82518660208202830111640100000000821117156200016457600080fd5b82525081516020918201928201910280838360005b838110156200019357818101518382015260200162000179565b5050505090500160405260200180516040519392919084640100000000821115620001bd57600080fd5b908301906020820185811115620001d357600080fd5b8251866020820283011164010000000082111715620001f157600080fd5b82525081516020918201928201910280838360005b838110156200022057818101518382015260200162000206565b505050509190910160408181526020938401518183018252601183527028a837b7b62232b837b9b4ba2a37b5b2b760791b858401908152825180840190935260048352631454111560e21b958301959095528251909650919450926200028a9250600391620003a4565b508051620002a0906004906020840190620003a4565b50506005805460ff1916601217815560016006556008546000925011801590620002cd5750600954600854145b620002d757600080fd5b60005b835181108015620002ec575060058111155b156200031957838181518110620002ff57fe5b6020026020010151820191508080600101915050620002da565b50806064146200032857600080fd5b84516200033d906007906020880190620003a4565b5083516200035390600890602087019062000429565b508251620003699060099060208601906200048f565b5050600a80546001600160a01b03199081166001600160a01b0393841617909155600b54600c80549190931691161790555062000504915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620003e757805160ff191683800117855562000417565b8280016001018555821562000417579182015b8281111562000417578251825591602001919060010190620003fa565b5062000425929150620004cc565b5090565b82805482825590600052602060002090810192821562000481579160200282015b828111156200048157825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906200044a565b5062000425929150620004e3565b82805482825590600052602060002090810192821562000417579160200282018281111562000417578251825591602001919060010190620003fa565b5b80821115620004255760008155600101620004cd565b5b80821115620004255780546001600160a01b0319168155600101620004e4565b61291f80620005146000396000f3fe60806040526004361061016a5760003560e01c806379cc6790116100d1578063a9059cbb1161008a578063d4c3eea011610064578063d4c3eea014610648578063dc9a15351461065d578063dd62ed3e14610672578063f3466dfa146106ad576101d4565b8063a9059cbb146105d0578063aa6ca80814610609578063c311d0491461061e576101d4565b806379cc6790146105175780637d882097146105505780638d8f2adb146105655780638f70bfa01461057a57806395d89b4114610582578063a457c2d714610597576101d4565b8063313ce56711610123578063313ce567146103da57806339509351146104055780633d370b4e1461043e57806342966c68146104a357806370a08231146104cf578063735de9f714610502576101d4565b806302d05d3f1461021a57806306fdde031461024b578063095ea7b3146102d557806318160ddd1461032257806323b872dd146103495780632f70d1ba1461038c576101d4565b366101d457600260065414156101b5576040805162461bcd60e51b815260206004820152601f6024820152600080516020612764833981519152604482015290519081900360640190fd5b600260065536156101c557600080fd5b6101cd6106c2565b6001600655005b600260065414156101b5576040805162461bcd60e51b815260206004820152601f6024820152600080516020612764833981519152604482015290519081900360640190fd5b34801561022657600080fd5b5061022f6107b7565b604080516001600160a01b039092168252519081900360200190f35b34801561025757600080fd5b506102606107c6565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561029a578181015183820152602001610282565b50505050905090810190601f1680156102c75780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102e157600080fd5b5061030e600480360360408110156102f857600080fd5b506001600160a01b03813516906020013561085d565b604080519115158252519081900360200190f35b34801561032e57600080fd5b5061033761087b565b60408051918252519081900360200190f35b34801561035557600080fd5b5061030e6004803603606081101561036c57600080fd5b506001600160a01b03813581169160208101359091169060400135610881565b34801561039857600080fd5b506103bf600480360360208110156103af57600080fd5b50356001600160a01b0316610908565b60408051921515835260208301919091528051918290030190f35b3480156103e657600080fd5b506103ef610965565b6040805160ff9092168252519081900360200190f35b34801561041157600080fd5b5061030e6004803603604081101561042857600080fd5b506001600160a01b03813516906020013561096e565b34801561044a57600080fd5b506104536109bc565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561048f578181015183820152602001610477565b505050509050019250505060405180910390f35b3480156104af57600080fd5b506104cd600480360360208110156104c657600080fd5b5035610a13565b005b3480156104db57600080fd5b50610337600480360360208110156104f257600080fd5b50356001600160a01b0316610a27565b34801561050e57600080fd5b5061022f610a42565b34801561052357600080fd5b506104cd6004803603604081101561053a57600080fd5b506001600160a01b038135169060200135610a51565b34801561055c57600080fd5b50610337610aab565b34801561057157600080fd5b506104cd610b0a565b6104cd6106c2565b34801561058e57600080fd5b50610260610d71565b3480156105a357600080fd5b5061030e600480360360408110156105ba57600080fd5b506001600160a01b038135169060200135610dd2565b3480156105dc57600080fd5b5061030e600480360360408110156105f357600080fd5b506001600160a01b038135169060200135610e3a565b34801561061557600080fd5b50610453610e4e565b34801561062a57600080fd5b506104cd6004803603602081101561064157600080fd5b5035610eaf565b34801561065457600080fd5b50610337611027565b34801561066957600080fd5b5061030e611365565b34801561067e57600080fd5b506103376004803603604081101561069557600080fd5b506001600160a01b038135811691602001351661136a565b3480156106b957600080fd5b50610260611395565b60026006541415610708576040805162461bcd60e51b815260206004820152601f6024820152600080516020612764833981519152604482015290519081900360640190fd5b60026006556000610717611423565b336000908152600e60205260409020549091506107375761073733611480565b336000908152600e602052604090205461075190346114e3565b336000908152600e6020526040902055610769611544565b61077257600080fd5b61077c3382611a57565b6040805134815290517f357e8ecb8719d1ea2362a4920bb1093bb9cde925b4984697817115eb99c23a5c9181900360200190a1506001600655565b600a546001600160a01b031681565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108525780601f1061082757610100808354040283529160200191610852565b820191906000526020600020905b81548152906001019060200180831161083557829003601f168201915b505050505090505b90565b600061087161086a611b47565b8484611b4b565b5060015b92915050565b60025490565b600061088e848484611c37565b6108fe8461089a611b47565b6108f98560405180606001604052806028815260200161280f602891396001600160a01b038a166000908152600160205260408120906108d8611b47565b6001600160a01b031681526020810191909152604001600020549190611d92565b611b4b565b5060019392505050565b60008060005b600d5481101561095757600d818154811061092557fe5b6000918252602090912001546001600160a01b038581169116141561094f57600192509050610960565b60010161090e565b50600080915091505b915091565b60055460ff1690565b600061087161097b611b47565b846108f9856001600061098c611b47565b6001600160a01b03908116825260208083019390935260409182016000908120918c1681529252902054906114e3565b6060600980548060200260200160405190810160405280929190818152602001828054801561085257602002820191906000526020600020905b8154815260200190600101908083116109f6575050505050905090565b610a24610a1e611b47565b82611e29565b50565b6001600160a01b031660009081526020819052604090205490565b600c546001600160a01b031681565b6000610a888260405180606001604052806024815260200161283760249139610a8186610a7c611b47565b61136a565b9190611d92565b9050610a9c83610a96611b47565b83611b4b565b610aa68383611e29565b505050565b600080805b600d54811015610b0457610afa600e6000600d8481548110610ace57fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190205483906114e3565b9150600101610ab0565b50905090565b60026006541415610b50576040805162461bcd60e51b815260206004820152601f6024820152600080516020612764833981519152604482015290519081900360640190fd5b60026006556000610b6033610a27565b90506000610b816064610b7b610b7461087b565b8590611f25565b90611f67565b9050610b8d3383611e29565b610b9633611fc0565b60005b600854811015610d6757600060088281548110610bb257fe5b6000918252602080832090910154604080516370a0823160e01b815230600482015290516001600160a01b03909216945084926370a0823192602480840193829003018186803b158015610c0557600080fd5b505afa158015610c19573d6000803e3d6000fd5b505050506040513d6020811015610c2f57600080fd5b505190506000610c4a6064610c448488611f67565b90611f25565b9050826001600160a01b031663095ea7b333836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610ca357600080fd5b505af1158015610cb7573d6000803e3d6000fd5b505050506040513d6020811015610ccd57600080fd5b5051610cd857600080fd5b6040805163a9059cbb60e01b81523360048201526024810183905290516001600160a01b0385169163a9059cbb9160448083019260209291908290030181600087803b158015610d2757600080fd5b505af1158015610d3b573d6000803e3d6000fd5b505050506040513d6020811015610d5157600080fd5b5051610d5c57600080fd5b505050600101610b99565b5050600160065550565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108525780601f1061082757610100808354040283529160200191610852565b6000610871610ddf611b47565b846108f9856040518060600160405280602581526020016128c56025913960016000610e09611b47565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190611d92565b6000610871610e47611b47565b8484611c37565b6060600880548060200260200160405190810160405280929190818152602001828054801561085257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610e88575050505050905090565b60026006541415610ef5576040805162461bcd60e51b815260206004820152601f6024820152600080516020612764833981519152604482015290519081900360640190fd5b600260065580610f0457600080fd5b6000610f0f33610a27565b90506000610f226064610c448486611f67565b905060646000610f3d610f3361087b565b610c448487611f67565b905082610f4933610a27565b1015610f5457600080fd5b610f5e308461085d565b610f6757600080fd5b610f713384611e29565b336000908152600e6020526040902054610fac90610f9690606490610c449089611f67565b336000908152600e60205260409020549061206e565b336000908152600e60205260409020819055610fcb57610fcb33611fc0565b600080610fd883886120b0565b9150915081610fe657600080fd5b6040805182815290517ffe58aa1cb04799cee89507f6618d46acbbc3d11551df3122cd67b9ee273ea7769181900360200190a1505060016006555050505050565b60408051600280825260608083018452600093849391929060208301908036833701905050905060005b60085481108015611063575060058111155b1561135d5760006008828154811061107757fe5b6000918252602080832090910154604080516370a0823160e01b815230600482015290516001600160a01b03909216945084926370a0823192602480840193829003018186803b1580156110ca57600080fd5b505afa1580156110de573d6000803e3d6000fd5b505050506040513d60208110156110f457600080fd5b505190508061110b5760009550505050505061085a565b6008838154811061111857fe5b600091825260208220015485516001600160a01b0390911691869161113957fe5b6001600160a01b03928316602091820292909201810191909152600c54604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561118d57600080fd5b505afa1580156111a1573d6000803e3d6000fd5b505050506040513d60208110156111b757600080fd5b50518451859060019081106111c857fe5b6001600160a01b03928316602091820292909201810191909152600c546040805163d06ca61f60e01b81526004810186815260248201928352895160448301528951606096949094169463d06ca61f9488948c949092606490910191858201910280838360005b8381101561124757818101518382015260200161122f565b50505050905001935050505060006040518083038186803b15801561126b57600080fd5b505afa15801561127f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156112a857600080fd5b8101908080516040519392919084600160201b8211156112c757600080fd5b9083019060208201858111156112dc57600080fd5b82518660208202830111600160201b821117156112f857600080fd5b82525081516020918201928201910280838360005b8381101561132557818101518382015260200161130d565b5050505090500160405250505090508060018151811061134157fe5b6020026020010151860195505050508080600101915050611051565b509091505090565b600190565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6007805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561141b5780601f106113f05761010080835404028352916020019161141b565b820191906000526020600020905b8154815290600101906020018083116113fe57829003601f168201915b505050505081565b600061142d61087b565b6114415750683635c9adc5dea0000061085a565b600061144b611027565b90506064600061145f83610c448434611f67565b905060006114746064610c4484610b7b61087b565b945061085a9350505050565b600061148b82610908565b509050806114df57600d80546001810182556000919091527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180546001600160a01b0319166001600160a01b0384161790555b5050565b60008282018381101561153d576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b604080516002808252606080830184526000939092919060208301908036833701905050905060005b6008548110801561157f575060058111155b15611a4e57600c60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156115d257600080fd5b505afa1580156115e6573d6000803e3d6000fd5b505050506040513d60208110156115fc57600080fd5b50518251839060009061160b57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506008818154811061163857fe5b9060005260206000200160009054906101000a90046001600160a01b03168260018151811061166357fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060008142600f0101905060006116be6064610c44600986815481106116a457fe5b906000526020600020015434611f6790919063ffffffff16565b600c546040805163d06ca61f60e01b815260048101848152602482019283528851604483015288519495506060946001600160a01b039094169363d06ca61f9387938b93926064909101906020808601910280838360005b8381101561172e578181015183820152602001611716565b50505050905001935050505060006040518083038186803b15801561175257600080fd5b505afa158015611766573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561178f57600080fd5b8101908080516040519392919084600160201b8211156117ae57600080fd5b9083019060208201858111156117c357600080fd5b82518660208202830111600160201b821117156117df57600080fd5b82525081516020918201928201910280838360005b8381101561180c5781810151838201526020016117f4565b5050505090500160405250505090506060600c60009054906101000a90046001600160a01b03166001600160a01b0316637ff36ab58360008151811061184e57fe5b60200260200101518460018151811061186357fe5b60200260200101518930896040518663ffffffff1660e01b81526004018085815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156118d85781810151838201526020016118c0565b50505050905001955050505050506000604051808303818588803b1580156118ff57600080fd5b505af1158015611913573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052602081101561193d57600080fd5b8101908080516040519392919084600160201b82111561195c57600080fd5b90830190602082018581111561197157600080fd5b82518660208202830111600160201b8211171561198d57600080fd5b82525081516020918201928201910280838360005b838110156119ba5781810151838201526020016119a2565b5050505090500160405250505090507f0c0be0458d81eb4d49ad60cf18809971d496be3c9a7293dbf6b1e759b0e95957816040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015611a2b578181015183820152602001611a13565b505050509050019250505060405180910390a150506001909201915061156d9050565b50600191505090565b6001600160a01b038216611ab2576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b611abe60008383610aa6565b600254611acb90826114e3565b6002556001600160a01b038216600090815260208190526040902054611af190826114e3565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b3390565b6001600160a01b038316611b905760405162461bcd60e51b81526004018080602001828103825260248152602001806128a16024913960400191505060405180910390fd5b6001600160a01b038216611bd55760405162461bcd60e51b81526004018080602001828103825260228152602001806127a66022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316611c7c5760405162461bcd60e51b815260040180806020018281038252602581526020018061287c6025913960400191505060405180910390fd5b6001600160a01b038216611cc15760405162461bcd60e51b81526004018080602001828103825260238152602001806127416023913960400191505060405180910390fd5b611ccc838383610aa6565b611d09816040518060600160405280602681526020016127c8602691396001600160a01b0386166000908152602081905260409020549190611d92565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611d3890826114e3565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115611e215760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611de6578181015183820152602001611dce565b50505050905090810190601f168015611e135780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b038216611e6e5760405162461bcd60e51b815260040180806020018281038252602181526020018061285b6021913960400191505060405180910390fd5b611e7a82600083610aa6565b611eb781604051806060016040528060228152602001612784602291396001600160a01b0385166000908152602081905260409020549190611d92565b6001600160a01b038316600090815260208190526040902055600254611edd908261206e565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b600061153d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506126db565b600082611f7657506000610875565b82820282848281611f8357fe5b041461153d5760405162461bcd60e51b81526004018080602001828103825260218152602001806127ee6021913960400191505060405180910390fd5b600080611fcc83610908565b915091508115610aa657600d80546000198101908110611fe857fe5b600091825260209091200154600d80546001600160a01b03909216918390811061200e57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600d80548061204757fe5b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b600061153d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611d92565b6040805160028082526060808301845260009384938493909160208301908036833701905050905060005b600854811080156120ed575060058111155b156126cc5760006008828154811061210157fe5b6000918252602080832090910154604080516370a0823160e01b815230600482015290516001600160a01b03909216945084926370a0823192602480840193829003018186803b15801561215457600080fd5b505afa158015612168573d6000803e3d6000fd5b505050506040513d602081101561217e57600080fd5b505190506000612198612710610c448b610b7b868f611f67565b9050600081116121a757600080fd5b600c546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810184905290519185169163095ea7b3916044808201926020929091908290030181600087803b1580156121fd57600080fd5b505af1158015612211573d6000803e3d6000fd5b505050506040513d602081101561222757600080fd5b505161223257600080fd5b6008848154811061223f57fe5b600091825260208220015486516001600160a01b0390911691879161226057fe5b6001600160a01b03928316602091820292909201810191909152600c54604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156122b457600080fd5b505afa1580156122c8573d6000803e3d6000fd5b505050506040513d60208110156122de57600080fd5b50518551869060019081106122ef57fe5b6001600160a01b03928316602091820292909201810191909152600c546040805163d06ca61f60e01b815260048101868152602482019283528a5160448301528a51606096949094169463d06ca61f9488948d949092606490910191858201910280838360005b8381101561236e578181015183820152602001612356565b50505050905001935050505060006040518083038186803b15801561239257600080fd5b505afa1580156123a6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156123cf57600080fd5b8101908080516040519392919084600160201b8211156123ee57600080fd5b90830190602082018581111561240357600080fd5b82518660208202830111600160201b8211171561241f57600080fd5b82525081516020918201928201910280838360005b8381101561244c578181015183820152602001612434565b505050509050016040525050509050620f42408160018151811061246c57fe5b60200260200101511161247e57600080fd5b600c548151428701600f01916060916001600160a01b03909116906318cbafe59085906000906124aa57fe5b6020026020010151856001815181106124bf57fe5b60200260200101518b33876040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561253a578181015183820152602001612522565b505050509050019650505050505050600060405180830381600087803b15801561256357600080fd5b505af1158015612577573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156125a057600080fd5b8101908080516040519392919084600160201b8211156125bf57600080fd5b9083019060208201858111156125d457600080fd5b82518660208202830111600160201b821117156125f057600080fd5b82525081516020918201928201910280838360005b8381101561261d578181015183820152602001612605565b5050505090500160405250505090508060018151811061263957fe5b6020026020010151890198507f0c0be0458d81eb4d49ad60cf18809971d496be3c9a7293dbf6b1e759b0e95957816040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156126a757818101518382015260200161268f565b505050509050019250505060405180910390a15050600190940193506120db92505050565b50600196919550909350505050565b6000818361272a5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611de6578181015183820152602001611dce565b50600083858161273657fe5b049594505050505056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573735265656e7472616e637947756172643a207265656e7472616e742063616c6c0045524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220b39c41f27f5331a77ab08f19f091bbcc3ebd376e4d7b64d8bdabd4458f5c01b064736f6c634300060c0033a2646970667358221220356a3834b860368919423d9e75603104284b2e8000bd0d0a25fac8f79896a47d64736f6c634300060c0033
Deployed Bytecode
0x60806040523480156200001157600080fd5b50600436106200005e5760003560e01c8063232898b0146200006357806330b9d2a714620002335780634ae26ea114620002705780635ef87ff714620002cc578063b95a23b714620002d6575b600080fd5b62000217600480360360608110156200007b57600080fd5b810190602081018135600160201b8111156200009657600080fd5b820183602082011115620000a957600080fd5b803590602001918460018302840111600160201b83111715620000cb57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156200011e57600080fd5b8201836020820111156200013157600080fd5b803590602001918460208302840111600160201b831117156200015357600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b811115620001a357600080fd5b820183602082011115620001b657600080fd5b803590602001918460208302840111600160201b83111715620001d857600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506200048a945050505050565b604080516001600160a01b039092168252519081900360200190f35b6200025c600480360360208110156200024b57600080fd5b50356001600160a01b031662000670565b604080519115158252519081900360200190f35b6200027a6200068e565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015620002b85781810151838201526020016200029e565b505050509050019250505060405180910390f35b6200027a620006f2565b6200021760048036036060811015620002ee57600080fd5b810190602081018135600160201b8111156200030957600080fd5b8201836020820111156200031c57600080fd5b803590602001918460018302840111600160201b831117156200033e57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156200039157600080fd5b820183602082011115620003a457600080fd5b803590602001918460208302840111600160201b83111715620003c657600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156200041657600080fd5b8201836020820111156200042957600080fd5b803590602001918460208302840111600160201b831117156200044b57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955062000754945050505050565b600080848484336040516200049f9062000939565b80806020018060200180602001856001600160a01b03168152602001848103845288818151815260200191508051906020019080838360005b83811015620004f2578181015183820152602001620004d8565b50505050905090810190601f168015620005205780820380516001836020036101000a031916815260200191505b508481038352875181528751602091820191808a01910280838360005b83811015620005575781810151838201526020016200053d565b50505050905001848103825286818151815260200191508051906020019060200280838360005b83811015620005985781810151838201526020016200057e565b50505050905001975050505050505050604051809103906000f080158015620005c5573d6000803e3d6000fd5b50604080516001600160a01b038316815290519192507f83a48fbcfc991335314e74d0496aab6a1987e992ddc85dddbcc4d6dd6ef2e9fc919081900360200190a160008054600180820183557f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56390910180546001600160a01b0319166001600160a01b038516908117909155825260026020526040909120805460ff19169091179055949350505050565b6001600160a01b031660009081526002602052604090205460ff1690565b60606001805480602002602001604051908101604052809291908181526020018280548015620006e857602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311620006c9575b5050505050905090565b60606000805480602002602001604051908101604052809291908181526020018280548015620006e8576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311620006c9575050505050905090565b60008084848433604051620007699062000947565b80806020018060200180602001856001600160a01b03168152602001848103845288818151815260200191508051906020019080838360005b83811015620007bc578181015183820152602001620007a2565b50505050905090810190601f168015620007ea5780820380516001836020036101000a031916815260200191505b508481038352875181528751602091820191808a01910280838360005b838110156200082157818101518382015260200162000807565b50505050905001848103825286818151815260200191508051906020019060200280838360005b838110156200086257818101518382015260200162000848565b50505050905001975050505050505050604051809103906000f0801580156200088f573d6000803e3d6000fd5b50604080516001600160a01b038316815290519192507f2c2e694640d4ce6b9d094e9b2ed610b706e48282c787a83013a9cd587c0aa5cc919081900360200190a16001805480820182557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b039093166001600160a01b031990931683179055600091825260026020526040909120805460ff191690911790559392505050565b611cda806200095683390190565b612e3380620026308339019056fe6080604052600480546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d1790553480156200003757600080fd5b5060405162001cda38038062001cda833981810160405260808110156200005d57600080fd5b81019080805160405193929190846401000000008211156200007e57600080fd5b9083019060208201858111156200009457600080fd5b8251640100000000811182820188101715620000af57600080fd5b82525081516020918201929091019080838360005b83811015620000de578181015183820152602001620000c4565b50505050905090810190601f1680156200010c5780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200013057600080fd5b9083019060208201858111156200014657600080fd5b82518660208202830111640100000000821117156200016457600080fd5b82525081516020918201928201910280838360005b838110156200019357818101518382015260200162000179565b5050505090500160405260200180516040519392919084640100000000821115620001bd57600080fd5b908301906020820185811115620001d357600080fd5b8251866020820283011164010000000082111715620001f157600080fd5b82525081516020918201928201910280838360005b838110156200022057818101518382015260200162000206565b50505050919091016040525060200151915060009050805b835181101562000269578381815181106200024f57fe5b602002602001015182019150808060010191505062000238565b50806064146200027857600080fd5b600080546001600160a01b0319166001600160a01b0384161790558451620002a890600190602088019062000303565b508351620002be90600290602087019062000388565b508251620002d4906003906020860190620003ee565b5050600454600580546001600160a01b0319166001600160a01b03909216919091179055506200046392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200034657805160ff191683800117855562000376565b8280016001018555821562000376579182015b828111156200037657825182559160200191906001019062000359565b50620003849291506200042b565b5090565b828054828255906000526020600020908101928215620003e0579160200282015b82811115620003e057825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620003a9565b506200038492915062000442565b8280548282559060005260206000209081019282156200037657916020028201828111156200037657825182559160200191906001019062000359565b5b808211156200038457600081556001016200042c565b5b80821115620003845780546001600160a01b031916815560010162000443565b61186780620004736000396000f3fe6080604052600436106100a05760003560e01c80638f70bfa0116100645780638f70bfa0146100c7578063aa6ca808146101bd578063c311d049146101d2578063d4c3eea0146101fc578063dc9a153514610223578063f3466dfa1461024c576100d1565b806302d05d3f146100e85780633d370b4e1461011957806343d726d61461017e578063735de9f7146101935780638d8f2adb146101a8576100d1565b366100d1576000546001600160a01b031633146100bc57600080fd5b36156100c757600080fd5b6100cf6102d6565b005b6000546001600160a01b031633146100bc57600080fd5b3480156100f457600080fd5b506100fd61085c565b604080516001600160a01b039092168252519081900360200190f35b34801561012557600080fd5b5061012e61086b565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561016a578181015183820152602001610152565b505050509050019250505060405180910390f35b34801561018a57600080fd5b506100cf6108c4565b34801561019f57600080fd5b506100fd6108e8565b3480156101b457600080fd5b506100cf6108f7565b3480156101c957600080fd5b5061012e610a73565b3480156101de57600080fd5b506100cf600480360360208110156101f557600080fd5b5035610ad4565b34801561020857600080fd5b50610211611275565b60408051918252519081900360200190f35b34801561022f57600080fd5b506102386115b3565b604080519115158252519081900360200190f35b34801561025857600080fd5b506102616115b8565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561029b578181015183820152602001610283565b50505050905090810190601f1680156102c85780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000546001600160a01b031633146102ed57600080fd5b662386f26fc1000034116103325760405162461bcd60e51b81526004018080602001828103825260228152602001806117a96022913960400191505060405180910390fd5b60408051600280825260608083018452926020830190803683375050600554604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c464892506004808301926020929190829003018186803b15801561039657600080fd5b505afa1580156103aa573d6000803e3d6000fd5b505050506040513d60208110156103c057600080fd5b5051815182906000906103cf57fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060005b6002548110156108255760008142600f010190506002828154811061041357fe5b9060005260206000200160009054906101000a90046001600160a01b03168360018151811061043e57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506000610495606461048f6003868154811061047557fe5b90600052602060002001543461164590919063ffffffff16565b906116a7565b6005546040805163d06ca61f60e01b815260048101848152602482019283528851604483015288519495506060946001600160a01b039094169363d06ca61f9387938b93926064909101906020808601910280838360005b838110156105055781810151838201526020016104ed565b50505050905001935050505060006040518083038186803b15801561052957600080fd5b505afa15801561053d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561056657600080fd5b8101908080516040519392919084600160201b82111561058557600080fd5b90830190602082018581111561059a57600080fd5b82518660208202830111600160201b821117156105b657600080fd5b82525081516020918201928201910280838360005b838110156105e35781810151838201526020016105cb565b5050505090500160405250505090506060600560009054906101000a90046001600160a01b03166001600160a01b0316637ff36ab58360008151811061062557fe5b60200260200101518460018151811061063a57fe5b60200260200101518930896040518663ffffffff1660e01b81526004018085815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156106af578181015183820152602001610697565b50505050905001955050505050506000604051808303818588803b1580156106d657600080fd5b505af11580156106ea573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052602081101561071457600080fd5b8101908080516040519392919084600160201b82111561073357600080fd5b90830190602082018581111561074857600080fd5b82518660208202830111600160201b8211171561076457600080fd5b82525081516020918201928201910280838360005b83811015610791578181015183820152602001610779565b5050505090500160405250505090507f0c0be0458d81eb4d49ad60cf18809971d496be3c9a7293dbf6b1e759b0e95957816040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156108025781810151838201526020016107ea565b505050509050019250505060405180910390a15050600190920191506103f29050565b506040805134815290517f357e8ecb8719d1ea2362a4920bb1093bb9cde925b4984697817115eb99c23a5c9181900360200190a150565b6000546001600160a01b031681565b606060038054806020026020016040519081016040528092919081815260200182805480156108b957602002820191906000526020600020905b8154815260200190600101908083116108a5575b505050505090505b90565b6000546001600160a01b031633146108db57600080fd5b6108e56064610ad4565b33ff5b6005546001600160a01b031681565b6000546001600160a01b031633146109405760405162461bcd60e51b81526004018080602001828103825260248152602001806117ec6024913960400191505060405180910390fd5b60005b600254811015610a705760006002828154811061095c57fe5b6000918252602080832090910154604080516370a0823160e01b815230600482015290516001600160a01b03909216945084926370a0823192602480840193829003018186803b1580156109af57600080fd5b505afa1580156109c3573d6000803e3d6000fd5b505050506040513d60208110156109d957600080fd5b5051600080546040805163a9059cbb60e01b81526001600160a01b0392831660048201526024810185905290519394509085169263a9059cbb92604480840193602093929083900390910190829087803b158015610a3657600080fd5b505af1158015610a4a573d6000803e3d6000fd5b505050506040513d6020811015610a6057600080fd5b5050600190920191506109439050565b50565b606060028054806020026020016040519081016040528092919081815260200182805480156108b957602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610aad575050505050905090565b6000546001600160a01b03163314610b1d5760405162461bcd60e51b81526004018080602001828103825260228152602001806118106022913960400191505060405180910390fd5b600081118015610b2e575060648111155b610b695760405162461bcd60e51b81526004018080602001828103825260228152602001806117876022913960400191505060405180910390fd5b60408051600280825260608083018452926020830190803683370190505090506000805b60025481101561123c57600060028281548110610ba657fe5b6000918252602080832090910154604080516370a0823160e01b815230600482015290516001600160a01b03909216945084926370a0823192602480840193829003018186803b158015610bf957600080fd5b505afa158015610c0d573d6000803e3d6000fd5b505050506040513d6020811015610c2357600080fd5b505190506000610c38606461048f848a611645565b905060008111610c82576040805162461bcd60e51b815260206004820152601060248201526f20b6b7bab73a1037baba1034b990181760811b604482015290519081900360640190fd5b6005546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810184905290519185169163095ea7b3916044808201926020929091908290030181600087803b158015610cd857600080fd5b505af1158015610cec573d6000803e3d6000fd5b505050506040513d6020811015610d0257600080fd5b5051610d47576040805162461bcd60e51b815260206004820152600f60248201526e105c1c1c9bdd985b0819985a5b1959608a1b604482015290519081900360640190fd5b60028481548110610d5457fe5b600091825260208220015487516001600160a01b03909116918891610d7557fe5b6001600160a01b03928316602091820292909201810191909152600554604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015610dc957600080fd5b505afa158015610ddd573d6000803e3d6000fd5b505050506040513d6020811015610df357600080fd5b5051865187906001908110610e0457fe5b6001600160a01b039283166020918202929092018101919091526005546040805163d06ca61f60e01b815260048101868152602482019283528b5160448301528b51606096949094169463d06ca61f9488948e949092606490910191858201910280838360005b83811015610e83578181015183820152602001610e6b565b50505050905001935050505060006040518083038186803b158015610ea757600080fd5b505afa158015610ebb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610ee457600080fd5b8101908080516040519392919084600160201b821115610f0357600080fd5b908301906020820185811115610f1857600080fd5b82518660208202830111600160201b82111715610f3457600080fd5b82525081516020918201928201910280838360005b83811015610f61578181015183820152602001610f49565b505050509050016040525050509050620f424081600181518110610f8157fe5b602002602001015111610fdb576040805162461bcd60e51b815260206004820152601f60248201527f416d6f756e7420697320746f6f20736d616c6c20746f207472616e7366657200604482015290519081900360640190fd5b6005548151428701600f01916060916001600160a01b03909116906318cbafe590859060009061100757fe5b60200260200101518560018151811061101c57fe5b60200260200101518c60008054906101000a90046001600160a01b0316876040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156110aa578181015183820152602001611092565b505050509050019650505050505050600060405180830381600087803b1580156110d357600080fd5b505af11580156110e7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561111057600080fd5b8101908080516040519392919084600160201b82111561112f57600080fd5b90830190602082018581111561114457600080fd5b82518660208202830111600160201b8211171561116057600080fd5b82525081516020918201928201910280838360005b8381101561118d578181015183820152602001611175565b505050509050016040525050509050806001815181106111a957fe5b6020026020010151880197507f0c0be0458d81eb4d49ad60cf18809971d496be3c9a7293dbf6b1e759b0e95957816040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156112175781810151838201526020016111ff565b505050509050019250505060405180910390a1505060019094019350610b8d92505050565b506040805182815290517ffe58aa1cb04799cee89507f6618d46acbbc3d11551df3122cd67b9ee273ea7769181900360200190a1505050565b60408051600280825260608083018452600093849391929060208301908036833701905050905060005b600254811080156112b1575060058111155b156115ab576000600282815481106112c557fe5b6000918252602080832090910154604080516370a0823160e01b815230600482015290516001600160a01b03909216945084926370a0823192602480840193829003018186803b15801561131857600080fd5b505afa15801561132c573d6000803e3d6000fd5b505050506040513d602081101561134257600080fd5b5051905080611359576000955050505050506108c1565b6002838154811061136657fe5b600091825260208220015485516001600160a01b0390911691869161138757fe5b6001600160a01b03928316602091820292909201810191909152600554604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156113db57600080fd5b505afa1580156113ef573d6000803e3d6000fd5b505050506040513d602081101561140557600080fd5b505184518590600190811061141657fe5b6001600160a01b039283166020918202929092018101919091526005546040805163d06ca61f60e01b81526004810186815260248201928352895160448301528951606096949094169463d06ca61f9488948c949092606490910191858201910280838360005b8381101561149557818101518382015260200161147d565b50505050905001935050505060006040518083038186803b1580156114b957600080fd5b505afa1580156114cd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156114f657600080fd5b8101908080516040519392919084600160201b82111561151557600080fd5b90830190602082018581111561152a57600080fd5b82518660208202830111600160201b8211171561154657600080fd5b82525081516020918201928201910280838360005b8381101561157357818101518382015260200161155b565b5050505090500160405250505090508060018151811061158f57fe5b602002602001015186019550505050808060010191505061129f565b509091505090565b600090565b60018054604080516020600284861615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561163d5780601f106116125761010080835404028352916020019161163d565b820191906000526020600020905b81548152906001019060200180831161162057829003601f168201915b505050505081565b600082611654575060006116a1565b8282028284828161166157fe5b041461169e5760405162461bcd60e51b81526004018080602001828103825260218152602001806117cb6021913960400191505060405180910390fd5b90505b92915050565b600061169e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250600081836117705760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561173557818101518382015260200161171d565b50505050905090810190601f1680156117625780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161177c57fe5b049594505050505056fe50657263656e74206d757374206265206265747765656e203020616e64203130302e4d696e696d756d206465706f73697420616d6f756e7420697320302e303120455448536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f6e6c79207468652063726561746f722063616e20776974686472617720746f6b656e734f6e6c79207468652063726561746f722063616e207769746864726177204554482ea26469706673582212209b5164b130713fc012fa9052ca6102d3939a205b8490cb8f47da56b11151eaa264736f6c634300060c00336080604052600b80546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d1790553480156200003757600080fd5b5060405162002e3338038062002e33833981810160405260808110156200005d57600080fd5b81019080805160405193929190846401000000008211156200007e57600080fd5b9083019060208201858111156200009457600080fd5b8251640100000000811182820188101715620000af57600080fd5b82525081516020918201929091019080838360005b83811015620000de578181015183820152602001620000c4565b50505050905090810190601f1680156200010c5780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200013057600080fd5b9083019060208201858111156200014657600080fd5b82518660208202830111640100000000821117156200016457600080fd5b82525081516020918201928201910280838360005b838110156200019357818101518382015260200162000179565b5050505090500160405260200180516040519392919084640100000000821115620001bd57600080fd5b908301906020820185811115620001d357600080fd5b8251866020820283011164010000000082111715620001f157600080fd5b82525081516020918201928201910280838360005b838110156200022057818101518382015260200162000206565b505050509190910160408181526020938401518183018252601183527028a837b7b62232b837b9b4ba2a37b5b2b760791b858401908152825180840190935260048352631454111560e21b958301959095528251909650919450926200028a9250600391620003a4565b508051620002a0906004906020840190620003a4565b50506005805460ff1916601217815560016006556008546000925011801590620002cd5750600954600854145b620002d757600080fd5b60005b835181108015620002ec575060058111155b156200031957838181518110620002ff57fe5b6020026020010151820191508080600101915050620002da565b50806064146200032857600080fd5b84516200033d906007906020880190620003a4565b5083516200035390600890602087019062000429565b508251620003699060099060208601906200048f565b5050600a80546001600160a01b03199081166001600160a01b0393841617909155600b54600c80549190931691161790555062000504915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620003e757805160ff191683800117855562000417565b8280016001018555821562000417579182015b8281111562000417578251825591602001919060010190620003fa565b5062000425929150620004cc565b5090565b82805482825590600052602060002090810192821562000481579160200282015b828111156200048157825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906200044a565b5062000425929150620004e3565b82805482825590600052602060002090810192821562000417579160200282018281111562000417578251825591602001919060010190620003fa565b5b80821115620004255760008155600101620004cd565b5b80821115620004255780546001600160a01b0319168155600101620004e4565b61291f80620005146000396000f3fe60806040526004361061016a5760003560e01c806379cc6790116100d1578063a9059cbb1161008a578063d4c3eea011610064578063d4c3eea014610648578063dc9a15351461065d578063dd62ed3e14610672578063f3466dfa146106ad576101d4565b8063a9059cbb146105d0578063aa6ca80814610609578063c311d0491461061e576101d4565b806379cc6790146105175780637d882097146105505780638d8f2adb146105655780638f70bfa01461057a57806395d89b4114610582578063a457c2d714610597576101d4565b8063313ce56711610123578063313ce567146103da57806339509351146104055780633d370b4e1461043e57806342966c68146104a357806370a08231146104cf578063735de9f714610502576101d4565b806302d05d3f1461021a57806306fdde031461024b578063095ea7b3146102d557806318160ddd1461032257806323b872dd146103495780632f70d1ba1461038c576101d4565b366101d457600260065414156101b5576040805162461bcd60e51b815260206004820152601f6024820152600080516020612764833981519152604482015290519081900360640190fd5b600260065536156101c557600080fd5b6101cd6106c2565b6001600655005b600260065414156101b5576040805162461bcd60e51b815260206004820152601f6024820152600080516020612764833981519152604482015290519081900360640190fd5b34801561022657600080fd5b5061022f6107b7565b604080516001600160a01b039092168252519081900360200190f35b34801561025757600080fd5b506102606107c6565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561029a578181015183820152602001610282565b50505050905090810190601f1680156102c75780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102e157600080fd5b5061030e600480360360408110156102f857600080fd5b506001600160a01b03813516906020013561085d565b604080519115158252519081900360200190f35b34801561032e57600080fd5b5061033761087b565b60408051918252519081900360200190f35b34801561035557600080fd5b5061030e6004803603606081101561036c57600080fd5b506001600160a01b03813581169160208101359091169060400135610881565b34801561039857600080fd5b506103bf600480360360208110156103af57600080fd5b50356001600160a01b0316610908565b60408051921515835260208301919091528051918290030190f35b3480156103e657600080fd5b506103ef610965565b6040805160ff9092168252519081900360200190f35b34801561041157600080fd5b5061030e6004803603604081101561042857600080fd5b506001600160a01b03813516906020013561096e565b34801561044a57600080fd5b506104536109bc565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561048f578181015183820152602001610477565b505050509050019250505060405180910390f35b3480156104af57600080fd5b506104cd600480360360208110156104c657600080fd5b5035610a13565b005b3480156104db57600080fd5b50610337600480360360208110156104f257600080fd5b50356001600160a01b0316610a27565b34801561050e57600080fd5b5061022f610a42565b34801561052357600080fd5b506104cd6004803603604081101561053a57600080fd5b506001600160a01b038135169060200135610a51565b34801561055c57600080fd5b50610337610aab565b34801561057157600080fd5b506104cd610b0a565b6104cd6106c2565b34801561058e57600080fd5b50610260610d71565b3480156105a357600080fd5b5061030e600480360360408110156105ba57600080fd5b506001600160a01b038135169060200135610dd2565b3480156105dc57600080fd5b5061030e600480360360408110156105f357600080fd5b506001600160a01b038135169060200135610e3a565b34801561061557600080fd5b50610453610e4e565b34801561062a57600080fd5b506104cd6004803603602081101561064157600080fd5b5035610eaf565b34801561065457600080fd5b50610337611027565b34801561066957600080fd5b5061030e611365565b34801561067e57600080fd5b506103376004803603604081101561069557600080fd5b506001600160a01b038135811691602001351661136a565b3480156106b957600080fd5b50610260611395565b60026006541415610708576040805162461bcd60e51b815260206004820152601f6024820152600080516020612764833981519152604482015290519081900360640190fd5b60026006556000610717611423565b336000908152600e60205260409020549091506107375761073733611480565b336000908152600e602052604090205461075190346114e3565b336000908152600e6020526040902055610769611544565b61077257600080fd5b61077c3382611a57565b6040805134815290517f357e8ecb8719d1ea2362a4920bb1093bb9cde925b4984697817115eb99c23a5c9181900360200190a1506001600655565b600a546001600160a01b031681565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108525780601f1061082757610100808354040283529160200191610852565b820191906000526020600020905b81548152906001019060200180831161083557829003601f168201915b505050505090505b90565b600061087161086a611b47565b8484611b4b565b5060015b92915050565b60025490565b600061088e848484611c37565b6108fe8461089a611b47565b6108f98560405180606001604052806028815260200161280f602891396001600160a01b038a166000908152600160205260408120906108d8611b47565b6001600160a01b031681526020810191909152604001600020549190611d92565b611b4b565b5060019392505050565b60008060005b600d5481101561095757600d818154811061092557fe5b6000918252602090912001546001600160a01b038581169116141561094f57600192509050610960565b60010161090e565b50600080915091505b915091565b60055460ff1690565b600061087161097b611b47565b846108f9856001600061098c611b47565b6001600160a01b03908116825260208083019390935260409182016000908120918c1681529252902054906114e3565b6060600980548060200260200160405190810160405280929190818152602001828054801561085257602002820191906000526020600020905b8154815260200190600101908083116109f6575050505050905090565b610a24610a1e611b47565b82611e29565b50565b6001600160a01b031660009081526020819052604090205490565b600c546001600160a01b031681565b6000610a888260405180606001604052806024815260200161283760249139610a8186610a7c611b47565b61136a565b9190611d92565b9050610a9c83610a96611b47565b83611b4b565b610aa68383611e29565b505050565b600080805b600d54811015610b0457610afa600e6000600d8481548110610ace57fe5b60009182526020808320909101546001600160a01b0316835282019290925260400190205483906114e3565b9150600101610ab0565b50905090565b60026006541415610b50576040805162461bcd60e51b815260206004820152601f6024820152600080516020612764833981519152604482015290519081900360640190fd5b60026006556000610b6033610a27565b90506000610b816064610b7b610b7461087b565b8590611f25565b90611f67565b9050610b8d3383611e29565b610b9633611fc0565b60005b600854811015610d6757600060088281548110610bb257fe5b6000918252602080832090910154604080516370a0823160e01b815230600482015290516001600160a01b03909216945084926370a0823192602480840193829003018186803b158015610c0557600080fd5b505afa158015610c19573d6000803e3d6000fd5b505050506040513d6020811015610c2f57600080fd5b505190506000610c4a6064610c448488611f67565b90611f25565b9050826001600160a01b031663095ea7b333836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610ca357600080fd5b505af1158015610cb7573d6000803e3d6000fd5b505050506040513d6020811015610ccd57600080fd5b5051610cd857600080fd5b6040805163a9059cbb60e01b81523360048201526024810183905290516001600160a01b0385169163a9059cbb9160448083019260209291908290030181600087803b158015610d2757600080fd5b505af1158015610d3b573d6000803e3d6000fd5b505050506040513d6020811015610d5157600080fd5b5051610d5c57600080fd5b505050600101610b99565b5050600160065550565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108525780601f1061082757610100808354040283529160200191610852565b6000610871610ddf611b47565b846108f9856040518060600160405280602581526020016128c56025913960016000610e09611b47565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190611d92565b6000610871610e47611b47565b8484611c37565b6060600880548060200260200160405190810160405280929190818152602001828054801561085257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610e88575050505050905090565b60026006541415610ef5576040805162461bcd60e51b815260206004820152601f6024820152600080516020612764833981519152604482015290519081900360640190fd5b600260065580610f0457600080fd5b6000610f0f33610a27565b90506000610f226064610c448486611f67565b905060646000610f3d610f3361087b565b610c448487611f67565b905082610f4933610a27565b1015610f5457600080fd5b610f5e308461085d565b610f6757600080fd5b610f713384611e29565b336000908152600e6020526040902054610fac90610f9690606490610c449089611f67565b336000908152600e60205260409020549061206e565b336000908152600e60205260409020819055610fcb57610fcb33611fc0565b600080610fd883886120b0565b9150915081610fe657600080fd5b6040805182815290517ffe58aa1cb04799cee89507f6618d46acbbc3d11551df3122cd67b9ee273ea7769181900360200190a1505060016006555050505050565b60408051600280825260608083018452600093849391929060208301908036833701905050905060005b60085481108015611063575060058111155b1561135d5760006008828154811061107757fe5b6000918252602080832090910154604080516370a0823160e01b815230600482015290516001600160a01b03909216945084926370a0823192602480840193829003018186803b1580156110ca57600080fd5b505afa1580156110de573d6000803e3d6000fd5b505050506040513d60208110156110f457600080fd5b505190508061110b5760009550505050505061085a565b6008838154811061111857fe5b600091825260208220015485516001600160a01b0390911691869161113957fe5b6001600160a01b03928316602091820292909201810191909152600c54604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561118d57600080fd5b505afa1580156111a1573d6000803e3d6000fd5b505050506040513d60208110156111b757600080fd5b50518451859060019081106111c857fe5b6001600160a01b03928316602091820292909201810191909152600c546040805163d06ca61f60e01b81526004810186815260248201928352895160448301528951606096949094169463d06ca61f9488948c949092606490910191858201910280838360005b8381101561124757818101518382015260200161122f565b50505050905001935050505060006040518083038186803b15801561126b57600080fd5b505afa15801561127f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156112a857600080fd5b8101908080516040519392919084600160201b8211156112c757600080fd5b9083019060208201858111156112dc57600080fd5b82518660208202830111600160201b821117156112f857600080fd5b82525081516020918201928201910280838360005b8381101561132557818101518382015260200161130d565b5050505090500160405250505090508060018151811061134157fe5b6020026020010151860195505050508080600101915050611051565b509091505090565b600190565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6007805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561141b5780601f106113f05761010080835404028352916020019161141b565b820191906000526020600020905b8154815290600101906020018083116113fe57829003601f168201915b505050505081565b600061142d61087b565b6114415750683635c9adc5dea0000061085a565b600061144b611027565b90506064600061145f83610c448434611f67565b905060006114746064610c4484610b7b61087b565b945061085a9350505050565b600061148b82610908565b509050806114df57600d80546001810182556000919091527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180546001600160a01b0319166001600160a01b0384161790555b5050565b60008282018381101561153d576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b604080516002808252606080830184526000939092919060208301908036833701905050905060005b6008548110801561157f575060058111155b15611a4e57600c60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156115d257600080fd5b505afa1580156115e6573d6000803e3d6000fd5b505050506040513d60208110156115fc57600080fd5b50518251839060009061160b57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506008818154811061163857fe5b9060005260206000200160009054906101000a90046001600160a01b03168260018151811061166357fe5b60200260200101906001600160a01b031690816001600160a01b03168152505060008142600f0101905060006116be6064610c44600986815481106116a457fe5b906000526020600020015434611f6790919063ffffffff16565b600c546040805163d06ca61f60e01b815260048101848152602482019283528851604483015288519495506060946001600160a01b039094169363d06ca61f9387938b93926064909101906020808601910280838360005b8381101561172e578181015183820152602001611716565b50505050905001935050505060006040518083038186803b15801561175257600080fd5b505afa158015611766573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561178f57600080fd5b8101908080516040519392919084600160201b8211156117ae57600080fd5b9083019060208201858111156117c357600080fd5b82518660208202830111600160201b821117156117df57600080fd5b82525081516020918201928201910280838360005b8381101561180c5781810151838201526020016117f4565b5050505090500160405250505090506060600c60009054906101000a90046001600160a01b03166001600160a01b0316637ff36ab58360008151811061184e57fe5b60200260200101518460018151811061186357fe5b60200260200101518930896040518663ffffffff1660e01b81526004018085815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156118d85781810151838201526020016118c0565b50505050905001955050505050506000604051808303818588803b1580156118ff57600080fd5b505af1158015611913573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052602081101561193d57600080fd5b8101908080516040519392919084600160201b82111561195c57600080fd5b90830190602082018581111561197157600080fd5b82518660208202830111600160201b8211171561198d57600080fd5b82525081516020918201928201910280838360005b838110156119ba5781810151838201526020016119a2565b5050505090500160405250505090507f0c0be0458d81eb4d49ad60cf18809971d496be3c9a7293dbf6b1e759b0e95957816040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015611a2b578181015183820152602001611a13565b505050509050019250505060405180910390a150506001909201915061156d9050565b50600191505090565b6001600160a01b038216611ab2576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b611abe60008383610aa6565b600254611acb90826114e3565b6002556001600160a01b038216600090815260208190526040902054611af190826114e3565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b3390565b6001600160a01b038316611b905760405162461bcd60e51b81526004018080602001828103825260248152602001806128a16024913960400191505060405180910390fd5b6001600160a01b038216611bd55760405162461bcd60e51b81526004018080602001828103825260228152602001806127a66022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316611c7c5760405162461bcd60e51b815260040180806020018281038252602581526020018061287c6025913960400191505060405180910390fd5b6001600160a01b038216611cc15760405162461bcd60e51b81526004018080602001828103825260238152602001806127416023913960400191505060405180910390fd5b611ccc838383610aa6565b611d09816040518060600160405280602681526020016127c8602691396001600160a01b0386166000908152602081905260409020549190611d92565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611d3890826114e3565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115611e215760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611de6578181015183820152602001611dce565b50505050905090810190601f168015611e135780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b038216611e6e5760405162461bcd60e51b815260040180806020018281038252602181526020018061285b6021913960400191505060405180910390fd5b611e7a82600083610aa6565b611eb781604051806060016040528060228152602001612784602291396001600160a01b0385166000908152602081905260409020549190611d92565b6001600160a01b038316600090815260208190526040902055600254611edd908261206e565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b600061153d83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506126db565b600082611f7657506000610875565b82820282848281611f8357fe5b041461153d5760405162461bcd60e51b81526004018080602001828103825260218152602001806127ee6021913960400191505060405180910390fd5b600080611fcc83610908565b915091508115610aa657600d80546000198101908110611fe857fe5b600091825260209091200154600d80546001600160a01b03909216918390811061200e57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600d80548061204757fe5b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b600061153d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611d92565b6040805160028082526060808301845260009384938493909160208301908036833701905050905060005b600854811080156120ed575060058111155b156126cc5760006008828154811061210157fe5b6000918252602080832090910154604080516370a0823160e01b815230600482015290516001600160a01b03909216945084926370a0823192602480840193829003018186803b15801561215457600080fd5b505afa158015612168573d6000803e3d6000fd5b505050506040513d602081101561217e57600080fd5b505190506000612198612710610c448b610b7b868f611f67565b9050600081116121a757600080fd5b600c546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810184905290519185169163095ea7b3916044808201926020929091908290030181600087803b1580156121fd57600080fd5b505af1158015612211573d6000803e3d6000fd5b505050506040513d602081101561222757600080fd5b505161223257600080fd5b6008848154811061223f57fe5b600091825260208220015486516001600160a01b0390911691879161226057fe5b6001600160a01b03928316602091820292909201810191909152600c54604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156122b457600080fd5b505afa1580156122c8573d6000803e3d6000fd5b505050506040513d60208110156122de57600080fd5b50518551869060019081106122ef57fe5b6001600160a01b03928316602091820292909201810191909152600c546040805163d06ca61f60e01b815260048101868152602482019283528a5160448301528a51606096949094169463d06ca61f9488948d949092606490910191858201910280838360005b8381101561236e578181015183820152602001612356565b50505050905001935050505060006040518083038186803b15801561239257600080fd5b505afa1580156123a6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156123cf57600080fd5b8101908080516040519392919084600160201b8211156123ee57600080fd5b90830190602082018581111561240357600080fd5b82518660208202830111600160201b8211171561241f57600080fd5b82525081516020918201928201910280838360005b8381101561244c578181015183820152602001612434565b505050509050016040525050509050620f42408160018151811061246c57fe5b60200260200101511161247e57600080fd5b600c548151428701600f01916060916001600160a01b03909116906318cbafe59085906000906124aa57fe5b6020026020010151856001815181106124bf57fe5b60200260200101518b33876040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b8381101561253a578181015183820152602001612522565b505050509050019650505050505050600060405180830381600087803b15801561256357600080fd5b505af1158015612577573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156125a057600080fd5b8101908080516040519392919084600160201b8211156125bf57600080fd5b9083019060208201858111156125d457600080fd5b82518660208202830111600160201b821117156125f057600080fd5b82525081516020918201928201910280838360005b8381101561261d578181015183820152602001612605565b5050505090500160405250505090508060018151811061263957fe5b6020026020010151890198507f0c0be0458d81eb4d49ad60cf18809971d496be3c9a7293dbf6b1e759b0e95957816040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156126a757818101518382015260200161268f565b505050509050019250505060405180910390a15050600190940193506120db92505050565b50600196919550909350505050565b6000818361272a5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611de6578181015183820152602001611dce565b50600083858161273657fe5b049594505050505056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573735265656e7472616e637947756172643a207265656e7472616e742063616c6c0045524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220b39c41f27f5331a77ab08f19f091bbcc3ebd376e4d7b64d8bdabd4458f5c01b064736f6c634300060c0033a2646970667358221220356a3834b860368919423d9e75603104284b2e8000bd0d0a25fac8f79896a47d64736f6c634300060c0033
Deployed Bytecode Sourcemap
41721:1269:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42301:343;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42301:343:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42301:343:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42301:343:0;;;;;;;;-1:-1:-1;42301:343:0;;-1:-1:-1;;;;;42301:343:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42301:343:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42301:343:0;;;;;;;;-1:-1:-1;42301:343:0;;-1:-1:-1;;;;;42301:343:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42301:343:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42301:343:0;;-1:-1:-1;42301:343:0;;-1:-1:-1;;;;;42301:343:0:i;:::-;;;;-1:-1:-1;;;;;42301:343:0;;;;;;;;;;;;;;42179:114;;;;;;;;;;;;;;;;-1:-1:-1;42179:114:0;-1:-1:-1;;;;;42179:114:0;;:::i;:::-;;;;;;;;;;;;;;;;;;42069:102;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41957:104;;;:::i;42652:335::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42652:335:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42652:335:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42652:335:0;;;;;;;;-1:-1:-1;42652:335:0;;-1:-1:-1;;;;;42652:335:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42652:335:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42652:335:0;;;;;;;;-1:-1:-1;42652:335:0;;-1:-1:-1;;;;;42652:335:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42652:335:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42652:335:0;;-1:-1:-1;42652:335:0;;-1:-1:-1;;;;;42652:335:0:i;42301:343::-;42410:7;42430:10;42453:5;42460:7;42469:8;42479:10;42443:47;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;42443:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42443:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42506:17:0;;;-1:-1:-1;;;;;42506:17:0;;;;;;42430:60;;-1:-1:-1;42506:17:0;;;;;;;;;;42534:12;:32;;;;;;;;;;;;;;-1:-1:-1;;;;;;42534:32:0;-1:-1:-1;;;;;42534:32:0;;;;;;;;42577:21;;:6;42534:32;42577:21;;;;;:28;;-1:-1:-1;;42577:28:0;;;;;;42534:32;42301:343;-1:-1:-1;;;;42301:343:0:o;42179:114::-;-1:-1:-1;;;;;42265:20:0;42241:4;42265:20;;;:6;:20;;;;;;;;;42179:114::o;42069:102::-;42116:16;42152:11;42145:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42145:18:0;;;;;;;;;;;;;;;;;;;;;;;42069:102;:::o;41957:104::-;42005:16;42041:12;42034:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42034:19:0;;;;;;;;;;;;;;;;;;;;;;41957:104;:::o;42652:335::-;42767:7;42787:16;42822:5;42829:7;42838:8;42848:10;42806:53;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;42806:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42806:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42875:23:0;;;-1:-1:-1;;;;;42875:23:0;;;;;;42787:72;;-1:-1:-1;42875:23:0;;;;;;;;;;42909:11;:31;;;;;;;;;;;-1:-1:-1;;;;;42909:31:0;;;-1:-1:-1;;;;;;42909:31:0;;;;;;;-1:-1:-1;42951:21:0;;;:6;42909:31;42951:21;;;;;:28;;-1:-1:-1;;42951:28:0;;;;;;42652:335;;-1:-1:-1;;;42652:335:0:o;-1:-1:-1:-;;;;;;;;:::o;:::-;;;;;;;;:::o
Swarm Source
ipfs://356a3834b860368919423d9e75603104284b2e8000bd0d0a25fac8f79896a47d
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.