// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
/* STAGWIFHOOD staking (Robinhood Chain) — v4
*
* Model:
* • Stake approved Robinhood-Chain tokens AND/OR Hooded 20 NFTs.
* • ETH rewards (real yield), funded by 90% of NFT mint sales (via RevenueSplitter →
* this contract) + early-unstake penalties + owner top-ups. Synthetix accounting so
* payouts can never exceed funding.
* • LOCK TIERS: pick 30 / 60 / 90 days when you stake. Longer lock = bigger reward
* multiplier (default 1× / 1.5× / 2×, owner-tunable).
* • HOLDING MULTIPLIER: your STAKED $STAG amount amplifies rewards — default
* ≥1M → 2×, ≥10M → 3× (owner-tunable thresholds/mults). Staked (not wallet) so it
* can't be flash-borrowed. Stacks MULTIPLICATIVELY with the lock tier.
* weight = Σ(amount×tokenWeight) × lockMult × holdMult × nftMult
* • WITHDRAW SPLIT: name up to 3 wallets with a bps share each; when you UNSTAKE, your withdrawn
* $STAG principal is split to them (remainder back to you). ETH rewards on claim go to the staker.
* Change anytime — only the original staking wallet can.
* • NFT staking is LOCK-IN-PLACE (NFT never leaves the wallet; we call lock()/unlock()).
* • Early unstake (before the lock): tokens → 15% penalty + forfeit rewards; NFTs →
* forfeit rewards (no penalty, keep the NFT).
*
* ⚠️ Holds real funds — get a security review before mainnet.
*/
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
interface IHoodLockable {
function ownerOf(uint256 tokenId) external view returns (address);
function lock(uint256 tokenId) external;
function unlock(uint256 tokenId) external;
}
contract StagStaking is Ownable, ReentrancyGuard {
using SafeERC20 for IERC20;
IHoodLockable public immutable hood; // Hooded 20 NFT (0 to disable NFT staking)
address public immutable stag; // $STAG — drives the holding multiplier
uint256 public constant BASE = 1e18;
// approved staking tokens → weight bps (10000 = 1×). 0 = not stakeable.
mapping(address => uint256) public tokenWeightBps;
mapping(address => bool) public everStakeable;
mapping(address => mapping(address => uint256)) public stakedOf; // user => token => amount
mapping(address => mapping(address => uint256)) private _weighted; // user => token => amount×weight/1e4
// ---- ETH reward distribution (Synthetix) ----
uint256 public rewardRate;
uint256 public periodFinish;
uint256 public lastUpdateTime;
uint256 public rewardPerWeightStored;
uint256 public totalWeight;
uint256 public reserved;
// ---- lock tiers (30/60/90) ----
uint256[3] public tierDuration = [uint256(30 days), 60 days, 90 days];
uint256[3] public tierMultBps = [uint256(10000), 15000, 20000]; // 1× / 1.5× / 2×
// ---- holding multiplier (by staked $STAG), ascending thresholds ----
uint256[] public holdThreshold = [uint256(0), 1_000_000 ether, 10_000_000 ether];
uint256[] public holdMultBps = [uint256(10000), 20000, 30000]; // 1× / 2× / 3×
// ---- policy ----
uint256 public earlyPenaltyBps = 1500; // 15% on early token unstake
uint256 public defaultNftBoostBps = 1000; // +10% per NFT unless set per-id
address public penaltyRecipient;
address public operator;
mapping(uint256 => uint256) public nftBoostBps;
mapping(uint256 => address) public nftStaker;
mapping(uint256 => uint256) public appliedBoost;
uint256 public nftBaseWeight = 10_000 ether; // base weight each staked NFT adds (owner-tuned tokenomics knob; keep modest vs token weights to avoid cheap pool dominance)
mapping(uint256 => uint256) public appliedBaseWeight; // snapshot of base weight added per staked NFT
struct UserInfo {
uint256 baseWeight; // Σ amount×tokenWeight/1e4
uint256 mult; // NFT multiplier: BASE + boosts
uint256 weight; // effective (base × lock × hold × nft)
uint256 stakedAt; // reset on any stake (lock timer)
uint8 lockTier; // 0/1/2 → 30/60/90 days
uint256 rewardPerWeightPaid;
uint256 rewards;
uint256[] nfts;
address[] splitTo; // up to 3 wallets that receive the STAKED TOKENS on unstake
uint256[] splitBps; // their shares (bps); remainder goes back to the staking wallet
}
mapping(address => UserInfo) private _u;
event StakedTokens(address indexed user, address indexed token, uint256 amount, uint8 tier);
event UnstakedTokens(address indexed user, address indexed token, uint256 amount, uint256 penalty, bool early);
event StakedNFT(address indexed user, uint256 tokenId);
event UnstakedNFT(address indexed user, uint256 tokenId, bool early);
event Claimed(address indexed user, uint256 ethAmount);
event WithdrawSplitSet(address indexed user, address[] wallets, uint256[] bps);
event RewardAdded(uint256 amount, uint256 duration);
event PoolDonation(address indexed from, uint256 amount);
event EthSwept(address indexed to, uint256 amount);
event NftUnlockFailed(uint256 indexed tokenId, address indexed staker); // unlock() reverted (locker migrated) — recover via retryUnlock or hood.adminUnlock
event ConfigChanged(bytes32 indexed what);
mapping(uint256 => bool) public pendingUnlock; // tokenId => unlock() failed and is owed
constructor(address _stag, address _hood) Ownable(msg.sender) {
hood = IHoodLockable(_hood);
stag = _stag;
penaltyRecipient = msg.sender;
if (_stag != address(0)) { tokenWeightBps[_stag] = 20000; everStakeable[_stag] = true; } // $STAG token weight 2×
}
/* ---------------- reward math ---------------- */
function lastTimeApplicable() public view returns (uint256) {
return block.timestamp < periodFinish ? block.timestamp : periodFinish;
}
function rewardPerWeight() public view returns (uint256) {
if (totalWeight == 0) return rewardPerWeightStored;
return rewardPerWeightStored + ((lastTimeApplicable() - lastUpdateTime) * rewardRate * BASE) / totalWeight;
}
function earned(address a) public view returns (uint256) {
UserInfo storage u = _u[a];
return (u.weight * (rewardPerWeight() - u.rewardPerWeightPaid)) / BASE + u.rewards;
}
modifier update(address a) {
uint256 rpw = rewardPerWeight();
reserved += ((rpw - rewardPerWeightStored) * totalWeight) / BASE;
rewardPerWeightStored = rpw;
lastUpdateTime = lastTimeApplicable();
if (a != address(0)) {
_u[a].rewards = earned(a);
_u[a].rewardPerWeightPaid = rewardPerWeightStored;
}
_;
}
// effective weight = base × lockMult × holdMult × nftMult
function holdMultBpsOf(address a) public view returns (uint256 m) {
uint256 staked = stag == address(0) ? 0 : stakedOf[a][stag];
m = 10000;
uint256 n = holdThreshold.length;
for (uint256 i = 0; i < n; i++) { if (staked >= holdThreshold[i]) m = holdMultBps[i]; }
}
function _effectiveWeight(address a) internal view returns (uint256) {
UserInfo storage u = _u[a];
uint256 w = u.baseWeight;
if (w == 0) return 0;
w = (w * tierMultBps[u.lockTier]) / 10000;
w = (w * holdMultBpsOf(a)) / 10000;
w = (w * (u.mult == 0 ? BASE : u.mult)) / BASE;
return w;
}
function _resync(address a) internal {
UserInfo storage u = _u[a];
uint256 newW = _effectiveWeight(a);
totalWeight = totalWeight - u.weight + newW;
u.weight = newW;
}
/* ---------------- token staking ---------------- */
function stakeTokens(address token, uint256 amount, uint8 tier) external nonReentrant update(msg.sender) {
require(tier < 3, "bad tier");
uint256 w = tokenWeightBps[token];
require(w > 0, "token not approved");
require(amount > 0, "amount=0");
uint256 pre = IERC20(token).balanceOf(address(this));
IERC20(token).safeTransferFrom(msg.sender, address(this), amount);
uint256 received = IERC20(token).balanceOf(address(this)) - pre;
require(received > 0, "no tokens received");
UserInfo storage u = _u[msg.sender];
// adding to an active position may raise the lock tier but never lower it (no multiplier downgrade)
if (u.baseWeight > 0) require(tier >= u.lockTier, "cannot lower lock tier");
if (u.mult == 0) u.mult = BASE;
uint256 add = (received * w) / 10000;
stakedOf[msg.sender][token] += received;
_weighted[msg.sender][token] += add;
u.baseWeight += add;
u.lockTier = tier; // adding to a stake (re)commits to this tier…
u.stakedAt = block.timestamp; // …and restarts the lock timer (claim before topping up)
_resync(msg.sender);
emit StakedTokens(msg.sender, token, received, tier);
}
function unstakeTokens(address token, uint256 amount) public nonReentrant update(msg.sender) {
uint256 have = stakedOf[msg.sender][token];
require(amount > 0 && have >= amount, "bad amount");
UserInfo storage u = _u[msg.sender];
bool early = block.timestamp < u.stakedAt + tierDuration[u.lockTier];
uint256 baseBefore = u.baseWeight;
uint256 wRemoved = (_weighted[msg.sender][token] * amount) / have;
_weighted[msg.sender][token] -= wRemoved;
u.baseWeight -= wRemoved;
stakedOf[msg.sender][token] = have - amount;
_resync(msg.sender);
uint256 penalty;
if (early) {
penalty = (amount * earlyPenaltyBps) / 10000;
// forfeit rewards PROPORTIONAL to the base weight withdrawn (not the whole position)
uint256 f = baseBefore > 0 ? (u.rewards * wRemoved) / baseBefore : u.rewards;
u.rewards -= f;
reserved = reserved >= f ? reserved - f : 0;
if (penalty > 0) IERC20(token).safeTransfer(penaltyRecipient, penalty);
}
// withdrawn tokens go to the staker's chosen split wallets (up to 3), remainder to the staker
_distributeWithdrawal(token, u, amount - penalty);
emit UnstakedTokens(msg.sender, token, amount, penalty, early);
}
/* ---------------- NFT staking (lock-in-place) ---------------- */
function stakeNFT(uint256 tokenId) external nonReentrant update(msg.sender) {
require(address(hood) != address(0), "nft disabled");
require(hood.ownerOf(tokenId) == msg.sender, "not owner");
require(nftStaker[tokenId] == address(0), "already staked");
UserInfo storage u = _u[msg.sender];
if (u.mult == 0) u.mult = BASE;
uint256 boostBps = nftBoostBps[tokenId] == 0 ? defaultNftBoostBps : nftBoostBps[tokenId];
uint256 boost = (boostBps * BASE) / 10000;
u.mult += boost;
appliedBoost[tokenId] = boost;
// NFTs also add BASE weight so NFT-only staking actually earns (not just a multiplier on 0)
u.baseWeight += nftBaseWeight;
appliedBaseWeight[tokenId] = nftBaseWeight;
u.nfts.push(tokenId);
nftStaker[tokenId] = msg.sender;
u.stakedAt = block.timestamp;
_resync(msg.sender);
hood.lock(tokenId);
emit StakedNFT(msg.sender, tokenId);
}
function unstakeNFT(uint256 tokenId) external nonReentrant update(msg.sender) {
require(nftStaker[tokenId] == msg.sender, "not your stake");
UserInfo storage u = _u[msg.sender];
bool early = block.timestamp < u.stakedAt + tierDuration[u.lockTier];
uint256 n = u.nfts.length;
uint256 idx = type(uint256).max;
for (uint256 i; i < n; i++) { if (u.nfts[i] == tokenId) { idx = i; break; } }
require(idx != type(uint256).max, "not staked");
u.nfts[idx] = u.nfts[n - 1];
u.nfts.pop();
delete nftStaker[tokenId];
uint256 boost = appliedBoost[tokenId];
delete appliedBoost[tokenId];
u.mult = u.mult > boost ? u.mult - boost : BASE;
uint256 baseBefore = u.baseWeight;
uint256 bw = appliedBaseWeight[tokenId];
delete appliedBaseWeight[tokenId];
u.baseWeight = u.baseWeight > bw ? u.baseWeight - bw : 0;
if (early) { // forfeit rewards proportional to the base weight this NFT contributed
uint256 f = baseBefore > 0 ? (u.rewards * bw) / baseBefore : u.rewards;
u.rewards -= f;
reserved = reserved >= f ? reserved - f : 0;
}
_resync(msg.sender);
// Don't let a migrated/broken locker brick unstaking; but DON'T fail silently — flag it.
try hood.unlock(tokenId) {} catch { pendingUnlock[tokenId] = true; emit NftUnlockFailed(tokenId, msg.sender); }
emit UnstakedNFT(msg.sender, tokenId, early);
}
/* ---------------- withdraw split (up to 3 destination wallets for the STAKED TOKENS) ---------------- */
// Name up to 3 wallets + a share (bps) each; when you unstake, your withdrawn $STAG is split to
// them (remainder back to you). Change anytime — only the original staking wallet can.
function setWithdrawSplit(address[] calldata wallets, uint256[] calldata bps) external {
require(wallets.length == bps.length && wallets.length <= 3, "bad len");
uint256 sum;
for (uint256 i; i < wallets.length; i++) {
require(wallets[i] != address(0) && wallets[i] != address(this), "bad wallet"); // no self-strand
sum += bps[i];
}
require(sum <= 10000, "bps > 100%");
UserInfo storage u = _u[msg.sender];
u.splitTo = wallets;
u.splitBps = bps;
emit WithdrawSplitSet(msg.sender, wallets, bps);
}
// Split `net` withdrawn tokens across the staker's chosen wallets (best-effort so a bad
// destination can't brick unstaking); anything unsent goes back to the staker.
function _distributeWithdrawal(address token, UserInfo storage u, uint256 net) internal {
uint256 paidOut;
uint256 n = u.splitTo.length;
for (uint256 i; i < n; i++) {
uint256 part = (net * u.splitBps[i]) / 10000;
if (part > 0) {
try IERC20(token).transfer(u.splitTo[i], part) returns (bool ok) { if (ok) paidOut += part; } catch {}
}
}
if (net > paidOut) IERC20(token).safeTransfer(msg.sender, net - paidOut);
}
function claim() public nonReentrant update(msg.sender) {
UserInfo storage u = _u[msg.sender];
require(block.timestamp >= u.stakedAt + tierDuration[u.lockTier], "locked");
uint256 r = u.rewards;
if (r == 0) return;
u.rewards = 0;
reserved = reserved >= r ? reserved - r : 0;
_sendEth(msg.sender, r); // ETH rewards go to the staker; the up-to-3 split is on the TOKENS at unstake
emit Claimed(msg.sender, r);
}
function _sendEth(address to, uint256 v) internal {
(bool ok, ) = payable(to).call{value: v}("");
require(ok, "eth send failed");
}
// Permissionless: settle + resync a batch of stakers so owner config changes (multipliers,
// weights, nftBaseWeight) apply to EXISTING positions immediately and fairly — not only on
// each user's next action. Caller pays the gas; it can only move weights to the current config.
function poke(address[] calldata users) external update(address(0)) {
for (uint256 i; i < users.length; i++) {
address u_ = users[i];
_u[u_].rewards = earned(u_);
_u[u_].rewardPerWeightPaid = rewardPerWeightStored;
_resync(u_);
}
}
// Re-attempt a previously-failed NFT unlock (e.g. after the locker is restored). No-op-safe.
function retryUnlock(uint256 tokenId) external {
require(pendingUnlock[tokenId], "no pending");
hood.unlock(tokenId); // reverts (no state change) if this is still not the locker
pendingUnlock[tokenId] = false;
}
/* ---------------- funding / owner ---------------- */
receive() external payable {}
/// @notice Anyone can top up the reward pool with ETH. Funds sit in the pool until the
/// owner streams them via `notifyRewardAmount`. Named + evented so wallets/explorers show
/// a clear "Donate" action (scanner-legible, single recipient = this pool).
function donate() external payable {
require(msg.value > 0, "no value");
emit PoolDonation(msg.sender, msg.value);
}
function notifyRewardAmount(uint256 amount, uint256 duration) external onlyOwner update(address(0)) {
require(duration > 0, "duration=0");
if (block.timestamp >= periodFinish) rewardRate = amount / duration;
else rewardRate = (amount + (periodFinish - block.timestamp) * rewardRate) / duration;
require(rewardRate > 0, "rate=0");
uint256 avail = address(this).balance > reserved ? address(this).balance - reserved : 0;
require(rewardRate * duration <= avail, "insufficient ETH funded");
lastUpdateTime = block.timestamp;
periodFinish = block.timestamp + duration;
emit RewardAdded(amount, duration);
}
function setOperator(address o) external onlyOwner { operator = o; }
function setTokenWeight(address token, uint256 weightBps) external {
require(weightBps <= 50000, "max 5x");
if (!everStakeable[token]) require(msg.sender == owner(), "new token: owner only");
else require(msg.sender == owner() || (operator != address(0) && msg.sender == operator), "not manager");
tokenWeightBps[token] = weightBps;
if (weightBps > 0) everStakeable[token] = true;
}
function setTierDuration(uint8 tier, uint256 secs) external onlyOwner { require(tier < 3 && secs >= 1 hours && secs <= 365 days, "bad"); tierDuration[tier] = secs; emit ConfigChanged("tierDuration"); }
function setTierMultBps(uint8 tier, uint256 bps) external onlyOwner { require(tier < 3 && bps >= 10000 && bps <= 100000, "bad"); tierMultBps[tier] = bps; }
function setNftBaseWeight(uint256 v) external onlyOwner { nftBaseWeight = v; }
function setHoldingTiers(uint256[] calldata thresholds, uint256[] calldata mults) external onlyOwner {
require(thresholds.length == mults.length && thresholds.length > 0 && thresholds.length <= 10, "len");
for (uint256 i; i < mults.length; i++) {
require(mults[i] >= 10000 && mults[i] <= 100000, "mult");
if (i > 0) require(thresholds[i] > thresholds[i - 1], "ascending");
}
holdThreshold = thresholds;
holdMultBps = mults;
}
function setEarlyPenaltyBps(uint256 bps) external onlyOwner { require(bps <= 3000, "max 30%"); earlyPenaltyBps = bps; }
function setDefaultNftBoostBps(uint256 bps) external onlyOwner { require(bps <= 5000, "max 50%"); defaultNftBoostBps = bps; }
function setNftBoostBps(uint256 tokenId, uint256 bps) external onlyOwner { require(bps <= 5000, "max 50%"); nftBoostBps[tokenId] = bps; }
function setPenaltyRecipient(address to) external onlyOwner { require(to != address(0), "zero"); penaltyRecipient = to; }
function rescueToken(address token, address to, uint256 amount) external onlyOwner {
require(!everStakeable[token], "staking token");
IERC20(token).safeTransfer(to, amount);
}
// Sweep only ETH NOT owed to stakers. `update(address(0))` first settles accrual into `reserved`,
// and we ALSO subtract the still-streaming scheduled emissions of the active period. So a sweep
// can never unfund already-accrued rewards OR the committed remainder of a live reward schedule.
function sweepEth(address to, uint256 amount) external onlyOwner update(address(0)) {
uint256 outstanding = block.timestamp < periodFinish ? rewardRate * (periodFinish - block.timestamp) : 0;
uint256 locked = reserved + outstanding;
uint256 free = address(this).balance > locked ? address(this).balance - locked : 0;
require(amount <= free, "exceeds free ETH");
(bool ok, ) = payable(to).call{value: amount}(""); require(ok, "eth send failed");
emit EthSwept(to, amount);
}
/* ---------------- views ---------------- */
function userInfo(address a) external view returns (
uint256 baseWeight, uint256 lockMultBps_, uint256 holdMult, uint256 weight,
uint256 stakedAt, uint8 lockTier, uint256 unlockAt, uint256 pendingEth, uint256[] memory nfts, bool locked
) {
UserInfo storage u = _u[a];
uint256 unlock = u.stakedAt + tierDuration[u.lockTier];
return (u.baseWeight, tierMultBps[u.lockTier], holdMultBpsOf(a), u.weight,
u.stakedAt, u.lockTier, unlock, earned(a), u.nfts, block.timestamp < unlock);
}
function withdrawSplitOf(address a) external view returns (address[] memory, uint256[] memory) {
return (_u[a].splitTo, _u[a].splitBps);
}
function tierInfo() external view returns (uint256[3] memory durations, uint256[3] memory mults) {
return (tierDuration, tierMultBps);
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "_stag",
"type": "address",
"internalType": "address"
},
{
"name": "_hood",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"name": "AddressEmptyCode",
"type": "error",
"inputs": [
{
"name": "target",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "AddressInsufficientBalance",
"type": "error",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "FailedInnerCall",
"type": "error",
"inputs": []
},
{
"name": "OwnableInvalidOwner",
"type": "error",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "OwnableUnauthorizedAccount",
"type": "error",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ReentrancyGuardReentrantCall",
"type": "error",
"inputs": []
},
{
"name": "SafeERC20FailedOperation",
"type": "error",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "Claimed",
"type": "event",
"inputs": [
{
"name": "user",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "ethAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "ConfigChanged",
"type": "event",
"inputs": [
{
"name": "what",
"type": "bytes32",
"indexed": true,
"internalType": "bytes32"
}
],
"anonymous": false
},
{
"name": "EthSwept",
"type": "event",
"inputs": [
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "NftUnlockFailed",
"type": "event",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "staker",
"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": "PoolDonation",
"type": "event",
"inputs": [
{
"name": "from",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "RewardAdded",
"type": "event",
"inputs": [
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "duration",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "StakedNFT",
"type": "event",
"inputs": [
{
"name": "user",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "StakedTokens",
"type": "event",
"inputs": [
{
"name": "user",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "tier",
"type": "uint8",
"indexed": false,
"internalType": "uint8"
}
],
"anonymous": false
},
{
"name": "UnstakedNFT",
"type": "event",
"inputs": [
{
"name": "user",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "tokenId",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "early",
"type": "bool",
"indexed": false,
"internalType": "bool"
}
],
"anonymous": false
},
{
"name": "UnstakedTokens",
"type": "event",
"inputs": [
{
"name": "user",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "penalty",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "early",
"type": "bool",
"indexed": false,
"internalType": "bool"
}
],
"anonymous": false
},
{
"name": "WithdrawSplitSet",
"type": "event",
"inputs": [
{
"name": "user",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "wallets",
"type": "address[]",
"indexed": false,
"internalType": "address[]"
},
{
"name": "bps",
"type": "uint256[]",
"indexed": false,
"internalType": "uint256[]"
}
],
"anonymous": false
},
{
"name": "BASE",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "appliedBaseWeight",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "appliedBoost",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "claim",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "defaultNftBoostBps",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "donate",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "earlyPenaltyBps",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "earned",
"type": "function",
"inputs": [
{
"name": "a",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "everStakeable",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "holdMultBps",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "holdMultBpsOf",
"type": "function",
"inputs": [
{
"name": "a",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "m",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "holdThreshold",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "hood",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IHoodLockable"
}
],
"stateMutability": "view"
},
{
"name": "lastTimeApplicable",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "lastUpdateTime",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "nftBaseWeight",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "nftBoostBps",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "nftStaker",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "notifyRewardAmount",
"type": "function",
"inputs": [
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "duration",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "operator",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "owner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "penaltyRecipient",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "pendingUnlock",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "periodFinish",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "poke",
"type": "function",
"inputs": [
{
"name": "users",
"type": "address[]",
"internalType": "address[]"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "renounceOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "rescueToken",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "reserved",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "retryUnlock",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "rewardPerWeight",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "rewardPerWeightStored",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "rewardRate",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "setDefaultNftBoostBps",
"type": "function",
"inputs": [
{
"name": "bps",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setEarlyPenaltyBps",
"type": "function",
"inputs": [
{
"name": "bps",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setHoldingTiers",
"type": "function",
"inputs": [
{
"name": "thresholds",
"type": "uint256[]",
"internalType": "uint256[]"
},
{
"name": "mults",
"type": "uint256[]",
"internalType": "uint256[]"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setNftBaseWeight",
"type": "function",
"inputs": [
{
"name": "v",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setNftBoostBps",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "bps",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setOperator",
"type": "function",
"inputs": [
{
"name": "o",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setPenaltyRecipient",
"type": "function",
"inputs": [
{
"name": "to",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setTierDuration",
"type": "function",
"inputs": [
{
"name": "tier",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "secs",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setTierMultBps",
"type": "function",
"inputs": [
{
"name": "tier",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "bps",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setTokenWeight",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "weightBps",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setWithdrawSplit",
"type": "function",
"inputs": [
{
"name": "wallets",
"type": "address[]",
"internalType": "address[]"
},
{
"name": "bps",
"type": "uint256[]",
"internalType": "uint256[]"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "stag",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "stakeNFT",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "stakeTokens",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "tier",
"type": "uint8",
"internalType": "uint8"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "stakedOf",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
},
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "sweepEth",
"type": "function",
"inputs": [
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "tierDuration",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "tierInfo",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "durations",
"type": "uint256[3]",
"internalType": "uint256[3]"
},
{
"name": "mults",
"type": "uint256[3]",
"internalType": "uint256[3]"
}
],
"stateMutability": "view"
},
{
"name": "tierMultBps",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "tokenWeightBps",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "totalWeight",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "transferOwnership",
"type": "function",
"inputs": [
{
"name": "newOwner",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "unstakeNFT",
"type": "function",
"inputs": [
{
"name": "tokenId",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "unstakeTokens",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "userInfo",
"type": "function",
"inputs": [
{
"name": "a",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "baseWeight",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "lockMultBps_",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "holdMult",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "weight",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "stakedAt",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "lockTier",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "unlockAt",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "pendingEth",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "nfts",
"type": "uint256[]",
"internalType": "uint256[]"
},
{
"name": "locked",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "withdrawSplitOf",
"type": "function",
"inputs": [
{
"name": "a",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "address[]",
"internalType": "address[]"
},
{
"name": "",
"type": "uint256[]",
"internalType": "uint256[]"
}
],
"stateMutability": "view"
},
{
"type": "receive",
"stateMutability": "payable"
}
]0x60c034620002e957620036c5601f38829003908101601f19168301906001600160401b03821184831017620002ee5780849160409485948552833981010312620002e9576200004e8262000324565b6200005d602080940162000324565b923315620002d157600080546001600160a01b03198082163390811784556001600160a01b039593949193919286167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08680a3600194858055620000c062000304565b62278d008152624f1a00848201526276a7008882015286865b60038110620002bd57505050620000ef62000304565b9161271094858452613a9885850152614e2093848a82015288885b60038110620002a9575050506200012062000304565b9587875269d3c21bcecceda1000000868801526a084595161401484a0000008a88015260125496600397886012558089106200028b575b5060128952868920908a8a5b8a81106200027857505050506200017962000304565b90815284868201526175308a820152601354876013558088106200025a575b506013885285882090885b888110620002485750505082899a6105dc60149b9a9b556103e860155569021e19e0c9bab2400000601b55166080528160a05233906016541617601655168062000225575b8551613372908162000353823960805181818161106f015281816112b701528181611ba501526127e9015260a0518181816122e50152612fe90152f35b8452600282528484205552209060ff1982541617905538818180808080620001e8565b815183820155908701908a01620001a3565b601389528689206200027191810190890162000339565b3862000198565b89835193019281850155018b9062000163565b60128a52878a20620002a2918101908a0162000339565b3862000157565b87835193019281600f01550189906200010a565b85835193019281600c0155018790620000d9565b8251631e4fbdf760e01b815260006004820152602490fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b60405190606082016001600160401b03811183821017620002ee57604052565b51906001600160a01b0382168203620002e957565b81811062000345575050565b600081556001016200033956fe6080604052600436101561001b575b361561001957600080fd5b005b6000803560e01c80628cc26214612a5c578063012caae114612a3357806302ba7395146128f657806306793968146128cb57806308a3baf01461289a578063131e56cf146127bc5780631959a002146126d35780632123c6c6146126845780632145103d14612645578063246132f9146124985780632a5402ac1461247a5780632ac3f4501461245f5780633228dd5914612441578063354ff55f1461242657806336a7bd3c146123f15780634e71d92d14612367578063570ca7351461233e5780635a27d547146123145780635bba873a146122cf57806361138db81461229c578063637888c014611ea25780636eb604e014611b36578063715018a614611adc578063794b0c6a14611aaf5780637b0a47ee14611a915780637e08f23e14611a7357806380f40b5d14611a3a5780638da5cb5b14611a1357806390e8265d146119e657806393cb1c49146119c3578063951378c5146118ef57806396c82e57146118d1578063a887d42f146118a2578063ab711ac214611884578063ae937fdf14611735578063b25a7a18146116c3578063b35559ec1461168a578063b3ab15fb1461164a578063b4f2c36c146115ef578063b9fe95b614611529578063c1c0f1ea146114ff578063c1dfa0bb146110e8578063c8f33c91146110ca578063cb1366b91461109e578063ce8ab46b14611059578063cfa4a5bf14610fa4578063d5a34ed214610f39578063df9b111014610c66578063e5711e8b14610bd9578063e89a173e146107b4578063ebe2b12b14610796578063ec342ad014610773578063eceb89221461049e578063ed88c68e1461042d578063f2fde38b146103a2578063f783c09e14610378578063fe60d12c1461035a5763fe87edbe146102a4575061000e565b34610357576040366003190112610357576102bd612b92565b602435906102c96130f2565b600360ff8216108061034b575b8061033d575b6102e590613086565b600381101561032957600c01556b3a34b2b9223ab930ba34b7b760a11b7fff7ae071df22ff533c359cd0fdc885b8f767ee394702a9b5f577fa3dd4087a158280a280f35b634e487b7160e01b83526032600452602483fd5b506301e133808211156102dc565b50610e108210156102d6565b80fd5b50346103575780600319360112610357576020600b54604051908152f35b50346103575760203660031901126103575760406020916004358152601c83522054604051908152f35b5034610357576020366003190112610357576103bc612a80565b6103c46130f2565b6001600160a01b0390811690811561041457600054826001600160601b0360a01b821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a380f35b604051631e4fbdf760e01b815260048101849052602490fd5b508060031936011261035757341561046e576040513481527f29a047f6fd84d8cae8b3b33dbfe103e58528cfd4af40aab48f111b019ed380a360203392a280f35b60405162461bcd60e51b81526020600482015260086024820152676e6f2076616c756560c01b6044820152606490fd5b5034610357576104ad36612bfb565b808392931480610768575b156107395784805b8382106106a15761271091501161066f57338552602090601d8252604086206008810167ffffffffffffffff9182861161065b57600160401b9182871161064757610510878254818455836130cf565b8952848920888a5b88811061062d5750505060090191831161061957821161060557610541828254818455836130cf565b865281862084875b8381106105f3575050506040519280604085016040865252606084019590875b8181106105c657505050828503828401528085526001600160fb1b0381116105c2577fd01426833eda68c3f3e19df1a81e99f8fe9d411753f8f45f9789787db46cd76093839160051b809184880137339501030190a280f35b8580fd5b90919687359060018060a01b0382168092036105ee5790815284019684019190600101610569565b600080fd5b81358382015590840190600101610549565b634e487b7160e01b87526041600452602487fd5b634e487b7160e01b88526041600452602488fd5b6001908861063a84612fc9565b9301928185015501610518565b634e487b7160e01b8a52604160045260248afd5b634e487b7160e01b89526041600452602489fd5b60405162461bcd60e51b815260206004820152600a602482015269627073203e203130302560b01b6044820152606490fd5b6001600160a01b03806106bd6106b885888b612fb9565b612fc9565b161515908161071f575b50156106ed576106e56001916106de848689612fb9565b3590612c9c565b9101906104c0565b60405162461bcd60e51b815260206004820152600a602482015269189859081dd85b1b195d60b21b6044820152606490fd5b905061072f6106b884878a612fb9565b16301415386106c7565b60405162461bcd60e51b81526020600482015260076024820152663130b2103632b760c91b6044820152606490fd5b5060038211156104b8565b50346103575780600319360112610357576020604051670de0b6b3a76400008152f35b50346103575780600319360112610357576020600754604051908152f35b5034610357576040366003190112610357576107ce612a80565b6107d661311e565b6107de612e66565b61080b670de0b6b3a76400006108026107f960095485612c46565b600a5490612c69565b04600b54612c9c565b600b55600955610819612eb7565b60085533610bb1575b33825260046020526040822060018060a01b03821660005260205260406000205490602435151580610ba5575b15610b7357338352601d6020526040832091600383015460ff6004850154166003811015610b5f57600c015461088491612c9c565b421092839181549033875260056020526040872060018060a01b0386166000526020526109086108c4826108bf602435604060002054612c69565b612c7c565b9133895260056020526040892060018060a01b03881660005260205260406000206108f0848254612c46565b90556108fd838654612c46565b855560243590612c46565b33885260046020526040882060018060a01b03871660005260205260406000205561093233613141565b8695610ac8575b505061094784602435612c46565b859160088101805491885b8381106109d457505050508181116109b0575b50506040519260243584526020840152604083015260018060a01b0316907f37ed3ff5f07752e36c2b68807cea4ede318c76fff2d2a561463c4987469e87b260603392a36001805580f35b6109cd916109bd91612c46565b336001600160a01b038516613186565b3880610965565b6127106109f46109e78360098601612b30565b90549060031b1c87612c69565b04888b82610a08575b505050600101610952565b82610a5592602092610a1a878a612b30565b905460405163a9059cbb60e01b815260039290921b1c6001600160a01b03166004820152602481019390935291938492839182906044820190565b03926001600160a01b03165af18c9181610a97575b50610a78575b50888b6109fd565b610a83575b80610a70565b610a909060019297612c9c565b9590610a7d565b610aba91925060203d602011610ac1575b610ab28183612d3d565b8101906131c7565b9038610a6a565b503d610aa8565b909450612710610adc601454602435612c69565b04948015610b53576108bf610af5926006850154612c69565b60068201610b04828254612c46565b9055600b5490808210610b4b57610b1a91612c46565b600b5583610b2a575b3880610939565b601654610b469085906001600160a01b03908116908616613186565b610b23565b505084610b1a565b50506006810154610af5565b634e487b7160e01b86526032600452602486fd5b60405162461bcd60e51b815260206004820152600a60248201526918985908185b5bdd5b9d60b21b6044820152606490fd5b5060243582101561084f565b610bba33612ca9565b338352601d602052604083209060068201556005600954910155610822565b503461035757606036600319011261035757610bf3612a80565b610bfb612a96565b90610c046130f2565b6001600160a01b03168083526003602052604083205460ff16610c3157610c2e9160443591613186565b80f35b60405162461bcd60e51b815260206004820152600d60248201526c39ba30b5b4b733903a37b5b2b760991b6044820152606490fd5b503461035757610c7536612bfb565b929091610c806130f2565b83811480610f30575b80610f25575b15610efa57845b848110610e1f575067ffffffffffffffff90818111610e0b57600160401b928382116106055760125482601255808310610dd0575b5060128752865b828110610d9c575050508311610d88578211610d745760135482601355808310610d39575b50825b828110610d05578380f35b60019060208335930192817f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a090015501610cfa565b610d6e906013600052837f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a09091820191016130b8565b38610cf7565b634e487b7160e01b83526041600452602483fd5b634e487b7160e01b84526041600452602484fd5b60019060208335930192817fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec3444015501610cd2565b610e05906012600052837fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344491820191016130b8565b38610ccb565b634e487b7160e01b86526041600452602486fd5b612710610e2d828787612fb9565b35101580610ee2575b15610eb75780610e49575b600101610c96565b610e54818385612fb9565b356000198201828111610ea357610e6c908486612fb9565b3510610e415760405162461bcd60e51b8152602060048201526009602482015268617363656e64696e6760b81b6044820152606490fd5b634e487b7160e01b88526011600452602488fd5b606460405162461bcd60e51b81526020600482015260046024820152631b5d5b1d60e21b6044820152fd5b50620186a0610ef2828787612fb9565b351115610e36565b60405162461bcd60e51b81526020600482015260036024820152623632b760e91b6044820152606490fd5b50600a811115610c8f565b50801515610c89565b503461035757604036600319011261035757610f53612b92565b60243590610f5f6130f2565b600360ff82161080610f98575b80610f8b575b610f7b90613086565b600381101561032957600f015580f35b50620186a0821115610f72565b50612710821015610f6c565b50346103575780600319360112610357576060604051610fc381612d21565b3690376060604051610fd481612d21565b369037604051600c6000825b600382106110435783610ff281612d21565b60405190600f6000835b6003821061102d5760c08461102b8761101481612d21565b6110216040518094612bd3565b6060830190612bd3565bf35b6001602081928554815201930191019091610ffc565b6001602081928554815201930191019091610fe0565b50346103575780600319360112610357576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103575760203660031901126103575760206110c26110bd612a80565b612fdd565b604051908152f35b50346103575780600319360112610357576020600854604051908152f35b503461035757602080600319360112611399576108026004359161110a61311e565b611112612e66565b61113661112160095483612c46565b670de0b6b3a7640000948591600a5490612c69565b600b55600955611144612eb7565b600855336114d8575b8284526019815260408420546001600160a01b039033908216036114a257338552601d825260408520600393600382015460ff600484015416600381101561148e57600c015461119c91612c9c565b42109460078301908154600019918a5b828110611465575b5050600019821461143357600019810190811161141f57906111ea6111dc6112039385612b30565b90549060031b1c9184612b30565b90919082549060031b91821b91600019901b1916179055565b8054801561140b5790889493929160001901906112208282612b30565b8154906000199060031b1b191690555586845260198552604084206001600160601b0360a01b8154169055601a8552604084209060008254925560018301918254818111600014611403576112759250612c46565b905b558054868452601c855260408420600081549155868354828082116000146113fb576112a291612c46565b845561139d575b5050506112b533613141565b7f000000000000000000000000000000000000000000000000000000000000000016803b1561139957818091602460405180958193636198e33960e01b83528a60048401525af19182611381575b505061137c57828452601e815260408420805460ff1916600117905533837f265e114590bfa9069cceb10fd39ca28b20c37e35e9432acf6c61797c9539531b8680a35b6040519283528201527fd3d90e05d105163dddbfc9c1f595f6c8290a002d02ce5d426c0958c8e88d33c460403392a26001805580f35b611346565b61138a90612cf7565b611395578438611303565b8480fd5b5080fd5b81156113ed576006916108bf6113b69284860154612c69565b915b016113c4828254612c46565b9055600b54908082106113e5576113da91612c46565b600b553880806112a9565b5050816113da565b5050600680820154916113b8565b5050856112a2565b505090611277565b634e487b7160e01b89526031600452602489fd5b634e487b7160e01b8a52601160045260248afd5b60405162461bcd60e51b815260048101889052600a6024820152691b9bdd081cdd185ad95960b21b6044820152606490fd5b8a6114708287612b30565b905490841b1c14611483576001016111ac565b9250389050806111b4565b634e487b7160e01b89526032600452602489fd5b60405162461bcd60e51b815260048101839052600e60248201526d6e6f7420796f7572207374616b6560901b6044820152606490fd5b6114e133612ca9565b338552601d825260408520906006820155600560095491015561114d565b50346103575760203660031901126103575760406020916004358152601a83522054604051908152f35b5034610357576020806003193601126113995760043567ffffffffffffffff81116115eb5761155c903690600401612ba2565b611567929192612e66565b90600991611586670de0b6b3a76400006108026107f960095485612c46565b600b55600955611594612eb7565b600855845b8181106115a4578580f35b806115e56115b86106b8600194868a612fb9565b6115c181612ca9565b848060a01b0382168a52601d885260408a2090600682015560058754910155613141565b01611599565b8280fd5b50346103575760203660031901126103575760043561160c6130f2565b610bb8811161161b5760145580f35b60405162461bcd60e51b81526020600482015260076024820152666d61782033302560c81b6044820152606490fd5b503461035757602036600319011261035757611664612a80565b61166c6130f2565b60018060a01b03166001600160601b0360a01b601754161760175580f35b503461035757602036600319011261035757600435906013548210156103575760206116b583612af9565b90546040519160031b1c8152f35b5034610357576020366003190112610357576116dd612a80565b6116e56130f2565b6001600160a01b0316801561170a576001600160601b0360a01b601654161760165580f35b606460405162461bcd60e51b81526020600482015260046024820152637a65726f60e01b6044820152fd5b50346103575760403660031901126103575761174f612a80565b6024359061c3508211611856576001600160a01b039081168084526003602052604084205490919060ff166117f05783541633036117b3575b8252600260205280604083205561179c5780f35b600360205260408120805460ff1916600117905580f35b60405162461bcd60e51b81526020600482015260156024820152746e657720746f6b656e3a206f776e6572206f6e6c7960581b6044820152606490fd5b808454163314908115611836575b506117885760405162461bcd60e51b815260206004820152600b60248201526a3737ba1036b0b730b3b2b960a91b6044820152606490fd5b6017541680151591508161184c575b50386117fe565b9050331438611845565b60405162461bcd60e51b81526020600482015260066024820152650dac2f0406af60d31b6044820152606490fd5b50346103575780600319360112610357576020601b54604051908152f35b50346103575760203660031901126103575760ff60406020926004358152601e84522054166040519015158152f35b50346103575780600319360112610357576020600a54604051908152f35b50346103575760209081600319360112610357576001600160a01b039182611915612a80565b168252601d81526040822091600883019160405193848285549182815201908195855283852090855b8181106119ad575050506119609161195a876009930388612d3d565b01612e13565b9160405194604086019060408752518091526060860194915b818110611997578686038488015286806119938888612b48565b0390f35b8251881686529483019491830191600101611979565b82548a168452928501926001928301920161193e565b5034610357576020366003190112610357576119dd6130f2565b600435601b5580f35b503461035757602036600319011261035757600435600381101561139957602090600c0154604051908152f35b5034610357578060031936011261035757546040516001600160a01b039091168152602090f35b5034610357576020366003190112610357576020906040906001600160a01b03611a62612a80565b168152600283522054604051908152f35b50346103575780600319360112610357576020601554604051908152f35b50346103575780600319360112610357576020600654604051908152f35b503461035757602036600319011261035757600435600381101561139957602090600f0154604051908152f35b5034610357578060031936011261035757611af56130f2565b600080546001600160a01b0319811682556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5034610357576020806003193601126113995760043590611b5561311e565b610802611b60612e66565b611b84611b6f60095483612c46565b670de0b6b3a7640000938491600a5490612c69565b600b55600955611b92612eb7565b60085533611e7b575b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116918215611e47576040516331a9108f60e11b8152600481018690526024929085818581885afa908115611e3c578891611e02575b508133911603611dd25785875260198552604087205416611d9d57338652601d845260408620906001820190815415611d95575b86885260188652604088205480611d9057506015545b818102918183041490151715611d7d57612710900490611c65828254612c9c565b9055858752601a85526040872055611c80601b548254612c9c565b8155601b54858752601c8552604087205560078101805490600160401b821015611d6a57866111ea83611cbc9360018c99989796018155612b30565b8584526019855260408420336001600160601b0360a01b825416179055600342910155611ce833613141565b813b156115eb5782918291604051809481936337519c1960e21b83528960048401525af18015611d5f57611d4b575b50507fa3a2f4924c244b65a4ecb0f6c615dc546a3510483f569d676ae4485f759d98d7906040519283523392a26001805580f35b611d5490612cf7565b6115eb578238611d17565b6040513d84823e3d90fd5b634e487b7160e01b885260416004528388fd5b634e487b7160e01b885260116004528388fd5b611c44565b808255611c2e565b60405162461bcd60e51b815260048101859052600e818401526d185b1c9958591e481cdd185ad95960921b6044820152606490fd5b60405162461bcd60e51b815260048101869052600981850152683737ba1037bbb732b960b91b6044820152606490fd5b90508581813d8311611e35575b611e198183612d3d565b81010312611e3157518181168103611e315738611bfa565b8780fd5b503d611e0f565b6040513d8a823e3d90fd5b60405162461bcd60e51b815260048101859052600c60248201526b1b999d08191a5cd8589b195960a21b6044820152606490fd5b611e8433612ca9565b338552601d8352604085209060068201556005600954910155611b9b565b503461035757606036600319011261035757611ebc612a80565b60249081359160449182359160ff83168093036105ee5761080291611edf61311e565b611ee7612e66565b611f0b611ef660095483612c46565b670de0b6b3a7640000958691600a5490612c69565b600b55600955611f19612eb7565b60085533612274575b6003841015612246576001600160a01b03168087526002602090815260408820549196909390821561220e5780156121e0576040516370a0823160e01b80825230600483015291868287818d5afa9182156121d5578b926121a6575b50604051906323b872dd60e01b888301523387830152308a83015260648201526064815260a0810181811067ffffffffffffffff82111761219157604052611fc6908a6131df565b604051918252306004830152858286818c5afa8015612186578a90612157575b611ff09250612c46565b95861561212057338952601d8552604089209384546120d6575b505061202b6120799261271092600186018054156120ce575b505087612c69565b043388526004845260408820876000528452604060002061204d878254612c9c565b905533885260058452604088208760005284526040600020612070828254612c9c565b90558254612c9c565b8155600481018360ff1982541617905560034291015561209833613141565b6040519283528201527fe28ac993e6e9802e861a36a4c6b790999a65dfdc1df4dc3b2d16cc15dd511e3c60403392a36001805580f35b553880612023565b60ff60048601541687101561200a577531b0b73737ba103637bbb2b9103637b1b5903a34b2b960511b606492601688936040519462461bcd60e51b86526004860152840152820152fd5b84711b9bc81d1bdad95b9cc81c9958d95a5d995960721b6064926012876040519462461bcd60e51b86526004860152840152820152fd5b508582813d831161217f575b61216d8183612d3d565b810103126105ee57611ff09151611fe6565b503d612163565b6040513d8c823e3d90fd5b86634e487b7160e01b60005260416004526000fd5b9091508681813d83116121ce575b6121be8183612d3d565b810103126105ee57519038611f7e565b503d6121b4565b6040513d8d823e3d90fd5b60405162461bcd60e51b815260048101869052600881860152670616d6f756e743d360c41b81890152606490fd5b60405162461bcd60e51b815260048101869052601281860152711d1bdad95b881b9bdd08185c1c1c9bdd995960721b81890152606490fd5b60405162461bcd60e51b815260206004820152600881840152673130b2103a34b2b960c11b81870152606490fd5b61227d33612ca9565b338852601d602052604088209060068201556005600954910155611f22565b503461035757602036600319011261035757602090600435815260198252604060018060a01b0391205416604051908152f35b50346103575780600319360112610357576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346103575760203660031901126103575760406020916004358152601883522054604051908152f35b50346103575780600319360112610357576017546040516001600160a01b039091168152602090f35b503461035757806003193601126103575761238061311e565b612388612e66565b6123a3670de0b6b3a76400006108026107f960095485612c46565b600b556009556123b1612eb7565b600855336123c9575b6123c2612ec9565b6001805580f35b6123d233612ca9565b338252601d6020526040822090600682015560056009549101556123ba565b50346103575761240036612b7c565b906124096130f2565b612417611388831115612ddd565b82526018602052604082205580f35b503461035757806003193601126103575760206110c2612eb7565b50346103575780600319360112610357576020600954604051908152f35b503461035757806003193601126103575760206110c2612e66565b50346103575780600319360112610357576020601454604051908152f35b5034610357576124a736612b7c565b6124af6130f2565b6124b7612e66565b6124d2670de0b6b3a76400006108026107f960095485612c46565b600b55600955801561261357600754814282116125e8576124f4915083612c7c565b6006555b60065480156125ba57600b5482478210156125ae5761251a6125209247612c46565b92612c69565b11612569577f6c07ee05dcf262f13abf9d87b846ee789d2f90fe991d495acd7d7fc109ee1f5591604091426008556125588142612c9c565b60075582519182526020820152a180f35b60405162461bcd60e51b815260206004820152601760248201527f696e73756666696369656e74204554482066756e6465640000000000000000006044820152606490fd5b61252091508592612c69565b60405162461bcd60e51b81526020600482015260066024820152650726174653d360d41b6044820152606490fd5b6108bf6126056125fc61260b944290612c46565b60065490612c69565b85612c9c565b6006556124f8565b60405162461bcd60e51b815260206004820152600a60248201526906475726174696f6e3d360b41b6044820152606490fd5b50346103575760203660031901126103575760209060ff906040906001600160a01b03612670612a80565b168152600384522054166040519015158152f35b50346103575760403660031901126103575761269e612a80565b60406126a8612a96565b9260018060a01b03809316815260046020522091166000526020526020604060002054604051908152f35b5034610357576020366003190112610357576126ed612a80565b9060018060a01b0382168152601d6020526040812060038101549260ff6004830154169260038410156127a8575061279b9061272d84600c015486612c9c565b9280549085600f01549561274084612fdd565b9761275b6007612754600286015497612ca9565b9401612e13565b94604051998a99610140968b5260208b015260408a01526060890152608088015260a08701528460c087015260e086015280610100860152840190612b48565b9042106101208301520390f35b634e487b7160e01b81526032600452602490fd5b50346103575760203660031901126103575760043590818152601e60205260ff60408220541615612868577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b1561139957818091602460405180948193636198e33960e01b83528860048401525af18015611d5f57612859575b50908152601e60205260408120805460ff1916905580f35b61286290612cf7565b38612841565b60405162461bcd60e51b815260206004820152600a6024820152696e6f2070656e64696e6760b01b6044820152606490fd5b5034610357576020366003190112610357576004356128b76130f2565b6128c5611388821115612ddd565b60155580f35b503461035757602036600319011261035757600435906012548210156103575760206116b583612aac565b503461035757604036600319011261035757612910612a80565b6024359061291c6130f2565b612980612927612e66565b612942670de0b6b3a76400006108026107f960095485612c46565b9081600b55600955612952612eb7565b600855600754804210600014612a2b5761297a90612974600654914290612c46565b90612c69565b90612c9c565b804711600014612a24576129949047612c46565b82116129ec576001600160a01b0316907fe901d1b59f1ff1fd9148d2556987aeae9812e642db2b40296421f8325d8c70f7906020906129e28580808085895af16129dc612d5f565b50612d9f565b604051908152a280f35b60405162461bcd60e51b815260206004820152601060248201526f0caf0c6cacac8e640cce4caca408aa8960831b6044820152606490fd5b5082612994565b508490612c9c565b50346103575780600319360112610357576016546040516001600160a01b039091168152602090f35b50346103575760203660031901126103575760206110c2612a7b612a80565b612ca9565b600435906001600160a01b03821682036105ee57565b602435906001600160a01b03821682036105ee57565b601254811015612ae35760126000527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440190600090565b634e487b7160e01b600052603260045260246000fd5b601354811015612ae35760136000527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0900190600090565b8054821015612ae35760005260206000200190600090565b90815180825260208080930193019160005b828110612b68575050505090565b835185529381019392810192600101612b5a565b60409060031901126105ee576004359060243590565b6004359060ff821682036105ee57565b9181601f840112156105ee5782359167ffffffffffffffff83116105ee576020808501948460051b0101116105ee57565b6000915b60038310612be457505050565b600190825181526020809101920192019190612bd7565b60406003198201126105ee5767ffffffffffffffff916004358381116105ee5782612c2891600401612ba2565b939093926024359182116105ee57612c4291600401612ba2565b9091565b91908203918211612c5357565b634e487b7160e01b600052601160045260246000fd5b81810292918115918404141715612c5357565b8115612c86570490565b634e487b7160e01b600052601260045260246000fd5b91908201809211612c5357565b60018060a01b0316600052601d602052612cf460406000206006670de0b6b3a7640000612cea6002840154612974612cdf612e66565b600587015490612c46565b0491015490612c9c565b90565b67ffffffffffffffff8111612d0b57604052565b634e487b7160e01b600052604160045260246000fd5b6060810190811067ffffffffffffffff821117612d0b57604052565b90601f8019910116810190811067ffffffffffffffff821117612d0b57604052565b3d15612d9a573d9067ffffffffffffffff8211612d0b5760405191612d8e601f8201601f191660200184612d3d565b82523d6000602084013e565b606090565b15612da657565b60405162461bcd60e51b815260206004820152600f60248201526e195d1a081cd95b990819985a5b1959608a1b6044820152606490fd5b15612de457565b60405162461bcd60e51b81526020600482015260076024820152666d61782035302560c81b6044820152606490fd5b90604051918281549182825260209260208301916000526020600020936000905b828210612e4c57505050612e4a92500383612d3d565b565b855484526001958601958895509381019390910190612e34565b600a548015612eb057600954612e896125fc612e80612eb7565b60085490612c46565b670de0b6b3a764000090818102918183041490151715612c5357612cf49261297a91612c7c565b5060095490565b600754804210600014612cf457504290565b6000338152601d60205260408120600381015460ff6004830154166003811015612fa557600c0154612efa91612c9c565b4210612f77576006018054918215612f725780612f3c9255600b548380821015600014612f6a57612f2a91612c46565b600b5580808085335af16129dc612d5f565b6040519081527fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a60203392a2565b505080612f2a565b505050565b60405162461bcd60e51b81526020600482015260066024820152651b1bd8dad95960d21b6044820152606490fd5b634e487b7160e01b84526032600452602484fd5b9190811015612ae35760051b0190565b356001600160a01b03811681036105ee5790565b60006001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116908161306a57505050506000905b6012546127109260005b82811061302e57505050565b61303781612aac565b9054600391821b1c831015613050575b50600101613022565b81955061305e600192612af9565b9054911b1c9490613047565b6040931682526004602052828220908252602052205490613018565b1561308d57565b60405162461bcd60e51b815260206004820152600360248201526218985960ea1b6044820152606490fd5b8181106130c3575050565b600081556001016130b8565b918181106130dc57505050565b612e4a92600052602060002091820191016130b8565b6000546001600160a01b0316330361310657565b60405163118cdaa760e01b8152336004820152602490fd5b60026001541461312f576002600155565b604051633ee5aeb560e01b8152600490fd5b6001600160a01b0381166000908152601d602052604090209061316390613251565b906131808261317b6002600a54940193845490612c46565b612c9c565b600a5555565b60405163a9059cbb60e01b60208201526001600160a01b03929092166024830152604480830193909352918152612e4a916131c2606483612d3d565b6131df565b908160209103126105ee575180151581036105ee5790565b6000806132089260018060a01b03169360208151910182865af1613201612d5f565b90836132d9565b8051908115159182613236575b505061321e5750565b60249060405190635274afe760e01b82526004820152fd5b61324992506020809183010191016131c7565b153880613215565b6001600160a01b0381166000908152601d602052604081208054909281156132d25760ff6004850154166003811015612fa557670de0b6b3a764000094926132b76132ce95936129746001946132b0612710958692600f015490612c69565b0491612fdd565b049201549050801560001461297457508290612c69565b0490565b5050905090565b9061330057508051156132ee57805190602001fd5b604051630a12f52160e11b8152600490fd5b81511580613333575b613311575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b1561330956fea264697066735822122047893cb39c65af0b5d93fcb68e48396630798fb679fa98910499637f691ed98d64736f6c63430008180033000000000000000000000000cddb2d9838b7edab2f04af4943a6efe42c2f9f490000000000000000000000004384cb362d908d36266bdf3c31f18db95eb127dc
0x6080604052600436101561001b575b361561001957600080fd5b005b6000803560e01c80628cc26214612a5c578063012caae114612a3357806302ba7395146128f657806306793968146128cb57806308a3baf01461289a578063131e56cf146127bc5780631959a002146126d35780632123c6c6146126845780632145103d14612645578063246132f9146124985780632a5402ac1461247a5780632ac3f4501461245f5780633228dd5914612441578063354ff55f1461242657806336a7bd3c146123f15780634e71d92d14612367578063570ca7351461233e5780635a27d547146123145780635bba873a146122cf57806361138db81461229c578063637888c014611ea25780636eb604e014611b36578063715018a614611adc578063794b0c6a14611aaf5780637b0a47ee14611a915780637e08f23e14611a7357806380f40b5d14611a3a5780638da5cb5b14611a1357806390e8265d146119e657806393cb1c49146119c3578063951378c5146118ef57806396c82e57146118d1578063a887d42f146118a2578063ab711ac214611884578063ae937fdf14611735578063b25a7a18146116c3578063b35559ec1461168a578063b3ab15fb1461164a578063b4f2c36c146115ef578063b9fe95b614611529578063c1c0f1ea146114ff578063c1dfa0bb146110e8578063c8f33c91146110ca578063cb1366b91461109e578063ce8ab46b14611059578063cfa4a5bf14610fa4578063d5a34ed214610f39578063df9b111014610c66578063e5711e8b14610bd9578063e89a173e146107b4578063ebe2b12b14610796578063ec342ad014610773578063eceb89221461049e578063ed88c68e1461042d578063f2fde38b146103a2578063f783c09e14610378578063fe60d12c1461035a5763fe87edbe146102a4575061000e565b34610357576040366003190112610357576102bd612b92565b602435906102c96130f2565b600360ff8216108061034b575b8061033d575b6102e590613086565b600381101561032957600c01556b3a34b2b9223ab930ba34b7b760a11b7fff7ae071df22ff533c359cd0fdc885b8f767ee394702a9b5f577fa3dd4087a158280a280f35b634e487b7160e01b83526032600452602483fd5b506301e133808211156102dc565b50610e108210156102d6565b80fd5b50346103575780600319360112610357576020600b54604051908152f35b50346103575760203660031901126103575760406020916004358152601c83522054604051908152f35b5034610357576020366003190112610357576103bc612a80565b6103c46130f2565b6001600160a01b0390811690811561041457600054826001600160601b0360a01b821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a380f35b604051631e4fbdf760e01b815260048101849052602490fd5b508060031936011261035757341561046e576040513481527f29a047f6fd84d8cae8b3b33dbfe103e58528cfd4af40aab48f111b019ed380a360203392a280f35b60405162461bcd60e51b81526020600482015260086024820152676e6f2076616c756560c01b6044820152606490fd5b5034610357576104ad36612bfb565b808392931480610768575b156107395784805b8382106106a15761271091501161066f57338552602090601d8252604086206008810167ffffffffffffffff9182861161065b57600160401b9182871161064757610510878254818455836130cf565b8952848920888a5b88811061062d5750505060090191831161061957821161060557610541828254818455836130cf565b865281862084875b8381106105f3575050506040519280604085016040865252606084019590875b8181106105c657505050828503828401528085526001600160fb1b0381116105c2577fd01426833eda68c3f3e19df1a81e99f8fe9d411753f8f45f9789787db46cd76093839160051b809184880137339501030190a280f35b8580fd5b90919687359060018060a01b0382168092036105ee5790815284019684019190600101610569565b600080fd5b81358382015590840190600101610549565b634e487b7160e01b87526041600452602487fd5b634e487b7160e01b88526041600452602488fd5b6001908861063a84612fc9565b9301928185015501610518565b634e487b7160e01b8a52604160045260248afd5b634e487b7160e01b89526041600452602489fd5b60405162461bcd60e51b815260206004820152600a602482015269627073203e203130302560b01b6044820152606490fd5b6001600160a01b03806106bd6106b885888b612fb9565b612fc9565b161515908161071f575b50156106ed576106e56001916106de848689612fb9565b3590612c9c565b9101906104c0565b60405162461bcd60e51b815260206004820152600a602482015269189859081dd85b1b195d60b21b6044820152606490fd5b905061072f6106b884878a612fb9565b16301415386106c7565b60405162461bcd60e51b81526020600482015260076024820152663130b2103632b760c91b6044820152606490fd5b5060038211156104b8565b50346103575780600319360112610357576020604051670de0b6b3a76400008152f35b50346103575780600319360112610357576020600754604051908152f35b5034610357576040366003190112610357576107ce612a80565b6107d661311e565b6107de612e66565b61080b670de0b6b3a76400006108026107f960095485612c46565b600a5490612c69565b04600b54612c9c565b600b55600955610819612eb7565b60085533610bb1575b33825260046020526040822060018060a01b03821660005260205260406000205490602435151580610ba5575b15610b7357338352601d6020526040832091600383015460ff6004850154166003811015610b5f57600c015461088491612c9c565b421092839181549033875260056020526040872060018060a01b0386166000526020526109086108c4826108bf602435604060002054612c69565b612c7c565b9133895260056020526040892060018060a01b03881660005260205260406000206108f0848254612c46565b90556108fd838654612c46565b855560243590612c46565b33885260046020526040882060018060a01b03871660005260205260406000205561093233613141565b8695610ac8575b505061094784602435612c46565b859160088101805491885b8381106109d457505050508181116109b0575b50506040519260243584526020840152604083015260018060a01b0316907f37ed3ff5f07752e36c2b68807cea4ede318c76fff2d2a561463c4987469e87b260603392a36001805580f35b6109cd916109bd91612c46565b336001600160a01b038516613186565b3880610965565b6127106109f46109e78360098601612b30565b90549060031b1c87612c69565b04888b82610a08575b505050600101610952565b82610a5592602092610a1a878a612b30565b905460405163a9059cbb60e01b815260039290921b1c6001600160a01b03166004820152602481019390935291938492839182906044820190565b03926001600160a01b03165af18c9181610a97575b50610a78575b50888b6109fd565b610a83575b80610a70565b610a909060019297612c9c565b9590610a7d565b610aba91925060203d602011610ac1575b610ab28183612d3d565b8101906131c7565b9038610a6a565b503d610aa8565b909450612710610adc601454602435612c69565b04948015610b53576108bf610af5926006850154612c69565b60068201610b04828254612c46565b9055600b5490808210610b4b57610b1a91612c46565b600b5583610b2a575b3880610939565b601654610b469085906001600160a01b03908116908616613186565b610b23565b505084610b1a565b50506006810154610af5565b634e487b7160e01b86526032600452602486fd5b60405162461bcd60e51b815260206004820152600a60248201526918985908185b5bdd5b9d60b21b6044820152606490fd5b5060243582101561084f565b610bba33612ca9565b338352601d602052604083209060068201556005600954910155610822565b503461035757606036600319011261035757610bf3612a80565b610bfb612a96565b90610c046130f2565b6001600160a01b03168083526003602052604083205460ff16610c3157610c2e9160443591613186565b80f35b60405162461bcd60e51b815260206004820152600d60248201526c39ba30b5b4b733903a37b5b2b760991b6044820152606490fd5b503461035757610c7536612bfb565b929091610c806130f2565b83811480610f30575b80610f25575b15610efa57845b848110610e1f575067ffffffffffffffff90818111610e0b57600160401b928382116106055760125482601255808310610dd0575b5060128752865b828110610d9c575050508311610d88578211610d745760135482601355808310610d39575b50825b828110610d05578380f35b60019060208335930192817f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a090015501610cfa565b610d6e906013600052837f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a09091820191016130b8565b38610cf7565b634e487b7160e01b83526041600452602483fd5b634e487b7160e01b84526041600452602484fd5b60019060208335930192817fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec3444015501610cd2565b610e05906012600052837fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344491820191016130b8565b38610ccb565b634e487b7160e01b86526041600452602486fd5b612710610e2d828787612fb9565b35101580610ee2575b15610eb75780610e49575b600101610c96565b610e54818385612fb9565b356000198201828111610ea357610e6c908486612fb9565b3510610e415760405162461bcd60e51b8152602060048201526009602482015268617363656e64696e6760b81b6044820152606490fd5b634e487b7160e01b88526011600452602488fd5b606460405162461bcd60e51b81526020600482015260046024820152631b5d5b1d60e21b6044820152fd5b50620186a0610ef2828787612fb9565b351115610e36565b60405162461bcd60e51b81526020600482015260036024820152623632b760e91b6044820152606490fd5b50600a811115610c8f565b50801515610c89565b503461035757604036600319011261035757610f53612b92565b60243590610f5f6130f2565b600360ff82161080610f98575b80610f8b575b610f7b90613086565b600381101561032957600f015580f35b50620186a0821115610f72565b50612710821015610f6c565b50346103575780600319360112610357576060604051610fc381612d21565b3690376060604051610fd481612d21565b369037604051600c6000825b600382106110435783610ff281612d21565b60405190600f6000835b6003821061102d5760c08461102b8761101481612d21565b6110216040518094612bd3565b6060830190612bd3565bf35b6001602081928554815201930191019091610ffc565b6001602081928554815201930191019091610fe0565b50346103575780600319360112610357576040517f0000000000000000000000004384cb362d908d36266bdf3c31f18db95eb127dc6001600160a01b03168152602090f35b50346103575760203660031901126103575760206110c26110bd612a80565b612fdd565b604051908152f35b50346103575780600319360112610357576020600854604051908152f35b503461035757602080600319360112611399576108026004359161110a61311e565b611112612e66565b61113661112160095483612c46565b670de0b6b3a7640000948591600a5490612c69565b600b55600955611144612eb7565b600855336114d8575b8284526019815260408420546001600160a01b039033908216036114a257338552601d825260408520600393600382015460ff600484015416600381101561148e57600c015461119c91612c9c565b42109460078301908154600019918a5b828110611465575b5050600019821461143357600019810190811161141f57906111ea6111dc6112039385612b30565b90549060031b1c9184612b30565b90919082549060031b91821b91600019901b1916179055565b8054801561140b5790889493929160001901906112208282612b30565b8154906000199060031b1b191690555586845260198552604084206001600160601b0360a01b8154169055601a8552604084209060008254925560018301918254818111600014611403576112759250612c46565b905b558054868452601c855260408420600081549155868354828082116000146113fb576112a291612c46565b845561139d575b5050506112b533613141565b7f0000000000000000000000004384cb362d908d36266bdf3c31f18db95eb127dc16803b1561139957818091602460405180958193636198e33960e01b83528a60048401525af19182611381575b505061137c57828452601e815260408420805460ff1916600117905533837f265e114590bfa9069cceb10fd39ca28b20c37e35e9432acf6c61797c9539531b8680a35b6040519283528201527fd3d90e05d105163dddbfc9c1f595f6c8290a002d02ce5d426c0958c8e88d33c460403392a26001805580f35b611346565b61138a90612cf7565b611395578438611303565b8480fd5b5080fd5b81156113ed576006916108bf6113b69284860154612c69565b915b016113c4828254612c46565b9055600b54908082106113e5576113da91612c46565b600b553880806112a9565b5050816113da565b5050600680820154916113b8565b5050856112a2565b505090611277565b634e487b7160e01b89526031600452602489fd5b634e487b7160e01b8a52601160045260248afd5b60405162461bcd60e51b815260048101889052600a6024820152691b9bdd081cdd185ad95960b21b6044820152606490fd5b8a6114708287612b30565b905490841b1c14611483576001016111ac565b9250389050806111b4565b634e487b7160e01b89526032600452602489fd5b60405162461bcd60e51b815260048101839052600e60248201526d6e6f7420796f7572207374616b6560901b6044820152606490fd5b6114e133612ca9565b338552601d825260408520906006820155600560095491015561114d565b50346103575760203660031901126103575760406020916004358152601a83522054604051908152f35b5034610357576020806003193601126113995760043567ffffffffffffffff81116115eb5761155c903690600401612ba2565b611567929192612e66565b90600991611586670de0b6b3a76400006108026107f960095485612c46565b600b55600955611594612eb7565b600855845b8181106115a4578580f35b806115e56115b86106b8600194868a612fb9565b6115c181612ca9565b848060a01b0382168a52601d885260408a2090600682015560058754910155613141565b01611599565b8280fd5b50346103575760203660031901126103575760043561160c6130f2565b610bb8811161161b5760145580f35b60405162461bcd60e51b81526020600482015260076024820152666d61782033302560c81b6044820152606490fd5b503461035757602036600319011261035757611664612a80565b61166c6130f2565b60018060a01b03166001600160601b0360a01b601754161760175580f35b503461035757602036600319011261035757600435906013548210156103575760206116b583612af9565b90546040519160031b1c8152f35b5034610357576020366003190112610357576116dd612a80565b6116e56130f2565b6001600160a01b0316801561170a576001600160601b0360a01b601654161760165580f35b606460405162461bcd60e51b81526020600482015260046024820152637a65726f60e01b6044820152fd5b50346103575760403660031901126103575761174f612a80565b6024359061c3508211611856576001600160a01b039081168084526003602052604084205490919060ff166117f05783541633036117b3575b8252600260205280604083205561179c5780f35b600360205260408120805460ff1916600117905580f35b60405162461bcd60e51b81526020600482015260156024820152746e657720746f6b656e3a206f776e6572206f6e6c7960581b6044820152606490fd5b808454163314908115611836575b506117885760405162461bcd60e51b815260206004820152600b60248201526a3737ba1036b0b730b3b2b960a91b6044820152606490fd5b6017541680151591508161184c575b50386117fe565b9050331438611845565b60405162461bcd60e51b81526020600482015260066024820152650dac2f0406af60d31b6044820152606490fd5b50346103575780600319360112610357576020601b54604051908152f35b50346103575760203660031901126103575760ff60406020926004358152601e84522054166040519015158152f35b50346103575780600319360112610357576020600a54604051908152f35b50346103575760209081600319360112610357576001600160a01b039182611915612a80565b168252601d81526040822091600883019160405193848285549182815201908195855283852090855b8181106119ad575050506119609161195a876009930388612d3d565b01612e13565b9160405194604086019060408752518091526060860194915b818110611997578686038488015286806119938888612b48565b0390f35b8251881686529483019491830191600101611979565b82548a168452928501926001928301920161193e565b5034610357576020366003190112610357576119dd6130f2565b600435601b5580f35b503461035757602036600319011261035757600435600381101561139957602090600c0154604051908152f35b5034610357578060031936011261035757546040516001600160a01b039091168152602090f35b5034610357576020366003190112610357576020906040906001600160a01b03611a62612a80565b168152600283522054604051908152f35b50346103575780600319360112610357576020601554604051908152f35b50346103575780600319360112610357576020600654604051908152f35b503461035757602036600319011261035757600435600381101561139957602090600f0154604051908152f35b5034610357578060031936011261035757611af56130f2565b600080546001600160a01b0319811682556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5034610357576020806003193601126113995760043590611b5561311e565b610802611b60612e66565b611b84611b6f60095483612c46565b670de0b6b3a7640000938491600a5490612c69565b600b55600955611b92612eb7565b60085533611e7b575b6001600160a01b037f0000000000000000000000004384cb362d908d36266bdf3c31f18db95eb127dc8116918215611e47576040516331a9108f60e11b8152600481018690526024929085818581885afa908115611e3c578891611e02575b508133911603611dd25785875260198552604087205416611d9d57338652601d845260408620906001820190815415611d95575b86885260188652604088205480611d9057506015545b818102918183041490151715611d7d57612710900490611c65828254612c9c565b9055858752601a85526040872055611c80601b548254612c9c565b8155601b54858752601c8552604087205560078101805490600160401b821015611d6a57866111ea83611cbc9360018c99989796018155612b30565b8584526019855260408420336001600160601b0360a01b825416179055600342910155611ce833613141565b813b156115eb5782918291604051809481936337519c1960e21b83528960048401525af18015611d5f57611d4b575b50507fa3a2f4924c244b65a4ecb0f6c615dc546a3510483f569d676ae4485f759d98d7906040519283523392a26001805580f35b611d5490612cf7565b6115eb578238611d17565b6040513d84823e3d90fd5b634e487b7160e01b885260416004528388fd5b634e487b7160e01b885260116004528388fd5b611c44565b808255611c2e565b60405162461bcd60e51b815260048101859052600e818401526d185b1c9958591e481cdd185ad95960921b6044820152606490fd5b60405162461bcd60e51b815260048101869052600981850152683737ba1037bbb732b960b91b6044820152606490fd5b90508581813d8311611e35575b611e198183612d3d565b81010312611e3157518181168103611e315738611bfa565b8780fd5b503d611e0f565b6040513d8a823e3d90fd5b60405162461bcd60e51b815260048101859052600c60248201526b1b999d08191a5cd8589b195960a21b6044820152606490fd5b611e8433612ca9565b338552601d8352604085209060068201556005600954910155611b9b565b503461035757606036600319011261035757611ebc612a80565b60249081359160449182359160ff83168093036105ee5761080291611edf61311e565b611ee7612e66565b611f0b611ef660095483612c46565b670de0b6b3a7640000958691600a5490612c69565b600b55600955611f19612eb7565b60085533612274575b6003841015612246576001600160a01b03168087526002602090815260408820549196909390821561220e5780156121e0576040516370a0823160e01b80825230600483015291868287818d5afa9182156121d5578b926121a6575b50604051906323b872dd60e01b888301523387830152308a83015260648201526064815260a0810181811067ffffffffffffffff82111761219157604052611fc6908a6131df565b604051918252306004830152858286818c5afa8015612186578a90612157575b611ff09250612c46565b95861561212057338952601d8552604089209384546120d6575b505061202b6120799261271092600186018054156120ce575b505087612c69565b043388526004845260408820876000528452604060002061204d878254612c9c565b905533885260058452604088208760005284526040600020612070828254612c9c565b90558254612c9c565b8155600481018360ff1982541617905560034291015561209833613141565b6040519283528201527fe28ac993e6e9802e861a36a4c6b790999a65dfdc1df4dc3b2d16cc15dd511e3c60403392a36001805580f35b553880612023565b60ff60048601541687101561200a577531b0b73737ba103637bbb2b9103637b1b5903a34b2b960511b606492601688936040519462461bcd60e51b86526004860152840152820152fd5b84711b9bc81d1bdad95b9cc81c9958d95a5d995960721b6064926012876040519462461bcd60e51b86526004860152840152820152fd5b508582813d831161217f575b61216d8183612d3d565b810103126105ee57611ff09151611fe6565b503d612163565b6040513d8c823e3d90fd5b86634e487b7160e01b60005260416004526000fd5b9091508681813d83116121ce575b6121be8183612d3d565b810103126105ee57519038611f7e565b503d6121b4565b6040513d8d823e3d90fd5b60405162461bcd60e51b815260048101869052600881860152670616d6f756e743d360c41b81890152606490fd5b60405162461bcd60e51b815260048101869052601281860152711d1bdad95b881b9bdd08185c1c1c9bdd995960721b81890152606490fd5b60405162461bcd60e51b815260206004820152600881840152673130b2103a34b2b960c11b81870152606490fd5b61227d33612ca9565b338852601d602052604088209060068201556005600954910155611f22565b503461035757602036600319011261035757602090600435815260198252604060018060a01b0391205416604051908152f35b50346103575780600319360112610357576040517f000000000000000000000000cddb2d9838b7edab2f04af4943a6efe42c2f9f496001600160a01b03168152602090f35b50346103575760203660031901126103575760406020916004358152601883522054604051908152f35b50346103575780600319360112610357576017546040516001600160a01b039091168152602090f35b503461035757806003193601126103575761238061311e565b612388612e66565b6123a3670de0b6b3a76400006108026107f960095485612c46565b600b556009556123b1612eb7565b600855336123c9575b6123c2612ec9565b6001805580f35b6123d233612ca9565b338252601d6020526040822090600682015560056009549101556123ba565b50346103575761240036612b7c565b906124096130f2565b612417611388831115612ddd565b82526018602052604082205580f35b503461035757806003193601126103575760206110c2612eb7565b50346103575780600319360112610357576020600954604051908152f35b503461035757806003193601126103575760206110c2612e66565b50346103575780600319360112610357576020601454604051908152f35b5034610357576124a736612b7c565b6124af6130f2565b6124b7612e66565b6124d2670de0b6b3a76400006108026107f960095485612c46565b600b55600955801561261357600754814282116125e8576124f4915083612c7c565b6006555b60065480156125ba57600b5482478210156125ae5761251a6125209247612c46565b92612c69565b11612569577f6c07ee05dcf262f13abf9d87b846ee789d2f90fe991d495acd7d7fc109ee1f5591604091426008556125588142612c9c565b60075582519182526020820152a180f35b60405162461bcd60e51b815260206004820152601760248201527f696e73756666696369656e74204554482066756e6465640000000000000000006044820152606490fd5b61252091508592612c69565b60405162461bcd60e51b81526020600482015260066024820152650726174653d360d41b6044820152606490fd5b6108bf6126056125fc61260b944290612c46565b60065490612c69565b85612c9c565b6006556124f8565b60405162461bcd60e51b815260206004820152600a60248201526906475726174696f6e3d360b41b6044820152606490fd5b50346103575760203660031901126103575760209060ff906040906001600160a01b03612670612a80565b168152600384522054166040519015158152f35b50346103575760403660031901126103575761269e612a80565b60406126a8612a96565b9260018060a01b03809316815260046020522091166000526020526020604060002054604051908152f35b5034610357576020366003190112610357576126ed612a80565b9060018060a01b0382168152601d6020526040812060038101549260ff6004830154169260038410156127a8575061279b9061272d84600c015486612c9c565b9280549085600f01549561274084612fdd565b9761275b6007612754600286015497612ca9565b9401612e13565b94604051998a99610140968b5260208b015260408a01526060890152608088015260a08701528460c087015260e086015280610100860152840190612b48565b9042106101208301520390f35b634e487b7160e01b81526032600452602490fd5b50346103575760203660031901126103575760043590818152601e60205260ff60408220541615612868577f0000000000000000000000004384cb362d908d36266bdf3c31f18db95eb127dc6001600160a01b0316803b1561139957818091602460405180948193636198e33960e01b83528860048401525af18015611d5f57612859575b50908152601e60205260408120805460ff1916905580f35b61286290612cf7565b38612841565b60405162461bcd60e51b815260206004820152600a6024820152696e6f2070656e64696e6760b01b6044820152606490fd5b5034610357576020366003190112610357576004356128b76130f2565b6128c5611388821115612ddd565b60155580f35b503461035757602036600319011261035757600435906012548210156103575760206116b583612aac565b503461035757604036600319011261035757612910612a80565b6024359061291c6130f2565b612980612927612e66565b612942670de0b6b3a76400006108026107f960095485612c46565b9081600b55600955612952612eb7565b600855600754804210600014612a2b5761297a90612974600654914290612c46565b90612c69565b90612c9c565b804711600014612a24576129949047612c46565b82116129ec576001600160a01b0316907fe901d1b59f1ff1fd9148d2556987aeae9812e642db2b40296421f8325d8c70f7906020906129e28580808085895af16129dc612d5f565b50612d9f565b604051908152a280f35b60405162461bcd60e51b815260206004820152601060248201526f0caf0c6cacac8e640cce4caca408aa8960831b6044820152606490fd5b5082612994565b508490612c9c565b50346103575780600319360112610357576016546040516001600160a01b039091168152602090f35b50346103575760203660031901126103575760206110c2612a7b612a80565b612ca9565b600435906001600160a01b03821682036105ee57565b602435906001600160a01b03821682036105ee57565b601254811015612ae35760126000527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440190600090565b634e487b7160e01b600052603260045260246000fd5b601354811015612ae35760136000527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0900190600090565b8054821015612ae35760005260206000200190600090565b90815180825260208080930193019160005b828110612b68575050505090565b835185529381019392810192600101612b5a565b60409060031901126105ee576004359060243590565b6004359060ff821682036105ee57565b9181601f840112156105ee5782359167ffffffffffffffff83116105ee576020808501948460051b0101116105ee57565b6000915b60038310612be457505050565b600190825181526020809101920192019190612bd7565b60406003198201126105ee5767ffffffffffffffff916004358381116105ee5782612c2891600401612ba2565b939093926024359182116105ee57612c4291600401612ba2565b9091565b91908203918211612c5357565b634e487b7160e01b600052601160045260246000fd5b81810292918115918404141715612c5357565b8115612c86570490565b634e487b7160e01b600052601260045260246000fd5b91908201809211612c5357565b60018060a01b0316600052601d602052612cf460406000206006670de0b6b3a7640000612cea6002840154612974612cdf612e66565b600587015490612c46565b0491015490612c9c565b90565b67ffffffffffffffff8111612d0b57604052565b634e487b7160e01b600052604160045260246000fd5b6060810190811067ffffffffffffffff821117612d0b57604052565b90601f8019910116810190811067ffffffffffffffff821117612d0b57604052565b3d15612d9a573d9067ffffffffffffffff8211612d0b5760405191612d8e601f8201601f191660200184612d3d565b82523d6000602084013e565b606090565b15612da657565b60405162461bcd60e51b815260206004820152600f60248201526e195d1a081cd95b990819985a5b1959608a1b6044820152606490fd5b15612de457565b60405162461bcd60e51b81526020600482015260076024820152666d61782035302560c81b6044820152606490fd5b90604051918281549182825260209260208301916000526020600020936000905b828210612e4c57505050612e4a92500383612d3d565b565b855484526001958601958895509381019390910190612e34565b600a548015612eb057600954612e896125fc612e80612eb7565b60085490612c46565b670de0b6b3a764000090818102918183041490151715612c5357612cf49261297a91612c7c565b5060095490565b600754804210600014612cf457504290565b6000338152601d60205260408120600381015460ff6004830154166003811015612fa557600c0154612efa91612c9c565b4210612f77576006018054918215612f725780612f3c9255600b548380821015600014612f6a57612f2a91612c46565b600b5580808085335af16129dc612d5f565b6040519081527fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a60203392a2565b505080612f2a565b505050565b60405162461bcd60e51b81526020600482015260066024820152651b1bd8dad95960d21b6044820152606490fd5b634e487b7160e01b84526032600452602484fd5b9190811015612ae35760051b0190565b356001600160a01b03811681036105ee5790565b60006001600160a01b037f000000000000000000000000cddb2d9838b7edab2f04af4943a6efe42c2f9f498116908161306a57505050506000905b6012546127109260005b82811061302e57505050565b61303781612aac565b9054600391821b1c831015613050575b50600101613022565b81955061305e600192612af9565b9054911b1c9490613047565b6040931682526004602052828220908252602052205490613018565b1561308d57565b60405162461bcd60e51b815260206004820152600360248201526218985960ea1b6044820152606490fd5b8181106130c3575050565b600081556001016130b8565b918181106130dc57505050565b612e4a92600052602060002091820191016130b8565b6000546001600160a01b0316330361310657565b60405163118cdaa760e01b8152336004820152602490fd5b60026001541461312f576002600155565b604051633ee5aeb560e01b8152600490fd5b6001600160a01b0381166000908152601d602052604090209061316390613251565b906131808261317b6002600a54940193845490612c46565b612c9c565b600a5555565b60405163a9059cbb60e01b60208201526001600160a01b03929092166024830152604480830193909352918152612e4a916131c2606483612d3d565b6131df565b908160209103126105ee575180151581036105ee5790565b6000806132089260018060a01b03169360208151910182865af1613201612d5f565b90836132d9565b8051908115159182613236575b505061321e5750565b60249060405190635274afe760e01b82526004820152fd5b61324992506020809183010191016131c7565b153880613215565b6001600160a01b0381166000908152601d602052604081208054909281156132d25760ff6004850154166003811015612fa557670de0b6b3a764000094926132b76132ce95936129746001946132b0612710958692600f015490612c69565b0491612fdd565b049201549050801560001461297457508290612c69565b0490565b5050905090565b9061330057508051156132ee57805190602001fd5b604051630a12f52160e11b8152600490fd5b81511580613333575b613311575090565b604051639996b31560e01b81526001600160a01b039091166004820152602490fd5b50803b1561330956fea264697066735822122047893cb39c65af0b5d93fcb68e48396630798fb679fa98910499637f691ed98d64736f6c63430008180033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| DIH | 1 | $0.0000123 | $0 |
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x86ab92…d474f7 | 18 days agoTue, 28 Jul 2026 01:10:18 UTC | 0x37ed3f…87b2 | [0] 0x000000000000…77c9cf3d [1] 0x000000000000…2c2f9f49 data: 0x000000000000000000…00000000 |
| 0x3fb219…31ac40 | 18 days agoTue, 28 Jul 2026 01:04:32 UTC | 0xd3d90e…33c4 | [0] 0x000000000000…55b2726b data: 0x000000000000000000…00000000 |
| 0x9623f1…124f4d | 18 days agoTue, 28 Jul 2026 01:04:23 UTC | 0xd3d90e…33c4 | [0] 0x000000000000…55b2726b data: 0x000000000000000000…00000000 |
| 0x415ffc…9c46be | 18 days agoTue, 28 Jul 2026 01:04:04 UTC | 0x37ed3f…87b2 | [0] 0x000000000000…55b2726b [1] 0x000000000000…2c2f9f49 data: 0x000000000000000000…00000000 |
| 0xb1ad88…042cd3 | 18 days agoTue, 28 Jul 2026 00:58:42 UTC | 0xd01426…d760 | [0] 0x000000000000…55b2726b data: 0x000000000000000000…00001388 |
| 0xc2b9cc…a17e01 | 18 days agoTue, 28 Jul 2026 00:58:14 UTC | 0xd01426…d760 | [0] 0x000000000000…55b2726b data: 0x000000000000000000…00001388 |
| 0xc2c2ad…40f968 | 19 days agoMon, 27 Jul 2026 23:25:50 UTC | 0xd8138f…426a | [0] 0x000000000000…55b2726b data: 0x000000000000000000…8d8098f8 |
| 0xffabda…1c9fca | 19 days agoMon, 27 Jul 2026 23:18:06 UTC | 0x37ed3f…87b2 | [0] 0x000000000000…5285d0f1 [1] 0x000000000000…2c2f9f49 data: 0x000000000000000000…00000000 |
| 0x431ebc…1505bd | 19 days agoMon, 27 Jul 2026 23:17:25 UTC | 0xd8138f…426a | [0] 0x000000000000…5285d0f1 data: 0x000000000000000000…f4457b58 |
| 0xfe2185…243c45 | 19 days agoMon, 27 Jul 2026 23:07:15 UTC | 0xe28ac9…1e3c | [0] 0x000000000000…77c9cf3d [1] 0x000000000000…2c2f9f49 data: 0x000000000000000000…00000002 |
| 0x18f981…5d4e05 | 19 days agoMon, 27 Jul 2026 18:11:40 UTC | 0x37ed3f…87b2 | [0] 0x000000000000…548835fe [1] 0x000000000000…2c2f9f49 data: 0x000000000000000000…00000000 |
| 0x28a3c7…5015b7 | 19 days agoMon, 27 Jul 2026 18:10:22 UTC | 0xd01426…d760 | [0] 0x000000000000…548835fe data: 0x000000000000000000…00002710 |
| 0x4a9261…802ef0 | 19 days agoMon, 27 Jul 2026 16:11:29 UTC | 0x37ed3f…87b2 | [0] 0x000000000000…430cddcf [1] 0x000000000000…2c2f9f49 data: 0x000000000000000000…00000000 |
| 0xd05c2b…463916 | 19 days agoMon, 27 Jul 2026 16:10:32 UTC | 0xd8138f…426a | [0] 0x000000000000…430cddcf data: 0x000000000000000000…911d7764 |
| 0x0eac2f…44f4c6 | 19 days agoMon, 27 Jul 2026 14:54:07 UTC | 0xff7ae0…7a15 | [0] 0x746965724475…00000000 |
| 0x4061ce…d979a4 | 19 days agoMon, 27 Jul 2026 14:53:57 UTC | 0xff7ae0…7a15 | [0] 0x746965724475…00000000 |
| 0xe50cd1…521d46 | 19 days agoMon, 27 Jul 2026 14:53:48 UTC | 0xff7ae0…7a15 | [0] 0x746965724475…00000000 |
| 0xb38723…78c21c | 19 days agoMon, 27 Jul 2026 14:13:39 UTC | 0xe28ac9…1e3c | [0] 0x000000000000…548835fe [1] 0x000000000000…2c2f9f49 data: 0x000000000000000000…00000000 |
| 0xe2d1f1…66f2d6 | 24 days agoWed, 22 Jul 2026 21:03:09 UTC | 0xe28ac9…1e3c | [0] 0x000000000000…55b2726b [1] 0x000000000000…2c2f9f49 data: 0x000000000000000000…00000000 |
| 0x120102…e57b14 | 24 days agoWed, 22 Jul 2026 21:03:02 UTC | 0xe28ac9…1e3c | [0] 0x000000000000…55b2726b [1] 0x000000000000…2c2f9f49 data: 0x000000000000000000…00000000 |
| 0xe1791a…10df51 | 24 days agoWed, 22 Jul 2026 21:02:53 UTC | 0xe28ac9…1e3c | [0] 0x000000000000…55b2726b [1] 0x000000000000…2c2f9f49 data: 0x000000000000000000…00000000 |
| 0x20252b…b77065 | 25 days agoTue, 21 Jul 2026 00:50:19 UTC | 0xd01426…d760 | [0] 0x000000000000…55b2726b data: 0x000000000000000000…00002710 |
| 0x8a0184…87973a | 25 days agoTue, 21 Jul 2026 00:47:22 UTC | 0xff7ae0…7a15 | [0] 0x746965724475…00000000 |
| 0x8e5a3c…3b68dd | 25 days agoTue, 21 Jul 2026 00:47:20 UTC | 0xff7ae0…7a15 | [0] 0x746965724475…00000000 |
| 0x6e677c…65a1d5 | 25 days agoTue, 21 Jul 2026 00:47:18 UTC | 0xff7ae0…7a15 | [0] 0x746965724475…00000000 |
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x86ab92…d474f7 | unstakeTokens | 21,186,767 | 18 days agoTue, 28 Jul 2026 01:10:18 UTC | 0xccec…cf3d | IN | StagStaking | $0.000 ETH | 0.00000419 | |
| !0x7cf174…50e150 | unstakeNFT | 21,183,333 | 18 days agoTue, 28 Jul 2026 01:04:34 UTC | 0x693c…726b | IN | StagStaking | $0.000 ETH | 0.00000225 | |
| 0x3fb219…31ac40 | unstakeNFT | 21,183,308 | 18 days agoTue, 28 Jul 2026 01:04:32 UTC | 0x693c…726b | IN | StagStaking | $0.000 ETH | 0.00000370 | |
| 0x9623f1…124f4d | unstakeNFT | 21,183,223 | 18 days agoTue, 28 Jul 2026 01:04:23 UTC | 0x693c…726b | IN | StagStaking | $0.000 ETH | 0.00000447 | |
| 0x415ffc…9c46be | unstakeTokens | 21,183,033 | 18 days agoTue, 28 Jul 2026 01:04:04 UTC | 0x693c…726b | IN | StagStaking | $0.000 ETH | 0.00000628 | |
| 0xb1ad88…042cd3 | setWithdrawSplit | 21,179,820 | 18 days agoTue, 28 Jul 2026 00:58:42 UTC | 0x693c…726b | IN | StagStaking | $0.000 ETH | 0.00000319 | |
| 0xc2b9cc…a17e01 | setWithdrawSplit | 21,179,544 | 18 days agoTue, 28 Jul 2026 00:58:14 UTC | 0x693c…726b | IN | StagStaking | $0.000 ETH | 0.00000145 | |
| 0xc2c2ad…40f968 | claim | 21,124,269 | 19 days agoMon, 27 Jul 2026 23:25:50 UTC | 0x693c…726b | IN | StagStaking | $0.000 ETH | 0.00000260 | |
| 0xffabda…1c9fca | unstakeTokens | 21,119,628 | 19 days agoMon, 27 Jul 2026 23:18:06 UTC | 0x1f99…d0f1 | IN | StagStaking | $0.000 ETH | 0.00000572 | |
| 0x431ebc…1505bd | claim | 21,119,219 | 19 days agoMon, 27 Jul 2026 23:17:25 UTC | 0x1f99…d0f1 | IN | StagStaking | $0.000 ETH | 0.00000260 | |
| 0xfe2185…243c45 | stakeTokens | 21,113,145 | 19 days agoMon, 27 Jul 2026 23:07:15 UTC | 0xccec…cf3d | IN | StagStaking | $0.000 ETH | 0.00000523 | |
| 0x18f981…5d4e05 | unstakeTokens | 20,936,264 | 19 days agoMon, 27 Jul 2026 18:11:40 UTC | 0x1600…35fe | IN | StagStaking | $0.000 ETH | 0.00000507 | |
| 0x28a3c7…5015b7 | setWithdrawSplit | 20,935,482 | 19 days agoMon, 27 Jul 2026 18:10:22 UTC | 0x1600…35fe | IN | StagStaking | $0.000 ETH | 0.00000434 | |
| 0x4a9261…802ef0 | unstakeTokens | 20,865,684 | 19 days agoMon, 27 Jul 2026 16:11:29 UTC | 0x1f6f…ddcf | IN | StagStaking | $0.000 ETH | 0.00000566 | |
| 0xd05c2b…463916 | claim | 20,865,120 | 19 days agoMon, 27 Jul 2026 16:10:32 UTC | 0x1f6f…ddcf | IN | StagStaking | $0.000 ETH | 0.00000257 | |
| 0x0dc93d…f79bcf | setEarlyPenaltyBps | 20,819,347 | 19 days agoMon, 27 Jul 2026 14:54:12 UTC | 0xb6a5…2516 | IN | StagStaking | $0.000 ETH | 0.00000095 | |
| 0x0eac2f…44f4c6 | setTierDuration | 20,819,301 | 19 days agoMon, 27 Jul 2026 14:54:07 UTC | 0xb6a5…2516 | IN | StagStaking | $0.000 ETH | 0.00000121 | |
| 0x4061ce…d979a4 | setTierDuration | 20,819,196 | 19 days agoMon, 27 Jul 2026 14:53:57 UTC | 0xb6a5…2516 | IN | StagStaking | $0.000 ETH | 0.00000120 | |
| 0xe50cd1…521d46 | setTierDuration | 20,819,107 | 19 days agoMon, 27 Jul 2026 14:53:48 UTC | 0xb6a5…2516 | IN | StagStaking | $0.000 ETH | 0.00000120 | |
| !0x3cc416…be00a8 | stakeTokens | 20,795,570 | 19 days agoMon, 27 Jul 2026 14:14:33 UTC | 0x1600…35fe | IN | StagStaking | $0.000 ETH | 0.00000334 | |
| !0x2cc670…0dea4e | stakeTokens | 20,795,498 | 19 days agoMon, 27 Jul 2026 14:14:26 UTC | 0x1600…35fe | IN | StagStaking | $0.000 ETH | 0.00000332 | |
| !0x1cdd1c…4c60a5 | stakeTokens | 20,795,125 | 19 days agoMon, 27 Jul 2026 14:13:48 UTC | 0x1600…35fe | IN | StagStaking | $0.000 ETH | 0.00000335 | |
| 0xb38723…78c21c | stakeTokens | 20,795,031 | 19 days agoMon, 27 Jul 2026 14:13:39 UTC | 0x1600…35fe | IN | StagStaking | $0.000 ETH | 0.00000845 | |
| 0x905a91…b5e099 | claim | 20,783,876 | 19 days agoMon, 27 Jul 2026 13:55:03 UTC | 0x1600…35fe | IN | StagStaking | $0.000 ETH | 0.00000235 | |
| 0x631b6a…e3029a | claim | 20,783,785 | 19 days agoMon, 27 Jul 2026 13:54:54 UTC | 0x1600…35fe | IN | StagStaking | $0.000 ETH | 0.00000300 |
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x86ab9255…d474f7 | Transfer | 21,186,767 | 18 days agoTue, 28 Jul 2026 01:10:18 UTC | 0x2faa…24ff | OUT | 0xccec…cf3d | $NaN20,000,343.017627 $Stag | ||
| 0x415ffc5b…9c46be | Transfer | 21,183,033 | 18 days agoTue, 28 Jul 2026 01:04:04 UTC | 0x2faa…24ff | OUT | 0x0009…0bb4 | $NaN19,547,197.641771 $Stag | ||
| 0x415ffc5b…9c46be | Transfer | 21,183,033 | 18 days agoTue, 28 Jul 2026 01:04:04 UTC | 0x2faa…24ff | OUT | 0x693c…726b | $NaN19,547,197.641771 $Stag | ||
| 0xffabda33…1c9fca | Transfer | 21,119,628 | 19 days agoMon, 27 Jul 2026 23:18:06 UTC | 0x2faa…24ff | OUT | 0x1f99…d0f1 | $NaN10,000,000.000000 $Stag | ||
| 0xfe2185c0…243c45 | Transfer | 21,113,145 | 19 days agoMon, 27 Jul 2026 23:07:15 UTC | 0xccec…cf3d | IN | 0x2faa…24ff | $NaN10,000,000.000000 $Stag | ||
| 0x18f9812d…5d4e05 | Transfer | 20,936,264 | 19 days agoMon, 27 Jul 2026 18:11:40 UTC | 0x2faa…24ff | OUT | 0xed86…8db7 | $NaN14,285,401.665158 $Stag | ||
| 0x4a92614d…802ef0 | Transfer | 20,865,684 | 19 days agoMon, 27 Jul 2026 16:11:29 UTC | 0x2faa…24ff | OUT | 0x1f6f…ddcf | $NaN27,587,014.907076 $Stag | ||
| 0xb387232e…78c21c | Transfer | 20,795,031 | 19 days agoMon, 27 Jul 2026 14:13:39 UTC | 0x1600…35fe | IN | 0x2faa…24ff | $NaN14,285,401.665158 $Stag | ||
| 0x0d3ac7f4…142192 | Transfer | 20,584,634 | 19 days agoMon, 27 Jul 2026 08:21:44 UTC | 0xcaf7…5d11 | IN | 0x2faa…24ff | $0.001 DIH | ||
| 0xe2d1f1ff…66f2d6 | Transfer | 16,733,744 | 24 days agoWed, 22 Jul 2026 21:03:09 UTC | 0x693c…726b | IN | 0x2faa…24ff | $NaN2,999,999.999999 $Stag | ||
| 0x12010212…e57b14 | Transfer | 16,733,680 | 24 days agoWed, 22 Jul 2026 21:03:02 UTC | 0x693c…726b | IN | 0x2faa…24ff | $NaN2,999,999.999999 $Stag | ||
| 0xe1791a8b…10df51 | Transfer | 16,733,588 | 24 days agoWed, 22 Jul 2026 21:02:53 UTC | 0x693c…726b | IN | 0x2faa…24ff | $NaN2,999,999.999999 $Stag | ||
| 0x569a8a4b…52dc63 | Transfer | 15,126,134 | 25 days agoTue, 21 Jul 2026 00:18:09 UTC | 0x1f6f…ddcf | IN | 0x2faa…24ff | $NaN10,499,999.999999 $Stag | ||
| 0xa638bf00…5468f2 | Transfer | 15,124,398 | 25 days agoTue, 21 Jul 2026 00:15:16 UTC | 0x1f6f…ddcf | IN | 0x2faa…24ff | $NaN17,087,014.907076 $Stag | ||
| 0xb8eda228…ecaece | Transfer | 15,121,735 | 25 days agoTue, 21 Jul 2026 00:10:48 UTC | 0x2faa…24ff | OUT | 0x5db7…575f | $NaN7,999,999.999999 $Stag | ||
| 0xea74ffc9…3906c6 | Transfer | 15,120,306 | 25 days agoTue, 21 Jul 2026 00:08:25 UTC | 0x2faa…24ff | OUT | 0x8b91…4a1b | $0.000.000000 $Stag | ||
| 0xea74ffc9…3906c6 | Transfer | 15,120,306 | 25 days agoTue, 21 Jul 2026 00:08:25 UTC | 0x2faa…24ff | OUT | 0x1600…35fe | $NaN4,312,739.995553 $Stag | ||
| 0xea74ffc9…3906c6 | Transfer | 15,120,306 | 25 days agoTue, 21 Jul 2026 00:08:25 UTC | 0x2faa…24ff | OUT | 0x1600…35fe | $NaN4,185,894.701566 $Stag | ||
| 0xea74ffc9…3906c6 | Transfer | 15,120,306 | 25 days agoTue, 21 Jul 2026 00:08:25 UTC | 0x2faa…24ff | OUT | 0xbbe5…3fb0 | $NaN4,185,894.701566 $Stag | ||
| 0x15cdb3bf…e04733 | Transfer | 15,117,830 | 25 days agoTue, 21 Jul 2026 00:04:16 UTC | 0x2faa…24ff | OUT | 0xbfc5…59f4 | $0.000.000000 $Stag | ||
| 0x15cdb3bf…e04733 | Transfer | 15,117,830 | 25 days agoTue, 21 Jul 2026 00:04:16 UTC | 0x2faa…24ff | OUT | 0x1600…35fe | $NaN6,667,021.830012 $Stag | ||
| 0x15cdb3bf…e04733 | Transfer | 15,117,830 | 25 days agoTue, 21 Jul 2026 00:04:16 UTC | 0x2faa…24ff | OUT | 0x4b9d…c261 | $NaN6,470,932.952659 $Stag | ||
| 0x15cdb3bf…e04733 | Transfer | 15,117,830 | 25 days agoTue, 21 Jul 2026 00:04:16 UTC | 0x2faa…24ff | OUT | 0xbbe5…3fb0 | $NaN6,470,932.952659 $Stag | ||
| 0x0e6a3fdb…7f94c8 | Transfer | 15,116,786 | 26 days agoTue, 21 Jul 2026 00:02:32 UTC | 0xbfc5…59f4 | IN | 0x2faa…24ff | $NaN19,608,887.735331 $Stag | ||
| 0xf539ab52…ba1cec | Transfer | 15,116,080 | 26 days agoTue, 21 Jul 2026 00:01:21 UTC | 0x2faa…24ff | OUT | 0xbfc5…59f4 | $NaN19,608,887.735331 $Stag |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 21,124,269 | 19 days agoMon, 27 Jul 2026 23:25:50 UTC | 0xc2c2ad…40f968 | CALL | claim | 0x2faa…24ff | OUT | 0x693c…726b | 0.02481 ETH |
| 21,119,219 | 19 days agoMon, 27 Jul 2026 23:17:25 UTC | 0x431ebc…1505bd | CALL | claim | 0x2faa…24ff | OUT | 0x1f99…d0f1 | 0.00929 ETH |
| 20,865,120 | 19 days agoMon, 27 Jul 2026 16:10:32 UTC | 0xd05c2b…463916 | CALL | claim | 0x2faa…24ff | OUT | 0x1f6f…ddcf | 0.02014 ETH |
| 15,129,237 | 25 days agoTue, 21 Jul 2026 00:23:19 UTC | 0xd760ca…a3803c | CALL | claim | 0x2faa…24ff | OUT | 0x5db7…575f | 0.00440 ETH |
| 15,122,173 | 25 days agoTue, 21 Jul 2026 00:11:32 UTC | 0x2605c0…12f585 | CALL | forwardProceeds | 0x1f6d…fe2a | IN | 0x2faa…24ff | 0.0855 ETH |
| 10,716,288 | 31 days agoWed, 15 Jul 2026 21:25:53 UTC | 0xefc8c8…bc1d0f | CALL | forwardProceeds | 0x101a…3082 | IN | 0x2faa…24ff | 0.009 ETH |
| 10,715,718 | 31 days agoWed, 15 Jul 2026 21:24:56 UTC | 0xf3a011…c6bee5 | CALL | forwardProceeds | 0x1f6d…fe2a | IN | 0x2faa…24ff | 0.0405 ETH |
| 10,660,832 | 31 days agoWed, 15 Jul 2026 19:53:25 UTC | 0x69d4fd…316d45 | CALL | forwardProceeds | 0x101a…3082 | IN | 0x2faa…24ff | 0.009 ETH |