// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
//
// ,(
// ((
// \\
// .---\\---.
// / `` \
// | |
// | |
// \ /
// '.______.'
//
// O R C H A R D · $SEED
// Plant ETH. Harvest $AAPL.
//
// https://orchard.gold
// https://x.com/orcharddotgold
//
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {Ownable, Ownable2Step} from "@openzeppelin/contracts/access/Ownable2Step.sol";
import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import {ISwapper} from "./interfaces/ISwapper.sol";
import {IStaking} from "./interfaces/IStaking.sol";
import {IRandomness} from "./interfaces/IRandomness.sol";
contract Orchard is Ownable2Step, ReentrancyGuard {
using SafeERC20 for IERC20;
error InvalidPlot();
error InvalidPlotMask();
error InvalidRoundCount();
error TooManySlots();
error BelowMinPlant();
error SowingClosed();
error RoundNotResolved(uint256 round);
error AlreadyClaimed(uint256 round);
error NothingToClaim();
error InsufficientOutput();
error ZeroAddress();
error BpsTooHigh();
error ZeroOdds();
error NotAuthorized();
error MinPlantTooHigh();
error RenounceDisabled();
event Planted(address indexed player, uint256 indexed round, uint8 plot, uint256 ethIn, uint256 stake);
event PlantedMany(
address indexed player,
uint256 indexed startRound,
uint16 roundCount,
uint32 plotMask,
uint256 ethIn,
uint256 totalStake
);
event Sealed(uint256 indexed round, uint64 sealBlock);
event Revealed(uint256 indexed round, uint8 winningPlot, uint256 winningStake, uint256 netLossPool);
event CropVaulted(uint256 indexed round, uint8 winningPlot, uint256 crop);
event RoundVoided(uint256 indexed round);
event JackpotHit(uint256 indexed round, uint256 amount);
event Claimed(address indexed player, uint256 aaplAmount, uint256 juiceFee);
event BuybackBurned(uint256 aaplIn, uint256 seedBurned);
event TreasuryCollected(address indexed to, uint256 aaplAmount);
event AdminCollected(address indexed to, uint256 aaplAmount);
event StakingFlushed(uint256 aaplAmount);
event MinPlantEthSet(uint256 minPlantEth);
event RakeBpsSet(uint16 bps);
event AdminFeeBpsSet(uint16 bps);
event JackpotBpsSet(uint16 bps);
event JackpotOddsSet(uint32 odds);
event SwapperSet(address swapper);
event StakingSet(address staking);
event RandomnessSet(address randomness);
event KeeperSet(address keeper);
uint8 public constant PLOTS = 25;
uint256 public constant ROUND_SECONDS = 75;
uint256 public constant SOW_SECONDS = 60;
uint256 public constant MAX_PLANT_SLOTS = 250;
uint16 public constant MAX_RAKE_BPS = 2_000;
uint16 public constant MAX_ADMIN_FEE_BPS = 500;
uint256 public constant MAX_MIN_PLANT_ETH = 1 ether;
uint16 public constant STAKERS_BPS = 1_000;
uint16 public constant JUICE_BPS = 1_000;
uint256 private constant BPS = 10_000;
uint256 private constant INDEX_SCALE = 1e18;
address private constant DEAD = 0x000000000000000000000000000000000000dEaD;
IERC20 public immutable aapl;
IERC20 public immutable seed;
uint256 public immutable genesis;
ISwapper public swapper;
IRandomness public randomness;
IStaking public staking;
address public keeper;
uint256 public minPlantEth;
uint16 public rakeBps;
uint16 public adminFeeBps;
uint16 public jackpotBps;
uint32 public jackpotOdds;
struct Round {
uint64 sealBlock;
bool revealed;
bool voided;
uint8 winningPlot;
uint16 rakeBps;
uint16 jackpotBps;
uint32 jackpotOdds;
uint256 totalStake;
uint256 winningStake;
uint256 netLossPool;
uint256 entryIndex;
uint256 jackpotWon;
}
mapping(uint256 => Round) public rounds;
mapping(uint256 => mapping(uint8 => uint256)) public plotStake;
mapping(uint256 => mapping(address => mapping(uint8 => uint256))) public stakeOf;
mapping(uint256 => mapping(address => uint256)) public playerTotal;
mapping(uint256 => mapping(address => bool)) public roundClaimed;
mapping(uint256 => address[]) private roundMiners;
mapping(uint256 => mapping(address => uint32)) public playerPlots;
uint256 public treasuryAccrued;
uint256 public stakingAccrued;
uint256 public adminAccrued;
uint256 public jackpotAccrued;
uint256 public juiceIndex;
uint256 public unclaimedShares;
uint256 public nextToResolve;
constructor(IERC20 aapl_, IERC20 seed_, ISwapper swapper_, IRandomness randomness_, uint16 rakeBps_, address owner_)
Ownable(owner_)
{
if (address(aapl_) == address(0) || address(seed_) == address(0)) revert ZeroAddress();
aapl = aapl_;
seed = seed_;
genesis = block.timestamp;
_setSwapper(swapper_);
_setRandomness(randomness_);
_setMinPlantEth(0.0005 ether);
_setRakeBps(rakeBps_);
_setAdminFeeBps(100);
_setJackpotBps(5_000);
_setJackpotOdds(500);
}
function plant(uint8 plot, uint256 minAaplOut) external payable nonReentrant {
if (plot >= PLOTS) revert InvalidPlot();
if (msg.value < minPlantEth) revert BelowMinPlant();
if ((block.timestamp - genesis) % ROUND_SECONDS >= SOW_SECONDS) revert SowingClosed();
_crank(2);
uint256 balanceBefore = aapl.balanceOf(address(this));
swapper.swapEthForAapl{value: msg.value}(minAaplOut);
uint256 bought = aapl.balanceOf(address(this)) - balanceBefore;
if (bought < minAaplOut || bought == 0) revert InsufficientOutput();
(uint256 round, uint256 stake) = _credit(plot, bought);
emit Planted(msg.sender, round, plot, msg.value, stake);
}
function plantMany(uint32 plotMask, uint16 roundCount, uint256 minAaplOut) external payable nonReentrant {
uint256 slots = _checkSpread(plotMask, roundCount);
if (msg.value < minPlantEth * slots) revert BelowMinPlant();
_crank(2);
uint256 balanceBefore = aapl.balanceOf(address(this));
swapper.swapEthForAapl{value: msg.value}(minAaplOut);
uint256 bought = aapl.balanceOf(address(this)) - balanceBefore;
if (bought < minAaplOut || bought == 0) revert InsufficientOutput();
(uint256 startRound, uint256 totalStake) = _creditMany(plotMask, roundCount, slots, bought);
emit PlantedMany(msg.sender, startRound, roundCount, plotMask, msg.value, totalStake);
}
function _credit(uint8 plot, uint256 bought) private returns (uint256 round, uint256 stake) {
uint256 adminCut = (bought * adminFeeBps) / BPS;
adminAccrued += adminCut;
stake = bought - adminCut;
round = currentRound();
_stake(round, plot, stake);
}
function _stake(uint256 round, uint8 plot, uint256 stake) private {
if (playerTotal[round][msg.sender] == 0) roundMiners[round].push(msg.sender);
stakeOf[round][msg.sender][plot] += stake;
plotStake[round][plot] += stake;
playerTotal[round][msg.sender] += stake;
playerPlots[round][msg.sender] |= uint32(1) << plot;
rounds[round].totalStake += stake;
}
function _checkSpread(uint32 plotMask, uint16 roundCount) private pure returns (uint256 slots) {
if (plotMask == 0 || plotMask >> PLOTS != 0) revert InvalidPlotMask();
if (roundCount == 0) revert InvalidRoundCount();
uint256 plots = 0;
for (uint32 m = plotMask; m != 0; m &= m - 1) {
plots++;
}
slots = plots * roundCount;
if (slots > MAX_PLANT_SLOTS) revert TooManySlots();
}
function _creditMany(uint32 plotMask, uint16 roundCount, uint256 slots, uint256 bought)
private
returns (uint256 startRound, uint256 totalStake)
{
uint256 adminCut = (bought * adminFeeBps) / BPS;
adminAccrued += adminCut;
totalStake = bought - adminCut;
uint256 perSlot = totalStake / slots;
if (perSlot == 0) revert InsufficientOutput();
startRound = currentRound();
if ((block.timestamp - genesis) % ROUND_SECONDS >= SOW_SECONDS) startRound += 1;
uint256 dust = totalStake - perSlot * slots;
for (uint256 r = 0; r < roundCount; r++) {
for (uint8 p = 0; p < PLOTS; p++) {
if (plotMask & (uint32(1) << p) == 0) continue;
_stake(startRound + r, p, perSlot + dust);
dust = 0;
}
}
}
function crank(uint256 maxRounds) public {
_crank(maxRounds);
}
function _crank(uint256 maxRounds) private {
uint256 round = nextToResolve;
uint256 limit = currentRound();
if ((block.timestamp - genesis) % ROUND_SECONDS >= SOW_SECONDS) limit += 1;
for (uint256 i = 0; i < maxRounds && round < limit; i++) {
Round storage r = rounds[round];
if (r.totalStake == 0) {
r.voided = true;
emit RoundVoided(round);
round++;
continue;
}
if (r.sealBlock == 0) {
r.sealBlock = randomness.commit();
r.rakeBps = rakeBps;
r.jackpotBps = jackpotBps;
r.jackpotOdds = jackpotOdds;
emit Sealed(round, r.sealBlock);
break;
}
bytes32 seed_ = randomness.seedFor(round, r.sealBlock);
if (seed_ == bytes32(0)) {
if (randomness.expired(r.sealBlock)) {
r.voided = true;
emit RoundVoided(round);
round++;
continue;
}
break;
}
_reveal(round, r, seed_);
round++;
}
nextToResolve = round;
}
function _reveal(uint256 round, Round storage r, bytes32 seed_) private {
uint8 winningPlot = uint8(uint256(seed_) % PLOTS);
uint256 winningStake = plotStake[round][winningPlot];
if (winningStake == 0) {
uint256 crop = r.totalStake;
jackpotAccrued += crop;
r.revealed = true;
r.winningPlot = winningPlot;
emit Revealed(round, winningPlot, 0, 0);
emit CropVaulted(round, winningPlot, crop);
return;
}
uint256 lossPool = r.totalStake - winningStake;
uint256 rake = (lossPool * r.rakeBps) / BPS;
uint256 toStakers = (rake * STAKERS_BPS) / BPS;
uint256 toJackpot = (rake * r.jackpotBps) / BPS;
stakingAccrued += toStakers;
jackpotAccrued += toJackpot;
treasuryAccrued += rake - toStakers - toJackpot;
uint256 netLossPool = lossPool - rake;
uint256 jackpot = jackpotAccrued;
if (jackpot != 0 && uint256(keccak256(abi.encode(seed_, "JACKPOT"))) % r.jackpotOdds == 0) {
jackpotAccrued = 0;
netLossPool += jackpot;
r.jackpotWon = jackpot;
emit JackpotHit(round, jackpot);
}
unclaimedShares += winningStake + netLossPool;
r.entryIndex = juiceIndex;
r.revealed = true;
r.winningPlot = winningPlot;
r.winningStake = winningStake;
r.netLossPool = netLossPool;
emit Revealed(round, winningPlot, winningStake, netLossPool);
}
function claim(uint256[] calldata roundIds) external nonReentrant {
uint256 refunds = 0;
uint256 grossTotal = 0;
for (uint256 i = 0; i < roundIds.length; i++) {
uint256 round = roundIds[i];
Round storage r = rounds[round];
if (!r.revealed && !r.voided) revert RoundNotResolved(round);
if (roundClaimed[round][msg.sender]) revert AlreadyClaimed(round);
roundClaimed[round][msg.sender] = true;
if (r.voided) {
refunds += playerTotal[round][msg.sender];
continue;
}
uint256 winStake = stakeOf[round][msg.sender][r.winningPlot];
if (winStake == 0) continue;
uint256 shares = winStake + (r.netLossPool * winStake) / r.winningStake;
grossTotal += shares + (shares * (juiceIndex - r.entryIndex)) / INDEX_SCALE;
unclaimedShares -= shares;
}
uint256 fee = (grossTotal * JUICE_BPS) / BPS;
if (fee > 0) {
if (unclaimedShares > 0) {
juiceIndex += (fee * INDEX_SCALE) / unclaimedShares;
} else {
jackpotAccrued += fee;
}
}
uint256 total = refunds + grossTotal - fee;
if (total == 0) revert NothingToClaim();
aapl.safeTransfer(msg.sender, total);
emit Claimed(msg.sender, total, fee);
}
function buybackSeed(uint256 minSeedOut) external onlyOwner nonReentrant {
uint256 amount = treasuryAccrued;
if (amount == 0) revert NothingToClaim();
treasuryAccrued = 0;
aapl.forceApprove(address(swapper), amount);
uint256 balanceBefore = seed.balanceOf(address(this));
swapper.swapAaplForSeed(amount, minSeedOut);
aapl.forceApprove(address(swapper), 0);
uint256 bought = seed.balanceOf(address(this)) - balanceBefore;
if (bought < minSeedOut || bought == 0) revert InsufficientOutput();
seed.safeTransfer(DEAD, bought);
emit BuybackBurned(amount, bought);
}
function collectTreasury(address to) external onlyOwner nonReentrant {
if (to == address(0)) revert ZeroAddress();
uint256 amount = treasuryAccrued;
if (amount == 0) revert NothingToClaim();
treasuryAccrued = 0;
aapl.safeTransfer(to, amount);
emit TreasuryCollected(to, amount);
}
function collectAdmin(address to) external onlyOwner nonReentrant {
if (to == address(0)) revert ZeroAddress();
uint256 amount = adminAccrued;
if (amount == 0) revert NothingToClaim();
adminAccrued = 0;
aapl.safeTransfer(to, amount);
emit AdminCollected(to, amount);
}
function flushStaking() external nonReentrant {
if (msg.sender != owner() && msg.sender != keeper) revert NotAuthorized();
if (address(staking) == address(0)) revert ZeroAddress();
uint256 amount = stakingAccrued;
if (amount == 0) revert NothingToClaim();
stakingAccrued = 0;
aapl.forceApprove(address(staking), amount);
uint256 balanceBefore = aapl.balanceOf(address(staking));
staking.notifyReward(amount);
if (aapl.balanceOf(address(staking)) - balanceBefore != amount) revert InsufficientOutput();
emit StakingFlushed(amount);
}
function currentRound() public view returns (uint256) {
return (block.timestamp - genesis) / ROUND_SECONDS;
}
function miners(uint256 round) external view returns (address[] memory) {
return roundMiners[round];
}
function pendingClaim(address player, uint256[] calldata roundIds) external view returns (uint256 total) {
for (uint256 i = 0; i < roundIds.length; i++) {
uint256 round = roundIds[i];
Round storage r = rounds[round];
if ((!r.revealed && !r.voided) || roundClaimed[round][player]) continue;
if (r.voided) {
total += playerTotal[round][player];
continue;
}
uint256 winStake = stakeOf[round][player][r.winningPlot];
if (winStake == 0) continue;
uint256 shares = winStake + (r.netLossPool * winStake) / r.winningStake;
uint256 gross = shares + (shares * (juiceIndex - r.entryIndex)) / INDEX_SCALE;
total += gross - (gross * JUICE_BPS) / BPS;
}
}
function setMinPlantEth(uint256 minPlantEth_) external onlyOwner {
_setMinPlantEth(minPlantEth_);
}
function setAdminFeeBps(uint16 bps) external onlyOwner {
_setAdminFeeBps(bps);
}
function setRakeBps(uint16 bps) external onlyOwner {
_setRakeBps(bps);
}
function setJackpotBps(uint16 bps) external onlyOwner {
_setJackpotBps(bps);
}
function setJackpotOdds(uint32 odds) external onlyOwner {
_setJackpotOdds(odds);
}
function setSwapper(ISwapper swapper_) external onlyOwner {
_setSwapper(swapper_);
}
function setStaking(IStaking staking_) external onlyOwner {
if (address(staking_) == address(0)) revert ZeroAddress();
staking = staking_;
emit StakingSet(address(staking_));
}
function setRandomness(IRandomness randomness_) external onlyOwner {
_setRandomness(randomness_);
}
function setKeeper(address keeper_) external onlyOwner {
keeper = keeper_;
emit KeeperSet(keeper_);
}
function renounceOwnership() public view override onlyOwner {
revert RenounceDisabled();
}
function _setMinPlantEth(uint256 minPlantEth_) private {
if (minPlantEth_ > MAX_MIN_PLANT_ETH) revert MinPlantTooHigh();
minPlantEth = minPlantEth_;
emit MinPlantEthSet(minPlantEth_);
}
function _setRakeBps(uint16 bps) private {
if (bps > MAX_RAKE_BPS) revert BpsTooHigh();
rakeBps = bps;
emit RakeBpsSet(bps);
}
function _setAdminFeeBps(uint16 bps) private {
if (bps > MAX_ADMIN_FEE_BPS) revert BpsTooHigh();
adminFeeBps = bps;
emit AdminFeeBpsSet(bps);
}
function _setJackpotBps(uint16 bps) private {
if (bps > BPS - STAKERS_BPS) revert BpsTooHigh();
jackpotBps = bps;
emit JackpotBpsSet(bps);
}
function _setJackpotOdds(uint32 odds) private {
if (odds == 0) revert ZeroOdds();
jackpotOdds = odds;
emit JackpotOddsSet(odds);
}
function _setSwapper(ISwapper swapper_) private {
if (address(swapper_) == address(0)) revert ZeroAddress();
swapper = swapper_;
emit SwapperSet(address(swapper_));
}
function _setRandomness(IRandomness randomness_) private {
if (address(randomness_) == address(0)) revert ZeroAddress();
randomness = randomness_;
emit RandomnessSet(address(randomness_));
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "aapl_",
"type": "address",
"internalType": "contract IERC20"
},
{
"name": "seed_",
"type": "address",
"internalType": "contract IERC20"
},
{
"name": "swapper_",
"type": "address",
"internalType": "contract ISwapper"
},
{
"name": "randomness_",
"type": "address",
"internalType": "contract IRandomness"
},
{
"name": "rakeBps_",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "owner_",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"name": "AlreadyClaimed",
"type": "error",
"inputs": [
{
"name": "round",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "BelowMinPlant",
"type": "error",
"inputs": []
},
{
"name": "BpsTooHigh",
"type": "error",
"inputs": []
},
{
"name": "InsufficientOutput",
"type": "error",
"inputs": []
},
{
"name": "InvalidPlot",
"type": "error",
"inputs": []
},
{
"name": "InvalidPlotMask",
"type": "error",
"inputs": []
},
{
"name": "InvalidRoundCount",
"type": "error",
"inputs": []
},
{
"name": "MinPlantTooHigh",
"type": "error",
"inputs": []
},
{
"name": "NotAuthorized",
"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": "RenounceDisabled",
"type": "error",
"inputs": []
},
{
"name": "RoundNotResolved",
"type": "error",
"inputs": [
{
"name": "round",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "SafeERC20FailedOperation",
"type": "error",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "SowingClosed",
"type": "error",
"inputs": []
},
{
"name": "TooManySlots",
"type": "error",
"inputs": []
},
{
"name": "ZeroAddress",
"type": "error",
"inputs": []
},
{
"name": "ZeroOdds",
"type": "error",
"inputs": []
},
{
"name": "AdminCollected",
"type": "event",
"inputs": [
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "aaplAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "AdminFeeBpsSet",
"type": "event",
"inputs": [
{
"name": "bps",
"type": "uint16",
"indexed": false,
"internalType": "uint16"
}
],
"anonymous": false
},
{
"name": "BuybackBurned",
"type": "event",
"inputs": [
{
"name": "aaplIn",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "seedBurned",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Claimed",
"type": "event",
"inputs": [
{
"name": "player",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "aaplAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "juiceFee",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "CropVaulted",
"type": "event",
"inputs": [
{
"name": "round",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "winningPlot",
"type": "uint8",
"indexed": false,
"internalType": "uint8"
},
{
"name": "crop",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "JackpotBpsSet",
"type": "event",
"inputs": [
{
"name": "bps",
"type": "uint16",
"indexed": false,
"internalType": "uint16"
}
],
"anonymous": false
},
{
"name": "JackpotHit",
"type": "event",
"inputs": [
{
"name": "round",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "JackpotOddsSet",
"type": "event",
"inputs": [
{
"name": "odds",
"type": "uint32",
"indexed": false,
"internalType": "uint32"
}
],
"anonymous": false
},
{
"name": "KeeperSet",
"type": "event",
"inputs": [
{
"name": "keeper",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "MinPlantEthSet",
"type": "event",
"inputs": [
{
"name": "minPlantEth",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "OwnershipTransferStarted",
"type": "event",
"inputs": [
{
"name": "previousOwner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "OwnershipTransferred",
"type": "event",
"inputs": [
{
"name": "previousOwner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "Planted",
"type": "event",
"inputs": [
{
"name": "player",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "round",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "plot",
"type": "uint8",
"indexed": false,
"internalType": "uint8"
},
{
"name": "ethIn",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "stake",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "PlantedMany",
"type": "event",
"inputs": [
{
"name": "player",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "startRound",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "roundCount",
"type": "uint16",
"indexed": false,
"internalType": "uint16"
},
{
"name": "plotMask",
"type": "uint32",
"indexed": false,
"internalType": "uint32"
},
{
"name": "ethIn",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "totalStake",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "RakeBpsSet",
"type": "event",
"inputs": [
{
"name": "bps",
"type": "uint16",
"indexed": false,
"internalType": "uint16"
}
],
"anonymous": false
},
{
"name": "RandomnessSet",
"type": "event",
"inputs": [
{
"name": "randomness",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "Revealed",
"type": "event",
"inputs": [
{
"name": "round",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "winningPlot",
"type": "uint8",
"indexed": false,
"internalType": "uint8"
},
{
"name": "winningStake",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "netLossPool",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "RoundVoided",
"type": "event",
"inputs": [
{
"name": "round",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Sealed",
"type": "event",
"inputs": [
{
"name": "round",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "sealBlock",
"type": "uint64",
"indexed": false,
"internalType": "uint64"
}
],
"anonymous": false
},
{
"name": "StakingFlushed",
"type": "event",
"inputs": [
{
"name": "aaplAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "StakingSet",
"type": "event",
"inputs": [
{
"name": "staking",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "SwapperSet",
"type": "event",
"inputs": [
{
"name": "swapper",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "TreasuryCollected",
"type": "event",
"inputs": [
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "aaplAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "JUICE_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "MAX_ADMIN_FEE_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "MAX_MIN_PLANT_ETH",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "MAX_PLANT_SLOTS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "MAX_RAKE_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "PLOTS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"stateMutability": "view"
},
{
"name": "ROUND_SECONDS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "SOW_SECONDS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "STAKERS_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "aapl",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IERC20"
}
],
"stateMutability": "view"
},
{
"name": "acceptOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "adminAccrued",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "adminFeeBps",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "buybackSeed",
"type": "function",
"inputs": [
{
"name": "minSeedOut",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "claim",
"type": "function",
"inputs": [
{
"name": "roundIds",
"type": "uint256[]",
"internalType": "uint256[]"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "collectAdmin",
"type": "function",
"inputs": [
{
"name": "to",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "collectTreasury",
"type": "function",
"inputs": [
{
"name": "to",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "crank",
"type": "function",
"inputs": [
{
"name": "maxRounds",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "currentRound",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "flushStaking",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "genesis",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "jackpotAccrued",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "jackpotBps",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "jackpotOdds",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint32",
"internalType": "uint32"
}
],
"stateMutability": "view"
},
{
"name": "juiceIndex",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "keeper",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "minPlantEth",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "miners",
"type": "function",
"inputs": [
{
"name": "round",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "address[]",
"internalType": "address[]"
}
],
"stateMutability": "view"
},
{
"name": "nextToResolve",
"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": "pendingClaim",
"type": "function",
"inputs": [
{
"name": "player",
"type": "address",
"internalType": "address"
},
{
"name": "roundIds",
"type": "uint256[]",
"internalType": "uint256[]"
}
],
"outputs": [
{
"name": "total",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "pendingOwner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "plant",
"type": "function",
"inputs": [
{
"name": "plot",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "minAaplOut",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "plantMany",
"type": "function",
"inputs": [
{
"name": "plotMask",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "roundCount",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "minAaplOut",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "playerPlots",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint32",
"internalType": "uint32"
}
],
"stateMutability": "view"
},
{
"name": "playerTotal",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "plotStake",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "rakeBps",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "randomness",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IRandomness"
}
],
"stateMutability": "view"
},
{
"name": "renounceOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "view"
},
{
"name": "roundClaimed",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "rounds",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "sealBlock",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "revealed",
"type": "bool",
"internalType": "bool"
},
{
"name": "voided",
"type": "bool",
"internalType": "bool"
},
{
"name": "winningPlot",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "rakeBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "jackpotBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "jackpotOdds",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "totalStake",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "winningStake",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "netLossPool",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "entryIndex",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "jackpotWon",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "seed",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IERC20"
}
],
"stateMutability": "view"
},
{
"name": "setAdminFeeBps",
"type": "function",
"inputs": [
{
"name": "bps",
"type": "uint16",
"internalType": "uint16"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setJackpotBps",
"type": "function",
"inputs": [
{
"name": "bps",
"type": "uint16",
"internalType": "uint16"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setJackpotOdds",
"type": "function",
"inputs": [
{
"name": "odds",
"type": "uint32",
"internalType": "uint32"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setKeeper",
"type": "function",
"inputs": [
{
"name": "keeper_",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setMinPlantEth",
"type": "function",
"inputs": [
{
"name": "minPlantEth_",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setRakeBps",
"type": "function",
"inputs": [
{
"name": "bps",
"type": "uint16",
"internalType": "uint16"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setRandomness",
"type": "function",
"inputs": [
{
"name": "randomness_",
"type": "address",
"internalType": "contract IRandomness"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setStaking",
"type": "function",
"inputs": [
{
"name": "staking_",
"type": "address",
"internalType": "contract IStaking"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setSwapper",
"type": "function",
"inputs": [
{
"name": "swapper_",
"type": "address",
"internalType": "contract ISwapper"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "stakeOf",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "",
"type": "address",
"internalType": "address"
},
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "staking",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IStaking"
}
],
"stateMutability": "view"
},
{
"name": "stakingAccrued",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "swapper",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract ISwapper"
}
],
"stateMutability": "view"
},
{
"name": "transferOwnership",
"type": "function",
"inputs": [
{
"name": "newOwner",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "treasuryAccrued",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "unclaimedShares",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
}
]0x60e060405234801561000f575f5ffd5b50604051613b51380380613b5183398101604081905261002e916104e0565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b61006581610132565b5060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556001600160a01b03861615806100a757506001600160a01b038516155b156100c55760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b03808716608052851660a0524260c0526100e58461014e565b6100ee836101ca565b6100fe6601c6bf5263400061023f565b6101078261029d565b6101116064610308565b61011c61138861037d565b6101276101f4610400565b50505050505061058e565b600180546001600160a01b031916905561014b8161047d565b50565b6001600160a01b0381166101755760405163d92e233d60e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527f673779832598d6a388768ee342f8de96fdd5c39a468a6955377cf1405b9652b9906020015b60405180910390a150565b6001600160a01b0381166101f15760405163d92e233d60e01b815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040519081527f25f8ac8ea12efdf0a8596aee41cd1afab5814806e5226ec0af6af5a250c61c57906020016101bf565b670de0b6b3a764000081111561026857604051631de2976760e01b815260040160405180910390fd5b60068190556040518181527fe90a5cb1fc3a1975961e435a02bc90b01df7bdd3e37b0bedecacc3a82886b156906020016101bf565b6107d061ffff821611156102c45760405163bbf4268d60e01b815260040160405180910390fd5b6007805461ffff191661ffff83169081179091556040519081527f2414b8749e7810f7b29456edb0c5ef41cd710a080ec31d8dd5fda03a233e4b6b906020016101bf565b6101f461ffff8216111561032f5760405163bbf4268d60e01b815260040160405180910390fd5b6007805463ffff000019166201000061ffff8416908102919091179091556040519081527fe95a1621a25210d2b1a745f0ffe3b2f4b00463b2605f7b3fd955db1874fd3713906020016101bf565b61038b6103e8612710610569565b8161ffff1611156103af5760405163bbf4268d60e01b815260040160405180910390fd5b6007805461ffff60201b191664010000000061ffff8416908102919091179091556040519081527f96e159425c55ee543ca9a2e0616a2af4c33b546cc746e3d4f814f07e75d04745906020016101bf565b8063ffffffff165f036104265760405163e1df1b7960e01b815260040160405180910390fd5b6007805463ffffffff60301b1916660100000000000063ffffffff8416908102919091179091556040519081527ff3a76a5814fa8e2944bb6a2c7ab4651082756982a4a4d450b8aec3e1c424ed8a906020016101bf565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038116811461014b575f5ffd5b5f5f5f5f5f5f60c087890312156104f5575f5ffd5b8651610500816104cc565b6020880151909650610511816104cc565b6040880151909550610522816104cc565b6060880151909450610533816104cc565b608088015190935061ffff8116811461054a575f5ffd5b60a088015190925061055b816104cc565b809150509295509295509295565b8181038181111561058857634e487b7160e01b5f52601160045260245ffd5b92915050565b60805160a05160c05161351461063d5f395f818161095a015281816119fc01528181611d9a015281816122b101526126ef01525f818161069d01528181610c7901528181610dba0152610e6601525f81816103b201528181610c3901528181610d7001528181610f4d0152818161103a015281816113570152818161143b0152818161153e015281816117d1015281816118210152818161191601528181611e080152611f0b01526135145ff3fe60806040526004361061037c575f3560e01c80638da5cb5b116101d3578063ccdea6f7116100fd578063e30c39781161009d578063eccfd5a21161006d578063eccfd5a214610b74578063f2fde38b14610b89578063f685e8e114610ba8578063f8efeabe14610bbd575f5ffd5b8063e30c397814610aee578063e6f0681c14610b0b578063e753f27414610b2b578063e815d16f14610b3e575f5ffd5b8063da9feed1116100d8578063da9feed114610a5c578063db11b7d814610a71578063e071c5b814610aad578063e0d152af14610ac2575f5ffd5b8063ccdea6f714610a0d578063d65a6e9b14610a33578063d65c120014610a47575f5ffd5b8063a37a85e911610173578063aced166111610143578063aced16611461099b578063b156edd3146109ba578063b594c371146109d9578063cc279009146109f8575f5ffd5b8063a37a85e91461090b578063a75f736c1461092a578063a7f0b3de14610949578063ac27a24f1461097c575f5ffd5b80639ae9b64c116101ae5780639ae9b64c146108ab5780639c82f2a4146108cd5780639d3cef9b146108ec578063a04941a214610559575f5ffd5b80638da5cb5b1461083a5780638ff39099146108565780639ae8588314610875575f5ffd5b80634cf088d9116102b4578063748747e6116102545780637ed2685a116102245780637ed2685a146106bf5780638a19c8bc146106fb5780638b3e04761461070f5780638c65c81f14610723575f5ffd5b8063748747e61461064557806379ba5097146106645780637bdcb394146106785780637d94792a1461068c575f5ffd5b8063694cf4fc1161028f578063694cf4fc146105b65780636ba4c138146105ff5780637050e6d91461061e578063715018a614610631575f5ffd5b80634cf088d91461056e578063599cde6e1461058d57806367f9912b146105a2575f5ffd5b806322aa44c51161031f57806336013189116102fa57806336013189146105065780633cf05d3c146105255780633ded547b1461053a578063406a573814610559575f5ffd5b806322aa44c5146104ad57806325929762146104cc5780632b3297f9146104e7575f5ffd5b8063102672ba1161035a578063102672ba1461041057806319eebf95146104385780631efae1c41461047057806321c9c44a14610493575f5ffd5b8063041d0415146103805780630b2f6e5e146103a15780630daf9d96146103f1575b5f5ffd5b34801561038b575f5ffd5b5061039f61039a3660046130ce565b610bdc565b005b3480156103ac575f5ffd5b506103d47f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156103fc575f5ffd5b5061039f61040b3660046130ee565b610bf0565b34801561041b575f5ffd5b506104256107d081565b60405161ffff90911681526020016103e8565b348015610443575f5ffd5b5060075461045b90600160301b900463ffffffff1681565b60405163ffffffff90911681526020016103e8565b34801561047b575f5ffd5b5061048560105481565b6040519081526020016103e8565b34801561049e575f5ffd5b506007546104259061ffff1681565b3480156104b8575f5ffd5b5061039f6104c7366004613119565b610ee1565b3480156104d7575f5ffd5b50610485670de0b6b3a764000081565b3480156104f2575f5ffd5b506002546103d4906001600160a01b031681565b348015610511575f5ffd5b506003546103d4906001600160a01b031681565b348015610530575f5ffd5b5061048560135481565b348015610545575f5ffd5b5061039f610554366004613119565b610fce565b348015610564575f5ffd5b506104256103e881565b348015610579575f5ffd5b506004546103d4906001600160a01b031681565b348015610598575f5ffd5b5061048560145481565b3480156105ad575f5ffd5b50610485603c81565b3480156105c1575f5ffd5b506105ef6105d0366004613134565b600c60209081525f928352604080842090915290825290205460ff1681565b60405190151581526020016103e8565b34801561060a575f5ffd5b5061039f6106193660046131aa565b61109c565b61039f61062c3660046131fc565b6113d7565b34801561063c575f5ffd5b5061039f611665565b348015610650575f5ffd5b5061039f61065f366004613119565b611686565b34801561066f575f5ffd5b5061039f6116e3565b348015610683575f5ffd5b5061039f611724565b348015610697575f5ffd5b506103d47f000000000000000000000000000000000000000000000000000000000000000081565b3480156106ca575f5ffd5b5061045b6106d9366004613134565b600e60209081525f928352604080842090915290825290205463ffffffff1681565b348015610706575f5ffd5b506104856119f4565b34801561071a575f5ffd5b50610485604b81565b34801561072e575f5ffd5b506107c461073d3660046130ee565b60086020525f908152604090208054600182015460028301546003840154600485015460059095015467ffffffffffffffff851695600160401b860460ff90811696600160481b8104821696600160501b820490921695600160581b820461ffff90811696600160681b840490911695600160781b90930463ffffffff169491929091908c565b6040805167ffffffffffffffff909d168d529a151560208d0152981515998b019990995260ff90961660608a015261ffff94851660808a01529390921660a088015263ffffffff1660c087015260e0860152610100850152610120840152610140830191909152610160820152610180016103e8565b348015610845575f5ffd5b505f546001600160a01b03166103d4565b348015610861575f5ffd5b5061039f610870366004613119565b611a30565b348015610880575f5ffd5b5061048561088f366004613134565b600b60209081525f928352604080842090915290825290205481565b3480156108b6575f5ffd5b5060075461042590640100000000900461ffff1681565b3480156108d8575f5ffd5b5061039f6108e7366004613119565b611aad565b3480156108f7575f5ffd5b5061039f6109063660046130ee565b611abe565b348015610916575f5ffd5b5061039f610925366004613119565b611ac7565b348015610935575f5ffd5b5061039f610944366004613236565b611ad8565b348015610954575f5ffd5b506104857f000000000000000000000000000000000000000000000000000000000000000081565b348015610987575f5ffd5b5061039f6109963660046130ce565b611ae9565b3480156109a6575f5ffd5b506005546103d4906001600160a01b031681565b3480156109c5575f5ffd5b506104856109d436600461324f565b611afa565b3480156109e4575f5ffd5b5061039f6109f33660046130ce565b611cc8565b348015610a03575f5ffd5b50610485600f5481565b348015610a18575f5ffd5b50610a21601981565b60405160ff90911681526020016103e8565b348015610a3e575f5ffd5b5061048560fa81565b348015610a52575f5ffd5b5061048560115481565b348015610a67575f5ffd5b5061048560125481565b348015610a7c575f5ffd5b50610485610a8b3660046132b0565b600a60209081525f938452604080852082529284528284209052825290205481565b348015610ab8575f5ffd5b5061048560155481565b348015610acd575f5ffd5b50610ae1610adc3660046130ee565b611cd9565b6040516103e891906132eb565b348015610af9575f5ffd5b506001546001600160a01b03166103d4565b348015610b16575f5ffd5b506007546104259062010000900461ffff1681565b61039f610b39366004613336565b611d42565b348015610b49575f5ffd5b50610485610b5836600461335e565b600960209081525f928352604080842090915290825290205481565b348015610b7f575f5ffd5b506104256101f481565b348015610b94575f5ffd5b5061039f610ba3366004613119565b61201c565b348015610bb3575f5ffd5b5061048560065481565b348015610bc8575f5ffd5b5061039f610bd73660046130ee565b61208c565b610be461209d565b610bed816120c9565b50565b610bf861209d565b610c00612134565b600f545f819003610c24576040516312d37ee560e31b815260040160405180910390fd5b5f600f55600254610c62906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811691168361214f565b6040516370a0823160e01b81523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610cc6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cea9190613388565b600254604051637748e10160e11b815260048101859052602481018690529192506001600160a01b03169063ee91c202906044016020604051808303815f875af1158015610d3a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d5e9190613388565b50600254610d99906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811691165f61214f565b6040516370a0823160e01b81523060048201525f9082906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015610dff573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e239190613388565b610e2d91906133b3565b905083811080610e3b575080155b15610e595760405163bb2875c360e01b815260040160405180910390fd5b610e8f6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001661dead836121c9565b60408051848152602081018390527fc65a4c73cfd820dccb7079db9e52bb2c09dfd56f9221e7d815e201b726b5c39d910160405180910390a1505050610bed60015f5160206134bf5f395f51905f5255565b610ee961209d565b610ef1612134565b6001600160a01b038116610f185760405163d92e233d60e01b815260040160405180910390fd5b600f545f819003610f3c576040516312d37ee560e31b815260040160405180910390fd5b5f600f55610f746001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001683836121c9565b816001600160a01b03167f04f9fbee3201718d7e2537842de223e46ca982e1530187df3b1de12041cdcc9e82604051610faf91815260200190565b60405180910390a250610bed60015f5160206134bf5f395f51905f5255565b610fd661209d565b610fde612134565b6001600160a01b0381166110055760405163d92e233d60e01b815260040160405180910390fd5b6011545f819003611029576040516312d37ee560e31b815260040160405180910390fd5b5f6011556110616001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001683836121c9565b816001600160a01b03167f276821c317a393a19b618adbd55cb2d5d4e3f2fdc9a2b473685812916d22ee6a82604051610faf91815260200190565b6110a4612134565b5f80805b83811015611296575f8585838181106110c3576110c36133cc565b602090810292909201355f81815260089093526040909220805492935091600160401b900460ff16159050801561110357508054600160481b900460ff16155b15611129576040516304e67c3960e31b8152600481018390526024015b60405180910390fd5b5f828152600c6020908152604080832033845290915290205460ff16156111665760405163598b3dfd60e11b815260048101839052602401611120565b5f828152600c602090815260408083203384529091529020805460ff191660011790558054600160481b900460ff16156111c6575f828152600b602090815260408083203384529091529020546111bd90866133e0565b9450505061128e565b5f828152600a6020908152604080832033845282528083208454600160501b900460ff168452909152812054908190036112025750505061128e565b5f826002015482846003015461121891906133f3565b611222919061341e565b61122c90836133e0565b9050670de0b6b3a7640000836004015460135461124991906133b3565b61125390836133f3565b61125d919061341e565b61126790826133e0565b61127190876133e0565b95508060145f82825461128491906133b3565b9091555050505050505b6001016110a8565b505f6127106112a76103e8846133f3565b6112b1919061341e565b9050801561131257601454156112fb576014546112d6670de0b6b3a7640000836133f3565b6112e0919061341e565b60135f8282546112f091906133e0565b909155506113129050565b8060125f82825461130c91906133e0565b90915550505b5f8161131e84866133e0565b61132891906133b3565b9050805f0361134a576040516312d37ee560e31b815260040160405180910390fd5b61137e6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633836121c9565b604080518281526020810184905233917f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a910160405180910390a2505050506113d360015f5160206134bf5f395f51905f5255565b5050565b6113df612134565b5f6113ea84846121d6565b9050806006546113fa91906133f3565b34101561141a576040516315105acf60e11b815260040160405180910390fd5b611424600261229a565b6040516370a0823160e01b81523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611488573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114ac9190613388565b6002546040516335b4f81960e01b8152600481018690529192506001600160a01b0316906335b4f81990349060240160206040518083038185885af11580156114f7573d5f5f3e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061151c9190613388565b506040516370a0823160e01b81523060048201525f9082906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015611583573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115a79190613388565b6115b191906133b3565b9050838110806115bf575080155b156115dd5760405163bb2875c360e01b815260040160405180910390fd5b5f5f6115eb8888878661265f565b6040805161ffff8b16815263ffffffff8c1660208201523481830152606081018390529051929450909250839133917ff43a0960c7d130f6bf42123f81b805df7a266c8b50924967b20f9b2a14452e0b919081900360800190a3505050505061166060015f5160206134bf5f395f51905f5255565b505050565b61166d61209d565b604051638905116560e01b815260040160405180910390fd5b61168e61209d565b600580546001600160a01b0319166001600160a01b0383169081179091556040519081527fdc3dba1d64dd67c0dc8b12621edd0c6ca4303a9073c3a8fcac38115e73d67b6b906020015b60405180910390a150565b60015433906001600160a01b0316811461171b5760405163118cdaa760e01b81526001600160a01b0382166004820152602401611120565b610bed816127b7565b61172c612134565b5f546001600160a01b0316331480159061175157506005546001600160a01b03163314155b1561176f5760405163ea8e4eb560e01b815260040160405180910390fd5b6004546001600160a01b03166117985760405163d92e233d60e01b815260040160405180910390fd5b6010545f8190036117bc576040516312d37ee560e31b815260040160405180910390fd5b5f6010556004546117fa906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811691168361214f565b600480546040516370a0823160e01b81526001600160a01b03918216928101929092525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015611868573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061188c9190613388565b600480546040516360993b5b60e01b81529293506001600160a01b0316916360993b5b916118c09186910190815260200190565b5f604051808303815f87803b1580156118d7575f5ffd5b505af11580156118e9573d5f5f3e3d5ffd5b5050600480546040516370a0823160e01b81526001600160a01b03918216928101929092528593508492507f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561195b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061197f9190613388565b61198991906133b3565b146119a75760405163bb2875c360e01b815260040160405180910390fd5b6040518281527f233a880054fc2534581dddab9bcf8bb115f17e357c9c90389c9455b1abfeeb489060200160405180910390a150506119f260015f5160206134bf5f395f51905f5255565b565b5f604b611a217f0000000000000000000000000000000000000000000000000000000000000000426133b3565b611a2b919061341e565b905090565b611a3861209d565b6001600160a01b038116611a5f5760405163d92e233d60e01b815260040160405180910390fd5b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527ff520447191196b125f76f7110397fdf32b1b9cefb7dec323bd3b998022ac2338906020016116d8565b611ab561209d565b610bed816127d0565b610bed8161229a565b611acf61209d565b610bed81612845565b611ae061209d565b610bed816128ba565b611af161209d565b610bed81612937565b5f805b82811015611cc0575f848483818110611b1857611b186133cc565b602090810292909201355f81815260089093526040909220805492935091600160401b900460ff161590508015611b5857508054600160481b900460ff16155b80611b8457505f828152600c602090815260408083206001600160a01b038b16845290915290205460ff165b15611b90575050611cb8565b8054600160481b900460ff1615611bd6575f828152600b602090815260408083206001600160a01b038b168452909152902054611bcd90856133e0565b93505050611cb8565b5f828152600a602090815260408083206001600160a01b038b16845282528083208454600160501b900460ff16845290915281205490819003611c1b57505050611cb8565b5f8260020154828460030154611c3191906133f3565b611c3b919061341e565b611c4590836133e0565b90505f670de0b6b3a76400008460040154601354611c6391906133b3565b611c6d90846133f3565b611c77919061341e565b611c8190836133e0565b9050612710611c926103e8836133f3565b611c9c919061341e565b611ca690826133b3565b611cb090886133e0565b965050505050505b600101611afd565b509392505050565b611cd061209d565b610bed816129ac565b5f818152600d6020908152604091829020805483518184028101840190945280845260609392830182828015611d3657602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311611d18575b50505050509050919050565b611d4a612134565b601960ff831610611d6e57604051636064e7a760e11b815260040160405180910390fd5b600654341015611d91576040516315105acf60e11b815260040160405180910390fd5b603c604b611dbf7f0000000000000000000000000000000000000000000000000000000000000000426133b3565b611dc99190613431565b10611de757604051636ec7afbd60e01b815260040160405180910390fd5b611df1600261229a565b6040516370a0823160e01b81523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611e55573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e799190613388565b6002546040516335b4f81960e01b8152600481018590529192506001600160a01b0316906335b4f81990349060240160206040518083038185885af1158015611ec4573d5f5f3e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190611ee99190613388565b506040516370a0823160e01b81523060048201525f9082906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015611f50573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f749190613388565b611f7e91906133b3565b905082811080611f8c575080155b15611faa5760405163bb2875c360e01b815260040160405180910390fd5b5f5f611fb68684612a30565b6040805160ff8a1681523460208201529081018290529193509150829033907f65be9a9702c82747e6530de985b13ae2e5205c0846f948bca9e8582a26add23f9060600160405180910390a3505050506113d360015f5160206134bf5f395f51905f5255565b61202461209d565b600180546001600160a01b0383166001600160a01b031990911681179091556120545f546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b61209461209d565b610bed81612a9d565b5f546001600160a01b031633146119f25760405163118cdaa760e01b8152336004820152602401611120565b6107d061ffff821611156120f05760405163bbf4268d60e01b815260040160405180910390fd5b6007805461ffff191661ffff83169081179091556040519081527f2414b8749e7810f7b29456edb0c5ef41cd710a080ec31d8dd5fda03a233e4b6b906020016116d8565b61213c612afb565b60025f5160206134bf5f395f51905f5255565b61215b8383835f612b2a565b6116605761216c83835f6001612b2a565b61219457604051635274afe760e01b81526001600160a01b0384166004820152602401611120565b6121a18383836001612b2a565b61166057604051635274afe760e01b81526001600160a01b0384166004820152602401611120565b6121a18383836001612b8c565b5f63ffffffff831615806121f05750607f601984901c1615155b1561220e5760405163751af65960e11b815260040160405180910390fd5b8161ffff165f036122325760405163de50091f60e01b815260040160405180910390fd5b5f835b63ffffffff811615612260578161224b81613444565b925061225a905060018261345c565b16612235565b5061226f61ffff8416826133f3565b915060fa82111561229357604051630c74bf5160e41b815260040160405180910390fd5b5092915050565b6015545f6122a66119f4565b9050603c604b6122d67f0000000000000000000000000000000000000000000000000000000000000000426133b3565b6122e09190613431565b106122f3576122f06001826133e0565b90505b5f5b838110801561230357508183105b15612657575f838152600860205260408120600181015490910361236f57805460ff60481b1916600160481b17815560405184907f4ecb450e70bc0e982eb52ddf0e0308fd4ff61efc2fc0d26d8169a6f860e244cc905f90a28361236681613444565b94505050612645565b805467ffffffffffffffff165f036124d35760035f9054906101000a90046001600160a01b03166001600160a01b0316633c7a3aff6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123d1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123f59190613478565b815467ffffffffffffffff19811667ffffffffffffffff9283169081178455600780546cffff000000ffffffffffffffff1990931690911761ffff928316600160581b0217808555815461ffff60681b198216640100000000909104909316600160681b029283178555905465ffffffffffff60681b1990911663ffffffff60781b1990921691909117600160301b90910463ffffffff16600160781b02178083556040519116815284907fdd4c86298dab371fdd224a7f2584fdc5b1a69ca4995422ebf051655609bc3ec09060200160405180910390a250612657565b600354815460405163f476962360e01b81526004810187905267ffffffffffffffff90911660248201525f916001600160a01b03169063f476962390604401602060405180830381865afa15801561252d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125519190613388565b90508061262a576003548254604051633e3cf5e760e11b815267ffffffffffffffff90911660048201526001600160a01b0390911690637c79ebce90602401602060405180830381865afa1580156125ab573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125cf919061349f565b1561262357815460ff60481b1916600160481b17825560405185907f4ecb450e70bc0e982eb52ddf0e0308fd4ff61efc2fc0d26d8169a6f860e244cc905f90a28461261981613444565b9550505050612645565b5050612657565b612635858383612bd6565b8461263f81613444565b95505050505b8061264f81613444565b9150506122f5565b505060155550565b6007545f9081908190612710906126809062010000900461ffff16866133f3565b61268a919061341e565b90508060115f82825461269d91906133e0565b909155506126ad905081856133b3565b91505f6126ba868461341e565b9050805f036126dc5760405163bb2875c360e01b815260040160405180910390fd5b6126e46119f4565b9350603c604b6127147f0000000000000000000000000000000000000000000000000000000000000000426133b3565b61271e9190613431565b106127315761272e6001856133e0565b93505b5f61273c87836133f3565b61274690856133b3565b90505f5b8861ffff168110156127aa575f5b601960ff821610156127a157600160ff82161b8b1663ffffffff16156127995761279561278583896133e0565b8261279086886133e0565b612f26565b5f92505b600101612758565b5060010161274a565b5050505094509492505050565b600180546001600160a01b0319169055610bed81613069565b6001600160a01b0381166127f75760405163d92e233d60e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527f673779832598d6a388768ee342f8de96fdd5c39a468a6955377cf1405b9652b9906020016116d8565b6001600160a01b03811661286c5760405163d92e233d60e01b815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040519081527f25f8ac8ea12efdf0a8596aee41cd1afab5814806e5226ec0af6af5a250c61c57906020016116d8565b8063ffffffff165f036128e05760405163e1df1b7960e01b815260040160405180910390fd5b6007805469ffffffff0000000000001916600160301b63ffffffff8416908102919091179091556040519081527ff3a76a5814fa8e2944bb6a2c7ab4651082756982a4a4d450b8aec3e1c424ed8a906020016116d8565b6101f461ffff8216111561295e5760405163bbf4268d60e01b815260040160405180910390fd5b6007805463ffff000019166201000061ffff8416908102919091179091556040519081527fe95a1621a25210d2b1a745f0ffe3b2f4b00463b2605f7b3fd955db1874fd3713906020016116d8565b6129ba6103e86127106133b3565b8161ffff1611156129de5760405163bbf4268d60e01b815260040160405180910390fd5b6007805465ffff00000000191664010000000061ffff8416908102919091179091556040519081527f96e159425c55ee543ca9a2e0616a2af4c33b546cc746e3d4f814f07e75d04745906020016116d8565b6007545f908190819061271090612a519062010000900461ffff16866133f3565b612a5b919061341e565b90508060115f828254612a6e91906133e0565b90915550612a7e905081856133b3565b9150612a886119f4565b9250612a95838684612f26565b509250929050565b670de0b6b3a7640000811115612ac657604051631de2976760e01b815260040160405180910390fd5b60068190556040518181527fe90a5cb1fc3a1975961e435a02bc90b01df7bdd3e37b0bedecacc3a82886b156906020016116d8565b5f5160206134bf5f395f51905f52546002036119f257604051633ee5aeb560e01b815260040160405180910390fd5b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316612b80578383151615612b74573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316612b80578383151615612b74573d5f823e3d81fd5b5f612be2601983613431565b5f85815260096020908152604080832060ff85168452909152812054919250819003612cd2575f846001015490508060125f828254612c2191906133e0565b9091555050845460ff8416600160501b810262ff00ff60401b1990921691909117600160401b178655604080519182525f602083018190529082015286907fd4e87eca2317678781825117ede38dc1ff6e2c7c4af5da0a86b6bf24d72acda89060600160405180910390a26040805160ff851681526020810183905287917f0d9a51744a5fa648fd58d24d7ad3a73b927cd16d0d6d11e7f6610c498f7e9da8910160405180910390a2505050505050565b5f818560010154612ce391906133b3565b85549091505f9061271090612d0390600160581b900461ffff16846133f3565b612d0d919061341e565b90505f612710612d1f6103e8846133f3565b612d29919061341e565b87549091505f9061271090612d4990600160681b900461ffff16856133f3565b612d53919061341e565b90508160105f828254612d6691906133e0565b925050819055508060125f828254612d7e91906133e0565b90915550819050612d8f83856133b3565b612d9991906133b3565b600f5f828254612da991906133e0565b909155505f9050612dba84866133b3565b6012549091508015801590612e2b5750895460408051602081018c9052808201919091526007606082015266129050d2d413d560ca1b6080820152600160781b90910463ffffffff169060a001604051602081830303815290604052805190602001205f1c612e299190613431565b155b15612e7e575f601255612e3e81836133e0565b60058b018290556040518281529092508b907f55fa18fe97d12ae9b4636e9c861c79895846e31ce4393c16f632ec3c542fa9d09060200160405180910390a25b612e8882886133e0565b60145f828254612e9891906133e0565b909155505060135460048b0155895460ff8916600160501b810262ff00ff60401b1990921691909117600160401b178b5560028b0188905560038b01839055604080519182526020820189905281018390528b907fd4e87eca2317678781825117ede38dc1ff6e2c7c4af5da0a86b6bf24d72acda89060600160405180910390a25050505050505050505050565b5f838152600b602090815260408083203384529091528120549003612f73575f838152600d602090815260408220805460018101825590835291200180546001600160a01b031916331790555b5f838152600a60209081526040808320338452825280832060ff8616845290915281208054839290612fa69084906133e0565b90915550505f83815260096020908152604080832060ff8616845290915281208054839290612fd69084906133e0565b90915550505f838152600b60209081526040808320338452909152812080548392906130039084906133e0565b90915550505f838152600e602090815260408083203384528252808320805463ffffffff19811663ffffffff918216600160ff8a1681901b9390931617179091558684526008909252822001805483929061305f9084906133e0565b9091555050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b803561ffff811681146130c9575f5ffd5b919050565b5f602082840312156130de575f5ffd5b6130e7826130b8565b9392505050565b5f602082840312156130fe575f5ffd5b5035919050565b6001600160a01b0381168114610bed575f5ffd5b5f60208284031215613129575f5ffd5b81356130e781613105565b5f5f60408385031215613145575f5ffd5b82359150602083013561315781613105565b809150509250929050565b5f5f83601f840112613172575f5ffd5b50813567ffffffffffffffff811115613189575f5ffd5b6020830191508360208260051b85010111156131a3575f5ffd5b9250929050565b5f5f602083850312156131bb575f5ffd5b823567ffffffffffffffff8111156131d1575f5ffd5b6131dd85828601613162565b90969095509350505050565b803563ffffffff811681146130c9575f5ffd5b5f5f5f6060848603121561320e575f5ffd5b613217846131e9565b9250613225602085016130b8565b929592945050506040919091013590565b5f60208284031215613246575f5ffd5b6130e7826131e9565b5f5f5f60408486031215613261575f5ffd5b833561326c81613105565b9250602084013567ffffffffffffffff811115613287575f5ffd5b61329386828701613162565b9497909650939450505050565b803560ff811681146130c9575f5ffd5b5f5f5f606084860312156132c2575f5ffd5b8335925060208401356132d481613105565b91506132e2604085016132a0565b90509250925092565b602080825282518282018190525f918401906040840190835b8181101561332b5783516001600160a01b0316835260209384019390920191600101613304565b509095945050505050565b5f5f60408385031215613347575f5ffd5b613350836132a0565b946020939093013593505050565b5f5f6040838503121561336f575f5ffd5b8235915061337f602084016132a0565b90509250929050565b5f60208284031215613398575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156133c6576133c661339f565b92915050565b634e487b7160e01b5f52603260045260245ffd5b808201808211156133c6576133c661339f565b80820281158282048414176133c6576133c661339f565b634e487b7160e01b5f52601260045260245ffd5b5f8261342c5761342c61340a565b500490565b5f8261343f5761343f61340a565b500690565b5f600182016134555761345561339f565b5060010190565b63ffffffff82811682821603908111156133c6576133c661339f565b5f60208284031215613488575f5ffd5b815167ffffffffffffffff811681146130e7575f5ffd5b5f602082840312156134af575f5ffd5b815180151581146130e7575f5ffdfe9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a26469706673582212201079dbd7f351870f188ae4896d809a087b0b7814cf1321dc93f2eb7ec535724f64736f6c634300081e0033000000000000000000000000af3d76f1834a1d425780943c99ea8a608f8a93f9000000000000000000000000945319a6028c782d5a18b6f829eb0619ad34fdc80000000000000000000000002b58ab8c52a09939bac7e8df1a1b3127857ebaa5000000000000000000000000334ff0dd624a672be02322d53ad8e59a51405e1a00000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000b0cd8fd8d1ebcabe8304717281c726af56e00b68
0x60806040526004361061037c575f3560e01c80638da5cb5b116101d3578063ccdea6f7116100fd578063e30c39781161009d578063eccfd5a21161006d578063eccfd5a214610b74578063f2fde38b14610b89578063f685e8e114610ba8578063f8efeabe14610bbd575f5ffd5b8063e30c397814610aee578063e6f0681c14610b0b578063e753f27414610b2b578063e815d16f14610b3e575f5ffd5b8063da9feed1116100d8578063da9feed114610a5c578063db11b7d814610a71578063e071c5b814610aad578063e0d152af14610ac2575f5ffd5b8063ccdea6f714610a0d578063d65a6e9b14610a33578063d65c120014610a47575f5ffd5b8063a37a85e911610173578063aced166111610143578063aced16611461099b578063b156edd3146109ba578063b594c371146109d9578063cc279009146109f8575f5ffd5b8063a37a85e91461090b578063a75f736c1461092a578063a7f0b3de14610949578063ac27a24f1461097c575f5ffd5b80639ae9b64c116101ae5780639ae9b64c146108ab5780639c82f2a4146108cd5780639d3cef9b146108ec578063a04941a214610559575f5ffd5b80638da5cb5b1461083a5780638ff39099146108565780639ae8588314610875575f5ffd5b80634cf088d9116102b4578063748747e6116102545780637ed2685a116102245780637ed2685a146106bf5780638a19c8bc146106fb5780638b3e04761461070f5780638c65c81f14610723575f5ffd5b8063748747e61461064557806379ba5097146106645780637bdcb394146106785780637d94792a1461068c575f5ffd5b8063694cf4fc1161028f578063694cf4fc146105b65780636ba4c138146105ff5780637050e6d91461061e578063715018a614610631575f5ffd5b80634cf088d91461056e578063599cde6e1461058d57806367f9912b146105a2575f5ffd5b806322aa44c51161031f57806336013189116102fa57806336013189146105065780633cf05d3c146105255780633ded547b1461053a578063406a573814610559575f5ffd5b806322aa44c5146104ad57806325929762146104cc5780632b3297f9146104e7575f5ffd5b8063102672ba1161035a578063102672ba1461041057806319eebf95146104385780631efae1c41461047057806321c9c44a14610493575f5ffd5b8063041d0415146103805780630b2f6e5e146103a15780630daf9d96146103f1575b5f5ffd5b34801561038b575f5ffd5b5061039f61039a3660046130ce565b610bdc565b005b3480156103ac575f5ffd5b506103d47f000000000000000000000000af3d76f1834a1d425780943c99ea8a608f8a93f981565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156103fc575f5ffd5b5061039f61040b3660046130ee565b610bf0565b34801561041b575f5ffd5b506104256107d081565b60405161ffff90911681526020016103e8565b348015610443575f5ffd5b5060075461045b90600160301b900463ffffffff1681565b60405163ffffffff90911681526020016103e8565b34801561047b575f5ffd5b5061048560105481565b6040519081526020016103e8565b34801561049e575f5ffd5b506007546104259061ffff1681565b3480156104b8575f5ffd5b5061039f6104c7366004613119565b610ee1565b3480156104d7575f5ffd5b50610485670de0b6b3a764000081565b3480156104f2575f5ffd5b506002546103d4906001600160a01b031681565b348015610511575f5ffd5b506003546103d4906001600160a01b031681565b348015610530575f5ffd5b5061048560135481565b348015610545575f5ffd5b5061039f610554366004613119565b610fce565b348015610564575f5ffd5b506104256103e881565b348015610579575f5ffd5b506004546103d4906001600160a01b031681565b348015610598575f5ffd5b5061048560145481565b3480156105ad575f5ffd5b50610485603c81565b3480156105c1575f5ffd5b506105ef6105d0366004613134565b600c60209081525f928352604080842090915290825290205460ff1681565b60405190151581526020016103e8565b34801561060a575f5ffd5b5061039f6106193660046131aa565b61109c565b61039f61062c3660046131fc565b6113d7565b34801561063c575f5ffd5b5061039f611665565b348015610650575f5ffd5b5061039f61065f366004613119565b611686565b34801561066f575f5ffd5b5061039f6116e3565b348015610683575f5ffd5b5061039f611724565b348015610697575f5ffd5b506103d47f000000000000000000000000945319a6028c782d5a18b6f829eb0619ad34fdc881565b3480156106ca575f5ffd5b5061045b6106d9366004613134565b600e60209081525f928352604080842090915290825290205463ffffffff1681565b348015610706575f5ffd5b506104856119f4565b34801561071a575f5ffd5b50610485604b81565b34801561072e575f5ffd5b506107c461073d3660046130ee565b60086020525f908152604090208054600182015460028301546003840154600485015460059095015467ffffffffffffffff851695600160401b860460ff90811696600160481b8104821696600160501b820490921695600160581b820461ffff90811696600160681b840490911695600160781b90930463ffffffff169491929091908c565b6040805167ffffffffffffffff909d168d529a151560208d0152981515998b019990995260ff90961660608a015261ffff94851660808a01529390921660a088015263ffffffff1660c087015260e0860152610100850152610120840152610140830191909152610160820152610180016103e8565b348015610845575f5ffd5b505f546001600160a01b03166103d4565b348015610861575f5ffd5b5061039f610870366004613119565b611a30565b348015610880575f5ffd5b5061048561088f366004613134565b600b60209081525f928352604080842090915290825290205481565b3480156108b6575f5ffd5b5060075461042590640100000000900461ffff1681565b3480156108d8575f5ffd5b5061039f6108e7366004613119565b611aad565b3480156108f7575f5ffd5b5061039f6109063660046130ee565b611abe565b348015610916575f5ffd5b5061039f610925366004613119565b611ac7565b348015610935575f5ffd5b5061039f610944366004613236565b611ad8565b348015610954575f5ffd5b506104857f000000000000000000000000000000000000000000000000000000006a6042c681565b348015610987575f5ffd5b5061039f6109963660046130ce565b611ae9565b3480156109a6575f5ffd5b506005546103d4906001600160a01b031681565b3480156109c5575f5ffd5b506104856109d436600461324f565b611afa565b3480156109e4575f5ffd5b5061039f6109f33660046130ce565b611cc8565b348015610a03575f5ffd5b50610485600f5481565b348015610a18575f5ffd5b50610a21601981565b60405160ff90911681526020016103e8565b348015610a3e575f5ffd5b5061048560fa81565b348015610a52575f5ffd5b5061048560115481565b348015610a67575f5ffd5b5061048560125481565b348015610a7c575f5ffd5b50610485610a8b3660046132b0565b600a60209081525f938452604080852082529284528284209052825290205481565b348015610ab8575f5ffd5b5061048560155481565b348015610acd575f5ffd5b50610ae1610adc3660046130ee565b611cd9565b6040516103e891906132eb565b348015610af9575f5ffd5b506001546001600160a01b03166103d4565b348015610b16575f5ffd5b506007546104259062010000900461ffff1681565b61039f610b39366004613336565b611d42565b348015610b49575f5ffd5b50610485610b5836600461335e565b600960209081525f928352604080842090915290825290205481565b348015610b7f575f5ffd5b506104256101f481565b348015610b94575f5ffd5b5061039f610ba3366004613119565b61201c565b348015610bb3575f5ffd5b5061048560065481565b348015610bc8575f5ffd5b5061039f610bd73660046130ee565b61208c565b610be461209d565b610bed816120c9565b50565b610bf861209d565b610c00612134565b600f545f819003610c24576040516312d37ee560e31b815260040160405180910390fd5b5f600f55600254610c62906001600160a01b037f000000000000000000000000af3d76f1834a1d425780943c99ea8a608f8a93f9811691168361214f565b6040516370a0823160e01b81523060048201525f907f000000000000000000000000945319a6028c782d5a18b6f829eb0619ad34fdc86001600160a01b0316906370a0823190602401602060405180830381865afa158015610cc6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cea9190613388565b600254604051637748e10160e11b815260048101859052602481018690529192506001600160a01b03169063ee91c202906044016020604051808303815f875af1158015610d3a573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d5e9190613388565b50600254610d99906001600160a01b037f000000000000000000000000af3d76f1834a1d425780943c99ea8a608f8a93f9811691165f61214f565b6040516370a0823160e01b81523060048201525f9082906001600160a01b037f000000000000000000000000945319a6028c782d5a18b6f829eb0619ad34fdc816906370a0823190602401602060405180830381865afa158015610dff573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e239190613388565b610e2d91906133b3565b905083811080610e3b575080155b15610e595760405163bb2875c360e01b815260040160405180910390fd5b610e8f6001600160a01b037f000000000000000000000000945319a6028c782d5a18b6f829eb0619ad34fdc81661dead836121c9565b60408051848152602081018390527fc65a4c73cfd820dccb7079db9e52bb2c09dfd56f9221e7d815e201b726b5c39d910160405180910390a1505050610bed60015f5160206134bf5f395f51905f5255565b610ee961209d565b610ef1612134565b6001600160a01b038116610f185760405163d92e233d60e01b815260040160405180910390fd5b600f545f819003610f3c576040516312d37ee560e31b815260040160405180910390fd5b5f600f55610f746001600160a01b037f000000000000000000000000af3d76f1834a1d425780943c99ea8a608f8a93f91683836121c9565b816001600160a01b03167f04f9fbee3201718d7e2537842de223e46ca982e1530187df3b1de12041cdcc9e82604051610faf91815260200190565b60405180910390a250610bed60015f5160206134bf5f395f51905f5255565b610fd661209d565b610fde612134565b6001600160a01b0381166110055760405163d92e233d60e01b815260040160405180910390fd5b6011545f819003611029576040516312d37ee560e31b815260040160405180910390fd5b5f6011556110616001600160a01b037f000000000000000000000000af3d76f1834a1d425780943c99ea8a608f8a93f91683836121c9565b816001600160a01b03167f276821c317a393a19b618adbd55cb2d5d4e3f2fdc9a2b473685812916d22ee6a82604051610faf91815260200190565b6110a4612134565b5f80805b83811015611296575f8585838181106110c3576110c36133cc565b602090810292909201355f81815260089093526040909220805492935091600160401b900460ff16159050801561110357508054600160481b900460ff16155b15611129576040516304e67c3960e31b8152600481018390526024015b60405180910390fd5b5f828152600c6020908152604080832033845290915290205460ff16156111665760405163598b3dfd60e11b815260048101839052602401611120565b5f828152600c602090815260408083203384529091529020805460ff191660011790558054600160481b900460ff16156111c6575f828152600b602090815260408083203384529091529020546111bd90866133e0565b9450505061128e565b5f828152600a6020908152604080832033845282528083208454600160501b900460ff168452909152812054908190036112025750505061128e565b5f826002015482846003015461121891906133f3565b611222919061341e565b61122c90836133e0565b9050670de0b6b3a7640000836004015460135461124991906133b3565b61125390836133f3565b61125d919061341e565b61126790826133e0565b61127190876133e0565b95508060145f82825461128491906133b3565b9091555050505050505b6001016110a8565b505f6127106112a76103e8846133f3565b6112b1919061341e565b9050801561131257601454156112fb576014546112d6670de0b6b3a7640000836133f3565b6112e0919061341e565b60135f8282546112f091906133e0565b909155506113129050565b8060125f82825461130c91906133e0565b90915550505b5f8161131e84866133e0565b61132891906133b3565b9050805f0361134a576040516312d37ee560e31b815260040160405180910390fd5b61137e6001600160a01b037f000000000000000000000000af3d76f1834a1d425780943c99ea8a608f8a93f91633836121c9565b604080518281526020810184905233917f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a910160405180910390a2505050506113d360015f5160206134bf5f395f51905f5255565b5050565b6113df612134565b5f6113ea84846121d6565b9050806006546113fa91906133f3565b34101561141a576040516315105acf60e11b815260040160405180910390fd5b611424600261229a565b6040516370a0823160e01b81523060048201525f907f000000000000000000000000af3d76f1834a1d425780943c99ea8a608f8a93f96001600160a01b0316906370a0823190602401602060405180830381865afa158015611488573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114ac9190613388565b6002546040516335b4f81960e01b8152600481018690529192506001600160a01b0316906335b4f81990349060240160206040518083038185885af11580156114f7573d5f5f3e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061151c9190613388565b506040516370a0823160e01b81523060048201525f9082906001600160a01b037f000000000000000000000000af3d76f1834a1d425780943c99ea8a608f8a93f916906370a0823190602401602060405180830381865afa158015611583573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115a79190613388565b6115b191906133b3565b9050838110806115bf575080155b156115dd5760405163bb2875c360e01b815260040160405180910390fd5b5f5f6115eb8888878661265f565b6040805161ffff8b16815263ffffffff8c1660208201523481830152606081018390529051929450909250839133917ff43a0960c7d130f6bf42123f81b805df7a266c8b50924967b20f9b2a14452e0b919081900360800190a3505050505061166060015f5160206134bf5f395f51905f5255565b505050565b61166d61209d565b604051638905116560e01b815260040160405180910390fd5b61168e61209d565b600580546001600160a01b0319166001600160a01b0383169081179091556040519081527fdc3dba1d64dd67c0dc8b12621edd0c6ca4303a9073c3a8fcac38115e73d67b6b906020015b60405180910390a150565b60015433906001600160a01b0316811461171b5760405163118cdaa760e01b81526001600160a01b0382166004820152602401611120565b610bed816127b7565b61172c612134565b5f546001600160a01b0316331480159061175157506005546001600160a01b03163314155b1561176f5760405163ea8e4eb560e01b815260040160405180910390fd5b6004546001600160a01b03166117985760405163d92e233d60e01b815260040160405180910390fd5b6010545f8190036117bc576040516312d37ee560e31b815260040160405180910390fd5b5f6010556004546117fa906001600160a01b037f000000000000000000000000af3d76f1834a1d425780943c99ea8a608f8a93f9811691168361214f565b600480546040516370a0823160e01b81526001600160a01b03918216928101929092525f917f000000000000000000000000af3d76f1834a1d425780943c99ea8a608f8a93f9909116906370a0823190602401602060405180830381865afa158015611868573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061188c9190613388565b600480546040516360993b5b60e01b81529293506001600160a01b0316916360993b5b916118c09186910190815260200190565b5f604051808303815f87803b1580156118d7575f5ffd5b505af11580156118e9573d5f5f3e3d5ffd5b5050600480546040516370a0823160e01b81526001600160a01b03918216928101929092528593508492507f000000000000000000000000af3d76f1834a1d425780943c99ea8a608f8a93f916906370a0823190602401602060405180830381865afa15801561195b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061197f9190613388565b61198991906133b3565b146119a75760405163bb2875c360e01b815260040160405180910390fd5b6040518281527f233a880054fc2534581dddab9bcf8bb115f17e357c9c90389c9455b1abfeeb489060200160405180910390a150506119f260015f5160206134bf5f395f51905f5255565b565b5f604b611a217f000000000000000000000000000000000000000000000000000000006a6042c6426133b3565b611a2b919061341e565b905090565b611a3861209d565b6001600160a01b038116611a5f5760405163d92e233d60e01b815260040160405180910390fd5b600480546001600160a01b0319166001600160a01b0383169081179091556040519081527ff520447191196b125f76f7110397fdf32b1b9cefb7dec323bd3b998022ac2338906020016116d8565b611ab561209d565b610bed816127d0565b610bed8161229a565b611acf61209d565b610bed81612845565b611ae061209d565b610bed816128ba565b611af161209d565b610bed81612937565b5f805b82811015611cc0575f848483818110611b1857611b186133cc565b602090810292909201355f81815260089093526040909220805492935091600160401b900460ff161590508015611b5857508054600160481b900460ff16155b80611b8457505f828152600c602090815260408083206001600160a01b038b16845290915290205460ff165b15611b90575050611cb8565b8054600160481b900460ff1615611bd6575f828152600b602090815260408083206001600160a01b038b168452909152902054611bcd90856133e0565b93505050611cb8565b5f828152600a602090815260408083206001600160a01b038b16845282528083208454600160501b900460ff16845290915281205490819003611c1b57505050611cb8565b5f8260020154828460030154611c3191906133f3565b611c3b919061341e565b611c4590836133e0565b90505f670de0b6b3a76400008460040154601354611c6391906133b3565b611c6d90846133f3565b611c77919061341e565b611c8190836133e0565b9050612710611c926103e8836133f3565b611c9c919061341e565b611ca690826133b3565b611cb090886133e0565b965050505050505b600101611afd565b509392505050565b611cd061209d565b610bed816129ac565b5f818152600d6020908152604091829020805483518184028101840190945280845260609392830182828015611d3657602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311611d18575b50505050509050919050565b611d4a612134565b601960ff831610611d6e57604051636064e7a760e11b815260040160405180910390fd5b600654341015611d91576040516315105acf60e11b815260040160405180910390fd5b603c604b611dbf7f000000000000000000000000000000000000000000000000000000006a6042c6426133b3565b611dc99190613431565b10611de757604051636ec7afbd60e01b815260040160405180910390fd5b611df1600261229a565b6040516370a0823160e01b81523060048201525f907f000000000000000000000000af3d76f1834a1d425780943c99ea8a608f8a93f96001600160a01b0316906370a0823190602401602060405180830381865afa158015611e55573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e799190613388565b6002546040516335b4f81960e01b8152600481018590529192506001600160a01b0316906335b4f81990349060240160206040518083038185885af1158015611ec4573d5f5f3e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190611ee99190613388565b506040516370a0823160e01b81523060048201525f9082906001600160a01b037f000000000000000000000000af3d76f1834a1d425780943c99ea8a608f8a93f916906370a0823190602401602060405180830381865afa158015611f50573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f749190613388565b611f7e91906133b3565b905082811080611f8c575080155b15611faa5760405163bb2875c360e01b815260040160405180910390fd5b5f5f611fb68684612a30565b6040805160ff8a1681523460208201529081018290529193509150829033907f65be9a9702c82747e6530de985b13ae2e5205c0846f948bca9e8582a26add23f9060600160405180910390a3505050506113d360015f5160206134bf5f395f51905f5255565b61202461209d565b600180546001600160a01b0383166001600160a01b031990911681179091556120545f546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b61209461209d565b610bed81612a9d565b5f546001600160a01b031633146119f25760405163118cdaa760e01b8152336004820152602401611120565b6107d061ffff821611156120f05760405163bbf4268d60e01b815260040160405180910390fd5b6007805461ffff191661ffff83169081179091556040519081527f2414b8749e7810f7b29456edb0c5ef41cd710a080ec31d8dd5fda03a233e4b6b906020016116d8565b61213c612afb565b60025f5160206134bf5f395f51905f5255565b61215b8383835f612b2a565b6116605761216c83835f6001612b2a565b61219457604051635274afe760e01b81526001600160a01b0384166004820152602401611120565b6121a18383836001612b2a565b61166057604051635274afe760e01b81526001600160a01b0384166004820152602401611120565b6121a18383836001612b8c565b5f63ffffffff831615806121f05750607f601984901c1615155b1561220e5760405163751af65960e11b815260040160405180910390fd5b8161ffff165f036122325760405163de50091f60e01b815260040160405180910390fd5b5f835b63ffffffff811615612260578161224b81613444565b925061225a905060018261345c565b16612235565b5061226f61ffff8416826133f3565b915060fa82111561229357604051630c74bf5160e41b815260040160405180910390fd5b5092915050565b6015545f6122a66119f4565b9050603c604b6122d67f000000000000000000000000000000000000000000000000000000006a6042c6426133b3565b6122e09190613431565b106122f3576122f06001826133e0565b90505b5f5b838110801561230357508183105b15612657575f838152600860205260408120600181015490910361236f57805460ff60481b1916600160481b17815560405184907f4ecb450e70bc0e982eb52ddf0e0308fd4ff61efc2fc0d26d8169a6f860e244cc905f90a28361236681613444565b94505050612645565b805467ffffffffffffffff165f036124d35760035f9054906101000a90046001600160a01b03166001600160a01b0316633c7a3aff6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123d1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123f59190613478565b815467ffffffffffffffff19811667ffffffffffffffff9283169081178455600780546cffff000000ffffffffffffffff1990931690911761ffff928316600160581b0217808555815461ffff60681b198216640100000000909104909316600160681b029283178555905465ffffffffffff60681b1990911663ffffffff60781b1990921691909117600160301b90910463ffffffff16600160781b02178083556040519116815284907fdd4c86298dab371fdd224a7f2584fdc5b1a69ca4995422ebf051655609bc3ec09060200160405180910390a250612657565b600354815460405163f476962360e01b81526004810187905267ffffffffffffffff90911660248201525f916001600160a01b03169063f476962390604401602060405180830381865afa15801561252d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125519190613388565b90508061262a576003548254604051633e3cf5e760e11b815267ffffffffffffffff90911660048201526001600160a01b0390911690637c79ebce90602401602060405180830381865afa1580156125ab573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125cf919061349f565b1561262357815460ff60481b1916600160481b17825560405185907f4ecb450e70bc0e982eb52ddf0e0308fd4ff61efc2fc0d26d8169a6f860e244cc905f90a28461261981613444565b9550505050612645565b5050612657565b612635858383612bd6565b8461263f81613444565b95505050505b8061264f81613444565b9150506122f5565b505060155550565b6007545f9081908190612710906126809062010000900461ffff16866133f3565b61268a919061341e565b90508060115f82825461269d91906133e0565b909155506126ad905081856133b3565b91505f6126ba868461341e565b9050805f036126dc5760405163bb2875c360e01b815260040160405180910390fd5b6126e46119f4565b9350603c604b6127147f000000000000000000000000000000000000000000000000000000006a6042c6426133b3565b61271e9190613431565b106127315761272e6001856133e0565b93505b5f61273c87836133f3565b61274690856133b3565b90505f5b8861ffff168110156127aa575f5b601960ff821610156127a157600160ff82161b8b1663ffffffff16156127995761279561278583896133e0565b8261279086886133e0565b612f26565b5f92505b600101612758565b5060010161274a565b5050505094509492505050565b600180546001600160a01b0319169055610bed81613069565b6001600160a01b0381166127f75760405163d92e233d60e01b815260040160405180910390fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040519081527f673779832598d6a388768ee342f8de96fdd5c39a468a6955377cf1405b9652b9906020016116d8565b6001600160a01b03811661286c5760405163d92e233d60e01b815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383169081179091556040519081527f25f8ac8ea12efdf0a8596aee41cd1afab5814806e5226ec0af6af5a250c61c57906020016116d8565b8063ffffffff165f036128e05760405163e1df1b7960e01b815260040160405180910390fd5b6007805469ffffffff0000000000001916600160301b63ffffffff8416908102919091179091556040519081527ff3a76a5814fa8e2944bb6a2c7ab4651082756982a4a4d450b8aec3e1c424ed8a906020016116d8565b6101f461ffff8216111561295e5760405163bbf4268d60e01b815260040160405180910390fd5b6007805463ffff000019166201000061ffff8416908102919091179091556040519081527fe95a1621a25210d2b1a745f0ffe3b2f4b00463b2605f7b3fd955db1874fd3713906020016116d8565b6129ba6103e86127106133b3565b8161ffff1611156129de5760405163bbf4268d60e01b815260040160405180910390fd5b6007805465ffff00000000191664010000000061ffff8416908102919091179091556040519081527f96e159425c55ee543ca9a2e0616a2af4c33b546cc746e3d4f814f07e75d04745906020016116d8565b6007545f908190819061271090612a519062010000900461ffff16866133f3565b612a5b919061341e565b90508060115f828254612a6e91906133e0565b90915550612a7e905081856133b3565b9150612a886119f4565b9250612a95838684612f26565b509250929050565b670de0b6b3a7640000811115612ac657604051631de2976760e01b815260040160405180910390fd5b60068190556040518181527fe90a5cb1fc3a1975961e435a02bc90b01df7bdd3e37b0bedecacc3a82886b156906020016116d8565b5f5160206134bf5f395f51905f52546002036119f257604051633ee5aeb560e01b815260040160405180910390fd5b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316612b80578383151615612b74573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316612b80578383151615612b74573d5f823e3d81fd5b5f612be2601983613431565b5f85815260096020908152604080832060ff85168452909152812054919250819003612cd2575f846001015490508060125f828254612c2191906133e0565b9091555050845460ff8416600160501b810262ff00ff60401b1990921691909117600160401b178655604080519182525f602083018190529082015286907fd4e87eca2317678781825117ede38dc1ff6e2c7c4af5da0a86b6bf24d72acda89060600160405180910390a26040805160ff851681526020810183905287917f0d9a51744a5fa648fd58d24d7ad3a73b927cd16d0d6d11e7f6610c498f7e9da8910160405180910390a2505050505050565b5f818560010154612ce391906133b3565b85549091505f9061271090612d0390600160581b900461ffff16846133f3565b612d0d919061341e565b90505f612710612d1f6103e8846133f3565b612d29919061341e565b87549091505f9061271090612d4990600160681b900461ffff16856133f3565b612d53919061341e565b90508160105f828254612d6691906133e0565b925050819055508060125f828254612d7e91906133e0565b90915550819050612d8f83856133b3565b612d9991906133b3565b600f5f828254612da991906133e0565b909155505f9050612dba84866133b3565b6012549091508015801590612e2b5750895460408051602081018c9052808201919091526007606082015266129050d2d413d560ca1b6080820152600160781b90910463ffffffff169060a001604051602081830303815290604052805190602001205f1c612e299190613431565b155b15612e7e575f601255612e3e81836133e0565b60058b018290556040518281529092508b907f55fa18fe97d12ae9b4636e9c861c79895846e31ce4393c16f632ec3c542fa9d09060200160405180910390a25b612e8882886133e0565b60145f828254612e9891906133e0565b909155505060135460048b0155895460ff8916600160501b810262ff00ff60401b1990921691909117600160401b178b5560028b0188905560038b01839055604080519182526020820189905281018390528b907fd4e87eca2317678781825117ede38dc1ff6e2c7c4af5da0a86b6bf24d72acda89060600160405180910390a25050505050505050505050565b5f838152600b602090815260408083203384529091528120549003612f73575f838152600d602090815260408220805460018101825590835291200180546001600160a01b031916331790555b5f838152600a60209081526040808320338452825280832060ff8616845290915281208054839290612fa69084906133e0565b90915550505f83815260096020908152604080832060ff8616845290915281208054839290612fd69084906133e0565b90915550505f838152600b60209081526040808320338452909152812080548392906130039084906133e0565b90915550505f838152600e602090815260408083203384528252808320805463ffffffff19811663ffffffff918216600160ff8a1681901b9390931617179091558684526008909252822001805483929061305f9084906133e0565b9091555050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b803561ffff811681146130c9575f5ffd5b919050565b5f602082840312156130de575f5ffd5b6130e7826130b8565b9392505050565b5f602082840312156130fe575f5ffd5b5035919050565b6001600160a01b0381168114610bed575f5ffd5b5f60208284031215613129575f5ffd5b81356130e781613105565b5f5f60408385031215613145575f5ffd5b82359150602083013561315781613105565b809150509250929050565b5f5f83601f840112613172575f5ffd5b50813567ffffffffffffffff811115613189575f5ffd5b6020830191508360208260051b85010111156131a3575f5ffd5b9250929050565b5f5f602083850312156131bb575f5ffd5b823567ffffffffffffffff8111156131d1575f5ffd5b6131dd85828601613162565b90969095509350505050565b803563ffffffff811681146130c9575f5ffd5b5f5f5f6060848603121561320e575f5ffd5b613217846131e9565b9250613225602085016130b8565b929592945050506040919091013590565b5f60208284031215613246575f5ffd5b6130e7826131e9565b5f5f5f60408486031215613261575f5ffd5b833561326c81613105565b9250602084013567ffffffffffffffff811115613287575f5ffd5b61329386828701613162565b9497909650939450505050565b803560ff811681146130c9575f5ffd5b5f5f5f606084860312156132c2575f5ffd5b8335925060208401356132d481613105565b91506132e2604085016132a0565b90509250925092565b602080825282518282018190525f918401906040840190835b8181101561332b5783516001600160a01b0316835260209384019390920191600101613304565b509095945050505050565b5f5f60408385031215613347575f5ffd5b613350836132a0565b946020939093013593505050565b5f5f6040838503121561336f575f5ffd5b8235915061337f602084016132a0565b90509250929050565b5f60208284031215613398575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156133c6576133c661339f565b92915050565b634e487b7160e01b5f52603260045260245ffd5b808201808211156133c6576133c661339f565b80820281158282048414176133c6576133c661339f565b634e487b7160e01b5f52601260045260245ffd5b5f8261342c5761342c61340a565b500490565b5f8261343f5761343f61340a565b500690565b5f600182016134555761345561339f565b5060010190565b63ffffffff82811682821603908111156133c6576133c661339f565b5f60208284031215613488575f5ffd5b815167ffffffffffffffff811681146130e7575f5ffd5b5f602082840312156134af575f5ffd5b815180151581146130e7575f5ffdfe9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a26469706673582212201079dbd7f351870f188ae4896d809a087b0b7814cf1321dc93f2eb7ec535724f64736f6c634300081e0033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
Apple • Robinhood Token (AAPL) | AAPL | 0.025924 | $305.28 | $7.91 |
| DIH | 1 | $0.0000102 | $0 |
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x0c5589e1…b76b61 | Transfer | 17,422,025 | 24 days agoThu, 23 Jul 2026 16:13:16 UTC | 0xcaf7…5d11 | IN | 0x13e3…4d79 | $0.001 DIH | ||
| 0xf0954aa8…3f8e9d | Transfer | 16,148,882 | 25 days agoWed, 22 Jul 2026 04:46:24 UTC | 0x13e3…4d79 | OUT | 0xb0cd…0b68 | $0.460.001504 AAPL | Apple • Robinhood Token (AAPL) | |
| 0xb039c527…4f01df | Transfer | 16,135,238 | 25 days agoWed, 22 Jul 2026 04:23:36 UTC | 0x8366…0951 | IN | 0x13e3…4d79 | $0.900.002949 AAPL | Apple • Robinhood Token (AAPL) | |
| 0xb28837f6…2ce055 | Transfer | 16,134,824 | 25 days agoWed, 22 Jul 2026 04:22:55 UTC | 0x13e3…4d79 | OUT | 0xae72…30af | $0.210.000700 AAPL | Apple • Robinhood Token (AAPL) | |
| 0xcd62adcd…a43864 | Transfer | 16,134,801 | 25 days agoWed, 22 Jul 2026 04:22:52 UTC | 0x13e3…4d79 | OUT | 0x674c…dae5 | $18.120.059352 AAPL | Apple • Robinhood Token (AAPL) | |
| 0x32eb743c…76b6a4 | Transfer | 16,133,587 | 25 days agoWed, 22 Jul 2026 04:20:50 UTC | 0x8366…0951 | IN | 0x13e3…4d79 | $22.500.073687 AAPL | Apple • Robinhood Token (AAPL) | |
| 0x16bc907c…6e1c04 | Transfer | 16,130,851 | 25 days agoWed, 22 Jul 2026 04:16:16 UTC | 0x13e3…4d79 | OUT | 0x0000…dead | 20,541.619855 TT | TestToken (TT) | |
| 0x16bc907c…6e1c04 | Transfer | 16,130,851 | 25 days agoWed, 22 Jul 2026 04:16:16 UTC | 0x7156…d8b0 | IN | 0x13e3…4d79 | 20,541.619855 TT | TestToken (TT) | |
| 0x16bc907c…6e1c04 | Transfer | 16,130,851 | 25 days agoWed, 22 Jul 2026 04:16:16 UTC | 0x13e3…4d79 | OUT | 0x2b58…baa5 | $0.860.002804 AAPL | Apple • Robinhood Token (AAPL) | |
| 0x5b3bc877…324ec5 | Transfer | 16,130,827 | 25 days agoWed, 22 Jul 2026 04:16:14 UTC | 0x13e3…4d79 | OUT | 0xae72…30af | $0.210.000701 AAPL | Apple • Robinhood Token (AAPL) | |
| 0x8d6aa4e3…6a390b | Transfer | 16,130,393 | 25 days agoWed, 22 Jul 2026 04:15:30 UTC | 0x13e3…4d79 | OUT | 0x674c…dae5 | $18.140.059418 AAPL | Apple • Robinhood Token (AAPL) | |
| 0xb38503bf…47251c | Transfer | 16,128,526 | 25 days agoWed, 22 Jul 2026 04:12:24 UTC | 0x8366…0951 | IN | 0x13e3…4d79 | $22.520.073769 AAPL | Apple • Robinhood Token (AAPL) |
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0xf0954a…3f8e9d | 25 days agoWed, 22 Jul 2026 04:46:24 UTC | 0x276821…ee6a | [0] 0x000000000000…56e00b68 data: 0x000000000000000000…30734a18 |
| 0x8306b8…076e78 | 25 days agoWed, 22 Jul 2026 04:45:34 UTC | 0x4ecb45…44cc | [0] 0x000000000000…0000001b |
| 0x9bfcb3…126b57 | 25 days agoWed, 22 Jul 2026 04:44:18 UTC | 0x4ecb45…44cc | [0] 0x000000000000…0000001a |
| 0xb57761…14dff3 | 25 days agoWed, 22 Jul 2026 04:43:02 UTC | 0x4ecb45…44cc | [0] 0x000000000000…00000019 |
| 0x73d2db…7e2914 | 25 days agoWed, 22 Jul 2026 04:41:47 UTC | 0x4ecb45…44cc | [0] 0x000000000000…00000018 |
| 0xb57efd…9ae5d2 | 25 days agoWed, 22 Jul 2026 04:40:33 UTC | 0x4ecb45…44cc | [0] 0x000000000000…00000017 |
| 0x4002dd…6aa457 | 25 days agoWed, 22 Jul 2026 04:39:18 UTC | 0x4ecb45…44cc | [0] 0x000000000000…00000016 |
| 0xae2398…4378e1 | 25 days agoWed, 22 Jul 2026 04:38:02 UTC | 0x4ecb45…44cc | [0] 0x000000000000…00000015 |
| 0xe63689…1da8eb | 25 days agoWed, 22 Jul 2026 04:36:50 UTC | 0x4ecb45…44cc | [0] 0x000000000000…00000014 |
| 0x847afd…c8a819 | 25 days agoWed, 22 Jul 2026 04:35:34 UTC | 0x4ecb45…44cc | [0] 0x000000000000…00000013 |
| 0xfd87b6…38e883 | 25 days agoWed, 22 Jul 2026 04:34:19 UTC | 0x4ecb45…44cc | [0] 0x000000000000…00000012 |
| 0xb1cd2c…9e0213 | 25 days agoWed, 22 Jul 2026 04:33:03 UTC | 0x4ecb45…44cc | [0] 0x000000000000…00000011 |
| 0x7f92d4…c60033 | 25 days agoWed, 22 Jul 2026 04:31:47 UTC | 0x4ecb45…44cc | [0] 0x000000000000…00000010 |
| 0xaf4666…ddd884 | 25 days agoWed, 22 Jul 2026 04:30:34 UTC | 0x4ecb45…44cc | [0] 0x000000000000…0000000f |
| 0x181d27…5d8cc2 | 25 days agoWed, 22 Jul 2026 04:29:18 UTC | 0x4ecb45…44cc | [0] 0x000000000000…0000000e |
| 0xde21f8…dd22fc | 25 days agoWed, 22 Jul 2026 04:28:03 UTC | 0x4ecb45…44cc | [0] 0x000000000000…0000000d |
| 0x1e1b6c…412f8c | 25 days agoWed, 22 Jul 2026 04:26:47 UTC | 0x4ecb45…44cc | [0] 0x000000000000…0000000c |
| 0xc354b2…db7214 | 25 days agoWed, 22 Jul 2026 04:25:34 UTC | 0x4ecb45…44cc | [0] 0x000000000000…0000000b |
| 0xce58f5…742299 | 25 days agoWed, 22 Jul 2026 04:24:22 UTC | 0x0d9a51…9da8 | [0] 0x000000000000…0000000a data: 0x000000000000000000…3ddedeae |
| 0xce58f5…742299 | 25 days agoWed, 22 Jul 2026 04:24:22 UTC | 0xd4e87e…cda8 | [0] 0x000000000000…0000000a data: 0x000000000000000000…00000000 |
| 0x9ff6b2…98050d | 25 days agoWed, 22 Jul 2026 04:24:17 UTC | 0xdd4c86…3ec0 | [0] 0x000000000000…0000000a data: 0x000000000000000000…00f635fb |
| 0xb039c5…4f01df | 25 days agoWed, 22 Jul 2026 04:23:36 UTC | 0x65be9a…d23f | [0] 0x000000000000…205ddae5 [1] 0x000000000000…0000000a data: 0x000000000000000000…3ddedeae |
| 0x577160…720afd | 25 days agoWed, 22 Jul 2026 04:23:04 UTC | 0x4ecb45…44cc | [0] 0x000000000000…00000009 |
| 0xb28837…2ce055 | 25 days agoWed, 22 Jul 2026 04:22:55 UTC | 0x233a88…eb48 | data: 0x000000000000000000…42324efc |
| 0xcd62ad…a43864 | 25 days agoWed, 22 Jul 2026 04:22:52 UTC | 0x987d62…2f9a | [0] 0x000000000000…205ddae5 data: 0x000000000000000000…da0467c6 |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 16,135,238 | 25 days agoWed, 22 Jul 2026 04:23:36 UTC | 0xb039c5…4f01df | CALL | plant | 0x13e3…4d79 | OUT | 0x2b58…baa5 | 0.0005 ETH |
| 16,133,587 | 25 days agoWed, 22 Jul 2026 04:20:50 UTC | 0x32eb74…76b6a4 | CALL | plantMany | 0x13e3…4d79 | OUT | 0x2b58…baa5 | 0.0125 ETH |
| 16,128,526 | 25 days agoWed, 22 Jul 2026 04:12:24 UTC | 0xb38503…47251c | CALL | plantMany | 0x13e3…4d79 | OUT | 0x2b58…baa5 | 0.0125 ETH |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xf0954a…3f8e9d | collectAdmin | 16,148,882 | 25 days agoWed, 22 Jul 2026 04:46:24 UTC | 0xb0cd…0b68 | IN | Orchard | $0.000 ETH | 0.00000658 | |
| 0x8306b8…076e78 | crank | 16,148,364 | 25 days agoWed, 22 Jul 2026 04:45:34 UTC | 0xb0cd…0b68 | IN | Orchard | $0.000 ETH | 0.00000405 | |
| 0x9bfcb3…126b57 | crank | 16,147,612 | 25 days agoWed, 22 Jul 2026 04:44:18 UTC | 0xb0cd…0b68 | IN | Orchard | $0.000 ETH | 0.00000397 | |
| 0xb57761…14dff3 | crank | 16,146,860 | 25 days agoWed, 22 Jul 2026 04:43:02 UTC | 0xb0cd…0b68 | IN | Orchard | $0.000 ETH | 0.00000407 | |
| 0x73d2db…7e2914 | crank | 16,146,108 | 25 days agoWed, 22 Jul 2026 04:41:47 UTC | 0xb0cd…0b68 | IN | Orchard | $0.000 ETH | 0.00000397 | |
| 0xb57efd…9ae5d2 | crank | 16,145,380 | 25 days agoWed, 22 Jul 2026 04:40:33 UTC | 0xb0cd…0b68 | IN | Orchard | $0.000 ETH | 0.00000398 | |
| 0x4002dd…6aa457 | crank | 16,144,626 | 25 days agoWed, 22 Jul 2026 04:39:18 UTC | 0xb0cd…0b68 | IN | Orchard | $0.000 ETH | 0.00000397 | |
| 0xae2398…4378e1 | crank | 16,143,862 | 25 days agoWed, 22 Jul 2026 04:38:02 UTC | 0xb0cd…0b68 | IN | Orchard | $0.000 ETH | 0.00000398 | |
| 0xe63689…1da8eb | crank | 16,143,143 | 25 days agoWed, 22 Jul 2026 04:36:50 UTC | 0xb0cd…0b68 | IN | Orchard | $0.000 ETH | 0.00000397 | |
| 0x847afd…c8a819 | crank | 16,142,392 | 25 days agoWed, 22 Jul 2026 04:35:34 UTC | 0xb0cd…0b68 | IN | Orchard | $0.000 ETH | 0.00000398 | |
| 0xfd87b6…38e883 | crank | 16,141,641 | 25 days agoWed, 22 Jul 2026 04:34:19 UTC | 0xb0cd…0b68 | IN | Orchard | $0.000 ETH | 0.00000397 | |
| 0xb1cd2c…9e0213 | crank | 16,140,887 | 25 days agoWed, 22 Jul 2026 04:33:03 UTC | 0xb0cd…0b68 | IN | Orchard | $0.000 ETH | 0.00000397 | |
| 0x7f92d4…c60033 | crank | 16,140,123 | 25 days agoWed, 22 Jul 2026 04:31:47 UTC | 0xb0cd…0b68 | IN | Orchard | $0.000 ETH | 0.00000399 | |
| 0xaf4666…ddd884 | crank | 16,139,400 | 25 days agoWed, 22 Jul 2026 04:30:34 UTC | 0xb0cd…0b68 | IN | Orchard | $0.000 ETH | 0.00000398 | |
| 0x181d27…5d8cc2 | crank | 16,138,649 | 25 days agoWed, 22 Jul 2026 04:29:18 UTC | 0xb0cd…0b68 | IN | Orchard | $0.000 ETH | 0.00000398 | |
| 0xde21f8…dd22fc | crank | 16,137,898 | 25 days agoWed, 22 Jul 2026 04:28:03 UTC | 0xb0cd…0b68 | IN | Orchard | $0.000 ETH | 0.00000397 | |
| 0x1e1b6c…412f8c | crank | 16,137,147 | 25 days agoWed, 22 Jul 2026 04:26:47 UTC | 0xb0cd…0b68 | IN | Orchard | $0.000 ETH | 0.00000398 | |
| 0xc354b2…db7214 | crank | 16,136,413 | 25 days agoWed, 22 Jul 2026 04:25:34 UTC | 0xb0cd…0b68 | IN | Orchard | $0.000 ETH | 0.00000404 | |
| 0xce58f5…742299 | crank | 16,135,691 | 25 days agoWed, 22 Jul 2026 04:24:22 UTC | 0xb0cd…0b68 | IN | Orchard | $0.000 ETH | 0.00000447 | |
| 0x9ff6b2…98050d | crank | 16,135,645 | 25 days agoWed, 22 Jul 2026 04:24:17 UTC | 0xb0cd…0b68 | IN | Orchard | $0.000 ETH | 0.00000449 | |
| 0xb039c5…4f01df | plant | 16,135,238 | 25 days agoWed, 22 Jul 2026 04:23:36 UTC | 0x674c…dae5 | IN | Orchard | $0.940.0005 ETH | 0.00003267 | |
| 0x577160…720afd | crank | 16,134,921 | 25 days agoWed, 22 Jul 2026 04:23:04 UTC | 0xb0cd…0b68 | IN | Orchard | $0.000 ETH | 0.00000400 | |
| 0xb28837…2ce055 | flushStaking | 16,134,824 | 25 days agoWed, 22 Jul 2026 04:22:55 UTC | 0xb0cd…0b68 | IN | Orchard | $0.000 ETH | 0.00000973 | |
| 0xcd62ad…a43864 | claim | 16,134,801 | 25 days agoWed, 22 Jul 2026 04:22:52 UTC | 0x674c…dae5 | IN | Orchard | $0.000 ETH | 0.00000837 | |
| 0x171ffc…3635f9 | crank | 16,134,199 | 25 days agoWed, 22 Jul 2026 04:21:52 UTC | 0xb0cd…0b68 | IN | Orchard | $0.000 ETH | 0.00001315 |