Contract
0x60a3bbec81a92e8894ed112a148dfcc98f577ba1
5
Contract Overview
My Name Tag:
Not Available
TokenTracker:
[ Download CSV Export ]
Latest 2 internal transactions
Parent Txn Hash | Block | From | To | Value | |||
---|---|---|---|---|---|---|---|
0xc0701a1fb49477751cb470754eaeb5170b1d652b9928b275a041c90fb359346b | 77253778 | 55 days 10 hrs ago | 0x60a3bbec81a92e8894ed112a148dfcc98f577ba1 | Contract Creation | 0 ETH | ||
0xc0701a1fb49477751cb470754eaeb5170b1d652b9928b275a041c90fb359346b | 77253778 | 55 days 10 hrs ago | 0xa36b55dbe8e83eb69c686368cf93abc8a238cc5f | Contract Creation | 0 ETH |
[ Download CSV Export ]
Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x07b4196e173520ec0d0159e309564855869b7136
Contract Name:
Pair
Compiler Version
v0.8.13+commit.abaa5c0e
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.13; import 'contracts/interfaces/IPairFactory.sol'; import 'contracts/Pair.sol'; contract PairFactory is IPairFactory { bool public isPaused; address public pauser; address public pendingPauser; address public feeManager; address public pendingFeeManager; mapping(address => mapping(address => mapping(bool => address))) public getPair; address[] public allPairs; mapping(address => bool) public isPair; // simplified check if its a pair, given that `stable` flag might not be available in peripherals address internal _temp0; address internal _temp1; bool internal _temp; event PairCreated(address indexed token0, address indexed token1, bool stable, address pair, uint); constructor() { pauser = msg.sender; isPaused = false; feeManager = msg.sender; } function allPairsLength() external view returns (uint) { return allPairs.length; } function setPauser(address _pauser) external { require(msg.sender == pauser); pendingPauser = _pauser; } function acceptPauser() external { require(msg.sender == pendingPauser); pauser = pendingPauser; } function setPause(bool _state) external { require(msg.sender == pauser); isPaused = _state; } function setFeeManager(address _feeManager) external { require(msg.sender == feeManager, 'not fee manager'); pendingFeeManager = _feeManager; } function acceptFeeManager() external { require(msg.sender == pendingFeeManager, 'not pending fee manager'); feeManager = pendingFeeManager; } function setFee(address pair, uint value) external { require(msg.sender == feeManager, "not fee manager"); Pair(pair).setFee(value); } function pairCodeHash() external pure returns (bytes32) { return keccak256(type(Pair).creationCode); } function getInitializable() external view returns (address, address, bool) { return (_temp0, _temp1, _temp); } function createPair(address tokenA, address tokenB, bool stable) external returns (address pair) { require(tokenA != tokenB, 'IA'); // Pair: IDENTICAL_ADDRESSES (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), 'ZA'); // Pair: ZERO_ADDRESS require(getPair[token0][token1][stable] == address(0), 'PE'); // Pair: PAIR_EXISTS - single check is sufficient bytes32 salt = keccak256(abi.encodePacked(token0, token1, stable)); // notice salt includes stable as well, 3 parameters (_temp0, _temp1, _temp) = (token0, token1, stable); pair = address(new Pair{salt:salt}()); getPair[token0][token1][stable] = pair; getPair[token1][token0][stable] = pair; // populate mapping in the reverse direction allPairs.push(pair); isPair[pair] = true; emit PairCreated(token0, token1, stable, pair, allPairs.length); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.13; interface IERC20 { function totalSupply() external view returns (uint256); function transfer(address recipient, uint amount) external returns (bool); function decimals() external view returns (uint8); function symbol() external view returns (string memory); function balanceOf(address) external view returns (uint); function transferFrom(address sender, address recipient, uint amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); event Transfer(address indexed from, address indexed to, uint value); event Approval(address indexed owner, address indexed spender, uint value); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.13; interface IPair { function metadata() external view returns (uint dec0, uint dec1, uint r0, uint r1, bool st, address t0, address t1); function claimFees() external returns (uint, uint); function tokens() external returns (address, address); function transferFrom(address src, address dst, uint amount) external returns (bool); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function burn(address to) external returns (uint amount0, uint amount1); function mint(address to) external returns (uint liquidity); function getReserves() external view returns (uint _reserve0, uint _reserve1, uint _blockTimestampLast); function getAmountOut(uint, address) external view returns (uint); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.13; interface IPairCallee { function hook(address sender, uint amount0, uint amount1, bytes calldata data) external; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.13; interface IPairFactory { function allPairsLength() external view returns (uint); function isPair(address pair) external view returns (bool); function pairCodeHash() external pure returns (bytes32); function getPair(address tokenA, address token, bool stable) external view returns (address); function createPair(address tokenA, address tokenB, bool stable) external returns (address pair); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.13; library Math { function max(uint a, uint b) internal pure returns (uint) { return a >= b ? a : b; } function min(uint a, uint b) internal pure returns (uint) { return a < b ? a : b; } 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; } } function cbrt(uint256 n) internal pure returns (uint256) { unchecked { uint256 x = 0; for (uint256 y = 1 << 255; y > 0; y >>= 3) { x <<= 1; uint256 z = 3 * x * (x + 1) + 1; if (n / y >= z) { n -= y * z; x += 1; } } return x; }} }
// SPDX-License-Identifier: MIT pragma solidity 0.8.13; import 'contracts/libraries/Math.sol'; import 'contracts/interfaces/IERC20.sol'; import 'contracts/interfaces/IPair.sol'; import 'contracts/interfaces/IPairCallee.sol'; import 'contracts/factories/PairFactory.sol'; import 'contracts/PairFees.sol'; // The base pair of pools, either stable or volatile contract Pair is IPair { string public name; string public symbol; uint8 public constant decimals = 18; // Used to denote stable or volatile pair, not immutable since construction happens in the initialize method for CREATE2 deterministic addresses bool public immutable stable; uint public totalSupply = 0; mapping(address => mapping (address => uint)) public allowance; mapping(address => uint) public balanceOf; bytes32 internal DOMAIN_SEPARATOR; // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); bytes32 internal constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; mapping(address => uint) public nonces; uint internal constant MINIMUM_LIQUIDITY = 10**3; uint256 public constant MAX_FEE = 100; // 1% uint internal constant FEE_STABLE = 1; // 0.01% uint internal constant FEE_VOLATILE = 5; // 0.05% uint public swapFee; address public immutable token0; address public immutable token1; address public immutable fees; address immutable factory; // Structure to capture time period obervations every 30 minutes, used for local oracles struct Observation { uint timestamp; uint reserve0Cumulative; uint reserve1Cumulative; } // Capture oracle reading every 30 minutes uint constant periodSize = 1800; Observation[] public observations; uint internal immutable decimals0; uint internal immutable decimals1; uint public reserve0; uint public reserve1; uint public blockTimestampLast; uint public reserve0CumulativeLast; uint public reserve1CumulativeLast; // index0 and index1 are used to accumulate fees, this is split out from normal trades to keep the swap "clean" // this further allows LP holders to easily claim fees for tokens they have/staked uint public index0 = 0; uint public index1 = 0; // position assigned to each LP to track their current index0 & index1 vs the global position mapping(address => uint) public supplyIndex0; mapping(address => uint) public supplyIndex1; // tracks the amount of unclaimed, but claimable tokens off of fees for token0 and token1 mapping(address => uint) public claimable0; mapping(address => uint) public claimable1; event Fees(address indexed sender, uint amount0, uint amount1); 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(uint reserve0, uint reserve1); event Claim(address indexed sender, address indexed recipient, uint amount0, uint amount1); event FeesChanged(uint newValue); event Transfer(address indexed from, address indexed to, uint amount); event Approval(address indexed owner, address indexed spender, uint amount); constructor() { factory = msg.sender; (address _token0, address _token1, bool _stable) = PairFactory(msg.sender).getInitializable(); (token0, token1, stable) = (_token0, _token1, _stable); fees = address(new PairFees(_token0, _token1)); swapFee = _stable ? FEE_STABLE : FEE_VOLATILE; if (_stable) { name = string(abi.encodePacked(IERC20(_token0).symbol(), "/", IERC20(_token1).symbol())); symbol = string(abi.encodePacked(IERC20(_token0).symbol(), "/", IERC20(_token1).symbol())); } else { name = string(abi.encodePacked(IERC20(_token0).symbol(), "/", IERC20(_token1).symbol())); symbol = string(abi.encodePacked(IERC20(_token0).symbol(), "/", IERC20(_token1).symbol())); } decimals0 = 10**IERC20(_token0).decimals(); decimals1 = 10**IERC20(_token1).decimals(); observations.push(Observation(block.timestamp, 0, 0)); } // simple re-entrancy check uint internal _unlocked = 1; modifier lock() { require(_unlocked == 1); _unlocked = 2; _; _unlocked = 1; } function setFee(uint value) external { require(msg.sender == factory, "!factory"); require(value >= MAX_FEE, "max"); swapFee = value; emit FeesChanged(value); } function observationLength() external view returns (uint) { return observations.length; } function lastObservation() public view returns (Observation memory) { return observations[observations.length-1]; } function metadata() external view returns (uint dec0, uint dec1, uint r0, uint r1, bool st, address t0, address t1) { return (decimals0, decimals1, reserve0, reserve1, stable, token0, token1); } function tokens() external view returns (address, address) { return (token0, token1); } // claim accumulated but unclaimed fees (viewable via claimable0 and claimable1) function claimFees() external returns (uint claimed0, uint claimed1) { _updateFor(msg.sender); claimed0 = claimable0[msg.sender]; claimed1 = claimable1[msg.sender]; if (claimed0 > 0 || claimed1 > 0) { claimable0[msg.sender] = 0; claimable1[msg.sender] = 0; PairFees(fees).claimFeesFor(msg.sender, claimed0, claimed1); emit Claim(msg.sender, msg.sender, claimed0, claimed1); } } // Accrue fees on token0 function _update0(uint amount) internal { _safeTransfer(token0, fees, amount); // transfer the fees out to PairFees uint256 _ratio = amount * 1e18 / totalSupply; // 1e18 adjustment is removed during claim if (_ratio > 0) { index0 += _ratio; } emit Fees(msg.sender, amount, 0); } // Accrue fees on token1 function _update1(uint amount) internal { _safeTransfer(token1, fees, amount); uint256 _ratio = amount * 1e18 / totalSupply; if (_ratio > 0) { index1 += _ratio; } emit Fees(msg.sender, 0, amount); } // this function MUST be called on any balance changes, otherwise can be used to infinitely claim fees // Fees are segregated from core funds, so fees can never put liquidity at risk function _updateFor(address recipient) internal { uint _supplied = balanceOf[recipient]; // get LP balance of `recipient` if (_supplied > 0) { uint _supplyIndex0 = supplyIndex0[recipient]; // get last adjusted index0 for recipient uint _supplyIndex1 = supplyIndex1[recipient]; uint _index0 = index0; // get global index0 for accumulated fees uint _index1 = index1; supplyIndex0[recipient] = _index0; // update user current position to global position supplyIndex1[recipient] = _index1; uint _delta0 = _index0 - _supplyIndex0; // see if there is any difference that need to be accrued uint _delta1 = _index1 - _supplyIndex1; if (_delta0 > 0) { uint _share = _supplied * _delta0 / 1e18; // add accrued difference for each supplied token claimable0[recipient] += _share; } if (_delta1 > 0) { uint _share = _supplied * _delta1 / 1e18; claimable1[recipient] += _share; } } else { supplyIndex0[recipient] = index0; // new users are set to the default global state supplyIndex1[recipient] = index1; } } function getReserves() public view returns (uint _reserve0, uint _reserve1, uint _blockTimestampLast) { _reserve0 = reserve0; _reserve1 = reserve1; _blockTimestampLast = blockTimestampLast; } // update reserves and, on the first call per block, price accumulators function _update(uint balance0, uint balance1, uint _reserve0, uint _reserve1) internal { uint blockTimestamp = block.timestamp; uint timeElapsed = blockTimestamp - blockTimestampLast; // overflow is desired if (timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0) { reserve0CumulativeLast += _reserve0 * timeElapsed; reserve1CumulativeLast += _reserve1 * timeElapsed; } Observation memory _point = lastObservation(); timeElapsed = blockTimestamp - _point.timestamp; // compare the last observation with current timestamp, if greater than 30 minutes, record a new event if (timeElapsed > periodSize) { observations.push(Observation(blockTimestamp, reserve0CumulativeLast, reserve1CumulativeLast)); } reserve0 = balance0; reserve1 = balance1; blockTimestampLast = blockTimestamp; emit Sync(reserve0, reserve1); } // produces the cumulative price using counterfactuals to save gas and avoid a call to sync. function currentCumulativePrices() public view returns (uint reserve0Cumulative, uint reserve1Cumulative, uint blockTimestamp) { blockTimestamp = block.timestamp; reserve0Cumulative = reserve0CumulativeLast; reserve1Cumulative = reserve1CumulativeLast; // if time has elapsed since the last update on the pair, mock the accumulated price values (uint _reserve0, uint _reserve1, uint _blockTimestampLast) = getReserves(); if (_blockTimestampLast != blockTimestamp) { // subtraction overflow is desired uint timeElapsed = blockTimestamp - _blockTimestampLast; reserve0Cumulative += _reserve0 * timeElapsed; reserve1Cumulative += _reserve1 * timeElapsed; } } // gives the current twap price measured from amountIn * tokenIn gives amountOut function current(address tokenIn, uint amountIn) external view returns (uint amountOut) { Observation memory _observation = lastObservation(); (uint reserve0Cumulative, uint reserve1Cumulative,) = currentCumulativePrices(); if (block.timestamp == _observation.timestamp) { _observation = observations[observations.length-2]; } uint timeElapsed = block.timestamp - _observation.timestamp; uint _reserve0 = (reserve0Cumulative - _observation.reserve0Cumulative) / timeElapsed; uint _reserve1 = (reserve1Cumulative - _observation.reserve1Cumulative) / timeElapsed; amountOut = _getAmountOut(amountIn, tokenIn, _reserve0, _reserve1); } // as per `current`, however allows user configured granularity, up to the full window size function quote(address tokenIn, uint amountIn, uint granularity) external view returns (uint amountOut) { uint [] memory _prices = sample(tokenIn, amountIn, granularity, 1); uint priceAverageCumulative; for (uint i = 0; i < _prices.length; i++) { priceAverageCumulative += _prices[i]; } return priceAverageCumulative / granularity; } // returns a memory set of twap prices function prices(address tokenIn, uint amountIn, uint points) external view returns (uint[] memory) { return sample(tokenIn, amountIn, points, 1); } function sample(address tokenIn, uint amountIn, uint points, uint window) public view returns (uint[] memory) { uint[] memory _prices = new uint[](points); uint length = observations.length-1; uint i = length - (points * window); uint nextIndex = 0; uint index = 0; for (; i < length; i+=window) { nextIndex = i + window; uint timeElapsed = observations[nextIndex].timestamp - observations[i].timestamp; uint _reserve0 = (observations[nextIndex].reserve0Cumulative - observations[i].reserve0Cumulative) / timeElapsed; uint _reserve1 = (observations[nextIndex].reserve1Cumulative - observations[i].reserve1Cumulative) / timeElapsed; _prices[index] = _getAmountOut(amountIn, tokenIn, _reserve0, _reserve1); // index < length; length cannot overflow unchecked { index = index + 1; } } return _prices; } // this low-level function should be called by addLiquidity functions in Router.sol, which performs important safety checks // standard uniswap v2 implementation function mint(address to) external lock returns (uint liquidity) { (uint _reserve0, uint _reserve1) = (reserve0, reserve1); uint _balance0 = IERC20(token0).balanceOf(address(this)); uint _balance1 = IERC20(token1).balanceOf(address(this)); uint _amount0 = _balance0 - _reserve0; uint _amount1 = _balance1 - _reserve1; uint _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee if (_totalSupply == 0) { liquidity = Math.sqrt(_amount0 * _amount1) - MINIMUM_LIQUIDITY; _mint(address(0), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens } else { liquidity = Math.min(_amount0 * _totalSupply / _reserve0, _amount1 * _totalSupply / _reserve1); } require(liquidity > 0, 'ILM'); // Pair: INSUFFICIENT_LIQUIDITY_MINTED _mint(to, liquidity); _update(_balance0, _balance1, _reserve0, _reserve1); emit Mint(msg.sender, _amount0, _amount1); } // this low-level function should be called from a contract which performs important safety checks // standard uniswap v2 implementation function burn(address to) external lock returns (uint amount0, uint amount1) { (uint _reserve0, uint _reserve1) = (reserve0, reserve1); (address _token0, address _token1) = (token0, token1); uint _balance0 = IERC20(_token0).balanceOf(address(this)); uint _balance1 = IERC20(_token1).balanceOf(address(this)); uint _liquidity = balanceOf[address(this)]; uint _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee amount0 = _liquidity * _balance0 / _totalSupply; // using balances ensures pro-rata distribution amount1 = _liquidity * _balance1 / _totalSupply; // using balances ensures pro-rata distribution require(amount0 > 0 && amount1 > 0, 'ILB'); // 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); 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(!PairFactory(factory).isPaused()); require(amount0Out > 0 || amount1Out > 0, 'IOA'); // Pair: INSUFFICIENT_OUTPUT_AMOUNT (uint _reserve0, uint _reserve1) = (reserve0, reserve1); require(amount0Out < _reserve0 && amount1Out < _reserve1, 'IL'); // Pair: INSUFFICIENT_LIQUIDITY uint _balance0; uint _balance1; { // scope for _token{0,1}, avoids stack too deep errors (address _token0, address _token1) = (token0, token1); require(to != _token0 && to != _token1, 'IT'); // 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) IPairCallee(to).hook(msg.sender, amount0Out, amount1Out, data); // callback, used for flash loans _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, 'IIA'); // Pair: INSUFFICIENT_INPUT_AMOUNT { // scope for reserve{0,1}Adjusted, avoids stack too deep errors (address _token0, address _token1) = (token0, token1); if (amount0In > 0) _update0(amount0In * swapFee / 10000); // accrue fees for token0 and move them out of pool if (amount1In > 0) _update1(amount1In * swapFee / 10000); // accrue fees for token1 and move them out of pool _balance0 = IERC20(_token0).balanceOf(address(this)); // since we removed tokens, we need to reconfirm balances, can also simply use previous balance - amountIn/ 10000, but doing balanceOf again as safety check _balance1 = IERC20(_token1).balanceOf(address(this)); // The curve, either x3y+y3x for stable pools, or x*y for volatile pools require(_k(_balance0, _balance1) >= _k(_reserve0, _reserve1), 'K'); // Pair: K } _update(_balance0, _balance1, _reserve0, _reserve1); emit Swap(msg.sender, amount0In, amount1In, amount0Out, amount1Out, to); } // force balances to match reserves function skim(address to) external lock { (address _token0, address _token1) = (token0, token1); _safeTransfer(_token0, to, IERC20(_token0).balanceOf(address(this)) - (reserve0)); _safeTransfer(_token1, to, IERC20(_token1).balanceOf(address(this)) - (reserve1)); } // force reserves to match balances function sync() external lock { _update(IERC20(token0).balanceOf(address(this)), IERC20(token1).balanceOf(address(this)), reserve0, reserve1); } function _f(uint x0, uint y) internal pure returns (uint) { return x0*(y*y/1e18*y/1e18)/1e18+(x0*x0/1e18*x0/1e18)*y/1e18; } function _d(uint x0, uint y) internal pure returns (uint) { return 3*x0*(y*y/1e18)/1e18+(x0*x0/1e18*x0/1e18); } function _get_y(uint x0, uint xy, uint y) internal pure returns (uint) { for (uint i = 0; i < 255; i++) { uint y_prev = y; uint k = _f(x0, y); if (k < xy) { uint dy = (xy - k)*1e18/_d(x0, y); y = y + dy; } else { uint dy = (k - xy)*1e18/_d(x0, y); y = y - dy; } if (y > y_prev) { if (y - y_prev <= 1) { return y; } } else { if (y_prev - y <= 1) { return y; } } } return y; } function getAmountOut(uint amountIn, address tokenIn) external view returns (uint) { (uint _reserve0, uint _reserve1) = (reserve0, reserve1); amountIn -= amountIn * swapFee / 10000; // remove fee from amount received return _getAmountOut(amountIn, tokenIn, _reserve0, _reserve1); } function _getAmountOut(uint amountIn, address tokenIn, uint _reserve0, uint _reserve1) internal view returns (uint) { if (stable) { uint xy = _k(_reserve0, _reserve1); _reserve0 = _reserve0 * 1e18 / decimals0; _reserve1 = _reserve1 * 1e18 / decimals1; (uint reserveA, uint reserveB) = tokenIn == token0 ? (_reserve0, _reserve1) : (_reserve1, _reserve0); amountIn = tokenIn == token0 ? amountIn * 1e18 / decimals0 : amountIn * 1e18 / decimals1; uint y = reserveB - _get_y(amountIn+reserveA, xy, reserveB); return y * (tokenIn == token0 ? decimals1 : decimals0) / 1e18; } else { (uint reserveA, uint reserveB) = tokenIn == token0 ? (_reserve0, _reserve1) : (_reserve1, _reserve0); return amountIn * reserveB / (reserveA + amountIn); } } function _k(uint x, uint y) internal view returns (uint) { if (stable) { uint _x = x * 1e18 / decimals0; uint _y = y * 1e18 / decimals1; uint _a = (_x * _y) / 1e18; uint _b = ((_x * _x) / 1e18 + (_y * _y) / 1e18); return _a * _b / 1e18; // x3y+y3x >= k } else { return x * y; // xy >= k } } function _mint(address dst, uint amount) internal { _updateFor(dst); // balances must be updated on mint/burn/transfer totalSupply += amount; balanceOf[dst] += amount; emit Transfer(address(0), dst, amount); } function _burn(address dst, uint amount) internal { _updateFor(dst); totalSupply -= amount; balanceOf[dst] -= amount; emit Transfer(dst, address(0), amount); } function approve(address spender, uint amount) external returns (bool) { allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external { require(deadline >= block.timestamp, 'Pair: EXPIRED'); DOMAIN_SEPARATOR = keccak256( abi.encode( keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'), keccak256(bytes(name)), keccak256(bytes('1')), block.chainid, address(this) ) ); 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, 'Pair: INVALID_SIGNATURE'); allowance[owner][spender] = value; emit Approval(owner, spender, value); } function transfer(address dst, uint amount) external returns (bool) { _transferTokens(msg.sender, dst, amount); return true; } function transferFrom(address src, address dst, uint amount) external returns (bool) { address spender = msg.sender; uint spenderAllowance = allowance[src][spender]; if (spender != src && spenderAllowance != type(uint).max) { uint newAllowance = spenderAllowance - amount; allowance[src][spender] = newAllowance; emit Approval(src, spender, newAllowance); } _transferTokens(src, dst, amount); return true; } function _transferTokens(address src, address dst, uint amount) internal { _updateFor(src); // update fee position for src _updateFor(dst); // update fee position for dst balanceOf[src] -= amount; balanceOf[dst] += amount; emit Transfer(src, dst, amount); } function _safeTransfer(address token,address to,uint256 value) internal { require(token.code.length > 0); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool)))); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.13; import 'contracts/interfaces/IERC20.sol'; // Pair Fees contract is used as a 1:1 pair relationship to split out fees, this ensures that the curve does not need to be modified for LP shares contract PairFees { address internal immutable pair; // The pair it is bonded to address internal immutable token0; // token0 of pair, saved localy and statically for gas optimization address internal immutable token1; // Token1 of pair, saved localy and statically for gas optimization constructor(address _token0, address _token1) { pair = msg.sender; token0 = _token0; token1 = _token1; } function _safeTransfer(address token,address to,uint256 value) internal { require(token.code.length > 0); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool)))); } // Allow the pair to transfer fees to users function claimFeesFor(address recipient, uint amount0, uint amount1) external { require(msg.sender == pair); if (amount0 > 0) _safeTransfer(token0, recipient, amount0); if (amount1 > 0) _safeTransfer(token1, recipient, amount1); } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Fees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"FeesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1Out","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"reserve0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reserve1","type":"uint256"}],"name":"Sync","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blockTimestampLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"burn","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimFees","outputs":[{"internalType":"uint256","name":"claimed0","type":"uint256"},{"internalType":"uint256","name":"claimed1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimable0","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimable1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"current","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentCumulativePrices","outputs":[{"internalType":"uint256","name":"reserve0Cumulative","type":"uint256"},{"internalType":"uint256","name":"reserve1Cumulative","type":"uint256"},{"internalType":"uint256","name":"blockTimestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fees","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserves","outputs":[{"internalType":"uint256","name":"_reserve0","type":"uint256"},{"internalType":"uint256","name":"_reserve1","type":"uint256"},{"internalType":"uint256","name":"_blockTimestampLast","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"index0","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"index1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastObservation","outputs":[{"components":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"reserve0Cumulative","type":"uint256"},{"internalType":"uint256","name":"reserve1Cumulative","type":"uint256"}],"internalType":"struct Pair.Observation","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadata","outputs":[{"internalType":"uint256","name":"dec0","type":"uint256"},{"internalType":"uint256","name":"dec1","type":"uint256"},{"internalType":"uint256","name":"r0","type":"uint256"},{"internalType":"uint256","name":"r1","type":"uint256"},{"internalType":"bool","name":"st","type":"bool"},{"internalType":"address","name":"t0","type":"address"},{"internalType":"address","name":"t1","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"observationLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"observations","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"reserve0Cumulative","type":"uint256"},{"internalType":"uint256","name":"reserve1Cumulative","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"points","type":"uint256"}],"name":"prices","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"granularity","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserve0","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserve0CumulativeLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserve1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserve1CumulativeLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"points","type":"uint256"},{"internalType":"uint256","name":"window","type":"uint256"}],"name":"sample","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"skim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"supplyIndex0","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"supplyIndex1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount0Out","type":"uint256"},{"internalType":"uint256","name":"amount1Out","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"swap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sync","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokens","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
61016060405260006002556000600e556000600f5560016014553480156200002657600080fd5b50336001600160a01b0316610100816001600160a01b0316815250506000806000336001600160a01b031663eb13c4cf6040518163ffffffff1660e01b8152600401606060405180830381865afa15801562000086573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000ac9190620007dc565b8015156080526001600160a01b0380831660c052831660a052604051929550909350915083908390620000df906200070b565b6001600160a01b03928316815291166020820152604001604051809103906000f08015801562000113573d6000803e3d6000fd5b506001600160a01b031660e052806200012e57600562000131565b60015b60075580156200035957826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa1580156200017a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620001a4919081019062000877565b826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015620001e3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200020d919081019062000877565b604051602001620002209291906200092f565b604051602081830303815290604052600090805190602001906200024692919062000719565b50826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000286573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620002b0919081019062000877565b826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015620002ef573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000319919081019062000877565b6040516020016200032c9291906200092f565b604051602081830303815290604052600190805190602001906200035292919062000719565b5062000572565b826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000398573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620003c2919081019062000877565b826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000401573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200042b919081019062000877565b6040516020016200043e9291906200092f565b604051602081830303815290604052600090805190602001906200046492919062000719565b50826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015620004a4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620004ce919081019062000877565b826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa1580156200050d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000537919081019062000877565b6040516020016200054a9291906200092f565b604051602081830303815290604052600190805190602001906200057092919062000719565b505b826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015620005b1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005d791906200096f565b620005e490600a62000ab0565b6101208181525050816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200062b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200065191906200096f565b6200065e90600a62000ab0565b6101405250506040805160608101825242815260006020820181815292820181815260088054600181018255925291517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee360039092029182015591517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee4830155517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee5909101555062000afd565b610370806200418983390190565b828054620007279062000ac1565b90600052602060002090601f0160209004810192826200074b576000855562000796565b82601f106200076657805160ff191683800117855562000796565b8280016001018555821562000796579182015b828111156200079657825182559160200191906001019062000779565b50620007a4929150620007a8565b5090565b5b80821115620007a45760008155600101620007a9565b80516001600160a01b0381168114620007d757600080fd5b919050565b600080600060608486031215620007f257600080fd5b620007fd84620007bf565b92506200080d60208501620007bf565b9150604084015180151581146200082357600080fd5b809150509250925092565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200086157818101518382015260200162000847565b8381111562000871576000848401525b50505050565b6000602082840312156200088a57600080fd5b81516001600160401b0380821115620008a257600080fd5b818401915084601f830112620008b757600080fd5b815181811115620008cc57620008cc6200082e565b604051601f8201601f19908116603f01168101908382118183101715620008f757620008f76200082e565b816040528281528760208487010111156200091157600080fd5b6200092483602083016020880162000844565b979650505050505050565b600083516200094381846020880162000844565b602f60f81b90830190815283516200096381600184016020880162000844565b01600101949350505050565b6000602082840312156200098257600080fd5b815160ff811681146200099457600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620009f2578160001904821115620009d657620009d66200099b565b80851615620009e457918102915b93841c9390800290620009b6565b509250929050565b60008262000a0b5750600162000aaa565b8162000a1a5750600062000aaa565b816001811462000a33576002811462000a3e5762000a5e565b600191505062000aaa565b60ff84111562000a525762000a526200099b565b50506001821b62000aaa565b5060208310610133831016604e8410600b841016171562000a83575081810a62000aaa565b62000a8f8383620009b1565b806000190482111562000aa65762000aa66200099b565b0290505b92915050565b60006200099460ff841683620009fa565b600181811c9082168062000ad657607f821691505b60208210810362000af757634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e05161010051610120516101405161352e62000c5b600039600081816104520152818161245a0152818161274401528181612806015261291101526000818161042f01528181612419015281816127050152818161284801526128eb0152600081816107fd015261134501526000818161062f01528181611c4401528181612280015261234d0152600081816104dc01528181610684015281816107590152818161093801528181610be0015281816114d9015281816116c401528181611aeb015281816120e6015261232c01526000818161031a015281816104b40152818161065f0152818161091701528181610bbf01528181611443015281816116a201528181611ac90152818161205e0152818161225f01528181612786015281816127cd015281816128b201526129550152600081816103b801528181610484015281816123f101526126d1015261352e6000f3fe608060405234801561001057600080fd5b50600436106102955760003560e01c806370a0823111610167578063bc25cf77116100ce578063d294f09311610087578063d294f0931461077b578063d505accf14610783578063dd62ed3e14610796578063ebeb31db146107c1578063f140a35a146107c9578063fff6cae9146107dc57600080fd5b8063bc25cf771461071d578063bda39cad14610730578063bf944dbc14610739578063c245febc14610742578063c5700a021461074b578063d21220a71461075457600080fd5b80639d63848a116101205780639d63848a146106515780639e8cc04b146106af5780639f767c88146106c2578063a1ac4d13146106e2578063a9059cbb14610702578063bc063e1a1461071557600080fd5b806370a08231146105905780637ecebe00146105b057806389afcb44146105d05780638a7b8cf2146105f857806395d89b41146106225780639af1d35a1461062a57600080fd5b8063252c09d71161020b578063517b3f82116101c4578063517b3f821461053257806354cf2aeb146105455780635881c4751461054e5780635a76f25e1461056157806369fe0e2d1461056a5780636a6278421461057d57600080fd5b8063252c09d7146103ed578063313ce5671461040057806332c0defd1461041a578063392f37e914610423578063443cb4bc146105095780634d5a9f8a1461051257600080fd5b806313345fe11161025d57806313345fe11461035457806318160ddd146103745780631df8c7171461038b578063205aabf11461039357806322be3de1146103b357806323b872dd146103da57600080fd5b8063022c0d9f1461029a57806306fdde03146102af5780630902f1ac146102cd578063095ea7b3146102f25780630dfe168114610315575b600080fd5b6102ad6102a8366004612fb1565b6107e4565b005b6102b7610de1565b6040516102c49190613075565b60405180910390f35b600954600a54600b545b604080519384526020840192909252908201526060016102c4565b6103056103003660046130a8565b610e6f565b60405190151581526020016102c4565b61033c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102c4565b6103676103623660046130d2565b610edc565b6040516102c4919061310b565b61037d60025481565b6040519081526020016102c4565b6102d76110d8565b61037d6103a136600461314f565b60116020526000908152604090205481565b6103057f000000000000000000000000000000000000000000000000000000000000000081565b6103056103e836600461316a565b611147565b6102d76103fb3660046131a6565b611210565b610408601281565b60405160ff90911681526020016102c4565b61037d600e5481565b600954600a54604080517f000000000000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060208201529081019290925260608201527f0000000000000000000000000000000000000000000000000000000000000000151560808201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660a08301527f00000000000000000000000000000000000000000000000000000000000000001660c082015260e0016102c4565b61037d60095481565b61037d61052036600461314f565b60126020526000908152604090205481565b61037d6105403660046130a8565b611243565b61037d60075481565b61036761055c3660046131bf565b61132b565b61037d600a5481565b6102ad6105783660046131a6565b61133a565b61037d61058b36600461314f565b61140f565b61037d61059e36600461314f565b60046020526000908152604090205481565b61037d6105be36600461314f565b60066020526000908152604090205481565b6105e36105de36600461314f565b611670565b604080519283526020830191909152016102c4565b61060061198d565b60408051825181526020808401519082015291810151908201526060016102c4565b6102b7611a0d565b61033c7f000000000000000000000000000000000000000000000000000000000000000081565b604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811682527f0000000000000000000000000000000000000000000000000000000000000000166020820152016102c4565b61037d6106bd3660046131bf565b611a1a565b61037d6106d036600461314f565b60106020526000908152604090205481565b61037d6106f036600461314f565b60136020526000908152604090205481565b6103056107103660046130a8565b611a87565b61037d606481565b6102ad61072b36600461314f565b611a9d565b61037d600f5481565b61037d600c5481565b61037d600d5481565b61037d600b5481565b61033c7f000000000000000000000000000000000000000000000000000000000000000081565b6105e3611bbb565b6102ad6107913660046131f2565b611ce2565b61037d6107a4366004613265565b600360209081526000928352604080842090915290825290205481565b60085461037d565b61037d6107d7366004613298565b611fea565b6102ad612031565b6014546001146107f357600080fd5b60026014819055507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b187bd266040518163ffffffff1660e01b8152600401602060405180830381865afa158015610859573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087d91906132bb565b1561088757600080fd5b60008511806108965750600084115b6108cd5760405162461bcd60e51b8152602060048201526003602482015262494f4160e81b60448201526064015b60405180910390fd5b600954600a5481871080156108e157508086105b6109125760405162461bcd60e51b8152602060048201526002602482015261125360f21b60448201526064016108c4565b6000807f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03898116908316148015906109855750806001600160a01b0316896001600160a01b031614155b6109b65760405162461bcd60e51b8152602060048201526002602482015261125560f21b60448201526064016108c4565b8a156109c7576109c7828a8d61216b565b89156109d8576109d8818a8c61216b565b8615610a4557604051639a7bff7960e01b81526001600160a01b038a1690639a7bff7990610a129033908f908f908e908e906004016132dd565b600060405180830381600087803b158015610a2c57600080fd5b505af1158015610a40573d6000803e3d6000fd5b505050505b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015610a89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aad9190613329565b6040516370a0823160e01b81523060048201529094506001600160a01b038216906370a0823190602401602060405180830381865afa158015610af4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b189190613329565b9250505060008985610b2a9190613358565b8311610b37576000610b4b565b610b418a86613358565b610b4b9084613358565b90506000610b598a86613358565b8311610b66576000610b7a565b610b708a86613358565b610b7a9084613358565b90506000821180610b8b5750600081115b610bbd5760405162461bcd60e51b815260206004820152600360248201526249494160e81b60448201526064016108c4565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008315610c2857610c2861271060075486610c19919061336f565b610c23919061338e565b61225a565b8215610c5157610c5161271060075485610c42919061336f565b610c4c919061338e565b612327565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015610c95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb99190613329565b6040516370a0823160e01b81523060048201529096506001600160a01b038216906370a0823190602401602060405180830381865afa158015610d00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d249190613329565b9450610d3088886123ed565b610d3a87876123ed565b1015610d6c5760405162461bcd60e51b81526020600482015260016024820152604b60f81b60448201526064016108c4565b5050610d7a84848888612539565b60408051838152602081018390529081018c9052606081018b90526001600160a01b038a169033907fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229060800160405180910390a350506001601455505050505050505050565b60008054610dee906133b0565b80601f0160208091040260200160405190810160405280929190818152602001828054610e1a906133b0565b8015610e675780601f10610e3c57610100808354040283529160200191610e67565b820191906000526020600020905b815481529060010190602001808311610e4a57829003601f168201915b505050505081565b3360008181526003602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610eca9086815260200190565b60405180910390a35060015b92915050565b606060008367ffffffffffffffff811115610ef957610ef96133e4565b604051908082528060200260200182016040528015610f22578160200160208202803683370190505b50600854909150600090610f3890600190613358565b90506000610f46858761336f565b610f509083613358565b90506000805b838310156110c857610f6887846133fa565b9150600060088481548110610f7f57610f7f613412565b90600052602060002090600302016000015460088481548110610fa457610fa4613412565b906000526020600020906003020160000154610fc09190613358565b905060008160088681548110610fd857610fd8613412565b90600052602060002090600302016001015460088681548110610ffd57610ffd613412565b9060005260206000209060030201600101546110199190613358565b611023919061338e565b90506000826008878154811061103b5761103b613412565b9060005260206000209060030201600201546008878154811061106057611060613412565b90600052602060002090600302016002015461107c9190613358565b611086919061338e565b90506110948c8e84846126cd565b8885815181106110a6576110a6613412565b60209081029190910101525050506001016110c187846133fa565b9250610f56565b509293505050505b949350505050565b600c54600d5442600080806110f6600954600a54600b549192909190565b92509250925083811461113f57600061110f8286613358565b905061111b818561336f565b61112590886133fa565b9650611131818461336f565b61113b90876133fa565b9550505b505050909192565b6001600160a01b03831660008181526003602090815260408083203380855292528220549192909190821480159061118157506000198114155b156111f75760006111928583613358565b6001600160a01b038881166000818152600360209081526040808320948916808452948252918290208590559051848152939450919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505b6112028686866129c2565b6001925050505b9392505050565b6008818154811061122057600080fd5b600091825260209091206003909102018054600182015460029092015490925083565b60008061124e61198d565b905060008061125b6110d8565b508451919350915042036112c3576008805461127990600290613358565b8154811061128957611289613412565b9060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505092505b82516000906112d29042613358565b90506000818560200151856112e79190613358565b6112f1919061338e565b90506000828660400151856113069190613358565b611310919061338e565b905061131e888a84846126cd565b9998505050505050505050565b60606110d08484846001610edc565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461139d5760405162461bcd60e51b815260206004820152600860248201526721666163746f727960c01b60448201526064016108c4565b60648110156113d45760405162461bcd60e51b81526020600482015260036024820152620dac2f60eb1b60448201526064016108c4565b60078190556040518181527f3dda580d2b9d92da338ef46ec718e7b1dd0a2c505e3df4aa8d40360192a0f8229060200160405180910390a150565b600060145460011461142057600080fd5b6002601455600954600a546040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611492573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b69190613329565b6040516370a0823160e01b81523060048201529091506000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015611520573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115449190613329565b905060006115528584613358565b905060006115608584613358565b60025490915060008190036115a2576103e861158461157f848661336f565b612a82565b61158e9190613358565b975061159d60006103e8612af2565b6115d7565b6115d4876115b0838661336f565b6115ba919061338e565b876115c5848661336f565b6115cf919061338e565b612b85565b97505b6000881161160d5760405162461bcd60e51b8152602060048201526003602482015262494c4d60e81b60448201526064016108c4565b6116178989612af2565b61162385858989612539565b604080518481526020810184905233917f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f910160405180910390a250506001601455509395945050505050565b60008060145460011461168257600080fd5b6002601455600954600a546040516370a0823160e01b81523060048201527f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000906000906001600160a01b038416906370a0823190602401602060405180830381865afa158015611718573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173c9190613329565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038416906370a0823190602401602060405180830381865afa158015611786573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117aa9190613329565b3060009081526004602052604090205460025491925090806117cc858461336f565b6117d6919061338e565b9950806117e3848461336f565b6117ed919061338e565b985060008a1180156117ff5750600089115b6118315760405162461bcd60e51b815260206004820152600360248201526224a62160e91b60448201526064016108c4565b61183b3083612b9b565b611846868c8c61216b565b611851858c8b61216b565b6040516370a0823160e01b81523060048201526001600160a01b038716906370a0823190602401602060405180830381865afa158015611895573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b99190613329565b6040516370a0823160e01b81523060048201529094506001600160a01b038616906370a0823190602401602060405180830381865afa158015611900573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119249190613329565b925061193284848a8a612539565b604080518b8152602081018b90526001600160a01b038d169133917fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496910160405180910390a350505050505050506001601481905550915091565b6119b160405180606001604052806000815260200160008152602001600081525090565b600880546119c190600190613358565b815481106119d1576119d1613412565b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905090565b60018054610dee906133b0565b600080611a2a8585856001610edc565b90506000805b8251811015611a7257828181518110611a4b57611a4b613412565b602002602001015182611a5e91906133fa565b915080611a6a81613428565b915050611a30565b50611a7d848261338e565b9695505050505050565b6000611a943384846129c2565b50600192915050565b601454600114611aac57600080fd5b60026014556009546040516370a0823160e01b81523060048201527f0000000000000000000000000000000000000000000000000000000000000000917f000000000000000000000000000000000000000000000000000000000000000091611b799184918691906001600160a01b038416906370a08231906024015b602060405180830381865afa158015611b46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6a9190613329565b611b749190613358565b61216b565b600a546040516370a0823160e01b8152306004820152611bb19183918691906001600160a01b038416906370a0823190602401611b29565b5050600160145550565b600080611bc733612c26565b50503360009081526012602090815260408083205460139092529091205481151580611bf35750600081115b15611cde573360008181526012602090815260408083208390556013909152808220919091555163299e7ae760e11b8152600481019190915260248101839052604481018290526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063533cf5ce90606401600060405180830381600087803b158015611c8857600080fd5b505af1158015611c9c573d6000803e3d6000fd5b505060408051858152602081018590523393508392507f865ca08d59f5cb456e85cd2f7ef63664ea4f73327414e9d8152c4158b0e94645910160405180910390a35b9091565b42841015611d225760405162461bcd60e51b815260206004820152600d60248201526c14185a5c8e8811561412549151609a1b60448201526064016108c4565b7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051611d529190613441565b60408051918290038220828201825260018352603160f81b6020938401528151928301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160408051601f19818403018152918152815160209283012060058190556001600160a01b038a166000908152600690935290822080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b919087611e1d83613428565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120604051602001611e9692919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015611f01573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590611f375750886001600160a01b0316816001600160a01b0316145b611f835760405162461bcd60e51b815260206004820152601760248201527f506169723a20494e56414c49445f5349474e415455524500000000000000000060448201526064016108c4565b6001600160a01b038981166000818152600360209081526040808320948d16808452948252918290208b905590518a81527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050505050505050565b600954600a54600754600092919061271090612006908761336f565b612010919061338e565b61201a9086613358565b9450612028858584846126cd565b95945050505050565b60145460011461204057600080fd5b60026014556040516370a0823160e01b8152306004820152612164907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156120ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d19190613329565b6040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015612135573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121599190613329565b600954600a54612539565b6001601455565b6000836001600160a01b03163b1161218257600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916121de91906134dc565b6000604051808303816000865af19150503d806000811461221b576040519150601f19603f3d011682016040523d82523d6000602084013e612220565b606091505b509150915081801561224a57508051158061224a57508080602001905181019061224a91906132bb565b61225357600080fd5b5050505050565b6122a57f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008361216b565b6002546000906122bd83670de0b6b3a764000061336f565b6122c7919061338e565b905080156122e75780600e60008282546122e191906133fa565b90915550505b604080518381526000602082015233917f112c256902bf554b6ed882d2936687aaeb4225e8cd5b51303c90ca6cf43a860291015b60405180910390a25050565b6123727f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008361216b565b60025460009061238a83670de0b6b3a764000061336f565b612394919061338e565b905080156123b45780600f60008282546123ae91906133fa565b90915550505b60408051600081526020810184905233917f112c256902bf554b6ed882d2936687aaeb4225e8cd5b51303c90ca6cf43a8602910161231b565b60007f0000000000000000000000000000000000000000000000000000000000000000156125285760007f000000000000000000000000000000000000000000000000000000000000000061244a85670de0b6b3a764000061336f565b612454919061338e565b905060007f000000000000000000000000000000000000000000000000000000000000000061248b85670de0b6b3a764000061336f565b612495919061338e565b90506000670de0b6b3a76400006124ac838561336f565b6124b6919061338e565b90506000670de0b6b3a76400006124cd848061336f565b6124d7919061338e565b670de0b6b3a76400006124ea868061336f565b6124f4919061338e565b6124fe91906133fa565b9050670de0b6b3a7640000612513828461336f565b61251d919061338e565b945050505050610ed6565b612532828461336f565b9050610ed6565b600b54429060009061254b9083613358565b905060008111801561255c57508315155b801561256757508215155b156125ae57612576818561336f565b600c600082825461258791906133fa565b909155506125979050818461336f565b600d60008282546125a891906133fa565b90915550505b60006125b861198d565b80519091506125c79084613358565b915061070882111561267c5760408051606081018252848152600c5460208201908152600d549282019283526008805460018101825560009190915291517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3600390930292830155517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee482015590517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee5909101555b6009879055600a869055600b83905560408051888152602081018890527fcf2aa50876cdfbb541206f89af0ee78d44a2abf8d328e37fa4917f982149848a910160405180910390a150505050505050565b60007f00000000000000000000000000000000000000000000000000000000000000001561295057600061270184846123ed565b90507f000000000000000000000000000000000000000000000000000000000000000061273685670de0b6b3a764000061336f565b612740919061338e565b93507f000000000000000000000000000000000000000000000000000000000000000061277584670de0b6b3a764000061336f565b61277f919061338e565b92506000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316876001600160a01b0316146127c45784866127c7565b85855b915091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316876001600160a01b031614612846577f000000000000000000000000000000000000000000000000000000000000000061283789670de0b6b3a764000061336f565b612841919061338e565b612883565b7f000000000000000000000000000000000000000000000000000000000000000061287989670de0b6b3a764000061336f565b612883919061338e565b9750600061289b612894848b6133fa565b8584612d86565b6128a59083613358565b9050670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316896001600160a01b03161461290f577f0000000000000000000000000000000000000000000000000000000000000000612931565b7f00000000000000000000000000000000000000000000000000000000000000005b61293b908361336f565b612945919061338e565b9450505050506110d0565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031614612993578385612996565b84845b90925090506129a587836133fa565b6129af828961336f565b6129b9919061338e565b925050506110d0565b6129cb83612c26565b6129d482612c26565b6001600160a01b038316600090815260046020526040812080548392906129fc908490613358565b90915550506001600160a01b03821660009081526004602052604081208054839290612a299084906133fa565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612a7591815260200190565b60405180910390a3505050565b60006003821115612ae35750806000612a9c60028361338e565b612aa79060016133fa565b90505b81811015612add57905080600281612ac2818661338e565b612acc91906133fa565b612ad6919061338e565b9050612aaa565b50919050565b8115612aed575060015b919050565b612afb82612c26565b8060026000828254612b0d91906133fa565b90915550506001600160a01b03821660009081526004602052604081208054839290612b3a9084906133fa565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b6000818310612b945781611209565b5090919050565b612ba482612c26565b8060026000828254612bb69190613358565b90915550506001600160a01b03821660009081526004602052604081208054839290612be3908490613358565b90915550506040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001612b79565b6001600160a01b0381166000908152600460205260409020548015612d54576001600160a01b0382166000908152601060209081526040808320805460118085529285208054600e54600f54948190559490955282905593612c888584613358565b90506000612c968584613358565b90508115612cf1576000670de0b6b3a7640000612cb3848a61336f565b612cbd919061338e565b6001600160a01b038a16600090815260126020526040812080549293508392909190612cea9084906133fa565b9091555050505b8015612d4a576000670de0b6b3a7640000612d0c838a61336f565b612d16919061338e565b6001600160a01b038a16600090815260136020526040812080549293508392909190612d439084906133fa565b9091555050505b5050505050505050565b600e546001600160a01b038316600090815260106020908152604080832093909355600f546011909152919020555050565b6000805b60ff811015612e8c57826000612da08783612e95565b905085811015612df0576000612db68887612f32565b612dc08389613358565b612dd290670de0b6b3a764000061336f565b612ddc919061338e565b9050612de881876133fa565b955050612e32565b6000612dfc8887612f32565b612e068884613358565b612e1890670de0b6b3a764000061336f565b612e22919061338e565b9050612e2e8187613358565b9550505b81851115612e5b576001612e468387613358565b11612e5657849350505050611209565b612e77565b6001612e678684613358565b11612e7757849350505050611209565b50508080612e8490613428565b915050612d8a565b50909392505050565b6000670de0b6b3a764000082818581612eae828061336f565b612eb8919061338e565b612ec2919061336f565b612ecc919061338e565b612ed6919061336f565b612ee0919061338e565b670de0b6b3a7640000808481612ef6828061336f565b612f00919061338e565b612f0a919061336f565b612f14919061338e565b612f1e908661336f565b612f28919061338e565b61120991906133fa565b6000670de0b6b3a76400008381612f49828061336f565b612f53919061338e565b612f5d919061336f565b612f67919061338e565b670de0b6b3a764000080612f7b858061336f565b612f85919061338e565b612f9086600361336f565b612f1e919061336f565b80356001600160a01b0381168114612aed57600080fd5b600080600080600060808688031215612fc957600080fd5b8535945060208601359350612fe060408701612f9a565b9250606086013567ffffffffffffffff80821115612ffd57600080fd5b818801915088601f83011261301157600080fd5b81358181111561302057600080fd5b89602082850101111561303257600080fd5b9699959850939650602001949392505050565b60005b83811015613060578181015183820152602001613048565b8381111561306f576000848401525b50505050565b6020815260008251806020840152613094816040850160208701613045565b601f01601f19169190910160400192915050565b600080604083850312156130bb57600080fd5b6130c483612f9a565b946020939093013593505050565b600080600080608085870312156130e857600080fd5b6130f185612f9a565b966020860135965060408601359560600135945092505050565b6020808252825182820181905260009190848201906040850190845b8181101561314357835183529284019291840191600101613127565b50909695505050505050565b60006020828403121561316157600080fd5b61120982612f9a565b60008060006060848603121561317f57600080fd5b61318884612f9a565b925061319660208501612f9a565b9150604084013590509250925092565b6000602082840312156131b857600080fd5b5035919050565b6000806000606084860312156131d457600080fd5b6131dd84612f9a565b95602085013595506040909401359392505050565b600080600080600080600060e0888a03121561320d57600080fd5b61321688612f9a565b965061322460208901612f9a565b95506040880135945060608801359350608088013560ff8116811461324857600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561327857600080fd5b61328183612f9a565b915061328f60208401612f9a565b90509250929050565b600080604083850312156132ab57600080fd5b8235915061328f60208401612f9a565b6000602082840312156132cd57600080fd5b8151801515811461120957600080fd5b60018060a01b038616815284602082015283604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f909201601f19160101949350505050565b60006020828403121561333b57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b60008282101561336a5761336a613342565b500390565b600081600019048311821515161561338957613389613342565b500290565b6000826133ab57634e487b7160e01b600052601260045260246000fd5b500490565b600181811c908216806133c457607f821691505b602082108103612add57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6000821982111561340d5761340d613342565b500190565b634e487b7160e01b600052603260045260246000fd5b60006001820161343a5761343a613342565b5060010190565b600080835481600182811c91508083168061345d57607f831692505b6020808410820361347c57634e487b7160e01b86526022600452602486fd5b81801561349057600181146134a1576134ce565b60ff198616895284890196506134ce565b60008a81526020902060005b868110156134c65781548b8201529085019083016134ad565b505084890196505b509498975050505050505050565b600082516134ee818460208701613045565b919091019291505056fea26469706673582212209c118d6612fae70208f02c30e337d18fef0aa4c3b972284d45b9d3ab926caf6c64736f6c634300080d003360e060405234801561001057600080fd5b5060405161037038038061037083398101604081905261002f91610066565b336080526001600160a01b0391821660a0521660c052610099565b80516001600160a01b038116811461006157600080fd5b919050565b6000806040838503121561007957600080fd5b6100828361004a565b91506100906020840161004a565b90509250929050565b60805160a05160c0516102ab6100c5600039600060b601526000608501526000605001526102ab6000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063533cf5ce14610030575b600080fd5b61004361003e3660046101d0565b610045565b005b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461007a57600080fd5b81156100ab576100ab7f000000000000000000000000000000000000000000000000000000000000000084846100e1565b80156100dc576100dc7f000000000000000000000000000000000000000000000000000000000000000084836100e1565b505050565b6000836001600160a01b03163b116100f857600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916101549190610211565b6000604051808303816000865af19150503d8060008114610191576040519150601f19603f3d011682016040523d82523d6000602084013e610196565b606091505b50915091508180156101c05750805115806101c05750808060200190518101906101c0919061024c565b6101c957600080fd5b5050505050565b6000806000606084860312156101e557600080fd5b83356001600160a01b03811681146101fc57600080fd5b95602085013595506040909401359392505050565b6000825160005b818110156102325760208186018101518583015201610218565b81811115610241576000828501525b509190910192915050565b60006020828403121561025e57600080fd5b8151801515811461026e57600080fd5b939250505056fea2646970667358221220e7d0a7a2e50c2d055850e7edaba0e8771248af579d7a68aeb22c490ba2fe968a64736f6c634300080d0033
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.