// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;
import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol";
import {Ownable2StepUpgradeable} from "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol";
import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {IOil} from "./interfaces/IOil.sol";
import {IReferralRegistry} from "./interfaces/IReferralRegistry.sol";
import {IRewardsLedger, REWARDS_LANE_GRID, REWARDS_LANE_AUCTION} from "./interfaces/IRewardsLedger.sol";
import {ITreasuryProtocolFees} from "./interfaces/ITreasuryProtocolFees.sol";
import {IOilVoteEscrow} from "./interfaces/IOilVoteEscrow.sol";
import {Constants} from "./libraries/Constants.sol";
/// @title RewardsLedger
/// @notice Per-lane (Grid / Auction) balances + refining. Users claim via Grid/Auction; lock via OilClaimLocker.
contract RewardsLedger is
Initializable,
Ownable2StepUpgradeable,
ReentrancyGuardUpgradeable,
UUPSUpgradeable,
IRewardsLedger
{
using SafeERC20 for IERC20;
uint8 public constant LANE_GRID = REWARDS_LANE_GRID;
uint8 public constant LANE_AUCTION = REWARDS_LANE_AUCTION;
IOil public oil;
address public grid;
address public auction;
address public referralRegistry;
mapping(uint8 => uint256) public totalUnclaimed;
mapping(uint8 => uint256) public totalRefined;
mapping(uint8 => uint256) public accRefiningPerUnclaimed;
mapping(uint8 => uint256) public totalUnclaimedETH;
mapping(uint8 => mapping(address => uint256)) public userUnclaimedETH;
mapping(uint8 => mapping(address => uint256)) public userUnclaimedOIL;
mapping(uint8 => mapping(address => uint256)) public userRefinedOIL;
mapping(uint8 => mapping(address => uint256)) public userRefiningDebt;
/// @dev Lifetime no-referrer claim fees (ETH → Treasury; OIL burned then pending until TeamVesting claims).
uint256 public protocolUnreferredFeeETH;
uint256 public protocolUnreferredFeeOIL;
address public treasury;
address public teamVesting;
address public voteEscrow;
/// @dev OilClaimLocker — may stake / payout ETH for a user (user is always msg.sender to the locker).
address public claimLocker;
/// @dev Unsettled no-referrer OIL (burned from this contract; TeamVesting mints on claim).
uint256 public pendingProtocolOil;
uint256[36] private __gap;
error ZeroAddress();
error Unauthorized();
error InvalidLane();
error InvalidAmount();
error NothingToClaim();
error TransferFailed();
error InsufficientOilReserves();
error InsufficientEthReserves();
error InvalidDuration();
/// @dev `permanent` flag must match the existing lock when increasing (`toTokenId != 0`).
error LockTypeMismatch();
event OilCredited(uint8 indexed lane, address indexed user, uint256 amount);
event EthCredited(uint8 indexed lane, address indexed user, uint256 amount);
event ClaimedETH(uint8 indexed lane, address indexed user, uint256 amount);
event ClaimedOIL(
uint8 indexed lane, address indexed user, uint256 mined, uint256 refined, uint256 fee, uint256 net
);
event ReferralPaid(address indexed from, address indexed referrer, uint256 amount, bool isEth);
event ProtocolUnreferredFee(address indexed from, uint256 amount, bool isEth);
event GridUpdated(address grid);
event AuctionUpdated(address auction);
event ReferralRegistryUpdated(address registry);
event TreasuryUpdated(address treasury);
event TeamVestingUpdated(address teamVesting);
event OilVoteEscrowUpdated(address voteEscrow);
event OilClaimLockerUpdated(address claimLocker);
event StakedOIL(
uint8 indexed lane,
address indexed user,
uint256 mined,
uint256 refined,
uint256 staked,
uint256 tokenId,
bool permanent
);
/// @custom:oz-upgrades-unsafe-allow constructor
constructor() {
_disableInitializers();
}
function initialize(address oil_, address owner_) external initializer {
if (oil_ == address(0) || owner_ == address(0)) revert ZeroAddress();
__Ownable_init(owner_);
__Ownable2Step_init();
__ReentrancyGuard_init();
__UUPSUpgradeable_init();
oil = IOil(oil_);
}
function _authorizeUpgrade(address) internal override onlyOwner {}
receive() external payable {}
function setGrid(address grid_) external onlyOwner {
if (grid_ == address(0)) revert ZeroAddress();
grid = grid_;
emit GridUpdated(grid_);
}
function setAuction(address auction_) external onlyOwner {
if (auction_ == address(0)) revert ZeroAddress();
auction = auction_;
emit AuctionUpdated(auction_);
}
function setReferralRegistry(address registry_) external onlyOwner {
if (registry_ == address(0)) revert ZeroAddress();
referralRegistry = registry_;
emit ReferralRegistryUpdated(registry_);
}
function setTreasury(address treasury_) external onlyOwner {
if (treasury_ == address(0)) revert ZeroAddress();
treasury = treasury_;
emit TreasuryUpdated(treasury_);
}
function setTeamVesting(address teamVesting_) external onlyOwner {
if (teamVesting_ == address(0)) revert ZeroAddress();
teamVesting = teamVesting_;
emit TeamVestingUpdated(teamVesting_);
}
function setOilVoteEscrow(address voteEscrow_) external onlyOwner {
if (voteEscrow_ == address(0)) revert ZeroAddress();
voteEscrow = voteEscrow_;
emit OilVoteEscrowUpdated(voteEscrow_);
}
function setOilClaimLocker(address claimLocker_) external onlyOwner {
if (claimLocker_ == address(0)) revert ZeroAddress();
claimLocker = claimLocker_;
emit OilClaimLockerUpdated(claimLocker_);
}
// -------------------------------------------------------------------------
// Credits (modes → ledger)
// -------------------------------------------------------------------------
/// @inheritdoc IRewardsLedger
function creditOil(uint8 lane, address user, uint256 amount) external nonReentrant {
_onlyMode();
_validLane(lane);
if (user == address(0)) revert ZeroAddress();
if (amount == 0) revert InvalidAmount();
IERC20(address(oil)).safeTransferFrom(msg.sender, address(this), amount);
_creditUnrefined(lane, user, amount);
emit OilCredited(lane, user, amount);
}
/// @inheritdoc IRewardsLedger
function creditEth(uint8 lane, address user) external payable nonReentrant {
_onlyMode();
_validLane(lane);
if (user == address(0)) revert ZeroAddress();
if (msg.value == 0) revert InvalidAmount();
userUnclaimedETH[lane][user] += msg.value;
totalUnclaimedETH[lane] += msg.value;
emit EthCredited(lane, user, msg.value);
}
/// @inheritdoc IRewardsLedger
function payoutAuctionRewards(address user) external nonReentrant {
if (msg.sender != auction) revert Unauthorized();
if (user == address(0)) revert ZeroAddress();
bool ethOk = _claimETH(LANE_AUCTION, user, user);
bool oilOk = _claimOIL(LANE_AUCTION, user);
if (!ethOk && !oilOk) revert NothingToClaim();
}
/// @inheritdoc IRewardsLedger
function payoutAuctionOIL(address user) external nonReentrant returns (bool) {
if (msg.sender != auction) revert Unauthorized();
if (user == address(0)) revert ZeroAddress();
return _claimOIL(LANE_AUCTION, user);
}
/// @inheritdoc IRewardsLedger
function payoutGridETH(address user, address to) external nonReentrant returns (uint256 payout) {
if (msg.sender != grid && msg.sender != claimLocker) revert Unauthorized();
if (user == address(0) || to == address(0)) revert ZeroAddress();
uint256 amount = userUnclaimedETH[LANE_GRID][user];
if (amount == 0) return 0;
userUnclaimedETH[LANE_GRID][user] = 0;
totalUnclaimedETH[LANE_GRID] -= amount;
payout = _applyEthReferral(user, amount);
_payoutEth(to, payout);
emit ClaimedETH(LANE_GRID, user, payout);
}
/// @inheritdoc IRewardsLedger
function payoutAuctionETH(address user, address to) external nonReentrant returns (uint256 payout) {
if (msg.sender != auction && msg.sender != claimLocker) revert Unauthorized();
if (user == address(0) || to == address(0)) revert ZeroAddress();
uint256 amount = userUnclaimedETH[LANE_AUCTION][user];
if (amount == 0) return 0;
userUnclaimedETH[LANE_AUCTION][user] = 0;
totalUnclaimedETH[LANE_AUCTION] -= amount;
payout = _applyEthReferral(user, amount);
_payoutEth(to, payout);
emit ClaimedETH(LANE_AUCTION, user, payout);
}
/// @inheritdoc IRewardsLedger
function payoutGridOIL(address user) external nonReentrant returns (bool) {
if (msg.sender != grid) revert Unauthorized();
if (user == address(0)) revert ZeroAddress();
return _claimOIL(LANE_GRID, user);
}
/// @inheritdoc IRewardsLedger
/// @dev OilClaimLocker only. Permanent skips refining fee; timed pays it.
function stakeGridOIL(address user, uint256 duration, bool permanent, uint256 toTokenId)
external
nonReentrant
returns (uint256 tokenId)
{
if (msg.sender != claimLocker) revert Unauthorized();
if (user == address(0)) revert ZeroAddress();
return _stakeOIL(LANE_GRID, user, duration, permanent, toTokenId);
}
/// @inheritdoc IRewardsLedger
/// @dev OilClaimLocker only. Permanent skips refining fee; timed pays it.
function stakeAuctionOIL(address user, uint256 duration, bool permanent, uint256 toTokenId)
external
nonReentrant
returns (uint256 tokenId)
{
if (msg.sender != claimLocker) revert Unauthorized();
if (user == address(0)) revert ZeroAddress();
return _stakeOIL(LANE_AUCTION, user, duration, permanent, toTokenId);
}
// -------------------------------------------------------------------------
// Views (UI / solvency)
// -------------------------------------------------------------------------
function userGridUnclaimedETH(address user) external view returns (uint256) {
return userUnclaimedETH[LANE_GRID][user];
}
function userGridUnclaimedOIL(address user) external view returns (uint256) {
return userUnclaimedOIL[LANE_GRID][user];
}
function userGridRefinedOIL(address user) external view returns (uint256) {
return userRefinedOIL[LANE_GRID][user];
}
function userAuctionUnclaimedETH(address user) external view returns (uint256) {
return userUnclaimedETH[LANE_AUCTION][user];
}
function userAuctionUnclaimedOIL(address user) external view returns (uint256) {
return userUnclaimedOIL[LANE_AUCTION][user];
}
function userAuctionRefinedOIL(address user) external view returns (uint256) {
return userRefinedOIL[LANE_AUCTION][user];
}
function oilLiabilities() public view returns (uint256) {
return totalUnclaimed[LANE_GRID] + totalRefined[LANE_GRID] + totalUnclaimed[LANE_AUCTION]
+ totalRefined[LANE_AUCTION];
}
function ethLiabilities() public view returns (uint256) {
return totalUnclaimedETH[LANE_GRID] + totalUnclaimedETH[LANE_AUCTION];
}
// -------------------------------------------------------------------------
// Internals
// -------------------------------------------------------------------------
function _onlyMode() internal view {
if (msg.sender != grid && msg.sender != auction) revert Unauthorized();
}
function _validLane(uint8 lane) internal pure {
if (lane != LANE_GRID && lane != LANE_AUCTION) revert InvalidLane();
}
function _creditUnrefined(uint8 lane, address user, uint256 amount) internal {
_accrueRefining(lane, user);
userUnclaimedOIL[lane][user] += amount;
totalUnclaimed[lane] += amount;
userRefiningDebt[lane][user] = (userUnclaimedOIL[lane][user] * accRefiningPerUnclaimed[lane]) / 1e18;
}
function _claimETH(uint8 lane, address user, address to) internal returns (bool) {
uint256 amount = userUnclaimedETH[lane][user];
if (amount == 0) return false;
userUnclaimedETH[lane][user] = 0;
totalUnclaimedETH[lane] -= amount;
uint256 payout = _applyEthReferral(user, amount);
_payoutEth(to, payout);
emit ClaimedETH(lane, user, payout);
return true;
}
function _claimOIL(uint8 lane, address user) internal returns (bool) {
_accrueRefining(lane, user);
uint256 mined = userUnclaimedOIL[lane][user];
uint256 refined = userRefinedOIL[lane][user];
uint256 gross = mined + refined;
if (gross == 0) return false;
userUnclaimedOIL[lane][user] = 0;
userRefinedOIL[lane][user] = 0;
if (mined > 0) totalUnclaimed[lane] -= mined;
if (refined > 0) totalRefined[lane] -= refined;
// Always charge refining on crude. If others remain unclaimed, redistribute; else send fee to treasury.
uint256 fee;
if (mined > 0) {
fee = mined / Constants.REFINING_FEE_DIVISOR;
if (fee > 0) {
if (totalUnclaimed[lane] > 0) {
accRefiningPerUnclaimed[lane] += (fee * 1e18) / totalUnclaimed[lane];
} else {
if (treasury == address(0)) revert ZeroAddress();
_transferOil(treasury, fee);
}
}
}
uint256 net = gross - fee;
uint256 payout = _applyOilReferral(user, net);
_transferOil(user, payout);
userRefiningDebt[lane][user] = 0;
emit ClaimedOIL(lane, user, mined, refined, fee, payout);
return true;
}
/// @dev Debit crude+refined; lock into OilVoteEscrow for `user`.
/// Refining fee: waived only for permanent locks. Timed pays 10%.
/// @param toTokenId 0 = create new timed / permanent path; else increase that existing lock.
function _stakeOIL(uint8 lane, address user, uint256 duration, bool permanent, uint256 toTokenId)
internal
returns (uint256 tokenId)
{
address ve = voteEscrow;
if (ve == address(0)) revert ZeroAddress();
if (
toTokenId == 0 && !permanent
&& (duration < Constants.MIN_LOCK_DURATION || duration > Constants.MAX_LOCK_DURATION)
) {
revert InvalidDuration();
}
_accrueRefining(lane, user);
uint256 mined = userUnclaimedOIL[lane][user];
uint256 refined = userRefinedOIL[lane][user];
uint256 gross = mined + refined;
if (gross == 0) revert NothingToClaim();
userUnclaimedOIL[lane][user] = 0;
userRefinedOIL[lane][user] = 0;
if (mined > 0) totalUnclaimed[lane] -= mined;
if (refined > 0) totalRefined[lane] -= refined;
userRefiningDebt[lane][user] = 0;
// Fee waiver must track the real lock type (not a caller-supplied `permanent` flag alone).
// Otherwise `permanent=true` + timed `toTokenId` skips refining then later withdraws.
bool isPermanent = permanent;
if (toTokenId != 0) {
IOilVoteEscrow.Lock memory lock = IOilVoteEscrow(ve).getLock(toTokenId);
if (lock.permanent != permanent) revert LockTypeMismatch();
isPermanent = lock.permanent;
}
// Timed stake pays refining fee; permanent stake bypasses.
// If no remaining unclaimed pool, fee goes to treasury (same as claim path).
uint256 fee;
if (!isPermanent && mined > 0) {
fee = mined / Constants.REFINING_FEE_DIVISOR;
if (fee > 0) {
if (totalUnclaimed[lane] > 0) {
accRefiningPerUnclaimed[lane] += (fee * 1e18) / totalUnclaimed[lane];
} else {
if (treasury == address(0)) revert ZeroAddress();
_transferOil(treasury, fee);
}
}
}
uint256 net = gross - fee;
uint256 staked = _applyOilReferral(user, net);
if (staked == 0) revert NothingToClaim();
uint256 bal = IERC20(address(oil)).balanceOf(address(this));
if (bal < staked || bal - staked < oilLiabilities()) revert InsufficientOilReserves();
IERC20(address(oil)).forceApprove(ve, staked);
if (toTokenId != 0) {
tokenId = IOilVoteEscrow(ve).increaseAmountFor(user, toTokenId, staked);
} else if (isPermanent) {
tokenId = IOilVoteEscrow(ve).stakePermanentFor(user, staked);
} else {
tokenId = IOilVoteEscrow(ve).createLockFor(user, staked, duration);
}
IERC20(address(oil)).forceApprove(ve, 0);
emit StakedOIL(lane, user, mined, refined, staked, tokenId, isPermanent);
}
function _applyEthReferral(address claimer, uint256 amount) internal returns (uint256 payout) {
if (amount == 0) return 0;
address registry = referralRegistry;
address ref = registry == address(0) ? address(0) : IReferralRegistry(registry).referrerOf(claimer);
if (ref != address(0)) {
uint256 cut = amount / Constants.REFERRAL_FEE_DIVISOR;
if (cut == 0) return amount;
IReferralRegistry(registry).creditReferralETH{value: cut}(ref);
emit ReferralPaid(claimer, ref, cut, true);
return amount - cut;
}
uint256 fee = amount / Constants.PROTOCOL_NO_REFERRER_FEE_DIVISOR;
if (fee == 0) return amount;
if (treasury == address(0)) revert ZeroAddress();
protocolUnreferredFeeETH += fee;
ITreasuryProtocolFees(treasury).notifyProtocolFees{value: fee}();
emit ProtocolUnreferredFee(claimer, fee, true);
return amount - fee;
}
function _applyOilReferral(address claimer, uint256 amount) internal returns (uint256 payout) {
if (amount == 0) return 0;
address registry = referralRegistry;
address ref = registry == address(0) ? address(0) : IReferralRegistry(registry).referrerOf(claimer);
if (ref != address(0)) {
uint256 cut = amount / Constants.REFERRAL_FEE_DIVISOR;
if (cut == 0) return amount;
IERC20(address(oil)).forceApprove(registry, cut);
IReferralRegistry(registry).creditReferralOIL(ref, cut);
emit ReferralPaid(claimer, ref, cut, false);
return amount - cut;
}
uint256 fee = amount / Constants.PROTOCOL_NO_REFERRER_FEE_DIVISOR;
if (fee == 0) return amount;
protocolUnreferredFeeOIL += fee;
pendingProtocolOil += fee;
oil.burn(fee);
emit ProtocolUnreferredFee(claimer, fee, false);
return amount - fee;
}
/// @notice TeamVesting: consume accrued no-referrer OIL so it can mint + vest into the team lock.
function claimProtocolOil() external nonReentrant returns (uint256 amount) {
if (msg.sender != teamVesting) revert Unauthorized();
amount = pendingProtocolOil;
if (amount == 0) revert NothingToClaim();
pendingProtocolOil = 0;
}
function _accrueRefining(uint8 lane, address user) internal {
uint256 unclaimed = userUnclaimedOIL[lane][user];
if (unclaimed == 0) {
userRefiningDebt[lane][user] = 0;
return;
}
uint256 accumulated = (unclaimed * accRefiningPerUnclaimed[lane]) / 1e18;
uint256 debt = userRefiningDebt[lane][user];
if (accumulated > debt) {
uint256 gained = accumulated - debt;
userRefinedOIL[lane][user] += gained;
totalRefined[lane] += gained;
}
userRefiningDebt[lane][user] = (unclaimed * accRefiningPerUnclaimed[lane]) / 1e18;
}
function _payoutEth(address to, uint256 amount) internal {
if (amount == 0) return;
uint256 bal = address(this).balance;
if (bal < amount || bal - amount < ethLiabilities()) revert InsufficientEthReserves();
(bool ok,) = to.call{value: amount}("");
if (!ok) revert TransferFailed();
}
function _transferOil(address to, uint256 amount) internal {
if (amount == 0) return;
uint256 bal = IERC20(address(oil)).balanceOf(address(this));
if (bal < amount || bal - amount < oilLiabilities()) revert InsufficientOilReserves();
IERC20(address(oil)).safeTransfer(to, amount);
}
}[
{
"type": "constructor",
"inputs": [],
"stateMutability": "nonpayable"
},
{
"name": "AddressEmptyCode",
"type": "error",
"inputs": [
{
"name": "target",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC1967InvalidImplementation",
"type": "error",
"inputs": [
{
"name": "implementation",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC1967NonPayable",
"type": "error",
"inputs": []
},
{
"name": "FailedCall",
"type": "error",
"inputs": []
},
{
"name": "InsufficientEthReserves",
"type": "error",
"inputs": []
},
{
"name": "InsufficientOilReserves",
"type": "error",
"inputs": []
},
{
"name": "InvalidAmount",
"type": "error",
"inputs": []
},
{
"name": "InvalidDuration",
"type": "error",
"inputs": []
},
{
"name": "InvalidInitialization",
"type": "error",
"inputs": []
},
{
"name": "InvalidLane",
"type": "error",
"inputs": []
},
{
"name": "LockTypeMismatch",
"type": "error",
"inputs": []
},
{
"name": "NotInitializing",
"type": "error",
"inputs": []
},
{
"name": "NothingToClaim",
"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": "TransferFailed",
"type": "error",
"inputs": []
},
{
"name": "UUPSUnauthorizedCallContext",
"type": "error",
"inputs": []
},
{
"name": "UUPSUnsupportedProxiableUUID",
"type": "error",
"inputs": [
{
"name": "slot",
"type": "bytes32",
"internalType": "bytes32"
}
]
},
{
"name": "Unauthorized",
"type": "error",
"inputs": []
},
{
"name": "ZeroAddress",
"type": "error",
"inputs": []
},
{
"name": "AuctionUpdated",
"type": "event",
"inputs": [
{
"name": "auction",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "ClaimedETH",
"type": "event",
"inputs": [
{
"name": "lane",
"type": "uint8",
"indexed": true,
"internalType": "uint8"
},
{
"name": "user",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "ClaimedOIL",
"type": "event",
"inputs": [
{
"name": "lane",
"type": "uint8",
"indexed": true,
"internalType": "uint8"
},
{
"name": "user",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "mined",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "refined",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "fee",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "net",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "EthCredited",
"type": "event",
"inputs": [
{
"name": "lane",
"type": "uint8",
"indexed": true,
"internalType": "uint8"
},
{
"name": "user",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "GridUpdated",
"type": "event",
"inputs": [
{
"name": "grid",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "Initialized",
"type": "event",
"inputs": [
{
"name": "version",
"type": "uint64",
"indexed": false,
"internalType": "uint64"
}
],
"anonymous": false
},
{
"name": "OilClaimLockerUpdated",
"type": "event",
"inputs": [
{
"name": "claimLocker",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "OilCredited",
"type": "event",
"inputs": [
{
"name": "lane",
"type": "uint8",
"indexed": true,
"internalType": "uint8"
},
{
"name": "user",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "OilVoteEscrowUpdated",
"type": "event",
"inputs": [
{
"name": "voteEscrow",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "OwnershipTransferStarted",
"type": "event",
"inputs": [
{
"name": "previousOwner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "OwnershipTransferred",
"type": "event",
"inputs": [
{
"name": "previousOwner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "ProtocolUnreferredFee",
"type": "event",
"inputs": [
{
"name": "from",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "isEth",
"type": "bool",
"indexed": false,
"internalType": "bool"
}
],
"anonymous": false
},
{
"name": "ReferralPaid",
"type": "event",
"inputs": [
{
"name": "from",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "referrer",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "isEth",
"type": "bool",
"indexed": false,
"internalType": "bool"
}
],
"anonymous": false
},
{
"name": "ReferralRegistryUpdated",
"type": "event",
"inputs": [
{
"name": "registry",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "StakedOIL",
"type": "event",
"inputs": [
{
"name": "lane",
"type": "uint8",
"indexed": true,
"internalType": "uint8"
},
{
"name": "user",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "mined",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "refined",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "staked",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "tokenId",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "permanent",
"type": "bool",
"indexed": false,
"internalType": "bool"
}
],
"anonymous": false
},
{
"name": "TeamVestingUpdated",
"type": "event",
"inputs": [
{
"name": "teamVesting",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "TreasuryUpdated",
"type": "event",
"inputs": [
{
"name": "treasury",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "Upgraded",
"type": "event",
"inputs": [
{
"name": "implementation",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "LANE_AUCTION",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"stateMutability": "view"
},
{
"name": "LANE_GRID",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"stateMutability": "view"
},
{
"name": "UPGRADE_INTERFACE_VERSION",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "accRefiningPerUnclaimed",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "acceptOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "auction",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "claimLocker",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "claimProtocolOil",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "creditEth",
"type": "function",
"inputs": [
{
"name": "lane",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "user",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "creditOil",
"type": "function",
"inputs": [
{
"name": "lane",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "user",
"type": "address",
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "ethLiabilities",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "grid",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "initialize",
"type": "function",
"inputs": [
{
"name": "oil_",
"type": "address",
"internalType": "address"
},
{
"name": "owner_",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "oil",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IOil"
}
],
"stateMutability": "view"
},
{
"name": "oilLiabilities",
"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": "payoutAuctionETH",
"type": "function",
"inputs": [
{
"name": "user",
"type": "address",
"internalType": "address"
},
{
"name": "to",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "payout",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "payoutAuctionOIL",
"type": "function",
"inputs": [
{
"name": "user",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"name": "payoutAuctionRewards",
"type": "function",
"inputs": [
{
"name": "user",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "payoutGridETH",
"type": "function",
"inputs": [
{
"name": "user",
"type": "address",
"internalType": "address"
},
{
"name": "to",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "payout",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "payoutGridOIL",
"type": "function",
"inputs": [
{
"name": "user",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"name": "pendingOwner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "pendingProtocolOil",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "protocolUnreferredFeeETH",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "protocolUnreferredFeeOIL",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "proxiableUUID",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"name": "referralRegistry",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "renounceOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setAuction",
"type": "function",
"inputs": [
{
"name": "auction_",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setGrid",
"type": "function",
"inputs": [
{
"name": "grid_",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setOilClaimLocker",
"type": "function",
"inputs": [
{
"name": "claimLocker_",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setOilVoteEscrow",
"type": "function",
"inputs": [
{
"name": "voteEscrow_",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setReferralRegistry",
"type": "function",
"inputs": [
{
"name": "registry_",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setTeamVesting",
"type": "function",
"inputs": [
{
"name": "teamVesting_",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setTreasury",
"type": "function",
"inputs": [
{
"name": "treasury_",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "stakeAuctionOIL",
"type": "function",
"inputs": [
{
"name": "user",
"type": "address",
"internalType": "address"
},
{
"name": "duration",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "permanent",
"type": "bool",
"internalType": "bool"
},
{
"name": "toTokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "stakeGridOIL",
"type": "function",
"inputs": [
{
"name": "user",
"type": "address",
"internalType": "address"
},
{
"name": "duration",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "permanent",
"type": "bool",
"internalType": "bool"
},
{
"name": "toTokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "teamVesting",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "totalRefined",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "totalUnclaimed",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "totalUnclaimedETH",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"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"
},
{
"name": "upgradeToAndCall",
"type": "function",
"inputs": [
{
"name": "newImplementation",
"type": "address",
"internalType": "address"
},
{
"name": "data",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "userAuctionRefinedOIL",
"type": "function",
"inputs": [
{
"name": "user",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "userAuctionUnclaimedETH",
"type": "function",
"inputs": [
{
"name": "user",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "userAuctionUnclaimedOIL",
"type": "function",
"inputs": [
{
"name": "user",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "userGridRefinedOIL",
"type": "function",
"inputs": [
{
"name": "user",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "userGridUnclaimedETH",
"type": "function",
"inputs": [
{
"name": "user",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "userGridUnclaimedOIL",
"type": "function",
"inputs": [
{
"name": "user",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "userRefinedOIL",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "userRefiningDebt",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "userUnclaimedETH",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "userUnclaimedOIL",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "voteEscrow",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"type": "receive",
"stateMutability": "payable"
}
]0x60a080604052346100ea57306080527ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460ff8160401c166100d9576002600160401b03196001600160401b03821601610073575b604051613a5590816100f08239608051818181611a5d0152611b820152f35b6001600160401b0319166001600160401b039081177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005581527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a13880610054565b63f92ee8a960e01b60005260046000fd5b600080fdfe608080604052600436101561001d575b50361561001b57600080fd5b005b60003560e01c9081630130184b146123795750806301fc161f1461220157806303912b73146121e557806303b9e8b4146121b157806304472e9d1461219357806306a7385a146120b45780630b7415bf1461206357806312cb9acb146120165780631708379e14611fe257806332aa465114611fc65780633e061eba14611f6a578063485cc95514611d7b5780634a0e472514611d475780634e627e6214611d1e5780634f1ef28614611b055780634f44092414611ab457806352d1902d14611a4a578063556fe77514611a21578063582fac84146119c55780635eccc21a1461196f578063619f3d6c1461194657806361d027b31461191d5780636a79115f146118ac578063715018a61461182b57806378cd01d81461180257806379ba5097146117b25780637d796d07146117415780637d9f6db5146117185780637eaf9a3a146116ce57806388aa54de1461169a5780638da5cb5b146116645780639019a2851461163b578063a23836ef14611612578063a8d4a550146115f7578063ad3cb1cc1461157b578063ae4b7cbc1461150a578063b1c65836146114d6578063b8c6f57914611465578063c2b3857f146113f4578063ccbb616914611398578063cd91b37a1461137a578063d531558b14611329578063d96614c8146112cd578063deb9bc2d1461127f578063e05b4048146111ee578063e09c09611461119d578063e30c397814611167578063e481dc6314610ba6578063e962157914610b3d578063ed90d98f14610485578063f0f4426014610414578063f2bef6d2146103b8578063f2fde38b14610331578063f9978083146102af5763fe02333d14610287573861000f565b346102aa5760003660031901126102aa5760206102a26126fc565b604051908152f35b600080fd5b346102aa5760203660031901126102aa576102c86123ba565b6102d06130cf565b6001600160a01b03168015610320576020817fb0ff1d8af6c056684758f6e94158cd3f5459120431b95ff20225f71502bf9422926001600160601b0360a01b6010541617601055604051908152a1005b63d92e233d60e01b60005260046000fd5b346102aa5760203660031901126102aa5761034a6123ba565b6103526130cf565b600080516020613a0083398151915280546001600160a01b0319166001600160a01b03928316908117909155600080516020613920833981519152549091167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700600080a3005b346102aa5760203660031901126102aa576103d16123ba565b6001600160a01b031660009081527fbbc70db1b6c7afd11e79c0fb0051300458f1a3acb8ee9789d9b6b26c61ad9bc7602090815260409182902054915191825290f35b346102aa5760203660031901126102aa5761042d6123ba565b6104356130cf565b6001600160a01b03168015610320576020817f7dae230f18360d76a040c81f050aa14eb9d6dc7901b20fc5d855e2a20fe814d1926001600160601b0360a01b600e541617600e55604051908152a1005b346102aa5761049336612440565b929161049d6127be565b6011546001600160a01b03163303610b2d576001600160a01b038316918215610320576010546001600160a01b031693600092908515610b1e578615968780610b16575b80610afe575b610aef576104f582866132a2565b848052600960205260408520868652602052604085205494808052600a6020526040812087825260205260408120549361052f858861259b565b998a15610ae057828052600960205260408320898452602052826040812055828052600a602052604083208984526020528260408120558715159a8b610ac2575b86610aa4575b838052600b602052604084208a855260205283604081205587911597886109d3575b50838215809d819e6109cb575b506108f6575b6105b8906105be92612477565b866134cf565b9687156108e75783546040516370a0823160e01b81523060048201526001600160a01b0390911690602081602481855afa9081156108dc5786916108a6575b508980821091821561088c575b505061087d5790610621898d8198979695946137fc565b15610716575050604051634cba16e360e11b81526001600160a01b03949094166004850152506024830152604482015260208160648160008a5af190811561070a576000916106cf575b50926020966000805160206139808339815191529360a093610699600097995b600180881b03895416613747565b604051938452898401526040830152866060830152156080820152a360016000805160206139c083398151915255604051908152f35b91929390506020823d602011610702575b816106ed60209383612402565b810103126102aa57905190929190602061066b565b3d91506106e0565b6040513d6000823e3d90fd5b9193509150156107c057505060405163daae40a360e01b81526001600160a01b039190911660048201526024810183905260208160448160008a5af190811561070a57600091610785575b50926020966000805160206139808339815191529360a0936106996000979961068b565b91929390506020823d6020116107b8575b816107a360209383612402565b810103126102aa579051909291906020610761565b3d9150610796565b6040516329b55ca760e01b81526001600160a01b0393909316600484015260248301859052604483015293969390602081606481858b5af191821561087157809261082b575b5050956000936000805160206139808339815191529360a09361069960209a9961068b565b9091506020823d602011610869575b8161084760209383612402565b8101031261086657505183600080516020613980833981519152610806565b80fd5b3d915061083a565b604051903d90823e3d90fd5b6306952df560e31b8552600485fd5b6108969250612477565b61089e6126fc565b11898f61060a565b90506020813d6020116108d4575b816108c160209383612402565b810103126108d057518e6105fd565b8580fd5b3d91506108b4565b6040513d88823e3d90fd5b6312d37ee560e31b8452600484fd5b50600a8904908115801561090c575b50906105ab565b858052600460205260408620541561099257670de0b6b3a7640000830290838204670de0b6b3a764000014171561097e57916105b89161095c6105be94888052600460205260408920549061286e565b87805260066020526109736040892091825461259b565b90555b915091610905565b634e487b7160e01b86526011600452602486fd5b50600e546001600160a01b031680156109bc57916105b8916109b7826105be956133df565b610976565b63d92e233d60e01b8652600486fd5b90508e6105a5565b60405163d68f4dd160e01b815260048101879052919250906080816024818f5afa8015610a99578590610a2c575b6060915001908151151590151503610a1d57511515908c610598565b6339c48a0160e01b8452600484fd5b506080813d608011610a91575b81610a4660809383612402565b81010312610a8d57606060405191610a5d836123d0565b805183526020810151602084015260408101516040840152015180151581036108d0579060609182820152610a01565b8480fd5b3d9150610a39565b6040513d87823e3d90fd5b838052600560205260408420610abb888254612477565b9055610576565b838052600460205260408420610ad98a8254612477565b9055610570565b6312d37ee560e31b8352600483fd5b637616640160e01b8552600485fd5b50620151808310806104e75750629e340083116104e7565b5083156104e1565b63d92e233d60e01b8452600484fd5b6282b42960e81b60005260046000fd5b346102aa5760203660031901126102aa57610b566123ba565b610b5e6127be565b6002546001600160a01b03163303610b2d576001600160a01b0381161561032057610b8a602091612e14565b60016000805160206139c0833981519152556040519015158152f35b346102aa57610bb436612440565b9291610bbe6127be565b6011546001600160a01b03163303610b2d576001600160a01b038316918215610320576010546001600160a01b031693600092908515610b1e57861596878061115f575b80611147575b610aef57610c178260016132a2565b6001855260096020526040852086865260205260408520549460018152600a60205260408120878252602052604081205493610c53858861259b565b998a15610ae0576001835260096020526040832089845260205282604081205560018352600a602052604083208984526020528260408120558715159a8b611128575b86611109575b60018452600b602052604084208a85526020528360408120558791159788611056575b50838215809d819e61104e575b50610f99575b6105b890610cdf92612477565b9687156108e75783546040516370a0823160e01b81523060048201526001600160a01b0390911690602081602481855afa9081156108dc578691610f67575b5089808210918215610f4d575b505061087d5790610d42898d8198979695946137fc565b15610df5575050604051634cba16e360e11b81526001600160a01b03949094166004850152506024830152604482015260208160648160008a5af190811561070a57600091610dba575b50926020966000805160206139808339815191529360a093610699600197995b8880881b0360005416613747565b91929390506020823d602011610ded575b81610dd860209383612402565b810103126102aa579051909291906020610d8c565b3d9150610dcb565b919350915015610e9f57505060405163daae40a360e01b81526001600160a01b039190911660048201526024810183905260208160448160008a5af190811561070a57600091610e64575b50926020966000805160206139808339815191529360a09361069960019799610dac565b91929390506020823d602011610e97575b81610e8260209383612402565b810103126102aa579051909291906020610e40565b3d9150610e75565b6040516329b55ca760e01b81526001600160a01b0393909316600484015260248301859052604483015293969390602081606481858b5af1918215610871578092610f0a575b5050956001936000805160206139808339815191529360a09361069960209a99610dac565b9091506020823d602011610f45575b81610f2660209383612402565b8101031261086657505183600080516020613980833981519152610ee5565b3d9150610f19565b610f579250612477565b610f5f6126fc565b11898f610d2b565b90506020813d602011610f91575b81610f8260209383612402565b810103126108d057518e610d1e565b3d9150610f75565b50600a89049081158015610faf575b5090610cd2565b60018652600460205260408620541561102457670de0b6b3a7640000830290838204670de0b6b3a764000014171561097e57916105b891611001610cdf9460018952600460205260408920549061286e565b6001885260066020526110196040892091825461259b565b90555b915091610fa8565b50600e546001600160a01b031680156109bc57916105b89161104982610cdf956133df565b61101c565b90508e610ccc565b60405163d68f4dd160e01b815260048101879052919250906080816024818f5afa8015610a995785906110a0575b6060915001908151151590151503610a1d57511515908c610cbf565b506080813d608011611101575b816110ba60809383612402565b81010312610a8d576060604051916110d1836123d0565b805183526020810151602084015260408101516040840152015180151581036108d0579060609182820152611084565b3d91506110ad565b60018452600560205260408420611121888254612477565b9055610c9c565b600184526004602052604084206111408a8254612477565b9055610c96565b5062015180831080610c085750629e34008311610c08565b508315610c02565b346102aa5760003660031901126102aa57600080516020613a00833981519152546040516001600160a01b039091168152602090f35b346102aa5760403660031901126102aa576111b6612394565b60ff6111c06123a4565b9116600052600960205260406000209060018060a01b03166000526020526020604060002054604051908152f35b346102aa5760203660031901126102aa576112076123ba565b61120f6127be565b6002546001600160a01b03163303610b2d576001600160a01b038116156103205761124361123d828061315e565b91612e14565b90159081611276575b506112655760016000805160206139c083398151915255005b6312d37ee560e31b60005260046000fd5b9050158161124c565b346102aa5760403660031901126102aa5760206112b361129d6123ba565b6112a56123a4565b906112ae6127be565b612602565b60016000805160206139c083398151915255604051908152f35b346102aa5760203660031901126102aa576112e66123ba565b6001600160a01b031660009081527fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6b602090815260409182902054915191825290f35b346102aa5760403660031901126102aa57611342612394565b60ff61134c6123a4565b9116600052600b60205260406000209060018060a01b03166000526020526020604060002054604051908152f35b346102aa5760003660031901126102aa576020600d54604051908152f35b346102aa5760203660031901126102aa576113b16123ba565b6001600160a01b031660009081527f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a36602090815260409182902054915191825290f35b346102aa5760203660031901126102aa5761140d6123ba565b6114156130cf565b6001600160a01b03168015610320576020817f7a14e4e0b52b7505a3f7713e51c3d0d272fab04ba4c9f88e69efcfafa7a79cd4926001600160601b0360a01b6011541617601155604051908152a1005b346102aa5760203660031901126102aa5761147e6123ba565b6114866130cf565b6001600160a01b03168015610320576020817fb53fa3ac8a5a3b4074ef200f128c7e87d27e53afb9d98d33f5ea003e60b4c270926001600160601b0360a01b6002541617600255604051908152a1005b346102aa5760203660031901126102aa5760ff6114f1612394565b1660005260046020526020604060002054604051908152f35b346102aa5760203660031901126102aa576115236123ba565b61152b6130cf565b6001600160a01b03168015610320576020817f69f07d1af215b909dfab0e8b66057d9e46d6bb01581779a372e1a45ff6ac8bdc926001600160601b0360a01b600f541617600f55604051908152a1005b346102aa5760003660031901126102aa57604080519061159b8183612402565b60058252640352e302e360dc1b6020830152805180926020825280519081602084015260005b8281106115e05750506000828201840152601f01601f19168101030190f35b6020828201810151878301870152869450016115c1565b346102aa5760003660031901126102aa5760206102a26125a8565b346102aa5760003660031901126102aa576001546040516001600160a01b039091168152602090f35b346102aa5760003660031901126102aa576010546040516001600160a01b039091168152602090f35b346102aa5760003660031901126102aa57600080516020613920833981519152546040516001600160a01b039091168152602090f35b346102aa5760203660031901126102aa5760ff6116b5612394565b1660005260076020526020604060002054604051908152f35b346102aa5760203660031901126102aa576116e76123ba565b6001600160a01b03166000908152600080516020613960833981519152602090815260409182902054915191825290f35b346102aa5760003660031901126102aa576002546040516001600160a01b039091168152602090f35b346102aa5760203660031901126102aa5761175a6123ba565b6117626130cf565b6001600160a01b03168015610320576020817fcd3a43dfa5cb61832c23a223b6ab0d4133925fc029f53d65ddc19019488a4f7e926001600160601b0360a01b6001541617600155604051908152a1005b346102aa5760003660031901126102aa57600080516020613a0083398151915254336001600160a01b03909116036117ed5761001b336130f0565b63118cdaa760e01b6000523360045260246000fd5b346102aa5760003660031901126102aa576011546040516001600160a01b039091168152602090f35b346102aa5760003660031901126102aa576118446130cf565b600080516020613a0083398151915280546001600160a01b0319908116909155600080516020613920833981519152805491821690556000906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346102aa5760203660031901126102aa576118c56123ba565b6118cd6130cf565b6001600160a01b03168015610320576020817f9d4414af8d61d821c1ad25f0aadfa28aa386c452716a31fc1f7fdbd9b9d364dc926001600160601b0360a01b6003541617600355604051908152a1005b346102aa5760003660031901126102aa57600e546040516001600160a01b039091168152602090f35b346102aa5760003660031901126102aa57600f546040516001600160a01b039091168152602090f35b346102aa5760003660031901126102aa576119886127be565b600f546001600160a01b03163303610b2d57601254801561126557602090600060125560016000805160206139c083398151915255604051908152f35b346102aa5760203660031901126102aa576119de6123ba565b6001600160a01b031660009081527f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e3602090815260409182902054915191825290f35b346102aa5760003660031901126102aa576000546040516001600160a01b039091168152602090f35b346102aa5760003660031901126102aa577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163003611aa35760206040516000805160206139408339815191528152f35b63703e46dd60e11b60005260046000fd5b346102aa5760403660031901126102aa57611acd612394565b60ff611ad76123a4565b9116600052600860205260406000209060018060a01b03166000526020526020604060002054604051908152f35b60403660031901126102aa57611b196123ba565b6024359067ffffffffffffffff82116102aa57366023830112156102aa57816004013590611b4682612424565b91611b546040519384612402565b808352602083019336602483830101116102aa57816000926024602093018737840101526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016308114908115611cfb575b50611aa357611bba6130cf565b6040516352d1902d60e01b81526001600160a01b0382169390602081600481885afa60009181611cc7575b50611bff5784634c9c8ce360e01b60005260045260246000fd5b80600080516020613940833981519152869203611cb35750823b15611c9f5760008051602061394083398151915280546001600160a01b031916821790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2825115611c84576000809161001b945190845af4611c7e612ab5565b916138be565b50505034611c8e57005b63b398979f60e01b60005260046000fd5b634c9c8ce360e01b60005260045260246000fd5b632a87526960e21b60005260045260246000fd5b9091506020813d602011611cf3575b81611ce360209383612402565b810103126102aa57519086611be5565b3d9150611cd6565b600080516020613940833981519152546001600160a01b03161415905084611bad565b346102aa5760003660031901126102aa576003546040516001600160a01b039091168152602090f35b346102aa5760203660031901126102aa5760ff611d62612394565b1660005260056020526020604060002054604051908152f35b346102aa5760403660031901126102aa57611d946123ba565b611d9c6123a4565b6000805160206139e0833981519152549160ff8360401c16159267ffffffffffffffff811680159081611f62575b6001149081611f58575b159081611f4f575b50611f3e5767ffffffffffffffff1981166001176000805160206139e08339815191525583611f11575b506001600160a01b03169081158015611f00575b61032057611e26613719565b611e2e613719565b6001600160a01b03811615611eea57611e46906130f0565b611e4e613719565b611e56613719565b611e5e613719565b60016000805160206139c083398151915255611e78613719565b6001600160601b0360a01b6000541617600055611e9157005b68ff0000000000000000196000805160206139e083398151915254166000805160206139e0833981519152557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a1005b631e4fbdf760e01b600052600060045260246000fd5b506001600160a01b03811615611e1a565b68ffffffffffffffffff191668010000000000000001176000805160206139e08339815191525583611e06565b63f92ee8a960e01b60005260046000fd5b90501585611ddc565b303b159150611dd4565b859150611dca565b346102aa5760203660031901126102aa57611f836123ba565b6001600160a01b031660009081527f5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c7602090815260409182902054915191825290f35b346102aa5760003660031901126102aa57602060405160008152f35b346102aa5760203660031901126102aa5760ff611ffd612394565b1660005260066020526020604060002054604051908152f35b346102aa5760203660031901126102aa5761202f6123ba565b6120376127be565b6001546001600160a01b03163303610b2d576001600160a01b0381161561032057610b8a602091612b53565b346102aa5760403660031901126102aa5761207c612394565b60ff6120866123a4565b9116600052600a60205260406000209060018060a01b03166000526020526020604060002054604051908152f35b60403660031901126102aa576120c8612394565b6120d06123a4565b6120d86127be565b6120e06127fa565b6120e98261282a565b6001600160a01b03169081156103205734156121825760ff16806000526008602052604060002082600052602052604060002061212734825461259b565b9055806000526007602052604060002061214234825461259b565b90557f17da4acb7a5ee08d35c02139ac2700696db1184cf766e08d880d5f8bba0081656020604051348152a360016000805160206139c083398151915255005b63162908e360e11b60005260046000fd5b346102aa5760003660031901126102aa576020600c54604051908152f35b346102aa5760403660031901126102aa5760206112b36121cf6123ba565b6121d76123a4565b906121e06127be565b61249a565b346102aa5760003660031901126102aa57602060405160018152f35b346102aa5760603660031901126102aa5761221a612394565b6122226123a4565b6044359061222e6127be565b6122366127fa565b61223f8361282a565b6001600160a01b0381169283156103205782156121825760ff6020916122ca7f45b5babf8a77395df16a09905e2614f5b52d55b7bb5c273a0789fda372ee8b0d946122c460018060a01b0360005416604051906323b872dd60e01b88830152336024830152306044830152896064830152606482526122bf608483612402565b613247565b826132a2565b16928360005260098252604060002085600052825260406000206122ef82825461259b565b90558360005260048252604060002061230982825461259b565b905583600052600982526040600020856000528252670de0b6b3a764000061234460406000205486600052600685526040600020549061285b565b0484600052600b83526040600020866000528352604060002055604051908152a360016000805160206139c083398151915255005b346102aa5760003660031901126102aa576020906012548152f35b6004359060ff821682036102aa57565b602435906001600160a01b03821682036102aa57565b600435906001600160a01b03821682036102aa57565b6080810190811067ffffffffffffffff8211176123ec57604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176123ec57604052565b67ffffffffffffffff81116123ec57601f01601f191660200190565b60809060031901126102aa576004356001600160a01b03811681036102aa57906024359060443580151581036102aa579060643590565b9190820391821161248457565b634e487b7160e01b600052601160045260246000fd5b6002549192916001600160a01b031633141580612586575b610b2d576001600160a01b0381169081158015612575575b610320576000828152600080516020613960833981519152602052604090205490811561256c5761253e91612537916001600052600860205260406000208560005260205260006040812055600160005260076020526040600020612530838254612477565b90556128ad565b8094612ae5565b60017f449b9273ffcbae116c106c36c0ed2c68c318a35842de623aa960b815bd631bcf6020604051868152a3565b50600093505050565b506001600160a01b038416156124ca565b506011546001600160a01b03163314156124b2565b9190820180921161248457565b60076020527f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df5460016000527fb39221ace053465ec3453ce2b36430bd138b997ecea25c1043da0c366812b828546125ff9161259b565b90565b6001549192916001600160a01b0316331415806126e7575b610b2d576001600160a01b03811690811580156126d6575b6103205760008281527f5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c7602052604090205490811561256c576126a89161253791600080526008602052604060002085600052602052600060408120556000805260076020526040600020612530838254612477565b60007f449b9273ffcbae116c106c36c0ed2c68c318a35842de623aa960b815bd631bcf6020604051868152a3565b506001600160a01b03841615612632565b506011546001600160a01b031633141561261a565b600080527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec5460056020527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc546125ff9161278c9161275a9161259b565b600160005260046020527fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe05549061259b565b600160005260056020527f1471eb6eb2c5e789fc3de43f8ce62938c7d1836ec861730447e2ada8fd81017b549061259b565b60026000805160206139c083398151915254146127e95760026000805160206139c083398151915255565b633ee5aeb560e01b60005260046000fd5b6001546001600160a01b031633141580612815575b610b2d57565b506002546001600160a01b031633141561280f565b60ff16801515908161284f575b5061283e57565b639885618760e01b60005260046000fd5b60019150141538612837565b8181029291811591840414171561248457565b8115612878570490565b634e487b7160e01b600052601260045260246000fd5b908160209103126102aa57516001600160a01b03811681036102aa5790565b600092918015612ab1576003546001600160a01b031680612a4957845b6001600160a01b03168061299157505060c8810491821561298b57600e546001600160a01b031680156109bc5761290384600c5461259b565b600c5585813b156108665784916004604051809481936302beab6360e41b83525af180156108dc57612976575b506125ff9394507f03081c2e39463b06ec1824c5612f9c79e6b7e81e5afc1dd2edc4ad5f5f5ff00160408051928584526001602085015260018060a01b031692a2612477565b612981868092612402565b610a8d5784612930565b50925050565b90939260648304948515612a3f57803b15612a3b57958086976024604098979851809a8193631482a0c360e31b83528860048401525af1968715612a2e576125ff9697612a1e575b505060408051858152600160208201526001600160a01b03909216917f4b64f7b8ae5ed52b2d130cc9273db96bb1d28fa3da80f336ce0d0ba8438ec7759190a3612477565b81612a2891612402565b386129d9565b50604051903d90823e3d90fd5b8680fd5b5050509150915090565b60405163d21cacdf60e01b81526001600160a01b0384166004820152602081602481855afa9081156108dc578691612a82575b506128ca565b612aa4915060203d602011612aaa575b612a9c8183612402565b81019061288e565b38612a7c565b503d612a92565b5050565b3d15612ae0573d90612ac682612424565b91612ad46040519384612402565b82523d6000602084013e565b606090565b8115612ab1574782808210918215612b39575b5050612b2857600080809381935af1612b0f612ab5565b5015612b1757565b6312171d8360e31b60005260046000fd5b6373214f8760e11b60005260046000fd5b612b439250612477565b612b4b6125a8565b118238612af8565b612b5e8160006132a2565b6001600160a01b03811660009081527fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6b60209081526040808320547f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e3909252909120549091612bcd828461259b565b918215612e0b576001600160a01b03821660009081527fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6b602090815260408083208390557f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e390915281205583151580612deb575b81612dcb575b600090612cc7575b9160809183612c78612c726000805160206139a083398151915296600098612477565b846134cf565b91612c8383856133df565b868052600b6020526040872060018060a01b038516885260205286604081205560405197885260208801526040870152606086015260018060a01b031693a3600190565b50600a84049283158015612cdd575b5092612c4f565b6000805260046020527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec54909391929015612d8c57670de0b6b3a7640000850293858504670de0b6b3a76400001417156124845784612c78612c72600097608096612d646000805160206139a0833981519152998b8052600460205260408c20549061286e565b8a80526006602052612d7b60408c2091825461259b565b90555b959750505050945091612cd6565b600e546001600160a01b0316935083156103205784612c78612c7282608096612dc660009a6000805160206139a08339815191529a6133df565b612d7e565b6000805260056020526040600020612de4838254612477565b9055612c47565b6000805260046020526040600020612e04868254612477565b9055612c41565b50505050600090565b612e1f8160016132a2565b6001600160a01b03811660009081527f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a3660209081526040808320547fbbc70db1b6c7afd11e79c0fb0051300458f1a3acb8ee9789d9b6b26c61ad9bc7909252909120549091612e8e828461259b565b918215612e0b576001600160a01b03821660009081527f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a36602090815260408083208390557fbbc70db1b6c7afd11e79c0fb0051300458f1a3acb8ee9789d9b6b26c61ad9bc7909152812055831515806130ae575b8161308d575b600090612f84575b9160809183612f33612c726000805160206139a083398151915296600198612477565b91612f3e83856133df565b86600052600b6020526040600020878060a01b03851660005260205260006040812055604051978852602088015260408701526060860152838060a01b031693a3600190565b50600a84049283158015612f9a575b5092612f10565b600160005260046020527fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe055490939192901561304e57670de0b6b3a7640000850293858504670de0b6b3a76400001417156124845784612f33612c726001976080966130246000805160206139a0833981519152998b60005260046020526040600020549061286e565b8a600052600660205261303d604060002091825461259b565b90555b959750505050945091612f93565b600e546001600160a01b0316935083156103205784612f33612c728260809661308860019a6000805160206139a08339815191529a6133df565b613040565b6001600052600560205260406000206130a7838254612477565b9055612f08565b6001600052600460205260406000206130c8868254612477565b9055612f02565b600080516020613920833981519152546001600160a01b031633036117ed57565b600080516020613a0083398151915280546001600160a01b031990811690915560008051602061392083398151915280549182166001600160a01b0393841690811790915591167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b6001600160a01b0381166000908152600080516020613960833981519152602052604090205490811561323f576001600160a01b0381166000908152600080516020613960833981519152602090815260408220829055600191829052600781527fb39221ace053465ec3453ce2b36430bd138b997ecea25c1043da0c366812b828805492947f449b9273ffcbae116c106c36c0ed2c68c318a35842de623aa960b815bd631bcf94929361322b92613224929161321c908390612477565b9055836128ad565b8096612ae5565b604051948552838060a01b031693a3600190565b505050600090565b906000602091828151910182855af11561070a576000513d61329957506001600160a01b0381163b155b6132785750565b635274afe760e01b60009081526001600160a01b0391909116600452602490fd5b60011415613271565b60ff1690816000526009602052604060002060018060a01b03821660005260205260406000205480156133b857613338670de0b6b3a764000091846000526006602052826132f56040600020548361285b565b0485600052600b602052604060002060018060a01b03861660005260205260406000205480821161335e575b50508460005260066020526040600020549061285b565b0491600052600b60205260406000209060018060a01b0316600052602052604060002055565b61336791612477565b85600052600a602052604060002060018060a01b038616600052602052604060002061339482825461259b565b90558560005260056020526133af604060002091825461259b565b90553880613321565b5090600052600b60205260406000209060018060a01b031660005260205260006040812055565b908015612ab1576000546040516370a0823160e01b81523060048201526001600160a01b0390911690602081602481855afa90811561070a5760009161349d575b5082808210918215613483575b50506134725760405163a9059cbb60e01b60208201526001600160a01b0393909316602484015260448084019290925290825261347091906122bf606483612402565b565b6306952df560e31b60005260046000fd5b61348d9250612477565b6134956126fc565b11823861342d565b906020823d6020116134c7575b816134b760209383612402565b8101031261086657505138613420565b3d91506134aa565b600092918015612ab1576003546001600160a01b0316806136c157845b6001600160a01b038116806135c05750505060c8810491821561298b5761351583600d5461259b565b600d556135248360125461259b565b601255845485906001600160a01b0316803b156135bc578190602460405180948193630852cd8d60e31b83528960048401525af180156108dc576135a7575b50937f03081c2e39463b06ec1824c5612f9c79e6b7e81e5afc1dd2edc4ad5f5f5ff00160406125ff9596815193868552602085015260018060a01b031692a2612477565b6135b2868092612402565b610a8d5738613563565b5080fd5b91959093606484049485156136b75782546135e79087908a906001600160a01b03166137fc565b873b156136b35760405163fdb266ab60e01b81526001600160a01b03919091166004820152602481018690529682908890604490829084905af19687156136a8576125ff9697613671575b5060407f4b64f7b8ae5ed52b2d130cc9273db96bb1d28fa3da80f336ce0d0ba8438ec77591815193878552602085015260018060a01b031692a3612477565b826136a07f4b64f7b8ae5ed52b2d130cc9273db96bb1d28fa3da80f336ce0d0ba8438ec7759394604093612402565b929150613632565b6040513d84823e3d90fd5b8280fd5b5092955050505050565b60405163d21cacdf60e01b81526001600160a01b0384166004820152602081602481855afa9081156108dc5786916136fa575b506134ec565b613713915060203d602011612aaa57612a9c8183612402565b386136f4565b60ff6000805160206139e08339815191525460401c161561373657565b631afcd79f60e31b60005260046000fd5b60405190602060008184019463095ea7b360e01b865260018060a01b03169485602486015281604486015260448552613781606486612402565b84519082855af16000513d826137d7575b50501561379e57505050565b6122bf613470936040519063095ea7b360e01b6020830152602482015260006044820152604481526137d1606482612402565b82613247565b9091506137f457506001600160a01b0381163b15155b3880613792565b6001146137ed565b60405163095ea7b360e01b60208083019182526001600160a01b03851660248401526044808401969096529482529293909260009061383c606486612402565b84519082855af16000513d82613899575b50501561385957505050565b60405163095ea7b360e01b60208201526001600160a01b03909316602484015260006044808501919091528352613470926122bf906137d1606482612402565b9091506138b657506001600160a01b0381163b15155b388061384d565b6001146138af565b906138e457508051156138d357805190602001fd5b63d6bda27560e01b60005260046000fd5b81511580613916575b6138f5575090565b639996b31560e01b60009081526001600160a01b0391909116600452602490fd5b50803b156138ed56fe9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcad67d757c34507f157cacfa2e3153e9f260a2244f30428821be7be64587ac55f3101190a0741c9d7e3db924538c82b75a57dff2bc83e13673e6995daa367457d889a6f94e29e815b629cacd58efb839182d6a4e9e48ac11ae92d93f4d57d20809b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00a26469706673582212209d06ac2e132928aa74c4668ed36bdc1ba2fe8f4c0cce4c7f00e691712bbf488664736f6c634300081c0033
0x608080604052600436101561001d575b50361561001b57600080fd5b005b60003560e01c9081630130184b146123795750806301fc161f1461220157806303912b73146121e557806303b9e8b4146121b157806304472e9d1461219357806306a7385a146120b45780630b7415bf1461206357806312cb9acb146120165780631708379e14611fe257806332aa465114611fc65780633e061eba14611f6a578063485cc95514611d7b5780634a0e472514611d475780634e627e6214611d1e5780634f1ef28614611b055780634f44092414611ab457806352d1902d14611a4a578063556fe77514611a21578063582fac84146119c55780635eccc21a1461196f578063619f3d6c1461194657806361d027b31461191d5780636a79115f146118ac578063715018a61461182b57806378cd01d81461180257806379ba5097146117b25780637d796d07146117415780637d9f6db5146117185780637eaf9a3a146116ce57806388aa54de1461169a5780638da5cb5b146116645780639019a2851461163b578063a23836ef14611612578063a8d4a550146115f7578063ad3cb1cc1461157b578063ae4b7cbc1461150a578063b1c65836146114d6578063b8c6f57914611465578063c2b3857f146113f4578063ccbb616914611398578063cd91b37a1461137a578063d531558b14611329578063d96614c8146112cd578063deb9bc2d1461127f578063e05b4048146111ee578063e09c09611461119d578063e30c397814611167578063e481dc6314610ba6578063e962157914610b3d578063ed90d98f14610485578063f0f4426014610414578063f2bef6d2146103b8578063f2fde38b14610331578063f9978083146102af5763fe02333d14610287573861000f565b346102aa5760003660031901126102aa5760206102a26126fc565b604051908152f35b600080fd5b346102aa5760203660031901126102aa576102c86123ba565b6102d06130cf565b6001600160a01b03168015610320576020817fb0ff1d8af6c056684758f6e94158cd3f5459120431b95ff20225f71502bf9422926001600160601b0360a01b6010541617601055604051908152a1005b63d92e233d60e01b60005260046000fd5b346102aa5760203660031901126102aa5761034a6123ba565b6103526130cf565b600080516020613a0083398151915280546001600160a01b0319166001600160a01b03928316908117909155600080516020613920833981519152549091167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700600080a3005b346102aa5760203660031901126102aa576103d16123ba565b6001600160a01b031660009081527fbbc70db1b6c7afd11e79c0fb0051300458f1a3acb8ee9789d9b6b26c61ad9bc7602090815260409182902054915191825290f35b346102aa5760203660031901126102aa5761042d6123ba565b6104356130cf565b6001600160a01b03168015610320576020817f7dae230f18360d76a040c81f050aa14eb9d6dc7901b20fc5d855e2a20fe814d1926001600160601b0360a01b600e541617600e55604051908152a1005b346102aa5761049336612440565b929161049d6127be565b6011546001600160a01b03163303610b2d576001600160a01b038316918215610320576010546001600160a01b031693600092908515610b1e578615968780610b16575b80610afe575b610aef576104f582866132a2565b848052600960205260408520868652602052604085205494808052600a6020526040812087825260205260408120549361052f858861259b565b998a15610ae057828052600960205260408320898452602052826040812055828052600a602052604083208984526020528260408120558715159a8b610ac2575b86610aa4575b838052600b602052604084208a855260205283604081205587911597886109d3575b50838215809d819e6109cb575b506108f6575b6105b8906105be92612477565b866134cf565b9687156108e75783546040516370a0823160e01b81523060048201526001600160a01b0390911690602081602481855afa9081156108dc5786916108a6575b508980821091821561088c575b505061087d5790610621898d8198979695946137fc565b15610716575050604051634cba16e360e11b81526001600160a01b03949094166004850152506024830152604482015260208160648160008a5af190811561070a576000916106cf575b50926020966000805160206139808339815191529360a093610699600097995b600180881b03895416613747565b604051938452898401526040830152866060830152156080820152a360016000805160206139c083398151915255604051908152f35b91929390506020823d602011610702575b816106ed60209383612402565b810103126102aa57905190929190602061066b565b3d91506106e0565b6040513d6000823e3d90fd5b9193509150156107c057505060405163daae40a360e01b81526001600160a01b039190911660048201526024810183905260208160448160008a5af190811561070a57600091610785575b50926020966000805160206139808339815191529360a0936106996000979961068b565b91929390506020823d6020116107b8575b816107a360209383612402565b810103126102aa579051909291906020610761565b3d9150610796565b6040516329b55ca760e01b81526001600160a01b0393909316600484015260248301859052604483015293969390602081606481858b5af191821561087157809261082b575b5050956000936000805160206139808339815191529360a09361069960209a9961068b565b9091506020823d602011610869575b8161084760209383612402565b8101031261086657505183600080516020613980833981519152610806565b80fd5b3d915061083a565b604051903d90823e3d90fd5b6306952df560e31b8552600485fd5b6108969250612477565b61089e6126fc565b11898f61060a565b90506020813d6020116108d4575b816108c160209383612402565b810103126108d057518e6105fd565b8580fd5b3d91506108b4565b6040513d88823e3d90fd5b6312d37ee560e31b8452600484fd5b50600a8904908115801561090c575b50906105ab565b858052600460205260408620541561099257670de0b6b3a7640000830290838204670de0b6b3a764000014171561097e57916105b89161095c6105be94888052600460205260408920549061286e565b87805260066020526109736040892091825461259b565b90555b915091610905565b634e487b7160e01b86526011600452602486fd5b50600e546001600160a01b031680156109bc57916105b8916109b7826105be956133df565b610976565b63d92e233d60e01b8652600486fd5b90508e6105a5565b60405163d68f4dd160e01b815260048101879052919250906080816024818f5afa8015610a99578590610a2c575b6060915001908151151590151503610a1d57511515908c610598565b6339c48a0160e01b8452600484fd5b506080813d608011610a91575b81610a4660809383612402565b81010312610a8d57606060405191610a5d836123d0565b805183526020810151602084015260408101516040840152015180151581036108d0579060609182820152610a01565b8480fd5b3d9150610a39565b6040513d87823e3d90fd5b838052600560205260408420610abb888254612477565b9055610576565b838052600460205260408420610ad98a8254612477565b9055610570565b6312d37ee560e31b8352600483fd5b637616640160e01b8552600485fd5b50620151808310806104e75750629e340083116104e7565b5083156104e1565b63d92e233d60e01b8452600484fd5b6282b42960e81b60005260046000fd5b346102aa5760203660031901126102aa57610b566123ba565b610b5e6127be565b6002546001600160a01b03163303610b2d576001600160a01b0381161561032057610b8a602091612e14565b60016000805160206139c0833981519152556040519015158152f35b346102aa57610bb436612440565b9291610bbe6127be565b6011546001600160a01b03163303610b2d576001600160a01b038316918215610320576010546001600160a01b031693600092908515610b1e57861596878061115f575b80611147575b610aef57610c178260016132a2565b6001855260096020526040852086865260205260408520549460018152600a60205260408120878252602052604081205493610c53858861259b565b998a15610ae0576001835260096020526040832089845260205282604081205560018352600a602052604083208984526020528260408120558715159a8b611128575b86611109575b60018452600b602052604084208a85526020528360408120558791159788611056575b50838215809d819e61104e575b50610f99575b6105b890610cdf92612477565b9687156108e75783546040516370a0823160e01b81523060048201526001600160a01b0390911690602081602481855afa9081156108dc578691610f67575b5089808210918215610f4d575b505061087d5790610d42898d8198979695946137fc565b15610df5575050604051634cba16e360e11b81526001600160a01b03949094166004850152506024830152604482015260208160648160008a5af190811561070a57600091610dba575b50926020966000805160206139808339815191529360a093610699600197995b8880881b0360005416613747565b91929390506020823d602011610ded575b81610dd860209383612402565b810103126102aa579051909291906020610d8c565b3d9150610dcb565b919350915015610e9f57505060405163daae40a360e01b81526001600160a01b039190911660048201526024810183905260208160448160008a5af190811561070a57600091610e64575b50926020966000805160206139808339815191529360a09361069960019799610dac565b91929390506020823d602011610e97575b81610e8260209383612402565b810103126102aa579051909291906020610e40565b3d9150610e75565b6040516329b55ca760e01b81526001600160a01b0393909316600484015260248301859052604483015293969390602081606481858b5af1918215610871578092610f0a575b5050956001936000805160206139808339815191529360a09361069960209a99610dac565b9091506020823d602011610f45575b81610f2660209383612402565b8101031261086657505183600080516020613980833981519152610ee5565b3d9150610f19565b610f579250612477565b610f5f6126fc565b11898f610d2b565b90506020813d602011610f91575b81610f8260209383612402565b810103126108d057518e610d1e565b3d9150610f75565b50600a89049081158015610faf575b5090610cd2565b60018652600460205260408620541561102457670de0b6b3a7640000830290838204670de0b6b3a764000014171561097e57916105b891611001610cdf9460018952600460205260408920549061286e565b6001885260066020526110196040892091825461259b565b90555b915091610fa8565b50600e546001600160a01b031680156109bc57916105b89161104982610cdf956133df565b61101c565b90508e610ccc565b60405163d68f4dd160e01b815260048101879052919250906080816024818f5afa8015610a995785906110a0575b6060915001908151151590151503610a1d57511515908c610cbf565b506080813d608011611101575b816110ba60809383612402565b81010312610a8d576060604051916110d1836123d0565b805183526020810151602084015260408101516040840152015180151581036108d0579060609182820152611084565b3d91506110ad565b60018452600560205260408420611121888254612477565b9055610c9c565b600184526004602052604084206111408a8254612477565b9055610c96565b5062015180831080610c085750629e34008311610c08565b508315610c02565b346102aa5760003660031901126102aa57600080516020613a00833981519152546040516001600160a01b039091168152602090f35b346102aa5760403660031901126102aa576111b6612394565b60ff6111c06123a4565b9116600052600960205260406000209060018060a01b03166000526020526020604060002054604051908152f35b346102aa5760203660031901126102aa576112076123ba565b61120f6127be565b6002546001600160a01b03163303610b2d576001600160a01b038116156103205761124361123d828061315e565b91612e14565b90159081611276575b506112655760016000805160206139c083398151915255005b6312d37ee560e31b60005260046000fd5b9050158161124c565b346102aa5760403660031901126102aa5760206112b361129d6123ba565b6112a56123a4565b906112ae6127be565b612602565b60016000805160206139c083398151915255604051908152f35b346102aa5760203660031901126102aa576112e66123ba565b6001600160a01b031660009081527fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6b602090815260409182902054915191825290f35b346102aa5760403660031901126102aa57611342612394565b60ff61134c6123a4565b9116600052600b60205260406000209060018060a01b03166000526020526020604060002054604051908152f35b346102aa5760003660031901126102aa576020600d54604051908152f35b346102aa5760203660031901126102aa576113b16123ba565b6001600160a01b031660009081527f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a36602090815260409182902054915191825290f35b346102aa5760203660031901126102aa5761140d6123ba565b6114156130cf565b6001600160a01b03168015610320576020817f7a14e4e0b52b7505a3f7713e51c3d0d272fab04ba4c9f88e69efcfafa7a79cd4926001600160601b0360a01b6011541617601155604051908152a1005b346102aa5760203660031901126102aa5761147e6123ba565b6114866130cf565b6001600160a01b03168015610320576020817fb53fa3ac8a5a3b4074ef200f128c7e87d27e53afb9d98d33f5ea003e60b4c270926001600160601b0360a01b6002541617600255604051908152a1005b346102aa5760203660031901126102aa5760ff6114f1612394565b1660005260046020526020604060002054604051908152f35b346102aa5760203660031901126102aa576115236123ba565b61152b6130cf565b6001600160a01b03168015610320576020817f69f07d1af215b909dfab0e8b66057d9e46d6bb01581779a372e1a45ff6ac8bdc926001600160601b0360a01b600f541617600f55604051908152a1005b346102aa5760003660031901126102aa57604080519061159b8183612402565b60058252640352e302e360dc1b6020830152805180926020825280519081602084015260005b8281106115e05750506000828201840152601f01601f19168101030190f35b6020828201810151878301870152869450016115c1565b346102aa5760003660031901126102aa5760206102a26125a8565b346102aa5760003660031901126102aa576001546040516001600160a01b039091168152602090f35b346102aa5760003660031901126102aa576010546040516001600160a01b039091168152602090f35b346102aa5760003660031901126102aa57600080516020613920833981519152546040516001600160a01b039091168152602090f35b346102aa5760203660031901126102aa5760ff6116b5612394565b1660005260076020526020604060002054604051908152f35b346102aa5760203660031901126102aa576116e76123ba565b6001600160a01b03166000908152600080516020613960833981519152602090815260409182902054915191825290f35b346102aa5760003660031901126102aa576002546040516001600160a01b039091168152602090f35b346102aa5760203660031901126102aa5761175a6123ba565b6117626130cf565b6001600160a01b03168015610320576020817fcd3a43dfa5cb61832c23a223b6ab0d4133925fc029f53d65ddc19019488a4f7e926001600160601b0360a01b6001541617600155604051908152a1005b346102aa5760003660031901126102aa57600080516020613a0083398151915254336001600160a01b03909116036117ed5761001b336130f0565b63118cdaa760e01b6000523360045260246000fd5b346102aa5760003660031901126102aa576011546040516001600160a01b039091168152602090f35b346102aa5760003660031901126102aa576118446130cf565b600080516020613a0083398151915280546001600160a01b0319908116909155600080516020613920833981519152805491821690556000906001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346102aa5760203660031901126102aa576118c56123ba565b6118cd6130cf565b6001600160a01b03168015610320576020817f9d4414af8d61d821c1ad25f0aadfa28aa386c452716a31fc1f7fdbd9b9d364dc926001600160601b0360a01b6003541617600355604051908152a1005b346102aa5760003660031901126102aa57600e546040516001600160a01b039091168152602090f35b346102aa5760003660031901126102aa57600f546040516001600160a01b039091168152602090f35b346102aa5760003660031901126102aa576119886127be565b600f546001600160a01b03163303610b2d57601254801561126557602090600060125560016000805160206139c083398151915255604051908152f35b346102aa5760203660031901126102aa576119de6123ba565b6001600160a01b031660009081527f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e3602090815260409182902054915191825290f35b346102aa5760003660031901126102aa576000546040516001600160a01b039091168152602090f35b346102aa5760003660031901126102aa577f00000000000000000000000031dcaafb35b228858d26ffb494a00d226d431fd86001600160a01b03163003611aa35760206040516000805160206139408339815191528152f35b63703e46dd60e11b60005260046000fd5b346102aa5760403660031901126102aa57611acd612394565b60ff611ad76123a4565b9116600052600860205260406000209060018060a01b03166000526020526020604060002054604051908152f35b60403660031901126102aa57611b196123ba565b6024359067ffffffffffffffff82116102aa57366023830112156102aa57816004013590611b4682612424565b91611b546040519384612402565b808352602083019336602483830101116102aa57816000926024602093018737840101526001600160a01b037f00000000000000000000000031dcaafb35b228858d26ffb494a00d226d431fd816308114908115611cfb575b50611aa357611bba6130cf565b6040516352d1902d60e01b81526001600160a01b0382169390602081600481885afa60009181611cc7575b50611bff5784634c9c8ce360e01b60005260045260246000fd5b80600080516020613940833981519152869203611cb35750823b15611c9f5760008051602061394083398151915280546001600160a01b031916821790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2825115611c84576000809161001b945190845af4611c7e612ab5565b916138be565b50505034611c8e57005b63b398979f60e01b60005260046000fd5b634c9c8ce360e01b60005260045260246000fd5b632a87526960e21b60005260045260246000fd5b9091506020813d602011611cf3575b81611ce360209383612402565b810103126102aa57519086611be5565b3d9150611cd6565b600080516020613940833981519152546001600160a01b03161415905084611bad565b346102aa5760003660031901126102aa576003546040516001600160a01b039091168152602090f35b346102aa5760203660031901126102aa5760ff611d62612394565b1660005260056020526020604060002054604051908152f35b346102aa5760403660031901126102aa57611d946123ba565b611d9c6123a4565b6000805160206139e0833981519152549160ff8360401c16159267ffffffffffffffff811680159081611f62575b6001149081611f58575b159081611f4f575b50611f3e5767ffffffffffffffff1981166001176000805160206139e08339815191525583611f11575b506001600160a01b03169081158015611f00575b61032057611e26613719565b611e2e613719565b6001600160a01b03811615611eea57611e46906130f0565b611e4e613719565b611e56613719565b611e5e613719565b60016000805160206139c083398151915255611e78613719565b6001600160601b0360a01b6000541617600055611e9157005b68ff0000000000000000196000805160206139e083398151915254166000805160206139e0833981519152557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a1005b631e4fbdf760e01b600052600060045260246000fd5b506001600160a01b03811615611e1a565b68ffffffffffffffffff191668010000000000000001176000805160206139e08339815191525583611e06565b63f92ee8a960e01b60005260046000fd5b90501585611ddc565b303b159150611dd4565b859150611dca565b346102aa5760203660031901126102aa57611f836123ba565b6001600160a01b031660009081527f5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c7602090815260409182902054915191825290f35b346102aa5760003660031901126102aa57602060405160008152f35b346102aa5760203660031901126102aa5760ff611ffd612394565b1660005260066020526020604060002054604051908152f35b346102aa5760203660031901126102aa5761202f6123ba565b6120376127be565b6001546001600160a01b03163303610b2d576001600160a01b0381161561032057610b8a602091612b53565b346102aa5760403660031901126102aa5761207c612394565b60ff6120866123a4565b9116600052600a60205260406000209060018060a01b03166000526020526020604060002054604051908152f35b60403660031901126102aa576120c8612394565b6120d06123a4565b6120d86127be565b6120e06127fa565b6120e98261282a565b6001600160a01b03169081156103205734156121825760ff16806000526008602052604060002082600052602052604060002061212734825461259b565b9055806000526007602052604060002061214234825461259b565b90557f17da4acb7a5ee08d35c02139ac2700696db1184cf766e08d880d5f8bba0081656020604051348152a360016000805160206139c083398151915255005b63162908e360e11b60005260046000fd5b346102aa5760003660031901126102aa576020600c54604051908152f35b346102aa5760403660031901126102aa5760206112b36121cf6123ba565b6121d76123a4565b906121e06127be565b61249a565b346102aa5760003660031901126102aa57602060405160018152f35b346102aa5760603660031901126102aa5761221a612394565b6122226123a4565b6044359061222e6127be565b6122366127fa565b61223f8361282a565b6001600160a01b0381169283156103205782156121825760ff6020916122ca7f45b5babf8a77395df16a09905e2614f5b52d55b7bb5c273a0789fda372ee8b0d946122c460018060a01b0360005416604051906323b872dd60e01b88830152336024830152306044830152896064830152606482526122bf608483612402565b613247565b826132a2565b16928360005260098252604060002085600052825260406000206122ef82825461259b565b90558360005260048252604060002061230982825461259b565b905583600052600982526040600020856000528252670de0b6b3a764000061234460406000205486600052600685526040600020549061285b565b0484600052600b83526040600020866000528352604060002055604051908152a360016000805160206139c083398151915255005b346102aa5760003660031901126102aa576020906012548152f35b6004359060ff821682036102aa57565b602435906001600160a01b03821682036102aa57565b600435906001600160a01b03821682036102aa57565b6080810190811067ffffffffffffffff8211176123ec57604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff8211176123ec57604052565b67ffffffffffffffff81116123ec57601f01601f191660200190565b60809060031901126102aa576004356001600160a01b03811681036102aa57906024359060443580151581036102aa579060643590565b9190820391821161248457565b634e487b7160e01b600052601160045260246000fd5b6002549192916001600160a01b031633141580612586575b610b2d576001600160a01b0381169081158015612575575b610320576000828152600080516020613960833981519152602052604090205490811561256c5761253e91612537916001600052600860205260406000208560005260205260006040812055600160005260076020526040600020612530838254612477565b90556128ad565b8094612ae5565b60017f449b9273ffcbae116c106c36c0ed2c68c318a35842de623aa960b815bd631bcf6020604051868152a3565b50600093505050565b506001600160a01b038416156124ca565b506011546001600160a01b03163314156124b2565b9190820180921161248457565b60076020527f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df5460016000527fb39221ace053465ec3453ce2b36430bd138b997ecea25c1043da0c366812b828546125ff9161259b565b90565b6001549192916001600160a01b0316331415806126e7575b610b2d576001600160a01b03811690811580156126d6575b6103205760008281527f5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c7602052604090205490811561256c576126a89161253791600080526008602052604060002085600052602052600060408120556000805260076020526040600020612530838254612477565b60007f449b9273ffcbae116c106c36c0ed2c68c318a35842de623aa960b815bd631bcf6020604051868152a3565b506001600160a01b03841615612632565b506011546001600160a01b031633141561261a565b600080527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec5460056020527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc546125ff9161278c9161275a9161259b565b600160005260046020527fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe05549061259b565b600160005260056020527f1471eb6eb2c5e789fc3de43f8ce62938c7d1836ec861730447e2ada8fd81017b549061259b565b60026000805160206139c083398151915254146127e95760026000805160206139c083398151915255565b633ee5aeb560e01b60005260046000fd5b6001546001600160a01b031633141580612815575b610b2d57565b506002546001600160a01b031633141561280f565b60ff16801515908161284f575b5061283e57565b639885618760e01b60005260046000fd5b60019150141538612837565b8181029291811591840414171561248457565b8115612878570490565b634e487b7160e01b600052601260045260246000fd5b908160209103126102aa57516001600160a01b03811681036102aa5790565b600092918015612ab1576003546001600160a01b031680612a4957845b6001600160a01b03168061299157505060c8810491821561298b57600e546001600160a01b031680156109bc5761290384600c5461259b565b600c5585813b156108665784916004604051809481936302beab6360e41b83525af180156108dc57612976575b506125ff9394507f03081c2e39463b06ec1824c5612f9c79e6b7e81e5afc1dd2edc4ad5f5f5ff00160408051928584526001602085015260018060a01b031692a2612477565b612981868092612402565b610a8d5784612930565b50925050565b90939260648304948515612a3f57803b15612a3b57958086976024604098979851809a8193631482a0c360e31b83528860048401525af1968715612a2e576125ff9697612a1e575b505060408051858152600160208201526001600160a01b03909216917f4b64f7b8ae5ed52b2d130cc9273db96bb1d28fa3da80f336ce0d0ba8438ec7759190a3612477565b81612a2891612402565b386129d9565b50604051903d90823e3d90fd5b8680fd5b5050509150915090565b60405163d21cacdf60e01b81526001600160a01b0384166004820152602081602481855afa9081156108dc578691612a82575b506128ca565b612aa4915060203d602011612aaa575b612a9c8183612402565b81019061288e565b38612a7c565b503d612a92565b5050565b3d15612ae0573d90612ac682612424565b91612ad46040519384612402565b82523d6000602084013e565b606090565b8115612ab1574782808210918215612b39575b5050612b2857600080809381935af1612b0f612ab5565b5015612b1757565b6312171d8360e31b60005260046000fd5b6373214f8760e11b60005260046000fd5b612b439250612477565b612b4b6125a8565b118238612af8565b612b5e8160006132a2565b6001600160a01b03811660009081527fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6b60209081526040808320547f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e3909252909120549091612bcd828461259b565b918215612e0b576001600160a01b03821660009081527fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6b602090815260408083208390557f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e390915281205583151580612deb575b81612dcb575b600090612cc7575b9160809183612c78612c726000805160206139a083398151915296600098612477565b846134cf565b91612c8383856133df565b868052600b6020526040872060018060a01b038516885260205286604081205560405197885260208801526040870152606086015260018060a01b031693a3600190565b50600a84049283158015612cdd575b5092612c4f565b6000805260046020527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec54909391929015612d8c57670de0b6b3a7640000850293858504670de0b6b3a76400001417156124845784612c78612c72600097608096612d646000805160206139a0833981519152998b8052600460205260408c20549061286e565b8a80526006602052612d7b60408c2091825461259b565b90555b959750505050945091612cd6565b600e546001600160a01b0316935083156103205784612c78612c7282608096612dc660009a6000805160206139a08339815191529a6133df565b612d7e565b6000805260056020526040600020612de4838254612477565b9055612c47565b6000805260046020526040600020612e04868254612477565b9055612c41565b50505050600090565b612e1f8160016132a2565b6001600160a01b03811660009081527f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a3660209081526040808320547fbbc70db1b6c7afd11e79c0fb0051300458f1a3acb8ee9789d9b6b26c61ad9bc7909252909120549091612e8e828461259b565b918215612e0b576001600160a01b03821660009081527f92e85d02570a8092d09a6e3a57665bc3815a2699a4074001bf1ccabf660f5a36602090815260408083208390557fbbc70db1b6c7afd11e79c0fb0051300458f1a3acb8ee9789d9b6b26c61ad9bc7909152812055831515806130ae575b8161308d575b600090612f84575b9160809183612f33612c726000805160206139a083398151915296600198612477565b91612f3e83856133df565b86600052600b6020526040600020878060a01b03851660005260205260006040812055604051978852602088015260408701526060860152838060a01b031693a3600190565b50600a84049283158015612f9a575b5092612f10565b600160005260046020527fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe055490939192901561304e57670de0b6b3a7640000850293858504670de0b6b3a76400001417156124845784612f33612c726001976080966130246000805160206139a0833981519152998b60005260046020526040600020549061286e565b8a600052600660205261303d604060002091825461259b565b90555b959750505050945091612f93565b600e546001600160a01b0316935083156103205784612f33612c728260809661308860019a6000805160206139a08339815191529a6133df565b613040565b6001600052600560205260406000206130a7838254612477565b9055612f08565b6001600052600460205260406000206130c8868254612477565b9055612f02565b600080516020613920833981519152546001600160a01b031633036117ed57565b600080516020613a0083398151915280546001600160a01b031990811690915560008051602061392083398151915280549182166001600160a01b0393841690811790915591167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b6001600160a01b0381166000908152600080516020613960833981519152602052604090205490811561323f576001600160a01b0381166000908152600080516020613960833981519152602090815260408220829055600191829052600781527fb39221ace053465ec3453ce2b36430bd138b997ecea25c1043da0c366812b828805492947f449b9273ffcbae116c106c36c0ed2c68c318a35842de623aa960b815bd631bcf94929361322b92613224929161321c908390612477565b9055836128ad565b8096612ae5565b604051948552838060a01b031693a3600190565b505050600090565b906000602091828151910182855af11561070a576000513d61329957506001600160a01b0381163b155b6132785750565b635274afe760e01b60009081526001600160a01b0391909116600452602490fd5b60011415613271565b60ff1690816000526009602052604060002060018060a01b03821660005260205260406000205480156133b857613338670de0b6b3a764000091846000526006602052826132f56040600020548361285b565b0485600052600b602052604060002060018060a01b03861660005260205260406000205480821161335e575b50508460005260066020526040600020549061285b565b0491600052600b60205260406000209060018060a01b0316600052602052604060002055565b61336791612477565b85600052600a602052604060002060018060a01b038616600052602052604060002061339482825461259b565b90558560005260056020526133af604060002091825461259b565b90553880613321565b5090600052600b60205260406000209060018060a01b031660005260205260006040812055565b908015612ab1576000546040516370a0823160e01b81523060048201526001600160a01b0390911690602081602481855afa90811561070a5760009161349d575b5082808210918215613483575b50506134725760405163a9059cbb60e01b60208201526001600160a01b0393909316602484015260448084019290925290825261347091906122bf606483612402565b565b6306952df560e31b60005260046000fd5b61348d9250612477565b6134956126fc565b11823861342d565b906020823d6020116134c7575b816134b760209383612402565b8101031261086657505138613420565b3d91506134aa565b600092918015612ab1576003546001600160a01b0316806136c157845b6001600160a01b038116806135c05750505060c8810491821561298b5761351583600d5461259b565b600d556135248360125461259b565b601255845485906001600160a01b0316803b156135bc578190602460405180948193630852cd8d60e31b83528960048401525af180156108dc576135a7575b50937f03081c2e39463b06ec1824c5612f9c79e6b7e81e5afc1dd2edc4ad5f5f5ff00160406125ff9596815193868552602085015260018060a01b031692a2612477565b6135b2868092612402565b610a8d5738613563565b5080fd5b91959093606484049485156136b75782546135e79087908a906001600160a01b03166137fc565b873b156136b35760405163fdb266ab60e01b81526001600160a01b03919091166004820152602481018690529682908890604490829084905af19687156136a8576125ff9697613671575b5060407f4b64f7b8ae5ed52b2d130cc9273db96bb1d28fa3da80f336ce0d0ba8438ec77591815193878552602085015260018060a01b031692a3612477565b826136a07f4b64f7b8ae5ed52b2d130cc9273db96bb1d28fa3da80f336ce0d0ba8438ec7759394604093612402565b929150613632565b6040513d84823e3d90fd5b8280fd5b5092955050505050565b60405163d21cacdf60e01b81526001600160a01b0384166004820152602081602481855afa9081156108dc5786916136fa575b506134ec565b613713915060203d602011612aaa57612a9c8183612402565b386136f4565b60ff6000805160206139e08339815191525460401c161561373657565b631afcd79f60e31b60005260046000fd5b60405190602060008184019463095ea7b360e01b865260018060a01b03169485602486015281604486015260448552613781606486612402565b84519082855af16000513d826137d7575b50501561379e57505050565b6122bf613470936040519063095ea7b360e01b6020830152602482015260006044820152604481526137d1606482612402565b82613247565b9091506137f457506001600160a01b0381163b15155b3880613792565b6001146137ed565b60405163095ea7b360e01b60208083019182526001600160a01b03851660248401526044808401969096529482529293909260009061383c606486612402565b84519082855af16000513d82613899575b50501561385957505050565b60405163095ea7b360e01b60208201526001600160a01b03909316602484015260006044808501919091528352613470926122bf906137d1606482612402565b9091506138b657506001600160a01b0381163b15155b388061384d565b6001146138af565b906138e457508051156138d357805190602001fd5b63d6bda27560e01b60005260046000fd5b81511580613916575b6138f5575090565b639996b31560e01b60009081526001600160a01b0391909116600452602490fd5b50803b156138ed56fe9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbcad67d757c34507f157cacfa2e3153e9f260a2244f30428821be7be64587ac55f3101190a0741c9d7e3db924538c82b75a57dff2bc83e13673e6995daa367457d889a6f94e29e815b629cacd58efb839182d6a4e9e48ac11ae92d93f4d57d20809b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00a26469706673582212209d06ac2e132928aa74c4668ed36bdc1ba2fe8f4c0cce4c7f00e691712bbf488664736f6c634300081c0033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| 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 ? | ||
|---|---|---|---|---|---|---|---|---|---|
| No direct transactions — this address is only ever reached via internal calls (common for a contract only invoked through a router or proxy). View Internal Transactions → | |||||||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x871444…782488 | 26 days agoWed, 22 Jul 2026 19:11:10 UTC | 0xc7f505…81d2 | data: 0x000000000000000000…ffffffff |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 20,991,452 | 21 days agoMon, 27 Jul 2026 19:43:52 UTC | 0x23b5e3…c7c687 | DELEGATECALL | executeFor | 0x0e4b…fa2d | IN | 0x31dc…1fd8 | 0.00018 ETH |
| 20,991,446 | 21 days agoMon, 27 Jul 2026 19:43:51 UTC | 0x9d14ae…6fb1cc | DELEGATECALL | deploy | 0x0e4b…fa2d | IN | 0x31dc…1fd8 | 0.00000 ETH |
| 20,991,415 | 21 days agoMon, 27 Jul 2026 19:43:48 UTC | 0xb2560f…64265c | DELEGATECALL | checkpoint | 0x0e4b…fa2d | IN | 0x31dc…1fd8 | 0.00013 ETH |
| 20,990,512 | 21 days agoMon, 27 Jul 2026 19:42:17 UTC | 0xa4151f…8937f5 | DELEGATECALL | checkpoint | 0x0e4b…fa2d | IN | 0x31dc…1fd8 | 0.00013 ETH |
| 20,990,450 | 21 days agoMon, 27 Jul 2026 19:42:11 UTC | 0x0ec029…798cfe | DELEGATECALL | executeFor | 0x0e4b…fa2d | IN | 0x31dc…1fd8 | 0.00018 ETH |
| 20,989,612 | 21 days agoMon, 27 Jul 2026 19:40:48 UTC | 0x6d5be6…b37ee3 | DELEGATECALL | checkpoint | 0x0e4b…fa2d | IN | 0x31dc…1fd8 | 0.00013 ETH |
| 20,989,536 | 21 days agoMon, 27 Jul 2026 19:40:40 UTC | 0xbf5f0f…16a4e8 | DELEGATECALL | executeFor | 0x0e4b…fa2d | IN | 0x31dc…1fd8 | 0.00018 ETH |
| 20,988,674 | 21 days agoMon, 27 Jul 2026 19:39:13 UTC | 0xd93ac4…f37bec | DELEGATECALL | checkpoint | 0x0e4b…fa2d | IN | 0x31dc…1fd8 | 0.00013 ETH |
| 20,988,635 | 21 days agoMon, 27 Jul 2026 19:39:09 UTC | 0xc30e32…dbc323 | DELEGATECALL | executeFor | 0x0e4b…fa2d | IN | 0x31dc…1fd8 | 0.00018 ETH |
| 20,987,825 | 21 days agoMon, 27 Jul 2026 19:37:48 UTC | 0x60044b…442600 | DELEGATECALL | checkpoint | 0x0e4b…fa2d | IN | 0x31dc…1fd8 | 0.00013 ETH |
| 20,987,730 | 21 days agoMon, 27 Jul 2026 19:37:38 UTC | 0xa51536…226562 | DELEGATECALL | executeFor | 0x0e4b…fa2d | IN | 0x31dc…1fd8 | 0.00018 ETH |
| 20,986,885 | 21 days agoMon, 27 Jul 2026 19:36:13 UTC | 0xa96c7f…9f6779 | DELEGATECALL | checkpoint | 0x0e4b…fa2d | IN | 0x31dc…1fd8 | 0.00013 ETH |
| 20,986,825 | 21 days agoMon, 27 Jul 2026 19:36:07 UTC | 0x344e23…c98b44 | DELEGATECALL | executeFor | 0x0e4b…fa2d | IN | 0x31dc…1fd8 | 0.00018 ETH |
| 20,986,544 | 21 days agoMon, 27 Jul 2026 19:35:39 UTC | 0x8a638c…55971c | DELEGATECALL | mine | 0x0e4b…fa2d | IN | 0x31dc…1fd8 | 0.00133 ETH |
| 20,985,979 | 21 days agoMon, 27 Jul 2026 19:34:43 UTC | 0x7c10fa…0a8b7a | DELEGATECALL | checkpoint | 0x0e4b…fa2d | IN | 0x31dc…1fd8 | 0.00013 ETH |
| 20,985,930 | 21 days agoMon, 27 Jul 2026 19:34:38 UTC | 0xefc19b…778ddf | DELEGATECALL | deploy | 0x0e4b…fa2d | IN | 0x31dc…1fd8 | 0.00000 ETH |
| 20,985,909 | 21 days agoMon, 27 Jul 2026 19:34:36 UTC | 0xc9b231…e97ddb | DELEGATECALL | executeFor | 0x0e4b…fa2d | IN | 0x31dc…1fd8 | 0.00018 ETH |
| 20,985,058 | 21 days agoMon, 27 Jul 2026 19:33:10 UTC | 0x0393ee…11c4ba | DELEGATECALL | checkpoint | 0x0e4b…fa2d | IN | 0x31dc…1fd8 | 0.00013 ETH |
| 20,985,005 | 21 days agoMon, 27 Jul 2026 19:33:05 UTC | 0xb321c9…cca7ef | DELEGATECALL | executeFor | 0x0e4b…fa2d | IN | 0x31dc…1fd8 | 0.00018 ETH |
| 20,984,164 | 21 days agoMon, 27 Jul 2026 19:31:41 UTC | 0xbe673f…8a477d | DELEGATECALL | checkpoint | 0x0e4b…fa2d | IN | 0x31dc…1fd8 | 0.00013 ETH |
| 20,984,100 | 21 days agoMon, 27 Jul 2026 19:31:34 UTC | 0x2b5770…00a26a | DELEGATECALL | executeFor | 0x0e4b…fa2d | IN | 0x31dc…1fd8 | 0.00018 ETH |
| 20,983,267 | 21 days agoMon, 27 Jul 2026 19:30:10 UTC | 0x2f5f02…1c3d3d | DELEGATECALL | checkpoint | 0x0e4b…fa2d | IN | 0x31dc…1fd8 | 0.00013 ETH |
| 20,983,195 | 21 days agoMon, 27 Jul 2026 19:30:03 UTC | 0x53ec76…516f65 | DELEGATECALL | executeFor | 0x0e4b…fa2d | IN | 0x31dc…1fd8 | 0.00018 ETH |
| 20,982,305 | 21 days agoMon, 27 Jul 2026 19:28:35 UTC | 0xbe6c89…0fc5d7 | DELEGATECALL | checkpoint | 0x0e4b…fa2d | IN | 0x31dc…1fd8 | 0.00013 ETH |
| 20,982,275 | 21 days agoMon, 27 Jul 2026 19:28:32 UTC | 0x4e8f36…fc9527 | DELEGATECALL | executeFor | 0x0e4b…fa2d | IN | 0x31dc…1fd8 | 0.00018 ETH |