// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
interface IERC20 {
function transfer(address to, uint256 amount) external returns (bool);
function transferFrom(address from, address to, uint256 amount) external returns (bool);
function balanceOf(address account) external view returns (uint256);
}
interface AggregatorV3Interface {
function latestRoundData()
external
view
returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);
function decimals() external view returns (uint8);
}
/// @title CitiusPool — parimutuel Up/Down prediction rounds collateralized in USDG
/// @notice PancakeSwap-Prediction-style rolling rounds resolved against a Chainlink push feed.
/// Round N accepts bets for `interval` seconds, then runs live for `interval` seconds:
/// start ──bets──> lock (openPrice) ──live──> close (closePrice) → resolve
/// Rule (Limitless): closePrice >= openPrice → UP wins, else DOWN wins.
/// Fees are taken from the LOSING pool only. If the oracle has not produced a fresh
/// update between lock and close, the round is cancelled and stakes are refundable —
/// this makes short rounds safe on deviation-based push feeds.
contract CitiusPool {
// ---------------------------------------------------------------- types
enum Position {
Up,
Down
}
struct Round {
uint64 startTimestamp;
uint64 lockTimestamp;
uint64 closeTimestamp;
int256 openPrice;
int256 closePrice;
uint80 openOracleRoundId;
uint256 openOracleUpdatedAt;
uint128 upAmount;
uint128 downAmount;
uint128 rewardBaseCalAmount; // winning pool at resolution
uint128 rewardAmount; // winning pool + net losing pool
bool locked;
bool resolved;
bool cancelled;
}
struct BetInfo {
Position position;
uint128 amount;
bool claimed;
}
// ---------------------------------------------------------------- state
IERC20 public immutable usdg;
AggregatorV3Interface public immutable oracle;
/// @dev betting window == live window == interval
uint64 public immutable interval;
address public owner;
address public treasury;
address public keeper;
/// @dev fee on the losing pool, in basis points (300 = 3%)
uint16 public feeBps;
uint16 public constant MAX_FEE_BPS = 500;
/// @dev max age of the oracle answer at lock time
uint256 public maxOracleDelay = 6 hours;
uint256 public minBet;
uint256 public currentEpoch; // 0 = not started
bool public paused;
uint256 public treasuryOwed; // accrued fees claimable by treasury
mapping(uint256 => Round) public rounds;
mapping(uint256 => mapping(address => BetInfo)) public ledger;
// ---------------------------------------------------------------- events
event BetPlaced(address indexed user, uint256 indexed epoch, Position position, uint256 amount);
event RoundStarted(uint256 indexed epoch, uint64 startTimestamp);
event RoundLocked(uint256 indexed epoch, int256 openPrice, uint80 oracleRoundId);
event RoundResolved(uint256 indexed epoch, int256 closePrice, Position winner, uint256 rewardAmount);
event RoundCancelled(uint256 indexed epoch, string reason);
event Claimed(address indexed user, uint256 indexed epoch, uint256 amount);
event TreasuryClaimed(uint256 amount);
// ---------------------------------------------------------------- errors
error NotOwner();
error NotKeeper();
error Paused();
error BettingClosed();
error AlreadyBet();
error BelowMinBet();
error NothingToClaim();
error TooEarly();
error NotStarted();
error TransferFailed();
error Reentrancy();
// ---------------------------------------------------------------- modifiers
uint256 private _lock = 1;
modifier nonReentrant() {
if (_lock != 1) revert Reentrancy();
_lock = 2;
_;
_lock = 1;
}
modifier onlyOwner() {
if (msg.sender != owner) revert NotOwner();
_;
}
modifier onlyKeeper() {
if (msg.sender != keeper && msg.sender != owner) revert NotKeeper();
_;
}
modifier whenNotPaused() {
if (paused) revert Paused();
_;
}
// ---------------------------------------------------------------- setup
constructor(
IERC20 _usdg,
AggregatorV3Interface _oracle,
uint64 _interval,
uint16 _feeBps,
uint256 _minBet,
address _treasury
) {
require(_feeBps <= MAX_FEE_BPS, "fee too high");
require(_interval >= 30, "interval too short");
usdg = _usdg;
oracle = _oracle;
interval = _interval;
feeBps = _feeBps;
minBet = _minBet;
treasury = _treasury;
owner = msg.sender;
keeper = msg.sender;
}
/// @notice Opens the first betting round. Callable once.
function genesisStart() external onlyKeeper whenNotPaused {
require(currentEpoch == 0, "already started");
currentEpoch = 1;
_startRound(1);
}
// ---------------------------------------------------------------- betting
function betUp(uint256 epoch, uint256 amount) external {
_bet(epoch, amount, Position.Up);
}
function betDown(uint256 epoch, uint256 amount) external {
_bet(epoch, amount, Position.Down);
}
function _bet(uint256 epoch, uint256 amount, Position position) internal nonReentrant whenNotPaused {
if (currentEpoch == 0) revert NotStarted();
if (epoch != currentEpoch) revert BettingClosed();
Round storage r = rounds[epoch];
if (block.timestamp >= r.lockTimestamp || r.locked) revert BettingClosed();
if (amount < minBet) revert BelowMinBet();
if (ledger[epoch][msg.sender].amount != 0) revert AlreadyBet();
if (!usdg.transferFrom(msg.sender, address(this), amount)) revert TransferFailed();
if (position == Position.Up) {
r.upAmount += uint128(amount);
} else {
r.downAmount += uint128(amount);
}
ledger[epoch][msg.sender] = BetInfo({position: position, amount: uint128(amount), claimed: false});
emit BetPlaced(msg.sender, epoch, position, amount);
}
// ---------------------------------------------------------------- keeper
/// @notice Advances the machine: locks the current round, resolves the previous one,
/// and opens the next betting round. Called once per interval.
function executeRound() external onlyKeeper whenNotPaused nonReentrant {
if (currentEpoch == 0) revert NotStarted();
uint256 lockEpoch = currentEpoch;
Round storage toLock = rounds[lockEpoch];
if (block.timestamp < toLock.lockTimestamp) revert TooEarly();
// 1. lock current round at openPrice
_lockRound(lockEpoch);
// 2. resolve previous round (if any and it was locked, not yet resolved)
if (lockEpoch > 1) {
uint256 prevEpoch = lockEpoch - 1;
Round storage prev = rounds[prevEpoch];
if (prev.locked && !prev.resolved && !prev.cancelled) {
_resolveRound(prevEpoch);
}
}
// 3. open next betting round
currentEpoch = lockEpoch + 1;
_startRound(currentEpoch);
}
function _startRound(uint256 epoch) internal {
Round storage r = rounds[epoch];
r.startTimestamp = uint64(block.timestamp);
r.lockTimestamp = uint64(block.timestamp) + interval;
r.closeTimestamp = uint64(block.timestamp) + 2 * interval;
emit RoundStarted(epoch, r.startTimestamp);
}
function _lockRound(uint256 epoch) internal {
Round storage r = rounds[epoch];
// one-sided pools can never pay out — cancel before the live phase
if (r.upAmount == 0 || r.downAmount == 0) {
r.cancelled = true;
r.locked = true;
emit RoundCancelled(epoch, "one-sided pool");
return;
}
(uint80 roundId, int256 answer,, uint256 updatedAt,) = oracle.latestRoundData();
if (answer <= 0 || updatedAt == 0 || block.timestamp - updatedAt > maxOracleDelay) {
r.cancelled = true;
r.locked = true;
emit RoundCancelled(epoch, "stale oracle at lock");
return;
}
r.openPrice = answer;
r.openOracleRoundId = roundId;
r.openOracleUpdatedAt = updatedAt;
r.locked = true;
emit RoundLocked(epoch, answer, roundId);
}
function _resolveRound(uint256 epoch) internal {
Round storage r = rounds[epoch];
if (block.timestamp < r.closeTimestamp) revert TooEarly();
(uint80 roundId, int256 answer,, uint256 updatedAt,) = oracle.latestRoundData();
// Push-feed honesty guard: if the oracle produced no new data during the live
// window, an up/down outcome would be fabricated — cancel and refund instead.
if (answer <= 0 || roundId == r.openOracleRoundId || updatedAt <= r.openOracleUpdatedAt) {
r.cancelled = true;
emit RoundCancelled(epoch, "no fresh oracle data");
return;
}
r.closePrice = answer;
r.resolved = true;
Position winner = answer >= r.openPrice ? Position.Up : Position.Down;
uint128 winPool = winner == Position.Up ? r.upAmount : r.downAmount;
uint128 losePool = winner == Position.Up ? r.downAmount : r.upAmount;
uint256 fee = (uint256(losePool) * feeBps) / 10_000;
treasuryOwed += fee;
r.rewardBaseCalAmount = winPool;
r.rewardAmount = winPool + losePool - uint128(fee);
emit RoundResolved(epoch, answer, winner, r.rewardAmount);
}
/// @notice Permissionless safety valve: anyone can cancel a round stuck
/// unresolved for 5+ minutes past its close time.
function cancelStuckRound(uint256 epoch) external nonReentrant {
Round storage r = rounds[epoch];
require(r.startTimestamp != 0, "no round");
require(!r.resolved && !r.cancelled, "finalized");
require(block.timestamp > uint256(r.closeTimestamp) + 5 minutes, "not stuck");
r.cancelled = true;
emit RoundCancelled(epoch, "stuck");
}
// ---------------------------------------------------------------- claims
/// @notice Claim winnings (or refunds for cancelled rounds) for multiple epochs.
function claim(uint256[] calldata epochs) external nonReentrant {
uint256 total;
for (uint256 i = 0; i < epochs.length; i++) {
uint256 epoch = epochs[i];
Round storage r = rounds[epoch];
BetInfo storage b = ledger[epoch][msg.sender];
if (b.amount == 0 || b.claimed) continue;
uint256 payout;
if (r.cancelled) {
payout = b.amount; // full refund
} else if (r.resolved) {
Position winner = r.closePrice >= r.openPrice ? Position.Up : Position.Down;
if (b.position != winner) continue;
payout = (uint256(b.amount) * r.rewardAmount) / r.rewardBaseCalAmount;
} else {
continue; // round still live
}
b.claimed = true;
total += payout;
emit Claimed(msg.sender, epoch, payout);
}
if (total == 0) revert NothingToClaim();
if (!usdg.transfer(msg.sender, total)) revert TransferFailed();
}
function claimTreasury() external nonReentrant {
uint256 amount = treasuryOwed;
treasuryOwed = 0;
if (amount == 0) revert NothingToClaim();
if (!usdg.transfer(treasury, amount)) revert TransferFailed();
emit TreasuryClaimed(amount);
}
// ---------------------------------------------------------------- views
function claimable(uint256 epoch, address user) public view returns (uint256) {
Round storage r = rounds[epoch];
BetInfo storage b = ledger[epoch][user];
if (b.amount == 0 || b.claimed) return 0;
if (r.cancelled) return b.amount;
if (!r.resolved) return 0;
Position winner = r.closePrice >= r.openPrice ? Position.Up : Position.Down;
if (b.position != winner) return 0;
return (uint256(b.amount) * r.rewardAmount) / r.rewardBaseCalAmount;
}
// ---------------------------------------------------------------- admin
function setKeeper(address _keeper) external onlyOwner {
keeper = _keeper;
}
function setTreasury(address _treasury) external onlyOwner {
treasury = _treasury;
}
function setFeeBps(uint16 _feeBps) external onlyOwner {
require(_feeBps <= MAX_FEE_BPS, "fee too high");
feeBps = _feeBps;
}
function setMinBet(uint256 _minBet) external onlyOwner {
minBet = _minBet;
}
function setMaxOracleDelay(uint256 _delay) external onlyOwner {
maxOracleDelay = _delay;
}
function setPaused(bool _paused) external onlyOwner {
paused = _paused;
}
function transferOwnership(address _owner) external onlyOwner {
owner = _owner;
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "_usdg",
"type": "address",
"internalType": "contract IERC20"
},
{
"name": "_oracle",
"type": "address",
"internalType": "contract AggregatorV3Interface"
},
{
"name": "_interval",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "_feeBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "_minBet",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "_treasury",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"name": "AlreadyBet",
"type": "error",
"inputs": []
},
{
"name": "BelowMinBet",
"type": "error",
"inputs": []
},
{
"name": "BettingClosed",
"type": "error",
"inputs": []
},
{
"name": "NotKeeper",
"type": "error",
"inputs": []
},
{
"name": "NotOwner",
"type": "error",
"inputs": []
},
{
"name": "NotStarted",
"type": "error",
"inputs": []
},
{
"name": "NothingToClaim",
"type": "error",
"inputs": []
},
{
"name": "Paused",
"type": "error",
"inputs": []
},
{
"name": "Reentrancy",
"type": "error",
"inputs": []
},
{
"name": "TooEarly",
"type": "error",
"inputs": []
},
{
"name": "TransferFailed",
"type": "error",
"inputs": []
},
{
"name": "BetPlaced",
"type": "event",
"inputs": [
{
"name": "user",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "epoch",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "position",
"type": "uint8",
"indexed": false,
"internalType": "enum CitiusPool.Position"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Claimed",
"type": "event",
"inputs": [
{
"name": "user",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "epoch",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "RoundCancelled",
"type": "event",
"inputs": [
{
"name": "epoch",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "reason",
"type": "string",
"indexed": false,
"internalType": "string"
}
],
"anonymous": false
},
{
"name": "RoundLocked",
"type": "event",
"inputs": [
{
"name": "epoch",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "openPrice",
"type": "int256",
"indexed": false,
"internalType": "int256"
},
{
"name": "oracleRoundId",
"type": "uint80",
"indexed": false,
"internalType": "uint80"
}
],
"anonymous": false
},
{
"name": "RoundResolved",
"type": "event",
"inputs": [
{
"name": "epoch",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "closePrice",
"type": "int256",
"indexed": false,
"internalType": "int256"
},
{
"name": "winner",
"type": "uint8",
"indexed": false,
"internalType": "enum CitiusPool.Position"
},
{
"name": "rewardAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "RoundStarted",
"type": "event",
"inputs": [
{
"name": "epoch",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "startTimestamp",
"type": "uint64",
"indexed": false,
"internalType": "uint64"
}
],
"anonymous": false
},
{
"name": "TreasuryClaimed",
"type": "event",
"inputs": [
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "MAX_FEE_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "betDown",
"type": "function",
"inputs": [
{
"name": "epoch",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "betUp",
"type": "function",
"inputs": [
{
"name": "epoch",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "cancelStuckRound",
"type": "function",
"inputs": [
{
"name": "epoch",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "claim",
"type": "function",
"inputs": [
{
"name": "epochs",
"type": "uint256[]",
"internalType": "uint256[]"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "claimTreasury",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "claimable",
"type": "function",
"inputs": [
{
"name": "epoch",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "user",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "currentEpoch",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "executeRound",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "feeBps",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "genesisStart",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "interval",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint64",
"internalType": "uint64"
}
],
"stateMutability": "view"
},
{
"name": "keeper",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "ledger",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "position",
"type": "uint8",
"internalType": "enum CitiusPool.Position"
},
{
"name": "amount",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "claimed",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "maxOracleDelay",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "minBet",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "oracle",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract AggregatorV3Interface"
}
],
"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": "rounds",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "startTimestamp",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "lockTimestamp",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "closeTimestamp",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "openPrice",
"type": "int256",
"internalType": "int256"
},
{
"name": "closePrice",
"type": "int256",
"internalType": "int256"
},
{
"name": "openOracleRoundId",
"type": "uint80",
"internalType": "uint80"
},
{
"name": "openOracleUpdatedAt",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "upAmount",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "downAmount",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "rewardBaseCalAmount",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "rewardAmount",
"type": "uint128",
"internalType": "uint128"
},
{
"name": "locked",
"type": "bool",
"internalType": "bool"
},
{
"name": "resolved",
"type": "bool",
"internalType": "bool"
},
{
"name": "cancelled",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "setFeeBps",
"type": "function",
"inputs": [
{
"name": "_feeBps",
"type": "uint16",
"internalType": "uint16"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setKeeper",
"type": "function",
"inputs": [
{
"name": "_keeper",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setMaxOracleDelay",
"type": "function",
"inputs": [
{
"name": "_delay",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setMinBet",
"type": "function",
"inputs": [
{
"name": "_minBet",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setPaused",
"type": "function",
"inputs": [
{
"name": "_paused",
"type": "bool",
"internalType": "bool"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setTreasury",
"type": "function",
"inputs": [
{
"name": "_treasury",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "transferOwnership",
"type": "function",
"inputs": [
{
"name": "_owner",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "treasury",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "treasuryOwed",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "usdg",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IERC20"
}
],
"stateMutability": "view"
}
]0x60e0346101e457601f61264438819003918201601f19168301916001600160401b038311848410176101e85780849260c0946040528339810103126101e4578051906001600160a01b03821682036101e45760208101516001600160a01b03811681036101e45760408201516001600160401b038116918282036101e45760608401519461ffff8616938487036101e457608086015160a0909601516001600160a01b03811695908690036101e4576101f4906154606003556001600a55116101b057601e116101765760805260a05260c0526002549160045560018060a01b031960015416176001553360018060a01b03195f5416175f55339161ffff60a01b9060a01b169060018060b01b031916171760025560405161244790816101fd8239608051818181610191015281816103d701528181610e61015281816113380152611a5c015260a0518181816109bc01528181611e510152612118015260c05181818161080501528181610a96015261176b0152f35b60405162461bcd60e51b81526020600482015260126024820152711a5b9d195c9d985b081d1bdbc81cda1bdc9d60721b6044820152606490fd5b60405162461bcd60e51b815260206004820152600c60248201526b0cccaca40e8dede40d0d2ced60a31b6044820152606490fd5b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080806040526004361015610012575f80fd5b5f3560e01c9081623bdc74146119c557508063023b1fc9146118d757806303762bae1461170257806311c31db2146114d457806316c38b3c1461146757806324a9d8531461144357806352f1edcc146114265780635c975abb1461140457806361d027b3146113d15780636ba4c138146110cf5780637285c58b1461104b5780637380f50014610d5d578063748747e614610ce357806375c3fc1314610cc65780637667180814610ca95780637b3205f5146109e05780637dc0d1d01461099057806388ea41b9146109595780638c65c81f1461085b5780638da5cb5b14610829578063947a36fb146107e55780639619367d146107c8578063a0c7f71c1461079a578063aced166114610767578063cd3b691c14610730578063d55be8c614610714578063dfd29e4a146102d3578063f0f4426014610259578063f2fde38b146101b95763f5b91b7b14610165575f80fd5b346101b5575f6003193601126101b557602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b5f80fd5b346101b55760206003193601126101b5576101d2611b06565b73ffffffffffffffffffffffffffffffffffffffff5f541633036102315773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000005f5416175f555f80f35b7f30cd7471000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101b55760206003193601126101b557610272611b06565b73ffffffffffffffffffffffffffffffffffffffff5f541633036102315773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff000000000000000000000000000000000000000060015416176001555f80f35b346101b5576102e136611b36565b6001600a54036106ec576002600a5560ff600654166106c457600554801561069c57820361066657815f52600860205260405f2067ffffffffffffffff815460401c16421080159061068e575b61066657600454821061063e57825f52600960205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f526020526fffffffffffffffffffffffffffffffff60405f205460081c16610616576040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201528260448201526020816064815f73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af190811561060b575f916105dc575b50156105b45760056fffffffffffffffffffffffffffffffff831691016fffffffffffffffffffffffffffffffff6104428382845416611d61565b167fffffffffffffffffffffffffffffffff0000000000000000000000000000000082541617905560405161047681611b4c565b5f815260208101918252604081015f8152845f52600960205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f5260205260405f20915160028110156105875761054e937fffffffffffffffffffffffffffffff000000000000000000000000000000000060ff70ffffffffffffffffffffffffffffffff008654935160081b1693169116171782555115157fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff71ff0000000000000000000000000000000000835492151560881b169116179055565b604051905f825260208201527f1efa8a4db358fbd4b3e1004cca7c5a1bdc9de3512d3392d48a51d1961316f98360403392a36001600a55005b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b7f90b8ec18000000000000000000000000000000000000000000000000000000005f5260045ffd5b6105fe915060203d602011610604575b6105f68183611b95565b810190611bd6565b84610407565b503d6105ec565b6040513d5f823e3d90fd5b7fa820742e000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f5688ffb3000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f61c54c4a000000000000000000000000000000000000000000000000000000005f5260045ffd5b5060ff60078201541661032e565b7f6f312cbd000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f9e87fac8000000000000000000000000000000000000000000000000000000005f5260045ffd5b7fab143c06000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101b5575f6003193601126101b55760206040516101f48152f35b346101b55760206003193601126101b55773ffffffffffffffffffffffffffffffffffffffff5f5416330361023157600435600355005b346101b5575f6003193601126101b557602073ffffffffffffffffffffffffffffffffffffffff60025416604051908152f35b346101b55760406003193601126101b55760206107c06107b8611ae3565b600435611c45565b604051908152f35b346101b5575f6003193601126101b5576020600454604051908152f35b346101b5575f6003193601126101b557602060405167ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101b5575f6003193601126101b557602073ffffffffffffffffffffffffffffffffffffffff5f5416604051908152f35b346101b55760206003193601126101b5576004355f5260086020526101c060405f2060ff815491600181015490600281015469ffffffffffffffffffff600383015416600483015490600584015492600760068601549501549567ffffffffffffffff604051998181168b52818160401c1660208c015260801c1660408a01526060890152608088015260a087015260c08601526fffffffffffffffffffffffffffffffff811660e086015260801c6101008501526fffffffffffffffffffffffffffffffff811661012085015260801c6101408401528181161515610160840152818160081c16151561018084015260101c1615156101a0820152f35b346101b55760206003193601126101b55773ffffffffffffffffffffffffffffffffffffffff5f5416330361023157600480359055005b346101b5575f6003193601126101b557602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101b5575f6003193601126101b55773ffffffffffffffffffffffffffffffffffffffff6002541633141580610c88575b610c605760ff600654166106c4576001600a54036106ec576002600a55600554801561069c57805f52600860205267ffffffffffffffff60405f205460401c164210610c3857610a6181611ddc565b60018111610bb3575b60018101809111610b865780600555805f52600860205260405f2067ffffffffffffffff4216908054907f0000000000000000000000000000000000000000000000000000000000000000906fffffffffffffffff0000000000000000610ad18386611d3f565b60401b169160011b926801fffffffffffffffe67fffffffffffffffe851694168403610b8657847fffffffffffffffff00000000000000000000000000000000000000000000000077ffffffffffffffff00000000000000000000000000000000610b5f6020977f44b6249f6f45fde9b3f126e8f5a4c6f9461178adf913503196aeab4a491a27c999611d3f565b60801b1692161780931717905567ffffffffffffffff60405191165f178152a26001600a55005b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818111610b8657805f526008602052600760405f20015460ff81169081610c28575b81610c19575b50610c0a575b50610a6a565b610c13906120b3565b81610c04565b60ff915060101c161583610bfe565b905060ff8160081c161590610bf8565b7f085de625000000000000000000000000000000000000000000000000000000005f5260045ffd5b7ff512b278000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff5f5416331415610a12565b346101b5575f6003193601126101b5576020600554604051908152f35b346101b5575f6003193601126101b5576020600754604051908152f35b346101b55760206003193601126101b557610cfc611b06565b73ffffffffffffffffffffffffffffffffffffffff5f541633036102315773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff000000000000000000000000000000000000000060025416176002555f80f35b346101b557610d6b36611b36565b6001600a54036106ec576002600a5560ff600654166106c457600554801561069c57820361066657815f52600860205260405f2067ffffffffffffffff815460401c16421080159061103d575b61066657600454821061063e57825f52600960205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f526020526fffffffffffffffffffffffffffffffff60405f205460081c16610616576040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201528260448201526020816064815f73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af190811561060b575f9161101e575b50156105b457610eff60056fffffffffffffffffffffffffffffffff84169201610ebf83825460801c611d61565b6fffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffff0000000000000000000000000000000083549260801b169116179055565b604051610f0b81611b4c565b6001815260208101918252604081015f8152845f52600960205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f5260205260405f209151600281101561058757610fe4937fffffffffffffffffffffffffffffff000000000000000000000000000000000060ff70ffffffffffffffffffffffffffffffff008654935160081b1693169116171782555115157fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff71ff0000000000000000000000000000000000835492151560881b169116179055565b604051906001825260208201527f1efa8a4db358fbd4b3e1004cca7c5a1bdc9de3512d3392d48a51d1961316f98360403392a36001600a55005b611037915060203d602011610604576105f68183611b95565b84610e91565b5060ff600782015416610db8565b346101b55760406003193601126101b557611064611ae3565b6004355f52600960205273ffffffffffffffffffffffffffffffffffffffff60405f2091165f52602052606060405f205460ff604051916110a783838316611b29565b6fffffffffffffffffffffffffffffffff8160081c16602084015260881c1615156040820152f35b346101b55760206003193601126101b55760043567ffffffffffffffff81116101b557366023820112156101b55780600401359067ffffffffffffffff82116101b5573660248360051b830101116101b5576001600a54036106ec576002600a553391905f90815b838110156112f45760248160051b83010135805f52600860205260405f20815f52600960205260405f20875f5260205260405f208054916fffffffffffffffffffffffffffffffff8360081c1690811580156112e7575b6112d357600781015460ff8160101c165f14611226575050917fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff966111f292710100000000000000000000000000000000006001979695998a945b16179055611bee565b946040519081527f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a60203392a35b01611137565b60081c60ff16156112d35760028101546001820154136112e0575f5b60ff8516600282101561058757600281101561058757036112d357966111f292710100000000000000000000000000000000006112cb6001989796946fffffffffffffffffffffffffffffffff6112c360067fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff9e0154928360801c90611bfb565b911690611c0e565b998a946111e9565b5050505050600190611220565b6001611242565b5060ff8460881c1661118e565b8280156113a9576040517fa9059cbb00000000000000000000000000000000000000000000000000000000815233600482015260248101919091526020816044815f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff165af190811561060b575f9161138a575b50156105b4576001600a55005b6113a3915060203d602011610604576105f68183611b95565b8161137d565b7f969bf728000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101b5575f6003193601126101b557602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b346101b5575f6003193601126101b557602060ff600654166040519015158152f35b346101b5575f6003193601126101b5576020600354604051908152f35b346101b5575f6003193601126101b557602061ffff60025460a01c16604051908152f35b346101b55760206003193601126101b5576004358015158091036101b55773ffffffffffffffffffffffffffffffffffffffff5f541633036102315760ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00600654169116176006555f80f35b346101b55760206003193601126101b5576004356001600a54036106ec576002600a55805f52600860205260405f2080549067ffffffffffffffff8216156116a4576007019081549060ff8260081c161580611696575b156116385767ffffffffffffffff9060801c1661012c8101809111610b86574211156115da577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff6201000091161790557f9220622428c3161d3444b6fa6e4c2991f48dd359515f98b6ef7fac06f0a18ea8606060405160208152600560208201527f737475636b0000000000000000000000000000000000000000000000000000006040820152a26001600a55005b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f6e6f7420737475636b00000000000000000000000000000000000000000000006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f66696e616c697a656400000000000000000000000000000000000000000000006044820152fd5b5060ff8260101c161561152b565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f6e6f20726f756e640000000000000000000000000000000000000000000000006044820152fd5b346101b5575f6003193601126101b55773ffffffffffffffffffffffffffffffffffffffff60025416331415806118b6575b610c605760ff600654166106c45760055461185857600160055560015f52600860205260405f2067ffffffffffffffff42168154917f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffff00000000000000006117a58285611d3f565b60401b169060011b916801fffffffffffffffe67fffffffffffffffe841693168303610b8657600194847fffffffffffffffff00000000000000000000000000000000000000000000000077ffffffffffffffff000000000000000000000000000000006118366020977f44b6249f6f45fde9b3f126e8f5a4c6f9461178adf913503196aeab4a491a27c999611d3f565b60801b1692161780931717905567ffffffffffffffff60405191165f178152a2005b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f616c7265616479207374617274656400000000000000000000000000000000006044820152fd5b5073ffffffffffffffffffffffffffffffffffffffff5f5416331415611734565b346101b55760206003193601126101b55760043561ffff81168082036101b55773ffffffffffffffffffffffffffffffffffffffff5f54163303610231576101f410611967577fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff75ffff00000000000000000000000000000000000000006002549260a01b169116176002555f80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f66656520746f6f206869676800000000000000000000000000000000000000006044820152fd5b346101b5575f6003193601126101b5576001600a54036106ec576002600a55600754905f60075581156113a9576001547fa9059cbb00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff16600482015260248101829052602081806044810103815f73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af190811561060b575f91611ac4575b50156105b45760207f78801bbd7cbf327a12f32881c63ae9e8e8ed5da8a28d4ade2e90029f8fbe34a391604051908152a16001600a55005b611add915060203d602011610604576105f68183611b95565b82611a8c565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036101b557565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036101b557565b9060028210156105875752565b60031960409101126101b5576004359060243590565b6060810190811067ffffffffffffffff821117611b6857604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117611b6857604052565b908160209103126101b5575180151581036101b55790565b91908201809211610b8657565b81810292918115918404141715610b8657565b8115611c18570490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b90815f52600860205260405f20915f52600960205273ffffffffffffffffffffffffffffffffffffffff60405f2091165f5260205260405f20546fffffffffffffffffffffffffffffffff8160081c169081158015611d32575b611d2457600783015460ff8160101c16611d2b5760081c60ff1615611d24576002830154600184015413611d1a5760ff5f915b1660028210156105875760028110156105875703611d14576fffffffffffffffffffffffffffffffff6112c36006611d11940154928360801c90611bfb565b90565b50505f90565b60ff600191611cd2565b5050505f90565b5050905090565b5060ff8160881c16611c9f565b9067ffffffffffffffff8091169116019067ffffffffffffffff8211610b8657565b906fffffffffffffffffffffffffffffffff809116911601906fffffffffffffffffffffffffffffffff8211610b8657565b519069ffffffffffffffffffff821682036101b557565b908160a09103126101b557611dbe81611d93565b91602082015191604081015191611d11608060608401519301611d93565b805f52600860205260405f2060058101546fffffffffffffffffffffffffffffffff8116159081156120a7575b5061201f576040517ffeaf968c00000000000000000000000000000000000000000000000000000000815260a08160048173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa801561060b575f905f925f91611fe7575b505f8313801590611fdf575b8015611fcb575b611f405790600784849360409560017f29df9f4f863c1556369b2f1aaa8ded9af531b1182d2b554765c387eb86b3d0b498015569ffffffffffffffffffff60038301941693847fffffffffffffffffffffffffffffffffffffffffffff0000000000000000000082541617905560048201550160017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905582519182526020820152a2565b505050600701620100017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff008254161790557f9220622428c3161d3444b6fa6e4c2991f48dd359515f98b6ef7fac06f0a18ea8606060405160208152601460208201527f7374616c65206f7261636c65206174206c6f636b0000000000000000000000006040820152a2565b50804203428111610b865760035410611e97565b508015611e90565b91505061200c915060a03d60a011612018575b6120048183611b95565b810190611daa565b5092905090915f611e84565b503d611ffa565b600701620100017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff008254161790557f9220622428c3161d3444b6fa6e4c2991f48dd359515f98b6ef7fac06f0a18ea8606060405160208152600e60208201527f6f6e652d736964656420706f6f6c0000000000000000000000000000000000006040820152a2565b905060801c155f611e09565b805f52600860205260405f2067ffffffffffffffff815460801c164210610c3857604051907ffeaf968c00000000000000000000000000000000000000000000000000000000825260a08260048173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa801561060b575f905f935f916123e7575b505f8413918215926123c9575b5081156123ba575b5061233057600281018290556007810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905560018101548212612328575f915b600283101561058757821591821561231a576fffffffffffffffffffffffffffffffff600582015416925b156122f9576fffffffffffffffffffffffffffffffff80612252600584015460801c5b600661271061221061ffff60025460a01c16868516611bfb565b049561221e87600754611bee565b60075501968381167fffffffffffffffffffffffffffffffff00000000000000000000000000000000895416178855611d61565b9216911603926fffffffffffffffffffffffffffffffff8411610b86576122f1836122dc7fdcc6e1fc254ffc4eb93f16496dded1a99b1ce2600792df79eae9e7f69da8feec96606096906fffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffff0000000000000000000000000000000083549260801b169116179055565b5460801c916040519384526020840190611b29565b6040820152a2565b6fffffffffffffffffffffffffffffffff80612252816005850154166121f6565b600581015460801c926121d3565b6001916121a8565b6007915001620100007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff8254161790557f9220622428c3161d3444b6fa6e4c2991f48dd359515f98b6ef7fac06f0a18ea8606060405160208152601460208201527f6e6f206672657368206f7261636c6520646174610000000000000000000000006040820152a2565b9050600482015410155f612160565b600384015469ffffffffffffffffffff91821691161491505f612158565b91505061240491925060a03d60a011612018576120048183611b95565b509392905090925f61214b56fea264697066735822122089f9fa5807080c091a39bacbea2adba2d764e4f12071f420ab6f4d4ffc955a7264736f6c634300081a00330000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d168000000000000000000000000ec26bfbe00e20a5f134c3f73ff41b4a65c29026e000000000000000000000000000000000000000000000000000000000000003c000000000000000000000000000000000000000000000000000000000000012c00000000000000000000000000000000000000000000000000000000000f42400000000000000000000000004deef125f24f8460fa64ae5e7e0ad70f7c02d3a9
0x6080806040526004361015610012575f80fd5b5f3560e01c9081623bdc74146119c557508063023b1fc9146118d757806303762bae1461170257806311c31db2146114d457806316c38b3c1461146757806324a9d8531461144357806352f1edcc146114265780635c975abb1461140457806361d027b3146113d15780636ba4c138146110cf5780637285c58b1461104b5780637380f50014610d5d578063748747e614610ce357806375c3fc1314610cc65780637667180814610ca95780637b3205f5146109e05780637dc0d1d01461099057806388ea41b9146109595780638c65c81f1461085b5780638da5cb5b14610829578063947a36fb146107e55780639619367d146107c8578063a0c7f71c1461079a578063aced166114610767578063cd3b691c14610730578063d55be8c614610714578063dfd29e4a146102d3578063f0f4426014610259578063f2fde38b146101b95763f5b91b7b14610165575f80fd5b346101b5575f6003193601126101b557602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d168168152f35b5f80fd5b346101b55760206003193601126101b5576101d2611b06565b73ffffffffffffffffffffffffffffffffffffffff5f541633036102315773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000005f5416175f555f80f35b7f30cd7471000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101b55760206003193601126101b557610272611b06565b73ffffffffffffffffffffffffffffffffffffffff5f541633036102315773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff000000000000000000000000000000000000000060015416176001555f80f35b346101b5576102e136611b36565b6001600a54036106ec576002600a5560ff600654166106c457600554801561069c57820361066657815f52600860205260405f2067ffffffffffffffff815460401c16421080159061068e575b61066657600454821061063e57825f52600960205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f526020526fffffffffffffffffffffffffffffffff60405f205460081c16610616576040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201528260448201526020816064815f73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d168165af190811561060b575f916105dc575b50156105b45760056fffffffffffffffffffffffffffffffff831691016fffffffffffffffffffffffffffffffff6104428382845416611d61565b167fffffffffffffffffffffffffffffffff0000000000000000000000000000000082541617905560405161047681611b4c565b5f815260208101918252604081015f8152845f52600960205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f5260205260405f20915160028110156105875761054e937fffffffffffffffffffffffffffffff000000000000000000000000000000000060ff70ffffffffffffffffffffffffffffffff008654935160081b1693169116171782555115157fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff71ff0000000000000000000000000000000000835492151560881b169116179055565b604051905f825260208201527f1efa8a4db358fbd4b3e1004cca7c5a1bdc9de3512d3392d48a51d1961316f98360403392a36001600a55005b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b7f90b8ec18000000000000000000000000000000000000000000000000000000005f5260045ffd5b6105fe915060203d602011610604575b6105f68183611b95565b810190611bd6565b84610407565b503d6105ec565b6040513d5f823e3d90fd5b7fa820742e000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f5688ffb3000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f61c54c4a000000000000000000000000000000000000000000000000000000005f5260045ffd5b5060ff60078201541661032e565b7f6f312cbd000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f9e87fac8000000000000000000000000000000000000000000000000000000005f5260045ffd5b7fab143c06000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101b5575f6003193601126101b55760206040516101f48152f35b346101b55760206003193601126101b55773ffffffffffffffffffffffffffffffffffffffff5f5416330361023157600435600355005b346101b5575f6003193601126101b557602073ffffffffffffffffffffffffffffffffffffffff60025416604051908152f35b346101b55760406003193601126101b55760206107c06107b8611ae3565b600435611c45565b604051908152f35b346101b5575f6003193601126101b5576020600454604051908152f35b346101b5575f6003193601126101b557602060405167ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000003c168152f35b346101b5575f6003193601126101b557602073ffffffffffffffffffffffffffffffffffffffff5f5416604051908152f35b346101b55760206003193601126101b5576004355f5260086020526101c060405f2060ff815491600181015490600281015469ffffffffffffffffffff600383015416600483015490600584015492600760068601549501549567ffffffffffffffff604051998181168b52818160401c1660208c015260801c1660408a01526060890152608088015260a087015260c08601526fffffffffffffffffffffffffffffffff811660e086015260801c6101008501526fffffffffffffffffffffffffffffffff811661012085015260801c6101408401528181161515610160840152818160081c16151561018084015260101c1615156101a0820152f35b346101b55760206003193601126101b55773ffffffffffffffffffffffffffffffffffffffff5f5416330361023157600480359055005b346101b5575f6003193601126101b557602060405173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ec26bfbe00e20a5f134c3f73ff41b4a65c29026e168152f35b346101b5575f6003193601126101b55773ffffffffffffffffffffffffffffffffffffffff6002541633141580610c88575b610c605760ff600654166106c4576001600a54036106ec576002600a55600554801561069c57805f52600860205267ffffffffffffffff60405f205460401c164210610c3857610a6181611ddc565b60018111610bb3575b60018101809111610b865780600555805f52600860205260405f2067ffffffffffffffff4216908054907f000000000000000000000000000000000000000000000000000000000000003c906fffffffffffffffff0000000000000000610ad18386611d3f565b60401b169160011b926801fffffffffffffffe67fffffffffffffffe851694168403610b8657847fffffffffffffffff00000000000000000000000000000000000000000000000077ffffffffffffffff00000000000000000000000000000000610b5f6020977f44b6249f6f45fde9b3f126e8f5a4c6f9461178adf913503196aeab4a491a27c999611d3f565b60801b1692161780931717905567ffffffffffffffff60405191165f178152a26001600a55005b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818111610b8657805f526008602052600760405f20015460ff81169081610c28575b81610c19575b50610c0a575b50610a6a565b610c13906120b3565b81610c04565b60ff915060101c161583610bfe565b905060ff8160081c161590610bf8565b7f085de625000000000000000000000000000000000000000000000000000000005f5260045ffd5b7ff512b278000000000000000000000000000000000000000000000000000000005f5260045ffd5b5073ffffffffffffffffffffffffffffffffffffffff5f5416331415610a12565b346101b5575f6003193601126101b5576020600554604051908152f35b346101b5575f6003193601126101b5576020600754604051908152f35b346101b55760206003193601126101b557610cfc611b06565b73ffffffffffffffffffffffffffffffffffffffff5f541633036102315773ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff000000000000000000000000000000000000000060025416176002555f80f35b346101b557610d6b36611b36565b6001600a54036106ec576002600a5560ff600654166106c457600554801561069c57820361066657815f52600860205260405f2067ffffffffffffffff815460401c16421080159061103d575b61066657600454821061063e57825f52600960205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f526020526fffffffffffffffffffffffffffffffff60405f205460081c16610616576040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201528260448201526020816064815f73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d168165af190811561060b575f9161101e575b50156105b457610eff60056fffffffffffffffffffffffffffffffff84169201610ebf83825460801c611d61565b6fffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffff0000000000000000000000000000000083549260801b169116179055565b604051610f0b81611b4c565b6001815260208101918252604081015f8152845f52600960205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f5260205260405f209151600281101561058757610fe4937fffffffffffffffffffffffffffffff000000000000000000000000000000000060ff70ffffffffffffffffffffffffffffffff008654935160081b1693169116171782555115157fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff71ff0000000000000000000000000000000000835492151560881b169116179055565b604051906001825260208201527f1efa8a4db358fbd4b3e1004cca7c5a1bdc9de3512d3392d48a51d1961316f98360403392a36001600a55005b611037915060203d602011610604576105f68183611b95565b84610e91565b5060ff600782015416610db8565b346101b55760406003193601126101b557611064611ae3565b6004355f52600960205273ffffffffffffffffffffffffffffffffffffffff60405f2091165f52602052606060405f205460ff604051916110a783838316611b29565b6fffffffffffffffffffffffffffffffff8160081c16602084015260881c1615156040820152f35b346101b55760206003193601126101b55760043567ffffffffffffffff81116101b557366023820112156101b55780600401359067ffffffffffffffff82116101b5573660248360051b830101116101b5576001600a54036106ec576002600a553391905f90815b838110156112f45760248160051b83010135805f52600860205260405f20815f52600960205260405f20875f5260205260405f208054916fffffffffffffffffffffffffffffffff8360081c1690811580156112e7575b6112d357600781015460ff8160101c165f14611226575050917fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff966111f292710100000000000000000000000000000000006001979695998a945b16179055611bee565b946040519081527f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a60203392a35b01611137565b60081c60ff16156112d35760028101546001820154136112e0575f5b60ff8516600282101561058757600281101561058757036112d357966111f292710100000000000000000000000000000000006112cb6001989796946fffffffffffffffffffffffffffffffff6112c360067fffffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffff9e0154928360801c90611bfb565b911690611c0e565b998a946111e9565b5050505050600190611220565b6001611242565b5060ff8460881c1661118e565b8280156113a9576040517fa9059cbb00000000000000000000000000000000000000000000000000000000815233600482015260248101919091526020816044815f7f0000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d16873ffffffffffffffffffffffffffffffffffffffff165af190811561060b575f9161138a575b50156105b4576001600a55005b6113a3915060203d602011610604576105f68183611b95565b8161137d565b7f969bf728000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101b5575f6003193601126101b557602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b346101b5575f6003193601126101b557602060ff600654166040519015158152f35b346101b5575f6003193601126101b5576020600354604051908152f35b346101b5575f6003193601126101b557602061ffff60025460a01c16604051908152f35b346101b55760206003193601126101b5576004358015158091036101b55773ffffffffffffffffffffffffffffffffffffffff5f541633036102315760ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00600654169116176006555f80f35b346101b55760206003193601126101b5576004356001600a54036106ec576002600a55805f52600860205260405f2080549067ffffffffffffffff8216156116a4576007019081549060ff8260081c161580611696575b156116385767ffffffffffffffff9060801c1661012c8101809111610b86574211156115da577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff6201000091161790557f9220622428c3161d3444b6fa6e4c2991f48dd359515f98b6ef7fac06f0a18ea8606060405160208152600560208201527f737475636b0000000000000000000000000000000000000000000000000000006040820152a26001600a55005b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f6e6f7420737475636b00000000000000000000000000000000000000000000006044820152fd5b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f66696e616c697a656400000000000000000000000000000000000000000000006044820152fd5b5060ff8260101c161561152b565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f6e6f20726f756e640000000000000000000000000000000000000000000000006044820152fd5b346101b5575f6003193601126101b55773ffffffffffffffffffffffffffffffffffffffff60025416331415806118b6575b610c605760ff600654166106c45760055461185857600160055560015f52600860205260405f2067ffffffffffffffff42168154917f000000000000000000000000000000000000000000000000000000000000003c6fffffffffffffffff00000000000000006117a58285611d3f565b60401b169060011b916801fffffffffffffffe67fffffffffffffffe841693168303610b8657600194847fffffffffffffffff00000000000000000000000000000000000000000000000077ffffffffffffffff000000000000000000000000000000006118366020977f44b6249f6f45fde9b3f126e8f5a4c6f9461178adf913503196aeab4a491a27c999611d3f565b60801b1692161780931717905567ffffffffffffffff60405191165f178152a2005b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f616c7265616479207374617274656400000000000000000000000000000000006044820152fd5b5073ffffffffffffffffffffffffffffffffffffffff5f5416331415611734565b346101b55760206003193601126101b55760043561ffff81168082036101b55773ffffffffffffffffffffffffffffffffffffffff5f54163303610231576101f410611967577fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff75ffff00000000000000000000000000000000000000006002549260a01b169116176002555f80f35b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f66656520746f6f206869676800000000000000000000000000000000000000006044820152fd5b346101b5575f6003193601126101b5576001600a54036106ec576002600a55600754905f60075581156113a9576001547fa9059cbb00000000000000000000000000000000000000000000000000000000825273ffffffffffffffffffffffffffffffffffffffff16600482015260248101829052602081806044810103815f73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d168165af190811561060b575f91611ac4575b50156105b45760207f78801bbd7cbf327a12f32881c63ae9e8e8ed5da8a28d4ade2e90029f8fbe34a391604051908152a16001600a55005b611add915060203d602011610604576105f68183611b95565b82611a8c565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036101b557565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036101b557565b9060028210156105875752565b60031960409101126101b5576004359060243590565b6060810190811067ffffffffffffffff821117611b6857604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117611b6857604052565b908160209103126101b5575180151581036101b55790565b91908201809211610b8657565b81810292918115918404141715610b8657565b8115611c18570490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b90815f52600860205260405f20915f52600960205273ffffffffffffffffffffffffffffffffffffffff60405f2091165f5260205260405f20546fffffffffffffffffffffffffffffffff8160081c169081158015611d32575b611d2457600783015460ff8160101c16611d2b5760081c60ff1615611d24576002830154600184015413611d1a5760ff5f915b1660028210156105875760028110156105875703611d14576fffffffffffffffffffffffffffffffff6112c36006611d11940154928360801c90611bfb565b90565b50505f90565b60ff600191611cd2565b5050505f90565b5050905090565b5060ff8160881c16611c9f565b9067ffffffffffffffff8091169116019067ffffffffffffffff8211610b8657565b906fffffffffffffffffffffffffffffffff809116911601906fffffffffffffffffffffffffffffffff8211610b8657565b519069ffffffffffffffffffff821682036101b557565b908160a09103126101b557611dbe81611d93565b91602082015191604081015191611d11608060608401519301611d93565b805f52600860205260405f2060058101546fffffffffffffffffffffffffffffffff8116159081156120a7575b5061201f576040517ffeaf968c00000000000000000000000000000000000000000000000000000000815260a08160048173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ec26bfbe00e20a5f134c3f73ff41b4a65c29026e165afa801561060b575f905f925f91611fe7575b505f8313801590611fdf575b8015611fcb575b611f405790600784849360409560017f29df9f4f863c1556369b2f1aaa8ded9af531b1182d2b554765c387eb86b3d0b498015569ffffffffffffffffffff60038301941693847fffffffffffffffffffffffffffffffffffffffffffff0000000000000000000082541617905560048201550160017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905582519182526020820152a2565b505050600701620100017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff008254161790557f9220622428c3161d3444b6fa6e4c2991f48dd359515f98b6ef7fac06f0a18ea8606060405160208152601460208201527f7374616c65206f7261636c65206174206c6f636b0000000000000000000000006040820152a2565b50804203428111610b865760035410611e97565b508015611e90565b91505061200c915060a03d60a011612018575b6120048183611b95565b810190611daa565b5092905090915f611e84565b503d611ffa565b600701620100017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff008254161790557f9220622428c3161d3444b6fa6e4c2991f48dd359515f98b6ef7fac06f0a18ea8606060405160208152600e60208201527f6f6e652d736964656420706f6f6c0000000000000000000000000000000000006040820152a2565b905060801c155f611e09565b805f52600860205260405f2067ffffffffffffffff815460801c164210610c3857604051907ffeaf968c00000000000000000000000000000000000000000000000000000000825260a08260048173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000ec26bfbe00e20a5f134c3f73ff41b4a65c29026e165afa801561060b575f905f935f916123e7575b505f8413918215926123c9575b5081156123ba575b5061233057600281018290556007810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905560018101548212612328575f915b600283101561058757821591821561231a576fffffffffffffffffffffffffffffffff600582015416925b156122f9576fffffffffffffffffffffffffffffffff80612252600584015460801c5b600661271061221061ffff60025460a01c16868516611bfb565b049561221e87600754611bee565b60075501968381167fffffffffffffffffffffffffffffffff00000000000000000000000000000000895416178855611d61565b9216911603926fffffffffffffffffffffffffffffffff8411610b86576122f1836122dc7fdcc6e1fc254ffc4eb93f16496dded1a99b1ce2600792df79eae9e7f69da8feec96606096906fffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffff0000000000000000000000000000000083549260801b169116179055565b5460801c916040519384526020840190611b29565b6040820152a2565b6fffffffffffffffffffffffffffffffff80612252816005850154166121f6565b600581015460801c926121d3565b6001916121a8565b6007915001620100007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff8254161790557f9220622428c3161d3444b6fa6e4c2991f48dd359515f98b6ef7fac06f0a18ea8606060405160208152601460208201527f6e6f206672657368206f7261636c6520646174610000000000000000000000006040820152a2565b9050600482015410155f612160565b600384015469ffffffffffffffffffff91821691161491505f612158565b91505061240491925060a03d60a011612018576120048183611b95565b509392905090925f61214b56fea264697066735822122089f9fa5807080c091a39bacbea2adba2d764e4f12071f420ab6f4d4ffc955a7264736f6c634300081a0033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0xc080d9…d1e922 | 28 days agoMon, 20 Jul 2026 18:51:32 UTC | 0x44b624…27c9 | [0] 0x000000000000…00000001 data: 0x000000000000000000…6a5e6e34 |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| no internal transactions found for this address yet (traced blocks + on-demand) | ||||||||
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| no token transfers for this address yet | |||||||||
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xc080d9…d1e922 | genesisStart | 14,930,513 | 28 days agoMon, 20 Jul 2026 18:51:32 UTC | 0x4dee…d3a9 | IN | CitiusPool | $0.000 ETH | 0.00000386 |