// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {IPoolManager} from "v4-core/interfaces/IPoolManager.sol";
import {IHooks} from "v4-core/interfaces/IHooks.sol";
import {IUnlockCallback} from "v4-core/interfaces/callback/IUnlockCallback.sol";
import {PoolKey} from "v4-core/types/PoolKey.sol";
import {Currency} from "v4-core/types/Currency.sol";
import {BalanceDelta} from "v4-core/types/BalanceDelta.sol";
import {TickMath} from "v4-core/libraries/TickMath.sol";
import {RawbinRwa} from "./RawbinRwa.sol";
/// @title RawbinZap
/// @author Rawbin — https://rawbin.fun
/// @custom:mission Verified contracts, no hidden owner over tokens, no token tax,
/// liquidity you can never rug. Read the code and verify it yourself. — rawbin
/// @notice One-transaction ETH ⇄ tokenized-stock ⇄ meme routing, in both directions. The
/// zap routes through the public ETH/stock pool (which we do NOT control — a
/// vanilla V4 pool, native-ETH-quoted, no hook; see docs/RWA-ROUTABILITY.md) and
/// through our stock/meme launch pool:
///
/// - `zapBuy`: native ETH → stock → meme, meme to the buyer.
/// - `zapSell`: meme → stock → native ETH, ETH to the seller.
///
/// **The sell exists because without it a stock-quoted launch is something you can
/// buy and cannot sell.** The route was always technically available (sell the meme
/// for the stock on Uniswap, then the stock for ETH), but a holder who has to
/// discover a two-pool path by hand has, in product terms, no exit.
///
/// **Neither path is guard-exempt, by construction, and that is the whole point.**
/// The zap is how ordinary traders reach a launch, so it must pay the snipe guard
/// like anyone else. It swaps through its OWN `unlock`, so the hook sees
/// `sender == address(this)` (the zap), never `== factory`. If the zap were ever the
/// factory, every sniper would route through it and the guard would be zero. It is a
/// plain router with no privileged relationship to the factory.
///
/// **One slippage guard over the whole route, in both directions.** Exact input
/// either way: the buyer spends all of `msg.value` and `minMemeOut` floors the FINAL
/// meme; the seller spends all of `memeIn` and `minEthOut` floors the FINAL native
/// ETH. One guard covers both legs' slippage AND the snipe-guard fee together. A
/// per-leg minimum would give the trader two numbers to accept and let the combined
/// loss hide between them. Nothing is left over to refund on either side: exactly
/// what was handed over is spent.
///
/// **The guard applies to sells too, and `minEthOut` already accounts for it.**
/// `RawbinHookRWA.afterSwap` charges the swap's *unspecified* currency. For an
/// exact-input swap v4-core fixes that side as `unspecifiedIsCurrency1 == zeroForOne`,
/// and selling the meme means `zeroForOne == memeIsToken0` — so on either sort order
/// the unspecified side is the stock, i.e. the seller's PROCEEDS. A sell inside the
/// window therefore pays the same decaying fee a buy does, on what it receives.
/// That needs no compensation here: v4-core subtracts the hook's returned delta from
/// the swapper's delta *before* `swap` returns, so `stockOut` below is already net of
/// the guard, leg 2 converts only the post-guard stock, and `minEthOut` is a floor on
/// a post-guard number by construction. The pre-guard amount never appears in this
/// contract, so there is no way to accidentally floor against it.
///
/// **The zap keeps nothing.** Both legs run in a single `unlock`, so a revert
/// anywhere — a partial fill leaving a non-zero delta, or the slippage floor —
/// unwinds the whole thing atomically. On a buy the meme goes straight to the
/// recipient; on a sell the seller's meme is not even pulled until both legs have
/// cleared and the floor has held, and the native ETH is `take`n straight to the
/// recipient. The zap holds no ETH at any point and deliberately has no `receive()`.
contract RawbinZap is IUnlockCallback {
IPoolManager public immutable poolManager;
/// @notice Our factory's hook — pinned so the zap can only route the meme leg through a
/// real Rawbin launch pool, never an attacker-supplied pool.
address public immutable hook;
uint24 public immutable memeFee;
int24 public immutable memeSpacing;
error NotPoolManager();
/// @notice NOT a failure: `previewSell`'s carrier for a quote. See `previewSell`.
error PreviewResult(uint256 ethOut);
/// @notice Unreachable by construction; kept so the impossible branch is not a silent
/// zero. `previewSellRoute` always reverts.
error PreviewDidNotRevert();
constructor(IPoolManager poolManager_, RawbinRwa factory) {
poolManager = poolManager_;
hook = address(factory.hook());
memeFee = factory.POOL_FEE();
memeSpacing = factory.TICK_SPACING();
}
/// @dev Which route an `unlock` is running. Tagged explicitly rather than inferred from
/// the payload's shape: `abi.decode` of an out-of-range enum reverts, so there is no
/// third, unhandled path — the same reason `RawbinHookRWA` tags its three actions.
enum Action {
Buy,
Sell,
PreviewSell
}
struct ZapOp {
address meme;
address stock;
uint24 ethStockFee;
int24 ethStockSpacing;
uint256 minMemeOut;
uint256 ethBudget;
address recipient;
}
struct SellOp {
address meme;
address stock;
uint24 ethStockFee;
int24 ethStockSpacing;
uint256 memeIn;
uint256 minEthOut;
address recipient;
/// @dev Whose meme is pulled. Carried through the unlock because inside the callback
/// `msg.sender` is the PoolManager, not the seller. `address(0)` on the preview
/// path, which never pulls anything.
address payer;
}
/// @notice Spend all of `msg.value` on `meme` (a launch quoted in `stock`), routed
/// ETH→stock→meme, and revert unless at least `minMemeOut` meme comes out.
/// `ethStockFee`/`ethStockSpacing` identify the public ETH/stock pool (from
/// docs/RWA-ROUTABILITY.md). Returns the meme delivered.
function zapBuy(
address meme,
address stock,
uint24 ethStockFee,
int24 ethStockSpacing,
uint256 minMemeOut,
address recipient
) external payable returns (uint256 memeOut) {
require(recipient != address(0), "recipient=0");
require(msg.value > 0, "no ETH");
memeOut = abi.decode(
poolManager.unlock(abi.encode(Action.Buy, abi.encode(ZapOp({
meme: meme, stock: stock, ethStockFee: ethStockFee, ethStockSpacing: ethStockSpacing,
minMemeOut: minMemeOut, ethBudget: msg.value, recipient: recipient
})))),
(uint256)
);
}
/// @notice Sell all of `memeIn` for native ETH, routed meme→stock→ETH, and revert unless
/// at least `minEthOut` wei comes out. Returns the ETH delivered to `recipient`.
///
/// **The seller must `approve` this contract for `memeIn` of `meme` first.** That
/// is one extra signature and it is unavoidable: pulling an ERC-20 from a wallet
/// requires an allowance, and the alternative — the seller transferring the meme
/// here first — would leave tokens sitting in a router between two transactions.
/// The UI says so plainly rather than surprising anyone with a second prompt.
///
/// Quote it with `previewSell`, which needs no allowance at all.
function zapSell(
address meme,
address stock,
uint24 ethStockFee,
int24 ethStockSpacing,
uint256 memeIn,
uint256 minEthOut,
address recipient
) external returns (uint256 ethOut) {
require(recipient != address(0), "recipient=0");
require(memeIn > 0, "no meme");
// A V4 balance delta is an `int128` and `amountSpecified` is `-int256(memeIn)` below.
// Bounded HERE, where the number arrives from outside, so a value above 2**255 cannot
// wrap through the negation into a positive `amountSpecified` — which V4 reads as
// exact OUTPUT, a different trade than the seller asked for.
require(memeIn <= uint256(uint128(type(int128).max)), "memeIn too large");
ethOut = abi.decode(
poolManager.unlock(abi.encode(Action.Sell, abi.encode(SellOp({
meme: meme, stock: stock, ethStockFee: ethStockFee, ethStockSpacing: ethStockSpacing,
memeIn: memeIn, minEthOut: minEthOut, recipient: recipient, payer: msg.sender
})))),
(uint256)
);
}
/// @notice Quote a sell by RUNNING it. `eth_call` this; it changes nothing.
///
/// Returns the exact native ETH `zapSell` would deliver for `memeIn` right now:
/// both legs at live prices, the public pool's venue fee, our pool's fee tier and
/// whatever the snipe guard is taking in this block. A per-leg Quoter cannot
/// produce this number — it knows nothing about the guard, so during the launch
/// window it would be optimistic by up to 90%, exactly when being wrong costs the
/// most. The frontend derives `minEthOut` from this and never from a fallback.
///
/// **Why this exists when the buy needs no equivalent.** A buy is simulated by
/// `eth_call`ing `zapBuy` directly, because the only thing it needs is ETH and the
/// buyer has ETH. A sell needs an ALLOWANCE, and the seller has none until they
/// sign one — so simulating `zapSell` would refuse to quote until after the
/// approval, i.e. the seller would have to sign before they could be shown a
/// price. On a route where the guard can take 90% of the proceeds that is not an
/// acceptable order of operations.
///
/// The mechanism is v4-periphery's quoter idiom: the inner call runs the identical
/// route and then reverts carrying the result, so nothing is ever settled and no
/// tokens are needed; the revert also unwinds the unlock (transient storage rolls
/// back with the frame), so this is a read. Because both paths go through the SAME
/// `_onSell`, the quote and the transaction cannot drift apart.
function previewSell(
address meme,
address stock,
uint24 ethStockFee,
int24 ethStockSpacing,
uint256 memeIn
) external returns (uint256 ethOut) {
try this.previewSellRoute(meme, stock, ethStockFee, ethStockSpacing, memeIn) {
revert PreviewDidNotRevert();
} catch (bytes memory reason) {
// Only OUR sentinel is a quote. Anything else — an uninitialised pool, an
// exhausted range, a zero amount — is bubbled UNCHANGED, so the caller sees the
// real reason and can say "cannot quote". Swallowing it into a zero here is the
// one outcome that must never happen: a zero would read as a legitimate quote and
// become a zero slippage floor.
if (reason.length == 36 && bytes4(reason) == PreviewResult.selector) {
assembly { ethOut := mload(add(reason, 36)) }
return ethOut;
}
assembly { revert(add(reason, 32), mload(reason)) }
}
}
/// @dev The reverting half of `previewSell`. External only so `previewSell` can `try` it
/// — a revert is what discards the route — and self-gated so it is not mistaken for
/// an entry point. Calling it directly can only waste gas: it always reverts.
function previewSellRoute(
address meme,
address stock,
uint24 ethStockFee,
int24 ethStockSpacing,
uint256 memeIn
) external {
require(msg.sender == address(this), "self only");
poolManager.unlock(abi.encode(Action.PreviewSell, abi.encode(SellOp({
meme: meme, stock: stock, ethStockFee: ethStockFee, ethStockSpacing: ethStockSpacing,
memeIn: memeIn, minEthOut: 0, recipient: address(0), payer: address(0)
}))));
}
function unlockCallback(bytes calldata data) external returns (bytes memory) {
if (msg.sender != address(poolManager)) revert NotPoolManager();
(Action action, bytes memory payload) = abi.decode(data, (Action, bytes));
if (action == Action.Buy) return _onBuy(abi.decode(payload, (ZapOp)));
return _onSell(abi.decode(payload, (SellOp)), action == Action.PreviewSell);
}
/// @dev ETH → stock → meme. Unchanged from the first deployment; fork-tested against the
/// live PoolManager and the real public ETH/NVDA pool.
function _onBuy(ZapOp memory o) internal returns (bytes memory) {
(PoolKey memory memeKey, PoolKey memory ethKey, bool memeIsToken0) =
_keys(o.meme, o.stock, o.ethStockFee, o.ethStockSpacing);
// Leg 1: spend all the ETH for stock, through the public pool. ETH is currency0, so
// buying the stock is zeroForOne (price falls); an extreme limit means "no limit".
BalanceDelta d1 = poolManager.swap(
ethKey,
IPoolManager.SwapParams({
zeroForOne: true,
amountSpecified: -int256(o.ethBudget),
sqrtPriceLimitX96: TickMath.MIN_SQRT_PRICE + 1
}),
""
);
uint256 stockOut = uint256(uint128(d1.amount1())); // stock received (currency1)
// Leg 2: spend all that stock for meme, through OUR pool. `sender` into this swap is
// the zap, not the factory, so the snipe guard charges it — the security property.
// The guard's fee lands on the meme output, so `memeOut` is already net of it.
bool leg2ZeroForOne = !memeIsToken0; // stock -> meme
BalanceDelta d2 = poolManager.swap(
memeKey,
IPoolManager.SwapParams({
zeroForOne: leg2ZeroForOne,
amountSpecified: -int256(stockOut),
sqrtPriceLimitX96: leg2ZeroForOne ? TickMath.MIN_SQRT_PRICE + 1 : TickMath.MAX_SQRT_PRICE - 1
}),
""
);
uint256 memeOut = uint256(uint128(memeIsToken0 ? d2.amount0() : d2.amount1()));
// The single whole-route guard: the final meme out, after both legs and the snipe fee.
require(memeOut >= o.minMemeOut, "insufficient meme out");
// Settle all the ETH and take the meme to the buyer. The stock nets to zero across the
// two legs; a partial fill on either leg would leave a non-zero delta and revert with
// CurrencyNotSettled, which fails safe — the buyer keeps their ETH and the zap keeps
// nothing.
poolManager.settle{value: o.ethBudget}();
poolManager.take(memeIsToken0 ? memeKey.currency0 : memeKey.currency1, o.recipient, memeOut);
return abi.encode(memeOut);
}
/// @dev meme → stock → ETH, the mirror of `_onBuy`. `preview` runs the identical route and
/// then throws the answer away (see `previewSell`), which is what makes a quote and a
/// sell impossible to disagree.
function _onSell(SellOp memory o, bool preview) internal returns (bytes memory) {
(PoolKey memory memeKey, PoolKey memory ethKey, bool memeIsToken0) =
_keys(o.meme, o.stock, o.ethStockFee, o.ethStockSpacing);
// Leg 1: spend all the meme for stock, through OUR pool. `sender` into this swap is
// the zap, so the snipe guard charges the sell exactly as it charges a buy — the zap
// is not the factory and must never become guard-exempt. The fee lands on the
// unspecified currency, which for an exact-input meme sell is the stock (the
// proceeds), and v4-core has already deducted it from the delta read below.
bool leg1ZeroForOne = memeIsToken0; // meme -> stock
BalanceDelta d1 = poolManager.swap(
memeKey,
IPoolManager.SwapParams({
zeroForOne: leg1ZeroForOne,
amountSpecified: -int256(o.memeIn),
sqrtPriceLimitX96: leg1ZeroForOne ? TickMath.MIN_SQRT_PRICE + 1 : TickMath.MAX_SQRT_PRICE - 1
}),
""
);
uint256 stockOut = uint256(uint128(memeIsToken0 ? d1.amount1() : d1.amount0()));
// Leg 2: spend all that (post-guard) stock for native ETH, through the public pool.
// ETH is currency0 there, so selling the stock into it is oneForZero — price rises,
// and an extreme limit means "no limit".
BalanceDelta d2 = poolManager.swap(
ethKey,
IPoolManager.SwapParams({
zeroForOne: false,
amountSpecified: -int256(stockOut),
sqrtPriceLimitX96: TickMath.MAX_SQRT_PRICE - 1
}),
""
);
uint256 ethOut = uint256(uint128(d2.amount0())); // native ETH received (currency0)
// The quote path stops here and discards everything: no floor to check, no payer to
// pull from, nothing settled. The revert is the return value.
if (preview) revert PreviewResult(ethOut);
// The single whole-route guard: the final native ETH, after both legs and the snipe
// fee. Checked BEFORE the seller's meme is pulled, so a floor that fails costs them
// nothing but gas.
require(ethOut >= o.minEthOut, "insufficient ETH out");
// Pay what we owe first, then take. The stock nets to zero across the two legs; a
// partial fill on either leg leaves a non-zero delta and reverts with
// CurrencyNotSettled, which fails safe — the seller keeps their meme.
//
// Taking native ETH straight to `recipient` hands control to that address (a native
// transfer forwards all gas), which is why it is the LAST thing that happens and why
// every debit is already settled by then. A reentrant attempt cannot steal: anything
// it did inside our still-open unlock would have to close its own deltas, and the
// PoolManager's global non-zero-delta check would otherwise revert this whole call.
_settleFromPayer(memeIsToken0 ? memeKey.currency0 : memeKey.currency1, o.payer, o.memeIn);
poolManager.take(ethKey.currency0, o.recipient, ethOut);
return abi.encode(ethOut);
}
/// @dev Both pool identities, from the same inputs, in one place — a V4 pool IS the hash
/// of its key, so two copies of this construction is two chances to address a
/// different (usually non-existent) pool.
/// @return memeKey our launch pool: (meme, stock) sorted, our fee tier and spacing, our
/// hook. The hook field is the immutable, so the meme leg can only ever run
/// through a real Rawbin launch.
/// @return ethKey the public pool: native ETH (address(0)) is always currency0; no hook.
/// @return memeIsToken0 true when the meme sorts below the stock, which fixes direction.
function _keys(address meme, address stock, uint24 ethStockFee, int24 ethStockSpacing)
internal
view
returns (PoolKey memory memeKey, PoolKey memory ethKey, bool memeIsToken0)
{
memeIsToken0 = uint160(meme) < uint160(stock);
(Currency mc0, Currency mc1) = memeIsToken0
? (Currency.wrap(meme), Currency.wrap(stock))
: (Currency.wrap(stock), Currency.wrap(meme));
memeKey =
PoolKey({currency0: mc0, currency1: mc1, fee: memeFee, tickSpacing: memeSpacing, hooks: IHooks(hook)});
ethKey = PoolKey({
currency0: Currency.wrap(address(0)),
currency1: Currency.wrap(stock),
fee: ethStockFee,
tickSpacing: ethStockSpacing,
hooks: IHooks(address(0))
});
}
/// @dev Pay `amount` of `currency` into the PoolManager straight out of `payer`'s wallet,
/// resolving the debit leg 1 opened. Straight from the payer, never via a balance of
/// our own, so the zap never holds the seller's token for even one instruction.
///
/// Low-level and tolerant of a missing return value for the same reason as
/// `RawbinHookRWA._payToPool`: solc decodes the return of a typed `transferFrom` even
/// when it is discarded, so a token that returns no data (the USDT-style convention)
/// would revert on the decode. Tolerance is not laxity here — `settle()` credits only
/// what the PoolManager's balance actually grew by, so a token that silently moves
/// nothing leaves the debit open and the whole unlock reverts with CurrencyNotSettled.
/// A fee-on-transfer token fails the same way, which is the correct outcome: this
/// route is exact-input and cannot silently sell a different amount than it was told.
function _settleFromPayer(Currency currency, address payer, uint256 amount) internal {
poolManager.sync(currency);
(bool ok, bytes memory ret) = Currency.unwrap(currency).call(
abi.encodeWithSelector(IERC20.transferFrom.selector, payer, address(poolManager), amount)
);
require(ok && (ret.length == 0 || abi.decode(ret, (bool))), "meme transferFrom failed");
poolManager.settle();
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "poolManager_",
"type": "address",
"internalType": "contract IPoolManager"
},
{
"name": "factory",
"type": "address",
"internalType": "contract RawbinRwa"
}
],
"stateMutability": "nonpayable"
},
{
"name": "NotPoolManager",
"type": "error",
"inputs": []
},
{
"name": "PreviewDidNotRevert",
"type": "error",
"inputs": []
},
{
"name": "PreviewResult",
"type": "error",
"inputs": [
{
"name": "ethOut",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "hook",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "memeFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint24",
"internalType": "uint24"
}
],
"stateMutability": "view"
},
{
"name": "memeSpacing",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "int24",
"internalType": "int24"
}
],
"stateMutability": "view"
},
{
"name": "poolManager",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IPoolManager"
}
],
"stateMutability": "view"
},
{
"name": "previewSell",
"type": "function",
"inputs": [
{
"name": "meme",
"type": "address",
"internalType": "address"
},
{
"name": "stock",
"type": "address",
"internalType": "address"
},
{
"name": "ethStockFee",
"type": "uint24",
"internalType": "uint24"
},
{
"name": "ethStockSpacing",
"type": "int24",
"internalType": "int24"
},
{
"name": "memeIn",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "ethOut",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "previewSellRoute",
"type": "function",
"inputs": [
{
"name": "meme",
"type": "address",
"internalType": "address"
},
{
"name": "stock",
"type": "address",
"internalType": "address"
},
{
"name": "ethStockFee",
"type": "uint24",
"internalType": "uint24"
},
{
"name": "ethStockSpacing",
"type": "int24",
"internalType": "int24"
},
{
"name": "memeIn",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "unlockCallback",
"type": "function",
"inputs": [
{
"name": "data",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [
{
"name": "",
"type": "bytes",
"internalType": "bytes"
}
],
"stateMutability": "nonpayable"
},
{
"name": "zapBuy",
"type": "function",
"inputs": [
{
"name": "meme",
"type": "address",
"internalType": "address"
},
{
"name": "stock",
"type": "address",
"internalType": "address"
},
{
"name": "ethStockFee",
"type": "uint24",
"internalType": "uint24"
},
{
"name": "ethStockSpacing",
"type": "int24",
"internalType": "int24"
},
{
"name": "minMemeOut",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "recipient",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "memeOut",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "payable"
},
{
"name": "zapSell",
"type": "function",
"inputs": [
{
"name": "meme",
"type": "address",
"internalType": "address"
},
{
"name": "stock",
"type": "address",
"internalType": "address"
},
{
"name": "ethStockFee",
"type": "uint24",
"internalType": "uint24"
},
{
"name": "ethStockSpacing",
"type": "int24",
"internalType": "int24"
},
{
"name": "memeIn",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "minEthOut",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "recipient",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "ethOut",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
}
]0x61010060405234801562000011575f80fd5b5060405162001fc438038062001fc48339810160408190526200003491620001c8565b816001600160a01b03166080816001600160a01b031681525050806001600160a01b0316637f5a7c7b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200008b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620000b1919062000205565b6001600160a01b031660a0816001600160a01b031681525050806001600160a01b031663dd1b9c4a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000107573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200012d91906200022a565b62ffffff1660c08162ffffff1681525050806001600160a01b03166346ca626b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200017b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001a191906200024e565b60020b60e05250620002709050565b6001600160a01b0381168114620001c5575f80fd5b50565b5f8060408385031215620001da575f80fd5b8251620001e781620001b0565b6020840151909250620001fa81620001b0565b809150509250929050565b5f6020828403121562000216575f80fd5b81516200022381620001b0565b9392505050565b5f602082840312156200023b575f80fd5b815162ffffff8116811462000223575f80fd5b5f602082840312156200025f575f80fd5b81518060020b811462000223575f80fd5b60805160a05160c05160e051611caa6200031a5f395f81816099015261121b01525f818161020e01526111f001525f8181610105015261124401525f81816101db015281816102c80152818161046c01528181610609015281816108a001528181610a0101528181610aef01528181610c5b01528181610ce301528181610de701528181610f0c015281816110c2015281816112e80152818161135301526114780152611caa5ff3fe608060405260043610610084575f3560e01c806391e9e6661161005757806391e9e6661461016b578063a74eb8f61461018a578063c6e68be3146101a9578063dc4c90d3146101ca578063eea4a5c0146101fd575f80fd5b806313e81563146100885780632eb3530d146100d35780637f5a7c7b146100f457806391dd73461461013f575b5f80fd5b348015610093575f80fd5b506100bb7f000000000000000000000000000000000000000000000000000000000000000081565b60405160029190910b81526020015b60405180910390f35b6100e66100e136600461152c565b610244565b6040519081526020016100ca565b3480156100ff575f80fd5b506101277f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100ca565b34801561014a575f80fd5b5061015e6101593660046115a1565b61045f565b6040516100ca919061165a565b348015610176575f80fd5b506100e6610185366004611673565b610536565b348015610195575f80fd5b506100e66101a43660046116f2565b610758565b3480156101b4575f80fd5b506101c86101c33660046116f2565b610863565b005b3480156101d5575f80fd5b506101277f000000000000000000000000000000000000000000000000000000000000000081565b348015610208575f80fd5b506102307f000000000000000000000000000000000000000000000000000000000000000081565b60405162ffffff90911681526020016100ca565b5f6001600160a01b03821661028e5760405162461bcd60e51b815260206004820152600b60248201526a0726563697069656e743d360ac1b60448201526064015b60405180910390fd5b5f34116102c65760405162461bcd60e51b81526020600482015260066024820152650dcde408aa8960d31b6044820152606401610285565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166348c894915f6040518060e001604052808b6001600160a01b031681526020018a6001600160a01b031681526020018962ffffff1681526020018860020b8152602001878152602001348152602001866001600160a01b03168152506040516020016103b6919081516001600160a01b03908116825260208084015182169083015260408084015162ffffff169083015260608084015160020b908301526080808401519083015260a0838101519083015260c092830151169181019190915260e00190565b60408051601f19818403018152908290526103d49291602001611766565b6040516020818303038152906040526040518263ffffffff1660e01b81526004016103ff919061165a565b5f604051808303815f875af115801561041a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610441919081019061180e565b806020019051810190610454919061187c565b979650505050505050565b6060336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104aa5760405163570c108560e11b815260040160405180910390fd5b5f806104b884860186611893565b90925090505f8260028111156104d0576104d0611752565b036104fa576104f1818060200190518101906104ec9190611944565b6109d8565b92505050610530565b61052b8180602001905181019061051191906119ee565b600284600281111561052557610525611752565b14610dba565b925050505b92915050565b5f6001600160a01b03821661057b5760405162461bcd60e51b815260206004820152600b60248201526a0726563697069656e743d360ac1b6044820152606401610285565b5f84116105b45760405162461bcd60e51b81526020600482015260076024820152666e6f206d656d6560c81b6044820152606401610285565b6f7fffffffffffffffffffffffffffffff8411156106075760405162461bcd60e51b815260206004820152601060248201526f6d656d65496e20746f6f206c6172676560801b6044820152606401610285565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166348c8949160016040518061010001604052808c6001600160a01b031681526020018b6001600160a01b031681526020018a62ffffff1681526020018960020b8152602001888152602001878152602001866001600160a01b03168152602001336001600160a01b03168152506040516020016106ae9190611aa8565b60408051601f19818403018152908290526106cc9291602001611766565b6040516020818303038152906040526040518263ffffffff1660e01b81526004016106f7919061165a565b5f604051808303815f875af1158015610712573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610739919081019061180e565b80602001905181019061074c919061187c565b98975050505050505050565b60405163c6e68be360e01b81526001600160a01b0380871660048301528516602482015262ffffff84166044820152600283900b6064820152608481018290525f90309063c6e68be39060a4015f604051808303815f87803b1580156107bc575f80fd5b505af19250505080156107cd575060015b610841573d8080156107fa576040519150601f19603f3d011682016040523d82523d5f602084013e6107ff565b606091505b508051602414801561082957506388b6072160e01b61081d82611b1a565b6001600160e01b031916145b156108395760240151905061085a565b805160208201fd5b60405163073148bb60e31b815260040160405180910390fd5b95945050505050565b33301461089e5760405162461bcd60e51b815260206004820152600960248201526873656c66206f6e6c7960b81b6044820152606401610285565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166348c894916002604051806101000160405280896001600160a01b03168152602001886001600160a01b031681526020018762ffffff1681526020018660020b81526020018581526020015f81526020015f6001600160a01b031681526020015f6001600160a01b03168152506040516020016109459190611aa8565b60408051601f19818403018152908290526109639291602001611766565b6040516020818303038152906040526040518263ffffffff1660e01b815260040161098e919061165a565b5f604051808303815f875af11580156109a9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526109d0919081019061180e565b505050505050565b60605f805f6109f8855f015186602001518760400151886060015161114d565b9250925092505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f3cd914c8460405180606001604052806001151581526020018a60a00151610a5190611b65565b8152602001610a666401000276a36001611b7f565b6001600160a01b03168152506040518363ffffffff1660e01b8152600401610a8f929190611b9f565b6020604051808303815f875af1158015610aab573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610acf919061187c565b90505f610adc82600f0b90565b6001600160801b031690505f831590505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f3cd914c886040518060600160405280861515815260200187610b3a90611b65565b815260200186610b6857610b63600173fffd8963efd1fc6a506488495d951d5263988d26611c1a565b610b78565b610b786401000276a36001611b7f565b6001600160a01b03168152506040518363ffffffff1660e01b8152600401610ba1929190611b9f565b6020604051808303815f875af1158015610bbd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610be1919061187c565b90505f85610bf857610bf382600f0b90565b610c02565b610c028260801d90565b6001600160801b031690508960800151811015610c595760405162461bcd60e51b81526020600482015260156024820152741a5b9cdd59999a58da595b9d081b595b59481bdd5d605a1b6044820152606401610285565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166311da60b48b60a001516040518263ffffffff1660e01b815260040160206040518083038185885af1158015610cbb573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190610ce0919061187c565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630b0d9c0987610d1f578960200151610d22565b89515b60c08d01516040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604481018490526064015f604051808303815f87803b158015610d73575f80fd5b505af1158015610d85573d5f803e3d5ffd5b5050505080604051602001610d9c91815260200190565b60405160208183030381529060405298505050505050505050919050565b60605f805f610dda865f015187602001518860400151896060015161114d565b9250925092505f8190505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f3cd914c86604051806060016040528086151581526020018c60800151610e3690611b65565b815260200186610e6457610e5f600173fffd8963efd1fc6a506488495d951d5263988d26611c1a565b610e74565b610e746401000276a36001611b7f565b6001600160a01b03168152506040518363ffffffff1660e01b8152600401610e9d929190611b9f565b6020604051808303815f875af1158015610eb9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610edd919061187c565b90505f83610ef457610eef8260801d90565b610efe565b610efe82600f0b90565b6001600160801b031690505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f3cd914c8760405180606001604052805f1515815260200186610f5790611b65565b8152602001610f7b600173fffd8963efd1fc6a506488495d951d5263988d26611c1a565b6001600160a01b03168152506040518363ffffffff1660e01b8152600401610fa4929190611b9f565b6020604051808303815f875af1158015610fc0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fe4919061187c565b90505f610ff18260801d90565b6001600160801b03169050891561101e576040516388b6072160e01b815260048101829052602401610285565b8a60a001518110156110695760405162461bcd60e51b81526020600482015260146024820152731a5b9cdd59999a58da595b9d08115512081bdd5d60621b6044820152606401610285565b61108d8661107b57886020015161107e565b88515b8c60e001518d608001516112c9565b865160c08c0151604051630b0d9c0960e01b81526001600160a01b0392831660048201529082166024820152604481018390527f000000000000000000000000000000000000000000000000000000000000000090911690630b0d9c09906064015f604051808303815f87803b158015611105575f80fd5b505af1158015611117573d5f803e3d5ffd5b505050508060405160200161112e91815260200190565b6040516020818303038152906040529850505050505050505092915050565b6040805160a0810182525f808252602082018190529181018290526060810182905260808101919091526040805160a0810182525f808252602082018190529181018290526060810182905260808101919091526001600160a01b03808616908716105f80826111be5787896111c1565b88885b915091506040518060a00160405280836001600160a01b03168152602001826001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000062ffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000060020b81526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681525094506040518060a001604052805f6001600160a01b03168152602001896001600160a01b031681526020018862ffffff1681526020018760020b81526020015f6001600160a01b0316815250935050509450945094915050565b604051632961046560e21b81526001600160a01b0384811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063a5841194906024015f604051808303815f87803b158015611329575f80fd5b505af115801561133b573d5f803e3d5ffd5b5050604080516001600160a01b0386811660248301527f000000000000000000000000000000000000000000000000000000000000000081166044830152606480830187905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291515f9450849350918716916113c29190611c3a565b5f604051808303815f865af19150503d805f81146113fb576040519150601f19603f3d011682016040523d82523d5f602084013e611400565b606091505b509150915081801561142a57508051158061142a57508080602001905181019061142a9190611c55565b6114765760405162461bcd60e51b815260206004820152601860248201527f6d656d65207472616e7366657246726f6d206661696c656400000000000000006044820152606401610285565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166311da60b46040518163ffffffff1660e01b81526004016020604051808303815f875af11580156114d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109d0919061187c565b6001600160a01b038116811461150b575f80fd5b50565b62ffffff8116811461150b575f80fd5b8060020b811461150b575f80fd5b5f805f805f8060c08789031215611541575f80fd5b863561154c816114f7565b9550602087013561155c816114f7565b9450604087013561156c8161150e565b9350606087013561157c8161151e565b92506080870135915060a0870135611593816114f7565b809150509295509295509295565b5f80602083850312156115b2575f80fd5b823567ffffffffffffffff808211156115c9575f80fd5b818501915085601f8301126115dc575f80fd5b8135818111156115ea575f80fd5b8660208285010111156115fb575f80fd5b60209290920196919550909350505050565b5f5b8381101561162757818101518382015260200161160f565b50505f910152565b5f815180845261164681602086016020860161160d565b601f01601f19169290920160200192915050565b602081525f61166c602083018461162f565b9392505050565b5f805f805f805f60e0888a031215611689575f80fd5b8735611694816114f7565b965060208801356116a4816114f7565b955060408801356116b48161150e565b945060608801356116c48161151e565b93506080880135925060a0880135915060c08801356116e2816114f7565b8091505092959891949750929550565b5f805f805f60a08688031215611706575f80fd5b8535611711816114f7565b94506020860135611721816114f7565b935060408601356117318161150e565b925060608601356117418161151e565b949793965091946080013592915050565b634e487b7160e01b5f52602160045260245ffd5b5f6003841061178357634e487b7160e01b5f52602160045260245ffd5b8382526040602083015261179a604083018461162f565b949350505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156117df576117df6117a2565b604052919050565b5f67ffffffffffffffff821115611800576118006117a2565b50601f01601f191660200190565b5f6020828403121561181e575f80fd5b815167ffffffffffffffff811115611834575f80fd5b8201601f81018413611844575f80fd5b8051611857611852826117e7565b6117b6565b81815285602083850101111561186b575f80fd5b61085a82602083016020860161160d565b5f6020828403121561188c575f80fd5b5051919050565b5f80604083850312156118a4575f80fd5b8235600381106118b2575f80fd5b9150602083013567ffffffffffffffff8111156118cd575f80fd5b8301601f810185136118dd575f80fd5b80356118eb611852826117e7565b8181528660208385010111156118ff575f80fd5b816020840160208301375f602083830101528093505050509250929050565b8051611929816114f7565b919050565b80516119298161150e565b80516119298161151e565b5f60e08284031215611954575f80fd5b60405160e0810181811067ffffffffffffffff82111715611977576119776117a2565b6040528251611985816114f7565b81526020830151611995816114f7565b602082015260408301516119a88161150e565b604082015260608301516119bb8161151e565b806060830152506080830151608082015260a083015160a08201526119e260c0840161191e565b60c08201529392505050565b5f610100808385031215611a00575f80fd5b6040519081019067ffffffffffffffff82118183101715611a2357611a236117a2565b8160405283519150611a34826114f7565b818152611a436020850161191e565b6020820152611a546040850161192e565b6040820152611a6560608501611939565b60608201526080840151608082015260a084015160a0820152611a8a60c0850161191e565b60c0820152611a9b60e0850161191e565b60e0820152949350505050565b81516001600160a01b03908116825260208084015182169083015260408084015162ffffff169083015260608084015160020b908301526080808401519083015260a0808401519083015260c08084015182169083015260e080840151918216908301526101008201905b5092915050565b805160208201516001600160e01b03198082169291906004831015611b495780818460040360031b1b83161693505b505050919050565b634e487b7160e01b5f52601160045260245ffd5b5f600160ff1b8201611b7957611b79611b51565b505f0390565b6001600160a01b03818116838216019080821115611b1357611b13611b51565b5f61012060018060a01b0380865116845280602087015116602085015262ffffff6040870151166040850152606086015160020b60608501528060808701511660808501528451151560a0850152602085015160c08501528060408601511660e0850152508061010084015261085a8184015f815260200190565b6001600160a01b03828116828216039080821115611b1357611b13611b51565b5f8251611c4b81846020870161160d565b9190910192915050565b5f60208284031215611c65575f80fd5b8151801515811461166c575f80fdfea2646970667358221220006b94a949866dc7fa70681276bcc1e4457945aa0924dc449d0831b9f218724564736f6c634300081800330000000000000000000000008366a39cc670b4001a1121b8f6a443a643e40951000000000000000000000000af7c6ae0c9eafa20d384e161862b4e75f902d999
0x608060405260043610610084575f3560e01c806391e9e6661161005757806391e9e6661461016b578063a74eb8f61461018a578063c6e68be3146101a9578063dc4c90d3146101ca578063eea4a5c0146101fd575f80fd5b806313e81563146100885780632eb3530d146100d35780637f5a7c7b146100f457806391dd73461461013f575b5f80fd5b348015610093575f80fd5b506100bb7f00000000000000000000000000000000000000000000000000000000000000c881565b60405160029190910b81526020015b60405180910390f35b6100e66100e136600461152c565b610244565b6040519081526020016100ca565b3480156100ff575f80fd5b506101277f00000000000000000000000065554efb22cf1f14684896209c8d41cc176d284481565b6040516001600160a01b0390911681526020016100ca565b34801561014a575f80fd5b5061015e6101593660046115a1565b61045f565b6040516100ca919061165a565b348015610176575f80fd5b506100e6610185366004611673565b610536565b348015610195575f80fd5b506100e66101a43660046116f2565b610758565b3480156101b4575f80fd5b506101c86101c33660046116f2565b610863565b005b3480156101d5575f80fd5b506101277f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095181565b348015610208575f80fd5b506102307f000000000000000000000000000000000000000000000000000000000000271081565b60405162ffffff90911681526020016100ca565b5f6001600160a01b03821661028e5760405162461bcd60e51b815260206004820152600b60248201526a0726563697069656e743d360ac1b60448201526064015b60405180910390fd5b5f34116102c65760405162461bcd60e51b81526020600482015260066024820152650dcde408aa8960d31b6044820152606401610285565b7f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409516001600160a01b03166348c894915f6040518060e001604052808b6001600160a01b031681526020018a6001600160a01b031681526020018962ffffff1681526020018860020b8152602001878152602001348152602001866001600160a01b03168152506040516020016103b6919081516001600160a01b03908116825260208084015182169083015260408084015162ffffff169083015260608084015160020b908301526080808401519083015260a0838101519083015260c092830151169181019190915260e00190565b60408051601f19818403018152908290526103d49291602001611766565b6040516020818303038152906040526040518263ffffffff1660e01b81526004016103ff919061165a565b5f604051808303815f875af115801561041a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610441919081019061180e565b806020019051810190610454919061187c565b979650505050505050565b6060336001600160a01b037f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095116146104aa5760405163570c108560e11b815260040160405180910390fd5b5f806104b884860186611893565b90925090505f8260028111156104d0576104d0611752565b036104fa576104f1818060200190518101906104ec9190611944565b6109d8565b92505050610530565b61052b8180602001905181019061051191906119ee565b600284600281111561052557610525611752565b14610dba565b925050505b92915050565b5f6001600160a01b03821661057b5760405162461bcd60e51b815260206004820152600b60248201526a0726563697069656e743d360ac1b6044820152606401610285565b5f84116105b45760405162461bcd60e51b81526020600482015260076024820152666e6f206d656d6560c81b6044820152606401610285565b6f7fffffffffffffffffffffffffffffff8411156106075760405162461bcd60e51b815260206004820152601060248201526f6d656d65496e20746f6f206c6172676560801b6044820152606401610285565b7f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409516001600160a01b03166348c8949160016040518061010001604052808c6001600160a01b031681526020018b6001600160a01b031681526020018a62ffffff1681526020018960020b8152602001888152602001878152602001866001600160a01b03168152602001336001600160a01b03168152506040516020016106ae9190611aa8565b60408051601f19818403018152908290526106cc9291602001611766565b6040516020818303038152906040526040518263ffffffff1660e01b81526004016106f7919061165a565b5f604051808303815f875af1158015610712573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610739919081019061180e565b80602001905181019061074c919061187c565b98975050505050505050565b60405163c6e68be360e01b81526001600160a01b0380871660048301528516602482015262ffffff84166044820152600283900b6064820152608481018290525f90309063c6e68be39060a4015f604051808303815f87803b1580156107bc575f80fd5b505af19250505080156107cd575060015b610841573d8080156107fa576040519150601f19603f3d011682016040523d82523d5f602084013e6107ff565b606091505b508051602414801561082957506388b6072160e01b61081d82611b1a565b6001600160e01b031916145b156108395760240151905061085a565b805160208201fd5b60405163073148bb60e31b815260040160405180910390fd5b95945050505050565b33301461089e5760405162461bcd60e51b815260206004820152600960248201526873656c66206f6e6c7960b81b6044820152606401610285565b7f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409516001600160a01b03166348c894916002604051806101000160405280896001600160a01b03168152602001886001600160a01b031681526020018762ffffff1681526020018660020b81526020018581526020015f81526020015f6001600160a01b031681526020015f6001600160a01b03168152506040516020016109459190611aa8565b60408051601f19818403018152908290526109639291602001611766565b6040516020818303038152906040526040518263ffffffff1660e01b815260040161098e919061165a565b5f604051808303815f875af11580156109a9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526109d0919081019061180e565b505050505050565b60605f805f6109f8855f015186602001518760400151886060015161114d565b9250925092505f7f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409516001600160a01b031663f3cd914c8460405180606001604052806001151581526020018a60a00151610a5190611b65565b8152602001610a666401000276a36001611b7f565b6001600160a01b03168152506040518363ffffffff1660e01b8152600401610a8f929190611b9f565b6020604051808303815f875af1158015610aab573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610acf919061187c565b90505f610adc82600f0b90565b6001600160801b031690505f831590505f7f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409516001600160a01b031663f3cd914c886040518060600160405280861515815260200187610b3a90611b65565b815260200186610b6857610b63600173fffd8963efd1fc6a506488495d951d5263988d26611c1a565b610b78565b610b786401000276a36001611b7f565b6001600160a01b03168152506040518363ffffffff1660e01b8152600401610ba1929190611b9f565b6020604051808303815f875af1158015610bbd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610be1919061187c565b90505f85610bf857610bf382600f0b90565b610c02565b610c028260801d90565b6001600160801b031690508960800151811015610c595760405162461bcd60e51b81526020600482015260156024820152741a5b9cdd59999a58da595b9d081b595b59481bdd5d605a1b6044820152606401610285565b7f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409516001600160a01b03166311da60b48b60a001516040518263ffffffff1660e01b815260040160206040518083038185885af1158015610cbb573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190610ce0919061187c565b507f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409516001600160a01b0316630b0d9c0987610d1f578960200151610d22565b89515b60c08d01516040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604481018490526064015f604051808303815f87803b158015610d73575f80fd5b505af1158015610d85573d5f803e3d5ffd5b5050505080604051602001610d9c91815260200190565b60405160208183030381529060405298505050505050505050919050565b60605f805f610dda865f015187602001518860400151896060015161114d565b9250925092505f8190505f7f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409516001600160a01b031663f3cd914c86604051806060016040528086151581526020018c60800151610e3690611b65565b815260200186610e6457610e5f600173fffd8963efd1fc6a506488495d951d5263988d26611c1a565b610e74565b610e746401000276a36001611b7f565b6001600160a01b03168152506040518363ffffffff1660e01b8152600401610e9d929190611b9f565b6020604051808303815f875af1158015610eb9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610edd919061187c565b90505f83610ef457610eef8260801d90565b610efe565b610efe82600f0b90565b6001600160801b031690505f7f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409516001600160a01b031663f3cd914c8760405180606001604052805f1515815260200186610f5790611b65565b8152602001610f7b600173fffd8963efd1fc6a506488495d951d5263988d26611c1a565b6001600160a01b03168152506040518363ffffffff1660e01b8152600401610fa4929190611b9f565b6020604051808303815f875af1158015610fc0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fe4919061187c565b90505f610ff18260801d90565b6001600160801b03169050891561101e576040516388b6072160e01b815260048101829052602401610285565b8a60a001518110156110695760405162461bcd60e51b81526020600482015260146024820152731a5b9cdd59999a58da595b9d08115512081bdd5d60621b6044820152606401610285565b61108d8661107b57886020015161107e565b88515b8c60e001518d608001516112c9565b865160c08c0151604051630b0d9c0960e01b81526001600160a01b0392831660048201529082166024820152604481018390527f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095190911690630b0d9c09906064015f604051808303815f87803b158015611105575f80fd5b505af1158015611117573d5f803e3d5ffd5b505050508060405160200161112e91815260200190565b6040516020818303038152906040529850505050505050505092915050565b6040805160a0810182525f808252602082018190529181018290526060810182905260808101919091526040805160a0810182525f808252602082018190529181018290526060810182905260808101919091526001600160a01b03808616908716105f80826111be5787896111c1565b88885b915091506040518060a00160405280836001600160a01b03168152602001826001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000271062ffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000c860020b81526020017f00000000000000000000000065554efb22cf1f14684896209c8d41cc176d28446001600160a01b031681525094506040518060a001604052805f6001600160a01b03168152602001896001600160a01b031681526020018862ffffff1681526020018760020b81526020015f6001600160a01b0316815250935050509450945094915050565b604051632961046560e21b81526001600160a01b0384811660048301527f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e40951169063a5841194906024015f604051808303815f87803b158015611329575f80fd5b505af115801561133b573d5f803e3d5ffd5b5050604080516001600160a01b0386811660248301527f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095181166044830152606480830187905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17905291515f9450849350918716916113c29190611c3a565b5f604051808303815f865af19150503d805f81146113fb576040519150601f19603f3d011682016040523d82523d5f602084013e611400565b606091505b509150915081801561142a57508051158061142a57508080602001905181019061142a9190611c55565b6114765760405162461bcd60e51b815260206004820152601860248201527f6d656d65207472616e7366657246726f6d206661696c656400000000000000006044820152606401610285565b7f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409516001600160a01b03166311da60b46040518163ffffffff1660e01b81526004016020604051808303815f875af11580156114d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109d0919061187c565b6001600160a01b038116811461150b575f80fd5b50565b62ffffff8116811461150b575f80fd5b8060020b811461150b575f80fd5b5f805f805f8060c08789031215611541575f80fd5b863561154c816114f7565b9550602087013561155c816114f7565b9450604087013561156c8161150e565b9350606087013561157c8161151e565b92506080870135915060a0870135611593816114f7565b809150509295509295509295565b5f80602083850312156115b2575f80fd5b823567ffffffffffffffff808211156115c9575f80fd5b818501915085601f8301126115dc575f80fd5b8135818111156115ea575f80fd5b8660208285010111156115fb575f80fd5b60209290920196919550909350505050565b5f5b8381101561162757818101518382015260200161160f565b50505f910152565b5f815180845261164681602086016020860161160d565b601f01601f19169290920160200192915050565b602081525f61166c602083018461162f565b9392505050565b5f805f805f805f60e0888a031215611689575f80fd5b8735611694816114f7565b965060208801356116a4816114f7565b955060408801356116b48161150e565b945060608801356116c48161151e565b93506080880135925060a0880135915060c08801356116e2816114f7565b8091505092959891949750929550565b5f805f805f60a08688031215611706575f80fd5b8535611711816114f7565b94506020860135611721816114f7565b935060408601356117318161150e565b925060608601356117418161151e565b949793965091946080013592915050565b634e487b7160e01b5f52602160045260245ffd5b5f6003841061178357634e487b7160e01b5f52602160045260245ffd5b8382526040602083015261179a604083018461162f565b949350505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156117df576117df6117a2565b604052919050565b5f67ffffffffffffffff821115611800576118006117a2565b50601f01601f191660200190565b5f6020828403121561181e575f80fd5b815167ffffffffffffffff811115611834575f80fd5b8201601f81018413611844575f80fd5b8051611857611852826117e7565b6117b6565b81815285602083850101111561186b575f80fd5b61085a82602083016020860161160d565b5f6020828403121561188c575f80fd5b5051919050565b5f80604083850312156118a4575f80fd5b8235600381106118b2575f80fd5b9150602083013567ffffffffffffffff8111156118cd575f80fd5b8301601f810185136118dd575f80fd5b80356118eb611852826117e7565b8181528660208385010111156118ff575f80fd5b816020840160208301375f602083830101528093505050509250929050565b8051611929816114f7565b919050565b80516119298161150e565b80516119298161151e565b5f60e08284031215611954575f80fd5b60405160e0810181811067ffffffffffffffff82111715611977576119776117a2565b6040528251611985816114f7565b81526020830151611995816114f7565b602082015260408301516119a88161150e565b604082015260608301516119bb8161151e565b806060830152506080830151608082015260a083015160a08201526119e260c0840161191e565b60c08201529392505050565b5f610100808385031215611a00575f80fd5b6040519081019067ffffffffffffffff82118183101715611a2357611a236117a2565b8160405283519150611a34826114f7565b818152611a436020850161191e565b6020820152611a546040850161192e565b6040820152611a6560608501611939565b60608201526080840151608082015260a084015160a0820152611a8a60c0850161191e565b60c0820152611a9b60e0850161191e565b60e0820152949350505050565b81516001600160a01b03908116825260208084015182169083015260408084015162ffffff169083015260608084015160020b908301526080808401519083015260a0808401519083015260c08084015182169083015260e080840151918216908301526101008201905b5092915050565b805160208201516001600160e01b03198082169291906004831015611b495780818460040360031b1b83161693505b505050919050565b634e487b7160e01b5f52601160045260245ffd5b5f600160ff1b8201611b7957611b79611b51565b505f0390565b6001600160a01b03818116838216019080821115611b1357611b13611b51565b5f61012060018060a01b0380865116845280602087015116602085015262ffffff6040870151166040850152606086015160020b60608501528060808701511660808501528451151560a0850152602085015160c08501528060408601511660e0850152508061010084015261085a8184015f815260200190565b6001600160a01b03828116828216039080821115611b1357611b13611b51565b5f8251611c4b81846020870161160d565b9190910192915050565b5f60208284031215611c65575f80fd5b8151801515811461166c575f80fdfea2646970667358221220006b94a949866dc7fa70681276bcc1e4457945aa0924dc449d0831b9f218724564736f6c63430008180033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
| 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 | |||||||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| no event logs emitted by this address | |||
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 27,712,607 | 11 days agoTue, 04 Aug 2026 14:55:58 UTC | 0x64aad5…7c3a5d | CALL | zapBuy | 0xa73f…01c2 | OUT | 0x8366…0951 | 0.00053 ETH |
| 24,121,665 | 15 days agoFri, 31 Jul 2026 10:55:35 UTC | 0xfa039d…b459af | CALL | zapBuy | 0xa73f…01c2 | OUT | 0x8366…0951 | 0.00265 ETH |
| 22,199,766 | 17 days agoWed, 29 Jul 2026 05:23:37 UTC | 0x132f35…34a1f9 | CALL | zapBuy | 0xa73f…01c2 | OUT | 0x8366…0951 | 0.014 ETH |
| 22,051,134 | 17 days agoWed, 29 Jul 2026 01:15:16 UTC | 0x49ebdb…42a763 | CALL | zapBuy | 0xa73f…01c2 | OUT | 0x8366…0951 | 0.015 ETH |
| 22,045,832 | 17 days agoWed, 29 Jul 2026 01:06:27 UTC | 0xdc4c1f…dddfcf | CALL | zapBuy | 0xa73f…01c2 | OUT | 0x8366…0951 | 0.016 ETH |
| 22,045,378 | 17 days agoWed, 29 Jul 2026 01:05:41 UTC | 0xb4d4e0…0d3abb | CALL | zapBuy | 0xa73f…01c2 | OUT | 0x8366…0951 | 0.015 ETH |
| 22,041,484 | 17 days agoWed, 29 Jul 2026 00:59:11 UTC | 0x491574…4b7ec9 | CALL | zapBuy | 0xa73f…01c2 | OUT | 0x8366…0951 | 0.015 ETH |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x64aad5…7c3a5d | zapBuy | 27,712,607 | 11 days agoTue, 04 Aug 2026 14:55:58 UTC | 0x9ee9…4b11 | IN | RawbinZap | $1.010.00053 ETH | 0.00000341 | |
| 0xfa039d…b459af | zapBuy | 24,121,665 | 15 days agoFri, 31 Jul 2026 10:55:35 UTC | 0x88bf…600c | IN | RawbinZap | $4.990.00265 ETH | 0.00000470 | |
| 0xaeda7a…3a7c6e | zapSell | 22,200,636 | 17 days agoWed, 29 Jul 2026 05:25:04 UTC | 0xd6d0…6b23 | IN | RawbinZap | $0.000 ETH | 0.00000394 | |
| 0x068fbd…b7d7ac | zapSell | 22,200,427 | 17 days agoWed, 29 Jul 2026 05:24:43 UTC | 0xd6d0…6b23 | IN | RawbinZap | $0.000 ETH | 0.00000394 | |
| 0x132f35…34a1f9 | zapBuy | 22,199,766 | 17 days agoWed, 29 Jul 2026 05:23:37 UTC | 0xd6d0…6b23 | IN | RawbinZap | $26.340.014 ETH | 0.00000368 | |
| 0x747e89…b2a074 | zapSell | 22,199,607 | 17 days agoWed, 29 Jul 2026 05:23:21 UTC | 0xd6d0…6b23 | IN | RawbinZap | $0.000 ETH | 0.00000397 | |
| 0xd2f48b…e38946 | zapSell | 22,051,578 | 17 days agoWed, 29 Jul 2026 01:16:01 UTC | 0x0967…2bcf | IN | RawbinZap | $0.000 ETH | 0.00000406 | |
| 0x49ebdb…42a763 | zapBuy | 22,051,134 | 17 days agoWed, 29 Jul 2026 01:15:16 UTC | 0x0967…2bcf | IN | RawbinZap | $28.220.015 ETH | 0.00000448 | |
| 0xdc4c1f…dddfcf | zapBuy | 22,045,832 | 17 days agoWed, 29 Jul 2026 01:06:27 UTC | 0xd6d0…6b23 | IN | RawbinZap | $30.100.016 ETH | 0.00000390 | |
| 0xbe6dec…62acf8 | zapSell | 22,045,638 | 17 days agoWed, 29 Jul 2026 01:06:07 UTC | 0xd6d0…6b23 | IN | RawbinZap | $0.000 ETH | 0.00000412 | |
| 0xb4d4e0…0d3abb | zapBuy | 22,045,378 | 17 days agoWed, 29 Jul 2026 01:05:41 UTC | 0xd6d0…6b23 | IN | RawbinZap | $28.220.015 ETH | 0.00000391 | |
| 0x285323…1b6535 | zapSell | 22,045,196 | 17 days agoWed, 29 Jul 2026 01:05:23 UTC | 0xd6d0…6b23 | IN | RawbinZap | $0.000 ETH | 0.00000406 | |
| 0x491574…4b7ec9 | zapBuy | 22,041,484 | 17 days agoWed, 29 Jul 2026 00:59:11 UTC | 0xd6d0…6b23 | IN | RawbinZap | $28.220.015 ETH | 0.00000390 | |
| 0x5356f0…f8be6b | zapSell | 22,041,115 | 17 days agoWed, 29 Jul 2026 00:58:34 UTC | 0xd6d0…6b23 | IN | RawbinZap | $0.000 ETH | 0.00000466 |