| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
// SPDX-License-Identifier: MIT
pragma solidity 0.8.26;
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {IYieldStrategy} from "../interfaces/IYieldStrategy.sol";
/**
* @title QuantisIdleVault
* @notice The IDLE WALLETS pillar of the Quantis Idle Protocol:
*
* deposit USDG/ETH -> yield strategy (Morpho/Lido-style adapter)
* -> yield earned -> 10% protocol fee -> buyback & burn $QUANTIS
*
* Users deposit an enabled asset (native ETH = address(0), or an ERC-20
* such as USDG) and receive shares of that asset's pool. The owner may
* route pooled funds into ONE strategy adapter per asset; yield the
* strategy earns appreciates every share. `harvest` skims the 10%
* protocol fee FROM PROFIT ONLY (never from principal) and sends it to
* the immutable fee sink (the QuantisBuybackBurner); the remaining 90%
* of profit stays in the pool for depositors.
*
* Share math uses virtual shares (OpenZeppelin ERC-4626 style) so a
* first-depositor donation cannot inflate the share price and steal
* later deposits.
*
* @dev Owner powers, in full: enableAsset, setStrategy (only while the old
* strategy is empty), invest / divest (move funds ONLY between this vault
* and the configured strategy), transferOwnership / renounceOwnership.
* There is NO owner path that sends user funds anywhere else: no sweep, no
* emergency withdraw, no pause. `harvest` is permissionless (it moves
* nothing but the fee, to a fixed sink). Fee-on-transfer deposits credit
* the amount ACTUALLY received; rebasing tokens must not be enabled.
*/
contract QuantisIdleVault is Ownable, ReentrancyGuard {
using SafeERC20 for IERC20;
/// @notice Marks this as the Quantis stack (also diverges runtime bytecode
/// from sibling ports so the explorer verifies it under its own name).
string public constant STACK_ID = "quantis-v1";
/// @notice Protocol fee on harvested PROFIT, in bps: 10%.
uint256 public constant PROTOCOL_FEE_BPS = 1000;
/// @dev Virtual shares offset, kills the ERC-4626 first-depositor inflation attack.
uint256 private constant VIRT_SHARES = 1e6;
/// @notice Where every protocol fee goes: the QuantisBuybackBurner. Immutable.
address payable public immutable feeSink;
struct AssetPool {
bool enabled;
IYieldStrategy strategy; // optional; address(0) = deposits stay idle here
uint256 totalShares;
uint256 idle; // asset units held by this contract for the pool
uint256 principal; // high-water mark: fee is only ever taken above it
}
/// @notice asset (address(0) = ETH) => its pool.
mapping(address => AssetPool) public pools;
/// @notice asset => user => shares.
mapping(address => mapping(address => uint256)) public sharesOf;
/// @notice Every enabled asset, in enable order.
address[] public assetList;
event AssetEnabled(address indexed asset);
event StrategySet(address indexed asset, address indexed strategy);
event Deposited(address indexed asset, address indexed user, uint256 amount, uint256 shares);
event Withdrawn(address indexed asset, address indexed user, uint256 amount, uint256 shares);
event Invested(address indexed asset, uint256 amount);
event Divested(address indexed asset, uint256 amount);
event Harvested(address indexed asset, uint256 profit, uint256 fee);
constructor(address payable _feeSink, address _owner) Ownable(_owner) {
require(_feeSink != address(0), "zero sink");
feeSink = _feeSink;
}
/// @dev Only strategies ever send plain ETH here (on withdraw); deposits go
/// through depositETH. Direct donations would sit outside `idle` and be
/// picked up by nothing, so refuse them to keep accounting exact.
receive() external payable {
require(address(pools[address(0)].strategy) == msg.sender, "use depositETH");
}
// ─── views ───────────────────────────────────────────────────────────────────
function assetCount() external view returns (uint256) {
return assetList.length;
}
/// @notice Everything the pool holds for `asset`: idle here plus at work in
/// the strategy, yield included.
function totalAssets(address asset) public view returns (uint256) {
AssetPool storage p = pools[asset];
uint256 inStrategy = address(p.strategy) == address(0) ? 0 : p.strategy.totalAssets();
return p.idle + inStrategy;
}
/// @notice Value of `user`'s shares in asset units.
function balanceOf(address asset, address user) external view returns (uint256) {
return _toAssets(pools[asset], asset, sharesOf[asset][user]);
}
function _toShares(AssetPool storage p, address asset, uint256 amount) private view returns (uint256) {
return (amount * (p.totalShares + VIRT_SHARES)) / (totalAssets(asset) + 1);
}
function _toAssets(AssetPool storage p, address asset, uint256 shares) private view returns (uint256) {
return (shares * (totalAssets(asset) + 1)) / (p.totalShares + VIRT_SHARES);
}
// ─── owner configuration ─────────────────────────────────────────────────────
/// @notice Allow deposits of `asset` (address(0) = native ETH). Enable only
/// plain, non-rebasing tokens: a rebasing balance would drift away
/// from the pool's share accounting.
function enableAsset(address asset) external onlyOwner {
require(!pools[asset].enabled, "already enabled");
pools[asset].enabled = true;
assetList.push(asset);
emit AssetEnabled(asset);
}
/// @notice Point `asset` at a strategy adapter. Only allowed while the
/// current strategy holds nothing (divest first), so funds can never
/// be orphaned in an unhooked strategy. address(0) unsets.
function setStrategy(address asset, address strategy) external onlyOwner {
AssetPool storage p = pools[asset];
require(p.enabled, "asset not enabled");
if (address(p.strategy) != address(0)) {
require(p.strategy.totalAssets() == 0, "divest first");
}
if (strategy != address(0)) {
require(IYieldStrategy(strategy).asset() == asset, "asset mismatch");
}
p.strategy = IYieldStrategy(strategy);
emit StrategySet(asset, strategy);
}
/// @notice Move idle funds into the configured strategy. Vault -> strategy
/// only; there is no way to route funds to any other address.
function invest(address asset, uint256 amount) external onlyOwner nonReentrant {
AssetPool storage p = pools[asset];
require(address(p.strategy) != address(0), "no strategy");
require(amount > 0 && amount <= p.idle, "bad amount");
p.idle -= amount;
if (asset == address(0)) {
p.strategy.deposit{value: amount}(amount);
} else {
IERC20(asset).forceApprove(address(p.strategy), amount);
p.strategy.deposit(amount);
IERC20(asset).forceApprove(address(p.strategy), 0);
}
emit Invested(asset, amount);
}
/// @notice Pull funds back from the strategy into the vault.
function divest(address asset, uint256 amount) external onlyOwner nonReentrant {
_divest(asset, amount);
}
function _divest(address asset, uint256 amount) private {
AssetPool storage p = pools[asset];
require(address(p.strategy) != address(0), "no strategy");
uint256 before = _heldBalance(asset);
p.strategy.withdraw(amount);
uint256 received = _heldBalance(asset) - before;
p.idle += received;
emit Divested(asset, received);
}
function _heldBalance(address asset) private view returns (uint256) {
return asset == address(0) ? address(this).balance : IERC20(asset).balanceOf(address(this));
}
// ─── deposits and withdrawals ────────────────────────────────────────────────
/// @notice Deposit native ETH, receive shares of the ETH pool.
function depositETH() external payable nonReentrant {
_deposit(address(0), msg.value, msg.value);
}
/// @notice Deposit an enabled ERC-20. The amount ACTUALLY received (after any
/// transfer fee the token itself takes) is what gets credited.
function deposit(address asset, uint256 amount) external nonReentrant {
require(asset != address(0), "use depositETH");
uint256 before = IERC20(asset).balanceOf(address(this));
IERC20(asset).safeTransferFrom(msg.sender, address(this), amount);
uint256 received = IERC20(asset).balanceOf(address(this)) - before;
_deposit(asset, amount, received);
}
function _deposit(address asset, uint256 sent, uint256 received) private {
AssetPool storage p = pools[asset];
require(p.enabled, "asset not enabled");
require(sent > 0 && received > 0, "zero deposit");
// Shares priced BEFORE this deposit's funds are counted: for ETH the value
// already sits in the contract balance, but `idle` (which totalAssets
// reads) is only bumped after, so both asset types price identically.
uint256 shares = (received * (p.totalShares + VIRT_SHARES)) / (totalAssets(asset) + 1);
require(shares > 0, "deposit too small");
p.idle += received;
p.principal += received;
p.totalShares += shares;
sharesOf[asset][msg.sender] += shares;
emit Deposited(asset, msg.sender, received, shares);
}
/// @notice Redeem `shares` of `asset` for the underlying (plus earned yield).
/// Pulls from the strategy automatically if the vault's idle balance
/// does not cover it.
function withdraw(address asset, uint256 shares) external nonReentrant {
AssetPool storage p = pools[asset];
require(shares > 0 && shares <= sharesOf[asset][msg.sender], "bad shares");
uint256 totalBefore = totalAssets(asset);
uint256 amount = (shares * (totalBefore + 1)) / (p.totalShares + VIRT_SHARES);
require(amount > 0, "nothing to withdraw");
// Principal leaves proportionally, so the unharvested-profit share of the
// pool (and the fee still owed on it) is unaffected by withdrawals.
uint256 principalCut = (amount * p.principal) / totalBefore;
if (principalCut > p.principal) principalCut = p.principal;
sharesOf[asset][msg.sender] -= shares;
p.totalShares -= shares;
p.principal -= principalCut;
if (p.idle < amount) {
_divest(asset, amount - p.idle);
require(p.idle >= amount, "strategy shortfall");
}
p.idle -= amount;
if (asset == address(0)) {
(bool ok, ) = msg.sender.call{value: amount}("");
require(ok, "eth send failed");
} else {
IERC20(asset).safeTransfer(msg.sender, amount);
}
emit Withdrawn(asset, msg.sender, amount, shares);
}
// ─── fee harvest ─────────────────────────────────────────────────────────────
/// @notice Skim the 10% protocol fee from profit above the principal
/// high-water mark and push it to the buyback burner. Permissionless:
/// the fee destination is immutable, so there is nothing to steer.
function harvest(address asset) external nonReentrant {
AssetPool storage p = pools[asset];
require(p.enabled, "asset not enabled");
uint256 total = totalAssets(asset);
require(total > p.principal, "no profit");
uint256 profit = total - p.principal;
uint256 fee = (profit * PROTOCOL_FEE_BPS) / 10000;
if (fee > 0) {
if (p.idle < fee) {
_divest(asset, fee - p.idle);
require(p.idle >= fee, "strategy shortfall");
}
p.idle -= fee;
if (asset == address(0)) {
(bool ok, ) = feeSink.call{value: fee}("");
require(ok, "fee send failed");
} else {
IERC20(asset).safeTransfer(feeSink, fee);
}
}
// Everything left (principal + 90% of profit) is the new high-water mark.
p.principal = totalAssets(asset);
emit Harvested(asset, profit, fee);
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "_feeSink",
"type": "address",
"internalType": "address payable"
},
{
"name": "_owner",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"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": "AssetEnabled",
"type": "event",
"inputs": [
{
"name": "asset",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "Deposited",
"type": "event",
"inputs": [
{
"name": "asset",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "user",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "shares",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Divested",
"type": "event",
"inputs": [
{
"name": "asset",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Harvested",
"type": "event",
"inputs": [
{
"name": "asset",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "profit",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "fee",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Invested",
"type": "event",
"inputs": [
{
"name": "asset",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "OwnershipTransferred",
"type": "event",
"inputs": [
{
"name": "previousOwner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "StrategySet",
"type": "event",
"inputs": [
{
"name": "asset",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "strategy",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "Withdrawn",
"type": "event",
"inputs": [
{
"name": "asset",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "user",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "shares",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "PROTOCOL_FEE_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "STACK_ID",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "assetCount",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "assetList",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "balanceOf",
"type": "function",
"inputs": [
{
"name": "asset",
"type": "address",
"internalType": "address"
},
{
"name": "user",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "deposit",
"type": "function",
"inputs": [
{
"name": "asset",
"type": "address",
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "depositETH",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "divest",
"type": "function",
"inputs": [
{
"name": "asset",
"type": "address",
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "enableAsset",
"type": "function",
"inputs": [
{
"name": "asset",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "feeSink",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address payable"
}
],
"stateMutability": "view"
},
{
"name": "harvest",
"type": "function",
"inputs": [
{
"name": "asset",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "invest",
"type": "function",
"inputs": [
{
"name": "asset",
"type": "address",
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "owner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "pools",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "enabled",
"type": "bool",
"internalType": "bool"
},
{
"name": "strategy",
"type": "address",
"internalType": "contract IYieldStrategy"
},
{
"name": "totalShares",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "idle",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "principal",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "renounceOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setStrategy",
"type": "function",
"inputs": [
{
"name": "asset",
"type": "address",
"internalType": "address"
},
{
"name": "strategy",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "sharesOf",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
},
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "totalAssets",
"type": "function",
"inputs": [
{
"name": "asset",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "transferOwnership",
"type": "function",
"inputs": [
{
"name": "newOwner",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "withdraw",
"type": "function",
"inputs": [
{
"name": "asset",
"type": "address",
"internalType": "address"
},
{
"name": "shares",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"type": "receive",
"stateMutability": "payable"
}
]0x60a03461014a57601f611b8938819003918201601f19168301916001600160401b0383118484101761014e57808492604094855283398101031261014a578051906001600160a01b0382169081830361014a57602001516001600160a01b038116919082900361014a578115610137575f80546001600160a01b031981168417825560405193916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a360017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055156101095750608052604051611a2690816101638239608051818181610d9f0152818161122301526112cf0152f35b62461bcd60e51b81526020600482015260096024820152687a65726f2073696e6b60b81b6044820152606490fd5b631e4fbdf760e01b5f525f60045260245ffd5b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080604052600436101561005e575b3615610018575f80fd5b5f805260016020527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb495461005c903360089190911c6001600160a01b031614611521565b005b5f803560e01c80630a7292f5146113595780630e5c011e146111335780632aef40241461103157806347e7ef2414610dce5780634b38474d14610d8a578063715018a614610d4657806372cb5d9714610b475780638da5cb5b14610b20578063a0b4b30114610ade578063a4063dbc14610a6e578063b29b86af14610a0b578063b9b8c2461461076f578063bb50431714610725578063be37822814610708578063eafe7a74146106ea578063f2fde38b14610677578063f3e0ffbf14610653578063f3fef3a3146103b2578063f6326fb31461020d5763f7888aec14610145575061000e565b3461020a57604036600319011261020a5761015e6113a9565b6101666113bf565b9060018060a01b038116918284526001602052604084209284526002602052604084209060018060a01b03165f526020526101a560405f2054916115a5565b90600182018092116101f6576001916101bd91611471565b91015491620f424083018093116101e25760206101da8484611484565b604051908152f35b634e487b7160e01b81526011600452602490fd5b634e487b7160e01b84526011600452602484fd5b80fd5b508060031936011261020a57610221611646565b80805260016020526040812061023a60ff825416611424565b341515806103ad575b1561037957600181018054620f42408101808211610365576102659034611471565b61026e856115a5565b9060018201809211610351579061028491611484565b928315610318576102b79160038260028794016102a2348254611598565b9055016102b0348254611598565b9055611598565b905581805260026020526040822060018060a01b0333165f5260205260405f206102e2828254611598565b9055604051903482526020820152815f8051602061197183398151915260403393a360015f805160206119d18339815191525580f35b60405162461bcd60e51b815260206004820152601160248201527019195c1bdcda5d081d1bdbc81cdb585b1b607a1b6044820152606490fd5b634e487b7160e01b86526011600452602486fd5b634e487b7160e01b85526011600452602485fd5b60405162461bcd60e51b815260206004820152600c60248201526b1e995c9bc819195c1bdcda5d60a21b6044820152606490fd5b610243565b503461020a57604036600319011261020a576103cc6113a9565b6024356103d7611646565b6001600160a01b0382168084526001602052604084209290919081151580610631575b156105ff57610408816115a5565b600181018082116105eb5761041d9084611471565b946001810195865490620f424082018092116105d7579061043d91611484565b95861561059c576104a7600293600384019261046484549261045f848d611471565b611484565b91808311610594575b50888b5260208681526040808d20335f908152925290208054610491908a90611464565b905561049e888254611464565b90558254611464565b9055019081549085821061056d575b50506104c3848254611464565b90558161055d578380808086335af16104da6114e3565b5015610526575b60405192835260208301527f91fb9d98b786c57d74c099ccd2beca1739e9f6a81fb49001ca465c4b7591bbe260403393a360015f805160206119d18339815191525580f35b60405162461bcd60e51b815260206004820152600f60248201526e195d1a081cd95b990819985a5b1959608a1b6044820152606490fd5b61056883338461174c565b6104e1565b61057a6105809287611464565b9061167e565b61058d84825410156114a2565b5f806104b6565b91505f61046d565b60405162461bcd60e51b81526020600482015260136024820152726e6f7468696e6720746f20776974686472617760681b6044820152606490fd5b634e487b7160e01b89526011600452602489fd5b634e487b7160e01b87526011600452602487fd5b60405162461bcd60e51b815260206004820152600a6024820152696261642073686172657360b01b6044820152606490fd5b50828552600260209081526040808720335f90815292529020548211156103fa565b503461020a57602036600319011261020a5760206101da6106726113a9565b6115a5565b503461020a57602036600319011261020a576106916113a9565b6106996117cd565b6001600160a01b031680156106d65781546001600160a01b03198116821783556001600160a01b03165f805160206119918339815191528380a380f35b631e4fbdf760e01b82526004829052602482fd5b503461020a578060031936011261020a576020600354604051908152f35b503461020a578060031936011261020a5760206040516103e88152f35b503461020a57604036600319011261020a5761075b6107426113a9565b61074a6117cd565b610752611646565b6024359061167e565b60015f805160206119d18339815191525580f35b503461097c57604036600319011261097c576107896113a9565b602435906107956117cd565b61079d611646565b60018060a01b031690815f52600160205260405f2060018060a01b03815460081c16906107cb82151561155e565b821515806109fd575b156109cb578491600282016107ea858254611464565b90558461088657505460081c6001600160a01b0316803b156108825781839160246040518094819363b6b55f2560e01b83528160048401525af180156108775761085e575b505060205f805160206119b1833981519152915b604051908152a260015f805160206119d18339815191525580f35b8161086891611401565b61087357825f61082f565b8280fd5b6040513d84823e3d90fd5b5080fd5b909150610894838286611864565b15610980575b50805460081c6001600160a01b0316803b1561097c575f809160246040518094819363b6b55f2560e01b83528860048401525af180156109715761095c575b505460081c6001600160a01b03166108f2848285611864565b1561090f575b5060205f805160206119b183398151915291610843565b61091981846118b1565b1561094857836109299184611915565b15610934575f6108f8565b635274afe760e01b83526004829052602483fd5b635274afe760e01b84526004839052602484fd5b6109699194505f90611401565b5f925f6108d9565b6040513d5f823e3d90fd5b5f80fd5b61098a81856118b1565b156109b8578261099a9185611915565b156109a5575f61089a565b82635274afe760e01b5f5260045260245ffd5b83635274afe760e01b5f5260045260245ffd5b60405162461bcd60e51b815260206004820152600a60248201526918985908185b5bdd5b9d60b21b6044820152606490fd5b5060028101548311156107d4565b3461097c575f36600319011261097c576040805190610a2a8183611401565b600a82526020820191697175616e7469732d763160b01b83528151928391602083525180918160208501528484015e5f828201840152601f01601f19168101030190f35b3461097c57602036600319011261097c576001600160a01b03610a8f6113a9565b165f52600160205260a060405f2080549060018101549060036002820154910154916040519360ff811615158552600180871b039060081c166020850152604084015260608301526080820152f35b3461097c57602036600319011261097c5760043560035481101561097c57610b076020916113d5565b905460405160039290921b1c6001600160a01b03168152f35b3461097c575f36600319011261097c575f546040516001600160a01b039091168152602090f35b3461097c57604036600319011261097c57610b606113a9565b610b686113bf565b90610b716117cd565b6001600160a01b03165f8181526001602052604090208054610b9560ff8216611424565b600881901c6001600160a01b031680610cb0575b506001600160a01b0384169384610c01575b610100600160a81b031990911660089190911b610100600160a81b03161790557f7a587acd0fd101cfe7d6d98bad768e91209a7ae91e55c3702570425bf0eae9bc5f80a3005b6040516338d52e0f60e01b8152602081600481895afa80156109715785915f91610c6b575b506001600160a01b031614610bbb5760405162461bcd60e51b815260206004820152600e60248201526d0c2e6e6cae840dad2e6dac2e8c6d60931b6044820152606490fd5b9150506020813d602011610ca8575b81610c8760209383611401565b8101031261097c57516001600160a01b038116810361097c57849087610c26565b3d9150610c7a565b6020600491604051928380926278744560e21b82525afa908115610971575f91610d14575b50610ce05784610ba9565b60405162461bcd60e51b815260206004820152600c60248201526b191a5d995cdd08199a5c9cdd60a21b6044820152606490fd5b90506020813d602011610d3e575b81610d2f60209383611401565b8101031261097c575185610cd5565b3d9150610d22565b3461097c575f36600319011261097c57610d5e6117cd565b5f80546001600160a01b0319811682556001600160a01b03165f805160206119918339815191528280a3005b3461097c575f36600319011261097c576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461097c57604036600319011261097c57610de76113a9565b602435610df2611646565b6001600160a01b03821690610e08821515611521565b6040516370a0823160e01b8152306004820152602081602481865afa908115610971575f91610fff575b50604051906323b872dd60e01b5f5233600452306024528260445260205f60648180885af160015f5114811615610fe0575b826040525f606052156109b8576370a0823160e01b8252306004830152602082602481875afa8015610971575f90610fac575b610ea19250611464565b92825f52600160205260405f2091610ebc60ff845416611424565b151580610fa3575b15610379576001820190815490620f42408201808311610f8f57610eeb610ef19188611471565b916115a5565b60018101809111610f8f57610f0591611484565b92831561031857610f31916003826002879401610f238a8254611598565b9055016102b0888254611598565b9055815f52600260205260405f2060018060a01b0333165f5260205260405f20610f5c828254611598565b905560405192835260208301525f8051602061197183398151915260403393a360015f805160206119d183398151915255005b634e487b7160e01b5f52601160045260245ffd5b50831515610ec4565b506020823d602011610fd8575b81610fc660209383611401565b8101031261097c57610ea19151610e97565b3d9150610fb9565b6001811516610ff657843b15153d151616610e64565b823d5f823e3d90fd5b90506020813d602011611029575b8161101a60209383611401565b8101031261097c575184610e32565b3d915061100d565b3461097c57602036600319011261097c5761104a6113a9565b6110526117cd565b6001600160a01b03165f8181526001602052604090205460ff166110fc57805f52600160205260405f20600160ff19825416179055600354600160401b8110156110e8578060016110a692016003556113d5565b81546001600160a01b0360039290921b91821b19169083901b1790557ffd732d206f79af7960b50a7ddc9483b904dbdd6e67a7846731623de726ae54e45f80a2005b634e487b7160e01b5f52604160045260245ffd5b60405162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e48195b98589b1959608a1b6044820152606490fd5b3461097c57602036600319011261097c5761114c6113a9565b611154611646565b60018060a01b03811690815f52600160205260405f209061117860ff835416611424565b611181816115a5565b9160038101928354808211156113285761119a91611464565b916103e883028381046103e81484151715610f8f57612710900491826111f8575b50905f80516020611951833981519152936111d8604094936115a5565b905582519182526020820152a260015f805160206119d183398151915255005b600201805491939291828110611302575b50611215828254611464565b9055846112b3575f808080847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af16112556114e3565b501561127c575f80516020611951833981519152936111d86040945b9293945050936111bb565b60405162461bcd60e51b815260206004820152600f60248201526e199959481cd95b990819985a5b1959608a1b6044820152606490fd5b5f80516020611951833981519152936040936111d8906112fd847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168a61174c565b611271565b61130f6113159184611464565b8561167e565b61132282825410156114a2565b86611209565b60405162461bcd60e51b81526020600482015260096024820152681b9bc81c1c9bd99a5d60ba1b6044820152606490fd5b3461097c57604036600319011261097c576113726113a9565b61137a6113bf565b6001600160a01b039182165f908152600260209081526040808320949093168252928352819020549051908152f35b600435906001600160a01b038216820361097c57565b602435906001600160a01b038216820361097c57565b6003548110156113ed5760035f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b601f909101601f19168101906001600160401b038211908210176110e857604052565b1561142b57565b60405162461bcd60e51b8152602060048201526011602482015270185cdcd95d081b9bdd08195b98589b1959607a1b6044820152606490fd5b91908203918211610f8f57565b81810292918115918404141715610f8f57565b811561148e570490565b634e487b7160e01b5f52601260045260245ffd5b156114a957565b60405162461bcd60e51b81526020600482015260126024820152711cdd1c985d1959de481cda1bdc9d19985b1b60721b6044820152606490fd5b3d1561151c573d906001600160401b0382116110e85760405191611511601f8201601f191660200184611401565b82523d5f602084013e565b606090565b1561152857565b60405162461bcd60e51b815260206004820152600e60248201526d0eae6ca40c8cae0dee6d2e88aa8960931b6044820152606490fd5b1561156557565b60405162461bcd60e51b815260206004820152600b60248201526a6e6f20737472617465677960a81b6044820152606490fd5b91908201809211610f8f57565b6001600160a01b039081165f908152600160205260409020805460081c90911690816115df576115dc915060025f915b0154611598565b90565b6020600492604051938480926278744560e21b82525afa918215610971575f92611611575b5060026115dc92916115d5565b91506020823d60201161163e575b8161162c60209383611401565b8101031261097c579051906002611604565b3d915061161f565b60025f805160206119d1833981519152541461166f5760025f805160206119d183398151915255565b633ee5aeb560e01b5f5260045ffd5b9060018060a01b03821691825f52600160205260405f2060018060a01b03815460081c16916116ae83151561155e565b6116b7816117f3565b93833b1561097c575f93602485926040519687938492632e1a7d4d60e01b845260048401525af1928315610971577f2253aebe2fe8682635bbe60d9b78df72efaf785a596910a8ad66e8c6e37584fd9461171f6002936117249360209761173c575b506117f3565b611464565b9101611731828254611598565b9055604051908152a2565b5f61174691611401565b5f611719565b916040519163a9059cbb60e01b5f5260018060a01b031660045260245260205f60448180865af19060015f51148216156117ac575b6040521561178c5750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b9060018115166117c457823b15153d15161690611781565b503d5f823e3d90fd5b5f546001600160a01b031633036117e057565b63118cdaa760e01b5f523360045260245ffd5b6001600160a01b03168061180657504790565b6020602491604051928380926370a0823160e01b82523060048301525afa908115610971575f91611835575090565b90506020813d60201161185c575b8161185060209383611401565b8101031261097c575190565b3d9150611843565b92916040519163095ea7b360e01b5f5260018060a01b031660045260245260205f60448180875af19260015f51148416156118a0575b50604052565b3d15903b151516909216915f61189a565b60405163095ea7b360e01b5f9081526001600160a01b03909316600452602483905290929160209060448180875af19260015f51148416156118f35750604052565b6001849294151661190c573b15153d151616915f61189a565b833d5f823e3d90fd5b92916040519163095ea7b360e01b5f5260018060a01b031660045260245260205f60448180875af19260015f51148416156118f3575060405256fe81ca9b2c230070eaa84787556b1aaf18bf1e2f07ea5d3dae4819db77a1a5b224f5681f9d0db1b911ac18ee83d515a1cf1051853a9eae418316a2fdf7dea427c58be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0c3f75dfc78f6efac88ad5abb5e606276b903647d97b2a62a1ef89840a658bbc39b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a2646970667358221220ad108a9eba318839d912762ff9689457d892a77ba4bacd92db831ccb17704e1364736f6c634300081a0033000000000000000000000000ed056ef68254b0b1e59e029f69da77f5b39cf02c000000000000000000000000b75e371c4c8c2114b5075fcb39cf5305fbc18305
0x6080604052600436101561005e575b3615610018575f80fd5b5f805260016020527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb495461005c903360089190911c6001600160a01b031614611521565b005b5f803560e01c80630a7292f5146113595780630e5c011e146111335780632aef40241461103157806347e7ef2414610dce5780634b38474d14610d8a578063715018a614610d4657806372cb5d9714610b475780638da5cb5b14610b20578063a0b4b30114610ade578063a4063dbc14610a6e578063b29b86af14610a0b578063b9b8c2461461076f578063bb50431714610725578063be37822814610708578063eafe7a74146106ea578063f2fde38b14610677578063f3e0ffbf14610653578063f3fef3a3146103b2578063f6326fb31461020d5763f7888aec14610145575061000e565b3461020a57604036600319011261020a5761015e6113a9565b6101666113bf565b9060018060a01b038116918284526001602052604084209284526002602052604084209060018060a01b03165f526020526101a560405f2054916115a5565b90600182018092116101f6576001916101bd91611471565b91015491620f424083018093116101e25760206101da8484611484565b604051908152f35b634e487b7160e01b81526011600452602490fd5b634e487b7160e01b84526011600452602484fd5b80fd5b508060031936011261020a57610221611646565b80805260016020526040812061023a60ff825416611424565b341515806103ad575b1561037957600181018054620f42408101808211610365576102659034611471565b61026e856115a5565b9060018201809211610351579061028491611484565b928315610318576102b79160038260028794016102a2348254611598565b9055016102b0348254611598565b9055611598565b905581805260026020526040822060018060a01b0333165f5260205260405f206102e2828254611598565b9055604051903482526020820152815f8051602061197183398151915260403393a360015f805160206119d18339815191525580f35b60405162461bcd60e51b815260206004820152601160248201527019195c1bdcda5d081d1bdbc81cdb585b1b607a1b6044820152606490fd5b634e487b7160e01b86526011600452602486fd5b634e487b7160e01b85526011600452602485fd5b60405162461bcd60e51b815260206004820152600c60248201526b1e995c9bc819195c1bdcda5d60a21b6044820152606490fd5b610243565b503461020a57604036600319011261020a576103cc6113a9565b6024356103d7611646565b6001600160a01b0382168084526001602052604084209290919081151580610631575b156105ff57610408816115a5565b600181018082116105eb5761041d9084611471565b946001810195865490620f424082018092116105d7579061043d91611484565b95861561059c576104a7600293600384019261046484549261045f848d611471565b611484565b91808311610594575b50888b5260208681526040808d20335f908152925290208054610491908a90611464565b905561049e888254611464565b90558254611464565b9055019081549085821061056d575b50506104c3848254611464565b90558161055d578380808086335af16104da6114e3565b5015610526575b60405192835260208301527f91fb9d98b786c57d74c099ccd2beca1739e9f6a81fb49001ca465c4b7591bbe260403393a360015f805160206119d18339815191525580f35b60405162461bcd60e51b815260206004820152600f60248201526e195d1a081cd95b990819985a5b1959608a1b6044820152606490fd5b61056883338461174c565b6104e1565b61057a6105809287611464565b9061167e565b61058d84825410156114a2565b5f806104b6565b91505f61046d565b60405162461bcd60e51b81526020600482015260136024820152726e6f7468696e6720746f20776974686472617760681b6044820152606490fd5b634e487b7160e01b89526011600452602489fd5b634e487b7160e01b87526011600452602487fd5b60405162461bcd60e51b815260206004820152600a6024820152696261642073686172657360b01b6044820152606490fd5b50828552600260209081526040808720335f90815292529020548211156103fa565b503461020a57602036600319011261020a5760206101da6106726113a9565b6115a5565b503461020a57602036600319011261020a576106916113a9565b6106996117cd565b6001600160a01b031680156106d65781546001600160a01b03198116821783556001600160a01b03165f805160206119918339815191528380a380f35b631e4fbdf760e01b82526004829052602482fd5b503461020a578060031936011261020a576020600354604051908152f35b503461020a578060031936011261020a5760206040516103e88152f35b503461020a57604036600319011261020a5761075b6107426113a9565b61074a6117cd565b610752611646565b6024359061167e565b60015f805160206119d18339815191525580f35b503461097c57604036600319011261097c576107896113a9565b602435906107956117cd565b61079d611646565b60018060a01b031690815f52600160205260405f2060018060a01b03815460081c16906107cb82151561155e565b821515806109fd575b156109cb578491600282016107ea858254611464565b90558461088657505460081c6001600160a01b0316803b156108825781839160246040518094819363b6b55f2560e01b83528160048401525af180156108775761085e575b505060205f805160206119b1833981519152915b604051908152a260015f805160206119d18339815191525580f35b8161086891611401565b61087357825f61082f565b8280fd5b6040513d84823e3d90fd5b5080fd5b909150610894838286611864565b15610980575b50805460081c6001600160a01b0316803b1561097c575f809160246040518094819363b6b55f2560e01b83528860048401525af180156109715761095c575b505460081c6001600160a01b03166108f2848285611864565b1561090f575b5060205f805160206119b183398151915291610843565b61091981846118b1565b1561094857836109299184611915565b15610934575f6108f8565b635274afe760e01b83526004829052602483fd5b635274afe760e01b84526004839052602484fd5b6109699194505f90611401565b5f925f6108d9565b6040513d5f823e3d90fd5b5f80fd5b61098a81856118b1565b156109b8578261099a9185611915565b156109a5575f61089a565b82635274afe760e01b5f5260045260245ffd5b83635274afe760e01b5f5260045260245ffd5b60405162461bcd60e51b815260206004820152600a60248201526918985908185b5bdd5b9d60b21b6044820152606490fd5b5060028101548311156107d4565b3461097c575f36600319011261097c576040805190610a2a8183611401565b600a82526020820191697175616e7469732d763160b01b83528151928391602083525180918160208501528484015e5f828201840152601f01601f19168101030190f35b3461097c57602036600319011261097c576001600160a01b03610a8f6113a9565b165f52600160205260a060405f2080549060018101549060036002820154910154916040519360ff811615158552600180871b039060081c166020850152604084015260608301526080820152f35b3461097c57602036600319011261097c5760043560035481101561097c57610b076020916113d5565b905460405160039290921b1c6001600160a01b03168152f35b3461097c575f36600319011261097c575f546040516001600160a01b039091168152602090f35b3461097c57604036600319011261097c57610b606113a9565b610b686113bf565b90610b716117cd565b6001600160a01b03165f8181526001602052604090208054610b9560ff8216611424565b600881901c6001600160a01b031680610cb0575b506001600160a01b0384169384610c01575b610100600160a81b031990911660089190911b610100600160a81b03161790557f7a587acd0fd101cfe7d6d98bad768e91209a7ae91e55c3702570425bf0eae9bc5f80a3005b6040516338d52e0f60e01b8152602081600481895afa80156109715785915f91610c6b575b506001600160a01b031614610bbb5760405162461bcd60e51b815260206004820152600e60248201526d0c2e6e6cae840dad2e6dac2e8c6d60931b6044820152606490fd5b9150506020813d602011610ca8575b81610c8760209383611401565b8101031261097c57516001600160a01b038116810361097c57849087610c26565b3d9150610c7a565b6020600491604051928380926278744560e21b82525afa908115610971575f91610d14575b50610ce05784610ba9565b60405162461bcd60e51b815260206004820152600c60248201526b191a5d995cdd08199a5c9cdd60a21b6044820152606490fd5b90506020813d602011610d3e575b81610d2f60209383611401565b8101031261097c575185610cd5565b3d9150610d22565b3461097c575f36600319011261097c57610d5e6117cd565b5f80546001600160a01b0319811682556001600160a01b03165f805160206119918339815191528280a3005b3461097c575f36600319011261097c576040517f000000000000000000000000ed056ef68254b0b1e59e029f69da77f5b39cf02c6001600160a01b03168152602090f35b3461097c57604036600319011261097c57610de76113a9565b602435610df2611646565b6001600160a01b03821690610e08821515611521565b6040516370a0823160e01b8152306004820152602081602481865afa908115610971575f91610fff575b50604051906323b872dd60e01b5f5233600452306024528260445260205f60648180885af160015f5114811615610fe0575b826040525f606052156109b8576370a0823160e01b8252306004830152602082602481875afa8015610971575f90610fac575b610ea19250611464565b92825f52600160205260405f2091610ebc60ff845416611424565b151580610fa3575b15610379576001820190815490620f42408201808311610f8f57610eeb610ef19188611471565b916115a5565b60018101809111610f8f57610f0591611484565b92831561031857610f31916003826002879401610f238a8254611598565b9055016102b0888254611598565b9055815f52600260205260405f2060018060a01b0333165f5260205260405f20610f5c828254611598565b905560405192835260208301525f8051602061197183398151915260403393a360015f805160206119d183398151915255005b634e487b7160e01b5f52601160045260245ffd5b50831515610ec4565b506020823d602011610fd8575b81610fc660209383611401565b8101031261097c57610ea19151610e97565b3d9150610fb9565b6001811516610ff657843b15153d151616610e64565b823d5f823e3d90fd5b90506020813d602011611029575b8161101a60209383611401565b8101031261097c575184610e32565b3d915061100d565b3461097c57602036600319011261097c5761104a6113a9565b6110526117cd565b6001600160a01b03165f8181526001602052604090205460ff166110fc57805f52600160205260405f20600160ff19825416179055600354600160401b8110156110e8578060016110a692016003556113d5565b81546001600160a01b0360039290921b91821b19169083901b1790557ffd732d206f79af7960b50a7ddc9483b904dbdd6e67a7846731623de726ae54e45f80a2005b634e487b7160e01b5f52604160045260245ffd5b60405162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e48195b98589b1959608a1b6044820152606490fd5b3461097c57602036600319011261097c5761114c6113a9565b611154611646565b60018060a01b03811690815f52600160205260405f209061117860ff835416611424565b611181816115a5565b9160038101928354808211156113285761119a91611464565b916103e883028381046103e81484151715610f8f57612710900491826111f8575b50905f80516020611951833981519152936111d8604094936115a5565b905582519182526020820152a260015f805160206119d183398151915255005b600201805491939291828110611302575b50611215828254611464565b9055846112b3575f808080847f000000000000000000000000ed056ef68254b0b1e59e029f69da77f5b39cf02c6001600160a01b03165af16112556114e3565b501561127c575f80516020611951833981519152936111d86040945b9293945050936111bb565b60405162461bcd60e51b815260206004820152600f60248201526e199959481cd95b990819985a5b1959608a1b6044820152606490fd5b5f80516020611951833981519152936040936111d8906112fd847f000000000000000000000000ed056ef68254b0b1e59e029f69da77f5b39cf02c6001600160a01b03168a61174c565b611271565b61130f6113159184611464565b8561167e565b61132282825410156114a2565b86611209565b60405162461bcd60e51b81526020600482015260096024820152681b9bc81c1c9bd99a5d60ba1b6044820152606490fd5b3461097c57604036600319011261097c576113726113a9565b61137a6113bf565b6001600160a01b039182165f908152600260209081526040808320949093168252928352819020549051908152f35b600435906001600160a01b038216820361097c57565b602435906001600160a01b038216820361097c57565b6003548110156113ed5760035f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b601f909101601f19168101906001600160401b038211908210176110e857604052565b1561142b57565b60405162461bcd60e51b8152602060048201526011602482015270185cdcd95d081b9bdd08195b98589b1959607a1b6044820152606490fd5b91908203918211610f8f57565b81810292918115918404141715610f8f57565b811561148e570490565b634e487b7160e01b5f52601260045260245ffd5b156114a957565b60405162461bcd60e51b81526020600482015260126024820152711cdd1c985d1959de481cda1bdc9d19985b1b60721b6044820152606490fd5b3d1561151c573d906001600160401b0382116110e85760405191611511601f8201601f191660200184611401565b82523d5f602084013e565b606090565b1561152857565b60405162461bcd60e51b815260206004820152600e60248201526d0eae6ca40c8cae0dee6d2e88aa8960931b6044820152606490fd5b1561156557565b60405162461bcd60e51b815260206004820152600b60248201526a6e6f20737472617465677960a81b6044820152606490fd5b91908201809211610f8f57565b6001600160a01b039081165f908152600160205260409020805460081c90911690816115df576115dc915060025f915b0154611598565b90565b6020600492604051938480926278744560e21b82525afa918215610971575f92611611575b5060026115dc92916115d5565b91506020823d60201161163e575b8161162c60209383611401565b8101031261097c579051906002611604565b3d915061161f565b60025f805160206119d1833981519152541461166f5760025f805160206119d183398151915255565b633ee5aeb560e01b5f5260045ffd5b9060018060a01b03821691825f52600160205260405f2060018060a01b03815460081c16916116ae83151561155e565b6116b7816117f3565b93833b1561097c575f93602485926040519687938492632e1a7d4d60e01b845260048401525af1928315610971577f2253aebe2fe8682635bbe60d9b78df72efaf785a596910a8ad66e8c6e37584fd9461171f6002936117249360209761173c575b506117f3565b611464565b9101611731828254611598565b9055604051908152a2565b5f61174691611401565b5f611719565b916040519163a9059cbb60e01b5f5260018060a01b031660045260245260205f60448180865af19060015f51148216156117ac575b6040521561178c5750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b9060018115166117c457823b15153d15161690611781565b503d5f823e3d90fd5b5f546001600160a01b031633036117e057565b63118cdaa760e01b5f523360045260245ffd5b6001600160a01b03168061180657504790565b6020602491604051928380926370a0823160e01b82523060048301525afa908115610971575f91611835575090565b90506020813d60201161185c575b8161185060209383611401565b8101031261097c575190565b3d9150611843565b92916040519163095ea7b360e01b5f5260018060a01b031660045260245260205f60448180875af19260015f51148416156118a0575b50604052565b3d15903b151516909216915f61189a565b60405163095ea7b360e01b5f9081526001600160a01b03909316600452602483905290929160209060448180875af19260015f51148416156118f35750604052565b6001849294151661190c573b15153d151616915f61189a565b833d5f823e3d90fd5b92916040519163095ea7b360e01b5f5260018060a01b031660045260245260205f60448180875af19260015f51148416156118f3575060405256fe81ca9b2c230070eaa84787556b1aaf18bf1e2f07ea5d3dae4819db77a1a5b224f5681f9d0db1b911ac18ee83d515a1cf1051853a9eae418316a2fdf7dea427c58be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0c3f75dfc78f6efac88ad5abb5e606276b903647d97b2a62a1ef89840a658bbc39b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a2646970667358221220ad108a9eba318839d912762ff9689457d892a77ba4bacd92db831ccb17704e1364736f6c634300081a0033
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x5c2272…074c70 | 2 days agoSat, 15 Aug 2026 19:53:29 UTC | 0x8be007…57e0 | [0] 0x000000000000…00000000 [1] 0x000000000000…fbc18305 |
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| no token transfers for this address yet | |||||||||
| 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 | |||||||||
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| no internal transactions found for this address yet (traced blocks + on-demand) | ||||||||
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| no transactions indexed for this address yet | |||||||||