Source Code
Latest 25 from a total of 9,931 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Add Sync Liquidi... | 3143980 | 1148 days ago | IN | 0 MOVR | 0.00005968 | ||||
| Remove Liquidity... | 3119664 | 1151 days ago | IN | 0 MOVR | 0.00020948 | ||||
| Remove Liquidity... | 3119634 | 1151 days ago | IN | 0 MOVR | 0.00055722 | ||||
| Add Sync Liquidi... | 3119431 | 1151 days ago | IN | 0 MOVR | 0.00150075 | ||||
| Remove Liquidity... | 3119419 | 1151 days ago | IN | 0 MOVR | 0.00074188 | ||||
| Add Sync Liquidi... | 3119388 | 1151 days ago | IN | 0 MOVR | 0.00147806 | ||||
| Add Sync Liquidi... | 3119374 | 1151 days ago | IN | 0 MOVR | 0.00141118 | ||||
| Remove Liquidity... | 3119366 | 1151 days ago | IN | 0 MOVR | 0.00101179 | ||||
| Add Sync Liquidi... | 3119313 | 1151 days ago | IN | 0 MOVR | 0.00160573 | ||||
| Add Async Liquid... | 3119306 | 1151 days ago | IN | 0 MOVR | 0.00181292 | ||||
| Remove Liquidity... | 3119303 | 1151 days ago | IN | 0 MOVR | 0.00116358 | ||||
| Add Async Liquid... | 3119186 | 1152 days ago | IN | 0 MOVR | 0.00166134 | ||||
| Remove Liquidity... | 3119040 | 1152 days ago | IN | 0 MOVR | 0.00093642 | ||||
| Remove Liquidity... | 3119023 | 1152 days ago | IN | 0 MOVR | 0.00117781 | ||||
| Add Sync Liquidi... | 3119013 | 1152 days ago | IN | 0 MOVR | 0.00184546 | ||||
| Add Sync Liquidi... | 3118932 | 1152 days ago | IN | 288 MOVR | 0.00148253 | ||||
| Add Sync Liquidi... | 3118918 | 1152 days ago | IN | 0 MOVR | 0.00128933 | ||||
| Remove Liquidity... | 3118900 | 1152 days ago | IN | 0 MOVR | 0.00070457 | ||||
| Remove Liquidity... | 3118883 | 1152 days ago | IN | 0 MOVR | 0.00096602 | ||||
| Add Sync Liquidi... | 3118854 | 1152 days ago | IN | 0 MOVR | 0.00139763 | ||||
| Remove Liquidity... | 3118837 | 1152 days ago | IN | 0 MOVR | 0.00095048 | ||||
| Remove Liquidity... | 3118805 | 1152 days ago | IN | 0 MOVR | 0.0007598 | ||||
| Add Sync Liquidi... | 3118782 | 1152 days ago | IN | 0 MOVR | 0.00157803 | ||||
| Add Sync Liquidi... | 3118688 | 1152 days ago | IN | 0 MOVR | 0.00107587 | ||||
| Remove Liquidity... | 3118496 | 1152 days ago | IN | 0 MOVR | 0.0007137 |
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 3119040 | 1152 days ago | 29.95228706 MOVR | ||||
| 3119040 | 1152 days ago | 29.95228706 MOVR | ||||
| 3118932 | 1152 days ago | 288 MOVR | ||||
| 3118900 | 1152 days ago | 387.99942165 MOVR | ||||
| 3118900 | 1152 days ago | 387.99942165 MOVR | ||||
| 3118496 | 1152 days ago | 42.37371028 MOVR | ||||
| 3118496 | 1152 days ago | 42.37371028 MOVR | ||||
| 3118372 | 1152 days ago | 3 MOVR | ||||
| 3118363 | 1152 days ago | 389.4 MOVR | ||||
| 3118329 | 1152 days ago | 392.46126012 MOVR | ||||
| 3118329 | 1152 days ago | 392.46126012 MOVR | ||||
| 3117608 | 1152 days ago | 0.09801213 MOVR | ||||
| 3117608 | 1152 days ago | 0.09801213 MOVR | ||||
| 3117347 | 1152 days ago | 85.70647289 MOVR | ||||
| 3117347 | 1152 days ago | 85.70647289 MOVR | ||||
| 3117315 | 1152 days ago | 85.95750683 MOVR | ||||
| 3117315 | 1152 days ago | 85.95750683 MOVR | ||||
| 3117263 | 1152 days ago | 83.32800007 MOVR | ||||
| 3117263 | 1152 days ago | 83.32800007 MOVR | ||||
| 3117173 | 1152 days ago | 110 MOVR | ||||
| 3117162 | 1152 days ago | 110.51663097 MOVR | ||||
| 3117162 | 1152 days ago | 110.51663097 MOVR | ||||
| 3116295 | 1152 days ago | 312.38343582 MOVR | ||||
| 3116295 | 1152 days ago | 312.38343582 MOVR | ||||
| 3114890 | 1152 days ago | 50.89784097 MOVR |
Cross-Chain Transactions
Loading...
Loading
This contract contains unverified libraries: ZirconPeripheralLibrary
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
ZirconPylonRouter
Compiler Version
v0.6.6+commit.6c089d02
Optimization Enabled:
Yes with 1000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0
pragma solidity =0.6.6;
import "./interfaces/IZirconPylonRouter.sol";
import "@zircon/core/contracts/interfaces/IZirconPair.sol";
import "@zircon/core/contracts/interfaces/IZirconPylonFactory.sol";
import "@zircon/core/contracts/interfaces/IZirconFactory.sol";
import "@zircon/core/contracts/interfaces/IZirconPoolToken.sol";
import "@zircon/core/contracts/interfaces/IZirconPTFactory.sol";
import "./libraries/ZirconPeripheralLibrary.sol";
import "./libraries/UniswapV2Library.sol";
//import "hardhat/console.sol";
import "@uniswap/lib/contracts/libraries/TransferHelper.sol";
import "@uniswap/v2-periphery/contracts/interfaces/IWETH.sol";
contract ZirconPylonRouter is IZirconPylonRouter {
address public immutable override factory;
address public immutable override pylonFactory;
address public immutable override ptFactory;
address public immutable override WETH;
bytes4 private constant DEPOSIT = bytes4(keccak256(bytes('routerDeposit(uint256)')));
modifier ensure(uint deadline) {
require(deadline >= block.timestamp, 'UniswapV2Router: EXPIRED');
_;
}
// **** Constructor ****
constructor(address _factory, address _pylonFactory, address _ptFactory, address _WETH) public {
factory = _factory;
WETH = _WETH;
pylonFactory = _pylonFactory;
ptFactory = _ptFactory;
}
receive() external payable {
assert(msg.sender == WETH); // only accept ETH via fallback from the WETH contract
}
// *** HELPER FUNCTIONS *****
function _getPylon(address tokenA, address tokenB) internal view returns (address pylon){
pylon = ZirconPeripheralLibrary.pylonFor(pylonFactory, tokenA, tokenB, UniswapV2Library.pairFor(factory, tokenA, tokenB));
}
// Transfers token or utility
function _transfer(uint amountDesired, address token, address pylon) private {
if (token == WETH) {
IWETH(WETH).deposit{value: amountDesired}();
assert(IWETH(WETH).transfer(pylon, amountDesired));
}else{
TransferHelper.safeTransferFrom(token, msg.sender, pylon, amountDesired);
}
}
function _getAmounts(uint amountDesiredToken, uint amountDesiredETH, bool isAnchor, address tokenA, address tokenB) internal view returns (uint amountA, uint amountB){
uint atA = !isAnchor ? amountDesiredToken : amountDesiredETH;
uint atB = !isAnchor ? amountDesiredETH : amountDesiredToken;
// uint aminA = !isAnchor ? amountTokenMin : amountETHMin;
// uint aminB = !isAnchor ? amountETHMin : amountTokenMin;
(amountA, amountB) = _addAsyncLiquidity(tokenA, tokenB, atA, atB);
}
// Transfers both tokens to pylon
function _transferAsync(address tokenA, address tokenB, uint amountA, uint amountB) internal returns (address pylon){
pylon = _getPylon(tokenA, tokenB);
TransferHelper.safeTransferFrom(tokenA, msg.sender, pylon, amountA);
TransferHelper.safeTransferFrom(tokenB, msg.sender, pylon, amountB);
}
// Modifier to check that pylon & pair are initialized
modifier _addLiquidityChecks(address tokenA, address tokenB) {
address pair = IZirconFactory(factory).getPair(tokenA, tokenB);
require(pair != address(0), "ZPR: Pair Not Created");
require(IZirconPylonFactory(pylonFactory).getPylon(tokenA, tokenB) != address(0), "ZPR: Pylon not created");
// Checking if pylon is initialized
require(ZirconPeripheralLibrary.isInitialized(pylonFactory, tokenA, tokenB, pair), "ZPR: Pylon Not Initialized");
_;
}
// function called only to use the modifier to restrict the usage
function restricted(address tokenA, address tokenB) internal _addLiquidityChecks(tokenA, tokenB){}
// **** INIT PYLON *****
function _initializePylon(address tokenA, address tokenB) internal virtual returns (address pair, address pylon) {
// If Pair is not initialized
pair = IZirconFactory(factory).getPair(tokenA, tokenB);
if (pair == address(0)) {
// Let's create it...
pair = IZirconFactory(factory).createPair(tokenA, tokenB, pylonFactory);
}
//Let's see if pylon is initialized
pylon = IZirconPylonFactory(pylonFactory).getPylon(tokenA, tokenB);
if (pylon == address(0)) {
// adds pylon
pylon = IZirconPylonFactory(pylonFactory).addPylon(pair, tokenA, tokenB);
}
}
// Init Function with two tokens
function init(
address tokenA,
address tokenB,
uint amountDesiredA,
uint amountDesiredB,
address to,
uint deadline
) external virtual override ensure(deadline) returns (uint amountA, uint amountB){
// Initializes the pylon
(, address pylon) = _initializePylon(tokenA, tokenB);
// Desired amounts
amountA = amountDesiredA;
amountB = amountDesiredB;
// Let's transfer to pylon
TransferHelper.safeTransferFrom(tokenA, msg.sender, pylon, amountA);
TransferHelper.safeTransferFrom(tokenB, msg.sender, pylon, amountB);
// init Pylon
IZirconPylon(pylon).initPylon(to);
}
// Init Function with one token and utility token
function initETH(
address token,
uint amountDesiredToken,
bool isAnchor,
address to,
uint deadline
) virtual override ensure(deadline) external payable returns (uint amountA, uint amountB){
// Initialize Pylon & Pair
address tokenA = isAnchor ? WETH : token;
address tokenB = isAnchor ? token : WETH;
(, address pylon) = _initializePylon(tokenA, tokenB);
amountA = isAnchor ? msg.value : amountDesiredToken;
amountB = isAnchor ? amountDesiredToken : msg.value;
// Transfering tokens to Pylon
TransferHelper.safeTransferFrom(token, msg.sender, pylon, amountDesiredToken);
IWETH(WETH).deposit{value: msg.value}();
assert(IWETH(WETH).transfer(pylon, msg.value));
// Calling init Pylon
IZirconPylon(pylon).initPylon(to);
}
// **** ADD SYNC LIQUIDITY ****
function stake(address farm, uint liquidity) internal {
(bool success, bytes memory data) = farm.call(abi.encodeWithSelector(DEPOSIT, uint256(liquidity)));
if (!success) {
if(data.length > 0){
assembly {
let returndata_size := mload(data)
revert(add(32, data), returndata_size)
}
}else{
require(success, 'ZP: FARM_FAILED');
}
}
}
function addSyncLiquidity(
address tokenA,
address tokenB,
uint amountDesired,
uint minLiquidity,
bool isAnchor,
address to,
address farm,
uint deadline
) virtual override ensure(deadline) external returns (uint amount, uint liquidity) {
// Checking Pylon and pair are initialized
restricted(tokenA, tokenB);
amount = amountDesired;
// Getting pylon address
address pylon = _getPylon(tokenA, tokenB);
// Transferring tokens
TransferHelper.safeTransferFrom(isAnchor ? tokenB : tokenA, msg.sender, pylon, amount);
liquidity = IZirconPylon(pylon).mintPoolTokens(to, isAnchor);
require(liquidity >= minLiquidity, "ZPR: Not enough liquidity");
// Adding liquidity
if (farm != address(0)) {
stake(farm, liquidity);
}
}
// @isAnchor indicates if the token should be the anchor or float
// it mints the ETH token, so the opposite of isAnchor
// In case where we want to mint the token we should use the classic addSyncLiquidity
// TODO: removing shouldMintAnchor change on FE
function addSyncLiquidityETH(
address token,
bool isAnchor,
uint minLiquidity,
address to,
address farm,
uint deadline
) virtual override ensure(deadline) external payable returns (uint liquidity) {
require(msg.value > 0, "ZPR: ZERO-VALUE");
address tokenA = isAnchor ? WETH : token;
address tokenB = isAnchor ? token : WETH;
// Checking Pylon and pair are initialized
restricted(tokenA, tokenB);
// Getting Pylon Address
address pylon = _getPylon(tokenA, tokenB);
// transferring token or utility token
IWETH(WETH).deposit{value: msg.value}();
assert(IWETH(WETH).transfer(pylon, msg.value));
// minting tokens
liquidity = IZirconPylon(pylon).mintPoolTokens(to, !isAnchor);
require(liquidity >= minLiquidity, "ZPR: Not enough liquidity");
// Adding liquidity
if (farm != address(0)) {
stake(farm, liquidity);
}
}
// **** ASYNC-100 LIQUIDITY ******
// function addAsyncLiquidity100(
// address tokenA,
// address tokenB,
// uint amountDesired,
// bool isAnchor,
// address to,
// address farm,
// uint deadline
// ) virtual override ensure(deadline) _addLiquidityChecks(tokenA, tokenB) external returns (uint liquidity){
// // Getting Pylon Address
// address pylon = _getPylon(tokenA, tokenB);
// // sending tokens to pylon
// TransferHelper.safeTransferFrom(isAnchor ? tokenB : tokenA, msg.sender, pylon, amountDesired);
// // minting async-100
// liquidity = IZirconPylon(pylon).mintAsync100(to, isAnchor);
// // Adding liquidity
// if (farm != address(0)) {
// stake(farm, liquidity);
// }
// }
// @isAnchor indicates if the token should be the anchor or float
// This Function mints tokens for WETH in the contrary of @isAnchor
// function addAsyncLiquidity100ETH(
// address token,
// bool isAnchor,
// address to,
// address farm,
// uint deadline
// ) virtual override ensure(deadline) external payable returns (uint liquidity){
// require(msg.value > 0, "ZPR: ZERO-VALUE");
// address tokenA = isAnchor ? WETH : token;
// address tokenB = isAnchor ? token : WETH;
//
// restricted(tokenA, tokenB);
// // getting pylon
// address pylon = _getPylon(tokenA, tokenB);
// // Transfering tokens
// IWETH(WETH).deposit{value: msg.value}();
// assert(IWETH(WETH).transfer(pylon, msg.value));
//
// // Miting Async-100
// liquidity = IZirconPylon(pylon).mintAsync100(to, !isAnchor);
// // Adding liquidity
// if (farm != address(0)) {
// stake(farm, liquidity);
// }
// }
// **** ADD ASYNC LIQUIDITY **** //
function _addAsyncLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired
) internal virtual _addLiquidityChecks(tokenA, tokenB) view returns (uint amountA, uint amountB) {
// create the pair if it doesn't exist yet
(uint reserveA, uint reserveB) = UniswapV2Library.getReserves(factory, tokenA, tokenB);
if (reserveA == 0 && reserveB == 0) {
(amountA, amountB) = (amountADesired, amountBDesired);
} else {
uint amountBOptimal = UniswapV2Library.quote(amountADesired, reserveA, reserveB);
if (amountBOptimal <= amountBDesired) {
(amountA, amountB) = (amountADesired, amountBOptimal);
} else {
uint amountAOptimal = UniswapV2Library.quote(amountBDesired, reserveB, reserveA);
assert(amountAOptimal <= amountADesired);
(amountA, amountB) = (amountAOptimal, amountBDesired);
}
}
}
function addAsyncLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint minLiquidity,
bool isAnchor,
address to,
address farm,
uint deadline
) virtual override ensure(deadline) external returns (uint liquidity){
(uint amountA, uint amountB) = _addAsyncLiquidity(tokenA, tokenB, amountADesired, amountBDesired);
address pylon = _transferAsync(tokenA, tokenB, amountA, amountB);
liquidity = IZirconPylon(pylon).mintAsync(to, isAnchor);
require(liquidity >= minLiquidity, "ZPR: Not enough liquidity");
// Adding liquidity
if (farm != address(0)) {
stake(farm, liquidity);
}
}
function addAsyncLiquidityETH(
address token,
uint amountDesiredToken,
uint minLiquidity,
bool isAnchor,
bool shouldReceiveAnchor,
address to,
address farm,
uint deadline
) virtual override ensure(deadline) external payable returns (uint amountA, uint amountB, uint liquidity){
{
address _token = token;
bool _isAnchor = isAnchor;
(amountA, amountB) = _getAmounts(amountDesiredToken, msg.value, _isAnchor, _isAnchor ? WETH : _token, _isAnchor ? _token : WETH);
}
{
address _token = token;
bool _isAnchor = isAnchor;
address pylon = _getPylon(_isAnchor ? WETH : _token, _isAnchor ? _token : WETH);
TransferHelper.safeTransferFrom(_token, msg.sender, pylon, _isAnchor ? amountB : amountA);
IWETH(WETH).deposit{value: _isAnchor ? amountA : amountB}();
assert(IWETH(WETH).transfer(pylon, _isAnchor ? amountA : amountB));
liquidity = IZirconPylon(pylon).mintAsync(to, shouldReceiveAnchor);
require(liquidity >= minLiquidity, "ZPR: Not enough liquidity");
}
// refund dust eth, if any
if (msg.value > (isAnchor ? amountA : amountB)) TransferHelper.safeTransferETH(msg.sender, msg.value - (isAnchor ? amountA : amountB));
// Adding liquidity
if (farm != address(0)) {
stake(farm, liquidity);
}
}
// *** remove Sync
function removeLiquiditySync(
address tokenA,
address tokenB,
uint liquidity,
uint amountMin,
bool shouldReceiveAnchor,
address to,
uint deadline
) virtual override ensure(deadline) public returns (uint amount){
address pylon = _getPylon(tokenA, tokenB);
address poolToken = IZirconPTFactory(ptFactory).getPoolToken(pylon, shouldReceiveAnchor ? tokenB : tokenA);
IZirconPoolToken(poolToken).transferFrom(msg.sender, pylon, liquidity); // send liquidity to pylon
(amount) = IZirconPylon(pylon).burn(to, shouldReceiveAnchor);
require(amount >= amountMin, 'UniswapV2Router: INSUFFICIENT_AMOUNT');
}
function removeLiquiditySyncETH(
address token,
uint liquidity,
uint amountMin,
bool isAnchor,
bool shouldRemoveAnchor,
address to,
uint deadline
) virtual override ensure(deadline) external returns (uint amount){
address tokenA = isAnchor ? WETH : token;
address tokenB = isAnchor ? token : WETH;
(amount) = removeLiquiditySync(
tokenA,
tokenB,
liquidity,
amountMin,
shouldRemoveAnchor,
(isAnchor && shouldRemoveAnchor) || (!shouldRemoveAnchor && !isAnchor) ? to : address(this),
deadline
);
if ((isAnchor && !shouldRemoveAnchor) || (shouldRemoveAnchor && !isAnchor)) {
IWETH(WETH).withdraw(amount);
TransferHelper.safeTransferETH(to, amount);
}
}
function removeLiquidityAsync(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
bool isAnchor,
address to,
uint deadline
) virtual override ensure(deadline) public returns (uint amountA, uint amountB){
address pylon = _getPylon(tokenA, tokenB);
address poolToken = IZirconPTFactory(ptFactory).getPoolToken(pylon, isAnchor ? tokenB : tokenA);
IZirconPoolToken(poolToken).transferFrom(msg.sender, pylon, liquidity); // send liquidity to pair
(amountA, amountB) = IZirconPylon(pylon).burnAsync(to, isAnchor);
require(amountA >= amountAMin, 'UniswapV2Router: INSUFFICIENT_A_AMOUNT');
require(amountB >= amountBMin, 'UniswapV2Router: INSUFFICIENT_B_AMOUNT');
}
function removeLiquidityAsyncETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
bool isAnchor,
bool shouldBurnAnchor,
address to,
uint deadline
) virtual override ensure(deadline) external returns (uint amountToken, uint amountETH){
{
(uint amountA, uint amountB) = removeLiquidityAsync(
!isAnchor ? token : WETH,
!isAnchor ? WETH : token,
liquidity,
amountTokenMin,
amountETHMin,
shouldBurnAnchor,
address(this),
deadline
);
amountToken = !isAnchor ? amountA : amountB;
amountETH = !isAnchor ? amountB : amountA;
}
TransferHelper.safeTransfer(token, to, amountToken);
IWETH(WETH).withdraw(amountETH);
TransferHelper.safeTransferETH(to, amountETH);
}
// function removeLiquiditySyncWithPermit(
// address tokenA,
// address tokenB,
// uint liquidity,
// uint amountMin,
// bool isAnchor,
// address to,
// uint deadline,
// bool approveMax, uint8 v, bytes32 r, bytes32 s
// ) virtual override ensure(deadline) external returns (uint amount){
// address pylon = _getPylon(tokenA, tokenB);
// uint value = approveMax ? uint(-1) : liquidity;
// IZirconPoolToken(isAnchor ? IZirconPylon(pylon).anchorPoolTokenAddress() : IZirconPylon(pylon).floatPoolTokenAddress()).permit(msg.sender, address(this), value, deadline, v, r, s);
// (amount) = removeLiquiditySync(tokenA, tokenB, liquidity, amountMin, isAnchor, to, deadline);
// }
//
// function removeLiquidityETHWithPermit(
// address token,
// uint liquidity,
// uint amountMin,
// bool isAnchor,
// bool shouldRemoveAnchor,
// address to,
// uint deadline,
// bool approveMax, uint8 v, bytes32 r, bytes32 s
// ) virtual override ensure(deadline) external returns (uint amount){
// address pylon = UniswapV2Library.pairFor(factory, token, WETH);
// uint value = approveMax ? uint(-1) : liquidity;
// IZirconPoolToken(shouldRemoveAnchor ? IZirconPylon(pylon).anchorPoolTokenAddress() : IZirconPylon(pylon).floatPoolTokenAddress())
// .permit(msg.sender, address(this), value, deadline, v, r, s);
// (amount) = removeLiquiditySyncETH(
// token,
// liquidity,
// amountMin,
// isAnchor,
// shouldRemoveAnchor,
// to,
// deadline);
// }
//
// function removeLiquidityAsyncWithPermit(
// address token,
// uint liquidity,
// uint amountTokenMin,
// uint amountETHMin,
// bool isAnchor,
// bool shouldBurnAnchor,
// address to,
// uint deadline,
// bool approveMax, uint8 v, bytes32 r, bytes32 s
// ) virtual override ensure(deadline) external returns (uint amountA, uint amountB){
// address tokenA = !isAnchor ? token : WETH;
// address tokenB = !isAnchor ? WETH : token;
//
// address pylon = _getPylon(tokenA, tokenB);
// uint value = approveMax ? uint(-1) : liquidity;
// IZirconPoolToken(shouldRemoveAnchor ? IZirconPylon(pylon).anchorPoolTokenAddress() : IZirconPylon(pylon).floatPoolTokenAddress())
// .permit(msg.sender, address(this), value, deadline, v, r, s);
// (amountA, amountB) = removeLiquidityAsyncETH(token, liquidity, amountAMin, amountBMin, isAnchor, to, deadline);
//
// }
// function removeLiquidityAsyncETHWithPermit(
// address token,
// uint liquidity,
// uint amountTokenMin,
// uint amountETHMin,
// bool isAnchor,
// bool shouldBurnAnchor,
// address to,
// uint deadline,
// bool approveMax, uint8 v, bytes32 r, bytes32 s
// ) virtual override ensure(deadline) external returns (uint amountA, uint amountB){
// address pylon = _getPylon(tokenA, tokenB);
// uint value = approveMax ? uint(-1) : liquidity;
// IZirconPoolToken(shouldRemoveAnchor ? IZirconPylon(pylon).anchorPoolTokenAddress() : IZirconPylon(pylon).floatPoolToken())
// .permit(msg.sender, address(this), value, deadline, v, r, s);
// (amountA, amountB) = removeLiquidityAsync(token, liquidity, amountTokenMin, amountETHMin, isAnchor, shouldBurnAnchor, to, deadline);
//
// }
}// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.6.2;
interface IZirconPylonRouter {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function pylonFactory() external pure returns (address);
function ptFactory() external pure returns (address);
function init(
address tokenA,
address tokenB,
uint amountDesiredA,
uint amountDesiredB,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function initETH(
address token,
uint amountDesiredToken,
bool isAnchor,
address to,
uint deadline
) external payable returns (uint amountA, uint amountB);
function addSyncLiquidity(
address tokenA,
address tokenB,
uint amountDesired,
uint minLiquidity,
bool isAnchor,
address to,
address farm,
uint deadline
) external returns (uint amount, uint liquidity);
function addSyncLiquidityETH(
address token,
bool isAnchor,
uint minLiquidity,
address to,
address pool,
uint deadline
) external payable returns (uint liquidity);
// function addAsyncLiquidity100(
// address tokenA,
// address tokenB,
// uint amountDesired,
// uint minLiquidity,
// bool isAnchor,
// address to,
// address pool,
// uint deadline
// ) external returns (uint liquidity);
//
// function addAsyncLiquidity100ETH(
// address token,
// bool isAnchor,
// uint minLiquidity,
//
// address to,
// address pool,
// uint deadline
// ) external payable returns (uint liquidity);
function addAsyncLiquidity(
address tokenA,
address tokenB,
uint amountA,
uint amountB,
uint minLiquidity,
bool isAnchor,
address to,
address farm,
uint deadline
) external returns (uint liquidity);
function addAsyncLiquidityETH(
address token,
uint amountDesiredToken,
uint minLiquidity,
bool isAnchor,
bool shouldReceiveAnchor,
address to,
address farm,
uint deadline
) external payable returns (uint amountA, uint amountB, uint liquidity);
function removeLiquiditySync(
address tokenA,
address tokenB,
uint liquidity,
uint amountMin,
bool shouldReceiveAnchor,
address to,
uint deadline
) external returns (uint amount);
function removeLiquiditySyncETH(
address token,
uint liquidity,
uint amountMin,
bool isAnchor,
bool shouldRemoveAnchor,
address to,
uint deadline
) external returns (uint amount);
function removeLiquidityAsync(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
bool isAnchor,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function removeLiquidityAsyncETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
bool isAnchor,
bool shouldBurnAnchor,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
// function removeLiquidityWithPermit(
// address tokenA,
// address tokenB,
// uint liquidity,
// uint amountAMin,
// uint amountBMin,
// address to,
// uint deadline,
// bool approveMax, uint8 v, bytes32 r, bytes32 s
// ) external returns (uint amountA, uint amountB);
// function removeLiquidityETHWithPermit(
// address token,
// uint liquidity,
// uint amountTokenMin,
// uint amountETHMin,
// address to,
// uint deadline,
// bool approveMax, uint8 v, bytes32 r, bytes32 s
// ) external returns (uint amountToken, uint amountETH);
}// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.5.16;
interface IZirconPair {
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 energyRevenueAddress() external pure returns (address);
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 burnOneSide(address to, bool isReserve0) external returns (uint amount);
function mintOneSide(address to, bool isReserve0) external returns (uint liquidity, uint amount0, uint amount1);
function publicMintFee() external;
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 tryLock() external;
function initialize(address, address, address) external;
function changeEnergyRevAddress(address _revAddress) external;
}pragma solidity >=0.5.16;
interface IZirconPylonFactory {
function maximumPercentageSync() external view returns (uint);
function deltaGammaThreshold() external view returns (uint);
function deltaGammaMinFee() external view returns (uint);
function muUpdatePeriod() external view returns (uint);
function muChangeFactor() external view returns (uint);
// function liquidityFee() external view returns (uint);
function EMASamples() external view returns (uint);
function allPylons(uint p) external view returns (address);
function getPylon(address tokenA, address tokenB) external view returns (address pair);
function factory() external view returns (address);
function energyFactory() external view returns (address);
event PylonCreated(address indexed token0, address indexed token1, address poolToken0, address poolToken1, address pylon, address pair);
function allPylonsLength() external view returns (uint);
function paused() external view returns (bool);
// function setLiquidityFee(uint _liquidityFee) external;
// Adding Pylon
// First Token is always the Float and the second one is the Anchor
function addPylon(address _pairAddress, address _tokenA, address _tokenB) external returns (address pylonAddress);
function addPylonCustomPT(address _pairAddress, address _tokenA, address _tokenB, address floatPTAddress, address anchorPTAddress) external returns (address pylonAddress);
function setMigrator(address _migrator) external;
function setFeeToSetter(address _feeToSetter) external;
function setFees(uint _maximumPercentageSync, uint _deltaGammaThreshold, uint _deltaGammaMinFee, uint _muUpdatePeriod, uint _muChangeFactor, uint _EMASamples) external;
function setPaused(bool _paused) external;
function changeEnergyAddress(address _newEnergyRev, address _pylonAddress, address _pairAddress, address _tokenA, address _tokenB) external returns (address energy);
function migrateLiquidity(address _oldPylon, address _newPylon) external;
function startPylon(address _pylon, uint _gamma, uint _vab, uint _anchorKFactor, bool _formulaSwitch) external;
function changeEnergyFactoryAddress(address _newEnergyFactory) external;
}pragma solidity >=0.5.16;
interface IZirconFactory {
// function feeTo() external view returns (address);
// function feeToSetter() external view returns (address);
// function migrator() external view returns (address);
function energyFactory() external view returns (address);
function getPair(address, address) external view returns (address pair);
function allPairs(uint) external view returns (address pair);
function allPairsLength() external view returns (uint);
function dynamicRatio() external view returns (uint);
function liquidityFee() external view returns (uint);
function setLiquidityFee(uint _liquidityFee) external;
function pairCodeHash() external pure returns (bytes32);
function createPair(address tokenA, address tokenB, address _pylonFactory) external returns (address pair);
function setMigrator(address _migrator) external;
function setFeeToSetter(address _feeToSetter) external;
function changeEnergyRevAddress(address _pairAddress, address _tokenA, address _tokenB, address _pylonFactory) external returns (address newEnergy);
function changeEnergyFactoryAddress(address _newEnergyFactory) external;
function setDynamicRatio(uint _dynamicRatio) external;
}pragma solidity >=0.5.16;
interface IZirconPoolToken {
function factory() external view returns (address);
function isAnchor() external view returns (bool);
function token() external view returns (address);
function pair() external view returns (address);
function pylon() external view returns (address);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function mint(address account, uint256 amount) external;
function burn(address account, uint256 amount) external;
function initialize(address _token0, address _pair, address _pylon, bool _isAnchor) external;
function transferFrom(address from, address to, uint value) external returns (bool);
}pragma solidity >=0.5.16;
interface IZirconPTFactory {
function getPoolToken(address pylon, address token) external view returns (address pt);
function createPTAddress(address _token, address pylonAddress) external returns (address poolToken);
function changePylonAddress(address oldPylon, address tokenA, address tokenB, address newPylon, address pylonFactory) external;
function setMigrator(address _migrator) external;
function setFeeToSetter(address _feeToSetter) external;
}// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.6.6;
import "./SafeMath.sol";
import "@zircon/core/contracts/interfaces/IZirconPylon.sol";
library ZirconPeripheralLibrary {
using SafeMath for uint256;
// calculates the CREATE2 address for a pair without making any external calls
//TODO: Update init code hash with Zircon Pylon code hash
function pylonFor(address factory, address tokenA, address tokenB, address pair) internal pure returns (address pylon) {
pylon = address(uint(keccak256(abi.encodePacked(
hex'ff',
factory,
keccak256(abi.encodePacked(tokenA, tokenB, pair)),
hex'44ca8087c95ad2e8ea0739f78fa06a76fc246d61762366f5b76eded713fadbb2' // init code hash
))));
}
function isInitialized(address factory, address tokenA, address tokenB, address pair) view external returns (bool initialized){
initialized = IZirconPylon(pylonFor(factory, tokenA, tokenB, pair)).initialized() == 1;
}
function translate(uint toConvert, uint ptt, uint ptb) pure public returns (uint amount){
amount = (ptt == 0 || ptb == 0) ? toConvert : toConvert.mul(ptb)/ptt;
}
// fetches and gets Reserves
function getSyncReserves(address factory, address tokenA, address tokenB, address pair) internal view returns (uint112 reserveF, uint112 reserveA) {
(reserveF, reserveA) = IZirconPylon(pylonFor(factory, tokenA, tokenB, pair)).getSyncReserves();
}
// TODO: Change this
// fetches and sorts the reserves for a pair
function maximumSync(uint reserve, uint reservePylon, uint syncPercentage, uint maxBase, uint ptt, uint ptb) external pure returns (uint maximum) {
uint pairReserveTranslated = translate(reserve, ptt, ptb);
maximum = (pairReserveTranslated == 0 || reservePylon > pairReserveTranslated) ? maxBase :
(pairReserveTranslated.mul(syncPercentage)/100).sub(reservePylon);
}
}// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.5.0;
import '@uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol';
//import "hardhat/console.sol";
import "./SafeMath.sol";
library UniswapV2Library {
using SafeMath for uint;
// 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, 'UniswapV2Library: IDENTICAL_ADDRESSES');
(token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
require(token0 != address(0), 'UniswapV2Library: ZERO_ADDRESS');
}
// calculates the CREATE2 address for a pair without making any external calls
// TODO: Update init code hash with Zircon Pair code hash
function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) {
(address token0, address token1) = sortTokens(tokenA, tokenB);
pair = address(uint(keccak256(abi.encodePacked(
hex'ff',
factory,
keccak256(abi.encodePacked(token0, token1)),
hex'0ec3a964af2d4288dcee11cf85135843bcfc1e8e4f8a107d634a0818cc792ee7' // init code hash
))));
}
// fetches and sorts the reserves for a pair
function getReserves(address factory, address tokenA, address tokenB) internal view returns (uint reserveA, uint reserveB) {
(address token0,) = sortTokens(tokenA, tokenB);
(uint reserve0, uint reserve1,) = IUniswapV2Pair(pairFor(factory, tokenA, tokenB)).getReserves();
(reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
}
// given some amount of an asset and pair reserves, returns an equivalent amount of the other asset
function quote(uint amountA, uint reserveA, uint reserveB) internal pure returns (uint amountB) {
require(amountA > 0, 'UniswapV2Library: INSUFFICIENT_AMOUNT');
require(reserveA > 0 && reserveB > 0, 'UniswapV2Library: INSUFFICIENT_LIQUIDITY');
amountB = amountA.mul(reserveB) / reserveA;
}
// given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) internal pure returns (uint amountOut) {
require(amountIn > 0, 'UniswapV2Library: INSUFFICIENT_INPUT_AMOUNT');
require(reserveIn > 0 && reserveOut > 0, 'UniswapV2Library: INSUFFICIENT_LIQUIDITY');
uint amountInWithFee = amountIn.mul(997);
uint numerator = amountInWithFee.mul(reserveOut);
uint denominator = reserveIn.mul(1000).add(amountInWithFee);
amountOut = numerator / denominator;
}
// given an output amount of an asset and pair reserves, returns a required input amount of the other asset
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) internal pure returns (uint amountIn) {
require(amountOut > 0, 'UniswapV2Library: INSUFFICIENT_OUTPUT_AMOUNT');
require(reserveIn > 0 && reserveOut > 0, 'UniswapV2Library: INSUFFICIENT_LIQUIDITY');
uint numerator = reserveIn.mul(amountOut).mul(1000);
uint denominator = reserveOut.sub(amountOut).mul(997);
amountIn = (numerator / denominator).add(1);
}
// performs chained getAmountOut calculations on any number of pairs
function getAmountsOut(address factory, uint amountIn, address[] memory path) internal view returns (uint[] memory amounts) {
require(path.length >= 2, 'UniswapV2Library: INVALID_PATH');
amounts = new uint[](path.length);
amounts[0] = amountIn;
for (uint i; i < path.length - 1; i++) {
(uint reserveIn, uint reserveOut) = getReserves(factory, path[i], path[i + 1]);
amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut);
}
}
// performs chained getAmountIn calculations on any number of pairs
function getAmountsIn(address factory, uint amountOut, address[] memory path) internal view returns (uint[] memory amounts) {
require(path.length >= 2, 'UniswapV2Library: INVALID_PATH');
amounts = new uint[](path.length);
amounts[amounts.length - 1] = amountOut;
for (uint i = path.length - 1; i > 0; i--) {
(uint reserveIn, uint reserveOut) = getReserves(factory, path[i - 1], path[i]);
amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut);
}
}
}// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity >=0.6.0;
// 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');
}
}pragma solidity >=0.5.0;
interface IWETH {
function deposit() external payable;
function transfer(address to, uint value) external returns (bool);
function withdraw(uint) external;
}// SPDX-License-Identifier: GPL-3.0
pragma solidity =0.6.6;
// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)
library SafeMath {
function add(uint x, uint y) internal pure returns (uint z) {
require((z = x + y) >= x, 'ds-math-add-overflow');
}
function sub(uint x, uint y) internal pure returns (uint z) {
require((z = x - y) <= x, 'ds-math-sub-underflow');
}
function mul(uint x, uint y) internal pure returns (uint z) {
require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');
}
}pragma solidity >=0.5.16;
interface IZirconPylon {
function initialized() external view returns (uint);
// function anchorPoolTokenAddress() external view returns (address);
// function floatPoolTokenAddress() external view returns (address);
// function energyAddress() external view returns (address);
function gammaMulDecimals() external view returns (uint);
function isFloatReserve0() external view returns (bool);
function virtualAnchorBalance() external view returns (uint);
function anchorKFactor() external view returns (uint);
function lastRootKTranslated() external view returns (uint);
function formulaSwitch() external view returns (bool);
function EMABlockNumber() external view returns (bool);
function getSyncReserves() external view returns (uint112 _reserve0, uint112 _reserve1);
// Called once by the factory at time of deployment
// @_floatPoolToken -> Contains Address Of Float PT
// @_anchorPoolToken -> Contains Address Of Anchor PT
// @token0 -> Float token
// @token1 -> Anchor token
function initMigratedPylon(uint _gamma, uint _vab, uint _anchorKFactor, bool _formulaSwitch) external;
function initialize(address _floatPoolTokenAddress, address _anchorPoolTokenAddress, address _floatToken, address _anchorToken, address _pairAddress, address _pairFactoryAddress, address _energy, address _energyRev) external;
// On init pylon we have to handle two cases
// The first case is when we initialize the pair through the pylon
// And the second one is when initialize the pylon with a pair al ready existing
function initPylon(address _to) external returns (uint floatLiquidity, uint anchorLiquidity);
// External Function called to mint pool Token
// Liquidity have to be sent before
function mintPoolTokens(address to, bool isAnchor) external returns (uint liquidity);
// function mintAsync100(address to, bool isAnchor) external returns (uint liquidity);
function mintAsync(address to, bool shouldMintAnchor) external returns (uint liquidity);
// Burn Async send both tokens 50-50
// Liquidity has to be sent before
function burnAsync(address _to, bool _isAnchor) external returns (uint amount0, uint amount1);
// Burn send liquidity back to user burning Pool tokens
// The function first uses the reserves of the Pylon
// If not enough reserves it burns The Pool Tokens of the pylon
function burn(address _to, bool _isAnchor) external returns (uint amount);
function changeEnergyAddress(address _energyAddress, address _energyRevAddress) external;
function migrateLiquidity(address newPylon) external;
}pragma solidity >=0.5.0;
interface IUniswapV2Pair {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
function name() external pure returns (string memory);
function symbol() external pure returns (string memory);
function decimals() external pure returns (uint8);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
function DOMAIN_SEPARATOR() external view returns (bytes32);
function PERMIT_TYPEHASH() external pure returns (bytes32);
function nonces(address owner) external view returns (uint);
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
event Mint(address indexed sender, uint amount0, uint amount1);
event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
event Swap(
address indexed sender,
uint amount0In,
uint amount1In,
uint amount0Out,
uint amount1Out,
address indexed to
);
event Sync(uint112 reserve0, uint112 reserve1);
function MINIMUM_LIQUIDITY() external pure returns (uint);
function factory() external view returns (address);
function token0() external view returns (address);
function token1() external view returns (address);
function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
function price0CumulativeLast() external view returns (uint);
function price1CumulativeLast() external view returns (uint);
function kLast() external view returns (uint);
function mint(address to) external returns (uint liquidity);
function burn(address to) external returns (uint amount0, uint amount1);
function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
function skim(address to) external;
function sync() external;
function initialize(address, address) external;
}{
"optimizer": {
"enabled": true,
"runs": 1000
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"metadata": {
"useLiteralContent": true
},
"libraries": {
"contracts/libraries/ZirconPeripheralLibrary.sol": {
"ZirconPeripheralLibrary": "0xa82e973126867ddf6b811c83f881c5203c66961c"
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_pylonFactory","type":"address"},{"internalType":"address","name":"_ptFactory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"minLiquidity","type":"uint256"},{"internalType":"bool","name":"isAnchor","type":"bool"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"farm","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addAsyncLiquidity","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountDesiredToken","type":"uint256"},{"internalType":"uint256","name":"minLiquidity","type":"uint256"},{"internalType":"bool","name":"isAnchor","type":"bool"},{"internalType":"bool","name":"shouldReceiveAnchor","type":"bool"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"farm","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addAsyncLiquidityETH","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountDesired","type":"uint256"},{"internalType":"uint256","name":"minLiquidity","type":"uint256"},{"internalType":"bool","name":"isAnchor","type":"bool"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"farm","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addSyncLiquidity","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"isAnchor","type":"bool"},{"internalType":"uint256","name":"minLiquidity","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"address","name":"farm","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addSyncLiquidityETH","outputs":[{"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":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"amountDesiredA","type":"uint256"},{"internalType":"uint256","name":"amountDesiredB","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"init","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":"amountDesiredToken","type":"uint256"},{"internalType":"bool","name":"isAnchor","type":"bool"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"initETH","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"ptFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pylonFactory","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":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"bool","name":"isAnchor","type":"bool"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityAsync","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":"bool","name":"isAnchor","type":"bool"},{"internalType":"bool","name":"shouldBurnAnchor","type":"bool"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityAsyncETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountMin","type":"uint256"},{"internalType":"bool","name":"shouldReceiveAnchor","type":"bool"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquiditySync","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountMin","type":"uint256"},{"internalType":"bool","name":"isAnchor","type":"bool"},{"internalType":"bool","name":"shouldRemoveAnchor","type":"bool"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquiditySyncETH","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
61010060405234801561001157600080fd5b506040516133b53803806133b58339818101604052608081101561003457600080fd5b508051602082015160408301516060938401516001600160601b031993851b8416608052841b831660e05290831b821660a05290911b1660c05260805160601c60a05160601c60c05160601c60e05160601c61324e6101676000398060f15280610875528061089c52806108e4528061090b528061095252806109d25280610c1f5280610c4a5280610cad5280610d44528061148d52806114b852806114fa5280611591528061170e528061192e528061196252806119c05280611ab65280611ae15280611b645250806105d45280610e485280610fd4525080611bec5280611c1552806121ad528061227b528061234b528061251652806125fc5280612847528061292d5250806117325280611c3b52806120a252806121d752806123d252806127035280612a2c525061324e6000f3fe6080604052600436106100e15760003560e01c80638a96e2471161007f578063cdccaca011610059578063cdccaca014610428578063ed1d080f14610497578063ef68f27f146104fb578063ef8863b41461055a5761011a565b80638a96e247146103b4578063ad5c4648146103fe578063c45a0155146104135761011a565b80632b34f135116100bb5780632b34f1351461026457806359b11df71461029557806359b9a98b146102ea578063769635bd1461034e5761011a565b8063119438711461011f5780631e3990bd14610190578063230e9bca146102075761011a565b3661011a57336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461011857fe5b005b600080fd5b34801561012b57600080fd5b5061017e600480360360e081101561014257600080fd5b506001600160a01b0381358116916020810135821691604082013591606081013591608082013515159160a08101359091169060c0013561056f565b60408051918252519081900360200190f35b6101e960048036036101008110156101a757600080fd5b506001600160a01b0381358116916020810135916040820135916060810135151591608082013515159160a081013582169160c0820135169060e0013561080a565b60408051938452602084019290925282820152519081900360600190f35b61024b600480360360a081101561021d57600080fd5b506001600160a01b038135811691602081013591604082013515159160608101359091169060800135610bbc565b6040805192835260208301919091528051918290030190f35b34801561027057600080fd5b50610279610e46565b604080516001600160a01b039092168252519081900360200190f35b3480156102a157600080fd5b5061024b600480360360c08110156102b857600080fd5b506001600160a01b03813581169160208101358216916040820135916060810135916080820135169060a00135610e6a565b3480156102f657600080fd5b5061024b600480360361010081101561030e57600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a081013515159160c0820135169060e00135610f6e565b34801561035a57600080fd5b5061024b600480360361010081101561037257600080fd5b506001600160a01b0381358116916020810135821691604082013591606081013591608082013515159160a081013582169160c0820135169060e00135611250565b61017e600480360360c08110156103ca57600080fd5b506001600160a01b038135811691602081013515159160408201359160608101358216916080820135169060a001356113d6565b34801561040a57600080fd5b5061027961170c565b34801561041f57600080fd5b50610279611730565b34801561043457600080fd5b5061017e600480360361012081101561044c57600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a081013515159160c082013581169160e0810135909116906101000135611754565b3480156104a357600080fd5b5061024b60048036036101008110156104bb57600080fd5b506001600160a01b038135811691602081013591604082013591606081013591608082013515159160a081013515159160c0820135169060e001356118cc565b34801561050757600080fd5b5061017e600480360360e081101561051e57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135151591608082013515159160a08101359091169060c00135611a54565b34801561056657600080fd5b50610279611bea565b600081428110156105c2576040805162461bcd60e51b8152602060048201526018602482015277155b9a5cddd85c158c949bdd5d195c8e881156141254915160421b604482015290519081900360640190fd5b60006105ce8a8a611c0e565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663fad51a9a838961060d578d61060f565b8c5b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019250505060206040518083038186803b15801561066e57600080fd5b505afa158015610682573d6000803e3d6000fd5b505050506040513d602081101561069857600080fd5b5051604080516323b872dd60e01b81523360048201526001600160a01b038581166024830152604482018d90529151929350908316916323b872dd916064808201926020929091908290030181600087803b1580156106f657600080fd5b505af115801561070a573d6000803e3d6000fd5b505050506040513d602081101561072057600080fd5b5050604080517fba7b3dea0000000000000000000000000000000000000000000000000000000081526001600160a01b038881166004830152891515602483015291519184169163ba7b3dea916044808201926020929091908290030181600087803b15801561078f57600080fd5b505af11580156107a3573d6000803e3d6000fd5b505050506040513d60208110156107b957600080fd5b50519350878410156107fc5760405162461bcd60e51b81526004018080602001828103825260248152602001806131556024913960400191505060405180910390fd5b505050979650505050505050565b60008060008342811015610860576040805162461bcd60e51b8152602060048201526018602482015277155b9a5cddd85c158c949bdd5d195c8e881156141254915160421b604482015290519081900360640190fd5b8b896108c78d3483806108735785610895565b7f00000000000000000000000000000000000000000000000000000000000000005b856108c0577f00000000000000000000000000000000000000000000000000000000000000006108c2565b865b611c6d565b90965094508d91508a90506000610936826108e25783610904565b7f00000000000000000000000000000000000000000000000000000000000000005b8361092f577f0000000000000000000000000000000000000000000000000000000000000000610931565b845b611c0e565b905061095083338385610949578a61094b565b895b611cb0565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db08361098a578761098c565b885b6040518263ffffffff1660e01b81526004016000604051808303818588803b1580156109b757600080fd5b505af11580156109cb573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb8284610a0b5788610a0d565b895b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610a5c57600080fd5b505af1158015610a70573d6000803e3d6000fd5b505050506040513d6020811015610a8657600080fd5b5051610a8e57fe5b604080516319e6ef2760e11b81526001600160a01b038c811660048301528d151560248301529151918316916333cdde4e916044808201926020929091908290030181600087803b158015610ae257600080fd5b505af1158015610af6573d6000803e3d6000fd5b505050506040513d6020811015610b0c57600080fd5b505194508c851015610b65576040805162461bcd60e51b815260206004820152601960248201527f5a50523a204e6f7420656e6f756768206c697175696469747900000000000000604482015290519081900360640190fd5b50505088610b735782610b75565b835b341115610b9457610b94338a610b8b5784610b8d565b855b3403611e0d565b6001600160a01b03861615610bad57610bad8683611f05565b50985098509895505050505050565b6000808242811015610c10576040805162461bcd60e51b8152602060048201526018602482015277155b9a5cddd85c158c949bdd5d195c8e881156141254915160421b604482015290519081900360640190fd5b600086610c1d5788610c3f565b7f00000000000000000000000000000000000000000000000000000000000000005b9050600087610c6e577f0000000000000000000000000000000000000000000000000000000000000000610c70565b895b90506000610c7e838361209d565b91505088610c8c5789610c8e565b345b955088610c9b5734610c9d565b895b9450610cab8b33838d611cb0565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610d0657600080fd5b505af1158015610d1a573d6000803e3d6000fd5b50506040805163a9059cbb60e01b81526001600160a01b03868116600483015234602483015291517f0000000000000000000000000000000000000000000000000000000000000000909216945063a9059cbb935060448082019350602092918290030181600087803b158015610d9057600080fd5b505af1158015610da4573d6000803e3d6000fd5b505050506040513d6020811015610dba57600080fd5b5051610dc257fe5b60408051633ca5007160e21b81526001600160a01b038a8116600483015282519084169263f29401c492602480820193918290030181600087803b158015610e0957600080fd5b505af1158015610e1d573d6000803e3d6000fd5b505050506040513d6040811015610e3357600080fd5b50959b949a509398505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000808242811015610ebe576040805162461bcd60e51b8152602060048201526018602482015277155b9a5cddd85c158c949bdd5d195c8e881156141254915160421b604482015290519081900360640190fd5b6000610eca8a8a61209d565b915050879350869250610edf8a338387611cb0565b610eeb89338386611cb0565b60408051633ca5007160e21b81526001600160a01b03888116600483015282519084169263f29401c492602480820193918290030181600087803b158015610f3257600080fd5b505af1158015610f46573d6000803e3d6000fd5b505050506040513d6040811015610f5c57600080fd5b50939a92995091975050505050505050565b6000808242811015610fc2576040805162461bcd60e51b8152602060048201526018602482015277155b9a5cddd85c158c949bdd5d195c8e881156141254915160421b604482015290519081900360640190fd5b6000610fce8c8c611c0e565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663fad51a9a838a61100d578f61100f565b8e5b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019250505060206040518083038186803b15801561106e57600080fd5b505afa158015611082573d6000803e3d6000fd5b505050506040513d602081101561109857600080fd5b5051604080516323b872dd60e01b81523360048201526001600160a01b038581166024830152604482018f90529151929350908316916323b872dd916064808201926020929091908290030181600087803b1580156110f657600080fd5b505af115801561110a573d6000803e3d6000fd5b505050506040513d602081101561112057600080fd5b5050604080517fc561cf4f0000000000000000000000000000000000000000000000000000000081526001600160a01b0389811660048301528a1515602483015282519085169263c561cf4f92604480820193918290030181600087803b15801561118a57600080fd5b505af115801561119e573d6000803e3d6000fd5b505050506040513d60408110156111b457600080fd5b5080516020909101519095509350898510156112015760405162461bcd60e51b81526004018080602001828103825260268152602001806131c66026913960400191505060405180910390fd5b888410156112405760405162461bcd60e51b815260040180806020018281038252602681526020018061312f6026913960400191505060405180910390fd5b5050509850989650505050505050565b60008082428110156112a4576040805162461bcd60e51b8152602060048201526018602482015277155b9a5cddd85c158c949bdd5d195c8e881156141254915160421b604482015290519081900360640190fd5b6112ae8b8b6123cc565b88925060006112bd8c8c611c0e565b90506112d7886112cd578c6112cf565b8b5b338387611cb0565b604080516346a3871160e11b81526001600160a01b0389811660048301528a15156024830152915191831691638d470e22916044808201926020929091908290030181600087803b15801561132b57600080fd5b505af115801561133f573d6000803e3d6000fd5b505050506040513d602081101561135557600080fd5b50519250888310156113ae576040805162461bcd60e51b815260206004820152601960248201527f5a50523a204e6f7420656e6f756768206c697175696469747900000000000000604482015290519081900360640190fd5b6001600160a01b038616156113c7576113c78684611f05565b50509850989650505050505050565b60008142811015611429576040805162461bcd60e51b8152602060048201526018602482015277155b9a5cddd85c158c949bdd5d195c8e881156141254915160421b604482015290519081900360640190fd5b6000341161147e576040805162461bcd60e51b815260206004820152600f60248201527f5a50523a205a45524f2d56414c55450000000000000000000000000000000000604482015290519081900360640190fd5b60008761148b57886114ad565b7f00000000000000000000000000000000000000000000000000000000000000005b90506000886114dc577f00000000000000000000000000000000000000000000000000000000000000006114de565b895b90506114ea82826123cc565b60006114f68383611c0e565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561155357600080fd5b505af1158015611567573d6000803e3d6000fd5b50506040805163a9059cbb60e01b81526001600160a01b03868116600483015234602483015291517f0000000000000000000000000000000000000000000000000000000000000000909216945063a9059cbb935060448082019350602092918290030181600087803b1580156115dd57600080fd5b505af11580156115f1573d6000803e3d6000fd5b505050506040513d602081101561160757600080fd5b505161160f57fe5b604080516346a3871160e11b81526001600160a01b038a811660048301528c156024830152915191831691638d470e22916044808201926020929091908290030181600087803b15801561166257600080fd5b505af1158015611676573d6000803e3d6000fd5b505050506040513d602081101561168c57600080fd5b50519450888510156116e5576040805162461bcd60e51b815260206004820152601960248201527f5a50523a204e6f7420656e6f756768206c697175696469747900000000000000604482015290519081900360640190fd5b6001600160a01b038716156116fe576116fe8786611f05565b505050509695505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600081428110156117a7576040805162461bcd60e51b8152602060048201526018602482015277155b9a5cddd85c158c949bdd5d195c8e881156141254915160421b604482015290519081900360640190fd5b6000806117b68d8d8d8d6126fa565b9150915060006117c88e8e8585612ac4565b604080516319e6ef2760e11b81526001600160a01b038b811660048301528c151560248301529151929350908316916333cdde4e916044808201926020929091908290030181600087803b15801561181f57600080fd5b505af1158015611833573d6000803e3d6000fd5b505050506040513d602081101561184957600080fd5b50519450898510156118a2576040805162461bcd60e51b815260206004820152601960248201527f5a50523a204e6f7420656e6f756768206c697175696469747900000000000000604482015290519081900360640190fd5b6001600160a01b038716156118bb576118bb8786611f05565b505050509998505050505050505050565b6000808242811015611920576040805162461bcd60e51b8152602060048201526018602482015277155b9a5cddd85c158c949bdd5d195c8e881156141254915160421b604482015290519081900360640190fd5b60008061198d8915611952577f0000000000000000000000000000000000000000000000000000000000000000611954565b8d5b8a15611960578e611982565b7f00000000000000000000000000000000000000000000000000000000000000005b8e8e8e8d308d610f6e565b91509150881561199d578061199f565b815b945088156119ad57816119af565b805b935050506119be8b8685612af2565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611a2457600080fd5b505af1158015611a38573d6000803e3d6000fd5b50505050611a468583611e0d565b509850989650505050505050565b60008142811015611aa7576040805162461bcd60e51b8152602060048201526018602482015277155b9a5cddd85c158c949bdd5d195c8e881156141254915160421b604482015290519081900360640190fd5b600086611ab45789611ad6565b7f00000000000000000000000000000000000000000000000000000000000000005b9050600087611b05577f0000000000000000000000000000000000000000000000000000000000000000611b07565b8a5b9050611b3f82828c8c8b8d8015611b1b57508c5b80611b2d57508c158015611b2d57508d155b611b375730611b39565b8b5b8b61056f565b9350878015611b4c575086155b80611b5d5750868015611b5d575087155b156107fc577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d856040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611bc857600080fd5b505af1158015611bdc573d6000803e3d6000fd5b505050506107fc8685611e0d565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000611c667f00000000000000000000000000000000000000000000000000000000000000008484611c617f00000000000000000000000000000000000000000000000000000000000000008888612c3f565b612d17565b9392505050565b60008060008515611c7e5786611c80565b875b905060008615611c905788611c92565b875b9050611ca0868684846126fa565b909a909950975050505050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b60208310611d355780518252601f199092019160209182019101611d16565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611d97576040519150601f19603f3d011682016040523d82523d6000602084013e611d9c565b606091505b5091509150818015611dca575080511580611dca5750808060200190516020811015611dc757600080fd5b50515b611e055760405162461bcd60e51b81526004018080602001828103825260318152602001806130a56031913960400191505060405180910390fd5b505050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b60208310611e595780518252601f199092019160209182019101611e3a565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611ebb576040519150601f19603f3d011682016040523d82523d6000602084013e611ec0565b606091505b5050905080611f005760405162461bcd60e51b81526004018080602001828103825260348152602001806130d66034913960400191505060405180910390fd5b505050565b604080518082018252601681527f726f757465724465706f7369742875696e74323536290000000000000000000060209182015281516024808201859052835180830390910181526044909101835290810180516001600160e01b03167f462293a300000000000000000000000000000000000000000000000000000000178152915181516000936060936001600160a01b038816939092909182918083835b60208310611fc45780518252601f199092019160209182019101611fa5565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612026576040519150601f19603f3d011682016040523d82523d6000602084013e61202b565b606091505b509150915081612097578051156120455780518082602001fd5b81612097576040805162461bcd60e51b815260206004820152600f60248201527f5a503a204641524d5f4641494c45440000000000000000000000000000000000604482015290519081900360640190fd5b50505050565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e6a4390585856040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019250505060206040518083038186803b15801561213057600080fd5b505afa158015612144573d6000803e3d6000fd5b505050506040513d602081101561215a57600080fd5b505191506001600160a01b03821661225157604080517f76f797380000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015285811660248301527f00000000000000000000000000000000000000000000000000000000000000008116604483015291517f0000000000000000000000000000000000000000000000000000000000000000909216916376f79738916064808201926020929091908290030181600087803b15801561222257600080fd5b505af1158015612236573d6000803e3d6000fd5b505050506040513d602081101561224c57600080fd5b505191505b60408051630e0f297360e01b81526001600160a01b038681166004830152858116602483015291517f000000000000000000000000000000000000000000000000000000000000000090921691630e0f297391604480820192602092909190829003018186803b1580156122c457600080fd5b505afa1580156122d8573d6000803e3d6000fd5b505050506040513d60208110156122ee57600080fd5b505190506001600160a01b0381166123c557604080517f79281abe0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301528681166024830152858116604483015291517f0000000000000000000000000000000000000000000000000000000000000000909216916379281abe916064808201926020929091908290030181600087803b15801561239657600080fd5b505af11580156123aa573d6000803e3d6000fd5b505050506040513d60208110156123c057600080fd5b505190505b9250929050565b818160007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e6a4390584846040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019250505060206040518083038186803b15801561246057600080fd5b505afa158015612474573d6000803e3d6000fd5b505050506040513d602081101561248a57600080fd5b505190506001600160a01b0381166124e9576040805162461bcd60e51b815260206004820152601560248201527f5a50523a2050616972204e6f7420437265617465640000000000000000000000604482015290519081900360640190fd5b60408051630e0f297360e01b81526001600160a01b038581166004830152848116602483015291516000927f00000000000000000000000000000000000000000000000000000000000000001691630e0f2973916044808301926020929190829003018186803b15801561255c57600080fd5b505afa158015612570573d6000803e3d6000fd5b505050506040513d602081101561258657600080fd5b50516001600160a01b031614156125e4576040805162461bcd60e51b815260206004820152601660248201527f5a50523a2050796c6f6e206e6f74206372656174656400000000000000000000604482015290519081900360640190fd5b60408051630614bbb360e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301528086166024830152808516604483015283166064820152905173a82e973126867ddf6b811c83f881c5203c66961c91631852eecc916084808301926020929190829003018186803b15801561267657600080fd5b505af415801561268a573d6000803e3d6000fd5b505050506040513d60208110156126a057600080fd5b50516126f3576040805162461bcd60e51b815260206004820152601a60248201527f5a50523a2050796c6f6e204e6f7420496e697469616c697a6564000000000000604482015290519081900360640190fd5b5050505050565b600080858560007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e6a4390584846040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019250505060206040518083038186803b15801561279157600080fd5b505afa1580156127a5573d6000803e3d6000fd5b505050506040513d60208110156127bb57600080fd5b505190506001600160a01b03811661281a576040805162461bcd60e51b815260206004820152601560248201527f5a50523a2050616972204e6f7420437265617465640000000000000000000000604482015290519081900360640190fd5b60408051630e0f297360e01b81526001600160a01b038581166004830152848116602483015291516000927f00000000000000000000000000000000000000000000000000000000000000001691630e0f2973916044808301926020929190829003018186803b15801561288d57600080fd5b505afa1580156128a1573d6000803e3d6000fd5b505050506040513d60208110156128b757600080fd5b50516001600160a01b03161415612915576040805162461bcd60e51b815260206004820152601660248201527f5a50523a2050796c6f6e206e6f74206372656174656400000000000000000000604482015290519081900360640190fd5b60408051630614bbb360e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301528086166024830152808516604483015283166064820152905173a82e973126867ddf6b811c83f881c5203c66961c91631852eecc916084808301926020929190829003018186803b1580156129a757600080fd5b505af41580156129bb573d6000803e3d6000fd5b505050506040513d60208110156129d157600080fd5b5051612a24576040805162461bcd60e51b815260206004820152601a60248201527f5a50523a2050796c6f6e204e6f7420496e697469616c697a6564000000000000604482015290519081900360640190fd5b600080612a527f00000000000000000000000000000000000000000000000000000000000000008c8c612de1565b91509150816000148015612a64575080155b15612a7457889650879550612ab6565b6000612a818a8484612eaf565b9050888111612a9557899750955085612ab4565b6000612aa28a8486612eaf565b90508a811115612aae57fe5b97508896505b505b505050505094509492505050565b6000612ad08585611c0e565b9050612ade85338386611cb0565b612aea84338385611cb0565b949350505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b60208310612b6f5780518252601f199092019160209182019101612b50565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612bd1576040519150601f19603f3d011682016040523d82523d6000602084013e612bd6565b606091505b5091509150818015612c04575080511580612c045750808060200190516020811015612c0157600080fd5b50515b6126f35760405162461bcd60e51b815260040180806020018281038252602d8152602001806131ec602d913960400191505060405180910390fd5b6000806000612c4e8585612f5b565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527f0ec3a964af2d4288dcee11cf85135843bcfc1e8e4f8a107d634a0818cc792ee7609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516bffffffffffffffffffffffff19606095861b811660208084019190915294861b8116603483015292851b831660488201528151603c818303018152605c820183528051908501207fff00000000000000000000000000000000000000000000000000000000000000607c8301529590941b909116607d84015260918301939093527f44ca8087c95ad2e8ea0739f78fa06a76fc246d61762366f5b76eded713fadbb260b1808401919091528351808403909101815260d1909201909252805191012090565b6000806000612df08585612f5b565b509050600080612e01888888612c3f565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015612e3957600080fd5b505afa158015612e4d573d6000803e3d6000fd5b505050506040513d6060811015612e6357600080fd5b5080516020909101516dffffffffffffffffffffffffffff91821693501690506001600160a01b0387811690841614612e9d578082612ea0565b81815b90999098509650505050505050565b6000808411612eef5760405162461bcd60e51b81526004018080602001828103825260258152602001806131a16025913960400191505060405180910390fd5b600083118015612eff5750600082115b612f3a5760405162461bcd60e51b81526004018080602001828103825260288152602001806131796028913960400191505060405180910390fd5b82612f4b858463ffffffff61303216565b81612f5257fe5b04949350505050565b600080826001600160a01b0316846001600160a01b03161415612faf5760405162461bcd60e51b815260040180806020018281038252602581526020018061310a6025913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031610612fcf578284612fd2565b83835b90925090506001600160a01b0382166123c5576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b600081158061304d5750508082028282828161304a57fe5b04145b61309e576040805162461bcd60e51b815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b9291505056fe5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472616e7366657246726f6d206661696c65645472616e7366657248656c7065723a3a736166655472616e736665724554483a20455448207472616e73666572206661696c6564556e697377617056324c6962726172793a204944454e544943414c5f414444524553534553556e69737761705632526f757465723a20494e53554646494349454e545f425f414d4f554e54556e69737761705632526f757465723a20494e53554646494349454e545f414d4f554e54556e697377617056324c6962726172793a20494e53554646494349454e545f4c4951554944495459556e697377617056324c6962726172793a20494e53554646494349454e545f414d4f554e54556e69737761705632526f757465723a20494e53554646494349454e545f415f414d4f554e545472616e7366657248656c7065723a3a736166655472616e736665723a207472616e73666572206661696c6564a2646970667358221220d037d1cfea7dcc0e7a999070935c6cd51195e5202e4a05761690866d3b71ea9f64736f6c634300060600330000000000000000000000006b6071ccc534fcee7b699aab87929faf8806d5bd0000000000000000000000003da19d8f9f1208f844ede1b6ac6caf2c14a318bd0000000000000000000000002d4ddeb8b183413e9d88a98fa3dd844e34d41c5400000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a
Deployed Bytecode
0x6080604052600436106100e15760003560e01c80638a96e2471161007f578063cdccaca011610059578063cdccaca014610428578063ed1d080f14610497578063ef68f27f146104fb578063ef8863b41461055a5761011a565b80638a96e247146103b4578063ad5c4648146103fe578063c45a0155146104135761011a565b80632b34f135116100bb5780632b34f1351461026457806359b11df71461029557806359b9a98b146102ea578063769635bd1461034e5761011a565b8063119438711461011f5780631e3990bd14610190578063230e9bca146102075761011a565b3661011a57336001600160a01b037f00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a161461011857fe5b005b600080fd5b34801561012b57600080fd5b5061017e600480360360e081101561014257600080fd5b506001600160a01b0381358116916020810135821691604082013591606081013591608082013515159160a08101359091169060c0013561056f565b60408051918252519081900360200190f35b6101e960048036036101008110156101a757600080fd5b506001600160a01b0381358116916020810135916040820135916060810135151591608082013515159160a081013582169160c0820135169060e0013561080a565b60408051938452602084019290925282820152519081900360600190f35b61024b600480360360a081101561021d57600080fd5b506001600160a01b038135811691602081013591604082013515159160608101359091169060800135610bbc565b6040805192835260208301919091528051918290030190f35b34801561027057600080fd5b50610279610e46565b604080516001600160a01b039092168252519081900360200190f35b3480156102a157600080fd5b5061024b600480360360c08110156102b857600080fd5b506001600160a01b03813581169160208101358216916040820135916060810135916080820135169060a00135610e6a565b3480156102f657600080fd5b5061024b600480360361010081101561030e57600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a081013515159160c0820135169060e00135610f6e565b34801561035a57600080fd5b5061024b600480360361010081101561037257600080fd5b506001600160a01b0381358116916020810135821691604082013591606081013591608082013515159160a081013582169160c0820135169060e00135611250565b61017e600480360360c08110156103ca57600080fd5b506001600160a01b038135811691602081013515159160408201359160608101358216916080820135169060a001356113d6565b34801561040a57600080fd5b5061027961170c565b34801561041f57600080fd5b50610279611730565b34801561043457600080fd5b5061017e600480360361012081101561044c57600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a081013515159160c082013581169160e0810135909116906101000135611754565b3480156104a357600080fd5b5061024b60048036036101008110156104bb57600080fd5b506001600160a01b038135811691602081013591604082013591606081013591608082013515159160a081013515159160c0820135169060e001356118cc565b34801561050757600080fd5b5061017e600480360360e081101561051e57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135151591608082013515159160a08101359091169060c00135611a54565b34801561056657600080fd5b50610279611bea565b600081428110156105c2576040805162461bcd60e51b8152602060048201526018602482015277155b9a5cddd85c158c949bdd5d195c8e881156141254915160421b604482015290519081900360640190fd5b60006105ce8a8a611c0e565b905060007f0000000000000000000000002d4ddeb8b183413e9d88a98fa3dd844e34d41c546001600160a01b031663fad51a9a838961060d578d61060f565b8c5b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019250505060206040518083038186803b15801561066e57600080fd5b505afa158015610682573d6000803e3d6000fd5b505050506040513d602081101561069857600080fd5b5051604080516323b872dd60e01b81523360048201526001600160a01b038581166024830152604482018d90529151929350908316916323b872dd916064808201926020929091908290030181600087803b1580156106f657600080fd5b505af115801561070a573d6000803e3d6000fd5b505050506040513d602081101561072057600080fd5b5050604080517fba7b3dea0000000000000000000000000000000000000000000000000000000081526001600160a01b038881166004830152891515602483015291519184169163ba7b3dea916044808201926020929091908290030181600087803b15801561078f57600080fd5b505af11580156107a3573d6000803e3d6000fd5b505050506040513d60208110156107b957600080fd5b50519350878410156107fc5760405162461bcd60e51b81526004018080602001828103825260248152602001806131556024913960400191505060405180910390fd5b505050979650505050505050565b60008060008342811015610860576040805162461bcd60e51b8152602060048201526018602482015277155b9a5cddd85c158c949bdd5d195c8e881156141254915160421b604482015290519081900360640190fd5b8b896108c78d3483806108735785610895565b7f00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a5b856108c0577f00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a6108c2565b865b611c6d565b90965094508d91508a90506000610936826108e25783610904565b7f00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a5b8361092f577f00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a610931565b845b611c0e565b905061095083338385610949578a61094b565b895b611cb0565b7f00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a6001600160a01b031663d0e30db08361098a578761098c565b885b6040518263ffffffff1660e01b81526004016000604051808303818588803b1580156109b757600080fd5b505af11580156109cb573d6000803e3d6000fd5b50505050507f00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a6001600160a01b031663a9059cbb8284610a0b5788610a0d565b895b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610a5c57600080fd5b505af1158015610a70573d6000803e3d6000fd5b505050506040513d6020811015610a8657600080fd5b5051610a8e57fe5b604080516319e6ef2760e11b81526001600160a01b038c811660048301528d151560248301529151918316916333cdde4e916044808201926020929091908290030181600087803b158015610ae257600080fd5b505af1158015610af6573d6000803e3d6000fd5b505050506040513d6020811015610b0c57600080fd5b505194508c851015610b65576040805162461bcd60e51b815260206004820152601960248201527f5a50523a204e6f7420656e6f756768206c697175696469747900000000000000604482015290519081900360640190fd5b50505088610b735782610b75565b835b341115610b9457610b94338a610b8b5784610b8d565b855b3403611e0d565b6001600160a01b03861615610bad57610bad8683611f05565b50985098509895505050505050565b6000808242811015610c10576040805162461bcd60e51b8152602060048201526018602482015277155b9a5cddd85c158c949bdd5d195c8e881156141254915160421b604482015290519081900360640190fd5b600086610c1d5788610c3f565b7f00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a5b9050600087610c6e577f00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a610c70565b895b90506000610c7e838361209d565b91505088610c8c5789610c8e565b345b955088610c9b5734610c9d565b895b9450610cab8b33838d611cb0565b7f00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a6001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610d0657600080fd5b505af1158015610d1a573d6000803e3d6000fd5b50506040805163a9059cbb60e01b81526001600160a01b03868116600483015234602483015291517f00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a909216945063a9059cbb935060448082019350602092918290030181600087803b158015610d9057600080fd5b505af1158015610da4573d6000803e3d6000fd5b505050506040513d6020811015610dba57600080fd5b5051610dc257fe5b60408051633ca5007160e21b81526001600160a01b038a8116600483015282519084169263f29401c492602480820193918290030181600087803b158015610e0957600080fd5b505af1158015610e1d573d6000803e3d6000fd5b505050506040513d6040811015610e3357600080fd5b50959b949a509398505050505050505050565b7f0000000000000000000000002d4ddeb8b183413e9d88a98fa3dd844e34d41c5481565b6000808242811015610ebe576040805162461bcd60e51b8152602060048201526018602482015277155b9a5cddd85c158c949bdd5d195c8e881156141254915160421b604482015290519081900360640190fd5b6000610eca8a8a61209d565b915050879350869250610edf8a338387611cb0565b610eeb89338386611cb0565b60408051633ca5007160e21b81526001600160a01b03888116600483015282519084169263f29401c492602480820193918290030181600087803b158015610f3257600080fd5b505af1158015610f46573d6000803e3d6000fd5b505050506040513d6040811015610f5c57600080fd5b50939a92995091975050505050505050565b6000808242811015610fc2576040805162461bcd60e51b8152602060048201526018602482015277155b9a5cddd85c158c949bdd5d195c8e881156141254915160421b604482015290519081900360640190fd5b6000610fce8c8c611c0e565b905060007f0000000000000000000000002d4ddeb8b183413e9d88a98fa3dd844e34d41c546001600160a01b031663fad51a9a838a61100d578f61100f565b8e5b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019250505060206040518083038186803b15801561106e57600080fd5b505afa158015611082573d6000803e3d6000fd5b505050506040513d602081101561109857600080fd5b5051604080516323b872dd60e01b81523360048201526001600160a01b038581166024830152604482018f90529151929350908316916323b872dd916064808201926020929091908290030181600087803b1580156110f657600080fd5b505af115801561110a573d6000803e3d6000fd5b505050506040513d602081101561112057600080fd5b5050604080517fc561cf4f0000000000000000000000000000000000000000000000000000000081526001600160a01b0389811660048301528a1515602483015282519085169263c561cf4f92604480820193918290030181600087803b15801561118a57600080fd5b505af115801561119e573d6000803e3d6000fd5b505050506040513d60408110156111b457600080fd5b5080516020909101519095509350898510156112015760405162461bcd60e51b81526004018080602001828103825260268152602001806131c66026913960400191505060405180910390fd5b888410156112405760405162461bcd60e51b815260040180806020018281038252602681526020018061312f6026913960400191505060405180910390fd5b5050509850989650505050505050565b60008082428110156112a4576040805162461bcd60e51b8152602060048201526018602482015277155b9a5cddd85c158c949bdd5d195c8e881156141254915160421b604482015290519081900360640190fd5b6112ae8b8b6123cc565b88925060006112bd8c8c611c0e565b90506112d7886112cd578c6112cf565b8b5b338387611cb0565b604080516346a3871160e11b81526001600160a01b0389811660048301528a15156024830152915191831691638d470e22916044808201926020929091908290030181600087803b15801561132b57600080fd5b505af115801561133f573d6000803e3d6000fd5b505050506040513d602081101561135557600080fd5b50519250888310156113ae576040805162461bcd60e51b815260206004820152601960248201527f5a50523a204e6f7420656e6f756768206c697175696469747900000000000000604482015290519081900360640190fd5b6001600160a01b038616156113c7576113c78684611f05565b50509850989650505050505050565b60008142811015611429576040805162461bcd60e51b8152602060048201526018602482015277155b9a5cddd85c158c949bdd5d195c8e881156141254915160421b604482015290519081900360640190fd5b6000341161147e576040805162461bcd60e51b815260206004820152600f60248201527f5a50523a205a45524f2d56414c55450000000000000000000000000000000000604482015290519081900360640190fd5b60008761148b57886114ad565b7f00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a5b90506000886114dc577f00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a6114de565b895b90506114ea82826123cc565b60006114f68383611c0e565b90507f00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a6001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561155357600080fd5b505af1158015611567573d6000803e3d6000fd5b50506040805163a9059cbb60e01b81526001600160a01b03868116600483015234602483015291517f00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a909216945063a9059cbb935060448082019350602092918290030181600087803b1580156115dd57600080fd5b505af11580156115f1573d6000803e3d6000fd5b505050506040513d602081101561160757600080fd5b505161160f57fe5b604080516346a3871160e11b81526001600160a01b038a811660048301528c156024830152915191831691638d470e22916044808201926020929091908290030181600087803b15801561166257600080fd5b505af1158015611676573d6000803e3d6000fd5b505050506040513d602081101561168c57600080fd5b50519450888510156116e5576040805162461bcd60e51b815260206004820152601960248201527f5a50523a204e6f7420656e6f756768206c697175696469747900000000000000604482015290519081900360640190fd5b6001600160a01b038716156116fe576116fe8786611f05565b505050509695505050505050565b7f00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a81565b7f0000000000000000000000006b6071ccc534fcee7b699aab87929faf8806d5bd81565b600081428110156117a7576040805162461bcd60e51b8152602060048201526018602482015277155b9a5cddd85c158c949bdd5d195c8e881156141254915160421b604482015290519081900360640190fd5b6000806117b68d8d8d8d6126fa565b9150915060006117c88e8e8585612ac4565b604080516319e6ef2760e11b81526001600160a01b038b811660048301528c151560248301529151929350908316916333cdde4e916044808201926020929091908290030181600087803b15801561181f57600080fd5b505af1158015611833573d6000803e3d6000fd5b505050506040513d602081101561184957600080fd5b50519450898510156118a2576040805162461bcd60e51b815260206004820152601960248201527f5a50523a204e6f7420656e6f756768206c697175696469747900000000000000604482015290519081900360640190fd5b6001600160a01b038716156118bb576118bb8786611f05565b505050509998505050505050505050565b6000808242811015611920576040805162461bcd60e51b8152602060048201526018602482015277155b9a5cddd85c158c949bdd5d195c8e881156141254915160421b604482015290519081900360640190fd5b60008061198d8915611952577f00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a611954565b8d5b8a15611960578e611982565b7f00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a5b8e8e8e8d308d610f6e565b91509150881561199d578061199f565b815b945088156119ad57816119af565b805b935050506119be8b8685612af2565b7f00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a6001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611a2457600080fd5b505af1158015611a38573d6000803e3d6000fd5b50505050611a468583611e0d565b509850989650505050505050565b60008142811015611aa7576040805162461bcd60e51b8152602060048201526018602482015277155b9a5cddd85c158c949bdd5d195c8e881156141254915160421b604482015290519081900360640190fd5b600086611ab45789611ad6565b7f00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a5b9050600087611b05577f00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a611b07565b8a5b9050611b3f82828c8c8b8d8015611b1b57508c5b80611b2d57508c158015611b2d57508d155b611b375730611b39565b8b5b8b61056f565b9350878015611b4c575086155b80611b5d5750868015611b5d575087155b156107fc577f00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a6001600160a01b0316632e1a7d4d856040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611bc857600080fd5b505af1158015611bdc573d6000803e3d6000fd5b505050506107fc8685611e0d565b7f0000000000000000000000003da19d8f9f1208f844ede1b6ac6caf2c14a318bd81565b6000611c667f0000000000000000000000003da19d8f9f1208f844ede1b6ac6caf2c14a318bd8484611c617f0000000000000000000000006b6071ccc534fcee7b699aab87929faf8806d5bd8888612c3f565b612d17565b9392505050565b60008060008515611c7e5786611c80565b875b905060008615611c905788611c92565b875b9050611ca0868684846126fa565b909a909950975050505050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b60208310611d355780518252601f199092019160209182019101611d16565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611d97576040519150601f19603f3d011682016040523d82523d6000602084013e611d9c565b606091505b5091509150818015611dca575080511580611dca5750808060200190516020811015611dc757600080fd5b50515b611e055760405162461bcd60e51b81526004018080602001828103825260318152602001806130a56031913960400191505060405180910390fd5b505050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b60208310611e595780518252601f199092019160209182019101611e3a565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611ebb576040519150601f19603f3d011682016040523d82523d6000602084013e611ec0565b606091505b5050905080611f005760405162461bcd60e51b81526004018080602001828103825260348152602001806130d66034913960400191505060405180910390fd5b505050565b604080518082018252601681527f726f757465724465706f7369742875696e74323536290000000000000000000060209182015281516024808201859052835180830390910181526044909101835290810180516001600160e01b03167f462293a300000000000000000000000000000000000000000000000000000000178152915181516000936060936001600160a01b038816939092909182918083835b60208310611fc45780518252601f199092019160209182019101611fa5565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612026576040519150601f19603f3d011682016040523d82523d6000602084013e61202b565b606091505b509150915081612097578051156120455780518082602001fd5b81612097576040805162461bcd60e51b815260206004820152600f60248201527f5a503a204641524d5f4641494c45440000000000000000000000000000000000604482015290519081900360640190fd5b50505050565b6000807f0000000000000000000000006b6071ccc534fcee7b699aab87929faf8806d5bd6001600160a01b031663e6a4390585856040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019250505060206040518083038186803b15801561213057600080fd5b505afa158015612144573d6000803e3d6000fd5b505050506040513d602081101561215a57600080fd5b505191506001600160a01b03821661225157604080517f76f797380000000000000000000000000000000000000000000000000000000081526001600160a01b03868116600483015285811660248301527f0000000000000000000000003da19d8f9f1208f844ede1b6ac6caf2c14a318bd8116604483015291517f0000000000000000000000006b6071ccc534fcee7b699aab87929faf8806d5bd909216916376f79738916064808201926020929091908290030181600087803b15801561222257600080fd5b505af1158015612236573d6000803e3d6000fd5b505050506040513d602081101561224c57600080fd5b505191505b60408051630e0f297360e01b81526001600160a01b038681166004830152858116602483015291517f0000000000000000000000003da19d8f9f1208f844ede1b6ac6caf2c14a318bd90921691630e0f297391604480820192602092909190829003018186803b1580156122c457600080fd5b505afa1580156122d8573d6000803e3d6000fd5b505050506040513d60208110156122ee57600080fd5b505190506001600160a01b0381166123c557604080517f79281abe0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301528681166024830152858116604483015291517f0000000000000000000000003da19d8f9f1208f844ede1b6ac6caf2c14a318bd909216916379281abe916064808201926020929091908290030181600087803b15801561239657600080fd5b505af11580156123aa573d6000803e3d6000fd5b505050506040513d60208110156123c057600080fd5b505190505b9250929050565b818160007f0000000000000000000000006b6071ccc534fcee7b699aab87929faf8806d5bd6001600160a01b031663e6a4390584846040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019250505060206040518083038186803b15801561246057600080fd5b505afa158015612474573d6000803e3d6000fd5b505050506040513d602081101561248a57600080fd5b505190506001600160a01b0381166124e9576040805162461bcd60e51b815260206004820152601560248201527f5a50523a2050616972204e6f7420437265617465640000000000000000000000604482015290519081900360640190fd5b60408051630e0f297360e01b81526001600160a01b038581166004830152848116602483015291516000927f0000000000000000000000003da19d8f9f1208f844ede1b6ac6caf2c14a318bd1691630e0f2973916044808301926020929190829003018186803b15801561255c57600080fd5b505afa158015612570573d6000803e3d6000fd5b505050506040513d602081101561258657600080fd5b50516001600160a01b031614156125e4576040805162461bcd60e51b815260206004820152601660248201527f5a50523a2050796c6f6e206e6f74206372656174656400000000000000000000604482015290519081900360640190fd5b60408051630614bbb360e21b81526001600160a01b037f0000000000000000000000003da19d8f9f1208f844ede1b6ac6caf2c14a318bd811660048301528086166024830152808516604483015283166064820152905173a82e973126867ddf6b811c83f881c5203c66961c91631852eecc916084808301926020929190829003018186803b15801561267657600080fd5b505af415801561268a573d6000803e3d6000fd5b505050506040513d60208110156126a057600080fd5b50516126f3576040805162461bcd60e51b815260206004820152601a60248201527f5a50523a2050796c6f6e204e6f7420496e697469616c697a6564000000000000604482015290519081900360640190fd5b5050505050565b600080858560007f0000000000000000000000006b6071ccc534fcee7b699aab87929faf8806d5bd6001600160a01b031663e6a4390584846040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019250505060206040518083038186803b15801561279157600080fd5b505afa1580156127a5573d6000803e3d6000fd5b505050506040513d60208110156127bb57600080fd5b505190506001600160a01b03811661281a576040805162461bcd60e51b815260206004820152601560248201527f5a50523a2050616972204e6f7420437265617465640000000000000000000000604482015290519081900360640190fd5b60408051630e0f297360e01b81526001600160a01b038581166004830152848116602483015291516000927f0000000000000000000000003da19d8f9f1208f844ede1b6ac6caf2c14a318bd1691630e0f2973916044808301926020929190829003018186803b15801561288d57600080fd5b505afa1580156128a1573d6000803e3d6000fd5b505050506040513d60208110156128b757600080fd5b50516001600160a01b03161415612915576040805162461bcd60e51b815260206004820152601660248201527f5a50523a2050796c6f6e206e6f74206372656174656400000000000000000000604482015290519081900360640190fd5b60408051630614bbb360e21b81526001600160a01b037f0000000000000000000000003da19d8f9f1208f844ede1b6ac6caf2c14a318bd811660048301528086166024830152808516604483015283166064820152905173a82e973126867ddf6b811c83f881c5203c66961c91631852eecc916084808301926020929190829003018186803b1580156129a757600080fd5b505af41580156129bb573d6000803e3d6000fd5b505050506040513d60208110156129d157600080fd5b5051612a24576040805162461bcd60e51b815260206004820152601a60248201527f5a50523a2050796c6f6e204e6f7420496e697469616c697a6564000000000000604482015290519081900360640190fd5b600080612a527f0000000000000000000000006b6071ccc534fcee7b699aab87929faf8806d5bd8c8c612de1565b91509150816000148015612a64575080155b15612a7457889650879550612ab6565b6000612a818a8484612eaf565b9050888111612a9557899750955085612ab4565b6000612aa28a8486612eaf565b90508a811115612aae57fe5b97508896505b505b505050505094509492505050565b6000612ad08585611c0e565b9050612ade85338386611cb0565b612aea84338385611cb0565b949350505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b60208310612b6f5780518252601f199092019160209182019101612b50565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612bd1576040519150601f19603f3d011682016040523d82523d6000602084013e612bd6565b606091505b5091509150818015612c04575080511580612c045750808060200190516020811015612c0157600080fd5b50515b6126f35760405162461bcd60e51b815260040180806020018281038252602d8152602001806131ec602d913960400191505060405180910390fd5b6000806000612c4e8585612f5b565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527f0ec3a964af2d4288dcee11cf85135843bcfc1e8e4f8a107d634a0818cc792ee7609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516bffffffffffffffffffffffff19606095861b811660208084019190915294861b8116603483015292851b831660488201528151603c818303018152605c820183528051908501207fff00000000000000000000000000000000000000000000000000000000000000607c8301529590941b909116607d84015260918301939093527f44ca8087c95ad2e8ea0739f78fa06a76fc246d61762366f5b76eded713fadbb260b1808401919091528351808403909101815260d1909201909252805191012090565b6000806000612df08585612f5b565b509050600080612e01888888612c3f565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015612e3957600080fd5b505afa158015612e4d573d6000803e3d6000fd5b505050506040513d6060811015612e6357600080fd5b5080516020909101516dffffffffffffffffffffffffffff91821693501690506001600160a01b0387811690841614612e9d578082612ea0565b81815b90999098509650505050505050565b6000808411612eef5760405162461bcd60e51b81526004018080602001828103825260258152602001806131a16025913960400191505060405180910390fd5b600083118015612eff5750600082115b612f3a5760405162461bcd60e51b81526004018080602001828103825260288152602001806131796028913960400191505060405180910390fd5b82612f4b858463ffffffff61303216565b81612f5257fe5b04949350505050565b600080826001600160a01b0316846001600160a01b03161415612faf5760405162461bcd60e51b815260040180806020018281038252602581526020018061310a6025913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031610612fcf578284612fd2565b83835b90925090506001600160a01b0382166123c5576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b600081158061304d5750508082028282828161304a57fe5b04145b61309e576040805162461bcd60e51b815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b9291505056fe5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472616e7366657246726f6d206661696c65645472616e7366657248656c7065723a3a736166655472616e736665724554483a20455448207472616e73666572206661696c6564556e697377617056324c6962726172793a204944454e544943414c5f414444524553534553556e69737761705632526f757465723a20494e53554646494349454e545f425f414d4f554e54556e69737761705632526f757465723a20494e53554646494349454e545f414d4f554e54556e697377617056324c6962726172793a20494e53554646494349454e545f4c4951554944495459556e697377617056324c6962726172793a20494e53554646494349454e545f414d4f554e54556e69737761705632526f757465723a20494e53554646494349454e545f415f414d4f554e545472616e7366657248656c7065723a3a736166655472616e736665723a207472616e73666572206661696c6564a2646970667358221220d037d1cfea7dcc0e7a999070935c6cd51195e5202e4a05761690866d3b71ea9f64736f6c63430006060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000006b6071ccc534fcee7b699aab87929faf8806d5bd0000000000000000000000003da19d8f9f1208f844ede1b6ac6caf2c14a318bd0000000000000000000000002d4ddeb8b183413e9d88a98fa3dd844e34d41c5400000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a
-----Decoded View---------------
Arg [0] : _factory (address): 0x6B6071Ccc534fcee7B699aAb87929fAF8806d5bd
Arg [1] : _pylonFactory (address): 0x3dA19d8f9f1208f844edE1b6Ac6caF2c14a318bD
Arg [2] : _ptFactory (address): 0x2D4ddeB8b183413e9D88A98Fa3Dd844e34D41c54
Arg [3] : _WETH (address): 0x98878B06940aE243284CA214f92Bb71a2b032B8A
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000006b6071ccc534fcee7b699aab87929faf8806d5bd
Arg [1] : 0000000000000000000000003da19d8f9f1208f844ede1b6ac6caf2c14a318bd
Arg [2] : 0000000000000000000000002d4ddeb8b183413e9d88a98fa3dd844e34d41c54
Arg [3] : 00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$92.41
Net Worth in MOVR
Token Allocations
WMOVR
100.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| MOVR | 100.00% | $2.31 | 40.0039 | $92.41 |
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.