Latest 25 from a total of 46,087 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Swap Exact Token... | 31234634 | 4 mins ago | IN | 0 FRAX | 0.00001021 | ||||
| Swap Exact Token... | 31234634 | 4 mins ago | IN | 0 FRAX | 0.00001055 | ||||
| Swap Exact Token... | 31232875 | 1 hr ago | IN | 0 FRAX | 0.00000985 | ||||
| Swap Exact Token... | 31232875 | 1 hr ago | IN | 0 FRAX | 0.00000996 | ||||
| Swap Exact Token... | 31232875 | 1 hr ago | IN | 0 FRAX | 0.00000985 | ||||
| Swap Exact Token... | 31232875 | 1 hr ago | IN | 0 FRAX | 0.00000994 | ||||
| Swap Exact Token... | 31232875 | 1 hr ago | IN | 0 FRAX | 0.00001004 | ||||
| Swap Exact Token... | 31232720 | 1 hr ago | IN | 0 FRAX | 0.00000869 | ||||
| Swap Exact Token... | 31232720 | 1 hr ago | IN | 0 FRAX | 0.00000864 | ||||
| Swap Exact Token... | 31232720 | 1 hr ago | IN | 0 FRAX | 0.00000884 | ||||
| Swap Exact Token... | 31232702 | 1 hr ago | IN | 0 FRAX | 0.00001002 | ||||
| Swap Exact Token... | 31232081 | 1 hr ago | IN | 0 FRAX | 0.00001691 | ||||
| Swap Exact Token... | 31231946 | 1 hr ago | IN | 0 FRAX | 0.00001569 | ||||
| Swap Exact Token... | 31231946 | 1 hr ago | IN | 0 FRAX | 0.00001566 | ||||
| Swap Exact Token... | 31231946 | 1 hr ago | IN | 0 FRAX | 0.00001566 | ||||
| Swap Exact Token... | 31231946 | 1 hr ago | IN | 0 FRAX | 0.00001586 | ||||
| Swap Exact Token... | 31231946 | 1 hr ago | IN | 0 FRAX | 0.00001586 | ||||
| Swap Exact Token... | 31231946 | 1 hr ago | IN | 0 FRAX | 0.00001586 | ||||
| Swap Exact Token... | 31231946 | 1 hr ago | IN | 0 FRAX | 0.00001578 | ||||
| Swap Exact Token... | 31230117 | 2 hrs ago | IN | 0 FRAX | 0.00002255 | ||||
| Swap Exact Token... | 31230117 | 2 hrs ago | IN | 0 FRAX | 0.00002221 | ||||
| Swap Exact Token... | 31229760 | 2 hrs ago | IN | 0 FRAX | 0.00002764 | ||||
| Swap Exact Token... | 31229760 | 2 hrs ago | IN | 0 FRAX | 0.00002764 | ||||
| Swap Exact Token... | 31229760 | 2 hrs ago | IN | 0 FRAX | 0.00002667 | ||||
| Swap Exact Token... | 31229756 | 2 hrs ago | IN | 0 FRAX | 0.00002607 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 20163071 | 256 days ago | 0.00005 FRAX | ||||
| 19512205 | 271 days ago | 0.00009937 FRAX | ||||
| 19512205 | 271 days ago | 0.00009937 FRAX | ||||
| 19509915 | 271 days ago | 0.00006368 FRAX | ||||
| 19509915 | 271 days ago | 0.00006368 FRAX | ||||
| 19491698 | 271 days ago | 0.00129338 FRAX | ||||
| 19491698 | 271 days ago | 0.00129338 FRAX | ||||
| 19490761 | 271 days ago | 0.00274354 FRAX | ||||
| 19490761 | 271 days ago | 0.00274354 FRAX | ||||
| 19475412 | 272 days ago | 0.00001482 FRAX | ||||
| 19475412 | 272 days ago | 0.00001482 FRAX | ||||
| 19470841 | 272 days ago | 0.0001 FRAX | ||||
| 19470841 | 272 days ago | 0.0001 FRAX | ||||
| 19470815 | 272 days ago | 0.0001 FRAX | ||||
| 19470815 | 272 days ago | 0.0001 FRAX | ||||
| 18988819 | 283 days ago | 0.00000063 FRAX | ||||
| 18988819 | 283 days ago | 0.00000063 FRAX | ||||
| 18610449 | 292 days ago | 0.00041235 FRAX | ||||
| 18610449 | 292 days ago | 0.00041235 FRAX | ||||
| 18426997 | 296 days ago | 0.001 FRAX | ||||
| 18426997 | 296 days ago | 0.001 FRAX | ||||
| 18426961 | 296 days ago | 0.001 FRAX | ||||
| 18426961 | 296 days ago | 0.001 FRAX | ||||
| 18389413 | 297 days ago | 0.00071112 FRAX | ||||
| 18389413 | 297 days ago | 0.00071112 FRAX |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
FraxswapRouter
Compiler Version
v0.8.23+commit.f704f362
Optimization Enabled:
Yes with 1000000 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.8.0;
// lib/v2-core/contracts/interfaces/IUniswapV2Factory.sol
interface IUniswapV2Factory {
event PairCreated(address indexed token0, address indexed token1, address pair, uint);
function feeTo() external view returns (address);
function feeToSetter() external view returns (address);
function getPair(address tokenA, address tokenB) external view returns (address pair);
function allPairs(uint) external view returns (address pair);
function allPairsLength() external view returns (uint);
function createPair(address tokenA, address tokenB) external returns (address pair);
function setFeeTo(address) external;
function setFeeToSetter(address) external;
}
// lib/v2-core/contracts/interfaces/IUniswapV2Pair.sol
interface IUniswapV2Pair {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
function name() external pure returns (string memory);
function symbol() external pure returns (string memory);
function decimals() external pure returns (uint8);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
function DOMAIN_SEPARATOR() external view returns (bytes32);
function PERMIT_TYPEHASH() external pure returns (bytes32);
function nonces(address owner) external view returns (uint);
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
event Mint(address indexed sender, uint amount0, uint amount1);
event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
event Swap(
address indexed sender,
uint amount0In,
uint amount1In,
uint amount0Out,
uint amount1Out,
address indexed to
);
event Sync(uint112 reserve0, uint112 reserve1);
function MINIMUM_LIQUIDITY() external pure returns (uint);
function factory() external view returns (address);
function token0() external view returns (address);
function token1() external view returns (address);
function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
function price0CumulativeLast() external view returns (uint);
function price1CumulativeLast() external view returns (uint);
function kLast() external view returns (uint);
function mint(address to) external returns (uint liquidity);
function burn(address to) external returns (uint amount0, uint amount1);
function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
function skim(address to) external;
function sync() external;
function initialize(address, address) external;
}
// node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 value) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 value) external returns (bool);
}
// src/contracts/libraries/TransferHelper.sol
// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
function safeApprove(address token, address to, uint256 value) internal {
// bytes4(keccak256(bytes('approve(address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
require(
success && (data.length == 0 || abi.decode(data, (bool))),
"TransferHelper::safeApprove: approve failed"
);
}
function safeTransfer(address token, address to, uint256 value) internal {
// bytes4(keccak256(bytes('transfer(address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
require(
success && (data.length == 0 || abi.decode(data, (bool))),
"TransferHelper::safeTransfer: transfer failed"
);
}
function safeTransferFrom(address token, address from, address to, uint256 value) internal {
// bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
require(
success && (data.length == 0 || abi.decode(data, (bool))),
"TransferHelper::transferFrom: transferFrom failed"
);
}
function safeTransferETH(address to, uint256 value) internal {
(bool success, ) = to.call{ value: value }(new bytes(0));
require(success, "TransferHelper::safeTransferETH: ETH transfer failed");
}
}
// src/contracts/periphery/interfaces/IWETH.sol
interface IWETH {
function deposit() external payable;
function transfer(address to, uint256 value) external returns (bool);
function withdraw(uint256) external;
}
// src/contracts/core/interfaces/IFraxswapFactory.sol
interface IFraxswapFactory is IUniswapV2Factory {
function createPair(address tokenA, address tokenB, uint256 fee) external returns (address pair);
function globalPause() external view returns (bool);
function toggleGlobalPause() external;
}
// src/contracts/core/interfaces/IFraxswapPair.sol
/// @dev Fraxswap LP Pair Interface
interface IFraxswapPair is IUniswapV2Pair {
// TWAMM
event LongTermSwap0To1(address indexed addr, uint256 orderId, uint256 amount0In, uint256 numberOfTimeIntervals);
event LongTermSwap1To0(address indexed addr, uint256 orderId, uint256 amount1In, uint256 numberOfTimeIntervals);
event CancelLongTermOrder(
address indexed addr,
uint256 orderId,
address sellToken,
uint256 unsoldAmount,
address buyToken,
uint256 purchasedAmount
);
event WithdrawProceedsFromLongTermOrder(
address indexed addr,
uint256 orderId,
address indexed proceedToken,
uint256 proceeds,
bool orderExpired
);
function fee() external view returns (uint256);
function longTermSwapFrom0To1(uint256 amount0In, uint256 numberOfTimeIntervals) external returns (uint256 orderId);
function longTermSwapFrom1To0(uint256 amount1In, uint256 numberOfTimeIntervals) external returns (uint256 orderId);
function cancelLongTermSwap(uint256 orderId) external;
function withdrawProceedsFromLongTermSwap(
uint256 orderId
) external returns (bool is_expired, address rewardTkn, uint256 totalReward);
function executeVirtualOrders(uint256 blockTimestamp) external;
function getAmountOut(uint256 amountIn, address tokenIn) external view returns (uint256);
function getAmountIn(uint256 amountOut, address tokenOut) external view returns (uint256);
function orderTimeInterval() external returns (uint256);
function getTWAPHistoryLength() external view returns (uint256);
function getTwammReserves()
external
view
returns (
uint112 _reserve0,
uint112 _reserve1,
uint32 _blockTimestampLast,
uint112 _twammReserve0,
uint112 _twammReserve1,
uint256 _fee
);
function getReserveAfterTwamm(
uint256 blockTimestamp
)
external
view
returns (
uint112 _reserve0,
uint112 _reserve1,
uint256 lastVirtualOrderTimestamp,
uint112 _twammReserve0,
uint112 _twammReserve1
);
function getNextOrderID() external view returns (uint256);
function getOrderIDsForUser(address user) external view returns (uint256[] memory);
function getOrderIDsForUserLength(address user) external view returns (uint256);
function twammUpToDate() external view returns (bool);
function getTwammState()
external
view
returns (
uint256 token0Rate,
uint256 token1Rate,
uint256 lastVirtualOrderTimestamp,
uint256 orderTimeInterval_rtn,
uint256 rewardFactorPool0,
uint256 rewardFactorPool1
);
function getTwammSalesRateEnding(
uint256 _blockTimestamp
) external view returns (uint256 orderPool0SalesRateEnding, uint256 orderPool1SalesRateEnding);
function getTwammRewardFactor(
uint256 _blockTimestamp
) external view returns (uint256 rewardFactorPool0AtTimestamp, uint256 rewardFactorPool1AtTimestamp);
function getTwammOrder(
uint256 orderId
)
external
view
returns (
uint256 id,
uint256 creationTimestamp,
uint256 expirationTimestamp,
uint256 saleRate,
address owner,
address sellTokenAddr,
address buyTokenAddr
);
function getTwammOrderProceedsView(
uint256 orderId,
uint256 blockTimestamp
) external view returns (bool orderExpired, uint256 totalReward);
function getTwammOrderProceeds(uint256 orderId) external returns (bool orderExpired, uint256 totalReward);
function togglePauseNewSwaps() external;
}
// src/contracts/periphery/FraxswapRouterLibrary.sol
// ====================================================================
// | ______ _______ |
// | / _____________ __ __ / ____(_____ ____ _____ ________ |
// | / /_ / ___/ __ `| |/_/ / /_ / / __ \/ __ `/ __ \/ ___/ _ \ |
// | / __/ / / / /_/ _> < / __/ / / / / / /_/ / / / / /__/ __/ |
// | /_/ /_/ \__,_/_/|_| /_/ /_/_/ /_/\__,_/_/ /_/\___/\___/ |
// | |
// ====================================================================
// ======================= FraxswapRouterLibrary ======================
// ====================================================================
/// @notice Fraxswap Router Library Functions
/// @author Frax Finance: https://github.com/FraxFinance
library FraxswapRouterLibrary {
bytes public constant INIT_CODE_HASH = hex"676b4c9b92980c4e7823b43031b17d7299896d1cd7d147104ad8e21692123fa1"; // init code / init hash
// returns sorted token addresses, used to handle return values from pairs sorted in this order
function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
require(tokenA != tokenB, "FraxswapRouterLibrary: IDENTICAL_ADDRESSES");
(token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
require(token0 != address(0), "FraxswapRouterLibrary: ZERO_ADDRESS");
}
// calculates the CREATE2 address for a pair without making any external calls
function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) {
(address token0, address token1) = sortTokens(tokenA, tokenB);
pair = address(
uint160(
uint256(
keccak256(
abi.encodePacked(
hex"ff",
factory,
keccak256(abi.encodePacked(token0, token1)),
INIT_CODE_HASH // init code / init hash
)
)
)
)
);
}
// fetches and sorts the reserves for a pair
function getReserves(
address factory,
address tokenA,
address tokenB
) internal view returns (uint256 reserveA, uint256 reserveB) {
(address token0, ) = sortTokens(tokenA, tokenB);
(uint256 reserve0, uint256 reserve1, ) = IFraxswapPair(pairFor(factory, tokenA, tokenB)).getReserves();
(reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
}
function getReservesWithTwamm(
address factory,
address tokenA,
address tokenB
) internal returns (uint256 reserveA, uint256 reserveB, uint256 twammReserveA, uint256 twammReserveB) {
(address token0, ) = sortTokens(tokenA, tokenB);
IFraxswapPair pair = IFraxswapPair(pairFor(factory, tokenA, tokenB));
pair.executeVirtualOrders(block.timestamp);
(uint256 reserve0, uint256 reserve1, , uint256 twammReserve0, uint256 twammReserve1, ) = pair
.getTwammReserves();
(reserveA, reserveB, twammReserveA, twammReserveB) = tokenA == token0
? (reserve0, reserve1, twammReserve0, twammReserve1)
: (reserve1, reserve0, twammReserve1, twammReserve0);
}
// given some amount of an asset and pair reserves, returns an equivalent amount of the other asset
function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) internal pure returns (uint256 amountB) {
require(amountA > 0, "FraxswapRouterLibrary: INSUFFICIENT_AMOUNT");
require(reserveA > 0 && reserveB > 0, "FraxswapRouterLibrary: INSUFFICIENT_LIQUIDITY");
amountB = (amountA * reserveB) / reserveA;
}
// performs chained getAmountOut calculations on any number of pairs
function getAmountsOut(
address factory,
uint256 amountIn,
address[] memory path
) internal view returns (uint256[] memory amounts) {
require(path.length >= 2, "FraxswapRouterLibrary: INVALID_PATH");
amounts = new uint256[](path.length);
amounts[0] = amountIn;
for (uint256 i; i < path.length - 1; i++) {
IFraxswapPair pair = IFraxswapPair(FraxswapRouterLibrary.pairFor(factory, path[i], path[i + 1]));
require(pair.twammUpToDate(), "twamm out of date");
amounts[i + 1] = pair.getAmountOut(amounts[i], path[i]);
}
}
// performs chained getAmountIn calculations on any number of pairs
function getAmountsIn(
address factory,
uint256 amountOut,
address[] memory path
) internal view returns (uint256[] memory amounts) {
require(path.length >= 2, "FraxswapRouterLibrary: INVALID_PATH");
amounts = new uint256[](path.length);
amounts[amounts.length - 1] = amountOut;
for (uint256 i = path.length - 1; i > 0; i--) {
IFraxswapPair pair = IFraxswapPair(FraxswapRouterLibrary.pairFor(factory, path[i - 1], path[i]));
require(pair.twammUpToDate(), "twamm out of date");
amounts[i - 1] = pair.getAmountIn(amounts[i], path[i - 1]);
}
}
// performs chained getAmountOut calculations on any number of pairs with Twamm
function getAmountsOutWithTwamm(
address factory,
uint256 amountIn,
address[] memory path
) internal returns (uint256[] memory amounts) {
require(path.length >= 2, "FraxswapRouterLibrary: INVALID_PATH");
amounts = new uint256[](path.length);
amounts[0] = amountIn;
for (uint256 i; i < path.length - 1; i++) {
IFraxswapPair pair = IFraxswapPair(FraxswapRouterLibrary.pairFor(factory, path[i], path[i + 1]));
pair.executeVirtualOrders(block.timestamp);
amounts[i + 1] = pair.getAmountOut(amounts[i], path[i]);
}
}
// performs chained getAmountIn calculations on any number of pairs with Twamm
function getAmountsInWithTwamm(
address factory,
uint256 amountOut,
address[] memory path
) internal returns (uint256[] memory amounts) {
require(path.length >= 2, "FraxswapRouterLibrary: INVALID_PATH");
amounts = new uint256[](path.length);
amounts[amounts.length - 1] = amountOut;
for (uint256 i = path.length - 1; i > 0; i--) {
IFraxswapPair pair = IFraxswapPair(FraxswapRouterLibrary.pairFor(factory, path[i - 1], path[i]));
pair.executeVirtualOrders(block.timestamp);
amounts[i - 1] = pair.getAmountIn(amounts[i], path[i - 1]);
}
}
}
// src/contracts/periphery/FraxswapRouter.sol
// ====================================================================
// | ______ _______ |
// | / _____________ __ __ / ____(_____ ____ _____ ________ |
// | / /_ / ___/ __ `| |/_/ / /_ / / __ \/ __ `/ __ \/ ___/ _ \ |
// | / __/ / / / /_/ _> < / __/ / / / / / /_/ / / / / /__/ __/ |
// | /_/ /_/ \__,_/_/|_| /_/ /_/_/ /_/\__,_/_/ /_/\___/\___/ |
// | |
// ====================================================================
// ========================== FraxswapRouter ==========================
// ====================================================================
/// @notice TWAMM Router
/// @author Frax Finance (https://github.com/FraxFinance)
contract FraxswapRouter {
address public immutable factory;
address public immutable WETH;
modifier ensure(uint256 deadline) {
require(deadline >= block.timestamp, "FraxswapV1Router: EXPIRED");
_;
}
constructor(address _factory, address _WETH) {
factory = _factory;
WETH = _WETH;
}
receive() external payable {
assert(msg.sender == WETH); // only accept ETH via fallback from the WETH contract
}
function INIT_CODE_HASH() public pure returns (bytes memory hash) {
return FraxswapRouterLibrary.INIT_CODE_HASH;
}
// **** ADD LIQUIDITY ****
function _addLiquidity(
address tokenA,
address tokenB,
uint256 amountADesired,
uint256 amountBDesired,
uint256 amountAMin,
uint256 amountBMin
) internal virtual returns (uint256 amountA, uint256 amountB) {
// create the pair if it doesn't exist yet
if (IFraxswapFactory(factory).getPair(tokenA, tokenB) == address(0)) {
IFraxswapFactory(factory).createPair(tokenA, tokenB);
}
(uint256 reserveA, uint256 reserveB, , ) = FraxswapRouterLibrary.getReservesWithTwamm(factory, tokenA, tokenB);
if (reserveA == 0 && reserveB == 0) {
(amountA, amountB) = (amountADesired, amountBDesired);
} else {
uint256 amountBOptimal = FraxswapRouterLibrary.quote(amountADesired, reserveA, reserveB);
if (amountBOptimal <= amountBDesired) {
require(amountBOptimal >= amountBMin, "FraxswapV1Router: INSUFFICIENT_B_AMOUNT");
(amountA, amountB) = (amountADesired, amountBOptimal);
} else {
uint256 amountAOptimal = FraxswapRouterLibrary.quote(amountBDesired, reserveB, reserveA);
assert(amountAOptimal <= amountADesired);
require(amountAOptimal >= amountAMin, "FraxswapV1Router: INSUFFICIENT_A_AMOUNT");
(amountA, amountB) = (amountAOptimal, amountBDesired);
}
}
}
function addLiquidity(
address tokenA,
address tokenB,
uint256 amountADesired,
uint256 amountBDesired,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline
) external virtual ensure(deadline) returns (uint256 amountA, uint256 amountB, uint256 liquidity) {
(amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);
address pair = FraxswapRouterLibrary.pairFor(factory, tokenA, tokenB);
TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
liquidity = IFraxswapPair(pair).mint(to);
}
function addLiquidityETH(
address token,
uint256 amountTokenDesired,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
) external payable virtual ensure(deadline) returns (uint256 amountToken, uint256 amountETH, uint256 liquidity) {
(amountToken, amountETH) = _addLiquidity(
token,
WETH,
amountTokenDesired,
msg.value,
amountTokenMin,
amountETHMin
);
address pair = FraxswapRouterLibrary.pairFor(factory, token, WETH);
TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
IWETH(WETH).deposit{ value: amountETH }();
assert(IWETH(WETH).transfer(pair, amountETH));
liquidity = IFraxswapPair(pair).mint(to);
// refund dust eth, if any
if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH);
}
// **** REMOVE LIQUIDITY ****
function removeLiquidity(
address tokenA,
address tokenB,
uint256 liquidity,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline
) public virtual ensure(deadline) returns (uint256 amountA, uint256 amountB) {
address pair = FraxswapRouterLibrary.pairFor(factory, tokenA, tokenB);
IFraxswapPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
(uint256 amount0, uint256 amount1) = IFraxswapPair(pair).burn(to);
(address token0, ) = FraxswapRouterLibrary.sortTokens(tokenA, tokenB);
(amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0);
require(amountA >= amountAMin, "FraxswapV1Router: INSUFFICIENT_A_AMOUNT");
require(amountB >= amountBMin, "FraxswapV1Router: INSUFFICIENT_B_AMOUNT");
}
function removeLiquidityETH(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
) public virtual ensure(deadline) returns (uint256 amountToken, uint256 amountETH) {
(amountToken, amountETH) = removeLiquidity(
token,
WETH,
liquidity,
amountTokenMin,
amountETHMin,
address(this),
deadline
);
TransferHelper.safeTransfer(token, to, amountToken);
IWETH(WETH).withdraw(amountETH);
TransferHelper.safeTransferETH(to, amountETH);
}
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint256 liquidity,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external virtual returns (uint256 amountA, uint256 amountB) {
address pair = FraxswapRouterLibrary.pairFor(factory, tokenA, tokenB);
uint256 value = approveMax ? type(uint256).max : liquidity;
IFraxswapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
(amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline);
}
function removeLiquidityETHWithPermit(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external virtual returns (uint256 amountToken, uint256 amountETH) {
address pair = FraxswapRouterLibrary.pairFor(factory, token, WETH);
uint256 value = approveMax ? type(uint256).max : liquidity;
IFraxswapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
(amountToken, amountETH) = removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline);
}
// **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) ****
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
) public virtual ensure(deadline) returns (uint256 amountETH) {
(, amountETH) = removeLiquidity(token, WETH, liquidity, amountTokenMin, amountETHMin, address(this), deadline);
TransferHelper.safeTransfer(token, to, IERC20(token).balanceOf(address(this)));
IWETH(WETH).withdraw(amountETH);
TransferHelper.safeTransferETH(to, amountETH);
}
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external virtual returns (uint256 amountETH) {
address pair = FraxswapRouterLibrary.pairFor(factory, token, WETH);
uint256 value = approveMax ? type(uint256).max : liquidity;
IFraxswapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s);
amountETH = removeLiquidityETHSupportingFeeOnTransferTokens(
token,
liquidity,
amountTokenMin,
amountETHMin,
to,
deadline
);
}
// **** SWAP ****
// requires the initial amount to have already been sent to the first pair
function _swap(uint256[] memory amounts, address[] memory path, address _to) internal virtual {
for (uint256 i; i < path.length - 1; i++) {
(address input, address output) = (path[i], path[i + 1]);
(address token0, ) = FraxswapRouterLibrary.sortTokens(input, output);
uint256 amountOut = amounts[i + 1];
(uint256 amount0Out, uint256 amount1Out) = input == token0
? (uint256(0), amountOut)
: (amountOut, uint256(0));
address to = i < path.length - 2 ? FraxswapRouterLibrary.pairFor(factory, output, path[i + 2]) : _to;
IFraxswapPair(FraxswapRouterLibrary.pairFor(factory, input, output)).swap(
amount0Out,
amount1Out,
to,
new bytes(0)
);
}
}
function swapExactTokensForTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external virtual ensure(deadline) returns (uint256[] memory amounts) {
amounts = FraxswapRouterLibrary.getAmountsOutWithTwamm(factory, amountIn, path);
require(amounts[amounts.length - 1] >= amountOutMin, "FraxswapV1Router: INSUFFICIENT_OUTPUT_AMOUNT");
TransferHelper.safeTransferFrom(
path[0],
msg.sender,
FraxswapRouterLibrary.pairFor(factory, path[0], path[1]),
amounts[0]
);
_swap(amounts, path, to);
}
function swapTokensForExactTokens(
uint256 amountOut,
uint256 amountInMax,
address[] calldata path,
address to,
uint256 deadline
) external virtual ensure(deadline) returns (uint256[] memory amounts) {
amounts = FraxswapRouterLibrary.getAmountsInWithTwamm(factory, amountOut, path);
require(amounts[0] <= amountInMax, "FraxswapV1Router: EXCESSIVE_INPUT_AMOUNT");
TransferHelper.safeTransferFrom(
path[0],
msg.sender,
FraxswapRouterLibrary.pairFor(factory, path[0], path[1]),
amounts[0]
);
_swap(amounts, path, to);
}
function swapExactETHForTokens(
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external payable virtual ensure(deadline) returns (uint256[] memory amounts) {
require(path[0] == WETH, "FraxswapV1Router: INVALID_PATH");
amounts = FraxswapRouterLibrary.getAmountsOutWithTwamm(factory, msg.value, path);
require(amounts[amounts.length - 1] >= amountOutMin, "FraxswapV1Router: INSUFFICIENT_OUTPUT_AMOUNT");
IWETH(WETH).deposit{ value: amounts[0] }();
assert(IWETH(WETH).transfer(FraxswapRouterLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
_swap(amounts, path, to);
}
function swapTokensForExactETH(
uint256 amountOut,
uint256 amountInMax,
address[] calldata path,
address to,
uint256 deadline
) external virtual ensure(deadline) returns (uint256[] memory amounts) {
require(path[path.length - 1] == WETH, "FraxswapV1Router: INVALID_PATH");
amounts = FraxswapRouterLibrary.getAmountsInWithTwamm(factory, amountOut, path);
require(amounts[0] <= amountInMax, "FraxswapV1Router: EXCESSIVE_INPUT_AMOUNT");
TransferHelper.safeTransferFrom(
path[0],
msg.sender,
FraxswapRouterLibrary.pairFor(factory, path[0], path[1]),
amounts[0]
);
_swap(amounts, path, address(this));
IWETH(WETH).withdraw(amounts[amounts.length - 1]);
TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
}
function swapExactTokensForETH(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external virtual ensure(deadline) returns (uint256[] memory amounts) {
require(path[path.length - 1] == WETH, "FraxswapV1Router: INVALID_PATH");
amounts = FraxswapRouterLibrary.getAmountsOutWithTwamm(factory, amountIn, path);
require(amounts[amounts.length - 1] >= amountOutMin, "FraxswapV1Router: INSUFFICIENT_OUTPUT_AMOUNT");
TransferHelper.safeTransferFrom(
path[0],
msg.sender,
FraxswapRouterLibrary.pairFor(factory, path[0], path[1]),
amounts[0]
);
_swap(amounts, path, address(this));
IWETH(WETH).withdraw(amounts[amounts.length - 1]);
TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]);
}
function swapETHForExactTokens(
uint256 amountOut,
address[] calldata path,
address to,
uint256 deadline
) external payable virtual ensure(deadline) returns (uint256[] memory amounts) {
require(path[0] == WETH, "FraxswapV1Router: INVALID_PATH");
amounts = FraxswapRouterLibrary.getAmountsInWithTwamm(factory, amountOut, path);
require(amounts[0] <= msg.value, "FraxswapV1Router: EXCESSIVE_INPUT_AMOUNT");
IWETH(WETH).deposit{ value: amounts[0] }();
assert(IWETH(WETH).transfer(FraxswapRouterLibrary.pairFor(factory, path[0], path[1]), amounts[0]));
_swap(amounts, path, to);
// refund dust eth, if any
if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]);
}
// **** SWAP (supporting fee-on-transfer tokens) ****
// requires the initial amount to have already been sent to the first pair
function _swapSupportingFeeOnTransferTokens(address[] memory path, address _to) internal virtual {
for (uint256 i; i < path.length - 1; i++) {
(address input, address output) = (path[i], path[i + 1]);
(address token0, ) = FraxswapRouterLibrary.sortTokens(input, output);
IFraxswapPair pair = IFraxswapPair(FraxswapRouterLibrary.pairFor(factory, input, output));
uint256 amountInput;
uint256 amountOutput;
{
// scope to avoid stack too deep errors
(uint256 reserveInput, , uint256 twammReserveInput, ) = FraxswapRouterLibrary.getReservesWithTwamm(
factory,
input,
output
);
amountInput = IERC20(input).balanceOf(address(pair)) - reserveInput - twammReserveInput;
amountOutput = pair.getAmountOut(amountInput, input);
}
(uint256 amount0Out, uint256 amount1Out) = input == token0
? (uint256(0), amountOutput)
: (amountOutput, uint256(0));
address to = i < path.length - 2 ? FraxswapRouterLibrary.pairFor(factory, output, path[i + 2]) : _to;
pair.swap(amount0Out, amount1Out, to, new bytes(0));
}
}
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external virtual ensure(deadline) {
TransferHelper.safeTransferFrom(
path[0],
msg.sender,
FraxswapRouterLibrary.pairFor(factory, path[0], path[1]),
amountIn
);
uint256 balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
_swapSupportingFeeOnTransferTokens(path, to);
require(
IERC20(path[path.length - 1]).balanceOf(to) - balanceBefore >= amountOutMin,
"FraxswapV1Router: INSUFFICIENT_OUTPUT_AMOUNT"
);
}
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external payable virtual ensure(deadline) {
require(path[0] == WETH, "FraxswapV1Router: INVALID_PATH");
uint256 amountIn = msg.value;
IWETH(WETH).deposit{ value: amountIn }();
assert(IWETH(WETH).transfer(FraxswapRouterLibrary.pairFor(factory, path[0], path[1]), amountIn));
uint256 balanceBefore = IERC20(path[path.length - 1]).balanceOf(to);
_swapSupportingFeeOnTransferTokens(path, to);
require(
IERC20(path[path.length - 1]).balanceOf(to) - balanceBefore >= amountOutMin,
"FraxswapV1Router: INSUFFICIENT_OUTPUT_AMOUNT"
);
}
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external virtual ensure(deadline) {
require(path[path.length - 1] == WETH, "FraxswapV1Router: INVALID_PATH");
TransferHelper.safeTransferFrom(
path[0],
msg.sender,
FraxswapRouterLibrary.pairFor(factory, path[0], path[1]),
amountIn
);
_swapSupportingFeeOnTransferTokens(path, address(this));
uint256 amountOut = IERC20(WETH).balanceOf(address(this));
require(amountOut >= amountOutMin, "FraxswapV1Router: INSUFFICIENT_OUTPUT_AMOUNT");
IWETH(WETH).withdraw(amountOut);
TransferHelper.safeTransferETH(to, amountOut);
}
// **** LIBRARY FUNCTIONS ****
function quote(uint256 amountA, uint256 reserveA, uint256 reserveB) public pure virtual returns (uint256 amountB) {
return FraxswapRouterLibrary.quote(amountA, reserveA, reserveB);
}
function getAmountOut(uint256, uint256, uint256) public pure virtual returns (uint256) {
revert("Deprecated: Use getAmountsOut"); // depends on the fee of the pool
}
function getAmountIn(uint256, uint256, uint256) public pure virtual returns (uint256) {
revert("Deprecated: Use getAmountsIn"); // depends on the fee of the pool
}
function getAmountsOut(
uint256 amountIn,
address[] memory path
) public view virtual returns (uint256[] memory amounts) {
return FraxswapRouterLibrary.getAmountsOut(factory, amountIn, path);
}
function getAmountsIn(
uint256 amountOut,
address[] memory path
) public view virtual returns (uint256[] memory amounts) {
return FraxswapRouterLibrary.getAmountsIn(factory, amountOut, path);
}
function getAmountsOutWithTwamm(uint256 amountIn, address[] memory path) public returns (uint256[] memory amounts) {
return FraxswapRouterLibrary.getAmountsOutWithTwamm(factory, amountIn, path);
}
function getAmountsInWithTwamm(uint256 amountOut, address[] memory path) public returns (uint256[] memory amounts) {
return FraxswapRouterLibrary.getAmountsInWithTwamm(factory, amountOut, path);
}
}{
"remappings": [
"ds-test/=lib/ds-test/src/",
"forge-std/=lib/forge-std/src/",
"frax-std/=node_modules/frax-standard-solidity/src/",
"src/=src/",
"frax-ether-redemption-queue/=lib/frax-ether-redemption-queue-dev/src/",
"solmate/=node_modules/solmate/",
"@chainlink/=node_modules/@chainlink/",
"@openzeppelin/=node_modules/@openzeppelin/",
"@eth-optimism/=node_modules/@eth-optimism/",
"frax-standard-solidity/=node_modules/frax-standard-solidity/",
"solidity-bytes-utils/=node_modules/solidity-bytes-utils/"
],
"optimizer": {
"enabled": true,
"runs": 1000000
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "none",
"appendCBOR": false
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "paris",
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"INIT_CODE_HASH","outputs":[{"internalType":"bytes","name":"hash","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"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":"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":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsInWithTwamm","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOutWithTwamm","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"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":"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":"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":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"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":"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":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"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":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"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"},{"internalType":"address[]","name":"path","type":"address[]"},{"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"},{"internalType":"address[]","name":"path","type":"address[]"},{"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"},{"internalType":"address[]","name":"path","type":"address[]"},{"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"},{"internalType":"address[]","name":"path","type":"address[]"},{"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":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60c06040523480156200001157600080fd5b5060405162005f2138038062005f21833981016040819052620000349162000069565b6001600160a01b039182166080521660a052620000a1565b80516001600160a01b03811681146200006457600080fd5b919050565b600080604083850312156200007d57600080fd5b62000088836200004c565b915062000098602084016200004c565b90509250929050565b60805160a051615cd962000248600039600081816101cd015281816104470152818161066f015281816106d70152818161084701528181610b3101528181610fe6015281816111e80152818161172101528181611874015281816119b501528181611a9f01528181611c9101528181611d2c015281816120f2015281816121e9015281816122fe015281816123df0152818161246001528181612ab201528181612dbb01528181612e1101528181612e4501528181612f0d015281816130b60152818161329c01526133370152600081816105330152818161091a01528181610a5c01528181610c2401528181610c5d01528181610dfc015281816110b9015281816111c6015281816113a50152818161167901528181611b7e01528181611d6b01528181611f650152818161226b0152818161249f0152818161277601528181612a6001528181612a9001528181612c6101528181612def015281816131950152818161337601528181613e0301528181613e3601528181614591015281816145c4015281816147a001528181614eb901528181614f8e01526150050152615cd96000f3fe6080604052600436106101b05760003560e01c806385f8c259116100ec578063baa2abde1161008a578063ded9382a11610064578063ded9382a14610575578063e8e3370014610595578063f305d719146105d0578063fb3bdb41146105e357600080fd5b8063baa2abde14610501578063c45a015514610521578063d06ca61f1461055557600080fd5b8063ad615dec116100c6578063ad615dec1461048e578063af2979eb146104ae578063b66caf06146104ce578063b6f9de95146104ee57600080fd5b806385f8c259146103f55780638803dbee14610415578063ad5c46481461043557600080fd5b806338ed1739116101595780635c11d795116101335780635c11d79514610382578063704c32cf146103a2578063791ac947146103c25780637ff36ab5146103e257600080fd5b806338ed1739146103225780634a25d94a146103425780635b0d59841461036257600080fd5b80631f00ca741161018a5780631f00ca74146102965780632195995c146102b6578063257671f5146102d657600080fd5b806302751cec14610201578063054d50d41461023b57806318cbafe51461026957600080fd5b366101fc573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146101fa576101fa615387565b005b600080fd5b34801561020d57600080fd5b5061022161021c3660046153eb565b6105f6565b604080519283526020830191909152015b60405180910390f35b34801561024757600080fd5b5061025b610256366004615449565b61075e565b604051908152602001610232565b34801561027557600080fd5b506102896102843660046154ba565b6107c3565b604051610232919061552d565b3480156102a257600080fd5b506102896102b13660046155a0565b610c1d565b3480156102c257600080fd5b506102216102d13660046156ae565b610c53565b3480156102e257600080fd5b5060408051808201825260208082527f676b4c9b92980c4e7823b43031b17d7299896d1cd7d147104ad8e21692123fa190820152905161023291906157c6565b34801561032e57600080fd5b5061028961033d3660046154ba565b610d8a565b34801561034e57600080fd5b5061028961035d3660046154ba565b610f62565b34801561036e57600080fd5b5061025b61037d3660046157d9565b6111be565b34801561038e57600080fd5b506101fa61039d3660046154ba565b611309565b3480156103ae57600080fd5b506102896103bd3660046155a0565b611672565b3480156103ce57600080fd5b506101fa6103dd3660046154ba565b61169f565b6102896103f036600461586f565b611a30565b34801561040157600080fd5b5061025b610410366004615449565b611e8e565b34801561042157600080fd5b506102896104303660046154ba565b611ef3565b34801561044157600080fd5b506104697f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610232565b34801561049a57600080fd5b5061025b6104a9366004615449565b61206a565b3480156104ba57600080fd5b5061025b6104c93660046153eb565b61207f565b3480156104da57600080fd5b506102896104e93660046155a0565b612264565b6101fa6104fc36600461586f565b612291565b34801561050d57600080fd5b5061022161051c3660046158d6565b612701565b34801561052d57600080fd5b506104697f000000000000000000000000000000000000000000000000000000000000000081565b34801561056157600080fd5b506102896105703660046155a0565b612a59565b34801561058157600080fd5b506102216105903660046157d9565b612a86565b3480156105a157600080fd5b506105b56105b0366004615948565b612bd7565b60408051938452602084019290925290820152606001610232565b6105b56105de3660046153eb565b612d45565b6102896105f136600461586f565b613047565b6000808242811015610669576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a20455850495245440000000000000060448201526064015b60405180910390fd5b610698897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612701565b90935091506106a88986856134db565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018390527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b15801561073057600080fd5b505af1158015610744573d6000803e3d6000fd5b505050506107528583613671565b50965096945050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f446570726563617465643a2055736520676574416d6f756e74734f75740000006044820152600090606401610660565b60608142811015610830576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610660565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686866108746001826159f3565b81811061088357610883615a06565b90506020020160208101906108989190615a35565b73ffffffffffffffffffffffffffffffffffffffff1614610915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f5041544800006044820152606401610660565b6109737f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061378092505050565b915086826001845161098591906159f3565b8151811061099557610995615a06565b60200260200101511015610a2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e5400000000000000000000000000000000000000006064820152608401610660565b610af086866000818110610a4157610a41615a06565b9050602002016020810190610a569190615a35565b33610ad07f00000000000000000000000000000000000000000000000000000000000000008a8a6000818110610a8e57610a8e615a06565b9050602002016020810190610aa39190615a35565b8b8b6001818110610ab657610ab6615a06565b9050602002016020810190610acb9190615a35565b613a64565b85600081518110610ae357610ae3615a06565b6020026020010151613b67565b610b2f82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613d06915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d8360018551610b7a91906159f3565b81518110610b8a57610b8a615a06565b60200260200101516040518263ffffffff1660e01b8152600401610bb091815260200190565b600060405180830381600087803b158015610bca57600080fd5b505af1158015610bde573d6000803e3d6000fd5b50505050610c12848360018551610bf591906159f3565b81518110610c0557610c05615a06565b6020026020010151613671565b509695505050505050565b6060610c4a7f00000000000000000000000000000000000000000000000000000000000000008484613f11565b90505b92915050565b6000806000610c837f00000000000000000000000000000000000000000000000000000000000000008f8f613a64565b9050600087610c92578c610cb4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c4810187905290915073ffffffffffffffffffffffffffffffffffffffff83169063d505accf9060e401600060405180830381600087803b158015610d4957600080fd5b505af1158015610d5d573d6000803e3d6000fd5b50505050610d708f8f8f8f8f8f8f612701565b809450819550505050509b509b9950505050505050505050565b60608142811015610df7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610660565b610e557f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061378092505050565b9150868260018451610e6791906159f3565b81518110610e7757610e77615a06565b60200260200101511015610f0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e5400000000000000000000000000000000000000006064820152608401610660565b610f2386866000818110610a4157610a41615a06565b610c1282878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613d06915050565b60608142811015610fcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610660565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686866110136001826159f3565b81811061102257611022615a06565b90506020020160208101906110379190615a35565b73ffffffffffffffffffffffffffffffffffffffff16146110b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f5041544800006044820152606401610660565b6111127f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061425692505050565b9150868260008151811061112857611128615a06565b60200260200101511115610a2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f46726178737761705631526f757465723a204558434553534956455f494e505560448201527f545f414d4f554e540000000000000000000000000000000000000000000000006064820152608401610660565b60008061120c7f00000000000000000000000000000000000000000000000000000000000000008d7f0000000000000000000000000000000000000000000000000000000000000000613a64565b905060008661121b578b61123d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018a905260ff8816608482015260a4810187905260c4810186905290915073ffffffffffffffffffffffffffffffffffffffff83169063d505accf9060e401600060405180830381600087803b1580156112d257600080fd5b505af11580156112e6573d6000803e3d6000fd5b505050506112f88d8d8d8d8d8d61207f565b9d9c50505050505050505050505050565b8042811015611374576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610660565b6114058585600081811061138a5761138a615a06565b905060200201602081019061139f9190615a35565b336113ff7f0000000000000000000000000000000000000000000000000000000000000000898960008181106113d7576113d7615a06565b90506020020160208101906113ec9190615a35565b8a8a6001818110610ab657610ab6615a06565b8a613b67565b600085856114146001826159f3565b81811061142357611423615a06565b90506020020160208101906114389190615a35565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015291909116906370a0823190602401602060405180830381865afa1580156114a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ca9190615a59565b905061150a86868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525088925061451c915050565b868187876115196001826159f3565b81811061152857611528615a06565b905060200201602081019061153d9190615a35565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015291909116906370a08231906024015b602060405180830381865afa1580156115ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d09190615a59565b6115da91906159f3565b1015611668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e5400000000000000000000000000000000000000006064820152608401610660565b5050505050505050565b6060610c4a7f00000000000000000000000000000000000000000000000000000000000000008484613780565b804281101561170a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610660565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016858561174e6001826159f3565b81811061175d5761175d615a06565b90506020020160208101906117729190615a35565b73ffffffffffffffffffffffffffffffffffffffff16146117ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f5041544800006044820152606401610660565b6118058585600081811061138a5761138a615a06565b61184385858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525030925061451c915050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156118d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f49190615a59565b905086811015611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e5400000000000000000000000000000000000000006064820152608401610660565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b158015611a0e57600080fd5b505af1158015611a22573d6000803e3d6000fd5b505050506116688482613671565b60608142811015611a9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610660565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1686866000818110611ae757611ae7615a06565b9050602002016020810190611afc9190615a35565b73ffffffffffffffffffffffffffffffffffffffff1614611b79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f5041544800006044820152606401610660565b611bd77f00000000000000000000000000000000000000000000000000000000000000003488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061378092505050565b9150868260018451611be991906159f3565b81518110611bf957611bf9615a06565b60200260200101511015611c8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e5400000000000000000000000000000000000000006064820152608401610660565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db083600081518110611cde57611cde615a06565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d1157600080fd5b505af1158015611d25573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611d9d7f0000000000000000000000000000000000000000000000000000000000000000898960008181106113d7576113d7615a06565b84600081518110611db057611db0615a06565b60200260200101516040518363ffffffff1660e01b8152600401611df692919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af1158015611e15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e399190615a72565b611e4557611e45615387565b611e8482878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613d06915050565b5095945050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f446570726563617465643a2055736520676574416d6f756e7473496e000000006044820152600090606401610660565b60608142811015611f60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610660565b611fbe7f00000000000000000000000000000000000000000000000000000000000000008988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061425692505050565b91508682600081518110611fd457611fd4615a06565b60200260200101511115610f0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f46726178737761705631526f757465723a204558434553534956455f494e505560448201527f545f414d4f554e540000000000000000000000000000000000000000000000006064820152608401610660565b600061207784848461487b565b949350505050565b600081428110156120ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610660565b61211b887f00000000000000000000000000000000000000000000000000000000000000008989893089612701565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529093506121ba91508990869073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015612191573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121b59190615a59565b6134db565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018390527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b15801561224257600080fd5b505af1158015612256573d6000803e3d6000fd5b50505050610c128483613671565b6060610c4a7f00000000000000000000000000000000000000000000000000000000000000008484614256565b80428110156122fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610660565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168585600081811061234657612346615a06565b905060200201602081019061235b9190615a35565b73ffffffffffffffffffffffffffffffffffffffff16146123d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f5041544800006044820152606401610660565b60003490507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561244557600080fd5b505af1158015612459573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6124d17f0000000000000000000000000000000000000000000000000000000000000000898960008181106113d7576113d7615a06565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018490526044016020604051808303816000875af1158015612543573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125679190615a72565b61257357612573615387565b600086866125826001826159f3565b81811061259157612591615a06565b90506020020160208101906125a69190615a35565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015291909116906370a0823190602401602060405180830381865afa158015612614573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126389190615a59565b905061267887878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061451c915050565b878188886126876001826159f3565b81811061269657612696615a06565b90506020020160208101906126ab9190615a35565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015291909116906370a082319060240161158f565b600080824281101561276f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610660565b600061279c7f00000000000000000000000000000000000000000000000000000000000000008c8c613a64565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff821660248201819052604482018c90529192506323b872dd906064016020604051808303816000875af1158015612818573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061283c9190615a72565b506040517f89afcb4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015260009182918416906389afcb449060240160408051808303816000875af11580156128af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128d39190615a8f565b9150915060006128e38e8e6149bd565b5090508073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff1614612920578183612923565b82825b90975095508a8710156129b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4160448201527f5f414d4f554e54000000000000000000000000000000000000000000000000006064820152608401610660565b89861015612a48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4260448201527f5f414d4f554e54000000000000000000000000000000000000000000000000006064820152608401610660565b505050505097509795505050505050565b6060610c4a7f00000000000000000000000000000000000000000000000000000000000000008484614b67565b6000806000612ad67f00000000000000000000000000000000000000000000000000000000000000008e7f0000000000000000000000000000000000000000000000000000000000000000613a64565b9050600087612ae5578c612b07565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c4810187905290915073ffffffffffffffffffffffffffffffffffffffff83169063d505accf9060e401600060405180830381600087803b158015612b9c57600080fd5b505af1158015612bb0573d6000803e3d6000fd5b50505050612bc28e8e8e8e8e8e6105f6565b909f909e509c50505050505050505050505050565b60008060008342811015612c47576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610660565b612c558c8c8c8c8c8c614e65565b90945092506000612c877f00000000000000000000000000000000000000000000000000000000000000008e8e613a64565b9050612c958d338388613b67565b612ca18c338387613b67565b6040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152821690636a627842906024016020604051808303816000875af1158015612d0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d339190615a59565b92505050985098509895505050505050565b60008060008342811015612db5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610660565b612de38a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c614e65565b90945092506000612e357f00000000000000000000000000000000000000000000000000000000000000008c7f0000000000000000000000000000000000000000000000000000000000000000613a64565b9050612e438b338388613b67565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612eab57600080fd5b505af1158015612ebf573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018990527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303816000875af1158015612f5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f7e9190615a72565b612f8a57612f8a615387565b6040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152821690636a627842906024016020604051808303816000875af1158015612ff8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061301c9190615a59565b925083341115613039576130393361303486346159f3565b613671565b505096509650969350505050565b606081428110156130b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610660565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16868660008181106130fe576130fe615a06565b90506020020160208101906131139190615a35565b73ffffffffffffffffffffffffffffffffffffffff1614613190576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f5041544800006044820152606401610660565b6131ee7f00000000000000000000000000000000000000000000000000000000000000008888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061425692505050565b9150348260008151811061320457613204615a06565b6020026020010151111561329a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f46726178737761705631526f757465723a204558434553534956455f494e505560448201527f545f414d4f554e540000000000000000000000000000000000000000000000006064820152608401610660565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836000815181106132e9576132e9615a06565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561331c57600080fd5b505af1158015613330573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6133a87f0000000000000000000000000000000000000000000000000000000000000000898960008181106113d7576113d7615a06565b846000815181106133bb576133bb615a06565b60200260200101516040518363ffffffff1660e01b815260040161340192919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af1158015613420573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134449190615a72565b61345057613450615387565b61348f82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613d06915050565b816000815181106134a2576134a2615a06565b6020026020010151341115611e8457611e8433836000815181106134c8576134c8615a06565b60200260200101513461303491906159f3565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916135729190615ab3565b6000604051808303816000865af19150503d80600081146135af576040519150601f19603f3d011682016040523d82523d6000602084013e6135b4565b606091505b50915091508180156135de5750805115806135de5750808060200190518101906135de9190615a72565b61366a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201527f616e73666572206661696c6564000000000000000000000000000000000000006064820152608401610660565b5050505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040516136a89190615ab3565b60006040518083038185875af1925050503d80600081146136e5576040519150601f19603f3d011682016040523d82523d6000602084013e6136ea565b606091505b505090508061377b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527f20455448207472616e73666572206661696c65640000000000000000000000006064820152608401610660565b505050565b6060600282511015613814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a20494e56414c49445f5060448201527f41544800000000000000000000000000000000000000000000000000000000006064820152608401610660565b815167ffffffffffffffff81111561382e5761382e615571565b604051908082528060200260200182016040528015613857578160200160208202803683370190505b509050828160008151811061386e5761386e615a06565b60200260200101818152505060005b6001835161388b91906159f3565b811015613a5c5760006138dd868584815181106138aa576138aa615a06565b6020026020010151868560016138c09190615acf565b815181106138d0576138d0615a06565b6020026020010151613a64565b6040517f2e0ae37500000000000000000000000000000000000000000000000000000000815242600482015290915073ffffffffffffffffffffffffffffffffffffffff821690632e0ae37590602401600060405180830381600087803b15801561394757600080fd5b505af115801561395b573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663f140a35a84848151811061398d5761398d615a06565b60200260200101518685815181106139a7576139a7615a06565b60200260200101516040518363ffffffff1660e01b81526004016139eb92919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b602060405180830381865afa158015613a08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a2c9190615a59565b83613a38846001615acf565b81518110613a4857613a48615a06565b60209081029190910101525060010161387d565b509392505050565b6000806000613a7385856149bd565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084811b8216602084015283901b16603482015291935091508690604801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012083830183528184527f676b4c9b92980c4e7823b43031b17d7299896d1cd7d147104ad8e21692123fa1848301529151613b2794939101615ae2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209695505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790529151600092839290881691613c069190615ab3565b6000604051808303816000865af19150503d8060008114613c43576040519150601f19603f3d011682016040523d82523d6000602084013e613c48565b606091505b5091509150818015613c72575080511580613c72575080806020019051810190613c729190615a72565b613cfe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a20747260448201527f616e7366657246726f6d206661696c65640000000000000000000000000000006064820152608401610660565b505050505050565b60005b60018351613d1791906159f3565b811015613f0b57600080848381518110613d3357613d33615a06565b602002602001015185846001613d499190615acf565b81518110613d5957613d59615a06565b6020026020010151915091506000613d7183836149bd565b509050600087613d82866001615acf565b81518110613d9257613d92615a06565b602002602001015190506000808373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614613dda57826000613dde565b6000835b91509150600060028a51613df291906159f3565b8810613dfe5788613e2f565b613e2f7f0000000000000000000000000000000000000000000000000000000000000000878c6138c08c6002615acf565b9050613e5c7f00000000000000000000000000000000000000000000000000000000000000008888613a64565b73ffffffffffffffffffffffffffffffffffffffff1663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613ea6576020820181803683370190505b506040518563ffffffff1660e01b8152600401613ec69493929190615b5a565b600060405180830381600087803b158015613ee057600080fd5b505af1158015613ef4573d6000803e3d6000fd5b505060019099019850613d09975050505050505050565b50505050565b6060600282511015613fa5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a20494e56414c49445f5060448201527f41544800000000000000000000000000000000000000000000000000000000006064820152608401610660565b815167ffffffffffffffff811115613fbf57613fbf615571565b604051908082528060200260200182016040528015613fe8578160200160208202803683370190505b509050828160018351613ffb91906159f3565b8151811061400b5761400b615a06565b60200260200101818152505060006001835161402791906159f3565b90505b8015613a5c57600061406c86856140426001866159f3565b8151811061405257614052615a06565b60200260200101518685815181106138d0576138d0615a06565b90508073ffffffffffffffffffffffffffffffffffffffff1663a1462c196040518163ffffffff1660e01b8152600401602060405180830381865afa1580156140b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140dd9190615a72565b614143576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f7477616d6d206f7574206f6620646174650000000000000000000000000000006044820152606401610660565b8073ffffffffffffffffffffffffffffffffffffffff16631125f13f84848151811061417157614171615a06565b60200260200101518660018661418791906159f3565b8151811061419757614197615a06565b60200260200101516040518363ffffffff1660e01b81526004016141db92919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b602060405180830381865afa1580156141f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061421c9190615a59565b836142286001856159f3565b8151811061423857614238615a06565b6020908102919091010152508061424e81615b9f565b91505061402a565b60606002825110156142ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a20494e56414c49445f5060448201527f41544800000000000000000000000000000000000000000000000000000000006064820152608401610660565b815167ffffffffffffffff81111561430457614304615571565b60405190808252806020026020018201604052801561432d578160200160208202803683370190505b50905082816001835161434091906159f3565b8151811061435057614350615a06565b60200260200101818152505060006001835161436c91906159f3565b90505b8015613a5c57600061438786856140426001866159f3565b6040517f2e0ae37500000000000000000000000000000000000000000000000000000000815242600482015290915073ffffffffffffffffffffffffffffffffffffffff821690632e0ae37590602401600060405180830381600087803b1580156143f157600080fd5b505af1158015614405573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16631125f13f84848151811061443757614437615a06565b60200260200101518660018661444d91906159f3565b8151811061445d5761445d615a06565b60200260200101516040518363ffffffff1660e01b81526004016144a192919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b602060405180830381865afa1580156144be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144e29190615a59565b836144ee6001856159f3565b815181106144fe576144fe615a06565b6020908102919091010152508061451481615b9f565b91505061436f565b60005b6001835161452d91906159f3565b81101561377b5760008084838151811061454957614549615a06565b60200260200101518584600161455f9190615acf565b8151811061456f5761456f615a06565b602002602001015191509150600061458783836149bd565b50905060006145b77f00000000000000000000000000000000000000000000000000000000000000008585613a64565b90506000806000806145ea7f000000000000000000000000000000000000000000000000000000000000000089896151c4565b506040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015293955090935083928592508b16906370a0823190602401602060405180830381865afa158015614662573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146869190615a59565b61469091906159f3565b61469a91906159f3565b6040517ff140a35a0000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff8a811660248301529195509086169063f140a35a90604401602060405180830381865afa158015614711573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147359190615a59565b925050506000808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146147775782600061477b565b6000835b91509150600060028c5161478f91906159f3565b8a1061479b578a6147cc565b6147cc7f0000000000000000000000000000000000000000000000000000000000000000898e6138c08e6002615acf565b604080516000815260208101918290527f022c0d9f0000000000000000000000000000000000000000000000000000000090915290915073ffffffffffffffffffffffffffffffffffffffff87169063022c0d9f906148349086908690869060248101615b5a565b600060405180830381600087803b15801561484e57600080fd5b505af1158015614862573d6000803e3d6000fd5b50506001909b019a5061451f9950505050505050505050565b600080841161490c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4672617873776170526f757465724c6962726172793a20494e5355464649434960448201527f454e545f414d4f554e54000000000000000000000000000000000000000000006064820152608401610660565b60008311801561491c5750600082115b6149a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4672617873776170526f757465724c6962726172793a20494e5355464649434960448201527f454e545f4c4951554944495459000000000000000000000000000000000000006064820152608401610660565b826149b38386615bd4565b6120779190615beb565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603614a7b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4672617873776170526f757465724c6962726172793a204944454e544943414c60448201527f5f414444524553534553000000000000000000000000000000000000000000006064820152608401610660565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610614ab5578284614ab8565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216614b60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a205a45524f5f4144445260448201527f45535300000000000000000000000000000000000000000000000000000000006064820152608401610660565b9250929050565b6060600282511015614bfb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a20494e56414c49445f5060448201527f41544800000000000000000000000000000000000000000000000000000000006064820152608401610660565b815167ffffffffffffffff811115614c1557614c15615571565b604051908082528060200260200182016040528015614c3e578160200160208202803683370190505b5090508281600081518110614c5557614c55615a06565b60200260200101818152505060005b60018351614c7291906159f3565b811015613a5c576000614c91868584815181106138aa576138aa615a06565b90508073ffffffffffffffffffffffffffffffffffffffff1663a1462c196040518163ffffffff1660e01b8152600401602060405180830381865afa158015614cde573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d029190615a72565b614d68576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f7477616d6d206f7574206f6620646174650000000000000000000000000000006044820152606401610660565b8073ffffffffffffffffffffffffffffffffffffffff1663f140a35a848481518110614d9657614d96615a06565b6020026020010151868581518110614db057614db0615a06565b60200260200101516040518363ffffffff1660e01b8152600401614df492919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b602060405180830381865afa158015614e11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e359190615a59565b83614e41846001615acf565b81518110614e5157614e51615a06565b602090810291909101015250600101614c64565b6040517fe6a4390500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301528681166024830152600091829182917f00000000000000000000000000000000000000000000000000000000000000009091169063e6a4390590604401602060405180830381865afa158015614f02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614f269190615c26565b73ffffffffffffffffffffffffffffffffffffffff1603614ffd576040517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015288811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303816000875af1158015614fd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614ffb9190615c26565b505b60008061502b7f00000000000000000000000000000000000000000000000000000000000000008b8b6151c4565b50509150915081600014801561503f575080155b1561504f578793508692506151b7565b600061505c89848461487b565b905087811161510057858110156150f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4260448201527f5f414d4f554e54000000000000000000000000000000000000000000000000006064820152608401610660565b8894509250826151b5565b600061510d89848661487b565b90508981111561511f5761511f615387565b878110156151af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4160448201527f5f414d4f554e54000000000000000000000000000000000000000000000000006064820152608401610660565b94508793505b505b5050965096945050505050565b60008060008060006151d687876149bd565b50905060006151e6898989613a64565b6040517f2e0ae37500000000000000000000000000000000000000000000000000000000815242600482015290915073ffffffffffffffffffffffffffffffffffffffff821690632e0ae37590602401600060405180830381600087803b15801561525057600080fd5b505af1158015615264573d6000803e3d6000fd5b505050506000806000808473ffffffffffffffffffffffffffffffffffffffff1663094cf1496040518163ffffffff1660e01b815260040160c060405180830381865afa1580156152b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906152dd9190615c61565b506dffffffffffffffffffffffffffff1694506dffffffffffffffffffffffffffff169450506dffffffffffffffffffffffffffff1693506dffffffffffffffffffffffffffff1693508573ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff16146153635782848284615368565b838383835b809a50819b50829c50839d505050505050505050505093509350935093565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff811681146153d857600080fd5b50565b80356153e6816153b6565b919050565b60008060008060008060c0878903121561540457600080fd5b863561540f816153b6565b95506020870135945060408701359350606087013592506080870135615434816153b6565b8092505060a087013590509295509295509295565b60008060006060848603121561545e57600080fd5b505081359360208301359350604090920135919050565b60008083601f84011261548757600080fd5b50813567ffffffffffffffff81111561549f57600080fd5b6020830191508360208260051b8501011115614b6057600080fd5b60008060008060008060a087890312156154d357600080fd5b8635955060208701359450604087013567ffffffffffffffff8111156154f857600080fd5b61550489828a01615475565b9095509350506060870135615518816153b6565b80925050608087013590509295509295509295565b6020808252825182820181905260009190848201906040850190845b8181101561556557835183529284019291840191600101615549565b50909695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080604083850312156155b357600080fd5b8235915060208084013567ffffffffffffffff808211156155d357600080fd5b818601915086601f8301126155e757600080fd5b8135818111156155f9576155f9615571565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f8301168101818110858211171561563c5761563c615571565b60405291825284820192508381018501918983111561565a57600080fd5b938501935b8285101561567f57615670856153db565b8452938501939285019261565f565b8096505050505050509250929050565b80151581146153d857600080fd5b803560ff811681146153e657600080fd5b60008060008060008060008060008060006101608c8e0312156156d057600080fd5b8b356156db816153b6565b9a5060208c01356156eb816153b6565b995060408c0135985060608c0135975060808c0135965060a08c0135615710816153b6565b955060c08c0135945060e08c01356157278161568f565b93506157366101008d0161569d565b92506101208c013591506101408c013590509295989b509295989b9093969950565b60005b8381101561577357818101518382015260200161575b565b50506000910152565b60008151808452615794816020860160208601615758565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610c4a602083018461577c565b6000806000806000806000806000806101408b8d0312156157f957600080fd5b8a35615804816153b6565b995060208b0135985060408b0135975060608b0135965060808b0135615829816153b6565b955060a08b0135945060c08b01356158408161568f565b935061584e60e08c0161569d565b92506101008b013591506101208b013590509295989b9194979a5092959850565b60008060008060006080868803121561588757600080fd5b85359450602086013567ffffffffffffffff8111156158a557600080fd5b6158b188828901615475565b90955093505060408601356158c5816153b6565b949793965091946060013592915050565b600080600080600080600060e0888a0312156158f157600080fd5b87356158fc816153b6565b9650602088013561590c816153b6565b955060408801359450606088013593506080880135925060a0880135615931816153b6565b8092505060c0880135905092959891949750929550565b600080600080600080600080610100898b03121561596557600080fd5b8835615970816153b6565b97506020890135615980816153b6565b965060408901359550606089013594506080890135935060a0890135925060c08901356159ac816153b6565b8092505060e089013590509295985092959890939650565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610c4d57610c4d6159c4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215615a4757600080fd5b8135615a52816153b6565b9392505050565b600060208284031215615a6b57600080fd5b5051919050565b600060208284031215615a8457600080fd5b8151615a528161568f565b60008060408385031215615aa257600080fd5b505080516020909101519092909150565b60008251615ac5818460208701615758565b9190910192915050565b80820180821115610c4d57610c4d6159c4565b7fff0000000000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008460601b16600182015282601582015260008251615b4b816035850160208701615758565b91909101603501949350505050565b84815283602082015273ffffffffffffffffffffffffffffffffffffffff83166040820152608060608201526000615b95608083018461577c565b9695505050505050565b600081615bae57615bae6159c4565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b8082028115828204841417610c4d57610c4d6159c4565b600082615c21577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600060208284031215615c3857600080fd5b8151615a52816153b6565b80516dffffffffffffffffffffffffffff811681146153e657600080fd5b60008060008060008060c08789031215615c7a57600080fd5b615c8387615c43565b9550615c9160208801615c43565b9450604087015163ffffffff81168114615caa57600080fd5b9350615cb860608801615c43565b9250615cc660808801615c43565b915060a08701519050929550929550929556000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e6000000000000000000000000fc00000000000000000000000000000000000006
Deployed Bytecode
0x6080604052600436106101b05760003560e01c806385f8c259116100ec578063baa2abde1161008a578063ded9382a11610064578063ded9382a14610575578063e8e3370014610595578063f305d719146105d0578063fb3bdb41146105e357600080fd5b8063baa2abde14610501578063c45a015514610521578063d06ca61f1461055557600080fd5b8063ad615dec116100c6578063ad615dec1461048e578063af2979eb146104ae578063b66caf06146104ce578063b6f9de95146104ee57600080fd5b806385f8c259146103f55780638803dbee14610415578063ad5c46481461043557600080fd5b806338ed1739116101595780635c11d795116101335780635c11d79514610382578063704c32cf146103a2578063791ac947146103c25780637ff36ab5146103e257600080fd5b806338ed1739146103225780634a25d94a146103425780635b0d59841461036257600080fd5b80631f00ca741161018a5780631f00ca74146102965780632195995c146102b6578063257671f5146102d657600080fd5b806302751cec14610201578063054d50d41461023b57806318cbafe51461026957600080fd5b366101fc573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000fc0000000000000000000000000000000000000616146101fa576101fa615387565b005b600080fd5b34801561020d57600080fd5b5061022161021c3660046153eb565b6105f6565b604080519283526020830191909152015b60405180910390f35b34801561024757600080fd5b5061025b610256366004615449565b61075e565b604051908152602001610232565b34801561027557600080fd5b506102896102843660046154ba565b6107c3565b604051610232919061552d565b3480156102a257600080fd5b506102896102b13660046155a0565b610c1d565b3480156102c257600080fd5b506102216102d13660046156ae565b610c53565b3480156102e257600080fd5b5060408051808201825260208082527f676b4c9b92980c4e7823b43031b17d7299896d1cd7d147104ad8e21692123fa190820152905161023291906157c6565b34801561032e57600080fd5b5061028961033d3660046154ba565b610d8a565b34801561034e57600080fd5b5061028961035d3660046154ba565b610f62565b34801561036e57600080fd5b5061025b61037d3660046157d9565b6111be565b34801561038e57600080fd5b506101fa61039d3660046154ba565b611309565b3480156103ae57600080fd5b506102896103bd3660046155a0565b611672565b3480156103ce57600080fd5b506101fa6103dd3660046154ba565b61169f565b6102896103f036600461586f565b611a30565b34801561040157600080fd5b5061025b610410366004615449565b611e8e565b34801561042157600080fd5b506102896104303660046154ba565b611ef3565b34801561044157600080fd5b506104697f000000000000000000000000fc0000000000000000000000000000000000000681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610232565b34801561049a57600080fd5b5061025b6104a9366004615449565b61206a565b3480156104ba57600080fd5b5061025b6104c93660046153eb565b61207f565b3480156104da57600080fd5b506102896104e93660046155a0565b612264565b6101fa6104fc36600461586f565b612291565b34801561050d57600080fd5b5061022161051c3660046158d6565b612701565b34801561052d57600080fd5b506104697f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e681565b34801561056157600080fd5b506102896105703660046155a0565b612a59565b34801561058157600080fd5b506102216105903660046157d9565b612a86565b3480156105a157600080fd5b506105b56105b0366004615948565b612bd7565b60408051938452602084019290925290820152606001610232565b6105b56105de3660046153eb565b612d45565b6102896105f136600461586f565b613047565b6000808242811015610669576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a20455850495245440000000000000060448201526064015b60405180910390fd5b610698897f000000000000000000000000fc000000000000000000000000000000000000068a8a8a308a612701565b90935091506106a88986856134db565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018390527f000000000000000000000000fc0000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b15801561073057600080fd5b505af1158015610744573d6000803e3d6000fd5b505050506107528583613671565b50965096945050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f446570726563617465643a2055736520676574416d6f756e74734f75740000006044820152600090606401610660565b60608142811015610830576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610660565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000fc000000000000000000000000000000000000061686866108746001826159f3565b81811061088357610883615a06565b90506020020160208101906108989190615a35565b73ffffffffffffffffffffffffffffffffffffffff1614610915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f5041544800006044820152606401610660565b6109737f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061378092505050565b915086826001845161098591906159f3565b8151811061099557610995615a06565b60200260200101511015610a2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e5400000000000000000000000000000000000000006064820152608401610660565b610af086866000818110610a4157610a41615a06565b9050602002016020810190610a569190615a35565b33610ad07f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68a8a6000818110610a8e57610a8e615a06565b9050602002016020810190610aa39190615a35565b8b8b6001818110610ab657610ab6615a06565b9050602002016020810190610acb9190615a35565b613a64565b85600081518110610ae357610ae3615a06565b6020026020010151613b67565b610b2f82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250613d06915050565b7f000000000000000000000000fc0000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d8360018551610b7a91906159f3565b81518110610b8a57610b8a615a06565b60200260200101516040518263ffffffff1660e01b8152600401610bb091815260200190565b600060405180830381600087803b158015610bca57600080fd5b505af1158015610bde573d6000803e3d6000fd5b50505050610c12848360018551610bf591906159f3565b81518110610c0557610c05615a06565b6020026020010151613671565b509695505050505050565b6060610c4a7f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68484613f11565b90505b92915050565b6000806000610c837f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68f8f613a64565b9050600087610c92578c610cb4565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c4810187905290915073ffffffffffffffffffffffffffffffffffffffff83169063d505accf9060e401600060405180830381600087803b158015610d4957600080fd5b505af1158015610d5d573d6000803e3d6000fd5b50505050610d708f8f8f8f8f8f8f612701565b809450819550505050509b509b9950505050505050505050565b60608142811015610df7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610660565b610e557f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061378092505050565b9150868260018451610e6791906159f3565b81518110610e7757610e77615a06565b60200260200101511015610f0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e5400000000000000000000000000000000000000006064820152608401610660565b610f2386866000818110610a4157610a41615a06565b610c1282878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613d06915050565b60608142811015610fcf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610660565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000fc000000000000000000000000000000000000061686866110136001826159f3565b81811061102257611022615a06565b90506020020160208101906110379190615a35565b73ffffffffffffffffffffffffffffffffffffffff16146110b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f5041544800006044820152606401610660565b6111127f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061425692505050565b9150868260008151811061112857611128615a06565b60200260200101511115610a2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f46726178737761705631526f757465723a204558434553534956455f494e505560448201527f545f414d4f554e540000000000000000000000000000000000000000000000006064820152608401610660565b60008061120c7f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68d7f000000000000000000000000fc00000000000000000000000000000000000006613a64565b905060008661121b578b61123d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018a905260ff8816608482015260a4810187905260c4810186905290915073ffffffffffffffffffffffffffffffffffffffff83169063d505accf9060e401600060405180830381600087803b1580156112d257600080fd5b505af11580156112e6573d6000803e3d6000fd5b505050506112f88d8d8d8d8d8d61207f565b9d9c50505050505050505050505050565b8042811015611374576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610660565b6114058585600081811061138a5761138a615a06565b905060200201602081019061139f9190615a35565b336113ff7f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e6898960008181106113d7576113d7615a06565b90506020020160208101906113ec9190615a35565b8a8a6001818110610ab657610ab6615a06565b8a613b67565b600085856114146001826159f3565b81811061142357611423615a06565b90506020020160208101906114389190615a35565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015291909116906370a0823190602401602060405180830381865afa1580156114a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ca9190615a59565b905061150a86868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525088925061451c915050565b868187876115196001826159f3565b81811061152857611528615a06565b905060200201602081019061153d9190615a35565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015291909116906370a08231906024015b602060405180830381865afa1580156115ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d09190615a59565b6115da91906159f3565b1015611668576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e5400000000000000000000000000000000000000006064820152608401610660565b5050505050505050565b6060610c4a7f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68484613780565b804281101561170a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610660565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000fc0000000000000000000000000000000000000616858561174e6001826159f3565b81811061175d5761175d615a06565b90506020020160208101906117729190615a35565b73ffffffffffffffffffffffffffffffffffffffff16146117ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f5041544800006044820152606401610660565b6118058585600081811061138a5761138a615a06565b61184385858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525030925061451c915050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000fc0000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156118d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f49190615a59565b905086811015611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e5400000000000000000000000000000000000000006064820152608401610660565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290527f000000000000000000000000fc0000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b158015611a0e57600080fd5b505af1158015611a22573d6000803e3d6000fd5b505050506116688482613671565b60608142811015611a9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610660565b7f000000000000000000000000fc0000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff1686866000818110611ae757611ae7615a06565b9050602002016020810190611afc9190615a35565b73ffffffffffffffffffffffffffffffffffffffff1614611b79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f5041544800006044820152606401610660565b611bd77f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e63488888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061378092505050565b9150868260018451611be991906159f3565b81518110611bf957611bf9615a06565b60200260200101511015611c8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e5400000000000000000000000000000000000000006064820152608401610660565b7f000000000000000000000000fc0000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff1663d0e30db083600081518110611cde57611cde615a06565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d1157600080fd5b505af1158015611d25573d6000803e3d6000fd5b50505050507f000000000000000000000000fc0000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611d9d7f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e6898960008181106113d7576113d7615a06565b84600081518110611db057611db0615a06565b60200260200101516040518363ffffffff1660e01b8152600401611df692919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af1158015611e15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e399190615a72565b611e4557611e45615387565b611e8482878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613d06915050565b5095945050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f446570726563617465643a2055736520676574416d6f756e7473496e000000006044820152600090606401610660565b60608142811015611f60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610660565b611fbe7f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061425692505050565b91508682600081518110611fd457611fd4615a06565b60200260200101511115610f0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f46726178737761705631526f757465723a204558434553534956455f494e505560448201527f545f414d4f554e540000000000000000000000000000000000000000000000006064820152608401610660565b600061207784848461487b565b949350505050565b600081428110156120ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610660565b61211b887f000000000000000000000000fc000000000000000000000000000000000000068989893089612701565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529093506121ba91508990869073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa158015612191573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121b59190615a59565b6134db565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018390527f000000000000000000000000fc0000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d90602401600060405180830381600087803b15801561224257600080fd5b505af1158015612256573d6000803e3d6000fd5b50505050610c128483613671565b6060610c4a7f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68484614256565b80428110156122fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610660565b7f000000000000000000000000fc0000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff168585600081811061234657612346615a06565b905060200201602081019061235b9190615a35565b73ffffffffffffffffffffffffffffffffffffffff16146123d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f5041544800006044820152606401610660565b60003490507f000000000000000000000000fc0000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561244557600080fd5b505af1158015612459573d6000803e3d6000fd5b50505050507f000000000000000000000000fc0000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6124d17f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e6898960008181106113d7576113d7615a06565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018490526044016020604051808303816000875af1158015612543573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125679190615a72565b61257357612573615387565b600086866125826001826159f3565b81811061259157612591615a06565b90506020020160208101906125a69190615a35565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015291909116906370a0823190602401602060405180830381865afa158015612614573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126389190615a59565b905061267887878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061451c915050565b878188886126876001826159f3565b81811061269657612696615a06565b90506020020160208101906126ab9190615a35565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015291909116906370a082319060240161158f565b600080824281101561276f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610660565b600061279c7f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68c8c613a64565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff821660248201819052604482018c90529192506323b872dd906064016020604051808303816000875af1158015612818573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061283c9190615a72565b506040517f89afcb4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015260009182918416906389afcb449060240160408051808303816000875af11580156128af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128d39190615a8f565b9150915060006128e38e8e6149bd565b5090508073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff1614612920578183612923565b82825b90975095508a8710156129b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4160448201527f5f414d4f554e54000000000000000000000000000000000000000000000000006064820152608401610660565b89861015612a48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4260448201527f5f414d4f554e54000000000000000000000000000000000000000000000000006064820152608401610660565b505050505097509795505050505050565b6060610c4a7f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68484614b67565b6000806000612ad67f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68e7f000000000000000000000000fc00000000000000000000000000000000000006613a64565b9050600087612ae5578c612b07565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c4810187905290915073ffffffffffffffffffffffffffffffffffffffff83169063d505accf9060e401600060405180830381600087803b158015612b9c57600080fd5b505af1158015612bb0573d6000803e3d6000fd5b50505050612bc28e8e8e8e8e8e6105f6565b909f909e509c50505050505050505050505050565b60008060008342811015612c47576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610660565b612c558c8c8c8c8c8c614e65565b90945092506000612c877f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68e8e613a64565b9050612c958d338388613b67565b612ca18c338387613b67565b6040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152821690636a627842906024016020604051808303816000875af1158015612d0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d339190615a59565b92505050985098509895505050505050565b60008060008342811015612db5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610660565b612de38a7f000000000000000000000000fc000000000000000000000000000000000000068b348c8c614e65565b90945092506000612e357f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68c7f000000000000000000000000fc00000000000000000000000000000000000006613a64565b9050612e438b338388613b67565b7f000000000000000000000000fc0000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015612eab57600080fd5b505af1158015612ebf573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018990527f000000000000000000000000fc0000000000000000000000000000000000000616935063a9059cbb925060440190506020604051808303816000875af1158015612f5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f7e9190615a72565b612f8a57612f8a615387565b6040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152821690636a627842906024016020604051808303816000875af1158015612ff8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061301c9190615a59565b925083341115613039576130393361303486346159f3565b613671565b505096509650969350505050565b606081428110156130b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610660565b7f000000000000000000000000fc0000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff16868660008181106130fe576130fe615a06565b90506020020160208101906131139190615a35565b73ffffffffffffffffffffffffffffffffffffffff1614613190576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f5041544800006044820152606401610660565b6131ee7f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061425692505050565b9150348260008151811061320457613204615a06565b6020026020010151111561329a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f46726178737761705631526f757465723a204558434553534956455f494e505560448201527f545f414d4f554e540000000000000000000000000000000000000000000000006064820152608401610660565b7f000000000000000000000000fc0000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0836000815181106132e9576132e9615a06565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561331c57600080fd5b505af1158015613330573d6000803e3d6000fd5b50505050507f000000000000000000000000fc0000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6133a87f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e6898960008181106113d7576113d7615a06565b846000815181106133bb576133bb615a06565b60200260200101516040518363ffffffff1660e01b815260040161340192919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303816000875af1158015613420573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134449190615a72565b61345057613450615387565b61348f82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250613d06915050565b816000815181106134a2576134a2615a06565b6020026020010151341115611e8457611e8433836000815181106134c8576134c8615a06565b60200260200101513461303491906159f3565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916135729190615ab3565b6000604051808303816000865af19150503d80600081146135af576040519150601f19603f3d011682016040523d82523d6000602084013e6135b4565b606091505b50915091508180156135de5750805115806135de5750808060200190518101906135de9190615a72565b61366a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201527f616e73666572206661696c6564000000000000000000000000000000000000006064820152608401610660565b5050505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040516136a89190615ab3565b60006040518083038185875af1925050503d80600081146136e5576040519150601f19603f3d011682016040523d82523d6000602084013e6136ea565b606091505b505090508061377b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527f20455448207472616e73666572206661696c65640000000000000000000000006064820152608401610660565b505050565b6060600282511015613814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a20494e56414c49445f5060448201527f41544800000000000000000000000000000000000000000000000000000000006064820152608401610660565b815167ffffffffffffffff81111561382e5761382e615571565b604051908082528060200260200182016040528015613857578160200160208202803683370190505b509050828160008151811061386e5761386e615a06565b60200260200101818152505060005b6001835161388b91906159f3565b811015613a5c5760006138dd868584815181106138aa576138aa615a06565b6020026020010151868560016138c09190615acf565b815181106138d0576138d0615a06565b6020026020010151613a64565b6040517f2e0ae37500000000000000000000000000000000000000000000000000000000815242600482015290915073ffffffffffffffffffffffffffffffffffffffff821690632e0ae37590602401600060405180830381600087803b15801561394757600080fd5b505af115801561395b573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663f140a35a84848151811061398d5761398d615a06565b60200260200101518685815181106139a7576139a7615a06565b60200260200101516040518363ffffffff1660e01b81526004016139eb92919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b602060405180830381865afa158015613a08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a2c9190615a59565b83613a38846001615acf565b81518110613a4857613a48615a06565b60209081029190910101525060010161387d565b509392505050565b6000806000613a7385856149bd565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084811b8216602084015283901b16603482015291935091508690604801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012083830183528184527f676b4c9b92980c4e7823b43031b17d7299896d1cd7d147104ad8e21692123fa1848301529151613b2794939101615ae2565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209695505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790529151600092839290881691613c069190615ab3565b6000604051808303816000865af19150503d8060008114613c43576040519150601f19603f3d011682016040523d82523d6000602084013e613c48565b606091505b5091509150818015613c72575080511580613c72575080806020019051810190613c729190615a72565b613cfe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a20747260448201527f616e7366657246726f6d206661696c65640000000000000000000000000000006064820152608401610660565b505050505050565b60005b60018351613d1791906159f3565b811015613f0b57600080848381518110613d3357613d33615a06565b602002602001015185846001613d499190615acf565b81518110613d5957613d59615a06565b6020026020010151915091506000613d7183836149bd565b509050600087613d82866001615acf565b81518110613d9257613d92615a06565b602002602001015190506000808373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614613dda57826000613dde565b6000835b91509150600060028a51613df291906159f3565b8810613dfe5788613e2f565b613e2f7f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e6878c6138c08c6002615acf565b9050613e5c7f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68888613a64565b73ffffffffffffffffffffffffffffffffffffffff1663022c0d9f84848460006040519080825280601f01601f191660200182016040528015613ea6576020820181803683370190505b506040518563ffffffff1660e01b8152600401613ec69493929190615b5a565b600060405180830381600087803b158015613ee057600080fd5b505af1158015613ef4573d6000803e3d6000fd5b505060019099019850613d09975050505050505050565b50505050565b6060600282511015613fa5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a20494e56414c49445f5060448201527f41544800000000000000000000000000000000000000000000000000000000006064820152608401610660565b815167ffffffffffffffff811115613fbf57613fbf615571565b604051908082528060200260200182016040528015613fe8578160200160208202803683370190505b509050828160018351613ffb91906159f3565b8151811061400b5761400b615a06565b60200260200101818152505060006001835161402791906159f3565b90505b8015613a5c57600061406c86856140426001866159f3565b8151811061405257614052615a06565b60200260200101518685815181106138d0576138d0615a06565b90508073ffffffffffffffffffffffffffffffffffffffff1663a1462c196040518163ffffffff1660e01b8152600401602060405180830381865afa1580156140b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140dd9190615a72565b614143576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f7477616d6d206f7574206f6620646174650000000000000000000000000000006044820152606401610660565b8073ffffffffffffffffffffffffffffffffffffffff16631125f13f84848151811061417157614171615a06565b60200260200101518660018661418791906159f3565b8151811061419757614197615a06565b60200260200101516040518363ffffffff1660e01b81526004016141db92919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b602060405180830381865afa1580156141f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061421c9190615a59565b836142286001856159f3565b8151811061423857614238615a06565b6020908102919091010152508061424e81615b9f565b91505061402a565b60606002825110156142ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a20494e56414c49445f5060448201527f41544800000000000000000000000000000000000000000000000000000000006064820152608401610660565b815167ffffffffffffffff81111561430457614304615571565b60405190808252806020026020018201604052801561432d578160200160208202803683370190505b50905082816001835161434091906159f3565b8151811061435057614350615a06565b60200260200101818152505060006001835161436c91906159f3565b90505b8015613a5c57600061438786856140426001866159f3565b6040517f2e0ae37500000000000000000000000000000000000000000000000000000000815242600482015290915073ffffffffffffffffffffffffffffffffffffffff821690632e0ae37590602401600060405180830381600087803b1580156143f157600080fd5b505af1158015614405573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16631125f13f84848151811061443757614437615a06565b60200260200101518660018661444d91906159f3565b8151811061445d5761445d615a06565b60200260200101516040518363ffffffff1660e01b81526004016144a192919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b602060405180830381865afa1580156144be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144e29190615a59565b836144ee6001856159f3565b815181106144fe576144fe615a06565b6020908102919091010152508061451481615b9f565b91505061436f565b60005b6001835161452d91906159f3565b81101561377b5760008084838151811061454957614549615a06565b60200260200101518584600161455f9190615acf565b8151811061456f5761456f615a06565b602002602001015191509150600061458783836149bd565b50905060006145b77f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68585613a64565b90506000806000806145ea7f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e689896151c4565b506040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015293955090935083928592508b16906370a0823190602401602060405180830381865afa158015614662573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146869190615a59565b61469091906159f3565b61469a91906159f3565b6040517ff140a35a0000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff8a811660248301529195509086169063f140a35a90604401602060405180830381865afa158015614711573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147359190615a59565b925050506000808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146147775782600061477b565b6000835b91509150600060028c5161478f91906159f3565b8a1061479b578a6147cc565b6147cc7f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e6898e6138c08e6002615acf565b604080516000815260208101918290527f022c0d9f0000000000000000000000000000000000000000000000000000000090915290915073ffffffffffffffffffffffffffffffffffffffff87169063022c0d9f906148349086908690869060248101615b5a565b600060405180830381600087803b15801561484e57600080fd5b505af1158015614862573d6000803e3d6000fd5b50506001909b019a5061451f9950505050505050505050565b600080841161490c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4672617873776170526f757465724c6962726172793a20494e5355464649434960448201527f454e545f414d4f554e54000000000000000000000000000000000000000000006064820152608401610660565b60008311801561491c5750600082115b6149a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4672617873776170526f757465724c6962726172793a20494e5355464649434960448201527f454e545f4c4951554944495459000000000000000000000000000000000000006064820152608401610660565b826149b38386615bd4565b6120779190615beb565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603614a7b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4672617873776170526f757465724c6962726172793a204944454e544943414c60448201527f5f414444524553534553000000000000000000000000000000000000000000006064820152608401610660565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610614ab5578284614ab8565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216614b60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a205a45524f5f4144445260448201527f45535300000000000000000000000000000000000000000000000000000000006064820152608401610660565b9250929050565b6060600282511015614bfb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a20494e56414c49445f5060448201527f41544800000000000000000000000000000000000000000000000000000000006064820152608401610660565b815167ffffffffffffffff811115614c1557614c15615571565b604051908082528060200260200182016040528015614c3e578160200160208202803683370190505b5090508281600081518110614c5557614c55615a06565b60200260200101818152505060005b60018351614c7291906159f3565b811015613a5c576000614c91868584815181106138aa576138aa615a06565b90508073ffffffffffffffffffffffffffffffffffffffff1663a1462c196040518163ffffffff1660e01b8152600401602060405180830381865afa158015614cde573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d029190615a72565b614d68576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f7477616d6d206f7574206f6620646174650000000000000000000000000000006044820152606401610660565b8073ffffffffffffffffffffffffffffffffffffffff1663f140a35a848481518110614d9657614d96615a06565b6020026020010151868581518110614db057614db0615a06565b60200260200101516040518363ffffffff1660e01b8152600401614df492919091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b602060405180830381865afa158015614e11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e359190615a59565b83614e41846001615acf565b81518110614e5157614e51615a06565b602090810291909101015250600101614c64565b6040517fe6a4390500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301528681166024830152600091829182917f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e69091169063e6a4390590604401602060405180830381865afa158015614f02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614f269190615c26565b73ffffffffffffffffffffffffffffffffffffffff1603614ffd576040517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015288811660248301527f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e6169063c9c65396906044016020604051808303816000875af1158015614fd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614ffb9190615c26565b505b60008061502b7f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68b8b6151c4565b50509150915081600014801561503f575080155b1561504f578793508692506151b7565b600061505c89848461487b565b905087811161510057858110156150f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4260448201527f5f414d4f554e54000000000000000000000000000000000000000000000000006064820152608401610660565b8894509250826151b5565b600061510d89848661487b565b90508981111561511f5761511f615387565b878110156151af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4160448201527f5f414d4f554e54000000000000000000000000000000000000000000000000006064820152608401610660565b94508793505b505b5050965096945050505050565b60008060008060006151d687876149bd565b50905060006151e6898989613a64565b6040517f2e0ae37500000000000000000000000000000000000000000000000000000000815242600482015290915073ffffffffffffffffffffffffffffffffffffffff821690632e0ae37590602401600060405180830381600087803b15801561525057600080fd5b505af1158015615264573d6000803e3d6000fd5b505050506000806000808473ffffffffffffffffffffffffffffffffffffffff1663094cf1496040518163ffffffff1660e01b815260040160c060405180830381865afa1580156152b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906152dd9190615c61565b506dffffffffffffffffffffffffffff1694506dffffffffffffffffffffffffffff169450506dffffffffffffffffffffffffffff1693506dffffffffffffffffffffffffffff1693508573ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff16146153635782848284615368565b838383835b809a50819b50829c50839d505050505050505050505093509350935093565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff811681146153d857600080fd5b50565b80356153e6816153b6565b919050565b60008060008060008060c0878903121561540457600080fd5b863561540f816153b6565b95506020870135945060408701359350606087013592506080870135615434816153b6565b8092505060a087013590509295509295509295565b60008060006060848603121561545e57600080fd5b505081359360208301359350604090920135919050565b60008083601f84011261548757600080fd5b50813567ffffffffffffffff81111561549f57600080fd5b6020830191508360208260051b8501011115614b6057600080fd5b60008060008060008060a087890312156154d357600080fd5b8635955060208701359450604087013567ffffffffffffffff8111156154f857600080fd5b61550489828a01615475565b9095509350506060870135615518816153b6565b80925050608087013590509295509295509295565b6020808252825182820181905260009190848201906040850190845b8181101561556557835183529284019291840191600101615549565b50909695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080604083850312156155b357600080fd5b8235915060208084013567ffffffffffffffff808211156155d357600080fd5b818601915086601f8301126155e757600080fd5b8135818111156155f9576155f9615571565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f8301168101818110858211171561563c5761563c615571565b60405291825284820192508381018501918983111561565a57600080fd5b938501935b8285101561567f57615670856153db565b8452938501939285019261565f565b8096505050505050509250929050565b80151581146153d857600080fd5b803560ff811681146153e657600080fd5b60008060008060008060008060008060006101608c8e0312156156d057600080fd5b8b356156db816153b6565b9a5060208c01356156eb816153b6565b995060408c0135985060608c0135975060808c0135965060a08c0135615710816153b6565b955060c08c0135945060e08c01356157278161568f565b93506157366101008d0161569d565b92506101208c013591506101408c013590509295989b509295989b9093969950565b60005b8381101561577357818101518382015260200161575b565b50506000910152565b60008151808452615794816020860160208601615758565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610c4a602083018461577c565b6000806000806000806000806000806101408b8d0312156157f957600080fd5b8a35615804816153b6565b995060208b0135985060408b0135975060608b0135965060808b0135615829816153b6565b955060a08b0135945060c08b01356158408161568f565b935061584e60e08c0161569d565b92506101008b013591506101208b013590509295989b9194979a5092959850565b60008060008060006080868803121561588757600080fd5b85359450602086013567ffffffffffffffff8111156158a557600080fd5b6158b188828901615475565b90955093505060408601356158c5816153b6565b949793965091946060013592915050565b600080600080600080600060e0888a0312156158f157600080fd5b87356158fc816153b6565b9650602088013561590c816153b6565b955060408801359450606088013593506080880135925060a0880135615931816153b6565b8092505060c0880135905092959891949750929550565b600080600080600080600080610100898b03121561596557600080fd5b8835615970816153b6565b97506020890135615980816153b6565b965060408901359550606089013594506080890135935060a0890135925060c08901356159ac816153b6565b8092505060e089013590509295985092959890939650565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610c4d57610c4d6159c4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215615a4757600080fd5b8135615a52816153b6565b9392505050565b600060208284031215615a6b57600080fd5b5051919050565b600060208284031215615a8457600080fd5b8151615a528161568f565b60008060408385031215615aa257600080fd5b505080516020909101519092909150565b60008251615ac5818460208701615758565b9190910192915050565b80820180821115610c4d57610c4d6159c4565b7fff0000000000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008460601b16600182015282601582015260008251615b4b816035850160208701615758565b91909101603501949350505050565b84815283602082015273ffffffffffffffffffffffffffffffffffffffff83166040820152608060608201526000615b95608083018461577c565b9695505050505050565b600081615bae57615bae6159c4565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b8082028115828204841417610c4d57610c4d6159c4565b600082615c21577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600060208284031215615c3857600080fd5b8151615a52816153b6565b80516dffffffffffffffffffffffffffff811681146153e657600080fd5b60008060008060008060c08789031215615c7a57600080fd5b615c8387615c43565b9550615c9160208801615c43565b9450604087015163ffffffff81168114615caa57600080fd5b9350615cb860608801615c43565b9250615cc660808801615c43565b915060a08701519050929550929550929556
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e6000000000000000000000000fc00000000000000000000000000000000000006
-----Decoded View---------------
Arg [0] : _factory (address): 0xE30521fe7f3bEB6Ad556887b50739d6C7CA667E6
Arg [1] : _WETH (address): 0xFC00000000000000000000000000000000000006
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e6
Arg [1] : 000000000000000000000000fc00000000000000000000000000000000000006
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.99
Net Worth in FRAX
0.992443
Token Allocations
FXS
100.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| POL | 100.00% | $0.99655 | 0.9967 | $0.9932 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.