// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
interface AggregatorV3Interface {
function decimals() external view returns (uint8);
function latestRoundData()
external
view
returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);
}
/// @title WhaleFloor
/// @notice Продаёт KRILL за ETH по фиксированной ДОЛЛАРОВОЙ цене. При
/// tokensPerUsd = 10 000 один KRILL стоит $0.0001, а мушкет из 5 000
/// KRILL, который сжигает NFT-контракт, — ровно $0.50 при любом курсе
/// ETH. Конвертацию даёт ценовой фид.
///
/// @dev Порт GirlSale с боевого запуска Girl Brokers. Долларовая привязка
/// надёжна ровно настолько, насколько надёжен фид, поэтому здесь тот
/// же набор предохранителей: проверка устаревания, абсолютные границы
/// цены, необязательная проверка аптайма секвенсера L2 и minOut от
/// вызывающего. Убран лимит на кошелёк — по решению владельца
/// ограничение стоит только на количество NFT в одной транзакции.
contract WhaleFloor is Ownable, ReentrancyGuard {
using SafeERC20 for IERC20;
/* ------------------------------------------------------------------ */
/* IMMUTABLES */
/* ------------------------------------------------------------------ */
IERC20 public immutable krill;
AggregatorV3Interface public immutable ethUsdFeed;
uint256 public immutable feedScale; // 10 ** feed.decimals()
/// Через сколько после endTime закрыть продажу может кто угодно, не только
/// владелец. Страховка от брошенного контракта с чужими деньгами.
uint256 public constant FINALIZE_GRACE = 7 days;
/* ------------------------------------------------------------------ */
/* ПАРАМЕТРЫ */
/* ------------------------------------------------------------------ */
/// KRILL за один доллар. 10 000 означает $0.0001 за токен.
uint256 public tokensPerUsd = 10_000;
/// Зеркало WhaleStreet.mintCost. Питает только quoteForMints(), поэтому
/// расхождение испортит подсказку фронта, но не может продать неправильно.
uint256 public mintCost = 5_000e18;
/// Потолок того, что контракт готов продать. Поднимать можно, пока токены
/// реально лежат на балансе; опустить ниже проданного нельзя.
uint256 public allocation;
bool public paused;
address public treasury;
/* ------------------------------------------------------------------ */
/* ПРЕДОХРАНИТЕЛИ ФИДА */
/* ------------------------------------------------------------------ */
/// Фид на Robinhood Chain — не стандартный прокси Chainlink: он не отдаёт
/// историю раундов, так что его период обновления нельзя измерить с чейна.
/// Шесть часов дрейфа на фиде, который обновляется по отклонению, стоят
/// заметно меньше цента на минт; setGuardrails затянет порог, когда
/// реальная частота будет измерена на живой сети.
uint256 public maxFeedAge = 6 hours;
uint256 public minEthUsd = 100;
uint256 public maxEthUsd = 100_000;
AggregatorV3Interface public sequencerFeed;
uint256 public sequencerGracePeriod = 1 hours;
/* ------------------------------------------------------------------ */
/* СОСТОЯНИЕ */
/* ------------------------------------------------------------------ */
uint256 public sold;
uint256 public startTime;
uint256 public endTime;
bool public finalized;
uint256 public minPurchase = 0.0002 ether; // защита от пыли, в wei
/* ------------------------------------------------------------------ */
/* СОБЫТИЯ */
/* ------------------------------------------------------------------ */
event SaleScheduled(uint256 start, uint256 end);
event Purchased(address indexed buyer, uint256 ethPaid, uint256 received, uint256 ethUsd);
event Refunded(address indexed buyer, uint256 amount);
event Finalized(uint256 sold, uint256 returnedToTreasury);
event GuardrailsUpdated(uint256 maxAge, uint256 minPrice, uint256 maxPrice);
event ParamsUpdated(string indexed what, uint256 a, uint256 b);
constructor(address _krill, address _ethUsdFeed, address _treasury, uint256 _allocation) Ownable(msg.sender) {
require(_krill != address(0) && _ethUsdFeed != address(0), "zero addr");
require(_treasury != address(0), "zero treasury");
require(_allocation > 0, "zero allocation");
krill = IERC20(_krill);
ethUsdFeed = AggregatorV3Interface(_ethUsdFeed);
feedScale = 10 ** uint256(AggregatorV3Interface(_ethUsdFeed).decimals());
treasury = _treasury;
allocation = _allocation;
}
/* ------------------------------------------------------------------ */
/* ЦЕНООБРАЗОВАНИЕ */
/* ------------------------------------------------------------------ */
/// @notice Текущий ETH/USD в десятичных самого фида.
/// @dev Лучше отказать, чем вернуть подозрительное число: остановленная
/// продажа поправима, продажа по неверной цене — нет.
function ethUsd() public view returns (uint256) {
_requireSequencerUp();
(, int256 answer,, uint256 updatedAt,) = ethUsdFeed.latestRoundData();
require(answer > 0, "bad feed answer");
require(updatedAt != 0, "incomplete round");
require(block.timestamp - updatedAt <= maxFeedAge, "stale feed");
uint256 price = uint256(answer);
uint256 whole = price / feedScale;
require(whole >= minEthUsd && whole <= maxEthUsd, "price out of band");
return price;
}
function _requireSequencerUp() internal view {
if (address(sequencerFeed) == address(0)) return;
(, int256 up, uint256 startedAt,,) = sequencerFeed.latestRoundData();
require(up == 0, "sequencer down");
// Незавершённый раунд (startedAt == 0) сделал бы разность огромной и
// прошёл бы проверку отсрочки — ровно то состояние сломанного фида,
// ради которого проверка и написана.
require(startedAt != 0, "incomplete sequencer round");
require(block.timestamp - startedAt > sequencerGracePeriod, "sequencer grace");
}
/// @notice Сколько KRILL даст указанное количество ETH прямо сейчас.
function quote(uint256 ethIn) public view returns (uint256) {
return (ethIn * ethUsd() * tokensPerUsd) / feedScale;
}
/// @notice Сколько ETH нужно на `n` минтов.
/// @dev Округление вверх. Округление вниз выдало бы сумму, которая после
/// buy() даёт на волос меньше KRILL, чем стоит минт.
function quoteForMints(uint256 n) external view returns (uint256) {
uint256 tokens = n * mintCost;
uint256 denom = ethUsd() * tokensPerUsd;
return (tokens * feedScale + denom - 1) / denom;
}
/* ------------------------------------------------------------------ */
/* РАСПИСАНИЕ */
/* ------------------------------------------------------------------ */
/// @notice Задать или сдвинуть окно продажи. Вызывается когда угодно,
/// чтобы запуск можно было отложить, продлить или обрезать без
/// редеплоя.
function schedule(uint256 _start, uint256 _end) external onlyOwner {
require(!finalized, "finalized");
require(_end > _start, "bad window");
require(krill.balanceOf(address(this)) >= allocation, "unfunded");
require(ethUsd() > 0, "feed not live"); // упасть здесь, а не на первом покупателе
startTime = _start;
endTime = _end;
emit SaleScheduled(_start, _end);
}
function isLive() public view returns (bool) {
return startTime != 0 && block.timestamp >= startTime && block.timestamp < endTime && !finalized && !paused
&& sold < allocation;
}
function remaining() public view returns (uint256) {
return allocation - sold;
}
/* ------------------------------------------------------------------ */
/* ПОКУПКА */
/* ------------------------------------------------------------------ */
/// @notice Купить KRILL за ETH по живому долларовому курсу.
/// @param minOut отказать, если покупателю досталось бы меньше. Обязателен:
/// курс ETH успевает сдвинуться между подсказкой фронта и попаданием
/// транзакции в блок.
function buy(uint256 minOut) external payable nonReentrant {
require(isLive(), "sale not live");
require(msg.value >= minPurchase, "below minimum");
uint256 price = ethUsd();
uint256 out = (msg.value * price * tokensPerUsd) / feedScale;
require(out > 0, "zero out");
uint256 spend = msg.value;
// прижать к остатку аллокации
uint256 left = allocation - sold;
if (out > left) {
spend = (spend * left) / out;
out = left;
}
require(out >= minOut, "below minOut");
require(spend > 0, "zero spend");
sold += out;
krill.safeTransfer(msg.sender, out);
(bool okT,) = treasury.call{value: spend}("");
require(okT, "treasury transfer failed");
uint256 refund = msg.value - spend;
if (refund > 0) {
(bool okR,) = msg.sender.call{value: refund}("");
require(okR, "refund failed");
emit Refunded(msg.sender, refund);
}
emit Purchased(msg.sender, spend, out, price);
}
/* ------------------------------------------------------------------ */
/* ЗАКРЫТИЕ */
/* ------------------------------------------------------------------ */
/// @notice Закрыть продажу и вернуть непроданные токены в казну.
/// @dev Сначала владелец, после отсрочки — кто угодно. Брошенный
/// контракт не должен запереть токены навсегда.
function finalize() external nonReentrant {
require(!finalized, "already finalized");
require(endTime != 0 && block.timestamp >= endTime, "sale not over");
if (msg.sender != owner()) {
require(block.timestamp >= endTime + FINALIZE_GRACE, "grace not passed");
}
finalized = true;
uint256 leftover = krill.balanceOf(address(this));
if (leftover > 0) krill.safeTransfer(treasury, leftover);
emit Finalized(sold, leftover);
}
/* ------------------------------------------------------------------ */
/* УПРАВЛЕНИЕ */
/* ------------------------------------------------------------------ */
/// @notice Переоценить продажу. 10 000 = $0.0001 за токен, 5 000 = $0.0002.
/// @dev Цена минта в долларах = mintCost / tokensPerUsd. Меняя это
/// число, владелец двигает цену всей коллекции.
function setTokensPerUsd(uint256 v) external onlyOwner {
require(v > 0, "zero price");
tokensPerUsd = v;
emit ParamsUpdated("tokensPerUsd", v, 0);
}
/// @notice Держать в курсе, сколько KRILL стоит один минт. Только подсказка.
function setMintCost(uint256 v) external onlyOwner {
require(v > 0, "zero cost");
mintCost = v;
emit ParamsUpdated("mintCost", v, 0);
}
function setAllocation(uint256 v) external onlyOwner {
require(v >= sold, "below sold");
require(krill.balanceOf(address(this)) >= v - sold, "unfunded");
allocation = v;
emit ParamsUpdated("allocation", v, 0);
}
function setMinPurchase(uint256 v) external onlyOwner {
minPurchase = v;
emit ParamsUpdated("minPurchase", v, 0);
}
function setPaused(bool v) external onlyOwner {
paused = v;
emit ParamsUpdated("paused", v ? 1 : 0, 0);
}
function setTreasury(address t) external onlyOwner {
require(t != address(0), "zero treasury");
treasury = t;
emit ParamsUpdated("treasury", uint256(uint160(t)), 0);
}
function setGuardrails(uint256 _maxAge, uint256 _minPrice, uint256 _maxPrice) external onlyOwner {
require(_maxAge > 0 && _minPrice > 0 && _maxPrice > _minPrice, "bad guardrails");
maxFeedAge = _maxAge;
minEthUsd = _minPrice;
maxEthUsd = _maxPrice;
emit GuardrailsUpdated(_maxAge, _minPrice, _maxPrice);
}
function setSequencerFeed(address feed, uint256 grace) external onlyOwner {
sequencerFeed = AggregatorV3Interface(feed);
sequencerGracePeriod = grace;
emit ParamsUpdated("sequencerFeed", uint256(uint160(feed)), grace);
}
/// @notice Вытащить случайно присланный ERC-20, кроме предмета продажи.
function rescueToken(address token, address to, uint256 amount) external onlyOwner {
require(token != address(krill), "not krill");
require(to != address(0), "zero to");
IERC20(token).safeTransfer(to, amount);
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "_krill",
"type": "address",
"internalType": "address"
},
{
"name": "_ethUsdFeed",
"type": "address",
"internalType": "address"
},
{
"name": "_treasury",
"type": "address",
"internalType": "address"
},
{
"name": "_allocation",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "AddressEmptyCode",
"type": "error",
"inputs": [
{
"name": "target",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "AddressInsufficientBalance",
"type": "error",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "FailedInnerCall",
"type": "error",
"inputs": []
},
{
"name": "OwnableInvalidOwner",
"type": "error",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "OwnableUnauthorizedAccount",
"type": "error",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ReentrancyGuardReentrantCall",
"type": "error",
"inputs": []
},
{
"name": "SafeERC20FailedOperation",
"type": "error",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "Finalized",
"type": "event",
"inputs": [
{
"name": "sold",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "returnedToTreasury",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "GuardrailsUpdated",
"type": "event",
"inputs": [
{
"name": "maxAge",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "minPrice",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "maxPrice",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "OwnershipTransferred",
"type": "event",
"inputs": [
{
"name": "previousOwner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "ParamsUpdated",
"type": "event",
"inputs": [
{
"name": "what",
"type": "string",
"indexed": true,
"internalType": "string"
},
{
"name": "a",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "b",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Purchased",
"type": "event",
"inputs": [
{
"name": "buyer",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "ethPaid",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "received",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "ethUsd",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Refunded",
"type": "event",
"inputs": [
{
"name": "buyer",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "SaleScheduled",
"type": "event",
"inputs": [
{
"name": "start",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "end",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "FINALIZE_GRACE",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "allocation",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "buy",
"type": "function",
"inputs": [
{
"name": "minOut",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "endTime",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "ethUsd",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "ethUsdFeed",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract AggregatorV3Interface"
}
],
"stateMutability": "view"
},
{
"name": "feedScale",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "finalize",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "finalized",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "isLive",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "krill",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IERC20"
}
],
"stateMutability": "view"
},
{
"name": "maxEthUsd",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "maxFeedAge",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "minEthUsd",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "minPurchase",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "mintCost",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "owner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "paused",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "quote",
"type": "function",
"inputs": [
{
"name": "ethIn",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "quoteForMints",
"type": "function",
"inputs": [
{
"name": "n",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "remaining",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "renounceOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "rescueToken",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "schedule",
"type": "function",
"inputs": [
{
"name": "_start",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "_end",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "sequencerFeed",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract AggregatorV3Interface"
}
],
"stateMutability": "view"
},
{
"name": "sequencerGracePeriod",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "setAllocation",
"type": "function",
"inputs": [
{
"name": "v",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setGuardrails",
"type": "function",
"inputs": [
{
"name": "_maxAge",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "_minPrice",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "_maxPrice",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setMinPurchase",
"type": "function",
"inputs": [
{
"name": "v",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setMintCost",
"type": "function",
"inputs": [
{
"name": "v",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setPaused",
"type": "function",
"inputs": [
{
"name": "v",
"type": "bool",
"internalType": "bool"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setSequencerFeed",
"type": "function",
"inputs": [
{
"name": "feed",
"type": "address",
"internalType": "address"
},
{
"name": "grace",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setTokensPerUsd",
"type": "function",
"inputs": [
{
"name": "v",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setTreasury",
"type": "function",
"inputs": [
{
"name": "t",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "sold",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "startTime",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "tokensPerUsd",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "transferOwnership",
"type": "function",
"inputs": [
{
"name": "newOwner",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "treasury",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
}
]0x60e060405261271060025569010f0cf064dd592000006003556154606006556064600755620186a0600855610e10600a5565b5e620f48000600f5534801562000046575f80fd5b506040516200229e3803806200229e8339810160408190526200006991620002ac565b33806200009057604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6200009b8162000241565b50600180556001600160a01b03841615801590620000c157506001600160a01b03831615155b620000fb5760405162461bcd60e51b81526020600482015260096024820152683d32b9379030b2323960b91b604482015260640162000087565b6001600160a01b038216620001435760405162461bcd60e51b815260206004820152600d60248201526c7a65726f20747265617375727960981b604482015260640162000087565b5f8111620001865760405162461bcd60e51b815260206004820152600f60248201526e3d32b9379030b63637b1b0ba34b7b760891b604482015260640162000087565b6001600160a01b03808516608052831660a08190526040805163313ce56760e01b8152905163313ce567916004808201926020929091908290030181865afa158015620001d5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001fb9190620002fb565b6200020b9060ff16600a62000433565b60c052600580546001600160a01b0390931661010002610100600160a81b03199093169290921790915560045550620004409050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b0381168114620002a7575f80fd5b919050565b5f805f8060808587031215620002c0575f80fd5b620002cb8562000290565b9350620002db6020860162000290565b9250620002eb6040860162000290565b6060959095015193969295505050565b5f602082840312156200030c575f80fd5b815160ff811681146200031d575f80fd5b9392505050565b634e487b7160e01b5f52601160045260245ffd5b600181815b808511156200037857815f19048211156200035c576200035c62000324565b808516156200036a57918102915b93841c93908002906200033d565b509250929050565b5f8262000390575060016200042d565b816200039e57505f6200042d565b8160018114620003b75760028114620003c257620003e2565b60019150506200042d565b60ff841115620003d657620003d662000324565b50506001821b6200042d565b5060208310610133831016604e8410600b841016171562000407575081810a6200042d565b62000413838362000338565b805f190482111562000429576200042962000324565b0290505b92915050565b5f6200031d838362000380565b60805160a05160c051611de6620004b85f395f818161045f015281816106cd01528181610ed001528181611119015261160c01525f81816104d00152610d7901525f81816103570152818161082e01528181610a4101528181610c5e01528181610ce00152818161126f01526114690152611de65ff3fe608060405260043610610228575f3560e01c8063715018a611610129578063b944a663116100a8578063eb641a291161006d578063eb641a2914610609578063ed1bd76c14610628578063efe3688b14610647578063f0f442601461065c578063f2fde38b1461067b575f80fd5b8063b944a6631461058e578063bdb4b848146105a3578063d96a094a146105b8578063e5711e8b146105cb578063e8307d00146105ea575f80fd5b806388a17bde116100ee57806388a17bde146105115780638da5cb5b14610526578063b11fdd2514610542578063b3f05b9714610561578063b8f7a6651461057a575f80fd5b8063715018a614610481578063744716fe1461049557806378e97925146104aa5780638009b7bd146104bf5780638545f4ea146104f2575f80fd5b806337dd150f116101b55780635a9602161161017a5780635a960216146103d85780635c975abb146103ec57806361d027b31461041557806369e7c3d7146104395780636f6f6da31461044e575f80fd5b806337dd150f1461033057806337ea9348146103465780633b521cb6146103915780634bb278f3146103b057806355234ec0146103c4575f80fd5b80631dabe830116101fb5780631dabe830146102b357806326a97b94146102d25780632bd8d552146102e75780633197cbb61461030657806333b5b62e1461031b575f80fd5b806302c7e7af1461022c5780630d9efca71461025457806316c38b3c146102735780631d9b1d6f14610294575b5f80fd5b348015610237575f80fd5b50610241600b5481565b6040519081526020015b60405180910390f35b34801561025f575f80fd5b5061024161026e366004611b40565b61069a565b34801561027e575f80fd5b5061029261028d366004611b64565b610718565b005b34801561029f575f80fd5b506102926102ae366004611b7f565b610782565b3480156102be575f80fd5b506102926102cd366004611bba565b61095d565b3480156102dd575f80fd5b50610241600a5481565b3480156102f2575f80fd5b50610292610301366004611b40565b6109d8565b348015610311575f80fd5b50610241600d5481565b348015610326575f80fd5b50610241600f5481565b34801561033b575f80fd5b5061024162093a8081565b348015610351575f80fd5b506103797f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161024b565b34801561039c575f80fd5b50600954610379906001600160a01b031681565b3480156103bb575f80fd5b50610292610b30565b3480156103cf575f80fd5b50610241610d56565b3480156103e3575f80fd5b50610241610d6c565b3480156103f7575f80fd5b506005546104059060ff1681565b604051901515815260200161024b565b348015610420575f80fd5b506005546103799061010090046001600160a01b031681565b348015610444575f80fd5b5061024160065481565b348015610459575f80fd5b506102417f000000000000000000000000000000000000000000000000000000000000000081565b34801561048c575f80fd5b50610292610f53565b3480156104a0575f80fd5b5061024160075481565b3480156104b5575f80fd5b50610241600c5481565b3480156104ca575f80fd5b506103797f000000000000000000000000000000000000000000000000000000000000000081565b3480156104fd575f80fd5b5061029261050c366004611b40565b610f64565b34801561051c575f80fd5b5061024160045481565b348015610531575f80fd5b505f546001600160a01b0316610379565b34801561054d575f80fd5b5061029261055c366004611b40565b610fc5565b34801561056c575f80fd5b50600e546104059060ff1681565b348015610585575f80fd5b5061040561102b565b348015610599575f80fd5b5061024160025481565b3480156105ae575f80fd5b5061024160035481565b6102926105c6366004611b40565b61107d565b3480156105d6575f80fd5b506102926105e5366004611be2565b61145f565b3480156105f5575f80fd5b50610292610604366004611b40565b61152d565b348015610614575f80fd5b50610292610623366004611c1b565b611556565b348015610633575f80fd5b50610241610642366004611b40565b611609565b348015610652575f80fd5b5061024160085481565b348015610667575f80fd5b50610292610676366004611c44565b61165a565b348015610686575f80fd5b50610292610695366004611c44565b61170e565b5f80600354836106aa9190611c71565b90505f6002546106b8610d6c565b6106c29190611c71565b9050806001816106f27f000000000000000000000000000000000000000000000000000000000000000086611c71565b6106fc9190611c88565b6107069190611c9b565b6107109190611cae565b949350505050565b610720611748565b6005805460ff1916821515179055604051651c185d5cd95960d21b815260060160405180910390205f80516020611d9183398151915282610761575f610764565b60015b6040805160ff90921682525f6020830152015b60405180910390a250565b61078a611748565b600e5460ff16156107ce5760405162461bcd60e51b8152602060048201526009602482015268199a5b985b1a5e995960ba1b60448201526064015b60405180910390fd5b81811161080a5760405162461bcd60e51b815260206004820152600a6024820152696261642077696e646f7760b01b60448201526064016107c5565b600480546040516370a0823160e01b81523092810192909252906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610873573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108979190611ccd565b10156108d05760405162461bcd60e51b81526020600482015260086024820152671d5b999d5b99195960c21b60448201526064016107c5565b5f6108d9610d6c565b116109165760405162461bcd60e51b815260206004820152600d60248201526c66656564206e6f74206c69766560981b60448201526064016107c5565b600c829055600d81905560408051838152602081018390527fda7c0ad4276fe529858f6543ebf8e74c90a43ad4813bcad166c926096d07d855910160405180910390a15050565b610965611748565b600980546001600160a01b0319166001600160a01b038416179055600a8190556040516c1cd95c5d595b98d95c91995959609a1b8152600d01604080519182900382206001600160a01b038516835260208301849052915f80516020611d91833981519152910160405180910390a25050565b6109e0611748565b600b54811015610a1f5760405162461bcd60e51b815260206004820152600a60248201526918995b1bddc81cdbdb1960b21b60448201526064016107c5565b600b54610a2c9082611c9b565b6040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610a8e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ab29190611ccd565b1015610aeb5760405162461bcd60e51b81526020600482015260086024820152671d5b999d5b99195960c21b60448201526064016107c5565b60048190556040516930b63637b1b0ba34b7b760b11b8152600a015b604080519182900382208383525f6020840152915f80516020611d918339815191529101610777565b610b38611774565b600e5460ff1615610b7f5760405162461bcd60e51b8152602060048201526011602482015270185b1c9958591e48199a5b985b1a5e9959607a1b60448201526064016107c5565b600d5415801590610b925750600d544210155b610bce5760405162461bcd60e51b815260206004820152600d60248201526c39b0b632903737ba1037bb32b960991b60448201526064016107c5565b5f546001600160a01b03163314610c325762093a80600d54610bf09190611c88565b421015610c325760405162461bcd60e51b815260206004820152601060248201526f19dc9858d9481b9bdd081c185cdcd95960821b60448201526064016107c5565b600e805460ff191660011790556040516370a0823160e01b81523060048201525f906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610ca3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cc79190611ccd565b90508015610d0e57600554610d0e906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116916101009004168361179e565b600b5460408051918252602082018390527fb968440accd1ce5fa60b00de8bb8d8487eb2fda3c3701fb30fea3f69aa910a48910160405180910390a150610d5460018055565b565b5f600b54600454610d679190611c9b565b905090565b5f610d756117f0565b5f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015610dd3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610df79190611cfd565b509350509250505f8213610e3f5760405162461bcd60e51b815260206004820152600f60248201526e3130b2103332b2b21030b739bbb2b960891b60448201526064016107c5565b805f03610e815760405162461bcd60e51b815260206004820152601060248201526f1a5b98dbdb5c1b195d19481c9bdd5b9960821b60448201526064016107c5565b600654610e8e8242611c9b565b1115610ec95760405162461bcd60e51b815260206004820152600a6024820152691cdd185b19481999595960b21b60448201526064016107c5565b815f610ef57f000000000000000000000000000000000000000000000000000000000000000083611cae565b90506007548110158015610f0b57506008548111155b610f4b5760405162461bcd60e51b81526020600482015260116024820152701c1c9a58d9481bdd5d081bd98818985b99607a1b60448201526064016107c5565b509392505050565b610f5b611748565b610d545f61195e565b610f6c611748565b5f8111610fa75760405162461bcd60e51b81526020600482015260096024820152681e995c9bc818dbdcdd60ba1b60448201526064016107c5565b6003819055604051671b5a5b9d10dbdcdd60c21b8152600801610b07565b610fcd611748565b5f81116110095760405162461bcd60e51b815260206004820152600a6024820152697a65726f20707269636560b01b60448201526064016107c5565b60028190556040516b1d1bdad95b9cd4195c955cd960a21b8152600c01610b07565b5f600c545f141580156110405750600c544210155b801561104d5750600d5442105b801561105c5750600e5460ff16155b801561106b575060055460ff16155b8015610d67575050600454600b541090565b611085611774565b61108d61102b565b6110c95760405162461bcd60e51b815260206004820152600d60248201526c73616c65206e6f74206c69766560981b60448201526064016107c5565b600f5434101561110b5760405162461bcd60e51b815260206004820152600d60248201526c62656c6f77206d696e696d756d60981b60448201526064016107c5565b5f611114610d6c565b90505f7f000000000000000000000000000000000000000000000000000000000000000060025483346111479190611c71565b6111519190611c71565b61115b9190611cae565b90505f81116111975760405162461bcd60e51b81526020600482015260086024820152671e995c9bc81bdd5d60c21b60448201526064016107c5565b600b5460045434915f916111ab9190611c9b565b9050808311156111d057826111c08284611c71565b6111ca9190611cae565b91508092505b8483101561120f5760405162461bcd60e51b815260206004820152600c60248201526b18995b1bddc81b5a5b93dd5d60a21b60448201526064016107c5565b5f821161124b5760405162461bcd60e51b815260206004820152600a6024820152691e995c9bc81cdc195b9960b21b60448201526064016107c5565b82600b5f82825461125c9190611c88565b9091555061129690506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016338561179e565b6005546040515f9161010090046001600160a01b03169084908381818185875af1925050503d805f81146112e5576040519150601f19603f3d011682016040523d82523d5f602084013e6112ea565b606091505b505090508061133b5760405162461bcd60e51b815260206004820152601860248201527f7472656173757279207472616e73666572206661696c6564000000000000000060448201526064016107c5565b5f6113468434611c9b565b9050801561140a576040515f90339083908381818185875af1925050503d805f811461138d576040519150601f19603f3d011682016040523d82523d5f602084013e611392565b606091505b50509050806113d35760405162461bcd60e51b815260206004820152600d60248201526c1c99599d5b990819985a5b1959609a1b60448201526064016107c5565b60405182815233907fd7dee2702d63ad89917b6a4da9981c90c4d24f8c2bdfd64c604ecae57d8d06519060200160405180910390a2505b604080518581526020810187905290810187905233907f2bdd59583c8e5cc64165e86af2482dbe93e85c98b355b788aa592465b3f6920e9060600160405180910390a250505050505061145c60018055565b50565b611467611748565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316036114d45760405162461bcd60e51b81526020600482015260096024820152681b9bdd081adc9a5b1b60ba1b60448201526064016107c5565b6001600160a01b0382166115145760405162461bcd60e51b81526020600482015260076024820152667a65726f20746f60c81b60448201526064016107c5565b6115286001600160a01b038416838361179e565b505050565b611535611748565b600f8190556040516a6d696e507572636861736560a81b8152600b01610b07565b61155e611748565b5f8311801561156c57505f82115b801561157757508181115b6115b45760405162461bcd60e51b815260206004820152600e60248201526d6261642067756172647261696c7360901b60448201526064016107c5565b60068390556007829055600881905560408051848152602081018490529081018290527fb2178208e782439ed3c99e40b7bda885a5747c00ed82066001f65ad8ae0b98359060600160405180910390a1505050565b5f7f0000000000000000000000000000000000000000000000000000000000000000600254611636610d6c565b6116409085611c71565b61164a9190611c71565b6116549190611cae565b92915050565b611662611748565b6001600160a01b0381166116a85760405162461bcd60e51b815260206004820152600d60248201526c7a65726f20747265617375727960981b60448201526064016107c5565b60058054610100600160a81b0319166101006001600160a01b0384160217905560405167747265617375727960c01b8152600801604080519182900382206001600160a01b03841683525f6020840152915f80516020611d918339815191529101610777565b611716611748565b6001600160a01b03811661173f57604051631e4fbdf760e01b81525f60048201526024016107c5565b61145c8161195e565b5f546001600160a01b03163314610d545760405163118cdaa760e01b81523360048201526024016107c5565b60026001540361179757604051633ee5aeb560e01b815260040160405180910390fd5b6002600155565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526115289084906119ad565b6009546001600160a01b031661180257565b5f8060095f9054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015611854573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118789190611cfd565b50509250925050815f146118bf5760405162461bcd60e51b815260206004820152600e60248201526d39b2b8bab2b731b2b9103237bbb760911b60448201526064016107c5565b805f0361190e5760405162461bcd60e51b815260206004820152601a60248201527f696e636f6d706c6574652073657175656e63657220726f756e6400000000000060448201526064016107c5565b600a5461191b8242611c9b565b1161195a5760405162461bcd60e51b815260206004820152600f60248201526e73657175656e63657220677261636560881b60448201526064016107c5565b5050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6119c16001600160a01b03841683611a0e565b905080515f141580156119e55750808060200190518101906119e39190611d49565b155b1561152857604051635274afe760e01b81526001600160a01b03841660048201526024016107c5565b6060611a1b83835f611a22565b9392505050565b606081471015611a475760405163cd78605960e01b81523060048201526024016107c5565b5f80856001600160a01b03168486604051611a629190611d64565b5f6040518083038185875af1925050503d805f8114611a9c576040519150601f19603f3d011682016040523d82523d5f602084013e611aa1565b606091505b5091509150611ab1868383611abb565b9695505050505050565b606082611ad057611acb82611b17565b611a1b565b8151158015611ae757506001600160a01b0384163b155b15611b1057604051639996b31560e01b81526001600160a01b03851660048201526024016107c5565b5080611a1b565b805115611b275780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f60208284031215611b50575f80fd5b5035919050565b801515811461145c575f80fd5b5f60208284031215611b74575f80fd5b8135611a1b81611b57565b5f8060408385031215611b90575f80fd5b50508035926020909101359150565b80356001600160a01b0381168114611bb5575f80fd5b919050565b5f8060408385031215611bcb575f80fd5b611bd483611b9f565b946020939093013593505050565b5f805f60608486031215611bf4575f80fd5b611bfd84611b9f565b9250611c0b60208501611b9f565b9150604084013590509250925092565b5f805f60608486031215611c2d575f80fd5b505081359360208301359350604090920135919050565b5f60208284031215611c54575f80fd5b611a1b82611b9f565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761165457611654611c5d565b8082018082111561165457611654611c5d565b8181038181111561165457611654611c5d565b5f82611cc857634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215611cdd575f80fd5b5051919050565b805169ffffffffffffffffffff81168114611bb5575f80fd5b5f805f805f60a08688031215611d11575f80fd5b611d1a86611ce4565b9450602086015193506040860151925060608601519150611d3d60808701611ce4565b90509295509295909350565b5f60208284031215611d59575f80fd5b8151611a1b81611b57565b5f82515f5b81811015611d835760208186018101518583015201611d69565b505f92019182525091905056fec194909a05d344d541a4418f8a1afcb8c4a13f35e87d3faf2b4d1f736a2f00b6a264697066735822122064505771fab3d13499524b0b9dae9694f51ceb4c39e64bcf3c52648d3ca89c5a64736f6c634300081800330000000000000000000000004adfcdf294d8603b3886c880e48b54bbb55b5c8500000000000000000000000078f3556b67e17df817d51ef5a990cdaf09e8d3a9000000000000000000000000cfa7ffd40b19907aed0a1e235f485b747673f4030000000000000000000000000000000000000000002116545850052128000000
0x608060405260043610610228575f3560e01c8063715018a611610129578063b944a663116100a8578063eb641a291161006d578063eb641a2914610609578063ed1bd76c14610628578063efe3688b14610647578063f0f442601461065c578063f2fde38b1461067b575f80fd5b8063b944a6631461058e578063bdb4b848146105a3578063d96a094a146105b8578063e5711e8b146105cb578063e8307d00146105ea575f80fd5b806388a17bde116100ee57806388a17bde146105115780638da5cb5b14610526578063b11fdd2514610542578063b3f05b9714610561578063b8f7a6651461057a575f80fd5b8063715018a614610481578063744716fe1461049557806378e97925146104aa5780638009b7bd146104bf5780638545f4ea146104f2575f80fd5b806337dd150f116101b55780635a9602161161017a5780635a960216146103d85780635c975abb146103ec57806361d027b31461041557806369e7c3d7146104395780636f6f6da31461044e575f80fd5b806337dd150f1461033057806337ea9348146103465780633b521cb6146103915780634bb278f3146103b057806355234ec0146103c4575f80fd5b80631dabe830116101fb5780631dabe830146102b357806326a97b94146102d25780632bd8d552146102e75780633197cbb61461030657806333b5b62e1461031b575f80fd5b806302c7e7af1461022c5780630d9efca71461025457806316c38b3c146102735780631d9b1d6f14610294575b5f80fd5b348015610237575f80fd5b50610241600b5481565b6040519081526020015b60405180910390f35b34801561025f575f80fd5b5061024161026e366004611b40565b61069a565b34801561027e575f80fd5b5061029261028d366004611b64565b610718565b005b34801561029f575f80fd5b506102926102ae366004611b7f565b610782565b3480156102be575f80fd5b506102926102cd366004611bba565b61095d565b3480156102dd575f80fd5b50610241600a5481565b3480156102f2575f80fd5b50610292610301366004611b40565b6109d8565b348015610311575f80fd5b50610241600d5481565b348015610326575f80fd5b50610241600f5481565b34801561033b575f80fd5b5061024162093a8081565b348015610351575f80fd5b506103797f0000000000000000000000004adfcdf294d8603b3886c880e48b54bbb55b5c8581565b6040516001600160a01b03909116815260200161024b565b34801561039c575f80fd5b50600954610379906001600160a01b031681565b3480156103bb575f80fd5b50610292610b30565b3480156103cf575f80fd5b50610241610d56565b3480156103e3575f80fd5b50610241610d6c565b3480156103f7575f80fd5b506005546104059060ff1681565b604051901515815260200161024b565b348015610420575f80fd5b506005546103799061010090046001600160a01b031681565b348015610444575f80fd5b5061024160065481565b348015610459575f80fd5b506102417f0000000000000000000000000000000000000000000000000000000005f5e10081565b34801561048c575f80fd5b50610292610f53565b3480156104a0575f80fd5b5061024160075481565b3480156104b5575f80fd5b50610241600c5481565b3480156104ca575f80fd5b506103797f00000000000000000000000078f3556b67e17df817d51ef5a990cdaf09e8d3a981565b3480156104fd575f80fd5b5061029261050c366004611b40565b610f64565b34801561051c575f80fd5b5061024160045481565b348015610531575f80fd5b505f546001600160a01b0316610379565b34801561054d575f80fd5b5061029261055c366004611b40565b610fc5565b34801561056c575f80fd5b50600e546104059060ff1681565b348015610585575f80fd5b5061040561102b565b348015610599575f80fd5b5061024160025481565b3480156105ae575f80fd5b5061024160035481565b6102926105c6366004611b40565b61107d565b3480156105d6575f80fd5b506102926105e5366004611be2565b61145f565b3480156105f5575f80fd5b50610292610604366004611b40565b61152d565b348015610614575f80fd5b50610292610623366004611c1b565b611556565b348015610633575f80fd5b50610241610642366004611b40565b611609565b348015610652575f80fd5b5061024160085481565b348015610667575f80fd5b50610292610676366004611c44565b61165a565b348015610686575f80fd5b50610292610695366004611c44565b61170e565b5f80600354836106aa9190611c71565b90505f6002546106b8610d6c565b6106c29190611c71565b9050806001816106f27f0000000000000000000000000000000000000000000000000000000005f5e10086611c71565b6106fc9190611c88565b6107069190611c9b565b6107109190611cae565b949350505050565b610720611748565b6005805460ff1916821515179055604051651c185d5cd95960d21b815260060160405180910390205f80516020611d9183398151915282610761575f610764565b60015b6040805160ff90921682525f6020830152015b60405180910390a250565b61078a611748565b600e5460ff16156107ce5760405162461bcd60e51b8152602060048201526009602482015268199a5b985b1a5e995960ba1b60448201526064015b60405180910390fd5b81811161080a5760405162461bcd60e51b815260206004820152600a6024820152696261642077696e646f7760b01b60448201526064016107c5565b600480546040516370a0823160e01b81523092810192909252906001600160a01b037f0000000000000000000000004adfcdf294d8603b3886c880e48b54bbb55b5c8516906370a0823190602401602060405180830381865afa158015610873573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108979190611ccd565b10156108d05760405162461bcd60e51b81526020600482015260086024820152671d5b999d5b99195960c21b60448201526064016107c5565b5f6108d9610d6c565b116109165760405162461bcd60e51b815260206004820152600d60248201526c66656564206e6f74206c69766560981b60448201526064016107c5565b600c829055600d81905560408051838152602081018390527fda7c0ad4276fe529858f6543ebf8e74c90a43ad4813bcad166c926096d07d855910160405180910390a15050565b610965611748565b600980546001600160a01b0319166001600160a01b038416179055600a8190556040516c1cd95c5d595b98d95c91995959609a1b8152600d01604080519182900382206001600160a01b038516835260208301849052915f80516020611d91833981519152910160405180910390a25050565b6109e0611748565b600b54811015610a1f5760405162461bcd60e51b815260206004820152600a60248201526918995b1bddc81cdbdb1960b21b60448201526064016107c5565b600b54610a2c9082611c9b565b6040516370a0823160e01b81523060048201527f0000000000000000000000004adfcdf294d8603b3886c880e48b54bbb55b5c856001600160a01b0316906370a0823190602401602060405180830381865afa158015610a8e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ab29190611ccd565b1015610aeb5760405162461bcd60e51b81526020600482015260086024820152671d5b999d5b99195960c21b60448201526064016107c5565b60048190556040516930b63637b1b0ba34b7b760b11b8152600a015b604080519182900382208383525f6020840152915f80516020611d918339815191529101610777565b610b38611774565b600e5460ff1615610b7f5760405162461bcd60e51b8152602060048201526011602482015270185b1c9958591e48199a5b985b1a5e9959607a1b60448201526064016107c5565b600d5415801590610b925750600d544210155b610bce5760405162461bcd60e51b815260206004820152600d60248201526c39b0b632903737ba1037bb32b960991b60448201526064016107c5565b5f546001600160a01b03163314610c325762093a80600d54610bf09190611c88565b421015610c325760405162461bcd60e51b815260206004820152601060248201526f19dc9858d9481b9bdd081c185cdcd95960821b60448201526064016107c5565b600e805460ff191660011790556040516370a0823160e01b81523060048201525f906001600160a01b037f0000000000000000000000004adfcdf294d8603b3886c880e48b54bbb55b5c8516906370a0823190602401602060405180830381865afa158015610ca3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cc79190611ccd565b90508015610d0e57600554610d0e906001600160a01b037f0000000000000000000000004adfcdf294d8603b3886c880e48b54bbb55b5c858116916101009004168361179e565b600b5460408051918252602082018390527fb968440accd1ce5fa60b00de8bb8d8487eb2fda3c3701fb30fea3f69aa910a48910160405180910390a150610d5460018055565b565b5f600b54600454610d679190611c9b565b905090565b5f610d756117f0565b5f807f00000000000000000000000078f3556b67e17df817d51ef5a990cdaf09e8d3a96001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015610dd3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610df79190611cfd565b509350509250505f8213610e3f5760405162461bcd60e51b815260206004820152600f60248201526e3130b2103332b2b21030b739bbb2b960891b60448201526064016107c5565b805f03610e815760405162461bcd60e51b815260206004820152601060248201526f1a5b98dbdb5c1b195d19481c9bdd5b9960821b60448201526064016107c5565b600654610e8e8242611c9b565b1115610ec95760405162461bcd60e51b815260206004820152600a6024820152691cdd185b19481999595960b21b60448201526064016107c5565b815f610ef57f0000000000000000000000000000000000000000000000000000000005f5e10083611cae565b90506007548110158015610f0b57506008548111155b610f4b5760405162461bcd60e51b81526020600482015260116024820152701c1c9a58d9481bdd5d081bd98818985b99607a1b60448201526064016107c5565b509392505050565b610f5b611748565b610d545f61195e565b610f6c611748565b5f8111610fa75760405162461bcd60e51b81526020600482015260096024820152681e995c9bc818dbdcdd60ba1b60448201526064016107c5565b6003819055604051671b5a5b9d10dbdcdd60c21b8152600801610b07565b610fcd611748565b5f81116110095760405162461bcd60e51b815260206004820152600a6024820152697a65726f20707269636560b01b60448201526064016107c5565b60028190556040516b1d1bdad95b9cd4195c955cd960a21b8152600c01610b07565b5f600c545f141580156110405750600c544210155b801561104d5750600d5442105b801561105c5750600e5460ff16155b801561106b575060055460ff16155b8015610d67575050600454600b541090565b611085611774565b61108d61102b565b6110c95760405162461bcd60e51b815260206004820152600d60248201526c73616c65206e6f74206c69766560981b60448201526064016107c5565b600f5434101561110b5760405162461bcd60e51b815260206004820152600d60248201526c62656c6f77206d696e696d756d60981b60448201526064016107c5565b5f611114610d6c565b90505f7f0000000000000000000000000000000000000000000000000000000005f5e10060025483346111479190611c71565b6111519190611c71565b61115b9190611cae565b90505f81116111975760405162461bcd60e51b81526020600482015260086024820152671e995c9bc81bdd5d60c21b60448201526064016107c5565b600b5460045434915f916111ab9190611c9b565b9050808311156111d057826111c08284611c71565b6111ca9190611cae565b91508092505b8483101561120f5760405162461bcd60e51b815260206004820152600c60248201526b18995b1bddc81b5a5b93dd5d60a21b60448201526064016107c5565b5f821161124b5760405162461bcd60e51b815260206004820152600a6024820152691e995c9bc81cdc195b9960b21b60448201526064016107c5565b82600b5f82825461125c9190611c88565b9091555061129690506001600160a01b037f0000000000000000000000004adfcdf294d8603b3886c880e48b54bbb55b5c8516338561179e565b6005546040515f9161010090046001600160a01b03169084908381818185875af1925050503d805f81146112e5576040519150601f19603f3d011682016040523d82523d5f602084013e6112ea565b606091505b505090508061133b5760405162461bcd60e51b815260206004820152601860248201527f7472656173757279207472616e73666572206661696c6564000000000000000060448201526064016107c5565b5f6113468434611c9b565b9050801561140a576040515f90339083908381818185875af1925050503d805f811461138d576040519150601f19603f3d011682016040523d82523d5f602084013e611392565b606091505b50509050806113d35760405162461bcd60e51b815260206004820152600d60248201526c1c99599d5b990819985a5b1959609a1b60448201526064016107c5565b60405182815233907fd7dee2702d63ad89917b6a4da9981c90c4d24f8c2bdfd64c604ecae57d8d06519060200160405180910390a2505b604080518581526020810187905290810187905233907f2bdd59583c8e5cc64165e86af2482dbe93e85c98b355b788aa592465b3f6920e9060600160405180910390a250505050505061145c60018055565b50565b611467611748565b7f0000000000000000000000004adfcdf294d8603b3886c880e48b54bbb55b5c856001600160a01b0316836001600160a01b0316036114d45760405162461bcd60e51b81526020600482015260096024820152681b9bdd081adc9a5b1b60ba1b60448201526064016107c5565b6001600160a01b0382166115145760405162461bcd60e51b81526020600482015260076024820152667a65726f20746f60c81b60448201526064016107c5565b6115286001600160a01b038416838361179e565b505050565b611535611748565b600f8190556040516a6d696e507572636861736560a81b8152600b01610b07565b61155e611748565b5f8311801561156c57505f82115b801561157757508181115b6115b45760405162461bcd60e51b815260206004820152600e60248201526d6261642067756172647261696c7360901b60448201526064016107c5565b60068390556007829055600881905560408051848152602081018490529081018290527fb2178208e782439ed3c99e40b7bda885a5747c00ed82066001f65ad8ae0b98359060600160405180910390a1505050565b5f7f0000000000000000000000000000000000000000000000000000000005f5e100600254611636610d6c565b6116409085611c71565b61164a9190611c71565b6116549190611cae565b92915050565b611662611748565b6001600160a01b0381166116a85760405162461bcd60e51b815260206004820152600d60248201526c7a65726f20747265617375727960981b60448201526064016107c5565b60058054610100600160a81b0319166101006001600160a01b0384160217905560405167747265617375727960c01b8152600801604080519182900382206001600160a01b03841683525f6020840152915f80516020611d918339815191529101610777565b611716611748565b6001600160a01b03811661173f57604051631e4fbdf760e01b81525f60048201526024016107c5565b61145c8161195e565b5f546001600160a01b03163314610d545760405163118cdaa760e01b81523360048201526024016107c5565b60026001540361179757604051633ee5aeb560e01b815260040160405180910390fd5b6002600155565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526115289084906119ad565b6009546001600160a01b031661180257565b5f8060095f9054906101000a90046001600160a01b03166001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015611854573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118789190611cfd565b50509250925050815f146118bf5760405162461bcd60e51b815260206004820152600e60248201526d39b2b8bab2b731b2b9103237bbb760911b60448201526064016107c5565b805f0361190e5760405162461bcd60e51b815260206004820152601a60248201527f696e636f6d706c6574652073657175656e63657220726f756e6400000000000060448201526064016107c5565b600a5461191b8242611c9b565b1161195a5760405162461bcd60e51b815260206004820152600f60248201526e73657175656e63657220677261636560881b60448201526064016107c5565b5050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6119c16001600160a01b03841683611a0e565b905080515f141580156119e55750808060200190518101906119e39190611d49565b155b1561152857604051635274afe760e01b81526001600160a01b03841660048201526024016107c5565b6060611a1b83835f611a22565b9392505050565b606081471015611a475760405163cd78605960e01b81523060048201526024016107c5565b5f80856001600160a01b03168486604051611a629190611d64565b5f6040518083038185875af1925050503d805f8114611a9c576040519150601f19603f3d011682016040523d82523d5f602084013e611aa1565b606091505b5091509150611ab1868383611abb565b9695505050505050565b606082611ad057611acb82611b17565b611a1b565b8151158015611ae757506001600160a01b0384163b155b15611b1057604051639996b31560e01b81526001600160a01b03851660048201526024016107c5565b5080611a1b565b805115611b275780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f60208284031215611b50575f80fd5b5035919050565b801515811461145c575f80fd5b5f60208284031215611b74575f80fd5b8135611a1b81611b57565b5f8060408385031215611b90575f80fd5b50508035926020909101359150565b80356001600160a01b0381168114611bb5575f80fd5b919050565b5f8060408385031215611bcb575f80fd5b611bd483611b9f565b946020939093013593505050565b5f805f60608486031215611bf4575f80fd5b611bfd84611b9f565b9250611c0b60208501611b9f565b9150604084013590509250925092565b5f805f60608486031215611c2d575f80fd5b505081359360208301359350604090920135919050565b5f60208284031215611c54575f80fd5b611a1b82611b9f565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761165457611654611c5d565b8082018082111561165457611654611c5d565b8181038181111561165457611654611c5d565b5f82611cc857634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215611cdd575f80fd5b5051919050565b805169ffffffffffffffffffff81168114611bb5575f80fd5b5f805f805f60a08688031215611d11575f80fd5b611d1a86611ce4565b9450602086015193506040860151925060608601519150611d3d60808701611ce4565b90509295509295909350565b5f60208284031215611d59575f80fd5b8151611a1b81611b57565b5f82515f5b81811015611d835760208186018101518583015201611d69565b505f92019182525091905056fec194909a05d344d541a4418f8a1afcb8c4a13f35e87d3faf2b4d1f736a2f00b6a264697066735822122064505771fab3d13499524b0b9dae9694f51ceb4c39e64bcf3c52648d3ca89c5a64736f6c63430008180033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| 0x4adf…5c85 | — | 40,000,000 | — | — |
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| no internal transactions found for this address yet (traced blocks + on-demand) | ||||||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0xe7b8e1…9f4d55 | 19 hrs agoMon, 17 Aug 2026 14:06:11 UTC | 0xda7c0a…d855 | data: 0x000000000000000000…6aaab04a |
| 0xba57ea…136163 | 19 hrs agoMon, 17 Aug 2026 14:06:07 UTC | 0xb21782…9835 | data: 0x000000000000000000…000186a0 |
| 0x54868e…a1f1bf | 19 hrs agoMon, 17 Aug 2026 14:05:54 UTC | 0x8be007…57e0 | [0] 0x000000000000…00000000 [1] 0x000000000000…7673f403 |
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x48430a1a…6dc145 | Transfer | 38,895,074 | 19 hrs agoMon, 17 Aug 2026 14:06:01 UTC | 0xcfa7…f403 | IN | 0xc6dd…ff14 | 40,000,000.000000 | 0x4adf…5c85 |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xe7b8e1…9f4d55 | schedule | 38,895,176 | 19 hrs agoMon, 17 Aug 2026 14:06:11 UTC | 0xcfa7…f403 | IN | WhaleFloor | $0.000 ETH | 0.00000211 | |
| 0xba57ea…136163 | setGuardrails | 38,895,138 | 19 hrs agoMon, 17 Aug 2026 14:06:07 UTC | 0xcfa7…f403 | IN | WhaleFloor | $0.000 ETH | 0.00000071 |