Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 5 from a total of 5 transactions
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0x145A7b84...08d1e7F79 The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
Lambda
Compiler Version
v0.8.20+commit.a1b79de6
Optimization Enabled:
Yes with 800 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
/* https://t.me/lambdamonad */
pragma solidity ^0.8.20;
/* ============================================================================
IMPORTS
============================================================================ */
import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
import { ReentrancyGuard } from "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import { AggregatorV3Interface } from "./vendor/chainlink/AggregatorV3Interface.sol";
/* ============================================================================
UNISWAP V2 INTERFACES
============================================================================ */
interface IUniswapV2Factory {
function createPair(address tokenA, address tokenB) external returns (address);
}
interface IUniswapV2Router02 {
function factory() external view returns (address);
function WETH() external view returns (address);
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external payable;
function addLiquidityETH(
address token,
uint256 amountTokenDesired,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
) external payable returns (uint256, uint256, uint256);
}
interface IUniswapV2Pair {
function getReserves()
external
view
returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
function token0() external view returns (address);
function token1() external view returns (address);
}
/* ============================================================================
Lp Vault INTERFACE
============================================================================ */
interface ILpVault {
function burnLp(uint256 amount) external;
function burnLpBps(uint256 bps) external;
}
/* ============================================================================
LAMBDA TOKEN (PRODUCTION)
============================================================================ */
/// @title LAMBDA Token
/// @notice ERC20 token with dynamic fees and automated liquidity management based on TVL and volatility.
/// @dev Implements:
/// - Dynamic Liquidity Gravity (DLG) = volatility-based fee bands
/// - Per-wallet 1h dump tracking to punish "slow chippers"
/// - Auto-liquidity, auto-buyback, and LP-burning based on dynamic USD thresholds.
contract Lambda is ERC20, Ownable, ReentrancyGuard {
/* -------------------------------- CONSTANTS ---------------------------- */
/// @notice Denominator for fee and percentage calculations (basis points).
uint256 public constant FEE_DENOM = 10_000;
uint256 public constant PERCENT_DENOM = 10_000;
/// @notice Basis points of TVL for buyback threshold (1.5%).
uint256 public constant BUYBACK_TVL_BPS = 150;
/// @notice Basis points of TVL for liquidity threshold (2%).
uint256 public constant LIQ_TVL_BPS = 200;
/// @notice Basis points of TVL-equivalent volume for LP burn threshold (2%).
uint256 public constant LPBURN_TVL_BPS = 200;
/// @notice Minimum / maximum USD thresholds (18 decimals) for ABB / DLG / LPT.
uint256 public constant MIN_BUYBACK_USD = 10 ether; // $10
uint256 public constant MAX_BUYBACK_USD = 1_000 ether; // $1k - more conservative
uint256 public constant MIN_LIQ_USD = 25 ether; // $25 - slightly higher for liquidity
uint256 public constant MAX_LIQ_USD = 2_000 ether; // $2k - balanced for growth
uint256 public constant MIN_LPBURN_USD = 50 ether; // $50 - higher bar for LP burns
uint256 public constant MAX_LPBURN_USD = 5_000 ether; // $5k - keep high for volume triggers
/* -------------------------------- CONFIG -------------------------------- */
/// @notice Uniswap V2 router.
IUniswapV2Router02 public immutable router;
/// @notice Uniswap V2 pair ( LAMB / MON).
address public pair;
/// @notice Baseline liquidity fee (bps) used as fallback.
uint256 public baseLiquidityFee = 100; // 1%
/// @notice Chainlink MON / USD oracle.
AggregatorV3Interface public immutable monUsdFeed;
/// @notice Maximum allowed oracle staleness.
uint256 public oracleMaxDelay = 2 hours;
/// @notice Emergency override to ignore Chainlink in case of failure.
bool public emergencyOracleOverride;
/// @notice Fallback MON/USD price used when emergencyOracleOverride is true.
/// @dev 18 decimals, e.g. 0.04 USD = 0.04 * 1e18.
uint256 public emergencyMonUsdPrice;
/// @notice True once trading is enabled.
bool public tradingEnabled;
/// @notice Internal guard to avoid re-entrancy during swaps / LP ops.
bool internal inSwap;
/// @notice Max tx and wallet limits in basis points of total supply.
/// @dev Defaults to 3% (300 bps), matching the original behavior.
uint256 public maxTxBps = 300;
uint256 public maxWalletBps = 300;
/// @notice Global flag to toggle maxTx / maxWallet checks.
/// @dev Once disabled, it cannot be re-enabled.
bool public limitsEnabled = true;
/// @notice TVL breakpoints
uint256 public tvlLevel1 = 5_000 ether; // ~ $5k
uint256 public tvlLevel2 = 20_000 ether; // ~ $20k
uint256 public tvlLevel3 = 100_000 ether; // ~ $100k
/// @notice % ETH for liquidity (in bps)
///
/// - < 5k → 90% LP
/// - < 20k → 75% LP
/// - < 100k → 60% LP
/// - >=100k → 50% LP
uint256 public ethShareLevel1Bps = 9_000; // 90%
uint256 public ethShareLevel2Bps = 7_500; // 75%
uint256 public ethShareLevel3Bps = 6_000; // 60%
uint256 public ethShareLevel4Bps = 5_000; // 50%
/* -------------------------------- VOLUME -------------------------------- */
/// @notice Rolling 1-hour global volume window (in token units).
uint256 public volumeWindow;
/// @notice Timestamp of last volume window reset.
uint256 public volumeLastReset;
/* ----------------------------- PRICE TRACKING --------------------------- */
/// @notice Last cached pair reserves.
uint256 public lastReserve0;
uint256 public lastReserve1;
/// @notice Last cached price (token in base units, 1e18 precision).
uint256 public lastPrice;
/// @notice Last block number where reserves were updated.
uint256 public lastUpdateBlock;
/// @notice Vault that custody protocol-owned LP.
address public lpVault;
/* ----------------------- PER-ADDRESS SELLER WINDOWS --------------------- */
/// @notice Per-address rolling 1-hour sell tracking for "slow chippers".
struct SellerWindow {
uint64 windowStart; // start timestamp of the current window
uint128 soldAmount; // total tokens sold into the pair during this window
uint128 startingBalance; // wallet balance at the beginning of the window
}
/// @notice Mapping of seller address → their rolling sell window state.
mapping(address => SellerWindow) private _sellerWindows;
/// @notice Last active fee band index for Dynamic Liquidity Gravity (DLG).
/// @dev 0 = low (1%), 1 = medium (3%), 2 = high (5%), 3 = extreme (8%).
uint8 public lastFeeBand;
/// @notice Last active liquidity fee in basis points (for the current band).
uint256 public lastFeeBps;
/* -------------------------------- EVENTS -------------------------------- */
/// @notice Emitted when liquidity is automatically added.
/// @param amountToken Amount of LAMB actually added to the pool.
/// @param amountETH Amount of ETH/MON actually added to the pool.
/// @param liquidity LP tokens minted to this contract.
/// @param tvlBeforeUsd Pool TVL in USD before adding liquidity (18 decimals).
/// @param tvlAfterUsd Pool TVL in USD after adding liquidity (18 decimals).
event LiquidityAdded(
uint256 amountToken,
uint256 amountETH,
uint256 liquidity,
uint256 tvlBeforeUsd,
uint256 tvlAfterUsd
);
/// @notice Emitted when a buyback occurs.
event BuybackOccurred(uint256 ethSpent, uint256 tokensBurned);
/// @notice Emitted when LP tokens are burned.
event LPBurned(
uint256 amount,
uint256 tvlBeforeUsd,
uint256 tvlAfterUsd
);
/// @notice Emitted when trading is enabled.
event TradingEnabled();
/// @notice Emitted whenever the DLG fee band changes.
/// @param oldBand Previous band index.
/// @param newBand New band index.
/// @param oldFeeBps Previous effective liquidity fee in bps.
/// @param newFeeBps New effective liquidity fee in bps.
event LiquidityFeeBandChanged(
uint8 indexed oldBand,
uint8 indexed newBand,
uint256 oldFeeBps,
uint256 newFeeBps
);
event EthShareCurveUpdated(
uint256 tvl1,
uint256 tvl2,
uint256 tvl3,
uint256 share1Bps,
uint256 share2Bps,
uint256 share3Bps,
uint256 share4Bps
);
/* --------------------------- INTERNAL MODIFIERS ------------------------- */
/// @notice Marks an execution context as performing swap / LP operations.
modifier swapping() {
inSwap = true;
_;
inSwap = false;
}
/// @notice Trading gate:
/// - Before pair exists: everything allowed.
/// - After pair exists but before tradingEnabled:
/// only owner → pair is allowed (for initial LP).
/// - After tradingEnabled: normal behavior.
modifier tradingOpen(address from, address to) {
if (!tradingEnabled) {
if (pair != address(0)) {
bool isTrade = (from == pair || to == pair);
if (isTrade) {
require(from == owner() && to == pair, "Trading not enabled");
}
}
}
_;
}
/* ============================================================================
CONSTRUCTOR
============================================================================ */
/// @notice Contract constructor.
/// @param routerAddr Address of the Uniswap V2 router.
/// @param chainlinkMonUsd Address of the Chainlink MON / USD price feed.
constructor(
address routerAddr,
address chainlinkMonUsd
)
ERC20(unicode"λLAMBDA", "LAMB")
Ownable(msg.sender)
{
require(routerAddr != address(0), "Router=0");
require(chainlinkMonUsd != address(0), "Oracle=0");
router = IUniswapV2Router02(routerAddr);
monUsdFeed = AggregatorV3Interface(chainlinkMonUsd);
_mint(msg.sender, 1_000_000_000 ether);
lastUpdateBlock = block.number;
volumeLastReset = block.timestamp;
lastFeeBand = 0;
lastFeeBps = baseLiquidityFee;
}
/* ============================================================================
ORACLE LOGIC
============================================================================ */
/// @notice Gets the current MON / USD price from Chainlink oracle.
/// @return price MON / USD price with 18 decimals.
/// @return ok True if price data is valid and recent.
function getMonUsdPrice() public view returns (uint256 price, bool ok) {
if (emergencyOracleOverride) {
if (emergencyMonUsdPrice == 0) {
return (0, false);
}
return (emergencyMonUsdPrice, true);
}
(
uint80 roundId,
int256 answer,
,
uint256 updatedAt,
uint80 answeredInRound
) = monUsdFeed.latestRoundData();
if (
answer <= 0 ||
updatedAt == 0 ||
block.timestamp - updatedAt > oracleMaxDelay ||
answeredInRound < roundId
) return (0, false);
uint8 d = monUsdFeed.decimals();
uint256 scaled;
if (d == 18) {
scaled = uint256(answer);
} else if (d < 18) {
scaled = uint256(answer) * 10 ** (18 - d);
} else {
scaled = uint256(answer) / 10 ** (d - 18);
}
return (scaled, true);
}
/// @notice Gets the current token price in MON (base asset) from pair reserves.
/// @return Token price in MON with 18 decimals.
function getTokenPriceMon() public view returns (uint256) {
if (pair == address(0)) return 1e18;
(uint112 r0, uint112 r1,) = IUniswapV2Pair(pair).getReserves();
if (r0 == 0 || r1 == 0) return lastPrice == 0 ? 1e18 : lastPrice;
return IUniswapV2Pair(pair).token0() == address(this)
? (uint256(r1) * 1e18) / uint256(r0)
: (uint256(r0) * 1e18) / uint256(r1);
}
/// @notice Gets the current token price in USD.
/// @return Token price in USD with 18 decimals.
function getTokenPriceUsd() public view returns (uint256) {
(uint256 p, bool ok) = getMonUsdPrice();
if (!ok) return 0;
return (getTokenPriceMon() * p) / 1e18;
}
/* ============================================================================
TVL HELPERS
============================================================================ */
/// @notice Calculates total value locked in the liquidity pool in USD.
/// @return TVL in USD with 18 decimals.
function getPoolUsd() public view returns (uint256) {
if (pair == address(0)) return 0;
(uint112 r0, uint112 r1,) = IUniswapV2Pair(pair).getReserves();
if (r0 == 0 || r1 == 0) return 0;
address token0 = IUniswapV2Pair(pair).token0();
uint256 tokenReserve = token0 == address(this) ? uint256(r0) : uint256(r1);
uint256 tokenSideUsd = (getTokenPriceUsd() * tokenReserve) / 1e18;
// 50/50 AMM, total TVL ≈ 2x token side.
return tokenSideUsd * 2;
}
/// @notice Clamps a value between min and max.
function _clamp(uint256 x, uint256 minV, uint256 maxV) internal pure returns (uint256) {
if (x < minV) return minV;
if (x > maxV) return maxV;
return x;
}
/// @notice Calculates dynamic USD threshold for automatic liquidity.
/// @return Threshold USD value with 18 decimals.
function _dynamicLiquidityThresholdUsd() internal view returns (uint256) {
uint256 tvlUsd = getPoolUsd();
if (tvlUsd == 0) return 0;
uint256 raw = (tvlUsd * LIQ_TVL_BPS) / PERCENT_DENOM;
return _clamp(raw, MIN_LIQ_USD, MAX_LIQ_USD);
}
/// @notice Calculates dynamic USD threshold for automatic buyback.
/// @return Threshold USD value with 18 decimals.
function _dynamicBuybackThresholdUsd() internal view returns (uint256) {
uint256 tvlUsd = getPoolUsd();
if (tvlUsd == 0) return 0;
uint256 raw = (tvlUsd * BUYBACK_TVL_BPS) / PERCENT_DENOM;
return _clamp(raw, MIN_BUYBACK_USD, MAX_BUYBACK_USD);
}
/// @notice Calculates dynamic USD threshold for automatic LP burning.
/// @return Threshold USD value with 18 decimals.
function _dynamicLpBurnThresholdUsd() internal view returns (uint256) {
uint256 tvlUsd = getPoolUsd();
if (tvlUsd == 0) return 0;
uint256 raw = (tvlUsd * LPBURN_TVL_BPS) / PERCENT_DENOM;
return _clamp(raw, MIN_LPBURN_USD, MAX_LPBURN_USD);
}
/* ============================================================================
DYNAMIC LIMITS (maxTx / maxWallet)
============================================================================ */
/// @notice Gets the current maximum transaction amount.
/// @dev By default: maxTxBps of the *pool's token balance* (LAMB in the pair).
/// If the pair is not set or empty, falls back to % of total supply.
function _currentMaxTxAmount() internal view returns (uint256) {
if (!limitsEnabled) {
// Sin límite: permite mover todo el supply en una tx
return totalSupply();
}
if (pair != address(0)) {
uint256 poolTokens = balanceOf(pair);
if (poolTokens > 0) {
// maxTxBps = 300 → 3% pool
return (poolTokens * maxTxBps) / PERCENT_DENOM;
}
}
uint256 supply = totalSupply();
if (supply == 0) return 0;
return (supply * maxTxBps) / PERCENT_DENOM;
}
/// @notice Gets the current maximum wallet holding amount.
/// @dev Fixed at 3% of total supply, independent of TVL.
/// @return Maximum amount allowed per wallet in token units.
function _currentMaxWalletAmount() internal view returns (uint256) {
if (!limitsEnabled) {
// No max wallet restriction
return totalSupply();
}
uint256 supply = totalSupply();
if (supply == 0) return 0;
return (supply * maxWalletBps) / PERCENT_DENOM;
}
/* ============================================================================
DYNAMIC LIQUIDITY GRAVITY (FEE BANDS)
============================================================================ */
/// @notice Computes the base DLG fee from pure price volatility (no wallet history).
/// @dev Uses lastPrice and current on-chain price from the pair; does not mutate state.
/// @return feeBps Liquidity fee in basis points from volatility alone.
function _volatilityFeeBps() internal view returns (uint256 feeBps) {
// No history → baseline 1%.
if (lastPrice == 0) {
return 100; // 1%
}
uint256 currentPrice = getTokenPriceMon();
if (currentPrice == 0) {
// If oracle / reserves are odd, fall back to baseline.
return baseLiquidityFee;
}
uint256 p0 = lastPrice;
uint256 p1 = currentPrice;
uint256 diff = p1 > p0 ? p1 - p0 : p0 - p1;
// change in basis points of price.
uint256 changeBps = (diff * PERCENT_DENOM) / p0;
// Volatility bands → fee bps:
// < 0.5% → 1%
// < 1.5% → 3%
// < 3.0% → 5%
// >= 3.0% → 8%
if (changeBps < 50) {
return 100; // 1% liquidity fee (low volatility)
} else if (changeBps < 150) {
return 300; // 3% liquidity fee (medium)
} else if (changeBps < 300) {
return 500; // 5% liquidity fee (high)
} else {
return 800; // 8% liquidity fee (extreme)
}
}
/// @notice Updates the seller's 1-hour rolling window and returns % of wallet dumped.
/// @dev Called only on sells (to == pair). Uses pre-transfer balance.
/// @param seller Address of the seller.
/// @param sellAmount Amount of tokens sold in this trade.
/// @param currentBalance Seller's current balance BEFORE this trade.
/// @return walletDumpWindowBps = (soldInWindow / startingBalance) * 10_000.
function _updateSellerWindowAndGetDumpBps(
address seller,
uint256 sellAmount,
uint256 currentBalance
) internal returns (uint256 walletDumpWindowBps) {
SellerWindow storage w = _sellerWindows[seller];
uint256 nowTs = block.timestamp;
// If window is stale (>1 hour) or never initialized, start a new one.
if (w.windowStart == 0 || nowTs > w.windowStart + 1 hours) {
w.windowStart = uint64(nowTs);
w.soldAmount = uint128(sellAmount);
w.startingBalance = uint128(currentBalance);
} else {
// Same window, accumulate sells.
w.soldAmount += uint128(sellAmount);
// If starting balance was somehow zero, initialize it.
if (w.startingBalance == 0) {
w.startingBalance = uint128(currentBalance + sellAmount);
}
}
if (w.startingBalance == 0) {
return 0;
}
walletDumpWindowBps = (uint256(w.soldAmount) * PERCENT_DENOM) / uint256(w.startingBalance);
}
/// @notice Maps 1-hour wallet dump % to an extra fee suggestion.
/// @dev This is the "slow chippers punishment" layer.
/// @param walletDumpWindowBps Percentage of wallet sold in the current window (bps).
/// @return feeBps Extra liquidity fee in bps imposed by wallet dump behavior.
function _walletDumpFeeBps(uint256 walletDumpWindowBps) internal pure returns (uint256) {
// Policy:
// - >= 50% of wallet in 1h → 8%
// - >= 20% of wallet in 1h → 5%
// - >= 10% of wallet in 1h → 3%
// - else → no extra bump.
if (walletDumpWindowBps >= 5_000) {
return 800; // 50%+ of wallet → extreme band
} else if (walletDumpWindowBps >= 2_000) {
return 500; // 20–50% of wallet
} else if (walletDumpWindowBps >= 1_000) {
return 300; // 10–20% of wallet
}
return 0; // no bump
}
/// @notice Calculates the current dynamic liquidity fee based on volatility and wallet behavior.
/// @dev Combines:
/// - price volatility (DLG),
/// - 1-hour per-wallet dump % ("slow chippers" punishment, sells only).
/// Emits LiquidityFeeBandChanged when the effective band changes.
/// @param from Sender address.
/// @param to Receiver address.
/// @param amount Trade amount in tokens.
/// @return feeBps Final liquidity fee in basis points for this trade.
function _currentLiquidityFeeBps(
address from,
address to,
uint256 amount
) internal returns (uint256 feeBps) {
bool isSell = (pair != address(0) && to == pair && from != pair);
// 0) Snapshot previous state for the event.
uint8 oldBand = lastFeeBand;
uint256 oldFeeBps = lastFeeBps;
// 1) Base band from price volatility.
uint256 volFeeBps = _volatilityFeeBps();
// 2) Extra band for slow-chipper behavior (sells only).
uint256 walletDumpWindowBps = 0;
uint256 walletDumpFeeBps = 0;
if (isSell) {
uint256 preBalance = balanceOf(from); // pre-trade balance
walletDumpWindowBps = _updateSellerWindowAndGetDumpBps(
from,
amount,
preBalance
);
walletDumpFeeBps = _walletDumpFeeBps(walletDumpWindowBps);
}
// Final fee = max(volatilityBand, walletDumpBand).
feeBps = volFeeBps;
if (walletDumpFeeBps > feeBps) {
feeBps = walletDumpFeeBps;
}
// 3) Determine band index from the resulting fee.
uint8 newBand;
if (feeBps <= 100) {
newBand = 0; // 1%
} else if (feeBps <= 300) {
newBand = 1; // 3%
} else if (feeBps <= 500) {
newBand = 2; // 5%
} else {
newBand = 3; // 8%;
}
// 4) Emit event only when the band changes.
if (newBand != oldBand) {
lastFeeBand = newBand;
lastFeeBps = feeBps;
emit LiquidityFeeBandChanged(oldBand, newBand, oldFeeBps, feeBps);
} else {
// Keep lastFeeBps updated even if the band index stays the same.
lastFeeBps = feeBps;
}
return feeBps;
}
/// @notice Returns the percentage of ETH (in bps) allocated to liquidity,
/// based on the current pool TVL and configurable curve.
function _ethShareForLiquidityBps() internal view returns (uint256) {
uint256 tvlUsd = getPoolUsd(); // 18 decimals
if (tvlUsd == 0) {
return ethShareLevel1Bps;
}
if (tvlUsd < tvlLevel1) {
return ethShareLevel1Bps;
} else if (tvlUsd < tvlLevel2) {
return ethShareLevel2Bps;
} else if (tvlUsd < tvlLevel3) {
return ethShareLevel3Bps;
} else {
return ethShareLevel4Bps;
}
}
/* ============================================================================
TRANSFER HOOK
============================================================================ */
/// @notice Internal automation runner (used both internally and by external entrypoint).
function _processAutomations() internal {
if (!tradingEnabled) return;
if (pair == address(0)) return;
autoLiquidity();
autoBuyback();
autoLPBurn();
}
/// @notice External hook to run automations.
function processAutomations() external nonReentrant swapping onlyOwner{
_processAutomations();
}
/// @notice ERC20 transfer hook, applies DLG fee and triggers automations.
/// @param from Sender address.
/// @param to Receiver address.
/// @param amount Amount of tokens to transfer.
function _update(address from, address to, uint256 amount)
internal
override
tradingOpen(from, to)
{
bool isTrade = (pair != address(0) && (from == pair || to == pair));
/* ---------------------- MINT / BURN PASS THROUGH --------------------- */
if (from == address(0) || to == address(0)) {
super._update(from, to, amount);
return;
}
/* ---------------------------- TRADING LOGIC -------------------------- */
if (!inSwap && isTrade) {
// Only enforce maxTx once trading is enabled.
// This allows the owner/router to seed initial LP without hitting tx limits.
if (tradingEnabled && limitsEnabled) {
// Exempt owner/contract if desired
if (from != owner() && from != address(this)) {
require(amount <= _currentMaxTxAmount(), "Max tx exceeded");
}
}
// Before trading is enabled, we do not take fees at all (pure LP bootstrap).
uint256 feeBps = tradingEnabled ? _currentLiquidityFeeBps(from, to, amount) : 0;
uint256 fee = (amount * feeBps) / FEE_DENOM;
uint256 sendAmt = amount - fee;
if (fee > 0) {
super._update(from, address(this), fee);
}
super._update(from, to, sendAmt);
// Volume tracking (simple 1h window).
if (block.timestamp > volumeLastReset + 1 hours) {
volumeWindow = 0;
volumeLastReset = block.timestamp;
}
volumeWindow += amount;
} else {
super._update(from, to, amount);
}
/* --------------------------- MAX WALLET ------------------------------ */
if (
tradingEnabled &&
limitsEnabled &&
!inSwap &&
to != pair &&
to != address(0xdead) &&
to != address(this)
) {
require(
balanceOf(to) <= _currentMaxWalletAmount(),
"Wallet too large"
);
}
/* --------------------------- RESERVE UPDATES ------------------------- */
updateReserves();
/* --------------------------- AUTOMATIONS ----------------------------- */
bool isSell = (pair != address(0) && to == pair);
// Trigger automations only on user sells, not on internal contract swaps
if (
tradingEnabled &&
!inSwap &&
isSell &&
from != address(this) &&
from != pair &&
msg.sender != address(router)
) {
_processAutomations();
}
}
/* ============================================================================
AUTO-LIQUIDITY (TOKEN → ETH)
============================================================================ */
/// @notice Automatically adds liquidity when accumulated tokens meet USD threshold.
/// @dev Swaps half of contract token balance for ETH, then adds liquidity.
function autoLiquidity() internal swapping {
if (!tradingEnabled || pair == address(0)) return;
uint256 bal = balanceOf(address(this));
if (bal < 2 * 1e18) return; // tiny guard so we don't do dust ops
uint256 thresholdUsd = _dynamicLiquidityThresholdUsd();
if (thresholdUsd == 0) return;
uint256 usdValue = (getTokenPriceUsd() * bal) / 1e18;
if (usdValue < thresholdUsd) return;
uint256 half = bal / 2;
uint256 otherHalf = bal - half;
uint256 beforeEth = address(this).balance;
uint256 tvlBefore = getPoolUsd();
// Approve HALF for swap
_approve(address(this), address(router), half);
address[] memory path = new address[](2);
path[0] = address(this); // LAMB
path[1] = router.WETH(); // MON / WETH
// 1) Swap half of the tokens to ETH
router.swapExactTokensForETHSupportingFeeOnTransferTokens(
half,
0,
path,
address(this),
block.timestamp
);
uint256 received = address(this).balance - beforeEth;
if (received == 0) return;
// 2) Decide how much ETH to allocate to LP (e.g. 100%, 75%, 60%...)
uint256 shareBps = _ethShareForLiquidityBps();
uint256 ethForLiquidity = (received * shareBps) / FEE_DENOM;
if (ethForLiquidity == 0) return;
// Approve the token side for addLiquidity
_approve(address(this), address(router), otherHalf);
address lpReceiver = lpVault != address(0) ? lpVault : address(this);
// 3) Add liquidity with VERY LOOSE mins to avoid router revert
(uint256 usedToken, uint256 usedEth, uint256 liquidity) =
router.addLiquidityETH{ value: ethForLiquidity }(
address(this),
otherHalf,
0, // amountTokenMin = 0 (no slippage protection)
0, // amountETHMin = 0 (no slippage protection)
lpReceiver,
block.timestamp
);
uint256 tvlAfter = getPoolUsd();
emit LiquidityAdded(usedToken, usedEth, liquidity, tvlBefore, tvlAfter);
}
/* ============================================================================
AUTO-BUYBACK (ETH → TOKEN)
============================================================================ */
/// @notice Automatically buys back and burns tokens when accumulated ETH meets USD threshold.
/// @dev Swaps all contract ETH for tokens, then burns the purchased tokens.
function autoBuyback() internal swapping {
if (!tradingEnabled || pair == address(0)) return;
uint256 ethBal = address(this).balance;
if (ethBal == 0) return;
(uint256 monUsd, bool ok) = getMonUsdPrice();
if (!ok || monUsd == 0) return;
uint256 thresholdUsd = _dynamicBuybackThresholdUsd();
if (thresholdUsd == 0) return;
uint256 usdValue = (ethBal * monUsd) / 1e18;
if (usdValue < thresholdUsd) return;
uint256 tokenPriceMon = getTokenPriceMon();
if (tokenPriceMon == 0) return;
address[] memory path = new address[](2);
path[0] = router.WETH();
path[1] = address(this); // LAMB
address burn = address(0xdead);
uint256 before = balanceOf(burn);
router.swapExactETHForTokensSupportingFeeOnTransferTokens{
value: ethBal
}(
0,
path,
burn,
block.timestamp
);
uint256 received = balanceOf(burn) - before;
if (received > 0) {
emit BuybackOccurred(ethBal, received);
}
}
/* ============================================================================
LP BURNING
============================================================================ */
/// @notice Automatically burns LP tokens when volume meets USD threshold.
/// @dev Burns 1% of LP held in the vault when 1-hour volume exceeds threshold.
function autoLPBurn() internal swapping {
if (pair == address(0)) return;
if (lpVault == address(0)) return; // no vault configured
// Volume in USD for this window.
uint256 volumeUsd = (getTokenPriceUsd() * volumeWindow) / 1e18;
uint256 thresholdUsd = _dynamicLpBurnThresholdUsd();
if (thresholdUsd == 0 || volumeUsd < thresholdUsd) return;
uint256 tvlBefore = getPoolUsd();
// We burn 1% (100 bps) of LP held by the vault.
uint256 burnBps = 100; // 1%
uint256 lpBefore = IERC20(pair).balanceOf(lpVault);
if (lpBefore == 0) return;
uint256 burnAmt = (lpBefore * burnBps) / 10_000;
if (burnAmt == 0) return;
ILpVault(lpVault).burnLpBps(burnBps);
volumeWindow = 0;
uint256 tvlAfter = getPoolUsd();
emit LPBurned(burnAmt, tvlBefore, tvlAfter);
}
/* ============================================================================
RESERVES
============================================================================ */
/// @notice Updates cached pair reserves and price tracking once per block.
/// @dev Prevents multiple updates in the same block to save gas.
function updateReserves() internal {
if (pair == address(0)) return;
if (block.number == lastUpdateBlock) return;
(uint112 r0, uint112 r1,) = IUniswapV2Pair(pair).getReserves();
lastReserve0 = r0;
lastReserve1 = r1;
lastUpdateBlock = block.number;
if (r0 > 0 && r1 > 0) {
lastPrice = IUniswapV2Pair(pair).token0() == address(this)
? (uint256(r1) * 1e18) / uint256(r0)
: (uint256(r0) * 1e18) / uint256(r1);
}
}
/* ============================================================================
ADMIN
============================================================================ */
/// @notice Creates the Uniswap V2 trading pair for this token.
/// @dev Can only be called once by the owner.
function createPair() external onlyOwner {
require(pair == address(0), "Pair exists");
pair = IUniswapV2Factory(router.factory()).createPair(address(this), router.WETH());
}
/// @notice Enables trading on the token pair.
/// @dev Can only be called by owner and cannot be undone.
function enableTrading() external onlyOwner {
require(!tradingEnabled, "Already enabled");
tradingEnabled = true;
emit TradingEnabled();
}
/// @notice Sets the maximum allowed oracle update delay.
/// @param delay Delay in seconds.
function setOracleMaxDelay(uint256 delay) external onlyOwner {
oracleMaxDelay = delay;
}
/// @notice Updates the max transaction limit in basis points of total supply.
/// @dev Cannot exceed 100% (10_000 bps).
function setMaxTxBps(uint256 newBps) external onlyOwner {
require(limitsEnabled, "Limits disabled");
require(newBps > 0 && newBps <= PERCENT_DENOM, "Invalid bps");
maxTxBps = newBps;
}
/// @notice Updates the max wallet limit in basis points of total supply.
/// @dev Cannot exceed 100% (10_000 bps).
function setMaxWalletBps(uint256 newBps) external onlyOwner {
require(limitsEnabled, "Limits disabled");
require(newBps > 0 && newBps <= PERCENT_DENOM, "Invalid bps");
maxWalletBps = newBps;
}
/// @notice Permanently disables maxTx and maxWallet limits.
/// @dev One-way switch: once called, limits can never be re-enabled.
function disableLimitsForever() external onlyOwner {
require(limitsEnabled, "Already disabled");
limitsEnabled = false;
}
/// @notice Enables or disables the emergency oracle override and sets a fallback price.
/// @dev When enabled, getMonUsdPrice() will ignore Chainlink and use this price instead.
/// @param enabled Whether to enable the emergency fallback.
/// @param fallbackPrice Fallback MON/USD price with 18 decimals.
function setEmergencyOracleOverride(bool enabled, uint256 fallbackPrice) external onlyOwner {
emergencyOracleOverride = enabled;
if (enabled) {
require(fallbackPrice > 0, "Fallback price=0");
emergencyMonUsdPrice = fallbackPrice;
}
}
/// @notice Sets the LP vault where protocol-owned LP tokens are stored.
/// @dev Can only be set once to avoid governance foot-guns.
function setLpVault(address _vault) external onlyOwner {
require(lpVault == address(0), "lpVault already set");
require(_vault != address(0), "lpVault = 0");
lpVault = _vault;
}
function setEthShareForLiquidityCurve(
uint256 _tvl1,
uint256 _tvl2,
uint256 _tvl3,
uint256 _share1Bps,
uint256 _share2Bps,
uint256 _share3Bps,
uint256 _share4Bps
) external onlyOwner {
require(_tvl1 > 0 && _tvl2 > _tvl1 && _tvl3 > _tvl2, "Bad TVL levels");
require(
_share1Bps <= FEE_DENOM &&
_share2Bps <= FEE_DENOM &&
_share3Bps <= FEE_DENOM &&
_share4Bps <= FEE_DENOM,
"Share > 100%"
);
tvlLevel1 = _tvl1;
tvlLevel2 = _tvl2;
tvlLevel3 = _tvl3;
ethShareLevel1Bps = _share1Bps;
ethShareLevel2Bps = _share2Bps;
ethShareLevel3Bps = _share3Bps;
ethShareLevel4Bps = _share4Bps;
emit EthShareCurveUpdated(
_tvl1,
_tvl2,
_tvl3,
_share1Bps,
_share2Bps,
_share3Bps,
_share4Bps
);
}
/* ============================================================================
ETH HANDLING
============================================================================ */
/// @notice Receives ETH used for auto-liquidity and buybacks.
/// @dev ETH can come from router swaps or from external senders (donations / manual top-ups).
receive() external payable {}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
import {Context} from "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* The initial owner is set to the address provided by the deployer. This can
* later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/draft-IERC6093.sol)
pragma solidity >=0.8.4;
/**
* @dev Standard ERC-20 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.
*/
interface IERC20Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC20InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC20InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
* @param spender Address that may be allowed to operate on tokens without being their owner.
* @param allowance Amount of tokens a `spender` is allowed to operate with.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC20InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `spender` to be approved. Used in approvals.
* @param spender Address that may be allowed to operate on tokens without being their owner.
*/
error ERC20InvalidSpender(address spender);
}
/**
* @dev Standard ERC-721 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.
*/
interface IERC721Errors {
/**
* @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20.
* Used in balance queries.
* @param owner Address of the current owner of a token.
*/
error ERC721InvalidOwner(address owner);
/**
* @dev Indicates a `tokenId` whose `owner` is the zero address.
* @param tokenId Identifier number of a token.
*/
error ERC721NonexistentToken(uint256 tokenId);
/**
* @dev Indicates an error related to the ownership over a particular token. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param tokenId Identifier number of a token.
* @param owner Address of the current owner of a token.
*/
error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC721InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC721InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param tokenId Identifier number of a token.
*/
error ERC721InsufficientApproval(address operator, uint256 tokenId);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC721InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC721InvalidOperator(address operator);
}
/**
* @dev Standard ERC-1155 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.
*/
interface IERC1155Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
* @param tokenId Identifier number of a token.
*/
error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC1155InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC1155InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param owner Address of the current owner of a token.
*/
error ERC1155MissingApprovalForAll(address operator, address owner);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC1155InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC1155InvalidOperator(address operator);
/**
* @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
* Used in batch transfers.
* @param idsLength Length of the array of token identifiers
* @param valuesLength Length of the array of token amounts
*/
error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/ERC20.sol)
pragma solidity ^0.8.20;
import {IERC20} from "./IERC20.sol";
import {IERC20Metadata} from "./extensions/IERC20Metadata.sol";
import {Context} from "../../utils/Context.sol";
import {IERC20Errors} from "../../interfaces/draft-IERC6093.sol";
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
*
* TIP: For a detailed writeup see our guide
* https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* The default value of {decimals} is 18. To change this, you should override
* this function so it returns a different value.
*
* We have followed general OpenZeppelin Contracts guidelines: functions revert
* instead returning `false` on failure. This behavior is nonetheless
* conventional and does not conflict with the expectations of ERC-20
* applications.
*/
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
mapping(address account => uint256) private _balances;
mapping(address account => mapping(address spender => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
/**
* @dev Sets the values for {name} and {symbol}.
*
* Both values are immutable: they can only be set once during construction.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5.05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the default value returned by this function, unless
* it's overridden.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual returns (uint8) {
return 18;
}
/// @inheritdoc IERC20
function totalSupply() public view virtual returns (uint256) {
return _totalSupply;
}
/// @inheritdoc IERC20
function balanceOf(address account) public view virtual returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - the caller must have a balance of at least `value`.
*/
function transfer(address to, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_transfer(owner, to, value);
return true;
}
/// @inheritdoc IERC20
function allowance(address owner, address spender) public view virtual returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
* `transferFrom`. This is semantically equivalent to an infinite approval.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, value);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Skips emitting an {Approval} event indicating an allowance update. This is not
* required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].
*
* NOTE: Does not update the allowance if the current allowance
* is the maximum `uint256`.
*
* Requirements:
*
* - `from` and `to` cannot be the zero address.
* - `from` must have a balance of at least `value`.
* - the caller must have allowance for ``from``'s tokens of at least
* `value`.
*/
function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, value);
_transfer(from, to, value);
return true;
}
/**
* @dev Moves a `value` amount of tokens from `from` to `to`.
*
* This internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* NOTE: This function is not virtual, {_update} should be overridden instead.
*/
function _transfer(address from, address to, uint256 value) internal {
if (from == address(0)) {
revert ERC20InvalidSender(address(0));
}
if (to == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(from, to, value);
}
/**
* @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
* (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
* this function.
*
* Emits a {Transfer} event.
*/
function _update(address from, address to, uint256 value) internal virtual {
if (from == address(0)) {
// Overflow check required: The rest of the code assumes that totalSupply never overflows
_totalSupply += value;
} else {
uint256 fromBalance = _balances[from];
if (fromBalance < value) {
revert ERC20InsufficientBalance(from, fromBalance, value);
}
unchecked {
// Overflow not possible: value <= fromBalance <= totalSupply.
_balances[from] = fromBalance - value;
}
}
if (to == address(0)) {
unchecked {
// Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
_totalSupply -= value;
}
} else {
unchecked {
// Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
_balances[to] += value;
}
}
emit Transfer(from, to, value);
}
/**
* @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
* Relies on the `_update` mechanism
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* NOTE: This function is not virtual, {_update} should be overridden instead.
*/
function _mint(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(address(0), account, value);
}
/**
* @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
* Relies on the `_update` mechanism.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* NOTE: This function is not virtual, {_update} should be overridden instead
*/
function _burn(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidSender(address(0));
}
_update(account, address(0), value);
}
/**
* @dev Sets `value` as the allowance of `spender` over the `owner`'s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*
* Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
*/
function _approve(address owner, address spender, uint256 value) internal {
_approve(owner, spender, value, true);
}
/**
* @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
*
* By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
* `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
* `Approval` event during `transferFrom` operations.
*
* Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
* true using the following override:
*
* ```solidity
* function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
* super._approve(owner, spender, value, true);
* }
* ```
*
* Requirements are the same as {_approve}.
*/
function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
if (owner == address(0)) {
revert ERC20InvalidApprover(address(0));
}
if (spender == address(0)) {
revert ERC20InvalidSpender(address(0));
}
_allowances[owner][spender] = value;
if (emitEvent) {
emit Approval(owner, spender, value);
}
}
/**
* @dev Updates `owner`'s allowance for `spender` based on spent `value`.
*
* Does not update the allowance value in case of infinite allowance.
* Revert if not enough allowance is available.
*
* Does not emit an {Approval} event.
*/
function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance < type(uint256).max) {
if (currentAllowance < value) {
revert ERC20InsufficientAllowance(spender, currentAllowance, value);
}
unchecked {
_approve(owner, spender, currentAllowance - value, false);
}
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity >=0.6.2;
import {IERC20} from "../IERC20.sol";
/**
* @dev Interface for the optional metadata functions from the ERC-20 standard.
*/
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)
pragma solidity >=0.4.16;
/**
* @dev Interface of the ERC-20 standard as defined in the ERC.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 value) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 value) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)
pragma solidity ^0.8.20;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,
* consider using {ReentrancyGuardTransient} instead.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant NOT_ENTERED = 1;
uint256 private constant ENTERED = 2;
uint256 private _status;
/**
* @dev Unauthorized reentrant call.
*/
error ReentrancyGuardReentrantCall();
constructor() {
_status = NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be NOT_ENTERED
if (_status == ENTERED) {
revert ReentrancyGuardReentrantCall();
}
// Any calls to nonReentrant after this point will fail
_status = ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == ENTERED;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/// @notice Minimal Chainlink AggregatorV3Interface needed for price feeds
interface AggregatorV3Interface {
function decimals() external view returns (uint8);
function description() external view returns (string memory);
function version() external view returns (uint256);
function latestRoundData()
external
view
returns (
uint80 roundId,
int256 answer,
uint256 startedAt,
uint256 updatedAt,
uint80 answeredInRound
);
}{
"metadata": {
"bytecodeHash": "none",
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 800
},
"evmVersion": "paris",
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"routerAddr","type":"address"},{"internalType":"address","name":"chainlinkMonUsd","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"ethSpent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensBurned","type":"uint256"}],"name":"BuybackOccurred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tvl1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tvl2","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tvl3","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"share1Bps","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"share2Bps","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"share3Bps","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"share4Bps","type":"uint256"}],"name":"EthShareCurveUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tvlBeforeUsd","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tvlAfterUsd","type":"uint256"}],"name":"LPBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountToken","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountETH","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tvlBeforeUsd","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tvlAfterUsd","type":"uint256"}],"name":"LiquidityAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint8","name":"oldBand","type":"uint8"},{"indexed":true,"internalType":"uint8","name":"newBand","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"oldFeeBps","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newFeeBps","type":"uint256"}],"name":"LiquidityFeeBandChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[],"name":"TradingEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BUYBACK_TVL_BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE_DENOM","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LIQ_TVL_BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LPBURN_TVL_BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BUYBACK_USD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_LIQ_USD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_LPBURN_USD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_BUYBACK_USD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_LIQ_USD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_LPBURN_USD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERCENT_DENOM","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"createPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableLimitsForever","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyMonUsdPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyOracleOverride","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ethShareLevel1Bps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ethShareLevel2Bps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ethShareLevel3Bps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ethShareLevel4Bps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMonUsdPrice","outputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"ok","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPoolUsd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenPriceMon","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenPriceUsd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastFeeBand","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastFeeBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastReserve0","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastReserve1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdateBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTxBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"monUsdFeed","outputs":[{"internalType":"contract AggregatorV3Interface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracleMaxDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"processAutomations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"},{"internalType":"uint256","name":"fallbackPrice","type":"uint256"}],"name":"setEmergencyOracleOverride","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tvl1","type":"uint256"},{"internalType":"uint256","name":"_tvl2","type":"uint256"},{"internalType":"uint256","name":"_tvl3","type":"uint256"},{"internalType":"uint256","name":"_share1Bps","type":"uint256"},{"internalType":"uint256","name":"_share2Bps","type":"uint256"},{"internalType":"uint256","name":"_share3Bps","type":"uint256"},{"internalType":"uint256","name":"_share4Bps","type":"uint256"}],"name":"setEthShareForLiquidityCurve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"setLpVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBps","type":"uint256"}],"name":"setMaxTxBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBps","type":"uint256"}],"name":"setMaxWalletBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"delay","type":"uint256"}],"name":"setOracleMaxDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tvlLevel1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tvlLevel2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tvlLevel3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"volumeLastReset","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"volumeWindow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
0x60c06040526064600855611c2060095561012c600d819055600e55600f805460ff1916600117905569010f0cf064dd5920000060105569043c33c193756480000060115569152d02c7e14af6800000601255612328601355611d4c6014556117706015556113886016553480156200007657600080fd5b50604051620060ab380380620060ab83398101604081905262000099916200212c565b3360405180604001604052806008815260200167cebb4c414d42444160c01b815250604051806040016040528060048152602001632620a6a160e11b8152508160039081620000e9919062002208565b506004620000f8828262002208565b5050506001600160a01b0381166200012b57604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b62000136816200020d565b5060016006556001600160a01b0382166200017f5760405162461bcd60e51b81526020600482015260086024820152670526f757465723d360c41b604482015260640162000122565b6001600160a01b038116620001c25760405162461bcd60e51b815260206004820152600860248201526704f7261636c653d360c41b604482015260640162000122565b6001600160a01b03808316608052811660a052620001ed336b033b2e3c9fd0803ce80000006200025f565b505043601c5542601855601f805460ff1916905560085460205562002708565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166200028b5760405163ec442f0560e01b81526000600482015260240162000122565b62000299600083836200029d565b5050565b600c548390839060ff166200036f576007546001600160a01b0316156200036f576007546000906001600160a01b0384811691161480620002eb57506007546001600160a01b038381169116145b905080156200036d576005546001600160a01b0384811691161480156200031f57506007546001600160a01b038381169116145b6200036d5760405162461bcd60e51b815260206004820152601360248201527f54726164696e67206e6f7420656e61626c656400000000000000000000000000604482015260640162000122565b505b6007546000906001600160a01b031615801590620003b257506007546001600160a01b0387811691161480620003b257506007546001600160a01b038681169116145b90506001600160a01b0386161580620003d257506001600160a01b038516155b15620003ec57620003e58686866200070e565b5062000707565b600c54610100900460ff16158015620004025750805b156200055957600c5460ff1680156200041d5750600f5460ff165b156200049e576005546001600160a01b038781169116148015906200044b57506001600160a01b0386163014155b156200049e576200045b62000841565b8411156200049e5760405162461bcd60e51b815260206004820152600f60248201526e13585e081d1e08195e18d959591959608a1b604482015260640162000122565b600c5460009060ff16620004b4576000620004c1565b620004c1878787620008e3565b90506000612710620004d48388620022ea565b620004e091906200230a565b90506000620004f082886200232d565b905081156200050657620005068930846200070e565b620005138989836200070e565b6018546200052490610e1062002343565b42111562000536576000601755426018555b86601760008282546200054a919062002343565b90915550620005669350505050565b620005668686866200070e565b600c5460ff1680156200057b5750600f5460ff165b8015620005905750600c54610100900460ff16155b8015620005ab57506007546001600160a01b03868116911614155b8015620005c357506001600160a01b03851661dead14155b8015620005d957506001600160a01b0385163014155b156200064557620005e962000a53565b6001600160a01b0386166000908152602081905260409020541115620006455760405162461bcd60e51b815260206004820152601060248201526f57616c6c657420746f6f206c6172676560801b604482015260640162000122565b6200064f62000ab5565b6007546000906001600160a01b0316158015906200067a57506007546001600160a01b038781169116145b600c5490915060ff168015620006985750600c54610100900460ff16155b8015620006a25750805b8015620006b857506001600160a01b0387163014155b8015620006d357506007546001600160a01b03888116911614155b8015620006f457506080516001600160a01b0316336001600160a01b031614155b1562000704576200070462000c85565b50505b5050505050565b6001600160a01b0383166200073d57806002600082825462000731919062002343565b90915550620007b19050565b6001600160a01b03831660009081526020819052604090205481811015620007925760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640162000122565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620007cf57600280548290039055620007ee565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200083491815260200190565b60405180910390a3505050565b600f5460009060ff1662000856575060025490565b6007546001600160a01b031615620008b1576007546001600160a01b03166000908152602081905260409020548015620008af57612710600d54826200089d9190620022ea565b620008a991906200230a565b91505090565b505b6000620008bd60025490565b905080600003620008d057600091505090565b612710600d54826200089d9190620022ea565b60075460009081906001600160a01b0316158015906200091057506007546001600160a01b038581169116145b80156200092b57506007546001600160a01b03868116911614155b601f5460205491925060ff169060006200094462000cc5565b9050600080851562000987576001600160a01b038a16600090815260208190526040902054620009768b8a8362000d96565b9250620009838362000f36565b9150505b8296508681111562000997578096505b600060648811620009ab57506000620009d5565b61012c8811620009be57506001620009d5565b6101f48811620009d157506002620009d5565b5060035b8560ff168160ff161462000a3e57601f805460ff191660ff83811691821790925560208a8155604080518981529182018c905291928916917f52082db318307845a2bd75620e9311db096d2f113c9e93413b8c7f75d8e39037910160405180910390a362000a44565b60208890555b505050505050505b9392505050565b600f5460009060ff1662000a68575060025490565b600062000a7460025490565b90508060000362000a8757600091505090565b612710600e54826200089d9190620022ea565b6001600160a01b031660009081526020819052604090205490565b6007546001600160a01b031662000ac857565b601c54430362000ad457565b600080600760009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801562000b2b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000b51919062002371565b506001600160701b038083166019819055908216601a5543601c5591935091501580159062000b8957506000816001600160701b0316115b15620002995760075460408051630dfe168160e01b8152905130926001600160a01b031691630dfe16819160048083019260209291908290030181865afa15801562000bd9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000bff9190620023c7565b6001600160a01b03161462000c4957806001600160701b0316826001600160701b0316670de0b6b3a764000062000c379190620022ea565b62000c4391906200230a565b62000c7e565b816001600160701b0316816001600160701b0316670de0b6b3a764000062000c729190620022ea565b62000c7e91906200230a565b601b555050565b600c5460ff1662000c9257565b6007546001600160a01b031662000ca557565b62000caf62000f79565b62000cb962001397565b62000cc362001685565b565b6000601b5460000362000cd85750606490565b600062000ce4620018b8565b90508060000362000cf757505060085490565b601b5481600082821162000d175762000d1182846200232d565b62000d23565b62000d2383836200232d565b905060008362000d3661271084620022ea565b62000d4291906200230a565b9050603281101562000d5a5760649550505050505090565b609681101562000d715761012c9550505050505090565b61012c81101562000d89576101f49550505050505090565b6103209550505050505090565b6001600160a01b0383166000908152601e60205260408120805442906001600160401b0316158062000de85750815462000ddc906001600160401b0316610e10620023e5565b6001600160401b031681115b1562000e445781546001600160801b0380871668010000000000000000026001600160c01b03199092166001600160401b038416179190911783556001830180549186166001600160801b031990921691909117905562000ece565b81548590839060089062000e6f9084906801000000000000000090046001600160801b03166200240f565b82546101009290920a6001600160801b03818102199093169183160217909155600184015416600003905062000ece5762000eab858562002343565b6001830180546001600160801b0319166001600160801b03929092169190911790555b60018201546001600160801b031660000362000ef05760009250505062000a4c565b600182015482546001600160801b039182169162000f2091612710916801000000000000000090910416620022ea565b62000f2c91906200230a565b9695505050505050565b6000611388821062000f4b5750610320919050565b6107d0821062000f5e57506101f4919050565b6103e8821062000f71575061012c919050565b506000919050565b600c805461ff001981166101001790915560ff16158062000fa357506007546001600160a01b0316155b6200138a5730600090815260208190526040902054671bc16d674ec8000081101562000fd057506200138a565b600062000fdc62001a93565b90508060000362000fef5750506200138a565b6000670de0b6b3a7640000836200100562001af2565b620010119190620022ea565b6200101d91906200230a565b90508181101562001031575050506200138a565b6000620010406002856200230a565b905060006200105082866200232d565b90504760006200105f62001b33565b905062001076306080518662001ce860201b60201c565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110620010ae57620010ae62002432565b60200260200101906001600160a01b031690816001600160a01b0316815250506080516001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200110f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620011359190620023c7565b816001815181106200114b576200114b62002432565b6001600160a01b03928316602091820292909201015260805160405163791ac94760e01b815291169063791ac94790620011939088906000908690309042906004016200248e565b600060405180830381600087803b158015620011ae57600080fd5b505af1158015620011c3573d6000803e3d6000fd5b5050505060008347620011d791906200232d565b905080600003620011f1575050505050505050506200138a565b6000620011fd62001cfc565b90506000612710620012108385620022ea565b6200121c91906200230a565b905080600003620012385750505050505050505050506200138a565b6200124d306080518962001ce860201b60201c565b601d546000906001600160a01b031662001268573062001275565b601d546001600160a01b03165b60805160405163f305d71960e01b8152306004820152602481018b9052600060448201819052606482018190526001600160a01b0380851660848401524260a4840152939450928392839291169063f305d71990879060c40160606040518083038185885af1158015620012ed573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190620013149190620024cc565b9194509250905060006200132762001b33565b6040805186815260208101869052908101849052606081018c9052608081018290529091507fb141efb20c72d616a1738edf3bfc091e675e9970798c20f084e967372070c25b9060a00160405180910390a1505050505050505050505050505050505b600c805461ff0019169055565b600c805461ff001981166101001790915560ff161580620013c157506007546001600160a01b0316155b6200138a57476000819003620013d857506200138a565b600080620013e562001d5d565b91509150801580620013f5575081155b1562001404575050506200138a565b60006200141062001f4e565b9050806000036200142557505050506200138a565b6000670de0b6b3a76400006200143c8587620022ea565b6200144891906200230a565b9050818110156200145e5750505050506200138a565b60006200146a620018b8565b90508060000362001481575050505050506200138a565b6040805160028082526060820183526000926020830190803683370190505090506080516001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620014e3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620015099190620023c7565b816000815181106200151f576200151f62002432565b60200260200101906001600160a01b031690816001600160a01b031681525050308160018151811062001556576200155662002432565b6001600160a01b039290921660209283029190910182015261dead6000818152918290527f44ad89ba62b98ff34f51403ac22759b55759460c0bb5521eb4b6ee3cff49cf83549091506080516001600160a01b031663b6f9de958a60008686426040518663ffffffff1660e01b8152600401620015d79493929190620024fb565b6000604051808303818588803b158015620015f157600080fd5b505af115801562001606573d6000803e3d6000fd5b50505050506000816200161f8462000a9a60201b60201c565b6200162b91906200232d565b905080156200166e57604080518b8152602081018390527f7b2f737ad25d6754dc3fda541b53e2231977a956462277e001f2badd1026b155910160405180910390a15b50505050505050505050600c805461ff0019169055565b600c805461ff0019166101001790556007546001600160a01b0316156200138a57601d546001600160a01b0316156200138a576000670de0b6b3a7640000601754620016d662001af260201b60201c565b620016e29190620022ea565b620016ee91906200230a565b90506000620016fc62001fac565b90508015806200170b57508082105b15620017195750506200138a565b60006200172562001b33565b600754601d546040516370a0823160e01b81526001600160a01b03918216600482015292935060649260009291909116906370a0823190602401602060405180830381865afa1580156200177d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620017a3919062002532565b905080600003620017b95750505050506200138a565b6000612710620017ca8484620022ea565b620017d691906200230a565b905080600003620017ed575050505050506200138a565b601d546040516313190dc960e21b8152600481018590526001600160a01b0390911690634c64372490602401600060405180830381600087803b1580156200183457600080fd5b505af115801562001849573d6000803e3d6000fd5b505060006017819055915062001860905062001b33565b60408051848152602081018890529081018290529091507faa806dcee66f738073660fffc529b7a09332a78075ef065c4c5da88c481a0f019060600160405180910390a150505050505050600c805461ff0019169055565b6007546000906001600160a01b0316620018d95750670de0b6b3a764000090565b600080600760009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801562001930573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001956919062002371565b5091509150816001600160701b0316600014806200197b57506001600160701b038116155b15620019a457601b54156200199357601b546200199d565b670de0b6b3a76400005b9250505090565b60075460408051630dfe168160e01b8152905130926001600160a01b031691630dfe16819160048083019260209291908290030181865afa158015620019ee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001a149190620023c7565b6001600160a01b03161462001a5e57806001600160701b0316826001600160701b0316670de0b6b3a764000062001a4c9190620022ea565b62001a5891906200230a565b6200199d565b816001600160701b0316816001600160701b0316670de0b6b3a764000062001a879190620022ea565b6200199d91906200230a565b60008062001aa062001b33565b90508060000362001ab357600091505090565b600061271062001ac560c884620022ea565b62001ad191906200230a565b90506200199d8168015af1d78b58c40000686c6b935b8bbd40000062002007565b6000808062001b0062001d5d565b915091508062001b135760009250505090565b670de0b6b3a76400008262001b27620018b8565b62001a879190620022ea565b6007546000906001600160a01b031662001b4d5750600090565b600080600760009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801562001ba4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001bca919062002371565b5091509150816001600160701b03166000148062001bef57506001600160701b038116155b1562001bfe5760009250505090565b60075460408051630dfe168160e01b815290516000926001600160a01b031691630dfe16819160048083019260209291908290030181865afa15801562001c49573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001c6f9190620023c7565b905060006001600160a01b038216301462001c9457826001600160701b031662001c9f565b836001600160701b03165b90506000670de0b6b3a76400008262001cb762001af2565b62001cc39190620022ea565b62001ccf91906200230a565b905062001cde816002620022ea565b9550505050505090565b62001cf7838383600162002033565b505050565b60008062001d0962001b33565b90508060000362001d1c57505060135490565b60105481101562001d2f57505060135490565b60115481101562001d4257505060145490565b60125481101562001d5557505060155490565b505060165490565b600a54600090819060ff161562001d8d57600b5460000362001d825750600091829150565b5050600b5490600190565b60008060008060a0516001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa15801562001dd4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001dfa919062002564565b94509450509350935060008313158062001e12575081155b8062001e2a575060095462001e2883426200232d565b115b8062001e475750836001600160501b0316816001600160501b0316105b1562001e5b57506000958695509350505050565b600060a0516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801562001e9e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001ec49190620025b9565b905060008160ff1660120362001edc57508362001f40565b60128260ff16101562001f175762001ef6826012620025de565b62001f0390600a620026f7565b62001f0f9086620022ea565b905062001f40565b62001f24601283620025de565b62001f3190600a620026f7565b62001f3d90866200230a565b90505b976001975095505050505050565b60008062001f5b62001b33565b90508060000362001f6e57600091505090565b600061271062001f80609684620022ea565b62001f8c91906200230a565b90506200199d81678ac7230489e80000683635c9adc5dea0000062002007565b60008062001fb962001b33565b90508060000362001fcc57600091505090565b600061271062001fde60c884620022ea565b62001fea91906200230a565b90506200199d816802b5e3af16b188000069010f0cf064dd592000005b6000828410156200201a57508162000a4c565b818411156200202b57508062000a4c565b509192915050565b6001600160a01b0384166200205f5760405163e602df0560e01b81526000600482015260240162000122565b6001600160a01b0383166200208b57604051634a1406b160e11b81526000600482015260240162000122565b6001600160a01b03808516600090815260016020908152604080832093871683529290522082905580156200210957826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516200210091815260200190565b60405180910390a35b50505050565b80516001600160a01b03811681146200212757600080fd5b919050565b600080604083850312156200214057600080fd5b6200214b836200210f565b91506200215b602084016200210f565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200218f57607f821691505b602082108103620021b057634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562001cf757600081815260208120601f850160051c81016020861015620021df5750805b601f850160051c820191505b818110156200220057828155600101620021eb565b505050505050565b81516001600160401b0381111562002224576200222462002164565b6200223c816200223584546200217a565b84620021b6565b602080601f8311600181146200227457600084156200225b5750858301515b600019600386901b1c1916600185901b17855562002200565b600085815260208120601f198616915b82811015620022a55788860151825594840194600190910190840162002284565b5085821015620022c45787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417620023045762002304620022d4565b92915050565b6000826200232857634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115620023045762002304620022d4565b80820180821115620023045762002304620022d4565b80516001600160701b03811681146200212757600080fd5b6000806000606084860312156200238757600080fd5b620023928462002359565b9250620023a26020850162002359565b9150604084015163ffffffff81168114620023bc57600080fd5b809150509250925092565b600060208284031215620023da57600080fd5b62000a4c826200210f565b6001600160401b03818116838216019080821115620024085762002408620022d4565b5092915050565b6001600160801b03818116838216019080821115620024085762002408620022d4565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b83811015620024835781516001600160a01b0316875295820195908201906001016200245c565b509495945050505050565b85815284602082015260a060408201526000620024af60a083018662002448565b6001600160a01b0394909416606083015250608001529392505050565b600080600060608486031215620024e257600080fd5b8351925060208401519150604084015190509250925092565b84815260806020820152600062002516608083018662002448565b6001600160a01b03949094166040830152506060015292915050565b6000602082840312156200254557600080fd5b5051919050565b80516001600160501b03811681146200212757600080fd5b600080600080600060a086880312156200257d57600080fd5b62002588866200254c565b9450602086015193506040860151925060608601519150620025ad608087016200254c565b90509295509295909350565b600060208284031215620025cc57600080fd5b815160ff8116811462000a4c57600080fd5b60ff8281168282160390811115620023045762002304620022d4565b600181815b808511156200263b5781600019048211156200261f576200261f620022d4565b808516156200262d57918102915b93841c9390800290620025ff565b509250929050565b600082620026545750600162002304565b81620026635750600062002304565b81600181146200267c57600281146200268757620026a7565b600191505062002304565b60ff8411156200269b576200269b620022d4565b50506001821b62002304565b5060208310610133831016604e8410600b8410161715620026cc575081810a62002304565b620026d88383620025fa565b8060001904821115620026ef57620026ef620022d4565b029392505050565b600062000a4c60ff84168362002643565b60805160a05161392962002782600039600081816107b2015281816114940152611579015260008181610a7c01528181611295015281816113260152818161201c0152818161212e015281816121aa015281816122620152818161233f015281816123d4015281816125b901526126cb01526139296000f3fe6080604052600436106103c75760003560e01c80638897854f116101f2578063bd0477731161010d578063dd62ed3e116100a0578063f2fde38b1161006f578063f2fde38b14610a4a578063f887ea4014610a6a578063f8d7a8a814610a9e578063ff8ea3e514610ab457600080fd5b8063dd62ed3e146109b4578063eb1abfd0146109fa578063edcfdcf914610a14578063f2119faa14610a3457600080fd5b8063c5fe0b4b116100dc578063c5fe0b4b14610939578063cf8b07d714610957578063d0a45f5914610977578063d2017e281461099457600080fd5b8063bd047773146108db578063be2b7a8b146108f8578063c17321111461090e578063c2735fb91461092357600080fd5b8063a218141b11610185578063a8aa1b3111610154578063a8aa1b311461086b578063a9059cbb1461088b578063aaa96719146108ab578063aac69e2b146108c157600080fd5b8063a218141b146107ff578063a2644a6014610815578063a43f1e041461083f578063a45e75901461085557600080fd5b80639c830fc3116101c15780639c830fc31461078a5780639d48d8aa146107a05780639d49b15c146107d45780639e78fb4f146107ea57600080fd5b80638897854f146107225780638a8c523c146107425780638da5cb5b1461075757806395d89b411461077557600080fd5b8063451af7d5116102e257806359bb18ea1161027557806370a082311161024457806370a08231146106ac578063715018a6146106e257806376d4c50c146106f7578063799804241461070d57600080fd5b806359bb18ea146106665780636221cfa9146104865780636d2ed1841461067b5780636d38726b1461069057600080fd5b80634f3150a4116102b15780634f3150a4146106105780634f53e1621461062557806353713af91461063b5780635632c15c1461065157600080fd5b8063451af7d5146105c357806346f1a0bd146105d95780634886c675146103f55780634ada218b146105f657600080fd5b806318160ddd1161035a5780632ba5ad1e116103295780632ba5ad1e1461052f5780632f8673671461054f578063313ce567146105875780633582ad23146105a957600080fd5b806318160ddd146104c757806323b872dd146104dc578063270c7dba146104fc57806329d1da211461051957600080fd5b8063095ea7b311610396578063095ea7b3146104565780630bf92301146104865780630dcf9dad1461049b57806312f16a07146104b157600080fd5b8063015f1abe146103d35780630452096b146103f5578063053f14da1461041e57806306fdde031461043457600080fd5b366103ce57005b600080fd5b3480156103df57600080fd5b506103f36103ee366004613343565b610aca565b005b34801561040157600080fd5b5061040b61271081565b6040519081526020015b60405180910390f35b34801561042a57600080fd5b5061040b601b5481565b34801561044057600080fd5b50610449610ad7565b604051610415919061335c565b34801561046257600080fd5b506104766104713660046133bf565b610b69565b6040519015158152602001610415565b34801561049257600080fd5b5061040b60c881565b3480156104a757600080fd5b5061040b60175481565b3480156104bd57600080fd5b5061040b600e5481565b3480156104d357600080fd5b5060025461040b565b3480156104e857600080fd5b506104766104f73660046133eb565b610b83565b34801561050857600080fd5b5061040b6802b5e3af16b188000081565b34801561052557600080fd5b5061040b600b5481565b34801561053b57600080fd5b506103f361054a366004613343565b610ba9565b34801561055b57600080fd5b50601d5461056f906001600160a01b031681565b6040516001600160a01b039091168152602001610415565b34801561059357600080fd5b5060125b60405160ff9091168152602001610415565b3480156105b557600080fd5b50600f546104769060ff1681565b3480156105cf57600080fd5b5061040b60135481565b3480156105e557600080fd5b5061040b683635c9adc5dea0000081565b34801561060257600080fd5b50600c546104769060ff1681565b34801561061c57600080fd5b506103f3610c4b565b34801561063157600080fd5b5061040b60105481565b34801561064757600080fd5b5061040b60085481565b34801561065d57600080fd5b5061040b610c89565b34801561067257600080fd5b506103f3610e2b565b34801561068757600080fd5b5061040b610e91565b34801561069c57600080fd5b5061040b678ac7230489e8000081565b3480156106b857600080fd5b5061040b6106c736600461342c565b6001600160a01b031660009081526020819052604090205490565b3480156106ee57600080fd5b506103f3610edd565b34801561070357600080fd5b5061040b60195481565b34801561071957600080fd5b5061040b610eef565b34801561072e57600080fd5b506103f361073d36600461342c565b6110aa565b34801561074e57600080fd5b506103f3611190565b34801561076357600080fd5b506005546001600160a01b031661056f565b34801561078157600080fd5b50610449611223565b34801561079657600080fd5b5061040b60145481565b3480156107ac57600080fd5b5061056f7f000000000000000000000000000000000000000000000000000000000000000081565b3480156107e057600080fd5b5061040b601a5481565b3480156107f657600080fd5b506103f3611232565b34801561080b57600080fd5b5061040b601c5481565b34801561082157600080fd5b5061082a61145e565b60408051928352901515602083015201610415565b34801561084b57600080fd5b5061040b60205481565b34801561086157600080fd5b5061040b60185481565b34801561087757600080fd5b5060075461056f906001600160a01b031681565b34801561089757600080fd5b506104766108a63660046133bf565b611673565b3480156108b757600080fd5b5061040b60165481565b3480156108cd57600080fd5b50600a546104769060ff1681565b3480156108e757600080fd5b5061040b686c6b935b8bbd40000081565b34801561090457600080fd5b5061040b60125481565b34801561091a57600080fd5b5061040b609681565b34801561092f57600080fd5b5061040b60095481565b34801561094557600080fd5b5061040b69010f0cf064dd5920000081565b34801561096357600080fd5b506103f3610972366004613343565b611681565b34801561098357600080fd5b5061040b68015af1d78b58c4000081565b3480156109a057600080fd5b506103f36109af366004613449565b61171e565b3480156109c057600080fd5b5061040b6109cf366004613495565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610a0657600080fd5b50601f546105979060ff1681565b348015610a2057600080fd5b506103f3610a2f3660046134ce565b611891565b348015610a4057600080fd5b5061040b60115481565b348015610a5657600080fd5b506103f3610a6536600461342c565b61190a565b348015610a7657600080fd5b5061056f7f000000000000000000000000000000000000000000000000000000000000000081565b348015610aaa57600080fd5b5061040b60155481565b348015610ac057600080fd5b5061040b600d5481565b610ad2611948565b600955565b606060038054610ae6906134f1565b80601f0160208091040260200160405190810160405280929190818152602001828054610b12906134f1565b8015610b5f5780601f10610b3457610100808354040283529160200191610b5f565b820191906000526020600020905b815481529060010190602001808311610b4257829003601f168201915b5050505050905090565b600033610b77818585611975565b60019150505b92915050565b600033610b91858285611987565b610b9c858585611a06565b60019150505b9392505050565b610bb1611948565b600f5460ff16610bfa5760405162461bcd60e51b815260206004820152600f60248201526e131a5b5a5d1cc8191a5cd8589b1959608a1b60448201526064015b60405180910390fd5b600081118015610c0c57506127108111155b610c465760405162461bcd60e51b815260206004820152600b60248201526a496e76616c69642062707360a81b6044820152606401610bf1565b600d55565b610c53611a65565b600c805461ff001916610100179055610c6a611948565b610c72611a8f565b600c805461ff0019169055610c876001600655565b565b6007546000906001600160a01b0316610ca25750600090565b600080600760009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015610cf8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1c9190613547565b5091509150816001600160701b031660001480610d4057506001600160701b038116155b15610d4e5760009250505090565b60075460408051630dfe168160e01b815290516000926001600160a01b031691630dfe16819160048083019260209291908290030181865afa158015610d98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dbc9190613597565b905060006001600160a01b0382163014610ddf57826001600160701b0316610dea565b836001600160701b03165b90506000670de0b6b3a764000082610e00610e91565b610e0a91906135ca565b610e1491906135e1565b9050610e218160026135ca565b9550505050505090565b610e33611948565b600f5460ff16610e855760405162461bcd60e51b815260206004820152601060248201527f416c72656164792064697361626c6564000000000000000000000000000000006044820152606401610bf1565b600f805460ff19169055565b6000806000610e9e61145e565b9150915080610eb05760009250505090565b670de0b6b3a764000082610ec2610eef565b610ecc91906135ca565b610ed691906135e1565b9250505090565b610ee5611948565b610c876000611ac5565b6007546000906001600160a01b0316610f0f5750670de0b6b3a764000090565b600080600760009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015610f65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f899190613547565b5091509150816001600160701b031660001480610fad57506001600160701b038116155b15610fd257601b5415610fc257601b54610ed6565b670de0b6b3a76400009250505090565b60075460408051630dfe168160e01b8152905130926001600160a01b031691630dfe16819160048083019260209291908290030181865afa15801561101b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103f9190613597565b6001600160a01b03161461108357806001600160701b0316826001600160701b0316670de0b6b3a764000061107491906135ca565b61107e91906135e1565b610ed6565b816001600160701b0316816001600160701b0316670de0b6b3a7640000610ecc91906135ca565b6110b2611948565b601d546001600160a01b03161561110b5760405162461bcd60e51b815260206004820152601360248201527f6c705661756c7420616c726561647920736574000000000000000000000000006044820152606401610bf1565b6001600160a01b0381166111615760405162461bcd60e51b815260206004820152600b60248201527f6c705661756c74203d20300000000000000000000000000000000000000000006044820152606401610bf1565b601d805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b611198611948565b600c5460ff16156111eb5760405162461bcd60e51b815260206004820152600f60248201527f416c726561647920656e61626c656400000000000000000000000000000000006044820152606401610bf1565b600c805460ff191660011790556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a1565b606060048054610ae6906134f1565b61123a611948565b6007546001600160a01b0316156112935760405162461bcd60e51b815260206004820152600b60248201527f50616972206578697374730000000000000000000000000000000000000000006044820152606401610bf1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113159190613597565b6001600160a01b031663c9c65396307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611382573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a69190613597565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801561140b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142f9190613597565b6007805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b600a54600090819060ff161561148c57600b546000036114815750600091829150565b5050600b5490600190565b6000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156114f0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611514919061361d565b94509450509350935060008313158061152b575081155b80611540575060095461153e834261366d565b115b8061156257508369ffffffffffffffffffff168169ffffffffffffffffffff16105b1561157557506000958695509350505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f99190613680565b905060008160ff1660120361160f575083611665565b60128260ff161015611642576116268260126136a3565b61163190600a6137a0565b61163b90866135ca565b9050611665565b61164d6012836136a3565b61165890600a6137a0565b61166290866135e1565b90505b976001975095505050505050565b600033610b77818585611a06565b611689611948565b600f5460ff166116cd5760405162461bcd60e51b815260206004820152600f60248201526e131a5b5a5d1cc8191a5cd8589b1959608a1b6044820152606401610bf1565b6000811180156116df57506127108111155b6117195760405162461bcd60e51b815260206004820152600b60248201526a496e76616c69642062707360a81b6044820152606401610bf1565b600e55565b611726611948565b60008711801561173557508686115b801561174057508585115b61178c5760405162461bcd60e51b815260206004820152600e60248201527f4261642054564c206c6576656c730000000000000000000000000000000000006044820152606401610bf1565b61271084111580156117a057506127108311155b80156117ae57506127108211155b80156117bc57506127108111155b6118085760405162461bcd60e51b815260206004820152600c60248201527f5368617265203e203130302500000000000000000000000000000000000000006044820152606401610bf1565b60108790556011869055601285905560138490556014839055601582905560168190556040805188815260208101889052908101869052606081018590526080810184905260a0810183905260c081018290527f53d7a20eb4402ea6dd2023960e805abeef360f82de6788f41666a01cb461720a9060e00160405180910390a150505050505050565b611899611948565b600a805460ff1916831580159190911790915561190657600081116119005760405162461bcd60e51b815260206004820152601060248201527f46616c6c6261636b2070726963653d30000000000000000000000000000000006044820152606401610bf1565b600b8190555b5050565b611912611948565b6001600160a01b03811661193c57604051631e4fbdf760e01b815260006004820152602401610bf1565b61194581611ac5565b50565b6005546001600160a01b03163314610c875760405163118cdaa760e01b8152336004820152602401610bf1565b6119828383836001611b24565b505050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811015611a0057818110156119f157604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610bf1565b611a0084848484036000611b24565b50505050565b6001600160a01b038316611a3057604051634b637e8f60e11b815260006004820152602401610bf1565b6001600160a01b038216611a5a5760405163ec442f0560e01b815260006004820152602401610bf1565b611982838383611bf9565b600260065403611a8857604051633ee5aeb560e01b815260040160405180910390fd5b6002600655565b600c5460ff16611a9b57565b6007546001600160a01b0316611aad57565b611ab5612056565b611abd6124c3565b610c876127d4565b600580546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038416611b4e5760405163e602df0560e01b815260006004820152602401610bf1565b6001600160a01b038316611b7857604051634a1406b160e11b815260006004820152602401610bf1565b6001600160a01b0380851660009081526001602090815260408083209387168352929052208290558015611a0057826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611beb91815260200190565b60405180910390a350505050565b600c548390839060ff16611cc4576007546001600160a01b031615611cc4576007546000906001600160a01b0384811691161480611c4457506007546001600160a01b038381169116145b90508015611cc2576005546001600160a01b038481169116148015611c7657506007546001600160a01b038381169116145b611cc25760405162461bcd60e51b815260206004820152601360248201527f54726164696e67206e6f7420656e61626c6564000000000000000000000000006044820152606401610bf1565b505b6007546000906001600160a01b031615801590611d0557506007546001600160a01b0387811691161480611d0557506007546001600160a01b038681169116145b90506001600160a01b0386161580611d2457506001600160a01b038516155b15611d3a57611d348686866129e4565b5061204f565b600c54610100900460ff16158015611d4f5750805b15611e9657600c5460ff168015611d685750600f5460ff165b15611df0576005546001600160a01b03878116911614801590611d9457506001600160a01b0386163014155b15611df057611da1612b0e565b841115611df05760405162461bcd60e51b815260206004820152600f60248201527f4d617820747820657863656564656400000000000000000000000000000000006044820152606401610bf1565b600c5460009060ff16611e04576000611e0f565b611e0f878787612ba5565b90506000612710611e2083886135ca565b611e2a91906135e1565b90506000611e38828861366d565b90508115611e4b57611e4b8930846129e4565b611e568989836129e4565b601854611e6590610e106137af565b421115611e76576000601755426018555b8660176000828254611e8891906137af565b90915550611ea19350505050565b611ea18686866129e4565b600c5460ff168015611eb55750600f5460ff165b8015611ec95750600c54610100900460ff16155b8015611ee357506007546001600160a01b03868116911614155b8015611efa57506001600160a01b03851661dead14155b8015611f0f57506001600160a01b0385163014155b15611f8357611f1c612d02565b6001600160a01b0386166000908152602081905260409020541115611f835760405162461bcd60e51b815260206004820152601060248201527f57616c6c657420746f6f206c61726765000000000000000000000000000000006044820152606401610bf1565b611f8b612d44565b6007546000906001600160a01b031615801590611fb557506007546001600160a01b038781169116145b600c5490915060ff168015611fd25750600c54610100900460ff16155b8015611fdb5750805b8015611ff057506001600160a01b0387163014155b801561200a57506007546001600160a01b03888116911614155b801561203f5750336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614155b1561204c5761204c611a8f565b50505b5050505050565b600c805461ff001981166101001790915560ff16158061207f57506007546001600160a01b0316155b6124b65730600090815260208190526040902054671bc16d674ec800008110156120a957506124b6565b60006120b3612f00565b9050806000036120c45750506124b6565b6000670de0b6b3a7640000836120d8610e91565b6120e291906135ca565b6120ec91906135e1565b9050818110156120fe575050506124b6565b600061210b6002856135e1565b90506000612119828661366d565b9050476000612126610c89565b9050612153307f000000000000000000000000000000000000000000000000000000000000000086611975565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612188576121886137c2565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612206573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061222a9190613597565b8160018151811061223d5761223d6137c2565b6001600160a01b03928316602091820292909201015260405163791ac94760e01b81527f00000000000000000000000000000000000000000000000000000000000000009091169063791ac947906122a290889060009086903090429060040161381c565b600060405180830381600087803b1580156122bc57600080fd5b505af11580156122d0573d6000803e3d6000fd5b50505050600083476122e2919061366d565b9050806000036122fa575050505050505050506124b6565b6000612304612f56565b9050600061271061231583856135ca565b61231f91906135e1565b9050806000036123395750505050505050505050506124b6565b612364307f000000000000000000000000000000000000000000000000000000000000000089611975565b601d546000906001600160a01b031661237d573061238a565b601d546001600160a01b03165b60405163f305d71960e01b8152306004820152602481018a9052600060448201819052606482018190526001600160a01b0380841660848401524260a484015292935091829182917f0000000000000000000000000000000000000000000000000000000000000000169063f305d71990879060c40160606040518083038185885af115801561241e573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906124439190613858565b9250925092506000612453610c89565b6040805186815260208101869052908101849052606081018c9052608081018290529091507fb141efb20c72d616a1738edf3bfc091e675e9970798c20f084e967372070c25b9060a00160405180910390a1505050505050505050505050505050505b600c805461ff0019169055565b600c805461ff001981166101001790915560ff1615806124ec57506007546001600160a01b0316155b6124b65747600081900361250057506124b6565b60008061250b61145e565b9150915080158061251a575081155b15612527575050506124b6565b6000612531612fb1565b90508060000361254457505050506124b6565b6000670de0b6b3a764000061255985876135ca565b61256391906135e1565b9050818110156125775750505050506124b6565b6000612581610eef565b905080600003612596575050505050506124b6565b6040805160028082526060820183526000926020830190803683370190505090507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612615573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126399190613597565b8160008151811061264c5761264c6137c2565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110612680576126806137c2565b6001600160a01b039290921660209283029190910182015261dead6000818152918290527f44ad89ba62b98ff34f51403ac22759b55759460c0bb5521eb4b6ee3cff49cf83549091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b6f9de958a60008686426040518663ffffffff1660e01b815260040161271d9493929190613886565b6000604051808303818588803b15801561273657600080fd5b505af115801561274a573d6000803e3d6000fd5b5050505050600081612771846001600160a01b031660009081526020819052604090205490565b61277b919061366d565b905080156127bd57604080518b8152602081018390527f7b2f737ad25d6754dc3fda541b53e2231977a956462277e001f2badd1026b155910160405180910390a15b50505050505050505050600c805461ff0019169055565b600c805461ff0019166101001790556007546001600160a01b0316156124b657601d546001600160a01b0316156124b6576000670de0b6b3a764000060175461281b610e91565b61282591906135ca565b61282f91906135e1565b9050600061283b613006565b905080158061284957508082105b156128555750506124b6565b600061285f610c89565b600754601d546040516370a0823160e01b81526001600160a01b03918216600482015292935060649260009291909116906370a0823190602401602060405180830381865afa1580156128b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128da91906138bb565b9050806000036128ee5750505050506124b6565b60006127106128fd84846135ca565b61290791906135e1565b90508060000361291c575050505050506124b6565b601d546040516313190dc960e21b8152600481018590526001600160a01b0390911690634c64372490602401600060405180830381600087803b15801561296257600080fd5b505af1158015612976573d6000803e3d6000fd5b505050506000601781905550600061298c610c89565b60408051848152602081018890529081018290529091507faa806dcee66f738073660fffc529b7a09332a78075ef065c4c5da88c481a0f019060600160405180910390a150505050505050600c805461ff0019169055565b6001600160a01b038316612a0f578060026000828254612a0491906137af565b90915550612a819050565b6001600160a01b03831660009081526020819052604090205481811015612a625760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610bf1565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216612a9d57600280548290039055612abc565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612b0191815260200190565b60405180910390a3505050565b600f5460009060ff16612b22575060025490565b6007546001600160a01b031615612b77576007546001600160a01b03166000908152602081905260409020548015612b7557612710600d5482612b6591906135ca565b612b6f91906135e1565b91505090565b505b6000612b8260025490565b905080600003612b9457600091505090565b612710600d5482612b6591906135ca565b60075460009081906001600160a01b031615801590612bd157506007546001600160a01b038581169116145b8015612beb57506007546001600160a01b03868116911614155b601f5460205491925060ff16906000612c0261305d565b90506000808515612c40576001600160a01b038a16600090815260208190526040902054612c318b8a8361311d565b9250612c3c836132db565b9150505b82965086811115612c4f578096505b600060648811612c6157506000612c87565b61012c8811612c7257506001612c87565b6101f48811612c8357506002612c87565b5060035b8560ff168160ff1614612cee57601f805460ff191660ff83811691821790925560208a8155604080518981529182018c905291928916917f52082db318307845a2bd75620e9311db096d2f113c9e93413b8c7f75d8e39037910160405180910390a3612cf4565b60208890555b505050505050509392505050565b600f5460009060ff16612d16575060025490565b6000612d2160025490565b905080600003612d3357600091505090565b612710600e5482612b6591906135ca565b6007546001600160a01b0316612d5657565b601c544303612d6157565b600080600760009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015612db7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ddb9190613547565b506001600160701b038083166019819055908216601a5543601c55919350915015801590612e1257506000816001600160701b0316115b156119065760075460408051630dfe168160e01b8152905130926001600160a01b031691630dfe16819160048083019260209291908290030181865afa158015612e60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e849190613597565b6001600160a01b031614612ec857806001600160701b0316826001600160701b0316670de0b6b3a7640000612eb991906135ca565b612ec391906135e1565b612ef9565b816001600160701b0316816001600160701b0316670de0b6b3a7640000612eef91906135ca565b612ef991906135e1565b601b555050565b600080612f0b610c89565b905080600003612f1d57600091505090565b6000612710612f2d60c8846135ca565b612f3791906135e1565b9050610ed68168015af1d78b58c40000686c6b935b8bbd40000061331b565b600080612f61610c89565b905080600003612f7357505060135490565b601054811015612f8557505060135490565b601154811015612f9757505060145490565b601254811015612fa957505060155490565b505060165490565b600080612fbc610c89565b905080600003612fce57600091505090565b6000612710612fde6096846135ca565b612fe891906135e1565b9050610ed681678ac7230489e80000683635c9adc5dea0000061331b565b600080613011610c89565b90508060000361302357600091505090565b600061271061303360c8846135ca565b61303d91906135e1565b9050610ed6816802b5e3af16b188000069010f0cf064dd5920000061331b565b6000601b5460000361306f5750606490565b6000613079610eef565b90508060000361308b57505060085490565b601b548160008282116130a7576130a2828461366d565b6130b1565b6130b1838361366d565b90506000836130c2612710846135ca565b6130cc91906135e1565b905060328110156130e35760649550505050505090565b60968110156130f95761012c9550505050505090565b61012c811015613110576101f49550505050505090565b6103209550505050505090565b6001600160a01b0383166000908152601e602052604081208054429067ffffffffffffffff16158061316f575081546131629067ffffffffffffffff16610e106138d4565b67ffffffffffffffff1681115b156131eb5781546001600160801b0380871668010000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090921667ffffffffffffffff8416179190911783556001830180549186166fffffffffffffffffffffffffffffffff19909216919091179055613279565b8154859083906008906132149084906801000000000000000090046001600160801b03166138fc565b82546101009290920a6001600160801b0381810219909316918316021790915560018401541660000390506132795761324d85856137af565b6001830180546fffffffffffffffffffffffffffffffff19166001600160801b03929092169190911790555b60018201546001600160801b031660000361329957600092505050610ba2565b600182015482546001600160801b03918216916132c7916127109168010000000000000000909104166135ca565b6132d191906135e1565b9695505050505050565b600061138882106132ef5750610320919050565b6107d0821061330157506101f4919050565b6103e88210613313575061012c919050565b506000919050565b60008284101561332c575081610ba2565b8184111561333b575080610ba2565b509192915050565b60006020828403121561335557600080fd5b5035919050565b600060208083528351808285015260005b818110156133895785810183015185820160400152820161336d565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461194557600080fd5b600080604083850312156133d257600080fd5b82356133dd816133aa565b946020939093013593505050565b60008060006060848603121561340057600080fd5b833561340b816133aa565b9250602084013561341b816133aa565b929592945050506040919091013590565b60006020828403121561343e57600080fd5b8135610ba2816133aa565b600080600080600080600060e0888a03121561346457600080fd5b505085359760208701359750604087013596606081013596506080810135955060a0810135945060c0013592509050565b600080604083850312156134a857600080fd5b82356134b3816133aa565b915060208301356134c3816133aa565b809150509250929050565b600080604083850312156134e157600080fd5b823580151581146133dd57600080fd5b600181811c9082168061350557607f821691505b60208210810361352557634e487b7160e01b600052602260045260246000fd5b50919050565b80516001600160701b038116811461354257600080fd5b919050565b60008060006060848603121561355c57600080fd5b6135658461352b565b92506135736020850161352b565b9150604084015163ffffffff8116811461358c57600080fd5b809150509250925092565b6000602082840312156135a957600080fd5b8151610ba2816133aa565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610b7d57610b7d6135b4565b6000826135fe57634e487b7160e01b600052601260045260246000fd5b500490565b805169ffffffffffffffffffff8116811461354257600080fd5b600080600080600060a0868803121561363557600080fd5b61363e86613603565b945060208601519350604086015192506060860151915061366160808701613603565b90509295509295909350565b81810381811115610b7d57610b7d6135b4565b60006020828403121561369257600080fd5b815160ff81168114610ba257600080fd5b60ff8281168282160390811115610b7d57610b7d6135b4565b600181815b808511156136f75781600019048211156136dd576136dd6135b4565b808516156136ea57918102915b93841c93908002906136c1565b509250929050565b60008261370e57506001610b7d565b8161371b57506000610b7d565b8160018114613731576002811461373b57613757565b6001915050610b7d565b60ff84111561374c5761374c6135b4565b50506001821b610b7d565b5060208310610133831016604e8410600b841016171561377a575081810a610b7d565b61378483836136bc565b8060001904821115613798576137986135b4565b029392505050565b6000610ba260ff8416836136ff565b80820180821115610b7d57610b7d6135b4565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b838110156138115781516001600160a01b0316875295820195908201906001016137ec565b509495945050505050565b85815284602082015260a06040820152600061383b60a08301866137d8565b6001600160a01b0394909416606083015250608001529392505050565b60008060006060848603121561386d57600080fd5b8351925060208401519150604084015190509250925092565b84815260806020820152600061389f60808301866137d8565b6001600160a01b03949094166040830152506060015292915050565b6000602082840312156138cd57600080fd5b5051919050565b67ffffffffffffffff8181168382160190808211156138f5576138f56135b4565b5092915050565b6001600160801b038181168382160190808211156138f5576138f56135b456fea164736f6c6343000814000a0000000000000000000000004b2ab38dbf28d31d467aa8993f6c2585981d6804000000000000000000000000bcd78f76005b7515837af6b50c7c52bcf73822fb
Deployed Bytecode
0x6080604052600436106103c75760003560e01c80638897854f116101f2578063bd0477731161010d578063dd62ed3e116100a0578063f2fde38b1161006f578063f2fde38b14610a4a578063f887ea4014610a6a578063f8d7a8a814610a9e578063ff8ea3e514610ab457600080fd5b8063dd62ed3e146109b4578063eb1abfd0146109fa578063edcfdcf914610a14578063f2119faa14610a3457600080fd5b8063c5fe0b4b116100dc578063c5fe0b4b14610939578063cf8b07d714610957578063d0a45f5914610977578063d2017e281461099457600080fd5b8063bd047773146108db578063be2b7a8b146108f8578063c17321111461090e578063c2735fb91461092357600080fd5b8063a218141b11610185578063a8aa1b3111610154578063a8aa1b311461086b578063a9059cbb1461088b578063aaa96719146108ab578063aac69e2b146108c157600080fd5b8063a218141b146107ff578063a2644a6014610815578063a43f1e041461083f578063a45e75901461085557600080fd5b80639c830fc3116101c15780639c830fc31461078a5780639d48d8aa146107a05780639d49b15c146107d45780639e78fb4f146107ea57600080fd5b80638897854f146107225780638a8c523c146107425780638da5cb5b1461075757806395d89b411461077557600080fd5b8063451af7d5116102e257806359bb18ea1161027557806370a082311161024457806370a08231146106ac578063715018a6146106e257806376d4c50c146106f7578063799804241461070d57600080fd5b806359bb18ea146106665780636221cfa9146104865780636d2ed1841461067b5780636d38726b1461069057600080fd5b80634f3150a4116102b15780634f3150a4146106105780634f53e1621461062557806353713af91461063b5780635632c15c1461065157600080fd5b8063451af7d5146105c357806346f1a0bd146105d95780634886c675146103f55780634ada218b146105f657600080fd5b806318160ddd1161035a5780632ba5ad1e116103295780632ba5ad1e1461052f5780632f8673671461054f578063313ce567146105875780633582ad23146105a957600080fd5b806318160ddd146104c757806323b872dd146104dc578063270c7dba146104fc57806329d1da211461051957600080fd5b8063095ea7b311610396578063095ea7b3146104565780630bf92301146104865780630dcf9dad1461049b57806312f16a07146104b157600080fd5b8063015f1abe146103d35780630452096b146103f5578063053f14da1461041e57806306fdde031461043457600080fd5b366103ce57005b600080fd5b3480156103df57600080fd5b506103f36103ee366004613343565b610aca565b005b34801561040157600080fd5b5061040b61271081565b6040519081526020015b60405180910390f35b34801561042a57600080fd5b5061040b601b5481565b34801561044057600080fd5b50610449610ad7565b604051610415919061335c565b34801561046257600080fd5b506104766104713660046133bf565b610b69565b6040519015158152602001610415565b34801561049257600080fd5b5061040b60c881565b3480156104a757600080fd5b5061040b60175481565b3480156104bd57600080fd5b5061040b600e5481565b3480156104d357600080fd5b5060025461040b565b3480156104e857600080fd5b506104766104f73660046133eb565b610b83565b34801561050857600080fd5b5061040b6802b5e3af16b188000081565b34801561052557600080fd5b5061040b600b5481565b34801561053b57600080fd5b506103f361054a366004613343565b610ba9565b34801561055b57600080fd5b50601d5461056f906001600160a01b031681565b6040516001600160a01b039091168152602001610415565b34801561059357600080fd5b5060125b60405160ff9091168152602001610415565b3480156105b557600080fd5b50600f546104769060ff1681565b3480156105cf57600080fd5b5061040b60135481565b3480156105e557600080fd5b5061040b683635c9adc5dea0000081565b34801561060257600080fd5b50600c546104769060ff1681565b34801561061c57600080fd5b506103f3610c4b565b34801561063157600080fd5b5061040b60105481565b34801561064757600080fd5b5061040b60085481565b34801561065d57600080fd5b5061040b610c89565b34801561067257600080fd5b506103f3610e2b565b34801561068757600080fd5b5061040b610e91565b34801561069c57600080fd5b5061040b678ac7230489e8000081565b3480156106b857600080fd5b5061040b6106c736600461342c565b6001600160a01b031660009081526020819052604090205490565b3480156106ee57600080fd5b506103f3610edd565b34801561070357600080fd5b5061040b60195481565b34801561071957600080fd5b5061040b610eef565b34801561072e57600080fd5b506103f361073d36600461342c565b6110aa565b34801561074e57600080fd5b506103f3611190565b34801561076357600080fd5b506005546001600160a01b031661056f565b34801561078157600080fd5b50610449611223565b34801561079657600080fd5b5061040b60145481565b3480156107ac57600080fd5b5061056f7f000000000000000000000000bcd78f76005b7515837af6b50c7c52bcf73822fb81565b3480156107e057600080fd5b5061040b601a5481565b3480156107f657600080fd5b506103f3611232565b34801561080b57600080fd5b5061040b601c5481565b34801561082157600080fd5b5061082a61145e565b60408051928352901515602083015201610415565b34801561084b57600080fd5b5061040b60205481565b34801561086157600080fd5b5061040b60185481565b34801561087757600080fd5b5060075461056f906001600160a01b031681565b34801561089757600080fd5b506104766108a63660046133bf565b611673565b3480156108b757600080fd5b5061040b60165481565b3480156108cd57600080fd5b50600a546104769060ff1681565b3480156108e757600080fd5b5061040b686c6b935b8bbd40000081565b34801561090457600080fd5b5061040b60125481565b34801561091a57600080fd5b5061040b609681565b34801561092f57600080fd5b5061040b60095481565b34801561094557600080fd5b5061040b69010f0cf064dd5920000081565b34801561096357600080fd5b506103f3610972366004613343565b611681565b34801561098357600080fd5b5061040b68015af1d78b58c4000081565b3480156109a057600080fd5b506103f36109af366004613449565b61171e565b3480156109c057600080fd5b5061040b6109cf366004613495565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610a0657600080fd5b50601f546105979060ff1681565b348015610a2057600080fd5b506103f3610a2f3660046134ce565b611891565b348015610a4057600080fd5b5061040b60115481565b348015610a5657600080fd5b506103f3610a6536600461342c565b61190a565b348015610a7657600080fd5b5061056f7f0000000000000000000000004b2ab38dbf28d31d467aa8993f6c2585981d680481565b348015610aaa57600080fd5b5061040b60155481565b348015610ac057600080fd5b5061040b600d5481565b610ad2611948565b600955565b606060038054610ae6906134f1565b80601f0160208091040260200160405190810160405280929190818152602001828054610b12906134f1565b8015610b5f5780601f10610b3457610100808354040283529160200191610b5f565b820191906000526020600020905b815481529060010190602001808311610b4257829003601f168201915b5050505050905090565b600033610b77818585611975565b60019150505b92915050565b600033610b91858285611987565b610b9c858585611a06565b60019150505b9392505050565b610bb1611948565b600f5460ff16610bfa5760405162461bcd60e51b815260206004820152600f60248201526e131a5b5a5d1cc8191a5cd8589b1959608a1b60448201526064015b60405180910390fd5b600081118015610c0c57506127108111155b610c465760405162461bcd60e51b815260206004820152600b60248201526a496e76616c69642062707360a81b6044820152606401610bf1565b600d55565b610c53611a65565b600c805461ff001916610100179055610c6a611948565b610c72611a8f565b600c805461ff0019169055610c876001600655565b565b6007546000906001600160a01b0316610ca25750600090565b600080600760009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015610cf8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1c9190613547565b5091509150816001600160701b031660001480610d4057506001600160701b038116155b15610d4e5760009250505090565b60075460408051630dfe168160e01b815290516000926001600160a01b031691630dfe16819160048083019260209291908290030181865afa158015610d98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dbc9190613597565b905060006001600160a01b0382163014610ddf57826001600160701b0316610dea565b836001600160701b03165b90506000670de0b6b3a764000082610e00610e91565b610e0a91906135ca565b610e1491906135e1565b9050610e218160026135ca565b9550505050505090565b610e33611948565b600f5460ff16610e855760405162461bcd60e51b815260206004820152601060248201527f416c72656164792064697361626c6564000000000000000000000000000000006044820152606401610bf1565b600f805460ff19169055565b6000806000610e9e61145e565b9150915080610eb05760009250505090565b670de0b6b3a764000082610ec2610eef565b610ecc91906135ca565b610ed691906135e1565b9250505090565b610ee5611948565b610c876000611ac5565b6007546000906001600160a01b0316610f0f5750670de0b6b3a764000090565b600080600760009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015610f65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f899190613547565b5091509150816001600160701b031660001480610fad57506001600160701b038116155b15610fd257601b5415610fc257601b54610ed6565b670de0b6b3a76400009250505090565b60075460408051630dfe168160e01b8152905130926001600160a01b031691630dfe16819160048083019260209291908290030181865afa15801561101b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103f9190613597565b6001600160a01b03161461108357806001600160701b0316826001600160701b0316670de0b6b3a764000061107491906135ca565b61107e91906135e1565b610ed6565b816001600160701b0316816001600160701b0316670de0b6b3a7640000610ecc91906135ca565b6110b2611948565b601d546001600160a01b03161561110b5760405162461bcd60e51b815260206004820152601360248201527f6c705661756c7420616c726561647920736574000000000000000000000000006044820152606401610bf1565b6001600160a01b0381166111615760405162461bcd60e51b815260206004820152600b60248201527f6c705661756c74203d20300000000000000000000000000000000000000000006044820152606401610bf1565b601d805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b611198611948565b600c5460ff16156111eb5760405162461bcd60e51b815260206004820152600f60248201527f416c726561647920656e61626c656400000000000000000000000000000000006044820152606401610bf1565b600c805460ff191660011790556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a1565b606060048054610ae6906134f1565b61123a611948565b6007546001600160a01b0316156112935760405162461bcd60e51b815260206004820152600b60248201527f50616972206578697374730000000000000000000000000000000000000000006044820152606401610bf1565b7f0000000000000000000000004b2ab38dbf28d31d467aa8993f6c2585981d68046001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113159190613597565b6001600160a01b031663c9c65396307f0000000000000000000000004b2ab38dbf28d31d467aa8993f6c2585981d68046001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611382573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a69190613597565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801561140b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142f9190613597565b6007805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b600a54600090819060ff161561148c57600b546000036114815750600091829150565b5050600b5490600190565b6000806000807f000000000000000000000000bcd78f76005b7515837af6b50c7c52bcf73822fb6001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156114f0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611514919061361d565b94509450509350935060008313158061152b575081155b80611540575060095461153e834261366d565b115b8061156257508369ffffffffffffffffffff168169ffffffffffffffffffff16105b1561157557506000958695509350505050565b60007f000000000000000000000000bcd78f76005b7515837af6b50c7c52bcf73822fb6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f99190613680565b905060008160ff1660120361160f575083611665565b60128260ff161015611642576116268260126136a3565b61163190600a6137a0565b61163b90866135ca565b9050611665565b61164d6012836136a3565b61165890600a6137a0565b61166290866135e1565b90505b976001975095505050505050565b600033610b77818585611a06565b611689611948565b600f5460ff166116cd5760405162461bcd60e51b815260206004820152600f60248201526e131a5b5a5d1cc8191a5cd8589b1959608a1b6044820152606401610bf1565b6000811180156116df57506127108111155b6117195760405162461bcd60e51b815260206004820152600b60248201526a496e76616c69642062707360a81b6044820152606401610bf1565b600e55565b611726611948565b60008711801561173557508686115b801561174057508585115b61178c5760405162461bcd60e51b815260206004820152600e60248201527f4261642054564c206c6576656c730000000000000000000000000000000000006044820152606401610bf1565b61271084111580156117a057506127108311155b80156117ae57506127108211155b80156117bc57506127108111155b6118085760405162461bcd60e51b815260206004820152600c60248201527f5368617265203e203130302500000000000000000000000000000000000000006044820152606401610bf1565b60108790556011869055601285905560138490556014839055601582905560168190556040805188815260208101889052908101869052606081018590526080810184905260a0810183905260c081018290527f53d7a20eb4402ea6dd2023960e805abeef360f82de6788f41666a01cb461720a9060e00160405180910390a150505050505050565b611899611948565b600a805460ff1916831580159190911790915561190657600081116119005760405162461bcd60e51b815260206004820152601060248201527f46616c6c6261636b2070726963653d30000000000000000000000000000000006044820152606401610bf1565b600b8190555b5050565b611912611948565b6001600160a01b03811661193c57604051631e4fbdf760e01b815260006004820152602401610bf1565b61194581611ac5565b50565b6005546001600160a01b03163314610c875760405163118cdaa760e01b8152336004820152602401610bf1565b6119828383836001611b24565b505050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811015611a0057818110156119f157604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610bf1565b611a0084848484036000611b24565b50505050565b6001600160a01b038316611a3057604051634b637e8f60e11b815260006004820152602401610bf1565b6001600160a01b038216611a5a5760405163ec442f0560e01b815260006004820152602401610bf1565b611982838383611bf9565b600260065403611a8857604051633ee5aeb560e01b815260040160405180910390fd5b6002600655565b600c5460ff16611a9b57565b6007546001600160a01b0316611aad57565b611ab5612056565b611abd6124c3565b610c876127d4565b600580546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038416611b4e5760405163e602df0560e01b815260006004820152602401610bf1565b6001600160a01b038316611b7857604051634a1406b160e11b815260006004820152602401610bf1565b6001600160a01b0380851660009081526001602090815260408083209387168352929052208290558015611a0057826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611beb91815260200190565b60405180910390a350505050565b600c548390839060ff16611cc4576007546001600160a01b031615611cc4576007546000906001600160a01b0384811691161480611c4457506007546001600160a01b038381169116145b90508015611cc2576005546001600160a01b038481169116148015611c7657506007546001600160a01b038381169116145b611cc25760405162461bcd60e51b815260206004820152601360248201527f54726164696e67206e6f7420656e61626c6564000000000000000000000000006044820152606401610bf1565b505b6007546000906001600160a01b031615801590611d0557506007546001600160a01b0387811691161480611d0557506007546001600160a01b038681169116145b90506001600160a01b0386161580611d2457506001600160a01b038516155b15611d3a57611d348686866129e4565b5061204f565b600c54610100900460ff16158015611d4f5750805b15611e9657600c5460ff168015611d685750600f5460ff165b15611df0576005546001600160a01b03878116911614801590611d9457506001600160a01b0386163014155b15611df057611da1612b0e565b841115611df05760405162461bcd60e51b815260206004820152600f60248201527f4d617820747820657863656564656400000000000000000000000000000000006044820152606401610bf1565b600c5460009060ff16611e04576000611e0f565b611e0f878787612ba5565b90506000612710611e2083886135ca565b611e2a91906135e1565b90506000611e38828861366d565b90508115611e4b57611e4b8930846129e4565b611e568989836129e4565b601854611e6590610e106137af565b421115611e76576000601755426018555b8660176000828254611e8891906137af565b90915550611ea19350505050565b611ea18686866129e4565b600c5460ff168015611eb55750600f5460ff165b8015611ec95750600c54610100900460ff16155b8015611ee357506007546001600160a01b03868116911614155b8015611efa57506001600160a01b03851661dead14155b8015611f0f57506001600160a01b0385163014155b15611f8357611f1c612d02565b6001600160a01b0386166000908152602081905260409020541115611f835760405162461bcd60e51b815260206004820152601060248201527f57616c6c657420746f6f206c61726765000000000000000000000000000000006044820152606401610bf1565b611f8b612d44565b6007546000906001600160a01b031615801590611fb557506007546001600160a01b038781169116145b600c5490915060ff168015611fd25750600c54610100900460ff16155b8015611fdb5750805b8015611ff057506001600160a01b0387163014155b801561200a57506007546001600160a01b03888116911614155b801561203f5750336001600160a01b037f0000000000000000000000004b2ab38dbf28d31d467aa8993f6c2585981d68041614155b1561204c5761204c611a8f565b50505b5050505050565b600c805461ff001981166101001790915560ff16158061207f57506007546001600160a01b0316155b6124b65730600090815260208190526040902054671bc16d674ec800008110156120a957506124b6565b60006120b3612f00565b9050806000036120c45750506124b6565b6000670de0b6b3a7640000836120d8610e91565b6120e291906135ca565b6120ec91906135e1565b9050818110156120fe575050506124b6565b600061210b6002856135e1565b90506000612119828661366d565b9050476000612126610c89565b9050612153307f0000000000000000000000004b2ab38dbf28d31d467aa8993f6c2585981d680486611975565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612188576121886137c2565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000004b2ab38dbf28d31d467aa8993f6c2585981d68046001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612206573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061222a9190613597565b8160018151811061223d5761223d6137c2565b6001600160a01b03928316602091820292909201015260405163791ac94760e01b81527f0000000000000000000000004b2ab38dbf28d31d467aa8993f6c2585981d68049091169063791ac947906122a290889060009086903090429060040161381c565b600060405180830381600087803b1580156122bc57600080fd5b505af11580156122d0573d6000803e3d6000fd5b50505050600083476122e2919061366d565b9050806000036122fa575050505050505050506124b6565b6000612304612f56565b9050600061271061231583856135ca565b61231f91906135e1565b9050806000036123395750505050505050505050506124b6565b612364307f0000000000000000000000004b2ab38dbf28d31d467aa8993f6c2585981d680489611975565b601d546000906001600160a01b031661237d573061238a565b601d546001600160a01b03165b60405163f305d71960e01b8152306004820152602481018a9052600060448201819052606482018190526001600160a01b0380841660848401524260a484015292935091829182917f0000000000000000000000004b2ab38dbf28d31d467aa8993f6c2585981d6804169063f305d71990879060c40160606040518083038185885af115801561241e573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906124439190613858565b9250925092506000612453610c89565b6040805186815260208101869052908101849052606081018c9052608081018290529091507fb141efb20c72d616a1738edf3bfc091e675e9970798c20f084e967372070c25b9060a00160405180910390a1505050505050505050505050505050505b600c805461ff0019169055565b600c805461ff001981166101001790915560ff1615806124ec57506007546001600160a01b0316155b6124b65747600081900361250057506124b6565b60008061250b61145e565b9150915080158061251a575081155b15612527575050506124b6565b6000612531612fb1565b90508060000361254457505050506124b6565b6000670de0b6b3a764000061255985876135ca565b61256391906135e1565b9050818110156125775750505050506124b6565b6000612581610eef565b905080600003612596575050505050506124b6565b6040805160028082526060820183526000926020830190803683370190505090507f0000000000000000000000004b2ab38dbf28d31d467aa8993f6c2585981d68046001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612615573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126399190613597565b8160008151811061264c5761264c6137c2565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110612680576126806137c2565b6001600160a01b039290921660209283029190910182015261dead6000818152918290527f44ad89ba62b98ff34f51403ac22759b55759460c0bb5521eb4b6ee3cff49cf83549091507f0000000000000000000000004b2ab38dbf28d31d467aa8993f6c2585981d68046001600160a01b031663b6f9de958a60008686426040518663ffffffff1660e01b815260040161271d9493929190613886565b6000604051808303818588803b15801561273657600080fd5b505af115801561274a573d6000803e3d6000fd5b5050505050600081612771846001600160a01b031660009081526020819052604090205490565b61277b919061366d565b905080156127bd57604080518b8152602081018390527f7b2f737ad25d6754dc3fda541b53e2231977a956462277e001f2badd1026b155910160405180910390a15b50505050505050505050600c805461ff0019169055565b600c805461ff0019166101001790556007546001600160a01b0316156124b657601d546001600160a01b0316156124b6576000670de0b6b3a764000060175461281b610e91565b61282591906135ca565b61282f91906135e1565b9050600061283b613006565b905080158061284957508082105b156128555750506124b6565b600061285f610c89565b600754601d546040516370a0823160e01b81526001600160a01b03918216600482015292935060649260009291909116906370a0823190602401602060405180830381865afa1580156128b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128da91906138bb565b9050806000036128ee5750505050506124b6565b60006127106128fd84846135ca565b61290791906135e1565b90508060000361291c575050505050506124b6565b601d546040516313190dc960e21b8152600481018590526001600160a01b0390911690634c64372490602401600060405180830381600087803b15801561296257600080fd5b505af1158015612976573d6000803e3d6000fd5b505050506000601781905550600061298c610c89565b60408051848152602081018890529081018290529091507faa806dcee66f738073660fffc529b7a09332a78075ef065c4c5da88c481a0f019060600160405180910390a150505050505050600c805461ff0019169055565b6001600160a01b038316612a0f578060026000828254612a0491906137af565b90915550612a819050565b6001600160a01b03831660009081526020819052604090205481811015612a625760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610bf1565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216612a9d57600280548290039055612abc565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612b0191815260200190565b60405180910390a3505050565b600f5460009060ff16612b22575060025490565b6007546001600160a01b031615612b77576007546001600160a01b03166000908152602081905260409020548015612b7557612710600d5482612b6591906135ca565b612b6f91906135e1565b91505090565b505b6000612b8260025490565b905080600003612b9457600091505090565b612710600d5482612b6591906135ca565b60075460009081906001600160a01b031615801590612bd157506007546001600160a01b038581169116145b8015612beb57506007546001600160a01b03868116911614155b601f5460205491925060ff16906000612c0261305d565b90506000808515612c40576001600160a01b038a16600090815260208190526040902054612c318b8a8361311d565b9250612c3c836132db565b9150505b82965086811115612c4f578096505b600060648811612c6157506000612c87565b61012c8811612c7257506001612c87565b6101f48811612c8357506002612c87565b5060035b8560ff168160ff1614612cee57601f805460ff191660ff83811691821790925560208a8155604080518981529182018c905291928916917f52082db318307845a2bd75620e9311db096d2f113c9e93413b8c7f75d8e39037910160405180910390a3612cf4565b60208890555b505050505050509392505050565b600f5460009060ff16612d16575060025490565b6000612d2160025490565b905080600003612d3357600091505090565b612710600e5482612b6591906135ca565b6007546001600160a01b0316612d5657565b601c544303612d6157565b600080600760009054906101000a90046001600160a01b03166001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015612db7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ddb9190613547565b506001600160701b038083166019819055908216601a5543601c55919350915015801590612e1257506000816001600160701b0316115b156119065760075460408051630dfe168160e01b8152905130926001600160a01b031691630dfe16819160048083019260209291908290030181865afa158015612e60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e849190613597565b6001600160a01b031614612ec857806001600160701b0316826001600160701b0316670de0b6b3a7640000612eb991906135ca565b612ec391906135e1565b612ef9565b816001600160701b0316816001600160701b0316670de0b6b3a7640000612eef91906135ca565b612ef991906135e1565b601b555050565b600080612f0b610c89565b905080600003612f1d57600091505090565b6000612710612f2d60c8846135ca565b612f3791906135e1565b9050610ed68168015af1d78b58c40000686c6b935b8bbd40000061331b565b600080612f61610c89565b905080600003612f7357505060135490565b601054811015612f8557505060135490565b601154811015612f9757505060145490565b601254811015612fa957505060155490565b505060165490565b600080612fbc610c89565b905080600003612fce57600091505090565b6000612710612fde6096846135ca565b612fe891906135e1565b9050610ed681678ac7230489e80000683635c9adc5dea0000061331b565b600080613011610c89565b90508060000361302357600091505090565b600061271061303360c8846135ca565b61303d91906135e1565b9050610ed6816802b5e3af16b188000069010f0cf064dd5920000061331b565b6000601b5460000361306f5750606490565b6000613079610eef565b90508060000361308b57505060085490565b601b548160008282116130a7576130a2828461366d565b6130b1565b6130b1838361366d565b90506000836130c2612710846135ca565b6130cc91906135e1565b905060328110156130e35760649550505050505090565b60968110156130f95761012c9550505050505090565b61012c811015613110576101f49550505050505090565b6103209550505050505090565b6001600160a01b0383166000908152601e602052604081208054429067ffffffffffffffff16158061316f575081546131629067ffffffffffffffff16610e106138d4565b67ffffffffffffffff1681115b156131eb5781546001600160801b0380871668010000000000000000027fffffffffffffffff00000000000000000000000000000000000000000000000090921667ffffffffffffffff8416179190911783556001830180549186166fffffffffffffffffffffffffffffffff19909216919091179055613279565b8154859083906008906132149084906801000000000000000090046001600160801b03166138fc565b82546101009290920a6001600160801b0381810219909316918316021790915560018401541660000390506132795761324d85856137af565b6001830180546fffffffffffffffffffffffffffffffff19166001600160801b03929092169190911790555b60018201546001600160801b031660000361329957600092505050610ba2565b600182015482546001600160801b03918216916132c7916127109168010000000000000000909104166135ca565b6132d191906135e1565b9695505050505050565b600061138882106132ef5750610320919050565b6107d0821061330157506101f4919050565b6103e88210613313575061012c919050565b506000919050565b60008284101561332c575081610ba2565b8184111561333b575080610ba2565b509192915050565b60006020828403121561335557600080fd5b5035919050565b600060208083528351808285015260005b818110156133895785810183015185820160400152820161336d565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461194557600080fd5b600080604083850312156133d257600080fd5b82356133dd816133aa565b946020939093013593505050565b60008060006060848603121561340057600080fd5b833561340b816133aa565b9250602084013561341b816133aa565b929592945050506040919091013590565b60006020828403121561343e57600080fd5b8135610ba2816133aa565b600080600080600080600060e0888a03121561346457600080fd5b505085359760208701359750604087013596606081013596506080810135955060a0810135945060c0013592509050565b600080604083850312156134a857600080fd5b82356134b3816133aa565b915060208301356134c3816133aa565b809150509250929050565b600080604083850312156134e157600080fd5b823580151581146133dd57600080fd5b600181811c9082168061350557607f821691505b60208210810361352557634e487b7160e01b600052602260045260246000fd5b50919050565b80516001600160701b038116811461354257600080fd5b919050565b60008060006060848603121561355c57600080fd5b6135658461352b565b92506135736020850161352b565b9150604084015163ffffffff8116811461358c57600080fd5b809150509250925092565b6000602082840312156135a957600080fd5b8151610ba2816133aa565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610b7d57610b7d6135b4565b6000826135fe57634e487b7160e01b600052601260045260246000fd5b500490565b805169ffffffffffffffffffff8116811461354257600080fd5b600080600080600060a0868803121561363557600080fd5b61363e86613603565b945060208601519350604086015192506060860151915061366160808701613603565b90509295509295909350565b81810381811115610b7d57610b7d6135b4565b60006020828403121561369257600080fd5b815160ff81168114610ba257600080fd5b60ff8281168282160390811115610b7d57610b7d6135b4565b600181815b808511156136f75781600019048211156136dd576136dd6135b4565b808516156136ea57918102915b93841c93908002906136c1565b509250929050565b60008261370e57506001610b7d565b8161371b57506000610b7d565b8160018114613731576002811461373b57613757565b6001915050610b7d565b60ff84111561374c5761374c6135b4565b50506001821b610b7d565b5060208310610133831016604e8410600b841016171561377a575081810a610b7d565b61378483836136bc565b8060001904821115613798576137986135b4565b029392505050565b6000610ba260ff8416836136ff565b80820180821115610b7d57610b7d6135b4565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b838110156138115781516001600160a01b0316875295820195908201906001016137ec565b509495945050505050565b85815284602082015260a06040820152600061383b60a08301866137d8565b6001600160a01b0394909416606083015250608001529392505050565b60008060006060848603121561386d57600080fd5b8351925060208401519150604084015190509250925092565b84815260806020820152600061389f60808301866137d8565b6001600160a01b03949094166040830152506060015292915050565b6000602082840312156138cd57600080fd5b5051919050565b67ffffffffffffffff8181168382160190808211156138f5576138f56135b4565b5092915050565b6001600160801b038181168382160190808211156138f5576138f56135b456fea164736f6c6343000814000a
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in MON
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.