More Info
Private Name Tags
ContractCreator:
TokenTracker
Multi Chain
Multichain Addresses
4 addresses found via
Latest 25 from a total of 2,788 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Approve | 72330574 | 7 hrs ago | IN | 0 FTM | 0.00196217 | ||||
Approve | 72327159 | 8 hrs 17 mins ago | IN | 0 FTM | 0.00476676 | ||||
Approve | 72309742 | 14 hrs 24 mins ago | IN | 0 FTM | 0.00868618 | ||||
Approve | 72285436 | 22 hrs 23 mins ago | IN | 0 FTM | 0.00408139 | ||||
Approve | 72281879 | 1 day 8 mins ago | IN | 0 FTM | 0.00341095 | ||||
Approve | 72271637 | 1 day 6 hrs ago | IN | 0 FTM | 0.00622331 | ||||
Approve | 72265987 | 1 day 10 hrs ago | IN | 0 FTM | 0.00339522 | ||||
Approve | 72204348 | 2 days 4 hrs ago | IN | 0 FTM | 0.02529781 | ||||
Approve | 72025174 | 3 days 21 hrs ago | IN | 0 FTM | 0.0356501 | ||||
Approve | 72023269 | 3 days 21 hrs ago | IN | 0 FTM | 0.02322506 | ||||
Approve | 72010084 | 4 days 53 mins ago | IN | 0 FTM | 0.02241773 | ||||
Approve | 71993724 | 4 days 4 hrs ago | IN | 0 FTM | 0.00709333 | ||||
Approve | 71986372 | 4 days 6 hrs ago | IN | 0 FTM | 0.00276943 | ||||
Approve | 71983655 | 4 days 7 hrs ago | IN | 0 FTM | 0.00260297 | ||||
Approve | 71970925 | 4 days 13 hrs ago | IN | 0 FTM | 0.00417973 | ||||
Approve | 71967815 | 4 days 14 hrs ago | IN | 0 FTM | 0.00376864 | ||||
Approve | 71946418 | 4 days 20 hrs ago | IN | 0 FTM | 0.00330316 | ||||
Approve | 71917990 | 5 days 5 hrs ago | IN | 0 FTM | 0.00675049 | ||||
Approve | 71907326 | 5 days 9 hrs ago | IN | 0 FTM | 0.00453148 | ||||
Approve | 71819569 | 6 days 19 hrs ago | IN | 0 FTM | 0.00179298 | ||||
Approve | 71799922 | 7 days 5 hrs ago | IN | 0 FTM | 0.00185119 | ||||
Approve | 71743863 | 8 days 14 hrs ago | IN | 0 FTM | 0.00196797 | ||||
Approve | 71740554 | 8 days 16 hrs ago | IN | 0 FTM | 0.00217954 | ||||
Approve | 71733646 | 8 days 20 hrs ago | IN | 0 FTM | 0.00168055 | ||||
Approve | 71723388 | 9 days 4 hrs ago | IN | 0 FTM | 0.0020808 |
Latest 2 internal transactions
Parent Txn Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
41749705 | 526 days 21 hrs ago | Contract Creation | 0 FTM | |||
41749705 | 526 days 21 hrs ago | Contract Creation | 0 FTM |
Loading...
Loading
Contract Name:
BaseV1Pair
Compiler Version
v0.8.11+commit.d7f03943
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.11; interface erc20 { 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 approve(address spender, uint value) external returns (bool); } library Math { 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; } } } interface IBaseV1Callee { function hook(address sender, uint amount0, uint amount1, bytes calldata data) external; } interface IBaseV1Factory { function protocolAddresses(address _pair) external returns (address); function spiritMaker() external returns (address); function stableFee() external returns (uint256); function variableFee() external returns (uint256); } // Base V1 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 BaseV1Fees { address internal immutable factory; // Factory that created the pairs 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, address _factory) { pair = msg.sender; factory = _factory; 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(erc20.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 returns (uint256 claimed0, uint256 claimed1) { require(msg.sender == pair); uint256 counter = 4; // send 25% to protocol address if protocol address exists address protocolAddress = IBaseV1Factory(factory).protocolAddresses(pair); if (protocolAddress != address(0x0)) { if (amount0 > 0) _safeTransfer(token0, protocolAddress, amount0 / 4); if (amount1 > 0) _safeTransfer(token1, protocolAddress, amount1 / 4); counter--; } // send 25% to spiritMaker address spiritMaker = IBaseV1Factory(factory).spiritMaker(); if (spiritMaker != address(0x0)) { if (amount0 > 0) _safeTransfer(token0, spiritMaker, amount0 / 4); if (amount1 > 0) _safeTransfer(token1, spiritMaker, amount1 / 4); counter--; } claimed0 = amount0 * counter / 4; claimed1 = amount1 * counter / 4; // send the rest to owner of LP if (amount0 > 0) _safeTransfer(token0, recipient, claimed0); if (amount1 > 0) _safeTransfer(token1, recipient, claimed1); } } // The base pair of pools, either stable or volatile contract BaseV1Pair { 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; uint256 public fee; 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; 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 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) = BaseV1Factory(msg.sender).getInitializable(); (token0, token1, stable) = (_token0, _token1, _stable); fees = address(new BaseV1Fees(_token0, _token1, factory)); if (_stable) { name = string(abi.encodePacked("StableV1 AMM - ", erc20(_token0).symbol(), "/", erc20(_token1).symbol())); symbol = string(abi.encodePacked("sAMM-", erc20(_token0).symbol(), "/", erc20(_token1).symbol())); fee = IBaseV1Factory(factory).stableFee(); } else { name = string(abi.encodePacked("VolatileV1 AMM - ", erc20(_token0).symbol(), "/", erc20(_token1).symbol())); symbol = string(abi.encodePacked("vAMM-", erc20(_token0).symbol(), "/", erc20(_token1).symbol())); fee = IBaseV1Factory(factory).variableFee(); } decimals0 = 10**erc20(_token0).decimals(); decimals1 = 10**erc20(_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 updateFee() external { if (stable) { fee = IBaseV1Factory(factory).stableFee(); } else { fee = IBaseV1Factory(factory).variableFee(); } } 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); } function spiritMaker() external returns (address) { return IBaseV1Factory(factory).spiritMaker(); } function protocol() external returns (address) { return IBaseV1Factory(factory).protocolAddresses(address(this)); } // 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; (claimed0, claimed1) = BaseV1Fees(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 BaseV1Fees 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 = index + 1; } return _prices; } // this low-level function should be called from a contract 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 = erc20(token0).balanceOf(address(this)); uint _balance1 = erc20(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'); // BaseV1: 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 = erc20(_token0).balanceOf(address(this)); uint _balance1 = erc20(_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'); // BaseV1: INSUFFICIENT_LIQUIDITY_BURNED _burn(address(this), _liquidity); _safeTransfer(_token0, to, amount0); _safeTransfer(_token1, to, amount1); _balance0 = erc20(_token0).balanceOf(address(this)); _balance1 = erc20(_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(!BaseV1Factory(factory).isPaused()); require(amount0Out > 0 || amount1Out > 0, 'IOA'); // BaseV1: INSUFFICIENT_OUTPUT_AMOUNT (uint _reserve0, uint _reserve1) = (reserve0, reserve1); require(amount0Out < _reserve0 && amount1Out < _reserve1, 'IL'); // BaseV1: 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'); // BaseV1: 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) IBaseV1Callee(to).hook(msg.sender, amount0Out, amount1Out, data); // callback, used for flash loans _balance0 = erc20(_token0).balanceOf(address(this)); _balance1 = erc20(_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'); // BaseV1: 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 / fee); // accrue fees for token0 and move them out of pool if (amount1In > 0) _update1(amount1In / fee); // accrue fees for token1 and move them out of pool _balance0 = erc20(_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 = erc20(_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'); // BaseV1: 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, erc20(_token0).balanceOf(address(this)) - (reserve0)); _safeTransfer(_token1, to, erc20(_token1).balanceOf(address(this)) - (reserve1)); } // force reserves to match balances function sync() external lock { _update(erc20(token0).balanceOf(address(this)), erc20(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 / fee; // 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, 'BaseV1: EXPIRED'); DOMAIN_SEPARATOR = keccak256( abi.encode( keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'), keccak256(bytes(name)), keccak256('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, 'BaseV1: 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(erc20.transfer.selector, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool)))); } } contract BaseV1Factory { bool public isPaused; address public owner; address public pendingOwner; address public admin; uint256 public stableFee = 2000; uint256 public variableFee = 500; 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; mapping(address => address) public protocolAddresses; // pair => protocolAddress address public spiritMaker; event PairCreated(address indexed token0, address indexed token1, bool stable, address pair, uint); constructor() { owner = msg.sender; isPaused = false; } function setStableFee(uint256 _fee) external { require(msg.sender == owner); require(_fee >= 100 && _fee <= 10000, "!range"); stableFee = _fee; } function setVariableFee(uint256 _fee) external { require(msg.sender == owner); require(_fee >= 100 && _fee <= 10000, "!range"); variableFee = _fee; } function allPairsLength() external view returns (uint) { return allPairs.length; } function setOwner(address _owner) external { require(msg.sender == owner); pendingOwner = _owner; } function setAdmin(address _admin) external { require(msg.sender == owner || msg.sender == admin); admin = _admin; } function acceptOwner() external { require(msg.sender == pendingOwner); owner = pendingOwner; } function setPause(bool _state) external { require(msg.sender == owner); isPaused = _state; } function setProtocolAddress(address _pair, address _protocolAddress) external { require (msg.sender == owner || msg.sender == admin || msg.sender == protocolAddresses[_pair]); protocolAddresses[_pair] = _protocolAddress; } function setSpiritMaker(address _spiritMaker) external { require (msg.sender == owner); spiritMaker = _spiritMaker; } function pairCodeHash() external pure returns (bytes32) { return keccak256(type(BaseV1Pair).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'); // BaseV1: IDENTICAL_ADDRESSES (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), 'ZA'); // BaseV1: ZERO_ADDRESS require(getPair[token0][token1][stable] == address(0), 'PE'); // BaseV1: 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 BaseV1Pair{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); } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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":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":[{"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":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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 BaseV1Pair.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":[],"name":"protocol","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","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":"address","name":"to","type":"address"}],"name":"skim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"spiritMaker","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"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"},{"inputs":[],"name":"updateFee","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
61016060405260006003556000600e556000600f5560016014553480156200002657600080fd5b50336001600160a01b0316610100816001600160a01b0316815250506000806000336001600160a01b031663eb13c4cf6040518163ffffffff1660e01b8152600401606060405180830381865afa15801562000086573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000ac9190620008b0565b8015156080526001600160a01b0380831660c052831660a0526101005160405193965091945092508491849190620000e490620007df565b6001600160a01b03938416815291831660208301529091166040820152606001604051809103906000f08015801562000121573d6000803e3d6000fd5b506001600160a01b031660e0528015620003c057826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000174573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200019e91908101906200094b565b826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015620001dd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200020791908101906200094b565b6040516020016200021a92919062000a03565b6040516020818303038152906040526000908051906020019062000240929190620007ed565b50826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000280573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620002aa91908101906200094b565b826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015620002e9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200031391908101906200094b565b6040516020016200032692919062000a5e565b604051602081830303815290604052600190805190602001906200034c929190620007ed565b50610100516001600160a01b03166340bbd7756040518163ffffffff1660e01b81526004016020604051808303816000875af115801562000391573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003b7919062000aaf565b60025562000646565b826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015620003ff573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200042991908101906200094b565b826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000468573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200049291908101906200094b565b604051602001620004a592919062000ac9565b60405160208183030381529060405260009080519060200190620004cb929190620007ed565b50826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa1580156200050b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200053591908101906200094b565b826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000574573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200059e91908101906200094b565b604051602001620005b192919062000b26565b60405160208183030381529060405260019080519060200190620005d7929190620007ed565b50610100516001600160a01b031663f11ee8456040518163ffffffff1660e01b81526004016020604051808303816000875af11580156200061c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000642919062000aaf565b6002555b826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000685573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620006ab919062000b48565b620006b890600a62000c89565b6101208181525050816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015620006ff573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000725919062000b48565b6200073290600a62000c89565b6101405250506040805160608101825242815260006020820181815292820181815260088054600181018255925291517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee360039092029182015591517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee4830155517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee5909101555062000cd7565b6106f680620044f983390190565b828054620007fb9062000c9a565b90600052602060002090601f0160209004810192826200081f57600085556200086a565b82601f106200083a57805160ff19168380011785556200086a565b828001600101855582156200086a579182015b828111156200086a5782518255916020019190600101906200084d565b50620008789291506200087c565b5090565b5b808211156200087857600081556001016200087d565b80516001600160a01b0381168114620008ab57600080fd5b919050565b600080600060608486031215620008c657600080fd5b620008d18462000893565b9250620008e16020850162000893565b915060408401518015158114620008f757600080fd5b809150509250925092565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620009355781810151838201526020016200091b565b8381111562000945576000848401525b50505050565b6000602082840312156200095e57600080fd5b81516001600160401b03808211156200097657600080fd5b818401915084601f8301126200098b57600080fd5b815181811115620009a057620009a062000902565b604051601f8201601f19908116603f01168101908382118183101715620009cb57620009cb62000902565b81604052828152876020848701011115620009e557600080fd5b620009f883602083016020880162000918565b979650505050505050565b6e029ba30b13632ab189020a6a690169608d1b81526000835162000a2f81600f85016020880162000918565b602f60f81b600f91840191820152835162000a5281601084016020880162000918565b01601001949350505050565b6473414d4d2d60d81b81526000835162000a8081600585016020880162000918565b602f60f81b600591840191820152835162000aa381600684016020880162000918565b01600601949350505050565b60006020828403121562000ac257600080fd5b5051919050565b7002b37b630ba34b632ab189020a6a690169607d1b81526000835162000af781601185016020880162000918565b602f60f81b601191840191820152835162000b1a81601284016020880162000918565b01601201949350505050565b6476414d4d2d60d81b81526000835162000a8081600585016020880162000918565b60006020828403121562000b5b57600080fd5b815160ff8116811462000b6d57600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000bcb57816000190482111562000baf5762000baf62000b74565b8085161562000bbd57918102915b93841c939080029062000b8f565b509250929050565b60008262000be45750600162000c83565b8162000bf35750600062000c83565b816001811462000c0c576002811462000c175762000c37565b600191505062000c83565b60ff84111562000c2b5762000c2b62000b74565b50506001821b62000c83565b5060208310610133831016604e8410600b841016171562000c5c575081810a62000c83565b62000c68838362000b8a565b806000190482111562000c7f5762000c7f62000b74565b0290505b92915050565b600062000b6d60ff84168362000bd3565b600181811c9082168062000caf57607f821691505b6020821081141562000cd157634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e0516101005161012051610140516136a862000e5160003960008181610465015281816125730152818161285d0152818161291f0152612a2a015260008181610442015281816125320152818161281e015281816129610152612a04015260008181610805015281816110d601528181611645015281816116ce0152611ae001526000818161063601528181611d680152818161239901526124660152600081816104ef0152818161068b015281816107580152818161094001528181610be80152818161148a0152818161178001528181611c0f015281816121ff0152612445015260008181610325015281816104c7015281816106660152818161091f01528181610bc7015281816113f40152818161175e01528181611bed01528181612177015281816123780152818161289f015281816128e6015281816129cb0152612a6e0152600081816103cb015281816104970152818161161f0152818161250a01526127ea01526136a86000f3fe608060405234801561001057600080fd5b50600436106102a05760003560e01c80637ecebe0011610167578063bda39cad116100ce578063d505accf11610087578063d505accf14610782578063dd62ed3e14610795578063ddca3f43146107c0578063ebeb31db146107c9578063f140a35a146107d1578063fff6cae9146107e457600080fd5b8063bda39cad1461072f578063bf944dbc14610738578063c245febc14610741578063c5700a021461074a578063d21220a714610753578063d294f0931461077a57600080fd5b80639d63848a116101205780639d63848a146106585780639e8cc04b146106b65780639f767c88146106c9578063a1ac4d13146106e9578063a9059cbb14610709578063bc25cf771461071c57600080fd5b80637ecebe00146105af57806389afcb44146105cf5780638a7b8cf2146105f75780638ce744261461062157806395d89b41146106295780639af1d35a1461063157600080fd5b8063252c09d71161020b578063517b3f82116101c4578063517b3f82146105455780635881c475146105585780635a76f25e1461056b5780636a6278421461057457806370a0823114610587578063758cdcf0146105a757600080fd5b8063252c09d714610400578063313ce5671461041357806332c0defd1461042d578063392f37e914610436578063443cb4bc1461051c5780634d5a9f8a1461052557600080fd5b8063149f2b271161025d578063149f2b271461037f57806318160ddd146103875780631df8c7171461039e578063205aabf1146103a657806322be3de1146103c657806323b872dd146103ed57600080fd5b8063022c0d9f146102a557806306fdde03146102ba5780630902f1ac146102d8578063095ea7b3146102fd5780630dfe16811461032057806313345fe11461035f575b600080fd5b6102b86102b33660046130cb565b6107ec565b005b6102c2610dcf565b6040516102cf9190613191565b60405180910390f35b600954600a54600b545b604080519384526020840192909252908201526060016102cf565b61031061030b3660046131c4565b610e5d565b60405190151581526020016102cf565b6103477f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102cf565b61037261036d3660046131f0565b610eca565b6040516102cf919061322b565b6103476110d2565b61039060035481565b6040519081526020016102cf565b6102e261115d565b6103906103b436600461326f565b60116020526000908152604090205481565b6103107f000000000000000000000000000000000000000000000000000000000000000081565b6103106103fb36600461328c565b6111cc565b6102e261040e3660046132cd565b611295565b61041b601281565b60405160ff90911681526020016102cf565b610390600e5481565b600954600a54604080517f000000000000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060208201529081019290925260608201527f0000000000000000000000000000000000000000000000000000000000000000151560808201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660a08301527f00000000000000000000000000000000000000000000000000000000000000001660c082015260e0016102cf565b61039060095481565b61039061053336600461326f565b60126020526000908152604090205481565b6103906105533660046131c4565b6112c8565b6103726105663660046132e6565b6113b1565b610390600a5481565b61039061058236600461326f565b6113c0565b61039061059536600461326f565b60056020526000908152604090205481565b6102b861161d565b6103906105bd36600461326f565b60076020526000908152604090205481565b6105e26105dd36600461326f565b61172c565b604080519283526020830191909152016102cf565b6105ff611a49565b60408051825181526020808401519082015291810151908201526060016102cf565b610347611ac9565b6102c2611b31565b6103477f000000000000000000000000000000000000000000000000000000000000000081565b604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811682527f0000000000000000000000000000000000000000000000000000000000000000166020820152016102cf565b6103906106c43660046132e6565b611b3e565b6103906106d736600461326f565b60106020526000908152604090205481565b6103906106f736600461326f565b60136020526000908152604090205481565b6103106107173660046131c4565b611bab565b6102b861072a36600461326f565b611bc1565b610390600f5481565b610390600c5481565b610390600d5481565b610390600b5481565b6103477f000000000000000000000000000000000000000000000000000000000000000081565b6105e2611cdf565b6102b861079036600461331b565b611e1c565b6103906107a3366004613392565b600460209081526000928352604080842090915290825290205481565b61039060025481565b600854610390565b6103906107df3660046133cb565b612111565b6102b861214a565b6014546001146107fb57600080fd5b60026014819055507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b187bd266040518163ffffffff1660e01b8152600401602060405180830381865afa158015610861573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088591906133f0565b1561088f57600080fd5b600085118061089e5750600084115b6108d55760405162461bcd60e51b8152602060048201526003602482015262494f4160e81b60448201526064015b60405180910390fd5b600954600a5481871080156108e957508086105b61091a5760405162461bcd60e51b8152602060048201526002602482015261125360f21b60448201526064016108cc565b6000807f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b038981169083161480159061098d5750806001600160a01b0316896001600160a01b031614155b6109be5760405162461bcd60e51b8152602060048201526002602482015261125560f21b60448201526064016108cc565b8a156109cf576109cf828a8d612284565b89156109e0576109e0818a8c612284565b8615610a4d57604051639a7bff7960e01b81526001600160a01b038a1690639a7bff7990610a1a9033908f908f908e908e90600401613412565b600060405180830381600087803b158015610a3457600080fd5b505af1158015610a48573d6000803e3d6000fd5b505050505b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015610a91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab5919061345e565b6040516370a0823160e01b81523060048201529094506001600160a01b038216906370a0823190602401602060405180830381865afa158015610afc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b20919061345e565b9250505060008985610b32919061348d565b8311610b3f576000610b53565b610b498a8661348d565b610b53908461348d565b90506000610b618a8661348d565b8311610b6e576000610b82565b610b788a8661348d565b610b82908461348d565b90506000821180610b935750600081115b610bc55760405162461bcd60e51b815260206004820152600360248201526249494160e81b60448201526064016108cc565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008315610c2357610c2360025485610c1e91906134a4565b612373565b8215610c3f57610c3f60025484610c3a91906134a4565b612440565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015610c83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca7919061345e565b6040516370a0823160e01b81523060048201529096506001600160a01b038216906370a0823190602401602060405180830381865afa158015610cee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d12919061345e565b9450610d1e8888612506565b610d288787612506565b1015610d5a5760405162461bcd60e51b81526020600482015260016024820152604b60f81b60448201526064016108cc565b5050610d6884848888612652565b60408051838152602081018390529081018c9052606081018b90526001600160a01b038a169033907fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229060800160405180910390a350506001601455505050505050505050565b60008054610ddc906134c6565b80601f0160208091040260200160405190810160405280929190818152602001828054610e08906134c6565b8015610e555780601f10610e2a57610100808354040283529160200191610e55565b820191906000526020600020905b815481529060010190602001808311610e3857829003601f168201915b505050505081565b3360008181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610eb89086815260200190565b60405180910390a35060015b92915050565b606060008367ffffffffffffffff811115610ee757610ee76134fb565b604051908082528060200260200182016040528015610f10578160200160208202803683370190505b50600854909150600090610f269060019061348d565b90506000610f348587613511565b610f3e908361348d565b90506000805b838310156110c257610f568784613530565b9150600060088481548110610f6d57610f6d613548565b90600052602060002090600302016000015460088481548110610f9257610f92613548565b906000526020600020906003020160000154610fae919061348d565b905060008160088681548110610fc657610fc6613548565b90600052602060002090600302016001015460088681548110610feb57610feb613548565b906000526020600020906003020160010154611007919061348d565b61101191906134a4565b90506000826008878154811061102957611029613548565b9060005260206000209060030201600201546008878154811061104e5761104e613548565b90600052602060002090600302016002015461106a919061348d565b61107491906134a4565b90506110828c8e84846127e6565b88858151811061109457611094613548565b60209081029190910101526110aa846001613530565b935050505086836110bb9190613530565b9250610f44565b509293505050505b949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663149f2b276040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611134573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611158919061355e565b905090565b600c54600d54426000808061117b600954600a54600b549192909190565b9250925092508381146111c4576000611194828661348d565b90506111a08185613511565b6111aa9088613530565b96506111b68184613511565b6111c09087613530565b9550505b505050909192565b6001600160a01b03831660008181526004602090815260408083203380855292528220549192909190821480159061120657506000198114155b1561127c576000611217858361348d565b6001600160a01b038881166000818152600460209081526040808320948916808452948252918290208590559051848152939450919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505b611287868686612adb565b6001925050505b9392505050565b600881815481106112a557600080fd5b600091825260209091206003909102018054600182015460029092015490925083565b6000806112d3611a49565b90506000806112e061115d565b508451919350915042141561134957600880546112ff9060029061348d565b8154811061130f5761130f613548565b9060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505092505b8251600090611358904261348d565b905060008185602001518561136d919061348d565b61137791906134a4565b905060008286604001518561138c919061348d565b61139691906134a4565b90506113a4888a84846127e6565b9998505050505050505050565b60606110ca8484846001610eca565b60006014546001146113d157600080fd5b6002601455600954600a546040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611443573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611467919061345e565b6040516370a0823160e01b81523060048201529091506000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156114d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f5919061345e565b90506000611503858461348d565b90506000611511858461348d565b6003549091508061154f576103e861153161152c8486613511565b612b9b565b61153b919061348d565b975061154a60006103e8612c0b565b611584565b6115818761155d8386613511565b61156791906134a4565b876115728486613511565b61157c91906134a4565b612c9e565b97505b600088116115ba5760405162461bcd60e51b8152602060048201526003602482015262494c4d60e81b60448201526064016108cc565b6115c48989612c0b565b6115d085858989612652565b604080518481526020810184905233917f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f910160405180910390a250506001601455509395945050505050565b7f0000000000000000000000000000000000000000000000000000000000000000156116cc577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166340bbd7756040518163ffffffff1660e01b81526004016020604051808303816000875af11580156116a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116c7919061345e565b600255565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f11ee8456040518163ffffffff1660e01b81526004016020604051808303816000875af11580156116a3573d6000803e3d6000fd5b60008060145460011461173e57600080fd5b6002601455600954600a546040516370a0823160e01b81523060048201527f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000906000906001600160a01b038416906370a0823190602401602060405180830381865afa1580156117d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f8919061345e565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038416906370a0823190602401602060405180830381865afa158015611842573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611866919061345e565b3060009081526005602052604090205460035491925090806118888584613511565b61189291906134a4565b99508061189f8484613511565b6118a991906134a4565b985060008a1180156118bb5750600089115b6118ed5760405162461bcd60e51b815260206004820152600360248201526224a62160e91b60448201526064016108cc565b6118f73083612cb4565b611902868c8c612284565b61190d858c8b612284565b6040516370a0823160e01b81523060048201526001600160a01b038716906370a0823190602401602060405180830381865afa158015611951573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611975919061345e565b6040516370a0823160e01b81523060048201529094506001600160a01b038616906370a0823190602401602060405180830381865afa1580156119bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e0919061345e565b92506119ee84848a8a612652565b604080518b8152602081018b90526001600160a01b038d169133917fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496910160405180910390a350505050505050506001601481905550915091565b611a6d60405180606001604052806000815260200160008152602001600081525090565b60088054611a7d9060019061348d565b81548110611a8d57611a8d613548565b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905090565b60405162a9652960e61b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632a594a40906024016020604051808303816000875af1158015611134573d6000803e3d6000fd5b60018054610ddc906134c6565b600080611b4e8585856001610eca565b90506000805b8251811015611b9657828181518110611b6f57611b6f613548565b602002602001015182611b829190613530565b915080611b8e8161357b565b915050611b54565b50611ba184826134a4565b9695505050505050565b6000611bb8338484612adb565b50600192915050565b601454600114611bd057600080fd5b60026014556009546040516370a0823160e01b81523060048201527f0000000000000000000000000000000000000000000000000000000000000000917f000000000000000000000000000000000000000000000000000000000000000091611c9d9184918691906001600160a01b038416906370a08231906024015b602060405180830381865afa158015611c6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8e919061345e565b611c98919061348d565b612284565b600a546040516370a0823160e01b8152306004820152611cd59183918691906001600160a01b038416906370a0823190602401611c4d565b5050600160145550565b600080611ceb33612d3f565b50503360009081526012602090815260408083205460139092529091205481151580611d175750600081115b15611e18573360008181526012602090815260408083208390556013909152808220919091555163299e7ae760e11b8152600481019190915260248101839052604481018290526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063533cf5ce9060640160408051808303816000875af1158015611db0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dd49190613596565b6040805183815260208101839052929450909250339182917f865ca08d59f5cb456e85cd2f7ef63664ea4f73327414e9d8152c4158b0e94645910160405180910390a35b9091565b42841015611e5e5760405162461bcd60e51b815260206004820152600f60248201526e10985cd9558c4e8811561412549151608a1b60448201526064016108cc565b7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051611e8e91906135ba565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160408051601f19818403018152918152815160209283012060068190556001600160a01b038a166000908152600790935290822080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b919087611f448361357b565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120604051602001611fbd92919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015612028573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381161580159061205e5750886001600160a01b0316816001600160a01b0316145b6120aa5760405162461bcd60e51b815260206004820152601960248201527f4261736556313a20494e56414c49445f5349474e41545552450000000000000060448201526064016108cc565b6001600160a01b038981166000818152600460209081526040808320948d16808452948252918290208b905590518a81527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050505050505050565b600954600a54600254600092919061212990866134a4565b612133908661348d565b9450612141858584846127e6565b95945050505050565b60145460011461215957600080fd5b60026014556040516370a0823160e01b815230600482015261227d907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156121c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ea919061345e565b6040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561224e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612272919061345e565b600954600a54612652565b6001601455565b6000836001600160a01b03163b1161229b57600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916122f79190613656565b6000604051808303816000865af19150503d8060008114612334576040519150601f19603f3d011682016040523d82523d6000602084013e612339565b606091505b509150915081801561236357508051158061236357508080602001905181019061236391906133f0565b61236c57600080fd5b5050505050565b6123be7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000083612284565b6003546000906123d683670de0b6b3a7640000613511565b6123e091906134a4565b905080156124005780600e60008282546123fa9190613530565b90915550505b604080518381526000602082015233917f112c256902bf554b6ed882d2936687aaeb4225e8cd5b51303c90ca6cf43a860291015b60405180910390a25050565b61248b7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000083612284565b6003546000906124a383670de0b6b3a7640000613511565b6124ad91906134a4565b905080156124cd5780600f60008282546124c79190613530565b90915550505b60408051600081526020810184905233917f112c256902bf554b6ed882d2936687aaeb4225e8cd5b51303c90ca6cf43a86029101612434565b60007f0000000000000000000000000000000000000000000000000000000000000000156126415760007f000000000000000000000000000000000000000000000000000000000000000061256385670de0b6b3a7640000613511565b61256d91906134a4565b905060007f00000000000000000000000000000000000000000000000000000000000000006125a485670de0b6b3a7640000613511565b6125ae91906134a4565b90506000670de0b6b3a76400006125c58385613511565b6125cf91906134a4565b90506000670de0b6b3a76400006125e68480613511565b6125f091906134a4565b670de0b6b3a76400006126038680613511565b61260d91906134a4565b6126179190613530565b9050670de0b6b3a764000061262c8284613511565b61263691906134a4565b945050505050610ec4565b61264b8284613511565b9050610ec4565b600b544290600090612664908361348d565b905060008111801561267557508315155b801561268057508215155b156126c75761268f8185613511565b600c60008282546126a09190613530565b909155506126b090508184613511565b600d60008282546126c19190613530565b90915550505b60006126d1611a49565b80519091506126e0908461348d565b91506107088211156127955760408051606081018252848152600c5460208201908152600d549282019283526008805460018101825560009190915291517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3600390930292830155517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee482015590517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee5909101555b6009879055600a869055600b83905560408051888152602081018890527fcf2aa50876cdfbb541206f89af0ee78d44a2abf8d328e37fa4917f982149848a910160405180910390a150505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000015612a6957600061281a8484612506565b90507f000000000000000000000000000000000000000000000000000000000000000061284f85670de0b6b3a7640000613511565b61285991906134a4565b93507f000000000000000000000000000000000000000000000000000000000000000061288e84670de0b6b3a7640000613511565b61289891906134a4565b92506000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316876001600160a01b0316146128dd5784866128e0565b85855b915091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316876001600160a01b03161461295f577f000000000000000000000000000000000000000000000000000000000000000061295089670de0b6b3a7640000613511565b61295a91906134a4565b61299c565b7f000000000000000000000000000000000000000000000000000000000000000061299289670de0b6b3a7640000613511565b61299c91906134a4565b975060006129b46129ad848b613530565b8584612e9f565b6129be908361348d565b9050670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316896001600160a01b031614612a28577f0000000000000000000000000000000000000000000000000000000000000000612a4a565b7f00000000000000000000000000000000000000000000000000000000000000005b612a549083613511565b612a5e91906134a4565b9450505050506110ca565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031614612aac578385612aaf565b84845b9092509050612abe8783613530565b612ac88289613511565b612ad291906134a4565b925050506110ca565b612ae483612d3f565b612aed82612d3f565b6001600160a01b03831660009081526005602052604081208054839290612b1590849061348d565b90915550506001600160a01b03821660009081526005602052604081208054839290612b42908490613530565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612b8e91815260200190565b60405180910390a3505050565b60006003821115612bfc5750806000612bb56002836134a4565b612bc0906001613530565b90505b81811015612bf657905080600281612bdb81866134a4565b612be59190613530565b612bef91906134a4565b9050612bc3565b50919050565b8115612c06575060015b919050565b612c1482612d3f565b8060036000828254612c269190613530565b90915550506001600160a01b03821660009081526005602052604081208054839290612c53908490613530565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b6000818310612cad578161128e565b5090919050565b612cbd82612d3f565b8060036000828254612ccf919061348d565b90915550506001600160a01b03821660009081526005602052604081208054839290612cfc90849061348d565b90915550506040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001612c92565b6001600160a01b0381166000908152600560205260409020548015612e6d576001600160a01b0382166000908152601060209081526040808320805460118085529285208054600e54600f54948190559490955282905593612da1858461348d565b90506000612daf858461348d565b90508115612e0a576000670de0b6b3a7640000612dcc848a613511565b612dd691906134a4565b6001600160a01b038a16600090815260126020526040812080549293508392909190612e03908490613530565b9091555050505b8015612e63576000670de0b6b3a7640000612e25838a613511565b612e2f91906134a4565b6001600160a01b038a16600090815260136020526040812080549293508392909190612e5c908490613530565b9091555050505b5050505050505050565b600e546001600160a01b038316600090815260106020908152604080832093909355600f546011909152919020555050565b6000805b60ff811015612fa557826000612eb98783612fae565b905085811015612f09576000612ecf888761304b565b612ed9838961348d565b612eeb90670de0b6b3a7640000613511565b612ef591906134a4565b9050612f018187613530565b955050612f4b565b6000612f15888761304b565b612f1f888461348d565b612f3190670de0b6b3a7640000613511565b612f3b91906134a4565b9050612f47818761348d565b9550505b81851115612f74576001612f5f838761348d565b11612f6f5784935050505061128e565b612f90565b6001612f80868461348d565b11612f905784935050505061128e565b50508080612f9d9061357b565b915050612ea3565b50909392505050565b6000670de0b6b3a764000082818581612fc78280613511565b612fd191906134a4565b612fdb9190613511565b612fe591906134a4565b612fef9190613511565b612ff991906134a4565b670de0b6b3a764000080848161300f8280613511565b61301991906134a4565b6130239190613511565b61302d91906134a4565b6130379086613511565b61304191906134a4565b61128e9190613530565b6000670de0b6b3a764000083816130628280613511565b61306c91906134a4565b6130769190613511565b61308091906134a4565b670de0b6b3a7640000806130948580613511565b61309e91906134a4565b6130a9866003613511565b6130379190613511565b6001600160a01b03811681146130c857600080fd5b50565b6000806000806000608086880312156130e357600080fd5b853594506020860135935060408601356130fc816130b3565b9250606086013567ffffffffffffffff8082111561311957600080fd5b818801915088601f83011261312d57600080fd5b81358181111561313c57600080fd5b89602082850101111561314e57600080fd5b9699959850939650602001949392505050565b60005b8381101561317c578181015183820152602001613164565b8381111561318b576000848401525b50505050565b60208152600082518060208401526131b0816040850160208701613161565b601f01601f19169190910160400192915050565b600080604083850312156131d757600080fd5b82356131e2816130b3565b946020939093013593505050565b6000806000806080858703121561320657600080fd5b8435613211816130b3565b966020860135965060408601359560600135945092505050565b6020808252825182820181905260009190848201906040850190845b8181101561326357835183529284019291840191600101613247565b50909695505050505050565b60006020828403121561328157600080fd5b813561128e816130b3565b6000806000606084860312156132a157600080fd5b83356132ac816130b3565b925060208401356132bc816130b3565b929592945050506040919091013590565b6000602082840312156132df57600080fd5b5035919050565b6000806000606084860312156132fb57600080fd5b8335613306816130b3565b95602085013595506040909401359392505050565b600080600080600080600060e0888a03121561333657600080fd5b8735613341816130b3565b96506020880135613351816130b3565b95506040880135945060608801359350608088013560ff8116811461337557600080fd5b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156133a557600080fd5b82356133b0816130b3565b915060208301356133c0816130b3565b809150509250929050565b600080604083850312156133de57600080fd5b8235915060208301356133c0816130b3565b60006020828403121561340257600080fd5b8151801515811461128e57600080fd5b60018060a01b038616815284602082015283604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f909201601f19160101949350505050565b60006020828403121561347057600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b60008282101561349f5761349f613477565b500390565b6000826134c157634e487b7160e01b600052601260045260246000fd5b500490565b600181811c908216806134da57607f821691505b60208210811415612bf657634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600081600019048311821515161561352b5761352b613477565b500290565b6000821982111561354357613543613477565b500190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561357057600080fd5b815161128e816130b3565b600060001982141561358f5761358f613477565b5060010190565b600080604083850312156135a957600080fd5b505080516020909101519092909150565b600080835481600182811c9150808316806135d657607f831692505b60208084108214156135f657634e487b7160e01b86526022600452602486fd5b81801561360a576001811461361b57613648565b60ff19861689528489019650613648565b60008a81526020902060005b868110156136405781548b820152908501908301613627565b505084890196505b509498975050505050505050565b60008251613668818460208701613161565b919091019291505056fea26469706673582212203756e96bd5b651feb8b188493a4f0ecf975ac3b9d776dcaf8c68606b8598b38664736f6c634300080b003361010060405234801561001157600080fd5b506040516106f63803806106f68339810160408190526100309161006d565b3360a0526001600160a01b0390811660805291821660c0521660e0526100b0565b80516001600160a01b038116811461006857600080fd5b919050565b60008060006060848603121561008257600080fd5b61008b84610051565b925061009960208501610051565b91506100a760408501610051565b90509250925092565b60805160a05160c05160e0516105e66101106000396000818161019e015281816102af0152610354015260008181610163015281816102790152610323015260008181606a015260aa01526000818160da01526101db01526105e66000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063533cf5ce14610030575b600080fd5b61004361003e36600461048c565b61005c565b6040805192835260208301919091520160405180910390f35b600080336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461009457600080fd5b60405162a9652960e61b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600480840191909152916000917f00000000000000000000000000000000000000000000000000000000000000001690632a594a40906024016020604051808303816000875af1158015610123573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061014791906104c1565b90506001600160a01b038116156101d7578515610193576101937f00000000000000000000000000000000000000000000000000000000000000008261018e60048a6104fb565b610385565b84156101c9576101c97f00000000000000000000000000000000000000000000000000000000000000008261018e6004896104fb565b816101d38161051d565b9250505b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663149f2b276040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610239573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061025d91906104c1565b90506001600160a01b038116156102e85786156102a4576102a47f00000000000000000000000000000000000000000000000000000000000000008261018e60048b6104fb565b85156102da576102da7f00000000000000000000000000000000000000000000000000000000000000008261018e60048a6104fb565b826102e48161051d565b9350505b60046102f48489610534565b6102fe91906104fb565b9450600461030c8488610534565b61031691906104fb565b93508615610349576103497f00000000000000000000000000000000000000000000000000000000000000008987610385565b851561037a5761037a7f00000000000000000000000000000000000000000000000000000000000000008986610385565b505050935093915050565b6000836001600160a01b03163b1161039c57600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916103f89190610553565b6000604051808303816000865af19150503d8060008114610435576040519150601f19603f3d011682016040523d82523d6000602084013e61043a565b606091505b5091509150818015610464575080511580610464575080806020019051810190610464919061058e565b61046d57600080fd5b5050505050565b6001600160a01b038116811461048957600080fd5b50565b6000806000606084860312156104a157600080fd5b83356104ac81610474565b95602085013595506040909401359392505050565b6000602082840312156104d357600080fd5b81516104de81610474565b9392505050565b634e487b7160e01b600052601160045260246000fd5b60008261051857634e487b7160e01b600052601260045260246000fd5b500490565b60008161052c5761052c6104e5565b506000190190565b600081600019048311821515161561054e5761054e6104e5565b500290565b6000825160005b81811015610574576020818601810151858301520161055a565b81811115610583576000828501525b509190910192915050565b6000602082840312156105a057600080fd5b815180151581146104de57600080fdfea26469706673582212204bac78d116270fb57afdda2bece111fae0a7f01d390bf88ae01474c7e139bd1f64736f6c634300080b0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102a05760003560e01c80637ecebe0011610167578063bda39cad116100ce578063d505accf11610087578063d505accf14610782578063dd62ed3e14610795578063ddca3f43146107c0578063ebeb31db146107c9578063f140a35a146107d1578063fff6cae9146107e457600080fd5b8063bda39cad1461072f578063bf944dbc14610738578063c245febc14610741578063c5700a021461074a578063d21220a714610753578063d294f0931461077a57600080fd5b80639d63848a116101205780639d63848a146106585780639e8cc04b146106b65780639f767c88146106c9578063a1ac4d13146106e9578063a9059cbb14610709578063bc25cf771461071c57600080fd5b80637ecebe00146105af57806389afcb44146105cf5780638a7b8cf2146105f75780638ce744261461062157806395d89b41146106295780639af1d35a1461063157600080fd5b8063252c09d71161020b578063517b3f82116101c4578063517b3f82146105455780635881c475146105585780635a76f25e1461056b5780636a6278421461057457806370a0823114610587578063758cdcf0146105a757600080fd5b8063252c09d714610400578063313ce5671461041357806332c0defd1461042d578063392f37e914610436578063443cb4bc1461051c5780634d5a9f8a1461052557600080fd5b8063149f2b271161025d578063149f2b271461037f57806318160ddd146103875780631df8c7171461039e578063205aabf1146103a657806322be3de1146103c657806323b872dd146103ed57600080fd5b8063022c0d9f146102a557806306fdde03146102ba5780630902f1ac146102d8578063095ea7b3146102fd5780630dfe16811461032057806313345fe11461035f575b600080fd5b6102b86102b33660046130cb565b6107ec565b005b6102c2610dcf565b6040516102cf9190613191565b60405180910390f35b600954600a54600b545b604080519384526020840192909252908201526060016102cf565b61031061030b3660046131c4565b610e5d565b60405190151581526020016102cf565b6103477f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c8381565b6040516001600160a01b0390911681526020016102cf565b61037261036d3660046131f0565b610eca565b6040516102cf919061322b565b6103476110d2565b61039060035481565b6040519081526020016102cf565b6102e261115d565b6103906103b436600461326f565b60116020526000908152604090205481565b6103107f000000000000000000000000000000000000000000000000000000000000000081565b6103106103fb36600461328c565b6111cc565b6102e261040e3660046132cd565b611295565b61041b601281565b60405160ff90911681526020016102cf565b610390600e5481565b600954600a54604080517f0000000000000000000000000000000000000000000000000de0b6b3a764000081527f0000000000000000000000000000000000000000000000000de0b6b3a764000060208201529081019290925260608201527f0000000000000000000000000000000000000000000000000000000000000000151560808201526001600160a01b037f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83811660a08301527f0000000000000000000000005cc61a78f164885776aa610fb0fe1257df78e59b1660c082015260e0016102cf565b61039060095481565b61039061053336600461326f565b60126020526000908152604090205481565b6103906105533660046131c4565b6112c8565b6103726105663660046132e6565b6113b1565b610390600a5481565b61039061058236600461326f565b6113c0565b61039061059536600461326f565b60056020526000908152604090205481565b6102b861161d565b6103906105bd36600461326f565b60076020526000908152604090205481565b6105e26105dd36600461326f565b61172c565b604080519283526020830191909152016102cf565b6105ff611a49565b60408051825181526020808401519082015291810151908201526060016102cf565b610347611ac9565b6102c2611b31565b6103477f000000000000000000000000922a5f13bd2345cd941fec240832623f919e3ea281565b604080516001600160a01b037f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83811682527f0000000000000000000000005cc61a78f164885776aa610fb0fe1257df78e59b166020820152016102cf565b6103906106c43660046132e6565b611b3e565b6103906106d736600461326f565b60106020526000908152604090205481565b6103906106f736600461326f565b60136020526000908152604090205481565b6103106107173660046131c4565b611bab565b6102b861072a36600461326f565b611bc1565b610390600f5481565b610390600c5481565b610390600d5481565b610390600b5481565b6103477f0000000000000000000000005cc61a78f164885776aa610fb0fe1257df78e59b81565b6105e2611cdf565b6102b861079036600461331b565b611e1c565b6103906107a3366004613392565b600460209081526000928352604080842090915290825290205481565b61039060025481565b600854610390565b6103906107df3660046133cb565b612111565b6102b861214a565b6014546001146107fb57600080fd5b60026014819055507f0000000000000000000000009d3591719038752db0c8beee2040ffcc3b2c6b9c6001600160a01b031663b187bd266040518163ffffffff1660e01b8152600401602060405180830381865afa158015610861573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088591906133f0565b1561088f57600080fd5b600085118061089e5750600084115b6108d55760405162461bcd60e51b8152602060048201526003602482015262494f4160e81b60448201526064015b60405180910390fd5b600954600a5481871080156108e957508086105b61091a5760405162461bcd60e51b8152602060048201526002602482015261125360f21b60448201526064016108cc565b6000807f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c837f0000000000000000000000005cc61a78f164885776aa610fb0fe1257df78e59b6001600160a01b038981169083161480159061098d5750806001600160a01b0316896001600160a01b031614155b6109be5760405162461bcd60e51b8152602060048201526002602482015261125560f21b60448201526064016108cc565b8a156109cf576109cf828a8d612284565b89156109e0576109e0818a8c612284565b8615610a4d57604051639a7bff7960e01b81526001600160a01b038a1690639a7bff7990610a1a9033908f908f908e908e90600401613412565b600060405180830381600087803b158015610a3457600080fd5b505af1158015610a48573d6000803e3d6000fd5b505050505b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015610a91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab5919061345e565b6040516370a0823160e01b81523060048201529094506001600160a01b038216906370a0823190602401602060405180830381865afa158015610afc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b20919061345e565b9250505060008985610b32919061348d565b8311610b3f576000610b53565b610b498a8661348d565b610b53908461348d565b90506000610b618a8661348d565b8311610b6e576000610b82565b610b788a8661348d565b610b82908461348d565b90506000821180610b935750600081115b610bc55760405162461bcd60e51b815260206004820152600360248201526249494160e81b60448201526064016108cc565b7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c837f0000000000000000000000005cc61a78f164885776aa610fb0fe1257df78e59b8315610c2357610c2360025485610c1e91906134a4565b612373565b8215610c3f57610c3f60025484610c3a91906134a4565b612440565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015610c83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca7919061345e565b6040516370a0823160e01b81523060048201529096506001600160a01b038216906370a0823190602401602060405180830381865afa158015610cee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d12919061345e565b9450610d1e8888612506565b610d288787612506565b1015610d5a5760405162461bcd60e51b81526020600482015260016024820152604b60f81b60448201526064016108cc565b5050610d6884848888612652565b60408051838152602081018390529081018c9052606081018b90526001600160a01b038a169033907fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229060800160405180910390a350506001601455505050505050505050565b60008054610ddc906134c6565b80601f0160208091040260200160405190810160405280929190818152602001828054610e08906134c6565b8015610e555780601f10610e2a57610100808354040283529160200191610e55565b820191906000526020600020905b815481529060010190602001808311610e3857829003601f168201915b505050505081565b3360008181526004602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610eb89086815260200190565b60405180910390a35060015b92915050565b606060008367ffffffffffffffff811115610ee757610ee76134fb565b604051908082528060200260200182016040528015610f10578160200160208202803683370190505b50600854909150600090610f269060019061348d565b90506000610f348587613511565b610f3e908361348d565b90506000805b838310156110c257610f568784613530565b9150600060088481548110610f6d57610f6d613548565b90600052602060002090600302016000015460088481548110610f9257610f92613548565b906000526020600020906003020160000154610fae919061348d565b905060008160088681548110610fc657610fc6613548565b90600052602060002090600302016001015460088681548110610feb57610feb613548565b906000526020600020906003020160010154611007919061348d565b61101191906134a4565b90506000826008878154811061102957611029613548565b9060005260206000209060030201600201546008878154811061104e5761104e613548565b90600052602060002090600302016002015461106a919061348d565b61107491906134a4565b90506110828c8e84846127e6565b88858151811061109457611094613548565b60209081029190910101526110aa846001613530565b935050505086836110bb9190613530565b9250610f44565b509293505050505b949350505050565b60007f0000000000000000000000009d3591719038752db0c8beee2040ffcc3b2c6b9c6001600160a01b031663149f2b276040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611134573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611158919061355e565b905090565b600c54600d54426000808061117b600954600a54600b549192909190565b9250925092508381146111c4576000611194828661348d565b90506111a08185613511565b6111aa9088613530565b96506111b68184613511565b6111c09087613530565b9550505b505050909192565b6001600160a01b03831660008181526004602090815260408083203380855292528220549192909190821480159061120657506000198114155b1561127c576000611217858361348d565b6001600160a01b038881166000818152600460209081526040808320948916808452948252918290208590559051848152939450919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505b611287868686612adb565b6001925050505b9392505050565b600881815481106112a557600080fd5b600091825260209091206003909102018054600182015460029092015490925083565b6000806112d3611a49565b90506000806112e061115d565b508451919350915042141561134957600880546112ff9060029061348d565b8154811061130f5761130f613548565b9060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505092505b8251600090611358904261348d565b905060008185602001518561136d919061348d565b61137791906134a4565b905060008286604001518561138c919061348d565b61139691906134a4565b90506113a4888a84846127e6565b9998505050505050505050565b60606110ca8484846001610eca565b60006014546001146113d157600080fd5b6002601455600954600a546040516370a0823160e01b81523060048201526000907f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b0316906370a0823190602401602060405180830381865afa158015611443573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611467919061345e565b6040516370a0823160e01b81523060048201529091506000906001600160a01b037f0000000000000000000000005cc61a78f164885776aa610fb0fe1257df78e59b16906370a0823190602401602060405180830381865afa1580156114d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f5919061345e565b90506000611503858461348d565b90506000611511858461348d565b6003549091508061154f576103e861153161152c8486613511565b612b9b565b61153b919061348d565b975061154a60006103e8612c0b565b611584565b6115818761155d8386613511565b61156791906134a4565b876115728486613511565b61157c91906134a4565b612c9e565b97505b600088116115ba5760405162461bcd60e51b8152602060048201526003602482015262494c4d60e81b60448201526064016108cc565b6115c48989612c0b565b6115d085858989612652565b604080518481526020810184905233917f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f910160405180910390a250506001601455509395945050505050565b7f0000000000000000000000000000000000000000000000000000000000000000156116cc577f0000000000000000000000009d3591719038752db0c8beee2040ffcc3b2c6b9c6001600160a01b03166340bbd7756040518163ffffffff1660e01b81526004016020604051808303816000875af11580156116a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116c7919061345e565b600255565b7f0000000000000000000000009d3591719038752db0c8beee2040ffcc3b2c6b9c6001600160a01b031663f11ee8456040518163ffffffff1660e01b81526004016020604051808303816000875af11580156116a3573d6000803e3d6000fd5b60008060145460011461173e57600080fd5b6002601455600954600a546040516370a0823160e01b81523060048201527f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83907f0000000000000000000000005cc61a78f164885776aa610fb0fe1257df78e59b906000906001600160a01b038416906370a0823190602401602060405180830381865afa1580156117d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f8919061345e565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038416906370a0823190602401602060405180830381865afa158015611842573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611866919061345e565b3060009081526005602052604090205460035491925090806118888584613511565b61189291906134a4565b99508061189f8484613511565b6118a991906134a4565b985060008a1180156118bb5750600089115b6118ed5760405162461bcd60e51b815260206004820152600360248201526224a62160e91b60448201526064016108cc565b6118f73083612cb4565b611902868c8c612284565b61190d858c8b612284565b6040516370a0823160e01b81523060048201526001600160a01b038716906370a0823190602401602060405180830381865afa158015611951573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611975919061345e565b6040516370a0823160e01b81523060048201529094506001600160a01b038616906370a0823190602401602060405180830381865afa1580156119bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e0919061345e565b92506119ee84848a8a612652565b604080518b8152602081018b90526001600160a01b038d169133917fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496910160405180910390a350505050505050506001601481905550915091565b611a6d60405180606001604052806000815260200160008152602001600081525090565b60088054611a7d9060019061348d565b81548110611a8d57611a8d613548565b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905090565b60405162a9652960e61b81523060048201526000907f0000000000000000000000009d3591719038752db0c8beee2040ffcc3b2c6b9c6001600160a01b031690632a594a40906024016020604051808303816000875af1158015611134573d6000803e3d6000fd5b60018054610ddc906134c6565b600080611b4e8585856001610eca565b90506000805b8251811015611b9657828181518110611b6f57611b6f613548565b602002602001015182611b829190613530565b915080611b8e8161357b565b915050611b54565b50611ba184826134a4565b9695505050505050565b6000611bb8338484612adb565b50600192915050565b601454600114611bd057600080fd5b60026014556009546040516370a0823160e01b81523060048201527f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83917f0000000000000000000000005cc61a78f164885776aa610fb0fe1257df78e59b91611c9d9184918691906001600160a01b038416906370a08231906024015b602060405180830381865afa158015611c6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c8e919061345e565b611c98919061348d565b612284565b600a546040516370a0823160e01b8152306004820152611cd59183918691906001600160a01b038416906370a0823190602401611c4d565b5050600160145550565b600080611ceb33612d3f565b50503360009081526012602090815260408083205460139092529091205481151580611d175750600081115b15611e18573360008181526012602090815260408083208390556013909152808220919091555163299e7ae760e11b8152600481019190915260248101839052604481018290526001600160a01b037f000000000000000000000000922a5f13bd2345cd941fec240832623f919e3ea2169063533cf5ce9060640160408051808303816000875af1158015611db0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dd49190613596565b6040805183815260208101839052929450909250339182917f865ca08d59f5cb456e85cd2f7ef63664ea4f73327414e9d8152c4158b0e94645910160405180910390a35b9091565b42841015611e5e5760405162461bcd60e51b815260206004820152600f60248201526e10985cd9558c4e8811561412549151608a1b60448201526064016108cc565b7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051611e8e91906135ba565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160408051601f19818403018152918152815160209283012060068190556001600160a01b038a166000908152600790935290822080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b919087611f448361357b565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120604051602001611fbd92919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015612028573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381161580159061205e5750886001600160a01b0316816001600160a01b0316145b6120aa5760405162461bcd60e51b815260206004820152601960248201527f4261736556313a20494e56414c49445f5349474e41545552450000000000000060448201526064016108cc565b6001600160a01b038981166000818152600460209081526040808320948d16808452948252918290208b905590518a81527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050505050505050565b600954600a54600254600092919061212990866134a4565b612133908661348d565b9450612141858584846127e6565b95945050505050565b60145460011461215957600080fd5b60026014556040516370a0823160e01b815230600482015261227d907f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b0316906370a0823190602401602060405180830381865afa1580156121c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ea919061345e565b6040516370a0823160e01b81523060048201527f0000000000000000000000005cc61a78f164885776aa610fb0fe1257df78e59b6001600160a01b0316906370a0823190602401602060405180830381865afa15801561224e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612272919061345e565b600954600a54612652565b6001601455565b6000836001600160a01b03163b1161229b57600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916122f79190613656565b6000604051808303816000865af19150503d8060008114612334576040519150601f19603f3d011682016040523d82523d6000602084013e612339565b606091505b509150915081801561236357508051158061236357508080602001905181019061236391906133f0565b61236c57600080fd5b5050505050565b6123be7f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c837f000000000000000000000000922a5f13bd2345cd941fec240832623f919e3ea283612284565b6003546000906123d683670de0b6b3a7640000613511565b6123e091906134a4565b905080156124005780600e60008282546123fa9190613530565b90915550505b604080518381526000602082015233917f112c256902bf554b6ed882d2936687aaeb4225e8cd5b51303c90ca6cf43a860291015b60405180910390a25050565b61248b7f0000000000000000000000005cc61a78f164885776aa610fb0fe1257df78e59b7f000000000000000000000000922a5f13bd2345cd941fec240832623f919e3ea283612284565b6003546000906124a383670de0b6b3a7640000613511565b6124ad91906134a4565b905080156124cd5780600f60008282546124c79190613530565b90915550505b60408051600081526020810184905233917f112c256902bf554b6ed882d2936687aaeb4225e8cd5b51303c90ca6cf43a86029101612434565b60007f0000000000000000000000000000000000000000000000000000000000000000156126415760007f0000000000000000000000000000000000000000000000000de0b6b3a764000061256385670de0b6b3a7640000613511565b61256d91906134a4565b905060007f0000000000000000000000000000000000000000000000000de0b6b3a76400006125a485670de0b6b3a7640000613511565b6125ae91906134a4565b90506000670de0b6b3a76400006125c58385613511565b6125cf91906134a4565b90506000670de0b6b3a76400006125e68480613511565b6125f091906134a4565b670de0b6b3a76400006126038680613511565b61260d91906134a4565b6126179190613530565b9050670de0b6b3a764000061262c8284613511565b61263691906134a4565b945050505050610ec4565b61264b8284613511565b9050610ec4565b600b544290600090612664908361348d565b905060008111801561267557508315155b801561268057508215155b156126c75761268f8185613511565b600c60008282546126a09190613530565b909155506126b090508184613511565b600d60008282546126c19190613530565b90915550505b60006126d1611a49565b80519091506126e0908461348d565b91506107088211156127955760408051606081018252848152600c5460208201908152600d549282019283526008805460018101825560009190915291517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3600390930292830155517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee482015590517ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee5909101555b6009879055600a869055600b83905560408051888152602081018890527fcf2aa50876cdfbb541206f89af0ee78d44a2abf8d328e37fa4917f982149848a910160405180910390a150505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000015612a6957600061281a8484612506565b90507f0000000000000000000000000000000000000000000000000de0b6b3a764000061284f85670de0b6b3a7640000613511565b61285991906134a4565b93507f0000000000000000000000000000000000000000000000000de0b6b3a764000061288e84670de0b6b3a7640000613511565b61289891906134a4565b92506000807f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b0316876001600160a01b0316146128dd5784866128e0565b85855b915091507f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b0316876001600160a01b03161461295f577f0000000000000000000000000000000000000000000000000de0b6b3a764000061295089670de0b6b3a7640000613511565b61295a91906134a4565b61299c565b7f0000000000000000000000000000000000000000000000000de0b6b3a764000061299289670de0b6b3a7640000613511565b61299c91906134a4565b975060006129b46129ad848b613530565b8584612e9f565b6129be908361348d565b9050670de0b6b3a76400007f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b0316896001600160a01b031614612a28577f0000000000000000000000000000000000000000000000000de0b6b3a7640000612a4a565b7f0000000000000000000000000000000000000000000000000de0b6b3a76400005b612a549083613511565b612a5e91906134a4565b9450505050506110ca565b6000807f00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c836001600160a01b0316866001600160a01b031614612aac578385612aaf565b84845b9092509050612abe8783613530565b612ac88289613511565b612ad291906134a4565b925050506110ca565b612ae483612d3f565b612aed82612d3f565b6001600160a01b03831660009081526005602052604081208054839290612b1590849061348d565b90915550506001600160a01b03821660009081526005602052604081208054839290612b42908490613530565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612b8e91815260200190565b60405180910390a3505050565b60006003821115612bfc5750806000612bb56002836134a4565b612bc0906001613530565b90505b81811015612bf657905080600281612bdb81866134a4565b612be59190613530565b612bef91906134a4565b9050612bc3565b50919050565b8115612c06575060015b919050565b612c1482612d3f565b8060036000828254612c269190613530565b90915550506001600160a01b03821660009081526005602052604081208054839290612c53908490613530565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b6000818310612cad578161128e565b5090919050565b612cbd82612d3f565b8060036000828254612ccf919061348d565b90915550506001600160a01b03821660009081526005602052604081208054839290612cfc90849061348d565b90915550506040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001612c92565b6001600160a01b0381166000908152600560205260409020548015612e6d576001600160a01b0382166000908152601060209081526040808320805460118085529285208054600e54600f54948190559490955282905593612da1858461348d565b90506000612daf858461348d565b90508115612e0a576000670de0b6b3a7640000612dcc848a613511565b612dd691906134a4565b6001600160a01b038a16600090815260126020526040812080549293508392909190612e03908490613530565b9091555050505b8015612e63576000670de0b6b3a7640000612e25838a613511565b612e2f91906134a4565b6001600160a01b038a16600090815260136020526040812080549293508392909190612e5c908490613530565b9091555050505b5050505050505050565b600e546001600160a01b038316600090815260106020908152604080832093909355600f546011909152919020555050565b6000805b60ff811015612fa557826000612eb98783612fae565b905085811015612f09576000612ecf888761304b565b612ed9838961348d565b612eeb90670de0b6b3a7640000613511565b612ef591906134a4565b9050612f018187613530565b955050612f4b565b6000612f15888761304b565b612f1f888461348d565b612f3190670de0b6b3a7640000613511565b612f3b91906134a4565b9050612f47818761348d565b9550505b81851115612f74576001612f5f838761348d565b11612f6f5784935050505061128e565b612f90565b6001612f80868461348d565b11612f905784935050505061128e565b50508080612f9d9061357b565b915050612ea3565b50909392505050565b6000670de0b6b3a764000082818581612fc78280613511565b612fd191906134a4565b612fdb9190613511565b612fe591906134a4565b612fef9190613511565b612ff991906134a4565b670de0b6b3a764000080848161300f8280613511565b61301991906134a4565b6130239190613511565b61302d91906134a4565b6130379086613511565b61304191906134a4565b61128e9190613530565b6000670de0b6b3a764000083816130628280613511565b61306c91906134a4565b6130769190613511565b61308091906134a4565b670de0b6b3a7640000806130948580613511565b61309e91906134a4565b6130a9866003613511565b6130379190613511565b6001600160a01b03811681146130c857600080fd5b50565b6000806000806000608086880312156130e357600080fd5b853594506020860135935060408601356130fc816130b3565b9250606086013567ffffffffffffffff8082111561311957600080fd5b818801915088601f83011261312d57600080fd5b81358181111561313c57600080fd5b89602082850101111561314e57600080fd5b9699959850939650602001949392505050565b60005b8381101561317c578181015183820152602001613164565b8381111561318b576000848401525b50505050565b60208152600082518060208401526131b0816040850160208701613161565b601f01601f19169190910160400192915050565b600080604083850312156131d757600080fd5b82356131e2816130b3565b946020939093013593505050565b6000806000806080858703121561320657600080fd5b8435613211816130b3565b966020860135965060408601359560600135945092505050565b6020808252825182820181905260009190848201906040850190845b8181101561326357835183529284019291840191600101613247565b50909695505050505050565b60006020828403121561328157600080fd5b813561128e816130b3565b6000806000606084860312156132a157600080fd5b83356132ac816130b3565b925060208401356132bc816130b3565b929592945050506040919091013590565b6000602082840312156132df57600080fd5b5035919050565b6000806000606084860312156132fb57600080fd5b8335613306816130b3565b95602085013595506040909401359392505050565b600080600080600080600060e0888a03121561333657600080fd5b8735613341816130b3565b96506020880135613351816130b3565b95506040880135945060608801359350608088013560ff8116811461337557600080fd5b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156133a557600080fd5b82356133b0816130b3565b915060208301356133c0816130b3565b809150509250929050565b600080604083850312156133de57600080fd5b8235915060208301356133c0816130b3565b60006020828403121561340257600080fd5b8151801515811461128e57600080fd5b60018060a01b038616815284602082015283604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f909201601f19160101949350505050565b60006020828403121561347057600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b60008282101561349f5761349f613477565b500390565b6000826134c157634e487b7160e01b600052601260045260246000fd5b500490565b600181811c908216806134da57607f821691505b60208210811415612bf657634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600081600019048311821515161561352b5761352b613477565b500290565b6000821982111561354357613543613477565b500190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561357057600080fd5b815161128e816130b3565b600060001982141561358f5761358f613477565b5060010190565b600080604083850312156135a957600080fd5b505080516020909101519092909150565b600080835481600182811c9150808316806135d657607f831692505b60208084108214156135f657634e487b7160e01b86526022600452602486fd5b81801561360a576001811461361b57613648565b60ff19861689528489019650613648565b60008a81526020902060005b868110156136405781548b820152908501908301613627565b505084890196505b509498975050505050505050565b60008251613668818460208701613161565b919091019291505056fea26469706673582212203756e96bd5b651feb8b188493a4f0ecf975ac3b9d776dcaf8c68606b8598b38664736f6c634300080b0033
Loading...
Loading
Loading...
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.
[ 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.