Overview
S Balance
0 S
S Value
-More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Incubator
Compiler Version
v0.8.28+commit.7893614a
Contract Source Code (Solidity Standard Json-Input format)
/* █▀ █▀█ █▄░█ █ █▀▀ █▀▀ ▄▀█ █▀▀ ▀█▀ █▀█ █▀█ █▄█ ▄█ █▄█ █░▀█ █ █▄▄ █▀░ █▀█ █▄▄ ░█░ █▄█ █▀▄ ░█░ Trade on SonicFactory and have fun! Web: https://sonicfactory.fun/ */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; import "./interfaces/IERC20.sol"; import "./interfaces/IIncubatorToken.sol"; import "./interfaces/IIncubatorPair.sol"; import "./interfaces/IUniswapV2Router.sol"; import "./interfaces/IUniswapV2Factory.sol"; import "./Ownable.sol"; import "./Token/Token.sol"; contract Incubator is Ownable { uint8 private _PAUSED; uint8 private _initialized; uint8 private constant _DECIMALS = 18; uint24 private _SWAP_FEE; uint24 private _REFERRAL_FEE; uint24 private _ESCAPE_FEE; uint24 private _ESCAPE_CREATOR_FEE; uint24 private _TOKEN_INITIAL_PERCENT; uint112 private _ETH_RESERVE_VIRTUAL_INITIAL; uint112 private _ETH_RESERVE_ESCAPE_TARGET; uint256 private _CREATION_FEE; uint256 private constant _TOTAL_SUPPLY = 1_000_000_000 ether; address private _AUTHORIZED; address private _TREASURY; address private _ROUTER_INCUBATOR; address private _WETH_INCUBATOR; address[] private _tokenList; address[] private _unauthorizedList; mapping(address => TokenData) private _tokenData; mapping(address => RouterData) private _routerData; mapping(address => bool) private _creatorData; mapping(address => address) private _pairData; struct TokenData { bytes32 salt; uint24 maxBalance; uint24 fee; uint24 tax; uint24 ref; uint32 creation; uint32 launch; uint32 escaped; uint112 ethReserveEscapeTarget; uint112 ethReserveVirtualInitial; uint112 ethReserveEscaped; uint112 tokenReserveInitial; uint256 tokenReserveEscaped; uint256 initialSupply; uint256 creationFee; uint256 escapeFee; address creator; address referral; address routerIncubator; address pairIncubator; address routerFinal; bool autoEscape; } struct TokenDataView { string name; string symbol; uint8 decimals; uint24 maxBalance; uint24 fee; uint24 tax; uint24 ref; uint24 holders; uint32 creation; uint32 launch; uint32 escaped; uint112 ethReserveEscapeTarget; uint112 ethReserveEscaped; uint112 ethReserveVirtualInitial; uint112 ethReserve; uint112 tokenReserveInitial; uint112 tokenReserve; uint256 tokenReserveEscaped; uint256 initialSupply; uint256 totalSupply; uint256 creationFee; uint256 escapeFee; address creator; address referral; address routerIncubator; address pairIncubator; address routerFinal; bool autoEscape; } struct RouterData { bool exists; bool enabled; } struct TokenListView { address token; address creator; bytes32 salt; } struct currentStatusView { address routerIncubator; uint8 paused; uint8 decimals; uint24 swapFee; uint24 referralFee; uint24 escapeFee; uint24 escapeCreatorFee; uint24 tokenInitialPercent; uint112 ethReserveVirtualInitial; uint112 ethReserveEscapeTarget; uint256 creationFee; uint256 totalSupply; } event TokenDeployed(address indexed token, address indexed creator, bytes32 salt); event TokenEscaped(address indexed token, uint32 escapeTime, uint112 ethReserveEscaped, uint256 tokenReserveEscaped, uint256 escapeFee); event TokenTraded(address indexed token, uint32 tradeTime, address indexed user, bool buy, uint112 ethReserve, uint112 tokenReserve, uint256 ethAmount, uint256 tokenAmount, uint256 feeAmount, uint256 taxAmount, uint256 refAmount); event WithdrawnETH(address indexed to, uint256 value); event WithdrawnERC20(address token, address indexed to, uint256 value); error ErrorPaused(); error ErrorReferral(); error ErrorTransfer(address to, uint256 value); error ErrorRouterUnavailable(address router); error ErrorTokenMinimumValue(uint256 value); error ErrorUnknownToken(address token); error ErrorUnescapedToken(address token); error ErrorTokenMaxBalance(uint24 percent); error ErrorTokenTax(uint24 percent); error ErrorTokenLiquidity(uint256 tokenAmount, uint256 ethAmount); error ErrorInvalidRange(); modifier onlyOwnerOrAuthorized() { if (msg.sender != _owner && msg.sender != _AUTHORIZED) { revert ErrorUnauthorized(msg.sender); } _; } modifier isToken(address token) { if (_tokenData[token].creator == address(0)) { revert ErrorUnknownToken(token); } _; } modifier isPairOfToken() { if (_pairData[msg.sender] == address(0)) { revert ErrorUnauthorized(msg.sender); } _; } constructor() payable {} function initialize() external { require(_initialized == 0); _SWAP_FEE = 1_000; // 1% _REFERRAL_FEE = 20_000; // 20% of _SWAP_FEE _ESCAPE_FEE = 5_000; // 5% _ESCAPE_CREATOR_FEE = 50_000; // 50% of _ESCAPE_FEE _TOKEN_INITIAL_PERCENT = 100_000; // 100% _ETH_RESERVE_VIRTUAL_INITIAL = 0.8 ether; _ETH_RESERVE_ESCAPE_TARGET = 3.8 ether; _transferOwnership(msg.sender); _initialized = 1; } function setPaused(bool status) external onlyOwner { _PAUSED = status ? 1 : 0; } function setAuthorized(address authorized) external onlyOwner { _AUTHORIZED = authorized; } function setFees(uint256 creationFee, uint24 swapFee, uint24 referralFee, uint24 escapeFee, uint24 escapeCreatorFee) external onlyOwner { require(swapFee <= 5_000); // Max. 5% require(referralFee <= 50_000); // Max. 50% of swapFee require(escapeFee <= 25_000); // Max. 25% require(escapeCreatorFee <= 100_000); // Max. 100% of escapeFee _CREATION_FEE = creationFee; _SWAP_FEE = swapFee; _REFERRAL_FEE = referralFee; _ESCAPE_FEE = escapeFee; _ESCAPE_CREATOR_FEE = escapeCreatorFee; } function setTokenReserves(uint24 percent) external onlyOwner { require(percent >= 50_000 && percent <= 100_000); // 50% to 100% _TOKEN_INITIAL_PERCENT = percent; } function setEthReserves(uint112 ethReserveVirtualInitial, uint112 ethReserveEscapeTarget) external onlyOwner { _ETH_RESERVE_VIRTUAL_INITIAL = ethReserveVirtualInitial; _ETH_RESERVE_ESCAPE_TARGET = ethReserveEscapeTarget; } function setRouterIncubator(address router) external onlyOwner { _ROUTER_INCUBATOR = router; _WETH_INCUBATOR = IUniswapV2Router(router).WETH(); } function setRouterFinal(address router, bool enabled, address[] calldata related) external onlyOwner { RouterData storage _router = _routerData[router]; _router.enabled = enabled; if (!_router.exists) { _router.exists = true; _unauthorizedList.push(router); unchecked { uint256 cnt = related.length; for (uint256 i; i < cnt; i++) { _unauthorizedList.push(related[i]); } } } } function listTokens(uint256 offset, uint256 limit) external view returns (TokenListView[] memory) { uint256 cnt = _tokenList.length; uint256 total; unchecked { total = (offset + limit > cnt) ? (cnt - offset) : limit; if (total > cnt) { revert ErrorInvalidRange(); } } TokenListView[] memory data = new TokenListView[](total); unchecked { uint256 j; uint256 max = offset + total; for (uint256 i = offset; i < max; i++) { address token = _tokenList[i]; TokenData storage tokenData = _tokenData[token]; data[j++] = TokenListView(token, tokenData.creator, tokenData.salt); } } return data; } function getTokenData(address token) public view isToken(token) returns (TokenDataView memory data) { TokenData storage tokenData = _tokenData[token]; data.name = IERC20(token).name(); data.symbol = IERC20(token).symbol(); data.decimals = IERC20(token).decimals(); data.creator = tokenData.creator; data.referral = tokenData.referral; data.creation = tokenData.creation; data.launch = tokenData.launch; data.maxBalance = tokenData.maxBalance; data.fee = tokenData.fee; data.tax = tokenData.tax; data.ref = tokenData.ref; data.holders = IIncubatorToken(token).totalHolders(); data.routerIncubator = tokenData.routerIncubator; data.pairIncubator = tokenData.pairIncubator; data.routerFinal = tokenData.routerFinal; data.escaped = tokenData.escaped; data.initialSupply = tokenData.initialSupply; data.totalSupply = IERC20(token).totalSupply(); data.ethReserveEscapeTarget = tokenData.ethReserveEscapeTarget; data.ethReserveVirtualInitial = tokenData.ethReserveVirtualInitial; data.tokenReserveInitial = tokenData.tokenReserveInitial; data.creationFee = tokenData.creationFee; data.escapeFee = tokenData.escapeFee; data.autoEscape = tokenData.autoEscape; if (tokenData.escaped == 0) { data.ethReserve = uint112(IERC20(_WETH_INCUBATOR).balanceOf(tokenData.pairIncubator)); data.tokenReserve = uint112(IERC20(token).balanceOf(tokenData.pairIncubator)); } else { data.ethReserveEscaped = tokenData.ethReserveEscaped; data.tokenReserveEscaped = tokenData.tokenReserveEscaped; } } function deployToken(bytes32 _salt, string memory _name, string memory _symbol, uint24 _maxBalance, uint24 _tax, uint32 _launch, address _routerFinal, bool _autoEscape, address _referral) external payable returns (address token) { if (_PAUSED == 1) { revert ErrorPaused(); } if (!_routerData[_routerFinal].enabled) { revert ErrorRouterUnavailable(_routerFinal); } if (_referral != address(0) && (_referral == msg.sender || !_creatorData[_referral])) { revert ErrorReferral(); } uint256 value = msg.value; if (value < _CREATION_FEE) { revert ErrorTokenMinimumValue(_CREATION_FEE); } if (_maxBalance < 100 && _maxBalance > 100_000) { revert ErrorTokenMaxBalance(_maxBalance); } // Min. 0.1% if (_tax > 10_000) { revert ErrorTokenTax(_tax); } // Max. 10% Token _token = new Token{ salt: _salt }(address(this), msg.sender, _name, _symbol, _DECIMALS, _TOTAL_SUPPLY); token = address(_token); TokenData storage tokenData = _tokenData[token]; tokenData.creator = msg.sender; tokenData.salt = _salt; tokenData.referral = _referral; tokenData.creation = _timestamp(); tokenData.maxBalance = _maxBalance; tokenData.fee = _SWAP_FEE; tokenData.tax = _tax; tokenData.launch = _launch > _timestamp() ? _launch : _timestamp(); tokenData.ref = _referral == address(0) ? uint24(0) : _REFERRAL_FEE; tokenData.initialSupply = _TOTAL_SUPPLY; tokenData.routerIncubator = _ROUTER_INCUBATOR; tokenData.pairIncubator = IUniswapV2Factory(IUniswapV2Router(_ROUTER_INCUBATOR).factory()).createPair(token, _WETH_INCUBATOR); tokenData.tokenReserveInitial = uint112(_percentage(_TOTAL_SUPPLY, uint256(_TOKEN_INITIAL_PERCENT))); tokenData.ethReserveVirtualInitial = _ETH_RESERVE_VIRTUAL_INITIAL; tokenData.ethReserveEscapeTarget = _ETH_RESERVE_ESCAPE_TARGET; tokenData.routerFinal = _routerFinal; tokenData.autoEscape = _autoEscape; _tokenList.push(token); _pairData[tokenData.pairIncubator] = token; if (!_creatorData[tokenData.creator]) { _creatorData[tokenData.creator] = true; } if (_CREATION_FEE > 0) { tokenData.creationFee = _CREATION_FEE; if (_TREASURY != address(0)) { (bool success,) = _TREASURY.call{ value: tokenData.creationFee }(""); if (!success) { revert ErrorTransfer(_TREASURY, tokenData.creationFee); } } unchecked { value -= _CREATION_FEE; } } IIncubatorToken(token).initialize(tokenData.routerIncubator, tokenData.pairIncubator, tokenData.maxBalance, tokenData.tax, tokenData.launch, _unauthorizedList); IERC20(token).transfer(tokenData.pairIncubator, uint256(tokenData.tokenReserveInitial)); emit TokenDeployed(token, tokenData.creator, _salt); IIncubatorPair(tokenData.pairIncubator).initializePair(tokenData.creator, _SWAP_FEE, _tax, tokenData.ref, tokenData.launch, tokenData.tokenReserveInitial, _ETH_RESERVE_VIRTUAL_INITIAL, _ETH_RESERVE_ESCAPE_TARGET, _WETH_INCUBATOR, tokenData.referral, tokenData.autoEscape); if (value > 0) { address[] memory path = new address[](2); path[0] = _WETH_INCUBATOR; path[1] = token; IUniswapV2Router(tokenData.routerIncubator).swapExactETHForTokensSupportingFeeOnTransferTokens{ value: value }(0, path, tokenData.creator, _timestamp()); } } function pairSwap(address user, bool buy, uint112 ethReserve, uint112 tokenReserve, uint256 ethAmount, uint256 tokenAmount, uint256 feeAmount, uint256 taxAmount, uint256 refAmount) external isPairOfToken() { address token = _pairData[msg.sender]; if (_TREASURY != address(0) && feeAmount > 0) { (bool success,) = _TREASURY.call{ value: feeAmount }(""); if (!success) { revert ErrorTransfer(_TREASURY, feeAmount); } } emit TokenTraded(token, _timestamp(), user, buy, ethReserve, tokenReserve, ethAmount, tokenAmount, feeAmount, taxAmount, refAmount); } function tokenEscape(uint256 amount) external payable isPairOfToken() { address token = _pairData[msg.sender]; uint256 value = msg.value; uint256 balance = IERC20(token).balanceOf(address(this)); TokenData storage tokenData = _tokenData[token]; tokenData.escaped = _timestamp(); tokenData.tokenReserveEscaped = amount; tokenData.ethReserveEscaped = uint112(value); if (_ESCAPE_FEE > 0) { tokenData.escapeFee = _percentage(value, uint256(_ESCAPE_FEE)); unchecked { value -= tokenData.escapeFee; } { // scope to avoid "stack too deep" error uint256 creatorFee; uint256 escapeFee; unchecked { creatorFee = _percentage(tokenData.escapeFee, uint256(_ESCAPE_CREATOR_FEE)); escapeFee = tokenData.escapeFee - creatorFee; } if (_TREASURY != address(0)) { (bool txTreasuryFee,) = _TREASURY.call{ value: escapeFee }(""); if (!txTreasuryFee) { revert ErrorTransfer(_TREASURY, escapeFee); } } (bool txCreatorFee,) = tokenData.creator.call{ value: creatorFee }(""); if (!txCreatorFee) { revert ErrorTransfer(tokenData.creator, creatorFee); } } } IIncubatorToken(token).escape(); if (_AUTHORIZED != address(0)) { IERC20(token).transfer(_AUTHORIZED, balance); (bool success,) = _AUTHORIZED.call{ value: value }(""); if (!success) { revert ErrorTransfer(_AUTHORIZED, value); } } emit TokenEscaped(token, tokenData.escaped, tokenData.ethReserveEscaped, tokenData.tokenReserveEscaped, tokenData.escapeFee); } function currentStatus() external view returns (currentStatusView memory data) { data.paused = _PAUSED; data.decimals = _DECIMALS; data.swapFee = _SWAP_FEE; data.referralFee = _REFERRAL_FEE; data.escapeFee = _ESCAPE_FEE; data.escapeCreatorFee = _ESCAPE_CREATOR_FEE; data.tokenInitialPercent = _TOKEN_INITIAL_PERCENT; data.ethReserveVirtualInitial = _ETH_RESERVE_VIRTUAL_INITIAL; data.ethReserveEscapeTarget = _ETH_RESERVE_ESCAPE_TARGET; data.creationFee = _CREATION_FEE; data.totalSupply = _TOTAL_SUPPLY; data.routerIncubator = _ROUTER_INCUBATOR; } function setTreasury(address treasury) external onlyOwner { _TREASURY = treasury; } function withdrawETH(address to, uint256 value) external onlyOwnerOrAuthorized { (bool success,) = to.call{ value: value }(""); if (!success) { revert ErrorTransfer(to, value); } emit WithdrawnETH(to, value); } function withdrawERC20(address token, address to, uint256 value) external onlyOwnerOrAuthorized { IERC20(token).transfer(to, value); emit WithdrawnERC20(token, to, value); } function _timestamp() private view returns (uint32) { unchecked { return uint32(block.timestamp % 2**32); } } function _percentage(uint256 value, uint256 bps) private pure returns (uint256) { unchecked { return (value * bps) / 100_000; } } receive() external payable {} }
/* █▀ █▀█ █▄░█ █ █▀▀ █▀▀ ▄▀█ █▀▀ ▀█▀ █▀█ █▀█ █▄█ ▄█ █▄█ █░▀█ █ █▄▄ █▀░ █▀█ █▄▄ ░█░ █▄█ █▀▄ ░█░ Trade on SonicFactory and have fun! Web: https://sonicfactory.fun/ */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.24; import "./ERC20.sol"; contract Token is ERC20 { address private immutable _creator; address private _owner; address private _router; address private _pair; bool private _escaped; bool private _initialized; uint24 private _maxBalance; uint24 private _tax; uint32 private _launch; mapping(address => bool) private _unauthorized; struct HolderView { address holder; uint256 balance; } event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); error ErrorUnauthorized(address sender); error ErrorAlreadyInitialized(); error ErrorUnapprovable(); error ErrorMaxBalanceExceeded(); error ErrorInvalidRecipient(address to); error ErrorInvalidRange(); modifier onlyOwner() { if (msg.sender != _owner) { revert ErrorUnauthorized(msg.sender); } _; } constructor(address _owner_, address _creator_, string memory _name_, string memory _symbol_, uint8 _decimals_, uint256 _totalSupply_) ERC20(_name_, _symbol_, _decimals_) payable { _creator = _creator_; _owner = _owner_; _mint(_owner_, _totalSupply_); } function initialize(address _router_, address _pair_, uint24 _maxBalance_, uint24 _tax_, uint32 _launch_, address[] calldata _unauthorized_) external onlyOwner { if (_initialized) { revert ErrorAlreadyInitialized(); } unchecked { uint256 cnt = _unauthorized_.length; for (uint256 i; i < cnt; i++) { _unauthorized[_unauthorized_[i]] = true; } } _router = _router_; _pair = _pair_; _maxBalance = _maxBalance_; _tax = _tax_; _launch = _launch_; _initialized = true; } function owner() external view returns (address) { return _owner; } /// @notice Returns the creator address function creator() external view returns (address) { return _creator; } function approve(address spender, uint256 value) public override returns (bool) { if (!_escaped && spender != _router) { revert ErrorUnapprovable(); } return super.approve(spender, value); } function permit(address owner_, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public override { if (!_escaped && spender != _router) { revert ErrorUnapprovable(); } super.permit(owner_, spender, value, deadline, v, r, s); } function _transferCheck(address from, address to, uint256 value) private view { if (_escaped || ((from == _owner && to == _pair) || ((!_escaped && to == _owner) || value == 0 || to == address(0xdEaD) || to == _router || to == _pair))) { return; } if (!_escaped) { if (_unauthorized[to]) { revert ErrorInvalidRecipient(to); } unchecked { if (_maxBalance == 100_000 || _balance[to] + value <= _percentage(_totalSupply, uint256(_maxBalance))) { return; } } } revert ErrorMaxBalanceExceeded(); } function transfer(address to, uint256 value) external virtual override returns (bool) { _transfer(msg.sender, to, value); return true; } function _transfer(address from, address to, uint256 value) internal virtual override { _transferCheck(from, to, value); super._transfer(from, to, value); } function transferFrom(address from, address to, uint256 value) public override returns (bool) { if (!_escaped && msg.sender == _router && to == _pair && _allowance[from][_router] != type(uint256).max) { super._approve(from, _router, type(uint256).max, false); } _transferCheck(from, to, value); return super.transferFrom(from, to, value); } function totalHolders() external view returns (uint24 total) { return _totalHolders; } function holders(uint256 offset, uint256 limit) public view returns (HolderView[] memory) { if (offset >= _totalHolders) { revert ErrorInvalidRange(); } unchecked { if (offset + limit > _totalHolders) { limit = _totalHolders - offset; } } HolderView[] memory list = new HolderView[](limit); unchecked { uint256 j; for (uint256 i = offset; j < limit; i++) { address holder = _holders[i]; if (holder == address(0xdEaD) || _balance[holder] == 0) { continue; } list[j].holder = holder; list[j].balance = _balance[holder]; ++j; } } return list; } function maxBalance() external view returns (uint24) { return _maxBalance; } function tax() external view returns (uint24) { return _tax; } function launch() external view returns (uint32) { return _launch; } /// @notice Returns True if token has reached the target MC and is now tradeable on a public DEX function escaped() external view returns (bool) { return _escaped; } function escape() external onlyOwner { if (_escaped) { revert ErrorUnauthorized(msg.sender); } if (_maxBalance < 100_000) { _maxBalance = 100_000; } // 100% address _previousOwner = _owner; delete _tax; delete _owner; delete _router; delete _pair; _escaped = true; emit OwnershipTransferred(_previousOwner, _owner); } function _percentage(uint256 value, uint256 bps) private pure returns (uint256) { unchecked { return (value * bps) / 100_000; } } function _timestamp() private view returns (uint32) { unchecked { return uint32(block.timestamp % 2**32); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; abstract contract Ownable { address internal _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); error ErrorUnauthorized(address sender); modifier onlyOwner() { if (msg.sender != _owner) { revert ErrorUnauthorized(msg.sender); } _; } function renounceOwnership() external onlyOwner { _transferOwnership(address(0)); } function transferOwnership(address newOwner) external onlyOwner { require(newOwner != address(0)); _transferOwnership(newOwner); } function _transferOwnership(address newOwner) internal { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } function owner() external view returns (address) { return _owner; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; interface IUniswapV2Factory { function createPair(address tokenA, address tokenB) external returns (address pair); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; interface IUniswapV2Router { function WETH() external pure returns (address); function factory() external pure returns (address); function addLiquidityETH(address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity); function swapExactETHForTokensSupportingFeeOnTransferTokens(uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external payable; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; interface IIncubatorPair { function initializePair(address creator, uint24 fee, uint24 tax, uint24 ref, uint32 launch, uint112 tokenInitialReserve, uint112 ethInitialVirtualReserve, uint112 ethReserveEscapeTarget, address WETH, address referral, bool autoEscape) external; function getTraderData(address user) external view returns (uint32 lastActivity, uint32 buys, uint32 sells, uint256 buy_volume, uint256 sell_volume); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; interface IIncubatorToken { function totalHolders() external view returns (uint24); function initialize(address router, address pair, uint24 maxBalance, uint24 tax, uint32 launch, address[] calldata unauthorized) external; function escape() external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; interface IERC20 { function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); function balanceOf(address account) external view returns (uint256); function totalSupply() external view returns (uint256); function transfer(address to, uint256 value) external returns (bool); function approve(address spender, uint256 value) external returns (bool); function burn(uint256 value) external returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; abstract contract ERC20 { uint8 private immutable _decimals; uint24 internal _totalHolders; uint256 internal _totalSupply; string private _name; string private _symbol; bytes32 public immutable DOMAIN_SEPARATOR; bytes32 private constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); address[] internal _holders; mapping(address => uint256) private _nonces; mapping(address => uint256) internal _balance; mapping(address => mapping(address => uint256)) internal _allowance; mapping(address => bool) internal _holderData; event Approval(address indexed owner, address indexed spender, uint256 value); event Transfer(address indexed from, address indexed to, uint256 value); error ERC20InvalidApprover(address owner); error ERC20InvalidSpender(address spender); error ERC20InvalidSender(address sender); error ERC20InvalidReceiver(address to); error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 value); error ERC20InsufficientBalance(address owner, uint256 balance, uint256 value); error ERC2612ExpiredSignature(uint256 deadline); error ERC2612InvalidSigner(address signer, address owner); constructor(string memory _name_, string memory _symbol_, uint8 _decimals_) { _name = _name_; _symbol = _symbol_; _decimals = _decimals_; DOMAIN_SEPARATOR = keccak256(abi.encode(keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(_name)), keccak256(bytes("1")), block.chainid, address(this))); } function name() external view returns (string memory) { return _name; } function symbol() external view returns (string memory) { return _symbol; } function decimals() external view returns (uint8) { return _decimals; } function totalSupply() external view returns (uint256) { return _totalSupply; } function balanceOf(address account) external view returns (uint256) { return _balance[account]; } function allowance(address owner, address spender) public view returns (uint256) { return _allowance[owner][spender]; } function approve(address spender, uint256 value) public virtual returns (bool) { _approve(msg.sender, spender, value, true); return true; } function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public virtual { if (block.timestamp > deadline) { revert ERC2612ExpiredSignature(deadline); } unchecked { address signer = ecrecover(keccak256(abi.encodePacked(hex"1901", DOMAIN_SEPARATOR, keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, _nonces[owner]++, deadline)))), v, r, s); if (signer != owner) { revert ERC2612InvalidSigner(signer, owner); } } _approve(owner, spender, value, true); } function nonces(address owner) external view returns (uint256) { return _nonces[owner]; } function transfer(address to, uint256 value) external virtual returns (bool) { _transfer(msg.sender, to, value); return true; } function transferFrom(address from, address to, uint256 value) public virtual returns (bool) { if (value > 0) { address spender = msg.sender; uint256 allowed = allowance(from, spender); if (allowed < value) { revert ERC20InsufficientAllowance(to, allowed, value); } if (allowed != type(uint256).max) { unchecked { _approve(from, spender, allowed - value, false); } } } _transfer(from, to, value); return true; } function burn(uint256 value) external returns (bool) { _transfer(msg.sender, address(0xdEaD), value); return true; } function _approve(address owner, address spender, uint256 value, bool emitEvent) internal { if (owner == address(0)) { revert ERC20InvalidApprover(owner); } if (spender == address(0)) { revert ERC20InvalidSpender(spender); } _allowance[owner][spender] = value; if (emitEvent) { emit Approval(owner, spender, value); } } function _transfer(address from, address to, uint256 value) internal virtual { if (from == address(0)) { revert ERC20InvalidSender(from); } if (to == address(0) || to == address(this)) { revert ERC20InvalidReceiver(to); } if (_balance[from] < value) { revert ERC20InsufficientBalance(from, _balance[from], value); } if (value > 0) { unchecked { _balance[from] -= value; if (_balance[from] == 0) { --_totalHolders; } if (to == address(0xdEaD)) { _totalSupply -= value; } else { if (_balance[to] == 0) { ++_totalHolders; } _balance[to] += value; if (!_holderData[to]) { _holderData[to] = true; _holders.push(to); } } } } emit Transfer(from, to, value); } function _mint(address to, uint256 value) internal { if (to == address(0) || to == address(0xdEaD)) { revert ERC20InvalidReceiver(to); } unchecked { if (_balance[to] == 0) { ++_totalHolders; } _totalSupply += value; _balance[to] += value; if (!_holderData[to]) { _holderData[to] = true; _holders.push(to); } } emit Transfer(address(0), to, value); } }
{ "optimizer": { "enabled": true, "runs": 9999 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "remappings": [], "evmVersion": "cancun" }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"inputs":[],"name":"ErrorInvalidRange","type":"error"},{"inputs":[],"name":"ErrorPaused","type":"error"},{"inputs":[],"name":"ErrorReferral","type":"error"},{"inputs":[{"internalType":"address","name":"router","type":"address"}],"name":"ErrorRouterUnavailable","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint256","name":"ethAmount","type":"uint256"}],"name":"ErrorTokenLiquidity","type":"error"},{"inputs":[{"internalType":"uint24","name":"percent","type":"uint24"}],"name":"ErrorTokenMaxBalance","type":"error"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ErrorTokenMinimumValue","type":"error"},{"inputs":[{"internalType":"uint24","name":"percent","type":"uint24"}],"name":"ErrorTokenTax","type":"error"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"ErrorTransfer","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ErrorUnauthorized","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"ErrorUnescapedToken","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"ErrorUnknownToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"bytes32","name":"salt","type":"bytes32"}],"name":"TokenDeployed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint32","name":"escapeTime","type":"uint32"},{"indexed":false,"internalType":"uint112","name":"ethReserveEscaped","type":"uint112"},{"indexed":false,"internalType":"uint256","name":"tokenReserveEscaped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"escapeFee","type":"uint256"}],"name":"TokenEscaped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint32","name":"tradeTime","type":"uint32"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"buy","type":"bool"},{"indexed":false,"internalType":"uint112","name":"ethReserve","type":"uint112"},{"indexed":false,"internalType":"uint112","name":"tokenReserve","type":"uint112"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"taxAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"refAmount","type":"uint256"}],"name":"TokenTraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"WithdrawnERC20","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"WithdrawnETH","type":"event"},{"inputs":[],"name":"currentStatus","outputs":[{"components":[{"internalType":"address","name":"routerIncubator","type":"address"},{"internalType":"uint8","name":"paused","type":"uint8"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"uint24","name":"swapFee","type":"uint24"},{"internalType":"uint24","name":"referralFee","type":"uint24"},{"internalType":"uint24","name":"escapeFee","type":"uint24"},{"internalType":"uint24","name":"escapeCreatorFee","type":"uint24"},{"internalType":"uint24","name":"tokenInitialPercent","type":"uint24"},{"internalType":"uint112","name":"ethReserveVirtualInitial","type":"uint112"},{"internalType":"uint112","name":"ethReserveEscapeTarget","type":"uint112"},{"internalType":"uint256","name":"creationFee","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"}],"internalType":"struct Incubator.currentStatusView","name":"data","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_salt","type":"bytes32"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint24","name":"_maxBalance","type":"uint24"},{"internalType":"uint24","name":"_tax","type":"uint24"},{"internalType":"uint32","name":"_launch","type":"uint32"},{"internalType":"address","name":"_routerFinal","type":"address"},{"internalType":"bool","name":"_autoEscape","type":"bool"},{"internalType":"address","name":"_referral","type":"address"}],"name":"deployToken","outputs":[{"internalType":"address","name":"token","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getTokenData","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"uint24","name":"maxBalance","type":"uint24"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"uint24","name":"tax","type":"uint24"},{"internalType":"uint24","name":"ref","type":"uint24"},{"internalType":"uint24","name":"holders","type":"uint24"},{"internalType":"uint32","name":"creation","type":"uint32"},{"internalType":"uint32","name":"launch","type":"uint32"},{"internalType":"uint32","name":"escaped","type":"uint32"},{"internalType":"uint112","name":"ethReserveEscapeTarget","type":"uint112"},{"internalType":"uint112","name":"ethReserveEscaped","type":"uint112"},{"internalType":"uint112","name":"ethReserveVirtualInitial","type":"uint112"},{"internalType":"uint112","name":"ethReserve","type":"uint112"},{"internalType":"uint112","name":"tokenReserveInitial","type":"uint112"},{"internalType":"uint112","name":"tokenReserve","type":"uint112"},{"internalType":"uint256","name":"tokenReserveEscaped","type":"uint256"},{"internalType":"uint256","name":"initialSupply","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"creationFee","type":"uint256"},{"internalType":"uint256","name":"escapeFee","type":"uint256"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"address","name":"referral","type":"address"},{"internalType":"address","name":"routerIncubator","type":"address"},{"internalType":"address","name":"pairIncubator","type":"address"},{"internalType":"address","name":"routerFinal","type":"address"},{"internalType":"bool","name":"autoEscape","type":"bool"}],"internalType":"struct Incubator.TokenDataView","name":"data","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"offset","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"listTokens","outputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"creator","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"}],"internalType":"struct Incubator.TokenListView[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"buy","type":"bool"},{"internalType":"uint112","name":"ethReserve","type":"uint112"},{"internalType":"uint112","name":"tokenReserve","type":"uint112"},{"internalType":"uint256","name":"ethAmount","type":"uint256"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint256","name":"feeAmount","type":"uint256"},{"internalType":"uint256","name":"taxAmount","type":"uint256"},{"internalType":"uint256","name":"refAmount","type":"uint256"}],"name":"pairSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"authorized","type":"address"}],"name":"setAuthorized","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint112","name":"ethReserveVirtualInitial","type":"uint112"},{"internalType":"uint112","name":"ethReserveEscapeTarget","type":"uint112"}],"name":"setEthReserves","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"creationFee","type":"uint256"},{"internalType":"uint24","name":"swapFee","type":"uint24"},{"internalType":"uint24","name":"referralFee","type":"uint24"},{"internalType":"uint24","name":"escapeFee","type":"uint24"},{"internalType":"uint24","name":"escapeCreatorFee","type":"uint24"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"router","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"},{"internalType":"address[]","name":"related","type":"address[]"}],"name":"setRouterFinal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"router","type":"address"}],"name":"setRouterIncubator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint24","name":"percent","type":"uint24"}],"name":"setTokenReserves","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"tokenEscape","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"withdrawERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526158d4806100115f395ff3fe60806040526004361061015a575f3560e01c80635beb0823116100bb578063af0d4f9511610071578063ef8a923511610057578063ef8a923514610380578063f0f44260146104ac578063f2fde38b146104cb575f5ffd5b8063af0d4f9514610335578063e30e5ae914610354575f5ffd5b80638129fc1c116100a15780638129fc1c146102e65780638da5cb5b146102fa578063a73cc35c14610316575f5ffd5b80635beb0823146102a7578063715018a6146102d2575f5ffd5b806337b3375f1161011057806344004cc1116100f657806344004cc11461024a5780634782f7791461026957806359d3515214610288575f5ffd5b806337b3375f14610218578063402c10391461022b575f5ffd5b806314fc28121161014057806314fc2812146101bb57806316c38b3c146101da5780631ca9ff1d146101f9575f5ffd5b806303a996c41461016557806313ff7e9f14610186575f5ffd5b3661016157005b5f5ffd5b348015610170575f5ffd5b5061018461017f366004612d87565b6104ea565b005b348015610191575f5ffd5b506101a56101a0366004612e0a565b610675565b6040516101b29190612e5a565b60405180910390f35b3480156101c6575f5ffd5b506101846101d5366004612e0a565b610d2d565b3480156101e5575f5ffd5b506101846101f43660046130d6565b610d93565b348015610204575f5ffd5b506101846102133660046130f1565b610de9565b61018461022636600461310c565b610e79565b348015610236575f5ffd5b50610184610245366004613140565b61140a565b348015610255575f5ffd5b50610184610264366004613171565b6114a9565b348015610274575f5ffd5b506101846102833660046131af565b6115c4565b348015610293575f5ffd5b506101846102a23660046131d9565b6116df565b6102ba6102b5366004613354565b611879565b6040516001600160a01b0390911681526020016101b2565b3480156102dd575f5ffd5b50610184612694565b3480156102f1575f5ffd5b506101846126cb565b348015610305575f5ffd5b505f546001600160a01b03166102ba565b348015610321575f5ffd5b50610184610330366004613425565b6127ef565b348015610340575f5ffd5b5061018461034f366004612e0a565b6129aa565b34801561035f575f5ffd5b5061037361036e3660046134a5565b612abd565b6040516101b291906134c5565b34801561038b575f5ffd5b5060408051610180810182525f5460ff74010000000000000000000000000000000000000000820416602083015260128284015262ffffff7601000000000000000000000000000000000000000000008204811660608401527901000000000000000000000000000000000000000000000000008204811660808401527c0100000000000000000000000000000000000000000000000000000000909104811660a083015260015480821660c08401526301000000810490911660e08301526dffffffffffffffffffffffffffff66010000000000009091048116610100830152600254166101208201526003546101408201526b033b2e3c9fd0803ce80000006101608201526006546001600160a01b0316815290516101b29190613535565b3480156104b7575f5ffd5b506101846104c6366004612e0a565b612c43565b3480156104d6575f5ffd5b506101846104e5366004612e0a565b612ca9565b5f546001600160a01b0316331461051b5760405163a11a9a4160e01b81523360048201526024015b60405180910390fd5b6113888462ffffff16111561052e575f5ffd5b61c3508362ffffff161115610541575f5ffd5b6161a88262ffffff161115610554575f5ffd5b620186a08162ffffff161115610568575f5ffd5b6003949094555f80547fffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000062ffffff958616027fffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff161779010000000000000000000000000000000000000000000000000093851693909302929092177fff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff167c010000000000000000000000000000000000000000000000000000000091841691909102179055600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000001691909216179055565b60408051610380810182526060808252602082018190525f92820183905281018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e08101829052610200810182905261022081018290526102408101829052610260810182905261028081018290526102a081018290526102c081018290526102e081018290526103008101829052610320810182905261034081018290526103608101919091526001600160a01b038083165f908152600a60205260409020600801548391166107b5576040517f8b67f6990000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610512565b6001600160a01b0383165f818152600a602052604080822081517f06fdde0300000000000000000000000000000000000000000000000000000000815291519093926306fdde0392600480820193918290030181865afa15801561081b573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610842919081019061364a565b835f0181905250836001600160a01b03166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa158015610884573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108ab919081019061364a565b8360200181905250836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108ef573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091391906136bf565b60ff1660408085019190915260088201546001600160a01b039081166102c0860152600983015481166102e0860152600183015463ffffffff6c010000000000000000000000008204811661010088015270010000000000000000000000000000000082041661012087015262ffffff8082166060880152630100000082048116608088015266010000000000008204811660a088015269010000000000000000009091041660c086015281517f53d74fdf0000000000000000000000000000000000000000000000000000000081529151908616916353d74fdf9160048083019260209291908290030181865afa158015610a11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a3591906136df565b62ffffff1660e0840152600a8101546001600160a01b03908116610300850152600b8201548116610320850152600c8201548116610340850152600182015474010000000000000000000000000000000000000000900463ffffffff166101408501526005820154610240850152604080517f18160ddd0000000000000000000000000000000000000000000000000000000081529051918616916318160ddd916004808201926020929091908290030181865afa158015610af9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b1d91906136fa565b61026084015260028101546dffffffffffffffffffffffffffff8082166101608601526e0100000000000000000000000000009182900481166101a0860152600383015491909104166101e0840152600681015461028084015260078101546102a0840152600c810154740100000000000000000000000000000000000000009081900460ff16151561036085015260018201540463ffffffff165f03610cff57600754600b8201546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201529116906370a0823190602401602060405180830381865afa158015610c23573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c4791906136fa565b6dffffffffffffffffffffffffffff166101c0840152600b8101546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152908516906370a0823190602401602060405180830381865afa158015610cc0573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ce491906136fa565b6dffffffffffffffffffffffffffff16610200840152610d26565b60038101546dffffffffffffffffffffffffffff1661018084015260048101546102208401525b5050919050565b5f546001600160a01b03163314610d595760405163a11a9a4160e01b8152336004820152602401610512565b600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b5f546001600160a01b03163314610dbf5760405163a11a9a4160e01b8152336004820152602401610512565b80610dca575f610dcd565b60015b5f60146101000a81548160ff021916908360ff16021790555050565b5f546001600160a01b03163314610e155760405163a11a9a4160e01b8152336004820152602401610512565b61c3508162ffffff1610158015610e345750620186a08162ffffff1611155b610e3c575f5ffd5b6001805462ffffff9092166301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff909216919091179055565b335f908152600d60205260409020546001600160a01b0316610eb05760405163a11a9a4160e01b8152336004820152602401610512565b335f908152600d60205260408082205490517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b0390911691349183906370a0823190602401602060405180830381865afa158015610f1f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f4391906136fa565b6001600160a01b0384165f908152600a602052604081206001810180547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff164263ffffffff167401000000000000000000000000000000000000000002179055600481018790556003810180547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000166dffffffffffffffffffffffffffff87161790559054919250907c0100000000000000000000000000000000000000000000000000000000900462ffffff16156111dc575f5461104d9084907c0100000000000000000000000000000000000000000000000000000000900462ffffff16620186a091020490565b6007820181905560015493819003935f918291611074919062ffffff16620186a091020490565b600784015460055491935083900391506001600160a01b031615611134576005546040515f916001600160a01b03169083908381818185875af1925050503d805f81146110dc576040519150601f19603f3d011682016040523d82523d5f602084013e6110e1565b606091505b5050905080611132576005546040517f1c196f330000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260248101839052604401610512565b505b60088301546040515f916001600160a01b03169084908381818185875af1925050503d805f8114611180576040519150601f19603f3d011682016040523d82523d5f602084013e611185565b606091505b50509050806111d85760088401546040517f1c196f330000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260248101849052604401610512565b5050505b836001600160a01b031663d180667d6040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611214575f5ffd5b505af1158015611226573d5f5f3e3d5ffd5b50506004546001600160a01b0316159150611372905057600480546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b03918216928101929092526024820184905285169063a9059cbb906044016020604051808303815f875af11580156112a8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112cc9190613711565b506004546040515f916001600160a01b03169085908381818185875af1925050503d805f8114611317576040519150601f19603f3d011682016040523d82523d5f602084013e61131c565b606091505b505090508061137057600480546040517f1c196f330000000000000000000000000000000000000000000000000000000081526001600160a01b039091169181019190915260248101859052604401610512565b505b6001810154600382015460048301546007840154604080517401000000000000000000000000000000000000000090950463ffffffff1685526dffffffffffffffffffffffffffff90931660208501529183015260608201526001600160a01b038516907fd3f4053c4681784b7bc55763984309feb3fb4aec78f26052bbfc4935740987cf9060800160405180910390a25050505050565b5f546001600160a01b031633146114365760405163a11a9a4160e01b8152336004820152602401610512565b600180547fffffffffffffffffffffffff0000000000000000000000000000ffffffffffff1666010000000000006dffffffffffffffffffffffffffff94851602179055600280547fffffffffffffffffffffffffffffffffffff00000000000000000000000000001691909216179055565b5f546001600160a01b031633148015906114ce57506004546001600160a01b03163314155b156114ee5760405163a11a9a4160e01b8152336004820152602401610512565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303815f875af1158015611553573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115779190613711565b50604080516001600160a01b038581168252602082018490528416917f31e3f58fbb760a4c31ae5c6416229fca813390b5fa0de533ee4cef14b2b344db91015b60405180910390a2505050565b5f546001600160a01b031633148015906115e957506004546001600160a01b03163314155b156116095760405163a11a9a4160e01b8152336004820152602401610512565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114611652576040519150601f19603f3d011682016040523d82523d5f602084013e611657565b606091505b50509050806116a4576040517f1c196f330000000000000000000000000000000000000000000000000000000081526001600160a01b038416600482015260248101839052604401610512565b826001600160a01b03167f5817fe91d2748c33f168d8a78037fc073adaf6ec8e3613a758d44a2cfae4563d836040516115b791815260200190565b5f546001600160a01b0316331461170b5760405163a11a9a4160e01b8152336004820152602401610512565b6001600160a01b0384165f908152600b602052604090208054841515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff82168117835560ff90811691161761187257805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909116811782556009805491820181555f9081527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af90910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03881617905582905b8181101561186f57600985858381811061180b5761180b61372c565b90506020020160208101906118209190612e0a565b8154600180820184555f93845260209093200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055016117ef565b50505b5050505050565b5f805474010000000000000000000000000000000000000000900460ff166001036118d0576040517fbc2c67a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0384165f908152600b6020526040902054610100900460ff16611931576040517f66e3bc3b0000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610512565b6001600160a01b0382161580159061197357506001600160a01b03821633148061197357506001600160a01b0382165f908152600c602052604090205460ff16155b156119aa576040517f22864a4500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035434908110156119ee576003546040517f9b9cbe1400000000000000000000000000000000000000000000000000000000815260040161051291815260200190565b60648862ffffff16108015611a0a5750620186a08862ffffff16115b15611a48576040517fd66f644100000000000000000000000000000000000000000000000000000000815262ffffff89166004820152602401610512565b6127108762ffffff161115611a90576040517f0b298c5e00000000000000000000000000000000000000000000000000000000815262ffffff88166004820152602401610512565b5f8b30338d8d60126b033b2e3c9fd0803ce8000000604051611ab190612d5a565b611ac096959493929190613759565b8190604051809103905ff5905080158015611add573d5f5f3e3d5ffd5b506001600160a01b038181165f908152600a60205260409020600881018054337fffffffffffffffffffffffff0000000000000000000000000000000000000000918216179091558f825560098201805490911692881692909217909155909350839150611b4e63ffffffff421690565b60018201805462ffffff8d81167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000063ffffffff9586166c01000000000000000000000000029081167fffffffffffffffffffffffffffffffff00000000ffffffffffffffffff000000851617821785555f548f84166601000000000000027fffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff6301000000760100000000000000000000000000000000000000000000909304909516919091027fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000009092167fffffffffffffffffffffffffffffffff00000000ffffffffffff000000000000909516949094179091171716179055421663ffffffff168863ffffffff1611611c88574263ffffffff16611c8a565b875b60018201805463ffffffff92909216700100000000000000000000000000000000027fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff9092169190911790556001600160a01b03851615611d0e575f54790100000000000000000000000000000000000000000000000000900462ffffff16611d10565b5f5b60018201805462ffffff929092166901000000000000000000027fffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff9092169190911790556b033b2e3c9fd0803ce8000000600582015560068054600a830180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039283161790559054604080517fc45a01550000000000000000000000000000000000000000000000000000000081529051919092169163c45a01559160048083019260209291908290030181865afa158015611df8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e1c91906137b4565b6007546040517fc9c653960000000000000000000000000000000000000000000000000000000081526001600160a01b038781166004830152918216602482015291169063c9c65396906044016020604051808303815f875af1158015611e85573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ea991906137b4565b600b820180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055600154611f0e906b033b2e3c9fd0803ce8000000906301000000900462ffffff16620186a091020490565b6003820180546dffffffffffffffffffffffffffff9283166e0100000000000000000000000000009081027fffffffff0000000000000000000000000000ffffffffffffffffffffffffffff9283161790925560018054600280870180546601000000000000909304871690950293821684178555547fffffffffffffffffffffffffffffffffffff00000000000000000000000000009093167fffffffff000000000000000000000000000000000000000000000000000000009091161791909316179055600c808301805489151574010000000000000000000000000000000000000000027fffffffffffffffffffffff0000000000000000000000000000000000000000009091166001600160a01b03808d1691909117919091179091556008805493840181557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee390930180548883167fffffffffffffffffffffffff00000000000000000000000000000000000000009182168117909255600b86015483165f908152600d60209081526040808320805490941690941790925594860154909216845291905290205460ff166121075760088101546001600160a01b03165f908152600c6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555b600354156121d95760035460068201556005546001600160a01b0316156121d15760055460068201546040515f926001600160a01b031691908381818185875af1925050503d805f8114612176576040519150601f19603f3d011682016040523d82523d5f602084013e61217b565b606091505b50509050806121cf5760055460068301546040517f1c196f330000000000000000000000000000000000000000000000000000000081526001600160a01b0390921660048301526024820152604401610512565b505b600354830392505b600a810154600b82015460018301546040517fae0ffca80000000000000000000000000000000000000000000000000000000081526001600160a01b038881169463ae0ffca894612268949183169392169162ffffff80831692660100000000000081049091169170010000000000000000000000000000000090910463ffffffff16906009906004016137cf565b5f604051808303815f87803b15801561227f575f5ffd5b505af1158015612291573d5f5f3e3d5ffd5b50505050600b81015460038201546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0392831660048201526e0100000000000000000000000000009091046dffffffffffffffffffffffffffff1660248201529085169063a9059cbb906044016020604051808303815f875af1158015612326573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061234a9190613711565b5060088101546040518e81526001600160a01b03918216918616907f9dfc95063374964ce3f014389cd49bd798a472043b03e52ab9942539221868bb9060200160405180910390a380600b015f9054906101000a90046001600160a01b03166001600160a01b0316635d5a1e43826008015f9054906101000a90046001600160a01b03165f60169054906101000a900462ffffff168c8560010160099054906101000a900462ffffff168660010160109054906101000a900463ffffffff1687600301600e9054906101000a90046dffffffffffffffffffffffffffff16600160069054906101000a90046dffffffffffffffffffffffffffff1660025f9054906101000a90046dffffffffffffffffffffffffffff1660075f9054906101000a90046001600160a01b03168b6009015f9054906101000a90046001600160a01b03168c600c0160149054906101000a900460ff166040518c63ffffffff1660e01b815260040161253e9b9a999897969594939291906001600160a01b039b8c16815262ffffff9a8b166020820152988a1660408a015296909816606088015263ffffffff9490941660808701526dffffffffffffffffffffffffffff92831660a087015290821660c08601521660e084015284166101008301529190921661012083015215156101408201526101600190565b5f604051808303815f87803b158015612555575f5ffd5b505af1158015612567573d5f5f3e3d5ffd5b505050505f831115612684576040805160028082526060820183525f92602083019080368337505060075482519293506001600160a01b0316918391505f906125b2576125b261372c565b60200260200101906001600160a01b031690816001600160a01b03168152505084816001815181106125e6576125e661372c565b6001600160a01b039283166020918202929092010152600a83015460088401546040517fb6f9de950000000000000000000000000000000000000000000000000000000081529183169263b6f9de95928892612654925f9288929091169063ffffffff421690600401613866565b5f604051808303818588803b15801561266b575f5ffd5b505af115801561267d573d5f5f3e3d5ffd5b5050505050505b5050509998505050505050505050565b5f546001600160a01b031633146126c05760405163a11a9a4160e01b8152336004820152602401610512565b6126c95f612cf3565b565b5f547501000000000000000000000000000000000000000000900460ff16156126f2575f5ffd5b5f80547fff000000000000000000ffffffffffffffffffffffffffffffffffffffffffff167d1388004e200003e800000000000000000000000000000000000000000000179055600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166d0b1a2bc2ec5000000186a000c350179055600280546734bc4fdde27c00007fffffffffffffffffffffffffffffffffffff00000000000000000000000000009091161790556127ae33612cf3565b5f80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055565b335f908152600d60205260409020546001600160a01b03166128265760405163a11a9a4160e01b8152336004820152602401610512565b335f908152600d60205260409020546005546001600160a01b0391821691161580159061285257505f84115b156128f9576005546040515f916001600160a01b03169086908381818185875af1925050503d805f81146128a1576040519150601f19603f3d011682016040523d82523d5f602084013e6128a6565b606091505b50509050806128f7576005546040517f1c196f330000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260248101869052604401610512565b505b896001600160a01b0316816001600160a01b03167f4d9f7f92f88822cab14479fe2c1b0d8e12a575302020d8b8577a22e466badae261293b63ffffffff421690565b6040805163ffffffff9290921682528d151560208301526dffffffffffffffffffffffffffff8d8116838301528c166060830152608082018b905260a082018a905260c0820189905260e08201889052610100820187905251908190036101200190a350505050505050505050565b5f546001600160a01b031633146129d65760405163a11a9a4160e01b8152336004820152602401610512565b600680547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038316908117909155604080517fad5c4648000000000000000000000000000000000000000000000000000000008152905163ad5c4648916004808201926020929091908290030181865afa158015612a5e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a8291906137b4565b600780547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691909117905550565b6008546060905f8484018210612ad35783612ad7565b8482035b905081811115612b13576040517f52acd57900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8167ffffffffffffffff811115612b2d57612b2d61326a565b604051908082528060200260200182016040528015612b9557816020015b604080516060810182525f80825260208083018290529282015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909201910181612b4b5790505b5090505f868301875b81811015612c36575f60088281548110612bba57612bba61372c565b5f9182526020808320909101546001600160a01b03908116808452600a8352604093849020845160608101865282815260088201549093169383019390935282549382019390935287516001880197939450919290918891908110612c2157612c2161372c565b60209081029190910101525050600101612b9e565b5091979650505050505050565b5f546001600160a01b03163314612c6f5760405163a11a9a4160e01b8152336004820152602401610512565b600580547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b5f546001600160a01b03163314612cd55760405163a11a9a4160e01b8152336004820152602401610512565b6001600160a01b038116612ce7575f5ffd5b612cf081612cf3565b50565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611fc4806138db83390190565b62ffffff81168114612cf0575f5ffd5b8035612d8281612d67565b919050565b5f5f5f5f5f60a08688031215612d9b575f5ffd5b853594506020860135612dad81612d67565b93506040860135612dbd81612d67565b92506060860135612dcd81612d67565b91506080860135612ddd81612d67565b809150509295509295909350565b6001600160a01b0381168114612cf0575f5ffd5b8035612d8281612deb565b5f60208284031215612e1a575f5ffd5b8135612e2581612deb565b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f82516103806020840152612e776103a0840182612e2c565b90506020840151601f19848303016040850152612e948282612e2c565b9150506040840151612eab606085018260ff169052565b50606084015162ffffff8116608085015250608084015162ffffff811660a08501525060a084015162ffffff811660c08501525060c084015162ffffff811660e08501525060e084015162ffffff81166101008501525061010084015163ffffffff81166101208501525061012084015163ffffffff81166101408501525061014084015163ffffffff8116610160850152506101608401516dffffffffffffffffffffffffffff8116610180850152506101808401516dffffffffffffffffffffffffffff81166101a0850152506101a08401516dffffffffffffffffffffffffffff81166101c0850152506101c08401516dffffffffffffffffffffffffffff81166101e0850152506101e08401516dffffffffffffffffffffffffffff8116610200850152506102008401516dffffffffffffffffffffffffffff8116610220850152506102208401516102408401526102408401516102608401526102608401516102808401526102808401516102a08401526102a08401516102c08401526102c084015161304a6102e08501826001600160a01b03169052565b506102e08401516001600160a01b038116610300850152506103008401516001600160a01b038116610320850152506103208401516001600160a01b038116610340850152506103408401516001600160a01b03811661036085015250610360840151801515610380850152509392505050565b8015158114612cf0575f5ffd5b8035612d82816130be565b5f602082840312156130e6575f5ffd5b8135612e25816130be565b5f60208284031215613101575f5ffd5b8135612e2581612d67565b5f6020828403121561311c575f5ffd5b5035919050565b80356dffffffffffffffffffffffffffff81168114612d82575f5ffd5b5f5f60408385031215613151575f5ffd5b61315a83613123565b915061316860208401613123565b90509250929050565b5f5f5f60608486031215613183575f5ffd5b833561318e81612deb565b9250602084013561319e81612deb565b929592945050506040919091013590565b5f5f604083850312156131c0575f5ffd5b82356131cb81612deb565b946020939093013593505050565b5f5f5f5f606085870312156131ec575f5ffd5b84356131f781612deb565b93506020850135613207816130be565b9250604085013567ffffffffffffffff811115613222575f5ffd5b8501601f81018713613232575f5ffd5b803567ffffffffffffffff811115613248575f5ffd5b8760208260051b840101111561325c575f5ffd5b949793965060200194505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156132c0576132c061326a565b604052919050565b5f67ffffffffffffffff8211156132e1576132e161326a565b50601f01601f191660200190565b5f82601f8301126132fe575f5ffd5b813561331161330c826132c8565b613297565b818152846020838601011115613325575f5ffd5b816020850160208301375f918101602001919091529392505050565b803563ffffffff81168114612d82575f5ffd5b5f5f5f5f5f5f5f5f5f6101208a8c03121561336d575f5ffd5b8935985060208a013567ffffffffffffffff81111561338a575f5ffd5b6133968c828d016132ef565b98505060408a013567ffffffffffffffff8111156133b2575f5ffd5b6133be8c828d016132ef565b97505060608a01356133cf81612d67565b95506133dd60808b01612d77565b94506133eb60a08b01613341565b93506133f960c08b01612dff565b925061340760e08b016130cb565b91506134166101008b01612dff565b90509295985092959850929598565b5f5f5f5f5f5f5f5f5f6101208a8c03121561343e575f5ffd5b893561344981612deb565b985060208a0135613459816130be565b975061346760408b01613123565b965061347560608b01613123565b989b979a50959860808101359760a0820135975060c0820135965060e08201359550610100909101359350915050565b5f5f604083850312156134b6575f5ffd5b50508035926020909101359150565b602080825282518282018190525f918401906040840190835b8181101561352a5783516001600160a01b0381511684526001600160a01b03602082015116602085015260408101516040850152506060830192506020840193506001810190506134de565b509095945050505050565b81516001600160a01b031681526101808101602083015161355b602084018260ff169052565b506040830151613570604084018260ff169052565b506060830151613587606084018262ffffff169052565b50608083015161359e608084018262ffffff169052565b5060a08301516135b560a084018262ffffff169052565b5060c08301516135cc60c084018262ffffff169052565b5060e08301516135e360e084018262ffffff169052565b506101008301516136076101008401826dffffffffffffffffffffffffffff169052565b5061012083015161362b6101208401826dffffffffffffffffffffffffffff169052565b5061014083015161014083015261016083015161016083015292915050565b5f6020828403121561365a575f5ffd5b815167ffffffffffffffff811115613670575f5ffd5b8201601f81018413613680575f5ffd5b805161368e61330c826132c8565b8181528560208385010111156136a2575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b5f602082840312156136cf575f5ffd5b815160ff81168114612e25575f5ffd5b5f602082840312156136ef575f5ffd5b8151612e2581612d67565b5f6020828403121561370a575f5ffd5b5051919050565b5f60208284031215613721575f5ffd5b8151612e25816130be565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b6001600160a01b03871681526001600160a01b038616602082015260c060408201525f61378960c0830187612e2c565b828103606084015261379b8187612e2c565b60ff959095166080840152505060a00152949350505050565b5f602082840312156137c4575f5ffd5b8151612e2581612deb565b5f60c082016001600160a01b03891683526001600160a01b038816602084015262ffffff8716604084015262ffffff8616606084015263ffffffff8516608084015260c060a084015280845480835260e085019150855f5260205f2092505f5b818110156138565783546001600160a01b031683526001938401936020909301920161382f565b50909a9950505050505050505050565b5f608082018683526080602084015280865180835260a0850191506020880192505f5b818110156138b05783516001600160a01b0316835260209384019390920191600101613889565b50506001600160a01b03959095166040840152505063ffffffff919091166060909101529291505056fe60e0604052604051611fc4380380611fc48339810160408190526100229161034e565b83838360026100318482610479565b50600361003e8382610479565b5060ff81166080526040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f9061007790600290610533565b60408051918290038220828201825260018352603160f81b6020938401528151928301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160408051808303601f19018152919052805160209091012060a0525050506001600160a01b0385811660c052600980546001600160a01b0319169188169190911790556101268682610131565b5050505050506105a4565b6001600160a01b038216158061015157506001600160a01b03821661dead145b1561017e5760405163ec442f0560e01b81526001600160a01b038316600482015260240160405180910390fd5b6001600160a01b0382165f9081526006602052604081205490036101b6575f805462ffffff8082166001011662ffffff199091161790555b60018054820190556001600160a01b0382165f908152600660209081526040808320805485019055600890915290205460ff16610252576001600160a01b0382165f818152600860205260408120805460ff191660019081179091556004805491820181559091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b03191690911790555b6040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b80516001600160a01b03811681146102ac575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126102d4575f5ffd5b81516001600160401b038111156102ed576102ed6102b1565b604051601f8201601f19908116603f011681016001600160401b038111828210171561031b5761031b6102b1565b604052818152838201602001851015610332575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f5f5f5f5f5f60c08789031215610363575f5ffd5b61036c87610296565b955061037a60208801610296565b60408801519095506001600160401b03811115610395575f5ffd5b6103a189828a016102c5565b606089015190955090506001600160401b038111156103be575f5ffd5b6103ca89828a016102c5565b935050608087015160ff811681146103e0575f5ffd5b8092505060a087015190509295509295509295565b600181811c9082168061040957607f821691505b60208210810361042757634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561047457805f5260205f20601f840160051c810160208510156104525750805b601f840160051c820191505b81811015610471575f815560010161045e565b50505b505050565b81516001600160401b03811115610492576104926102b1565b6104a6816104a084546103f5565b8461042d565b6020601f8211600181146104d8575f83156104c15750848201515b5f19600385901b1c1916600184901b178455610471565b5f84815260208120601f198516915b8281101561050757878501518255602094850194600190920191016104e7565b508482101561052457868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f5f8354610540816103f5565b600182168015610557576001811461056c57610599565b60ff1983168652811515820286019350610599565b865f5260205f205f5b8381101561059157815488820152600190910190602001610575565b505081860193505b509195945050505050565b60805160a05160c0516119ef6105d55f395f6101cd01525f818161029801526111c201525f61026901526119ef5ff3fe608060405234801561000f575f5ffd5b5060043610610184575f3560e01c806370a08231116100dd578063a9059cbb11610088578063d180667d11610063578063d180667d1461040e578063d505accf14610416578063dd62ed3e14610429575f5ffd5b8063a9059cbb146103c6578063ae0ffca8146103d9578063aed6176e146103ee575f5ffd5b80638da5cb5b116100b85780638da5cb5b1461038357806395d89b411461039457806399c8d5561461039c575f5ffd5b806370a082311461030c57806373ad468a146103345780637ecebe001461035b575f5ffd5b806323b872dd1161013d57806342966c681161011857806342966c68146102ba5780634c346e72146102cd57806353d74fdf146102f0575f5ffd5b806323b872dd1461024f578063313ce567146102625780633644e51514610293575f5ffd5b806306fdde031161016d57806306fdde0314610205578063095ea7b31461021a57806318160ddd1461023d575f5ffd5b806301339c211461018857806302d05d3f146101cb575b5f5ffd5b600b547c0100000000000000000000000000000000000000000000000000000000900463ffffffff1660405163ffffffff90911681526020015b60405180910390f35b7f00000000000000000000000000000000000000000000000000000000000000005b6040516001600160a01b0390911681526020016101c2565b61020d610461565b6040516101c2919061161a565b61022d610228366004611688565b6104f1565b60405190151581526020016101c2565b6001545b6040519081526020016101c2565b61022d61025d3660046116b0565b610574565b60405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020016101c2565b6102417f000000000000000000000000000000000000000000000000000000000000000081565b61022d6102c83660046116ea565b610635565b600b5474010000000000000000000000000000000000000000900460ff1661022d565b5f5462ffffff165b60405162ffffff90911681526020016101c2565b61024161031a366004611701565b6001600160a01b03165f9081526006602052604090205490565b600b54760100000000000000000000000000000000000000000000900462ffffff166102f8565b610241610369366004611701565b6001600160a01b03165f9081526005602052604090205490565b6009546001600160a01b03166101ed565b61020d61064b565b600b54790100000000000000000000000000000000000000000000000000900462ffffff166102f8565b61022d6103d4366004611688565b61065a565b6103ec6103e736600461172c565b61066f565b005b6104016103fc3660046117f9565b6108e7565b6040516101c29190611819565b6103ec610a87565b6103ec610424366004611870565b610c47565b6102416104373660046118dd565b6001600160a01b039182165f90815260076020908152604080832093909416825291909152205490565b6060600280546104709061190e565b80601f016020809104026020016040519081016040528092919081815260200182805461049c9061190e565b80156104e75780601f106104be576101008083540402835291602001916104e7565b820191905f5260205f20905b8154815290600101906020018083116104ca57829003601f168201915b5050505050905090565b600b545f9074010000000000000000000000000000000000000000900460ff1615801561052c5750600a546001600160a01b03848116911614155b15610563576040517f86b1a17f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61056d8383610ccf565b9392505050565b600b545f9074010000000000000000000000000000000000000000900460ff161580156105ab5750600a546001600160a01b031633145b80156105c45750600b546001600160a01b038481169116145b80156105f857506001600160a01b038085165f908152600760209081526040808320600a54909416835292905220545f1914155b1561061757600a546106179085906001600160a01b03165f195f610cd9565b610622848484610df0565b61062d84848461100d565b949350505050565b5f6106433361dead846110b9565b506001919050565b6060600380546104709061190e565b5f6106663384846110b9565b50600192915050565b6009546001600160a01b031633146106ba576040517fa11a9a410000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b600b547501000000000000000000000000000000000000000000900460ff1615610710576040517f66a02dea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f5b81811015610794576001600c5f8686858181106107325761073261195f565b90506020020160208101906107479190611701565b6001600160a01b0316815260208101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055600101610713565b5050600a80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039889161790555050600b80547501000000000000000000000000000000000000000000959096167fffffffffffffff000000ffff00000000000000000000000000000000000000009096169590951776010000000000000000000000000000000000000000000062ffffff948516021778ffffffffffffffffffffffffffffffffffffffffffffffffff1679010000000000000000000000000000000000000000000000000092909316919091027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16919091177c010000000000000000000000000000000000000000000000000000000063ffffffff9290921691909102177fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16179055565b5f5460609062ffffff168310610929576040517f52acd57900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5462ffffff168383011115610946575f5462ffffff1683900391505b5f8267ffffffffffffffff8111156109605761096061198c565b6040519080825280602002602001820160405280156109a457816020015b604080518082019091525f808252602082015281526020019060019003908161097e5790505b5090505f845b84821015610a7d575f600482815481106109c6576109c661195f565b5f918252602090912001546001600160a01b0316905061dead811480610a0157506001600160a01b0381165f90815260066020526040902054155b15610a0c5750610a75565b80848481518110610a1f57610a1f61195f565b6020908102919091018101516001600160a01b0392831690529082165f908152600690915260409020548451859085908110610a5d57610a5d61195f565b60200260200101516020018181525050826001019250505b6001016109aa565b5090949350505050565b6009546001600160a01b03163314610acd576040517fa11a9a410000000000000000000000000000000000000000000000000000000081523360048201526024016106b1565b600b5474010000000000000000000000000000000000000000900460ff1615610b24576040517fa11a9a410000000000000000000000000000000000000000000000000000000081523360048201526024016106b1565b600b54620186a076010000000000000000000000000000000000000000000090910462ffffff161015610b9557600b80547fffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff16780186a0000000000000000000000000000000000000000000001790555b60098054600b80547fffffffffffffffffffffffff0000000000000000000000000000000000000000808416909455600a80549094169093557fffffffff000000ffffffff00000000000000000000000000000000000000000090921674010000000000000000000000000000000000000000179091556040516001600160a01b03909116905f9082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a350565b600b5474010000000000000000000000000000000000000000900460ff16158015610c805750600a546001600160a01b03878116911614155b15610cb7576040517f86b1a17f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cc6878787878787876110d4565b50505050505050565b5f61066633848460015b6001600160a01b038416610d24576040517fe602df050000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016106b1565b6001600160a01b038316610d6f576040517f94280d620000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024016106b1565b6001600160a01b038085165f9081526007602090815260408083209387168352929052208290558015610dea57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610de191815260200190565b60405180910390a35b50505050565b600b5474010000000000000000000000000000000000000000900460ff1680610eca57506009546001600160a01b038481169116148015610e3e5750600b546001600160a01b038381169116145b80610eca5750600b5474010000000000000000000000000000000000000000900460ff16158015610e7c57506009546001600160a01b038381169116145b80610e85575080155b80610e9a57506001600160a01b03821661dead145b80610eb25750600a546001600160a01b038381169116145b80610eca5750600b546001600160a01b038381169116145b15610ed457505050565b600b5474010000000000000000000000000000000000000000900460ff16610fdb576001600160a01b0382165f908152600c602052604090205460ff1615610f53576040517f342be1ce0000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016106b1565b600b54760100000000000000000000000000000000000000000000900462ffffff16620186a01480610fd15750600154600b54610fb49190760100000000000000000000000000000000000000000000900462ffffff16620186a091020490565b6001600160a01b0383165f90815260066020526040902054820111155b15610fdb57505050565b6040517f9bd6a5a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f81156110a4576001600160a01b0384165f908152600760209081526040808320338085529252909120548381101561108b576040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526001600160a01b038616600482015260248101829052604481018590526064016106b1565b5f1981146110a1576110a186838684035f610cd9565b50505b6110af8484846110b9565b5060019392505050565b6110c4838383610df0565b6110cf8383836112e4565b505050565b83421115611111576040517f62791302000000000000000000000000000000000000000000000000000000008152600481018590526024016106b1565b6001600160a01b038781165f8181526005602090815260408083208054600180820190925582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98186015280840196909652958c166060860152608085018b905260a085019590955260c08085018a90528151808603909101815260e0850190915280519101207f19010000000000000000000000000000000000000000000000000000000000006101008401527f0000000000000000000000000000000000000000000000000000000000000000610102840152610122830152919061014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa15801561126c573d5f5f3e3d5ffd5b505050602060405103519050876001600160a01b0316816001600160a01b0316146112d6576040517f4b800e460000000000000000000000000000000000000000000000000000000081526001600160a01b038083166004830152891660248201526044016106b1565b50610cc68787876001610cd9565b6001600160a01b03831661132f576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024016106b1565b6001600160a01b038216158061134d57506001600160a01b03821630145b1561138f576040517fec442f050000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016106b1565b6001600160a01b0383165f90815260066020526040902054811115611409576001600160a01b0383165f81815260066020526040908190205490517fe450d38c00000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016106b1565b80156115c8576001600160a01b0383165f908152600660205260408120805483900390819055900361146c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000811662ffffff9182165f19019091161790555b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff21536001600160a01b038316016114aa576001805482900390556115c8565b6001600160a01b0382165f9081526006602052604081205490036114fe575f805462ffffff808216600101167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000009091161790555b6001600160a01b0382165f908152600660209081526040808320805485019055600890915290205460ff166115c8576001600160a01b0382165f81815260086020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091556004805491820181559091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690911790555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161160d91815260200190565b60405180910390a3505050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b80356001600160a01b0381168114611683575f5ffd5b919050565b5f5f60408385031215611699575f5ffd5b6116a28361166d565b946020939093013593505050565b5f5f5f606084860312156116c2575f5ffd5b6116cb8461166d565b92506116d96020850161166d565b929592945050506040919091013590565b5f602082840312156116fa575f5ffd5b5035919050565b5f60208284031215611711575f5ffd5b61056d8261166d565b803562ffffff81168114611683575f5ffd5b5f5f5f5f5f5f5f60c0888a031215611742575f5ffd5b61174b8861166d565b96506117596020890161166d565b95506117676040890161171a565b94506117756060890161171a565b9350608088013563ffffffff8116811461178d575f5ffd5b925060a088013567ffffffffffffffff8111156117a8575f5ffd5b8801601f81018a136117b8575f5ffd5b803567ffffffffffffffff8111156117ce575f5ffd5b8a60208260051b84010111156117e2575f5ffd5b602082019350809250505092959891949750929550565b5f5f6040838503121561180a575f5ffd5b50508035926020909101359150565b602080825282518282018190525f918401906040840190835b8181101561186557835180516001600160a01b031684526020908101518185015290930192604090920191600101611832565b509095945050505050565b5f5f5f5f5f5f5f60e0888a031215611886575f5ffd5b61188f8861166d565b965061189d6020890161166d565b95506040880135945060608801359350608088013560ff811681146118c0575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f604083850312156118ee575f5ffd5b6118f78361166d565b91506119056020840161166d565b90509250929050565b600181811c9082168061192257607f821691505b602082108103611959577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffdfea2646970667358221220688214a33c697126760eeed157514a03e7bf0b8444ccad98749000ac1be5d87764736f6c634300081c0033a2646970667358221220b75506246bc522b2e5bada14645c853931b1b21ab0a3d6aa766a27c047ed9dc464736f6c634300081c0033
Deployed Bytecode
0x60806040526004361061015a575f3560e01c80635beb0823116100bb578063af0d4f9511610071578063ef8a923511610057578063ef8a923514610380578063f0f44260146104ac578063f2fde38b146104cb575f5ffd5b8063af0d4f9514610335578063e30e5ae914610354575f5ffd5b80638129fc1c116100a15780638129fc1c146102e65780638da5cb5b146102fa578063a73cc35c14610316575f5ffd5b80635beb0823146102a7578063715018a6146102d2575f5ffd5b806337b3375f1161011057806344004cc1116100f657806344004cc11461024a5780634782f7791461026957806359d3515214610288575f5ffd5b806337b3375f14610218578063402c10391461022b575f5ffd5b806314fc28121161014057806314fc2812146101bb57806316c38b3c146101da5780631ca9ff1d146101f9575f5ffd5b806303a996c41461016557806313ff7e9f14610186575f5ffd5b3661016157005b5f5ffd5b348015610170575f5ffd5b5061018461017f366004612d87565b6104ea565b005b348015610191575f5ffd5b506101a56101a0366004612e0a565b610675565b6040516101b29190612e5a565b60405180910390f35b3480156101c6575f5ffd5b506101846101d5366004612e0a565b610d2d565b3480156101e5575f5ffd5b506101846101f43660046130d6565b610d93565b348015610204575f5ffd5b506101846102133660046130f1565b610de9565b61018461022636600461310c565b610e79565b348015610236575f5ffd5b50610184610245366004613140565b61140a565b348015610255575f5ffd5b50610184610264366004613171565b6114a9565b348015610274575f5ffd5b506101846102833660046131af565b6115c4565b348015610293575f5ffd5b506101846102a23660046131d9565b6116df565b6102ba6102b5366004613354565b611879565b6040516001600160a01b0390911681526020016101b2565b3480156102dd575f5ffd5b50610184612694565b3480156102f1575f5ffd5b506101846126cb565b348015610305575f5ffd5b505f546001600160a01b03166102ba565b348015610321575f5ffd5b50610184610330366004613425565b6127ef565b348015610340575f5ffd5b5061018461034f366004612e0a565b6129aa565b34801561035f575f5ffd5b5061037361036e3660046134a5565b612abd565b6040516101b291906134c5565b34801561038b575f5ffd5b5060408051610180810182525f5460ff74010000000000000000000000000000000000000000820416602083015260128284015262ffffff7601000000000000000000000000000000000000000000008204811660608401527901000000000000000000000000000000000000000000000000008204811660808401527c0100000000000000000000000000000000000000000000000000000000909104811660a083015260015480821660c08401526301000000810490911660e08301526dffffffffffffffffffffffffffff66010000000000009091048116610100830152600254166101208201526003546101408201526b033b2e3c9fd0803ce80000006101608201526006546001600160a01b0316815290516101b29190613535565b3480156104b7575f5ffd5b506101846104c6366004612e0a565b612c43565b3480156104d6575f5ffd5b506101846104e5366004612e0a565b612ca9565b5f546001600160a01b0316331461051b5760405163a11a9a4160e01b81523360048201526024015b60405180910390fd5b6113888462ffffff16111561052e575f5ffd5b61c3508362ffffff161115610541575f5ffd5b6161a88262ffffff161115610554575f5ffd5b620186a08162ffffff161115610568575f5ffd5b6003949094555f80547fffffffff000000000000ffffffffffffffffffffffffffffffffffffffffffff1676010000000000000000000000000000000000000000000062ffffff958616027fffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffffff161779010000000000000000000000000000000000000000000000000093851693909302929092177fff000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff167c010000000000000000000000000000000000000000000000000000000091841691909102179055600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000001691909216179055565b60408051610380810182526060808252602082018190525f92820183905281018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e08101829052610200810182905261022081018290526102408101829052610260810182905261028081018290526102a081018290526102c081018290526102e081018290526103008101829052610320810182905261034081018290526103608101919091526001600160a01b038083165f908152600a60205260409020600801548391166107b5576040517f8b67f6990000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610512565b6001600160a01b0383165f818152600a602052604080822081517f06fdde0300000000000000000000000000000000000000000000000000000000815291519093926306fdde0392600480820193918290030181865afa15801561081b573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610842919081019061364a565b835f0181905250836001600160a01b03166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa158015610884573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108ab919081019061364a565b8360200181905250836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108ef573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091391906136bf565b60ff1660408085019190915260088201546001600160a01b039081166102c0860152600983015481166102e0860152600183015463ffffffff6c010000000000000000000000008204811661010088015270010000000000000000000000000000000082041661012087015262ffffff8082166060880152630100000082048116608088015266010000000000008204811660a088015269010000000000000000009091041660c086015281517f53d74fdf0000000000000000000000000000000000000000000000000000000081529151908616916353d74fdf9160048083019260209291908290030181865afa158015610a11573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a3591906136df565b62ffffff1660e0840152600a8101546001600160a01b03908116610300850152600b8201548116610320850152600c8201548116610340850152600182015474010000000000000000000000000000000000000000900463ffffffff166101408501526005820154610240850152604080517f18160ddd0000000000000000000000000000000000000000000000000000000081529051918616916318160ddd916004808201926020929091908290030181865afa158015610af9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b1d91906136fa565b61026084015260028101546dffffffffffffffffffffffffffff8082166101608601526e0100000000000000000000000000009182900481166101a0860152600383015491909104166101e0840152600681015461028084015260078101546102a0840152600c810154740100000000000000000000000000000000000000009081900460ff16151561036085015260018201540463ffffffff165f03610cff57600754600b8201546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201529116906370a0823190602401602060405180830381865afa158015610c23573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c4791906136fa565b6dffffffffffffffffffffffffffff166101c0840152600b8101546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152908516906370a0823190602401602060405180830381865afa158015610cc0573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ce491906136fa565b6dffffffffffffffffffffffffffff16610200840152610d26565b60038101546dffffffffffffffffffffffffffff1661018084015260048101546102208401525b5050919050565b5f546001600160a01b03163314610d595760405163a11a9a4160e01b8152336004820152602401610512565b600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b5f546001600160a01b03163314610dbf5760405163a11a9a4160e01b8152336004820152602401610512565b80610dca575f610dcd565b60015b5f60146101000a81548160ff021916908360ff16021790555050565b5f546001600160a01b03163314610e155760405163a11a9a4160e01b8152336004820152602401610512565b61c3508162ffffff1610158015610e345750620186a08162ffffff1611155b610e3c575f5ffd5b6001805462ffffff9092166301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffff000000ffffff909216919091179055565b335f908152600d60205260409020546001600160a01b0316610eb05760405163a11a9a4160e01b8152336004820152602401610512565b335f908152600d60205260408082205490517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b0390911691349183906370a0823190602401602060405180830381865afa158015610f1f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f4391906136fa565b6001600160a01b0384165f908152600a602052604081206001810180547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff164263ffffffff167401000000000000000000000000000000000000000002179055600481018790556003810180547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000166dffffffffffffffffffffffffffff87161790559054919250907c0100000000000000000000000000000000000000000000000000000000900462ffffff16156111dc575f5461104d9084907c0100000000000000000000000000000000000000000000000000000000900462ffffff16620186a091020490565b6007820181905560015493819003935f918291611074919062ffffff16620186a091020490565b600784015460055491935083900391506001600160a01b031615611134576005546040515f916001600160a01b03169083908381818185875af1925050503d805f81146110dc576040519150601f19603f3d011682016040523d82523d5f602084013e6110e1565b606091505b5050905080611132576005546040517f1c196f330000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260248101839052604401610512565b505b60088301546040515f916001600160a01b03169084908381818185875af1925050503d805f8114611180576040519150601f19603f3d011682016040523d82523d5f602084013e611185565b606091505b50509050806111d85760088401546040517f1c196f330000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260248101849052604401610512565b5050505b836001600160a01b031663d180667d6040518163ffffffff1660e01b81526004015f604051808303815f87803b158015611214575f5ffd5b505af1158015611226573d5f5f3e3d5ffd5b50506004546001600160a01b0316159150611372905057600480546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b03918216928101929092526024820184905285169063a9059cbb906044016020604051808303815f875af11580156112a8573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112cc9190613711565b506004546040515f916001600160a01b03169085908381818185875af1925050503d805f8114611317576040519150601f19603f3d011682016040523d82523d5f602084013e61131c565b606091505b505090508061137057600480546040517f1c196f330000000000000000000000000000000000000000000000000000000081526001600160a01b039091169181019190915260248101859052604401610512565b505b6001810154600382015460048301546007840154604080517401000000000000000000000000000000000000000090950463ffffffff1685526dffffffffffffffffffffffffffff90931660208501529183015260608201526001600160a01b038516907fd3f4053c4681784b7bc55763984309feb3fb4aec78f26052bbfc4935740987cf9060800160405180910390a25050505050565b5f546001600160a01b031633146114365760405163a11a9a4160e01b8152336004820152602401610512565b600180547fffffffffffffffffffffffff0000000000000000000000000000ffffffffffff1666010000000000006dffffffffffffffffffffffffffff94851602179055600280547fffffffffffffffffffffffffffffffffffff00000000000000000000000000001691909216179055565b5f546001600160a01b031633148015906114ce57506004546001600160a01b03163314155b156114ee5760405163a11a9a4160e01b8152336004820152602401610512565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303815f875af1158015611553573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115779190613711565b50604080516001600160a01b038581168252602082018490528416917f31e3f58fbb760a4c31ae5c6416229fca813390b5fa0de533ee4cef14b2b344db91015b60405180910390a2505050565b5f546001600160a01b031633148015906115e957506004546001600160a01b03163314155b156116095760405163a11a9a4160e01b8152336004820152602401610512565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114611652576040519150601f19603f3d011682016040523d82523d5f602084013e611657565b606091505b50509050806116a4576040517f1c196f330000000000000000000000000000000000000000000000000000000081526001600160a01b038416600482015260248101839052604401610512565b826001600160a01b03167f5817fe91d2748c33f168d8a78037fc073adaf6ec8e3613a758d44a2cfae4563d836040516115b791815260200190565b5f546001600160a01b0316331461170b5760405163a11a9a4160e01b8152336004820152602401610512565b6001600160a01b0384165f908152600b602052604090208054841515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff82168117835560ff90811691161761187257805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909116811782556009805491820181555f9081527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af90910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03881617905582905b8181101561186f57600985858381811061180b5761180b61372c565b90506020020160208101906118209190612e0a565b8154600180820184555f93845260209093200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055016117ef565b50505b5050505050565b5f805474010000000000000000000000000000000000000000900460ff166001036118d0576040517fbc2c67a600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0384165f908152600b6020526040902054610100900460ff16611931576040517f66e3bc3b0000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610512565b6001600160a01b0382161580159061197357506001600160a01b03821633148061197357506001600160a01b0382165f908152600c602052604090205460ff16155b156119aa576040517f22864a4500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035434908110156119ee576003546040517f9b9cbe1400000000000000000000000000000000000000000000000000000000815260040161051291815260200190565b60648862ffffff16108015611a0a5750620186a08862ffffff16115b15611a48576040517fd66f644100000000000000000000000000000000000000000000000000000000815262ffffff89166004820152602401610512565b6127108762ffffff161115611a90576040517f0b298c5e00000000000000000000000000000000000000000000000000000000815262ffffff88166004820152602401610512565b5f8b30338d8d60126b033b2e3c9fd0803ce8000000604051611ab190612d5a565b611ac096959493929190613759565b8190604051809103905ff5905080158015611add573d5f5f3e3d5ffd5b506001600160a01b038181165f908152600a60205260409020600881018054337fffffffffffffffffffffffff0000000000000000000000000000000000000000918216179091558f825560098201805490911692881692909217909155909350839150611b4e63ffffffff421690565b60018201805462ffffff8d81167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000063ffffffff9586166c01000000000000000000000000029081167fffffffffffffffffffffffffffffffff00000000ffffffffffffffffff000000851617821785555f548f84166601000000000000027fffffffffffffffffffffffffffffffffffffffffffffff000000ffffffffffff6301000000760100000000000000000000000000000000000000000000909304909516919091027fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000009092167fffffffffffffffffffffffffffffffff00000000ffffffffffff000000000000909516949094179091171716179055421663ffffffff168863ffffffff1611611c88574263ffffffff16611c8a565b875b60018201805463ffffffff92909216700100000000000000000000000000000000027fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff9092169190911790556001600160a01b03851615611d0e575f54790100000000000000000000000000000000000000000000000000900462ffffff16611d10565b5f5b60018201805462ffffff929092166901000000000000000000027fffffffffffffffffffffffffffffffffffffffff000000ffffffffffffffffff9092169190911790556b033b2e3c9fd0803ce8000000600582015560068054600a830180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039283161790559054604080517fc45a01550000000000000000000000000000000000000000000000000000000081529051919092169163c45a01559160048083019260209291908290030181865afa158015611df8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e1c91906137b4565b6007546040517fc9c653960000000000000000000000000000000000000000000000000000000081526001600160a01b038781166004830152918216602482015291169063c9c65396906044016020604051808303815f875af1158015611e85573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ea991906137b4565b600b820180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055600154611f0e906b033b2e3c9fd0803ce8000000906301000000900462ffffff16620186a091020490565b6003820180546dffffffffffffffffffffffffffff9283166e0100000000000000000000000000009081027fffffffff0000000000000000000000000000ffffffffffffffffffffffffffff9283161790925560018054600280870180546601000000000000909304871690950293821684178555547fffffffffffffffffffffffffffffffffffff00000000000000000000000000009093167fffffffff000000000000000000000000000000000000000000000000000000009091161791909316179055600c808301805489151574010000000000000000000000000000000000000000027fffffffffffffffffffffff0000000000000000000000000000000000000000009091166001600160a01b03808d1691909117919091179091556008805493840181557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee390930180548883167fffffffffffffffffffffffff00000000000000000000000000000000000000009182168117909255600b86015483165f908152600d60209081526040808320805490941690941790925594860154909216845291905290205460ff166121075760088101546001600160a01b03165f908152600c6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555b600354156121d95760035460068201556005546001600160a01b0316156121d15760055460068201546040515f926001600160a01b031691908381818185875af1925050503d805f8114612176576040519150601f19603f3d011682016040523d82523d5f602084013e61217b565b606091505b50509050806121cf5760055460068301546040517f1c196f330000000000000000000000000000000000000000000000000000000081526001600160a01b0390921660048301526024820152604401610512565b505b600354830392505b600a810154600b82015460018301546040517fae0ffca80000000000000000000000000000000000000000000000000000000081526001600160a01b038881169463ae0ffca894612268949183169392169162ffffff80831692660100000000000081049091169170010000000000000000000000000000000090910463ffffffff16906009906004016137cf565b5f604051808303815f87803b15801561227f575f5ffd5b505af1158015612291573d5f5f3e3d5ffd5b50505050600b81015460038201546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b0392831660048201526e0100000000000000000000000000009091046dffffffffffffffffffffffffffff1660248201529085169063a9059cbb906044016020604051808303815f875af1158015612326573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061234a9190613711565b5060088101546040518e81526001600160a01b03918216918616907f9dfc95063374964ce3f014389cd49bd798a472043b03e52ab9942539221868bb9060200160405180910390a380600b015f9054906101000a90046001600160a01b03166001600160a01b0316635d5a1e43826008015f9054906101000a90046001600160a01b03165f60169054906101000a900462ffffff168c8560010160099054906101000a900462ffffff168660010160109054906101000a900463ffffffff1687600301600e9054906101000a90046dffffffffffffffffffffffffffff16600160069054906101000a90046dffffffffffffffffffffffffffff1660025f9054906101000a90046dffffffffffffffffffffffffffff1660075f9054906101000a90046001600160a01b03168b6009015f9054906101000a90046001600160a01b03168c600c0160149054906101000a900460ff166040518c63ffffffff1660e01b815260040161253e9b9a999897969594939291906001600160a01b039b8c16815262ffffff9a8b166020820152988a1660408a015296909816606088015263ffffffff9490941660808701526dffffffffffffffffffffffffffff92831660a087015290821660c08601521660e084015284166101008301529190921661012083015215156101408201526101600190565b5f604051808303815f87803b158015612555575f5ffd5b505af1158015612567573d5f5f3e3d5ffd5b505050505f831115612684576040805160028082526060820183525f92602083019080368337505060075482519293506001600160a01b0316918391505f906125b2576125b261372c565b60200260200101906001600160a01b031690816001600160a01b03168152505084816001815181106125e6576125e661372c565b6001600160a01b039283166020918202929092010152600a83015460088401546040517fb6f9de950000000000000000000000000000000000000000000000000000000081529183169263b6f9de95928892612654925f9288929091169063ffffffff421690600401613866565b5f604051808303818588803b15801561266b575f5ffd5b505af115801561267d573d5f5f3e3d5ffd5b5050505050505b5050509998505050505050505050565b5f546001600160a01b031633146126c05760405163a11a9a4160e01b8152336004820152602401610512565b6126c95f612cf3565b565b5f547501000000000000000000000000000000000000000000900460ff16156126f2575f5ffd5b5f80547fff000000000000000000ffffffffffffffffffffffffffffffffffffffffffff167d1388004e200003e800000000000000000000000000000000000000000000179055600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166d0b1a2bc2ec5000000186a000c350179055600280546734bc4fdde27c00007fffffffffffffffffffffffffffffffffffff00000000000000000000000000009091161790556127ae33612cf3565b5f80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055565b335f908152600d60205260409020546001600160a01b03166128265760405163a11a9a4160e01b8152336004820152602401610512565b335f908152600d60205260409020546005546001600160a01b0391821691161580159061285257505f84115b156128f9576005546040515f916001600160a01b03169086908381818185875af1925050503d805f81146128a1576040519150601f19603f3d011682016040523d82523d5f602084013e6128a6565b606091505b50509050806128f7576005546040517f1c196f330000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015260248101869052604401610512565b505b896001600160a01b0316816001600160a01b03167f4d9f7f92f88822cab14479fe2c1b0d8e12a575302020d8b8577a22e466badae261293b63ffffffff421690565b6040805163ffffffff9290921682528d151560208301526dffffffffffffffffffffffffffff8d8116838301528c166060830152608082018b905260a082018a905260c0820189905260e08201889052610100820187905251908190036101200190a350505050505050505050565b5f546001600160a01b031633146129d65760405163a11a9a4160e01b8152336004820152602401610512565b600680547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038316908117909155604080517fad5c4648000000000000000000000000000000000000000000000000000000008152905163ad5c4648916004808201926020929091908290030181865afa158015612a5e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a8291906137b4565b600780547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691909117905550565b6008546060905f8484018210612ad35783612ad7565b8482035b905081811115612b13576040517f52acd57900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8167ffffffffffffffff811115612b2d57612b2d61326a565b604051908082528060200260200182016040528015612b9557816020015b604080516060810182525f80825260208083018290529282015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909201910181612b4b5790505b5090505f868301875b81811015612c36575f60088281548110612bba57612bba61372c565b5f9182526020808320909101546001600160a01b03908116808452600a8352604093849020845160608101865282815260088201549093169383019390935282549382019390935287516001880197939450919290918891908110612c2157612c2161372c565b60209081029190910101525050600101612b9e565b5091979650505050505050565b5f546001600160a01b03163314612c6f5760405163a11a9a4160e01b8152336004820152602401610512565b600580547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b5f546001600160a01b03163314612cd55760405163a11a9a4160e01b8152336004820152602401610512565b6001600160a01b038116612ce7575f5ffd5b612cf081612cf3565b50565b5f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611fc4806138db83390190565b62ffffff81168114612cf0575f5ffd5b8035612d8281612d67565b919050565b5f5f5f5f5f60a08688031215612d9b575f5ffd5b853594506020860135612dad81612d67565b93506040860135612dbd81612d67565b92506060860135612dcd81612d67565b91506080860135612ddd81612d67565b809150509295509295909350565b6001600160a01b0381168114612cf0575f5ffd5b8035612d8281612deb565b5f60208284031215612e1a575f5ffd5b8135612e2581612deb565b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f82516103806020840152612e776103a0840182612e2c565b90506020840151601f19848303016040850152612e948282612e2c565b9150506040840151612eab606085018260ff169052565b50606084015162ffffff8116608085015250608084015162ffffff811660a08501525060a084015162ffffff811660c08501525060c084015162ffffff811660e08501525060e084015162ffffff81166101008501525061010084015163ffffffff81166101208501525061012084015163ffffffff81166101408501525061014084015163ffffffff8116610160850152506101608401516dffffffffffffffffffffffffffff8116610180850152506101808401516dffffffffffffffffffffffffffff81166101a0850152506101a08401516dffffffffffffffffffffffffffff81166101c0850152506101c08401516dffffffffffffffffffffffffffff81166101e0850152506101e08401516dffffffffffffffffffffffffffff8116610200850152506102008401516dffffffffffffffffffffffffffff8116610220850152506102208401516102408401526102408401516102608401526102608401516102808401526102808401516102a08401526102a08401516102c08401526102c084015161304a6102e08501826001600160a01b03169052565b506102e08401516001600160a01b038116610300850152506103008401516001600160a01b038116610320850152506103208401516001600160a01b038116610340850152506103408401516001600160a01b03811661036085015250610360840151801515610380850152509392505050565b8015158114612cf0575f5ffd5b8035612d82816130be565b5f602082840312156130e6575f5ffd5b8135612e25816130be565b5f60208284031215613101575f5ffd5b8135612e2581612d67565b5f6020828403121561311c575f5ffd5b5035919050565b80356dffffffffffffffffffffffffffff81168114612d82575f5ffd5b5f5f60408385031215613151575f5ffd5b61315a83613123565b915061316860208401613123565b90509250929050565b5f5f5f60608486031215613183575f5ffd5b833561318e81612deb565b9250602084013561319e81612deb565b929592945050506040919091013590565b5f5f604083850312156131c0575f5ffd5b82356131cb81612deb565b946020939093013593505050565b5f5f5f5f606085870312156131ec575f5ffd5b84356131f781612deb565b93506020850135613207816130be565b9250604085013567ffffffffffffffff811115613222575f5ffd5b8501601f81018713613232575f5ffd5b803567ffffffffffffffff811115613248575f5ffd5b8760208260051b840101111561325c575f5ffd5b949793965060200194505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156132c0576132c061326a565b604052919050565b5f67ffffffffffffffff8211156132e1576132e161326a565b50601f01601f191660200190565b5f82601f8301126132fe575f5ffd5b813561331161330c826132c8565b613297565b818152846020838601011115613325575f5ffd5b816020850160208301375f918101602001919091529392505050565b803563ffffffff81168114612d82575f5ffd5b5f5f5f5f5f5f5f5f5f6101208a8c03121561336d575f5ffd5b8935985060208a013567ffffffffffffffff81111561338a575f5ffd5b6133968c828d016132ef565b98505060408a013567ffffffffffffffff8111156133b2575f5ffd5b6133be8c828d016132ef565b97505060608a01356133cf81612d67565b95506133dd60808b01612d77565b94506133eb60a08b01613341565b93506133f960c08b01612dff565b925061340760e08b016130cb565b91506134166101008b01612dff565b90509295985092959850929598565b5f5f5f5f5f5f5f5f5f6101208a8c03121561343e575f5ffd5b893561344981612deb565b985060208a0135613459816130be565b975061346760408b01613123565b965061347560608b01613123565b989b979a50959860808101359760a0820135975060c0820135965060e08201359550610100909101359350915050565b5f5f604083850312156134b6575f5ffd5b50508035926020909101359150565b602080825282518282018190525f918401906040840190835b8181101561352a5783516001600160a01b0381511684526001600160a01b03602082015116602085015260408101516040850152506060830192506020840193506001810190506134de565b509095945050505050565b81516001600160a01b031681526101808101602083015161355b602084018260ff169052565b506040830151613570604084018260ff169052565b506060830151613587606084018262ffffff169052565b50608083015161359e608084018262ffffff169052565b5060a08301516135b560a084018262ffffff169052565b5060c08301516135cc60c084018262ffffff169052565b5060e08301516135e360e084018262ffffff169052565b506101008301516136076101008401826dffffffffffffffffffffffffffff169052565b5061012083015161362b6101208401826dffffffffffffffffffffffffffff169052565b5061014083015161014083015261016083015161016083015292915050565b5f6020828403121561365a575f5ffd5b815167ffffffffffffffff811115613670575f5ffd5b8201601f81018413613680575f5ffd5b805161368e61330c826132c8565b8181528560208385010111156136a2575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b5f602082840312156136cf575f5ffd5b815160ff81168114612e25575f5ffd5b5f602082840312156136ef575f5ffd5b8151612e2581612d67565b5f6020828403121561370a575f5ffd5b5051919050565b5f60208284031215613721575f5ffd5b8151612e25816130be565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b6001600160a01b03871681526001600160a01b038616602082015260c060408201525f61378960c0830187612e2c565b828103606084015261379b8187612e2c565b60ff959095166080840152505060a00152949350505050565b5f602082840312156137c4575f5ffd5b8151612e2581612deb565b5f60c082016001600160a01b03891683526001600160a01b038816602084015262ffffff8716604084015262ffffff8616606084015263ffffffff8516608084015260c060a084015280845480835260e085019150855f5260205f2092505f5b818110156138565783546001600160a01b031683526001938401936020909301920161382f565b50909a9950505050505050505050565b5f608082018683526080602084015280865180835260a0850191506020880192505f5b818110156138b05783516001600160a01b0316835260209384019390920191600101613889565b50506001600160a01b03959095166040840152505063ffffffff919091166060909101529291505056fe60e0604052604051611fc4380380611fc48339810160408190526100229161034e565b83838360026100318482610479565b50600361003e8382610479565b5060ff81166080526040517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f9061007790600290610533565b60408051918290038220828201825260018352603160f81b6020938401528151928301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160408051808303601f19018152919052805160209091012060a0525050506001600160a01b0385811660c052600980546001600160a01b0319169188169190911790556101268682610131565b5050505050506105a4565b6001600160a01b038216158061015157506001600160a01b03821661dead145b1561017e5760405163ec442f0560e01b81526001600160a01b038316600482015260240160405180910390fd5b6001600160a01b0382165f9081526006602052604081205490036101b6575f805462ffffff8082166001011662ffffff199091161790555b60018054820190556001600160a01b0382165f908152600660209081526040808320805485019055600890915290205460ff16610252576001600160a01b0382165f818152600860205260408120805460ff191660019081179091556004805491820181559091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b03191690911790555b6040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b80516001600160a01b03811681146102ac575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126102d4575f5ffd5b81516001600160401b038111156102ed576102ed6102b1565b604051601f8201601f19908116603f011681016001600160401b038111828210171561031b5761031b6102b1565b604052818152838201602001851015610332575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f5f5f5f5f5f60c08789031215610363575f5ffd5b61036c87610296565b955061037a60208801610296565b60408801519095506001600160401b03811115610395575f5ffd5b6103a189828a016102c5565b606089015190955090506001600160401b038111156103be575f5ffd5b6103ca89828a016102c5565b935050608087015160ff811681146103e0575f5ffd5b8092505060a087015190509295509295509295565b600181811c9082168061040957607f821691505b60208210810361042757634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561047457805f5260205f20601f840160051c810160208510156104525750805b601f840160051c820191505b81811015610471575f815560010161045e565b50505b505050565b81516001600160401b03811115610492576104926102b1565b6104a6816104a084546103f5565b8461042d565b6020601f8211600181146104d8575f83156104c15750848201515b5f19600385901b1c1916600184901b178455610471565b5f84815260208120601f198516915b8281101561050757878501518255602094850194600190920191016104e7565b508482101561052457868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f5f8354610540816103f5565b600182168015610557576001811461056c57610599565b60ff1983168652811515820286019350610599565b865f5260205f205f5b8381101561059157815488820152600190910190602001610575565b505081860193505b509195945050505050565b60805160a05160c0516119ef6105d55f395f6101cd01525f818161029801526111c201525f61026901526119ef5ff3fe608060405234801561000f575f5ffd5b5060043610610184575f3560e01c806370a08231116100dd578063a9059cbb11610088578063d180667d11610063578063d180667d1461040e578063d505accf14610416578063dd62ed3e14610429575f5ffd5b8063a9059cbb146103c6578063ae0ffca8146103d9578063aed6176e146103ee575f5ffd5b80638da5cb5b116100b85780638da5cb5b1461038357806395d89b411461039457806399c8d5561461039c575f5ffd5b806370a082311461030c57806373ad468a146103345780637ecebe001461035b575f5ffd5b806323b872dd1161013d57806342966c681161011857806342966c68146102ba5780634c346e72146102cd57806353d74fdf146102f0575f5ffd5b806323b872dd1461024f578063313ce567146102625780633644e51514610293575f5ffd5b806306fdde031161016d57806306fdde0314610205578063095ea7b31461021a57806318160ddd1461023d575f5ffd5b806301339c211461018857806302d05d3f146101cb575b5f5ffd5b600b547c0100000000000000000000000000000000000000000000000000000000900463ffffffff1660405163ffffffff90911681526020015b60405180910390f35b7f00000000000000000000000000000000000000000000000000000000000000005b6040516001600160a01b0390911681526020016101c2565b61020d610461565b6040516101c2919061161a565b61022d610228366004611688565b6104f1565b60405190151581526020016101c2565b6001545b6040519081526020016101c2565b61022d61025d3660046116b0565b610574565b60405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020016101c2565b6102417f000000000000000000000000000000000000000000000000000000000000000081565b61022d6102c83660046116ea565b610635565b600b5474010000000000000000000000000000000000000000900460ff1661022d565b5f5462ffffff165b60405162ffffff90911681526020016101c2565b61024161031a366004611701565b6001600160a01b03165f9081526006602052604090205490565b600b54760100000000000000000000000000000000000000000000900462ffffff166102f8565b610241610369366004611701565b6001600160a01b03165f9081526005602052604090205490565b6009546001600160a01b03166101ed565b61020d61064b565b600b54790100000000000000000000000000000000000000000000000000900462ffffff166102f8565b61022d6103d4366004611688565b61065a565b6103ec6103e736600461172c565b61066f565b005b6104016103fc3660046117f9565b6108e7565b6040516101c29190611819565b6103ec610a87565b6103ec610424366004611870565b610c47565b6102416104373660046118dd565b6001600160a01b039182165f90815260076020908152604080832093909416825291909152205490565b6060600280546104709061190e565b80601f016020809104026020016040519081016040528092919081815260200182805461049c9061190e565b80156104e75780601f106104be576101008083540402835291602001916104e7565b820191905f5260205f20905b8154815290600101906020018083116104ca57829003601f168201915b5050505050905090565b600b545f9074010000000000000000000000000000000000000000900460ff1615801561052c5750600a546001600160a01b03848116911614155b15610563576040517f86b1a17f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61056d8383610ccf565b9392505050565b600b545f9074010000000000000000000000000000000000000000900460ff161580156105ab5750600a546001600160a01b031633145b80156105c45750600b546001600160a01b038481169116145b80156105f857506001600160a01b038085165f908152600760209081526040808320600a54909416835292905220545f1914155b1561061757600a546106179085906001600160a01b03165f195f610cd9565b610622848484610df0565b61062d84848461100d565b949350505050565b5f6106433361dead846110b9565b506001919050565b6060600380546104709061190e565b5f6106663384846110b9565b50600192915050565b6009546001600160a01b031633146106ba576040517fa11a9a410000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b600b547501000000000000000000000000000000000000000000900460ff1615610710576040517f66a02dea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f5b81811015610794576001600c5f8686858181106107325761073261195f565b90506020020160208101906107479190611701565b6001600160a01b0316815260208101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055600101610713565b5050600a80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039889161790555050600b80547501000000000000000000000000000000000000000000959096167fffffffffffffff000000ffff00000000000000000000000000000000000000009096169590951776010000000000000000000000000000000000000000000062ffffff948516021778ffffffffffffffffffffffffffffffffffffffffffffffffff1679010000000000000000000000000000000000000000000000000092909316919091027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16919091177c010000000000000000000000000000000000000000000000000000000063ffffffff9290921691909102177fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff16179055565b5f5460609062ffffff168310610929576040517f52acd57900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5462ffffff168383011115610946575f5462ffffff1683900391505b5f8267ffffffffffffffff8111156109605761096061198c565b6040519080825280602002602001820160405280156109a457816020015b604080518082019091525f808252602082015281526020019060019003908161097e5790505b5090505f845b84821015610a7d575f600482815481106109c6576109c661195f565b5f918252602090912001546001600160a01b0316905061dead811480610a0157506001600160a01b0381165f90815260066020526040902054155b15610a0c5750610a75565b80848481518110610a1f57610a1f61195f565b6020908102919091018101516001600160a01b0392831690529082165f908152600690915260409020548451859085908110610a5d57610a5d61195f565b60200260200101516020018181525050826001019250505b6001016109aa565b5090949350505050565b6009546001600160a01b03163314610acd576040517fa11a9a410000000000000000000000000000000000000000000000000000000081523360048201526024016106b1565b600b5474010000000000000000000000000000000000000000900460ff1615610b24576040517fa11a9a410000000000000000000000000000000000000000000000000000000081523360048201526024016106b1565b600b54620186a076010000000000000000000000000000000000000000000090910462ffffff161015610b9557600b80547fffffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffff16780186a0000000000000000000000000000000000000000000001790555b60098054600b80547fffffffffffffffffffffffff0000000000000000000000000000000000000000808416909455600a80549094169093557fffffffff000000ffffffff00000000000000000000000000000000000000000090921674010000000000000000000000000000000000000000179091556040516001600160a01b03909116905f9082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a350565b600b5474010000000000000000000000000000000000000000900460ff16158015610c805750600a546001600160a01b03878116911614155b15610cb7576040517f86b1a17f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cc6878787878787876110d4565b50505050505050565b5f61066633848460015b6001600160a01b038416610d24576040517fe602df050000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016106b1565b6001600160a01b038316610d6f576040517f94280d620000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024016106b1565b6001600160a01b038085165f9081526007602090815260408083209387168352929052208290558015610dea57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610de191815260200190565b60405180910390a35b50505050565b600b5474010000000000000000000000000000000000000000900460ff1680610eca57506009546001600160a01b038481169116148015610e3e5750600b546001600160a01b038381169116145b80610eca5750600b5474010000000000000000000000000000000000000000900460ff16158015610e7c57506009546001600160a01b038381169116145b80610e85575080155b80610e9a57506001600160a01b03821661dead145b80610eb25750600a546001600160a01b038381169116145b80610eca5750600b546001600160a01b038381169116145b15610ed457505050565b600b5474010000000000000000000000000000000000000000900460ff16610fdb576001600160a01b0382165f908152600c602052604090205460ff1615610f53576040517f342be1ce0000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016106b1565b600b54760100000000000000000000000000000000000000000000900462ffffff16620186a01480610fd15750600154600b54610fb49190760100000000000000000000000000000000000000000000900462ffffff16620186a091020490565b6001600160a01b0383165f90815260066020526040902054820111155b15610fdb57505050565b6040517f9bd6a5a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f81156110a4576001600160a01b0384165f908152600760209081526040808320338085529252909120548381101561108b576040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526001600160a01b038616600482015260248101829052604481018590526064016106b1565b5f1981146110a1576110a186838684035f610cd9565b50505b6110af8484846110b9565b5060019392505050565b6110c4838383610df0565b6110cf8383836112e4565b505050565b83421115611111576040517f62791302000000000000000000000000000000000000000000000000000000008152600481018590526024016106b1565b6001600160a01b038781165f8181526005602090815260408083208054600180820190925582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98186015280840196909652958c166060860152608085018b905260a085019590955260c08085018a90528151808603909101815260e0850190915280519101207f19010000000000000000000000000000000000000000000000000000000000006101008401527f0000000000000000000000000000000000000000000000000000000000000000610102840152610122830152919061014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa15801561126c573d5f5f3e3d5ffd5b505050602060405103519050876001600160a01b0316816001600160a01b0316146112d6576040517f4b800e460000000000000000000000000000000000000000000000000000000081526001600160a01b038083166004830152891660248201526044016106b1565b50610cc68787876001610cd9565b6001600160a01b03831661132f576040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024016106b1565b6001600160a01b038216158061134d57506001600160a01b03821630145b1561138f576040517fec442f050000000000000000000000000000000000000000000000000000000081526001600160a01b03831660048201526024016106b1565b6001600160a01b0383165f90815260066020526040902054811115611409576001600160a01b0383165f81815260066020526040908190205490517fe450d38c00000000000000000000000000000000000000000000000000000000815260048101929092526024820152604481018290526064016106b1565b80156115c8576001600160a01b0383165f908152600660205260408120805483900390819055900361146c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000811662ffffff9182165f19019091161790555b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff21536001600160a01b038316016114aa576001805482900390556115c8565b6001600160a01b0382165f9081526006602052604081205490036114fe575f805462ffffff808216600101167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000009091161790555b6001600160a01b0382165f908152600660209081526040808320805485019055600890915290205460ff166115c8576001600160a01b0382165f81815260086020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091556004805491820181559091527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690911790555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161160d91815260200190565b60405180910390a3505050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b80356001600160a01b0381168114611683575f5ffd5b919050565b5f5f60408385031215611699575f5ffd5b6116a28361166d565b946020939093013593505050565b5f5f5f606084860312156116c2575f5ffd5b6116cb8461166d565b92506116d96020850161166d565b929592945050506040919091013590565b5f602082840312156116fa575f5ffd5b5035919050565b5f60208284031215611711575f5ffd5b61056d8261166d565b803562ffffff81168114611683575f5ffd5b5f5f5f5f5f5f5f60c0888a031215611742575f5ffd5b61174b8861166d565b96506117596020890161166d565b95506117676040890161171a565b94506117756060890161171a565b9350608088013563ffffffff8116811461178d575f5ffd5b925060a088013567ffffffffffffffff8111156117a8575f5ffd5b8801601f81018a136117b8575f5ffd5b803567ffffffffffffffff8111156117ce575f5ffd5b8a60208260051b84010111156117e2575f5ffd5b602082019350809250505092959891949750929550565b5f5f6040838503121561180a575f5ffd5b50508035926020909101359150565b602080825282518282018190525f918401906040840190835b8181101561186557835180516001600160a01b031684526020908101518185015290930192604090920191600101611832565b509095945050505050565b5f5f5f5f5f5f5f60e0888a031215611886575f5ffd5b61188f8861166d565b965061189d6020890161166d565b95506040880135945060608801359350608088013560ff811681146118c0575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f604083850312156118ee575f5ffd5b6118f78361166d565b91506119056020840161166d565b90509250929050565b600181811c9082168061192257607f821691505b602082108103611959577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffdfea2646970667358221220688214a33c697126760eeed157514a03e7bf0b8444ccad98749000ac1be5d87764736f6c634300081c0033a2646970667358221220b75506246bc522b2e5bada14645c853931b1b21ab0a3d6aa766a27c047ed9dc464736f6c634300081c0033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.