// SPDX-License-Identifier: MIT
pragma solidity 0.8.24;
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "./BangerToken.sol";
import "./BondingCurveV3.sol";
import "./GraduationManager.sol";
import "./FeeLockerV2.sol";
import "./TokenDeployer.sol";
import "./interfaces/ISushiSwapV3.sol";
/// @title BangerFactoryV6 — audit-remediated launchpad (V6.5)
/// @notice V6.5: re-audit M-01 fix — actual-price deviation check (see GraduationManager V6.5).
/// V6.4: CRITICAL fix — hostile-pool graduation route removed (see GraduationManager V6.4).
///
/// V6.3 changes:
/// H-02 Attack B fix: pools are created AND initialized at launchToken() time at the
/// deterministic graduation price (derivable because the buy cap fixes realEthReserve
/// at graduationThreshold). This prevents attackers from initializing pools at malicious prices.
/// Chain tick spacing: GraduationManager reads tick spacing from ISushiV3Factory.feeAmountTickSpacing()
/// instead of hardcoded values.
/// Fee tier hardening: unsupported fee tiers (tickSpacing==0) are gracefully skipped.
/// If ALL tiers are hostile, graduation reverts AllPoolsHostile() (V6.4 CRITICAL fix).
///
/// All V6.2/V6.1 fixes preserved: R-1/C-01, R-2/H-01, R-3..R-7, L-02, M-01..M-04, C-1, C-2.
contract BangerFactoryV6 is ReentrancyGuard {
using SafeERC20 for IERC20;
// --- Enums ---
enum DexChoice { SushiSwapV3, UniswapV3 }
// --- Constants ---
uint256 public constant TOTAL_SUPPLY = 1_000_000_000e18;
uint256 public constant CURVE_SUPPLY = 800_000_000e18;
uint256 public constant GRADUATION_SUPPLY = 200_000_000e18;
uint256 public constant TIMELOCK_DELAY = 2 days;
/// @dev Maximum graduation fee = 2.5% of graduation threshold
uint256 public constant MAX_GRADUATION_FEE_BPS = 250;
/// @dev Graduation threshold bounds
uint256 public constant MIN_GRADUATION_THRESHOLD = 0.2 ether;
uint256 public constant MAX_GRADUATION_THRESHOLD = 20 ether;
/// @dev V6.6 (L-vEth): Overflow-safe upper bound on virtualEthReserve. Caps
/// k = virtualEth * CURVE_SUPPLY and keeps deterministic-price and sqrtPriceX96
/// math far below uint256/uint160 limits. Must stay in sync with
/// BondingCurveV3.MAX_VIRTUAL_ETH.
uint256 public constant MAX_VIRTUAL_ETH = 1e27;
/// @dev M-4: Maximum launch fee
uint256 public constant MAX_LAUNCH_FEE = 0.1 ether;
/// @dev C-2: Gas limit for pull-payment attempts
uint256 public constant PULL_PAYMENT_GAS = 50_000;
// --- Immutables ---
IWETH public immutable weth;
// SushiSwap V3
ISushiV3Factory public immutable sushiFactory;
INonfungiblePositionManager public immutable sushiPositionManager;
FeeLockerV2 public immutable sushiFeeLocker;
bool public immutable sushiV3Enabled;
// Uniswap V3
ISushiV3Factory public immutable uniFactory;
INonfungiblePositionManager public immutable uniPositionManager;
FeeLockerV2 public immutable uniFeeLocker;
bool public immutable uniswapV3Enabled;
address public immutable guardian;
uint256 public immutable virtualEthReserve;
/// @dev Graduation logic delegated to GraduationManager (size split)
GraduationManager public immutable graduationManager;
// --- Adjustable parameters (owner-only) ---
uint256 public graduationThreshold;
uint256 public graduationFee;
// --- Admin State (Ownable2Step) ---
address public owner;
address public pendingOwner;
address public protocolTreasury;
bool public sunset;
uint256 public launchFee;
// Timelock
address public pendingTreasury;
uint256 public treasuryChangeTimestamp;
// H-1: Guardian pause with monotonic time tracking
bool public paused;
uint256 public pausedSince;
uint256 public cumulativePausedTime;
/// @dev C-2: Pull-payment for failed ETH transfers (launch fee refunds, etc.)
mapping(address => uint256) public unclaimedEth;
// --- Token Registry ---
struct TokenInfo {
address token;
address bondingCurve;
address creator;
DexChoice dexChoice;
bool graduated;
uint256 lpTokenId;
uint24 feeTier; // V6.2: which fee tier was used for graduation
address graduatedPool; // V6.2: the DEX pool used for graduation LP
}
mapping(address => TokenInfo) public tokenInfo;
mapping(address => address) public curveToToken;
address[] public allTokens;
// --- Events ---
event TokenLaunched(
address indexed token,
address indexed bondingCurve,
address indexed creator,
string name,
string symbol,
string metadataURI,
DexChoice dexChoice
);
event TokenGraduated(
address indexed token,
address indexed bondingCurve,
DexChoice dexChoice,
uint256 lpTokenId,
uint256 ethLiquidity,
uint256 tokenLiquidity,
uint24 feeTier,
address pool
);
event TreasuryChangeProposed(address indexed newTreasury, uint256 executeAfter);
event TreasuryChanged(address indexed oldTreasury, address indexed newTreasury);
event Sunset(bool active);
event LaunchFeeUpdated(uint256 oldFee, uint256 newFee);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);
event GraduationFeeUpdated(uint256 oldFee, uint256 newFee);
event GraduationThresholdUpdated(uint256 oldThreshold, uint256 newThreshold);
event Paused(address indexed by);
event Unpaused(address indexed by);
event EthCredited(address indexed to, uint256 amount);
event EthClaimed(address indexed to, uint256 amount);
// --- Errors ---
error OnlyOwner();
error FactorySunset();
error DexNotEnabled();
error TokenNotFound();
error AlreadyGraduated();
error NotThresholdReached();
error TimelockNotReady();
error NoPendingTreasury();
error InsufficientLaunchFee();
error TransferFailed();
error GraduationFailed(string reason);
error OnlyGuardian();
error OnlyPendingOwner();
error FactoryPaused();
error FeeExceedsCap();
error ThresholdOutOfBounds();
error LaunchFeeExceedsCap();
error NothingToClaim();
error ZeroAddress();
error ZeroVirtualReserve();
/// @dev V6.6 (L-ethlock): plain ETH transfer from an unexpected sender
error DirectEthNotAccepted();
/// @dev V6.6 (M-erec): emergency restore requires the factory to be unpaused
error RestoreWhilePaused();
/// @dev V6.6 (L-vEth): virtualEthReserve above the overflow-safe bound
error VirtualReserveTooLarge();
modifier onlyOwner() {
if (msg.sender != owner) revert OnlyOwner();
_;
}
modifier onlyGuardian() {
if (msg.sender != guardian) revert OnlyGuardian();
_;
}
modifier whenNotPaused() {
if (paused) revert FactoryPaused();
_;
}
struct ConstructorParams {
address weth;
// SushiSwap V3
address sushiFactory;
address sushiPositionManager;
bool enableSushiV3;
// Uniswap V3
address uniFactory;
address uniPositionManager;
bool enableUniswapV3;
// Common
address treasury;
uint256 virtualEthReserve;
uint256 graduationThreshold;
uint256 graduationFee;
uint256 launchFee;
address guardian;
}
constructor(ConstructorParams memory p) {
if (p.weth == address(0) || p.treasury == address(0) || p.guardian == address(0)) revert ZeroAddress();
if (p.virtualEthReserve == 0) revert ZeroVirtualReserve();
// V6.6 (L-vEth): overflow-safe bound — keeps k = virtualEth * CURVE_SUPPLY and
// all deterministic-price math far below uint256/uint160 limits (mirrors
// BondingCurveV3.MAX_VIRTUAL_ETH; both constants must stay in sync).
if (p.virtualEthReserve > MAX_VIRTUAL_ETH) revert VirtualReserveTooLarge();
if (p.graduationThreshold < MIN_GRADUATION_THRESHOLD || p.graduationThreshold > MAX_GRADUATION_THRESHOLD) {
revert ThresholdOutOfBounds();
}
uint256 maxFee = (p.graduationThreshold * MAX_GRADUATION_FEE_BPS) / 10_000;
if (p.graduationFee > maxFee) revert FeeExceedsCap();
if (p.launchFee > MAX_LAUNCH_FEE) revert LaunchFeeExceedsCap();
weth = IWETH(p.weth);
owner = msg.sender;
protocolTreasury = p.treasury;
virtualEthReserve = p.virtualEthReserve;
graduationThreshold = p.graduationThreshold;
graduationFee = p.graduationFee;
launchFee = p.launchFee;
guardian = p.guardian;
// Deploy GraduationManager
graduationManager = new GraduationManager(p.weth);
// SushiSwap V3 setup
bool _sushiEnabled = p.enableSushiV3 && p.sushiFactory != address(0) && p.sushiPositionManager != address(0);
sushiV3Enabled = _sushiEnabled;
sushiFactory = ISushiV3Factory(_sushiEnabled ? p.sushiFactory : address(0xdead));
sushiPositionManager = INonfungiblePositionManager(_sushiEnabled ? p.sushiPositionManager : address(0xdead));
sushiFeeLocker = new FeeLockerV2(_sushiEnabled ? p.sushiPositionManager : address(0xdead));
// Uniswap V3 setup
bool _uniEnabled = p.enableUniswapV3 && p.uniFactory != address(0) && p.uniPositionManager != address(0);
uniswapV3Enabled = _uniEnabled;
uniFactory = ISushiV3Factory(_uniEnabled ? p.uniFactory : address(0xdead));
uniPositionManager = INonfungiblePositionManager(_uniEnabled ? p.uniPositionManager : address(0xdead));
uniFeeLocker = new FeeLockerV2(_uniEnabled ? p.uniPositionManager : address(0xdead));
}
/// @dev V6.6 (L-ethlock): only registered bonding curves send plain ETH to the
/// factory (releaseForMigration during graduateToken). Anything else — user
/// mistakes included — would be permanently locked since the factory has no
/// sweep, so it is rejected outright. (Curves send via call with full gas,
/// so the SLOAD here is safe.)
receive() external payable {
if (curveToToken[msg.sender] == address(0)) revert DirectEthNotAccepted();
}
// =====================================================================
// TOKEN LAUNCH
// =====================================================================
function launchToken(
string calldata name,
string calldata symbol,
string calldata metadataURI,
DexChoice dexChoice
) external payable nonReentrant whenNotPaused returns (address tokenAddr, address curveAddr) {
if (sunset) revert FactorySunset();
if (dexChoice == DexChoice.SushiSwapV3 && !sushiV3Enabled) revert DexNotEnabled();
if (dexChoice == DexChoice.UniswapV3 && !uniswapV3Enabled) revert DexNotEnabled();
if (msg.value < launchFee) revert InsufficientLaunchFee();
// Deploy token + curve via external library (saves ~12KB factory runtime)
(tokenAddr, curveAddr) = TokenDeployer.deployTokenAndCurve(
name, symbol, msg.sender, protocolTreasury, virtualEthReserve, graduationThreshold
);
// Transfer curve supply to curve
IERC20(tokenAddr).safeTransfer(curveAddr, CURVE_SUPPLY);
// H-02 V6.3: Reserve AND initialize pools at the deterministic graduation price.
// The final curve price is deterministic because the buy cap (R-1/C-01) fixes
// realEthReserve at graduationThreshold. This prevents attackers from initializing
// pools at malicious prices after launch.
{
ISushiV3Factory v3F = dexChoice == DexChoice.SushiSwapV3 ? sushiFactory : uniFactory;
uint256 deterministicPrice = _computeDeterministicGradPrice();
graduationManager.reserveAndInitializePools(tokenAddr, v3F, deterministicPrice);
}
tokenInfo[tokenAddr] = TokenInfo({
token: tokenAddr,
bondingCurve: curveAddr,
creator: msg.sender,
dexChoice: dexChoice,
graduated: false,
lpTokenId: 0,
feeTier: 0,
graduatedPool: address(0)
});
curveToToken[curveAddr] = tokenAddr;
allTokens.push(tokenAddr);
// R-6: Refund excess using pull-payment (not hard revert)
uint256 excess = msg.value - launchFee;
if (excess > 0) {
_safeSendEth(msg.sender, excess);
}
// Send launch fee to treasury (C-2: pull-payment on failure)
if (launchFee > 0) {
_safeSendEth(protocolTreasury, launchFee);
}
emit TokenLaunched(tokenAddr, curveAddr, msg.sender, name, symbol, metadataURI, dexChoice);
}
// =====================================================================
// GRADUATION (H-2: NOT whenNotPaused — migration must always be possible)
// =====================================================================
/// @notice Graduate a token to DEX liquidity.
/// @dev V6.2: GraduationManager handles token derivation, pool fallback, excess burn.
/// Factory handles: curve release, fee distribution, locker, registry.
function graduateToken(address tokenAddr) external nonReentrant {
TokenInfo storage info = tokenInfo[tokenAddr];
if (info.token == address(0)) revert TokenNotFound();
if (info.graduated) revert AlreadyGraduated();
info.graduated = true;
uint256 ethForLiquidity;
uint256 curveFinalPrice;
address curveCreator;
// Phase 1: Release ETH + unsold tokens from curve
{
BondingCurveV3 curve = BondingCurveV3(payable(info.bondingCurve));
if (!curve.thresholdReached()) revert NotThresholdReached();
curveFinalPrice = curve.currentPrice();
curveCreator = curve.creator();
uint256 actualFee;
{
uint256 curveThreshold = curve.graduationThreshold();
uint256 maxFee = (curveThreshold * MAX_GRADUATION_FEE_BPS) / 10_000;
actualFee = graduationFee > maxFee ? maxFee : graduationFee;
}
ethForLiquidity = curve.realEthReserve() - actualFee;
curve.releaseForMigration(ethForLiquidity + actualFee, curve.tokensInCurve());
if (actualFee > 0) _safeSendEth(protocolTreasury, actualFee);
}
// Phase 2: Send ALL tokens to GraduationManager (grad supply + unsold + any dust)
{
uint256 tokenBal = IERC20(tokenAddr).balanceOf(address(this));
if (tokenBal > 0) {
IERC20(tokenAddr).safeTransfer(address(graduationManager), tokenBal);
}
}
// Phase 3: DEX graduation (with fallback tiers) + locker
_executeDexGraduation(info, tokenAddr, ethForLiquidity, curveFinalPrice, curveCreator);
}
/// @dev Execute DEX graduation + locker handling (extracted to manage stack depth)
function _executeDexGraduation(
TokenInfo storage info,
address tokenAddr,
uint256 ethForLiquidity,
uint256 curveFinalPrice,
address curveCreator
) internal {
ISushiV3Factory v3F;
INonfungiblePositionManager npm_;
FeeLockerV2 locker_;
if (info.dexChoice == DexChoice.SushiSwapV3) {
v3F = sushiFactory;
npm_ = sushiPositionManager;
locker_ = sushiFeeLocker;
} else {
v3F = uniFactory;
npm_ = uniPositionManager;
locker_ = uniFeeLocker;
}
(uint256 lpTokenId, uint24 feeTier, uint256 tokensUsed, address pool) =
graduationManager.executeGraduation{value: ethForLiquidity}(
GraduationManager.GradParams({
tokenAddr: tokenAddr,
ethAmount: ethForLiquidity,
treasury: protocolTreasury,
v3Factory: v3F,
npm: npm_,
curveFinalPrice: curveFinalPrice
})
);
locker_.prepareDeposit();
npm_.safeTransferFrom(address(this), address(locker_), lpTokenId);
locker_.lockPosition(lpTokenId, curveCreator, protocolTreasury);
info.lpTokenId = lpTokenId;
info.feeTier = feeTier;
info.graduatedPool = pool;
emit TokenGraduated(
tokenAddr, info.bondingCurve, info.dexChoice, lpTokenId,
ethForLiquidity, tokensUsed, feeTier, pool
);
}
// =====================================================================
// PULL-PAYMENT (C-2)
// =====================================================================
/// @notice C-2: Claim ETH that was credited due to a failed transfer
function claimEth() external nonReentrant {
uint256 amount = unclaimedEth[msg.sender];
if (amount == 0) revert NothingToClaim();
unclaimedEth[msg.sender] = 0;
(bool sent,) = msg.sender.call{value: amount}("");
if (!sent) revert TransferFailed();
emit EthClaimed(msg.sender, amount);
}
/// @dev C-2: Attempt ETH transfer with bounded gas. On failure, credit unclaimed.
function _safeSendEth(address to, uint256 amount) internal {
(bool sent,) = to.call{value: amount, gas: PULL_PAYMENT_GAS}("");
if (!sent) {
unclaimedEth[to] += amount;
emit EthCredited(to, amount);
}
}
// =====================================================================
// V6 ADMIN: ADJUSTABLE PARAMETERS
// =====================================================================
function setGraduationFee(uint256 newFee) external onlyOwner {
uint256 maxFee = (graduationThreshold * MAX_GRADUATION_FEE_BPS) / 10_000;
if (newFee > maxFee) revert FeeExceedsCap();
uint256 oldFee = graduationFee;
graduationFee = newFee;
emit GraduationFeeUpdated(oldFee, newFee);
}
/// @notice L-1 (V6.4): Reverts if the current graduationFee exceeds 2.5% of the new
/// threshold. If you need to lower the threshold while the current fee is too
/// high for the new value, either call setGraduationFee first to lower the fee,
/// or use setGraduationParams(newThreshold, newFee) which validates jointly.
function setGraduationThreshold(uint256 newThreshold) external onlyOwner {
if (newThreshold < MIN_GRADUATION_THRESHOLD || newThreshold > MAX_GRADUATION_THRESHOLD) {
revert ThresholdOutOfBounds();
}
uint256 maxFee = (newThreshold * MAX_GRADUATION_FEE_BPS) / 10_000;
if (graduationFee > maxFee) revert FeeExceedsCap();
uint256 oldThreshold = graduationThreshold;
graduationThreshold = newThreshold;
emit GraduationThresholdUpdated(oldThreshold, newThreshold);
}
/// @notice L-1 (V6.4): Set both graduation threshold and fee atomically.
/// Avoids the ordering problem where setGraduationThreshold reverts if the
/// current fee exceeds 2.5% of the new threshold.
function setGraduationParams(uint256 newThreshold, uint256 newFee) external onlyOwner {
if (newThreshold < MIN_GRADUATION_THRESHOLD || newThreshold > MAX_GRADUATION_THRESHOLD) {
revert ThresholdOutOfBounds();
}
uint256 maxFee = (newThreshold * MAX_GRADUATION_FEE_BPS) / 10_000;
if (newFee > maxFee) revert FeeExceedsCap();
uint256 oldThreshold = graduationThreshold;
uint256 oldFee = graduationFee;
graduationThreshold = newThreshold;
graduationFee = newFee;
if (newThreshold != oldThreshold) emit GraduationThresholdUpdated(oldThreshold, newThreshold);
if (newFee != oldFee) emit GraduationFeeUpdated(oldFee, newFee);
}
function setLaunchFee(uint256 _fee) external onlyOwner {
if (_fee > MAX_LAUNCH_FEE) revert LaunchFeeExceedsCap();
emit LaunchFeeUpdated(launchFee, _fee);
launchFee = _fee;
}
// =====================================================================
// ADMIN (Ownable2Step + Treasury)
// =====================================================================
function proposeTreasuryChange(address newTreasury) external onlyOwner {
if (newTreasury == address(0)) revert ZeroAddress();
pendingTreasury = newTreasury;
treasuryChangeTimestamp = block.timestamp + TIMELOCK_DELAY;
emit TreasuryChangeProposed(newTreasury, treasuryChangeTimestamp);
}
function executeTreasuryChange() external onlyOwner {
if (pendingTreasury == address(0)) revert NoPendingTreasury();
if (block.timestamp < treasuryChangeTimestamp) revert TimelockNotReady();
address old = protocolTreasury;
protocolTreasury = pendingTreasury;
pendingTreasury = address(0);
treasuryChangeTimestamp = 0;
emit TreasuryChanged(old, protocolTreasury);
}
function cancelTreasuryChange() external onlyOwner {
pendingTreasury = address(0);
treasuryChangeTimestamp = 0;
}
function setSunset(bool _sunset) external onlyOwner {
sunset = _sunset;
emit Sunset(_sunset);
}
// =====================================================================
// GUARDIAN: PAUSE / UNPAUSE (H-1: monotonic time tracking)
// =====================================================================
/// @dev V6.6 (M-erec): a curve recovered from emergency mode
event CurveRestoredFromEmergency(address indexed token, address indexed bondingCurve);
/// @notice V6.6 (M-erec): Owner recovery for a curve stuck in emergency mode.
/// Emergency mode is entered when any holder emergency-withdraws during a
/// 7-day continuous factory pause; it used to be permanent. If the factory
/// recovers (unpaused), the owner can restore the curve: trading and fee
/// claims resume, completed pro-rata exits stay honored, and the curve
/// re-bases its invariant to post-drain reserves.
function restoreCurveFromEmergency(address tokenAddr) external onlyOwner nonReentrant {
TokenInfo storage info = tokenInfo[tokenAddr];
if (info.token == address(0)) revert TokenNotFound();
if (paused) revert RestoreWhilePaused();
BondingCurveV3(payable(info.bondingCurve)).restoreFromEmergency();
emit CurveRestoredFromEmergency(tokenAddr, info.bondingCurve);
}
function pause() external onlyGuardian {
if (!paused) {
paused = true;
pausedSince = block.timestamp;
emit Paused(msg.sender);
}
}
function unpause() external onlyGuardian {
if (paused) {
if (pausedSince > 0) {
cumulativePausedTime += block.timestamp - pausedSince;
}
paused = false;
pausedSince = 0;
emit Unpaused(msg.sender);
}
}
function emergencyElapsed() external view returns (uint256) {
uint256 total = cumulativePausedTime;
if (paused && pausedSince > 0) {
total += block.timestamp - pausedSince;
}
return total;
}
function currentPauseElapsed() external view returns (uint256) {
if (!paused || pausedSince == 0) return 0;
return block.timestamp - pausedSince;
}
// =====================================================================
// OWNERSHIP (Two-Step Transfer)
// =====================================================================
function transferOwnership(address newOwner) external onlyOwner {
if (newOwner == address(0)) revert ZeroAddress();
pendingOwner = newOwner;
emit OwnershipTransferStarted(owner, newOwner);
}
function acceptOwnership() external {
if (msg.sender != pendingOwner) revert OnlyPendingOwner();
address oldOwner = owner;
owner = pendingOwner;
pendingOwner = address(0);
emit OwnershipTransferred(oldOwner, owner);
}
// =====================================================================
// INTERNAL HELPERS
// =====================================================================
/// @dev V6.3: Compute the deterministic graduation price from known parameters.
/// price = (virtualEthReserve + graduationThreshold)^2 * 1e18 / (virtualEthReserve * CURVE_SUPPLY)
/// This equals the bonding curve's currentPrice() at the exact moment
/// realEthReserve == graduationThreshold (guaranteed by the R-1/C-01 buy cap).
function _computeDeterministicGradPrice() internal view returns (uint256) {
uint256 totalEth = virtualEthReserve + graduationThreshold;
uint256 k = virtualEthReserve * CURVE_SUPPLY;
uint256 tokensAtGrad = k / totalEth;
return (totalEth * 1e18) / tokensAtGrad;
}
// =====================================================================
// VIEW FUNCTIONS
// =====================================================================
function totalTokens() external view returns (uint256) {
return allTokens.length;
}
function getTokenAt(uint256 index) external view returns (address) {
return allTokens[index];
}
function isFactoryToken(address tokenAddr) external view returns (bool) {
return tokenInfo[tokenAddr].token != address(0);
}
function onERC721Received(address, address, uint256, bytes calldata) external pure returns (bytes4) {
return this.onERC721Received.selector;
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "p",
"type": "tuple",
"components": [
{
"name": "weth",
"type": "address",
"internalType": "address"
},
{
"name": "sushiFactory",
"type": "address",
"internalType": "address"
},
{
"name": "sushiPositionManager",
"type": "address",
"internalType": "address"
},
{
"name": "enableSushiV3",
"type": "bool",
"internalType": "bool"
},
{
"name": "uniFactory",
"type": "address",
"internalType": "address"
},
{
"name": "uniPositionManager",
"type": "address",
"internalType": "address"
},
{
"name": "enableUniswapV3",
"type": "bool",
"internalType": "bool"
},
{
"name": "treasury",
"type": "address",
"internalType": "address"
},
{
"name": "virtualEthReserve",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "graduationThreshold",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "graduationFee",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "launchFee",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "guardian",
"type": "address",
"internalType": "address"
}
],
"internalType": "struct BangerFactoryV6.ConstructorParams"
}
],
"stateMutability": "nonpayable"
},
{
"name": "AlreadyGraduated",
"type": "error",
"inputs": []
},
{
"name": "DexNotEnabled",
"type": "error",
"inputs": []
},
{
"name": "DirectEthNotAccepted",
"type": "error",
"inputs": []
},
{
"name": "FactoryPaused",
"type": "error",
"inputs": []
},
{
"name": "FactorySunset",
"type": "error",
"inputs": []
},
{
"name": "FeeExceedsCap",
"type": "error",
"inputs": []
},
{
"name": "GraduationFailed",
"type": "error",
"inputs": [
{
"name": "reason",
"type": "string",
"internalType": "string"
}
]
},
{
"name": "InsufficientLaunchFee",
"type": "error",
"inputs": []
},
{
"name": "LaunchFeeExceedsCap",
"type": "error",
"inputs": []
},
{
"name": "NoPendingTreasury",
"type": "error",
"inputs": []
},
{
"name": "NotThresholdReached",
"type": "error",
"inputs": []
},
{
"name": "NothingToClaim",
"type": "error",
"inputs": []
},
{
"name": "OnlyGuardian",
"type": "error",
"inputs": []
},
{
"name": "OnlyOwner",
"type": "error",
"inputs": []
},
{
"name": "OnlyPendingOwner",
"type": "error",
"inputs": []
},
{
"name": "ReentrancyGuardReentrantCall",
"type": "error",
"inputs": []
},
{
"name": "RestoreWhilePaused",
"type": "error",
"inputs": []
},
{
"name": "SafeERC20FailedOperation",
"type": "error",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ThresholdOutOfBounds",
"type": "error",
"inputs": []
},
{
"name": "TimelockNotReady",
"type": "error",
"inputs": []
},
{
"name": "TokenNotFound",
"type": "error",
"inputs": []
},
{
"name": "TransferFailed",
"type": "error",
"inputs": []
},
{
"name": "VirtualReserveTooLarge",
"type": "error",
"inputs": []
},
{
"name": "ZeroAddress",
"type": "error",
"inputs": []
},
{
"name": "ZeroVirtualReserve",
"type": "error",
"inputs": []
},
{
"name": "CurveRestoredFromEmergency",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "bondingCurve",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "EthClaimed",
"type": "event",
"inputs": [
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "EthCredited",
"type": "event",
"inputs": [
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "GraduationFeeUpdated",
"type": "event",
"inputs": [
{
"name": "oldFee",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "newFee",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "GraduationThresholdUpdated",
"type": "event",
"inputs": [
{
"name": "oldThreshold",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "newThreshold",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "LaunchFeeUpdated",
"type": "event",
"inputs": [
{
"name": "oldFee",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "newFee",
"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": "Paused",
"type": "event",
"inputs": [
{
"name": "by",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "Sunset",
"type": "event",
"inputs": [
{
"name": "active",
"type": "bool",
"indexed": false,
"internalType": "bool"
}
],
"anonymous": false
},
{
"name": "TokenGraduated",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "bondingCurve",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "dexChoice",
"type": "uint8",
"indexed": false,
"internalType": "enum BangerFactoryV6.DexChoice"
},
{
"name": "lpTokenId",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "ethLiquidity",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "tokenLiquidity",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "feeTier",
"type": "uint24",
"indexed": false,
"internalType": "uint24"
},
{
"name": "pool",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "TokenLaunched",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "bondingCurve",
"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": "metadataURI",
"type": "string",
"indexed": false,
"internalType": "string"
},
{
"name": "dexChoice",
"type": "uint8",
"indexed": false,
"internalType": "enum BangerFactoryV6.DexChoice"
}
],
"anonymous": false
},
{
"name": "TreasuryChangeProposed",
"type": "event",
"inputs": [
{
"name": "newTreasury",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "executeAfter",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "TreasuryChanged",
"type": "event",
"inputs": [
{
"name": "oldTreasury",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newTreasury",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "Unpaused",
"type": "event",
"inputs": [
{
"name": "by",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "CURVE_SUPPLY",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "GRADUATION_SUPPLY",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "MAX_GRADUATION_FEE_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "MAX_GRADUATION_THRESHOLD",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "MAX_LAUNCH_FEE",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "MAX_VIRTUAL_ETH",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "MIN_GRADUATION_THRESHOLD",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "PULL_PAYMENT_GAS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "TIMELOCK_DELAY",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"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": "allTokens",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "cancelTreasuryChange",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "claimEth",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "cumulativePausedTime",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "currentPauseElapsed",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "curveToToken",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "emergencyElapsed",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "executeTreasuryChange",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "getTokenAt",
"type": "function",
"inputs": [
{
"name": "index",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "graduateToken",
"type": "function",
"inputs": [
{
"name": "tokenAddr",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "graduationFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "graduationManager",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract GraduationManager"
}
],
"stateMutability": "view"
},
{
"name": "graduationThreshold",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "guardian",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "isFactoryToken",
"type": "function",
"inputs": [
{
"name": "tokenAddr",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "launchFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "launchToken",
"type": "function",
"inputs": [
{
"name": "name",
"type": "string",
"internalType": "string"
},
{
"name": "symbol",
"type": "string",
"internalType": "string"
},
{
"name": "metadataURI",
"type": "string",
"internalType": "string"
},
{
"name": "dexChoice",
"type": "uint8",
"internalType": "enum BangerFactoryV6.DexChoice"
}
],
"outputs": [
{
"name": "tokenAddr",
"type": "address",
"internalType": "address"
},
{
"name": "curveAddr",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "payable"
},
{
"name": "onERC721Received",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
},
{
"name": "",
"type": "address",
"internalType": "address"
},
{
"name": "",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [
{
"name": "",
"type": "bytes4",
"internalType": "bytes4"
}
],
"stateMutability": "pure"
},
{
"name": "owner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "pause",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "paused",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "pausedSince",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "pendingOwner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "pendingTreasury",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "proposeTreasuryChange",
"type": "function",
"inputs": [
{
"name": "newTreasury",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "protocolTreasury",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "restoreCurveFromEmergency",
"type": "function",
"inputs": [
{
"name": "tokenAddr",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setGraduationFee",
"type": "function",
"inputs": [
{
"name": "newFee",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setGraduationParams",
"type": "function",
"inputs": [
{
"name": "newThreshold",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "newFee",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setGraduationThreshold",
"type": "function",
"inputs": [
{
"name": "newThreshold",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setLaunchFee",
"type": "function",
"inputs": [
{
"name": "_fee",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setSunset",
"type": "function",
"inputs": [
{
"name": "_sunset",
"type": "bool",
"internalType": "bool"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "sunset",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "sushiFactory",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract ISushiV3Factory"
}
],
"stateMutability": "view"
},
{
"name": "sushiFeeLocker",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract FeeLockerV2"
}
],
"stateMutability": "view"
},
{
"name": "sushiPositionManager",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract INonfungiblePositionManager"
}
],
"stateMutability": "view"
},
{
"name": "sushiV3Enabled",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "tokenInfo",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "bondingCurve",
"type": "address",
"internalType": "address"
},
{
"name": "creator",
"type": "address",
"internalType": "address"
},
{
"name": "dexChoice",
"type": "uint8",
"internalType": "enum BangerFactoryV6.DexChoice"
},
{
"name": "graduated",
"type": "bool",
"internalType": "bool"
},
{
"name": "lpTokenId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "feeTier",
"type": "uint24",
"internalType": "uint24"
},
{
"name": "graduatedPool",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "totalTokens",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "transferOwnership",
"type": "function",
"inputs": [
{
"name": "newOwner",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "treasuryChangeTimestamp",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "unclaimedEth",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "uniFactory",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract ISushiV3Factory"
}
],
"stateMutability": "view"
},
{
"name": "uniFeeLocker",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract FeeLockerV2"
}
],
"stateMutability": "view"
},
{
"name": "uniPositionManager",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract INonfungiblePositionManager"
}
],
"stateMutability": "view"
},
{
"name": "uniswapV3Enabled",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "unpause",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "virtualEthReserve",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "weth",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IWETH"
}
],
"stateMutability": "view"
},
{
"type": "receive",
"stateMutability": "payable"
}
]0x61020060405234801562000011575f80fd5b50604051620067c7380380620067c78339810160408190526200003491620004a6565b60015f5580516001600160a01b031615806200005b575060e08101516001600160a01b0316155b806200007357506101808101516001600160a01b0316155b15620000925760405163d92e233d60e01b815260040160405180910390fd5b8061010001515f03620000b85760405163101a52c960e21b815260040160405180910390fd5b6b033b2e3c9fd0803ce80000008161010001511115620000eb5760405163178340cb60e01b815260040160405180910390fd5b6702c68af0bb14000081610120015110806200011457506801158e460913d00000816101200151115b15620001335760405163be80e34760e01b815260040160405180910390fd5b5f61271060fa8361012001516200014b91906200059b565b620001579190620005c5565b9050808261014001511115620001805760405163179381e360e31b815260040160405180910390fd5b67016345785d8a00008261016001511115620001af57604051635919136b60e11b815260040160405180910390fd5b81516001600160a01b0390811660805260038054336001600160a01b03199182161790915560e0840151600580549092169083161790556101008301516101c052610120830151600155610140830151600255610160830151600655610180830151166101a0528151604051620002269062000428565b6001600160a01b039091168152602001604051809103905ff08015801562000250573d5f803e3d5ffd5b506001600160a01b03166101e05260608201515f9080156200027e575060208301516001600160a01b031615155b801562000297575060408301516001600160a01b031615155b80151561010052905080620002af5761dead620002b5565b82602001515b6001600160a01b031660a05280620002d05761dead620002d6565b82604001515b6001600160a01b031660c05280620002f15761dead620002f7565b82604001515b604051620003059062000436565b6001600160a01b039091168152602001604051809103905ff0801580156200032f573d5f803e3d5ffd5b506001600160a01b031660e05260c08301515f9080156200035c575060808401516001600160a01b031615155b801562000375575060a08401516001600160a01b031615155b801515610180529050806200038d5761dead62000393565b83608001515b6001600160a01b03166101205280620003af5761dead620003b5565b8360a001515b6001600160a01b03166101405280620003d15761dead620003d7565b8360a001515b604051620003e59062000436565b6001600160a01b039091168152602001604051809103905ff0801580156200040f573d5f803e3d5ffd5b506001600160a01b03166101605250620005e592505050565b61260880620033c783390190565b610df880620059cf83390190565b6040516101a081016001600160401b03811182821017156200047457634e487b7160e01b5f52604160045260245ffd5b60405290565b80516001600160a01b038116811462000491575f80fd5b919050565b8051801515811462000491575f80fd5b5f6101a08284031215620004b8575f80fd5b620004c262000444565b620004cd836200047a565b8152620004dd602084016200047a565b6020820152620004f0604084016200047a565b6040820152620005036060840162000496565b606082015262000516608084016200047a565b60808201526200052960a084016200047a565b60a08201526200053c60c0840162000496565b60c08201526200054f60e084016200047a565b60e08201526101008381015190820152610120808401519082015261014080840151908201526101608084015190820152610180620005908185016200047a565b908201529392505050565b8082028115828204841417620005bf57634e487b7160e01b5f52601160045260245ffd5b92915050565b5f82620005e057634e487b7160e01b5f52601260045260245ffd5b500490565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516101e051612ce0620006e75f395f81816104100152818161151b01528181611d7301526124cb01525f81816106b1015281816113f2015281816121e1015261221f01525f818161064a01528181610d1d01526111bf01525f81816107a3015261134501525f81816107d6015261242101525f818161075101526123fe01525f818161083c0152818161149901526123db01525f81816109d701526112e801525f818161080901526123b401525f8181610485015261239101525f818161051b015281816114bf015261236e01525f6106170152612ce05ff3fe60806040526004361061038a575f3560e01c806379ba5097116101d35780639e5a5906116100fd578063cb37ed6b1161009d578063e8fa36571161006d578063e8fa365714610b4f578063f2fde38b14610b63578063f5dab71114610b82578063fe1140a314610c11575f80fd5b8063cb37ed6b14610ae8578063cf3cf57314610afd578063e30c397814610b12578063e4ed41b014610b31575f80fd5b8063ae78a08a116100d8578063ae78a08a14610a80578063b3165ed214610aab578063b7cdddcb14610abf578063c7f2762c14610ad3575f80fd5b80639e5a590614610a18578063a463fb2514610a2c578063a4b7914e14610a47575f80fd5b80638b0bc501116101735780639293ed7e116101435780639293ed7e1461097457806397254bc1146109a75780639749f09d146109c657806397f548f7146109f9575f80fd5b80638b0bc501146109215780638da5cb5b14610936578063902d55a5146109555780639261441814610955575f80fd5b8063803db96d116101ae578063803db96d146108ba5780638120192c146108d95780638456cb59146108ee57806389f7352014610902575f80fd5b806379ba5097146108735780637dac938c146108875780637e1c0c09146108a6575f80fd5b8063452a9320116102b45780635c975abb1161025457806370da291d1161022457806370da291d146107c557806373a58f30146107f857806376771d4b1461082b578063781495991461085e575f80fd5b80635c975abb14610727578063630ec4e814610740578063634282af14610773578063691bdc2514610792575f80fd5b806352b86d2b1161028f57806352b86d2b146106a057806352f5b3ef146106d35780635313be2c146106f25780635ba1c1a914610711575f80fd5b8063452a93201461063957806348721a531461066c5780634f3a185c14610681575f80fd5b806324682b111161032a578063309e3989116102fa578063309e3989146105bf57806335625a7d146105de5780633f4ba83a146105f25780633fc8cef314610606575f80fd5b806324682b111461053d57806328ff1d4c146105715780632ed6b75d1461058c578063305902da146105ab575f80fd5b806314fbbd2c1161036557806314fbbd2c14610474578063150b7a02146104a75780631e4c7292146104eb57806322984b241461050a575f80fd5b8063026164ad146103ca5780630da3f62b146103ff57806313489bec1461044a575f80fd5b366103c657335f908152600e60205260409020546001600160a01b03166103c45760405163867783b760e01b815260040160405180910390fd5b005b5f80fd5b3480156103d5575f80fd5b506005546103ea90600160a01b900460ff1681565b60405190151581526020015b60405180910390f35b34801561040a575f80fd5b506104327f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016103f6565b348015610455575f80fd5b506104666801158e460913d0000081565b6040519081526020016103f6565b34801561047f575f80fd5b506104327f000000000000000000000000000000000000000000000000000000000000000081565b3480156104b2575f80fd5b506104d26104c1366004612807565b630a85bd0160e11b95945050505050565b6040516001600160e01b031990911681526020016103f6565b3480156104f6575f80fd5b506104666b0295be96e64066972000000081565b348015610515575f80fd5b506104327f000000000000000000000000000000000000000000000000000000000000000081565b348015610548575f80fd5b50610432610557366004612875565b600e6020525f90815260409020546001600160a01b031681565b34801561057c575f80fd5b5061046667016345785d8a000081565b348015610597575f80fd5b50600754610432906001600160a01b031681565b3480156105b6575f80fd5b50610466610c30565b3480156105ca575f80fd5b506103c46105d9366004612897565b610c60565b3480156105e9575f80fd5b5061046660fa81565b3480156105fd575f80fd5b506103c4610d12565b348015610611575f80fd5b506104327f000000000000000000000000000000000000000000000000000000000000000081565b348015610644575f80fd5b506104327f000000000000000000000000000000000000000000000000000000000000000081565b348015610677575f80fd5b50610466600b5481565b34801561068c575f80fd5b506103c461069b366004612875565b610dcc565b3480156106ab575f80fd5b506104667f000000000000000000000000000000000000000000000000000000000000000081565b3480156106de575f80fd5b506103c46106ed366004612897565b610f0a565b3480156106fd575f80fd5b506103c461070c366004612897565b610fed565b34801561071c575f80fd5b506104666202a30081565b348015610732575f80fd5b506009546103ea9060ff1681565b34801561074b575f80fd5b506104327f000000000000000000000000000000000000000000000000000000000000000081565b34801561077e575f80fd5b5061043261078d366004612897565b611082565b34801561079d575f80fd5b506103ea7f000000000000000000000000000000000000000000000000000000000000000081565b3480156107d0575f80fd5b506104327f000000000000000000000000000000000000000000000000000000000000000081565b348015610803575f80fd5b506104327f000000000000000000000000000000000000000000000000000000000000000081565b348015610836575f80fd5b506104327f000000000000000000000000000000000000000000000000000000000000000081565b348015610869575f80fd5b5061046661c35081565b34801561087e575f80fd5b506103c46110aa565b348015610892575f80fd5b506103c46108a13660046128bb565b611131565b3480156108b1575f80fd5b50600f54610466565b3480156108c5575f80fd5b50600554610432906001600160a01b031681565b3480156108e4575f80fd5b5061046660025481565b3480156108f9575f80fd5b506103c46111b4565b34801561090d575f80fd5b5061043261091c366004612897565b611244565b34801561092c575f80fd5b5061046660015481565b348015610941575f80fd5b50600354610432906001600160a01b031681565b348015610960575f80fd5b506104666b033b2e3c9fd0803ce800000081565b6109876109823660046128d6565b611272565b604080516001600160a01b039384168152929091166020830152016103f6565b3480156109b2575f80fd5b506103c46109c136600461297f565b6117f2565b3480156109d1575f80fd5b506103ea7f000000000000000000000000000000000000000000000000000000000000000081565b348015610a04575f80fd5b506103c4610a13366004612875565b61192e565b348015610a23575f80fd5b506103c4611db3565b348015610a37575f80fd5b506104666702c68af0bb14000081565b348015610a52575f80fd5b506103ea610a61366004612875565b6001600160a01b039081165f908152600d602052604090205416151590565b348015610a8b575f80fd5b50610466610a9a366004612875565b600c6020525f908152604090205481565b348015610ab6575f80fd5b506103c4611e8d565b348015610aca575f80fd5b506103c4611ece565b348015610ade575f80fd5b50610466600a5481565b348015610af3575f80fd5b5061046660085481565b348015610b08575f80fd5b5061046660065481565b348015610b1d575f80fd5b50600454610432906001600160a01b031681565b348015610b3c575f80fd5b506104666aa56fa5b99019a5c800000081565b348015610b5a575f80fd5b50610466611fbb565b348015610b6e575f80fd5b506103c4610b7d366004612875565b611ff8565b348015610b8d575f80fd5b50610bfd610b9c366004612875565b600d6020525f9081526040902080546001820154600283015460038401546004909401546001600160a01b0393841694928416938281169360ff600160a01b8504811694600160a81b90041692909162ffffff821691630100000090041688565b6040516103f69897969594939291906129d3565b348015610c1c575f80fd5b506103c4610c2b366004612875565b61209b565b6009545f9060ff161580610c445750600a54155b15610c4e57505f90565b600a54610c5b9042612a46565b905090565b6003546001600160a01b03163314610c8b57604051635fc483c560e01b815260040160405180910390fd5b5f61271060fa600154610c9e9190612a5f565b610ca89190612a76565b905080821115610ccb5760405163179381e360e31b815260040160405180910390fd5b600280549083905560408051828152602081018590527fccacd6248103a034fa1ccdec838a464619657e424f6b39dc4e6ff2d8265b9a7b91015b60405180910390a1505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610d5b57604051636570ecab60e11b815260040160405180910390fd5b60095460ff1615610dca57600a5415610d9157600a54610d7b9042612a46565b600b5f828254610d8b9190612a95565b90915550505b6009805460ff191690555f600a81905560405133917f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa91a25b565b6003546001600160a01b03163314610df757604051635fc483c560e01b815260040160405180910390fd5b610dff61215b565b6001600160a01b038082165f908152600d602052604090208054909116610e3957604051630cbdb7b360e41b815260040160405180910390fd5b60095460ff1615610e5d5760405163028e68af60e31b815260040160405180910390fd5b806001015f9054906101000a90046001600160a01b03166001600160a01b031663fc4c20a26040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610eab575f80fd5b505af1158015610ebd573d5f803e3d5ffd5b5050505060018101546040516001600160a01b03918216918416907f283440c67c7a1fa53726f70b3f97009ab1501ed149a2748f7aa20dd5d609082a905f90a350610f0760015f55565b50565b6003546001600160a01b03163314610f3557604051635fc483c560e01b815260040160405180910390fd5b6702c68af0bb140000811080610f5357506801158e460913d0000081115b15610f715760405163be80e34760e01b815260040160405180910390fd5b5f612710610f8060fa84612a5f565b610f8a9190612a76565b9050806002541115610faf5760405163179381e360e31b815260040160405180910390fd5b600180549083905560408051828152602081018590527f74fa33832976c63d8bc0ee8ecb7180955e8222b437b61c2d88aa8acdbc0ba1bc9101610d05565b6003546001600160a01b0316331461101857604051635fc483c560e01b815260040160405180910390fd5b67016345785d8a000081111561104157604051635919136b60e11b815260040160405180910390fd5b60065460408051918252602082018390527f0fd958ac60db1437ae35514054402c4e597e81881e4b6dd47a6509bd89121428910160405180910390a1600655565b600f8181548110611091575f80fd5b5f918252602090912001546001600160a01b0316905081565b6004546001600160a01b031633146110d5576040516303c25d1960e61b815260040160405180910390fd5b60038054600480546001600160a01b03198084166001600160a01b038381169182179096559116909155604051929091169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a350565b6003546001600160a01b0316331461115c57604051635fc483c560e01b815260040160405180910390fd5b60058054821515600160a01b0260ff60a01b199091161790556040517fcd62b3824d2183ae05f654408a9f8a5768f44218ec6eea3722d91b9405d2757e906111a990831515815260200190565b60405180910390a150565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111fd57604051636570ecab60e11b815260040160405180910390fd5b60095460ff16610dca576009805460ff1916600117905542600a5560405133907f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258905f90a2565b5f600f828154811061125857611258612aa8565b5f918252602090912001546001600160a01b031692915050565b5f8061127c61215b565b60095460ff16156112a057604051633461791360e11b815260040160405180910390fd5b600554600160a01b900460ff16156112cb5760405163107f189160e01b815260040160405180910390fd5b5f8360018111156112de576112de61299f565b14801561130957507f0000000000000000000000000000000000000000000000000000000000000000155b156113275760405163be34d26560e01b815260040160405180910390fd5b600183600181111561133b5761133b61299f565b14801561136657507f0000000000000000000000000000000000000000000000000000000000000000155b156113845760405163be34d26560e01b815260040160405180910390fd5b6006543410156113a75760405163ceaba46f60e01b815260040160405180910390fd5b600554600154604051630c8af22160e31b815273af1ac0e41940ee0e565a051d0185477eff2ce95e9263645791089261141b928e928e928e928e9233926001600160a01b03909116917f00000000000000000000000000000000000000000000000000000000000000009190600401612ae4565b6040805180830381865af4158015611435573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114599190612b3b565b909250905061147e6001600160a01b038316826b0295be96e640669720000000612183565b5f808460018111156114925761149261299f565b146114bd577f00000000000000000000000000000000000000000000000000000000000000006114df565b7f00000000000000000000000000000000000000000000000000000000000000005b90505f6114ea6121da565b6040516370c4bbaf60e01b81526001600160a01b0386811660048301528481166024830152604482018390529192507f0000000000000000000000000000000000000000000000000000000000000000909116906370c4bbaf906064015f604051808303815f87803b15801561155e575f80fd5b505af1158015611570573d5f803e3d5ffd5b505050505050604051806101000160405280836001600160a01b03168152602001826001600160a01b03168152602001336001600160a01b031681526020018460018111156115c1576115c161299f565b81525f60208083018290526040808401839052606080850184905260809094018390526001600160a01b038781168452600d835292819020855181549085166001600160a01b03199182161782559286015160018281018054928716928616929092179091559186015160028201805491909516938116841785559486015190949093926001600160a81b03199091161790600160a01b90849081111561166a5761166a61299f565b02179055506080820151600282018054911515600160a81b0260ff60a81b1990921691909117905560a0820151600382015560c08201516004909101805460e0909301516001600160a01b039081166301000000026001600160b81b031990941662ffffff90931692909217929092179091558181165f908152600e6020526040812080549285166001600160a01b03199384168117909155600f80546001810182559083527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802018054909316179091556006546117489034612a46565b9050801561175a5761175a3382612277565b6006541561177b5760055460065461177b916001600160a01b031690612277565b336001600160a01b0316826001600160a01b0316846001600160a01b03167fbe8847e9c0d2ddb0e8929a4466675e6174f16f710e2293e5b6fb447d6a297feb8d8d8d8d8d8d8d6040516117d49796959493929190612b73565b60405180910390a4506117e660015f55565b97509795505050505050565b6003546001600160a01b0316331461181d57604051635fc483c560e01b815260040160405180910390fd5b6702c68af0bb14000082108061183b57506801158e460913d0000082115b156118595760405163be80e34760e01b815260040160405180910390fd5b5f61271061186860fa85612a5f565b6118729190612a76565b9050808211156118955760405163179381e360e31b815260040160405180910390fd5b600180546002805492869055849055908482146118e65760408051838152602081018790527f74fa33832976c63d8bc0ee8ecb7180955e8222b437b61c2d88aa8acdbc0ba1bc910160405180910390a15b8084146119275760408051828152602081018690527fccacd6248103a034fa1ccdec838a464619657e424f6b39dc4e6ff2d8265b9a7b910160405180910390a15b5050505050565b61193661215b565b6001600160a01b038082165f908152600d60205260409020805490911661197057604051630cbdb7b360e41b815260040160405180910390fd5b6002810154600160a81b900460ff161561199d5760405163e6a0d45f60e01b815260040160405180910390fd5b60028101805460ff60a81b1916600160a81b1790556001810154604080516206e61760ed1b815290515f92839283926001600160a01b0390921691829163dcc2e0009160048083019260209291908290030181865afa158015611a02573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a269190612bca565b611a43576040516326bbb0b160e01b815260040160405180910390fd5b806001600160a01b0316639d1b464a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a7f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611aa39190612be5565b9250806001600160a01b03166302d05d3f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ae1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b059190612bfc565b91505f80826001600160a01b0316638b0bc5016040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b45573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b699190612be5565b90505f612710611b7a60fa84612a5f565b611b849190612a76565b90508060025411611b9757600254611b99565b805b9250505080826001600160a01b0316632ab04c7b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bda573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bfe9190612be5565b611c089190612a46565b94506001600160a01b03821663ec5f5e9a611c238388612a95565b846001600160a01b031663b497ab926040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c5f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c839190612be5565b6040516001600160e01b031960e085901b168152600481019290925260248201526044015f604051808303815f87803b158015611cbe575f80fd5b505af1158015611cd0573d5f803e3d5ffd5b505050505f811115611cf257600554611cf2906001600160a01b031682612277565b50506040516370a0823160e01b81523060048201525f906001600160a01b038716906370a0823190602401602060405180830381865afa158015611d38573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d5c9190612be5565b90508015611d9857611d986001600160a01b0387167f000000000000000000000000000000000000000000000000000000000000000083612183565b50611da68486858585612342565b50505050610f0760015f55565b6003546001600160a01b03163314611dde57604051635fc483c560e01b815260040160405180910390fd5b6007546001600160a01b0316611e07576040516312047a6d60e11b815260040160405180910390fd5b600854421015611e2a57604051637378c19d60e01b815260040160405180910390fd5b60058054600780546001600160a01b03198084166001600160a01b0383811691821790965591169091555f60088190556040519390921692909183917f8c3aa5f43a388513435861bf27dfad7829cd248696fed367c62d441f629544969190a350565b6003546001600160a01b03163314611eb857604051635fc483c560e01b815260040160405180910390fd5b600780546001600160a01b03191690555f600855565b611ed661215b565b335f908152600c602052604081205490819003611f06576040516312d37ee560e31b815260040160405180910390fd5b335f818152600c60205260408082208290555190919083908381818185875af1925050503d805f8114611f54576040519150601f19603f3d011682016040523d82523d5f602084013e611f59565b606091505b5050905080611f7b576040516312171d8360e31b815260040160405180910390fd5b60405182815233907f0d7976053781e071cecf47e898ad2a6dc87621ca33734e96eb4b92453319e8c99060200160405180910390a25050610dca60015f55565b600b546009545f919060ff168015611fd457505f600a54115b15611ff357600a54611fe69042612a46565b611ff09082612a95565b90505b919050565b6003546001600160a01b0316331461202357604051635fc483c560e01b815260040160405180910390fd5b6001600160a01b03811661204a5760405163d92e233d60e01b815260040160405180910390fd5b600480546001600160a01b0319166001600160a01b03838116918217909255600354604051919216907f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700905f90a350565b6003546001600160a01b031633146120c657604051635fc483c560e01b815260040160405180910390fd5b6001600160a01b0381166120ed5760405163d92e233d60e01b815260040160405180910390fd5b600780546001600160a01b0319166001600160a01b0383161790556121156202a30042612a95565b60088190556040519081526001600160a01b038216907f2fdb8aa18e3708b0dfed4acb0de7452e85e7f833b1b055880cef38e8bee690b59060200160405180910390a250565b60025f540361217d57604051633ee5aeb560e01b815260040160405180910390fd5b60025f55565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526121d5908490612738565b505050565b5f806001547f000000000000000000000000000000000000000000000000000000000000000061220a9190612a95565b90505f6122436b0295be96e6406697200000007f0000000000000000000000000000000000000000000000000000000000000000612a5f565b90505f6122508383612a76565b90508061226584670de0b6b3a7640000612a5f565b61226f9190612a76565b935050505090565b5f826001600160a01b03168261c350906040515f60405180830381858888f193505050503d805f81146122c5576040519150601f19603f3d011682016040523d82523d5f602084013e6122ca565b606091505b50509050806121d5576001600160a01b0383165f908152600c6020526040812080548492906122fa908490612a95565b90915550506040518281526001600160a01b038416907fe5cb8d81473b57bd1e538dcb737d485e0c5b8ecf1e30516945ca99fcddab31529060200160405180910390a2505050565b5f8080806002890154600160a01b900460ff1660018111156123665761236661299f565b036123d857507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000612441565b507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f00000000000000000000000000000000000000000000000000000000000000005b6040805160c0810182526001600160a01b038981168252602082018981526005548216838501908152878316606085019081528784166080860190815260a086018c8152965163b25b68a560e01b81529551851660048701529251602486015290518316604485015251821660648401525181166084830152915160a48201525f918291829182917f00000000000000000000000000000000000000000000000000000000000000009091169063b25b68a5908c9060c40160806040518083038185885af1158015612515573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061253a9190612c17565b9350935093509350846001600160a01b03166302b4bdec6040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561257a575f80fd5b505af115801561258c573d5f803e3d5ffd5b5050604051632142170760e11b81523060048201526001600160a01b03888116602483015260448201889052891692506342842e0e91506064015f604051808303815f87803b1580156125dd575f80fd5b505af11580156125ef573d5f803e3d5ffd5b5050600554604051632530c5b960e21b8152600481018890526001600160a01b038c81166024830152918216604482015290881692506394c316e491506064015f604051808303815f87803b158015612646575f80fd5b505af1158015612658573d5f803e3d5ffd5b50505050838c60030181905550828c6004015f6101000a81548162ffffff021916908362ffffff160217905550808c60040160036101000a8154816001600160a01b0302191690836001600160a01b031602179055508b6001015f9054906101000a90046001600160a01b03166001600160a01b03168b6001600160a01b03167f953aa84a278048673b5778b1045dcb91ec88f4eb714b09801e97014facc306d78e60020160149054906101000a900460ff16878e87898860405161272296959493929190612c66565b60405180910390a3505050505050505050505050565b5f8060205f8451602086015f885af180612757576040513d5f823e3d81fd5b50505f513d9150811561276e57806001141561277b565b6001600160a01b0384163b155b156127a857604051635274afe760e01b81526001600160a01b038516600482015260240160405180910390fd5b50505050565b6001600160a01b0381168114610f07575f80fd5b5f8083601f8401126127d2575f80fd5b50813567ffffffffffffffff8111156127e9575f80fd5b602083019150836020828501011115612800575f80fd5b9250929050565b5f805f805f6080868803121561281b575f80fd5b8535612826816127ae565b94506020860135612836816127ae565b935060408601359250606086013567ffffffffffffffff811115612858575f80fd5b612864888289016127c2565b969995985093965092949392505050565b5f60208284031215612885575f80fd5b8135612890816127ae565b9392505050565b5f602082840312156128a7575f80fd5b5035919050565b8015158114610f07575f80fd5b5f602082840312156128cb575f80fd5b8135612890816128ae565b5f805f805f805f6080888a0312156128ec575f80fd5b873567ffffffffffffffff80821115612903575f80fd5b61290f8b838c016127c2565b909950975060208a0135915080821115612927575f80fd5b6129338b838c016127c2565b909750955060408a013591508082111561294b575f80fd5b506129588a828b016127c2565b90945092505060608801356002811061296f575f80fd5b8091505092959891949750929550565b5f8060408385031215612990575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b600281106129cf57634e487b7160e01b5f52602160045260245ffd5b9052565b6001600160a01b03898116825288811660208301528781166040830152610100820190612a0360608401896129b3565b86151560808401528560a084015262ffffff851660c084015280841660e0840152509998505050505050505050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115612a5957612a59612a32565b92915050565b8082028115828204841417612a5957612a59612a32565b5f82612a9057634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115612a5957612a59612a32565b634e487b7160e01b5f52603260045260245ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b60c081525f612af760c083018a8c612abc565b8281036020840152612b0a81898b612abc565b6001600160a01b03978816604085015295909616606083015250608081019290925260a09091015295945050505050565b5f8060408385031215612b4c575f80fd5b8251612b57816127ae565b6020840151909250612b68816127ae565b809150509250929050565b608081525f612b8660808301898b612abc565b8281036020840152612b9981888a612abc565b90508281036040840152612bae818688612abc565b915050612bbe60608301846129b3565b98975050505050505050565b5f60208284031215612bda575f80fd5b8151612890816128ae565b5f60208284031215612bf5575f80fd5b5051919050565b5f60208284031215612c0c575f80fd5b8151612890816127ae565b5f805f8060808587031215612c2a575f80fd5b84519350602085015162ffffff81168114612c43575f80fd5b604086015160608701519194509250612c5b816127ae565b939692955090935050565b60c08101612c7482896129b3565b60208201969096526040810194909452606084019290925262ffffff1660808301526001600160a01b031660a09091015291905056fea2646970667358221220fb02568643cc9dc6dae97b53e7cb4502913aaf47d46aa5d3396c81394c30a9cb64736f6c6343000818003360c060405234801562000010575f80fd5b506040516200260838038062002608833981016040819052620000339162000094565b60015f556001600160a01b0381166200007e5760405162461bcd60e51b81526020600482015260096024820152680f4cae4de40ae8aa8960bb1b604482015260640160405180910390fd5b6001600160a01b03166080523360a052620000c3565b5f60208284031215620000a5575f80fd5b81516001600160a01b0381168114620000bc575f80fd5b9392505050565b60805160a0516124cf620001395f395f818161036b015281816103b70152818161049b0152610fdf01525f8181610102015281816101f1015281816103f7015281816105100152818161057301528181610db00152818161118a015281816111c3015281816119c80152611a6701526124cf5ff3fe6080604052600436106100f2575f3560e01c8063a014fb2811610087578063b25b68a511610057578063b25b68a514610306578063b7cdddcb14610346578063c45a01551461035a578063fa461e331461038d575f80fd5b8063a014fb281461029d578063a47084a9146102b2578063ad34ec25146102c6578063ae78a08a146102db575f80fd5b806360174036116100c2578063601740361461022b5780636882a8881461024057806370c4bbaf146102695780637814959914610288575f80fd5b8063045013d1146101465780630f03138d14610173578063150b7a021461019c5780633fc8cef3146101e0575f80fd5b3661014257336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101405760405163867783b760e01b815260040160405180910390fd5b005b5f80fd5b348015610151575f80fd5b5061016066038d7ea4c6800081565b6040519081526020015b60405180910390f35b34801561017e575f80fd5b5061018861271081565b60405162ffffff909116815260200161016a565b3480156101a7575f80fd5b506101c76101b6366004612015565b630a85bd0160e11b95945050505050565b6040516001600160e01b0319909116815260200161016a565b3480156101eb575f80fd5b506102137f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161016a565b348015610236575f80fd5b506101886101f481565b34801561024b575f80fd5b50610256620d89e881565b60405160029190910b815260200161016a565b348015610274575f80fd5b50610140610283366004612083565b6103ac565b348015610293575f80fd5b5061016061c35081565b3480156102a8575f80fd5b50610188610bb881565b3480156102bd575f80fd5b50610160603281565b3480156102d1575f80fd5b5061016061012c81565b3480156102e6575f80fd5b506101606102f53660046120c1565b60016020525f908152604090205481565b6103196103143660046120dc565b61048c565b6040805194855262ffffff9093166020850152918301526001600160a01b0316606082015260800161016a565b348015610351575f80fd5b50610140610701565b348015610365575f80fd5b506102137f000000000000000000000000000000000000000000000000000000000000000081565b348015610398575f80fd5b506101406103a73660046120f2565b6107f0565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146103f557604051630636a15760e11b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03808216908516105f816104315782610433565b855b90505f826104415786610443565b835b90505f6104508685610919565b90506104628383612710848b8d610a44565b6104728383610bb8848b8d610a44565b61048283836101f4848b8d610a44565b5050505050505050565b5f808080336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104d957604051630636a15760e11b815260040160405180910390fd5b6104e1610c83565b846020013534146105055760405163bc6f88c560e01b815260040160405180910390fd5b5f6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001661053d60208801886120c1565b6001600160a01b03161090505f6003819055505f61055f8760a0013583610919565b90506105a961057160208901896120c1565b7f000000000000000000000000000000000000000000000000000000000000000084846105a460808d0160608e016120c1565b610cab565b60035491965093505f91506105c2906020890135612155565b5f60038190559091506105d860208901896120c1565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa15801561061c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106409190612168565b905060a088013561065983670de0b6b3a764000061217f565b61066391906121aa565b945080851115610671578094505b5061067f8783868885610d99565b955061068e60208801886120c1565b604080518881526020810184905290810186905262ffffff871660608201526001600160a01b03858116608083015291909116907fdeaf6e5105d31f5e391836ff3de7ecc4ec89afac1580eeecbd138a6dec3fa56f9060a00160405180910390a250506106fa60015f55565b9193509193565b610709610c83565b335f9081526001602052604081205490819003610739576040516312d37ee560e31b815260040160405180910390fd5b335f818152600160205260408082208290555190919083908381818185875af1925050503d805f8114610787576040519150601f19603f3d011682016040523d82523d5f602084013e61078c565b606091505b50509050806107ae576040516312171d8360e31b815260040160405180910390fd5b60405182815233907f0d7976053781e071cecf47e898ad2a6dc87621ca33734e96eb4b92453319e8c99060200160405180910390a250506107ee60015f55565b565b6002546001600160a01b03168015806108125750336001600160a01b03821614155b1561083057604051636f7349f760e11b815260040160405180910390fd5b5f8513156108a1576108a1816001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015610877573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061089b91906121bd565b86611160565b5f84131561091257610912816001600160a01b031663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108e8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061090c91906121bd565b85611160565b5050505050565b5f80831161095b5760405162461bcd60e51b815260206004820152600a6024820152697a65726f20707269636560b01b60448201526064015b60405180910390fd5b5f61096584611260565b90505f81116109a25760405162461bcd60e51b815260206004820152600960248201526873717274207a65726f60b81b6044820152606401610952565b5f83156109cd57633b9aca006109bc83600160601b61217f565b6109c691906121aa565b90506109e0565b6109dd82621dcd6560691b6121aa565b90505b5f811180156109f657506001600160a01b038111155b610a3a5760405162461bcd60e51b8152602060048201526015602482015274737172745072696365583936206f766572666c6f7760581b6044820152606401610952565b9150505b92915050565b5f610a4f83866113b8565b90505f8160020b13610a615750610c7b565b604051630b4c774160e11b81525f906001600160a01b03851690631698ee8290610a93908b908b908b906004016121d8565b602060405180830381865afa158015610aae573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ad291906121bd565b90506001600160a01b038116610bde5760405163a167129560e01b81526001600160a01b0385169063a167129590610b12908b908b908b906004016121d8565b6020604051808303815f875af1925050508015610b4c575060408051601f3d908101601f19168201909252610b49918101906121bd565b60015b610bdb57604051630b4c774160e11b81526001600160a01b03851690631698ee8290610b80908b908b908b906004016121d8565b602060405180830381865afa158015610b9b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bbf91906121bd565b90506001600160a01b038116610bd6575050610c7b565b610bde565b90505b60405163f637731d60e01b81526001600160a01b03868116600483015282169063f637731d906024015f604051808303815f87803b158015610c1e575f80fd5b505af1925050508015610c2f575060015b5060405162ffffff871681526001600160a01b0380831691908516907fdff247fa96e9643c3bb27b2b65a6bd253dbaeabc8f1175ea98857e4caed184839060200160405180910390a350505b505050505050565b60025f5403610ca557604051633ee5aeb560e01b815260040160405180910390fd5b60025f55565b5f805f610cba846127106113b8565b60020b1315610cf0575f80610cd58989898989612710611431565b915091508115610ced5761271093509150610d8f9050565b50505b5f610cfd84610bb86113b8565b60020b1315610d33575f80610d188989898989610bb8611431565b915091508115610d3057610bb893509150610d8f9050565b50505b5f610d40846101f46113b8565b60020b1315610d76575f80610d5b89898989896101f4611431565b915091508115610d73576101f493509150610d8f9050565b50505b604051635c7f1e4d60e01b815260040160405180910390fd5b9550959350505050565b6040516370a0823160e01b81523060048201525f907f00000000000000000000000000000000000000000000000000000000000000009082906001600160a01b038316906370a0823190602401602060405180830381865afa158015610e01573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e259190612168565b9050816001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004015f604051808303818588803b158015610e60575f80fd5b505af1158015610e72573d5f803e3d5ffd5b5050505050610e9e886080016020810190610e8d91906120c1565b6001600160a01b03841690866116fc565b610ecf610eb160a08a0160808b016120c1565b87610ebf60208c018c6120c1565b6001600160a01b031691906116fc565b604080516101008101909152610f6b9080610eed60208c018c6120c1565b6001600160a01b03168152602001846001600160a01b0316815260200189151581526020018681526020018881526020018a6080016020810190610f3191906120c1565b6001600160a01b03168152602001610f4f60808c0160608d016120c1565b6001600160a01b031681526020018762ffffff168152506117bf565b9250610f91610f8060a08a0160808b016120c1565b6001600160a01b038416905f6116fc565b610fb2610fa460a08a0160808b016120c1565b5f610ebf60208c018c6120c1565b610fc260a0890160808a016120c1565b604051632142170760e11b81523060048201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660248301526044820186905291909116906342842e0e906064015f604051808303815f87803b158015611031575f80fd5b505af1158015611043573d5f803e3d5ffd5b505f925061105791505060208a018a6120c1565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a0823190602401602060405180830381865afa15801561109b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110bf9190612168565b9050801561113b576110eb61dead826110db60208d018d6120c1565b6001600160a01b0316919061197b565b6110f860208a018a6120c1565b6001600160a01b03167fd68ef10911c48f3459384c11cb2149527256c29bb7e4f25c26f18b44c9aed5638260405161113291815260200190565b60405180910390a25b5061115561114f60608a0160408b016120c1565b826119b1565b505095945050505050565b66038d7ea4c6800081111561118857604051637b2e3c6160e11b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031603611248577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004015f604051808303818588803b15801561121a575f80fd5b505af115801561122c573d5f803e3d5ffd5b50505050508060035f8282546112429190612200565b90915550505b61125c6001600160a01b038316338361197b565b5050565b5f6001821161126d575090565b816001600160801b82106112865760809190911c9060401b5b6801000000000000000082106112a15760409190911c9060201b5b64010000000082106112b85760209190911c9060101b5b6201000082106112cd5760109190911c9060081b5b61010082106112e15760089190911c9060041b5b601082106112f45760049190911c9060021b5b600482106113005760011b5b600302600190811c9081858161131857611318612196565b048201901c9050600181858161133057611330612196565b048201901c9050600181858161134857611348612196565b048201901c9050600181858161136057611360612196565b048201901c9050600181858161137857611378612196565b048201901c9050600181858161139057611390612196565b048201901c90506113af8185816113a9576113a9612196565b04821190565b90039392505050565b6040516322afcccb60e01b815262ffffff821660048201525f906001600160a01b038416906322afcccb90602401602060405180830381865afa92505050801561141f575060408051601f3d908101601f1916820190925261141c91810190612229565b60015b61142a57505f610a3e565b9050610a3e565b5f805f8661143f5787611441565b885b90505f8761144f5789611451565b885b604051630b4c774160e11b81529091506001600160a01b03871690631698ee829061148490859085908a906004016121d8565b602060405180830381865afa15801561149f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114c391906121bd565b92506001600160a01b0383166115bc5760405163a167129560e01b81526001600160a01b0387169063a16712959061150390859085908a906004016121d8565b6020604051808303815f875af192505050801561153d575060408051601f3d908101601f1916820190925261153a918101906121bd565b60015b61154e575f809350935050506116f1565b60405163f637731d60e01b81526001600160a01b0389811660048301529194509084169063f637731d906024015f604051808303815f87803b158015611592575f80fd5b505af19250505080156115a3575060015b6115b1575f935050506116f1565b6001935050506116f1565b5f836001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa1580156115f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061161d9190612253565b5050505050509050806001600160a01b03165f036116a15760405163f637731d60e01b81526001600160a01b03898116600483015285169063f637731d906024015f604051808303815f87803b158015611675575f80fd5b505af1925050508015611686575060015b611695575f94505050506116f1565b600194505050506116f1565b6116bd816001600160a01b0316896001600160a01b0316611b93565b156116ce57600194505050506116f1565b6116d984828a611c40565b156116ea57600194505050506116f1565b5f94505050505b965096945050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b17905261174d8482611dcb565b6117b9576040516001600160a01b0384811660248301525f60448301526117af91869182169063095ea7b3906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050611e14565b6117b98482611e14565b50505050565b5f805f6117d48460c001518560e00151611e80565b915091505f84604001516117ec5784606001516117f2565b84608001515b90505f856040015161180857856080015161180e565b85606001515b90505f61271061182061012c82612155565b61182a908561217f565b61183491906121aa565b90505f61271061184661012c82612155565b611850908561217f565b61185a91906121aa565b90508760a001516001600160a01b031663883164566040518061016001604052808b6040015161188e578b60200151611891565b8b515b6001600160a01b031681526020018b604001516118af578b516118b5565b8b602001515b6001600160a01b031681526020018b60e0015162ffffff1681526020018960020b81526020018860020b8152602001878152602001868152602001858152602001848152602001306001600160a01b03168152602001428152506040518263ffffffff1660e01b815260040161192b91906122e6565b6080604051808303815f875af1158015611947573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061196b91906123aa565b50919a9950505050505050505050565b6040516001600160a01b038381166024830152604482018390526119ac91859182169063a9059cbb9060640161177d565b505050565b6040516370a0823160e01b81523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611a15573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a399190612168565b9050818111156119ac575f611a4e8383612155565b604051632e1a7d4d60e01b8152600481018290529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d906024015f604051808303815f87803b158015611ab0575f80fd5b505af1158015611ac2573d5f803e3d5ffd5b505050505f846001600160a01b03168261c350906040515f60405180830381858888f193505050503d805f8114611b14576040519150601f19603f3d011682016040523d82523d5f602084013e611b19565b606091505b5050905080610912576001600160a01b0385165f9081526001602052604081208054849290611b49908490612200565b90915550506040518281526001600160a01b038616907fe5cb8d81473b57bd1e538dcb737d485e0c5b8ecf1e30516945ca99fcddab31529060200160405180910390a25050505050565b5f815f03611ba257505f610a3e565b825f03611bb057505f610a3e565b611bbb82600261217f565b831180611bd15750611bce83600261217f565b82115b15611bdd57505f610a3e565b5f828411611bf457611bef8484612155565b611bfe565b611bfe8385612155565b90505f611c0b8486612200565b90505f611c2483611c1e8461271061217f565b87611ee3565b90505f611c3286603261217f565b909111159695505050505050565b5f6001600160a01b0383161580611c685750816001600160a01b0316836001600160a01b0316145b15611c7457505f611dc4565b600280546001600160a01b0319166001600160a01b03868116918217909255604051630251596160e31b815230600482015284831692861683106024820181905266038d7ea4c680006044830152606482019390935260a060848201525f60a482015263128acb089060c40160408051808303815f875af1925050508015611d19575060408051601f3d908101601f19168201909252611d16918101906123f9565b60015b15611d215750505b600280546001600160a01b031916905560408051633850c7bd60e01b815290515f916001600160a01b03881691633850c7bd9160048082019260e0929091908290030181865afa158015611d77573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d9b9190612253565b5050505050509050611dbf816001600160a01b0316856001600160a01b0316611b93565b925050505b9392505050565b5f805f8060205f8651602088015f8a5af192503d91505f519050828015611e0a57508115611dfc5780600114611e0a565b5f866001600160a01b03163b115b9695505050505050565b5f8060205f8451602086015f885af180611e33576040513d5f823e3d81fd5b50505f513d91508115611e4a578060011415611e57565b6001600160a01b0384163b155b156117b957604051635274afe760e01b81526001600160a01b0385166004820152602401610952565b5f805f611e8d85856113b8565b90505f8160020b13611eb25760405163c3cec22360e01b815260040160405180910390fd5b5f81611ec181620d89e861241b565b611ecb9190612453565b9050611ed681612479565b93509150505b9250929050565b5f805f611ef08686611f93565b91509150815f03611f1457838181611f0a57611f0a612196565b0492505050611dc4565b818411611f2b57611f2b6003851502601118611faf565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010185841190960395909502919093039390930492909217029150509392505050565b5f805f1983850993909202808410938190039390930393915050565b634e487b715f52806020526024601cfd5b6001600160a01b0381168114611fd4575f80fd5b50565b5f8083601f840112611fe7575f80fd5b50813567ffffffffffffffff811115611ffe575f80fd5b602083019150836020828501011115611edc575f80fd5b5f805f805f60808688031215612029575f80fd5b853561203481611fc0565b9450602086013561204481611fc0565b935060408601359250606086013567ffffffffffffffff811115612066575f80fd5b61207288828901611fd7565b969995985093965092949392505050565b5f805f60608486031215612095575f80fd5b83356120a081611fc0565b925060208401356120b081611fc0565b929592945050506040919091013590565b5f602082840312156120d1575f80fd5b8135611dc481611fc0565b5f60c082840312156120ec575f80fd5b50919050565b5f805f8060608587031215612105575f80fd5b8435935060208501359250604085013567ffffffffffffffff811115612129575f80fd5b61213587828801611fd7565b95989497509550505050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610a3e57610a3e612141565b5f60208284031215612178575f80fd5b5051919050565b8082028115828204841417610a3e57610a3e612141565b634e487b7160e01b5f52601260045260245ffd5b5f826121b8576121b8612196565b500490565b5f602082840312156121cd575f80fd5b8151611dc481611fc0565b6001600160a01b03938416815291909216602082015262ffffff909116604082015260600190565b80820180821115610a3e57610a3e612141565b8051600281900b8114612224575f80fd5b919050565b5f60208284031215612239575f80fd5b611dc482612213565b805161ffff81168114612224575f80fd5b5f805f805f805f60e0888a031215612269575f80fd5b875161227481611fc0565b965061228260208901612213565b955061229060408901612242565b945061229e60608901612242565b93506122ac60808901612242565b925060a088015160ff811681146122c1575f80fd5b60c089015190925080151581146122d6575f80fd5b8091505092959891949750929550565b81516001600160a01b031681526101608101602083015161231260208401826001600160a01b03169052565b506040830151612329604084018262ffffff169052565b50606083015161233e606084018260020b9052565b506080830151612353608084018260020b9052565b5060a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525061012080840151612399828501826001600160a01b03169052565b505061014092830151919092015290565b5f805f80608085870312156123bd575f80fd5b8451935060208501516fffffffffffffffffffffffffffffffff811681146123e3575f80fd5b6040860151606090960151949790965092505050565b5f806040838503121561240a575f80fd5b505080516020909101519092909150565b5f8160020b8360020b8061243157612431612196565b627fffff1982145f198214161561244a5761244a612141565b90059392505050565b5f8260020b8260020b028060020b915080821461247257612472612141565b5092915050565b5f8160020b627fffff19810361249157612491612141565b5f039291505056fea2646970667358221220a1629db4d0f7ff4b398ffb8e3656ce939f8c6be3afc0e1843040a63af5294fce64736f6c6343000818003360c060405234801561000f575f80fd5b50604051610df8380380610df883398101604081905261002e916100a1565b60015f556001600160a01b03811661008c5760405162461bcd60e51b815260206004820152601460248201527f4665654c6f636b657256323a207a65726f20504d000000000000000000000000604482015260640160405180910390fd5b6001600160a01b03166080523360a0526100ce565b5f602082840312156100b1575f80fd5b81516001600160a01b03811681146100c7575f80fd5b9392505050565b60805160a051610ce66101125f395f8181610289015281816102d501526103d501525f81816101bf0152818161032e015281816105b301526106680152610ce65ff3fe608060405260043610610092575f3560e01c806394c316e41161005757806394c316e4146102265780639ef282b914610245578063b17acdcd14610259578063c45a015514610278578063f66111e5146102ab575f80fd5b806301a5e163146100e857806302b4bdec14610160578063150b7a0214610176578063791b98bc146101ae5780637d07b2d2146101f9575f80fd5b366100e45760405162461bcd60e51b815260206004820152601960248201527f4665654c6f636b657256323a206e6f207374726179204554480000000000000060448201526064015b60405180910390fd5b5f80fd5b3480156100f3575f80fd5b506101336101023660046109b6565b600160208190525f918252604090912080549101546001600160a01b0391821691811690600160a01b900460ff1683565b604080516001600160a01b0394851681529390921660208401521515908201526060015b60405180910390f35b34801561016b575f80fd5b506101746102ca565b005b348015610181575f80fd5b506101956101903660046109e1565b610322565b6040516001600160e01b03199091168152602001610157565b3480156101b9575f80fd5b506101e17f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610157565b348015610204575f80fd5b506102186102133660046109b6565b6103ab565b604051908152602001610157565b348015610231575f80fd5b50610174610240366004610a78565b6103ca565b348015610250575f80fd5b50600254610218565b348015610264575f80fd5b506101746102733660046109b6565b61054e565b348015610283575f80fd5b506101e17f000000000000000000000000000000000000000000000000000000000000000081565b3480156102b6575f80fd5b506101746102c5366004610ab7565b6107e7565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461031357604051630636a15760e11b815260040160405180910390fd5b6003805460ff19166001179055565b5f336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461036c576040516328b05d3b60e01b815260040160405180910390fd5b60035460ff1661038f576040516328b05d3b60e01b815260040160405180910390fd5b506003805460ff19169055630a85bd0160e11b95945050505050565b600281815481106103ba575f80fd5b5f91825260209091200154905081565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461041357604051630636a15760e11b815260040160405180910390fd5b6001600160a01b0382161580159061043357506001600160a01b03811615155b6104785760405162461bcd60e51b81526020600482015260166024820152752332b2a637b1b5b2b92b191d103d32b9379030b2323960511b60448201526064016100db565b604080516060810182526001600160a01b03808516808352848216602080850182815260018688018181525f8c815293829052888420975188549088166001600160a01b03199091161788559151968101805492511515600160a01b026001600160a81b031990931697909616969096171790935560028054948501815583527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace909301879055925191929186917fa440229f738a9fb80807b5a881152e41634f4879749dc3fd163415962c4ce45e91a4505050565b6105566108c5565b5f81815260016020819052604090912090810154600160a01b900460ff1661059157604051636ac7cb4360e11b815260040160405180910390fd5b60405163133f757160e31b8152600481018390525f9081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906399fbab889060240161018060405180830381865afa1580156105f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061061d9190610b2e565b5050604080516080810182528f81523060208201526001600160801b038183018190526060820152905163fc6f786560e01b8152989c50969a505f9950899850506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169663fc6f7865966106a3965094506004019250610c07915050565b60408051808303815f875af11580156106be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e29190610c4a565b90925090508115610741575f6106f9600284610c6c565b90505f6107068285610c8b565b8754909150610722906001600160a01b038881169116846108ed565b600187015461073e906001600160a01b038881169116836108ed565b50505b801561079b575f610753600283610c6c565b90505f6107608284610c8b565b875490915061077c906001600160a01b038781169116846108ed565b6001870154610798906001600160a01b038781169116836108ed565b50505b604080518381526020810183905287917fa54e6c2fc0861aa9c991b26891d71059d517983b9e84b91020f42609c452eb9d910160405180910390a250505050506107e460015f55565b50565b5f82815260016020819052604090912090810154600160a01b900460ff1661082257604051636ac7cb4360e11b815260040160405180910390fd5b80546001600160a01b0316331461084c576040516308f78f9960e31b815260040160405180910390fd5b6001600160a01b0382166108735760405163d92e233d60e01b815260040160405180910390fd5b80546001600160a01b031981166001600160a01b038481169182178455604051921691829086907f8d808eeb59a29ec753ed0ac453113298b25d3f68f2c6edbffc5f4328e32ef969905f90a450505050565b60025f54036108e757604051633ee5aeb560e01b815260040160405180910390fd5b60025f55565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261093f908490610944565b505050565b5f8060205f8451602086015f885af180610963576040513d5f823e3d81fd5b50505f513d9150811561097a578060011415610987565b6001600160a01b0384163b155b156109b057604051635274afe760e01b81526001600160a01b03851660048201526024016100db565b50505050565b5f602082840312156109c6575f80fd5b5035919050565b6001600160a01b03811681146107e4575f80fd5b5f805f805f608086880312156109f5575f80fd5b8535610a00816109cd565b94506020860135610a10816109cd565b935060408601359250606086013567ffffffffffffffff80821115610a33575f80fd5b818801915088601f830112610a46575f80fd5b813581811115610a54575f80fd5b896020828501011115610a65575f80fd5b9699959850939650602001949392505050565b5f805f60608486031215610a8a575f80fd5b833592506020840135610a9c816109cd565b91506040840135610aac816109cd565b809150509250925092565b5f8060408385031215610ac8575f80fd5b823591506020830135610ada816109cd565b809150509250929050565b8051610af0816109cd565b919050565b805162ffffff81168114610af0575f80fd5b8051600281900b8114610af0575f80fd5b80516001600160801b0381168114610af0575f80fd5b5f805f805f805f805f805f806101808d8f031215610b4a575f80fd5b8c516bffffffffffffffffffffffff81168114610b65575f80fd5b9b50610b7360208e01610ae5565b9a50610b8160408e01610ae5565b9950610b8f60608e01610ae5565b9850610b9d60808e01610af5565b9750610bab60a08e01610b07565b9650610bb960c08e01610b07565b9550610bc760e08e01610b18565b94506101008d015193506101208d01519250610be66101408e01610b18565b9150610bf56101608e01610b18565b90509295989b509295989b509295989b565b815181526020808301516001600160a01b0316908201526040808301516001600160801b0390811691830191909152606092830151169181019190915260800190565b5f8060408385031215610c5b575f80fd5b505080516020909101519092909150565b5f82610c8657634e487b7160e01b5f52601260045260245ffd5b500490565b81810381811115610caa57634e487b7160e01b5f52601160045260245ffd5b9291505056fea2646970667358221220673b74acce307620be321a674da95aad1063050d1fc9a6393106792c506d454564736f6c634300081800330000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73000000000000000000000000e51960f1b45f1c9fb6d166e6a884f866fc70433b00000000000000000000000051d0e5188afe12d502e29d982d20c190e781610700000000000000000000000000000000000000000000000000000000000000010000000000000000000000001f7d7550b1b028f7571e69a784071f0205fd2efa00000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d300000000000000000000000000000000000000000000000000000000000000010000000000000000000000001f15f8917e83379518ec608622c6612aedf01a3000000000000000000000000000000000000000000000000014d1120d7b1600000000000000000000000000000000000000000000000000001bc16d674ec8000000000000000000000000000000000000000000000000000000b1a2bc2ec500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000172dae523b5bfbd6fb623bb7cd3a4d7c541916cc
0x60806040526004361061038a575f3560e01c806379ba5097116101d35780639e5a5906116100fd578063cb37ed6b1161009d578063e8fa36571161006d578063e8fa365714610b4f578063f2fde38b14610b63578063f5dab71114610b82578063fe1140a314610c11575f80fd5b8063cb37ed6b14610ae8578063cf3cf57314610afd578063e30c397814610b12578063e4ed41b014610b31575f80fd5b8063ae78a08a116100d8578063ae78a08a14610a80578063b3165ed214610aab578063b7cdddcb14610abf578063c7f2762c14610ad3575f80fd5b80639e5a590614610a18578063a463fb2514610a2c578063a4b7914e14610a47575f80fd5b80638b0bc501116101735780639293ed7e116101435780639293ed7e1461097457806397254bc1146109a75780639749f09d146109c657806397f548f7146109f9575f80fd5b80638b0bc501146109215780638da5cb5b14610936578063902d55a5146109555780639261441814610955575f80fd5b8063803db96d116101ae578063803db96d146108ba5780638120192c146108d95780638456cb59146108ee57806389f7352014610902575f80fd5b806379ba5097146108735780637dac938c146108875780637e1c0c09146108a6575f80fd5b8063452a9320116102b45780635c975abb1161025457806370da291d1161022457806370da291d146107c557806373a58f30146107f857806376771d4b1461082b578063781495991461085e575f80fd5b80635c975abb14610727578063630ec4e814610740578063634282af14610773578063691bdc2514610792575f80fd5b806352b86d2b1161028f57806352b86d2b146106a057806352f5b3ef146106d35780635313be2c146106f25780635ba1c1a914610711575f80fd5b8063452a93201461063957806348721a531461066c5780634f3a185c14610681575f80fd5b806324682b111161032a578063309e3989116102fa578063309e3989146105bf57806335625a7d146105de5780633f4ba83a146105f25780633fc8cef314610606575f80fd5b806324682b111461053d57806328ff1d4c146105715780632ed6b75d1461058c578063305902da146105ab575f80fd5b806314fbbd2c1161036557806314fbbd2c14610474578063150b7a02146104a75780631e4c7292146104eb57806322984b241461050a575f80fd5b8063026164ad146103ca5780630da3f62b146103ff57806313489bec1461044a575f80fd5b366103c657335f908152600e60205260409020546001600160a01b03166103c45760405163867783b760e01b815260040160405180910390fd5b005b5f80fd5b3480156103d5575f80fd5b506005546103ea90600160a01b900460ff1681565b60405190151581526020015b60405180910390f35b34801561040a575f80fd5b506104327f000000000000000000000000d1ecc847e6c707a4d172e74e3ab6538daf38bf6781565b6040516001600160a01b0390911681526020016103f6565b348015610455575f80fd5b506104666801158e460913d0000081565b6040519081526020016103f6565b34801561047f575f80fd5b506104327f00000000000000000000000051d0e5188afe12d502e29d982d20c190e781610781565b3480156104b2575f80fd5b506104d26104c1366004612807565b630a85bd0160e11b95945050505050565b6040516001600160e01b031990911681526020016103f6565b3480156104f6575f80fd5b506104666b0295be96e64066972000000081565b348015610515575f80fd5b506104327f000000000000000000000000e51960f1b45f1c9fb6d166e6a884f866fc70433b81565b348015610548575f80fd5b50610432610557366004612875565b600e6020525f90815260409020546001600160a01b031681565b34801561057c575f80fd5b5061046667016345785d8a000081565b348015610597575f80fd5b50600754610432906001600160a01b031681565b3480156105b6575f80fd5b50610466610c30565b3480156105ca575f80fd5b506103c46105d9366004612897565b610c60565b3480156105e9575f80fd5b5061046660fa81565b3480156105fd575f80fd5b506103c4610d12565b348015610611575f80fd5b506104327f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad7381565b348015610644575f80fd5b506104327f000000000000000000000000172dae523b5bfbd6fb623bb7cd3a4d7c541916cc81565b348015610677575f80fd5b50610466600b5481565b34801561068c575f80fd5b506103c461069b366004612875565b610dcc565b3480156106ab575f80fd5b506104667f00000000000000000000000000000000000000000000000014d1120d7b16000081565b3480156106de575f80fd5b506103c46106ed366004612897565b610f0a565b3480156106fd575f80fd5b506103c461070c366004612897565b610fed565b34801561071c575f80fd5b506104666202a30081565b348015610732575f80fd5b506009546103ea9060ff1681565b34801561074b575f80fd5b506104327f00000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d381565b34801561077e575f80fd5b5061043261078d366004612897565b611082565b34801561079d575f80fd5b506103ea7f000000000000000000000000000000000000000000000000000000000000000181565b3480156107d0575f80fd5b506104327f0000000000000000000000002f9878d39173b9711136547ac0f84555153ce23081565b348015610803575f80fd5b506104327f000000000000000000000000d7b99eee33d62c152fbc2cd1ea1ca7166b64622081565b348015610836575f80fd5b506104327f0000000000000000000000001f7d7550b1b028f7571e69a784071f0205fd2efa81565b348015610869575f80fd5b5061046661c35081565b34801561087e575f80fd5b506103c46110aa565b348015610892575f80fd5b506103c46108a13660046128bb565b611131565b3480156108b1575f80fd5b50600f54610466565b3480156108c5575f80fd5b50600554610432906001600160a01b031681565b3480156108e4575f80fd5b5061046660025481565b3480156108f9575f80fd5b506103c46111b4565b34801561090d575f80fd5b5061043261091c366004612897565b611244565b34801561092c575f80fd5b5061046660015481565b348015610941575f80fd5b50600354610432906001600160a01b031681565b348015610960575f80fd5b506104666b033b2e3c9fd0803ce800000081565b6109876109823660046128d6565b611272565b604080516001600160a01b039384168152929091166020830152016103f6565b3480156109b2575f80fd5b506103c46109c136600461297f565b6117f2565b3480156109d1575f80fd5b506103ea7f000000000000000000000000000000000000000000000000000000000000000181565b348015610a04575f80fd5b506103c4610a13366004612875565b61192e565b348015610a23575f80fd5b506103c4611db3565b348015610a37575f80fd5b506104666702c68af0bb14000081565b348015610a52575f80fd5b506103ea610a61366004612875565b6001600160a01b039081165f908152600d602052604090205416151590565b348015610a8b575f80fd5b50610466610a9a366004612875565b600c6020525f908152604090205481565b348015610ab6575f80fd5b506103c4611e8d565b348015610aca575f80fd5b506103c4611ece565b348015610ade575f80fd5b50610466600a5481565b348015610af3575f80fd5b5061046660085481565b348015610b08575f80fd5b5061046660065481565b348015610b1d575f80fd5b50600454610432906001600160a01b031681565b348015610b3c575f80fd5b506104666aa56fa5b99019a5c800000081565b348015610b5a575f80fd5b50610466611fbb565b348015610b6e575f80fd5b506103c4610b7d366004612875565b611ff8565b348015610b8d575f80fd5b50610bfd610b9c366004612875565b600d6020525f9081526040902080546001820154600283015460038401546004909401546001600160a01b0393841694928416938281169360ff600160a01b8504811694600160a81b90041692909162ffffff821691630100000090041688565b6040516103f69897969594939291906129d3565b348015610c1c575f80fd5b506103c4610c2b366004612875565b61209b565b6009545f9060ff161580610c445750600a54155b15610c4e57505f90565b600a54610c5b9042612a46565b905090565b6003546001600160a01b03163314610c8b57604051635fc483c560e01b815260040160405180910390fd5b5f61271060fa600154610c9e9190612a5f565b610ca89190612a76565b905080821115610ccb5760405163179381e360e31b815260040160405180910390fd5b600280549083905560408051828152602081018590527fccacd6248103a034fa1ccdec838a464619657e424f6b39dc4e6ff2d8265b9a7b91015b60405180910390a1505050565b336001600160a01b037f000000000000000000000000172dae523b5bfbd6fb623bb7cd3a4d7c541916cc1614610d5b57604051636570ecab60e11b815260040160405180910390fd5b60095460ff1615610dca57600a5415610d9157600a54610d7b9042612a46565b600b5f828254610d8b9190612a95565b90915550505b6009805460ff191690555f600a81905560405133917f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa91a25b565b6003546001600160a01b03163314610df757604051635fc483c560e01b815260040160405180910390fd5b610dff61215b565b6001600160a01b038082165f908152600d602052604090208054909116610e3957604051630cbdb7b360e41b815260040160405180910390fd5b60095460ff1615610e5d5760405163028e68af60e31b815260040160405180910390fd5b806001015f9054906101000a90046001600160a01b03166001600160a01b031663fc4c20a26040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610eab575f80fd5b505af1158015610ebd573d5f803e3d5ffd5b5050505060018101546040516001600160a01b03918216918416907f283440c67c7a1fa53726f70b3f97009ab1501ed149a2748f7aa20dd5d609082a905f90a350610f0760015f55565b50565b6003546001600160a01b03163314610f3557604051635fc483c560e01b815260040160405180910390fd5b6702c68af0bb140000811080610f5357506801158e460913d0000081115b15610f715760405163be80e34760e01b815260040160405180910390fd5b5f612710610f8060fa84612a5f565b610f8a9190612a76565b9050806002541115610faf5760405163179381e360e31b815260040160405180910390fd5b600180549083905560408051828152602081018590527f74fa33832976c63d8bc0ee8ecb7180955e8222b437b61c2d88aa8acdbc0ba1bc9101610d05565b6003546001600160a01b0316331461101857604051635fc483c560e01b815260040160405180910390fd5b67016345785d8a000081111561104157604051635919136b60e11b815260040160405180910390fd5b60065460408051918252602082018390527f0fd958ac60db1437ae35514054402c4e597e81881e4b6dd47a6509bd89121428910160405180910390a1600655565b600f8181548110611091575f80fd5b5f918252602090912001546001600160a01b0316905081565b6004546001600160a01b031633146110d5576040516303c25d1960e61b815260040160405180910390fd5b60038054600480546001600160a01b03198084166001600160a01b038381169182179096559116909155604051929091169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a350565b6003546001600160a01b0316331461115c57604051635fc483c560e01b815260040160405180910390fd5b60058054821515600160a01b0260ff60a01b199091161790556040517fcd62b3824d2183ae05f654408a9f8a5768f44218ec6eea3722d91b9405d2757e906111a990831515815260200190565b60405180910390a150565b336001600160a01b037f000000000000000000000000172dae523b5bfbd6fb623bb7cd3a4d7c541916cc16146111fd57604051636570ecab60e11b815260040160405180910390fd5b60095460ff16610dca576009805460ff1916600117905542600a5560405133907f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258905f90a2565b5f600f828154811061125857611258612aa8565b5f918252602090912001546001600160a01b031692915050565b5f8061127c61215b565b60095460ff16156112a057604051633461791360e11b815260040160405180910390fd5b600554600160a01b900460ff16156112cb5760405163107f189160e01b815260040160405180910390fd5b5f8360018111156112de576112de61299f565b14801561130957507f0000000000000000000000000000000000000000000000000000000000000001155b156113275760405163be34d26560e01b815260040160405180910390fd5b600183600181111561133b5761133b61299f565b14801561136657507f0000000000000000000000000000000000000000000000000000000000000001155b156113845760405163be34d26560e01b815260040160405180910390fd5b6006543410156113a75760405163ceaba46f60e01b815260040160405180910390fd5b600554600154604051630c8af22160e31b815273af1ac0e41940ee0e565a051d0185477eff2ce95e9263645791089261141b928e928e928e928e9233926001600160a01b03909116917f00000000000000000000000000000000000000000000000014d1120d7b1600009190600401612ae4565b6040805180830381865af4158015611435573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114599190612b3b565b909250905061147e6001600160a01b038316826b0295be96e640669720000000612183565b5f808460018111156114925761149261299f565b146114bd577f0000000000000000000000001f7d7550b1b028f7571e69a784071f0205fd2efa6114df565b7f000000000000000000000000e51960f1b45f1c9fb6d166e6a884f866fc70433b5b90505f6114ea6121da565b6040516370c4bbaf60e01b81526001600160a01b0386811660048301528481166024830152604482018390529192507f000000000000000000000000d1ecc847e6c707a4d172e74e3ab6538daf38bf67909116906370c4bbaf906064015f604051808303815f87803b15801561155e575f80fd5b505af1158015611570573d5f803e3d5ffd5b505050505050604051806101000160405280836001600160a01b03168152602001826001600160a01b03168152602001336001600160a01b031681526020018460018111156115c1576115c161299f565b81525f60208083018290526040808401839052606080850184905260809094018390526001600160a01b038781168452600d835292819020855181549085166001600160a01b03199182161782559286015160018281018054928716928616929092179091559186015160028201805491909516938116841785559486015190949093926001600160a81b03199091161790600160a01b90849081111561166a5761166a61299f565b02179055506080820151600282018054911515600160a81b0260ff60a81b1990921691909117905560a0820151600382015560c08201516004909101805460e0909301516001600160a01b039081166301000000026001600160b81b031990941662ffffff90931692909217929092179091558181165f908152600e6020526040812080549285166001600160a01b03199384168117909155600f80546001810182559083527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802018054909316179091556006546117489034612a46565b9050801561175a5761175a3382612277565b6006541561177b5760055460065461177b916001600160a01b031690612277565b336001600160a01b0316826001600160a01b0316846001600160a01b03167fbe8847e9c0d2ddb0e8929a4466675e6174f16f710e2293e5b6fb447d6a297feb8d8d8d8d8d8d8d6040516117d49796959493929190612b73565b60405180910390a4506117e660015f55565b97509795505050505050565b6003546001600160a01b0316331461181d57604051635fc483c560e01b815260040160405180910390fd5b6702c68af0bb14000082108061183b57506801158e460913d0000082115b156118595760405163be80e34760e01b815260040160405180910390fd5b5f61271061186860fa85612a5f565b6118729190612a76565b9050808211156118955760405163179381e360e31b815260040160405180910390fd5b600180546002805492869055849055908482146118e65760408051838152602081018790527f74fa33832976c63d8bc0ee8ecb7180955e8222b437b61c2d88aa8acdbc0ba1bc910160405180910390a15b8084146119275760408051828152602081018690527fccacd6248103a034fa1ccdec838a464619657e424f6b39dc4e6ff2d8265b9a7b910160405180910390a15b5050505050565b61193661215b565b6001600160a01b038082165f908152600d60205260409020805490911661197057604051630cbdb7b360e41b815260040160405180910390fd5b6002810154600160a81b900460ff161561199d5760405163e6a0d45f60e01b815260040160405180910390fd5b60028101805460ff60a81b1916600160a81b1790556001810154604080516206e61760ed1b815290515f92839283926001600160a01b0390921691829163dcc2e0009160048083019260209291908290030181865afa158015611a02573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a269190612bca565b611a43576040516326bbb0b160e01b815260040160405180910390fd5b806001600160a01b0316639d1b464a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a7f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611aa39190612be5565b9250806001600160a01b03166302d05d3f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ae1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b059190612bfc565b91505f80826001600160a01b0316638b0bc5016040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b45573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b699190612be5565b90505f612710611b7a60fa84612a5f565b611b849190612a76565b90508060025411611b9757600254611b99565b805b9250505080826001600160a01b0316632ab04c7b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bda573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bfe9190612be5565b611c089190612a46565b94506001600160a01b03821663ec5f5e9a611c238388612a95565b846001600160a01b031663b497ab926040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c5f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c839190612be5565b6040516001600160e01b031960e085901b168152600481019290925260248201526044015f604051808303815f87803b158015611cbe575f80fd5b505af1158015611cd0573d5f803e3d5ffd5b505050505f811115611cf257600554611cf2906001600160a01b031682612277565b50506040516370a0823160e01b81523060048201525f906001600160a01b038716906370a0823190602401602060405180830381865afa158015611d38573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d5c9190612be5565b90508015611d9857611d986001600160a01b0387167f000000000000000000000000d1ecc847e6c707a4d172e74e3ab6538daf38bf6783612183565b50611da68486858585612342565b50505050610f0760015f55565b6003546001600160a01b03163314611dde57604051635fc483c560e01b815260040160405180910390fd5b6007546001600160a01b0316611e07576040516312047a6d60e11b815260040160405180910390fd5b600854421015611e2a57604051637378c19d60e01b815260040160405180910390fd5b60058054600780546001600160a01b03198084166001600160a01b0383811691821790965591169091555f60088190556040519390921692909183917f8c3aa5f43a388513435861bf27dfad7829cd248696fed367c62d441f629544969190a350565b6003546001600160a01b03163314611eb857604051635fc483c560e01b815260040160405180910390fd5b600780546001600160a01b03191690555f600855565b611ed661215b565b335f908152600c602052604081205490819003611f06576040516312d37ee560e31b815260040160405180910390fd5b335f818152600c60205260408082208290555190919083908381818185875af1925050503d805f8114611f54576040519150601f19603f3d011682016040523d82523d5f602084013e611f59565b606091505b5050905080611f7b576040516312171d8360e31b815260040160405180910390fd5b60405182815233907f0d7976053781e071cecf47e898ad2a6dc87621ca33734e96eb4b92453319e8c99060200160405180910390a25050610dca60015f55565b600b546009545f919060ff168015611fd457505f600a54115b15611ff357600a54611fe69042612a46565b611ff09082612a95565b90505b919050565b6003546001600160a01b0316331461202357604051635fc483c560e01b815260040160405180910390fd5b6001600160a01b03811661204a5760405163d92e233d60e01b815260040160405180910390fd5b600480546001600160a01b0319166001600160a01b03838116918217909255600354604051919216907f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700905f90a350565b6003546001600160a01b031633146120c657604051635fc483c560e01b815260040160405180910390fd5b6001600160a01b0381166120ed5760405163d92e233d60e01b815260040160405180910390fd5b600780546001600160a01b0319166001600160a01b0383161790556121156202a30042612a95565b60088190556040519081526001600160a01b038216907f2fdb8aa18e3708b0dfed4acb0de7452e85e7f833b1b055880cef38e8bee690b59060200160405180910390a250565b60025f540361217d57604051633ee5aeb560e01b815260040160405180910390fd5b60025f55565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526121d5908490612738565b505050565b5f806001547f00000000000000000000000000000000000000000000000014d1120d7b16000061220a9190612a95565b90505f6122436b0295be96e6406697200000007f00000000000000000000000000000000000000000000000014d1120d7b160000612a5f565b90505f6122508383612a76565b90508061226584670de0b6b3a7640000612a5f565b61226f9190612a76565b935050505090565b5f826001600160a01b03168261c350906040515f60405180830381858888f193505050503d805f81146122c5576040519150601f19603f3d011682016040523d82523d5f602084013e6122ca565b606091505b50509050806121d5576001600160a01b0383165f908152600c6020526040812080548492906122fa908490612a95565b90915550506040518281526001600160a01b038416907fe5cb8d81473b57bd1e538dcb737d485e0c5b8ecf1e30516945ca99fcddab31529060200160405180910390a2505050565b5f8080806002890154600160a01b900460ff1660018111156123665761236661299f565b036123d857507f000000000000000000000000e51960f1b45f1c9fb6d166e6a884f866fc70433b91507f00000000000000000000000051d0e5188afe12d502e29d982d20c190e781610790507f000000000000000000000000d7b99eee33d62c152fbc2cd1ea1ca7166b646220612441565b507f0000000000000000000000001f7d7550b1b028f7571e69a784071f0205fd2efa91507f00000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d390507f0000000000000000000000002f9878d39173b9711136547ac0f84555153ce2305b6040805160c0810182526001600160a01b038981168252602082018981526005548216838501908152878316606085019081528784166080860190815260a086018c8152965163b25b68a560e01b81529551851660048701529251602486015290518316604485015251821660648401525181166084830152915160a48201525f918291829182917f000000000000000000000000d1ecc847e6c707a4d172e74e3ab6538daf38bf679091169063b25b68a5908c9060c40160806040518083038185885af1158015612515573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061253a9190612c17565b9350935093509350846001600160a01b03166302b4bdec6040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561257a575f80fd5b505af115801561258c573d5f803e3d5ffd5b5050604051632142170760e11b81523060048201526001600160a01b03888116602483015260448201889052891692506342842e0e91506064015f604051808303815f87803b1580156125dd575f80fd5b505af11580156125ef573d5f803e3d5ffd5b5050600554604051632530c5b960e21b8152600481018890526001600160a01b038c81166024830152918216604482015290881692506394c316e491506064015f604051808303815f87803b158015612646575f80fd5b505af1158015612658573d5f803e3d5ffd5b50505050838c60030181905550828c6004015f6101000a81548162ffffff021916908362ffffff160217905550808c60040160036101000a8154816001600160a01b0302191690836001600160a01b031602179055508b6001015f9054906101000a90046001600160a01b03166001600160a01b03168b6001600160a01b03167f953aa84a278048673b5778b1045dcb91ec88f4eb714b09801e97014facc306d78e60020160149054906101000a900460ff16878e87898860405161272296959493929190612c66565b60405180910390a3505050505050505050505050565b5f8060205f8451602086015f885af180612757576040513d5f823e3d81fd5b50505f513d9150811561276e57806001141561277b565b6001600160a01b0384163b155b156127a857604051635274afe760e01b81526001600160a01b038516600482015260240160405180910390fd5b50505050565b6001600160a01b0381168114610f07575f80fd5b5f8083601f8401126127d2575f80fd5b50813567ffffffffffffffff8111156127e9575f80fd5b602083019150836020828501011115612800575f80fd5b9250929050565b5f805f805f6080868803121561281b575f80fd5b8535612826816127ae565b94506020860135612836816127ae565b935060408601359250606086013567ffffffffffffffff811115612858575f80fd5b612864888289016127c2565b969995985093965092949392505050565b5f60208284031215612885575f80fd5b8135612890816127ae565b9392505050565b5f602082840312156128a7575f80fd5b5035919050565b8015158114610f07575f80fd5b5f602082840312156128cb575f80fd5b8135612890816128ae565b5f805f805f805f6080888a0312156128ec575f80fd5b873567ffffffffffffffff80821115612903575f80fd5b61290f8b838c016127c2565b909950975060208a0135915080821115612927575f80fd5b6129338b838c016127c2565b909750955060408a013591508082111561294b575f80fd5b506129588a828b016127c2565b90945092505060608801356002811061296f575f80fd5b8091505092959891949750929550565b5f8060408385031215612990575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b600281106129cf57634e487b7160e01b5f52602160045260245ffd5b9052565b6001600160a01b03898116825288811660208301528781166040830152610100820190612a0360608401896129b3565b86151560808401528560a084015262ffffff851660c084015280841660e0840152509998505050505050505050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115612a5957612a59612a32565b92915050565b8082028115828204841417612a5957612a59612a32565b5f82612a9057634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115612a5957612a59612a32565b634e487b7160e01b5f52603260045260245ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b60c081525f612af760c083018a8c612abc565b8281036020840152612b0a81898b612abc565b6001600160a01b03978816604085015295909616606083015250608081019290925260a09091015295945050505050565b5f8060408385031215612b4c575f80fd5b8251612b57816127ae565b6020840151909250612b68816127ae565b809150509250929050565b608081525f612b8660808301898b612abc565b8281036020840152612b9981888a612abc565b90508281036040840152612bae818688612abc565b915050612bbe60608301846129b3565b98975050505050505050565b5f60208284031215612bda575f80fd5b8151612890816128ae565b5f60208284031215612bf5575f80fd5b5051919050565b5f60208284031215612c0c575f80fd5b8151612890816127ae565b5f805f8060808587031215612c2a575f80fd5b84519350602085015162ffffff81168114612c43575f80fd5b604086015160608701519194509250612c5b816127ae565b939692955090935050565b60c08101612c7482896129b3565b60208201969096526040810194909452606084019290925262ffffff1660808301526001600160a01b031660a09091015291905056fea2646970667358221220fb02568643cc9dc6dae97b53e7cb4502913aaf47d46aa5d3396c81394c30a9cb64736f6c63430008180033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| V66 Smoke (V66S) | V66S | 200,000,000 | — | — |
| test (TEST) | TEST | 200,000,000 | — | — |
| tttt (tttt) | tttt | 200,000,000 | — | — |
| tttt1 (tttt1) | tttt1 | 200,000,000 | — | — |
| tttt2 (tttt2) | tttt2 | 200,000,000 | — | — |
| tttt3 (tttt3) | tttt3 | 200,000,000 | — | — |
| tttt4 (tttt4) | tttt4 | 200,000,000 | — | — |
| tttt5 (tttt5) | tttt5 | 200,000,000 | — | — |
| tttt6 (tttt6) | tttt6 | 200,000,000 | — | — |
| BANGER (BANGER) | BANGER | 200,000,000 | — | — |
| dog (DOG) | DOG | 200,000,000 | — | — |
| BANGER (BANGER) | BANGER | 200,000,000 | — | — |
| bager (BAGER) | BAGER | 200,000,000 | — | — |
| banger (BANGER) | BANGER | 200,000,000 | — | — |
| Banger Ape (BAPE) | BAPE | 200,000,000 | — | — |
| Bonger (BONG) | BONG | 200,000,000 | — | — |
| VLAD (VLAD) | VLAD | 200,000,000 | — | — |
| First Ape (APE) | APE | 200,000,000 | — | — |
| IYKYK (IYKYK) | IYKYK | 200,000,000 | — | — |
| Banger (BNGR) | BNGR | 200,000,000 | — | — |
| CexDog (CEXDOG) | CEXDOG | 200,000,000 | — | — |
| Bangzap (ZAP) | ZAP | 200,000,000 | — | — |
| BangerFun (BANGER) | BANGER | 200,000,000 | — | — |
| BANGBANG (BANG) | BANG | 200,000,000 | — | — |
| UPONLY (UPONLY) | UPONLY | 200,000,000 | — | — |
| king kong (KONG) | KONG | 200,000,000 | — | — |
| BF (KINGKONG) | KINGKONG | 200,000,000 | — | — |
| SolCex (SOLCEX) | SOLCEX | 200,000,000 | — | — |
| BANG (BANG) | BANG | 200,000,000 | — | — |
| BF (KINGKONG) | KINGKONG | 200,000,000 | — | — |
| ARLOX (ARLOXSHOT) | ARLOXSHOT | 200,000,000 | — | — |
| Green God (GG) | GG | 200,000,000 | — | — |
| 1$ (1) | 1 | 200,000,000 | — | — |
| Banger Mascot (BANGSCOT) | BANGSCOT | 200,000,000 | — | — |
| Robinetch (ROBINETC) | ROBINETC | 200,000,000 | — | — |
| test (TEST) | TEST | 200,000,000 | — | — |
| The Banger Launchpad (BANGER) | BANGER | 200,000,000 | — | — |
| International Cat day (CATDAY) | CATDAY | 200,000,000 | — | — |
| BONANZA (BZA) | BZA | 200,000,000 | — | — |
| The Purple Bull (SOLCEX) | SOLCEX | 200,000,000 | — | — |
| SOLCEX (SOLCEX) | SOLCEX | 200,000,000 | — | — |
| SOLCEX (SOLCEX) | SOLCEX | 200,000,000 | — | — |
| 🦍 🟢 (BANGER) | BANGER | 200,000,000 | — | — |
| RobinToken (RBT) | RBT | 200,000,000 | — | — |
| DONNIE (DONNIE) | DONNIE | 200,000,000 | — | — |
| GHOST (GHOST) | GHOST | 200,000,000 | — | — |
| BENJI (BENJI) | BENJI | 200,000,000 | — | — |
| SAME (SAME) | SAME | 200,000,000 | — | — |
| SolCex Mascot (BANGER) | BANGER | 200,000,000 | — | — |
| GREENBAG (GREENBAG) | GREENBAG | 200,000,000 | — | — |
| ARLOX (ARLOX) | ARLOX | 200,000,000 | — | — |
| Solape (SOLAPE) | SOLAPE | 200,000,000 | — | — |
| king Banger (KBANGER) | KBANGER | 200,000,000 | — | — |
| swappy (SWAPPY) | SWAPPY | 200,000,000 | — | — |
| CASH KINGKONG (CASHKONG) | CASHKONG | 200,000,000 | — | — |
| Banger.fun (BANGER) | BANGER | 200,000,000 | — | — |
| Trump (TRUMP) | TRUMP | 200,000,000 | — | — |
| TeNT (SQUID) | SQUID | 200,000,000 | — | — |
| Solcex szn (SOLCEX) | SOLCEX | 200,000,000 | — | — |
| Danger (DANGER) | DANGER | 200,000,000 | — | — |
| KONG (KONG) | KONG | 200,000,000 | — | — |
| Greenjak (GREEN) | GREEN | 200,000,000 | — | — |
| GORILLA HOOD (GHOOD) | GHOOD | 200,000,000 | — | — |
| Luffy (LUFFY) | LUFFY | 200,000,000 | — | — |
| Banger Ape (BAPE) | BAPE | 200,000,000 | — | — |
| Banger Club (RILLAZ) | RILLAZ | 200,000,000 | — | — |
| BANGER OFF (BANGOFF) | BANGOFF | 200,000,000 | — | — |
| whodatcat (WDCAT) | WDCAT | 200,000,000 | — | — |
| BEGGAR (BEGGAR) | BEGGAR | 200,000,000 | — | — |
| TENTA (AFTERWEB) | AFTERWEB | 200,000,000 | — | — |
| CASHDOG (CASHDOG) | CASHDOG | 200,000,000 | — | — |
| DINO (DINO) | DINO | 200,000,000 | — | — |
| hugedick (DICK) | DICK | 200,000,000 | — | — |
| BANG (BANG) | BANG | 200,000,000 | — | — |
| BangerCat (BANGERCAT) | BANGERCAT | 200,000,000 | — | — |
| Banger Ape (BAPE) | BAPE | 200,000,000 | — | — |
| Harambe (HARAMBE) | HARAMBE | 200,000,000 | — | — |
| SOON... (SOON) | SOON | 200,000,000 | — | — |
| HUGE (HUGE) | HUGE | 200,000,000 | — | — |
| DINO (DINO) | DINO | 200,000,000 | — | — |
| Bangushi (BANGUSHI) | BANGUSHI | 200,000,000 | — | — |
| Pepe el Ratonero (PEPE) | PEPE | 200,000,000 | — | — |
| Warren Buffet Squishmallow (WBS) | WBS | 200,000,000 | — | — |
| TUZKI (TUZKI) | TUZKI | 200,000,000 | — | — |
| SNOWBOY (SB) | SB | 200,000,000 | — | — |
| XSo-lut-sol (XST) | XST | 200,000,000 | — | — |
| AORP (AORP) | AORP | 200,000,000 | — | — |
| MUJER (MJ) | MJ | 200,000,000 | — | — |
| ROBINHOOD (RBD) | RBD | 200,000,000 | — | — |
| banger.fun (B) | B | 200,000,000 | — | — |
| PGMCOIN (1368PG) | 1368PG | 200,000,000 | — | — |
| chipcoin (CHC) | CHC | 200,000,000 | — | — |
| ChipCoin (CHIP) | CHIP | 200,000,000 | — | — |
| GODZILLA COIN (GODZ) | GODZ | 200,000,000 | — | — |
| RACCOON (RAN) | RAN | 200,000,000 | — | — |
| Glizzy (GLIZZY) | GLIZZY | 200,000,000 | — | — |
| 新的开始 (ANEWBEGI) | ANEWBEGI | 200,000,000 | — | — |
| CRYING SHARK (CRYSHARK) | CRYSHARK | 200,000,000 | — | — |
| Baby Unicorn (BABYUNI) | BABYUNI | 200,000,000 | — | — |
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x262258…814106 | 7 days agoMon, 10 Aug 2026 15:22:52 UTC | 0xbe8847…7feb | [0] 0x000000000000…a39a8773 [1] 0x000000000000…717aa050 [2] 0x000000000000…01879a7e data: 0x000000000000000000…00000000 |
| 0x41d6d5…7d491c | 7 days agoSun, 09 Aug 2026 21:07:29 UTC | 0xbe8847…7feb | [0] 0x000000000000…1bdf1941 [1] 0x000000000000…31e6749f [2] 0x000000000000…af262bb2 data: 0x000000000000000000…00000000 |
| 0xe0b641…03ae30 | 7 days agoSun, 09 Aug 2026 19:58:01 UTC | 0xbe8847…7feb | [0] 0x000000000000…b8bc2975 [1] 0x000000000000…4f8c3356 [2] 0x000000000000…d49e7b82 data: 0x000000000000000000…00000000 |
| 0x98271a…a9fc1f | 8 days agoSun, 09 Aug 2026 17:55:36 UTC | 0x953aa8…06d7 | [0] 0x000000000000…f4c66241 [1] 0x000000000000…d9c3f4fe data: 0x000000000000000000…a8a82dcd |
| 0x1f3302…fb1d84 | 8 days agoSun, 09 Aug 2026 17:28:08 UTC | 0xbe8847…7feb | [0] 0x000000000000…f4c66241 [1] 0x000000000000…d9c3f4fe [2] 0x000000000000…2f62e3ed data: 0x000000000000000000…00000000 |
| 0x87f558…48f878 | 8 days agoSun, 09 Aug 2026 06:45:15 UTC | 0xbe8847…7feb | [0] 0x000000000000…33e858f6 [1] 0x000000000000…98d5340b [2] 0x000000000000…b13de5f9 data: 0x000000000000000000…00000000 |
| 0x0bcf71…fc6e00 | 8 days agoSat, 08 Aug 2026 20:10:12 UTC | 0xbe8847…7feb | [0] 0x000000000000…9223097b [1] 0x000000000000…c5559ef3 [2] 0x000000000000…bf211c1b data: 0x000000000000000000…00000000 |
| 0xf74ee9…89b399 | 9 days agoSat, 08 Aug 2026 13:48:36 UTC | 0xbe8847…7feb | [0] 0x000000000000…f165571c [1] 0x000000000000…d2952da0 [2] 0x000000000000…6b2e5e33 data: 0x000000000000000000…00000000 |
| 0xbf2daf…dd7dc7 | 9 days agoSat, 08 Aug 2026 13:38:35 UTC | 0xbe8847…7feb | [0] 0x000000000000…a054c4d8 [1] 0x000000000000…e43cc549 [2] 0x000000000000…6b2e5e33 data: 0x000000000000000000…00000000 |
| 0x0c4aee…d11272 | 9 days agoSat, 08 Aug 2026 13:28:29 UTC | 0xbe8847…7feb | [0] 0x000000000000…cb2f58c7 [1] 0x000000000000…dbb8c595 [2] 0x000000000000…6b2e5e33 data: 0x000000000000000000…00000000 |
| 0xc65483…62ab22 | 9 days agoSat, 08 Aug 2026 13:18:27 UTC | 0xbe8847…7feb | [0] 0x000000000000…be8c7434 [1] 0x000000000000…b16a4526 [2] 0x000000000000…6b2e5e33 data: 0x000000000000000000…00000000 |
| 0x308f8f…ebbeba | 9 days agoSat, 08 Aug 2026 13:16:50 UTC | 0xbe8847…7feb | [0] 0x000000000000…00d4cba7 [1] 0x000000000000…12bc8100 [2] 0x000000000000…6b2e5e33 data: 0x000000000000000000…00000000 |
| 0xabae1e…159e14 | 9 days agoSat, 08 Aug 2026 13:08:26 UTC | 0xbe8847…7feb | [0] 0x000000000000…cefab927 [1] 0x000000000000…9b70fdf2 [2] 0x000000000000…6b2e5e33 data: 0x000000000000000000…227d0000 |
| 0xbe0dac…fad045 | 9 days agoSat, 08 Aug 2026 12:20:14 UTC | 0xbe8847…7feb | [0] 0x000000000000…6c5eb89c [1] 0x000000000000…22d25db4 [2] 0x000000000000…e946a4fa data: 0x000000000000000000…00000000 |
| 0xeb3c14…e47838 | 9 days agoSat, 08 Aug 2026 12:09:04 UTC | 0xbe8847…7feb | [0] 0x000000000000…78ce13cf [1] 0x000000000000…068eb6df [2] 0x000000000000…a86949a4 data: 0x000000000000000000…00000000 |
| 0x6876f6…84d9b9 | 9 days agoSat, 08 Aug 2026 05:05:37 UTC | 0xbe8847…7feb | [0] 0x000000000000…4cb41eab [1] 0x000000000000…be1e0ec4 [2] 0x000000000000…15edfb2d data: 0x000000000000000000…00000000 |
| 0xe2b324…ccf330 | 9 days agoSat, 08 Aug 2026 04:33:01 UTC | 0xbe8847…7feb | [0] 0x000000000000…305233e8 [1] 0x000000000000…7142c469 [2] 0x000000000000…01a661f9 data: 0x000000000000000000…70227d00 |
| 0x2f7431…18213d | 9 days agoSat, 08 Aug 2026 04:09:35 UTC | 0xbe8847…7feb | [0] 0x000000000000…b81c96a2 [1] 0x000000000000…6667820b [2] 0x000000000000…01a661f9 data: 0x000000000000000000…00000000 |
| 0xb99397…13278a | 9 days agoSat, 08 Aug 2026 04:09:22 UTC | 0xbe8847…7feb | [0] 0x000000000000…6f31e804 [1] 0x000000000000…4a9f3a09 [2] 0x000000000000…01a661f9 data: 0x000000000000000000…00000000 |
| 0x925cc7…4c5eda | 9 days agoSat, 08 Aug 2026 03:42:34 UTC | 0xbe8847…7feb | [0] 0x000000000000…605d4719 [1] 0x000000000000…87dbaf3f [2] 0x000000000000…01a661f9 data: 0x000000000000000000…00000000 |
| 0xc035f1…979917 | 9 days agoFri, 07 Aug 2026 23:23:13 UTC | 0xbe8847…7feb | [0] 0x000000000000…981bb5c5 [1] 0x000000000000…4a3f955b [2] 0x000000000000…98925437 data: 0x000000000000000000…6270227d |
| 0x216387…7fa24c | 9 days agoFri, 07 Aug 2026 21:54:22 UTC | 0xbe8847…7feb | [0] 0x000000000000…df5f8fc8 [1] 0x000000000000…ee0783b7 [2] 0x000000000000…98925437 data: 0x000000000000000000…227d0000 |
| 0x90c712…89ae41 | 10 days agoFri, 07 Aug 2026 15:29:55 UTC | 0xbe8847…7feb | [0] 0x000000000000…32551883 [1] 0x000000000000…342becc7 [2] 0x000000000000…e946a4fa data: 0x000000000000000000…00000000 |
| 0x272b47…0cff08 | 10 days agoFri, 07 Aug 2026 15:24:01 UTC | 0xbe8847…7feb | [0] 0x000000000000…eab87492 [1] 0x000000000000…b12c9be1 [2] 0x000000000000…e946a4fa data: 0x000000000000000000…00000000 |
| 0xd3fad1…f0d90e | 10 days agoFri, 07 Aug 2026 15:23:32 UTC | 0xbe8847…7feb | [0] 0x000000000000…fdd70679 [1] 0x000000000000…d28a3e21 [2] 0x000000000000…512122c9 data: 0x000000000000000000…00000000 |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x262258…814106 | launchToken | 32,902,952 | 7 days agoMon, 10 Aug 2026 15:22:52 UTC | 0x4c44…9a7e | IN | BangerFactoryV6 | $0.000 ETH | 0.00042280 | |
| 0x41d6d5…7d491c | launchToken | 32,246,909 | 7 days agoSun, 09 Aug 2026 21:07:29 UTC | 0xc8d9…2bb2 | IN | BangerFactoryV6 | $0.000 ETH | 0.00045258 | |
| 0xe0b641…03ae30 | launchToken | 32,205,258 | 7 days agoSun, 09 Aug 2026 19:58:01 UTC | 0x3eef…7b82 | IN | BangerFactoryV6 | $0.000 ETH | 0.00043951 | |
| 0x98271a…a9fc1f | graduateToken | 32,131,861 | 8 days agoSun, 09 Aug 2026 17:55:36 UTC | 0x6d54…01e1 | IN | BangerFactoryV6 | $0.000 ETH | 0.00002557 | |
| 0x1f3302…fb1d84 | launchToken | 32,115,407 | 8 days agoSun, 09 Aug 2026 17:28:08 UTC | 0x5547…e3ed | IN | BangerFactoryV6 | $0.000 ETH | 0.00043802 | |
| 0x87f558…48f878 | launchToken | 31,730,515 | 8 days agoSun, 09 Aug 2026 06:45:15 UTC | 0x8de5…e5f9 | IN | BangerFactoryV6 | $0.000 ETH | 0.00047037 | |
| 0x0bcf71…fc6e00 | launchToken | 31,350,148 | 8 days agoSat, 08 Aug 2026 20:10:12 UTC | 0x376f…1c1b | IN | BangerFactoryV6 | $0.000 ETH | 0.00050811 | |
| 0xf74ee9…89b399 | launchToken | 31,121,424 | 9 days agoSat, 08 Aug 2026 13:48:36 UTC | 0x394d…5e33 | IN | BangerFactoryV6 | $0.000 ETH | 0.00045720 | |
| 0xbf2daf…dd7dc7 | launchToken | 31,115,433 | 9 days agoSat, 08 Aug 2026 13:38:35 UTC | 0x394d…5e33 | IN | BangerFactoryV6 | $0.000 ETH | 0.00045668 | |
| 0x0c4aee…d11272 | launchToken | 31,109,384 | 9 days agoSat, 08 Aug 2026 13:28:29 UTC | 0x394d…5e33 | IN | BangerFactoryV6 | $0.000 ETH | 0.00045878 | |
| 0xc65483…62ab22 | launchToken | 31,103,390 | 9 days agoSat, 08 Aug 2026 13:18:27 UTC | 0x394d…5e33 | IN | BangerFactoryV6 | $0.000 ETH | 0.00046362 | |
| 0x308f8f…ebbeba | launchToken | 31,102,414 | 9 days agoSat, 08 Aug 2026 13:16:50 UTC | 0x394d…5e33 | IN | BangerFactoryV6 | $0.000 ETH | 0.00046110 | |
| 0xabae1e…159e14 | launchToken | 31,097,388 | 9 days agoSat, 08 Aug 2026 13:08:26 UTC | 0x394d…5e33 | IN | BangerFactoryV6 | $0.000 ETH | 0.00046439 | |
| 0xbe0dac…fad045 | launchToken | 31,068,507 | 9 days agoSat, 08 Aug 2026 12:20:14 UTC | 0x1007…a4fa | IN | BangerFactoryV6 | $0.000 ETH | 0.00046811 | |
| 0xeb3c14…e47838 | launchToken | 31,061,815 | 9 days agoSat, 08 Aug 2026 12:09:04 UTC | 0xb310…49a4 | IN | BangerFactoryV6 | $0.000 ETH | 0.00046588 | |
| 0x6876f6…84d9b9 | launchToken | 30,808,477 | 9 days agoSat, 08 Aug 2026 05:05:37 UTC | 0x0fc7…fb2d | IN | BangerFactoryV6 | $0.000 ETH | 0.00049571 | |
| 0xe2b324…ccf330 | launchToken | 30,788,980 | 9 days agoSat, 08 Aug 2026 04:33:01 UTC | 0x204c…61f9 | IN | BangerFactoryV6 | $0.000 ETH | 0.00050266 | |
| 0x2f7431…18213d | launchToken | 30,774,956 | 9 days agoSat, 08 Aug 2026 04:09:35 UTC | 0x204c…61f9 | IN | BangerFactoryV6 | $0.000 ETH | 0.00050895 | |
| 0xb99397…13278a | launchToken | 30,774,826 | 9 days agoSat, 08 Aug 2026 04:09:22 UTC | 0x204c…61f9 | IN | BangerFactoryV6 | $0.000 ETH | 0.00050667 | |
| 0x925cc7…4c5eda | launchToken | 30,758,788 | 9 days agoSat, 08 Aug 2026 03:42:34 UTC | 0x204c…61f9 | IN | BangerFactoryV6 | $0.000 ETH | 0.00049927 | |
| 0xc035f1…979917 | launchToken | 30,603,418 | 9 days agoFri, 07 Aug 2026 23:23:13 UTC | 0x7b7f…5437 | IN | BangerFactoryV6 | $0.000 ETH | 0.00052279 | |
| 0x216387…7fa24c | launchToken | 30,550,086 | 9 days agoFri, 07 Aug 2026 21:54:22 UTC | 0x7b7f…5437 | IN | BangerFactoryV6 | $0.000 ETH | 0.00051680 | |
| 0x90c712…89ae41 | launchToken | 30,319,746 | 10 days agoFri, 07 Aug 2026 15:29:55 UTC | 0x1007…a4fa | IN | BangerFactoryV6 | $0.000 ETH | 0.00048456 | |
| 0x272b47…0cff08 | launchToken | 30,316,205 | 10 days agoFri, 07 Aug 2026 15:24:01 UTC | 0x1007…a4fa | IN | BangerFactoryV6 | $0.000 ETH | 0.00049157 | |
| 0xd3fad1…f0d90e | launchToken | 30,315,925 | 10 days agoFri, 07 Aug 2026 15:23:32 UTC | 0x2b67…22c9 | IN | BangerFactoryV6 | $0.000 ETH | 0.00048817 |
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x98271a6a…a9fc1f | Transfer | 32,131,861 | 8 days agoSun, 09 Aug 2026 17:55:36 UTC | 0xa1e3…660b | OUT | 0x2f98…e230 | Transfer | Uniswap V3 Positions NFT-V1 (UNI-V3-POS) #639566 | |
| 0x98271a6a…a9fc1f | Transfer | 32,131,861 | 8 days agoSun, 09 Aug 2026 17:55:36 UTC | 0xd1ec…bf67 | IN | 0xa1e3…660b | Transfer | Uniswap V3 Positions NFT-V1 (UNI-V3-POS) #639566 | |
| 0x19165c44…d75ba0 | Transfer | 30,231,226 | 10 days agoFri, 07 Aug 2026 13:02:09 UTC | 0xa1e3…660b | OUT | 0x2f98…e230 | Transfer | Uniswap V3 Positions NFT-V1 (UNI-V3-POS) #617414 | |
| 0x19165c44…d75ba0 | Transfer | 30,231,226 | 10 days agoFri, 07 Aug 2026 13:02:09 UTC | 0xd1ec…bf67 | IN | 0xa1e3…660b | Transfer | Uniswap V3 Positions NFT-V1 (UNI-V3-POS) #617414 | |
| 0xe565a797…4e7773 | Transfer | 28,827,584 | 11 days agoWed, 05 Aug 2026 21:58:16 UTC | 0xa1e3…660b | OUT | 0x2f98…e230 | Transfer | Uniswap V3 Positions NFT-V1 (UNI-V3-POS) #599267 | |
| 0xe565a797…4e7773 | Transfer | 28,827,584 | 11 days agoWed, 05 Aug 2026 21:58:16 UTC | 0xd1ec…bf67 | IN | 0xa1e3…660b | Transfer | Uniswap V3 Positions NFT-V1 (UNI-V3-POS) #599267 |
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x2622582e…814106 | Transfer | 32,902,952 | 7 days agoMon, 10 Aug 2026 15:22:52 UTC | 0xa1e3…660b | OUT | 0x7423…a050 | 800,000,000.000000 CRYSHARK | CRYING SHARK (CRYSHARK) | |
| 0x2622582e…814106 | Transfer | 32,902,952 | 7 days agoMon, 10 Aug 2026 15:22:52 UTC | 0x0000…0000 | IN | 0xa1e3…660b | 1,000,000,000.000000 CRYSHARK | CRYING SHARK (CRYSHARK) | |
| 0x41d6d5e5…7d491c | Transfer | 32,246,909 | 7 days agoSun, 09 Aug 2026 21:07:29 UTC | 0xa1e3…660b | OUT | 0x9961…749f | 800,000,000.000000 BABYUNI | Baby Unicorn (BABYUNI) | |
| 0x41d6d5e5…7d491c | Transfer | 32,246,909 | 7 days agoSun, 09 Aug 2026 21:07:29 UTC | 0x0000…0000 | IN | 0xa1e3…660b | 1,000,000,000.000000 BABYUNI | Baby Unicorn (BABYUNI) | |
| 0xe0b64162…03ae30 | Transfer | 32,205,258 | 7 days agoSun, 09 Aug 2026 19:58:01 UTC | 0xa1e3…660b | OUT | 0x3a51…3356 | 800,000,000.000000 GLIZZY | Glizzy (GLIZZY) | |
| 0xe0b64162…03ae30 | Transfer | 32,205,258 | 7 days agoSun, 09 Aug 2026 19:58:01 UTC | 0x0000…0000 | IN | 0xa1e3…660b | 1,000,000,000.000000 GLIZZY | Glizzy (GLIZZY) | |
| 0x98271a6a…a9fc1f | Transfer | 32,131,861 | 8 days agoSun, 09 Aug 2026 17:55:36 UTC | 0xa1e3…660b | OUT | 0xd1ec…bf67 | $NaN542,857,142.857142 PEPECOIN | ||
| 0x98271a6a…a9fc1f | Transfer | 32,131,861 | 8 days agoSun, 09 Aug 2026 17:55:36 UTC | 0x5b86…f4fe | IN | 0xa1e3…660b | $NaN342,857,142.857142 PEPECOIN | ||
| 0x1f330247…fb1d84 | Transfer | 32,115,407 | 8 days agoSun, 09 Aug 2026 17:28:08 UTC | 0xa1e3…660b | OUT | 0x5b86…f4fe | $NaN800,000,000.000000 PEPECOIN | ||
| 0x1f330247…fb1d84 | Transfer | 32,115,407 | 8 days agoSun, 09 Aug 2026 17:28:08 UTC | 0x0000…0000 | IN | 0xa1e3…660b | $NaN1,000,000,000.000000 PEPECOIN | ||
| 0x87f55807…48f878 | Transfer | 31,730,515 | 8 days agoSun, 09 Aug 2026 06:45:15 UTC | 0xa1e3…660b | OUT | 0x1fd2…340b | 800,000,000.000000 ANEWBEGI | 新的开始 (ANEWBEGI) | |
| 0x87f55807…48f878 | Transfer | 31,730,515 | 8 days agoSun, 09 Aug 2026 06:45:15 UTC | 0x0000…0000 | IN | 0xa1e3…660b | 1,000,000,000.000000 ANEWBEGI | 新的开始 (ANEWBEGI) | |
| 0x0bcf7182…fc6e00 | Transfer | 31,350,148 | 8 days agoSat, 08 Aug 2026 20:10:12 UTC | 0xa1e3…660b | OUT | 0x3561…9ef3 | 800,000,000.000000 B | banger.fun (B) | |
| 0x0bcf7182…fc6e00 | Transfer | 31,350,148 | 8 days agoSat, 08 Aug 2026 20:10:12 UTC | 0x0000…0000 | IN | 0xa1e3…660b | 1,000,000,000.000000 B | banger.fun (B) | |
| 0xf74ee9b3…89b399 | Transfer | 31,121,424 | 9 days agoSat, 08 Aug 2026 13:48:36 UTC | 0xa1e3…660b | OUT | 0xb414…2da0 | 800,000,000.000000 AORP | AORP (AORP) | |
| 0xf74ee9b3…89b399 | Transfer | 31,121,424 | 9 days agoSat, 08 Aug 2026 13:48:36 UTC | 0x0000…0000 | IN | 0xa1e3…660b | 1,000,000,000.000000 AORP | AORP (AORP) | |
| 0xbf2daffe…dd7dc7 | Transfer | 31,115,433 | 9 days agoSat, 08 Aug 2026 13:38:35 UTC | 0xa1e3…660b | OUT | 0xa5f4…c549 | 800,000,000.000000 XST | XSo-lut-sol (XST) | |
| 0xbf2daffe…dd7dc7 | Transfer | 31,115,433 | 9 days agoSat, 08 Aug 2026 13:38:35 UTC | 0x0000…0000 | IN | 0xa1e3…660b | 1,000,000,000.000000 XST | XSo-lut-sol (XST) | |
| 0x0c4aee19…d11272 | Transfer | 31,109,384 | 9 days agoSat, 08 Aug 2026 13:28:29 UTC | 0xa1e3…660b | OUT | 0x638f…c595 | 800,000,000.000000 SB | SNOWBOY (SB) | |
| 0x0c4aee19…d11272 | Transfer | 31,109,384 | 9 days agoSat, 08 Aug 2026 13:28:29 UTC | 0x0000…0000 | IN | 0xa1e3…660b | 1,000,000,000.000000 SB | SNOWBOY (SB) | |
| 0xc654830b…62ab22 | Transfer | 31,103,390 | 9 days agoSat, 08 Aug 2026 13:18:27 UTC | 0xa1e3…660b | OUT | 0x8c06…4526 | 800,000,000.000000 TUZKI | TUZKI (TUZKI) | |
| 0xc654830b…62ab22 | Transfer | 31,103,390 | 9 days agoSat, 08 Aug 2026 13:18:27 UTC | 0x0000…0000 | IN | 0xa1e3…660b | 1,000,000,000.000000 TUZKI | TUZKI (TUZKI) | |
| 0x308f8fdc…ebbeba | Transfer | 31,102,414 | 9 days agoSat, 08 Aug 2026 13:16:50 UTC | 0xa1e3…660b | OUT | 0x33f2…8100 | 800,000,000.000000 WBS | Warren Buffet Squishmallow (WBS) | |
| 0x308f8fdc…ebbeba | Transfer | 31,102,414 | 9 days agoSat, 08 Aug 2026 13:16:50 UTC | 0x0000…0000 | IN | 0xa1e3…660b | 1,000,000,000.000000 WBS | Warren Buffet Squishmallow (WBS) | |
| 0xabae1e02…159e14 | Transfer | 31,097,388 | 9 days agoSat, 08 Aug 2026 13:08:26 UTC | 0xa1e3…660b | OUT | 0xdafe…fdf2 | 800,000,000.000000 PEPE | Pepe el Ratonero (PEPE) |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 32,902,952 | 7 days agoMon, 10 Aug 2026 15:22:52 UTC | 0x262258…814106 | CREATE | launchToken | 0xa1e3…660b | OUT | 0x7423…a050 | 0 ETH |
| 32,902,952 | 7 days agoMon, 10 Aug 2026 15:22:52 UTC | 0x262258…814106 | CREATE | launchToken | 0xa1e3…660b | OUT | 0x5220…8773 | 0 ETH |
| 32,246,909 | 7 days agoSun, 09 Aug 2026 21:07:29 UTC | 0x41d6d5…7d491c | CREATE | launchToken | 0xa1e3…660b | OUT | 0x9961…749f | 0 ETH |
| 32,246,909 | 7 days agoSun, 09 Aug 2026 21:07:29 UTC | 0x41d6d5…7d491c | CREATE | launchToken | 0xa1e3…660b | OUT | 0x3c00…1941 | 0 ETH |
| 32,205,258 | 7 days agoSun, 09 Aug 2026 19:58:01 UTC | 0xe0b641…03ae30 | CREATE | launchToken | 0xa1e3…660b | OUT | 0x3a51…3356 | 0 ETH |
| 32,205,258 | 7 days agoSun, 09 Aug 2026 19:58:01 UTC | 0xe0b641…03ae30 | CREATE | launchToken | 0xa1e3…660b | OUT | 0x8bfe…2975 | 0 ETH |
| 32,131,861 | 8 days agoSun, 09 Aug 2026 17:55:36 UTC | 0x98271a…a9fc1f | CALL | graduateToken | 0xa1e3…660b | OUT | 0xd1ec…bf67 | 1.95 ETH |
| 32,131,861 | 8 days agoSun, 09 Aug 2026 17:55:36 UTC | 0x98271a…a9fc1f | CALL | graduateToken | 0xa1e3…660b | OUT | 0x1f15…1a30 | 0.05 ETH |
| 32,131,861 | 8 days agoSun, 09 Aug 2026 17:55:36 UTC | 0x98271a…a9fc1f | CALL | graduateToken | 0x5b86…f4fe | IN | 0xa1e3…660b | 2 ETH |
| 32,115,407 | 8 days agoSun, 09 Aug 2026 17:28:08 UTC | 0x1f3302…fb1d84 | CREATE | launchToken | 0xa1e3…660b | OUT | 0x5b86…f4fe | 0 ETH |
| 32,115,407 | 8 days agoSun, 09 Aug 2026 17:28:08 UTC | 0x1f3302…fb1d84 | CREATE | launchToken | 0xa1e3…660b | OUT | 0x0b96…6241 | 0 ETH |
| 31,730,515 | 8 days agoSun, 09 Aug 2026 06:45:15 UTC | 0x87f558…48f878 | CREATE | launchToken | 0xa1e3…660b | OUT | 0x1fd2…340b | 0 ETH |
| 31,730,515 | 8 days agoSun, 09 Aug 2026 06:45:15 UTC | 0x87f558…48f878 | CREATE | launchToken | 0xa1e3…660b | OUT | 0xf07c…58f6 | 0 ETH |
| 31,350,148 | 8 days agoSat, 08 Aug 2026 20:10:12 UTC | 0x0bcf71…fc6e00 | CREATE | launchToken | 0xa1e3…660b | OUT | 0x3561…9ef3 | 0 ETH |
| 31,350,148 | 8 days agoSat, 08 Aug 2026 20:10:12 UTC | 0x0bcf71…fc6e00 | CREATE | launchToken | 0xa1e3…660b | OUT | 0xa849…097b | 0 ETH |
| 31,121,424 | 9 days agoSat, 08 Aug 2026 13:48:36 UTC | 0xf74ee9…89b399 | CREATE | launchToken | 0xa1e3…660b | OUT | 0xb414…2da0 | 0 ETH |
| 31,121,424 | 9 days agoSat, 08 Aug 2026 13:48:36 UTC | 0xf74ee9…89b399 | CREATE | launchToken | 0xa1e3…660b | OUT | 0x5f9d…571c | 0 ETH |
| 31,115,433 | 9 days agoSat, 08 Aug 2026 13:38:35 UTC | 0xbf2daf…dd7dc7 | CREATE | launchToken | 0xa1e3…660b | OUT | 0xa5f4…c549 | 0 ETH |
| 31,115,433 | 9 days agoSat, 08 Aug 2026 13:38:35 UTC | 0xbf2daf…dd7dc7 | CREATE | launchToken | 0xa1e3…660b | OUT | 0x3b52…c4d8 | 0 ETH |
| 31,109,384 | 9 days agoSat, 08 Aug 2026 13:28:29 UTC | 0x0c4aee…d11272 | CREATE | launchToken | 0xa1e3…660b | OUT | 0x638f…c595 | 0 ETH |
| 31,109,384 | 9 days agoSat, 08 Aug 2026 13:28:29 UTC | 0x0c4aee…d11272 | CREATE | launchToken | 0xa1e3…660b | OUT | 0x36b8…58c7 | 0 ETH |
| 31,103,390 | 9 days agoSat, 08 Aug 2026 13:18:27 UTC | 0xc65483…62ab22 | CREATE | launchToken | 0xa1e3…660b | OUT | 0x8c06…4526 | 0 ETH |
| 31,103,390 | 9 days agoSat, 08 Aug 2026 13:18:27 UTC | 0xc65483…62ab22 | CREATE | launchToken | 0xa1e3…660b | OUT | 0x3fe0…7434 | 0 ETH |
| 31,102,414 | 9 days agoSat, 08 Aug 2026 13:16:50 UTC | 0x308f8f…ebbeba | CREATE | launchToken | 0xa1e3…660b | OUT | 0x33f2…8100 | 0 ETH |
| 31,102,414 | 9 days agoSat, 08 Aug 2026 13:16:50 UTC | 0x308f8f…ebbeba | CREATE | launchToken | 0xa1e3…660b | OUT | 0x8bf8…cba7 | 0 ETH |