// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import {IndexVault} from "./IndexVault.sol";
/// @dev Minimale Uniswap V4-interface. We hangen bewust niet de hele v4-core lib
/// binnen: we hebben alleen unlock/swap/settle/take nodig.
interface IPoolManager {
function unlock(bytes calldata data) external returns (bytes memory);
function swap(PoolKey memory key, SwapParams memory params, bytes calldata hookData) external returns (int256 delta);
function sync(address currency) external;
function settle() external payable returns (uint256);
function take(address currency, address to, uint256 amount) external;
}
struct PoolKey {
address currency0;
address currency1;
uint24 fee;
int24 tickSpacing;
address hooks;
}
struct SwapParams {
bool zeroForOne;
int256 amountSpecified; // <0 = exact input, >0 = exact output
uint160 sqrtPriceLimitX96;
}
/// @title ZapV4 — één transactie: ETH erin, hMAG7 eruit.
/// @notice De MAG7-stock tokens hebben geen bruikbare V3-liquiditeit en 0x weigert
/// ze ("not authorized for trade due to legal restrictions"). Alle diepte
/// zit in Uniswap V4. Dit contract koopt in één `unlock` de zeven
/// componenten (ETH → USDG → stock) en mint ze in-kind tegen de vault.
///
/// @dev Routering: elke component mag rechtstreeks uit een ETH-pool komen, óf
/// via USDG als tussenstap. Dat is niet cosmetisch — voor AAPL, GOOGL,
/// NVDA, META en TSLA zijn de ETH-pools véél dieper, terwijl MSFT er
/// helemaal geen heeft en AMZN alleen een lege. Eén vaste hub kiezen kost
/// dus altijd iemand geld; de caller quote't beide en levert per component
/// de goedkoopste pool aan.
///
/// Binnen één unlock netten de deltas: stock-swaps maken ETH- en/of
/// USDG-schuld, één ETH→USDG exact-output swap dekt precies de USDG-schuld
/// af, en aan het eind settlen we alleen ETH.
///
/// Veiligheid:
/// - Geen owner, geen upgrade, geen whitelist: de pool-keys komen van de caller
/// en het ergste dat een slechte key kan doen is de tx laten falen.
/// - maxEthIn = msg.value is de harde bovengrens; minSharesOut beschermt tegen
/// slippage. Alles wat overblijft gaat terug naar de caller.
/// - Het contract houdt tussen transacties in niets aan.
contract ZapV4 is ReentrancyGuard {
using SafeERC20 for IERC20;
uint160 internal constant MIN_SQRT_PRICE = 4295128739;
uint160 internal constant MAX_SQRT_PRICE = 1461446703485210103287273052203988822378723970342;
IPoolManager public immutable poolManager;
IndexVault public immutable vault;
address public immutable usdg;
event ZapMinted(address indexed sender, address indexed to, uint256 ethSpent, uint256 sharesOut);
event ZapRedeemed(address indexed sender, address indexed to, uint256 sharesIn, uint256 ethOut);
enum Action {
MINT,
REDEEM
}
error NotPoolManager();
error NoValue();
error ZeroShares();
error RouteMismatch();
error BadRoute(address component);
error InsufficientShares(uint256 got, uint256 want);
error EthRefundFailed();
error UsdgNotSettled(int256 delta);
error RouteTooThin(address component);
error InsufficientEth(uint256 got, uint256 want);
struct CallbackData {
uint256 shares;
PoolKey ethUsdg;
PoolKey[] stockPools;
address[] comps;
uint256[] amounts;
}
constructor(IPoolManager poolManager_, IndexVault vault_, address usdg_) {
poolManager = poolManager_;
vault = vault_;
usdg = usdg_;
}
receive() external payable {}
/// @notice Koop de basket met ETH en mint `shares` hMAG7 in één transactie.
/// @param ethUsdg de ETH/USDG V4-pool (currency0 moet native ETH zijn)
/// @param stockPools per component één USDG/<component>-pool, in dezelfde
/// volgorde als vault.allComponents()
/// @param shares hoeveel shares er gemint worden (vóór de mint-fee)
/// @param minSharesOut ondergrens op wat je ontvangt (mint-fee + slippage)
function zapMint(
PoolKey calldata ethUsdg,
PoolKey[] calldata stockPools,
uint256 shares,
uint256 minSharesOut,
address to
) external payable nonReentrant returns (uint256 sharesOut) {
if (msg.value == 0) revert NoValue();
if (shares == 0) revert ZeroShares();
address[] memory comps = vault.allComponents();
if (stockPools.length != comps.length) revert RouteMismatch();
uint256[] memory amounts = vault.amountsForMint(shares);
poolManager.unlock(
abi.encode(
Action.MINT,
abi.encode(
CallbackData({shares: shares, ethUsdg: ethUsdg, stockPools: stockPools, comps: comps, amounts: amounts})
)
)
);
// De componenten staan nu op dit contract; in-kind minten naar de user.
for (uint256 i = 0; i < comps.length; i++) {
IERC20(comps[i]).forceApprove(address(vault), amounts[i]);
}
sharesOut = vault.mint(shares, to);
if (sharesOut < minSharesOut) revert InsufficientShares(sharesOut, minSharesOut);
// Restjes terug: component-dust en niet-verbruikte ETH.
for (uint256 i = 0; i < comps.length; i++) {
uint256 dust = IERC20(comps[i]).balanceOf(address(this));
if (dust > 0) IERC20(comps[i]).safeTransfer(msg.sender, dust);
}
uint256 left = address(this).balance;
if (left > 0) {
(bool ok,) = msg.sender.call{value: left}("");
if (!ok) revert EthRefundFailed();
}
emit ZapMinted(msg.sender, to, msg.value - left, sharesOut);
}
/// @notice De omgekeerde weg: hMAG7 erin, ETH eruit — ook in één transactie.
/// Zonder dit krijg je bij redeem zeven stock tokens terug die je zelf
/// moet verkopen; wie met ETH instapt wil met ETH uitstappen.
/// @param shares hoeveel hMAG7 je inlevert (approve dit contract eerst)
/// @param minEthOut ondergrens op de ETH die je terugkrijgt
function zapRedeem(
PoolKey calldata ethUsdg,
PoolKey[] calldata stockPools,
uint256 shares,
uint256 minEthOut,
address to
) external nonReentrant returns (uint256 ethOut) {
if (shares == 0) revert ZeroShares();
address[] memory comps = vault.allComponents();
if (stockPools.length != comps.length) revert RouteMismatch();
IERC20(address(vault)).safeTransferFrom(msg.sender, address(this), shares);
vault.redeem(shares, address(this)); // levert de componenten pro-rata op
uint256[] memory amounts = new uint256[](comps.length);
for (uint256 i = 0; i < comps.length; i++) {
amounts[i] = IERC20(comps[i]).balanceOf(address(this));
}
poolManager.unlock(
abi.encode(
Action.REDEEM,
abi.encode(
CallbackData({shares: shares, ethUsdg: ethUsdg, stockPools: stockPools, comps: comps, amounts: amounts})
)
)
);
ethOut = address(this).balance;
if (ethOut < minEthOut) revert InsufficientEth(ethOut, minEthOut);
(bool ok,) = to.call{value: ethOut}("");
if (!ok) revert EthRefundFailed();
emit ZapRedeemed(msg.sender, to, shares, ethOut);
}
/// @dev Alle swaps gebeuren hierbinnen; de PoolManager verrekent pas aan het eind.
function unlockCallback(bytes calldata raw) external returns (bytes memory) {
if (msg.sender != address(poolManager)) revert NotPoolManager();
(Action action, bytes memory payload) = abi.decode(raw, (Action, bytes));
CallbackData memory d = abi.decode(payload, (CallbackData));
if (action == Action.REDEEM) {
_redeemToEth(d);
return "";
}
// 1. Koop elke component exact (exact-output), betaald in ETH of in USDG —
// net wat de caller als goedkoopste pool heeft aangeleverd.
int256 usdgDelta = 0;
int256 ethDelta = 0;
for (uint256 i = 0; i < d.comps.length; i++) {
PoolKey memory k = d.stockPools[i];
address comp = d.comps[i];
bool compIsCurrency1;
address payWith;
if (k.currency1 == comp) {
compIsCurrency1 = true;
payWith = k.currency0;
} else if (k.currency0 == comp) {
compIsCurrency1 = false;
payWith = k.currency1;
} else {
revert BadRoute(comp);
}
// we betalen alleen in ETH of USDG; iets anders kunnen we niet settlen
if (payWith != address(0) && payWith != usdg) revert BadRoute(comp);
(int256 a0, int256 a1) = _swap(k, compIsCurrency1, int256(d.amounts[i]));
int256 paid = compIsCurrency1 ? a0 : a1; // negatief: dit zijn we schuldig
int256 got = compIsCurrency1 ? a1 : a0; // positief: dit hebben we gekocht
// Een exact-output swap op een te dunne pool vult maar deels: je krijgt
// minder dan gevraagd. Zonder deze check nemen we alsnog het volle bedrag
// op en klapt de unlock op CurrencyNotSettled — een onleesbare revert.
if (got < int256(d.amounts[i])) revert RouteTooThin(comp);
if (payWith == usdg) usdgDelta += paid;
else ethDelta += paid;
}
// 2. Koop precies de USDG-schuld met ETH (exact-output), zodat USDG op 0 net.
// Loopt alles al direct via ETH-pools, dan slaan we deze swap over.
if (usdgDelta < 0) {
PoolKey memory k = d.ethUsdg;
// currency0 is per V4-conventie het lage adres → native ETH (0x0) is altijd currency0
if (k.currency0 != address(0) || k.currency1 != usdg) revert BadRoute(usdg);
(int256 a0, int256 a1) = _swap(k, true, -usdgDelta);
ethDelta += a0;
usdgDelta += a1;
}
if (usdgDelta != 0) revert UsdgNotSettled(usdgDelta);
// 3. Exact de ETH-schuld afrekenen — méér sturen laat een positieve delta
// achter en dan weigert de PoolManager de unlock te sluiten.
if (ethDelta < 0) poolManager.settle{value: uint256(-ethDelta)}();
// 4. De gekochte componenten ophalen.
for (uint256 i = 0; i < d.comps.length; i++) {
poolManager.take(d.comps[i], address(this), d.amounts[i]);
}
return "";
}
/// @dev De componenten die de redeem opleverde verkopen naar ETH. Spiegelbeeld
/// van de mint: daar kopen we exact-output, hier verkopen we exact-input
/// (we willen álles kwijt, en hoeveel ETH dat oplevert bepaalt de markt).
function _redeemToEth(CallbackData memory d) internal {
int256 usdgDelta = 0;
int256 ethDelta = 0;
for (uint256 i = 0; i < d.comps.length; i++) {
if (d.amounts[i] == 0) continue;
PoolKey memory k = d.stockPools[i];
address comp = d.comps[i];
bool compIsCurrency0;
address proceeds;
if (k.currency0 == comp) {
compIsCurrency0 = true;
proceeds = k.currency1;
} else if (k.currency1 == comp) {
compIsCurrency0 = false;
proceeds = k.currency0;
} else {
revert BadRoute(comp);
}
if (proceeds != address(0) && proceeds != usdg) revert BadRoute(comp);
(int256 a0, int256 a1) = _swap(k, compIsCurrency0, -int256(d.amounts[i])); // exact input
int256 gained = compIsCurrency0 ? a1 : a0;
if (proceeds == usdg) usdgDelta += gained;
else ethDelta += gained;
// de component zijn we schuldig aan de pool
poolManager.sync(comp);
IERC20(comp).safeTransfer(address(poolManager), d.amounts[i]);
poolManager.settle();
}
// alle USDG-opbrengst in één keer naar ETH; die USDG-schuld valt binnen
// dezelfde unlock weg tegen het tegoed van de swaps hierboven
if (usdgDelta > 0) {
if (d.ethUsdg.currency0 != address(0) || d.ethUsdg.currency1 != usdg) revert BadRoute(usdg);
(int256 b0,) = _swap(d.ethUsdg, false, -usdgDelta);
ethDelta += b0;
}
if (ethDelta > 0) poolManager.take(address(0), address(this), uint256(ethDelta));
}
/// @dev exact-output swap; geeft de twee deltas van deze pool terug.
/// V4 propt twee int128's in één int256 (amount0 hoog, amount1 laag) —
/// uitpakken exact zoals BalanceDeltaLibrary: sar voor de hoge helft,
/// signextend voor de lage, anders klopt het teken niet.
function _swap(PoolKey memory key, bool buyCurrency1, int256 exactOut)
internal
returns (int256 amount0, int256 amount1)
{
bool zeroForOne = buyCurrency1; // currency1 kopen = currency0 verkopen
int256 packed = poolManager.swap(
key,
SwapParams({
zeroForOne: zeroForOne,
amountSpecified: exactOut, // > 0 = exact output
sqrtPriceLimitX96: zeroForOne ? MIN_SQRT_PRICE + 1 : MAX_SQRT_PRICE - 1
}),
""
);
int128 a0;
int128 a1;
assembly ("memory-safe") {
a0 := sar(128, packed)
a1 := signextend(15, packed)
}
amount0 = int256(a0);
amount1 = int256(a1);
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "poolManager_",
"type": "address",
"internalType": "contract IPoolManager"
},
{
"name": "vault_",
"type": "address",
"internalType": "contract IndexVault"
},
{
"name": "usdg_",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"name": "BadRoute",
"type": "error",
"inputs": [
{
"name": "component",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "EthRefundFailed",
"type": "error",
"inputs": []
},
{
"name": "InsufficientEth",
"type": "error",
"inputs": [
{
"name": "got",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "want",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "InsufficientShares",
"type": "error",
"inputs": [
{
"name": "got",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "want",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "NoValue",
"type": "error",
"inputs": []
},
{
"name": "NotPoolManager",
"type": "error",
"inputs": []
},
{
"name": "ReentrancyGuardReentrantCall",
"type": "error",
"inputs": []
},
{
"name": "RouteMismatch",
"type": "error",
"inputs": []
},
{
"name": "RouteTooThin",
"type": "error",
"inputs": [
{
"name": "component",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "SafeERC20FailedOperation",
"type": "error",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "UsdgNotSettled",
"type": "error",
"inputs": [
{
"name": "delta",
"type": "int256",
"internalType": "int256"
}
]
},
{
"name": "ZeroShares",
"type": "error",
"inputs": []
},
{
"name": "ZapMinted",
"type": "event",
"inputs": [
{
"name": "sender",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "ethSpent",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "sharesOut",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "ZapRedeemed",
"type": "event",
"inputs": [
{
"name": "sender",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "sharesIn",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "ethOut",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "poolManager",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IPoolManager"
}
],
"stateMutability": "view"
},
{
"name": "unlockCallback",
"type": "function",
"inputs": [
{
"name": "raw",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [
{
"name": "",
"type": "bytes",
"internalType": "bytes"
}
],
"stateMutability": "nonpayable"
},
{
"name": "usdg",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "vault",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IndexVault"
}
],
"stateMutability": "view"
},
{
"name": "zapMint",
"type": "function",
"inputs": [
{
"name": "ethUsdg",
"type": "tuple",
"components": [
{
"name": "currency0",
"type": "address",
"internalType": "address"
},
{
"name": "currency1",
"type": "address",
"internalType": "address"
},
{
"name": "fee",
"type": "uint24",
"internalType": "uint24"
},
{
"name": "tickSpacing",
"type": "int24",
"internalType": "int24"
},
{
"name": "hooks",
"type": "address",
"internalType": "address"
}
],
"internalType": "struct PoolKey"
},
{
"name": "stockPools",
"type": "tuple[]",
"components": [
{
"name": "currency0",
"type": "address",
"internalType": "address"
},
{
"name": "currency1",
"type": "address",
"internalType": "address"
},
{
"name": "fee",
"type": "uint24",
"internalType": "uint24"
},
{
"name": "tickSpacing",
"type": "int24",
"internalType": "int24"
},
{
"name": "hooks",
"type": "address",
"internalType": "address"
}
],
"internalType": "struct PoolKey[]"
},
{
"name": "shares",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "minSharesOut",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "to",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "sharesOut",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "payable"
},
{
"name": "zapRedeem",
"type": "function",
"inputs": [
{
"name": "ethUsdg",
"type": "tuple",
"components": [
{
"name": "currency0",
"type": "address",
"internalType": "address"
},
{
"name": "currency1",
"type": "address",
"internalType": "address"
},
{
"name": "fee",
"type": "uint24",
"internalType": "uint24"
},
{
"name": "tickSpacing",
"type": "int24",
"internalType": "int24"
},
{
"name": "hooks",
"type": "address",
"internalType": "address"
}
],
"internalType": "struct PoolKey"
},
{
"name": "stockPools",
"type": "tuple[]",
"components": [
{
"name": "currency0",
"type": "address",
"internalType": "address"
},
{
"name": "currency1",
"type": "address",
"internalType": "address"
},
{
"name": "fee",
"type": "uint24",
"internalType": "uint24"
},
{
"name": "tickSpacing",
"type": "int24",
"internalType": "int24"
},
{
"name": "hooks",
"type": "address",
"internalType": "address"
}
],
"internalType": "struct PoolKey[]"
},
{
"name": "shares",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "minEthOut",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "to",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "ethOut",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"type": "receive",
"stateMutability": "payable"
}
]0x60e060405234801561000f575f80fd5b506040516125f03803806125f083398101604081905261002e91610086565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556001600160a01b0392831660805290821660a0521660c0526100d0565b6001600160a01b0381168114610083575f80fd5b50565b5f805f60608486031215610098575f80fd5b83516100a38161006f565b60208501519093506100b48161006f565b60408501519092506100c58161006f565b809150509250925092565b60805160a05160c0516124486101a85f395f818161013e01528181610dc601528181610ebd01528181610f4901528181610f9e015281816113af015281816114510152818161162b015261168401525f8181610171015281816101df0152818161029b015281816104740152818161050e015281816107a201528181610853015261089701525f818160f30152818161031201528181610a0a01528181610c4b01528181611036015281816110ca015281816114c5015281816115210152818161157901528181611700015261176d01526124485ff3fe608060405260043610610066575f3560e01c8063dc4c90d311610041578063dc4c90d3146100e2578063f5b91b7b1461012d578063fbfa77cf14610160575f80fd5b8063513426591461007157806364b0e6fc1461009757806391dd7346146100b6575f80fd5b3661006d57005b5f80fd5b61008461007f3660046119f3565b610193565b6040519081526020015b60405180910390f35b3480156100a2575f80fd5b506100846100b13660046119f3565b610776565b3480156100c1575f80fd5b506100d56100d0366004611a9f565b610c3e565b60405161008e9190611b3b565b3480156100ed575f80fd5b506101157f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161008e565b348015610138575f80fd5b506101157f000000000000000000000000000000000000000000000000000000000000000081565b34801561016b575f80fd5b506101157f000000000000000000000000000000000000000000000000000000000000000081565b5f61019c6111db565b345f036101bc5760405163f2365b5b60e01b815260040160405180910390fd5b835f036101dc57604051639811e0c760e01b815260040160405180910390fd5b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c08221636040518163ffffffff1660e01b81526004015f60405180830381865afa158015610238573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261025f9190810190611c58565b8051909150861461028357604051637b9a4b0f60e01b815260040160405180910390fd5b604051633d0f624760e21b8152600481018690525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f43d891c906024015f60405180830381865afa1580156102e7573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261030e9190810190611ced565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166348c894915f6040518060a001604052808a81526020018d8036038101906103629190611d3d565b81526020018c8c808060200260200160405190810160405280939291908181526020015f905b828210156103b4576103a560a08302860136819003810190611d3d565b81526020019060010190610388565b50505050508152602001868152602001858152506040516020016103d89190611e2a565b60408051601f19818403018152908290526103f69291602001611f90565b6040516020818303038152906040526040518263ffffffff1660e01b81526004016104219190611b3b565b5f604051808303815f875af115801561043c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526104639190810190611feb565b505f5b82518110156104e7576104df7f00000000000000000000000000000000000000000000000000000000000000008383815181106104a5576104a5612060565b60200260200101518584815181106104bf576104bf612060565b60200260200101516001600160a01b03166112099092919063ffffffff16565b600101610466565b506040516394bf804d60e01b8152600481018790526001600160a01b0385811660248301527f000000000000000000000000000000000000000000000000000000000000000016906394bf804d906044016020604051808303815f875af1158015610554573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105789190612074565b9250848310156105aa5760405163658ec5dd60e11b815260048101849052602481018690526044015b60405180910390fd5b5f5b8251811015610682575f8382815181106105c8576105c8612060565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610616573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061063a9190612074565b9050801561067957610679338286858151811061065957610659612060565b60200260200101516001600160a01b03166112889092919063ffffffff16565b506001016105ac565b504780156106f2576040515f90339083908381818185875af1925050503d805f81146106c9576040519150601f19603f3d011682016040523d82523d5f602084013e6106ce565b606091505b50509050806106f057604051631453fe1760e21b815260040160405180910390fd5b505b6001600160a01b038516337f3e4567a28c43f6fd0514b63f92587e8d805302e4707ff56fd17e255517c8b169610728843461209f565b6040805191825260208201899052015b60405180910390a350505061076c60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b9695505050505050565b5f61077f6111db565b835f0361079f57604051639811e0c760e01b815260040160405180910390fd5b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c08221636040518163ffffffff1660e01b81526004015f60405180830381865afa1580156107fb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108229190810190611c58565b8051909150861461084657604051637b9a4b0f60e01b815260040160405180910390fd5b61087b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333088611295565b604051633def417960e11b8152600481018690523060248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690637bde82f2906044015f604051808303815f875af11580156108e4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261090b9190810190611ced565b505f815167ffffffffffffffff81111561092757610927611b54565b604051908082528060200260200182016040528015610950578160200160208202803683370190505b5090505f5b8251811015610a075782818151811061097057610970612060565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156109be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109e29190612074565b8282815181106109f4576109f4612060565b6020908102919091010152600101610955565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166348c8949160016040518060a001604052808a81526020018d803603810190610a5b9190611d3d565b81526020018c8c808060200260200160405190810160405280939291908181526020015f905b82821015610aad57610a9e60a08302860136819003810190611d3d565b81526020019060010190610a81565b5050505050815260200186815260200185815250604051602001610ad19190611e2a565b60408051601f1981840301815290829052610aef9291602001611f90565b6040516020818303038152906040526040518263ffffffff1660e01b8152600401610b1a9190611b3b565b5f604051808303815f875af1158015610b35573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b5c9190810190611feb565b5047925084831015610b8b57604051633ebbc33760e01b815260048101849052602481018690526044016105a1565b5f846001600160a01b0316846040515f6040518083038185875af1925050503d805f8114610bd4576040519150601f19603f3d011682016040523d82523d5f602084013e610bd9565b606091505b5050905080610bfb57604051631453fe1760e21b815260040160405180910390fd5b60408051888152602081018690526001600160a01b0387169133917f98817c292439082b15b21a04b51c487787973df7de95b5470c630c581ee7d5539101610738565b6060336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c895760405163570c108560e11b815260040160405180910390fd5b5f80610c97848601866120b2565b915091505f81806020019051810190610cb0919061221b565b90506001836001811115610cc657610cc6611f7c565b03610ced57610cd4816112d1565b60405180602001604052805f81525093505050506111d5565b5f805f5b836060015151811015610f26575f84604001518281518110610d1557610d15612060565b602002602001015190505f85606001518381518110610d3657610d36612060565b602002602001015190505f80826001600160a01b031684602001516001600160a01b031603610d6b5750508151600190610db1565b83516001600160a01b03808516911603610d8d57505060208201515f90610db1565b604051631e22d7c960e31b81526001600160a01b03841660048201526024016105a1565b6001600160a01b03811615801590610dfb57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614155b15610e2457604051631e22d7c960e31b81526001600160a01b03841660048201526024016105a1565b5f80610e4e86858c608001518a81518110610e4157610e41612060565b6020026020010151611764565b915091505f84610e5e5781610e60565b825b90505f85610e6e5783610e70565b825b90508b608001518981518110610e8857610e88612060565b6020026020010151811215610ebb5760405163370228ab60e01b81526001600160a01b03881660048201526024016105a1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031603610f0557610efe828c6122fb565b9a50610f12565b610f0f828b6122fb565b99505b505060019096019550610cf1945050505050565b505f82121561100257602083015180516001600160a01b0316151580610f8257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681602001516001600160a01b031614155b15610fcb57604051631e22d7c960e31b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660048201526024016105a1565b5f80610fe1836001610fdc88612322565b611764565b9092509050610ff082856122fb565b9350610ffc81866122fb565b94505050505b811561102457604051639ebee44160e01b8152600481018390526024016105a1565b5f8112156110b9576001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166311da60b461106483612322565b6040518263ffffffff1660e01b815260040160206040518083038185885af1158015611092573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906110b79190612074565b505b5f5b8360600151518110156111bd577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630b0d9c098560600151838151811061110d5761110d612060565b6020026020010151308760800151858151811061112c5761112c612060565b60209081029190910101516040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064015f604051808303815f87803b15801561119b575f80fd5b505af11580156111ad573d5f803e3d5ffd5b5050600190920191506110bb9050565b5060405180602001604052805f815250955050505050505b92915050565b6111e361186f565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6112158383835f6118b3565b6112835761122683835f60016118b3565b61124e57604051635274afe760e01b81526001600160a01b03841660048201526024016105a1565b61125b83838360016118b3565b61128357604051635274afe760e01b81526001600160a01b03841660048201526024016105a1565b505050565b61125b8383836001611915565b6112a384848484600161195f565b6112cb57604051635274afe760e01b81526001600160a01b03851660048201526024016105a1565b50505050565b5f805f5b83606001515181101561160957836080015181815181106112f8576112f8612060565b60200260200101515f0315611601575f8460400151828151811061131e5761131e612060565b602002602001015190505f8560600151838151811061133f5761133f612060565b602002602001015190505f80826001600160a01b0316845f01516001600160a01b031603611376575050602082015160019061139a565b826001600160a01b031684602001516001600160a01b031603610d8d57505081515f905b6001600160a01b038116158015906113e457507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614155b1561140d57604051631e22d7c960e31b81526001600160a01b03841660048201526024016105a1565b5f8061143b86858c608001518a8151811061142a5761142a612060565b6020026020010151610fdc90612322565b915091505f8461144b578261144d565b815b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b03160361149957611492818b6122fb565b99506114a6565b6114a3818a6122fb565b98505b604051632961046560e21b81526001600160a01b0387811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063a5841194906024015f604051808303815f87803b158015611506575f80fd5b505af1158015611518573d5f803e3d5ffd5b505050506115777f00000000000000000000000000000000000000000000000000000000000000008c608001518a8151811061155657611556612060565b6020026020010151886001600160a01b03166112889092919063ffffffff16565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166311da60b46040518163ffffffff1660e01b81526004016020604051808303815f875af11580156115d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f89190612074565b50505050505050505b6001016112d5565b505f8213156116d6576020830151516001600160a01b031615158061166857507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168360200151602001516001600160a01b031614155b156116b157604051631e22d7c960e31b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660048201526024016105a1565b5f6116c584602001515f85610fdc90612322565b5090506116d281836122fb565b9150505b5f81131561128357604051630b0d9c0960e01b81525f6004820152306024820152604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690630b0d9c09906064015f604051808303815f87803b158015611749575f80fd5b505af115801561175b573d5f803e3d5ffd5b50505050505050565b5f805f8490505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f3cd914c8860405180606001604052808615158152602001898152602001866117dd576117d8600173fffd8963efd1fc6a506488495d951d5263988d2661233c565b6117ed565b6117ed6401000276a3600161235b565b6001600160a01b03168152506040518363ffffffff1660e01b815260040161181692919061237a565b6020604051808303815f875af1158015611832573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118569190612074565b608081901d600f90810b9991900b975095505050505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002036118b157604051633ee5aeb560e01b815260040160405180910390fd5b565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f511483166119095783831516156118fd573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f511483166119095783831516156118fd573d5f823e3d81fd5b6040516323b872dd60e01b5f8181526001600160a01b038781166004528616602452604485905291602083606481808c5af1925060015f511483166119bb5783831516156119af573d5f823e3d81fd5b5f883b113d1516831692505b604052505f60605295945050505050565b6001600160a01b03811681146119e0575f80fd5b50565b80356119ee816119cc565b919050565b5f805f805f80868803610120811215611a0a575f80fd5b60a0811215611a17575f80fd5b5086955060a087013567ffffffffffffffff811115611a34575f80fd5b8701601f81018913611a44575f80fd5b803567ffffffffffffffff811115611a5a575f80fd5b89602060a083028401011115611a6e575f80fd5b6020919091019550935060c0870135925060e08701359150611a9361010088016119e3565b90509295509295509295565b5f8060208385031215611ab0575f80fd5b823567ffffffffffffffff811115611ac6575f80fd5b8301601f81018513611ad6575f80fd5b803567ffffffffffffffff811115611aec575f80fd5b856020828401011115611afd575f80fd5b6020919091019590945092505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f611b4d6020830184611b0d565b9392505050565b634e487b7160e01b5f52604160045260245ffd5b60405160a0810167ffffffffffffffff81118282101715611b8b57611b8b611b54565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611bba57611bba611b54565b604052919050565b5f67ffffffffffffffff821115611bdb57611bdb611b54565b5060051b60200190565b5f82601f830112611bf4575f80fd5b8151611c07611c0282611bc2565b611b91565b8082825260208201915060208360051b860101925085831115611c28575f80fd5b602085015b83811015611c4e578051611c40816119cc565b835260209283019201611c2d565b5095945050505050565b5f60208284031215611c68575f80fd5b815167ffffffffffffffff811115611c7e575f80fd5b611c8a84828501611be5565b949350505050565b5f82601f830112611ca1575f80fd5b8151611caf611c0282611bc2565b8082825260208201915060208360051b860101925085831115611cd0575f80fd5b602085015b83811015611c4e578051835260209283019201611cd5565b5f60208284031215611cfd575f80fd5b815167ffffffffffffffff811115611d13575f80fd5b611c8a84828501611c92565b62ffffff811681146119e0575f80fd5b8060020b81146119e0575f80fd5b5f60a0828403128015611d4e575f80fd5b50611d57611b68565b8235611d62816119cc565b81526020830135611d72816119cc565b60208201526040830135611d8581611d1f565b60408201526060830135611d9881611d2f565b60608201526080830135611dab816119cc565b60808201529392505050565b5f8151808452602084019350602083015f5b82811015611df05781516001600160a01b0316865260209586019590910190600101611dc9565b5093949350505050565b5f8151808452602084019350602083015f5b82811015611df0578151865260209586019590910190600101611e0c565b602081525f6101408201835160208401526020840151611e9b60408501826001600160a01b0381511682526001600160a01b03602082015116602083015262ffffff6040820151166040830152606081015160020b60608301526001600160a01b0360808201511660808301525050565b50604084015161012060e0850152805191829052602001905f906101608501905b80831015611f3457611f1d8285516001600160a01b0381511682526001600160a01b03602082015116602083015262ffffff6040820151166040830152606081015160020b60608301526001600160a01b0360808201511660808301525050565b60a082019150602084019350600183019250611ebc565b506060860151858203601f19016101008701529250611f538184611db7565b925050506080840151601f1984830301610120850152611f738282611dfa565b95945050505050565b634e487b7160e01b5f52602160045260245ffd5b5f60028410611fad57634e487b7160e01b5f52602160045260245ffd5b83825260406020830152611c8a6040830184611b0d565b5f67ffffffffffffffff821115611fdd57611fdd611b54565b50601f01601f191660200190565b5f60208284031215611ffb575f80fd5b815167ffffffffffffffff811115612011575f80fd5b8201601f81018413612021575f80fd5b805161202f611c0282611fc4565b818152856020838501011115612043575f80fd5b8160208401602083015e5f91810160200191909152949350505050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215612084575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156111d5576111d561208b565b5f80604083850312156120c3575f80fd5b8235600281106120d1575f80fd5b9150602083013567ffffffffffffffff8111156120ec575f80fd5b8301601f810185136120fc575f80fd5b803561210a611c0282611fc4565b81815286602083850101111561211e575f80fd5b816020840160208301375f602083830101528093505050509250929050565b5f60a0828403121561214d575f80fd5b612155611b68565b90508151612162816119cc565b81526020820151612172816119cc565b6020820152604082015161218581611d1f565b6040820152606082015161219881611d2f565b606082015260808201516121ab816119cc565b608082015292915050565b5f82601f8301126121c5575f80fd5b81516121d3611c0282611bc2565b80828252602082019150602060a084028601019250858311156121f4575f80fd5b602085015b83811015611c4e5761220b878261213d565b835260209092019160a0016121f9565b5f6020828403121561222b575f80fd5b815167ffffffffffffffff811115612241575f80fd5b82016101208185031215612253575f80fd5b61225b611b68565b8151815261226c856020840161213d565b602082015260c082015167ffffffffffffffff81111561228a575f80fd5b612296868285016121b6565b60408301525060e082015167ffffffffffffffff8111156122b5575f80fd5b6122c186828501611be5565b60608301525061010082015167ffffffffffffffff8111156122e1575f80fd5b6122ed86828501611c92565b608083015250949350505050565b8082018281125f83128015821682158216171561231a5761231a61208b565b505092915050565b5f600160ff1b82016123365761233661208b565b505f0390565b6001600160a01b0382811682821603908111156111d5576111d561208b565b6001600160a01b0381811683821601908111156111d5576111d561208b565b6123d281846001600160a01b0381511682526001600160a01b03602082015116602083015262ffffff6040820151166040830152606081015160020b60608301526001600160a01b0360808201511660808301525050565b8151151560a0820152602082015160c08201526040909101516001600160a01b031660e082015261012061010082018190525f908201526101400191905056fea26469706673582212202ed3ec6cbab48e7944c93340645e7faf85c83b576797a56440c63f6c32bbe60d64736f6c634300081a00330000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095100000000000000000000000043e4aa3204a2d3cee2e12532195e9a6b766a36390000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d168
0x608060405260043610610066575f3560e01c8063dc4c90d311610041578063dc4c90d3146100e2578063f5b91b7b1461012d578063fbfa77cf14610160575f80fd5b8063513426591461007157806364b0e6fc1461009757806391dd7346146100b6575f80fd5b3661006d57005b5f80fd5b61008461007f3660046119f3565b610193565b6040519081526020015b60405180910390f35b3480156100a2575f80fd5b506100846100b13660046119f3565b610776565b3480156100c1575f80fd5b506100d56100d0366004611a9f565b610c3e565b60405161008e9190611b3b565b3480156100ed575f80fd5b506101157f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095181565b6040516001600160a01b03909116815260200161008e565b348015610138575f80fd5b506101157f0000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d16881565b34801561016b575f80fd5b506101157f00000000000000000000000043e4aa3204a2d3cee2e12532195e9a6b766a363981565b5f61019c6111db565b345f036101bc5760405163f2365b5b60e01b815260040160405180910390fd5b835f036101dc57604051639811e0c760e01b815260040160405180910390fd5b5f7f00000000000000000000000043e4aa3204a2d3cee2e12532195e9a6b766a36396001600160a01b031663c08221636040518163ffffffff1660e01b81526004015f60405180830381865afa158015610238573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261025f9190810190611c58565b8051909150861461028357604051637b9a4b0f60e01b815260040160405180910390fd5b604051633d0f624760e21b8152600481018690525f907f00000000000000000000000043e4aa3204a2d3cee2e12532195e9a6b766a36396001600160a01b03169063f43d891c906024015f60405180830381865afa1580156102e7573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261030e9190810190611ced565b90507f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409516001600160a01b03166348c894915f6040518060a001604052808a81526020018d8036038101906103629190611d3d565b81526020018c8c808060200260200160405190810160405280939291908181526020015f905b828210156103b4576103a560a08302860136819003810190611d3d565b81526020019060010190610388565b50505050508152602001868152602001858152506040516020016103d89190611e2a565b60408051601f19818403018152908290526103f69291602001611f90565b6040516020818303038152906040526040518263ffffffff1660e01b81526004016104219190611b3b565b5f604051808303815f875af115801561043c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526104639190810190611feb565b505f5b82518110156104e7576104df7f00000000000000000000000043e4aa3204a2d3cee2e12532195e9a6b766a36398383815181106104a5576104a5612060565b60200260200101518584815181106104bf576104bf612060565b60200260200101516001600160a01b03166112099092919063ffffffff16565b600101610466565b506040516394bf804d60e01b8152600481018790526001600160a01b0385811660248301527f00000000000000000000000043e4aa3204a2d3cee2e12532195e9a6b766a363916906394bf804d906044016020604051808303815f875af1158015610554573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105789190612074565b9250848310156105aa5760405163658ec5dd60e11b815260048101849052602481018690526044015b60405180910390fd5b5f5b8251811015610682575f8382815181106105c8576105c8612060565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610616573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061063a9190612074565b9050801561067957610679338286858151811061065957610659612060565b60200260200101516001600160a01b03166112889092919063ffffffff16565b506001016105ac565b504780156106f2576040515f90339083908381818185875af1925050503d805f81146106c9576040519150601f19603f3d011682016040523d82523d5f602084013e6106ce565b606091505b50509050806106f057604051631453fe1760e21b815260040160405180910390fd5b505b6001600160a01b038516337f3e4567a28c43f6fd0514b63f92587e8d805302e4707ff56fd17e255517c8b169610728843461209f565b6040805191825260208201899052015b60405180910390a350505061076c60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b9695505050505050565b5f61077f6111db565b835f0361079f57604051639811e0c760e01b815260040160405180910390fd5b5f7f00000000000000000000000043e4aa3204a2d3cee2e12532195e9a6b766a36396001600160a01b031663c08221636040518163ffffffff1660e01b81526004015f60405180830381865afa1580156107fb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108229190810190611c58565b8051909150861461084657604051637b9a4b0f60e01b815260040160405180910390fd5b61087b6001600160a01b037f00000000000000000000000043e4aa3204a2d3cee2e12532195e9a6b766a363916333088611295565b604051633def417960e11b8152600481018690523060248201527f00000000000000000000000043e4aa3204a2d3cee2e12532195e9a6b766a36396001600160a01b031690637bde82f2906044015f604051808303815f875af11580156108e4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261090b9190810190611ced565b505f815167ffffffffffffffff81111561092757610927611b54565b604051908082528060200260200182016040528015610950578160200160208202803683370190505b5090505f5b8251811015610a075782818151811061097057610970612060565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa1580156109be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109e29190612074565b8282815181106109f4576109f4612060565b6020908102919091010152600101610955565b507f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409516001600160a01b03166348c8949160016040518060a001604052808a81526020018d803603810190610a5b9190611d3d565b81526020018c8c808060200260200160405190810160405280939291908181526020015f905b82821015610aad57610a9e60a08302860136819003810190611d3d565b81526020019060010190610a81565b5050505050815260200186815260200185815250604051602001610ad19190611e2a565b60408051601f1981840301815290829052610aef9291602001611f90565b6040516020818303038152906040526040518263ffffffff1660e01b8152600401610b1a9190611b3b565b5f604051808303815f875af1158015610b35573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b5c9190810190611feb565b5047925084831015610b8b57604051633ebbc33760e01b815260048101849052602481018690526044016105a1565b5f846001600160a01b0316846040515f6040518083038185875af1925050503d805f8114610bd4576040519150601f19603f3d011682016040523d82523d5f602084013e610bd9565b606091505b5050905080610bfb57604051631453fe1760e21b815260040160405180910390fd5b60408051888152602081018690526001600160a01b0387169133917f98817c292439082b15b21a04b51c487787973df7de95b5470c630c581ee7d5539101610738565b6060336001600160a01b037f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409511614610c895760405163570c108560e11b815260040160405180910390fd5b5f80610c97848601866120b2565b915091505f81806020019051810190610cb0919061221b565b90506001836001811115610cc657610cc6611f7c565b03610ced57610cd4816112d1565b60405180602001604052805f81525093505050506111d5565b5f805f5b836060015151811015610f26575f84604001518281518110610d1557610d15612060565b602002602001015190505f85606001518381518110610d3657610d36612060565b602002602001015190505f80826001600160a01b031684602001516001600160a01b031603610d6b5750508151600190610db1565b83516001600160a01b03808516911603610d8d57505060208201515f90610db1565b604051631e22d7c960e31b81526001600160a01b03841660048201526024016105a1565b6001600160a01b03811615801590610dfb57507f0000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d1686001600160a01b0316816001600160a01b031614155b15610e2457604051631e22d7c960e31b81526001600160a01b03841660048201526024016105a1565b5f80610e4e86858c608001518a81518110610e4157610e41612060565b6020026020010151611764565b915091505f84610e5e5781610e60565b825b90505f85610e6e5783610e70565b825b90508b608001518981518110610e8857610e88612060565b6020026020010151811215610ebb5760405163370228ab60e01b81526001600160a01b03881660048201526024016105a1565b7f0000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d1686001600160a01b0316856001600160a01b031603610f0557610efe828c6122fb565b9a50610f12565b610f0f828b6122fb565b99505b505060019096019550610cf1945050505050565b505f82121561100257602083015180516001600160a01b0316151580610f8257507f0000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d1686001600160a01b031681602001516001600160a01b031614155b15610fcb57604051631e22d7c960e31b81526001600160a01b037f0000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d1681660048201526024016105a1565b5f80610fe1836001610fdc88612322565b611764565b9092509050610ff082856122fb565b9350610ffc81866122fb565b94505050505b811561102457604051639ebee44160e01b8152600481018390526024016105a1565b5f8112156110b9576001600160a01b037f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e40951166311da60b461106483612322565b6040518263ffffffff1660e01b815260040160206040518083038185885af1158015611092573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906110b79190612074565b505b5f5b8360600151518110156111bd577f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409516001600160a01b0316630b0d9c098560600151838151811061110d5761110d612060565b6020026020010151308760800151858151811061112c5761112c612060565b60209081029190910101516040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064015f604051808303815f87803b15801561119b575f80fd5b505af11580156111ad573d5f803e3d5ffd5b5050600190920191506110bb9050565b5060405180602001604052805f815250955050505050505b92915050565b6111e361186f565b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6112158383835f6118b3565b6112835761122683835f60016118b3565b61124e57604051635274afe760e01b81526001600160a01b03841660048201526024016105a1565b61125b83838360016118b3565b61128357604051635274afe760e01b81526001600160a01b03841660048201526024016105a1565b505050565b61125b8383836001611915565b6112a384848484600161195f565b6112cb57604051635274afe760e01b81526001600160a01b03851660048201526024016105a1565b50505050565b5f805f5b83606001515181101561160957836080015181815181106112f8576112f8612060565b60200260200101515f0315611601575f8460400151828151811061131e5761131e612060565b602002602001015190505f8560600151838151811061133f5761133f612060565b602002602001015190505f80826001600160a01b0316845f01516001600160a01b031603611376575050602082015160019061139a565b826001600160a01b031684602001516001600160a01b031603610d8d57505081515f905b6001600160a01b038116158015906113e457507f0000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d1686001600160a01b0316816001600160a01b031614155b1561140d57604051631e22d7c960e31b81526001600160a01b03841660048201526024016105a1565b5f8061143b86858c608001518a8151811061142a5761142a612060565b6020026020010151610fdc90612322565b915091505f8461144b578261144d565b815b90507f0000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d1686001600160a01b0316846001600160a01b03160361149957611492818b6122fb565b99506114a6565b6114a3818a6122fb565b98505b604051632961046560e21b81526001600160a01b0387811660048301527f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e40951169063a5841194906024015f604051808303815f87803b158015611506575f80fd5b505af1158015611518573d5f803e3d5ffd5b505050506115777f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409518c608001518a8151811061155657611556612060565b6020026020010151886001600160a01b03166112889092919063ffffffff16565b7f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409516001600160a01b03166311da60b46040518163ffffffff1660e01b81526004016020604051808303815f875af11580156115d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f89190612074565b50505050505050505b6001016112d5565b505f8213156116d6576020830151516001600160a01b031615158061166857507f0000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d1686001600160a01b03168360200151602001516001600160a01b031614155b156116b157604051631e22d7c960e31b81526001600160a01b037f0000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d1681660048201526024016105a1565b5f6116c584602001515f85610fdc90612322565b5090506116d281836122fb565b9150505b5f81131561128357604051630b0d9c0960e01b81525f6004820152306024820152604481018290527f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409516001600160a01b031690630b0d9c09906064015f604051808303815f87803b158015611749575f80fd5b505af115801561175b573d5f803e3d5ffd5b50505050505050565b5f805f8490505f7f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409516001600160a01b031663f3cd914c8860405180606001604052808615158152602001898152602001866117dd576117d8600173fffd8963efd1fc6a506488495d951d5263988d2661233c565b6117ed565b6117ed6401000276a3600161235b565b6001600160a01b03168152506040518363ffffffff1660e01b815260040161181692919061237a565b6020604051808303815f875af1158015611832573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118569190612074565b608081901d600f90810b9991900b975095505050505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00546002036118b157604051633ee5aeb560e01b815260040160405180910390fd5b565b60405163095ea7b360e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f511483166119095783831516156118fd573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f511483166119095783831516156118fd573d5f823e3d81fd5b6040516323b872dd60e01b5f8181526001600160a01b038781166004528616602452604485905291602083606481808c5af1925060015f511483166119bb5783831516156119af573d5f823e3d81fd5b5f883b113d1516831692505b604052505f60605295945050505050565b6001600160a01b03811681146119e0575f80fd5b50565b80356119ee816119cc565b919050565b5f805f805f80868803610120811215611a0a575f80fd5b60a0811215611a17575f80fd5b5086955060a087013567ffffffffffffffff811115611a34575f80fd5b8701601f81018913611a44575f80fd5b803567ffffffffffffffff811115611a5a575f80fd5b89602060a083028401011115611a6e575f80fd5b6020919091019550935060c0870135925060e08701359150611a9361010088016119e3565b90509295509295509295565b5f8060208385031215611ab0575f80fd5b823567ffffffffffffffff811115611ac6575f80fd5b8301601f81018513611ad6575f80fd5b803567ffffffffffffffff811115611aec575f80fd5b856020828401011115611afd575f80fd5b6020919091019590945092505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f611b4d6020830184611b0d565b9392505050565b634e487b7160e01b5f52604160045260245ffd5b60405160a0810167ffffffffffffffff81118282101715611b8b57611b8b611b54565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611bba57611bba611b54565b604052919050565b5f67ffffffffffffffff821115611bdb57611bdb611b54565b5060051b60200190565b5f82601f830112611bf4575f80fd5b8151611c07611c0282611bc2565b611b91565b8082825260208201915060208360051b860101925085831115611c28575f80fd5b602085015b83811015611c4e578051611c40816119cc565b835260209283019201611c2d565b5095945050505050565b5f60208284031215611c68575f80fd5b815167ffffffffffffffff811115611c7e575f80fd5b611c8a84828501611be5565b949350505050565b5f82601f830112611ca1575f80fd5b8151611caf611c0282611bc2565b8082825260208201915060208360051b860101925085831115611cd0575f80fd5b602085015b83811015611c4e578051835260209283019201611cd5565b5f60208284031215611cfd575f80fd5b815167ffffffffffffffff811115611d13575f80fd5b611c8a84828501611c92565b62ffffff811681146119e0575f80fd5b8060020b81146119e0575f80fd5b5f60a0828403128015611d4e575f80fd5b50611d57611b68565b8235611d62816119cc565b81526020830135611d72816119cc565b60208201526040830135611d8581611d1f565b60408201526060830135611d9881611d2f565b60608201526080830135611dab816119cc565b60808201529392505050565b5f8151808452602084019350602083015f5b82811015611df05781516001600160a01b0316865260209586019590910190600101611dc9565b5093949350505050565b5f8151808452602084019350602083015f5b82811015611df0578151865260209586019590910190600101611e0c565b602081525f6101408201835160208401526020840151611e9b60408501826001600160a01b0381511682526001600160a01b03602082015116602083015262ffffff6040820151166040830152606081015160020b60608301526001600160a01b0360808201511660808301525050565b50604084015161012060e0850152805191829052602001905f906101608501905b80831015611f3457611f1d8285516001600160a01b0381511682526001600160a01b03602082015116602083015262ffffff6040820151166040830152606081015160020b60608301526001600160a01b0360808201511660808301525050565b60a082019150602084019350600183019250611ebc565b506060860151858203601f19016101008701529250611f538184611db7565b925050506080840151601f1984830301610120850152611f738282611dfa565b95945050505050565b634e487b7160e01b5f52602160045260245ffd5b5f60028410611fad57634e487b7160e01b5f52602160045260245ffd5b83825260406020830152611c8a6040830184611b0d565b5f67ffffffffffffffff821115611fdd57611fdd611b54565b50601f01601f191660200190565b5f60208284031215611ffb575f80fd5b815167ffffffffffffffff811115612011575f80fd5b8201601f81018413612021575f80fd5b805161202f611c0282611fc4565b818152856020838501011115612043575f80fd5b8160208401602083015e5f91810160200191909152949350505050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215612084575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156111d5576111d561208b565b5f80604083850312156120c3575f80fd5b8235600281106120d1575f80fd5b9150602083013567ffffffffffffffff8111156120ec575f80fd5b8301601f810185136120fc575f80fd5b803561210a611c0282611fc4565b81815286602083850101111561211e575f80fd5b816020840160208301375f602083830101528093505050509250929050565b5f60a0828403121561214d575f80fd5b612155611b68565b90508151612162816119cc565b81526020820151612172816119cc565b6020820152604082015161218581611d1f565b6040820152606082015161219881611d2f565b606082015260808201516121ab816119cc565b608082015292915050565b5f82601f8301126121c5575f80fd5b81516121d3611c0282611bc2565b80828252602082019150602060a084028601019250858311156121f4575f80fd5b602085015b83811015611c4e5761220b878261213d565b835260209092019160a0016121f9565b5f6020828403121561222b575f80fd5b815167ffffffffffffffff811115612241575f80fd5b82016101208185031215612253575f80fd5b61225b611b68565b8151815261226c856020840161213d565b602082015260c082015167ffffffffffffffff81111561228a575f80fd5b612296868285016121b6565b60408301525060e082015167ffffffffffffffff8111156122b5575f80fd5b6122c186828501611be5565b60608301525061010082015167ffffffffffffffff8111156122e1575f80fd5b6122ed86828501611c92565b608083015250949350505050565b8082018281125f83128015821682158216171561231a5761231a61208b565b505092915050565b5f600160ff1b82016123365761233661208b565b505f0390565b6001600160a01b0382811682821603908111156111d5576111d561208b565b6001600160a01b0381811683821601908111156111d5576111d561208b565b6123d281846001600160a01b0381511682526001600160a01b03602082015116602083015262ffffff6040820151166040830152606081015160020b60608301526001600160a01b0360808201511660808301525050565b8151151560a0820152602082015160c08201526040909101516001600160a01b031660e082015261012061010082018190525f908201526101400191905056fea26469706673582212202ed3ec6cbab48e7944c93340645e7faf85c83b576797a56440c63f6c32bbe60d64736f6c634300081a0033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x337f37…46cd6c | 32 days agoFri, 17 Jul 2026 08:05:38 UTC | 0x98817c…d553 | [0] 0x000000000000…e5875182 [1] 0x000000000000…e5875182 data: 0x000000000000000000…37f2d665 |
| 0x6a5a08…341c8f | 32 days agoFri, 17 Jul 2026 08:04:37 UTC | 0x3e4567…b169 | [0] 0x000000000000…e5875182 [1] 0x000000000000…e5875182 data: 0x000000000000000000…960da000 |
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x337f377a…46cd6c | Transfer | 11,962,375 | 32 days agoFri, 17 Jul 2026 08:05:38 UTC | 0x56a0…0fc7 | OUT | 0x8366…0951 | $0.620.001811 TSLA | Tesla • Robinhood Token (TSLA) | |
| 0x337f377a…46cd6c | Transfer | 11,962,375 | 32 days agoFri, 17 Jul 2026 08:05:38 UTC | 0x56a0…0fc7 | OUT | 0x8366…0951 | $0.610.001083 META | Meta Platforms • Robinhood Token (META) | |
| 0x337f377a…46cd6c | Transfer | 11,962,375 | 32 days agoFri, 17 Jul 2026 08:05:38 UTC | 0x56a0…0fc7 | OUT | 0x8366…0951 | $0.780.003471 NVDA | NVIDIA • Robinhood Token (NVDA) | |
| 0x337f377a…46cd6c | Transfer | 11,962,375 | 32 days agoFri, 17 Jul 2026 08:05:38 UTC | 0x56a0…0fc7 | OUT | 0x8366…0951 | 0.002890 AMZN | Amazon • Robinhood Token (AMZN) | |
| 0x337f377a…46cd6c | Transfer | 11,962,375 | 32 days agoFri, 17 Jul 2026 08:05:38 UTC | 0x56a0…0fc7 | OUT | 0x8366…0951 | 0.002014 GOOGL | Alphabet Class A • Robinhood Token (GOOGL) | |
| 0x337f377a…46cd6c | Transfer | 11,962,375 | 32 days agoFri, 17 Jul 2026 08:05:38 UTC | 0x56a0…0fc7 | OUT | 0x8366…0951 | $0.910.001835 MSFT | Microsoft • Robinhood Token (MSFT) | |
| 0x337f377a…46cd6c | Transfer | 11,962,375 | 32 days agoFri, 17 Jul 2026 08:05:38 UTC | 0x56a0…0fc7 | OUT | 0x8366…0951 | $0.690.002261 AAPL | Apple • Robinhood Token (AAPL) | |
| 0x337f377a…46cd6c | Transfer | 11,962,375 | 32 days agoFri, 17 Jul 2026 08:05:38 UTC | 0x43e4…3639 | IN | 0x56a0…0fc7 | $0.620.001811 TSLA | Tesla • Robinhood Token (TSLA) | |
| 0x337f377a…46cd6c | Transfer | 11,962,375 | 32 days agoFri, 17 Jul 2026 08:05:38 UTC | 0x43e4…3639 | IN | 0x56a0…0fc7 | $0.610.001083 META | Meta Platforms • Robinhood Token (META) | |
| 0x337f377a…46cd6c | Transfer | 11,962,375 | 32 days agoFri, 17 Jul 2026 08:05:38 UTC | 0x43e4…3639 | IN | 0x56a0…0fc7 | $0.780.003471 NVDA | NVIDIA • Robinhood Token (NVDA) | |
| 0x337f377a…46cd6c | Transfer | 11,962,375 | 32 days agoFri, 17 Jul 2026 08:05:38 UTC | 0x43e4…3639 | IN | 0x56a0…0fc7 | 0.002890 AMZN | Amazon • Robinhood Token (AMZN) | |
| 0x337f377a…46cd6c | Transfer | 11,962,375 | 32 days agoFri, 17 Jul 2026 08:05:38 UTC | 0x43e4…3639 | IN | 0x56a0…0fc7 | 0.002014 GOOGL | Alphabet Class A • Robinhood Token (GOOGL) | |
| 0x337f377a…46cd6c | Transfer | 11,962,375 | 32 days agoFri, 17 Jul 2026 08:05:38 UTC | 0x43e4…3639 | IN | 0x56a0…0fc7 | $0.910.001835 MSFT | Microsoft • Robinhood Token (MSFT) | |
| 0x337f377a…46cd6c | Transfer | 11,962,375 | 32 days agoFri, 17 Jul 2026 08:05:38 UTC | 0x43e4…3639 | IN | 0x56a0…0fc7 | $0.690.002261 AAPL | Apple • Robinhood Token (AAPL) | |
| 0x337f377a…46cd6c | Transfer | 11,962,375 | 32 days agoFri, 17 Jul 2026 08:05:38 UTC | 0x56a0…0fc7 | OUT | 0x0000…0000 | 0.050248 hMAG7 | Hood MAG7 Index (hMAG7) | |
| 0x337f377a…46cd6c | Transfer | 11,962,375 | 32 days agoFri, 17 Jul 2026 08:05:38 UTC | 0x56a0…0fc7 | OUT | 0x7fcf…b4f1 | 0.000151 hMAG7 | Hood MAG7 Index (hMAG7) | |
| 0x337f377a…46cd6c | Transfer | 11,962,375 | 32 days agoFri, 17 Jul 2026 08:05:38 UTC | 0xeddc…5182 | IN | 0x56a0…0fc7 | 0.0504 hMAG7 | Hood MAG7 Index (hMAG7) | |
| 0x6a5a089c…341c8f | Transfer | 11,961,767 | 32 days agoFri, 17 Jul 2026 08:04:37 UTC | 0x56a0…0fc7 | OUT | 0x43e4…3639 | $0.610.001802 TSLA | Tesla • Robinhood Token (TSLA) | |
| 0x6a5a089c…341c8f | Transfer | 11,961,767 | 32 days agoFri, 17 Jul 2026 08:04:37 UTC | 0x56a0…0fc7 | OUT | 0x43e4…3639 | $0.610.001078 META | Meta Platforms • Robinhood Token (META) | |
| 0x6a5a089c…341c8f | Transfer | 11,961,767 | 32 days agoFri, 17 Jul 2026 08:04:37 UTC | 0x56a0…0fc7 | OUT | 0x43e4…3639 | $0.770.003454 NVDA | NVIDIA • Robinhood Token (NVDA) | |
| 0x6a5a089c…341c8f | Transfer | 11,961,767 | 32 days agoFri, 17 Jul 2026 08:04:37 UTC | 0x56a0…0fc7 | OUT | 0x43e4…3639 | 0.002876 AMZN | Amazon • Robinhood Token (AMZN) | |
| 0x6a5a089c…341c8f | Transfer | 11,961,767 | 32 days agoFri, 17 Jul 2026 08:04:37 UTC | 0x56a0…0fc7 | OUT | 0x43e4…3639 | 0.002004 GOOGL | Alphabet Class A • Robinhood Token (GOOGL) | |
| 0x6a5a089c…341c8f | Transfer | 11,961,767 | 32 days agoFri, 17 Jul 2026 08:04:37 UTC | 0x56a0…0fc7 | OUT | 0x43e4…3639 | $0.900.001826 MSFT | Microsoft • Robinhood Token (MSFT) | |
| 0x6a5a089c…341c8f | Transfer | 11,961,767 | 32 days agoFri, 17 Jul 2026 08:04:37 UTC | 0x56a0…0fc7 | OUT | 0x43e4…3639 | $0.690.002250 AAPL | Apple • Robinhood Token (AAPL) | |
| 0x6a5a089c…341c8f | Transfer | 11,961,767 | 32 days agoFri, 17 Jul 2026 08:04:37 UTC | 0x8366…0951 | IN | 0x56a0…0fc7 | $0.610.001802 TSLA | Tesla • Robinhood Token (TSLA) |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x337f37…46cd6c | zapRedeem | 11,962,375 | 32 days agoFri, 17 Jul 2026 08:05:38 UTC | 0xeddc…5182 | IN | ZapV4 | $0.000 ETH | 0.00006435 | |
| 0x6a5a08…341c8f | zapMint | 11,961,767 | 32 days agoFri, 17 Jul 2026 08:04:37 UTC | 0xeddc…5182 | IN | ZapV4 | $5.400.00284 ETH | 0.00007308 |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 11,962,375 | 32 days agoFri, 17 Jul 2026 08:05:38 UTC | 0x337f37…46cd6c | CALL | zapRedeem | 0x56a0…0fc7 | OUT | 0xeddc…5182 | 0.00272 ETH |
| 11,962,375 | 32 days agoFri, 17 Jul 2026 08:05:38 UTC | 0x337f37…46cd6c | CALL | zapRedeem | 0x8366…0951 | IN | 0x56a0…0fc7 | 0.00272 ETH |
| 11,961,767 | 32 days agoFri, 17 Jul 2026 08:04:37 UTC | 0x6a5a08…341c8f | CALL | zapMint | 0x56a0…0fc7 | OUT | 0xeddc…5182 | 0.00008 ETH |
| 11,961,767 | 32 days agoFri, 17 Jul 2026 08:04:37 UTC | 0x6a5a08…341c8f | CALL | zapMint | 0x56a0…0fc7 | OUT | 0x8366…0951 | 0.00276 ETH |