// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
import {Ownable} from '@solady/auth/Ownable.sol';
import {IPoolManager} from '@uniswap/v4-core/src/interfaces/IPoolManager.sol';
import {IHooks} from '@uniswap/v4-core/src/libraries/Hooks.sol';
import {StateLibrary} from '@uniswap/v4-core/src/libraries/StateLibrary.sol';
import {TickMath} from '@uniswap/v4-core/src/libraries/TickMath.sol';
import {BalanceDelta} from '@uniswap/v4-core/src/types/BalanceDelta.sol';
import {Currency, CurrencyLibrary} from '@uniswap/v4-core/src/types/Currency.sol';
import {PoolId, PoolIdLibrary} from '@uniswap/v4-core/src/types/PoolId.sol';
import {PoolKey} from '@uniswap/v4-core/src/types/PoolKey.sol';
import {ModifyLiquidityParams} from '@uniswap/v4-core/src/types/PoolOperation.sol';
import {LiquidityAmounts} from '@uniswap/v4-core/test/utils/LiquidityAmounts.sol';
import {PositionManager} from '@flaunch/PositionManager.sol';
import {CurrencySettler} from '@flaunch/libraries/CurrencySettler.sol';
import {BaseSubscriber} from '@flaunch/subscribers/Base.sol';
import {TickFinder} from '@flaunch/types/TickFinder.sol';
import {IBuyBackAndBurnFlay} from '@flaunch-interfaces/IBuyBackAndBurnFlay.sol';
import {IFLETH} from '@flaunch-interfaces/IFLETH.sol';
/**
* Collects ETH and flETH from external contracts and when a certain threshold is reached
* then the total amount will be spent on buying $FLAY token from a specified PoolKey and
* burning it.
*/
contract BuyBackAndBurnFlay is IBuyBackAndBurnFlay, BaseSubscriber, Ownable {
using CurrencyLibrary for Currency;
using CurrencySettler for Currency;
using PoolIdLibrary for PoolKey;
using StateLibrary for IPoolManager;
using TickFinder for int24;
/// The `dEaD` address to burn our $FLAY tokens to
address public constant BURN_ADDRESS = 0x000000000000000000000000000000000000dEaD;
/// The amount of ETH that must be reached before buying $FLAY
uint public ethThreshold;
/// The FLETH contract that is used by the Flaunch protocol
IFLETH public immutable fleth;
/// The $FLAY PoolKey that we will be making buys against
PoolKey public flayPoolKey;
/// The {PoolManager} contract
IPoolManager public immutable poolManager;
/// The buy position information
PositionInfo public positionInfo;
/// Stores the last recorded ETH balance for event emissions
uint internal _storedEthBalance;
/**
* Sets our {Notifier} to parent contract to lock down calls and references our FLETH
* contract address.
*/
constructor(
address _fleth,
address _poolManager,
address _notifier
) BaseSubscriber(_notifier) {
fleth = IFLETH(_fleth);
poolManager = IPoolManager(_poolManager);
// Set our initial ETH threshold and emit the corresponding event
ethThreshold = 1 ether;
emit ThresholdUpdated(ethThreshold);
_initializeOwner(msg.sender);
}
/**
* Called when the contract is subscribed to the Notifier.
*
* We have no subscription requirements, so we can just confirm immediately.
*
* @dev This must return `true` to be subscribed.
*/
function subscribe(
bytes memory /* _data */
) public view override(BaseSubscriber, IBuyBackAndBurnFlay) onlyNotifier returns (bool) {
return true;
}
/**
* If we have reached a specific threshold of combined ETH and flETH then we make a swap
* to buy $FLAY tokens and then burn them.
*
* @dev Called when `afterSwap` is triggered.
*
* @param _key The notification key
*/
function notify(
PoolId,
/* _poolId */
bytes4 _key,
bytes calldata /* _data */
) public override(BaseSubscriber, IBuyBackAndBurnFlay) onlyNotifier {
// We only want to deal with the `afterSwap` key
if (_key != IHooks.afterSwap.selector) {
return;
}
// Find the combined balance of flETH (ETH will be converted to flETH on receipt)
uint ethBalance = fleth.balanceOf(address(this));
// If the eth balance has changed since the last time we hit this notification, then we
// want to send an updated event to notify.
// Confirm that we have surpassed the defined threshold
if (ethBalance < ethThreshold) {
// If we have not crossed the threshold, then we won't hit this check at the end of
// this function call due to exiting early. For this reason we call it within this
// conditional.
_emitEthBalance(ethBalance);
return;
}
// Confirm that we have a valid PoolKey
if (flayPoolKey.tickSpacing == 0) {
_emitEthBalance(ethBalance);
return;
}
/**
* We need to create a liquidity position that puts ETH into a position. This means
* that we will be creating a token buy position 1 tick under the current, just like
* the {BidWall} contract does.
*
* If we have an existing position then we need to withdraw from this and recreate
* the position with the combined ETH.
*/
// Check if the native token is `currency0`
bool nativeIsZero = address(fleth) == Currency.unwrap(flayPoolKey.currency0);
// If our position has already been initialized, then we need to remove any
// existing liquidity to get any earned FLAY and recover any unspent ETH.
if (positionInfo.initialized) {
// Get our existing liquidity for the position
(uint128 liquidityBefore,,) = poolManager.getPositionInfo({
poolId: flayPoolKey.toId(),
owner: address(this),
tickLower: positionInfo.tickLower,
tickUpper: positionInfo.tickUpper,
salt: ''
});
// Remove the current liquidity from our position
_modifyAndSettleLiquidity({
_tickLower: positionInfo.tickLower, _tickUpper: positionInfo.tickUpper, _liquidityDelta: -int128(liquidityBefore)
});
} else {
// Mark our position as initialized
positionInfo.initialized = true;
}
// Increase our spent balance
positionInfo.spent += ethBalance;
// If we have any FLAY tokens held in our contract, then we want to burn them
Currency flayToken = (nativeIsZero) ? flayPoolKey.currency1 : flayPoolKey.currency0;
uint tokenBalance = flayToken.balanceOfSelf();
if (tokenBalance != 0) {
flayToken.transfer(BURN_ADDRESS, tokenBalance);
positionInfo.burned += tokenBalance;
emit BurnBabyBurn(tokenBalance);
}
// Get the current tick from the pool
(, int24 currentTick,,) = poolManager.getSlot0(flayPoolKey.toId());
// Determine a base tick just outside of the current tick
int24 baseTick = nativeIsZero ? currentTick + 1 : currentTick - 1;
// Calculate the new tick range and liquidity values
int24 newTickLower;
int24 newTickUpper;
uint128 liquidityDelta;
if (nativeIsZero) {
newTickLower = baseTick.validTick(false);
newTickUpper = newTickLower + TickFinder.TICK_SPACING;
liquidityDelta = LiquidityAmounts.getLiquidityForAmount0({
sqrtPriceAX96: TickMath.getSqrtPriceAtTick(newTickLower),
sqrtPriceBX96: TickMath.getSqrtPriceAtTick(newTickUpper),
amount0: ethBalance
});
} else {
newTickUpper = baseTick.validTick(true);
newTickLower = newTickUpper - TickFinder.TICK_SPACING;
liquidityDelta = LiquidityAmounts.getLiquidityForAmount1({
sqrtPriceAX96: TickMath.getSqrtPriceAtTick(newTickLower),
sqrtPriceBX96: TickMath.getSqrtPriceAtTick(newTickUpper),
amount1: ethBalance
});
}
// Modify the liquidity to add our position
_modifyAndSettleLiquidity({_tickLower: newTickLower, _tickUpper: newTickUpper, _liquidityDelta: int128(liquidityDelta)});
// Update the position tick range
positionInfo.tickLower = newTickLower;
positionInfo.tickUpper = newTickUpper;
// After modifying liquidity, check our updated ETH balance
_emitEthBalance(fleth.balanceOf(address(this)));
}
/**
* Updates the ETH threshold that must be reached to trigger a buy back.
*
* @dev This can only be called by the contract Owner.
*
* @param _ethThreshold The new ETH threshold
*/
function setEthThreshold(
uint _ethThreshold
) public onlyOwner {
ethThreshold = _ethThreshold;
emit ThresholdUpdated(_ethThreshold);
}
/**
* Updates the $FLAY PoolKey that actions the swap.
*
* @dev This can only be called by the contract Owner.
*
* @param _poolKey The new ETH threshold
*/
function setPoolKey(
PoolKey memory _poolKey
) public onlyOwner {
flayPoolKey = _poolKey;
emit PoolKeyUpdated(_poolKey);
}
/**
* This function will only be called by other functions via the PositionManager, which will already
* hold the Uniswap V4 PoolManager key. It is for this reason we can interact openly with the
* Uniswap V4 protocol without requiring a separate callback.
*
* @param _tickLower The lower tick of our BidWall position
* @param _tickUpper The upper tick of our BidWall position
* @param _liquidityDelta The liquidity delta modifying the position
*/
function _modifyAndSettleLiquidity(
int24 _tickLower,
int24 _tickUpper,
int128 _liquidityDelta
) internal {
(BalanceDelta delta_,) = poolManager.modifyLiquidity({
key: flayPoolKey,
params: ModifyLiquidityParams({tickLower: _tickLower, tickUpper: _tickUpper, liquidityDelta: _liquidityDelta, salt: ''}),
hookData: ''
});
if (delta_.amount0() < 0) {
flayPoolKey.currency0.settle(poolManager, address(this), uint128(-delta_.amount0()), false);
} else if (delta_.amount0() > 0) {
poolManager.take(flayPoolKey.currency0, address(this), uint128(delta_.amount0()));
}
if (delta_.amount1() < 0) {
flayPoolKey.currency1.settle(poolManager, address(this), uint128(-delta_.amount1()), false);
} else if (delta_.amount1() > 0) {
poolManager.take(flayPoolKey.currency1, address(this), uint128(delta_.amount1()));
}
}
/**
* Checks the flETH balance held by the contract and emits an event if it has changed.
*/
function _emitEthBalance(
uint _ethBalance
) internal {
if (_ethBalance == _storedEthBalance) {
return;
}
// Update our internally stored ETH balance and emit our event
_storedEthBalance = _ethBalance;
emit EthBalanceUpdated(_ethBalance);
}
/**
* The contract should be able to receive ETH from any source.
*/
receive() external payable {
// Convert any ETH that we receive into FLETH
fleth.deposit{value: msg.value}(0);
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "_fleth",
"type": "address",
"internalType": "address"
},
{
"name": "_poolManager",
"type": "address",
"internalType": "address"
},
{
"name": "_notifier",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"name": "AlreadyInitialized",
"type": "error",
"inputs": []
},
{
"name": "InvalidNotifier",
"type": "error",
"inputs": [
{
"name": "_sender",
"type": "address",
"internalType": "address"
},
{
"name": "_validNotifier",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "NewOwnerIsZeroAddress",
"type": "error",
"inputs": []
},
{
"name": "NoHandoverRequest",
"type": "error",
"inputs": []
},
{
"name": "Unauthorized",
"type": "error",
"inputs": []
},
{
"name": "BurnBabyBurn",
"type": "event",
"inputs": [
{
"name": "_flayBurned",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "EthBalanceUpdated",
"type": "event",
"inputs": [
{
"name": "_ethBalance",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "OwnershipHandoverCanceled",
"type": "event",
"inputs": [
{
"name": "pendingOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "OwnershipHandoverRequested",
"type": "event",
"inputs": [
{
"name": "pendingOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "OwnershipTransferred",
"type": "event",
"inputs": [
{
"name": "oldOwner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "PoolKeyUpdated",
"type": "event",
"inputs": [
{
"name": "_poolKey",
"type": "tuple",
"indexed": false,
"components": [
{
"name": "currency0",
"type": "address",
"internalType": "Currency"
},
{
"name": "currency1",
"type": "address",
"internalType": "Currency"
},
{
"name": "fee",
"type": "uint24",
"internalType": "uint24"
},
{
"name": "tickSpacing",
"type": "int24",
"internalType": "int24"
},
{
"name": "hooks",
"type": "address",
"internalType": "contract IHooks"
}
],
"internalType": "struct PoolKey"
}
],
"anonymous": false
},
{
"name": "ThresholdUpdated",
"type": "event",
"inputs": [
{
"name": "_ethThreshold",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "BURN_ADDRESS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "cancelOwnershipHandover",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "completeOwnershipHandover",
"type": "function",
"inputs": [
{
"name": "pendingOwner",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "ethThreshold",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "flayPoolKey",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "currency0",
"type": "address",
"internalType": "Currency"
},
{
"name": "currency1",
"type": "address",
"internalType": "Currency"
},
{
"name": "fee",
"type": "uint24",
"internalType": "uint24"
},
{
"name": "tickSpacing",
"type": "int24",
"internalType": "int24"
},
{
"name": "hooks",
"type": "address",
"internalType": "contract IHooks"
}
],
"stateMutability": "view"
},
{
"name": "fleth",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IFLETH"
}
],
"stateMutability": "view"
},
{
"name": "notifier",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "notify",
"type": "function",
"inputs": [
{
"name": "",
"type": "bytes32",
"internalType": "PoolId"
},
{
"name": "_key",
"type": "bytes4",
"internalType": "bytes4"
},
{
"name": "",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "owner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "result",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "ownershipHandoverExpiresAt",
"type": "function",
"inputs": [
{
"name": "pendingOwner",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "result",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "poolManager",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IPoolManager"
}
],
"stateMutability": "view"
},
{
"name": "positionInfo",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "initialized",
"type": "bool",
"internalType": "bool"
},
{
"name": "tickLower",
"type": "int24",
"internalType": "int24"
},
{
"name": "tickUpper",
"type": "int24",
"internalType": "int24"
},
{
"name": "spent",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "burned",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "renounceOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "requestOwnershipHandover",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "setEthThreshold",
"type": "function",
"inputs": [
{
"name": "_ethThreshold",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setPoolKey",
"type": "function",
"inputs": [
{
"name": "_poolKey",
"type": "tuple",
"components": [
{
"name": "currency0",
"type": "address",
"internalType": "Currency"
},
{
"name": "currency1",
"type": "address",
"internalType": "Currency"
},
{
"name": "fee",
"type": "uint24",
"internalType": "uint24"
},
{
"name": "tickSpacing",
"type": "int24",
"internalType": "int24"
},
{
"name": "hooks",
"type": "address",
"internalType": "contract IHooks"
}
],
"internalType": "struct PoolKey"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "subscribe",
"type": "function",
"inputs": [
{
"name": "",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "transferOwnership",
"type": "function",
"inputs": [
{
"name": "newOwner",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "unsubscribe",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"type": "receive",
"stateMutability": "payable"
}
]0x60e060405234801561000f575f80fd5b5060405161247938038061247983398101604081905261002e916100ee565b6001600160a01b0381811660805283811660a052821660c052670de0b6b3a76400005f8190556040519081527fadfa8ecb21b6962ebcd0adbd9ab985b7b4c5b5eb3b0dead683171565c7bfe1719060200160405180910390a161009033610098565b50505061012e565b6001600160a01b0316638b78c6d819819055805f7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a350565b80516001600160a01b03811681146100e9575f80fd5b919050565b5f805f60608486031215610100575f80fd5b610109846100d3565b9250610117602085016100d3565b9150610125604085016100d3565b90509250925092565b60805160a05160c0516122aa6101cf5f395f81816103ff015281816107880152818161092b01528181610e6201528181610ef301528181610f730152818161103501526110b501525f818161015a015281816103030152818161063f015281816106ef0152610a6401525f81816101ce015281816105190152818161055b015281816105a1015281816105e301528181610d1b0152610d5d01526122aa5ff3fe608060405260043610610140575f3560e01c80637d31596c116100bb578063f0ec98d711610071578063fcae448411610057578063fcae448414610466578063fccc28131461047a578063fee81cf41461048f575f80fd5b8063f0ec98d714610434578063f2fde38b14610453575f80fd5b806390e975aa116100a157806390e975aa146103cc578063dc4c90d3146103ee578063f04e283e14610421575f80fd5b80637d31596c146103955780638da5cb5b146103b4575f80fd5b80634ca1f0621161011057806366a64393116100f657806366a64393146102f2578063715018a6146103255780637b05fe621461032d575f80fd5b80634ca1f062146102cb57806354d1f13d146102ea575f80fd5b806309276ea4146101bd578063256929621461020d578063275efa3d146102155780634610b70a1461029c575f80fd5b366101b95760405163b6b55f2560e01b81525f60048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b6b55f259034906024015f604051808303818588803b1580156101a5575f80fd5b505af11580156101b7573d5f803e3d5ffd5b005b5f80fd5b3480156101c8575f80fd5b506101f07f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b6101b76104c0565b348015610220575f80fd5b506001546002805460035461025c936001600160a01b03908116938382169362ffffff600160a01b82041693600160b81b90910490910b911685565b604080516001600160a01b039687168152948616602086015262ffffff9093169284019290925260020b606083015291909116608082015260a001610204565b3480156102a7575f80fd5b506102bb6102b6366004611d90565b61050d565b6040519015158152602001610204565b3480156102d6575f80fd5b506101b76102e5366004611e24565b610596565b6101b7610ae3565b3480156102fd575f80fd5b506101f07f000000000000000000000000000000000000000000000000000000000000000081565b6101b7610b1c565b348015610338575f80fd5b506004546005546006546103659260ff8116926101008204600290810b93640100000000909304900b9185565b604080519515158652600294850b60208701529290930b918401919091526060830152608082015260a001610204565b3480156103a0575f80fd5b506101b76103af366004611eb5565b610b2f565b3480156103bf575f80fd5b50638b78c6d819546101f0565b3480156103d7575f80fd5b506103e05f5481565b604051908152602001610204565b3480156103f9575f80fd5b506101f07f000000000000000000000000000000000000000000000000000000000000000081565b6101b761042f366004611ee0565b610b72565b34801561043f575f80fd5b506101b761044e366004611f06565b610baf565b6101b7610461366004611ee0565b610cea565b348015610471575f80fd5b506101b7610d10565b348015610485575f80fd5b506101f061dead81565b34801561049a575f80fd5b506103e06104a9366004611ee0565b63389a75e1600c9081525f91909152602090205490565b5f6202a30067ffffffffffffffff164201905063389a75e1600c52335f52806020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d5f80a250565b5f336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461058d576040516316ff6b4b60e11b81523360048201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660248201526044015b60405180910390fd5b5060015b919050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610610576040516316ff6b4b60e11b81523360048201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166024820152604401610584565b634b84d04f60e01b6001600160e01b0319841601610add576040516370a0823160e01b81523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a08231906024016020604051808303815f875af115801561068d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106b19190611f8b565b90505f548110156106cb576106c581610d8a565b50610add565b60028054600160b81b9004900b5f036106e7576106c581610d8a565b6001546004547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b039081169216919091149060ff16156107f9576040805160a080820183526001546001600160a01b03908116835260028054808316602086015262ffffff600160a01b82041695850195909552600160b81b909404840b60608401526003548116608084015291206004545f936107c4937f000000000000000000000000000000000000000000000000000000000000000016929130916101008204810b916401000000009004900b86610dcb565b50506004549091506107f3906101008104600290810b916401000000009004900b6107ee84611fb6565b610e22565b50610807565b6004805460ff191660011790555b8160046001015f82825461081b9190611fe3565b909155505f905081610838576001546001600160a01b0316610845565b6002546001600160a01b03165b90505f61085a826001600160a01b0316611163565b905080156108c5576108786001600160a01b03831661dead836111e5565b8060046002015f82825461088c9190611fe3565b90915550506040518181527f0585fe56a48bc368300bd7da228655743fc64325817fdac460edcf7767546b269060200160405180910390a15b6040805160a080820183526001546001600160a01b039081168352600280548083166020860152600160a01b810462ffffff1695850195909552600160b81b90940490930b60608301526003549092166080820152205f90610951906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169061127f565b50509150505f8461096c57610967600183611ff6565b610977565b61097782600161201b565b90505f805f87156109c157610990600285900b5f611331565b925061099d603c8461201b565b91506109ba6109ab846113c7565b6109b4846113c7565b8b61168c565b90506109fd565b6109d0600285900b6001611331565b91506109dd603c83611ff6565b92506109fa6109eb846113c7565b6109f4846113c7565b8b611706565b90505b610a08838383610e22565b6004805462ffffff8481166401000000000266ffffff0000000019918716610100029190911666ffffffffffff0019909216919091171781556040516370a0823160e01b81523091810191909152610ad3906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a08231906024016020604051808303815f875af1158015610aaa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ace9190611f8b565b610d8a565b5050505050505050505b50505050565b63389a75e1600c52335f525f6020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c925f80a2565b610b2461174c565b610b2d5f611766565b565b610b3761174c565b5f8190556040518181527fadfa8ecb21b6962ebcd0adbd9ab985b7b4c5b5eb3b0dead683171565c7bfe171906020015b60405180910390a150565b610b7a61174c565b63389a75e1600c52805f526020600c208054421115610ba057636f5e88185f526004601cfd5b5f9055610bac81611766565b50565b610bb761174c565b8051600180547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b0393841690811790925560208085018051600280546040808a0180516060808d018051978d167fffffffffffffffffff000000000000000000000000000000000000000000000090961695909517600160a01b62ffffff93841602177fffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff16600160b81b978316979097029690961785556080808d01805160038054909c16908e1617909a5583519a8b5296518b16978a01979097525190951694870194909452925190920b918401919091529051909216918101919091527f296ba97753bd1260f11251341a34258bb5f591efe59b6bca30da786c7362bf0b9060a001610b67565b610cf261174c565b8060601b610d0757637448fbae5f526004601cfd5b610bac81611766565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b2d576040516316ff6b4b60e11b81523360048201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166024820152604401610584565b6007548103610d965750565b60078190556040518181527fe968090a83cd0c78dcb9e891725da982db6cdbe2c46d6a3c88c132b4a365e13f90602001610b67565b60408051602681018390526006810184905260038101859052858152603a600c8201205f928201839052602082018390529082905281908190610e0f8a8a836117a3565b919c909b50909950975050505050505050565b60408051608081018252600285810b825284900b6020820152600f83900b818301525f606082018190529151632d35e7ed60e11b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691635a6bcfda91610e9891600191600401612040565b60408051808303815f875af1158015610eb3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ed791906120d5565b5090505f610ee58260801d90565b600f0b1215610f5257610f4d7f000000000000000000000000000000000000000000000000000000000000000030610f1d8460801d90565b610f2690611fb6565b6001546001600160a01b03169291906fffffffffffffffffffffffffffffffff165f611846565b61101c565b5f610f5d8260801d90565b600f0b131561101c576001546001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811691630b0d9c09911630610fa78560801d90565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526fffffffffffffffffffffffffffffffff1660448201526064015f604051808303815f87803b158015611005575f80fd5b505af1158015611017573d5f803e3d5ffd5b505050505b5f61102782600f0b90565b600f0b12156110945761108f7f00000000000000000000000000000000000000000000000000000000000000003061105f84600f0b90565b61106890611fb6565b6002546001600160a01b03169291906fffffffffffffffffffffffffffffffff165f611846565b610add565b5f61109f82600f0b90565b600f0b1315610add576002546001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811691630b0d9c099116306110e985600f0b90565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526fffffffffffffffffffffffffffffffff1660448201526064015f604051808303815f87803b158015611147575f80fd5b505af1158015611159573d5f803e3d5ffd5b5050505050505050565b5f6001600160a01b038216611179575047919050565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa1580156111bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111df9190611f8b565b92915050565b5f6001600160a01b038416611215575f805f8085875af190508061108f5761108f835f633d2cec6f60e21b611b11565b60405163a9059cbb60e01b81526001600160a01b038416600482015282602482015260205f6044835f895af13d15601f3d1160015f511416171691505f81525f60208201525f60408201525080610add57610add8463a9059cbb60e01b633c9fd93960e21b611b11565b5f805f805f61128d86611b89565b604051631e2eaeaf60e01b8152600481018290529091505f906001600160a01b03891690631e2eaeaf90602401602060405180830381865afa1580156112d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f99190611f8b565b90506001600160a01b03811695508060a01c60020b945062ffffff8160b81c16935062ffffff8160d01c169250505092959194509250565b5f620d89b319600284900b121561134e57620d89b3199250611364565b620d89b4600284900b131561136457620d89b492505b61136f603c8461210b565b60020b5f0361137f5750816111df565b603c61138b818561212c565b6113959190612164565b90505f8360020b12156113b0576113ad603c82611ff6565b90505b816111df576113c0603c8261201b565b9392505050565b60020b5f60ff82901d80830118620d89e88111156113f0576113f06345c3193d60e11b84611bc5565b7001fffcb933bd6fad37aa2d162d1a5940016001821602700100000000000000000000000000000000186002821615611439576ffff97272373d413259a46990580e213a0260801c5b6004821615611458576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615611477576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615611496576fffcb9843d60f6159c9db58835c9266440260801c5b60208216156114b5576fff973b41fa98c081472e6896dfb254c00260801c5b60408216156114d4576fff2ea16466c96a3843ec78b326b528610260801c5b60808216156114f3576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615611513576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615611533576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615611553576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615611573576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615611593576fd097f3bdfd2022b8845ad8f792aa58250260801c5b6120008216156115b3576fa9f746462d870fdf8a65dc1f90e061e50260801c5b6140008216156115d3576f70d869a156d2a1b890bb3df62baf32f70260801c5b6180008216156115f3576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615611614576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615611634576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615611653576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615611670576b048a170391f7dc42444e8fa20260801c5b5f84131561167c575f19045b63ffffffff0160201c9392505050565b5f826001600160a01b0316846001600160a01b031611156116ab579192915b5f6116d6856001600160a01b0316856001600160a01b03166c01000000000000000000000000611bd4565b90506116fd6116f884836116ea898961218a565b6001600160a01b0316611bd4565b611c70565b95945050505050565b5f826001600160a01b0316846001600160a01b03161115611725579192915b6117446116f8836c010000000000000000000000006116ea888861218a565b949350505050565b638b78c6d819543314610b2d576382b429005f526004601cfd5b638b78c6d81980546001600160a01b039092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a355565b5f805f806117b18686611cd2565b604051631afeb18d60e11b815260048101829052600360248201529091505f906001600160a01b038916906335fd631a906044015f60405180830381865afa1580156117ff573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261182691908101906121a9565b60208101516040820151606090920151909a919950975095505050505050565b80156118da57836001600160a01b031663f5298aca84611875886001600160a01b03166001600160a01b031690565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604481018590526064015f604051808303815f87803b1580156118bf575f80fd5b505af11580156118d1573d5f803e3d5ffd5b50505050611b0a565b6001600160a01b03851661195157836001600160a01b03166311da60b4836040518263ffffffff1660e01b815260040160206040518083038185885af1158015611926573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061194b9190611f8b565b50611b0a565b604051632961046560e21b81526001600160a01b03868116600483015285169063a5841194906024015f604051808303815f87803b158015611991575f80fd5b505af11580156119a3573d5f803e3d5ffd5b505050506001600160a01b0383163014611a35576040516323b872dd60e01b81526001600160a01b0384811660048301528581166024830152604482018490528616906323b872dd906064016020604051808303815f875af1158015611a0b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a2f9190612255565b50611aa7565b60405163a9059cbb60e01b81526001600160a01b0385811660048301526024820184905286169063a9059cbb906044016020604051808303815f875af1158015611a81573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611aa59190612255565b505b836001600160a01b03166311da60b46040518163ffffffff1660e01b81526004016020604051808303815f875af1158015611ae4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b089190611f8b565b505b5050505050565b6040516390bfb86560e01b8082526001600160a01b03851660048301526001600160e01b031984166024830152608060448301526020601f3d018190040260a0810160648401523d608484015290913d5f60a483013e60048260a4018201526001600160e01b031984168260c4018201528160e40181fd5b6040515f90611ba8908390600690602001918252602082015260400190565b604051602081830303815290604052805190602001209050919050565b815f528060020b60045260245ffd5b5f838302815f1985870982811083820303915050808411611bf3575f80fd5b805f03611c05575082900490506113c0565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b806fffffffffffffffffffffffffffffffff811681146105915760405162461bcd60e51b815260206004820152601260248201527f6c6971756964697479206f766572666c6f7700000000000000000000000000006044820152606401610584565b5f80611cdd84611b89565b90505f611ceb600683611fe3565b6040805160208101879052908101829052909150606001604051602081830303815290604052805190602001209250505092915050565b634e487b7160e01b5f52604160045260245ffd5b60405160a0810167ffffffffffffffff81118282101715611d5957611d59611d22565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611d8857611d88611d22565b604052919050565b5f60208284031215611da0575f80fd5b813567ffffffffffffffff811115611db6575f80fd5b8201601f81018413611dc6575f80fd5b803567ffffffffffffffff811115611de057611de0611d22565b611df3601f8201601f1916602001611d5f565b818152856020838501011115611e07575f80fd5b816020840160208301375f91810160200191909152949350505050565b5f805f8060608587031215611e37575f80fd5b8435935060208501356001600160e01b031981168114611e55575f80fd5b9250604085013567ffffffffffffffff811115611e70575f80fd5b8501601f81018713611e80575f80fd5b803567ffffffffffffffff811115611e96575f80fd5b876020828401011115611ea7575f80fd5b949793965060200194505050565b5f60208284031215611ec5575f80fd5b5035919050565b6001600160a01b0381168114610bac575f80fd5b5f60208284031215611ef0575f80fd5b81356113c081611ecc565b803561059181611ecc565b5f60a0828403128015611f17575f80fd5b50611f20611d36565b8235611f2b81611ecc565b81526020830135611f3b81611ecc565b6020820152604083013562ffffff81168114611f55575f80fd5b60408201526060830135600281900b8114611f6e575f80fd5b6060820152611f7f60808401611efb565b60808201529392505050565b5f60208284031215611f9b575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b5f81600f0b6f7fffffffffffffffffffffffffffffff198103611fdb57611fdb611fa2565b5f0392915050565b808201808211156111df576111df611fa2565b600282810b9082900b03627fffff198112627fffff821317156111df576111df611fa2565b600281810b9083900b01627fffff8113627fffff19821217156111df576111df611fa2565b82546001600160a01b0390811682526001840154808216602084015260a081811c62ffffff16604085015260b89190911c600290810b606085015285015490911660808301525f906120bb90830184805160020b8252602081015160020b602083015260408101516040830152606081015160608301525050565b61014061012083015261174461014083015f815260200190565b5f80604083850312156120e6575f80fd5b505080516020909101519092909150565b634e487b7160e01b5f52601260045260245ffd5b5f8260020b8061211d5761211d6120f7565b808360020b0791505092915050565b5f8160020b8360020b80612142576121426120f7565b627fffff1982145f198214161561215b5761215b611fa2565b90059392505050565b5f8260020b8260020b028060020b915080821461218357612183611fa2565b5092915050565b6001600160a01b0382811682821603908111156111df576111df611fa2565b5f602082840312156121b9575f80fd5b815167ffffffffffffffff8111156121cf575f80fd5b8201601f810184136121df575f80fd5b805167ffffffffffffffff8111156121f9576121f9611d22565b8060051b61220960208201611d5f565b91825260208184018101929081019087841115612224575f80fd5b6020850194505b8385101561224a5784518083526020958601959093509091019061222b565b979650505050505050565b5f60208284031215612265575f80fd5b815180151581146113c0575f80fdfea2646970667358221220e154a5de2d64854ba0535c79c23a5b400d7304b2ef8639de38e75d7e827a31a564736f6c634300081a003300000000000000000000000000000000043c1117dafa3a3d0c7148eb48b301300000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409510000000000000000000000007fcebafc49039e7068dfa2c0ac6d90f31c7d1285
0x608060405260043610610140575f3560e01c80637d31596c116100bb578063f0ec98d711610071578063fcae448411610057578063fcae448414610466578063fccc28131461047a578063fee81cf41461048f575f80fd5b8063f0ec98d714610434578063f2fde38b14610453575f80fd5b806390e975aa116100a157806390e975aa146103cc578063dc4c90d3146103ee578063f04e283e14610421575f80fd5b80637d31596c146103955780638da5cb5b146103b4575f80fd5b80634ca1f0621161011057806366a64393116100f657806366a64393146102f2578063715018a6146103255780637b05fe621461032d575f80fd5b80634ca1f062146102cb57806354d1f13d146102ea575f80fd5b806309276ea4146101bd578063256929621461020d578063275efa3d146102155780634610b70a1461029c575f80fd5b366101b95760405163b6b55f2560e01b81525f60048201527f00000000000000000000000000000000043c1117dafa3a3d0c7148eb48b301306001600160a01b03169063b6b55f259034906024015f604051808303818588803b1580156101a5575f80fd5b505af11580156101b7573d5f803e3d5ffd5b005b5f80fd5b3480156101c8575f80fd5b506101f07f0000000000000000000000007fcebafc49039e7068dfa2c0ac6d90f31c7d128581565b6040516001600160a01b0390911681526020015b60405180910390f35b6101b76104c0565b348015610220575f80fd5b506001546002805460035461025c936001600160a01b03908116938382169362ffffff600160a01b82041693600160b81b90910490910b911685565b604080516001600160a01b039687168152948616602086015262ffffff9093169284019290925260020b606083015291909116608082015260a001610204565b3480156102a7575f80fd5b506102bb6102b6366004611d90565b61050d565b6040519015158152602001610204565b3480156102d6575f80fd5b506101b76102e5366004611e24565b610596565b6101b7610ae3565b3480156102fd575f80fd5b506101f07f00000000000000000000000000000000043c1117dafa3a3d0c7148eb48b3013081565b6101b7610b1c565b348015610338575f80fd5b506004546005546006546103659260ff8116926101008204600290810b93640100000000909304900b9185565b604080519515158652600294850b60208701529290930b918401919091526060830152608082015260a001610204565b3480156103a0575f80fd5b506101b76103af366004611eb5565b610b2f565b3480156103bf575f80fd5b50638b78c6d819546101f0565b3480156103d7575f80fd5b506103e05f5481565b604051908152602001610204565b3480156103f9575f80fd5b506101f07f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095181565b6101b761042f366004611ee0565b610b72565b34801561043f575f80fd5b506101b761044e366004611f06565b610baf565b6101b7610461366004611ee0565b610cea565b348015610471575f80fd5b506101b7610d10565b348015610485575f80fd5b506101f061dead81565b34801561049a575f80fd5b506103e06104a9366004611ee0565b63389a75e1600c9081525f91909152602090205490565b5f6202a30067ffffffffffffffff164201905063389a75e1600c52335f52806020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d5f80a250565b5f336001600160a01b037f0000000000000000000000007fcebafc49039e7068dfa2c0ac6d90f31c7d1285161461058d576040516316ff6b4b60e11b81523360048201526001600160a01b037f0000000000000000000000007fcebafc49039e7068dfa2c0ac6d90f31c7d12851660248201526044015b60405180910390fd5b5060015b919050565b336001600160a01b037f0000000000000000000000007fcebafc49039e7068dfa2c0ac6d90f31c7d12851614610610576040516316ff6b4b60e11b81523360048201526001600160a01b037f0000000000000000000000007fcebafc49039e7068dfa2c0ac6d90f31c7d1285166024820152604401610584565b634b84d04f60e01b6001600160e01b0319841601610add576040516370a0823160e01b81523060048201525f907f00000000000000000000000000000000043c1117dafa3a3d0c7148eb48b301306001600160a01b0316906370a08231906024016020604051808303815f875af115801561068d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106b19190611f8b565b90505f548110156106cb576106c581610d8a565b50610add565b60028054600160b81b9004900b5f036106e7576106c581610d8a565b6001546004547f00000000000000000000000000000000043c1117dafa3a3d0c7148eb48b301306001600160a01b039081169216919091149060ff16156107f9576040805160a080820183526001546001600160a01b03908116835260028054808316602086015262ffffff600160a01b82041695850195909552600160b81b909404840b60608401526003548116608084015291206004545f936107c4937f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095116929130916101008204810b916401000000009004900b86610dcb565b50506004549091506107f3906101008104600290810b916401000000009004900b6107ee84611fb6565b610e22565b50610807565b6004805460ff191660011790555b8160046001015f82825461081b9190611fe3565b909155505f905081610838576001546001600160a01b0316610845565b6002546001600160a01b03165b90505f61085a826001600160a01b0316611163565b905080156108c5576108786001600160a01b03831661dead836111e5565b8060046002015f82825461088c9190611fe3565b90915550506040518181527f0585fe56a48bc368300bd7da228655743fc64325817fdac460edcf7767546b269060200160405180910390a15b6040805160a080820183526001546001600160a01b039081168352600280548083166020860152600160a01b810462ffffff1695850195909552600160b81b90940490930b60608301526003549092166080820152205f90610951906001600160a01b037f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e40951169061127f565b50509150505f8461096c57610967600183611ff6565b610977565b61097782600161201b565b90505f805f87156109c157610990600285900b5f611331565b925061099d603c8461201b565b91506109ba6109ab846113c7565b6109b4846113c7565b8b61168c565b90506109fd565b6109d0600285900b6001611331565b91506109dd603c83611ff6565b92506109fa6109eb846113c7565b6109f4846113c7565b8b611706565b90505b610a08838383610e22565b6004805462ffffff8481166401000000000266ffffff0000000019918716610100029190911666ffffffffffff0019909216919091171781556040516370a0823160e01b81523091810191909152610ad3906001600160a01b037f00000000000000000000000000000000043c1117dafa3a3d0c7148eb48b3013016906370a08231906024016020604051808303815f875af1158015610aaa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ace9190611f8b565b610d8a565b5050505050505050505b50505050565b63389a75e1600c52335f525f6020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c925f80a2565b610b2461174c565b610b2d5f611766565b565b610b3761174c565b5f8190556040518181527fadfa8ecb21b6962ebcd0adbd9ab985b7b4c5b5eb3b0dead683171565c7bfe171906020015b60405180910390a150565b610b7a61174c565b63389a75e1600c52805f526020600c208054421115610ba057636f5e88185f526004601cfd5b5f9055610bac81611766565b50565b610bb761174c565b8051600180547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b0393841690811790925560208085018051600280546040808a0180516060808d018051978d167fffffffffffffffffff000000000000000000000000000000000000000000000090961695909517600160a01b62ffffff93841602177fffffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffff16600160b81b978316979097029690961785556080808d01805160038054909c16908e1617909a5583519a8b5296518b16978a01979097525190951694870194909452925190920b918401919091529051909216918101919091527f296ba97753bd1260f11251341a34258bb5f591efe59b6bca30da786c7362bf0b9060a001610b67565b610cf261174c565b8060601b610d0757637448fbae5f526004601cfd5b610bac81611766565b336001600160a01b037f0000000000000000000000007fcebafc49039e7068dfa2c0ac6d90f31c7d12851614610b2d576040516316ff6b4b60e11b81523360048201526001600160a01b037f0000000000000000000000007fcebafc49039e7068dfa2c0ac6d90f31c7d1285166024820152604401610584565b6007548103610d965750565b60078190556040518181527fe968090a83cd0c78dcb9e891725da982db6cdbe2c46d6a3c88c132b4a365e13f90602001610b67565b60408051602681018390526006810184905260038101859052858152603a600c8201205f928201839052602082018390529082905281908190610e0f8a8a836117a3565b919c909b50909950975050505050505050565b60408051608081018252600285810b825284900b6020820152600f83900b818301525f606082018190529151632d35e7ed60e11b81526001600160a01b037f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409511691635a6bcfda91610e9891600191600401612040565b60408051808303815f875af1158015610eb3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ed791906120d5565b5090505f610ee58260801d90565b600f0b1215610f5257610f4d7f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095130610f1d8460801d90565b610f2690611fb6565b6001546001600160a01b03169291906fffffffffffffffffffffffffffffffff165f611846565b61101c565b5f610f5d8260801d90565b600f0b131561101c576001546001600160a01b037f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e40951811691630b0d9c09911630610fa78560801d90565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526fffffffffffffffffffffffffffffffff1660448201526064015f604051808303815f87803b158015611005575f80fd5b505af1158015611017573d5f803e3d5ffd5b505050505b5f61102782600f0b90565b600f0b12156110945761108f7f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409513061105f84600f0b90565b61106890611fb6565b6002546001600160a01b03169291906fffffffffffffffffffffffffffffffff165f611846565b610add565b5f61109f82600f0b90565b600f0b1315610add576002546001600160a01b037f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e40951811691630b0d9c099116306110e985600f0b90565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526fffffffffffffffffffffffffffffffff1660448201526064015f604051808303815f87803b158015611147575f80fd5b505af1158015611159573d5f803e3d5ffd5b5050505050505050565b5f6001600160a01b038216611179575047919050565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa1580156111bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111df9190611f8b565b92915050565b5f6001600160a01b038416611215575f805f8085875af190508061108f5761108f835f633d2cec6f60e21b611b11565b60405163a9059cbb60e01b81526001600160a01b038416600482015282602482015260205f6044835f895af13d15601f3d1160015f511416171691505f81525f60208201525f60408201525080610add57610add8463a9059cbb60e01b633c9fd93960e21b611b11565b5f805f805f61128d86611b89565b604051631e2eaeaf60e01b8152600481018290529091505f906001600160a01b03891690631e2eaeaf90602401602060405180830381865afa1580156112d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f99190611f8b565b90506001600160a01b03811695508060a01c60020b945062ffffff8160b81c16935062ffffff8160d01c169250505092959194509250565b5f620d89b319600284900b121561134e57620d89b3199250611364565b620d89b4600284900b131561136457620d89b492505b61136f603c8461210b565b60020b5f0361137f5750816111df565b603c61138b818561212c565b6113959190612164565b90505f8360020b12156113b0576113ad603c82611ff6565b90505b816111df576113c0603c8261201b565b9392505050565b60020b5f60ff82901d80830118620d89e88111156113f0576113f06345c3193d60e11b84611bc5565b7001fffcb933bd6fad37aa2d162d1a5940016001821602700100000000000000000000000000000000186002821615611439576ffff97272373d413259a46990580e213a0260801c5b6004821615611458576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615611477576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615611496576fffcb9843d60f6159c9db58835c9266440260801c5b60208216156114b5576fff973b41fa98c081472e6896dfb254c00260801c5b60408216156114d4576fff2ea16466c96a3843ec78b326b528610260801c5b60808216156114f3576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615611513576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615611533576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615611553576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615611573576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615611593576fd097f3bdfd2022b8845ad8f792aa58250260801c5b6120008216156115b3576fa9f746462d870fdf8a65dc1f90e061e50260801c5b6140008216156115d3576f70d869a156d2a1b890bb3df62baf32f70260801c5b6180008216156115f3576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615611614576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615611634576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615611653576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615611670576b048a170391f7dc42444e8fa20260801c5b5f84131561167c575f19045b63ffffffff0160201c9392505050565b5f826001600160a01b0316846001600160a01b031611156116ab579192915b5f6116d6856001600160a01b0316856001600160a01b03166c01000000000000000000000000611bd4565b90506116fd6116f884836116ea898961218a565b6001600160a01b0316611bd4565b611c70565b95945050505050565b5f826001600160a01b0316846001600160a01b03161115611725579192915b6117446116f8836c010000000000000000000000006116ea888861218a565b949350505050565b638b78c6d819543314610b2d576382b429005f526004601cfd5b638b78c6d81980546001600160a01b039092169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a355565b5f805f806117b18686611cd2565b604051631afeb18d60e11b815260048101829052600360248201529091505f906001600160a01b038916906335fd631a906044015f60405180830381865afa1580156117ff573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261182691908101906121a9565b60208101516040820151606090920151909a919950975095505050505050565b80156118da57836001600160a01b031663f5298aca84611875886001600160a01b03166001600160a01b031690565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604481018590526064015f604051808303815f87803b1580156118bf575f80fd5b505af11580156118d1573d5f803e3d5ffd5b50505050611b0a565b6001600160a01b03851661195157836001600160a01b03166311da60b4836040518263ffffffff1660e01b815260040160206040518083038185885af1158015611926573d5f803e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061194b9190611f8b565b50611b0a565b604051632961046560e21b81526001600160a01b03868116600483015285169063a5841194906024015f604051808303815f87803b158015611991575f80fd5b505af11580156119a3573d5f803e3d5ffd5b505050506001600160a01b0383163014611a35576040516323b872dd60e01b81526001600160a01b0384811660048301528581166024830152604482018490528616906323b872dd906064016020604051808303815f875af1158015611a0b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a2f9190612255565b50611aa7565b60405163a9059cbb60e01b81526001600160a01b0385811660048301526024820184905286169063a9059cbb906044016020604051808303815f875af1158015611a81573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611aa59190612255565b505b836001600160a01b03166311da60b46040518163ffffffff1660e01b81526004016020604051808303815f875af1158015611ae4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b089190611f8b565b505b5050505050565b6040516390bfb86560e01b8082526001600160a01b03851660048301526001600160e01b031984166024830152608060448301526020601f3d018190040260a0810160648401523d608484015290913d5f60a483013e60048260a4018201526001600160e01b031984168260c4018201528160e40181fd5b6040515f90611ba8908390600690602001918252602082015260400190565b604051602081830303815290604052805190602001209050919050565b815f528060020b60045260245ffd5b5f838302815f1985870982811083820303915050808411611bf3575f80fd5b805f03611c05575082900490506113c0565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b806fffffffffffffffffffffffffffffffff811681146105915760405162461bcd60e51b815260206004820152601260248201527f6c6971756964697479206f766572666c6f7700000000000000000000000000006044820152606401610584565b5f80611cdd84611b89565b90505f611ceb600683611fe3565b6040805160208101879052908101829052909150606001604051602081830303815290604052805190602001209250505092915050565b634e487b7160e01b5f52604160045260245ffd5b60405160a0810167ffffffffffffffff81118282101715611d5957611d59611d22565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611d8857611d88611d22565b604052919050565b5f60208284031215611da0575f80fd5b813567ffffffffffffffff811115611db6575f80fd5b8201601f81018413611dc6575f80fd5b803567ffffffffffffffff811115611de057611de0611d22565b611df3601f8201601f1916602001611d5f565b818152856020838501011115611e07575f80fd5b816020840160208301375f91810160200191909152949350505050565b5f805f8060608587031215611e37575f80fd5b8435935060208501356001600160e01b031981168114611e55575f80fd5b9250604085013567ffffffffffffffff811115611e70575f80fd5b8501601f81018713611e80575f80fd5b803567ffffffffffffffff811115611e96575f80fd5b876020828401011115611ea7575f80fd5b949793965060200194505050565b5f60208284031215611ec5575f80fd5b5035919050565b6001600160a01b0381168114610bac575f80fd5b5f60208284031215611ef0575f80fd5b81356113c081611ecc565b803561059181611ecc565b5f60a0828403128015611f17575f80fd5b50611f20611d36565b8235611f2b81611ecc565b81526020830135611f3b81611ecc565b6020820152604083013562ffffff81168114611f55575f80fd5b60408201526060830135600281900b8114611f6e575f80fd5b6060820152611f7f60808401611efb565b60808201529392505050565b5f60208284031215611f9b575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b5f81600f0b6f7fffffffffffffffffffffffffffffff198103611fdb57611fdb611fa2565b5f0392915050565b808201808211156111df576111df611fa2565b600282810b9082900b03627fffff198112627fffff821317156111df576111df611fa2565b600281810b9083900b01627fffff8113627fffff19821217156111df576111df611fa2565b82546001600160a01b0390811682526001840154808216602084015260a081811c62ffffff16604085015260b89190911c600290810b606085015285015490911660808301525f906120bb90830184805160020b8252602081015160020b602083015260408101516040830152606081015160608301525050565b61014061012083015261174461014083015f815260200190565b5f80604083850312156120e6575f80fd5b505080516020909101519092909150565b634e487b7160e01b5f52601260045260245ffd5b5f8260020b8061211d5761211d6120f7565b808360020b0791505092915050565b5f8160020b8360020b80612142576121426120f7565b627fffff1982145f198214161561215b5761215b611fa2565b90059392505050565b5f8260020b8260020b028060020b915080821461218357612183611fa2565b5092915050565b6001600160a01b0382811682821603908111156111df576111df611fa2565b5f602082840312156121b9575f80fd5b815167ffffffffffffffff8111156121cf575f80fd5b8201601f810184136121df575f80fd5b805167ffffffffffffffff8111156121f9576121f9611d22565b8060051b61220960208201611d5f565b91825260208184018101929081019087841115612224575f80fd5b6020850194505b8385101561224a5784518083526020958601959093509091019061222b565b979650505050505050565b5f60208284031215612265575f80fd5b815180151581146113c0575f80fdfea2646970667358221220e154a5de2d64854ba0535c79c23a5b400d7304b2ef8639de38e75d7e827a31a564736f6c634300081a0033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x93e33d…35dabf | 30 days agoFri, 17 Jul 2026 10:13:58 UTC | 0xadfa8e…e171 | data: 0x000000000000000000…107a4000 |
| 0x59670e…541045 | 30 days agoFri, 17 Jul 2026 10:13:57 UTC | 0x8be007…57e0 | [0] 0x000000000000…00000000 [1] 0x000000000000…9fd0a973 |
| 0x59670e…541045 | 30 days agoFri, 17 Jul 2026 10:13:57 UTC | 0xadfa8e…e171 | data: 0x000000000000000000…a7640000 |
| 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 | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x93e33d…35dabf | setEthThreshold | 12,038,982 | 30 days agoFri, 17 Jul 2026 10:13:58 UTC | 0xb8a7…a973 | IN | BuyBackAndBurnFlay | $0.000 ETH | 0.00000228 |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| no internal transactions found for this address yet (traced blocks + on-demand) | ||||||||