More Info
Private Name Tags
ContractCreator
Multichain Info
No addresses found
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
17883964 | 9 days ago | 0.00760226 ETH | ||||
17167083 | 26 days ago | 0.00117049 ETH | ||||
17167083 | 26 days ago | 0.00117049 ETH | ||||
17151911 | 26 days ago | 0.00094327 ETH | ||||
17151911 | 26 days ago | 0.00094327 ETH | ||||
17075140 | 28 days ago | 0.00012947 ETH | ||||
17075140 | 28 days ago | 0.00012947 ETH | ||||
16797819 | 34 days ago | 0.00135063 ETH | ||||
16797819 | 34 days ago | 0.00135063 ETH | ||||
16755563 | 35 days ago | 0.00093023 ETH | ||||
16755563 | 35 days ago | 0.00093023 ETH | ||||
16571312 | 40 days ago | 0.00024955 ETH | ||||
16571312 | 40 days ago | 0.00024955 ETH | ||||
16571245 | 40 days ago | 0.00069904 ETH | ||||
16571245 | 40 days ago | 0.00069904 ETH | ||||
16558624 | 40 days ago | 0.00003462 ETH | ||||
16558624 | 40 days ago | 0.00003462 ETH | ||||
16510856 | 41 days ago | 0.00000502 ETH | ||||
16510856 | 41 days ago | 0.00000502 ETH | ||||
15715338 | 59 days ago | 0.003 ETH | ||||
15652709 | 61 days ago | 0.001 ETH | ||||
15642932 | 61 days ago | 0.00616619 ETH | ||||
15642932 | 61 days ago | 0.00616619 ETH | ||||
15349796 | 68 days ago | 0.00010638 ETH | ||||
15349796 | 68 days ago | 0.00010638 ETH |
Loading...
Loading
Contract Name:
RouterV2
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
Yes with 2000 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
import {Clones} from "@openzeppelin/contracts/proxy/Clones.sol"; import {IPairFactory} from "./interfaces/IPairFactory.sol"; /** *Submitted for verification at FtmScan.com on 2022-02-20 */ // SPDX-License-Identifier: MIT // ftm.guru's extension of Solidly's periphery (Router) // https://github.com/andrecronje/solidly/blob/master/contracts/BaseV1-periphery.sol // BaseV1Router02.sol : Supporting Fee-on-transfer Tokens // https://github.com/ftm1337/solidly-with-FoT/blob/master/contracts/BaseV1-periphery.sol pragma solidity =0.8.19; interface IBaseV1Pair { function transferFrom(address src, address dst, uint amount) external returns (bool); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function burn(address to) external returns (uint amount0, uint amount1); function mint(address to) external returns (uint liquidity); function getReserves() external view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast); function getAmountOut(uint, address) external view returns (uint); } 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 allowance(address, 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; } } function sub(uint x, uint y) internal pure returns (uint z) { require((z = x - y) <= x, "Math: Sub-underflow"); } } interface IWETH { function deposit() external payable; function transfer(address to, uint value) external returns (bool); function withdraw(uint) external; } interface IBlast { function configureGovernor(address _governor) external; } // Experimental Extension [ftm.guru/solidly/BaseV1Router02] // contract BaseV1Router02 is BaseV1Router01 // with Support for Fee-on-Transfer Tokens contract RouterV2 { using Math for uint; struct route { address from; address to; bool stable; } address public immutable factory; IWETH public immutable wETH; uint internal constant MINIMUM_LIQUIDITY = 10 ** 3; // swap event for the referral system event Swap(address indexed sender, uint amount0In, address _tokenIn, address indexed to, bool stable); modifier ensure(uint deadline) { require(deadline >= block.timestamp, "BaseV1Router: EXPIRED"); _; } constructor(address _blastGovernor, address _factory, address _wETH) { IBlast(0x4300000000000000000000000000000000000002).configureGovernor(_blastGovernor); factory = _factory; wETH = IWETH(_wETH); } receive() external payable { assert(msg.sender == address(wETH)); // only accept ETH via fallback from the WETH contract } function sortTokens(address tokenA, address tokenB) public pure returns (address token0, address token1) { require(tokenA != tokenB, "BaseV1Router: IDENTICAL_ADDRESSES"); (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), "BaseV1Router: ZERO_ADDRESS"); } function pairFor(address tokenA, address tokenB, bool stable) public view returns (address pair) { pair = IPairFactory(factory).getPair(tokenA, tokenB, stable); } // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset function quoteLiquidity(uint amountA, uint reserveA, uint reserveB) internal pure returns (uint amountB) { require(amountA > 0, "BaseV1Router: INSUFFICIENT_AMOUNT"); require(reserveA > 0 && reserveB > 0, "BaseV1Router: INSUFFICIENT_LIQUIDITY"); amountB = (amountA * reserveB) / reserveA; } // fetches and sorts the reserves for a pair function getReserves(address tokenA, address tokenB, bool stable) public view returns (uint reserveA, uint reserveB) { (address token0, ) = sortTokens(tokenA, tokenB); (uint reserve0, uint reserve1, ) = IBaseV1Pair(pairFor(tokenA, tokenB, stable)).getReserves(); (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0); } // performs chained getAmountOut calculations on any number of pairs function getAmountOut(uint amountIn, address tokenIn, address tokenOut) public view returns (uint amount, bool stable) { address pair = pairFor(tokenIn, tokenOut, true); uint amountStable; uint amountVolatile; if (IPairFactory(factory).isPair(pair)) { amountStable = IBaseV1Pair(pair).getAmountOut(amountIn, tokenIn); } pair = pairFor(tokenIn, tokenOut, false); if (IPairFactory(factory).isPair(pair)) { amountVolatile = IBaseV1Pair(pair).getAmountOut(amountIn, tokenIn); } return amountStable > amountVolatile ? (amountStable, true) : (amountVolatile, false); } // performs chained getAmountOut calculations on any number of pairs function getAmountsOut(uint amountIn, route[] memory routes) public view returns (uint[] memory amounts) { require(routes.length >= 1, "BaseV1Router: INVALID_PATH"); amounts = new uint[](routes.length + 1); amounts[0] = amountIn; for (uint i = 0; i < routes.length; i++) { address pair = pairFor(routes[i].from, routes[i].to, routes[i].stable); if (IPairFactory(factory).isPair(pair)) { amounts[i + 1] = IBaseV1Pair(pair).getAmountOut(amounts[i], routes[i].from); } } } function isPair(address pair) public view returns (bool) { return IPairFactory(factory).isPair(pair); } function quoteAddLiquidity( address tokenA, address tokenB, bool stable, uint amountADesired, uint amountBDesired ) public view returns (uint amountA, uint amountB, uint liquidity) { // create the pair if it doesn't exist yet address _pair = IPairFactory(factory).getPair(tokenA, tokenB, stable); (uint reserveA, uint reserveB) = (0, 0); uint _totalSupply = 0; if (_pair != address(0)) { _totalSupply = erc20(_pair).totalSupply(); (reserveA, reserveB) = getReserves(tokenA, tokenB, stable); } if (reserveA == 0 && reserveB == 0) { (amountA, amountB) = (amountADesired, amountBDesired); liquidity = Math.sqrt(amountA * amountB) - MINIMUM_LIQUIDITY; } else { uint amountBOptimal = quoteLiquidity(amountADesired, reserveA, reserveB); if (amountBOptimal <= amountBDesired) { (amountA, amountB) = (amountADesired, amountBOptimal); liquidity = Math.min((amountA * _totalSupply) / reserveA, (amountB * _totalSupply) / reserveB); } else { uint amountAOptimal = quoteLiquidity(amountBDesired, reserveB, reserveA); (amountA, amountB) = (amountAOptimal, amountBDesired); liquidity = Math.min((amountA * _totalSupply) / reserveA, (amountB * _totalSupply) / reserveB); } } } function quoteRemoveLiquidity( address tokenA, address tokenB, bool stable, uint liquidity ) public view returns (uint amountA, uint amountB) { // create the pair if it doesn't exist yet address _pair = IPairFactory(factory).getPair(tokenA, tokenB, stable); if (_pair == address(0)) { return (0, 0); } (uint reserveA, uint reserveB) = getReserves(tokenA, tokenB, stable); uint _totalSupply = erc20(_pair).totalSupply(); amountA = (liquidity * reserveA) / _totalSupply; // using balances ensures pro-rata distribution amountB = (liquidity * reserveB) / _totalSupply; // using balances ensures pro-rata distribution } function _addLiquidity( address tokenA, address tokenB, bool stable, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin ) internal returns (uint amountA, uint amountB) { require(amountADesired >= amountAMin); require(amountBDesired >= amountBMin); // create the pair if it doesn't exist yet address _pair = IPairFactory(factory).getPair(tokenA, tokenB, stable); if (_pair == address(0)) { _pair = IPairFactory(factory).createPair(tokenA, tokenB, stable); } (uint reserveA, uint reserveB) = getReserves(tokenA, tokenB, stable); if (reserveA == 0 && reserveB == 0) { (amountA, amountB) = (amountADesired, amountBDesired); } else { uint amountBOptimal = quoteLiquidity(amountADesired, reserveA, reserveB); if (amountBOptimal <= amountBDesired) { require(amountBOptimal >= amountBMin, "BaseV1Router: INSUFFICIENT_B_AMOUNT"); (amountA, amountB) = (amountADesired, amountBOptimal); } else { uint amountAOptimal = quoteLiquidity(amountBDesired, reserveB, reserveA); assert(amountAOptimal <= amountADesired); require(amountAOptimal >= amountAMin, "BaseV1Router: INSUFFICIENT_A_AMOUNT"); (amountA, amountB) = (amountAOptimal, amountBDesired); } } } function addLiquidity( address tokenA, address tokenB, bool stable, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) public ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) { (amountA, amountB) = _addLiquidity(tokenA, tokenB, stable, amountADesired, amountBDesired, amountAMin, amountBMin); address pair = pairFor(tokenA, tokenB, stable); _safeTransferFrom(tokenA, msg.sender, pair, amountA); _safeTransferFrom(tokenB, msg.sender, pair, amountB); liquidity = IBaseV1Pair(pair).mint(to); } function addLiquidityETH( address token, bool stable, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) public payable ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) { (amountToken, amountETH) = _addLiquidity(token, address(wETH), stable, amountTokenDesired, msg.value, amountTokenMin, amountETHMin); address pair = pairFor(token, address(wETH), stable); _safeTransferFrom(token, msg.sender, pair, amountToken); wETH.deposit{value: amountETH}(); assert(wETH.transfer(pair, amountETH)); liquidity = IBaseV1Pair(pair).mint(to); // refund dust ETH, if any if (msg.value > amountETH) _safeTransferETH(msg.sender, msg.value - amountETH); } // **** REMOVE LIQUIDITY **** function removeLiquidity( address tokenA, address tokenB, bool stable, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) public ensure(deadline) returns (uint amountA, uint amountB) { address pair = pairFor(tokenA, tokenB, stable); require(IBaseV1Pair(pair).transferFrom(msg.sender, pair, liquidity)); // send liquidity to pair (uint amount0, uint amount1) = IBaseV1Pair(pair).burn(to); (address token0, ) = sortTokens(tokenA, tokenB); (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0); require(amountA >= amountAMin, "BaseV1Router: INSUFFICIENT_A_AMOUNT"); require(amountB >= amountBMin, "BaseV1Router: INSUFFICIENT_B_AMOUNT"); } function removeLiquidityETH( address token, bool stable, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) public ensure(deadline) returns (uint amountToken, uint amountETH) { (amountToken, amountETH) = removeLiquidity( token, address(wETH), stable, liquidity, amountTokenMin, amountETHMin, address(this), deadline ); _safeTransfer(token, to, amountToken); wETH.withdraw(amountETH); _safeTransferETH(to, amountETH); } function removeLiquidityWithPermit( address tokenA, address tokenB, bool stable, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) public returns (uint amountA, uint amountB) { address pair = pairFor(tokenA, tokenB, stable); { uint value = approveMax ? type(uint).max : liquidity; _trustlessPermit(pair, msg.sender, address(this), value, deadline, v, r, s); } (amountA, amountB) = removeLiquidity(tokenA, tokenB, stable, liquidity, amountAMin, amountBMin, to, deadline); } function removeLiquidityETHWithPermit( address token, bool stable, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) public returns (uint amountToken, uint amountETH) { address pair = pairFor(token, address(wETH), stable); uint value = approveMax ? type(uint).max : liquidity; _trustlessPermit(pair, msg.sender, address(this), value, deadline, v, r, s); (amountToken, amountETH) = removeLiquidityETH(token, stable, liquidity, amountTokenMin, amountETHMin, to, deadline); } // **** SWAP **** // requires the initial amount to have already been sent to the first pair function _swap(uint[] memory amounts, route[] memory routes, address _to) internal virtual { for (uint i = 0; i < routes.length; i++) { (address token0, ) = sortTokens(routes[i].from, routes[i].to); uint amountOut = amounts[i + 1]; (uint amount0Out, uint amount1Out) = routes[i].from == token0 ? (uint(0), amountOut) : (amountOut, uint(0)); address to = i < routes.length - 1 ? pairFor(routes[i + 1].from, routes[i + 1].to, routes[i + 1].stable) : _to; IBaseV1Pair(pairFor(routes[i].from, routes[i].to, routes[i].stable)).swap(amount0Out, amount1Out, to, new bytes(0)); emit Swap(msg.sender, amounts[i], routes[i].from, _to, routes[i].stable); } } function swapExactTokensForTokensSimple( uint amountIn, uint amountOutMin, address tokenFrom, address tokenTo, bool stable, address to, uint deadline ) public ensure(deadline) returns (uint[] memory amounts) { route[] memory routes = new route[](1); routes[0].from = tokenFrom; routes[0].to = tokenTo; routes[0].stable = stable; amounts = getAmountsOut(amountIn, routes); require(amounts[amounts.length - 1] >= amountOutMin, "BaseV1Router: INSUFFICIENT_OUTPUT_AMOUNT"); _safeTransferFrom(routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]); _swap(amounts, routes, to); } function swapExactTokensForTokens( uint amountIn, uint amountOutMin, route[] memory routes, address to, uint deadline ) public ensure(deadline) returns (uint[] memory amounts) { amounts = getAmountsOut(amountIn, routes); require(amounts[amounts.length - 1] >= amountOutMin, "BaseV1Router: INSUFFICIENT_OUTPUT_AMOUNT"); _safeTransferFrom(routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]); _swap(amounts, routes, to); } function swapExactETHForTokens( uint amountOutMin, route[] memory routes, address to, uint deadline ) public payable ensure(deadline) returns (uint[] memory amounts) { require(routes[0].from == address(wETH), "BaseV1Router: INVALID_PATH"); amounts = getAmountsOut(msg.value, routes); require(amounts[amounts.length - 1] >= amountOutMin, "BaseV1Router: INSUFFICIENT_OUTPUT_AMOUNT"); wETH.deposit{value: amounts[0]}(); assert(wETH.transfer(pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0])); _swap(amounts, routes, to); } function swapExactTokensForETH( uint amountIn, uint amountOutMin, route[] memory routes, address to, uint deadline ) public ensure(deadline) returns (uint[] memory amounts) { require(routes[routes.length - 1].to == address(wETH), "BaseV1Router: INVALID_PATH"); amounts = getAmountsOut(amountIn, routes); require(amounts[amounts.length - 1] >= amountOutMin, "BaseV1Router: INSUFFICIENT_OUTPUT_AMOUNT"); _safeTransferFrom(routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]); _swap(amounts, routes, address(this)); wETH.withdraw(amounts[amounts.length - 1]); _safeTransferETH(to, amounts[amounts.length - 1]); } function UNSAFE_swapExactTokensForTokens( uint[] memory amounts, route[] memory routes, address to, uint deadline ) public ensure(deadline) returns (uint[] memory) { _safeTransferFrom(routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]); _swap(amounts, routes, to); return amounts; } function _safeTransferETH(address to, uint value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); require(success, "TransferHelper: ETH_TRANSFER_FAILED"); } 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)))); } function _safeTransferFrom(address token, address from, address to, uint256 value) internal { require(token.code.length > 0); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(erc20.transferFrom.selector, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool)))); } // Experimental Extension [ETH.guru/solidly/BaseV1Router02] // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens)**** function removeLiquidityETHSupportingFeeOnTransferTokens( address token, bool stable, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) public ensure(deadline) returns (uint amountToken, uint amountETH) { (amountToken, amountETH) = removeLiquidity( token, address(wETH), stable, liquidity, amountTokenMin, amountETHMin, address(this), deadline ); _safeTransfer(token, to, erc20(token).balanceOf(address(this))); wETH.withdraw(amountETH); _safeTransferETH(to, amountETH); } function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, bool stable, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) public returns (uint amountToken, uint amountETH) { address pair = pairFor(token, address(wETH), stable); uint value = approveMax ? type(uint).max : liquidity; _trustlessPermit(pair, msg.sender, address(this), value, deadline, v, r, s); (amountToken, amountETH) = removeLiquidityETHSupportingFeeOnTransferTokens( token, stable, liquidity, amountTokenMin, amountETHMin, to, deadline ); } // **** SWAP (supporting fee-on-transfer tokens) **** // requires the initial amount to have already been sent to the first pair function _swapSupportingFeeOnTransferTokens(route[] memory routes, address _to) internal virtual { for (uint i; i < routes.length; i++) { (address input, address output) = (routes[i].from, routes[i].to); (address token0, ) = sortTokens(input, output); IBaseV1Pair pair = IBaseV1Pair(pairFor(routes[i].from, routes[i].to, routes[i].stable)); uint amountInput; uint amountOutput; { // scope to avoid stack too deep errors (uint reserve0, uint reserve1, ) = pair.getReserves(); (uint reserveInput, ) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0); amountInput = erc20(input).balanceOf(address(pair)).sub(reserveInput); (amountOutput, ) = getAmountOut(amountInput, input, output); } (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0)); address to = i < routes.length - 1 ? pairFor(routes[i + 1].from, routes[i + 1].to, routes[i + 1].stable) : _to; pair.swap(amount0Out, amount1Out, to, new bytes(0)); bool _stable = routes[i].stable; emit Swap(msg.sender, amountInput, input, _to, _stable); } } function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, route[] memory routes, address to, uint deadline ) public ensure(deadline) { _safeTransferFrom(routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amountIn); uint balanceBefore = erc20(routes[routes.length - 1].to).balanceOf(to); _swapSupportingFeeOnTransferTokens(routes, to); require( erc20(routes[routes.length - 1].to).balanceOf(to).sub(balanceBefore) >= amountOutMin, "BaseV1Router: INSUFFICIENT_OUTPUT_AMOUNT" ); } function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, route[] memory routes, address to, uint deadline ) public payable ensure(deadline) { require(routes[0].from == address(wETH), "BaseV1Router: INVALID_PATH"); uint amountIn = msg.value; wETH.deposit{value: amountIn}(); assert(wETH.transfer(pairFor(routes[0].from, routes[0].to, routes[0].stable), amountIn)); uint balanceBefore = erc20(routes[routes.length - 1].to).balanceOf(to); _swapSupportingFeeOnTransferTokens(routes, to); require( erc20(routes[routes.length - 1].to).balanceOf(to).sub(balanceBefore) >= amountOutMin, "BaseV1Router: INSUFFICIENT_OUTPUT_AMOUNT" ); } function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, route[] memory routes, address to, uint deadline ) public ensure(deadline) { require(routes[routes.length - 1].to == address(wETH), "BaseV1Router: INVALID_PATH"); _safeTransferFrom(routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amountIn); _swapSupportingFeeOnTransferTokens(routes, address(this)); uint amountOut = erc20(address(wETH)).balanceOf(address(this)); require(amountOut >= amountOutMin, "BaseV1Router: INSUFFICIENT_OUTPUT_AMOUNT"); wETH.withdraw(amountOut); _safeTransferETH(to, amountOut); } function _trustlessPermit( address token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { // Try permit() before allowance check to advance nonce if possible try IBaseV1Pair(token).permit(owner, spender, value, deadline, v, r, s) { return; } catch { // Permit potentially got frontran. Continue anyways if allowance is sufficient. if (erc20(token).allowance(owner, spender) >= value) { return; } } revert("Permit failure"); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (proxy/Clones.sol) pragma solidity ^0.8.0; /** * @dev https://eips.ethereum.org/EIPS/eip-1167[EIP 1167] is a standard for * deploying minimal proxy contracts, also known as "clones". * * > To simply and cheaply clone contract functionality in an immutable way, this standard specifies * > a minimal bytecode implementation that delegates all calls to a known, fixed address. * * The library includes functions to deploy a proxy using either `create` (traditional deployment) or `create2` * (salted deterministic deployment). It also includes functions to predict the addresses of clones deployed using the * deterministic method. * * _Available since v3.4._ */ library Clones { /** * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. * * This function uses the create opcode, which should never revert. */ function clone(address implementation) internal returns (address instance) { /// @solidity memory-safe-assembly assembly { // Cleans the upper 96 bits of the `implementation` word, then packs the first 3 bytes // of the `implementation` address with the bytecode before the address. mstore(0x00, or(shr(0xe8, shl(0x60, implementation)), 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000)) // Packs the remaining 17 bytes of `implementation` with the bytecode after the address. mstore(0x20, or(shl(0x78, implementation), 0x5af43d82803e903d91602b57fd5bf3)) instance := create(0, 0x09, 0x37) } require(instance != address(0), "ERC1167: create failed"); } /** * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. * * This function uses the create2 opcode and a `salt` to deterministically deploy * the clone. Using the same `implementation` and `salt` multiple time will revert, since * the clones cannot be deployed twice at the same address. */ function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) { /// @solidity memory-safe-assembly assembly { // Cleans the upper 96 bits of the `implementation` word, then packs the first 3 bytes // of the `implementation` address with the bytecode before the address. mstore(0x00, or(shr(0xe8, shl(0x60, implementation)), 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000)) // Packs the remaining 17 bytes of `implementation` with the bytecode after the address. mstore(0x20, or(shl(0x78, implementation), 0x5af43d82803e903d91602b57fd5bf3)) instance := create2(0, 0x09, 0x37, salt) } require(instance != address(0), "ERC1167: create2 failed"); } /** * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. */ function predictDeterministicAddress( address implementation, bytes32 salt, address deployer ) internal pure returns (address predicted) { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) mstore(add(ptr, 0x38), deployer) mstore(add(ptr, 0x24), 0x5af43d82803e903d91602b57fd5bf3ff) mstore(add(ptr, 0x14), implementation) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73) mstore(add(ptr, 0x58), salt) mstore(add(ptr, 0x78), keccak256(add(ptr, 0x0c), 0x37)) predicted := keccak256(add(ptr, 0x43), 0x55) } } /** * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. */ function predictDeterministicAddress( address implementation, bytes32 salt ) internal view returns (address predicted) { return predictDeterministicAddress(implementation, salt, address(this)); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.0; interface IPairFactory { event PairCreated(address indexed token0, address indexed token1, bool stable, address pair, uint); event SetPaused(bool state); event SetCommunityVaultFactory(address indexed communityVaultFactory); event SetIsPublicPoolCreationMode(bool mode); event SetProtocolFee(uint256 fee); event SetCustomProtocolFee(address indexed pair, uint256 fee); event SetCustomFee(address indexed pair, uint256 fee); event SetFee(bool stable, uint256 fee); /** * @dev Emitted when the rebasing tokens governor address is set. * * @param oldRebasingTokensGovernor The previous address of the rebasing tokens governor. * @param newRebasingTokensGovernor The new address of the rebasing tokens governor. */ event SetRebasingTokensGovernor(address indexed oldRebasingTokensGovernor, address indexed newRebasingTokensGovernor); error IncorrcectFee(); error IncorrectPair(); error IdenticalAddress(); error PairExist(); function implementation() external view returns (address); function PAIRS_ADMINISTRATOR_ROLE() external view returns (bytes32); function FEES_MANAGER_ROLE() external view returns (bytes32); function PAIRS_CREATOR_ROLE() external view returns (bytes32); function hasRole(bytes32 role, address user) external view returns (bool); function allPairsLength() external view returns (uint); function isPair(address pair) external view returns (bool); function allPairs(uint index) external view returns (address); function getPair(address tokenA, address token, bool stable) external view returns (address); function createPair(address tokenA, address tokenB, bool stable) external returns (address pair); function pairs() external view returns (address[] memory); function getFee(address pair_, bool stable_) external view returns (uint256); function getHookTarget(address pair_) external view returns (address); function getProtocolFee(address pair_) external view returns (uint256); function isPaused() external view returns (bool); function isPublicPoolCreationMode() external view returns (bool); }
{ "evmVersion": "paris", "viaIR": true, "optimizer": { "enabled": true, "runs": 2000 }, "metadata": { "bytecodeHash": "none" }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_blastGovernor","type":"address"},{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_wETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"address","name":"_tokenIn","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"bool","name":"stable","type":"bool"}],"name":"Swap","type":"event"},{"inputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct RouterV2.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"UNSAFE_swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"stable","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct RouterV2.route[]","name":"routes","type":"tuple[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"getReserves","outputs":[{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"isPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"pairFor","outputs":[{"internalType":"address","name":"pair","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"}],"name":"quoteAddLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"quoteRemoveLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"sortTokens","outputs":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct RouterV2.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct RouterV2.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct RouterV2.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct RouterV2.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct RouterV2.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address","name":"tokenFrom","type":"address"},{"internalType":"address","name":"tokenTo","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSimple","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct RouterV2.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wETH","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c0346200019657601f62003a2a38819003918201601f1916830192916001600160401b03918285118486101762000175578160609285926040978852833981010312620001965762000052826200019b565b916200006e8462000066602084016200019b565b92016200019b565b9173430000000000000000000000000000000000000290813b1562000196578551631d70c8d360e31b81526001600160a01b039586166004820152916000908390602490829084905af180156200018b5762000164575b50506080521660a052516138799081620001b1823960805181818161057d015281816108ad01528181610d2901528181612246015281816123d8015281816127b101528181612af40152612d64015260a051818181602a015281816101b4015281816105180152818161060e015281816106b3015281816109070152818161106e015281816111fd015281816115e8015281816119a20152611a920152f35b8111620001755784523880620000c5565b634e487b7160e01b600052604160045260246000fd5b86513d6000823e3d90fd5b600080fd5b51906001600160a01b0382168203620001965756fe604060808152600480361015610053575b5050361561001d57600080fd5b6100516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633146120ed565b005b6000803560e01c80630dede6c414611d0f57806313dcfc5914611bd257806318a1308614611a375780634386e63c146119fe578063448725b4146119755780634c1ee03e1461192e578063544caa56146118df5780635a47ddc3146117a85780635e1e63251461176c5780635e60dab51461173757806367ffb66a146115ae5780636cc1ae131461154c5780637301e3c81461145657806376c72751146111c35780637af728c81461100f5780639881fcb414610fc257806398a0fb3c14610ca3578063a32b1fcd14610acf578063b7e0d4c0146108d1578063c45a01551461088d578063d7b0e0a514610673578063e2d9d4dc146105e1578063e5e31b131461053c578063f2428621146104f8578063f41766d8146104135763fe411f141461017d5750610010565b3461032d5761018b3661209f565b97929795919395949094421115936101a285612bf2565b6101e16001600160a01b03926101da847f00000000000000000000000000000000000000000000000000000000000000001697612bf2565b8685612206565b8a516323b872dd60e01b8152338682019081526001600160a01b038316602082810191909152604082019a909a529184169189908290819060600103818d865af1908115610409578a916103dc575b50156103d857908a89969594939260248251809c819363226bf2d160e21b8352308a8401525af19889156103ce578690879a610395575b50610272868561210a565b5084841693168303610380579161029d8992610295602496959d8e5b1015612c3d565b8b1015612cae565b8b51938480926370a0823160e01b825230888301525afa908115610376578690869261033e575b6102ce935061328b565b813b1561033a578560248492838b519586948593632e1a7d4d60e01b85528401525af180156103305790859291610315575b505061030b916131fa565b8351928352820152f35b81925061032190611e7f565b61032d57808491610300565b80fd5b87513d84823e3d90fd5b8280fd5b9150508682813d831161036f575b6103568183611eaf565b8101031261036a57856102ce9251916102c4565b600080fd5b503d61034c565b8a513d87823e3d90fd5b989161029d8992610295602496959d8e61028e565b809a508c8092503d83116103c7575b6103ae8183611eaf565b810103126103c3578789519901519838610267565b8580fd5b503d6103a4565b8b513d88823e3d90fd5b8880fd5b6103fc9150893d8b11610402575b6103f48183611eaf565b8101906123b2565b38610230565b503d6103ea565b8c513d8c823e3d90fd5b5082346104f45761043861043d61042936611f91565b95829593949196421115612bf2565b61274d565b9485519060001982019182116104e1576104dd87876104d3888861046d896104658a88612714565b511015612ec9565b6104cd6001600160a01b036104bb81610485856126f1565b5151169180610493866126f1565b5151169060206104a2876126f1565b51015116886104b0876126f1565b510151151591612206565b6104c4886126f1565b51913390613326565b84612f9f565b5191829182611e12565b0390f35b80601189634e487b7160e01b6024945252fd5b5080fd5b5082346104f457816003193601126104f457602090516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b50913461033a57602060031936011261033a576020610559611d97565b92602483518095819363e5e31b1360e01b83526001600160a01b03809216908301527f0000000000000000000000000000000000000000000000000000000000000000165afa9182156105d757602093926105b8575b50519015158152f35b6105d0919250833d8111610402576103f48183611eaf565b90386105af565b81513d85823e3d90fd5b5090346104f45781906105f336611fdf565b97809b9885928b9598979c999f946001600160a01b03998b8b7f0000000000000000000000000000000000000000000000000000000000000000169e8f61063992612206565b6101e1996101da985061065c9690921561066d5750600019905b309033906136ed565b42111561066881612bf2565b612bf2565b90610653565b5091903461033a5760206106d9936106e061071c936106913661209f565b9a929a999194979099421115976106a789612bf2565b6001600160a01b039d8e7f00000000000000000000000000000000000000000000000000000000000000001699612bf2565b8887612206565b8b516323b872dd60e01b8152338882019081526001600160a01b03831660208201526040810195909552908d1693909283918291606090910190565b03818a865af1908115610883578791610865575b50156103c357888691602482518094819363226bf2d160e21b8352308a8401525af1998a1561085b578691879b610821575b509261079a999a928892856107a79661077b8a8661210a565b50169084161460001461081257906107a2919b8c959b5b861015612c3d565b8a1015612cae565b61328b565b813b1561033a578460248492838a519586948593632e1a7d4d60e01b85528401525af1801561080857908492916107f0575b50506107e4916131fa565b82519182526020820152f35b8192506107fc90611e7f565b61032d578083916107d9565b86513d84823e3d90fd5b93906107a2919b8c959b610792565b8a80929c508193503d8311610854575b61083b8183611eaf565b810103126103c3578051602090910151996107a7610762565b503d610831565b89513d88823e3d90fd5b61087d915060203d8111610402576103f48183611eaf565b38610730565b8a513d89823e3d90fd5b5082346104f457816003193601126104f457602090516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b61093c6109458484876109326108fb6108e93661209f565b9b93949b979296909597421115612bf2565b6001600160a01b0395867f0000000000000000000000000000000000000000000000000000000000000000169434908d878b612d1f565b9a819a8488612206565b80963390613326565b803b156103c3578451630d0e30db60e41b8152868189818d865af18015610aaa57859288928a92610ab4575b506109ab908c895194858094819363a9059cbb60e01b835260209c8d988401602090939291936001600160a01b0360408201951681520152565b03925af1908115610aaa57846024936109d0889796948b948591610a8d575b506120ed565b88519a8b9687957f6a6278420000000000000000000000000000000000000000000000000000000087521690850152165af1928315610a825792610a50575b506104dd9250843411610a38575b51938493846040919493926060820195825260208201520152565b610a4b610a4586346129ad565b336131fa565b610a1d565b90915082813d8311610a7b575b610a678183611eaf565b8101031261036a576104dd91519085610a0f565b503d610a5d565b8251903d90823e3d90fd5b610aa49150893d8b11610402576103f48183611eaf565b8f6109ca565b86513d89823e3d90fd5b909350610ac19150611e7f565b6103c357858785928c610971565b5090346104f4576101806003193601126104f457610aeb611d97565b610af3611dad565b92610afc611e03565b9060643591610b09611dc3565b90610104359060e435821515830361036a57610124359060ff8216820361036a57610b5f610b6792610b6e95610b40868e8d612206565b9015610c9c57600019915b8461016435936101443593309033906136ed565b421115612bf2565b8786612206565b87516323b872dd60e01b8152338782019081526001600160a01b0392831660208281018290526040830197909752929590829081906060015b038187865af1908115610c92578491610c74575b501561033a57602488928486938551998a95869463226bf2d160e21b865216908401525af1948515610c685781948296610c2e575b5090610bfd83928561210a565b50905016911614600014610c2957905b610c1b608435831015612c3d565b6107e460a435821015612cae565b610c0d565b87809297508196503d8311610c61575b610c488183611eaf565b8101031261032d57835160209094015194610bfd610bf0565b503d610c3e565b508551903d90823e3d90fd5b610c8c915060203d8111610402576103f48183611eaf565b38610bbb565b89513d86823e3d90fd5b8991610b4b565b5082903461032d5760a060031936011261032d57610cbf611d97565b91610cc8611dad565b9184610cd2611e03565b60643594608435968551926306801cc360e41b845283610d18828585602099850191939260409160608401956001600160a01b0380921685521660208401521515910152565b039285856001600160a01b039581877f0000000000000000000000000000000000000000000000000000000000000000165afa948515610fb857908b92918896610f89575b508796889589971680610ef1575b505050505050821580610ee9575b15610e6757505050610d8b848461297a565b90806003831115610e58575081600181811c818101809111610e455791905b848310610e0e575050505b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc188201918211610dfb575090519182526020820192909252604081019190915260609150f35b80601187634e487b7160e01b6024945252fd5b9193509083610e1d818461298d565b908101809111610e3057811c9190610daa565b601189634e487b7160e01b6000525260246000fd5b60248460118b634e487b7160e01b835252fd5b9115610db55760019150610db5565b909592919650610e788188876129ba565b92808411610ec05750610ea790610e9c6104dd9697610ea1869a610e9c838c61297a565b61298d565b9561297a565b905080821015610eb957505b90610a1d565b9050610eb3565b92506104dd945080610e9c610ed989610ea794876129ba565b97610ea1869a610e9c838c61297a565b508015610d79565b91949750929550829194508851958680927f18160ddd0000000000000000000000000000000000000000000000000000000082525afa908115610f7f578691610f4f575b50610f419350936122f2565b919091888881808080610d6b565b905083813d8311610f78575b610f658183611eaf565b8101031261036a57610f4192518a610f35565b503d610f5b565b87513d88823e3d90fd5b610faa919650873d8911610fb1575b610fa28183611eaf565b8101906121e7565b948c610d5d565b503d610f98565b88513d89823e3d90fd5b5082903461032d578160031936011261032d576024359067ffffffffffffffff821161032d57506104dd92610ffd6110049236908301611eea565b903561274d565b905191829182611e12565b5082346104f45761102f61102236611f91565b9593949095421115612bf2565b80519360001985019485116111b05761106394926110dc8895936110d58b946001600160a01b03809860209b8c9186612714565b5101511697611096817f000000000000000000000000000000000000000000000000000000000000000016809a146126a6565b6110cd816110a3866126f1565b51511691806110b1876126f1565b515116908d6110bf886126f1565b510151168a6104b0886126f1565b903390613326565b30906133d1565b82516370a0823160e01b815230838201528681602481885afa9687156111a6578697611170575b505061111190861015612ec9565b823b1561116c5784602485928385519687948593632e1a7d4d60e01b85528401525af1908115611163575061114f575b505061114c916131fa565b80f35b61115890611e7f565b61033a578284611141565b513d84823e3d90fd5b8380fd5b809297508196503d831161119f575b6111898183611eaf565b8101031261036a57611111879451959089611103565b503d61117f565b84513d88823e3d90fd5b60248760118a634e487b7160e01b835252fd5b50916111e0906111d236612054565b959294909195421115612bf2565b6001600160a01b0391826111f3876126f1565b51511691611225847f0000000000000000000000000000000000000000000000000000000000000000168094146126a6565b823b1561145257878551630d0e30db60e41b81528181858134895af180156103305761143e575b50611281936112b38661125e8b6126f1565b5151169160209687938c8b6104b08c88611277856126f1565b51015116926126f1565b895194858094819363a9059cbb60e01b835234908b8401602090939291936001600160a01b0360408201951681520152565b03925af190811561143457906112cf918a9161141757506120ed565b8651936000199485810190811161140457846112ec83928b612714565b51015116948651986370a0823160e01b93848b52868b6024818785169b8c8b8301525afa9a8b156113fa578c9b6113c9575b5061132990826133d1565b80519182019182116113b657918561134681969593602495612714565b510151168751968794859384528301525afa9283156113ad5750859261137d575b505061114c9261137691613378565b1015612ec9565b90809250813d83116113a6575b6113948183611eaf565b8101031261036a575182611376611367565b503d61138a565b513d87823e3d90fd5b60248b601187634e487b7160e01b835252fd5b909a508681813d83116113f3575b6113e18183611eaf565b8101031261036a57519961132961131e565b503d6113d7565b89513d8e823e3d90fd5b60248a601186634e487b7160e01b835252fd5b61142e9150853d8711610402576103f48183611eaf565b386109ca565b86513d8b823e3d90fd5b6114488291611e7f565b61032d573861124c565b8780fd5b50913461033a57608060031936011261033a5781359167ffffffffffffffff808411611548573660238501121561154857838201359461149586611ed2565b946114a285519687611eaf565b86865260209660248888019160051b8301019136831161116c57906024899201905b838210611539575050505060243591821161032d5750936114ee6104d3926104dd96369101611eea565b6104cd6114f9611dd9565b92611508426064351015612bf2565b6104bb6001600160a01b03918261151e866126f1565b515116928061152c876126f1565b515116916104a2876126f1565b813581529082019082016114c4565b8480fd5b50913461033a576115709061156036611f91565b9691969590939295421115612bf2565b6001600160a01b03926112cf84611586896126f1565b51511693856115948a6126f1565b515116946110cd6020968b8a6104b08b8b611277856126f1565b50916115cb6115bc36612054565b95919295939093421115612bf2565b6001600160a01b0390816115de846126f1565b51511691611610817f0000000000000000000000000000000000000000000000000000000000000000168094146126a6565b61161a843461274d565b96875160001981019081116114045790610465611637928a612714565b87611641886126f1565b51843b156104f457818491895192838092630d0e30db60e41b8252895af1801561172d57611715575b5050906116d99261169d83602094611681886126f1565b515116908561168f896126f1565b51015116896104b0896126f1565b896116a78a6126f1565b519389519687958694859363a9059cbb60e01b85528401602090939291936001600160a01b0360408201951681520152565b03925af19081156111a6576104d39392916104cd916104dd98916116fd57506120ed565b61142e915060203d8111610402576103f48183611eaf565b61172190939293611e7f565b6114525790873861166a565b88513d84823e3d90fd5b83823461032d57606060031936011261032d57506107e4611756611d97565b61175e611dad565b611766611e03565b916122f2565b503461032d57606060031936011261032d575061179a9061178b611dad565b611793611dd9565b91356123ca565b825191825215156020820152f35b5082903461032d5761012060031936011261032d576117c5611d97565b906117ce611dad565b926117d7611e03565b9260e4356001600160a01b0380821680920361036a5761184197856024926118486118366020976118288c8e61181242610104351015612bf2565b60c4359160a43591608435916064359187612d1f565b9e8f93829f929e8385612206565b9d8e80943390613326565b3390613326565b865198899586947f6a627842000000000000000000000000000000000000000000000000000000008652850152165af19182156118d4579161189f575b519283526020830193909352506040810191909152606090f35b90506020823d82116118cc575b816118b960209383611eaf565b8101031261036a576104dd915190611885565b3d91506118ac565b9051903d90823e3d90fd5b5082346104f457806003193601126104f4576104dd9061190e611900611d97565b611908611dad565b9061210a565b91516001600160a01b039182168152911660208201529081906040820190565b5082346104f45760606003193601126104f4576020906001600160a01b0361196d611957611d97565b61195f611dad565b611967611e03565b91612206565b915191168152f35b5091903461033a5761198636611fdf565b9297939c988d6001600160a01b039c989c9b97969b9392939e8f7f0000000000000000000000000000000000000000000000000000000000000000169a6119ce848d8c612206565b90600014966020966106e0966106d99561065c9461071c9b6119f75760001990309033906136ed565b8c90610653565b83823461032d57608060031936011261032d57506107e4611a1d611d97565b611a25611dad565b611a2d611e03565b9060643592612ab7565b5082346104f457611a5b611a4a36611f91565b969296949094939193421115612bf2565b82519260001993848101908111610e4557611aba82611a879260206001600160a01b0394859284612714565b5101511694610438847f0000000000000000000000000000000000000000000000000000000000000000168097146126a6565b978851868101908111611bbf5791611add611b1e92610465611b2696958d612714565b611b1581611aea856126f1565b5151169180611af8866126f1565b515116906020611b07876126f1565b510151168b6104b0876126f1565b6104c48b6126f1565b309088612f9f565b8551838101908111611bac57611b3c9087612714565b51813b1561033a5782916024839288519485938492632e1a7d4d60e01b84528d8401525af18015611ba257611b93575b508451918201918211610dfb576104dd85856104d386611b8c8785612714565b51906131fa565b611b9c90611e7f565b86611b6c565b85513d84823e3d90fd5b60248360118a634e487b7160e01b835252fd5b60248660118d634e487b7160e01b835252fd5b50913461033a5760e060031936011261033a57611bed611dd9565b606435926001600160a01b03908185168095036103c35760843591821515809303611d0b5760a43590808216820361145257611c2d4260c4351015612bf2565b85519386850185811067ffffffffffffffff821117611cf857875260018552885b602080821015611c7f57885160209291611c6782611e4d565b8c82528c818301528c8b830152828901015201611c4e565b50509194979690929783611c92866126f1565b51911690526020611ca2856126f1565b51015284611caf846126f1565b510152611cbd82873561274d565b9485519060001982019182116104e1576104dd87876104d388886104cd89611ceb6024356104658c8a612714565b6104bb81610485856126f1565b60248a604187634e487b7160e01b835252fd5b8680fd5b5090346104f4576101006003193601126104f457611d2b611d97565b611d33611dad565b92611d3c611e03565b90611d57611d48611dc3565b926101da4260e4351015612bf2565b86516323b872dd60e01b8152338682019081526001600160a01b039283166020828101829052606435604084015293959390929182908190606001610ba7565b600435906001600160a01b038216820361036a57565b602435906001600160a01b038216820361036a57565b60c435906001600160a01b038216820361036a57565b604435906001600160a01b038216820361036a57565b35906001600160a01b038216820361036a57565b60443590811515820361036a57565b6020908160408183019282815285518094520193019160005b828110611e39575050505090565b835185529381019392810192600101611e2b565b6060810190811067ffffffffffffffff821117611e6957604052565b634e487b7160e01b600052604160045260246000fd5b67ffffffffffffffff8111611e6957604052565b6020810190811067ffffffffffffffff821117611e6957604052565b90601f601f19910116810190811067ffffffffffffffff821117611e6957604052565b67ffffffffffffffff8111611e695760051b60200190565b81601f8201121561036a57803590611f0182611ed2565b92604090611f1182519586611eaf565b838552602091828601918360608097028601019481861161036a578401925b858410611f41575050505050505090565b868483031261036a57825190611f5682611e4d565b611f5f85611def565b8252611f6c868601611def565b868301528385013590811515820361036a57828792868b950152815201930192611f30565b60a060031982011261036a5760043591602435916044359067ffffffffffffffff821161036a57611fc491600401611eea565b906064356001600160a01b038116810361036a579060843590565b60031961016091011261036a576001600160a01b0390600435828116810361036a5791602435801515810361036a579160443591606435916084359160a435908116810361036a579060c4359060e435801515810361036a57906101043560ff8116810361036a579061012435906101443590565b90608060031983011261036a57600435916024359067ffffffffffffffff821161036a5761208491600401611eea565b906044356001600160a01b038116810361036a579060643590565b60031960e091011261036a576001600160a01b0390600435828116810361036a5791602435801515810361036a579160443591606435916084359160a435908116810361036a579060c43590565b156120f457565b634e487b7160e01b600052600160045260246000fd5b90916001600160a01b039182841683821681811461217d57101561217857925b9183161561213457565b606460405162461bcd60e51b815260206004820152601a60248201527f426173655631526f757465723a205a45524f5f414444524553530000000000006044820152fd5b61212a565b608460405162461bcd60e51b815260206004820152602160248201527f426173655631526f757465723a204944454e544943414c5f414444524553534560448201527f53000000000000000000000000000000000000000000000000000000000000006064820152fd5b9081602091031261036a57516001600160a01b038116810361036a5790565b6040516306801cc360e41b81526001600160a01b039182166004820152911660248201529015156044820152602081806064810103816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa9081156122955760009161227a575090565b612292915060203d8111610fb157610fa28183611eaf565b90565b6040513d6000823e3d90fd5b51906dffffffffffffffffffffffffffff8216820361036a57565b9081606091031261036a576122d0816122a1565b9160406122df602084016122a1565b92015163ffffffff8116810361036a5790565b600491926060612302858461210a565b50946123186001600160a01b0393849286612206565b16604051948580927f0902f1ac0000000000000000000000000000000000000000000000000000000082525afa928315612295576000908194612380575b5081906dffffffffffffffffffffffffffff8091169416941691161460001461237c5791565b9091565b8294506123a4915060603d81116123ab575b61239c8183611eaf565b8101906122bc565b5093612356565b503d612392565b9081602091031261036a5751801515810361036a5790565b91906001600160a01b0390817f0000000000000000000000000000000000000000000000000000000000000000166040918251916306801cc360e41b968784528583169580600498888a8801521698896024870152600160448701526020958681606481885afa9081156125cd57600091612689575b5060009a8b998b8a518663e5e31b1360e01b958683521680928201528a816024818c5afa90811561267d578f91612660575b506125d8575b5089519384528b8401526024830152600060448301528682606481885afa9182156125cd57908792916000926125ab575b506024908951948593849283521696878d8301525afa9081156125a057600091612583575b506124f3575b505050505090508082116000146124ec575090600190565b9160009150565b84955061252b96849551978894859384936378a051ad60e11b855284019092916001600160a01b036020916040840195845216910152565b03915afa918215612579575060009161254d575b5090508038808080806124d4565b82813d8311612572575b6125618183611eaf565b8101031261032d575051803861253f565b503d612557565b513d6000823e3d90fd5b61259a9150853d8711610402576103f48183611eaf565b386124ce565b86513d6000823e3d90fd5b60249192506125c690843d8611610fb157610fa28183611eaf565b91906124a9565b88513d6000823e3d90fd5b8a516378a051ad60e11b8152808e018881526001600160a01b038b166020820152929e9290918b918391908290819060400103915afa918215612655578092612625575b50509b38612478565b9091508982813d831161264e575b61263d8183611eaf565b8101031261032d575051388061261c565b503d612633565b8b51903d90823e3d90fd5b61267791508b3d8d11610402576103f48183611eaf565b38612472565b8f8d51903d90823e3d90fd5b6126a09150873d8911610fb157610fa28183611eaf565b38612440565b156126ad57565b606460405162461bcd60e51b815260206004820152601a60248201527f426173655631526f757465723a20494e56414c49445f504154480000000000006044820152fd5b8051156126fe5760200190565b634e487b7160e01b600052603260045260246000fd5b80518210156126fe5760209160051b010190565b60001981146127375760010190565b634e487b7160e01b600052601160045260246000fd5b9190600161275e81835110156126a6565b81518181018091116127375761277381611ed2565b601f1961279060409361278885519485611eaf565b808452611ed2565b0193602094368684013781966127a5836126f1565b526001600160a01b03907f000000000000000000000000000000000000000000000000000000000000000082166000865b6127e5575b5050505050505050565b82518110156129755761281a846127fc8386612714565b515116858a61280b8588612714565b51015116886104b08588612714565b8487519163e5e31b1360e01b8352169060049180838301526024918b818481895afa90811561296a57918c918c98979695949360009161294d575b50612870575b5050505061286890612728565b9091926127d6565b84959697506128826128c3958b612714565b51908961288f888b612714565b515116918c518097819482936378a051ad60e11b84528984019092916001600160a01b036020916040840195845216910152565b03915afa92831561294257600093612913575b508984019182851161290057505091612868916128f68a96959489612714565b5290388a8161285b565b601190634e487b7160e01b600052526000fd5b90928b82813d831161293b575b61292a8183611eaf565b8101031261032d57505191386128d6565b503d612920565b89513d6000823e3d90fd5b6129649150833d8511610402576103f48183611eaf565b38612855565b8a513d6000823e3d90fd5b6127db565b8181029291811591840414171561273757565b8115612997570490565b634e487b7160e01b600052601260045260246000fd5b9190820391821161273757565b8015612a4d5781151580612a44575b156129db5761229292610e9c9161297a565b608460405162461bcd60e51b8152602060048201526024808201527f426173655631526f757465723a20494e53554646494349454e545f4c4951554960448201527f44495459000000000000000000000000000000000000000000000000000000006064820152fd5b508215156129c9565b608460405162461bcd60e51b815260206004820152602160248201527f426173655631526f757465723a20494e53554646494349454e545f414d4f554e60448201527f54000000000000000000000000000000000000000000000000000000000000006064820152fd5b6040516306801cc360e41b81526001600160a01b0382811660048301528381166024830152841515604483015294959460209492939185816064817f000000000000000000000000000000000000000000000000000000000000000086165afa90811561229557600091612bd5575b5016928315612bc657849392600492612b3e926122f2565b949092604051928380927f18160ddd0000000000000000000000000000000000000000000000000000000082525afa92831561229557600093612b93575b505061229292610ea183610e9c610e9c948961297a565b8181949293943d8311612bbf575b612bab8183611eaf565b8101031261032d5750519082610ea1612b7c565b503d612ba1565b50505050509050600090600090565b612bec9150863d8811610fb157610fa28183611eaf565b38612b26565b15612bf957565b606460405162461bcd60e51b815260206004820152601560248201527f426173655631526f757465723a204558504952454400000000000000000000006044820152fd5b15612c4457565b608460405162461bcd60e51b815260206004820152602360248201527f426173655631526f757465723a20494e53554646494349454e545f415f414d4f60448201527f554e5400000000000000000000000000000000000000000000000000000000006064820152fd5b15612cb557565b608460405162461bcd60e51b815260206004820152602360248201527f426173655631526f757465723a20494e53554646494349454e545f425f414d4f60448201527f554e5400000000000000000000000000000000000000000000000000000000006064820152fd5b919095929594939484871061036a5783861061036a576040516306801cc360e41b81526001600160a01b038481166004830152828116602483015283151560448301527f0000000000000000000000000000000000000000000000000000000000000000811694916020919082816064818a5afa90811561229557600091612eac575b501615612e24575b50612db593506122f2565b9290801580612e1c575b15612dcd575050505090915b565b612ddc848288979596976129ba565b94838611612df4575050505061237c90821015612cae565b83955061237c945090612e0b91612e1493946129ba565b948511156120ed565b831015612c3d565b508315612dbf565b6040517f82dfdce40000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152841660248201528415156044820152948190869060649082906000905af194851561229557612db595612e8e575b50612daa565b81612ea492903d10610fb157610fa28183611eaf565b503880612e88565b612ec39150833d8511610fb157610fa28183611eaf565b38612da2565b15612ed057565b608460405162461bcd60e51b815260206004820152602860248201527f426173655631526f757465723a20494e53554646494349454e545f4f5554505560448201527f545f414d4f554e540000000000000000000000000000000000000000000000006064820152fd5b926001600160a01b03919594958452602092838501521660408301526080606083015283519384608084015260005b858110612f8b57505050601f19601f84600060a0809697860101520116010190565b81810183015184820160a001528201612f69565b929160005b82518110156131b3576001600160a01b0380612fc08386612714565b515116612fdf6020918383612fd5878a612714565b510151169061210a565b5090600184019182851161273757612ff7838a612714565b51908480613005888b612714565b5151169116146000146131ab57600090915b87516000198101908111612737578694898792871060001461319e578261306683826130466130929686612714565b5151169060406104b0858a61305b858a612714565b510151169287612714565b945b61308089836130778287612714565b51511694612714565b510151168b6104b06040998a92612714565b1684519361309f85611e93565b60008552813b1561036a57600080946130e68851978896879586947f022c0d9f00000000000000000000000000000000000000000000000000000000865260048601612f3a565b03925af18015613193579061317f94939291613184575b507f423c093a1f80c354c75d4f9e86fde37d7c9014453df9643f585a1b199d094e50613129848a612714565b519183613136868a612714565b5151169361317782613148888c612714565b51015192519485526001600160a01b039095166020850152901515604084015286169233929081906060820190565b0390a3612728565b612fa4565b61318d90611e7f565b386130fd565b82513d6000823e3d90fd5b6130929150828a94613068565b600091613017565b5050509050565b3d156131f5573d9067ffffffffffffffff8211611e6957604051916131e96020601f19601f8401160184611eaf565b82523d6000602084013e565b606090565b600080809381938260405161320e81611e93565b525af16132196131ba565b501561322157565b608460405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201527f4c454400000000000000000000000000000000000000000000000000000000006064820152fd5b919091803b1561036a5760405163a9059cbb60e01b602082019081526001600160a01b0390941660248201526044810192909252600092839283906132dd81606481015b03601f198101835282611eaf565b51925af16132e96131ba565b816132f7575b501561036a57565b805180159250821561330c575b5050386132ef565b61331f92506020809183010191016123b2565b3880613304565b90929192813b1561036a576040516323b872dd60e01b602082019081526001600160a01b0392831660248301529490911660448201526064810192909252600092839283906132dd81608481016132cf565b919061338490836129ad565b91821161338d57565b606460405162461bcd60e51b815260206004820152601360248201527f4d6174683a205375622d756e646572666c6f77000000000000000000000000006044820152fd5b916000925b80518410156136e7576001600160a01b0393846133f38284612714565b51511660209580876134058587612714565b5101511690613414828461210a565b50816134208688612714565b515116988261344781836134348a8c612714565b510151169b60409c8d6104b08b8d612714565b16908a51917f0902f1ac000000000000000000000000000000000000000000000000000000008352606060049381818681865afa9586156136dc57879160009384986136aa575b5050168814946dffffffffffffffffffffffffffff919086156136a1575016915b8c51926370a0823160e01b84528285850152602493828186818d5afa90811561369657600091613667575b506134f0916134e891613378565b9789896123ca565b50941561365f57600094925b8a51600019810190811161364b578a10156136425760018a0190818b1161362f5750908a8e6104b0848a8061353461354c9887612714565b515116956135428387612714565b5101511693612714565b935b8c5161355981611e93565b60008152823b1561036a576000946135a08f92879351988997889687957f022c0d9f0000000000000000000000000000000000000000000000000000000087528601612f3a565b03925af18015612942579161361896979899917f423c093a1f80c354c75d4f9e86fde37d7c9014453df9643f585a1b199d094e5093613620575b50613177826135e9888b612714565b51015192519485526001600160a01b039095166020850152901515604084015288169233929081906060820190565b9291906133d6565b61362990611e7f565b386135da565b601186634e487b7160e01b600052526000fd5b50508a9361354e565b50601185634e487b7160e01b600052526000fd5b6000926134fc565b908382813d831161368f575b61367d8183611eaf565b8101031261032d5750516134f06134da565b503d613673565b8f513d6000823e3d90fd5b905016916134af565b6136d29298506dffffffffffffffffffffffffffff9450803d106123ab5761239c8183611eaf565b509690923861348e565b8e513d6000823e3d90fd5b50915050565b959690939192966001600160a01b0380971695863b1561036a5760ff90604051947fd505accf0000000000000000000000000000000000000000000000000000000086526000998089166004880152871660248701528a6044870152606486015216608484015260a483015260c4820152848160e48183885af19081613859575b50613852576040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081526001600160a01b0392831660048201529116602482015290602090829060449082905afa9182156138465791613815575b501015612dcb57606460405162461bcd60e51b815260206004820152600e60248201527f5065726d6974206661696c7572650000000000000000000000000000000000006044820152fd5b90506020813d821161383e575b8161382f60209383611eaf565b8101031261036a5751386137ca565b3d9150613822565b604051903d90823e3d90fd5b5050505050565b61386590959195611e7f565b933861376e56fea164736f6c6343000813000a00000000000000000000000072e47b1eaaaac6c07ea4071f1d0d355f603e1cc1000000000000000000000000a19c51d91891d3df7c13ed22a2f89d328a82950f0000000000000000000000004300000000000000000000000000000000000004
Deployed Bytecode
0x604060808152600480361015610053575b5050361561001d57600080fd5b6100516001600160a01b037f00000000000000000000000043000000000000000000000000000000000000041633146120ed565b005b6000803560e01c80630dede6c414611d0f57806313dcfc5914611bd257806318a1308614611a375780634386e63c146119fe578063448725b4146119755780634c1ee03e1461192e578063544caa56146118df5780635a47ddc3146117a85780635e1e63251461176c5780635e60dab51461173757806367ffb66a146115ae5780636cc1ae131461154c5780637301e3c81461145657806376c72751146111c35780637af728c81461100f5780639881fcb414610fc257806398a0fb3c14610ca3578063a32b1fcd14610acf578063b7e0d4c0146108d1578063c45a01551461088d578063d7b0e0a514610673578063e2d9d4dc146105e1578063e5e31b131461053c578063f2428621146104f8578063f41766d8146104135763fe411f141461017d5750610010565b3461032d5761018b3661209f565b97929795919395949094421115936101a285612bf2565b6101e16001600160a01b03926101da847f00000000000000000000000043000000000000000000000000000000000000041697612bf2565b8685612206565b8a516323b872dd60e01b8152338682019081526001600160a01b038316602082810191909152604082019a909a529184169189908290819060600103818d865af1908115610409578a916103dc575b50156103d857908a89969594939260248251809c819363226bf2d160e21b8352308a8401525af19889156103ce578690879a610395575b50610272868561210a565b5084841693168303610380579161029d8992610295602496959d8e5b1015612c3d565b8b1015612cae565b8b51938480926370a0823160e01b825230888301525afa908115610376578690869261033e575b6102ce935061328b565b813b1561033a578560248492838b519586948593632e1a7d4d60e01b85528401525af180156103305790859291610315575b505061030b916131fa565b8351928352820152f35b81925061032190611e7f565b61032d57808491610300565b80fd5b87513d84823e3d90fd5b8280fd5b9150508682813d831161036f575b6103568183611eaf565b8101031261036a57856102ce9251916102c4565b600080fd5b503d61034c565b8a513d87823e3d90fd5b989161029d8992610295602496959d8e61028e565b809a508c8092503d83116103c7575b6103ae8183611eaf565b810103126103c3578789519901519838610267565b8580fd5b503d6103a4565b8b513d88823e3d90fd5b8880fd5b6103fc9150893d8b11610402575b6103f48183611eaf565b8101906123b2565b38610230565b503d6103ea565b8c513d8c823e3d90fd5b5082346104f45761043861043d61042936611f91565b95829593949196421115612bf2565b61274d565b9485519060001982019182116104e1576104dd87876104d3888861046d896104658a88612714565b511015612ec9565b6104cd6001600160a01b036104bb81610485856126f1565b5151169180610493866126f1565b5151169060206104a2876126f1565b51015116886104b0876126f1565b510151151591612206565b6104c4886126f1565b51913390613326565b84612f9f565b5191829182611e12565b0390f35b80601189634e487b7160e01b6024945252fd5b5080fd5b5082346104f457816003193601126104f457602090516001600160a01b037f0000000000000000000000004300000000000000000000000000000000000004168152f35b50913461033a57602060031936011261033a576020610559611d97565b92602483518095819363e5e31b1360e01b83526001600160a01b03809216908301527f000000000000000000000000a19c51d91891d3df7c13ed22a2f89d328a82950f165afa9182156105d757602093926105b8575b50519015158152f35b6105d0919250833d8111610402576103f48183611eaf565b90386105af565b81513d85823e3d90fd5b5090346104f45781906105f336611fdf565b97809b9885928b9598979c999f946001600160a01b03998b8b7f0000000000000000000000004300000000000000000000000000000000000004169e8f61063992612206565b6101e1996101da985061065c9690921561066d5750600019905b309033906136ed565b42111561066881612bf2565b612bf2565b90610653565b5091903461033a5760206106d9936106e061071c936106913661209f565b9a929a999194979099421115976106a789612bf2565b6001600160a01b039d8e7f00000000000000000000000043000000000000000000000000000000000000041699612bf2565b8887612206565b8b516323b872dd60e01b8152338882019081526001600160a01b03831660208201526040810195909552908d1693909283918291606090910190565b03818a865af1908115610883578791610865575b50156103c357888691602482518094819363226bf2d160e21b8352308a8401525af1998a1561085b578691879b610821575b509261079a999a928892856107a79661077b8a8661210a565b50169084161460001461081257906107a2919b8c959b5b861015612c3d565b8a1015612cae565b61328b565b813b1561033a578460248492838a519586948593632e1a7d4d60e01b85528401525af1801561080857908492916107f0575b50506107e4916131fa565b82519182526020820152f35b8192506107fc90611e7f565b61032d578083916107d9565b86513d84823e3d90fd5b93906107a2919b8c959b610792565b8a80929c508193503d8311610854575b61083b8183611eaf565b810103126103c3578051602090910151996107a7610762565b503d610831565b89513d88823e3d90fd5b61087d915060203d8111610402576103f48183611eaf565b38610730565b8a513d89823e3d90fd5b5082346104f457816003193601126104f457602090516001600160a01b037f000000000000000000000000a19c51d91891d3df7c13ed22a2f89d328a82950f168152f35b61093c6109458484876109326108fb6108e93661209f565b9b93949b979296909597421115612bf2565b6001600160a01b0395867f0000000000000000000000004300000000000000000000000000000000000004169434908d878b612d1f565b9a819a8488612206565b80963390613326565b803b156103c3578451630d0e30db60e41b8152868189818d865af18015610aaa57859288928a92610ab4575b506109ab908c895194858094819363a9059cbb60e01b835260209c8d988401602090939291936001600160a01b0360408201951681520152565b03925af1908115610aaa57846024936109d0889796948b948591610a8d575b506120ed565b88519a8b9687957f6a6278420000000000000000000000000000000000000000000000000000000087521690850152165af1928315610a825792610a50575b506104dd9250843411610a38575b51938493846040919493926060820195825260208201520152565b610a4b610a4586346129ad565b336131fa565b610a1d565b90915082813d8311610a7b575b610a678183611eaf565b8101031261036a576104dd91519085610a0f565b503d610a5d565b8251903d90823e3d90fd5b610aa49150893d8b11610402576103f48183611eaf565b8f6109ca565b86513d89823e3d90fd5b909350610ac19150611e7f565b6103c357858785928c610971565b5090346104f4576101806003193601126104f457610aeb611d97565b610af3611dad565b92610afc611e03565b9060643591610b09611dc3565b90610104359060e435821515830361036a57610124359060ff8216820361036a57610b5f610b6792610b6e95610b40868e8d612206565b9015610c9c57600019915b8461016435936101443593309033906136ed565b421115612bf2565b8786612206565b87516323b872dd60e01b8152338782019081526001600160a01b0392831660208281018290526040830197909752929590829081906060015b038187865af1908115610c92578491610c74575b501561033a57602488928486938551998a95869463226bf2d160e21b865216908401525af1948515610c685781948296610c2e575b5090610bfd83928561210a565b50905016911614600014610c2957905b610c1b608435831015612c3d565b6107e460a435821015612cae565b610c0d565b87809297508196503d8311610c61575b610c488183611eaf565b8101031261032d57835160209094015194610bfd610bf0565b503d610c3e565b508551903d90823e3d90fd5b610c8c915060203d8111610402576103f48183611eaf565b38610bbb565b89513d86823e3d90fd5b8991610b4b565b5082903461032d5760a060031936011261032d57610cbf611d97565b91610cc8611dad565b9184610cd2611e03565b60643594608435968551926306801cc360e41b845283610d18828585602099850191939260409160608401956001600160a01b0380921685521660208401521515910152565b039285856001600160a01b039581877f000000000000000000000000a19c51d91891d3df7c13ed22a2f89d328a82950f165afa948515610fb857908b92918896610f89575b508796889589971680610ef1575b505050505050821580610ee9575b15610e6757505050610d8b848461297a565b90806003831115610e58575081600181811c818101809111610e455791905b848310610e0e575050505b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc188201918211610dfb575090519182526020820192909252604081019190915260609150f35b80601187634e487b7160e01b6024945252fd5b9193509083610e1d818461298d565b908101809111610e3057811c9190610daa565b601189634e487b7160e01b6000525260246000fd5b60248460118b634e487b7160e01b835252fd5b9115610db55760019150610db5565b909592919650610e788188876129ba565b92808411610ec05750610ea790610e9c6104dd9697610ea1869a610e9c838c61297a565b61298d565b9561297a565b905080821015610eb957505b90610a1d565b9050610eb3565b92506104dd945080610e9c610ed989610ea794876129ba565b97610ea1869a610e9c838c61297a565b508015610d79565b91949750929550829194508851958680927f18160ddd0000000000000000000000000000000000000000000000000000000082525afa908115610f7f578691610f4f575b50610f419350936122f2565b919091888881808080610d6b565b905083813d8311610f78575b610f658183611eaf565b8101031261036a57610f4192518a610f35565b503d610f5b565b87513d88823e3d90fd5b610faa919650873d8911610fb1575b610fa28183611eaf565b8101906121e7565b948c610d5d565b503d610f98565b88513d89823e3d90fd5b5082903461032d578160031936011261032d576024359067ffffffffffffffff821161032d57506104dd92610ffd6110049236908301611eea565b903561274d565b905191829182611e12565b5082346104f45761102f61102236611f91565b9593949095421115612bf2565b80519360001985019485116111b05761106394926110dc8895936110d58b946001600160a01b03809860209b8c9186612714565b5101511697611096817f000000000000000000000000430000000000000000000000000000000000000416809a146126a6565b6110cd816110a3866126f1565b51511691806110b1876126f1565b515116908d6110bf886126f1565b510151168a6104b0886126f1565b903390613326565b30906133d1565b82516370a0823160e01b815230838201528681602481885afa9687156111a6578697611170575b505061111190861015612ec9565b823b1561116c5784602485928385519687948593632e1a7d4d60e01b85528401525af1908115611163575061114f575b505061114c916131fa565b80f35b61115890611e7f565b61033a578284611141565b513d84823e3d90fd5b8380fd5b809297508196503d831161119f575b6111898183611eaf565b8101031261036a57611111879451959089611103565b503d61117f565b84513d88823e3d90fd5b60248760118a634e487b7160e01b835252fd5b50916111e0906111d236612054565b959294909195421115612bf2565b6001600160a01b0391826111f3876126f1565b51511691611225847f0000000000000000000000004300000000000000000000000000000000000004168094146126a6565b823b1561145257878551630d0e30db60e41b81528181858134895af180156103305761143e575b50611281936112b38661125e8b6126f1565b5151169160209687938c8b6104b08c88611277856126f1565b51015116926126f1565b895194858094819363a9059cbb60e01b835234908b8401602090939291936001600160a01b0360408201951681520152565b03925af190811561143457906112cf918a9161141757506120ed565b8651936000199485810190811161140457846112ec83928b612714565b51015116948651986370a0823160e01b93848b52868b6024818785169b8c8b8301525afa9a8b156113fa578c9b6113c9575b5061132990826133d1565b80519182019182116113b657918561134681969593602495612714565b510151168751968794859384528301525afa9283156113ad5750859261137d575b505061114c9261137691613378565b1015612ec9565b90809250813d83116113a6575b6113948183611eaf565b8101031261036a575182611376611367565b503d61138a565b513d87823e3d90fd5b60248b601187634e487b7160e01b835252fd5b909a508681813d83116113f3575b6113e18183611eaf565b8101031261036a57519961132961131e565b503d6113d7565b89513d8e823e3d90fd5b60248a601186634e487b7160e01b835252fd5b61142e9150853d8711610402576103f48183611eaf565b386109ca565b86513d8b823e3d90fd5b6114488291611e7f565b61032d573861124c565b8780fd5b50913461033a57608060031936011261033a5781359167ffffffffffffffff808411611548573660238501121561154857838201359461149586611ed2565b946114a285519687611eaf565b86865260209660248888019160051b8301019136831161116c57906024899201905b838210611539575050505060243591821161032d5750936114ee6104d3926104dd96369101611eea565b6104cd6114f9611dd9565b92611508426064351015612bf2565b6104bb6001600160a01b03918261151e866126f1565b515116928061152c876126f1565b515116916104a2876126f1565b813581529082019082016114c4565b8480fd5b50913461033a576115709061156036611f91565b9691969590939295421115612bf2565b6001600160a01b03926112cf84611586896126f1565b51511693856115948a6126f1565b515116946110cd6020968b8a6104b08b8b611277856126f1565b50916115cb6115bc36612054565b95919295939093421115612bf2565b6001600160a01b0390816115de846126f1565b51511691611610817f0000000000000000000000004300000000000000000000000000000000000004168094146126a6565b61161a843461274d565b96875160001981019081116114045790610465611637928a612714565b87611641886126f1565b51843b156104f457818491895192838092630d0e30db60e41b8252895af1801561172d57611715575b5050906116d99261169d83602094611681886126f1565b515116908561168f896126f1565b51015116896104b0896126f1565b896116a78a6126f1565b519389519687958694859363a9059cbb60e01b85528401602090939291936001600160a01b0360408201951681520152565b03925af19081156111a6576104d39392916104cd916104dd98916116fd57506120ed565b61142e915060203d8111610402576103f48183611eaf565b61172190939293611e7f565b6114525790873861166a565b88513d84823e3d90fd5b83823461032d57606060031936011261032d57506107e4611756611d97565b61175e611dad565b611766611e03565b916122f2565b503461032d57606060031936011261032d575061179a9061178b611dad565b611793611dd9565b91356123ca565b825191825215156020820152f35b5082903461032d5761012060031936011261032d576117c5611d97565b906117ce611dad565b926117d7611e03565b9260e4356001600160a01b0380821680920361036a5761184197856024926118486118366020976118288c8e61181242610104351015612bf2565b60c4359160a43591608435916064359187612d1f565b9e8f93829f929e8385612206565b9d8e80943390613326565b3390613326565b865198899586947f6a627842000000000000000000000000000000000000000000000000000000008652850152165af19182156118d4579161189f575b519283526020830193909352506040810191909152606090f35b90506020823d82116118cc575b816118b960209383611eaf565b8101031261036a576104dd915190611885565b3d91506118ac565b9051903d90823e3d90fd5b5082346104f457806003193601126104f4576104dd9061190e611900611d97565b611908611dad565b9061210a565b91516001600160a01b039182168152911660208201529081906040820190565b5082346104f45760606003193601126104f4576020906001600160a01b0361196d611957611d97565b61195f611dad565b611967611e03565b91612206565b915191168152f35b5091903461033a5761198636611fdf565b9297939c988d6001600160a01b039c989c9b97969b9392939e8f7f0000000000000000000000004300000000000000000000000000000000000004169a6119ce848d8c612206565b90600014966020966106e0966106d99561065c9461071c9b6119f75760001990309033906136ed565b8c90610653565b83823461032d57608060031936011261032d57506107e4611a1d611d97565b611a25611dad565b611a2d611e03565b9060643592612ab7565b5082346104f457611a5b611a4a36611f91565b969296949094939193421115612bf2565b82519260001993848101908111610e4557611aba82611a879260206001600160a01b0394859284612714565b5101511694610438847f0000000000000000000000004300000000000000000000000000000000000004168097146126a6565b978851868101908111611bbf5791611add611b1e92610465611b2696958d612714565b611b1581611aea856126f1565b5151169180611af8866126f1565b515116906020611b07876126f1565b510151168b6104b0876126f1565b6104c48b6126f1565b309088612f9f565b8551838101908111611bac57611b3c9087612714565b51813b1561033a5782916024839288519485938492632e1a7d4d60e01b84528d8401525af18015611ba257611b93575b508451918201918211610dfb576104dd85856104d386611b8c8785612714565b51906131fa565b611b9c90611e7f565b86611b6c565b85513d84823e3d90fd5b60248360118a634e487b7160e01b835252fd5b60248660118d634e487b7160e01b835252fd5b50913461033a5760e060031936011261033a57611bed611dd9565b606435926001600160a01b03908185168095036103c35760843591821515809303611d0b5760a43590808216820361145257611c2d4260c4351015612bf2565b85519386850185811067ffffffffffffffff821117611cf857875260018552885b602080821015611c7f57885160209291611c6782611e4d565b8c82528c818301528c8b830152828901015201611c4e565b50509194979690929783611c92866126f1565b51911690526020611ca2856126f1565b51015284611caf846126f1565b510152611cbd82873561274d565b9485519060001982019182116104e1576104dd87876104d388886104cd89611ceb6024356104658c8a612714565b6104bb81610485856126f1565b60248a604187634e487b7160e01b835252fd5b8680fd5b5090346104f4576101006003193601126104f457611d2b611d97565b611d33611dad565b92611d3c611e03565b90611d57611d48611dc3565b926101da4260e4351015612bf2565b86516323b872dd60e01b8152338682019081526001600160a01b039283166020828101829052606435604084015293959390929182908190606001610ba7565b600435906001600160a01b038216820361036a57565b602435906001600160a01b038216820361036a57565b60c435906001600160a01b038216820361036a57565b604435906001600160a01b038216820361036a57565b35906001600160a01b038216820361036a57565b60443590811515820361036a57565b6020908160408183019282815285518094520193019160005b828110611e39575050505090565b835185529381019392810192600101611e2b565b6060810190811067ffffffffffffffff821117611e6957604052565b634e487b7160e01b600052604160045260246000fd5b67ffffffffffffffff8111611e6957604052565b6020810190811067ffffffffffffffff821117611e6957604052565b90601f601f19910116810190811067ffffffffffffffff821117611e6957604052565b67ffffffffffffffff8111611e695760051b60200190565b81601f8201121561036a57803590611f0182611ed2565b92604090611f1182519586611eaf565b838552602091828601918360608097028601019481861161036a578401925b858410611f41575050505050505090565b868483031261036a57825190611f5682611e4d565b611f5f85611def565b8252611f6c868601611def565b868301528385013590811515820361036a57828792868b950152815201930192611f30565b60a060031982011261036a5760043591602435916044359067ffffffffffffffff821161036a57611fc491600401611eea565b906064356001600160a01b038116810361036a579060843590565b60031961016091011261036a576001600160a01b0390600435828116810361036a5791602435801515810361036a579160443591606435916084359160a435908116810361036a579060c4359060e435801515810361036a57906101043560ff8116810361036a579061012435906101443590565b90608060031983011261036a57600435916024359067ffffffffffffffff821161036a5761208491600401611eea565b906044356001600160a01b038116810361036a579060643590565b60031960e091011261036a576001600160a01b0390600435828116810361036a5791602435801515810361036a579160443591606435916084359160a435908116810361036a579060c43590565b156120f457565b634e487b7160e01b600052600160045260246000fd5b90916001600160a01b039182841683821681811461217d57101561217857925b9183161561213457565b606460405162461bcd60e51b815260206004820152601a60248201527f426173655631526f757465723a205a45524f5f414444524553530000000000006044820152fd5b61212a565b608460405162461bcd60e51b815260206004820152602160248201527f426173655631526f757465723a204944454e544943414c5f414444524553534560448201527f53000000000000000000000000000000000000000000000000000000000000006064820152fd5b9081602091031261036a57516001600160a01b038116810361036a5790565b6040516306801cc360e41b81526001600160a01b039182166004820152911660248201529015156044820152602081806064810103816001600160a01b037f000000000000000000000000a19c51d91891d3df7c13ed22a2f89d328a82950f165afa9081156122955760009161227a575090565b612292915060203d8111610fb157610fa28183611eaf565b90565b6040513d6000823e3d90fd5b51906dffffffffffffffffffffffffffff8216820361036a57565b9081606091031261036a576122d0816122a1565b9160406122df602084016122a1565b92015163ffffffff8116810361036a5790565b600491926060612302858461210a565b50946123186001600160a01b0393849286612206565b16604051948580927f0902f1ac0000000000000000000000000000000000000000000000000000000082525afa928315612295576000908194612380575b5081906dffffffffffffffffffffffffffff8091169416941691161460001461237c5791565b9091565b8294506123a4915060603d81116123ab575b61239c8183611eaf565b8101906122bc565b5093612356565b503d612392565b9081602091031261036a5751801515810361036a5790565b91906001600160a01b0390817f000000000000000000000000a19c51d91891d3df7c13ed22a2f89d328a82950f166040918251916306801cc360e41b968784528583169580600498888a8801521698896024870152600160448701526020958681606481885afa9081156125cd57600091612689575b5060009a8b998b8a518663e5e31b1360e01b958683521680928201528a816024818c5afa90811561267d578f91612660575b506125d8575b5089519384528b8401526024830152600060448301528682606481885afa9182156125cd57908792916000926125ab575b506024908951948593849283521696878d8301525afa9081156125a057600091612583575b506124f3575b505050505090508082116000146124ec575090600190565b9160009150565b84955061252b96849551978894859384936378a051ad60e11b855284019092916001600160a01b036020916040840195845216910152565b03915afa918215612579575060009161254d575b5090508038808080806124d4565b82813d8311612572575b6125618183611eaf565b8101031261032d575051803861253f565b503d612557565b513d6000823e3d90fd5b61259a9150853d8711610402576103f48183611eaf565b386124ce565b86513d6000823e3d90fd5b60249192506125c690843d8611610fb157610fa28183611eaf565b91906124a9565b88513d6000823e3d90fd5b8a516378a051ad60e11b8152808e018881526001600160a01b038b166020820152929e9290918b918391908290819060400103915afa918215612655578092612625575b50509b38612478565b9091508982813d831161264e575b61263d8183611eaf565b8101031261032d575051388061261c565b503d612633565b8b51903d90823e3d90fd5b61267791508b3d8d11610402576103f48183611eaf565b38612472565b8f8d51903d90823e3d90fd5b6126a09150873d8911610fb157610fa28183611eaf565b38612440565b156126ad57565b606460405162461bcd60e51b815260206004820152601a60248201527f426173655631526f757465723a20494e56414c49445f504154480000000000006044820152fd5b8051156126fe5760200190565b634e487b7160e01b600052603260045260246000fd5b80518210156126fe5760209160051b010190565b60001981146127375760010190565b634e487b7160e01b600052601160045260246000fd5b9190600161275e81835110156126a6565b81518181018091116127375761277381611ed2565b601f1961279060409361278885519485611eaf565b808452611ed2565b0193602094368684013781966127a5836126f1565b526001600160a01b03907f000000000000000000000000a19c51d91891d3df7c13ed22a2f89d328a82950f82166000865b6127e5575b5050505050505050565b82518110156129755761281a846127fc8386612714565b515116858a61280b8588612714565b51015116886104b08588612714565b8487519163e5e31b1360e01b8352169060049180838301526024918b818481895afa90811561296a57918c918c98979695949360009161294d575b50612870575b5050505061286890612728565b9091926127d6565b84959697506128826128c3958b612714565b51908961288f888b612714565b515116918c518097819482936378a051ad60e11b84528984019092916001600160a01b036020916040840195845216910152565b03915afa92831561294257600093612913575b508984019182851161290057505091612868916128f68a96959489612714565b5290388a8161285b565b601190634e487b7160e01b600052526000fd5b90928b82813d831161293b575b61292a8183611eaf565b8101031261032d57505191386128d6565b503d612920565b89513d6000823e3d90fd5b6129649150833d8511610402576103f48183611eaf565b38612855565b8a513d6000823e3d90fd5b6127db565b8181029291811591840414171561273757565b8115612997570490565b634e487b7160e01b600052601260045260246000fd5b9190820391821161273757565b8015612a4d5781151580612a44575b156129db5761229292610e9c9161297a565b608460405162461bcd60e51b8152602060048201526024808201527f426173655631526f757465723a20494e53554646494349454e545f4c4951554960448201527f44495459000000000000000000000000000000000000000000000000000000006064820152fd5b508215156129c9565b608460405162461bcd60e51b815260206004820152602160248201527f426173655631526f757465723a20494e53554646494349454e545f414d4f554e60448201527f54000000000000000000000000000000000000000000000000000000000000006064820152fd5b6040516306801cc360e41b81526001600160a01b0382811660048301528381166024830152841515604483015294959460209492939185816064817f000000000000000000000000a19c51d91891d3df7c13ed22a2f89d328a82950f86165afa90811561229557600091612bd5575b5016928315612bc657849392600492612b3e926122f2565b949092604051928380927f18160ddd0000000000000000000000000000000000000000000000000000000082525afa92831561229557600093612b93575b505061229292610ea183610e9c610e9c948961297a565b8181949293943d8311612bbf575b612bab8183611eaf565b8101031261032d5750519082610ea1612b7c565b503d612ba1565b50505050509050600090600090565b612bec9150863d8811610fb157610fa28183611eaf565b38612b26565b15612bf957565b606460405162461bcd60e51b815260206004820152601560248201527f426173655631526f757465723a204558504952454400000000000000000000006044820152fd5b15612c4457565b608460405162461bcd60e51b815260206004820152602360248201527f426173655631526f757465723a20494e53554646494349454e545f415f414d4f60448201527f554e5400000000000000000000000000000000000000000000000000000000006064820152fd5b15612cb557565b608460405162461bcd60e51b815260206004820152602360248201527f426173655631526f757465723a20494e53554646494349454e545f425f414d4f60448201527f554e5400000000000000000000000000000000000000000000000000000000006064820152fd5b919095929594939484871061036a5783861061036a576040516306801cc360e41b81526001600160a01b038481166004830152828116602483015283151560448301527f000000000000000000000000a19c51d91891d3df7c13ed22a2f89d328a82950f811694916020919082816064818a5afa90811561229557600091612eac575b501615612e24575b50612db593506122f2565b9290801580612e1c575b15612dcd575050505090915b565b612ddc848288979596976129ba565b94838611612df4575050505061237c90821015612cae565b83955061237c945090612e0b91612e1493946129ba565b948511156120ed565b831015612c3d565b508315612dbf565b6040517f82dfdce40000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152841660248201528415156044820152948190869060649082906000905af194851561229557612db595612e8e575b50612daa565b81612ea492903d10610fb157610fa28183611eaf565b503880612e88565b612ec39150833d8511610fb157610fa28183611eaf565b38612da2565b15612ed057565b608460405162461bcd60e51b815260206004820152602860248201527f426173655631526f757465723a20494e53554646494349454e545f4f5554505560448201527f545f414d4f554e540000000000000000000000000000000000000000000000006064820152fd5b926001600160a01b03919594958452602092838501521660408301526080606083015283519384608084015260005b858110612f8b57505050601f19601f84600060a0809697860101520116010190565b81810183015184820160a001528201612f69565b929160005b82518110156131b3576001600160a01b0380612fc08386612714565b515116612fdf6020918383612fd5878a612714565b510151169061210a565b5090600184019182851161273757612ff7838a612714565b51908480613005888b612714565b5151169116146000146131ab57600090915b87516000198101908111612737578694898792871060001461319e578261306683826130466130929686612714565b5151169060406104b0858a61305b858a612714565b510151169287612714565b945b61308089836130778287612714565b51511694612714565b510151168b6104b06040998a92612714565b1684519361309f85611e93565b60008552813b1561036a57600080946130e68851978896879586947f022c0d9f00000000000000000000000000000000000000000000000000000000865260048601612f3a565b03925af18015613193579061317f94939291613184575b507f423c093a1f80c354c75d4f9e86fde37d7c9014453df9643f585a1b199d094e50613129848a612714565b519183613136868a612714565b5151169361317782613148888c612714565b51015192519485526001600160a01b039095166020850152901515604084015286169233929081906060820190565b0390a3612728565b612fa4565b61318d90611e7f565b386130fd565b82513d6000823e3d90fd5b6130929150828a94613068565b600091613017565b5050509050565b3d156131f5573d9067ffffffffffffffff8211611e6957604051916131e96020601f19601f8401160184611eaf565b82523d6000602084013e565b606090565b600080809381938260405161320e81611e93565b525af16132196131ba565b501561322157565b608460405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201527f4c454400000000000000000000000000000000000000000000000000000000006064820152fd5b919091803b1561036a5760405163a9059cbb60e01b602082019081526001600160a01b0390941660248201526044810192909252600092839283906132dd81606481015b03601f198101835282611eaf565b51925af16132e96131ba565b816132f7575b501561036a57565b805180159250821561330c575b5050386132ef565b61331f92506020809183010191016123b2565b3880613304565b90929192813b1561036a576040516323b872dd60e01b602082019081526001600160a01b0392831660248301529490911660448201526064810192909252600092839283906132dd81608481016132cf565b919061338490836129ad565b91821161338d57565b606460405162461bcd60e51b815260206004820152601360248201527f4d6174683a205375622d756e646572666c6f77000000000000000000000000006044820152fd5b916000925b80518410156136e7576001600160a01b0393846133f38284612714565b51511660209580876134058587612714565b5101511690613414828461210a565b50816134208688612714565b515116988261344781836134348a8c612714565b510151169b60409c8d6104b08b8d612714565b16908a51917f0902f1ac000000000000000000000000000000000000000000000000000000008352606060049381818681865afa9586156136dc57879160009384986136aa575b5050168814946dffffffffffffffffffffffffffff919086156136a1575016915b8c51926370a0823160e01b84528285850152602493828186818d5afa90811561369657600091613667575b506134f0916134e891613378565b9789896123ca565b50941561365f57600094925b8a51600019810190811161364b578a10156136425760018a0190818b1161362f5750908a8e6104b0848a8061353461354c9887612714565b515116956135428387612714565b5101511693612714565b935b8c5161355981611e93565b60008152823b1561036a576000946135a08f92879351988997889687957f022c0d9f0000000000000000000000000000000000000000000000000000000087528601612f3a565b03925af18015612942579161361896979899917f423c093a1f80c354c75d4f9e86fde37d7c9014453df9643f585a1b199d094e5093613620575b50613177826135e9888b612714565b51015192519485526001600160a01b039095166020850152901515604084015288169233929081906060820190565b9291906133d6565b61362990611e7f565b386135da565b601186634e487b7160e01b600052526000fd5b50508a9361354e565b50601185634e487b7160e01b600052526000fd5b6000926134fc565b908382813d831161368f575b61367d8183611eaf565b8101031261032d5750516134f06134da565b503d613673565b8f513d6000823e3d90fd5b905016916134af565b6136d29298506dffffffffffffffffffffffffffff9450803d106123ab5761239c8183611eaf565b509690923861348e565b8e513d6000823e3d90fd5b50915050565b959690939192966001600160a01b0380971695863b1561036a5760ff90604051947fd505accf0000000000000000000000000000000000000000000000000000000086526000998089166004880152871660248701528a6044870152606486015216608484015260a483015260c4820152848160e48183885af19081613859575b50613852576040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081526001600160a01b0392831660048201529116602482015290602090829060449082905afa9182156138465791613815575b501015612dcb57606460405162461bcd60e51b815260206004820152600e60248201527f5065726d6974206661696c7572650000000000000000000000000000000000006044820152fd5b90506020813d821161383e575b8161382f60209383611eaf565b8101031261036a5751386137ca565b3d9150613822565b604051903d90823e3d90fd5b5050505050565b61386590959195611e7f565b933861376e56fea164736f6c6343000813000a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000072e47b1eaaaac6c07ea4071f1d0d355f603e1cc1000000000000000000000000a19c51d91891d3df7c13ed22a2f89d328a82950f0000000000000000000000004300000000000000000000000000000000000004
-----Decoded View---------------
Arg [0] : _blastGovernor (address): 0x72e47b1eaAAaC6c07Ea4071f1d0d355f603E1cc1
Arg [1] : _factory (address): 0xa19C51D91891D3DF7C13Ed22a2f89d328A82950f
Arg [2] : _wETH (address): 0x4300000000000000000000000000000000000004
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000072e47b1eaaaac6c07ea4071f1d0d355f603e1cc1
Arg [1] : 000000000000000000000000a19c51d91891d3df7c13ed22a2f89d328a82950f
Arg [2] : 0000000000000000000000004300000000000000000000000000000000000004
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.