Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 42679 | 340 days ago | Contract Creation | 0 HYPE |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
HyperswapPair
Compiler Version
v0.5.16+commit.9c3226ce
Optimization Enabled:
Yes with 500 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
pragma solidity >=0.5.16;
import './interfaces/IHyperswapPair.sol';
import './UniswapV2ERC20.sol';
import './libraries/Math.sol';
import './interfaces/IERC20.sol';
import './interfaces/IHyperswapFactory.sol';
import './interfaces/IUniswapV2Callee.sol';
contract HyperswapPair is IHyperswapPair, UniswapV2ERC20 {
using SafeMath for uint;
uint public constant MINIMUM_LIQUIDITY = 10 ** 3;
bytes4 private constant SELECTOR = bytes4(keccak256(bytes('transfer(address,uint256)')));
address public factory;
address public token0;
address public token1;
bool public initialized;
uint public constant FEE_DENOMINATOR = 100000;
uint public constant MAX_FEE_PERCENT = 2000; // = 2%
uint112 private reserve0; // uses single storage slot, accessible via getReserves
uint112 private reserve1; // uses single storage slot, accessible via getReserves
uint16 public token0FeePercent = 300; // default = 0.3% // uses single storage slot, accessible via getReserves
uint16 public token1FeePercent = 300; // default = 0.3% // uses single storage slot, accessible via getReserves
uint public precisionMultiplier0;
uint public precisionMultiplier1;
uint public kLast; // reserve0 * reserve1, as of immediately after the most recent liquidity event
bool public stableSwap; // if set to true, defines pair type as stable
bool public pairTypeImmutable; // if set to true, stableSwap states cannot be updated anymore
uint private unlocked = 1;
modifier lock() {
require(unlocked == 1, 'HyperswapPair LOCKED');
unlocked = 0;
_;
unlocked = 1;
}
function getReserves() public view returns (uint112 _reserve0, uint112 _reserve1, uint16 _token0FeePercent, uint16 _token1FeePercent) {
_reserve0 = reserve0;
_reserve1 = reserve1;
_token0FeePercent = token0FeePercent;
_token1FeePercent = token1FeePercent;
}
function _safeTransfer(address token, address to, uint value) private {
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(SELECTOR, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'HyperswapPair TRANSFER_FAILED');
}
event DrainWrongToken(address indexed token, address to);
event FeePercentUpdated(uint16 token0FeePercent, uint16 token1FeePercent);
event SetStableSwap(bool prevStableSwap, bool stableSwap);
event SetPairTypeImmutable();
event Mint(address indexed sender, uint amount0, uint amount1);
event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
event Swap(
address indexed sender,
uint amount0In,
uint amount1In,
uint amount0Out,
uint amount1Out,
address indexed to
);
event Sync(uint112 reserve0, uint112 reserve1);
event Skim();
constructor() public {
factory = msg.sender;
}
// called once by the factory at time of deployment
function initialize(address _token0, address _token1) external {
require(msg.sender == factory && !initialized, 'HyperswapPair FORBIDDEN');
// sufficient check
token0 = _token0;
token1 = _token1;
precisionMultiplier0 = 10 ** uint(IERC20(_token0).decimals());
precisionMultiplier1 = 10 ** uint(IERC20(_token1).decimals());
initialized = true;
}
/**
* @dev Updates the swap fees percent
*
* Can only be called by the factory's feeAmountOwner
*/
function setFeePercent(uint16 newToken0FeePercent, uint16 newToken1FeePercent) external lock {
require(msg.sender == IHyperswapFactory(factory).feePercentOwner(), "HyperswapPair only factory's feeAmountOwner");
require(newToken0FeePercent <= MAX_FEE_PERCENT && newToken1FeePercent <= MAX_FEE_PERCENT, "HyperswapPair feePercent mustn't exceed the maximum");
require(newToken0FeePercent > 0 && newToken1FeePercent > 0, "HyperswapPair feePercent mustn't exceed the minimum");
token0FeePercent = newToken0FeePercent;
token1FeePercent = newToken1FeePercent;
emit FeePercentUpdated(newToken0FeePercent, newToken1FeePercent);
}
function setStableSwap(bool stable, uint112 expectedReserve0, uint112 expectedReserve1) external lock {
require(msg.sender == IHyperswapFactory(factory).setStableOwner(), "HyperswapPair only factory's setStableOwner");
require(!pairTypeImmutable, "HyperswapPair immutable");
require(stable != stableSwap, "HyperswapPair no update");
require(expectedReserve0 == reserve0 && expectedReserve1 == reserve1, "HyperswapPair failed");
bool feeOn = _mintFee(reserve0, reserve1);
emit SetStableSwap(stableSwap, stable);
stableSwap = stable;
kLast = (feeOn) ? _k(uint(reserve0), uint(reserve1)) : 0;
}
function setPairTypeImmutable() external lock {
require(msg.sender == IHyperswapFactory(factory).owner(), "HyperswapPair only factory's owner");
require(!pairTypeImmutable, "HyperswapPair already immutable");
pairTypeImmutable = true;
emit SetPairTypeImmutable();
}
// update reserves
function _update(uint balance0, uint balance1) private {
require(balance0 <= uint112(- 1) && balance1 <= uint112(- 1), 'HyperswapPair OVERFLOW');
reserve0 = uint112(balance0);
reserve1 = uint112(balance1);
emit Sync(uint112(balance0), uint112(balance1));
}
// if fee is on, mint liquidity equivalent to "factory.ownerFeeShare()" of the growth in sqrt(k)
// only for uni configuration
function _mintFee(uint112 _reserve0, uint112 _reserve1) private returns (bool feeOn) {
if(stableSwap) return false;
(uint ownerFeeShare, address feeTo) = IHyperswapFactory(factory).feeInfo();
feeOn = feeTo != address(0);
uint _kLast = kLast;
// gas savings
if (feeOn) {
if (_kLast != 0) {
uint rootK = Math.sqrt(_k(uint(_reserve0), uint(_reserve1)));
uint rootKLast = Math.sqrt(_kLast);
if (rootK > rootKLast) {
uint d = (FEE_DENOMINATOR.mul(100) / ownerFeeShare).sub(100);
uint numerator = totalSupply.mul(rootK.sub(rootKLast)).mul(100);
uint denominator = rootK.mul(d).add(rootKLast.mul(100));
uint liquidity = numerator / denominator;
if (liquidity > 0) _mint(feeTo, liquidity);
}
}
} else if (_kLast != 0) {
kLast = 0;
}
}
/**
* @dev Allows the protocol to claim accumulated fees from the pair without requiring
* a mint or burn action from an LP. Updates reserves and `kLast` accordingly.
*/
function forceClaimFees() external {
require(msg.sender == IHyperswapFactory(factory).owner(), "HyperswapPair only factory's owner");
(uint112 _reserve0, uint112 _reserve1,,) = getReserves();
bool feeOn = _mintFee(_reserve0, _reserve1);
uint balance0 = IERC20(token0).balanceOf(address(this));
uint balance1 = IERC20(token1).balanceOf(address(this));
_update(balance0, balance1);
if (feeOn) kLast = _k(uint(reserve0), uint(reserve1));
}
// this low-level function should be called from a contract which performs important safety checks
function mint(address to) external lock returns (uint liquidity) {
(uint112 _reserve0, uint112 _reserve1,,) = getReserves();
// gas savings
uint balance0 = IERC20(token0).balanceOf(address(this));
uint balance1 = IERC20(token1).balanceOf(address(this));
uint amount0 = balance0.sub(_reserve0);
uint amount1 = balance1.sub(_reserve1);
bool feeOn = _mintFee(_reserve0, _reserve1);
uint _totalSupply = totalSupply;
// gas savings, must be defined here since totalSupply can update in _mintFee
if (_totalSupply == 0) {
liquidity = Math.sqrt(amount0.mul(amount1)).sub(MINIMUM_LIQUIDITY);
_mint(address(0), MINIMUM_LIQUIDITY);
// permanently lock the first MINIMUM_LIQUIDITY tokens
} else {
liquidity = Math.min(amount0.mul(_totalSupply) / _reserve0, amount1.mul(_totalSupply) / _reserve1);
}
require(liquidity > 0, 'HyperswapPair INSUFFICIENT_LIQUIDITY_MINTED');
_mint(to, liquidity);
_update(balance0, balance1);
if (feeOn) kLast = _k(uint(reserve0), uint(reserve1));
// reserve0 and reserve1 are up-to-date
emit Mint(msg.sender, amount0, amount1);
}
// this low-level function should be called from a contract which performs important safety checks
function burn(address to) external lock returns (uint amount0, uint amount1) {
(uint112 _reserve0, uint112 _reserve1,,) = getReserves(); // gas savings
address _token0 = token0; // gas savings
address _token1 = token1; // gas savings
uint balance0 = IERC20(_token0).balanceOf(address(this));
uint balance1 = IERC20(_token1).balanceOf(address(this));
uint liquidity = balanceOf[address(this)];
bool feeOn = _mintFee(_reserve0, _reserve1);
uint _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee
amount0 = liquidity.mul(balance0) / _totalSupply; // using balances ensures pro-rata distribution
amount1 = liquidity.mul(balance1) / _totalSupply; // using balances ensures pro-rata distribution
require(amount0 > 0 && amount1 > 0, 'HyperswapPair INSUFFICIENT_LIQUIDITY_BURNED');
_burn(address(this), liquidity);
_safeTransfer(_token0, to, amount0);
_safeTransfer(_token1, to, amount1);
balance0 = IERC20(_token0).balanceOf(address(this));
balance1 = IERC20(_token1).balanceOf(address(this));
_update(balance0, balance1);
if (feeOn) kLast = _k(uint(reserve0), uint(reserve1)); // reserve0 and reserve1 are up-to-date
emit Burn(msg.sender, amount0, amount1, to);
}
struct TokensData {
address token0;
address token1;
uint amount0Out;
uint amount1Out;
uint balance0;
uint balance1;
uint remainingFee0;
uint remainingFee1;
}
// this low-level function should be called from a contract which performs important safety checks
function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external {
TokensData memory tokensData = TokensData({
token0: token0,
token1: token1,
amount0Out: amount0Out,
amount1Out: amount1Out,
balance0: 0,
balance1: 0,
remainingFee0: 0,
remainingFee1: 0
});
_swap(tokensData, to, data, address(0));
}
// this low-level function should be called from a contract which performs important safety checks
function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data, address referrer) external {
TokensData memory tokensData = TokensData({
token0: token0,
token1: token1,
amount0Out: amount0Out,
amount1Out: amount1Out,
balance0: 0,
balance1: 0,
remainingFee0: 0,
remainingFee1: 0
});
_swap(tokensData, to, data, referrer);
}
function _swap(TokensData memory tokensData, address to, bytes memory data, address referrer) internal lock {
require(tokensData.amount0Out > 0 || tokensData.amount1Out > 0, 'HyperswapPair INSUFFICIENT_OUTPUT_AMOUNT');
(uint112 _reserve0, uint112 _reserve1, uint16 _token0FeePercent, uint16 _token1FeePercent) = getReserves();
require(tokensData.amount0Out < _reserve0 && tokensData.amount1Out < _reserve1, 'HyperswapPair INSUFFICIENT_LIQUIDITY');
{
require(to != tokensData.token0 && to != tokensData.token1, 'HyperswapPair INVALID_TO');
// optimistically transfer tokens
if (tokensData.amount0Out > 0) _safeTransfer(tokensData.token0, to, tokensData.amount0Out);
// optimistically transfer tokens
if (tokensData.amount1Out > 0) _safeTransfer(tokensData.token1, to, tokensData.amount1Out);
if (data.length > 0) IUniswapV2Callee(to).uniswapV2Call(msg.sender, tokensData.amount0Out, tokensData.amount1Out, data);
tokensData.balance0 = IERC20(tokensData.token0).balanceOf(address(this));
tokensData.balance1 = IERC20(tokensData.token1).balanceOf(address(this));
}
uint amount0In = tokensData.balance0 > _reserve0 - tokensData.amount0Out ? tokensData.balance0 - (_reserve0 - tokensData.amount0Out) : 0;
uint amount1In = tokensData.balance1 > _reserve1 - tokensData.amount1Out ? tokensData.balance1 - (_reserve1 - tokensData.amount1Out) : 0;
require(amount0In > 0 || amount1In > 0, 'HyperswapPair INSUFFICIENT_INPUT_AMOUNT');
tokensData.remainingFee0 = amount0In.mul(_token0FeePercent) / FEE_DENOMINATOR;
tokensData.remainingFee1 = amount1In.mul(_token1FeePercent) / FEE_DENOMINATOR;
{// scope for referer/stable fees management
uint fee = 0;
uint referrerInputFeeShare = referrer != address(0) ? IHyperswapFactory(factory).referrersFeeShare(referrer) : 0;
if (referrerInputFeeShare > 0) {
if (amount0In > 0) {
fee = amount0In.mul(referrerInputFeeShare).mul(_token0FeePercent) / (FEE_DENOMINATOR ** 2);
tokensData.remainingFee0 = tokensData.remainingFee0.sub(fee);
_safeTransfer(tokensData.token0, referrer, fee);
}
if (amount1In > 0) {
fee = amount1In.mul(referrerInputFeeShare).mul(_token1FeePercent) / (FEE_DENOMINATOR ** 2);
tokensData.remainingFee1 = tokensData.remainingFee1.sub(fee);
_safeTransfer(tokensData.token1, referrer, fee);
}
}
if(stableSwap){
(uint ownerFeeShare, address feeTo) = IHyperswapFactory(factory).feeInfo();
if(feeTo != address(0)) {
ownerFeeShare = FEE_DENOMINATOR.sub(referrerInputFeeShare).mul(ownerFeeShare);
if (amount0In > 0) {
fee = amount0In.mul(ownerFeeShare).mul(_token0FeePercent) / (FEE_DENOMINATOR ** 3);
tokensData.remainingFee0 = tokensData.remainingFee0.sub(fee);
_safeTransfer(tokensData.token0, feeTo, fee);
}
if (amount1In > 0) {
fee = amount1In.mul(ownerFeeShare).mul(_token1FeePercent) / (FEE_DENOMINATOR ** 3);
tokensData.remainingFee1 = tokensData.remainingFee1.sub(fee);
_safeTransfer(tokensData.token1, feeTo, fee);
}
}
}
// readjust tokens balance
if (amount0In > 0) tokensData.balance0 = IERC20(tokensData.token0).balanceOf(address(this));
if (amount1In > 0) tokensData.balance1 = IERC20(tokensData.token1).balanceOf(address(this));
}
{// scope for reserve{0,1}Adjusted, avoids stack too deep errors
uint balance0Adjusted = tokensData.balance0.sub(tokensData.remainingFee0);
uint balance1Adjusted = tokensData.balance1.sub(tokensData.remainingFee1);
require(_k(balance0Adjusted, balance1Adjusted) >= _k(uint(_reserve0), uint(_reserve1)), 'HyperswapPair K');
}
_update(tokensData.balance0, tokensData.balance1);
emit Swap(msg.sender, amount0In, amount1In, tokensData.amount0Out, tokensData.amount1Out, to);
}
function _k(uint balance0, uint balance1) internal view returns (uint) {
if (stableSwap) {
uint _x = balance0.mul(1e18) / precisionMultiplier0;
uint _y = balance1.mul(1e18) / precisionMultiplier1;
uint _a = (_x.mul(_y)) / 1e18;
uint _b = (_x.mul(_x) / 1e18).add(_y.mul(_y) / 1e18);
return _a.mul(_b) / 1e18; // x3y+y3x >= k
}
return balance0.mul(balance1);
}
function _get_y(uint x0, uint xy, uint y) internal pure returns (uint) {
for (uint i = 0; i < 255; i++) {
uint y_prev = y;
uint k = _f(x0, y);
if (k < xy) {
uint dy = (xy - k) * 1e18 / _d(x0, y);
y = y + dy;
} else {
uint dy = (k - xy) * 1e18 / _d(x0, y);
y = y - dy;
}
if (y > y_prev) {
if (y - y_prev <= 1) {
return y;
}
} else {
if (y_prev - y <= 1) {
return y;
}
}
}
return y;
}
function _f(uint x0, uint y) internal pure returns (uint) {
return x0 * (y * y / 1e18 * y / 1e18) / 1e18 + (x0 * x0 / 1e18 * x0 / 1e18) * y / 1e18;
}
function _d(uint x0, uint y) internal pure returns (uint) {
return 3 * x0 * (y * y / 1e18) / 1e18 + (x0 * x0 / 1e18 * x0 / 1e18);
}
function getAmountOut(uint amountIn, address tokenIn) external view returns (uint) {
uint16 feePercent = tokenIn == token0 ? token0FeePercent : token1FeePercent;
return _getAmountOut(amountIn, tokenIn, uint(reserve0), uint(reserve1), feePercent);
}
function _getAmountOut(uint amountIn, address tokenIn, uint _reserve0, uint _reserve1, uint feePercent) internal view returns (uint) {
if (stableSwap) {
amountIn = amountIn.sub(amountIn.mul(feePercent) / FEE_DENOMINATOR); // remove fee from amount received
uint xy = _k(_reserve0, _reserve1);
_reserve0 = _reserve0 * 1e18 / precisionMultiplier0;
_reserve1 = _reserve1 * 1e18 / precisionMultiplier1;
(uint reserveA, uint reserveB) = tokenIn == token0 ? (_reserve0, _reserve1) : (_reserve1, _reserve0);
amountIn = tokenIn == token0 ? amountIn * 1e18 / precisionMultiplier0 : amountIn * 1e18 / precisionMultiplier1;
uint y = reserveB - _get_y(amountIn + reserveA, xy, reserveB);
return y * (tokenIn == token0 ? precisionMultiplier1 : precisionMultiplier0) / 1e18;
} else {
(uint reserveA, uint reserveB) = tokenIn == token0 ? (_reserve0, _reserve1) : (_reserve1, _reserve0);
amountIn = amountIn.mul(FEE_DENOMINATOR.sub(feePercent));
return (amountIn.mul(reserveB)) / (reserveA.mul(FEE_DENOMINATOR).add(amountIn));
}
}
// force balances to match reserves
function skim(address to) external lock {
address _token0 = token0;
// gas savings
address _token1 = token1;
// gas savings
_safeTransfer(_token0, to, IERC20(_token0).balanceOf(address(this)).sub(reserve0));
_safeTransfer(_token1, to, IERC20(_token1).balanceOf(address(this)).sub(reserve1));
emit Skim();
}
// force reserves to match balances
function sync() external lock {
uint token0Balance = IERC20(token0).balanceOf(address(this));
uint token1Balance = IERC20(token1).balanceOf(address(this));
require(token0Balance != 0 && token1Balance != 0, "HyperswapPair liquidity ratio not initialized");
_update(token0Balance, token1Balance);
}
/**
* @dev Allow to recover token sent here by mistake
*
* Can only be called by factory's owner
*/
function drainWrongToken(address token, address to) external lock {
require(msg.sender == IHyperswapFactory(factory).owner(), "HyperswapPair only factory's owner");
require(token != token0 && token != token1, "HyperswapPair invalid token");
_safeTransfer(token, to, IERC20(token).balanceOf(address(this)));
emit DrainWrongToken(token, to);
}
}pragma solidity =0.5.16;
import './interfaces/IUniswapV2ERC20.sol';
import './libraries/SafeMath.sol';
contract UniswapV2ERC20 is IUniswapV2ERC20 {
using SafeMath for uint;
string public constant name = 'Hyperswap LP';
string public constant symbol = 'SWAP-LP';
uint8 public constant decimals = 18;
uint public totalSupply;
mapping(address => uint) public balanceOf;
mapping(address => mapping(address => uint)) public allowance;
bytes32 public DOMAIN_SEPARATOR;
// keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;
mapping(address => uint) public nonces;
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
constructor() public {
uint chainId;
assembly {
chainId := chainid
}
DOMAIN_SEPARATOR = keccak256(
abi.encode(
keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'),
keccak256(bytes(name)),
keccak256(bytes('1')),
chainId,
address(this)
)
);
}
function _mint(address to, uint value) internal {
totalSupply = totalSupply.add(value);
balanceOf[to] = balanceOf[to].add(value);
emit Transfer(address(0), to, value);
}
function _burn(address from, uint value) internal {
balanceOf[from] = balanceOf[from].sub(value);
totalSupply = totalSupply.sub(value);
emit Transfer(from, address(0), value);
}
function _approve(address owner, address spender, uint value) private {
allowance[owner][spender] = value;
emit Approval(owner, spender, value);
}
function _transfer(address from, address to, uint value) private {
balanceOf[from] = balanceOf[from].sub(value);
balanceOf[to] = balanceOf[to].add(value);
emit Transfer(from, to, value);
}
function approve(address spender, uint value) external returns (bool) {
_approve(msg.sender, spender, value);
return true;
}
function transfer(address to, uint value) external returns (bool) {
_transfer(msg.sender, to, value);
return true;
}
function transferFrom(address from, address to, uint value) external returns (bool) {
if (allowance[from][msg.sender] != uint(-1)) {
uint remaining = allowance[from][msg.sender].sub(value);
allowance[from][msg.sender] = remaining;
emit Approval(from, msg.sender, remaining);
}
_transfer(from, to, value);
return true;
}
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external {
require(deadline >= block.timestamp, 'Hyperswap EXPIRED');
bytes32 digest = keccak256(
abi.encodePacked(
'\x19\x01',
DOMAIN_SEPARATOR,
keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))
)
);
address recoveredAddress = ecrecover(digest, v, r, s);
require(recoveredAddress != address(0) && recoveredAddress == owner, 'Hyperswap INVALID_SIGNATURE');
_approve(owner, spender, value);
}
}pragma solidity >=0.5.0;
interface IERC20 {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
}pragma solidity >=0.5.0;
interface IHyperswapFactory {
event PairCreated(address indexed token0, address indexed token1, address pair, uint256);
function owner() external view returns (address);
function feePercentOwner() external view returns (address);
function setStableOwner() external view returns (address);
function setSetStableOwner(address _setStableOwner) external;
function setOwner(address _owner) external;
function feeTo() external view returns (address);
function ownerFeeShare() external view returns (uint256);
function referrersFeeShare(address) external view returns (uint256);
function setReferrerFeeShare(address referrer, uint referrerFeeShare) external;
function getPair(address tokenA, address tokenB) external view returns (address pair);
function allPairs(uint256) external view returns (address pair);
function allPairsLength() external view returns (uint256);
function createPair(address tokenA, address tokenB) external returns (address pair);
function setFeeTo(address) external;
function feeInfo() external view returns (uint _ownerFeeShare, address _feeTo);
}pragma solidity >=0.5.0;
interface IHyperswapPair {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
function name() external pure returns (string memory);
function symbol() external pure returns (string memory);
function decimals() external pure returns (uint8);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
function DOMAIN_SEPARATOR() external view returns (bytes32);
function PERMIT_TYPEHASH() external pure returns (bytes32);
function nonces(address owner) external view returns (uint);
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
event Mint(address indexed sender, uint amount0, uint amount1);
event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
event Swap(
address indexed sender,
uint amount0In,
uint amount1In,
uint amount0Out,
uint amount1Out,
address indexed to
);
event Sync(uint112 reserve0, uint112 reserve1);
function MINIMUM_LIQUIDITY() external pure returns (uint);
function factory() external view returns (address);
function token0() external view returns (address);
function token1() external view returns (address);
function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint16 token0feePercent, uint16 token1FeePercent);
function getAmountOut(uint amountIn, address tokenIn) external view returns (uint);
function kLast() external view returns (uint);
function setFeePercent(uint16 token0FeePercent, uint16 token1FeePercent) external;
function mint(address to) external returns (uint liquidity);
function burn(address to) external returns (uint amount0, uint amount1);
function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data, address referrer) external;
function skim(address to) external;
function sync() external;
function forceClaimFees() external;
function initialize(address, address) external;
}pragma solidity >=0.5.0;
interface IUniswapV2Callee {
function uniswapV2Call(address sender, uint amount0, uint amount1, bytes calldata data) external;
}pragma solidity >=0.5.0;
interface IUniswapV2ERC20 {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
function name() external pure returns (string memory);
function symbol() external pure returns (string memory);
function decimals() external pure returns (uint8);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
function DOMAIN_SEPARATOR() external view returns (bytes32);
function PERMIT_TYPEHASH() external pure returns (bytes32);
function nonces(address owner) external view returns (uint);
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
}pragma solidity =0.5.16;
// a library for performing various math operations
library Math {
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a >= b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow, so we distribute
return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
}
// babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
function sqrt(uint y) internal pure returns (uint z) {
if (y > 3) {
z = y;
uint x = y / 2 + 1;
while (x < z) {
z = x;
x = (y / x + x) / 2;
}
} else if (y != 0) {
z = 1;
}
}
}pragma solidity >=0.5.16;
// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)
library SafeMath {
uint256 constant WAD = 10 ** 18;
uint256 constant RAY = 10 ** 27;
function wad() public pure returns (uint256) {
return WAD;
}
function ray() public pure returns (uint256) {
return RAY;
}
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
function 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;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
// Solidity only automatically asserts when dividing by 0
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a <= b ? a : b;
}
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a >= b ? a : b;
}
function sqrt(uint256 a) internal pure returns (uint256 b) {
if (a > 3) {
b = a;
uint256 x = a / 2 + 1;
while (x < b) {
b = x;
x = (a / x + x) / 2;
}
} else if (a != 0) {
b = 1;
}
}
function wmul(uint256 a, uint256 b) internal pure returns (uint256) {
return mul(a, b) / WAD;
}
function wmulRound(uint256 a, uint256 b) internal pure returns (uint256) {
return add(mul(a, b), WAD / 2) / WAD;
}
function rmul(uint256 a, uint256 b) internal pure returns (uint256) {
return mul(a, b) / RAY;
}
function rmulRound(uint256 a, uint256 b) internal pure returns (uint256) {
return add(mul(a, b), RAY / 2) / RAY;
}
function wdiv(uint256 a, uint256 b) internal pure returns (uint256) {
return div(mul(a, WAD), b);
}
function wdivRound(uint256 a, uint256 b) internal pure returns (uint256) {
return add(mul(a, WAD), b / 2) / b;
}
function rdiv(uint256 a, uint256 b) internal pure returns (uint256) {
return div(mul(a, RAY), b);
}
function rdivRound(uint256 a, uint256 b) internal pure returns (uint256) {
return add(mul(a, RAY), b / 2) / b;
}
function wpow(uint256 x, uint256 n) internal pure returns (uint256) {
uint256 result = WAD;
while (n > 0) {
if (n % 2 != 0) {
result = wmul(result, x);
}
x = wmul(x, x);
n /= 2;
}
return result;
}
function rpow(uint256 x, uint256 n) internal pure returns (uint256) {
uint256 result = RAY;
while (n > 0) {
if (n % 2 != 0) {
result = rmul(result, x);
}
x = rmul(x, x);
n /= 2;
}
return result;
}
}{
"libraries": {},
"optimizer": {
"enabled": true,
"runs": 500
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"}],"name":"DrainWrongToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"token0FeePercent","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"token1FeePercent","type":"uint16"}],"name":"FeePercentUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[],"name":"SetPairTypeImmutable","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"prevStableSwap","type":"bool"},{"indexed":false,"internalType":"bool","name":"stableSwap","type":"bool"}],"name":"SetStableSwap","type":"event"},{"anonymous":false,"inputs":[],"name":"Skim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1Out","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint112","name":"reserve0","type":"uint112"},{"indexed":false,"internalType":"uint112","name":"reserve1","type":"uint112"}],"name":"Sync","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":true,"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"FEE_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_FEE_PERCENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MINIMUM_LIQUIDITY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"burn","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"drainWrongToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"forceClaimFees","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getReserves","outputs":[{"internalType":"uint112","name":"_reserve0","type":"uint112"},{"internalType":"uint112","name":"_reserve1","type":"uint112"},{"internalType":"uint16","name":"_token0FeePercent","type":"uint16"},{"internalType":"uint16","name":"_token1FeePercent","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token0","type":"address"},{"internalType":"address","name":"_token1","type":"address"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"kLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pairTypeImmutable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"precisionMultiplier0","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"precisionMultiplier1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint16","name":"newToken0FeePercent","type":"uint16"},{"internalType":"uint16","name":"newToken1FeePercent","type":"uint16"}],"name":"setFeePercent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"setPairTypeImmutable","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint112","name":"expectedReserve0","type":"uint112"},{"internalType":"uint112","name":"expectedReserve1","type":"uint112"}],"name":"setStableSwap","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"skim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"stableSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount0Out","type":"uint256"},{"internalType":"uint256","name":"amount1Out","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"swap","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount0Out","type":"uint256"},{"internalType":"uint256","name":"amount1Out","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"address","name":"referrer","type":"address"}],"name":"swap","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"sync","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"token0FeePercent","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"token1FeePercent","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040526008805461ffff60e01b1916604b60e21b176001600160f01b0316604b60f21b1790556001600d5534801561003857600080fd5b506040514690806052613fad8239604080519182900360520182208282018252600c83526b0487970657273776170204c560a41b6020938401528151808301835260018152603160f81b908401528151808401919091527f58f480df8d48ff925278c45d98d539a679d6b759331a818079400967dd1f26a0818301527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606082015260808101949094523060a0808601919091528151808603909101815260c09094019052825192019190912060035550600580546001600160a01b03191633179055613e838061012a6000396000f3fe608060405234801561001057600080fd5b50600436106102635760003560e01c806367d8174011610156578063b6200b07116100d3578063d505accf11610097578063f140a35a11610071578063f140a35a146107ce578063f39ac11f146107fa578063fff6cae91461082857610263565b8063d505accf14610747578063d73792a914610798578063dd62ed3e146107a057610263565b8063b6200b0714610701578063ba9a7a5614610709578063bc25cf7714610711578063c45a015514610737578063d21220a71461073f57610263565b80637ecebe001161011a5780637ecebe001461066057806389afcb441461068657806395d89b41146106c55780639e548b7f146106cd578063a9059cbb146106d557610263565b806367d817401461056f5780636a627842146105775780636e1fdd7f1461059d57806370a08231146106325780637464fc3d1461065857610263565b80632fcd1692116101e45780633b9f1dc0116101a85780633b9f1dc0146105005780633ba1707714610508578063485cc9551461051057806348e5d2601461053e57806362ecec031461056757610263565b80632fcd16921461047d5780633029e5d41461049c57806330adf81f146104d2578063313ce567146104da5780633644e515146104f857610263565b80630dfe16811161022b5780630dfe1681146103f9578063158ef93e1461041d57806318160ddd1461042557806323b872dd1461043f578063288e5d021461047557610263565b8063022c0d9f1461026857806306fdde03146102f65780630902f1ac14610373578063095ea7b3146103b15780630a0ef8b5146103f1575b600080fd5b6102f46004803603608081101561027e57600080fd5b8135916020810135916001600160a01b0360408301351691908101906080810160608201356401000000008111156102b557600080fd5b8201836020820111156102c757600080fd5b803590602001918460018302840111640100000000831117156102e957600080fd5b509092509050610830565b005b6102fe6108d1565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610338578181015183820152602001610320565b50505050905090810190601f1680156103655780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61037b6108f9565b604080516001600160701b03958616815293909416602084015261ffff9182168385015216606082015290519081900360800190f35b6103dd600480360360408110156103c757600080fd5b506001600160a01b03813516906020013561092c565b604080519115158252519081900360200190f35b6102f4610943565b610401610b57565b604080516001600160a01b039092168252519081900360200190f35b6103dd610b66565b61042d610b76565b60408051918252519081900360200190f35b6103dd6004803603606081101561045557600080fd5b506001600160a01b03813581169160208101359091169060400135610b7c565b61042d610c53565b610485610c59565b6040805161ffff9092168252519081900360200190f35b6102f4600480360360608110156104b257600080fd5b5080351515906001600160701b0360208201358116916040013516610c6a565b61042d610f62565b6104e2610f86565b6040805160ff9092168252519081900360200190f35b61042d610f8b565b61042d610f91565b6102f4610f97565b6102f46004803603604081101561052657600080fd5b506001600160a01b038135811691602001351661113d565b6102f46004803603604081101561055457600080fd5b5061ffff813581169160200135166112e5565b61048561152a565b61042d61153b565b61042d6004803603602081101561058d57600080fd5b50356001600160a01b0316611541565b6102f4600480360360a08110156105b357600080fd5b8135916020810135916001600160a01b0360408301351691908101906080810160608201356401000000008111156105ea57600080fd5b8201836020820111156105fc57600080fd5b8035906020019184600183028401116401000000008311171561061e57600080fd5b9193509150356001600160a01b0316611849565b61042d6004803603602081101561064857600080fd5b50356001600160a01b03166118ed565b61042d6118ff565b61042d6004803603602081101561067657600080fd5b50356001600160a01b0316611905565b6106ac6004803603602081101561069c57600080fd5b50356001600160a01b0316611917565b6040805192835260208301919091528051918290030190f35b6102fe611cb9565b6103dd611cdc565b6103dd600480360360408110156106eb57600080fd5b506001600160a01b038135169060200135611ce5565b6103dd611cf2565b61042d611d00565b6102f46004803603602081101561072757600080fd5b50356001600160a01b0316611d06565b610401611e9d565b610401611eac565b6102f4600480360360e081101561075d57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135611ebb565b61042d6120c8565b61042d600480360360408110156107b657600080fd5b506001600160a01b03813581169160200135166120cf565b61042d600480360360408110156107e457600080fd5b50803590602001356001600160a01b03166120ec565b6102f46004803603604081101561081057600080fd5b506001600160a01b038135811691602001351661215c565b6102f46123b9565b610838613c02565b5060408051610100810182526006546001600160a01b039081168252600754166020808301919091528183018890526060820187905260006080830181905260a0830181905260c0830181905260e08301528251601f850182900482028101820190935283835290916108c99183918791879087908190840183828082843760009201829052509250612560915050565b505050505050565b6040518060400160405280600c81526020016b0487970657273776170204c560a41b81525081565b6008546001600160701b0380821692600160701b83049091169161ffff600160e01b8204811692600160f01b9092041690565b6000610939338484612f31565b5060015b92915050565b600560009054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561099157600080fd5b505afa1580156109a5573d6000803e3d6000fd5b505050506040513d60208110156109bb57600080fd5b50516001600160a01b03163314610a035760405162461bcd60e51b8152600401808060200182810382526022815260200180613c5a6022913960400191505060405180910390fd5b600080610a0e6108f9565b5050915091506000610a208383612f93565b600654604080516370a0823160e01b815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015610a7157600080fd5b505afa158015610a85573d6000803e3d6000fd5b505050506040513d6020811015610a9b57600080fd5b5051600754604080516370a0823160e01b815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015610aee57600080fd5b505afa158015610b02573d6000803e3d6000fd5b505050506040513d6020811015610b1857600080fd5b50519050610b26828261314c565b8215610b5057600854610b4c906001600160701b0380821691600160701b90041661324f565b600b555b5050505050565b6006546001600160a01b031681565b600754600160a01b900460ff1681565b60005481565b6001600160a01b038316600090815260026020908152604080832033845290915281205460001914610c3d576001600160a01b0384166000908152600260209081526040808320338452909152812054610bdc908463ffffffff61336516565b6001600160a01b038616600081815260026020908152604080832033808552908352928190208590558051858152905194955091937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505b610c488484846133a7565b5060015b9392505050565b600a5481565b600854600160f01b900461ffff1681565b600d54600114610cb8576040805162461bcd60e51b8152602060048201526014602482015273121e5c195c9cddd85c14185a5c881313d0d2d15160621b604482015290519081900360640190fd5b6000600d5560055460408051637e1c813560e11b815290516001600160a01b039092169163fc39026a91600480820192602092909190829003018186803b158015610d0257600080fd5b505afa158015610d16573d6000803e3d6000fd5b505050506040513d6020811015610d2c57600080fd5b50516001600160a01b03163314610d745760405162461bcd60e51b815260040180806020018281038252602b815260200180613d1c602b913960400191505060405180910390fd5b600c54610100900460ff1615610dd1576040805162461bcd60e51b815260206004820152601760248201527f4879706572737761705061697220696d6d757461626c65000000000000000000604482015290519081900360640190fd5b600c5460ff1615158315151415610e2f576040805162461bcd60e51b815260206004820152601760248201527f48797065727377617050616972206e6f20757064617465000000000000000000604482015290519081900360640190fd5b6008546001600160701b038381169116148015610e6057506008546001600160701b03828116600160701b90920416145b610eb1576040805162461bcd60e51b815260206004820152601460248201527f48797065727377617050616972206661696c6564000000000000000000000000604482015290519081900360640190fd5b600854600090610ed4906001600160701b0380821691600160701b900416612f93565b600c546040805160ff90921615158252861515602083015280519293507fb6a86710bde53aa7fb1b3856279e2af5b476d53e2dd0902cf17a0911b5a43a8b92918290030190a1600c805460ff191685151517905580610f34576000610f54565b600854610f54906001600160701b0380821691600160701b90041661324f565b600b5550506001600d555050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b601281565b60035481565b60095481565b600d54600114610fe5576040805162461bcd60e51b8152602060048201526014602482015273121e5c195c9cddd85c14185a5c881313d0d2d15160621b604482015290519081900360640190fd5b6000600d5560055460408051638da5cb5b60e01b815290516001600160a01b0390921691638da5cb5b91600480820192602092909190829003018186803b15801561102f57600080fd5b505afa158015611043573d6000803e3d6000fd5b505050506040513d602081101561105957600080fd5b50516001600160a01b031633146110a15760405162461bcd60e51b8152600401808060200182810382526022815260200180613c5a6022913960400191505060405180910390fd5b600c54610100900460ff16156110fe576040805162461bcd60e51b815260206004820152601f60248201527f4879706572737761705061697220616c726561647920696d6d757461626c6500604482015290519081900360640190fd5b600c805461ff0019166101001790556040517f09122c41ae733a4d7740324d50e35fbd6ee85be3c1312a45596d8045150ab2f290600090a16001600d55565b6005546001600160a01b0316331480156111615750600754600160a01b900460ff16155b6111b2576040805162461bcd60e51b815260206004820152601760248201527f4879706572737761705061697220464f5242494444454e000000000000000000604482015290519081900360640190fd5b600680546001600160a01b0380851673ffffffffffffffffffffffffffffffffffffffff19928316811790935560078054918516919092161790556040805163313ce56760e01b8152905163313ce56791600480820192602092909190829003018186803b15801561122357600080fd5b505afa158015611237573d6000803e3d6000fd5b505050506040513d602081101561124d57600080fd5b505160ff16600a0a6009556040805163313ce56760e01b815290516001600160a01b0383169163313ce567916004808301926020929190829003018186803b15801561129857600080fd5b505afa1580156112ac573d6000803e3d6000fd5b505050506040513d60208110156112c257600080fd5b505160ff16600a90810a905550506007805460ff60a01b1916600160a01b179055565b600d54600114611333576040805162461bcd60e51b8152602060048201526014602482015273121e5c195c9cddd85c14185a5c881313d0d2d15160621b604482015290519081900360640190fd5b6000600d5560055460408051634c21771560e01b815290516001600160a01b0390921691634c21771591600480820192602092909190829003018186803b15801561137d57600080fd5b505afa158015611391573d6000803e3d6000fd5b505050506040513d60208110156113a757600080fd5b50516001600160a01b031633146113ef5760405162461bcd60e51b815260040180806020018281038252602b815260200180613e24602b913960400191505060405180910390fd5b6107d08261ffff161115801561140b57506107d08161ffff1611155b6114465760405162461bcd60e51b8152600401808060200182810382526033815260200180613dc66033913960400191505060405180910390fd5b60008261ffff1611801561145e575060008161ffff16115b6114995760405162461bcd60e51b8152600401808060200182810382526033815260200180613d936033913960400191505060405180910390fd5b6008805461ffff60e01b1916600160e01b61ffff858116918202929092177dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160f01b9285169283021790925560408051928352602083019190915280517fa4877b8ecb5a00ba277e4bceeeb187a669e7113649774dfbea05c259ce27f17b9281900390910190a150506001600d55565b600854600160e01b900461ffff1681565b6107d081565b6000600d54600114611591576040805162461bcd60e51b8152602060048201526014602482015273121e5c195c9cddd85c14185a5c881313d0d2d15160621b604482015290519081900360640190fd5b6000600d819055806115a16108f9565b5050600654604080516370a0823160e01b815230600482015290519395509193506000926001600160a01b03909116916370a08231916024808301926020929190829003018186803b1580156115f657600080fd5b505afa15801561160a573d6000803e3d6000fd5b505050506040513d602081101561162057600080fd5b5051600754604080516370a0823160e01b815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561167357600080fd5b505afa158015611687573d6000803e3d6000fd5b505050506040513d602081101561169d57600080fd5b5051905060006116bc836001600160701b03871663ffffffff61336516565b905060006116d9836001600160701b03871663ffffffff61336516565b905060006116e78787612f93565b600054909150806117305761171c6103e861171061170b878763ffffffff61346116565b6134ba565b9063ffffffff61336516565b985061172b60006103e861350c565b61177f565b61177c6001600160701b03891661174d868463ffffffff61346116565b8161175457fe5b046001600160701b03891661176f868563ffffffff61346116565b8161177657fe5b046135a2565b98505b600089116117be5760405162461bcd60e51b815260040180806020018281038252602b815260200180613d47602b913960400191505060405180910390fd5b6117c88a8a61350c565b6117d2868661314c565b81156117fc576008546117f8906001600160701b0380821691600160701b90041661324f565b600b555b6040805185815260208101859052815133927f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f928290030190a250506001600d5550949695505050505050565b611851613c02565b5060408051610100810182526006546001600160a01b039081168252600754166020808301919091528183018990526060820188905260006080830181905260a0830181905260c0830181905260e08301528251601f860182900482028101820190935284835290916118e491839188918890889081908401838280828437600092019190915250889250612560915050565b50505050505050565b60016020526000908152604090205481565b600b5481565b60046020526000908152604090205481565b600080600d54600114611968576040805162461bcd60e51b8152602060048201526014602482015273121e5c195c9cddd85c14185a5c881313d0d2d15160621b604482015290519081900360640190fd5b6000600d819055806119786108f9565b5050600654600754604080516370a0823160e01b815230600482015290519496509294506001600160a01b039182169391169160009184916370a08231916024808301926020929190829003018186803b1580156119d557600080fd5b505afa1580156119e9573d6000803e3d6000fd5b505050506040513d60208110156119ff57600080fd5b5051604080516370a0823160e01b815230600482015290519192506000916001600160a01b038516916370a08231916024808301926020929190829003018186803b158015611a4d57600080fd5b505afa158015611a61573d6000803e3d6000fd5b505050506040513d6020811015611a7757600080fd5b505130600090815260016020526040812054919250611a968888612f93565b60005490915080611aad848763ffffffff61346116565b81611ab457fe5b049a5080611ac8848663ffffffff61346116565b81611acf57fe5b04995060008b118015611ae2575060008a115b611b1d5760405162461bcd60e51b815260040180806020018281038252602b815260200180613df9602b913960400191505060405180910390fd5b611b2730846135b8565b611b32878d8d613656565b611b3d868d8c613656565b604080516370a0823160e01b815230600482015290516001600160a01b038916916370a08231916024808301926020929190829003018186803b158015611b8357600080fd5b505afa158015611b97573d6000803e3d6000fd5b505050506040513d6020811015611bad57600080fd5b5051604080516370a0823160e01b815230600482015290519196506001600160a01b038816916370a0823191602480820192602092909190829003018186803b158015611bf957600080fd5b505afa158015611c0d573d6000803e3d6000fd5b505050506040513d6020811015611c2357600080fd5b50519350611c31858561314c565b8115611c5b57600854611c57906001600160701b0380821691600160701b90041661324f565b600b555b604080518c8152602081018c905281516001600160a01b038f169233927fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496929081900390910190a35050505050505050506001600d81905550915091565b604051806040016040528060078152602001660535741502d4c560cc1b81525081565b600c5460ff1681565b60006109393384846133a7565b600c54610100900460ff1681565b6103e881565b600d54600114611d54576040805162461bcd60e51b8152602060048201526014602482015273121e5c195c9cddd85c14185a5c881313d0d2d15160621b604482015290519081900360640190fd5b6000600d55600654600754600854604080516370a0823160e01b815230600482015290516001600160a01b039485169490931692611e039285928792611dfe926001600160701b03169185916370a0823191602480820192602092909190829003018186803b158015611dc657600080fd5b505afa158015611dda573d6000803e3d6000fd5b505050506040513d6020811015611df057600080fd5b50519063ffffffff61336516565b613656565b600854604080516370a0823160e01b81523060048201529051611e6a9284928792611dfe92600160701b90046001600160701b0316916001600160a01b038616916370a0823191602480820192602092909190829003018186803b158015611dc657600080fd5b6040517f21ad22495c9c75cd1c94756f91824e779c0c8a8e168b267c790df464fe056b7990600090a150506001600d5550565b6005546001600160a01b031681565b6007546001600160a01b031681565b42841015611f10576040805162461bcd60e51b815260206004820152601160248201527f4879706572737761702045585049524544000000000000000000000000000000604482015290519081900360640190fd5b6003546001600160a01b0380891660008181526004602090815260408083208054600180820190925582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98186015280840196909652958d166060860152608085018c905260a085019590955260c08085018b90528151808603909101815260e08501825280519083012061190160f01b6101008601526101028501969096526101228085019690965280518085039096018652610142840180825286519683019690962095839052610162840180825286905260ff89166101828501526101a284018890526101c28401879052519193926101e280820193601f1981019281900390910190855afa15801561202b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906120615750886001600160a01b0316816001600160a01b0316145b6120b2576040805162461bcd60e51b815260206004820152601b60248201527f48797065727377617020494e56414c49445f5349474e41545552450000000000604482015290519081900360640190fd5b6120bd898989612f31565b505050505050505050565b620186a081565b600260209081526000928352604080842090915290825290205481565b60065460009081906001600160a01b0384811691161461211957600854600160f01b900461ffff16612128565b600854600160e01b900461ffff165b60085490915061215490859085906001600160701b0380821691600160701b90041661ffff86166137fe565b949350505050565b600d546001146121aa576040805162461bcd60e51b8152602060048201526014602482015273121e5c195c9cddd85c14185a5c881313d0d2d15160621b604482015290519081900360640190fd5b6000600d5560055460408051638da5cb5b60e01b815290516001600160a01b0390921691638da5cb5b91600480820192602092909190829003018186803b1580156121f457600080fd5b505afa158015612208573d6000803e3d6000fd5b505050506040513d602081101561221e57600080fd5b50516001600160a01b031633146122665760405162461bcd60e51b8152600401808060200182810382526022815260200180613c5a6022913960400191505060405180910390fd5b6006546001600160a01b0383811691161480159061229257506007546001600160a01b03838116911614155b6122e3576040805162461bcd60e51b815260206004820152601b60248201527f4879706572737761705061697220696e76616c696420746f6b656e0000000000604482015290519081900360640190fd5b61236f8282846001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561233e57600080fd5b505afa158015612352573d6000803e3d6000fd5b505050506040513d602081101561236857600080fd5b5051613656565b604080516001600160a01b0383811682529151918416917f368a9dc863ecb94b5ba32a682e26295b10d9c2666fad7d785ebdf262c3c524139181900360200190a250506001600d55565b600d54600114612407576040805162461bcd60e51b8152602060048201526014602482015273121e5c195c9cddd85c14185a5c881313d0d2d15160621b604482015290519081900360640190fd5b6000600d819055600654604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561245957600080fd5b505afa15801561246d573d6000803e3d6000fd5b505050506040513d602081101561248357600080fd5b5051600754604080516370a0823160e01b815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b1580156124d657600080fd5b505afa1580156124ea573d6000803e3d6000fd5b505050506040513d602081101561250057600080fd5b50519050811580159061251257508015155b61254d5760405162461bcd60e51b815260040180806020018281038252602d815260200180613c7c602d913960400191505060405180910390fd5b612557828261314c565b50506001600d55565b600d546001146125ae576040805162461bcd60e51b8152602060048201526014602482015273121e5c195c9cddd85c14185a5c881313d0d2d15160621b604482015290519081900360640190fd5b6000600d5560408401511515806125c9575060008460600151115b6126045760405162461bcd60e51b8152600401808060200182810382526028815260200180613ccd6028913960400191505060405180910390fd5b6000806000806126126108f9565b9350935093509350836001600160701b031688604001511080156126425750826001600160701b03168860600151105b61267d5760405162461bcd60e51b8152600401808060200182810382526024815260200180613ca96024913960400191505060405180910390fd5b87516001600160a01b038881169116148015906126b0575087602001516001600160a01b0316876001600160a01b031614155b612701576040805162461bcd60e51b815260206004820152601860248201527f4879706572737761705061697220494e56414c49445f544f0000000000000000604482015290519081900360640190fd5b60408801511561271e5761271e8860000151888a60400151613656565b60608801511561273b5761273b8860200151888a60600151613656565b85511561283557866001600160a01b03166310d1e85c338a604001518b606001518a6040518563ffffffff1660e01b815260040180856001600160a01b03166001600160a01b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156127cd5781810151838201526020016127b5565b50505050905090810190601f1680156127fa5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561281c57600080fd5b505af1158015612830573d6000803e3d6000fd5b505050505b8751604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561287f57600080fd5b505afa158015612893573d6000803e3d6000fd5b505050506040513d60208110156128a957600080fd5b50516080890152602088810151604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b1580156128f857600080fd5b505afa15801561290c573d6000803e3d6000fd5b505050506040513d602081101561292257600080fd5b505160a0890152604088015160808901516000916001600160701b038716031061294d576000612964565b8860400151856001600160701b0316038960800151035b905060008960600151856001600160701b0316038a60a00151116129895760006129a0565b8960600151856001600160701b0316038a60a00151035b905060008211806129b15750600081115b6129ec5760405162461bcd60e51b8152600401808060200182810382526027815260200180613cf56027913960400191505060405180910390fd5b620186a0612a048361ffff871663ffffffff61346116565b81612a0b57fe5b0460c08b0152620186a0612a298261ffff861663ffffffff61346116565b81612a3057fe5b0460e08b01526000806001600160a01b038916612a4e576000612ac8565b60055460408051631c60f51f60e21b81526001600160a01b038c8116600483015291519190921691637183d47c916024808301926020929190829003018186803b158015612a9b57600080fd5b505afa158015612aaf573d6000803e3d6000fd5b505050506040513d6020811015612ac557600080fd5b50515b90508015612b8d578315612b33576402540be400612b0061ffff8816612af4878563ffffffff61346116565b9063ffffffff61346116565b81612b0757fe5b049150612b21828d60c0015161336590919063ffffffff16565b60c08d01528b51612b33908a84613656565b8215612b8d576402540be400612b5761ffff8716612af4868563ffffffff61346116565b81612b5e57fe5b049150612b78828d60e0015161336590919063ffffffff16565b60e08d015260208c0151612b8d908a84613656565b600c5460ff1615612cf55760055460408051634cadad5760e11b8152815160009384936001600160a01b039091169263995b5aae9260048083019392829003018186803b158015612bdd57600080fd5b505afa158015612bf1573d6000803e3d6000fd5b505050506040513d6040811015612c0757600080fd5b50805160209091015190925090506001600160a01b03811615612cf257612c3b82612af4620186a08663ffffffff61336516565b91508515612c965766038d7ea4c68000612c6361ffff8a16612af4898663ffffffff61346116565b81612c6a57fe5b049350612c84848f60c0015161336590919063ffffffff16565b60c08f01528d51612c96908286613656565b8415612cf25766038d7ea4c68000612cbc61ffff8916612af4888663ffffffff61346116565b81612cc357fe5b049350612cdd848f60e0015161336590919063ffffffff16565b60e08f015260208e0151612cf2908286613656565b50505b8315612d77578b51604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015612d4557600080fd5b505afa158015612d59573d6000803e3d6000fd5b505050506040513d6020811015612d6f57600080fd5b505160808d01525b8215612df7576020808d0151604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b158015612dc557600080fd5b505afa158015612dd9573d6000803e3d6000fd5b505050506040513d6020811015612def57600080fd5b505160a08d01525b50506000612e168b60c001518c6080015161336590919063ffffffff16565b90506000612e358c60e001518d60a0015161336590919063ffffffff16565b9050612e53886001600160701b0316886001600160701b031661324f565b612e5d838361324f565b1015612eb0576040805162461bcd60e51b815260206004820152600f60248201527f48797065727377617050616972204b0000000000000000000000000000000000604482015290519081900360640190fd5b5050612ec48a608001518b60a0015161314c565b6040808b01516060808d0151835186815260208101869052808501939093529082015290516001600160a01b038b169133917fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229181900360800190a350506001600d555050505050505050565b6001600160a01b03808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600c5460009060ff1615612fa95750600061093d565b60055460408051634cadad5760e11b8152815160009384936001600160a01b039091169263995b5aae9260048083019392829003018186803b158015612fee57600080fd5b505afa158015613002573d6000803e3d6000fd5b505050506040513d604081101561301857600080fd5b508051602090910151600b546001600160a01b03821615801596509294509092509061313757801561313257600061306561170b886001600160701b0316886001600160701b031661324f565b90506000613072836134ba565b90508082111561312f5760006130ab606487613097620186a08363ffffffff61346116565b8161309e57fe5b049063ffffffff61336516565b905060006130d66064612af46130c7878763ffffffff61336516565b6000549063ffffffff61346116565b9050600061310a6130ee85606463ffffffff61346116565b6130fe878663ffffffff61346116565b9063ffffffff6139cc16565b9050600081838161311757fe5b049050801561312a5761312a888261350c565b505050505b50505b613143565b8015613143576000600b555b50505092915050565b6001600160701b03821180159061316a57506001600160701b038111155b6131bb576040805162461bcd60e51b815260206004820152601660248201527f48797065727377617050616972204f564552464c4f5700000000000000000000604482015290519081900360640190fd5b600880546dffffffffffffffffffffffffffff19166001600160701b038481169182177fffffffff0000000000000000000000000000ffffffffffffffffffffffffffff16600160701b9185169182021790925560408051918252602082019290925281517f1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1929181900390910190a15050565b600c5460009060ff16156133555760095460009061327b85670de0b6b3a764000063ffffffff61346116565b8161328257fe5b0490506000600a546132a5670de0b6b3a76400008661346190919063ffffffff16565b816132ac57fe5b0490506000670de0b6b3a76400006132ca848463ffffffff61346116565b816132d157fe5b0490506000613327670de0b6b3a76400006132f2858063ffffffff61346116565b816132f957fe5b04670de0b6b3a7640000613313878063ffffffff61346116565b8161331a57fe5b049063ffffffff6139cc16565b9050670de0b6b3a7640000613342838363ffffffff61346116565b8161334957fe5b0494505050505061093d565b610c4c838363ffffffff61346116565b6000610c4c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613a26565b6001600160a01b0383166000908152600160205260409020546133d0908263ffffffff61336516565b6001600160a01b038085166000908152600160205260408082209390935590841681522054613405908263ffffffff6139cc16565b6001600160a01b0380841660008181526001602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000826134705750600061093d565b8282028284828161347d57fe5b0414610c4c5760405162461bcd60e51b8152600401808060200182810382526021815260200180613d726021913960400191505060405180910390fd5b600060038211156134fd575080600160028204015b818110156134f7578091506002818285816134e657fe5b0401816134ef57fe5b0490506134cf565b50613507565b8115613507575060015b919050565b60005461351f908263ffffffff6139cc16565b60009081556001600160a01b03831681526001602052604090205461354a908263ffffffff6139cc16565b6001600160a01b03831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b60008183106135b15781610c4c565b5090919050565b6001600160a01b0382166000908152600160205260409020546135e1908263ffffffff61336516565b6001600160a01b0383166000908152600160205260408120919091555461360e908263ffffffff61336516565b60009081556040805183815290516001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef919081900360200190a35050565b604080518082018252601981527f7472616e7366657228616464726573732c75696e74323536290000000000000060209182015281516001600160a01b0385811660248301526044808301869052845180840390910181526064909201845291810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b1781529251815160009460609489169392918291908083835b602083106137185780518252601f1990920191602091820191016136f9565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461377a576040519150601f19603f3d011682016040523d82523d6000602084013e61377f565b606091505b50915091508180156137ad5750805115806137ad57508080602001905160208110156137aa57600080fd5b50515b610b50576040805162461bcd60e51b815260206004820152601d60248201527f48797065727377617050616972205452414e534645525f4641494c4544000000604482015290519081900360640190fd5b600c5460009060ff161561394157613839620186a0613823888563ffffffff61346116565b8161382a57fe5b8891900463ffffffff61336516565b95506000613847858561324f565b905060095485670de0b6b3a7640000028161385e57fe5b049450600a5484670de0b6b3a7640000028161387657fe5b600654919004945060009081906001600160a01b0389811691161461389c57858761389f565b86865b60065491935091506001600160a01b038981169116146138d457600a5489670de0b6b3a764000002816138ce57fe5b046138eb565b60095489670de0b6b3a764000002816138e957fe5b045b985060006138fc838b018584613abd565b6006549083039150670de0b6b3a7640000906001600160a01b038b81169116146139285760095461392c565b600a545b82028161393557fe5b049450505050506139c3565b60065460009081906001600160a01b03888116911614613962578486613965565b85855b909250905061398d613980620186a08663ffffffff61336516565b899063ffffffff61346116565b97506139a6886130fe84620186a063ffffffff61346116565b6139b6898363ffffffff61346116565b816139bd57fe5b04925050505b95945050505050565b600082820183811015610c4c576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008184841115613ab55760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613a7a578181015183820152602001613a62565b50505050905090810190601f168015613aa75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000805b60ff811015613b7557826000613ad78783613b7e565b905085811015613b0d576000613aed8887613bce565b828803670de0b6b3a76400000281613b0157fe5b04959095019450613b34565b6000613b198887613bce565b878303670de0b6b3a76400000281613b2d57fe5b0490950394505b81851115613b5657600182860311613b5157849350505050610c4c565b613b6b565b600185830311613b6b57849350505050610c4c565b5050600101613ac1565b50909392505050565b6000670de0b6b3a764000082818581818002040281613b9957fe5b040281613ba257fe5b04670de0b6b3a7640000808481818002040281613bbb57fe5b04850281613bc557fe5b04019392505050565b6000670de0b6b3a76400008381818002040281613be757fe5b04670de0b6b3a76400008084800204856003020281613bc557fe5b60405180610100016040528060006001600160a01b0316815260200160006001600160a01b03168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152509056fe48797065727377617050616972206f6e6c7920666163746f72792773206f776e657248797065727377617050616972206c697175696469747920726174696f206e6f7420696e697469616c697a65644879706572737761705061697220494e53554646494349454e545f4c49515549444954594879706572737761705061697220494e53554646494349454e545f4f55545055545f414d4f554e544879706572737761705061697220494e53554646494349454e545f494e5055545f414d4f554e5448797065727377617050616972206f6e6c7920666163746f7279277320736574537461626c654f776e65724879706572737761705061697220494e53554646494349454e545f4c49515549444954595f4d494e544544536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77487970657273776170506169722066656550657263656e74206d7573746e27742065786365656420746865206d696e696d756d487970657273776170506169722066656550657263656e74206d7573746e27742065786365656420746865206d6178696d756d4879706572737761705061697220494e53554646494349454e545f4c49515549444954595f4255524e454448797065727377617050616972206f6e6c7920666163746f7279277320666565416d6f756e744f776e6572a265627a7a723158201cf5d65a01e9791fb45931c5192766e2433a34c6e11b2641cf8ad169e931125764736f6c63430005100032454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102635760003560e01c806367d8174011610156578063b6200b07116100d3578063d505accf11610097578063f140a35a11610071578063f140a35a146107ce578063f39ac11f146107fa578063fff6cae91461082857610263565b8063d505accf14610747578063d73792a914610798578063dd62ed3e146107a057610263565b8063b6200b0714610701578063ba9a7a5614610709578063bc25cf7714610711578063c45a015514610737578063d21220a71461073f57610263565b80637ecebe001161011a5780637ecebe001461066057806389afcb441461068657806395d89b41146106c55780639e548b7f146106cd578063a9059cbb146106d557610263565b806367d817401461056f5780636a627842146105775780636e1fdd7f1461059d57806370a08231146106325780637464fc3d1461065857610263565b80632fcd1692116101e45780633b9f1dc0116101a85780633b9f1dc0146105005780633ba1707714610508578063485cc9551461051057806348e5d2601461053e57806362ecec031461056757610263565b80632fcd16921461047d5780633029e5d41461049c57806330adf81f146104d2578063313ce567146104da5780633644e515146104f857610263565b80630dfe16811161022b5780630dfe1681146103f9578063158ef93e1461041d57806318160ddd1461042557806323b872dd1461043f578063288e5d021461047557610263565b8063022c0d9f1461026857806306fdde03146102f65780630902f1ac14610373578063095ea7b3146103b15780630a0ef8b5146103f1575b600080fd5b6102f46004803603608081101561027e57600080fd5b8135916020810135916001600160a01b0360408301351691908101906080810160608201356401000000008111156102b557600080fd5b8201836020820111156102c757600080fd5b803590602001918460018302840111640100000000831117156102e957600080fd5b509092509050610830565b005b6102fe6108d1565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610338578181015183820152602001610320565b50505050905090810190601f1680156103655780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61037b6108f9565b604080516001600160701b03958616815293909416602084015261ffff9182168385015216606082015290519081900360800190f35b6103dd600480360360408110156103c757600080fd5b506001600160a01b03813516906020013561092c565b604080519115158252519081900360200190f35b6102f4610943565b610401610b57565b604080516001600160a01b039092168252519081900360200190f35b6103dd610b66565b61042d610b76565b60408051918252519081900360200190f35b6103dd6004803603606081101561045557600080fd5b506001600160a01b03813581169160208101359091169060400135610b7c565b61042d610c53565b610485610c59565b6040805161ffff9092168252519081900360200190f35b6102f4600480360360608110156104b257600080fd5b5080351515906001600160701b0360208201358116916040013516610c6a565b61042d610f62565b6104e2610f86565b6040805160ff9092168252519081900360200190f35b61042d610f8b565b61042d610f91565b6102f4610f97565b6102f46004803603604081101561052657600080fd5b506001600160a01b038135811691602001351661113d565b6102f46004803603604081101561055457600080fd5b5061ffff813581169160200135166112e5565b61048561152a565b61042d61153b565b61042d6004803603602081101561058d57600080fd5b50356001600160a01b0316611541565b6102f4600480360360a08110156105b357600080fd5b8135916020810135916001600160a01b0360408301351691908101906080810160608201356401000000008111156105ea57600080fd5b8201836020820111156105fc57600080fd5b8035906020019184600183028401116401000000008311171561061e57600080fd5b9193509150356001600160a01b0316611849565b61042d6004803603602081101561064857600080fd5b50356001600160a01b03166118ed565b61042d6118ff565b61042d6004803603602081101561067657600080fd5b50356001600160a01b0316611905565b6106ac6004803603602081101561069c57600080fd5b50356001600160a01b0316611917565b6040805192835260208301919091528051918290030190f35b6102fe611cb9565b6103dd611cdc565b6103dd600480360360408110156106eb57600080fd5b506001600160a01b038135169060200135611ce5565b6103dd611cf2565b61042d611d00565b6102f46004803603602081101561072757600080fd5b50356001600160a01b0316611d06565b610401611e9d565b610401611eac565b6102f4600480360360e081101561075d57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135611ebb565b61042d6120c8565b61042d600480360360408110156107b657600080fd5b506001600160a01b03813581169160200135166120cf565b61042d600480360360408110156107e457600080fd5b50803590602001356001600160a01b03166120ec565b6102f46004803603604081101561081057600080fd5b506001600160a01b038135811691602001351661215c565b6102f46123b9565b610838613c02565b5060408051610100810182526006546001600160a01b039081168252600754166020808301919091528183018890526060820187905260006080830181905260a0830181905260c0830181905260e08301528251601f850182900482028101820190935283835290916108c99183918791879087908190840183828082843760009201829052509250612560915050565b505050505050565b6040518060400160405280600c81526020016b0487970657273776170204c560a41b81525081565b6008546001600160701b0380821692600160701b83049091169161ffff600160e01b8204811692600160f01b9092041690565b6000610939338484612f31565b5060015b92915050565b600560009054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561099157600080fd5b505afa1580156109a5573d6000803e3d6000fd5b505050506040513d60208110156109bb57600080fd5b50516001600160a01b03163314610a035760405162461bcd60e51b8152600401808060200182810382526022815260200180613c5a6022913960400191505060405180910390fd5b600080610a0e6108f9565b5050915091506000610a208383612f93565b600654604080516370a0823160e01b815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015610a7157600080fd5b505afa158015610a85573d6000803e3d6000fd5b505050506040513d6020811015610a9b57600080fd5b5051600754604080516370a0823160e01b815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015610aee57600080fd5b505afa158015610b02573d6000803e3d6000fd5b505050506040513d6020811015610b1857600080fd5b50519050610b26828261314c565b8215610b5057600854610b4c906001600160701b0380821691600160701b90041661324f565b600b555b5050505050565b6006546001600160a01b031681565b600754600160a01b900460ff1681565b60005481565b6001600160a01b038316600090815260026020908152604080832033845290915281205460001914610c3d576001600160a01b0384166000908152600260209081526040808320338452909152812054610bdc908463ffffffff61336516565b6001600160a01b038616600081815260026020908152604080832033808552908352928190208590558051858152905194955091937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505b610c488484846133a7565b5060015b9392505050565b600a5481565b600854600160f01b900461ffff1681565b600d54600114610cb8576040805162461bcd60e51b8152602060048201526014602482015273121e5c195c9cddd85c14185a5c881313d0d2d15160621b604482015290519081900360640190fd5b6000600d5560055460408051637e1c813560e11b815290516001600160a01b039092169163fc39026a91600480820192602092909190829003018186803b158015610d0257600080fd5b505afa158015610d16573d6000803e3d6000fd5b505050506040513d6020811015610d2c57600080fd5b50516001600160a01b03163314610d745760405162461bcd60e51b815260040180806020018281038252602b815260200180613d1c602b913960400191505060405180910390fd5b600c54610100900460ff1615610dd1576040805162461bcd60e51b815260206004820152601760248201527f4879706572737761705061697220696d6d757461626c65000000000000000000604482015290519081900360640190fd5b600c5460ff1615158315151415610e2f576040805162461bcd60e51b815260206004820152601760248201527f48797065727377617050616972206e6f20757064617465000000000000000000604482015290519081900360640190fd5b6008546001600160701b038381169116148015610e6057506008546001600160701b03828116600160701b90920416145b610eb1576040805162461bcd60e51b815260206004820152601460248201527f48797065727377617050616972206661696c6564000000000000000000000000604482015290519081900360640190fd5b600854600090610ed4906001600160701b0380821691600160701b900416612f93565b600c546040805160ff90921615158252861515602083015280519293507fb6a86710bde53aa7fb1b3856279e2af5b476d53e2dd0902cf17a0911b5a43a8b92918290030190a1600c805460ff191685151517905580610f34576000610f54565b600854610f54906001600160701b0380821691600160701b90041661324f565b600b5550506001600d555050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b601281565b60035481565b60095481565b600d54600114610fe5576040805162461bcd60e51b8152602060048201526014602482015273121e5c195c9cddd85c14185a5c881313d0d2d15160621b604482015290519081900360640190fd5b6000600d5560055460408051638da5cb5b60e01b815290516001600160a01b0390921691638da5cb5b91600480820192602092909190829003018186803b15801561102f57600080fd5b505afa158015611043573d6000803e3d6000fd5b505050506040513d602081101561105957600080fd5b50516001600160a01b031633146110a15760405162461bcd60e51b8152600401808060200182810382526022815260200180613c5a6022913960400191505060405180910390fd5b600c54610100900460ff16156110fe576040805162461bcd60e51b815260206004820152601f60248201527f4879706572737761705061697220616c726561647920696d6d757461626c6500604482015290519081900360640190fd5b600c805461ff0019166101001790556040517f09122c41ae733a4d7740324d50e35fbd6ee85be3c1312a45596d8045150ab2f290600090a16001600d55565b6005546001600160a01b0316331480156111615750600754600160a01b900460ff16155b6111b2576040805162461bcd60e51b815260206004820152601760248201527f4879706572737761705061697220464f5242494444454e000000000000000000604482015290519081900360640190fd5b600680546001600160a01b0380851673ffffffffffffffffffffffffffffffffffffffff19928316811790935560078054918516919092161790556040805163313ce56760e01b8152905163313ce56791600480820192602092909190829003018186803b15801561122357600080fd5b505afa158015611237573d6000803e3d6000fd5b505050506040513d602081101561124d57600080fd5b505160ff16600a0a6009556040805163313ce56760e01b815290516001600160a01b0383169163313ce567916004808301926020929190829003018186803b15801561129857600080fd5b505afa1580156112ac573d6000803e3d6000fd5b505050506040513d60208110156112c257600080fd5b505160ff16600a90810a905550506007805460ff60a01b1916600160a01b179055565b600d54600114611333576040805162461bcd60e51b8152602060048201526014602482015273121e5c195c9cddd85c14185a5c881313d0d2d15160621b604482015290519081900360640190fd5b6000600d5560055460408051634c21771560e01b815290516001600160a01b0390921691634c21771591600480820192602092909190829003018186803b15801561137d57600080fd5b505afa158015611391573d6000803e3d6000fd5b505050506040513d60208110156113a757600080fd5b50516001600160a01b031633146113ef5760405162461bcd60e51b815260040180806020018281038252602b815260200180613e24602b913960400191505060405180910390fd5b6107d08261ffff161115801561140b57506107d08161ffff1611155b6114465760405162461bcd60e51b8152600401808060200182810382526033815260200180613dc66033913960400191505060405180910390fd5b60008261ffff1611801561145e575060008161ffff16115b6114995760405162461bcd60e51b8152600401808060200182810382526033815260200180613d936033913960400191505060405180910390fd5b6008805461ffff60e01b1916600160e01b61ffff858116918202929092177dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160f01b9285169283021790925560408051928352602083019190915280517fa4877b8ecb5a00ba277e4bceeeb187a669e7113649774dfbea05c259ce27f17b9281900390910190a150506001600d55565b600854600160e01b900461ffff1681565b6107d081565b6000600d54600114611591576040805162461bcd60e51b8152602060048201526014602482015273121e5c195c9cddd85c14185a5c881313d0d2d15160621b604482015290519081900360640190fd5b6000600d819055806115a16108f9565b5050600654604080516370a0823160e01b815230600482015290519395509193506000926001600160a01b03909116916370a08231916024808301926020929190829003018186803b1580156115f657600080fd5b505afa15801561160a573d6000803e3d6000fd5b505050506040513d602081101561162057600080fd5b5051600754604080516370a0823160e01b815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561167357600080fd5b505afa158015611687573d6000803e3d6000fd5b505050506040513d602081101561169d57600080fd5b5051905060006116bc836001600160701b03871663ffffffff61336516565b905060006116d9836001600160701b03871663ffffffff61336516565b905060006116e78787612f93565b600054909150806117305761171c6103e861171061170b878763ffffffff61346116565b6134ba565b9063ffffffff61336516565b985061172b60006103e861350c565b61177f565b61177c6001600160701b03891661174d868463ffffffff61346116565b8161175457fe5b046001600160701b03891661176f868563ffffffff61346116565b8161177657fe5b046135a2565b98505b600089116117be5760405162461bcd60e51b815260040180806020018281038252602b815260200180613d47602b913960400191505060405180910390fd5b6117c88a8a61350c565b6117d2868661314c565b81156117fc576008546117f8906001600160701b0380821691600160701b90041661324f565b600b555b6040805185815260208101859052815133927f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f928290030190a250506001600d5550949695505050505050565b611851613c02565b5060408051610100810182526006546001600160a01b039081168252600754166020808301919091528183018990526060820188905260006080830181905260a0830181905260c0830181905260e08301528251601f860182900482028101820190935284835290916118e491839188918890889081908401838280828437600092019190915250889250612560915050565b50505050505050565b60016020526000908152604090205481565b600b5481565b60046020526000908152604090205481565b600080600d54600114611968576040805162461bcd60e51b8152602060048201526014602482015273121e5c195c9cddd85c14185a5c881313d0d2d15160621b604482015290519081900360640190fd5b6000600d819055806119786108f9565b5050600654600754604080516370a0823160e01b815230600482015290519496509294506001600160a01b039182169391169160009184916370a08231916024808301926020929190829003018186803b1580156119d557600080fd5b505afa1580156119e9573d6000803e3d6000fd5b505050506040513d60208110156119ff57600080fd5b5051604080516370a0823160e01b815230600482015290519192506000916001600160a01b038516916370a08231916024808301926020929190829003018186803b158015611a4d57600080fd5b505afa158015611a61573d6000803e3d6000fd5b505050506040513d6020811015611a7757600080fd5b505130600090815260016020526040812054919250611a968888612f93565b60005490915080611aad848763ffffffff61346116565b81611ab457fe5b049a5080611ac8848663ffffffff61346116565b81611acf57fe5b04995060008b118015611ae2575060008a115b611b1d5760405162461bcd60e51b815260040180806020018281038252602b815260200180613df9602b913960400191505060405180910390fd5b611b2730846135b8565b611b32878d8d613656565b611b3d868d8c613656565b604080516370a0823160e01b815230600482015290516001600160a01b038916916370a08231916024808301926020929190829003018186803b158015611b8357600080fd5b505afa158015611b97573d6000803e3d6000fd5b505050506040513d6020811015611bad57600080fd5b5051604080516370a0823160e01b815230600482015290519196506001600160a01b038816916370a0823191602480820192602092909190829003018186803b158015611bf957600080fd5b505afa158015611c0d573d6000803e3d6000fd5b505050506040513d6020811015611c2357600080fd5b50519350611c31858561314c565b8115611c5b57600854611c57906001600160701b0380821691600160701b90041661324f565b600b555b604080518c8152602081018c905281516001600160a01b038f169233927fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496929081900390910190a35050505050505050506001600d81905550915091565b604051806040016040528060078152602001660535741502d4c560cc1b81525081565b600c5460ff1681565b60006109393384846133a7565b600c54610100900460ff1681565b6103e881565b600d54600114611d54576040805162461bcd60e51b8152602060048201526014602482015273121e5c195c9cddd85c14185a5c881313d0d2d15160621b604482015290519081900360640190fd5b6000600d55600654600754600854604080516370a0823160e01b815230600482015290516001600160a01b039485169490931692611e039285928792611dfe926001600160701b03169185916370a0823191602480820192602092909190829003018186803b158015611dc657600080fd5b505afa158015611dda573d6000803e3d6000fd5b505050506040513d6020811015611df057600080fd5b50519063ffffffff61336516565b613656565b600854604080516370a0823160e01b81523060048201529051611e6a9284928792611dfe92600160701b90046001600160701b0316916001600160a01b038616916370a0823191602480820192602092909190829003018186803b158015611dc657600080fd5b6040517f21ad22495c9c75cd1c94756f91824e779c0c8a8e168b267c790df464fe056b7990600090a150506001600d5550565b6005546001600160a01b031681565b6007546001600160a01b031681565b42841015611f10576040805162461bcd60e51b815260206004820152601160248201527f4879706572737761702045585049524544000000000000000000000000000000604482015290519081900360640190fd5b6003546001600160a01b0380891660008181526004602090815260408083208054600180820190925582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98186015280840196909652958d166060860152608085018c905260a085019590955260c08085018b90528151808603909101815260e08501825280519083012061190160f01b6101008601526101028501969096526101228085019690965280518085039096018652610142840180825286519683019690962095839052610162840180825286905260ff89166101828501526101a284018890526101c28401879052519193926101e280820193601f1981019281900390910190855afa15801561202b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906120615750886001600160a01b0316816001600160a01b0316145b6120b2576040805162461bcd60e51b815260206004820152601b60248201527f48797065727377617020494e56414c49445f5349474e41545552450000000000604482015290519081900360640190fd5b6120bd898989612f31565b505050505050505050565b620186a081565b600260209081526000928352604080842090915290825290205481565b60065460009081906001600160a01b0384811691161461211957600854600160f01b900461ffff16612128565b600854600160e01b900461ffff165b60085490915061215490859085906001600160701b0380821691600160701b90041661ffff86166137fe565b949350505050565b600d546001146121aa576040805162461bcd60e51b8152602060048201526014602482015273121e5c195c9cddd85c14185a5c881313d0d2d15160621b604482015290519081900360640190fd5b6000600d5560055460408051638da5cb5b60e01b815290516001600160a01b0390921691638da5cb5b91600480820192602092909190829003018186803b1580156121f457600080fd5b505afa158015612208573d6000803e3d6000fd5b505050506040513d602081101561221e57600080fd5b50516001600160a01b031633146122665760405162461bcd60e51b8152600401808060200182810382526022815260200180613c5a6022913960400191505060405180910390fd5b6006546001600160a01b0383811691161480159061229257506007546001600160a01b03838116911614155b6122e3576040805162461bcd60e51b815260206004820152601b60248201527f4879706572737761705061697220696e76616c696420746f6b656e0000000000604482015290519081900360640190fd5b61236f8282846001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561233e57600080fd5b505afa158015612352573d6000803e3d6000fd5b505050506040513d602081101561236857600080fd5b5051613656565b604080516001600160a01b0383811682529151918416917f368a9dc863ecb94b5ba32a682e26295b10d9c2666fad7d785ebdf262c3c524139181900360200190a250506001600d55565b600d54600114612407576040805162461bcd60e51b8152602060048201526014602482015273121e5c195c9cddd85c14185a5c881313d0d2d15160621b604482015290519081900360640190fd5b6000600d819055600654604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561245957600080fd5b505afa15801561246d573d6000803e3d6000fd5b505050506040513d602081101561248357600080fd5b5051600754604080516370a0823160e01b815230600482015290519293506000926001600160a01b03909216916370a0823191602480820192602092909190829003018186803b1580156124d657600080fd5b505afa1580156124ea573d6000803e3d6000fd5b505050506040513d602081101561250057600080fd5b50519050811580159061251257508015155b61254d5760405162461bcd60e51b815260040180806020018281038252602d815260200180613c7c602d913960400191505060405180910390fd5b612557828261314c565b50506001600d55565b600d546001146125ae576040805162461bcd60e51b8152602060048201526014602482015273121e5c195c9cddd85c14185a5c881313d0d2d15160621b604482015290519081900360640190fd5b6000600d5560408401511515806125c9575060008460600151115b6126045760405162461bcd60e51b8152600401808060200182810382526028815260200180613ccd6028913960400191505060405180910390fd5b6000806000806126126108f9565b9350935093509350836001600160701b031688604001511080156126425750826001600160701b03168860600151105b61267d5760405162461bcd60e51b8152600401808060200182810382526024815260200180613ca96024913960400191505060405180910390fd5b87516001600160a01b038881169116148015906126b0575087602001516001600160a01b0316876001600160a01b031614155b612701576040805162461bcd60e51b815260206004820152601860248201527f4879706572737761705061697220494e56414c49445f544f0000000000000000604482015290519081900360640190fd5b60408801511561271e5761271e8860000151888a60400151613656565b60608801511561273b5761273b8860200151888a60600151613656565b85511561283557866001600160a01b03166310d1e85c338a604001518b606001518a6040518563ffffffff1660e01b815260040180856001600160a01b03166001600160a01b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156127cd5781810151838201526020016127b5565b50505050905090810190601f1680156127fa5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561281c57600080fd5b505af1158015612830573d6000803e3d6000fd5b505050505b8751604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561287f57600080fd5b505afa158015612893573d6000803e3d6000fd5b505050506040513d60208110156128a957600080fd5b50516080890152602088810151604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b1580156128f857600080fd5b505afa15801561290c573d6000803e3d6000fd5b505050506040513d602081101561292257600080fd5b505160a0890152604088015160808901516000916001600160701b038716031061294d576000612964565b8860400151856001600160701b0316038960800151035b905060008960600151856001600160701b0316038a60a00151116129895760006129a0565b8960600151856001600160701b0316038a60a00151035b905060008211806129b15750600081115b6129ec5760405162461bcd60e51b8152600401808060200182810382526027815260200180613cf56027913960400191505060405180910390fd5b620186a0612a048361ffff871663ffffffff61346116565b81612a0b57fe5b0460c08b0152620186a0612a298261ffff861663ffffffff61346116565b81612a3057fe5b0460e08b01526000806001600160a01b038916612a4e576000612ac8565b60055460408051631c60f51f60e21b81526001600160a01b038c8116600483015291519190921691637183d47c916024808301926020929190829003018186803b158015612a9b57600080fd5b505afa158015612aaf573d6000803e3d6000fd5b505050506040513d6020811015612ac557600080fd5b50515b90508015612b8d578315612b33576402540be400612b0061ffff8816612af4878563ffffffff61346116565b9063ffffffff61346116565b81612b0757fe5b049150612b21828d60c0015161336590919063ffffffff16565b60c08d01528b51612b33908a84613656565b8215612b8d576402540be400612b5761ffff8716612af4868563ffffffff61346116565b81612b5e57fe5b049150612b78828d60e0015161336590919063ffffffff16565b60e08d015260208c0151612b8d908a84613656565b600c5460ff1615612cf55760055460408051634cadad5760e11b8152815160009384936001600160a01b039091169263995b5aae9260048083019392829003018186803b158015612bdd57600080fd5b505afa158015612bf1573d6000803e3d6000fd5b505050506040513d6040811015612c0757600080fd5b50805160209091015190925090506001600160a01b03811615612cf257612c3b82612af4620186a08663ffffffff61336516565b91508515612c965766038d7ea4c68000612c6361ffff8a16612af4898663ffffffff61346116565b81612c6a57fe5b049350612c84848f60c0015161336590919063ffffffff16565b60c08f01528d51612c96908286613656565b8415612cf25766038d7ea4c68000612cbc61ffff8916612af4888663ffffffff61346116565b81612cc357fe5b049350612cdd848f60e0015161336590919063ffffffff16565b60e08f015260208e0151612cf2908286613656565b50505b8315612d77578b51604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015612d4557600080fd5b505afa158015612d59573d6000803e3d6000fd5b505050506040513d6020811015612d6f57600080fd5b505160808d01525b8215612df7576020808d0151604080516370a0823160e01b815230600482015290516001600160a01b03909216926370a0823192602480840193829003018186803b158015612dc557600080fd5b505afa158015612dd9573d6000803e3d6000fd5b505050506040513d6020811015612def57600080fd5b505160a08d01525b50506000612e168b60c001518c6080015161336590919063ffffffff16565b90506000612e358c60e001518d60a0015161336590919063ffffffff16565b9050612e53886001600160701b0316886001600160701b031661324f565b612e5d838361324f565b1015612eb0576040805162461bcd60e51b815260206004820152600f60248201527f48797065727377617050616972204b0000000000000000000000000000000000604482015290519081900360640190fd5b5050612ec48a608001518b60a0015161314c565b6040808b01516060808d0151835186815260208101869052808501939093529082015290516001600160a01b038b169133917fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229181900360800190a350506001600d555050505050505050565b6001600160a01b03808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600c5460009060ff1615612fa95750600061093d565b60055460408051634cadad5760e11b8152815160009384936001600160a01b039091169263995b5aae9260048083019392829003018186803b158015612fee57600080fd5b505afa158015613002573d6000803e3d6000fd5b505050506040513d604081101561301857600080fd5b508051602090910151600b546001600160a01b03821615801596509294509092509061313757801561313257600061306561170b886001600160701b0316886001600160701b031661324f565b90506000613072836134ba565b90508082111561312f5760006130ab606487613097620186a08363ffffffff61346116565b8161309e57fe5b049063ffffffff61336516565b905060006130d66064612af46130c7878763ffffffff61336516565b6000549063ffffffff61346116565b9050600061310a6130ee85606463ffffffff61346116565b6130fe878663ffffffff61346116565b9063ffffffff6139cc16565b9050600081838161311757fe5b049050801561312a5761312a888261350c565b505050505b50505b613143565b8015613143576000600b555b50505092915050565b6001600160701b03821180159061316a57506001600160701b038111155b6131bb576040805162461bcd60e51b815260206004820152601660248201527f48797065727377617050616972204f564552464c4f5700000000000000000000604482015290519081900360640190fd5b600880546dffffffffffffffffffffffffffff19166001600160701b038481169182177fffffffff0000000000000000000000000000ffffffffffffffffffffffffffff16600160701b9185169182021790925560408051918252602082019290925281517f1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1929181900390910190a15050565b600c5460009060ff16156133555760095460009061327b85670de0b6b3a764000063ffffffff61346116565b8161328257fe5b0490506000600a546132a5670de0b6b3a76400008661346190919063ffffffff16565b816132ac57fe5b0490506000670de0b6b3a76400006132ca848463ffffffff61346116565b816132d157fe5b0490506000613327670de0b6b3a76400006132f2858063ffffffff61346116565b816132f957fe5b04670de0b6b3a7640000613313878063ffffffff61346116565b8161331a57fe5b049063ffffffff6139cc16565b9050670de0b6b3a7640000613342838363ffffffff61346116565b8161334957fe5b0494505050505061093d565b610c4c838363ffffffff61346116565b6000610c4c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613a26565b6001600160a01b0383166000908152600160205260409020546133d0908263ffffffff61336516565b6001600160a01b038085166000908152600160205260408082209390935590841681522054613405908263ffffffff6139cc16565b6001600160a01b0380841660008181526001602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000826134705750600061093d565b8282028284828161347d57fe5b0414610c4c5760405162461bcd60e51b8152600401808060200182810382526021815260200180613d726021913960400191505060405180910390fd5b600060038211156134fd575080600160028204015b818110156134f7578091506002818285816134e657fe5b0401816134ef57fe5b0490506134cf565b50613507565b8115613507575060015b919050565b60005461351f908263ffffffff6139cc16565b60009081556001600160a01b03831681526001602052604090205461354a908263ffffffff6139cc16565b6001600160a01b03831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b60008183106135b15781610c4c565b5090919050565b6001600160a01b0382166000908152600160205260409020546135e1908263ffffffff61336516565b6001600160a01b0383166000908152600160205260408120919091555461360e908263ffffffff61336516565b60009081556040805183815290516001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef919081900360200190a35050565b604080518082018252601981527f7472616e7366657228616464726573732c75696e74323536290000000000000060209182015281516001600160a01b0385811660248301526044808301869052845180840390910181526064909201845291810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b1781529251815160009460609489169392918291908083835b602083106137185780518252601f1990920191602091820191016136f9565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461377a576040519150601f19603f3d011682016040523d82523d6000602084013e61377f565b606091505b50915091508180156137ad5750805115806137ad57508080602001905160208110156137aa57600080fd5b50515b610b50576040805162461bcd60e51b815260206004820152601d60248201527f48797065727377617050616972205452414e534645525f4641494c4544000000604482015290519081900360640190fd5b600c5460009060ff161561394157613839620186a0613823888563ffffffff61346116565b8161382a57fe5b8891900463ffffffff61336516565b95506000613847858561324f565b905060095485670de0b6b3a7640000028161385e57fe5b049450600a5484670de0b6b3a7640000028161387657fe5b600654919004945060009081906001600160a01b0389811691161461389c57858761389f565b86865b60065491935091506001600160a01b038981169116146138d457600a5489670de0b6b3a764000002816138ce57fe5b046138eb565b60095489670de0b6b3a764000002816138e957fe5b045b985060006138fc838b018584613abd565b6006549083039150670de0b6b3a7640000906001600160a01b038b81169116146139285760095461392c565b600a545b82028161393557fe5b049450505050506139c3565b60065460009081906001600160a01b03888116911614613962578486613965565b85855b909250905061398d613980620186a08663ffffffff61336516565b899063ffffffff61346116565b97506139a6886130fe84620186a063ffffffff61346116565b6139b6898363ffffffff61346116565b816139bd57fe5b04925050505b95945050505050565b600082820183811015610c4c576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008184841115613ab55760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613a7a578181015183820152602001613a62565b50505050905090810190601f168015613aa75780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000805b60ff811015613b7557826000613ad78783613b7e565b905085811015613b0d576000613aed8887613bce565b828803670de0b6b3a76400000281613b0157fe5b04959095019450613b34565b6000613b198887613bce565b878303670de0b6b3a76400000281613b2d57fe5b0490950394505b81851115613b5657600182860311613b5157849350505050610c4c565b613b6b565b600185830311613b6b57849350505050610c4c565b5050600101613ac1565b50909392505050565b6000670de0b6b3a764000082818581818002040281613b9957fe5b040281613ba257fe5b04670de0b6b3a7640000808481818002040281613bbb57fe5b04850281613bc557fe5b04019392505050565b6000670de0b6b3a76400008381818002040281613be757fe5b04670de0b6b3a76400008084800204856003020281613bc557fe5b60405180610100016040528060006001600160a01b0316815260200160006001600160a01b03168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152509056fe48797065727377617050616972206f6e6c7920666163746f72792773206f776e657248797065727377617050616972206c697175696469747920726174696f206e6f7420696e697469616c697a65644879706572737761705061697220494e53554646494349454e545f4c49515549444954594879706572737761705061697220494e53554646494349454e545f4f55545055545f414d4f554e544879706572737761705061697220494e53554646494349454e545f494e5055545f414d4f554e5448797065727377617050616972206f6e6c7920666163746f7279277320736574537461626c654f776e65724879706572737761705061697220494e53554646494349454e545f4c49515549444954595f4d494e544544536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77487970657273776170506169722066656550657263656e74206d7573746e27742065786365656420746865206d696e696d756d487970657273776170506169722066656550657263656e74206d7573746e27742065786365656420746865206d6178696d756d4879706572737761705061697220494e53554646494349454e545f4c49515549444954595f4255524e454448797065727377617050616972206f6e6c7920666163746f7279277320666565416d6f756e744f776e6572a265627a7a723158201cf5d65a01e9791fb45931c5192766e2433a34c6e11b2641cf8ad169e931125764736f6c63430005100032
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$7.38
Net Worth in HYPE
Token Allocations
WHYPE
100.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| HYPEREVM | 100.00% | $22.06 | 0.3347 | $7.38 |
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.