// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import {IUniswapV3Pool} from "v3-core/contracts/interfaces/IUniswapV3Pool.sol";
import {IUniswapV3SwapCallback} from "v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.sol";
import {IPoolManager} from "v4-core/src/interfaces/IPoolManager.sol";
import {IUnlockCallback} from "v4-core/src/interfaces/callback/IUnlockCallback.sol";
import {PoolKey} from "v4-core/src/types/PoolKey.sol";
import {Currency} from "v4-core/src/types/Currency.sol";
import {IHooks} from "v4-core/src/interfaces/IHooks.sol";
import {TickMath} from "v4-core/src/libraries/TickMath.sol";
import {TransientStateLibrary} from "v4-core/src/libraries/TransientStateLibrary.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
interface IWETH {
function deposit() external payable;
function withdraw(uint256 amount) external;
}
contract UniV3V4Arb is IUniswapV3SwapCallback, IUnlockCallback, ReentrancyGuard {
using SafeERC20 for IERC20;
address public owner;
IUniswapV3Pool public immutable V3_POOL_A;
IUniswapV3Pool public immutable V3_POOL_B;
IPoolManager public immutable POOL_MANAGER;
Currency public immutable CURRENCY0;
Currency public immutable CURRENCY1;
uint24 public immutable V4_FEE;
int24 public immutable V4_TICK_SPACING;
IHooks public immutable V4_HOOKS;
IWETH public immutable WETH;
uint160 private constant MIN_SQRT = TickMath.MIN_SQRT_PRICE + 1;
uint160 private constant MAX_SQRT = TickMath.MAX_SQRT_PRICE - 1;
uint256 private constant DEADLINE_MAX = 300;
// profitToken = 0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF means native ETH
address private constant PROFIT_ETH = 0xFFfFfFffFFfffFFfFFfFFFFFffFFFffffFfFFFfF;
event ArbExecuted(address indexed caller, uint256 profit);
event OwnershipTransferred(address indexed prev, address indexed next);
modifier onlyOwner() {
_onlyOwner();
_;
}
function _onlyOwner() internal view {
require(msg.sender == owner, "NOT_OWNER");
}
constructor(
address _v3PoolA,
address _v3PoolB,
address _poolManager,
Currency _currency0,
Currency _currency1,
uint24 _v4Fee,
int24 _v4TickSpacing,
address _v4Hooks,
address _weth
) {
owner = msg.sender;
V3_POOL_A = IUniswapV3Pool(_v3PoolA);
V3_POOL_B = IUniswapV3Pool(_v3PoolB);
POOL_MANAGER = IPoolManager(_poolManager);
CURRENCY0 = _currency0;
CURRENCY1 = _currency1;
V4_FEE = _v4Fee;
V4_TICK_SPACING = _v4TickSpacing;
V4_HOOKS = IHooks(_v4Hooks);
WETH = IWETH(_weth);
IERC20(V3_POOL_A.token0()).forceApprove(_v3PoolA, type(uint256).max);
IERC20(V3_POOL_A.token1()).forceApprove(_v3PoolA, type(uint256).max);
IERC20(V3_POOL_B.token0()).forceApprove(_v3PoolB, type(uint256).max);
IERC20(V3_POOL_B.token1()).forceApprove(_v3PoolB, type(uint256).max);
}
function transferOwnership(address newOwner) external onlyOwner {
require(newOwner != address(0), "ZERO_ADDRESS");
emit OwnershipTransferred(owner, newOwner);
owner = newOwner;
}
function withdrawToken(address token, address to) external onlyOwner {
IERC20 t = IERC20(token);
uint256 bal = t.balanceOf(address(this));
if (bal > 0) t.safeTransfer(to, bal);
}
function withdrawEth(address payable to) external onlyOwner {
(bool ok,) = to.call{value: address(this).balance}("");
require(ok, "ETH_TRANSFER_FAIL");
}
function withdrawWeth(address to) external onlyOwner {
uint256 bal = IERC20(address(WETH)).balanceOf(address(this));
if (bal > 0) IERC20(address(WETH)).safeTransfer(to, bal);
}
receive() external payable {}
// -------------------------------------------------------------------
// Entry point
// -------------------------------------------------------------------
function arb(
bool v4ZeroForOne,
uint256 v4AmountOut,
bool v3aZeroForOne,
int256 v3aAmountSpecified,
bool v3bZeroForOne,
int256 v3bAmountSpecified,
bool wrapEthBefore,
bool unwrapWethAfter,
address profitToken,
uint256 minProfit,
uint256 deadline
) external onlyOwner nonReentrant {
require(deadline >= block.timestamp, "EXPIRED");
require(deadline <= block.timestamp + DEADLINE_MAX, "DEADLINE_TOO_FAR");
require(v4AmountOut > 0, "ZERO_AMOUNT");
POOL_MANAGER.unlock(
abi.encode(
v4ZeroForOne,
v4AmountOut,
v3aZeroForOne,
v3aAmountSpecified,
v3bZeroForOne,
v3bAmountSpecified,
wrapEthBefore,
unwrapWethAfter,
profitToken,
minProfit,
deadline
)
);
}
// -------------------------------------------------------------------
// V4 unlock callback
// -------------------------------------------------------------------
function unlockCallback(bytes calldata rawData) external override returns (bytes memory) {
require(msg.sender == address(POOL_MANAGER), "WRONG_V4_MANAGER");
(
bool v4ZeroForOne,
uint256 v4AmountOut,
bool v3aZeroForOne,
int256 v3aAmountSpecified,
bool v3bZeroForOne,
int256 v3bAmountSpecified,
bool wrapEthBefore,
bool unwrapWethAfter,
address profitToken,
uint256 minProfit,
uint256 deadline
) = abi.decode(rawData, (bool, uint256, bool, int256, bool, int256, bool, bool, address, uint256, uint256));
require(block.timestamp <= deadline, "EXPIRED");
uint256 profitBefore = _balanceOf(profitToken);
// Step 1: V4 swap (exact output, 0% fee)
_doV4Swap(v4ZeroForOne, v4AmountOut);
// Step 2: take positive deltas (receive borrowed tokens)
_takeIfPositive(Currency.unwrap(CURRENCY0));
_takeIfPositive(Currency.unwrap(CURRENCY1));
// Step 3: wrap ETH → WETH if V4 gave us native ETH
if (wrapEthBefore) {
uint256 ethBal = address(this).balance;
if (ethBal > 0) WETH.deposit{value: ethBal}();
}
// Step 4 & 5: V3 swaps in correct order depending on direction
if (v4ZeroForOne) {
_v3Swap(V3_POOL_A, v3aZeroForOne, v3aAmountSpecified);
_v3Swap(V3_POOL_B, v3bZeroForOne, v3bAmountSpecified);
} else {
_v3Swap(V3_POOL_B, v3bZeroForOne, v3bAmountSpecified);
_v3Swap(V3_POOL_A, v3aZeroForOne, v3aAmountSpecified);
}
// Step 6: unwrap exactly enough WETH to cover V4 ETH debt if settling in ETH
if (unwrapWethAfter) {
uint256 ethDebt = _v4EthDebt();
uint256 wethBal = IERC20(address(WETH)).balanceOf(address(this));
uint256 unwrapAmount = ethDebt < wethBal ? ethDebt : wethBal;
if (unwrapAmount > 0) WETH.withdraw(unwrapAmount);
}
// Step 7: settle negative deltas to V4
_settleIfNegative(Currency.unwrap(CURRENCY0));
_settleIfNegative(Currency.unwrap(CURRENCY1));
// Step 8: verify profit
uint256 profitAfter = _balanceOf(profitToken);
require(profitAfter >= profitBefore + minProfit, "PROFIT_TOO_LOW");
uint256 profit = profitAfter - profitBefore;
emit ArbExecuted(msg.sender, profit);
return "";
}
// -------------------------------------------------------------------
// Internal helpers
// -------------------------------------------------------------------
function _doV4Swap(bool v4ZeroForOne, uint256 v4AmountOut) internal {
PoolKey memory key = PoolKey({
currency0: CURRENCY0,
currency1: CURRENCY1,
fee: V4_FEE,
tickSpacing: V4_TICK_SPACING,
hooks: V4_HOOKS
});
// forge-lint: disable-next-line(unsafe-typecast)
POOL_MANAGER.swap(
key,
IPoolManager.SwapParams({
zeroForOne: v4ZeroForOne,
// forge-lint: disable-next-line(unsafe-typecast)
amountSpecified: int256(uint256(v4AmountOut)),
sqrtPriceLimitX96: v4ZeroForOne ? MIN_SQRT : MAX_SQRT
}),
""
);
}
function _v3Swap(IUniswapV3Pool pool, bool zeroForOne, int256 amountSpecified) internal {
if (amountSpecified == 0) return;
uint160 limit = zeroForOne ? MIN_SQRT : MAX_SQRT;
pool.swap(address(this), zeroForOne, amountSpecified, limit, "");
}
function _balanceOf(address token) internal view returns (uint256) {
if (token == PROFIT_ETH || token == address(0)) {
return address(this).balance;
}
return IERC20(token).balanceOf(address(this));
}
function _v4EthDebt() internal view returns (uint256) {
int256 delta = TransientStateLibrary.currencyDelta(
POOL_MANAGER, address(this), Currency.wrap(address(0))
);
if (delta < 0) {
// forge-lint: disable-next-line(unsafe-typecast)
return uint256(int256(-delta));
}
return 0;
}
// -------------------------------------------------------------------
// V3 swap callback
// -------------------------------------------------------------------
function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes calldata) external {
require(
msg.sender == address(V3_POOL_A) || msg.sender == address(V3_POOL_B),
"WRONG_V3_POOL"
);
IERC20 tok0 = IERC20(IUniswapV3Pool(msg.sender).token0());
IERC20 tok1 = IERC20(IUniswapV3Pool(msg.sender).token1());
if (amount0Delta > 0) {
// forge-lint: disable-next-line(unsafe-typecast)
tok0.safeTransfer(msg.sender, uint256(amount0Delta));
}
if (amount1Delta > 0) {
// forge-lint: disable-next-line(unsafe-typecast)
tok1.safeTransfer(msg.sender, uint256(amount1Delta));
}
}
// -------------------------------------------------------------------
// V4 settlement helpers
// -------------------------------------------------------------------
function _takeIfPositive(address token) internal {
int256 delta = TransientStateLibrary.currencyDelta(POOL_MANAGER, address(this), Currency.wrap(token));
if (delta > 0) {
// forge-lint: disable-next-line(unsafe-typecast)
POOL_MANAGER.take(Currency.wrap(token), address(this), uint256(int256(delta)));
}
}
function _settleIfNegative(address token) internal {
int256 delta = TransientStateLibrary.currencyDelta(POOL_MANAGER, address(this), Currency.wrap(token));
if (delta < 0) {
// forge-lint: disable-next-line(unsafe-typecast)
uint256 amount = uint256(int256(-delta));
POOL_MANAGER.sync(Currency.wrap(token));
if (token == address(0)) {
// forge-lint: disable-next-line(unsafe-typecast)
POOL_MANAGER.settle{value: amount}();
} else {
// forge-lint: disable-next-line(unsafe-typecast)
IERC20(token).safeTransfer(address(POOL_MANAGER), amount);
POOL_MANAGER.settle();
}
}
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "_v3PoolA",
"type": "address",
"internalType": "address"
},
{
"name": "_v3PoolB",
"type": "address",
"internalType": "address"
},
{
"name": "_poolManager",
"type": "address",
"internalType": "address"
},
{
"name": "_currency0",
"type": "address",
"internalType": "Currency"
},
{
"name": "_currency1",
"type": "address",
"internalType": "Currency"
},
{
"name": "_v4Fee",
"type": "uint24",
"internalType": "uint24"
},
{
"name": "_v4TickSpacing",
"type": "int24",
"internalType": "int24"
},
{
"name": "_v4Hooks",
"type": "address",
"internalType": "address"
},
{
"name": "_weth",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"name": "AddressEmptyCode",
"type": "error",
"inputs": [
{
"name": "target",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "AddressInsufficientBalance",
"type": "error",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "FailedInnerCall",
"type": "error",
"inputs": []
},
{
"name": "ReentrancyGuardReentrantCall",
"type": "error",
"inputs": []
},
{
"name": "SafeERC20FailedOperation",
"type": "error",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ArbExecuted",
"type": "event",
"inputs": [
{
"name": "caller",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "profit",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "OwnershipTransferred",
"type": "event",
"inputs": [
{
"name": "prev",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "next",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "CURRENCY0",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "Currency"
}
],
"stateMutability": "view"
},
{
"name": "CURRENCY1",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "Currency"
}
],
"stateMutability": "view"
},
{
"name": "POOL_MANAGER",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IPoolManager"
}
],
"stateMutability": "view"
},
{
"name": "V3_POOL_A",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IUniswapV3Pool"
}
],
"stateMutability": "view"
},
{
"name": "V3_POOL_B",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IUniswapV3Pool"
}
],
"stateMutability": "view"
},
{
"name": "V4_FEE",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint24",
"internalType": "uint24"
}
],
"stateMutability": "view"
},
{
"name": "V4_HOOKS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IHooks"
}
],
"stateMutability": "view"
},
{
"name": "V4_TICK_SPACING",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "int24",
"internalType": "int24"
}
],
"stateMutability": "view"
},
{
"name": "WETH",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IWETH"
}
],
"stateMutability": "view"
},
{
"name": "arb",
"type": "function",
"inputs": [
{
"name": "v4ZeroForOne",
"type": "bool",
"internalType": "bool"
},
{
"name": "v4AmountOut",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "v3aZeroForOne",
"type": "bool",
"internalType": "bool"
},
{
"name": "v3aAmountSpecified",
"type": "int256",
"internalType": "int256"
},
{
"name": "v3bZeroForOne",
"type": "bool",
"internalType": "bool"
},
{
"name": "v3bAmountSpecified",
"type": "int256",
"internalType": "int256"
},
{
"name": "wrapEthBefore",
"type": "bool",
"internalType": "bool"
},
{
"name": "unwrapWethAfter",
"type": "bool",
"internalType": "bool"
},
{
"name": "profitToken",
"type": "address",
"internalType": "address"
},
{
"name": "minProfit",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "deadline",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "owner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "transferOwnership",
"type": "function",
"inputs": [
{
"name": "newOwner",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "uniswapV3SwapCallback",
"type": "function",
"inputs": [
{
"name": "amount0Delta",
"type": "int256",
"internalType": "int256"
},
{
"name": "amount1Delta",
"type": "int256",
"internalType": "int256"
},
{
"name": "",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "unlockCallback",
"type": "function",
"inputs": [
{
"name": "rawData",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [
{
"name": "",
"type": "bytes",
"internalType": "bytes"
}
],
"stateMutability": "nonpayable"
},
{
"name": "withdrawEth",
"type": "function",
"inputs": [
{
"name": "to",
"type": "address",
"internalType": "address payable"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "withdrawToken",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "to",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "withdrawWeth",
"type": "function",
"inputs": [
{
"name": "to",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"type": "receive",
"stateMutability": "payable"
}
]0x6101a0806040523461032c576101208161208780380380916100218285610404565b83398101031261032c576100348161043b565b906100416020820161043b565b9061004e6040820161043b565b61005a6060830161043b565b906100676080840161043b565b9160a08401519362ffffff8516850361032c5760c08101518060020b810361032c576004956020956100a86101006100a160e0870161043b565b950161043b565b60015f81905580546001600160a01b031916331790556001600160a01b038b811660808190528b821660a05297811660c05260e096909652610100919091526101209190915261014091909152908216610160521661018052604051630dfe168160e01b815292839182905afa80156103385783905f906103c7575b61013792506001600160a01b031661044f565b60805160405163d21220a760e01b815290602090829060049082906001600160a01b03165afa908115610338575f91610385575b50600492610181916001600160a01b031661044f565b60a051604051630dfe168160e01b81529260209184919082906001600160a01b03165afa918215610338575f92610343575b506004916101cb9082906001600160a01b031661044f565b60a05160405163d21220a760e01b81529260209184919082906001600160a01b03165afa8015610338575f906102f9575b61020f92506001600160a01b031661044f565b604051611a2e908161065982396080518181816101230152818161042f015281816107f80152610aa1015260a0518181816102cd0152818161081e01528181610a7b0152610c46015260c05181818161051a01528181610c890152818161106a015281816114f6015281816116e20152611767015260e05181818161031b01526105f30152610100518181816106260152610df80152610120518181816106550152610d0501526101405181818161067e0152610cc40152610160518181816104b701526106b10152610180518181816104730152818161094f01528181610ae10152610ed80152f35b506020823d602011610330575b8161031360209383610404565b8101031261032c5761032761020f9261043b565b6101fc565b5f80fd5b3d9150610306565b6040513d5f823e3d90fd5b91506020823d60201161037d575b8161035e60209383610404565b8101031261032c576101cb8161037560049461043b565b9350506101b3565b3d9150610351565b90506020813d6020116103bf575b816103a060209383610404565b8101031261032c576004926103b76101819261043b565b91509261016b565b3d9150610393565b50506020813d6020116103fc575b816103e260209383610404565b8101031261032c57826103f76101379261043b565b610124565b3d91506103d5565b601f909101601f19168101906001600160401b0382119082101761042757604052565b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b038216820361032c57565b60405190602082019263095ea7b360e01b845260018060a01b0316928360248401525f19604484015260448352610487606484610404565b82516001600160a01b038316915f91829182855af1906104a5610539565b82610507575b50816104fc575b50156104bd57505050565b6104f56104fa936040519063095ea7b360e01b602083015260248201525f6044820152604481526104ef606482610404565b8261058f565b61058f565b565b90503b15155f6104b2565b8051919250811591821561051f575b5050905f6104ab565b6105329250602080918301019101610577565b5f80610516565b3d15610572573d906001600160401b0382116104275760405191610567601f8201601f191660200184610404565b82523d5f602084013e565b606090565b9081602091031261032c5751801515810361032c5790565b5f806105b79260018060a01b03169360208151910182865af16105b0610539565b90836105fa565b80519081151591826105df575b50506105cd5750565b635274afe760e01b5f5260045260245ffd5b6105f29250602080918301019101610577565b155f806105c4565b9061061e575080511561060f57805190602001fd5b630a12f52160e11b5f5260045ffd5b8151158061064f575b61062f575090565b639996b31560e01b5f9081526001600160a01b0391909116600452602490fd5b50803b1561062756fe6080604052600436101561001a575b3615610018575f80fd5b005b5f803560e01c8063088e53bb14610f1f578063208daad414610ea257806325e1606314610e1c57806333631df414610dd95780633aeac4e114610d295780634b05d78c14610cea5780635c76be2114610cad57806362308e8514610c6a5780637b5dcb0c14610c275780638da5cb5b14610c0157806391dd7346146104db578063996d976a14610497578063ad5c464814610453578063ba5bd4c11461040f578063f2fde38b1461033f578063f33b3271146102fb5763fa461e33146100e0575061000e565b346102f85760606003193601126102f85760043560243560443567ffffffffffffffff81116102f4576101179036906004016111fa565b50506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016331480156102c2575b1561027e576040517f0dfe1681000000000000000000000000000000000000000000000000000000008152602081600481335afa908115610273578491610254575b50604051927fd21220a7000000000000000000000000000000000000000000000000000000008452602084600481335afa938415610249578594610218575b508481136101fd575b50508281136101e3578280f35b6101f7916001600160a01b03339116611391565b5f808280f35b610211916001600160a01b03339116611391565b5f806101d6565b61023b91945060203d602011610242575b610233818361129d565b81019061131a565b925f6101cd565b503d610229565b6040513d87823e3d90fd5b61026d915060203d60201161024257610233818361129d565b5f61018e565b6040513d86823e3d90fd5b606460405162461bcd60e51b815260206004820152600d60248201527f57524f4e475f56335f504f4f4c000000000000000000000000000000000000006044820152fd5b506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016331461014c565b8380fd5b80fd5b50346102f857806003193601126102f85760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102f85760206003193601126102f8576001600160a01b036103616111e4565b610369611339565b1680156103cb577fffffffffffffffffffffffff0000000000000000000000000000000000000000600154826001600160a01b0382167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08680a3161760015580f35b606460405162461bcd60e51b815260206004820152600c60248201527f5a45524f5f4144445245535300000000000000000000000000000000000000006044820152fd5b50346102f857806003193601126102f85760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102f857806003193601126102f85760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102f857806003193601126102f85760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b5034610a58576020600319360112610a585760043567ffffffffffffffff8111610a585761050d9036906004016111fa565b6001600160a01b039291927f00000000000000000000000000000000000000000000000000000000000000001690813303610bbd57836101609181010312610a5857610558836111d7565b90610565604085016111d7565b906060850135610577608087016111d7565b60a08701359161058960c089016111d7565b9261059660e08a016111d7565b926101008a0135966001600160a01b038816809803610a58576105c06101408c0135421115611252565b6105c988611463565b986040519660a0880188811067ffffffffffffffff821117610b8e576040528c6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169889815260208101906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169b8c8352604082019362ffffff7f000000000000000000000000000000000000000000000000000000000000000016855260608301907f000000000000000000000000000000000000000000000000000000000000000060020b825260808401916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168352885f14610ba2576401000276a4925b604051916060830183811067ffffffffffffffff821117610b8e576040528a15158352602083019360200135845260408301946001600160a01b0316855260405198899889987ff3cd914c000000000000000000000000000000000000000000000000000000008a52516001600160a01b031660048a0152516001600160a01b031660248901525162ffffff1660448801525160020b6064870152516001600160a01b0316608486015251151560a48501525160c4840152516001600160a01b031660e48301526101048201610120905261012482015f90525a925f61014492602095f18015610b5857610b63575b506107db886114ec565b6107e4896114ec565b610aca575b15610a6f576108429361081c917f000000000000000000000000000000000000000000000000000000000000000061159b565b7f000000000000000000000000000000000000000000000000000000000000000061159b565b61093d575b916108606108659261085b6101209561175d565b61175d565b611463565b93013581018082116109295783106108e55782039182116108d1576108cd916040519081527f1b4deb727b75ffc843de0de07e8d503170a8b27d3a14e749270b74c89d969ac160203392a2604051906108bf60208361129d565b815260405191829182611228565b0390f35b80634e487b7160e01b602492526011600452fd5b606460405162461bcd60e51b815260206004820152600e60248201527f50524f4649545f544f4f5f4c4f570000000000000000000000000000000000006044820152fd5b602483634e487b7160e01b81526011600452fd5b61094561169b565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906040516370a0823160e01b8152306004820152602081602481865afa908115610a64578891610a2e575b5080821015610a2757505b806109b2575b5050610847565b813b15610a235786916024839260405194859384927f2e1a7d4d00000000000000000000000000000000000000000000000000000000845260048401525af18015610a1857908691156109ab5781610a099161129d565b610a1457845f6109ab565b8480fd5b6040513d88823e3d90fd5b8680fd5b90506109a5565b90506020813d602011610a5c575b81610a496020938361129d565b81010312610a5857515f61099a565b5f80fd5b3d9150610a3c565b6040513d8a823e3d90fd5b90610ac59392610a9f917f000000000000000000000000000000000000000000000000000000000000000061159b565b7f000000000000000000000000000000000000000000000000000000000000000061159b565b610842565b4780610ad7575b506107e9565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016803b15610a58575f906004604051809481937fd0e30db00000000000000000000000000000000000000000000000000000000083525af18015610b585715610ad157610b50919b505f9061129d565b5f995f610ad1565b6040513d5f823e3d90fd5b602090813d8311610b87575b610b79818361129d565b81010312610a58575f6107d1565b503d610b6f565b634e487b7160e01b5f52604160045260245ffd5b73fffd8963efd1fc6a506488495d951d5263988d25926106e2565b606460405162461bcd60e51b815260206004820152601060248201527f57524f4e475f56345f4d414e41474552000000000000000000000000000000006044820152fd5b34610a58575f600319360112610a585760206001600160a01b0360015416604051908152f35b34610a58575f600319360112610a585760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610a58575f600319360112610a585760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610a58575f600319360112610a585760206040517f000000000000000000000000000000000000000000000000000000000000000060020b8152f35b34610a58575f600319360112610a5857602060405162ffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610a58576040600319360112610a5857610d426111e4565b602435906001600160a01b0382168203610a58576001600160a01b0390610d67611339565b1690604051906370a0823160e01b8252306004830152602082602481865afa918215610b58575f92610da5575b5081610d9c57005b61001892611391565b9091506020813d602011610dd1575b81610dc16020938361129d565b81010312610a5857519083610d94565b3d9150610db4565b34610a58575f600319360112610a585760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610a58576020600319360112610a58575f808080610e396111e4565b610e41611339565b6001600160a01b034791165af1610e566112eb565b5015610e5e57005b606460405162461bcd60e51b815260206004820152601160248201527f4554485f5452414e534645525f4641494c0000000000000000000000000000006044820152fd5b34610a58576020600319360112610a5857610ebb6111e4565b610ec3611339565b6040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691602082602481865afa918215610b58575f92610da5575081610d9c57005b34610a5857610160600319360112610a5857600435801515809103610a585760243560443591821515809303610a5857608435801515809103610a585760c435801515809103610a585760e435801515809103610a585761010435916001600160a01b038316809303610a58576101443593610f99611339565b60025f54146111af5760025f55610fb242861015611252565b61012c420180421161119b5785116111575786156111135761105d975f9760405197602089015260408801526060870152606435608087015260a086015260a43560c086015260e085015261010084015261012083015261012435610140830152610160820152610160815261102a6101808261129d565b604051809381927f48c8949100000000000000000000000000000000000000000000000000000000835260048301611228565b0381836001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165af18015610b585761109d575b60015f55005b3d805f833e6110ac818361129d565b810190602081830312610a585780519067ffffffffffffffff8211610a58570181601f82011215610a585780516110e2816112c0565b926110f0604051948561129d565b81845260208284010111610a58575f928160208094018483015e01015280611097565b606460405162461bcd60e51b815260206004820152600b60248201527f5a45524f5f414d4f554e540000000000000000000000000000000000000000006044820152fd5b606460405162461bcd60e51b815260206004820152601060248201527f444541444c494e455f544f4f5f464152000000000000000000000000000000006044820152fd5b634e487b7160e01b5f52601160045260245ffd5b7f3ee5aeb5000000000000000000000000000000000000000000000000000000005f5260045ffd5b35908115158203610a5857565b600435906001600160a01b0382168203610a5857565b9181601f84011215610a585782359167ffffffffffffffff8311610a585760208381860195010111610a5857565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b1561125957565b606460405162461bcd60e51b815260206004820152600760248201527f45585049524544000000000000000000000000000000000000000000000000006044820152fd5b90601f601f19910116810190811067ffffffffffffffff821117610b8e57604052565b67ffffffffffffffff8111610b8e57601f01601f191660200190565b90816020910312610a58575190565b3d15611315573d906112fc826112c0565b9161130a604051938461129d565b82523d5f602084013e565b606090565b90816020910312610a5857516001600160a01b0381168103610a585790565b6001600160a01b0360015416330361134d57565b606460405162461bcd60e51b815260206004820152600960248201527f4e4f545f4f574e455200000000000000000000000000000000000000000000006044820152fd5b5f6113fe926001600160a01b038293604051968260208901947fa9059cbb0000000000000000000000000000000000000000000000000000000086521660248901526044880152604487526113e760648861129d565b1694519082865af16113f76112eb565b908361196c565b805190811515918261143f575b50506114145750565b7f5274afe7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b8192509060209181010312610a585760200151801590811503610a58575f8061140b565b6001600160a01b03166001600160a01b03811480156114e4575b6114df576020602491604051928380926370a0823160e01b82523060048301525afa908115610b58575f916114b0575090565b90506020813d6020116114d7575b816114cb6020938361129d565b81010312610a58575190565b3d91506114be565b504790565b50801561147d565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000911661152281308461190e565b915f831361152f57505050565b6001600160a01b031691823b15610a585760645f928360405195869485937f0b0d9c09000000000000000000000000000000000000000000000000000000008552600485015230602485015260448401525af18015610b585761158f5750565b5f6115999161129d565b565b91801561166a5760c4604092805f14611646575f6001600160a01b036401000276a4965b81875198899788967f128acb0800000000000000000000000000000000000000000000000000000000885230600489015215156024880152604487015216606485015260a060848501528260a4850152165af18015610b585761161f5750565b604090813d831161163f575b611635818361129d565b81010312610a5857565b503d61162b565b5f6001600160a01b0373fffd8963efd1fc6a506488495d951d5263988d25966115bf565b505050565b7f8000000000000000000000000000000000000000000000000000000000000000811461119b575f0390565b305f525f60205260405f20604051907ff135baaa00000000000000000000000000000000000000000000000000000000825260048201526020816024816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa908115610b58575f9161172b575b505f811261171f57505f90565b6117289061166f565b90565b90506020813d602011611755575b816117466020938361129d565b81010312610a5857515f611712565b3d9150611739565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000911661179381308461190e565b905f915f81126117a4575b50505050565b6117b56001600160a01b039161166f565b931690813b15610a58576040517fa58411940000000000000000000000000000000000000000000000000000000081528160048201525f8160248183875af18015610b58576118f9575b508061188a57506020906004604051809581937f11da60b40000000000000000000000000000000000000000000000000000000083525af190811561187e575061184f575b505b5f80808061179e565b6118709060203d602011611877575b611868818361129d565b8101906112dc565b505f611844565b503d61185e565b604051903d90823e3d90fd5b90611899839482602094611391565b6004604051809581937f11da60b40000000000000000000000000000000000000000000000000000000083525af190811561187e57506118da575b50611846565b6118f29060203d60201161187757611868818361129d565b505f6118d4565b6119069193505f9061129d565b5f915f6117ff565b6001600160a01b03809381602094165f52168252602460405f2060405194859384927ff135baaa0000000000000000000000000000000000000000000000000000000084526004840152165afa908115610b58575f916114b0575090565b906119a9575080511561198157805190602001fd5b7f1425ea42000000000000000000000000000000000000000000000000000000005f5260045ffd5b815115806119ef575b6119ba575090565b6001600160a01b03907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b156119b256fea2646970667358221220c719437e0a931366964ae1884ec9668af4575161545438907f10d51c2485209964736f6c634300081a003300000000000000000000000054e550d1422951e560b5e6074135656d60acf4b900000000000000000000000052e65b17fb6e5ba00ed806f37afcd2daa50271ca0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409510000000000000000000000000000000000000000000000000000000000000000000000000000000000000000516e98b6b422889f2fc4695bf1bc853c6b095fa30000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73
0x6080604052600436101561001a575b3615610018575f80fd5b005b5f803560e01c8063088e53bb14610f1f578063208daad414610ea257806325e1606314610e1c57806333631df414610dd95780633aeac4e114610d295780634b05d78c14610cea5780635c76be2114610cad57806362308e8514610c6a5780637b5dcb0c14610c275780638da5cb5b14610c0157806391dd7346146104db578063996d976a14610497578063ad5c464814610453578063ba5bd4c11461040f578063f2fde38b1461033f578063f33b3271146102fb5763fa461e33146100e0575061000e565b346102f85760606003193601126102f85760043560243560443567ffffffffffffffff81116102f4576101179036906004016111fa565b50506001600160a01b037f00000000000000000000000054e550d1422951e560b5e6074135656d60acf4b916331480156102c2575b1561027e576040517f0dfe1681000000000000000000000000000000000000000000000000000000008152602081600481335afa908115610273578491610254575b50604051927fd21220a7000000000000000000000000000000000000000000000000000000008452602084600481335afa938415610249578594610218575b508481136101fd575b50508281136101e3578280f35b6101f7916001600160a01b03339116611391565b5f808280f35b610211916001600160a01b03339116611391565b5f806101d6565b61023b91945060203d602011610242575b610233818361129d565b81019061131a565b925f6101cd565b503d610229565b6040513d87823e3d90fd5b61026d915060203d60201161024257610233818361129d565b5f61018e565b6040513d86823e3d90fd5b606460405162461bcd60e51b815260206004820152600d60248201527f57524f4e475f56335f504f4f4c000000000000000000000000000000000000006044820152fd5b506001600160a01b037f00000000000000000000000052e65b17fb6e5ba00ed806f37afcd2daa50271ca16331461014c565b8380fd5b80fd5b50346102f857806003193601126102f85760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b50346102f85760206003193601126102f8576001600160a01b036103616111e4565b610369611339565b1680156103cb577fffffffffffffffffffffffff0000000000000000000000000000000000000000600154826001600160a01b0382167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08680a3161760015580f35b606460405162461bcd60e51b815260206004820152600c60248201527f5a45524f5f4144445245535300000000000000000000000000000000000000006044820152fd5b50346102f857806003193601126102f85760206040516001600160a01b037f00000000000000000000000054e550d1422951e560b5e6074135656d60acf4b9168152f35b50346102f857806003193601126102f85760206040516001600160a01b037f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73168152f35b50346102f857806003193601126102f85760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b5034610a58576020600319360112610a585760043567ffffffffffffffff8111610a585761050d9036906004016111fa565b6001600160a01b039291927f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409511690813303610bbd57836101609181010312610a5857610558836111d7565b90610565604085016111d7565b906060850135610577608087016111d7565b60a08701359161058960c089016111d7565b9261059660e08a016111d7565b926101008a0135966001600160a01b038816809803610a58576105c06101408c0135421115611252565b6105c988611463565b986040519660a0880188811067ffffffffffffffff821117610b8e576040528c6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169889815260208101906001600160a01b037f000000000000000000000000516e98b6b422889f2fc4695bf1bc853c6b095fa3169b8c8352604082019362ffffff7f000000000000000000000000000000000000000000000000000000000000000016855260608301907f000000000000000000000000000000000000000000000000000000000000000160020b825260808401916001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168352885f14610ba2576401000276a4925b604051916060830183811067ffffffffffffffff821117610b8e576040528a15158352602083019360200135845260408301946001600160a01b0316855260405198899889987ff3cd914c000000000000000000000000000000000000000000000000000000008a52516001600160a01b031660048a0152516001600160a01b031660248901525162ffffff1660448801525160020b6064870152516001600160a01b0316608486015251151560a48501525160c4840152516001600160a01b031660e48301526101048201610120905261012482015f90525a925f61014492602095f18015610b5857610b63575b506107db886114ec565b6107e4896114ec565b610aca575b15610a6f576108429361081c917f00000000000000000000000054e550d1422951e560b5e6074135656d60acf4b961159b565b7f00000000000000000000000052e65b17fb6e5ba00ed806f37afcd2daa50271ca61159b565b61093d575b916108606108659261085b6101209561175d565b61175d565b611463565b93013581018082116109295783106108e55782039182116108d1576108cd916040519081527f1b4deb727b75ffc843de0de07e8d503170a8b27d3a14e749270b74c89d969ac160203392a2604051906108bf60208361129d565b815260405191829182611228565b0390f35b80634e487b7160e01b602492526011600452fd5b606460405162461bcd60e51b815260206004820152600e60248201527f50524f4649545f544f4f5f4c4f570000000000000000000000000000000000006044820152fd5b602483634e487b7160e01b81526011600452fd5b61094561169b565b6001600160a01b037f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad7316906040516370a0823160e01b8152306004820152602081602481865afa908115610a64578891610a2e575b5080821015610a2757505b806109b2575b5050610847565b813b15610a235786916024839260405194859384927f2e1a7d4d00000000000000000000000000000000000000000000000000000000845260048401525af18015610a1857908691156109ab5781610a099161129d565b610a1457845f6109ab565b8480fd5b6040513d88823e3d90fd5b8680fd5b90506109a5565b90506020813d602011610a5c575b81610a496020938361129d565b81010312610a5857515f61099a565b5f80fd5b3d9150610a3c565b6040513d8a823e3d90fd5b90610ac59392610a9f917f00000000000000000000000052e65b17fb6e5ba00ed806f37afcd2daa50271ca61159b565b7f00000000000000000000000054e550d1422951e560b5e6074135656d60acf4b961159b565b610842565b4780610ad7575b506107e9565b6001600160a01b037f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad7316803b15610a58575f906004604051809481937fd0e30db00000000000000000000000000000000000000000000000000000000083525af18015610b585715610ad157610b50919b505f9061129d565b5f995f610ad1565b6040513d5f823e3d90fd5b602090813d8311610b87575b610b79818361129d565b81010312610a58575f6107d1565b503d610b6f565b634e487b7160e01b5f52604160045260245ffd5b73fffd8963efd1fc6a506488495d951d5263988d25926106e2565b606460405162461bcd60e51b815260206004820152601060248201527f57524f4e475f56345f4d414e41474552000000000000000000000000000000006044820152fd5b34610a58575f600319360112610a585760206001600160a01b0360015416604051908152f35b34610a58575f600319360112610a585760206040516001600160a01b037f00000000000000000000000052e65b17fb6e5ba00ed806f37afcd2daa50271ca168152f35b34610a58575f600319360112610a585760206040516001600160a01b037f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e40951168152f35b34610a58575f600319360112610a585760206040517f000000000000000000000000000000000000000000000000000000000000000160020b8152f35b34610a58575f600319360112610a5857602060405162ffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b34610a58576040600319360112610a5857610d426111e4565b602435906001600160a01b0382168203610a58576001600160a01b0390610d67611339565b1690604051906370a0823160e01b8252306004830152602082602481865afa918215610b58575f92610da5575b5081610d9c57005b61001892611391565b9091506020813d602011610dd1575b81610dc16020938361129d565b81010312610a5857519083610d94565b3d9150610db4565b34610a58575f600319360112610a585760206040516001600160a01b037f000000000000000000000000516e98b6b422889f2fc4695bf1bc853c6b095fa3168152f35b34610a58576020600319360112610a58575f808080610e396111e4565b610e41611339565b6001600160a01b034791165af1610e566112eb565b5015610e5e57005b606460405162461bcd60e51b815260206004820152601160248201527f4554485f5452414e534645525f4641494c0000000000000000000000000000006044820152fd5b34610a58576020600319360112610a5857610ebb6111e4565b610ec3611339565b6040516370a0823160e01b81523060048201527f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b031691602082602481865afa918215610b58575f92610da5575081610d9c57005b34610a5857610160600319360112610a5857600435801515809103610a585760243560443591821515809303610a5857608435801515809103610a585760c435801515809103610a585760e435801515809103610a585761010435916001600160a01b038316809303610a58576101443593610f99611339565b60025f54146111af5760025f55610fb242861015611252565b61012c420180421161119b5785116111575786156111135761105d975f9760405197602089015260408801526060870152606435608087015260a086015260a43560c086015260e085015261010084015261012083015261012435610140830152610160820152610160815261102a6101808261129d565b604051809381927f48c8949100000000000000000000000000000000000000000000000000000000835260048301611228565b0381836001600160a01b037f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e40951165af18015610b585761109d575b60015f55005b3d805f833e6110ac818361129d565b810190602081830312610a585780519067ffffffffffffffff8211610a58570181601f82011215610a585780516110e2816112c0565b926110f0604051948561129d565b81845260208284010111610a58575f928160208094018483015e01015280611097565b606460405162461bcd60e51b815260206004820152600b60248201527f5a45524f5f414d4f554e540000000000000000000000000000000000000000006044820152fd5b606460405162461bcd60e51b815260206004820152601060248201527f444541444c494e455f544f4f5f464152000000000000000000000000000000006044820152fd5b634e487b7160e01b5f52601160045260245ffd5b7f3ee5aeb5000000000000000000000000000000000000000000000000000000005f5260045ffd5b35908115158203610a5857565b600435906001600160a01b0382168203610a5857565b9181601f84011215610a585782359167ffffffffffffffff8311610a585760208381860195010111610a5857565b601f19601f602060409481855280519182918282880152018686015e5f8582860101520116010190565b1561125957565b606460405162461bcd60e51b815260206004820152600760248201527f45585049524544000000000000000000000000000000000000000000000000006044820152fd5b90601f601f19910116810190811067ffffffffffffffff821117610b8e57604052565b67ffffffffffffffff8111610b8e57601f01601f191660200190565b90816020910312610a58575190565b3d15611315573d906112fc826112c0565b9161130a604051938461129d565b82523d5f602084013e565b606090565b90816020910312610a5857516001600160a01b0381168103610a585790565b6001600160a01b0360015416330361134d57565b606460405162461bcd60e51b815260206004820152600960248201527f4e4f545f4f574e455200000000000000000000000000000000000000000000006044820152fd5b5f6113fe926001600160a01b038293604051968260208901947fa9059cbb0000000000000000000000000000000000000000000000000000000086521660248901526044880152604487526113e760648861129d565b1694519082865af16113f76112eb565b908361196c565b805190811515918261143f575b50506114145750565b7f5274afe7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b8192509060209181010312610a585760200151801590811503610a58575f8061140b565b6001600160a01b03166001600160a01b03811480156114e4575b6114df576020602491604051928380926370a0823160e01b82523060048301525afa908115610b58575f916114b0575090565b90506020813d6020116114d7575b816114cb6020938361129d565b81010312610a58575190565b3d91506114be565b504790565b50801561147d565b6001600160a01b037f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e40951911661152281308461190e565b915f831361152f57505050565b6001600160a01b031691823b15610a585760645f928360405195869485937f0b0d9c09000000000000000000000000000000000000000000000000000000008552600485015230602485015260448401525af18015610b585761158f5750565b5f6115999161129d565b565b91801561166a5760c4604092805f14611646575f6001600160a01b036401000276a4965b81875198899788967f128acb0800000000000000000000000000000000000000000000000000000000885230600489015215156024880152604487015216606485015260a060848501528260a4850152165af18015610b585761161f5750565b604090813d831161163f575b611635818361129d565b81010312610a5857565b503d61162b565b5f6001600160a01b0373fffd8963efd1fc6a506488495d951d5263988d25966115bf565b505050565b7f8000000000000000000000000000000000000000000000000000000000000000811461119b575f0390565b305f525f60205260405f20604051907ff135baaa00000000000000000000000000000000000000000000000000000000825260048201526020816024816001600160a01b037f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e40951165afa908115610b58575f9161172b575b505f811261171f57505f90565b6117289061166f565b90565b90506020813d602011611755575b816117466020938361129d565b81010312610a5857515f611712565b3d9150611739565b6001600160a01b037f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e40951911661179381308461190e565b905f915f81126117a4575b50505050565b6117b56001600160a01b039161166f565b931690813b15610a58576040517fa58411940000000000000000000000000000000000000000000000000000000081528160048201525f8160248183875af18015610b58576118f9575b508061188a57506020906004604051809581937f11da60b40000000000000000000000000000000000000000000000000000000083525af190811561187e575061184f575b505b5f80808061179e565b6118709060203d602011611877575b611868818361129d565b8101906112dc565b505f611844565b503d61185e565b604051903d90823e3d90fd5b90611899839482602094611391565b6004604051809581937f11da60b40000000000000000000000000000000000000000000000000000000083525af190811561187e57506118da575b50611846565b6118f29060203d60201161187757611868818361129d565b505f6118d4565b6119069193505f9061129d565b5f915f6117ff565b6001600160a01b03809381602094165f52168252602460405f2060405194859384927ff135baaa0000000000000000000000000000000000000000000000000000000084526004840152165afa908115610b58575f916114b0575090565b906119a9575080511561198157805190602001fd5b7f1425ea42000000000000000000000000000000000000000000000000000000005f5260045ffd5b815115806119ef575b6119ba575090565b6001600160a01b03907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b156119b256fea2646970667358221220c719437e0a931366964ae1884ec9668af4575161545438907f10d51c2485209964736f6c634300081a0033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| !0xd17dfb…5074ce | arb | 11,129,010 | 32 days agoThu, 16 Jul 2026 08:54:45 UTC | 0xe5b3…cd92 | IN | UniV3V4Arb | $0.000 ETH | 0.00027783 | |
| !0x4d0573…855743 | arb | 11,121,894 | 32 days agoThu, 16 Jul 2026 08:42:51 UTC | 0xe5b3…cd92 | IN | UniV3V4Arb | $0.000 ETH | 0.00018151 | |
| !0x6da7d4…89c78b | arb | 11,112,397 | 32 days agoThu, 16 Jul 2026 08:26:59 UTC | 0xe5b3…cd92 | IN | UniV3V4Arb | $0.000 ETH | 0.00009074 |
| 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 | |||
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| no token transfers for this address yet | |||||||||
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| no internal transactions found for this address yet (traced blocks + on-demand) | ||||||||