Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 3 internal transactions
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|---|
0x60806040 | 18100533 | 642 days ago | Contract Creation | 0 ETH | |||
0x60806040 | 18100531 | 642 days ago | Contract Creation | 0 ETH | |||
0x60806040 | 18100314 | 642 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
Factory
Compiler Version
v0.8.5+commit.a4f2e591
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-09-01 */ /** *Submitted for verification at Arbiscan.io on 2023-08-01 */ /** *Submitted for verification at BscScan.com on 2023-03-22 */ // File: contracts/interfaces/IFactory.sol // SPDX-License-Identifier: MIT pragma solidity >=0.5.0; interface IFactory { struct AllInfo { uint[30] POSSIBLE_PROTOCOL_PERCENT; uint MAX_TOTAL_FEE_PERCENT; uint MAX_PROTOCOL_FEE_PERCENT; uint totalSwaps; uint protocolFee; uint totalFee; uint OnoutFeePercent; address feeTo; address feeToSetter; address OnoutFeeTo; address OnoutFeeSetter; bool allFeeToProtocol; bytes32 INIT_CODE_PAIR_HASH; } event PairCreated(address indexed token0, address indexed token1, address pair, uint); function MAX_TOTAL_FEE_PERCENT() external view returns(uint); function MAX_PROTOCOL_FEE_PERCENT() external view returns(uint); function totalSwaps() external view returns(uint); function protocolFee() external view returns(uint); function totalFee() external view returns(uint); function OnoutFeePercent() external view returns(uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function OnoutFeeTo() external view returns(address); function OnoutFeeSetter() external view returns(address); function allFeeToProtocol() external view returns(bool); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function allInfo() external view returns (AllInfo memory); function createPair(address tokenA, address tokenB) external returns (address pair); function setOnoutFeePercent(uint) external; function setFeeTo(address) external; function setFeeToSetter(address) external; function setOnoutFeeTo(address) external; function setOnoutFeeSetter(address) external; function setAllFeeToProtocol(bool) external; function setMainFees(uint _totalFee, uint _protocolFee) external; function setTotalFee(uint) external; function setProtocolFee(uint) external; function increaseNumberOfSwaps(address token0, address token1) external; } // File: contracts/interfaces/IUniswapV2Pair.sol pragma solidity >=0.5.0; interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } // File: contracts/interfaces/IUniswapV2ERC20.sol pragma solidity >=0.5.0; interface IUniswapV2ERC20 { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; } // File: contracts/libraries/SafeMath.sol pragma solidity ^0.8.0; // a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math) library SafeMath { function add(uint x, uint y) internal pure returns (uint z) { require((z = x + y) >= x, 'ds-math-add-overflow'); } function sub(uint x, uint y) internal pure returns (uint z) { require((z = x - y) <= x, 'ds-math-sub-underflow'); } function mul(uint x, uint y) internal pure returns (uint z) { require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow'); } } // File: contracts/ERC20.sol pragma solidity ^0.8.0; contract ERC20 is IUniswapV2ERC20 { using SafeMath for uint; string public override constant name = 'Liquidity-Pool-Token'; string public override constant symbol = 'LP-TOKEN'; uint8 public override constant decimals = 18; uint public override totalSupply; mapping(address => uint) public override balanceOf; mapping(address => mapping(address => uint)) public override allowance; bytes32 public override DOMAIN_SEPARATOR; // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); bytes32 public override constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; mapping(address => uint) public override nonces; constructor() { uint chainId; assembly { chainId := chainid() } DOMAIN_SEPARATOR = keccak256( abi.encode( keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'), keccak256(bytes(name)), keccak256(bytes('1')), chainId, address(this) ) ); } function _mint(address to, uint value) internal { totalSupply = totalSupply.add(value); balanceOf[to] = balanceOf[to].add(value); emit Transfer(address(0), to, value); } function _burn(address from, uint value) internal { balanceOf[from] = balanceOf[from].sub(value); totalSupply = totalSupply.sub(value); emit Transfer(from, address(0), value); } function _approve(address owner, address spender, uint value) private { allowance[owner][spender] = value; emit Approval(owner, spender, value); } function _transfer(address from, address to, uint value) private { balanceOf[from] = balanceOf[from].sub(value); balanceOf[to] = balanceOf[to].add(value); emit Transfer(from, to, value); } function approve(address spender, uint value) external override returns (bool) { _approve(msg.sender, spender, value); return true; } function transfer(address to, uint value) external override returns (bool) { _transfer(msg.sender, to, value); return true; } function transferFrom(address from, address to, uint value) external override returns (bool) { if (allowance[from][msg.sender] != type(uint).max) { allowance[from][msg.sender] = allowance[from][msg.sender].sub(value); } _transfer(from, to, value); return true; } function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external override { require(deadline >= block.timestamp, 'ERC20: EXPIRED'); bytes32 digest = keccak256( abi.encodePacked( '\x19\x01', DOMAIN_SEPARATOR, keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline)) ) ); address recoveredAddress = ecrecover(digest, v, r, s); require(recoveredAddress != address(0) && recoveredAddress == owner, 'ERC20: INVALID_SIGNATURE'); _approve(owner, spender, value); } } // File: contracts/libraries/Math.sol pragma solidity ^0.8.0; // a library for performing various math operations library Math { function min(uint x, uint y) internal pure returns (uint z) { z = x < y ? x : y; } // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method) function sqrt(uint y) internal pure returns (uint z) { if (y > 3) { z = y; uint x = y / 2 + 1; while (x < z) { z = x; x = (y / x + x) / 2; } } else if (y != 0) { z = 1; } } } // File: contracts/libraries/UQ112x112.sol pragma solidity ^0.8.0; // a library for handling binary fixed point numbers (https://en.wikipedia.org/wiki/Q_(number_format)) // range: [0, 2**112 - 1] // resolution: 1 / 2**112 library UQ112x112 { uint224 constant Q112 = 2**112; // encode a uint112 as a UQ112x112 function encode(uint112 y) internal pure returns (uint224 z) { z = uint224(y) * Q112; // never overflows } // divide a UQ112x112 by a uint112, returning a UQ112x112 function uqdiv(uint224 x, uint112 y) internal pure returns (uint224 z) { z = x / uint224(y); } } // File: contracts/interfaces/IERC20.sol pragma solidity >=0.5.0; interface IERC20 { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); } // File: contracts/interfaces/IUniswapV2Callee.sol pragma solidity >=0.5.0; interface IUniswapV2Callee { function uniswapV2Call(address sender, uint amount0, uint amount1, bytes calldata data) external; } // File: contracts/Pair.sol pragma solidity ^0.8.0; contract Pair is ERC20 { using SafeMath for uint; using UQ112x112 for uint224; uint public constant MINIMUM_LIQUIDITY = 10**3; bytes4 private constant SELECTOR = bytes4(keccak256(bytes('transfer(address,uint256)'))); address public factory; address public token0; address public token1; uint112 private reserve0; // uses single storage slot, accessible via getReserves uint112 private reserve1; // uses single storage slot, accessible via getReserves uint32 private blockTimestampLast; // uses single storage slot, accessible via getReserves uint public price0CumulativeLast; uint public price1CumulativeLast; uint public kLast; // reserve0 * reserve1, as of immediately after the most recent liquidity event uint private unlocked = 1; modifier lock() { require(unlocked == 1, 'Swap: LOCKED'); unlocked = 0; _; unlocked = 1; } function getReserves() public view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast) { _reserve0 = reserve0; _reserve1 = reserve1; _blockTimestampLast = blockTimestampLast; } function _safeTransfer(address token, address to, uint value) private { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(SELECTOR, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'Pair: TRANSFER_FAILED'); } event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); event ProtocolLiquidity(uint liquidity); constructor() { factory = msg.sender; } // called once by the factory at time of deployment function initialize(address _token0, address _token1) external { require(msg.sender == factory, 'Pair: FORBIDDEN'); // sufficient check token0 = _token0; token1 = _token1; } // update reserves and, on the first call per block, price accumulators function _update(uint balance0, uint balance1, uint112 _reserve0, uint112 _reserve1) private { require(balance0 <= type(uint112).max && balance1 <= type(uint112).max, 'Pair: OVERFLOW'); uint32 blockTimestamp = uint32(block.timestamp % 2**32); uint32 timeElapsed = blockTimestamp - blockTimestampLast; // overflow is desired if (timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0) { // * never overflows, and + overflow is desired price0CumulativeLast += uint(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) * timeElapsed; price1CumulativeLast += uint(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) * timeElapsed; } reserve0 = uint112(balance0); reserve1 = uint112(balance1); blockTimestampLast = blockTimestamp; emit Sync(reserve0, reserve1); } function _mintFee(uint112 _reserve0, uint112 _reserve1) private returns (bool feeOn) { address feeTo = IFactory(factory).feeTo(); address OnoutFeeTo = IFactory(factory).OnoutFeeTo(); uint OnoutFeePercent = IFactory(factory).OnoutFeePercent(); uint totalFee = IFactory(factory).totalFee(); uint protocolFee = IFactory(factory).protocolFee(); uint _kLast = kLast; // gas savings feeOn = totalFee > 0 && feeTo != address(0) && protocolFee > 0; if (feeOn) { if (_kLast != 0) { uint rootK = Math.sqrt(uint(_reserve0).mul(_reserve1)); uint rootKLast = Math.sqrt(_kLast); if (rootK > rootKLast) { uint liquidity = _protocolLiquidity(rootK, rootKLast); emit ProtocolLiquidity(liquidity); if (liquidity > 0) { if (OnoutFeePercent == 0 || OnoutFeeTo == address(0)) { _mint(feeTo, liquidity); } else { uint onePercentOfLiquidity = liquidity / 100; uint OnoutLiquidity = onePercentOfLiquidity.mul(OnoutFeePercent); uint protocolLiquidity = liquidity.sub(OnoutLiquidity); require(protocolLiquidity.add(OnoutLiquidity) <= liquidity, 'Pair: INSUFFICIENT_PROTOCOL_LIQUIDITY'); _mint(feeTo, protocolLiquidity); _mint(OnoutFeeTo, OnoutLiquidity); } } } } } else if (_kLast != 0) { kLast = 0; } } function _protocolLiquidity(uint rootK, uint rootKLast) internal view returns(uint liquidity) { require(rootK > 0 && rootKLast > 0, 'Pair: ROOT_K_ZERO'); bool allFeeToProtocol = IFactory(factory).allFeeToProtocol(); uint maxProtocolPercent = IFactory(factory).MAX_PROTOCOL_FEE_PERCENT(); uint protocolFee = IFactory(factory).protocolFee(); require(protocolFee > 0 && protocolFee <= maxProtocolPercent, 'Pair: FORBIDDEN_PROTOCOL_FEE'); uint feeMultiplier = maxProtocolPercent / protocolFee - 1; uint numerator = totalSupply.mul(rootK.sub(rootKLast)); uint denominator = rootK.mul(allFeeToProtocol ? 0 : feeMultiplier).add(rootKLast); liquidity = numerator / denominator; } // this low-level function should be called from a contract which performs important safety checks function mint(address to) external lock returns (uint liquidity) { (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings uint balance0 = IERC20(token0).balanceOf(address(this)); uint balance1 = IERC20(token1).balanceOf(address(this)); uint amount0 = balance0.sub(_reserve0); uint amount1 = balance1.sub(_reserve1); bool feeOn = _mintFee(_reserve0, _reserve1); uint _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee if (_totalSupply == 0) { liquidity = Math.sqrt(amount0.mul(amount1)).sub(MINIMUM_LIQUIDITY); _mint(address(0), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens } else { liquidity = Math.min(amount0.mul(_totalSupply) / _reserve0, amount1.mul(_totalSupply) / _reserve1); } require(liquidity > 0, 'Pair: INSUFFICIENT_LIQUIDITY_MINTED'); _mint(to, liquidity); _update(balance0, balance1, _reserve0, _reserve1); if (feeOn) kLast = uint(reserve0).mul(reserve1); // reserve0 and reserve1 are up-to-date emit Mint(msg.sender, amount0, amount1); } // this low-level function should be called from a contract which performs important safety checks function burn(address to) external lock returns (uint amount0, uint amount1) { (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings address _token0 = token0; // gas savings address _token1 = token1; // gas savings uint balance0 = IERC20(_token0).balanceOf(address(this)); uint balance1 = IERC20(_token1).balanceOf(address(this)); uint liquidity = balanceOf[address(this)]; bool feeOn = _mintFee(_reserve0, _reserve1); uint _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee amount0 = liquidity.mul(balance0) / _totalSupply; // using balances ensures pro-rata distribution amount1 = liquidity.mul(balance1) / _totalSupply; // using balances ensures pro-rata distribution require(amount0 > 0 && amount1 > 0, 'Pair: INSUFFICIENT_LIQUIDITY_BURNED'); _burn(address(this), liquidity); _safeTransfer(_token0, to, amount0); _safeTransfer(_token1, to, amount1); balance0 = IERC20(_token0).balanceOf(address(this)); balance1 = IERC20(_token1).balanceOf(address(this)); _update(balance0, balance1, _reserve0, _reserve1); if (feeOn) kLast = uint(reserve0).mul(reserve1); // reserve0 and reserve1 are up-to-date emit Burn(msg.sender, amount0, amount1, to); } // this low-level function should be called from a contract which performs important safety checks function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external lock { require(amount0Out > 0 || amount1Out > 0, 'Pair: INSUFFICIENT_OUTPUT_AMOUNT'); (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings require(amount0Out < _reserve0 && amount1Out < _reserve1, 'Pair: INSUFFICIENT_LIQUIDITY'); uint balance0; uint balance1; { // scope for _token{0,1}, avoids stack too deep errors address _token0 = token0; address _token1 = token1; require(to != _token0 && to != _token1, 'Pair: INVALID_TO'); if (amount0Out > 0) _safeTransfer(_token0, to, amount0Out); // optimistically transfer tokens if (amount1Out > 0) _safeTransfer(_token1, to, amount1Out); // optimistically transfer tokens if (data.length > 0) IUniswapV2Callee(to).uniswapV2Call(msg.sender, amount0Out, amount1Out, data); balance0 = IERC20(_token0).balanceOf(address(this)); balance1 = IERC20(_token1).balanceOf(address(this)); } uint amount0In = balance0 > _reserve0 - amount0Out ? balance0 - (_reserve0 - amount0Out) : 0; uint amount1In = balance1 > _reserve1 - amount1Out ? balance1 - (_reserve1 - amount1Out) : 0; require(amount0In > 0 || amount1In > 0, 'Pair: INSUFFICIENT_INPUT_AMOUNT'); { // scope for reserve{0,1}Adjusted, avoids stack too deep errors uint maxPercent = IFactory(factory).MAX_TOTAL_FEE_PERCENT(); uint totalFee = IFactory(factory).totalFee(); uint balance0Adjusted = balance0.mul(maxPercent).sub(amount0In.mul(totalFee)); uint balance1Adjusted = balance1.mul(maxPercent).sub(amount1In.mul(totalFee)); require(balance0Adjusted.mul(balance1Adjusted) >= uint(_reserve0).mul(_reserve1).mul(maxPercent**2), 'Pair: K'); } _update(balance0, balance1, _reserve0, _reserve1); if (IFactory(factory).totalSwaps() < type(uint).max) IFactory(factory).increaseNumberOfSwaps(token0, token1); emit Swap(msg.sender, amount0In, amount1In, amount0Out, amount1Out, to); } // force balances to match reserves function skim(address to) external lock { address _token0 = token0; // gas savings address _token1 = token1; // gas savings _safeTransfer(_token0, to, IERC20(_token0).balanceOf(address(this)).sub(reserve0)); _safeTransfer(_token1, to, IERC20(_token1).balanceOf(address(this)).sub(reserve1)); } // force reserves to match balances function sync() external lock { _update(IERC20(token0).balanceOf(address(this)), IERC20(token1).balanceOf(address(this)), reserve0, reserve1); } } // File: contracts/Factory.sol pragma solidity ^0.8.0; contract Factory is IFactory { using SafeMath for uint; uint[30] public POSSIBLE_PROTOCOL_PERCENT = [10000, 5000, 3300, 2500, 2000, 1600, 1400, 1200, 1100, 1000, 900, 800, 700, 600, 500, 400, 300, 200, 100, 90, 80, 70, 60, 50, 40, 30, 20, 10, 5, 1]; uint public override constant MAX_TOTAL_FEE_PERCENT = 1_000; uint public override constant MAX_PROTOCOL_FEE_PERCENT = 10_000; uint public override totalSwaps; uint public override protocolFee; uint public override totalFee; uint public override OnoutFeePercent; address public override feeTo; address public override feeToSetter; address public override OnoutFeeTo; address public override OnoutFeeSetter; bool public override allFeeToProtocol; bytes32 public constant INIT_CODE_PAIR_HASH = keccak256(abi.encodePacked(type(Pair).creationCode)); mapping(address => mapping(address => address)) public override getPair; address[] public override allPairs; modifier onlyOwner() { require(msg.sender == feeToSetter, 'Factory: FORBIDDEN'); _; } constructor(address _feeToSetter, address _OnoutFeeTo) { feeToSetter = _feeToSetter; OnoutFeeSetter = _feeToSetter; OnoutFeeTo = _OnoutFeeTo; totalFee = 3; protocolFee = 2000; OnoutFeePercent = 20; } function allPairsLength() external view override returns (uint) { return allPairs.length; } function allInfo() external view override returns(AllInfo memory) { return AllInfo({ totalSwaps: totalSwaps, protocolFee: protocolFee, totalFee: totalFee, OnoutFeePercent: OnoutFeePercent, feeTo: feeTo, feeToSetter: feeToSetter, OnoutFeeTo: OnoutFeeTo, OnoutFeeSetter: OnoutFeeSetter, allFeeToProtocol: allFeeToProtocol, POSSIBLE_PROTOCOL_PERCENT: POSSIBLE_PROTOCOL_PERCENT, MAX_TOTAL_FEE_PERCENT: MAX_TOTAL_FEE_PERCENT, MAX_PROTOCOL_FEE_PERCENT: MAX_PROTOCOL_FEE_PERCENT, INIT_CODE_PAIR_HASH: INIT_CODE_PAIR_HASH }); } function createPair(address tokenA, address tokenB) external override returns (address pair) { require(tokenA != tokenB, 'Factory: IDENTICAL_ADDRESSES'); (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), 'Factory: ZERO_ADDRESS'); require(getPair[token0][token1] == address(0), 'Factory: PAIR_EXISTS'); // single check is sufficient bytes memory bytecode = type(Pair).creationCode; bytes32 salt = keccak256(abi.encodePacked(token0, token1)); assembly { pair := create2(0, add(bytecode, 32), mload(bytecode), salt) } IUniswapV2Pair(pair).initialize(token0, token1); getPair[token0][token1] = pair; getPair[token1][token0] = pair; // populate mapping in the reverse direction allPairs.push(pair); emit PairCreated(token0, token1, pair, allPairs.length); } function setOnoutFeePercent(uint _OnoutFeePercent) external override { require(msg.sender == OnoutFeeSetter, 'Factory: FORBIDDEN'); require(_OnoutFeePercent >= 0 && _OnoutFeePercent <= 100, 'Factory: WRONG_PERCENTAGE'); OnoutFeePercent = _OnoutFeePercent; } function setFeeTo(address _feeTo) external override onlyOwner { feeTo = _feeTo; } function setFeeToSetter(address _feeToSetter) external override onlyOwner { feeToSetter = _feeToSetter; } function setOnoutFeeTo(address _OnoutFeeTo) external override { require(msg.sender == OnoutFeeSetter, 'Factory: FORBIDDEN'); OnoutFeeTo = _OnoutFeeTo; } function setOnoutFeeSetter(address _OnoutFeeToSetter) external override { require(msg.sender == OnoutFeeSetter, 'Factory: FORBIDDEN'); OnoutFeeSetter = _OnoutFeeToSetter; } function setAllFeeToProtocol(bool _allFeeToProtocol) external override onlyOwner { allFeeToProtocol = _allFeeToProtocol; } function setMainFees(uint _totalFee, uint _protocolFee) external override onlyOwner { _setTotalFee(_totalFee); _setProtocolFee(_protocolFee); require(totalFee == _totalFee && protocolFee == _protocolFee, 'Factory: CANNOT_CHANGE'); } function setTotalFee(uint _totalFee) external override onlyOwner { _setTotalFee(_totalFee); } function setProtocolFee(uint _protocolFee) external override onlyOwner { _setProtocolFee(_protocolFee); } function increaseNumberOfSwaps(address token0, address token1) external override { require(msg.sender == getPair[token0][token1], 'Factory: FORBIDDEN'); if (totalSwaps < type(uint).max) totalSwaps += 1; } function _setTotalFee(uint _totalFee) private { require(_totalFee >= 0 && _totalFee <= MAX_TOTAL_FEE_PERCENT - 1, 'Factory: FORBIDDEN_FEE'); totalFee = _totalFee; } function _setProtocolFee(uint _protocolFee) private { require(_protocolFee >= 0 && _protocolFee <= MAX_PROTOCOL_FEE_PERCENT, 'Factory: FORBIDDEN_FEE'); if (_protocolFee != 0) { bool allowed; for(uint x; x < POSSIBLE_PROTOCOL_PERCENT.length; x++) { if (_protocolFee == POSSIBLE_PROTOCOL_PERCENT[x]) { allowed = true; break; } } if (!allowed) revert('Factory: FORBIDDEN_FEE'); } protocolFee = _protocolFee; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_feeToSetter","type":"address"},{"internalType":"address","name":"_OnoutFeeTo","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token0","type":"address"},{"indexed":true,"internalType":"address","name":"token1","type":"address"},{"indexed":false,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"PairCreated","type":"event"},{"inputs":[],"name":"INIT_CODE_PAIR_HASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PROTOCOL_FEE_PERCENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOTAL_FEE_PERCENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OnoutFeePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OnoutFeeSetter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OnoutFeeTo","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"POSSIBLE_PROTOCOL_PERCENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allFeeToProtocol","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allInfo","outputs":[{"components":[{"internalType":"uint256[30]","name":"POSSIBLE_PROTOCOL_PERCENT","type":"uint256[30]"},{"internalType":"uint256","name":"MAX_TOTAL_FEE_PERCENT","type":"uint256"},{"internalType":"uint256","name":"MAX_PROTOCOL_FEE_PERCENT","type":"uint256"},{"internalType":"uint256","name":"totalSwaps","type":"uint256"},{"internalType":"uint256","name":"protocolFee","type":"uint256"},{"internalType":"uint256","name":"totalFee","type":"uint256"},{"internalType":"uint256","name":"OnoutFeePercent","type":"uint256"},{"internalType":"address","name":"feeTo","type":"address"},{"internalType":"address","name":"feeToSetter","type":"address"},{"internalType":"address","name":"OnoutFeeTo","type":"address"},{"internalType":"address","name":"OnoutFeeSetter","type":"address"},{"internalType":"bool","name":"allFeeToProtocol","type":"bool"},{"internalType":"bytes32","name":"INIT_CODE_PAIR_HASH","type":"bytes32"}],"internalType":"struct IFactory.AllInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allPairs","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allPairsLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"createPair","outputs":[{"internalType":"address","name":"pair","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeTo","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeToSetter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"getPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"}],"name":"increaseNumberOfSwaps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"protocolFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_allFeeToProtocol","type":"bool"}],"name":"setAllFeeToProtocol","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeTo","type":"address"}],"name":"setFeeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeToSetter","type":"address"}],"name":"setFeeToSetter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_totalFee","type":"uint256"},{"internalType":"uint256","name":"_protocolFee","type":"uint256"}],"name":"setMainFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_OnoutFeePercent","type":"uint256"}],"name":"setOnoutFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_OnoutFeeToSetter","type":"address"}],"name":"setOnoutFeeSetter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_OnoutFeeTo","type":"address"}],"name":"setOnoutFeeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_protocolFee","type":"uint256"}],"name":"setProtocolFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_totalFee","type":"uint256"}],"name":"setTotalFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSwaps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
610440604052612710608090815261138860a052610ce460c0526109c460e0526107d06101005261064061012052610578610140526104b06101605261044c610180526103e86101a0526103846101c0526103206101e08190526102bc61020052610258610220526101f4610240526101906102605261012c6102805260c86102a05260646102c052605a6102e05260506103005260469052603c61034052603261036052602861038052601e6103a081905260146103c052600a6103e052600561040052600161042052620000d89160009162000158565b50348015620000e657600080fd5b5060405162003ed738038062003ed78339810160408190526200010991620001d5565b602380546001600160a01b039384166001600160a01b031991821681179092556025805482169092179091556024805492909316911617905560036020556107d0601f5560146021556200020d565b82601e81019282156200018f579160200282015b828111156200018f578251829061ffff169055916020019190600101906200016c565b506200019d929150620001a1565b5090565b5b808211156200019d5760008155600101620001a2565b80516001600160a01b0381168114620001d057600080fd5b919050565b60008060408385031215620001e957600080fd5b620001f483620001b8565b91506200020460208401620001b8565b90509250929050565b613cba806200021d6000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c8063a2e74af6116100f9578063c213311e11610097578063e6a4390511610071578063e6a439051461037d578063ef7adc00146103b1578063f1f5aa74146103c6578063f46901ed146103d957600080fd5b8063c213311e1461034e578063c9c6539614610361578063d63cdaa31461037457600080fd5b8063b0e21e8a116100d3578063b0e21e8a14610305578063b4a800ce1461030e578063b8ff503814610317578063bf1d90db1461033b57600080fd5b8063a2e74af6146102d6578063a74d5f30146102e9578063ac212d2e146102f257600080fd5b8063574f2ba311610166578063671629ea11610140578063671629ea1461028a578063787dce3d1461029d578063892ffec6146102b0578063992d0ebb146102c357600080fd5b8063574f2ba3146102675780635837e5501461026f5780635855a25a1461028257600080fd5b806315067b84116101a257806315067b84146102235780631df4ccfc146102365780631e3dd18b1461023f578063471280f81461025257600080fd5b8063016a7d76146101c9578063017e7e58146101e5578063094b741514610210575b600080fd5b6101d260215481565b6040519081526020015b60405180910390f35b6022546101f8906001600160a01b031681565b6040516001600160a01b0390911681526020016101dc565b6023546101f8906001600160a01b031681565b6101d2610231366004610de1565b6103ec565b6101d260205481565b6101f861024d366004610de1565b610403565b610265610260366004610d6a565b61042d565b005b6027546101d2565b61026561027d366004610d8c565b610482565b6101d26104f1565b610265610298366004610de1565b61053b565b6102656102ab366004610de1565b6105bb565b6102656102be366004610d6a565b6105f1565b6102656102d1366004610de1565b61063d565b6102656102e4366004610d6a565b610670565b6101d261271081565b6025546101f8906001600160a01b031681565b6101d2601f5481565b6101d2601e5481565b60255461032b90600160a01b900460ff1681565b60405190151581526020016101dc565b610265610349366004610dfa565b6106bc565b6024546101f8906001600160a01b031681565b6101f861036f366004610d8c565b61074f565b6101d26103e881565b6101f861038b366004610d8c565b60266020908152600092835260408084209091529082529020546001600160a01b031681565b6103b9610a44565b6040516101dc9190610edc565b6102656103d4366004610dbf565b610b59565b6102656103e7366004610d6a565b610ba1565b600081601e81106103fc57600080fd5b0154905081565b6027818154811061041357600080fd5b6000918252602090912001546001600160a01b0316905081565b6025546001600160a01b031633146104605760405162461bcd60e51b815260040161045790610eb0565b60405180910390fd5b602480546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03828116600090815260266020908152604080832085851684529091529020541633146104c85760405162461bcd60e51b815260040161045790610eb0565b600019601e5410156104ed576001601e60008282546104e79190610f90565b90915550505b5050565b60405161050060208201610caf565b601f1982820381018352601f9091011660408190526105229190602001610e45565b6040516020818303038152906040528051906020012081565b6025546001600160a01b031633146105655760405162461bcd60e51b815260040161045790610eb0565b60648111156105b65760405162461bcd60e51b815260206004820152601960248201527f466163746f72793a2057524f4e475f50455243454e54414745000000000000006044820152606401610457565b602155565b6023546001600160a01b031633146105e55760405162461bcd60e51b815260040161045790610eb0565b6105ee81610bed565b50565b6025546001600160a01b0316331461061b5760405162461bcd60e51b815260040161045790610eb0565b602580546001600160a01b0319166001600160a01b0392909216919091179055565b6023546001600160a01b031633146106675760405162461bcd60e51b815260040161045790610eb0565b6105ee81610c7e565b6023546001600160a01b0316331461069a5760405162461bcd60e51b815260040161045790610eb0565b602380546001600160a01b0319166001600160a01b0392909216919091179055565b6023546001600160a01b031633146106e65760405162461bcd60e51b815260040161045790610eb0565b6106ef82610c7e565b6106f881610bed565b8160205414801561070a575080601f54145b6104ed5760405162461bcd60e51b8152602060048201526016602482015275466163746f72793a2043414e4e4f545f4348414e474560501b6044820152606401610457565b6000816001600160a01b0316836001600160a01b031614156107b35760405162461bcd60e51b815260206004820152601c60248201527f466163746f72793a204944454e544943414c5f414444524553534553000000006044820152606401610457565b600080836001600160a01b0316856001600160a01b0316106107d65783856107d9565b84845b90925090506001600160a01b03821661082c5760405162461bcd60e51b8152602060048201526015602482015274466163746f72793a205a45524f5f4144445245535360581b6044820152606401610457565b6001600160a01b038281166000908152602660209081526040808320858516845290915290205416156108985760405162461bcd60e51b8152602060048201526014602482015273466163746f72793a20504149525f45584953545360601b6044820152606401610457565b6000604051806020016108aa90610caf565b601f1982820381018352601f9091011660408190526bffffffffffffffffffffffff19606086811b8216602084015285901b166034820152909150600090604801604051602081830303815290604052805190602001209050808251602084016000f560405163485cc95560e01b81526001600160a01b03868116600483015285811660248301529196509086169063485cc95590604401600060405180830381600087803b15801561095c57600080fd5b505af1158015610970573d6000803e3d6000fd5b505050506001600160a01b0384811660008181526026602081815260408084208987168086529083528185208054978d166001600160a01b031998891681179091559383528185208686528352818520805488168517905560278054600181018255958190527f98a476f1687bc3d60a2da2adbcba2c46958e61fa2fb4042cd7bc5816a710195b9095018054909716841790965592548351928352908201527f0d3648bd0f6ba80134a33ba9275ac585d9d315f0ad8355cddefde31afa28d0e9910160405180910390a35050505092915050565b610a4c610cbc565b604080516105608101909152806101a081016000601e8282826020028201915b815481526020019060010190808311610a6c5750505091835250506103e8602080830191909152612710604080840191909152601e546060840152601f546080840152815460a084015260215460c08401526022546001600160a01b0390811660e085015260235481166101008501526024548116610120850152602554908116610140850152600160a01b900460ff161515610160840152516101809092019190610b19908201610caf565b601f1982820381018352601f909101166040819052610b3b9190602001610e45565b60405160208183030381529060405280519060200120815250905090565b6023546001600160a01b03163314610b835760405162461bcd60e51b815260040161045790610eb0565b60258054911515600160a01b0260ff60a01b19909216919091179055565b6023546001600160a01b03163314610bcb5760405162461bcd60e51b815260040161045790610eb0565b602280546001600160a01b0319166001600160a01b0392909216919091179055565b612710811115610c0f5760405162461bcd60e51b815260040161045790610e80565b8015610c79576000805b601e811015610c5957600081601e8110610c3557610c35610ff0565b0154831415610c475760019150610c59565b80610c5181610fbf565b915050610c19565b5080610c775760405162461bcd60e51b815260040161045790610e80565b505b601f55565b610c8b60016103e8610fa8565b811115610caa5760405162461bcd60e51b815260040161045790610e80565b602055565b612c7e8061100783390190565b604051806101a00160405280610cd0610d2f565b815260006020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e0820181905261010082018190526101208201819052610140820181905261016082018190526101809091015290565b604051806103c00160405280601e906020820280368337509192915050565b80356001600160a01b0381168114610d6557600080fd5b919050565b600060208284031215610d7c57600080fd5b610d8582610d4e565b9392505050565b60008060408385031215610d9f57600080fd5b610da883610d4e565b9150610db660208401610d4e565b90509250929050565b600060208284031215610dd157600080fd5b81358015158114610d8557600080fd5b600060208284031215610df357600080fd5b5035919050565b60008060408385031215610e0d57600080fd5b50508035926020909101359150565b8060005b601e811015610e3f578151845260209384019390910190600101610e20565b50505050565b6000825160005b81811015610e665760208186018101518583015201610e4c565b81811115610e75576000828501525b509190910192915050565b602080825260169082015275466163746f72793a20464f5242494444454e5f46454560501b604082015260600190565b6020808252601290820152712330b1ba37b93c9d102327a92124a22222a760711b604082015260600190565b600061054082019050610ef0828451610e1c565b60208301516103c083015260408301516103e08301526060830151610400830152608083015161042083015260a083015161044083015260c083015161046083015260e08301516001600160a01b0390811661048084015261010084015181166104a084015261012084015181166104c0840152610140840151166104e08301526101608301511515610500830152610180909201516105209091015290565b60008219821115610fa357610fa3610fda565b500190565b600082821015610fba57610fba610fda565b500390565b6000600019821415610fd357610fd3610fda565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fdfe60806040526001600c5534801561001557600080fd5b50604080518082018252601481527f4c69717569646974792d506f6f6c2d546f6b656e0000000000000000000000006020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527fee49096366cc590b73291b7aa9e5e091aa761dec637befae63796ffa4f337d4a818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528351808303909101815260c09091019092528151910120600355600580546001600160a01b03191633179055612b638061011b6000396000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c80636a627842116100f9578063ba9a7a5611610097578063d21220a711610071578063d21220a714610414578063d505accf14610427578063dd62ed3e1461043a578063fff6cae91461046557600080fd5b8063ba9a7a56146103e5578063bc25cf77146103ee578063c45a01551461040157600080fd5b80637ecebe00116100d35780637ecebe001461036357806389afcb441461038357806395d89b41146103ab578063a9059cbb146103d257600080fd5b80636a6278421461032757806370a082311461033a5780637464fc3d1461035a57600080fd5b806323b872dd116101665780633644e515116101405780633644e515146102f9578063485cc955146103025780635909c0d5146103155780635a3d54931461031e57600080fd5b806323b872dd146102a557806330adf81f146102b8578063313ce567146102df57600080fd5b8063022c0d9f146101ae57806306fdde03146101c35780630902f1ac1461020c578063095ea7b3146102405780630dfe16811461026357806318160ddd1461028e575b600080fd5b6101c16101bc366004612769565b61046d565b005b6101f6604051806040016040528060148152602001732634b8bab4b234ba3c96a837b7b616aa37b5b2b760611b81525081565b6040516102039190612867565b60405180910390f35b610214610b6c565b604080516001600160701b03948516815293909216602084015263ffffffff1690820152606001610203565b61025361024e366004612702565b610b96565b6040519015158152602001610203565b600654610276906001600160a01b031681565b6040516001600160a01b039091168152602001610203565b61029760005481565b604051908152602001610203565b6102536102b336600461264a565b610bad565b6102977f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b6102e7601281565b60405160ff9091168152602001610203565b61029760035481565b6101c1610310366004612611565b610c41565b61029760095481565b610297600a5481565b6102976103353660046125d7565b610cbb565b6102976103483660046125d7565b60016020526000908152604090205481565b610297600b5481565b6102976103713660046125d7565b60046020526000908152604090205481565b6103966103913660046125d7565b610f99565b60408051928352602083019190915201610203565b6101f660405180604001604052806008815260200167262816aa27a5a2a760c11b81525081565b6102536103e0366004612702565b611336565b6102976103e881565b6101c16103fc3660046125d7565b611343565b600554610276906001600160a01b031681565b600754610276906001600160a01b031681565b6101c161043536600461268b565b611466565b610297610448366004612611565b600260209081526000928352604080842090915290825290205481565b6101c1611676565b600c546001146104985760405162461bcd60e51b815260040161048f9061289a565b60405180910390fd5b6000600c55841515806104ab5750600084115b6104f75760405162461bcd60e51b815260206004820181905260248201527f506169723a20494e53554646494349454e545f4f55545055545f414d4f554e54604482015260640161048f565b600080610502610b6c565b5091509150816001600160701b0316871080156105275750806001600160701b031686105b6105735760405162461bcd60e51b815260206004820152601c60248201527f506169723a20494e53554646494349454e545f4c495155494449545900000000604482015260640161048f565b60065460075460009182916001600160a01b039182169190811690891682148015906105b15750806001600160a01b0316896001600160a01b031614155b6105f05760405162461bcd60e51b815260206004820152601060248201526f506169723a20494e56414c49445f544f60801b604482015260640161048f565b8a1561060157610601828a8d6117b8565b891561061257610612818a8c6117b8565b861561067f576040516304347a1760e21b81526001600160a01b038a16906310d1e85c9061064c9033908f908f908e908e9060040161281b565b600060405180830381600087803b15801561066657600080fd5b505af115801561067a573d6000803e3d6000fd5b505050505b6040516370a0823160e01b81523060048201526001600160a01b038316906370a082319060240160206040518083038186803b1580156106be57600080fd5b505afa1580156106d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f69190612750565b6040516370a0823160e01b81523060048201529094506001600160a01b038216906370a082319060240160206040518083038186803b15801561073857600080fd5b505afa15801561074c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107709190612750565b92505050600089856001600160701b031661078b9190612a4e565b83116107985760006107b5565b6107ab8a6001600160701b038716612a4e565b6107b59084612a4e565b905060006107cc8a6001600160701b038716612a4e565b83116107d95760006107f6565b6107ec8a6001600160701b038716612a4e565b6107f69084612a4e565b905060008211806108075750600081115b6108535760405162461bcd60e51b815260206004820152601f60248201527f506169723a20494e53554646494349454e545f494e5055545f414d4f554e5400604482015260640161048f565b6005546040805163d63cdaa360e01b815290516000926001600160a01b03169163d63cdaa3916004808301926020929190829003018186803b15801561089857600080fd5b505afa1580156108ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d09190612750565b90506000600560009054906101000a90046001600160a01b03166001600160a01b0316631df4ccfc6040518163ffffffff1660e01b815260040160206040518083038186803b15801561092257600080fd5b505afa158015610936573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095a9190612750565b9050600061097b61096b86846118fb565b61097589866118fb565b90611962565b9050600061099661098c86856118fb565b61097589876118fb565b90506109c26109a6600286612955565b6109bc6001600160701b038d8116908d166118fb565b906118fb565b6109cc83836118fb565b1015610a045760405162461bcd60e51b8152602060048201526007602482015266506169723a204b60c81b604482015260640161048f565b50505050610a14848488886119b8565b60055460408051635a54006760e11b81529051600019926001600160a01b03169163b4a800ce916004808301926020929190829003018186803b158015610a5a57600080fd5b505afa158015610a6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a929190612750565b1015610b05576005546006546007546040516305837e5560e41b81526001600160a01b0392831660048201529082166024820152911690635837e55090604401600060405180830381600087803b158015610aec57600080fd5b505af1158015610b00573d6000803e3d6000fd5b505050505b60408051838152602081018390529081018c9052606081018b90526001600160a01b038a169033907fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229060800160405180910390a350506001600c55505050505050505050565b6008546001600160701b0380821692600160701b830490911691600160e01b900463ffffffff1690565b6000610ba3338484611b9f565b5060015b92915050565b6001600160a01b038316600090815260026020908152604080832033845290915281205460001914610c2c576001600160a01b0384166000908152600260209081526040808320338452909152902054610c079083611962565b6001600160a01b03851660009081526002602090815260408083203384529091529020555b610c37848484611c01565b5060019392505050565b6005546001600160a01b03163314610c8d5760405162461bcd60e51b815260206004820152600f60248201526e2830b4b91d102327a92124a22222a760891b604482015260640161048f565b600680546001600160a01b039384166001600160a01b03199182161790915560078054929093169116179055565b6000600c54600114610cdf5760405162461bcd60e51b815260040161048f9061289a565b6000600c81905580610cef610b6c565b506006546040516370a0823160e01b81523060048201529294509092506000916001600160a01b03909116906370a082319060240160206040518083038186803b158015610d3c57600080fd5b505afa158015610d50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d749190612750565b6007546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a082319060240160206040518083038186803b158015610dbd57600080fd5b505afa158015610dd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df59190612750565b90506000610e0c836001600160701b038716611962565b90506000610e23836001600160701b038716611962565b90506000610e318787611ca7565b60005490915080610e6857610e546103e8610975610e4f87876118fb565b612102565b9850610e6360006103e8612172565b610eaf565b610eac6001600160701b038916610e7f86846118fb565b610e8991906128fe565b6001600160701b038916610e9d86856118fb565b610ea791906128fe565b612201565b98505b60008911610f0b5760405162461bcd60e51b815260206004820152602360248201527f506169723a20494e53554646494349454e545f4c49515549444954595f4d494e60448201526215115160ea1b606482015260840161048f565b610f158a8a612172565b610f2186868a8a6119b8565b8115610f4b57600854610f47906001600160701b0380821691600160701b9004166118fb565b600b555b604080518581526020810185905233917f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f910160405180910390a250506001600c5550949695505050505050565b600080600c54600114610fbe5760405162461bcd60e51b815260040161048f9061289a565b6000600c81905580610fce610b6c565b506006546007546040516370a0823160e01b81523060048201529395509193506001600160a01b039081169291169060009083906370a082319060240160206040518083038186803b15801561102357600080fd5b505afa158015611037573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105b9190612750565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038416906370a082319060240160206040518083038186803b1580156110a057600080fd5b505afa1580156110b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d89190612750565b306000908152600160205260408120549192506110f58888611ca7565b6000549091508061110684876118fb565b61111091906128fe565b9a508061111d84866118fb565b61112791906128fe565b995060008b118015611139575060008a115b6111915760405162461bcd60e51b815260206004820152602360248201527f506169723a20494e53554646494349454e545f4c49515549444954595f42555260448201526213915160ea1b606482015260840161048f565b61119b3084612219565b6111a6878d8d6117b8565b6111b1868d8c6117b8565b6040516370a0823160e01b81523060048201526001600160a01b038816906370a082319060240160206040518083038186803b1580156111f057600080fd5b505afa158015611204573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112289190612750565b6040516370a0823160e01b81523060048201529095506001600160a01b038716906370a082319060240160206040518083038186803b15801561126a57600080fd5b505afa15801561127e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a29190612750565b93506112b085858b8b6119b8565b81156112da576008546112d6906001600160701b0380821691600160701b9004166118fb565b600b555b604080518c8152602081018c90526001600160a01b038e169133917fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496910160405180910390a35050505050505050506001600c81905550915091565b6000610ba3338484611c01565b600c546001146113655760405162461bcd60e51b815260040161048f9061289a565b6000600c556006546007546008546040516370a0823160e01b81523060048201526001600160a01b03938416939092169161140f918491869161140a916001600160701b039091169084906370a08231906024015b60206040518083038186803b1580156113d257600080fd5b505afa1580156113e6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109759190612750565b6117b8565b6008546040516370a0823160e01b815230600482015261145c918391869161140a91600160701b9091046001600160701b0316906001600160a01b038516906370a08231906024016113ba565b50506001600c5550565b428410156114a75760405162461bcd60e51b815260206004820152600e60248201526d115490cc8c0e881156141254915160921b604482015260640161048f565b6003546001600160a01b038816600090815260046020526040812080549192917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b9190876114fa83612aba565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e0016040516020818303038152906040528051906020012060405160200161157392919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa1580156115de573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906116145750886001600160a01b0316816001600160a01b0316145b6116605760405162461bcd60e51b815260206004820152601860248201527f45524332303a20494e56414c49445f5349474e41545552450000000000000000604482015260640161048f565b61166b898989611b9f565b505050505050505050565b600c546001146116985760405162461bcd60e51b815260040161048f9061289a565b6000600c556006546040516370a0823160e01b81523060048201526117b1916001600160a01b0316906370a082319060240160206040518083038186803b1580156116e257600080fd5b505afa1580156116f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171a9190612750565b6007546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561175d57600080fd5b505afa158015611771573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117959190612750565b6008546001600160701b0380821691600160701b9004166119b8565b6001600c55565b604080518082018252601981527f7472616e7366657228616464726573732c75696e74323536290000000000000060209182015281516001600160a01b0385811660248301526044808301869052845180840390910181526064909201845291810180516001600160e01b031663a9059cbb60e01b1790529151600092839287169161184491906127ff565b6000604051808303816000865af19150503d8060008114611881576040519150601f19603f3d011682016040523d82523d6000602084013e611886565b606091505b50915091508180156118b05750805115806118b05750808060200190518101906118b0919061272e565b6118f45760405162461bcd60e51b815260206004820152601560248201527414185a5c8e881514905394d1915497d19052531151605a1b604482015260640161048f565b5050505050565b600081158061191f575082826119118183612a2f565b925061191d90836128fe565b145b610ba75760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015260640161048f565b60008261196f8382612a4e565b9150811115610ba75760405162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015260640161048f565b6001600160701b0384118015906119d657506001600160701b038311155b611a135760405162461bcd60e51b815260206004820152600e60248201526d506169723a204f564552464c4f5760901b604482015260640161048f565b6000611a2464010000000042612ad5565b600854909150600090611a4490600160e01b900463ffffffff1683612a65565b905060008163ffffffff16118015611a6457506001600160701b03841615155b8015611a7857506001600160701b03831615155b15611b07578063ffffffff16611aa085611a91866122a3565b6001600160e01b0316906122bc565b6001600160e01b0316611ab39190612a2f565b60096000828254611ac491906128c0565b909155505063ffffffff8116611add84611a91876122a3565b6001600160e01b0316611af09190612a2f565b600a6000828254611b0191906128c0565b90915550505b6008805463ffffffff8416600160e01b026001600160e01b036001600160701b03898116600160701b9081026001600160e01b03199095168c83161794909417918216831794859055604080519382169282169290921783529290930490911660208201527f1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1910160405180910390a1505050505050565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316600090815260016020526040902054611c249082611962565b6001600160a01b038085166000908152600160205260408082209390935590841681522054611c5390826122d1565b6001600160a01b0380841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611bf49085815260200190565b600080600560009054906101000a90046001600160a01b03166001600160a01b031663017e7e586040518163ffffffff1660e01b815260040160206040518083038186803b158015611cf857600080fd5b505afa158015611d0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d3091906125f4565b90506000600560009054906101000a90046001600160a01b03166001600160a01b031663c213311e6040518163ffffffff1660e01b815260040160206040518083038186803b158015611d8257600080fd5b505afa158015611d96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dba91906125f4565b90506000600560009054906101000a90046001600160a01b03166001600160a01b031663016a7d766040518163ffffffff1660e01b815260040160206040518083038186803b158015611e0c57600080fd5b505afa158015611e20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e449190612750565b90506000600560009054906101000a90046001600160a01b03166001600160a01b0316631df4ccfc6040518163ffffffff1660e01b815260040160206040518083038186803b158015611e9657600080fd5b505afa158015611eaa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ece9190612750565b90506000600560009054906101000a90046001600160a01b03166001600160a01b031663b0e21e8a6040518163ffffffff1660e01b815260040160206040518083038186803b158015611f2057600080fd5b505afa158015611f34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f589190612750565b600b549091508215801590611f7557506001600160a01b03861615155b8015611f815750600082115b965086156120ea5780156120e5576000611faa610e4f6001600160701b038c8116908c166118fb565b90506000611fb783612102565b9050808211156120e2576000611fcd8383612326565b90507f556884274ae9710f4ee09c7684aca5dd4300045d7bef418f17cdfa428ca3f5208160405161200091815260200190565b60405180910390a180156120e05786158061202257506001600160a01b038816155b15612036576120318982612172565b6120e0565b60006120436064836128fe565b90506000612051828a6118fb565b9050600061205f8483611962565b90508361206c82846122d1565b11156120c85760405162461bcd60e51b815260206004820152602560248201527f506169723a20494e53554646494349454e545f50524f544f434f4c5f4c495155604482015264494449545960d81b606482015260840161048f565b6120d28c82612172565b6120dc8b83612172565b5050505b505b50505b6120f6565b80156120f6576000600b555b50505050505092915050565b60006003821115612163575080600061211c6002836128fe565b6121279060016128c0565b90505b8181101561215d5790508060028161214281866128fe565b61214c91906128c0565b61215691906128fe565b905061212a565b50919050565b811561216d575060015b919050565b60005461217f90826122d1565b60009081556001600160a01b0383168152600160205260409020546121a490826122d1565b6001600160a01b0383166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906121f59085815260200190565b60405180910390a35050565b60008183106122105781612212565b825b9392505050565b6001600160a01b03821660009081526001602052604090205461223c9082611962565b6001600160a01b038316600090815260016020526040812091909155546122639082611962565b60009081556040518281526001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016121f5565b6000610ba7600160701b6001600160701b038416612a00565b60006122126001600160701b038316846128d8565b6000826122de83826128c0565b9150811015610ba75760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015260640161048f565b600080831180156123375750600082115b6123775760405162461bcd60e51b8152602060048201526011602482015270506169723a20524f4f545f4b5f5a45524f60781b604482015260640161048f565b6005546040805163171fea0760e31b815290516000926001600160a01b03169163b8ff5038916004808301926020929190829003018186803b1580156123bc57600080fd5b505afa1580156123d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123f4919061272e565b90506000600560009054906101000a90046001600160a01b03166001600160a01b031663a74d5f306040518163ffffffff1660e01b815260040160206040518083038186803b15801561244657600080fd5b505afa15801561245a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247e9190612750565b90506000600560009054906101000a90046001600160a01b03166001600160a01b031663b0e21e8a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156124d057600080fd5b505afa1580156124e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125089190612750565b905060008111801561251a5750818111155b6125665760405162461bcd60e51b815260206004820152601c60248201527f506169723a20464f5242494444454e5f50524f544f434f4c5f46454500000000604482015260640161048f565b6000600161257483856128fe565b61257e9190612a4e565b9050600061259861258f8989611962565b600054906118fb565b905060006125be886125b8886125ae57856125b1565b60005b8c906118fb565b906122d1565b90506125ca81836128fe565b9998505050505050505050565b6000602082840312156125e957600080fd5b813561221281612b15565b60006020828403121561260657600080fd5b815161221281612b15565b6000806040838503121561262457600080fd5b823561262f81612b15565b9150602083013561263f81612b15565b809150509250929050565b60008060006060848603121561265f57600080fd5b833561266a81612b15565b9250602084013561267a81612b15565b929592945050506040919091013590565b600080600080600080600060e0888a0312156126a657600080fd5b87356126b181612b15565b965060208801356126c181612b15565b95506040880135945060608801359350608088013560ff811681146126e557600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561271557600080fd5b823561272081612b15565b946020939093013593505050565b60006020828403121561274057600080fd5b8151801515811461221257600080fd5b60006020828403121561276257600080fd5b5051919050565b60008060008060006080868803121561278157600080fd5b8535945060208601359350604086013561279a81612b15565b9250606086013567ffffffffffffffff808211156127b757600080fd5b818801915088601f8301126127cb57600080fd5b8135818111156127da57600080fd5b8960208285010111156127ec57600080fd5b9699959850939650602001949392505050565b60008251612811818460208701612a8a565b9190910192915050565b60018060a01b038616815284602082015283604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f909201601f19160101949350505050565b6020815260008251806020840152612886816040850160208701612a8a565b601f01601f19169190910160400192915050565b6020808252600c908201526b14ddd85c0e881313d0d2d15160a21b604082015260600190565b600082198211156128d3576128d3612ae9565b500190565b60006001600160e01b03838116806128f2576128f2612aff565b92169190910492915050565b60008261290d5761290d612aff565b500490565b600181815b8085111561294d57816000190482111561293357612933612ae9565b8085161561294057918102915b93841c9390800290612917565b509250929050565b600061221260ff84168360008261296e57506001610ba7565b8161297b57506000610ba7565b8160018114612991576002811461299b576129b7565b6001915050610ba7565b60ff8411156129ac576129ac612ae9565b50506001821b610ba7565b5060208310610133831016604e8410600b84101617156129da575081810a610ba7565b6129e48383612912565b80600019048211156129f8576129f8612ae9565b029392505050565b60006001600160e01b0382811684821681151582840482111615612a2657612a26612ae9565b02949350505050565b6000816000190483118215151615612a4957612a49612ae9565b500290565b600082821015612a6057612a60612ae9565b500390565b600063ffffffff83811690831681811015612a8257612a82612ae9565b039392505050565b60005b83811015612aa5578181015183820152602001612a8d565b83811115612ab4576000848401525b50505050565b6000600019821415612ace57612ace612ae9565b5060010190565b600082612ae457612ae4612aff565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6001600160a01b0381168114612b2a57600080fd5b5056fea2646970667358221220add3de11aa3edca0470d8cb49bd747619f87ce376de508f30cbf249b6a5cacab64736f6c63430008050033a2646970667358221220d18df50f8846082cedafe94cd1bfcd1d51919ac8b61af9492034fa0e47daeacf64736f6c634300080500330000000000000000000000008d335dd41c970ed83b1e57b3ba3f5832431077930000000000000000000000008d335dd41c970ed83b1e57b3ba3f583243107793
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101c45760003560e01c8063a2e74af6116100f9578063c213311e11610097578063e6a4390511610071578063e6a439051461037d578063ef7adc00146103b1578063f1f5aa74146103c6578063f46901ed146103d957600080fd5b8063c213311e1461034e578063c9c6539614610361578063d63cdaa31461037457600080fd5b8063b0e21e8a116100d3578063b0e21e8a14610305578063b4a800ce1461030e578063b8ff503814610317578063bf1d90db1461033b57600080fd5b8063a2e74af6146102d6578063a74d5f30146102e9578063ac212d2e146102f257600080fd5b8063574f2ba311610166578063671629ea11610140578063671629ea1461028a578063787dce3d1461029d578063892ffec6146102b0578063992d0ebb146102c357600080fd5b8063574f2ba3146102675780635837e5501461026f5780635855a25a1461028257600080fd5b806315067b84116101a257806315067b84146102235780631df4ccfc146102365780631e3dd18b1461023f578063471280f81461025257600080fd5b8063016a7d76146101c9578063017e7e58146101e5578063094b741514610210575b600080fd5b6101d260215481565b6040519081526020015b60405180910390f35b6022546101f8906001600160a01b031681565b6040516001600160a01b0390911681526020016101dc565b6023546101f8906001600160a01b031681565b6101d2610231366004610de1565b6103ec565b6101d260205481565b6101f861024d366004610de1565b610403565b610265610260366004610d6a565b61042d565b005b6027546101d2565b61026561027d366004610d8c565b610482565b6101d26104f1565b610265610298366004610de1565b61053b565b6102656102ab366004610de1565b6105bb565b6102656102be366004610d6a565b6105f1565b6102656102d1366004610de1565b61063d565b6102656102e4366004610d6a565b610670565b6101d261271081565b6025546101f8906001600160a01b031681565b6101d2601f5481565b6101d2601e5481565b60255461032b90600160a01b900460ff1681565b60405190151581526020016101dc565b610265610349366004610dfa565b6106bc565b6024546101f8906001600160a01b031681565b6101f861036f366004610d8c565b61074f565b6101d26103e881565b6101f861038b366004610d8c565b60266020908152600092835260408084209091529082529020546001600160a01b031681565b6103b9610a44565b6040516101dc9190610edc565b6102656103d4366004610dbf565b610b59565b6102656103e7366004610d6a565b610ba1565b600081601e81106103fc57600080fd5b0154905081565b6027818154811061041357600080fd5b6000918252602090912001546001600160a01b0316905081565b6025546001600160a01b031633146104605760405162461bcd60e51b815260040161045790610eb0565b60405180910390fd5b602480546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03828116600090815260266020908152604080832085851684529091529020541633146104c85760405162461bcd60e51b815260040161045790610eb0565b600019601e5410156104ed576001601e60008282546104e79190610f90565b90915550505b5050565b60405161050060208201610caf565b601f1982820381018352601f9091011660408190526105229190602001610e45565b6040516020818303038152906040528051906020012081565b6025546001600160a01b031633146105655760405162461bcd60e51b815260040161045790610eb0565b60648111156105b65760405162461bcd60e51b815260206004820152601960248201527f466163746f72793a2057524f4e475f50455243454e54414745000000000000006044820152606401610457565b602155565b6023546001600160a01b031633146105e55760405162461bcd60e51b815260040161045790610eb0565b6105ee81610bed565b50565b6025546001600160a01b0316331461061b5760405162461bcd60e51b815260040161045790610eb0565b602580546001600160a01b0319166001600160a01b0392909216919091179055565b6023546001600160a01b031633146106675760405162461bcd60e51b815260040161045790610eb0565b6105ee81610c7e565b6023546001600160a01b0316331461069a5760405162461bcd60e51b815260040161045790610eb0565b602380546001600160a01b0319166001600160a01b0392909216919091179055565b6023546001600160a01b031633146106e65760405162461bcd60e51b815260040161045790610eb0565b6106ef82610c7e565b6106f881610bed565b8160205414801561070a575080601f54145b6104ed5760405162461bcd60e51b8152602060048201526016602482015275466163746f72793a2043414e4e4f545f4348414e474560501b6044820152606401610457565b6000816001600160a01b0316836001600160a01b031614156107b35760405162461bcd60e51b815260206004820152601c60248201527f466163746f72793a204944454e544943414c5f414444524553534553000000006044820152606401610457565b600080836001600160a01b0316856001600160a01b0316106107d65783856107d9565b84845b90925090506001600160a01b03821661082c5760405162461bcd60e51b8152602060048201526015602482015274466163746f72793a205a45524f5f4144445245535360581b6044820152606401610457565b6001600160a01b038281166000908152602660209081526040808320858516845290915290205416156108985760405162461bcd60e51b8152602060048201526014602482015273466163746f72793a20504149525f45584953545360601b6044820152606401610457565b6000604051806020016108aa90610caf565b601f1982820381018352601f9091011660408190526bffffffffffffffffffffffff19606086811b8216602084015285901b166034820152909150600090604801604051602081830303815290604052805190602001209050808251602084016000f560405163485cc95560e01b81526001600160a01b03868116600483015285811660248301529196509086169063485cc95590604401600060405180830381600087803b15801561095c57600080fd5b505af1158015610970573d6000803e3d6000fd5b505050506001600160a01b0384811660008181526026602081815260408084208987168086529083528185208054978d166001600160a01b031998891681179091559383528185208686528352818520805488168517905560278054600181018255958190527f98a476f1687bc3d60a2da2adbcba2c46958e61fa2fb4042cd7bc5816a710195b9095018054909716841790965592548351928352908201527f0d3648bd0f6ba80134a33ba9275ac585d9d315f0ad8355cddefde31afa28d0e9910160405180910390a35050505092915050565b610a4c610cbc565b604080516105608101909152806101a081016000601e8282826020028201915b815481526020019060010190808311610a6c5750505091835250506103e8602080830191909152612710604080840191909152601e546060840152601f546080840152815460a084015260215460c08401526022546001600160a01b0390811660e085015260235481166101008501526024548116610120850152602554908116610140850152600160a01b900460ff161515610160840152516101809092019190610b19908201610caf565b601f1982820381018352601f909101166040819052610b3b9190602001610e45565b60405160208183030381529060405280519060200120815250905090565b6023546001600160a01b03163314610b835760405162461bcd60e51b815260040161045790610eb0565b60258054911515600160a01b0260ff60a01b19909216919091179055565b6023546001600160a01b03163314610bcb5760405162461bcd60e51b815260040161045790610eb0565b602280546001600160a01b0319166001600160a01b0392909216919091179055565b612710811115610c0f5760405162461bcd60e51b815260040161045790610e80565b8015610c79576000805b601e811015610c5957600081601e8110610c3557610c35610ff0565b0154831415610c475760019150610c59565b80610c5181610fbf565b915050610c19565b5080610c775760405162461bcd60e51b815260040161045790610e80565b505b601f55565b610c8b60016103e8610fa8565b811115610caa5760405162461bcd60e51b815260040161045790610e80565b602055565b612c7e8061100783390190565b604051806101a00160405280610cd0610d2f565b815260006020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e0820181905261010082018190526101208201819052610140820181905261016082018190526101809091015290565b604051806103c00160405280601e906020820280368337509192915050565b80356001600160a01b0381168114610d6557600080fd5b919050565b600060208284031215610d7c57600080fd5b610d8582610d4e565b9392505050565b60008060408385031215610d9f57600080fd5b610da883610d4e565b9150610db660208401610d4e565b90509250929050565b600060208284031215610dd157600080fd5b81358015158114610d8557600080fd5b600060208284031215610df357600080fd5b5035919050565b60008060408385031215610e0d57600080fd5b50508035926020909101359150565b8060005b601e811015610e3f578151845260209384019390910190600101610e20565b50505050565b6000825160005b81811015610e665760208186018101518583015201610e4c565b81811115610e75576000828501525b509190910192915050565b602080825260169082015275466163746f72793a20464f5242494444454e5f46454560501b604082015260600190565b6020808252601290820152712330b1ba37b93c9d102327a92124a22222a760711b604082015260600190565b600061054082019050610ef0828451610e1c565b60208301516103c083015260408301516103e08301526060830151610400830152608083015161042083015260a083015161044083015260c083015161046083015260e08301516001600160a01b0390811661048084015261010084015181166104a084015261012084015181166104c0840152610140840151166104e08301526101608301511515610500830152610180909201516105209091015290565b60008219821115610fa357610fa3610fda565b500190565b600082821015610fba57610fba610fda565b500390565b6000600019821415610fd357610fd3610fda565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fdfe60806040526001600c5534801561001557600080fd5b50604080518082018252601481527f4c69717569646974792d506f6f6c2d546f6b656e0000000000000000000000006020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527fee49096366cc590b73291b7aa9e5e091aa761dec637befae63796ffa4f337d4a818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528351808303909101815260c09091019092528151910120600355600580546001600160a01b03191633179055612b638061011b6000396000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c80636a627842116100f9578063ba9a7a5611610097578063d21220a711610071578063d21220a714610414578063d505accf14610427578063dd62ed3e1461043a578063fff6cae91461046557600080fd5b8063ba9a7a56146103e5578063bc25cf77146103ee578063c45a01551461040157600080fd5b80637ecebe00116100d35780637ecebe001461036357806389afcb441461038357806395d89b41146103ab578063a9059cbb146103d257600080fd5b80636a6278421461032757806370a082311461033a5780637464fc3d1461035a57600080fd5b806323b872dd116101665780633644e515116101405780633644e515146102f9578063485cc955146103025780635909c0d5146103155780635a3d54931461031e57600080fd5b806323b872dd146102a557806330adf81f146102b8578063313ce567146102df57600080fd5b8063022c0d9f146101ae57806306fdde03146101c35780630902f1ac1461020c578063095ea7b3146102405780630dfe16811461026357806318160ddd1461028e575b600080fd5b6101c16101bc366004612769565b61046d565b005b6101f6604051806040016040528060148152602001732634b8bab4b234ba3c96a837b7b616aa37b5b2b760611b81525081565b6040516102039190612867565b60405180910390f35b610214610b6c565b604080516001600160701b03948516815293909216602084015263ffffffff1690820152606001610203565b61025361024e366004612702565b610b96565b6040519015158152602001610203565b600654610276906001600160a01b031681565b6040516001600160a01b039091168152602001610203565b61029760005481565b604051908152602001610203565b6102536102b336600461264a565b610bad565b6102977f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b6102e7601281565b60405160ff9091168152602001610203565b61029760035481565b6101c1610310366004612611565b610c41565b61029760095481565b610297600a5481565b6102976103353660046125d7565b610cbb565b6102976103483660046125d7565b60016020526000908152604090205481565b610297600b5481565b6102976103713660046125d7565b60046020526000908152604090205481565b6103966103913660046125d7565b610f99565b60408051928352602083019190915201610203565b6101f660405180604001604052806008815260200167262816aa27a5a2a760c11b81525081565b6102536103e0366004612702565b611336565b6102976103e881565b6101c16103fc3660046125d7565b611343565b600554610276906001600160a01b031681565b600754610276906001600160a01b031681565b6101c161043536600461268b565b611466565b610297610448366004612611565b600260209081526000928352604080842090915290825290205481565b6101c1611676565b600c546001146104985760405162461bcd60e51b815260040161048f9061289a565b60405180910390fd5b6000600c55841515806104ab5750600084115b6104f75760405162461bcd60e51b815260206004820181905260248201527f506169723a20494e53554646494349454e545f4f55545055545f414d4f554e54604482015260640161048f565b600080610502610b6c565b5091509150816001600160701b0316871080156105275750806001600160701b031686105b6105735760405162461bcd60e51b815260206004820152601c60248201527f506169723a20494e53554646494349454e545f4c495155494449545900000000604482015260640161048f565b60065460075460009182916001600160a01b039182169190811690891682148015906105b15750806001600160a01b0316896001600160a01b031614155b6105f05760405162461bcd60e51b815260206004820152601060248201526f506169723a20494e56414c49445f544f60801b604482015260640161048f565b8a1561060157610601828a8d6117b8565b891561061257610612818a8c6117b8565b861561067f576040516304347a1760e21b81526001600160a01b038a16906310d1e85c9061064c9033908f908f908e908e9060040161281b565b600060405180830381600087803b15801561066657600080fd5b505af115801561067a573d6000803e3d6000fd5b505050505b6040516370a0823160e01b81523060048201526001600160a01b038316906370a082319060240160206040518083038186803b1580156106be57600080fd5b505afa1580156106d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106f69190612750565b6040516370a0823160e01b81523060048201529094506001600160a01b038216906370a082319060240160206040518083038186803b15801561073857600080fd5b505afa15801561074c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107709190612750565b92505050600089856001600160701b031661078b9190612a4e565b83116107985760006107b5565b6107ab8a6001600160701b038716612a4e565b6107b59084612a4e565b905060006107cc8a6001600160701b038716612a4e565b83116107d95760006107f6565b6107ec8a6001600160701b038716612a4e565b6107f69084612a4e565b905060008211806108075750600081115b6108535760405162461bcd60e51b815260206004820152601f60248201527f506169723a20494e53554646494349454e545f494e5055545f414d4f554e5400604482015260640161048f565b6005546040805163d63cdaa360e01b815290516000926001600160a01b03169163d63cdaa3916004808301926020929190829003018186803b15801561089857600080fd5b505afa1580156108ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d09190612750565b90506000600560009054906101000a90046001600160a01b03166001600160a01b0316631df4ccfc6040518163ffffffff1660e01b815260040160206040518083038186803b15801561092257600080fd5b505afa158015610936573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095a9190612750565b9050600061097b61096b86846118fb565b61097589866118fb565b90611962565b9050600061099661098c86856118fb565b61097589876118fb565b90506109c26109a6600286612955565b6109bc6001600160701b038d8116908d166118fb565b906118fb565b6109cc83836118fb565b1015610a045760405162461bcd60e51b8152602060048201526007602482015266506169723a204b60c81b604482015260640161048f565b50505050610a14848488886119b8565b60055460408051635a54006760e11b81529051600019926001600160a01b03169163b4a800ce916004808301926020929190829003018186803b158015610a5a57600080fd5b505afa158015610a6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a929190612750565b1015610b05576005546006546007546040516305837e5560e41b81526001600160a01b0392831660048201529082166024820152911690635837e55090604401600060405180830381600087803b158015610aec57600080fd5b505af1158015610b00573d6000803e3d6000fd5b505050505b60408051838152602081018390529081018c9052606081018b90526001600160a01b038a169033907fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229060800160405180910390a350506001600c55505050505050505050565b6008546001600160701b0380821692600160701b830490911691600160e01b900463ffffffff1690565b6000610ba3338484611b9f565b5060015b92915050565b6001600160a01b038316600090815260026020908152604080832033845290915281205460001914610c2c576001600160a01b0384166000908152600260209081526040808320338452909152902054610c079083611962565b6001600160a01b03851660009081526002602090815260408083203384529091529020555b610c37848484611c01565b5060019392505050565b6005546001600160a01b03163314610c8d5760405162461bcd60e51b815260206004820152600f60248201526e2830b4b91d102327a92124a22222a760891b604482015260640161048f565b600680546001600160a01b039384166001600160a01b03199182161790915560078054929093169116179055565b6000600c54600114610cdf5760405162461bcd60e51b815260040161048f9061289a565b6000600c81905580610cef610b6c565b506006546040516370a0823160e01b81523060048201529294509092506000916001600160a01b03909116906370a082319060240160206040518083038186803b158015610d3c57600080fd5b505afa158015610d50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d749190612750565b6007546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a082319060240160206040518083038186803b158015610dbd57600080fd5b505afa158015610dd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df59190612750565b90506000610e0c836001600160701b038716611962565b90506000610e23836001600160701b038716611962565b90506000610e318787611ca7565b60005490915080610e6857610e546103e8610975610e4f87876118fb565b612102565b9850610e6360006103e8612172565b610eaf565b610eac6001600160701b038916610e7f86846118fb565b610e8991906128fe565b6001600160701b038916610e9d86856118fb565b610ea791906128fe565b612201565b98505b60008911610f0b5760405162461bcd60e51b815260206004820152602360248201527f506169723a20494e53554646494349454e545f4c49515549444954595f4d494e60448201526215115160ea1b606482015260840161048f565b610f158a8a612172565b610f2186868a8a6119b8565b8115610f4b57600854610f47906001600160701b0380821691600160701b9004166118fb565b600b555b604080518581526020810185905233917f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f910160405180910390a250506001600c5550949695505050505050565b600080600c54600114610fbe5760405162461bcd60e51b815260040161048f9061289a565b6000600c81905580610fce610b6c565b506006546007546040516370a0823160e01b81523060048201529395509193506001600160a01b039081169291169060009083906370a082319060240160206040518083038186803b15801561102357600080fd5b505afa158015611037573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105b9190612750565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038416906370a082319060240160206040518083038186803b1580156110a057600080fd5b505afa1580156110b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d89190612750565b306000908152600160205260408120549192506110f58888611ca7565b6000549091508061110684876118fb565b61111091906128fe565b9a508061111d84866118fb565b61112791906128fe565b995060008b118015611139575060008a115b6111915760405162461bcd60e51b815260206004820152602360248201527f506169723a20494e53554646494349454e545f4c49515549444954595f42555260448201526213915160ea1b606482015260840161048f565b61119b3084612219565b6111a6878d8d6117b8565b6111b1868d8c6117b8565b6040516370a0823160e01b81523060048201526001600160a01b038816906370a082319060240160206040518083038186803b1580156111f057600080fd5b505afa158015611204573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112289190612750565b6040516370a0823160e01b81523060048201529095506001600160a01b038716906370a082319060240160206040518083038186803b15801561126a57600080fd5b505afa15801561127e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a29190612750565b93506112b085858b8b6119b8565b81156112da576008546112d6906001600160701b0380821691600160701b9004166118fb565b600b555b604080518c8152602081018c90526001600160a01b038e169133917fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496910160405180910390a35050505050505050506001600c81905550915091565b6000610ba3338484611c01565b600c546001146113655760405162461bcd60e51b815260040161048f9061289a565b6000600c556006546007546008546040516370a0823160e01b81523060048201526001600160a01b03938416939092169161140f918491869161140a916001600160701b039091169084906370a08231906024015b60206040518083038186803b1580156113d257600080fd5b505afa1580156113e6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109759190612750565b6117b8565b6008546040516370a0823160e01b815230600482015261145c918391869161140a91600160701b9091046001600160701b0316906001600160a01b038516906370a08231906024016113ba565b50506001600c5550565b428410156114a75760405162461bcd60e51b815260206004820152600e60248201526d115490cc8c0e881156141254915160921b604482015260640161048f565b6003546001600160a01b038816600090815260046020526040812080549192917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b9190876114fa83612aba565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e0016040516020818303038152906040528051906020012060405160200161157392919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa1580156115de573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906116145750886001600160a01b0316816001600160a01b0316145b6116605760405162461bcd60e51b815260206004820152601860248201527f45524332303a20494e56414c49445f5349474e41545552450000000000000000604482015260640161048f565b61166b898989611b9f565b505050505050505050565b600c546001146116985760405162461bcd60e51b815260040161048f9061289a565b6000600c556006546040516370a0823160e01b81523060048201526117b1916001600160a01b0316906370a082319060240160206040518083038186803b1580156116e257600080fd5b505afa1580156116f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171a9190612750565b6007546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561175d57600080fd5b505afa158015611771573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117959190612750565b6008546001600160701b0380821691600160701b9004166119b8565b6001600c55565b604080518082018252601981527f7472616e7366657228616464726573732c75696e74323536290000000000000060209182015281516001600160a01b0385811660248301526044808301869052845180840390910181526064909201845291810180516001600160e01b031663a9059cbb60e01b1790529151600092839287169161184491906127ff565b6000604051808303816000865af19150503d8060008114611881576040519150601f19603f3d011682016040523d82523d6000602084013e611886565b606091505b50915091508180156118b05750805115806118b05750808060200190518101906118b0919061272e565b6118f45760405162461bcd60e51b815260206004820152601560248201527414185a5c8e881514905394d1915497d19052531151605a1b604482015260640161048f565b5050505050565b600081158061191f575082826119118183612a2f565b925061191d90836128fe565b145b610ba75760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015260640161048f565b60008261196f8382612a4e565b9150811115610ba75760405162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015260640161048f565b6001600160701b0384118015906119d657506001600160701b038311155b611a135760405162461bcd60e51b815260206004820152600e60248201526d506169723a204f564552464c4f5760901b604482015260640161048f565b6000611a2464010000000042612ad5565b600854909150600090611a4490600160e01b900463ffffffff1683612a65565b905060008163ffffffff16118015611a6457506001600160701b03841615155b8015611a7857506001600160701b03831615155b15611b07578063ffffffff16611aa085611a91866122a3565b6001600160e01b0316906122bc565b6001600160e01b0316611ab39190612a2f565b60096000828254611ac491906128c0565b909155505063ffffffff8116611add84611a91876122a3565b6001600160e01b0316611af09190612a2f565b600a6000828254611b0191906128c0565b90915550505b6008805463ffffffff8416600160e01b026001600160e01b036001600160701b03898116600160701b9081026001600160e01b03199095168c83161794909417918216831794859055604080519382169282169290921783529290930490911660208201527f1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1910160405180910390a1505050505050565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316600090815260016020526040902054611c249082611962565b6001600160a01b038085166000908152600160205260408082209390935590841681522054611c5390826122d1565b6001600160a01b0380841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611bf49085815260200190565b600080600560009054906101000a90046001600160a01b03166001600160a01b031663017e7e586040518163ffffffff1660e01b815260040160206040518083038186803b158015611cf857600080fd5b505afa158015611d0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d3091906125f4565b90506000600560009054906101000a90046001600160a01b03166001600160a01b031663c213311e6040518163ffffffff1660e01b815260040160206040518083038186803b158015611d8257600080fd5b505afa158015611d96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dba91906125f4565b90506000600560009054906101000a90046001600160a01b03166001600160a01b031663016a7d766040518163ffffffff1660e01b815260040160206040518083038186803b158015611e0c57600080fd5b505afa158015611e20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e449190612750565b90506000600560009054906101000a90046001600160a01b03166001600160a01b0316631df4ccfc6040518163ffffffff1660e01b815260040160206040518083038186803b158015611e9657600080fd5b505afa158015611eaa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ece9190612750565b90506000600560009054906101000a90046001600160a01b03166001600160a01b031663b0e21e8a6040518163ffffffff1660e01b815260040160206040518083038186803b158015611f2057600080fd5b505afa158015611f34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f589190612750565b600b549091508215801590611f7557506001600160a01b03861615155b8015611f815750600082115b965086156120ea5780156120e5576000611faa610e4f6001600160701b038c8116908c166118fb565b90506000611fb783612102565b9050808211156120e2576000611fcd8383612326565b90507f556884274ae9710f4ee09c7684aca5dd4300045d7bef418f17cdfa428ca3f5208160405161200091815260200190565b60405180910390a180156120e05786158061202257506001600160a01b038816155b15612036576120318982612172565b6120e0565b60006120436064836128fe565b90506000612051828a6118fb565b9050600061205f8483611962565b90508361206c82846122d1565b11156120c85760405162461bcd60e51b815260206004820152602560248201527f506169723a20494e53554646494349454e545f50524f544f434f4c5f4c495155604482015264494449545960d81b606482015260840161048f565b6120d28c82612172565b6120dc8b83612172565b5050505b505b50505b6120f6565b80156120f6576000600b555b50505050505092915050565b60006003821115612163575080600061211c6002836128fe565b6121279060016128c0565b90505b8181101561215d5790508060028161214281866128fe565b61214c91906128c0565b61215691906128fe565b905061212a565b50919050565b811561216d575060015b919050565b60005461217f90826122d1565b60009081556001600160a01b0383168152600160205260409020546121a490826122d1565b6001600160a01b0383166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906121f59085815260200190565b60405180910390a35050565b60008183106122105781612212565b825b9392505050565b6001600160a01b03821660009081526001602052604090205461223c9082611962565b6001600160a01b038316600090815260016020526040812091909155546122639082611962565b60009081556040518281526001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016121f5565b6000610ba7600160701b6001600160701b038416612a00565b60006122126001600160701b038316846128d8565b6000826122de83826128c0565b9150811015610ba75760405162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015260640161048f565b600080831180156123375750600082115b6123775760405162461bcd60e51b8152602060048201526011602482015270506169723a20524f4f545f4b5f5a45524f60781b604482015260640161048f565b6005546040805163171fea0760e31b815290516000926001600160a01b03169163b8ff5038916004808301926020929190829003018186803b1580156123bc57600080fd5b505afa1580156123d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123f4919061272e565b90506000600560009054906101000a90046001600160a01b03166001600160a01b031663a74d5f306040518163ffffffff1660e01b815260040160206040518083038186803b15801561244657600080fd5b505afa15801561245a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247e9190612750565b90506000600560009054906101000a90046001600160a01b03166001600160a01b031663b0e21e8a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156124d057600080fd5b505afa1580156124e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125089190612750565b905060008111801561251a5750818111155b6125665760405162461bcd60e51b815260206004820152601c60248201527f506169723a20464f5242494444454e5f50524f544f434f4c5f46454500000000604482015260640161048f565b6000600161257483856128fe565b61257e9190612a4e565b9050600061259861258f8989611962565b600054906118fb565b905060006125be886125b8886125ae57856125b1565b60005b8c906118fb565b906122d1565b90506125ca81836128fe565b9998505050505050505050565b6000602082840312156125e957600080fd5b813561221281612b15565b60006020828403121561260657600080fd5b815161221281612b15565b6000806040838503121561262457600080fd5b823561262f81612b15565b9150602083013561263f81612b15565b809150509250929050565b60008060006060848603121561265f57600080fd5b833561266a81612b15565b9250602084013561267a81612b15565b929592945050506040919091013590565b600080600080600080600060e0888a0312156126a657600080fd5b87356126b181612b15565b965060208801356126c181612b15565b95506040880135945060608801359350608088013560ff811681146126e557600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561271557600080fd5b823561272081612b15565b946020939093013593505050565b60006020828403121561274057600080fd5b8151801515811461221257600080fd5b60006020828403121561276257600080fd5b5051919050565b60008060008060006080868803121561278157600080fd5b8535945060208601359350604086013561279a81612b15565b9250606086013567ffffffffffffffff808211156127b757600080fd5b818801915088601f8301126127cb57600080fd5b8135818111156127da57600080fd5b8960208285010111156127ec57600080fd5b9699959850939650602001949392505050565b60008251612811818460208701612a8a565b9190910192915050565b60018060a01b038616815284602082015283604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f909201601f19160101949350505050565b6020815260008251806020840152612886816040850160208701612a8a565b601f01601f19169190910160400192915050565b6020808252600c908201526b14ddd85c0e881313d0d2d15160a21b604082015260600190565b600082198211156128d3576128d3612ae9565b500190565b60006001600160e01b03838116806128f2576128f2612aff565b92169190910492915050565b60008261290d5761290d612aff565b500490565b600181815b8085111561294d57816000190482111561293357612933612ae9565b8085161561294057918102915b93841c9390800290612917565b509250929050565b600061221260ff84168360008261296e57506001610ba7565b8161297b57506000610ba7565b8160018114612991576002811461299b576129b7565b6001915050610ba7565b60ff8411156129ac576129ac612ae9565b50506001821b610ba7565b5060208310610133831016604e8410600b84101617156129da575081810a610ba7565b6129e48383612912565b80600019048211156129f8576129f8612ae9565b029392505050565b60006001600160e01b0382811684821681151582840482111615612a2657612a26612ae9565b02949350505050565b6000816000190483118215151615612a4957612a49612ae9565b500290565b600082821015612a6057612a60612ae9565b500390565b600063ffffffff83811690831681811015612a8257612a82612ae9565b039392505050565b60005b83811015612aa5578181015183820152602001612a8d565b83811115612ab4576000848401525b50505050565b6000600019821415612ace57612ace612ae9565b5060010190565b600082612ae457612ae4612aff565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6001600160a01b0381168114612b2a57600080fd5b5056fea2646970667358221220add3de11aa3edca0470d8cb49bd747619f87ce376de508f30cbf249b6a5cacab64736f6c63430008050033a2646970667358221220d18df50f8846082cedafe94cd1bfcd1d51919ac8b61af9492034fa0e47daeacf64736f6c63430008050033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000008d335dd41c970ed83b1e57b3ba3f5832431077930000000000000000000000008d335dd41c970ed83b1e57b3ba3f583243107793
-----Decoded View---------------
Arg [0] : _feeToSetter (address): 0x8D335dd41c970ed83b1e57B3BA3F583243107793
Arg [1] : _OnoutFeeTo (address): 0x8D335dd41c970ed83b1e57B3BA3F583243107793
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000008d335dd41c970ed83b1e57b3ba3f583243107793
Arg [1] : 0000000000000000000000008d335dd41c970ed83b1e57b3ba3f583243107793
Deployed Bytecode Sourcemap
24258:5753:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24774:36;;;;;;;;;3803:25:1;;;3791:2;3776:18;24774:36:0;;;;;;;;24817:29;;;;;-1:-1:-1;;;;;24817:29:0;;;;;;-1:-1:-1;;;;;2833:32:1;;;2815:51;;2803:2;2788:18;24817:29:0;2770:102:1;24853:35:0;;;;;-1:-1:-1;;;;;24853:35:0;;;24326:192;;;;;;:::i;:::-;;:::i;24738:29::-;;;;;;25210:34;;;;;;:::i;:::-;;:::i;27959:175::-;;;;;;:::i;:::-;;:::i;:::-;;25635:105;25717:8;:15;25635:105;;29003:227;;;;;;:::i;:::-;;:::i;25025:98::-;;;:::i;27432:289::-;;;;;;:::i;:::-;;:::i;28876:119::-;;;;;;:::i;:::-;;:::i;28142:195::-;;;;;;:::i;:::-;;:::i;28761:107::-;;;;;;:::i;:::-;;:::i;27832:119::-;;;;;;:::i;:::-;;:::i;24591:63::-;;24648:6;24591:63;;24936:38;;;;;-1:-1:-1;;;;;24936:38:0;;;24699:32;;;;;;24661:31;;;;;;24981:37;;;;;-1:-1:-1;;;24981:37:0;;;;;;;;;3630:14:1;;3623:22;3605:41;;3593:2;3578:18;24981:37:0;3560:92:1;28489:264:0;;;;;;:::i;:::-;;:::i;24895:34::-;;;;;-1:-1:-1;;;;;24895:34:0;;;26467:957;;;;;;:::i;:::-;;:::i;24525:59::-;;24579:5;24525:59;;25132:71;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25132:71:0;;;25748:711;;;:::i;:::-;;;;;;;:::i;28345:136::-;;;;;;:::i;:::-;;:::i;27729:95::-;;;;;;:::i;:::-;;:::i;24326:192::-;;;;;;;;;;;;;;;-1:-1:-1;24326:192:0;:::o;25210:34::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25210:34:0;;-1:-1:-1;25210:34:0;:::o;27959:175::-;28054:14;;-1:-1:-1;;;;;28054:14:0;28040:10;:28;28032:59;;;;-1:-1:-1;;;28032:59:0;;;;;;;:::i;:::-;;;;;;;;;28102:10;:24;;-1:-1:-1;;;;;;28102:24:0;-1:-1:-1;;;;;28102:24:0;;;;;;;;;;27959:175::o;29003:227::-;-1:-1:-1;;;;;29117:15:0;;;;;;;:7;:15;;;;;;;;:23;;;;;;;;;;;;29103:10;:37;29095:68;;;;-1:-1:-1;;;29095:68:0;;;;;;;:::i;:::-;-1:-1:-1;;29178:10:0;;:27;29174:48;;;29221:1;29207:10;;:15;;;;;;;:::i;:::-;;;;-1:-1:-1;;29174:48:0;29003:227;;:::o;25025:98::-;25098:23;;;;;;;:::i;:::-;-1:-1:-1;;25098:23:0;;;;;;;;;;;;;;;;25081:41;;25098:23;;25081:41;;:::i;:::-;;;;;;;;;;;;;25071:52;;;;;;25025:98;:::o;27432:289::-;27534:14;;-1:-1:-1;;;;;27534:14:0;27520:10;:28;27512:59;;;;-1:-1:-1;;;27512:59:0;;;;;;;:::i;:::-;27635:3;27615:16;:23;;27582:86;;;;-1:-1:-1;;;27582:86:0;;4747:2:1;27582:86:0;;;4729:21:1;4786:2;4766:18;;;4759:30;4825:27;4805:18;;;4798:55;4870:18;;27582:86:0;4719:175:1;27582:86:0;27679:15;:34;27432:289::o;28876:119::-;25307:11;;-1:-1:-1;;;;;25307:11:0;25293:10;:25;25285:56;;;;-1:-1:-1;;;25285:56:0;;;;;;;:::i;:::-;28958:29:::1;28974:12;28958:15;:29::i;:::-;28876:119:::0;:::o;28142:195::-;28247:14;;-1:-1:-1;;;;;28247:14:0;28233:10;:28;28225:59;;;;-1:-1:-1;;;28225:59:0;;;;;;;:::i;:::-;28295:14;:34;;-1:-1:-1;;;;;;28295:34:0;-1:-1:-1;;;;;28295:34:0;;;;;;;;;;28142:195::o;28761:107::-;25307:11;;-1:-1:-1;;;;;25307:11:0;25293:10;:25;25285:56;;;;-1:-1:-1;;;25285:56:0;;;;;;;:::i;:::-;28837:23:::1;28850:9;28837:12;:23::i;27832:119::-:0;25307:11;;-1:-1:-1;;;;;25307:11:0;25293:10;:25;25285:56;;;;-1:-1:-1;;;25285:56:0;;;;;;;:::i;:::-;27917:11:::1;:26:::0;;-1:-1:-1;;;;;;27917:26:0::1;-1:-1:-1::0;;;;;27917:26:0;;;::::1;::::0;;;::::1;::::0;;27832:119::o;28489:264::-;25307:11;;-1:-1:-1;;;;;25307:11:0;25293:10;:25;25285:56;;;;-1:-1:-1;;;25285:56:0;;;;;;;:::i;:::-;28584:23:::1;28597:9;28584:12;:23::i;:::-;28618:29;28634:12;28618:15;:29::i;:::-;28678:9;28666:8;;:21;:52;;;;;28706:12;28691:11;;:27;28666:52;28658:87;;;::::0;-1:-1:-1;;;28658:87:0;;5101:2:1;28658:87:0::1;::::0;::::1;5083:21:1::0;5140:2;5120:18;;;5113:30;-1:-1:-1;;;5159:18:1;;;5152:52;5221:18;;28658:87:0::1;5073:172:1::0;26467:957:0;26546:12;26589:6;-1:-1:-1;;;;;26579:16:0;:6;-1:-1:-1;;;;;26579:16:0;;;26571:57;;;;-1:-1:-1;;;26571:57:0;;4041:2:1;26571:57:0;;;4023:21:1;4080:2;4060:18;;;4053:30;4119;4099:18;;;4092:58;4167:18;;26571:57:0;4013:178:1;26571:57:0;26640:14;26656;26683:6;-1:-1:-1;;;;;26674:15:0;:6;-1:-1:-1;;;;;26674:15:0;;:53;;26712:6;26720;26674:53;;;26693:6;26701;26674:53;26639:88;;-1:-1:-1;26639:88:0;-1:-1:-1;;;;;;26746:20:0;;26738:54;;;;-1:-1:-1;;;26738:54:0;;6150:2:1;26738:54:0;;;6132:21:1;6189:2;6169:18;;;6162:30;-1:-1:-1;;;6208:18:1;;;6201:51;6269:18;;26738:54:0;6122:171:1;26738:54:0;-1:-1:-1;;;;;26811:15:0;;;26846:1;26811:15;;;:7;:15;;;;;;;;:23;;;;;;;;;;;;:37;26803:70;;;;-1:-1:-1;;;26803:70:0;;4398:2:1;26803:70:0;;;4380:21:1;4437:2;4417:18;;;4410:30;-1:-1:-1;;;4456:18:1;;;4449:50;4516:18;;26803:70:0;4370:170:1;26803:70:0;26914:21;26938:23;;;;;;;;:::i;:::-;-1:-1:-1;;26938:23:0;;;;;;;;;;;;;;;;-1:-1:-1;;2127:2:1;2123:15;;;2119:24;;26938:23:0;26997:32;;2107:37:1;2178:15;;;2174:24;2160:12;;;2153:46;26938:23:0;;-1:-1:-1;26972:12:0;;2215::1;;26997:32:0;;;;;;;;;;;;26987:43;;;;;;26972:58;;27120:4;27109:8;27103:15;27098:2;27088:8;27084:17;27081:1;27073:52;27146:47;;-1:-1:-1;;;27146:47:0;;-1:-1:-1;;;;;3107:15:1;;;27146:47:0;;;3089:34:1;3159:15;;;3139:18;;;3132:43;27065:60:0;;-1:-1:-1;27146:31:0;;;;;;3024:18:1;;27146:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;27204:15:0;;;;;;;:7;:15;;;;;;;;:23;;;;;;;;;;;;:30;;;;;-1:-1:-1;;;;;;27204:30:0;;;;;;;;27245:15;;;;;;:23;;;;;;;;:30;;;;;;;;27331:8;:19;;-1:-1:-1;27331:19:0;;;;;;;;;;;;;;;;;;;;;;27400:15;;27366:50;;3360:51:1;;;3427:18;;;3420:34;27366:50:0;;3333:18:1;27366:50:0;;;;;;;26560:864;;;;26467:957;;;;:::o;25748:711::-;25798:14;;:::i;:::-;25832:619;;;;;;;;;;;;;-1:-1:-1;25832:619:0;;-1:-1:-1;25832:619:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25832:619:0;;;-1:-1:-1;;24579:5:0;25832:619;;;;;;;;24648:6;25832:619;;;;;;;;25867:10;;25832:619;;;;25905:11;;25832:619;;;;25941:8;;25832:619;;;;25981:15;;25832:619;;;;26018:5;;-1:-1:-1;;;;;26018:5:0;;;25832:619;;;;26051:11;;;;26018:5;25832:619;;;26089:10;;;;25832:619;;;;26130:14;;;;;25832:619;;;;-1:-1:-1;;;26177:16:0;;;;25832:619;;;;;;25098:23;25832:619;;;;;25098:23;;;;;;:::i;:::-;-1:-1:-1;;25098:23:0;;;;;;;;;;;;;;;;25081:41;;25098:23;;25081:41;;:::i;:::-;;;;;;;;;;;;;25071:52;;;;;;25832:619;;;25825:626;;25748:711;:::o;28345:136::-;25307:11;;-1:-1:-1;;;;;25307:11:0;25293:10;:25;25285:56;;;;-1:-1:-1;;;25285:56:0;;;;;;;:::i;:::-;28437:16:::1;:36:::0;;;::::1;;-1:-1:-1::0;;;28437:36:0::1;-1:-1:-1::0;;;;28437:36:0;;::::1;::::0;;;::::1;::::0;;28345:136::o;27729:95::-;25307:11;;-1:-1:-1;;;;;25307:11:0;25293:10;:25;25285:56;;;;-1:-1:-1;;;25285:56:0;;;;;;;:::i;:::-;27802:5:::1;:14:::0;;-1:-1:-1;;;;;;27802:14:0::1;-1:-1:-1::0;;;;;27802:14:0;;;::::1;::::0;;;::::1;::::0;;27729:95::o;29433:575::-;24648:6;29525:12;:40;;29496:96;;;;-1:-1:-1;;;29496:96:0;;;;;;;:::i;:::-;29607:17;;29603:361;;29641:12;29672:6;29668:224;29684:32;29680:1;:36;29668:224;;;29762:25;29788:1;29762:28;;;;;;;:::i;:::-;;;29746:12;:44;29742:135;;;29825:4;29815:14;;29852:5;;29742:135;29718:3;;;;:::i;:::-;;;;29668:224;;;;29911:7;29906:46;;29920:32;;-1:-1:-1;;;29920:32:0;;;;;;;:::i;29906:46::-;29626:338;29603:361;29974:11;:26;29433:575::o;29238:187::-;29334:25;29358:1;24579:5;29334:25;:::i;:::-;29321:9;:38;;29295:91;;;;-1:-1:-1;;;29295:91:0;;;;;;;:::i;:::-;29397:8;:20;29238:187::o;-1:-1:-1:-;;;;;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:2;;;320:1;317;310:12;272:2;343:29;362:9;343:29;:::i;:::-;333:39;262:116;-1:-1:-1;;;262:116:1:o;383:260::-;451:6;459;512:2;500:9;491:7;487:23;483:32;480:2;;;528:1;525;518:12;480:2;551:29;570:9;551:29;:::i;:::-;541:39;;599:38;633:2;622:9;618:18;599:38;:::i;:::-;589:48;;470:173;;;;;:::o;648:273::-;704:6;757:2;745:9;736:7;732:23;728:32;725:2;;;773:1;770;763:12;725:2;812:9;799:23;865:5;858:13;851:21;844:5;841:32;831:2;;887:1;884;877:12;926:180;985:6;1038:2;1026:9;1017:7;1013:23;1009:32;1006:2;;;1054:1;1051;1044:12;1006:2;-1:-1:-1;1077:23:1;;996:110;-1:-1:-1;996:110:1:o;1111:248::-;1179:6;1187;1240:2;1228:9;1219:7;1215:23;1211:32;1208:2;;;1256:1;1253;1246:12;1208:2;-1:-1:-1;;1279:23:1;;;1349:2;1334:18;;;1321:32;;-1:-1:-1;1198:161:1:o;1473:326::-;1566:5;1589:1;1599:194;1613:4;1610:1;1607:11;1599:194;;;1672:13;;1660:26;;1709:4;1733:12;;;;1768:15;;;;1633:1;1626:9;1599:194;;;1603:3;;1523:276;;:::o;2238:426::-;2367:3;2405:6;2399:13;2430:1;2440:129;2454:6;2451:1;2448:13;2440:129;;;2552:4;2536:14;;;2532:25;;2526:32;2513:11;;;2506:53;2469:12;2440:129;;;2587:6;2584:1;2581:13;2578:2;;;2622:1;2613:6;2608:3;2604:16;2597:27;2578:2;-1:-1:-1;2642:16:1;;;;;2375:289;-1:-1:-1;;2375:289:1:o;5250:346::-;5452:2;5434:21;;;5491:2;5471:18;;;5464:30;-1:-1:-1;;;5525:2:1;5510:18;;5503:52;5587:2;5572:18;;5424:172::o;5601:342::-;5803:2;5785:21;;;5842:2;5822:18;;;5815:30;-1:-1:-1;;;5876:2:1;5861:18;;5854:48;5934:2;5919:18;;5775:168::o;6298:1318::-;6436:4;6478;6467:9;6463:20;6455:28;;6492:50;6532:9;6523:6;6517:13;6492:50;:::i;:::-;6600:4;6588:17;;6582:24;6573:6;6558:22;;6551:56;6665:4;6653:17;;6647:24;6638:6;6623:22;;6616:56;6730:4;6718:17;;6712:24;6703:6;6688:22;;6681:56;6795:4;6783:17;;6777:24;6768:6;6753:22;;6746:56;6860:4;6848:17;;6842:24;6833:6;6818:22;;6811:56;6925:4;6913:17;;6907:24;6898:6;6883:22;;6876:56;6979:4;6967:17;;6961:24;-1:-1:-1;;;;;1430:31:1;;;7042:6;7027:22;;1418:44;7099:6;7087:19;;7081:26;1430:31;;7166:6;7151:22;;1418:44;7223:6;7211:19;;7205:26;1430:31;;7290:6;7275:22;;1418:44;7347:6;7335:19;;7329:26;1430:31;7414:6;7399:22;;1418:44;7471:6;7459:19;;7453:26;1874:13;1867:21;7535:6;7520:22;;1855:34;7601:6;7589:19;;;7583:26;7574:6;7559:22;;;7552:58;6445:1171;:::o;7803:128::-;7843:3;7874:1;7870:6;7867:1;7864:13;7861:2;;;7880:18;;:::i;:::-;-1:-1:-1;7916:9:1;;7851:80::o;7936:125::-;7976:4;8004:1;8001;7998:8;7995:2;;;8009:18;;:::i;:::-;-1:-1:-1;8046:9:1;;7985:76::o;8066:135::-;8105:3;-1:-1:-1;;8126:17:1;;8123:2;;;8146:18;;:::i;:::-;-1:-1:-1;8193:1:1;8182:13;;8113:88::o;8206:127::-;8267:10;8262:3;8258:20;8255:1;8248:31;8298:4;8295:1;8288:15;8322:4;8319:1;8312:15;8338:127;8399:10;8394:3;8390:20;8387:1;8380:31;8430:4;8427:1;8420:15;8454:4;8451:1;8444:15
Swarm Source
ipfs://d18df50f8846082cedafe94cd1bfcd1d51919ac8b61af9492034fa0e47daeacf
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.