// SPDX-License-Identifier: MIT
pragma solidity 0.8.35;
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {Ownable2Step} from "@openzeppelin/contracts/access/Ownable2Step.sol";
import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import {Math} from "@openzeppelin/contracts/utils/math/Math.sol";
import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {MoireToken} from "./MoireToken.sol";
import {MoireLocker} from "./MoireLocker.sol";
import {
INonfungiblePositionManager,
IUniswapV3Pool,
IUniswapV3SwapCallback,
IWETH9
} from "./interfaces/IUniswapMinimal.sol";
error UnknownToken();
error AlreadyGraduated();
error ZeroAmount();
error Slippage();
error BadParams();
error InsufficientFee();
error NotPool();
error NotWeth();
error EthTransferFailed();
error PoolPriceMismatch();
/// @notice Moire: create a token, trade it on a virtual-reserve constant-product
/// curve, and graduate it into a permanently locked full-range Uniswap v3
/// position once the raise threshold is hit. Params are snapshotted per token
/// at creation — the owner can retune future launches, never live ones.
contract MoireLaunchpad is Ownable2Step, ReentrancyGuard, IUniswapV3SwapCallback {
using SafeERC20 for IERC20;
using SafeCast for uint256;
struct Curve {
address creator;
bool graduated;
uint16 curveFeeBps;
uint16 graduationFeeBps;
uint16 creatorShareBps;
uint128 vEth; // virtual ETH reserve; grows with buys
uint128 vTok; // virtual token reserve; shrinks with buys
uint128 vEth0; // starting virtual ETH (real raised = vEth - vEth0)
uint128 thresholdVEth; // graduation triggers when vEth reaches this
}
// hard caps — compiled in; the owner can never exceed these
uint16 public constant MAX_CURVE_FEE_BPS = 300;
uint16 public constant MAX_GRADUATION_FEE_BPS = 500;
uint16 public constant MIN_CREATOR_SHARE_BPS = 2500;
uint256 public constant MAX_CREATION_FEE = 0.01 ether;
uint256 public constant TOTAL_SUPPLY = 1_000_000_000e18;
uint24 public constant POOL_FEE = 10_000; // v3 1% tier
int24 public constant TICK_LOWER = -887_200; // full range at 200 tick spacing
int24 public constant TICK_UPPER = 887_200;
uint16 private constant BPS = 10_000;
INonfungiblePositionManager public immutable npm;
IWETH9 public immutable weth9;
MoireLocker public immutable locker;
address public treasury;
uint16 public curveFeeBps = 100;
uint16 public graduationFeeBps = 200;
uint16 public creatorShareBps = 5000;
uint256 public creationFee = 0;
uint128 public virtualEth = 1.4 ether;
uint128 public virtualToken = 1_073_000_000e18;
uint128 public thresholdEth = 4 ether;
uint256 public accruedFees;
mapping(address token => Curve) public curves;
address private transient expectedPool; // set only around the graduation price-fix swap
event TokenCreated(
address indexed token,
address indexed creator,
string name,
string symbol,
string metadata,
uint256 supply,
uint128 virtualEth,
uint128 virtualToken,
uint128 thresholdEth,
uint16 curveFeeBps
);
// ethAmount is the reserve delta (net of fee); fee is reported separately
event Trade(
address indexed token,
address indexed trader,
bool indexed isBuy,
uint256 ethAmount,
uint256 tokenAmount,
uint256 fee,
uint128 vEth,
uint128 vTok
);
event Graduated(
address indexed token,
address indexed pool,
uint256 positionId,
uint256 ethLp,
uint256 tokenLp,
uint256 tokensBurned
);
event FeesSwept(uint256 amount);
event TreasuryUpdated(address treasury);
event FeesUpdated(uint16 curveFeeBps, uint16 graduationFeeBps, uint16 creatorShareBps, uint256 creationFee);
event CurveShapeUpdated(uint128 virtualEth, uint128 virtualToken, uint128 thresholdEth);
constructor(address npm_, address treasury_, address owner_) Ownable(owner_) {
if (npm_ == address(0) || treasury_ == address(0)) revert BadParams();
npm = INonfungiblePositionManager(npm_);
weth9 = IWETH9(npm.WETH9());
locker = new MoireLocker(npm_);
treasury = treasury_;
}
/// @dev Only WETH unwrapping may push plain ETH here.
receive() external payable {
if (msg.sender != address(weth9)) revert NotWeth();
}
// ---- launch ----
function create(string calldata name, string calldata symbol, string calldata metadata)
external
payable
nonReentrant
returns (address token)
{
if (msg.value < creationFee) revert InsufficientFee();
if (creationFee > 0) accruedFees += creationFee;
token = address(new MoireToken(name, symbol, metadata));
Curve storage c = curves[token];
c.creator = msg.sender;
c.curveFeeBps = curveFeeBps;
c.graduationFeeBps = graduationFeeBps;
c.creatorShareBps = creatorShareBps;
c.vEth = virtualEth;
c.vTok = virtualToken;
c.vEth0 = virtualEth;
c.thresholdVEth = virtualEth + thresholdEth;
emit TokenCreated(
token, msg.sender, name, symbol, metadata, TOTAL_SUPPLY, virtualEth, virtualToken, thresholdEth, curveFeeBps
);
uint256 buyValue = msg.value - creationFee;
if (buyValue > 0) _buy(token, c, buyValue, 0);
}
// ---- curve trading ----
function buy(address token, uint256 minTokensOut) external payable nonReentrant {
Curve storage c = curves[token];
if (c.creator == address(0)) revert UnknownToken();
if (msg.value == 0) revert ZeroAmount();
_buy(token, c, msg.value, minTokensOut);
}
function _buy(address token, Curve storage c, uint256 grossIn, uint256 minTokensOut) private {
if (c.graduated) revert AlreadyGraduated();
uint256 fee = grossIn * c.curveFeeBps / BPS;
uint256 netIn = grossIn - fee;
uint256 maxNet = c.thresholdVEth - c.vEth;
uint256 refund;
if (netIn > maxNet) {
// cap the buy at the graduation threshold; refund the surplus
netIn = maxNet;
uint256 grossUsed = Math.ceilDiv(netIn * BPS, BPS - c.curveFeeBps);
fee = grossUsed - netIn;
refund = grossIn - grossUsed;
}
if (netIn == 0) revert ZeroAmount();
uint256 tokensOut = uint256(c.vTok) * netIn / (uint256(c.vEth) + netIn);
if (tokensOut < minTokensOut) revert Slippage();
c.vEth += netIn.toUint128();
c.vTok -= tokensOut.toUint128();
accruedFees += fee;
IERC20(token).safeTransfer(msg.sender, tokensOut);
emit Trade(token, msg.sender, true, netIn, tokensOut, fee, c.vEth, c.vTok);
if (c.vEth == c.thresholdVEth) _graduate(token, c);
if (refund > 0) _sendEth(msg.sender, refund);
}
function sell(address token, uint256 tokensIn, uint256 minEthOut) external nonReentrant {
Curve storage c = curves[token];
if (c.creator == address(0)) revert UnknownToken();
if (c.graduated) revert AlreadyGraduated();
if (tokensIn == 0) revert ZeroAmount();
uint256 ethOut = uint256(c.vEth) * tokensIn / (uint256(c.vTok) + tokensIn);
uint256 fee = ethOut * c.curveFeeBps / BPS;
uint256 netOut = ethOut - fee;
if (netOut < minEthOut) revert Slippage();
c.vTok += tokensIn.toUint128();
c.vEth -= ethOut.toUint128();
accruedFees += fee;
IERC20(token).safeTransferFrom(msg.sender, address(this), tokensIn);
emit Trade(token, msg.sender, false, ethOut, tokensIn, fee, c.vEth, c.vTok);
_sendEth(msg.sender, netOut);
}
// ---- graduation ----
function _graduate(address token, Curve storage c) private {
c.graduated = true;
MoireToken(token).markLaunched();
uint256 raised = c.vEth - c.vEth0;
uint256 gradFee = raised * c.graduationFeeBps / BPS;
uint256 ethLp = raised - gradFee;
accruedFees += gradFee;
// token side priced at the curve's final spot price P = vEth/vTok
uint256 tokenLp = uint256(c.vTok) * ethLp / c.vEth;
uint256 avail = IERC20(token).balanceOf(address(this));
if (tokenLp > avail) tokenLp = avail; // ponytail: guards param drift; only raises pool price (benign)
weth9.deposit{value: ethLp}();
(address t0, address t1, uint256 a0, uint256 a1) = token < address(weth9)
? (token, address(weth9), tokenLp, ethLp)
: (address(weth9), token, ethLp, tokenLp);
uint160 sqrtPriceX96 = Math.sqrt(Math.mulDiv(a1, uint256(1) << 192, a0)).toUint160();
address pool = npm.createAndInitializePoolIfNecessary(t0, t1, POOL_FEE, sqrtPriceX96);
// Pool creation is permissionless: someone may have pre-initialized this pool
// at a hostile price. A corrective swap snaps slot0 toward our target — but a
// 1-wei swap only reaches the target across EMPTY liquidity. WETH is
// unrestricted, so an attacker can plant single-sided WETH liquidity in the
// swap path to absorb the correction and leave the price rigged. So after the
// swap we re-read slot0 and REVERT unless it landed exactly on target, rather
// than mint the graduation liquidity into a manipulated pool. Reverting parks
// the token just below graduation (curve trading + sells still work, no funds
// lost); the attacker's blocking WETH sits stranded in a dead pool.
(uint160 current,,,,,,) = IUniswapV3Pool(pool).slot0();
if (current != sqrtPriceX96) {
expectedPool = pool;
IUniswapV3Pool(pool).swap(address(this), current > sqrtPriceX96, 1, sqrtPriceX96, abi.encode(t0, t1));
expectedPool = address(0);
(current,,,,,,) = IUniswapV3Pool(pool).slot0();
if (current != sqrtPriceX96) revert PoolPriceMismatch();
}
IERC20(t0).forceApprove(address(npm), a0);
IERC20(t1).forceApprove(address(npm), a1);
(uint256 positionId,,,) = npm.mint(
INonfungiblePositionManager.MintParams({
token0: t0,
token1: t1,
fee: POOL_FEE,
tickLower: TICK_LOWER,
tickUpper: TICK_UPPER,
amount0Desired: a0,
amount1Desired: a1,
// Price is verified exactly above; these floors are defense-in-depth.
// 90% tolerates full-range rounding while catching gross mispricing.
amount0Min: a0 * 9 / 10,
amount1Min: a1 * 9 / 10,
recipient: address(locker),
deadline: block.timestamp
})
);
locker.register(positionId, token, c.creator, c.creatorShareBps);
uint256 tokenDust = IERC20(token).balanceOf(address(this));
if (tokenDust > 0) IERC20(token).safeTransfer(address(0xdEaD), tokenDust);
uint256 wethDust = weth9.balanceOf(address(this));
if (wethDust > 0) {
weth9.withdraw(wethDust);
accruedFees += wethDust;
}
emit Graduated(token, pool, positionId, ethLp, tokenLp, tokenDust);
}
/// @dev Pays the (≤ few wei) input owed by the graduation price-fix swap.
function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes calldata data) external {
if (expectedPool == address(0) || msg.sender != expectedPool) revert NotPool();
(address t0, address t1) = abi.decode(data, (address, address));
if (amount0Delta > 0) IERC20(t0).safeTransfer(msg.sender, uint256(amount0Delta));
if (amount1Delta > 0) IERC20(t1).safeTransfer(msg.sender, uint256(amount1Delta));
}
// ---- fees & admin ----
function sweepFees() external nonReentrant {
uint256 amount = accruedFees;
if (amount == 0) revert ZeroAmount();
accruedFees = 0;
_sendEth(treasury, amount);
emit FeesSwept(amount);
}
function setTreasury(address treasury_) external onlyOwner {
if (treasury_ == address(0)) revert BadParams();
treasury = treasury_;
emit TreasuryUpdated(treasury_);
}
function setFees(uint16 curveFeeBps_, uint16 graduationFeeBps_, uint16 creatorShareBps_, uint256 creationFee_)
external
onlyOwner
{
if (
curveFeeBps_ > MAX_CURVE_FEE_BPS || graduationFeeBps_ > MAX_GRADUATION_FEE_BPS
|| creatorShareBps_ < MIN_CREATOR_SHARE_BPS || creatorShareBps_ > BPS || creationFee_ > MAX_CREATION_FEE
) revert BadParams();
curveFeeBps = curveFeeBps_;
graduationFeeBps = graduationFeeBps_;
creatorShareBps = creatorShareBps_;
creationFee = creationFee_;
emit FeesUpdated(curveFeeBps_, graduationFeeBps_, creatorShareBps_, creationFee_);
}
function setCurveShape(uint128 virtualEth_, uint128 virtualToken_, uint128 thresholdEth_) external onlyOwner {
if (virtualEth_ < 0.1 ether || virtualEth_ > 10 ether) revert BadParams();
if (thresholdEth_ < 1 ether || thresholdEth_ > 20 ether) revert BadParams();
// tokens sold at graduation must land in [50%, 95%] of supply
uint256 sold = uint256(virtualToken_) * thresholdEth_ / (uint256(virtualEth_) + thresholdEth_);
if (sold * 2 < TOTAL_SUPPLY || sold * 20 > TOTAL_SUPPLY * 19) revert BadParams();
virtualEth = virtualEth_;
virtualToken = virtualToken_;
thresholdEth = thresholdEth_;
emit CurveShapeUpdated(virtualEth_, virtualToken_, thresholdEth_);
}
function _sendEth(address to, uint256 amount) private {
(bool ok,) = to.call{value: amount}("");
if (!ok) revert EthTransferFailed();
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "npm_",
"type": "address",
"internalType": "address"
},
{
"name": "treasury_",
"type": "address",
"internalType": "address"
},
{
"name": "owner_",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"name": "AlreadyGraduated",
"type": "error",
"inputs": []
},
{
"name": "BadParams",
"type": "error",
"inputs": []
},
{
"name": "EthTransferFailed",
"type": "error",
"inputs": []
},
{
"name": "InsufficientFee",
"type": "error",
"inputs": []
},
{
"name": "NotPool",
"type": "error",
"inputs": []
},
{
"name": "NotWeth",
"type": "error",
"inputs": []
},
{
"name": "OwnableInvalidOwner",
"type": "error",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "OwnableUnauthorizedAccount",
"type": "error",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "PoolPriceMismatch",
"type": "error",
"inputs": []
},
{
"name": "ReentrancyGuardReentrantCall",
"type": "error",
"inputs": []
},
{
"name": "SafeCastOverflowedUintDowncast",
"type": "error",
"inputs": [
{
"name": "bits",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "SafeERC20FailedOperation",
"type": "error",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "Slippage",
"type": "error",
"inputs": []
},
{
"name": "UnknownToken",
"type": "error",
"inputs": []
},
{
"name": "ZeroAmount",
"type": "error",
"inputs": []
},
{
"name": "CurveShapeUpdated",
"type": "event",
"inputs": [
{
"name": "virtualEth",
"type": "uint128",
"indexed": false,
"internalType": "uint128"
},
{
"name": "virtualToken",
"type": "uint128",
"indexed": false,
"internalType": "uint128"
},
{
"name": "thresholdEth",
"type": "uint128",
"indexed": false,
"internalType": "uint128"
}
],
"anonymous": false
},
{
"name": "FeesSwept",
"type": "event",
"inputs": [
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "FeesUpdated",
"type": "event",
"inputs": [
{
"name": "curveFeeBps",
"type": "uint16",
"indexed": false,
"internalType": "uint16"
},
{
"name": "graduationFeeBps",
"type": "uint16",
"indexed": false,
"internalType": "uint16"
},
{
"name": "creatorShareBps",
"type": "uint16",
"indexed": false,
"internalType": "uint16"
},
{
"name": "creationFee",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Graduated",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "pool",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "positionId",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "ethLp",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "tokenLp",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "tokensBurned",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "OwnershipTransferStarted",
"type": "event",
"inputs": [
{
"name": "previousOwner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "OwnershipTransferred",
"type": "event",
"inputs": [
{
"name": "previousOwner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "TokenCreated",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "creator",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "name",
"type": "string",
"indexed": false,
"internalType": "string"
},
{
"name": "symbol",
"type": "string",
"indexed": false,
"internalType": "string"
},
{
"name": "metadata",
"type": "string",
"indexed": false,
"internalType": "string"
},
{
"name": "supply",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "virtualEth",
"type": "uint128",
"indexed": false,
"internalType": "uint128"
},
{
"name": "virtualToken",
"type": "uint128",
"indexed": false,
"internalType": "uint128"
},
{
"name": "thresholdEth",
"type": "uint128",
"indexed": false,
"internalType": "uint128"
},
{
"name": "curveFeeBps",
"type": "uint16",
"indexed": false,
"internalType": "uint16"
}
],
"anonymous": false
},
{
"name": "Trade",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "trader",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "isBuy",
"type": "bool",
"indexed": true,
"internalType": "bool"
},
{
"name": "ethAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "tokenAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "fee",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "vEth",
"type": "uint128",
"indexed": false,
"internalType": "uint128"
},
{
"name": "vTok",
"type": "uint128",
"indexed": false,
"internalType": "uint128"
}
],
"anonymous": false
},
{
"name": "TreasuryUpdated",
"type": "event",
"inputs": [
{
"name": "treasury",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "MAX_CREATION_FEE",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "MAX_CURVE_FEE_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "MAX_GRADUATION_FEE_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "MIN_CREATOR_SHARE_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "POOL_FEE",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint24",
"internalType": "uint24"
}
],
"stateMutability": "view"
},
{
"name": "TICK_LOWER",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "int24",
"internalType": "int24"
}
],
"stateMutability": "view"
},
{
"name": "TICK_UPPER",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "int24",
"internalType": "int24"
}
],
"stateMutability": "view"
},
{
"name": "TOTAL_SUPPLY",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "acceptOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "accruedFees",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "buy",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "minTokensOut",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "create",
"type": "function",
"inputs": [
{
"name": "name",
"type": "string",
"internalType": "string"
},
{
"name": "symbol",
"type": "string",
"internalType": "string"
},
{
"name": "metadata",
"type": "string",
"internalType": "string"
}
],
"outputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "payable"
},
{
"name": "creationFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "creatorShareBps",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "curveFeeBps",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "curves",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "creator",
"type": "address",
"internalType": "address"
},
{
"name": "graduated",
"type": "bool",
"internalType": "bool"
},
{
"name": "curveFeeBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "graduationFeeBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "creatorShareBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "vEth",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "vTok",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "vEth0",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "thresholdVEth",
"type": "uint128",
"internalType": "uint128"
}
],
"stateMutability": "view"
},
{
"name": "graduationFeeBps",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "locker",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract MoireLocker"
}
],
"stateMutability": "view"
},
{
"name": "npm",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract INonfungiblePositionManager"
}
],
"stateMutability": "view"
},
{
"name": "owner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "pendingOwner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "renounceOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "sell",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "tokensIn",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "minEthOut",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setCurveShape",
"type": "function",
"inputs": [
{
"name": "virtualEth_",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "virtualToken_",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "thresholdEth_",
"type": "uint128",
"internalType": "uint128"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setFees",
"type": "function",
"inputs": [
{
"name": "curveFeeBps_",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "graduationFeeBps_",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "creatorShareBps_",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "creationFee_",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setTreasury",
"type": "function",
"inputs": [
{
"name": "treasury_",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "sweepFees",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "thresholdEth",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint128",
"internalType": "uint128"
}
],
"stateMutability": "view"
},
{
"name": "transferOwnership",
"type": "function",
"inputs": [
{
"name": "newOwner",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "treasury",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "uniswapV3SwapCallback",
"type": "function",
"inputs": [
{
"name": "amount0Delta",
"type": "int256",
"internalType": "int256"
},
{
"name": "amount1Delta",
"type": "int256",
"internalType": "int256"
},
{
"name": "data",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "virtualEth",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint128",
"internalType": "uint128"
}
],
"stateMutability": "view"
},
{
"name": "virtualToken",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint128",
"internalType": "uint128"
}
],
"stateMutability": "view"
},
{
"name": "weth9",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IWETH9"
}
],
"stateMutability": "view"
},
{
"type": "receive",
"stateMutability": "payable"
}
]0x60e0806040523461032057606081614e7d803803809161001f828561035f565b8339810103126103205761003281610382565b61003e60208301610382565b916001600160a01b039061005490604001610382565b1690811561034c57600180546001600160a01b03199081169091555f80549182168417815560405193916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a360017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556002805465ffffffffffff60a01b19166504e20032001960a21b1790555f6003557b037790968dc8efffd10000000000000000000000136dcc951d8c000060045560058054673782dace9d9000006001600160801b03199091161790556001600160a01b0316908115801561033b575b61032c5760808290526312a9293f60e21b8152602081600481855afa9081156102cf575f916102ee575b506001600160a01b031660a052604051906109be8083016001600160401b038111848210176102da5760209284926144bf843981520301905ff080156102cf5760c052600280546001600160a01b0319166001600160a01b039290921691909117905560405161412890816103978239608051818181610aae01528181610b3201528181610b6801528181610cf501528181611505015281816120c9015281816121420152818161217e0152612312015260a051818181601c0152818161095501528181610998015281816109d401528181610a0901528181610e1601528181610ea001528181610eec015281816112a401528181611f7001528181611fb301528181611ff70152818161203401528181612443015281816124dc015281816125260152818161282c01526129ec015260c0518181816105e401528181610c1601528181610d2901528181610d9a015281816122330152818161234601526123bd0152f35b6040513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b90506020813d602011610324575b816103096020938361035f565b810103126103205761031a90610382565b5f61016a565b5f80fd5b3d91506102fc565b63019af63760e01b5f5260045ffd5b506001600160a01b03831615610140565b631e4fbdf760e01b5f525f60045260245ffd5b601f909101601f19168101906001600160401b038211908210176102da57604052565b51906001600160a01b03821682036103205756fe608080604052600436101561005b575b50361561001a575f80fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361004c57005b63c11f59c560e01b5f5260045ffd5b5f905f3560e01c9081631f514c5214612b7e57508063218d578f14612b62578063239f3af714612b455780632cc3dc6e14612a975780632e39757214612a7b57806335625a7d14612a5f57806347377d9214612a415780634bd387e114612a1b57806350879c1c146129d7578063545193c5146129b15780635d28560a146119bf57806361d027b314611996578063682c20581461197857806369d7954c146118405780636a2724621461161e578063715018a6146115b957806379ba5097146115345780637f1e9ef6146114ef57806387cb5f94146114cd5780638da5cb5b146114a6578063902ccca514611481578063902d55a51461145a578063b1a25c9414611435578063bf04b8a114611410578063cce7ec131461069b578063d113b95c14610613578063d7b96d4e146105ce578063dce0b4e4146105b0578063dd1b9c4a14610593578063e30c39781461056a578063f0f44260146104e3578063f2fde38b14610476578063fa461e33146103985763fcc3fa6f0361000f5734610395576060366003190112610395576004356001600160801b038116809103610393576024356001600160801b03811680820361038f57604435916001600160801b03831680930361038b5761022f612d1e565b67016345785d8a00008410801561037a575b61030957670de0b6b3a764000083108015610368575b610309576102786102688484612c51565b6102728587612bdf565b90612c64565b8060011b90801591818104600214831715610354576b033b2e3c9fd0803ce800000011918215610318575b505061030957917fc20acea1d84cadf857e246700cecb16fbf5cd1ed9c341473993ae0c72477249093916060936001600160801b03199060801b168317600455816001600160801b0319600554161760055560405192835260208301526040820152a180f35b63019af63760e01b8552600485fd5b909150601482029182046014141715610340576b3d646e7fdc79848538000000105f806102a3565b634e487b7160e01b86526011600452602486fd5b634e487b7160e01b88526011600452602488fd5b506801158e460913d000008311610257565b50678ac7230489e800008411610241565b8480fd5b8380fd5b505b80fd5b50346103955760603660031901126103955760043560243560443567ffffffffffffffff811161038f576103d0903690600401612bb1565b845c6001600160a01b0316158015610462575b61045357816040918101031261038f57610408602061040183612cd2565b9201612cd2565b92848113610438575b505082811361041e578280f35b6104329133906001600160a01b0316612e8b565b5f808280f35b61044c9133906001600160a01b0316612e8b565b5f80610411565b636f61f64160e01b8552600485fd5b5033855c6001600160a01b031614156103e3565b503461039557602036600319011261039557610490612b9b565b610498612d1e565b600180546001600160a01b0319166001600160a01b0392831690811790915582549091167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227008380a380f35b5034610395576020366003190112610395576104fd612b9b565b610505612d1e565b6001600160a01b0316801561055b576020817f7dae230f18360d76a040c81f050aa14eb9d6dc7901b20fc5d855e2a20fe814d1926bffffffffffffffffffffffff60a01b6002541617600255604051908152a180f35b63019af63760e01b8252600482fd5b50346103955780600319360112610395576001546040516001600160a01b039091168152602090f35b503461039557806003193601126103955760206040516127108152f35b50346103955780600319360112610395576020600354604051908152f35b50346103955780600319360112610395576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b503461039557806003193601126103955761062c612ce6565b600654801561068c5760207fc1d94a7c9f6a6bc92f1ca076189cb2bccd07ce7193ac9423e7a3f9fde840139d91836006556106718160018060a01b0360025416612db4565b604051908152a160015f5160206140d35f395f51905f525580f35b631f2a200560e01b8252600482fd5b506040366003190112610395576106b0612b9b565b906106b9612ce6565b6001600160a01b038281168083526007602052604083208054909216156114015734156113f257815460ff8160a01c166113e35760a81c61ffff16916127106107028434612c51565b049061070e8234612c2c565b6002820190815460801c600184019485546001600160801b036107348183168095612c82565b16988a99808611611363575b5050831561135457610758846107629260801c612c51565b6102728585612bdf565b916024358310611345577fa1f66e4bd561f4970224fa6654fa58993ac36dfd2b13479a293eba20756cff8c600193926001600160801b036107ad8b946107a789612d44565b90612c0c565b166001600160801b03198a54161789556107f66107d66107cc86612d44565b8b5460801c612c82565b8a546001600160801b031660809190911b6001600160801b031916178a55565b61080281600654612bdf565b600655610810843385612e8b565b8854936108346001600160801b0386169788604051948594339960801c9386612ca2565b0390a4815460801c14610874575b5050505080919250610864575b5060015f5160206140d35f395f51905f525580f35b61086e9033612db4565b5f61084f565b815460ff60a01b1916600160a01b178255833b156112e7576040516375ae61eb60e01b8152868160048183895af180156112eb57908791611330575b50506001600160801b036108cf61091e92828087541691541690612c82565b16926108fd6108f46127106108ec61ffff875460b81c1688612c51565b048096612c2c565b94600654612bdf565b600655546001600160801b03610916858360801c612c51565b911690612c64565b956040516370a0823160e01b8152306004820152602081602481885afa9081156112eb5787916112fe575b508088116112f6575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163b156112e757604051630d0e30db60e41b81528681600481877f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af180156112eb579087916112d2575b50507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684101561129f57919586927f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169290825b610a47610a42828c612f4f565b612ff7565b996001600160a01b038b1161128657896020999a9b60018060a01b0316998a946084604051809481936309f56ab160e11b835260018060a01b03169b8c600484015260018060a01b0316988960248401526127106044840152606483015260018060a01b037f0000000000000000000000000000000000000000000000000000000000000000165af190811561127b578c91611239575b50604051633850c7bd60e01b81526001600160a01b039190911699908c60e0826004818f5afa801561122c5789928291611207575b506001600160a01b03168c8482036110a8575b50610b629350859250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316905088613119565b610b96817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685613119565b6009820291808304600914811517156110945760098202938285046009148315171561108057928c959492600a949285936040519a610bd48c612d75565b8b5260208b015261271060408b0152620d899f1960608b0152620d89a060808b015260a08a015260c08901520460e08701520461010085015260018060a01b037f0000000000000000000000000000000000000000000000000000000000000000166101208501524261014085015261014060405194634418b22b60e11b865260018060a01b03815116600487015260018060a01b03602082015116602487015262ffffff6040820151166044870152606081015160020b6064870152608081015160020b608487015260a081015160a487015260c081015160c487015260e081015160e487015261010081015161010487015260018060a01b03610120820151166101248701520151610144850152608084610164818560018060a01b037f0000000000000000000000000000000000000000000000000000000000000000165af1938415610f84578294611037575b50547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163b156103935761ffff604051916306122f7b60e11b835285600484015287602484015260018060a01b038116604484015260c81c16606482015281816084818360018060a01b037f0000000000000000000000000000000000000000000000000000000000000000165af18015610f845761101e575b50506040516370a0823160e01b815230600482015290602082602481885afa918215611013578892610fdf575b5081610fd0575b6040516370a0823160e01b81523060048201526020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115610fc5578991610f8f575b5080610e9e575b5090608092917f8d0453dc55ff49f0c8c7ca816943faff3ced84a6a1a9b3831f8bcf12b4d700c394604051938452602084015260408301526060820152a381905f808080610842565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163b15610f8057604051632e1a7d4d60e01b81526004810182905289908181602481837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af18015610f8457610f63575b5050907f8d0453dc55ff49f0c8c7ca816943faff3ced84a6a1a9b3831f8bcf12b4d700c394610f566080959493600654612bdf565b6006559450909192610e55565b81610f72919695949396612d92565b610f8057909192885f610f21565b8880fd5b6040513d84823e3d90fd5b90506020813d602011610fbd575b81610faa60209383612d92565b81010312610fb957515f610e4e565b5f80fd5b3d9150610f9d565b6040513d8b823e3d90fd5b610fda8286612e0f565b610dfb565b9091506020813d60201161100b575b81610ffb60209383612d92565b81010312610fb95751905f610df4565b3d9150610fee565b6040513d8a823e3d90fd5b8161102891612d92565b61103357865f610dc7565b8680fd5b9093506080813d608011611078575b8161105360809383612d92565b8101031261039357602081519101516001600160801b0381160361039357925f610d25565b3d9150611046565b634e487b7160e01b8d52601160045260248dfd5b634e487b7160e01b8c52601160045260248cfd5b6040928590805c6001600160a01b0319168317815d60c4855194602086019788528b878701528686526110dc606087612d92565b865197889687958693630251596160e31b8552306004860152116024840152600160448401528a606484015260a060848401525180918160a48501528484015e8181018301849052601f01601f191681010301925af180156111cd576111d8575b508b5c6001600160a01b0319168c5d604051633850c7bd60e01b815260e0816004818e5afa9081156111cd578d91611198575b506001600160a01b031603611189575f868c828c610b26565b6334c4589960e01b8b5260048bfd5b6111ba915060e03d60e0116111c6575b6111b28183612d92565b810190612ed9565b5050505050505f611170565b503d6111a8565b6040513d8f823e3d90fd5b604090813d8311611200575b6111ee8183612d92565b810103126111fc575f61113d565b8b80fd5b503d6111e4565b611220915060e03d60e0116111c6576111b28183612d92565b5050505050505f610b13565b50604051903d90823e3d90fd5b90506020813d602011611273575b8161125460209383612d92565b810103126111fc57516001600160a01b03811681036111fc575f610ade565b3d9150611247565b6040513d8e823e3d90fd5b6306dfcc6560e41b8a5260a060045260248b905260448afd5b9086907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684610a35565b816112dc91612d92565b6112e757855f6109d0565b8580fd5b6040513d89823e3d90fd5b96505f610952565b90506020813d602011611328575b8161131960209383612d92565b81010312610fb957515f610949565b3d915061130c565b8161133a91612d92565b6112e757855f6108b0565b6307dd37f760e41b8a5260048afd5b631f2a200560e01b8a5260048afd5b925093509750809261137482612c39565b906127100361ffff81116113cf5761ffff1680156113bd576113b59160016113a26113ae935f198401612c64565b01901515029283612c2c565b9134612c2c565b975f80610740565b634e487b718b5260126020526024601cfd5b634e487b7160e01b8b52601160045260248bfd5b63e6a0d45f60e01b8452600484fd5b631f2a200560e01b8352600483fd5b638698bf3760e01b8352600483fd5b5034610395578060031936011261039557602061ffff60025460b01c16604051908152f35b5034610395578060031936011261039557602061ffff60025460c01c16604051908152f35b503461039557806003193601126103955760206040516b033b2e3c9fd0803ce80000008152f35b5034610395578060031936011261039557602061ffff60025460a01c16604051908152f35b5034610395578060031936011261039557546040516001600160a01b039091168152602090f35b50346103955780600319360112610395576020604051662386f26fc100008152f35b50346103955780600319360112610395576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5034610395578060031936011261039557600154336001600160a01b03909116036115a657600180546001600160a01b0319908116909155815433918116821783556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b63118cdaa760e01b815233600452602490fd5b50346103955780600319360112610395576115d2612d1e565b600180546001600160a01b03199081169091558154908116825581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461039557606036600319011261039557611638612b9b565b9060243591611645612ce6565b6001600160a01b039081168083526007602052604083208054919491928316156118315760ff8360a01c166113e3578115611822576001018054926127106116b961ffff6116ae61169f876001600160801b038a16612c51565b9760801c97610272888a612bdf565b9360a81c1683612c51565b04906116c58282612c2c565b946044358610611813576116df6116ff916107a787612d44565b84546001600160801b031660809190911b6001600160801b031916178455565b6001600160801b0361171c61171383612d44565b82865416612c82565b166001600160801b031984541617835561173882600654612bdf565b6006556040516323b872dd60e01b87523360045230602452604485905292602087606481808c5af160018851148116156117f4575b8460405287606052156117e05792806117c38899947fa1f66e4bd561f4970224fa6654fa58993ac36dfd2b13479a293eba20756cff8c946117cc9a9897549133986001600160801b038460801c94169286612ca2565b0390a433612db4565b60015f5160206140d35f395f51905f525580f35b635274afe760e01b87526004889052602487fd5b600181151661180a57883b15153d15161661176d565b843d89823e3d90fd5b6307dd37f760e41b8752600487fd5b631f2a200560e01b8452600484fd5b638698bf3760e01b8452600484fd5b50346103955760803660031901126103955760043561ffff8116908181036119745760243561ffff811680820361038b576044359261ffff841692838503611033576064359461188e612d1e565b61012c87118015611969575b801561195e575b8015611953575b8015611943575b611934579160809593917f62fc48cf8c3fe38766644371ae4a46a51d0edde9ff642d479a10a6bd8c631e089795936002549061ffff60c01b9060c01b169261ffff60a01b9060a01b169065ffffffffffff60a01b1916179061ffff60b01b9060b01b16171760025582600355604051938452602084015260408301526060820152a180f35b63019af63760e01b8852600488fd5b50662386f26fc1000086116118af565b5061271085116118a8565b506109c485106118a1565b506101f4841161189a565b8280fd5b50346103955780600319360112610395576020600654604051908152f35b50346103955780600319360112610395576002546040516001600160a01b039091168152602090f35b506060366003190112610fb95760043567ffffffffffffffff8111610fb9576119ec903690600401612bb1565b60243567ffffffffffffffff8111610fb957611a0c903690600401612bb1565b939060443567ffffffffffffffff8111610fb957611a2e903690600401612bb1565b939091611a39612ce6565b6003548034106129a3578061298e575b50604051610ec48082019082821067ffffffffffffffff83111761297a578291611aa69161320f843960608152611a96611a8760608301888d612bec565b82810360208401528c87612bec565b9060408183039101528887612bec565b03905ff09586156128d0576001600160a01b0387165f90815260076020526040902080546001600160a01b031981163390811783556002805461ffff60a81b198316600162ffff0160a01b0319851617600891821b61ffff60a81b169081178655825463ffffffff60a81b198516600164ffffffff0160a01b0319871617821790831b61ffff60b81b169081178755925465ffffffffffff60a81b19909416600166ffffffffffff0160a01b03199095169490941790931717911b61ffff60c81b16178155600480546001830180546001600160801b03199081166001600160801b03939093169283178255925490921617815590989094611c62906001600160801b0360045416986001600160801b0360028d019a166001600160801b03198b5416178a55611c10611bf06001600160801b03600454166001600160801b036005541690612c0c565b8b546001600160801b031660809190911b6001600160801b031916178b55565b611c54600454966001600160801b036005541695611c4661ffff60025460a01c16986040519b6101008d526101008d0191612bec565b918a830360208c0152612bec565b918783036040890152612bec565b926b033b2e3c9fd0803ce800000060608601526001600160801b038116608086015260801c60a085015260c084015260e08301527f30fa88fb3f28659bbb54f2e869db6009a4799abccc7690a56f5c30743f9a1ba433928060018060a01b038916930390a3611cd360035434612c2c565b9283611cff575b60015f5160206140d35f395f51905f52556040516001600160a01b0386168152602090f35b855460ff8160a01c1661296b5760a81c61ffff1693612710611d218683612c51565b0490611d2d8282612c2c565b91835460801c8554926001600160801b03611d4b8186168094612c82565b16905f998287116128ea575b50505083156128db577fa1f66e4bd561f4970224fa6654fa58993ac36dfd2b13479a293eba20756cff8c89926001600160801b03611db4611daa611da08960019960801c612c51565b6102728a88612bdf565b946107a789612d44565b166001600160801b0319895416178855611dfd611ddd611dd385612d44565b8a5460801c612c82565b89546001600160801b031660809190911b6001600160801b031916178955565b611e0981600654612bdf565b600655611e1e8333878060a01b038716612e8b565b875492611e4a6001600160801b038516978860405194859433998b8060a01b03169860801c9386612ca2565b0390a4815460801c14611e7d575b5050506020925080611e6d575b808080611cda565b611e779033612db4565b5f611e65565b855460ff60a01b1916600160a01b178655919392916001600160a01b0384163b15610fb9576040516375ae61eb60e01b81525f81600481836001600160a01b038a165af180156128d0576128b4575b506001600160801b03611eea611f3192828086541691541690612c82565b1691611f18611f0f612710611f0761ffff8b5460b81c1687612c51565b048095612c2c565b93600654612bdf565b600655546001600160801b03610916848360801c612c51565b6040516370a0823160e01b81523060048201526020816024816001600160a01b0389165afa90811561286f578691612882575b5080821161287a575b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163b1561038b57604051630d0e30db60e41b81528581600481867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1801561286f5790869161285a575b50506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169085161015612822576001600160a01b038481169690839083907f0000000000000000000000000000000000000000000000000000000000000000165b612062610a428385612f4f565b996001600160a01b038b11611286579860849798996020829c60018060a01b0316916040519a8b80926309f56ab160e11b825260018060a01b03169586600483015260018060a01b0388166024830152612710604483015285606483015260018060a01b037f0000000000000000000000000000000000000000000000000000000000000000165af198891561127b578c996127de575b50604051633850c7bd60e01b815260e0816004816001600160a01b038e165afa9081156111cd578d916127b9575b506001600160a01b0316818103612667575b506121709050837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031683613119565b6121a7846001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116908516613119565b826009810204600914831517156113cf57836009810204600914841517156113cf578a93600a60096121e59a99989795829582956040519d8e612d75565b8d5260018060a01b031660208d015261271060408d0152620d899f1960608d0152620d89a060808d01528060a08d01528360c08d0152020460e08a0152020461010087015260018060a01b037f0000000000000000000000000000000000000000000000000000000000000000166101208701524261014087015261014060405196634418b22b60e11b885260018060a01b03815116600489015260018060a01b03602082015116602489015262ffffff6040820151166044890152606081015160020b6064890152608081015160020b608489015260a081015160a489015260c081015160c489015260e081015160e489015261010081015161010489015260018060a01b03610120820151166101248901520151610144870152608086610164818560018060a01b037f0000000000000000000000000000000000000000000000000000000000000000165af1958615610f8457829661261e575b50547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163b15610393576040516306122f7b60e11b8152600481018790526001600160a01b038981166024830152808316604483015260c89290921c61ffff1660648201529082908290608490829084907f0000000000000000000000000000000000000000000000000000000000000000165af18015610f8457612609575b50506040516370a0823160e01b8152306004820152916020836024816001600160a01b038b165afa9283156110135788936125d5575b50826125bd575b6040516370a0823160e01b8152306004820152976020896024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa98891561122c578199612589575b50886124da575b5060209750604051948552878501526040840152606083015260018060a01b0316907f8d0453dc55ff49f0c8c7ca816943faff3ced84a6a1a9b3831f8bcf12b4d700c3608060018060a01b03861692a35f8080611e58565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163b1561039557604051632e1a7d4d60e01b8152600481018a90528181602481837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af18015610f8457612574575b505061256b602098600654612bdf565b6006555f612482565b61257f828092612d92565b610395578061255b565b9098506020813d6020116125b5575b816125a560209383612d92565b81010312610fb95751975f61247b565b3d9150612598565b6125d0836001600160a01b038916612e0f565b612427565b9092506020813d602011612601575b816125f160209383612d92565b81010312610fb95751915f612420565b3d91506125e4565b8161261391612d92565b61103357865f6123ea565b9095506080813d60801161265f575b8161263a60809383612d92565b8101031261039357602081519101516001600160801b0381160361039357945f612342565b3d915061262d565b8c5c6001600160a01b0319166001600160a01b038b16178d5d60408d8b8483519260c4602085019689885260018060a01b038b16878701528686526126ad606087612d92565b865197889687958693630251596160e31b8552306004860152116024840152600160448401528a606484015260a060848401525180918160a48501528484015e8181018301849052601f01601f191681010301926001600160a01b03165af180156111cd5761278e575b508b5c6001600160a01b0319168c5d604051633850c7bd60e01b815260e0816004816001600160a01b038e165afa9081156111cd578d91612769575b506001600160a01b031603611189575f80612139565b612782915060e03d60e0116111c6576111b28183612d92565b5050505050505f612753565b604090813d83116127b2575b6127a48183612d92565b810103126111fc575f612717565b503d61279a565b6127d2915060e03d60e0116111c6576111b28183612d92565b5050505050505f612127565b9098506020813d60201161281a575b816127fa60209383612d92565b810103126111fc57516001600160a01b03811681036111fc57975f6120f9565b3d91506127ed565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169690829084908716612055565b8161286491612d92565b61038b57845f611feb565b6040513d88823e3d90fd5b90505f611f6d565b90506020813d6020116128ac575b8161289d60209383612d92565b81010312610fb957515f611f64565b3d9150612890565b6128c19195505f90612d92565b5f936001600160801b03611ecc565b6040513d5f823e3d90fd5b631f2a200560e01b5f5260045ffd5b9299509250809450936128fc81612c39565b916127100361ffff81116129575761ffff1680156129455761293c92600161292a612936935f198401612c64565b01901515029182612c2c565b92612c2c565b965f8080611d57565b634e487b715f5260126020526024601cfd5b634e487b7160e01b5f52601160045260245ffd5b63e6a0d45f60e01b5f5260045ffd5b634e487b7160e01b5f52604160045260245ffd5b61299a90600654612bdf565b6006555f611a49565b62976f7560e21b5f5260045ffd5b34610fb9575f366003190112610fb95760206001600160801b0360055416604051908152f35b34610fb9575f366003190112610fb9576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610fb9575f366003190112610fb95760206001600160801b0360045416604051908152f35b34610fb9575f366003190112610fb9576020604051620d899f198152f35b34610fb9575f366003190112610fb95760206040516101f48152f35b34610fb9575f366003190112610fb95760206040516109c48152f35b34610fb9576020366003190112610fb9576001600160a01b03612ab8612b9b565b165f52600760205261012060405f20805490600260018201549101549061ffff6040519360018060a01b038116855260ff8160a01c1615156020860152818160a81c166040860152818160b81c16606086015260c81c1660808401526001600160801b03811660a084015260801c60c08301526001600160801b03811660e083015260801c610100820152f35b34610fb9575f366003190112610fb9576020604051620d89a08152f35b34610fb9575f366003190112610fb957602060405161012c8152f35b34610fb9575f366003190112610fb95760209060045460801c8152f35b600435906001600160a01b0382168203610fb957565b9181601f84011215610fb95782359167ffffffffffffffff8311610fb95760208381860195010111610fb957565b9190820180921161295757565b908060209392818452848401375f828201840152601f01601f1916010190565b906001600160801b03809116911601906001600160801b03821161295757565b9190820391821161295757565b90612710820291808304612710149015171561295757565b8181029291811591840414171561295757565b8115612c6e570490565b634e487b7160e01b5f52601260045260245ffd5b906001600160801b03809116911603906001600160801b03821161295757565b908152602081019190915260408101919091526001600160801b0391821660608201529116608082015260a00190565b35906001600160a01b0382168203610fb957565b60025f5160206140d35f395f51905f525414612d0f5760025f5160206140d35f395f51905f5255565b633ee5aeb560e01b5f5260045ffd5b5f546001600160a01b03163303612d3157565b63118cdaa760e01b5f523360045260245ffd5b6001600160801b038111612d5e576001600160801b031690565b6306dfcc6560e41b5f52608060045260245260445ffd5b610160810190811067ffffffffffffffff82111761297a57604052565b90601f8019910116810190811067ffffffffffffffff82111761297a57604052565b5f80809381935af13d15612e0a573d67ffffffffffffffff811161297a5760405190612dea601f8201601f191660200183612d92565b81525f60203d92013e5b15612dfb57565b630db2c7f160e31b5f5260045ffd5b612df4565b906040519063a9059cbb60e01b5f5261dead60045260245260205f60448180865af19060015f5114821615612e6a575b60405215612e4a5750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b906001811516612e8257823b15153d15161690612e3f565b503d5f823e3d90fd5b916040519163a9059cbb60e01b5f5260018060a01b031660045260245260205f60448180865af19060015f5114821615612e6a5760405215612e4a5750565b519061ffff82168203610fb957565b908160e0910312610fb95780516001600160a01b0381168103610fb9579160208201518060020b8103610fb95791612f1360408201612eca565b91612f2060608301612eca565b91612f2d60808201612eca565b9160a082015160ff81168103610fb95760c0909201518015158103610fb95790565b5f19600160c01b8209918160c01b91828085109403938085039414612fe85783821115612fd0578190600160c01b9009815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b50634e487b715f52156003026011186020526024601cfd5b5090612ff49250612c64565b90565b6001811115612ff457806001600160801b821015613108575b600482600160401b6130ba9410156130fb575b6401000000008110156130ee575b620100008110156130e1575b6101008110156130d5575b60108110156130c9575b10156130c1575b60030260011c6130698184612c64565b0160011c6130778184612c64565b0160011c6130858184612c64565b0160011c6130938184612c64565b0160011c6130a18184612c64565b0160011c6130af8184612c64565b0160011c8092612c64565b8111900390565b60011b613059565b811c9160021b91613052565b60081c91811b91613048565b60101c9160081b9161303d565b60201c9160101b91613031565b60401c9160201b91613023565b5050608081901c600160401b613010565b916040519163095ea7b360e01b5f5260018060a01b031691826004528160245260205f60448180885af19060015f51148216156131ff575b6040521561315e57505050565b60405163095ea7b360e01b5f52826004525f60245260205f60448180885af19060015f51148216156131e7575b604052156131c9576040519163095ea7b360e01b5f5260045260245260205f60448180865af19060015f5114821615612e6a5760405215612e4a5750565b635274afe760e01b5f9081526001600160a01b038416600452602490fd5b906001811516612e8257843b15153d1516169061318b565b90843b15153d1516169061315156fe60a0604052346105ac57610ec480380380610019816105b0565b92833981016060828203126105ac5781516001600160401b0381116105ac57816100449184016105d5565b60208301519092906001600160401b0381116105ac57826100669183016105d5565b60408201519092906001600160401b0381116105ac5761008692016105d5565b82516001600160401b0381116103ce57600354600181811c911680156105a2575b60208210146103b057601f8111610534575b506020601f82116001146104d157819293945f926104c6575b50508160011b915f199060031b1c1916176003555b81516001600160401b0381116103ce57600454600181811c911680156104bc575b60208210146103b057601f811161044e575b50602092601f82116001146103ed57928192935f926103e2575b50508160011b915f199060031b1c1916176004555b3360805280516001600160401b0381116103ce57600554600181811c911680156103c4575b60208210146103b057601f8111610341575b50602091601f82116001146102e1579181925f926102d6575b50508160011b915f199060031b1c1916176005555b33156102c35760ff6006541615806102bc575b806102a8575b80610293575b610284576002546b033b2e3c9fd0803ce8000000810180911161027057600255335f525f60205260405f206b033b2e3c9fd0803ce800000081540190556040516b033b2e3c9fd0803ce800000081525f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60203393a360405161089d908161062782396080518181816102b30152818161068b015281816107d601526108090152f35b634e487b7160e01b5f52601160045260245ffd5b637413882f60e11b5f5260045ffd5b506080516001600160a01b03163314156101cd565b506080516001600160a01b031615156101c7565b505f6101c1565b63ec442f0560e01b5f525f60045260245ffd5b015190505f80610199565b601f1982169260055f52805f20915f5b85811061032957508360019510610311575b505050811b016005556101ae565b01515f1960f88460031b161c191690555f8080610303565b919260206001819286850151815501940192016102f1565b818111156101805760055f819052601f8301901c7f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0602084106103a8575b81601f9101920160051c03905f5b82811061039b575050610180565b5f8282015560010161038d565b5f915061037f565b634e487b7160e01b5f52602260045260245ffd5b90607f169061016e565b634e487b7160e01b5f52604160045260245ffd5b015190505f80610134565b601f1982169360045f52805f20915f5b868110610436575083600195961061041e575b505050811b01600455610149565b01515f1960f88460031b161c191690555f8080610410565b919260206001819286850151815501940192016103fd565b8181111561011a5760045f52601f820160051c7f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b602084106104b4575b81601f9101920160051c03905f5b8281106104a757505061011a565b5f82820155600101610499565b5f915061048b565b90607f1690610108565b015190505f806100d2565b601f1982169060035f52805f20915f5b81811061051c57509583600195969710610504575b505050811b016003556100e7565b01515f1960f88460031b161c191690555f80806104f6565b9192602060018192868b0151815501940192016104e1565b818111156100b95760035f52601f820160051c7fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b6020841061059a575b81601f9101920160051c03905f5b82811061058d5750506100b9565b5f8282015560010161057f565b5f9150610571565b90607f16906100a7565b5f80fd5b6040519190601f01601f191682016001600160401b038111838210176103ce57604052565b81601f820112156105ac578051906001600160401b0382116103ce57610604601f8301601f19166020016105b0565b92828452602083830101116105ac57815f9260208093018386015e830101529056fe6080806040526004361015610012575f80fd5b5f3560e01c90816302669b52146106795750806306fdde03146105a4578063095ea7b31461052257806318160ddd1461050557806323b872dd14610426578063313ce5671461040b578063392f37e91461033657806370a08231146102ff57806375ae61eb146102a15780638091f3bf1461027f578063902d55a51461025957806395d89b411461013b578063a9059cbb1461010a5763dd62ed3e146100b6575f80fd5b34610106576040366003190112610106576100cf6106e4565b6100d76106fa565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b5f80fd5b34610106576040366003190112610106576101306101266106e4565b6024359033610710565b602060405160018152f35b34610106575f366003190112610106576040515f6004548060011c9060018116801561024f575b60208310811461023b5782855290811561021f57506001146101c9575b50819003601f01601f191681019067ffffffffffffffff8211818310176101b557604082905281906101b190826106ba565b0390f35b634e487b7160e01b5f52604160045260245ffd5b60045f9081529091507f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b8282106102095750602091508201018261017f565b60018160209254838588010152019101906101f4565b90506020925060ff191682840152151560051b8201018261017f565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610162565b34610106575f3660031901126101065760206040516b033b2e3c9fd0803ce80000008152f35b34610106575f36600319011261010657602060ff600654166040519015158152f35b34610106575f366003190112610106577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036102f0576006805460ff19166001179055005b63ed6fcad960e01b5f5260045ffd5b34610106576020366003190112610106576001600160a01b036103206106e4565b165f525f602052602060405f2054604051908152f35b34610106575f366003190112610106576040515f6005548060011c90600181168015610401575b60208310811461023b5782855290811561021f57506001146103ab5750819003601f01601f191681019067ffffffffffffffff8211818310176101b557604082905281906101b190826106ba565b60055f9081529091507f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db05b8282106103eb5750602091508201018261017f565b60018160209254838588010152019101906103d6565b91607f169161035d565b34610106575f36600319011261010657602060405160128152f35b346101065760603660031901126101065761043f6106e4565b6104476106fa565b6001600160a01b0382165f818152600160209081526040808320338452909152902054909260443592915f198110610485575b506101309350610710565b8381106104ea5784156104d75733156104c457610130945f52600160205260405f2060018060a01b0333165f526020528360405f20910390558461047a565b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b8390637dc7a0d960e11b5f523360045260245260445260645ffd5b34610106575f366003190112610106576020600254604051908152f35b346101065760403660031901126101065761053b6106e4565b6024359033156104d7576001600160a01b03169081156104c457335f52600160205260405f20825f526020528060405f20556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b34610106575f366003190112610106576040515f6003548060011c9060018116801561066f575b60208310811461023b5782855290811561021f57506001146106195750819003601f01601f191681019067ffffffffffffffff8211818310176101b557604082905281906101b190826106ba565b60035f9081529091507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b8282106106595750602091508201018261017f565b6001816020925483858801015201910190610644565b91607f16916105cb565b34610106575f366003190112610106577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361010657565b602435906001600160a01b038216820361010657565b6001600160a01b0316908115610854576001600160a01b03169182156108415760ff600654161580610839575b80610806575b806107d3575b6107c457815f525f60205260405f20548181106107ab57817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92602092855f525f84520360405f2055845f525f825260405f20818154019055604051908152a3565b8263391434e360e21b5f5260045260245260445260645ffd5b637413882f60e11b5f5260045ffd5b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316831415610749565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316821415610743565b50600161073d565b63ec442f0560e01b5f525f60045260245ffd5b634b637e8f60e11b5f525f60045260245ffdfea2646970667358221220c2fbae7e11fb6509e7082182e5d7f7217e080ec347d5834a4ebc16d3cfe88ae464736f6c634300082300339b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a26469706673582212208e8c55136472fc5cc8a8e4246cbe89a940faa131d9394455d57c9c715d43b38364736f6c6343000823003360c03461009557601f6109be38819003918201601f19168301916001600160401b038311848410176100995780849260209460405283398101031261009557516001600160a01b03811690819003610095576080523360a05260405161091090816100ae823960805181818161011a015281816104b40152610544015260a051818181610212015281816105d601526106e10152f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f3560e01c90816302669b52146106cf575080630c245ef614610593578063150b7a02146104e35780637f1e9ef61461049f578063ce3f865f146100b25763f4dadc611461005e575f80fd5b346100ae5760203660031901126100ae576004355f525f602052606060405f2061ffff6001808060a01b0383541692015460405192835260018060a01b038116602084015260a01c166040820152f35b5f80fd5b346100ae5760203660031901126100ae57600435805f525f60205260405f2090604051916100df8361073c565b6001808060a01b0382541691828552015492602081019160018060a01b038516835261ffff604083019560a01c1685521561049057604051937f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031692906080860167ffffffffffffffff81118782101761047c57604090815285875230602088019081526001600160801b0388830181815260608a01828152845163fc6f786560e01b81529a5160048c015292516001600160a01b031660248b015251811660448a01529051166064880152866084815f885af193841561036e575f965f9561043e575b506101806024916040519283809263133f757160e31b82528a60048301525afa91821561036e575f915f93610379575b506040516361d027b360e01b8152916020836004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa92831561036e5789905f946102e9575b506102b58795856102d0958b61029f61ffff9b977f356325f43e4ec847c1758f4442bec0c32f4a2d1ec7249e2ab2e11f46f9cb798b9e9a6102ca9860809f60018060a01b03905116908f875116936107d1565b9a8b9a60018060a01b03905116925116936107d1565b91516001600160a01b031699919485926107b0565b926107b0565b91604051938452602084015260408301526060820152a3005b92979350509492936020823d602011610366575b8161030a60209383610758565b810103126100ae576102ca6102b561ffff968b7f356325f43e4ec847c1758f4442bec0c32f4a2d1ec7249e2ab2e11f46f9cb798b9a8761029f60809c6103526102d09a61077a565b9a50979b50509b509550925095975061024c565b3d91506102fd565b6040513d5f823e3d90fd5b91509150610180813d8211610436575b816103976101809383610758565b810103126100ae5780516bffffffffffffffffffffffff8116036100ae576103c16020820161077a565b506103ce6040820161077a565b6103da6060830161077a565b91608081015162ffffff8116036100ae57610160816103fe60a061042d940161078e565b5061040b60c0820161078e565b5061041860e0820161079c565b50610426610140820161079c565b500161079c565b509091886101fb565b3d9150610389565b965093506040863d604011610474575b8161045b60409383610758565b810103126100ae578551602090960151936101806101cb565b3d915061044e565b634e487b7160e01b5f52604160045260245ffd5b631928cfa560e21b5f5260045ffd5b346100ae575f3660031901126100ae576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346100ae5760803660031901126100ae576104fc610726565b50610505610710565b5060643567ffffffffffffffff81116100ae57366023820112156100ae57806004013567ffffffffffffffff81116100ae57369101602401116100ae577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361058457604051630a85bd0160e11b8152602090f35b63a2331b8960e01b5f5260045ffd5b346100ae5760803660031901126100ae576004356105af610710565b6044356001600160a01b03811692908390036100ae5760643561ffff81168091036100ae577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036106c05761271081116106b15760207ff00eb898eeafc70388ca5f548ead959835fc681a30ae580f65d7e10d81df5018916040519461063e8661073c565b8686526001600160a01b0390811683870181815260408089018581525f89815280885282902099518a546001600160a01b031916908616178a559151600199909901805492516001600160b01b0319909316999094169890981760a09190911b61ffff60a01b16179091559451908152a4005b63040357dd60e21b5f5260045ffd5b63236deb5b60e01b5f5260045ffd5b346100ae575f3660031901126100ae577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b602435906001600160a01b03821682036100ae57565b600435906001600160a01b03821682036100ae57565b6060810190811067ffffffffffffffff82111761047c57604052565b90601f8019910116810190811067ffffffffffffffff82111761047c57604052565b51906001600160a01b03821682036100ae57565b51908160020b82036100ae57565b51906001600160801b03821682036100ae57565b919082039182116107bd57565b634e487b7160e01b5f52601160045260245ffd5b919290949385156108505761ffff1680860290868204036107bd5761271090049485938480610836575b6108069150826107b0565b610811575b50505050565b61082d9361081e916107b0565b916001600160a01b0316610859565b815f808061080b565b610849916001600160a01b038616610859565b5f846107fb565b505f9450505050565b916040519163a9059cbb60e01b5f5260018060a01b031660045260245260205f60448180865af19060015f51148216156108b9575b604052156108995750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b9060018115166108d157823b15153d1516169061088e565b503d5f823e3d90fdfea264697066735822122083a67ca91df6b518bb6452d01276b9138d5c97591f73b54d60b56c7627e27fce64736f6c6343000823003300000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d3000000000000000000000000555dead5552df0dcc4592e2cffb9c26591fd7589000000000000000000000000555dead5552df0dcc4592e2cffb9c26591fd7589
0x608080604052600436101561005b575b50361561001a575f80fd5b7f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b0316330361004c57005b63c11f59c560e01b5f5260045ffd5b5f905f3560e01c9081631f514c5214612b7e57508063218d578f14612b62578063239f3af714612b455780632cc3dc6e14612a975780632e39757214612a7b57806335625a7d14612a5f57806347377d9214612a415780634bd387e114612a1b57806350879c1c146129d7578063545193c5146129b15780635d28560a146119bf57806361d027b314611996578063682c20581461197857806369d7954c146118405780636a2724621461161e578063715018a6146115b957806379ba5097146115345780637f1e9ef6146114ef57806387cb5f94146114cd5780638da5cb5b146114a6578063902ccca514611481578063902d55a51461145a578063b1a25c9414611435578063bf04b8a114611410578063cce7ec131461069b578063d113b95c14610613578063d7b96d4e146105ce578063dce0b4e4146105b0578063dd1b9c4a14610593578063e30c39781461056a578063f0f44260146104e3578063f2fde38b14610476578063fa461e33146103985763fcc3fa6f0361000f5734610395576060366003190112610395576004356001600160801b038116809103610393576024356001600160801b03811680820361038f57604435916001600160801b03831680930361038b5761022f612d1e565b67016345785d8a00008410801561037a575b61030957670de0b6b3a764000083108015610368575b610309576102786102688484612c51565b6102728587612bdf565b90612c64565b8060011b90801591818104600214831715610354576b033b2e3c9fd0803ce800000011918215610318575b505061030957917fc20acea1d84cadf857e246700cecb16fbf5cd1ed9c341473993ae0c72477249093916060936001600160801b03199060801b168317600455816001600160801b0319600554161760055560405192835260208301526040820152a180f35b63019af63760e01b8552600485fd5b909150601482029182046014141715610340576b3d646e7fdc79848538000000105f806102a3565b634e487b7160e01b86526011600452602486fd5b634e487b7160e01b88526011600452602488fd5b506801158e460913d000008311610257565b50678ac7230489e800008411610241565b8480fd5b8380fd5b505b80fd5b50346103955760603660031901126103955760043560243560443567ffffffffffffffff811161038f576103d0903690600401612bb1565b845c6001600160a01b0316158015610462575b61045357816040918101031261038f57610408602061040183612cd2565b9201612cd2565b92848113610438575b505082811361041e578280f35b6104329133906001600160a01b0316612e8b565b5f808280f35b61044c9133906001600160a01b0316612e8b565b5f80610411565b636f61f64160e01b8552600485fd5b5033855c6001600160a01b031614156103e3565b503461039557602036600319011261039557610490612b9b565b610498612d1e565b600180546001600160a01b0319166001600160a01b0392831690811790915582549091167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227008380a380f35b5034610395576020366003190112610395576104fd612b9b565b610505612d1e565b6001600160a01b0316801561055b576020817f7dae230f18360d76a040c81f050aa14eb9d6dc7901b20fc5d855e2a20fe814d1926bffffffffffffffffffffffff60a01b6002541617600255604051908152a180f35b63019af63760e01b8252600482fd5b50346103955780600319360112610395576001546040516001600160a01b039091168152602090f35b503461039557806003193601126103955760206040516127108152f35b50346103955780600319360112610395576020600354604051908152f35b50346103955780600319360112610395576040517f000000000000000000000000594aae718a566c638106fdae44987153152880756001600160a01b03168152602090f35b503461039557806003193601126103955761062c612ce6565b600654801561068c5760207fc1d94a7c9f6a6bc92f1ca076189cb2bccd07ce7193ac9423e7a3f9fde840139d91836006556106718160018060a01b0360025416612db4565b604051908152a160015f5160206140d35f395f51905f525580f35b631f2a200560e01b8252600482fd5b506040366003190112610395576106b0612b9b565b906106b9612ce6565b6001600160a01b038281168083526007602052604083208054909216156114015734156113f257815460ff8160a01c166113e35760a81c61ffff16916127106107028434612c51565b049061070e8234612c2c565b6002820190815460801c600184019485546001600160801b036107348183168095612c82565b16988a99808611611363575b5050831561135457610758846107629260801c612c51565b6102728585612bdf565b916024358310611345577fa1f66e4bd561f4970224fa6654fa58993ac36dfd2b13479a293eba20756cff8c600193926001600160801b036107ad8b946107a789612d44565b90612c0c565b166001600160801b03198a54161789556107f66107d66107cc86612d44565b8b5460801c612c82565b8a546001600160801b031660809190911b6001600160801b031916178a55565b61080281600654612bdf565b600655610810843385612e8b565b8854936108346001600160801b0386169788604051948594339960801c9386612ca2565b0390a4815460801c14610874575b5050505080919250610864575b5060015f5160206140d35f395f51905f525580f35b61086e9033612db4565b5f61084f565b815460ff60a01b1916600160a01b178255833b156112e7576040516375ae61eb60e01b8152868160048183895af180156112eb57908791611330575b50506001600160801b036108cf61091e92828087541691541690612c82565b16926108fd6108f46127106108ec61ffff875460b81c1688612c51565b048096612c2c565b94600654612bdf565b600655546001600160801b03610916858360801c612c51565b911690612c64565b956040516370a0823160e01b8152306004820152602081602481885afa9081156112eb5787916112fe575b508088116112f6575b507f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b03163b156112e757604051630d0e30db60e41b81528681600481877f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b03165af180156112eb579087916112d2575b50507f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b031684101561129f57919586927f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b03169290825b610a47610a42828c612f4f565b612ff7565b996001600160a01b038b1161128657896020999a9b60018060a01b0316998a946084604051809481936309f56ab160e11b835260018060a01b03169b8c600484015260018060a01b0316988960248401526127106044840152606483015260018060a01b037f00000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d3165af190811561127b578c91611239575b50604051633850c7bd60e01b81526001600160a01b039190911699908c60e0826004818f5afa801561122c5789928291611207575b506001600160a01b03168c8482036110a8575b50610b629350859250507f00000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d36001600160a01b0316905088613119565b610b96817f00000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d36001600160a01b031685613119565b6009820291808304600914811517156110945760098202938285046009148315171561108057928c959492600a949285936040519a610bd48c612d75565b8b5260208b015261271060408b0152620d899f1960608b0152620d89a060808b015260a08a015260c08901520460e08701520461010085015260018060a01b037f000000000000000000000000594aae718a566c638106fdae4498715315288075166101208501524261014085015261014060405194634418b22b60e11b865260018060a01b03815116600487015260018060a01b03602082015116602487015262ffffff6040820151166044870152606081015160020b6064870152608081015160020b608487015260a081015160a487015260c081015160c487015260e081015160e487015261010081015161010487015260018060a01b03610120820151166101248701520151610144850152608084610164818560018060a01b037f00000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d3165af1938415610f84578294611037575b50547f000000000000000000000000594aae718a566c638106fdae44987153152880756001600160a01b03163b156103935761ffff604051916306122f7b60e11b835285600484015287602484015260018060a01b038116604484015260c81c16606482015281816084818360018060a01b037f000000000000000000000000594aae718a566c638106fdae4498715315288075165af18015610f845761101e575b50506040516370a0823160e01b815230600482015290602082602481885afa918215611013578892610fdf575b5081610fd0575b6040516370a0823160e01b81523060048201526020816024817f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b03165afa908115610fc5578991610f8f575b5080610e9e575b5090608092917f8d0453dc55ff49f0c8c7ca816943faff3ced84a6a1a9b3831f8bcf12b4d700c394604051938452602084015260408301526060820152a381905f808080610842565b7f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b03163b15610f8057604051632e1a7d4d60e01b81526004810182905289908181602481837f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b03165af18015610f8457610f63575b5050907f8d0453dc55ff49f0c8c7ca816943faff3ced84a6a1a9b3831f8bcf12b4d700c394610f566080959493600654612bdf565b6006559450909192610e55565b81610f72919695949396612d92565b610f8057909192885f610f21565b8880fd5b6040513d84823e3d90fd5b90506020813d602011610fbd575b81610faa60209383612d92565b81010312610fb957515f610e4e565b5f80fd5b3d9150610f9d565b6040513d8b823e3d90fd5b610fda8286612e0f565b610dfb565b9091506020813d60201161100b575b81610ffb60209383612d92565b81010312610fb95751905f610df4565b3d9150610fee565b6040513d8a823e3d90fd5b8161102891612d92565b61103357865f610dc7565b8680fd5b9093506080813d608011611078575b8161105360809383612d92565b8101031261039357602081519101516001600160801b0381160361039357925f610d25565b3d9150611046565b634e487b7160e01b8d52601160045260248dfd5b634e487b7160e01b8c52601160045260248cfd5b6040928590805c6001600160a01b0319168317815d60c4855194602086019788528b878701528686526110dc606087612d92565b865197889687958693630251596160e31b8552306004860152116024840152600160448401528a606484015260a060848401525180918160a48501528484015e8181018301849052601f01601f191681010301925af180156111cd576111d8575b508b5c6001600160a01b0319168c5d604051633850c7bd60e01b815260e0816004818e5afa9081156111cd578d91611198575b506001600160a01b031603611189575f868c828c610b26565b6334c4589960e01b8b5260048bfd5b6111ba915060e03d60e0116111c6575b6111b28183612d92565b810190612ed9565b5050505050505f611170565b503d6111a8565b6040513d8f823e3d90fd5b604090813d8311611200575b6111ee8183612d92565b810103126111fc575f61113d565b8b80fd5b503d6111e4565b611220915060e03d60e0116111c6576111b28183612d92565b5050505050505f610b13565b50604051903d90823e3d90fd5b90506020813d602011611273575b8161125460209383612d92565b810103126111fc57516001600160a01b03811681036111fc575f610ade565b3d9150611247565b6040513d8e823e3d90fd5b6306dfcc6560e41b8a5260a060045260248b905260448afd5b9086907f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b031684610a35565b816112dc91612d92565b6112e757855f6109d0565b8580fd5b6040513d89823e3d90fd5b96505f610952565b90506020813d602011611328575b8161131960209383612d92565b81010312610fb957515f610949565b3d915061130c565b8161133a91612d92565b6112e757855f6108b0565b6307dd37f760e41b8a5260048afd5b631f2a200560e01b8a5260048afd5b925093509750809261137482612c39565b906127100361ffff81116113cf5761ffff1680156113bd576113b59160016113a26113ae935f198401612c64565b01901515029283612c2c565b9134612c2c565b975f80610740565b634e487b718b5260126020526024601cfd5b634e487b7160e01b8b52601160045260248bfd5b63e6a0d45f60e01b8452600484fd5b631f2a200560e01b8352600483fd5b638698bf3760e01b8352600483fd5b5034610395578060031936011261039557602061ffff60025460b01c16604051908152f35b5034610395578060031936011261039557602061ffff60025460c01c16604051908152f35b503461039557806003193601126103955760206040516b033b2e3c9fd0803ce80000008152f35b5034610395578060031936011261039557602061ffff60025460a01c16604051908152f35b5034610395578060031936011261039557546040516001600160a01b039091168152602090f35b50346103955780600319360112610395576020604051662386f26fc100008152f35b50346103955780600319360112610395576040517f00000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d36001600160a01b03168152602090f35b5034610395578060031936011261039557600154336001600160a01b03909116036115a657600180546001600160a01b0319908116909155815433918116821783556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08380a380f35b63118cdaa760e01b815233600452602490fd5b50346103955780600319360112610395576115d2612d1e565b600180546001600160a01b03199081169091558154908116825581906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b503461039557606036600319011261039557611638612b9b565b9060243591611645612ce6565b6001600160a01b039081168083526007602052604083208054919491928316156118315760ff8360a01c166113e3578115611822576001018054926127106116b961ffff6116ae61169f876001600160801b038a16612c51565b9760801c97610272888a612bdf565b9360a81c1683612c51565b04906116c58282612c2c565b946044358610611813576116df6116ff916107a787612d44565b84546001600160801b031660809190911b6001600160801b031916178455565b6001600160801b0361171c61171383612d44565b82865416612c82565b166001600160801b031984541617835561173882600654612bdf565b6006556040516323b872dd60e01b87523360045230602452604485905292602087606481808c5af160018851148116156117f4575b8460405287606052156117e05792806117c38899947fa1f66e4bd561f4970224fa6654fa58993ac36dfd2b13479a293eba20756cff8c946117cc9a9897549133986001600160801b038460801c94169286612ca2565b0390a433612db4565b60015f5160206140d35f395f51905f525580f35b635274afe760e01b87526004889052602487fd5b600181151661180a57883b15153d15161661176d565b843d89823e3d90fd5b6307dd37f760e41b8752600487fd5b631f2a200560e01b8452600484fd5b638698bf3760e01b8452600484fd5b50346103955760803660031901126103955760043561ffff8116908181036119745760243561ffff811680820361038b576044359261ffff841692838503611033576064359461188e612d1e565b61012c87118015611969575b801561195e575b8015611953575b8015611943575b611934579160809593917f62fc48cf8c3fe38766644371ae4a46a51d0edde9ff642d479a10a6bd8c631e089795936002549061ffff60c01b9060c01b169261ffff60a01b9060a01b169065ffffffffffff60a01b1916179061ffff60b01b9060b01b16171760025582600355604051938452602084015260408301526060820152a180f35b63019af63760e01b8852600488fd5b50662386f26fc1000086116118af565b5061271085116118a8565b506109c485106118a1565b506101f4841161189a565b8280fd5b50346103955780600319360112610395576020600654604051908152f35b50346103955780600319360112610395576002546040516001600160a01b039091168152602090f35b506060366003190112610fb95760043567ffffffffffffffff8111610fb9576119ec903690600401612bb1565b60243567ffffffffffffffff8111610fb957611a0c903690600401612bb1565b939060443567ffffffffffffffff8111610fb957611a2e903690600401612bb1565b939091611a39612ce6565b6003548034106129a3578061298e575b50604051610ec48082019082821067ffffffffffffffff83111761297a578291611aa69161320f843960608152611a96611a8760608301888d612bec565b82810360208401528c87612bec565b9060408183039101528887612bec565b03905ff09586156128d0576001600160a01b0387165f90815260076020526040902080546001600160a01b031981163390811783556002805461ffff60a81b198316600162ffff0160a01b0319851617600891821b61ffff60a81b169081178655825463ffffffff60a81b198516600164ffffffff0160a01b0319871617821790831b61ffff60b81b169081178755925465ffffffffffff60a81b19909416600166ffffffffffff0160a01b03199095169490941790931717911b61ffff60c81b16178155600480546001830180546001600160801b03199081166001600160801b03939093169283178255925490921617815590989094611c62906001600160801b0360045416986001600160801b0360028d019a166001600160801b03198b5416178a55611c10611bf06001600160801b03600454166001600160801b036005541690612c0c565b8b546001600160801b031660809190911b6001600160801b031916178b55565b611c54600454966001600160801b036005541695611c4661ffff60025460a01c16986040519b6101008d526101008d0191612bec565b918a830360208c0152612bec565b918783036040890152612bec565b926b033b2e3c9fd0803ce800000060608601526001600160801b038116608086015260801c60a085015260c084015260e08301527f30fa88fb3f28659bbb54f2e869db6009a4799abccc7690a56f5c30743f9a1ba433928060018060a01b038916930390a3611cd360035434612c2c565b9283611cff575b60015f5160206140d35f395f51905f52556040516001600160a01b0386168152602090f35b855460ff8160a01c1661296b5760a81c61ffff1693612710611d218683612c51565b0490611d2d8282612c2c565b91835460801c8554926001600160801b03611d4b8186168094612c82565b16905f998287116128ea575b50505083156128db577fa1f66e4bd561f4970224fa6654fa58993ac36dfd2b13479a293eba20756cff8c89926001600160801b03611db4611daa611da08960019960801c612c51565b6102728a88612bdf565b946107a789612d44565b166001600160801b0319895416178855611dfd611ddd611dd385612d44565b8a5460801c612c82565b89546001600160801b031660809190911b6001600160801b031916178955565b611e0981600654612bdf565b600655611e1e8333878060a01b038716612e8b565b875492611e4a6001600160801b038516978860405194859433998b8060a01b03169860801c9386612ca2565b0390a4815460801c14611e7d575b5050506020925080611e6d575b808080611cda565b611e779033612db4565b5f611e65565b855460ff60a01b1916600160a01b178655919392916001600160a01b0384163b15610fb9576040516375ae61eb60e01b81525f81600481836001600160a01b038a165af180156128d0576128b4575b506001600160801b03611eea611f3192828086541691541690612c82565b1691611f18611f0f612710611f0761ffff8b5460b81c1687612c51565b048095612c2c565b93600654612bdf565b600655546001600160801b03610916848360801c612c51565b6040516370a0823160e01b81523060048201526020816024816001600160a01b0389165afa90811561286f578691612882575b5080821161287a575b507f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b03163b1561038b57604051630d0e30db60e41b81528581600481867f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b03165af1801561286f5790869161285a575b50506001600160a01b037f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad7381169085161015612822576001600160a01b038481169690839083907f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73165b612062610a428385612f4f565b996001600160a01b038b11611286579860849798996020829c60018060a01b0316916040519a8b80926309f56ab160e11b825260018060a01b03169586600483015260018060a01b0388166024830152612710604483015285606483015260018060a01b037f00000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d3165af198891561127b578c996127de575b50604051633850c7bd60e01b815260e0816004816001600160a01b038e165afa9081156111cd578d916127b9575b506001600160a01b0316818103612667575b506121709050837f00000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d36001600160a01b031683613119565b6121a7846001600160a01b037f00000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d38116908516613119565b826009810204600914831517156113cf57836009810204600914841517156113cf578a93600a60096121e59a99989795829582956040519d8e612d75565b8d5260018060a01b031660208d015261271060408d0152620d899f1960608d0152620d89a060808d01528060a08d01528360c08d0152020460e08a0152020461010087015260018060a01b037f000000000000000000000000594aae718a566c638106fdae4498715315288075166101208701524261014087015261014060405196634418b22b60e11b885260018060a01b03815116600489015260018060a01b03602082015116602489015262ffffff6040820151166044890152606081015160020b6064890152608081015160020b608489015260a081015160a489015260c081015160c489015260e081015160e489015261010081015161010489015260018060a01b03610120820151166101248901520151610144870152608086610164818560018060a01b037f00000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d3165af1958615610f8457829661261e575b50547f000000000000000000000000594aae718a566c638106fdae44987153152880756001600160a01b03163b15610393576040516306122f7b60e11b8152600481018790526001600160a01b038981166024830152808316604483015260c89290921c61ffff1660648201529082908290608490829084907f000000000000000000000000594aae718a566c638106fdae4498715315288075165af18015610f8457612609575b50506040516370a0823160e01b8152306004820152916020836024816001600160a01b038b165afa9283156110135788936125d5575b50826125bd575b6040516370a0823160e01b8152306004820152976020896024817f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b03165afa98891561122c578199612589575b50886124da575b5060209750604051948552878501526040840152606083015260018060a01b0316907f8d0453dc55ff49f0c8c7ca816943faff3ced84a6a1a9b3831f8bcf12b4d700c3608060018060a01b03861692a35f8080611e58565b7f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b03163b1561039557604051632e1a7d4d60e01b8152600481018a90528181602481837f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b03165af18015610f8457612574575b505061256b602098600654612bdf565b6006555f612482565b61257f828092612d92565b610395578061255b565b9098506020813d6020116125b5575b816125a560209383612d92565b81010312610fb95751975f61247b565b3d9150612598565b6125d0836001600160a01b038916612e0f565b612427565b9092506020813d602011612601575b816125f160209383612d92565b81010312610fb95751915f612420565b3d91506125e4565b8161261391612d92565b61103357865f6123ea565b9095506080813d60801161265f575b8161263a60809383612d92565b8101031261039357602081519101516001600160801b0381160361039357945f612342565b3d915061262d565b8c5c6001600160a01b0319166001600160a01b038b16178d5d60408d8b8483519260c4602085019689885260018060a01b038b16878701528686526126ad606087612d92565b865197889687958693630251596160e31b8552306004860152116024840152600160448401528a606484015260a060848401525180918160a48501528484015e8181018301849052601f01601f191681010301926001600160a01b03165af180156111cd5761278e575b508b5c6001600160a01b0319168c5d604051633850c7bd60e01b815260e0816004816001600160a01b038e165afa9081156111cd578d91612769575b506001600160a01b031603611189575f80612139565b612782915060e03d60e0116111c6576111b28183612d92565b5050505050505f612753565b604090813d83116127b2575b6127a48183612d92565b810103126111fc575f612717565b503d61279a565b6127d2915060e03d60e0116111c6576111b28183612d92565b5050505050505f612127565b9098506020813d60201161281a575b816127fa60209383612d92565b810103126111fc57516001600160a01b03811681036111fc57975f6120f9565b3d91506127ed565b6001600160a01b037f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad7381169690829084908716612055565b8161286491612d92565b61038b57845f611feb565b6040513d88823e3d90fd5b90505f611f6d565b90506020813d6020116128ac575b8161289d60209383612d92565b81010312610fb957515f611f64565b3d9150612890565b6128c19195505f90612d92565b5f936001600160801b03611ecc565b6040513d5f823e3d90fd5b631f2a200560e01b5f5260045ffd5b9299509250809450936128fc81612c39565b916127100361ffff81116129575761ffff1680156129455761293c92600161292a612936935f198401612c64565b01901515029182612c2c565b92612c2c565b965f8080611d57565b634e487b715f5260126020526024601cfd5b634e487b7160e01b5f52601160045260245ffd5b63e6a0d45f60e01b5f5260045ffd5b634e487b7160e01b5f52604160045260245ffd5b61299a90600654612bdf565b6006555f611a49565b62976f7560e21b5f5260045ffd5b34610fb9575f366003190112610fb95760206001600160801b0360055416604051908152f35b34610fb9575f366003190112610fb9576040517f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b03168152602090f35b34610fb9575f366003190112610fb95760206001600160801b0360045416604051908152f35b34610fb9575f366003190112610fb9576020604051620d899f198152f35b34610fb9575f366003190112610fb95760206040516101f48152f35b34610fb9575f366003190112610fb95760206040516109c48152f35b34610fb9576020366003190112610fb9576001600160a01b03612ab8612b9b565b165f52600760205261012060405f20805490600260018201549101549061ffff6040519360018060a01b038116855260ff8160a01c1615156020860152818160a81c166040860152818160b81c16606086015260c81c1660808401526001600160801b03811660a084015260801c60c08301526001600160801b03811660e083015260801c610100820152f35b34610fb9575f366003190112610fb9576020604051620d89a08152f35b34610fb9575f366003190112610fb957602060405161012c8152f35b34610fb9575f366003190112610fb95760209060045460801c8152f35b600435906001600160a01b0382168203610fb957565b9181601f84011215610fb95782359167ffffffffffffffff8311610fb95760208381860195010111610fb957565b9190820180921161295757565b908060209392818452848401375f828201840152601f01601f1916010190565b906001600160801b03809116911601906001600160801b03821161295757565b9190820391821161295757565b90612710820291808304612710149015171561295757565b8181029291811591840414171561295757565b8115612c6e570490565b634e487b7160e01b5f52601260045260245ffd5b906001600160801b03809116911603906001600160801b03821161295757565b908152602081019190915260408101919091526001600160801b0391821660608201529116608082015260a00190565b35906001600160a01b0382168203610fb957565b60025f5160206140d35f395f51905f525414612d0f5760025f5160206140d35f395f51905f5255565b633ee5aeb560e01b5f5260045ffd5b5f546001600160a01b03163303612d3157565b63118cdaa760e01b5f523360045260245ffd5b6001600160801b038111612d5e576001600160801b031690565b6306dfcc6560e41b5f52608060045260245260445ffd5b610160810190811067ffffffffffffffff82111761297a57604052565b90601f8019910116810190811067ffffffffffffffff82111761297a57604052565b5f80809381935af13d15612e0a573d67ffffffffffffffff811161297a5760405190612dea601f8201601f191660200183612d92565b81525f60203d92013e5b15612dfb57565b630db2c7f160e31b5f5260045ffd5b612df4565b906040519063a9059cbb60e01b5f5261dead60045260245260205f60448180865af19060015f5114821615612e6a575b60405215612e4a5750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b906001811516612e8257823b15153d15161690612e3f565b503d5f823e3d90fd5b916040519163a9059cbb60e01b5f5260018060a01b031660045260245260205f60448180865af19060015f5114821615612e6a5760405215612e4a5750565b519061ffff82168203610fb957565b908160e0910312610fb95780516001600160a01b0381168103610fb9579160208201518060020b8103610fb95791612f1360408201612eca565b91612f2060608301612eca565b91612f2d60808201612eca565b9160a082015160ff81168103610fb95760c0909201518015158103610fb95790565b5f19600160c01b8209918160c01b91828085109403938085039414612fe85783821115612fd0578190600160c01b9009815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b50634e487b715f52156003026011186020526024601cfd5b5090612ff49250612c64565b90565b6001811115612ff457806001600160801b821015613108575b600482600160401b6130ba9410156130fb575b6401000000008110156130ee575b620100008110156130e1575b6101008110156130d5575b60108110156130c9575b10156130c1575b60030260011c6130698184612c64565b0160011c6130778184612c64565b0160011c6130858184612c64565b0160011c6130938184612c64565b0160011c6130a18184612c64565b0160011c6130af8184612c64565b0160011c8092612c64565b8111900390565b60011b613059565b811c9160021b91613052565b60081c91811b91613048565b60101c9160081b9161303d565b60201c9160101b91613031565b60401c9160201b91613023565b5050608081901c600160401b613010565b916040519163095ea7b360e01b5f5260018060a01b031691826004528160245260205f60448180885af19060015f51148216156131ff575b6040521561315e57505050565b60405163095ea7b360e01b5f52826004525f60245260205f60448180885af19060015f51148216156131e7575b604052156131c9576040519163095ea7b360e01b5f5260045260245260205f60448180865af19060015f5114821615612e6a5760405215612e4a5750565b635274afe760e01b5f9081526001600160a01b038416600452602490fd5b906001811516612e8257843b15153d1516169061318b565b90843b15153d1516169061315156fe60a0604052346105ac57610ec480380380610019816105b0565b92833981016060828203126105ac5781516001600160401b0381116105ac57816100449184016105d5565b60208301519092906001600160401b0381116105ac57826100669183016105d5565b60408201519092906001600160401b0381116105ac5761008692016105d5565b82516001600160401b0381116103ce57600354600181811c911680156105a2575b60208210146103b057601f8111610534575b506020601f82116001146104d157819293945f926104c6575b50508160011b915f199060031b1c1916176003555b81516001600160401b0381116103ce57600454600181811c911680156104bc575b60208210146103b057601f811161044e575b50602092601f82116001146103ed57928192935f926103e2575b50508160011b915f199060031b1c1916176004555b3360805280516001600160401b0381116103ce57600554600181811c911680156103c4575b60208210146103b057601f8111610341575b50602091601f82116001146102e1579181925f926102d6575b50508160011b915f199060031b1c1916176005555b33156102c35760ff6006541615806102bc575b806102a8575b80610293575b610284576002546b033b2e3c9fd0803ce8000000810180911161027057600255335f525f60205260405f206b033b2e3c9fd0803ce800000081540190556040516b033b2e3c9fd0803ce800000081525f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60203393a360405161089d908161062782396080518181816102b30152818161068b015281816107d601526108090152f35b634e487b7160e01b5f52601160045260245ffd5b637413882f60e11b5f5260045ffd5b506080516001600160a01b03163314156101cd565b506080516001600160a01b031615156101c7565b505f6101c1565b63ec442f0560e01b5f525f60045260245ffd5b015190505f80610199565b601f1982169260055f52805f20915f5b85811061032957508360019510610311575b505050811b016005556101ae565b01515f1960f88460031b161c191690555f8080610303565b919260206001819286850151815501940192016102f1565b818111156101805760055f819052601f8301901c7f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0602084106103a8575b81601f9101920160051c03905f5b82811061039b575050610180565b5f8282015560010161038d565b5f915061037f565b634e487b7160e01b5f52602260045260245ffd5b90607f169061016e565b634e487b7160e01b5f52604160045260245ffd5b015190505f80610134565b601f1982169360045f52805f20915f5b868110610436575083600195961061041e575b505050811b01600455610149565b01515f1960f88460031b161c191690555f8080610410565b919260206001819286850151815501940192016103fd565b8181111561011a5760045f52601f820160051c7f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b602084106104b4575b81601f9101920160051c03905f5b8281106104a757505061011a565b5f82820155600101610499565b5f915061048b565b90607f1690610108565b015190505f806100d2565b601f1982169060035f52805f20915f5b81811061051c57509583600195969710610504575b505050811b016003556100e7565b01515f1960f88460031b161c191690555f80806104f6565b9192602060018192868b0151815501940192016104e1565b818111156100b95760035f52601f820160051c7fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b6020841061059a575b81601f9101920160051c03905f5b82811061058d5750506100b9565b5f8282015560010161057f565b5f9150610571565b90607f16906100a7565b5f80fd5b6040519190601f01601f191682016001600160401b038111838210176103ce57604052565b81601f820112156105ac578051906001600160401b0382116103ce57610604601f8301601f19166020016105b0565b92828452602083830101116105ac57815f9260208093018386015e830101529056fe6080806040526004361015610012575f80fd5b5f3560e01c90816302669b52146106795750806306fdde03146105a4578063095ea7b31461052257806318160ddd1461050557806323b872dd14610426578063313ce5671461040b578063392f37e91461033657806370a08231146102ff57806375ae61eb146102a15780638091f3bf1461027f578063902d55a51461025957806395d89b411461013b578063a9059cbb1461010a5763dd62ed3e146100b6575f80fd5b34610106576040366003190112610106576100cf6106e4565b6100d76106fa565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b5f80fd5b34610106576040366003190112610106576101306101266106e4565b6024359033610710565b602060405160018152f35b34610106575f366003190112610106576040515f6004548060011c9060018116801561024f575b60208310811461023b5782855290811561021f57506001146101c9575b50819003601f01601f191681019067ffffffffffffffff8211818310176101b557604082905281906101b190826106ba565b0390f35b634e487b7160e01b5f52604160045260245ffd5b60045f9081529091507f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b8282106102095750602091508201018261017f565b60018160209254838588010152019101906101f4565b90506020925060ff191682840152151560051b8201018261017f565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610162565b34610106575f3660031901126101065760206040516b033b2e3c9fd0803ce80000008152f35b34610106575f36600319011261010657602060ff600654166040519015158152f35b34610106575f366003190112610106577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036102f0576006805460ff19166001179055005b63ed6fcad960e01b5f5260045ffd5b34610106576020366003190112610106576001600160a01b036103206106e4565b165f525f602052602060405f2054604051908152f35b34610106575f366003190112610106576040515f6005548060011c90600181168015610401575b60208310811461023b5782855290811561021f57506001146103ab5750819003601f01601f191681019067ffffffffffffffff8211818310176101b557604082905281906101b190826106ba565b60055f9081529091507f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db05b8282106103eb5750602091508201018261017f565b60018160209254838588010152019101906103d6565b91607f169161035d565b34610106575f36600319011261010657602060405160128152f35b346101065760603660031901126101065761043f6106e4565b6104476106fa565b6001600160a01b0382165f818152600160209081526040808320338452909152902054909260443592915f198110610485575b506101309350610710565b8381106104ea5784156104d75733156104c457610130945f52600160205260405f2060018060a01b0333165f526020528360405f20910390558461047a565b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b8390637dc7a0d960e11b5f523360045260245260445260645ffd5b34610106575f366003190112610106576020600254604051908152f35b346101065760403660031901126101065761053b6106e4565b6024359033156104d7576001600160a01b03169081156104c457335f52600160205260405f20825f526020528060405f20556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b34610106575f366003190112610106576040515f6003548060011c9060018116801561066f575b60208310811461023b5782855290811561021f57506001146106195750819003601f01601f191681019067ffffffffffffffff8211818310176101b557604082905281906101b190826106ba565b60035f9081529091507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b8282106106595750602091508201018261017f565b6001816020925483858801015201910190610644565b91607f16916105cb565b34610106575f366003190112610106577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361010657565b602435906001600160a01b038216820361010657565b6001600160a01b0316908115610854576001600160a01b03169182156108415760ff600654161580610839575b80610806575b806107d3575b6107c457815f525f60205260405f20548181106107ab57817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92602092855f525f84520360405f2055845f525f825260405f20818154019055604051908152a3565b8263391434e360e21b5f5260045260245260445260645ffd5b637413882f60e11b5f5260045ffd5b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316831415610749565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316821415610743565b50600161073d565b63ec442f0560e01b5f525f60045260245ffd5b634b637e8f60e11b5f525f60045260245ffdfea2646970667358221220c2fbae7e11fb6509e7082182e5d7f7217e080ec347d5834a4ebc16d3cfe88ae464736f6c634300082300339b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a26469706673582212208e8c55136472fc5cc8a8e4246cbe89a940faa131d9394455d57c9c715d43b38364736f6c63430008230033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| Moire (MOIRE) | MOIRE | 1,000,000,000 | — | — |
| Moire (MOIRE) | MOIRE | 999,962,063.127053 | — | — |
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0xd7180b…c74a3e | 31 days agoFri, 17 Jul 2026 03:39:51 UTC | 0xa1f66e…ff8c | [0] 0x000000000000…8f3dd310 [1] 0x000000000000…91fd7589 [2] 0x000000000000…00000001 data: 0x000000000000000000…d7cbc273 |
| 0xd7180b…c74a3e | 31 days agoFri, 17 Jul 2026 03:39:51 UTC | 0x30fa88…1ba4 | [0] 0x000000000000…8f3dd310 [1] 0x000000000000…91fd7589 data: 0x000000000000000000…00000000 |
| 0xcf3667…8a6788 | 31 days agoFri, 17 Jul 2026 03:21:12 UTC | 0x30fa88…1ba4 | [0] 0x000000000000…96a563fe [1] 0x000000000000…91fd7589 data: 0x000000000000000000…00000000 |
| 0x732fd4…02b2d0 | 31 days agoFri, 17 Jul 2026 03:05:00 UTC | 0x8be007…57e0 | [0] 0x000000000000…00000000 [1] 0x000000000000…91fd7589 |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xd7180b…c74a3e | create | 11,803,517 | 31 days agoFri, 17 Jul 2026 03:39:51 UTC | 0x555d…7589 | IN | MoireLaunchpad | $0.100.00005 ETH | 0.00006843 | |
| 0xcf3667…8a6788 | create | 11,792,357 | 31 days agoFri, 17 Jul 2026 03:21:12 UTC | 0x555d…7589 | IN | MoireLaunchpad | $0.000 ETH | 0.00006402 |
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xd7180bf1…c74a3e | Transfer | 11,803,517 | 31 days agoFri, 17 Jul 2026 03:39:51 UTC | 0x3c5e…bf56 | OUT | 0x555d…7589 | 37,936.872946 MOIRE | Moire (MOIRE) | |
| 0xd7180bf1…c74a3e | Transfer | 11,803,517 | 31 days agoFri, 17 Jul 2026 03:39:51 UTC | 0x0000…0000 | IN | 0x3c5e…bf56 | 1,000,000,000.000000 MOIRE | Moire (MOIRE) | |
| 0xcf36671f…8a6788 | Transfer | 11,792,357 | 31 days agoFri, 17 Jul 2026 03:21:12 UTC | 0x0000…0000 | IN | 0x3c5e…bf56 | 1,000,000,000.000000 MOIRE | Moire (MOIRE) |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 11,803,517 | 31 days agoFri, 17 Jul 2026 03:39:51 UTC | 0xd7180b…c74a3e | CREATE | create | 0x3c5e…bf56 | OUT | 0x5c0b…d310 | 0 ETH |
| 11,792,357 | 31 days agoFri, 17 Jul 2026 03:21:12 UTC | 0xcf3667…8a6788 | CREATE | create | 0x3c5e…bf56 | OUT | 0xce2d…63fe | 0 ETH |
| 11,782,665 | 31 days agoFri, 17 Jul 2026 03:05:00 UTC | 0x732fd4…02b2d0 | CREATE | 0x60e08060 | 0x3c5e…bf56 | OUT | 0x594a…8075 | 0 ETH |