// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;
import {SafeTransferLib} from "../lib/solady/src/utils/SafeTransferLib.sol";
interface IUniswapV2PairLike {
function token0() external view returns (address);
function token1() external view returns (address);
function factory() external view returns (address);
function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
function totalSupply() external view returns (uint256);
function swap(uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data) external;
}
interface IUniswapV3PoolLike {
function token0() external view returns (address);
function token1() external view returns (address);
function fee() external view returns (uint24);
function liquidity() external view returns (uint128);
function slot0()
external
view
returns (
uint160 sqrtPriceX96,
int24 tick,
uint16 observationIndex,
uint16 observationCardinality,
uint16 observationCardinalityNext,
uint8 feeProtocol,
bool unlocked
);
}
interface IV3SwapRouter {
function exactInputSingle(
ExactInputSingleParams calldata params
) external payable returns (uint256 amountOut);
}
struct ExactInputSingleParams {
address tokenIn;
address tokenOut;
uint24 fee;
address recipient;
uint256 amountIn;
uint256 amountOutMinimum;
uint160 sqrtPriceLimitX96;
}
/**
* ProxyPair — transparent liquidity mirror.
*
* getReserves() / token0 / token1 report the UNDERLYING pool's liquidity so
* explorers, aggregators and UIs see real depth on THIS address. Swaps settle
* against the underlying Uni V2 pair or V3 pool; this contract never holds inventory
* between trades. TRADE_FEE_BPS of output goes to treasury.
*
* Kind:
* 1 = V2 mirror (underlying is a UniswapV2Pair)
* 2 = V3 virtual (underlying is a UniswapV3Pool; reserves derived from L + sqrtP)
*/
contract ProxyPair {
uint8 public constant KIND_V2 = 1;
uint8 public constant KIND_V3 = 2;
uint256 public constant TRADE_FEE_BPS = 100;
uint256 public constant BPS = 10_000;
address public immutable factory;
address public immutable underlying;
address public immutable token0;
address public immutable token1;
address public immutable treasury;
address public immutable v3Router; // only used when kind == V3
uint24 public immutable v3Fee;
uint8 public immutable kind;
uint256 private _lock;
event Sync(uint112 reserve0, uint112 reserve1);
event Swap(
address indexed sender,
uint256 amount0In,
uint256 amount1In,
uint256 amount0Out,
uint256 amount1Out,
address indexed to
);
event FeeTaken(address indexed trader, uint256 fee0, uint256 fee1);
error Locked();
error BadOut();
error InsufficientInput();
error FlashUnsupported();
modifier lock() {
if (_lock == 1) revert Locked();
_lock = 1;
_;
_lock = 0;
}
constructor(
address underlying_,
uint8 kind_,
address treasury_,
address v3Router_,
uint24 v3Fee_
) {
factory = msg.sender;
underlying = underlying_;
kind = kind_;
treasury = treasury_;
v3Router = v3Router_;
v3Fee = v3Fee_;
if (kind_ == KIND_V2) {
token0 = IUniswapV2PairLike(underlying_).token0();
token1 = IUniswapV2PairLike(underlying_).token1();
} else if (kind_ == KIND_V3) {
token0 = IUniswapV3PoolLike(underlying_).token0();
token1 = IUniswapV3PoolLike(underlying_).token1();
} else {
revert("bad kind");
}
}
/// Real depth — forwarded / derived from the underlying LP. This is what makes liq "visible" here.
function getReserves()
public
view
returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast)
{
if (kind == KIND_V2) {
return IUniswapV2PairLike(underlying).getReserves();
}
// V3 → virtual V2 reserves from active liquidity + spot price (transparent approximation).
IUniswapV3PoolLike pool = IUniswapV3PoolLike(underlying);
(uint160 sqrtP,,,,,,) = pool.slot0();
uint128 L = pool.liquidity();
if (sqrtP == 0 || L == 0) return (0, 0, uint32(block.timestamp));
// amount0 ≈ L * 2^96 / sqrtP ; amount1 ≈ L * sqrtP / 2^96
uint256 r0 = (uint256(L) << 96) / uint256(sqrtP);
uint256 r1 = (uint256(L) * uint256(sqrtP)) >> 96;
if (r0 > type(uint112).max) r0 = type(uint112).max;
if (r1 > type(uint112).max) r1 = type(uint112).max;
return (uint112(r0), uint112(r1), uint32(block.timestamp));
}
/// Mirrored LP supply (V2 only). V3 returns active liquidity as a stand-in.
function totalSupply() external view returns (uint256) {
if (kind == KIND_V2) return IUniswapV2PairLike(underlying).totalSupply();
return uint256(IUniswapV3PoolLike(underlying).liquidity());
}
function getUnderlying() external view returns (address) {
return underlying;
}
/**
* Uniswap V2 Pair.swap compatible.
* Caller (usually a router) must first transfer the input token(s) to this contract,
* then call swap. We forward settlement to the underlying pool and skim 1% of output.
*/
function swap(uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data) external lock {
if (data.length != 0) revert FlashUnsupported();
if (amount0Out == 0 && amount1Out == 0) revert BadOut();
if (to == address(0) || to == token0 || to == token1) revert BadOut();
(uint112 r0, uint112 r1,) = getReserves();
if (amount0Out >= r0 || amount1Out >= r1) revert BadOut();
uint256 bal0 = SafeTransferLib.balanceOf(token0, address(this));
uint256 bal1 = SafeTransferLib.balanceOf(token1, address(this));
// Inputs are whatever is sitting on this pair before we send outs.
// (Uni V2 style: router transferred input here already.)
if (bal0 == 0 && bal1 == 0) revert InsufficientInput();
if (kind == KIND_V2) {
_swapV2(amount0Out, amount1Out, to, bal0, bal1);
} else {
_swapV3(amount0Out, amount1Out, to, bal0, bal1);
}
(uint112 n0, uint112 n1,) = getReserves();
emit Sync(n0, n1);
}
function _swapV2(
uint256 amount0Out,
uint256 amount1Out,
address to,
uint256 bal0,
uint256 bal1
) private {
// Move all input to underlying (Uni V2 pair expects input balance on itself).
if (bal0 > 0) SafeTransferLib.safeTransfer(token0, underlying, bal0);
if (bal1 > 0) SafeTransferLib.safeTransfer(token1, underlying, bal1);
// Pull full requested out to this proxy, skim fee, forward.
// Ask underlying for a bit more if fee applies so user can still receive amount*Out
// when possible — for simplicity request same out and skim from what we get.
IUniswapV2PairLike(underlying).swap(amount0Out, amount1Out, address(this), "");
uint256 out0 = SafeTransferLib.balanceOf(token0, address(this));
uint256 out1 = SafeTransferLib.balanceOf(token1, address(this));
uint256 fee0;
uint256 fee1;
if (out0 > 0) {
fee0 = (out0 * TRADE_FEE_BPS) / BPS;
if (fee0 > 0) SafeTransferLib.safeTransfer(token0, treasury, fee0);
SafeTransferLib.safeTransfer(token0, to, out0 - fee0);
}
if (out1 > 0) {
fee1 = (out1 * TRADE_FEE_BPS) / BPS;
if (fee1 > 0) SafeTransferLib.safeTransfer(token1, treasury, fee1);
SafeTransferLib.safeTransfer(token1, to, out1 - fee1);
}
if (fee0 > 0 || fee1 > 0) emit FeeTaken(msg.sender, fee0, fee1);
// amountIn ≈ what we forwarded (pre-fee on input side we took none; fee on output)
emit Swap(msg.sender, bal0, bal1, out0 - fee0, out1 - fee1, to);
}
function _swapV3(
uint256 amount0Out,
uint256 amount1Out,
address to,
uint256 bal0,
uint256 bal1
) private {
// Exactly one side in, exactly one side out (V2-style single hop).
bool zeroForOne;
uint256 amountIn;
if (bal0 > 0 && bal1 == 0 && amount1Out > 0 && amount0Out == 0) {
zeroForOne = true;
amountIn = bal0;
} else if (bal1 > 0 && bal0 == 0 && amount0Out > 0 && amount1Out == 0) {
zeroForOne = false;
amountIn = bal1;
} else {
revert BadOut();
}
address tokenIn = zeroForOne ? token0 : token1;
address tokenOut = zeroForOne ? token1 : token0;
uint256 minOut = zeroForOne ? amount1Out : amount0Out;
SafeTransferLib.safeApproveWithRetry(tokenIn, v3Router, amountIn);
uint256 got = IV3SwapRouter(v3Router).exactInputSingle(
ExactInputSingleParams({
tokenIn: tokenIn,
tokenOut: tokenOut,
fee: v3Fee,
recipient: address(this),
amountIn: amountIn,
amountOutMinimum: minOut,
sqrtPriceLimitX96: 0
})
);
uint256 fee = (got * TRADE_FEE_BPS) / BPS;
uint256 send = got - fee;
if (fee > 0) SafeTransferLib.safeTransfer(tokenOut, treasury, fee);
SafeTransferLib.safeTransfer(tokenOut, to, send);
if (fee > 0) {
emit FeeTaken(msg.sender, zeroForOne ? 0 : fee, zeroForOne ? fee : 0);
}
emit Swap(
msg.sender,
zeroForOne ? amountIn : 0,
zeroForOne ? 0 : amountIn,
zeroForOne ? 0 : send,
zeroForOne ? send : 0,
to
);
}
/// Billboard: force a Sync log with current mirrored reserves (gas only).
function sync() external {
(uint112 r0, uint112 r1,) = getReserves();
emit Sync(r0, r1);
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "underlying_",
"type": "address",
"internalType": "address"
},
{
"name": "kind_",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "treasury_",
"type": "address",
"internalType": "address"
},
{
"name": "v3Router_",
"type": "address",
"internalType": "address"
},
{
"name": "v3Fee_",
"type": "uint24",
"internalType": "uint24"
}
],
"stateMutability": "nonpayable"
},
{
"name": "BadOut",
"type": "error",
"inputs": []
},
{
"name": "FlashUnsupported",
"type": "error",
"inputs": []
},
{
"name": "InsufficientInput",
"type": "error",
"inputs": []
},
{
"name": "Locked",
"type": "error",
"inputs": []
},
{
"name": "FeeTaken",
"type": "event",
"inputs": [
{
"name": "trader",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "fee0",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "fee1",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Swap",
"type": "event",
"inputs": [
{
"name": "sender",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount0In",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "amount1In",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "amount0Out",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "amount1Out",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "Sync",
"type": "event",
"inputs": [
{
"name": "reserve0",
"type": "uint112",
"indexed": false,
"internalType": "uint112"
},
{
"name": "reserve1",
"type": "uint112",
"indexed": false,
"internalType": "uint112"
}
],
"anonymous": false
},
{
"name": "BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "KIND_V2",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"stateMutability": "view"
},
{
"name": "KIND_V3",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"stateMutability": "view"
},
{
"name": "TRADE_FEE_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "factory",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "getReserves",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "reserve0",
"type": "uint112",
"internalType": "uint112"
},
{
"name": "reserve1",
"type": "uint112",
"internalType": "uint112"
},
{
"name": "blockTimestampLast",
"type": "uint32",
"internalType": "uint32"
}
],
"stateMutability": "view"
},
{
"name": "getUnderlying",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "kind",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"stateMutability": "view"
},
{
"name": "swap",
"type": "function",
"inputs": [
{
"name": "amount0Out",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "amount1Out",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "data",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "sync",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "token0",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "token1",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "totalSupply",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "treasury",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "underlying",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "v3Fee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint24",
"internalType": "uint24"
}
],
"stateMutability": "view"
},
{
"name": "v3Router",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
}
]0x60806040526004361015610011575f80fd5b5f5f3560e01c8063022c0d9f146103e157806304baa00b146103a35780630902f1ac146103625780630dc913061461031d5780630dfe1681146102d857806318160ddd146102b5578063249d39e914610298578063260bfc991461027c578063330ec614146102605780633de1d8a41461022057806361d027b3146101db5780636f307dc3146101ba5780639185f598146101bf5780639816f473146101ba578063c45a015514610175578063d21220a7146101305763fff6cae9146100d5575f80fd5b3461012d578060031936011261012d577f1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad161010e610dfc565b50604080516001600160701b039384168152919092166020820152a180f35b80fd5b503461012d578060031936011261012d576040517f000000000000000000000000f39c09643e1bc1a5acabad3addf8cff015981df06001600160a01b03168152602090f35b503461012d578060031936011261012d576040517f00000000000000000000000082fb297d56ed220c1f0f6ffa951e11871794aa0f6001600160a01b03168152602090f35b610d54565b503461012d578060031936011261012d57602060405160648152f35b503461012d578060031936011261012d576040517f000000000000000000000000f43cea6ef9dbe74be5dc13b24cecd046ff5cd0446001600160a01b03168152602090f35b503461012d578060031936011261012d57602060405162ffffff7f0000000000000000000000000000000000000000000000000000000000002710168152f35b503461012d578060031936011261012d57602060405160018152f35b503461012d578060031936011261012d57602060405160028152f35b503461012d578060031936011261012d5760206040516127108152f35b503461012d578060031936011261012d5760206102d06110fe565b604051908152f35b503461012d578060031936011261012d576040517f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b03168152602090f35b503461012d578060031936011261012d576040517f000000000000000000000000caf681a66d020601342297493863e78c959e5cb26001600160a01b03168152602090f35b503461012d578060031936011261012d5760606001600160701b0363ffffffff61038a610dfc565b9193908160405195168552166020840152166040820152f35b503461012d578060031936011261012d57602060405160ff7f0000000000000000000000000000000000000000000000000000000000000002168152f35b5034610831576080366003190112610831576044356001600160a01b03811690602435906004358382036108315760643567ffffffffffffffff811161083157366023820112156108315780600401359067ffffffffffffffff82116108315760248236920101116108315760015f5414610d455760015f55610d36578015908180610d2e575b610c5f5784158015610cfc575b8015610cca575b610c5f576001600160701b03610490610dfc565b509116821090811591610cb6575b50610c5f577f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73906104cf308361121e565b947f000000000000000000000000f39c09643e1bc1a5acabad3addf8cff015981df0916104fc308461121e565b948715908180610cae575b610c9f577f000000000000000000000000000000000000000000000000000000000000000260ff16600103610895575015610865575b84610835575b7f0000000000000000000000009dfe86959c48037d2f14f6c1380d0491a44ffa846001600160a01b031691823b156108315760a45f9283604051958694859363022c0d9f60e01b855260048501526024840152306044840152608060648401528160848401525af1801561082657610811575b506105c1308361121e565b6105cb308361121e565b948892899483158015610798575b5050861580156106e3575b5050507fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229493926106298361062f9361065495158015906106da575b6106a357611243565b94611243565b6040519384933397859094939260609260808301968352602083015260408201520152565b0390a35b7f1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad1610681610dfc565b50604080516001600160701b039384168152919092166020820152a180805580f35b6040518281528460208201527fa6b7d7885e75fafb205114d74135904f557437647ebcbb720fad77c6869c183560403392a2611243565b50831515610620565b9091945060648702908782046064141715610784576106549361062f936107477fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229998979461271061062995049586610754575b610741878c611243565b91611250565b93509382959697506105e4565b61077f877f000000000000000000000000f43cea6ef9dbe74be5dc13b24cecd046ff5cd04484611250565b610737565b634e487b7160e01b8a52601160045260248afd5b909450606484029084820460641417156107fd576127106107c6910494856107cd575b836107418787611243565b5f806105d9565b6107f8867f000000000000000000000000f43cea6ef9dbe74be5dc13b24cecd046ff5cd04483611250565b6107bb565b634e487b7160e01b8b52601160045260248bfd5b61081e9197505f90610d98565b5f955f6105b6565b6040513d5f823e3d90fd5b5f80fd5b610860857f0000000000000000000000009dfe86959c48037d2f14f6c1380d0491a44ffa8485611250565b610543565b610890877f0000000000000000000000009dfe86959c48037d2f14f6c1380d0491a44ffa8486611250565b61053d565b5f9896929795949850811580610c97575b80610c8e575b80610c87575b15610c3657505050600193955b8415610c2f57825b8515610c275750945b8415610c1f5750905b7f000000000000000000000000caf681a66d020601342297493863e78c959e5cb2806014528660345263095ea7b360601b5f5260205f6044601082865af18060015f51141615610bb3575b505f60345260405160e081019080821067ffffffffffffffff831117610b9f5760409182526001600160a01b039384168152878416602080830191825262ffffff7f000000000000000000000000000000000000000000000000000000000000271081168486019081523060608601908152608086018e815260a087019a8b525f60c0880181815298516304e45aaf60e01b815297518b16600489015295518a16602488015291519092166044860152905187166064850152516084840152955160a48301529151841660c48201529392849260e49284929091165af1908115610826575f91610b6d575b50606481029381850460641482151715610b5957610a66610a566127107fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d82297048094611243565b80948415159384610b2957611250565b610ad5575b508115610ace57835b8215610ac857505f905b8215610ac1575f925b15610ab757604080519586526020860192909252908401919091526060830152339180608081015b0390a3610658565b50610aaf5f61062f565b8092610a87565b90610a7e565b5f93610a74565b8215610b23575f905b8315610b1c575b60405191825260208201527fa6b7d7885e75fafb205114d74135904f557437647ebcbb720fad77c6869c183560403392a25f610a6b565b505f610ae5565b80610ade565b610b54867f000000000000000000000000f43cea6ef9dbe74be5dc13b24cecd046ff5cd04483611250565b611250565b634e487b7160e01b5f52601160045260245ffd5b90506020813d602011610b97575b81610b8860209383610d98565b8101031261083157515f610a0f565b3d9150610b7b565b634e487b7160e01b5f52604160045260245ffd5b3d833b15171015610bc5575b5f610924565b5f603481905263095ea7b360601b8152386044601083865af1508660345260205f6044601082865af18060015f51141615610c01575b50610bbf565b3d833b15171015610c12575f610bfb565b633e3f8f735f526004601cfd5b9050906108d9565b9050946108d0565b80926108c7565b909180965015159182610c7f575b5081610c76575b5080610c6e575b15610c5f575f93956108bf565b630b986bd560e21b5f5260045ffd5b508015610c52565b9050155f610c4b565b91505f610c44565b50806108b2565b508315156108ac565b5082156108a6565b63f8b3bb6160e01b5f5260045ffd5b508615610507565b6001600160701b039150168410155f61049e565b507f000000000000000000000000f39c09643e1bc1a5acabad3addf8cff015981df06001600160a01b0316851461047c565b507f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b03168514610475565b508315610468565b6314513cb760e21b5f5260045ffd5b6303cb96db60e21b5f5260045ffd5b34610831575f366003190112610831576040517f0000000000000000000000009dfe86959c48037d2f14f6c1380d0491a44ffa846001600160a01b03168152602090f35b90601f8019910116810190811067ffffffffffffffff821117610b9f57604052565b51906001600160701b038216820361083157565b519061ffff8216820361083157565b9081602091031261083157516001600160801b03811681036108315790565b600160ff7f0000000000000000000000000000000000000000000000000000000000000002161461104757604051633850c7bd60e01b8152907f0000000000000000000000009dfe86959c48037d2f14f6c1380d0491a44ffa846001600160a01b031660e083600481845afa928315610826575f93610fb3575b5091602060049360405194858092630d34328160e11b82525afa928315610826575f93610f82575b506001600160a01b031691821590818015610f71575b610f60576001600160801b03811691610f4c5760601b6fffffffffffffffffffffffffffffffff60601b16839004928391808202918115918304141715610b59576001600160701b039060601c9311610f3e575b6001600160701b038311610f2f575b6001600160701b0380911692169063ffffffff421690565b6001600160701b039250610f17565b506001600160701b03610f08565b634e487b7160e01b5f52601260045260245ffd5b505f925082914263ffffffff169150565b506001600160801b03811615610eb4565b610fa591935060203d602011610fac575b610f9d8183610d98565b810190610ddd565b915f610e9e565b503d610f93565b925060e0833d60e01161103f575b81610fce60e09383610d98565b81010312610831578251926001600160a01b03841684036108315760208101518060020b036108315761100360408201610dce565b5061101060608201610dce565b5061101d60808201610dce565b5060a081015160ff8116036108315760c0015180151503610831576020610e76565b3d9150610fc1565b604051630240bc6b60e21b8152906060826004817f0000000000000000000000009dfe86959c48037d2f14f6c1380d0491a44ffa846001600160a01b03165afa908115610826575f5f935f9361109e575b50929190565b92505091506060813d6060116110f6575b816110bc60609383610d98565b81010312610831576110cd81610dba565b9160406110dc60208401610dba565b9201519263ffffffff84168403610831579192915f611098565b3d91506110af565b600160ff7f0000000000000000000000000000000000000000000000000000000000000002161461119f57604051630d34328160e11b81526020816004817f0000000000000000000000009dfe86959c48037d2f14f6c1380d0491a44ffa846001600160a01b03165afa8015610826576001600160801b03915f9161118257501690565b61119b915060203d602011610fac57610f9d8183610d98565b1690565b6040516318160ddd60e01b81526020816004817f0000000000000000000000009dfe86959c48037d2f14f6c1380d0491a44ffa846001600160a01b03165afa908115610826575f916111ef575090565b90506020813d602011611216575b8161120a60209383610d98565b81010312610831575190565b3d91506111fd565b602460106020939284936014526370a0823160601b5f525afa601f3d11166020510290565b91908203918211610b5957565b919060145260345263a9059cbb60601b5f5260205f6044601082855af1908160015f51141615611283575b50505f603452565b3b153d171015611294575f8061127b565b6390b8ec185f526004601cfdfea2646970667358221220edac705ca4c35bb5f2a55a7d859a585426a1c265961f8be51343205cd5d4317664736f6c634300081c0033
| 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 | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x0c6018…e920c0 | 23 days agoSat, 25 Jul 2026 11:29:19 UTC | Sync | data: 0x000000000000000000…6cd3695d |
| 0x0c6018…e920c0 | 23 days agoSat, 25 Jul 2026 11:29:19 UTC | Swap | [0] 0x000000000000…ff5cd044 [1] 0x000000000000…ff5cd044 data: 0x000000000000000000…766d7dda |
| 0x0c6018…e920c0 | 23 days agoSat, 25 Jul 2026 11:29:19 UTC | 0xa6b7d7…1835 | [0] 0x000000000000…ff5cd044 data: 0x000000000000000000…4999abf0 |
| 0xc42a6e…aa0f72 | 23 days agoSat, 25 Jul 2026 11:29:12 UTC | Sync | data: 0x000000000000000000…ba8c1d80 |
| 0xc42a6e…aa0f72 | 23 days agoSat, 25 Jul 2026 11:29:12 UTC | Swap | [0] 0x000000000000…ff5cd044 [1] 0x000000000000…ff5cd044 data: 0x000000000000000000…4a9d5a7d |
| 0xc42a6e…aa0f72 | 23 days agoSat, 25 Jul 2026 11:29:12 UTC | 0xa6b7d7…1835 | [0] 0x000000000000…ff5cd044 data: 0x000000000000000000…5dd83737 |
| 0x23915a…17545e | 23 days agoSat, 25 Jul 2026 11:29:06 UTC | Sync | data: 0x000000000000000000…b20814fb |
| 0x23915a…17545e | 23 days agoSat, 25 Jul 2026 11:29:06 UTC | Swap | [0] 0x000000000000…ff5cd044 [1] 0x000000000000…ff5cd044 data: 0x000000000000000000…058d4dfc |
| 0x23915a…17545e | 23 days agoSat, 25 Jul 2026 11:29:06 UTC | 0xa6b7d7…1835 | [0] 0x000000000000…ff5cd044 data: 0x000000000000000000…90dd39ad |
| 0x2a03ac…d394d3 | 23 days agoSat, 25 Jul 2026 11:28:58 UTC | Sync | data: 0x000000000000000000…5f469b04 |
| 0x2a03ac…d394d3 | 23 days agoSat, 25 Jul 2026 11:28:58 UTC | Swap | [0] 0x000000000000…ff5cd044 [1] 0x000000000000…ff5cd044 data: 0x000000000000000000…3c8975b6 |
| 0x2a03ac…d394d3 | 23 days agoSat, 25 Jul 2026 11:28:58 UTC | 0xa6b7d7…1835 | [0] 0x000000000000…ff5cd044 data: 0x000000000000000000…5887da66 |
| 0x3fb496…07d3de | 23 days agoSat, 25 Jul 2026 11:28:52 UTC | Sync | data: 0x000000000000000000…f6d322bb |
| 0x3fb496…07d3de | 23 days agoSat, 25 Jul 2026 11:28:52 UTC | Swap | [0] 0x000000000000…ff5cd044 [1] 0x000000000000…ff5cd044 data: 0x000000000000000000…88d78254 |
| 0x3fb496…07d3de | 23 days agoSat, 25 Jul 2026 11:28:52 UTC | 0xa6b7d7…1835 | [0] 0x000000000000…ff5cd044 data: 0x000000000000000000…a6e08f89 |
| 0xadd8a7…663171 | 23 days agoSat, 25 Jul 2026 11:28:45 UTC | Sync | data: 0x000000000000000000…65f2894a |
| 0xadd8a7…663171 | 23 days agoSat, 25 Jul 2026 11:28:45 UTC | Swap | [0] 0x000000000000…ff5cd044 [1] 0x000000000000…ff5cd044 data: 0x000000000000000000…fd12c9e3 |
| 0xadd8a7…663171 | 23 days agoSat, 25 Jul 2026 11:28:45 UTC | 0xa6b7d7…1835 | [0] 0x000000000000…ff5cd044 data: 0x000000000000000000…a57723a7 |
| 0x70ffef…2c678f | 23 days agoSat, 25 Jul 2026 11:28:37 UTC | Sync | data: 0x000000000000000000…bb306e49 |
| 0x70ffef…2c678f | 23 days agoSat, 25 Jul 2026 11:28:37 UTC | Swap | [0] 0x000000000000…ff5cd044 [1] 0x000000000000…ff5cd044 data: 0x000000000000000000…7bf492e3 |
| 0x70ffef…2c678f | 23 days agoSat, 25 Jul 2026 11:28:37 UTC | 0xa6b7d7…1835 | [0] 0x000000000000…ff5cd044 data: 0x000000000000000000…78339a0c |
| 0xd24f27…ced644 | 23 days agoSat, 25 Jul 2026 11:28:30 UTC | Sync | data: 0x000000000000000000…93e8c25a |
| 0xd24f27…ced644 | 23 days agoSat, 25 Jul 2026 11:28:30 UTC | Swap | [0] 0x000000000000…ff5cd044 [1] 0x000000000000…ff5cd044 data: 0x000000000000000000…a25940b7 |
| 0xd24f27…ced644 | 23 days agoSat, 25 Jul 2026 11:28:30 UTC | 0xa6b7d7…1835 | [0] 0x000000000000…ff5cd044 data: 0x000000000000000000…23418c4a |
| 0x7f2b5f…e51b2d | 23 days agoSat, 25 Jul 2026 11:28:24 UTC | Sync | data: 0x000000000000000000…ae4aabec |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x0c6018…e920c0 | swap | 18,974,409 | 23 days agoSat, 25 Jul 2026 11:29:19 UTC | 0xf43c…d044 | IN | ProxyPair | $0.000 ETH | 0.00001352 | |
| 0xc42a6e…aa0f72 | swap | 18,974,341 | 23 days agoSat, 25 Jul 2026 11:29:12 UTC | 0xf43c…d044 | IN | ProxyPair | $0.000 ETH | 0.00001360 | |
| 0x23915a…17545e | swap | 18,974,273 | 23 days agoSat, 25 Jul 2026 11:29:06 UTC | 0xf43c…d044 | IN | ProxyPair | $0.000 ETH | 0.00001352 | |
| 0x2a03ac…d394d3 | swap | 18,974,202 | 23 days agoSat, 25 Jul 2026 11:28:58 UTC | 0xf43c…d044 | IN | ProxyPair | $0.000 ETH | 0.00001357 | |
| 0x3fb496…07d3de | swap | 18,974,134 | 23 days agoSat, 25 Jul 2026 11:28:52 UTC | 0xf43c…d044 | IN | ProxyPair | $0.000 ETH | 0.00001352 | |
| 0xadd8a7…663171 | swap | 18,974,059 | 23 days agoSat, 25 Jul 2026 11:28:45 UTC | 0xf43c…d044 | IN | ProxyPair | $0.000 ETH | 0.00001354 | |
| 0x70ffef…2c678f | swap | 18,973,983 | 23 days agoSat, 25 Jul 2026 11:28:37 UTC | 0xf43c…d044 | IN | ProxyPair | $0.000 ETH | 0.00001357 | |
| 0xd24f27…ced644 | swap | 18,973,914 | 23 days agoSat, 25 Jul 2026 11:28:30 UTC | 0xf43c…d044 | IN | ProxyPair | $0.000 ETH | 0.00001359 | |
| 0x7f2b5f…e51b2d | swap | 18,973,848 | 23 days agoSat, 25 Jul 2026 11:28:24 UTC | 0xf43c…d044 | IN | ProxyPair | $0.000 ETH | 0.00001359 | |
| 0xc67885…087c1f | swap | 18,973,779 | 23 days agoSat, 25 Jul 2026 11:28:17 UTC | 0xf43c…d044 | IN | ProxyPair | $0.000 ETH | 0.00001353 | |
| 0x280434…37ccbb | swap | 18,973,712 | 23 days agoSat, 25 Jul 2026 11:28:10 UTC | 0xf43c…d044 | IN | ProxyPair | $0.000 ETH | 0.00001355 | |
| 0x2696d3…fe11cc | swap | 18,973,647 | 23 days agoSat, 25 Jul 2026 11:28:03 UTC | 0xf43c…d044 | IN | ProxyPair | $0.000 ETH | 0.00001358 | |
| 0xfe89a5…cc4d73 | swap | 18,973,580 | 23 days agoSat, 25 Jul 2026 11:27:57 UTC | 0xf43c…d044 | IN | ProxyPair | $0.000 ETH | 0.00001353 | |
| 0x47d242…f3c12b | swap | 18,973,508 | 23 days agoSat, 25 Jul 2026 11:27:49 UTC | 0xf43c…d044 | IN | ProxyPair | $0.000 ETH | 0.00001361 | |
| 0x3d4b95…21853b | swap | 18,972,771 | 23 days agoSat, 25 Jul 2026 11:26:35 UTC | 0xf43c…d044 | IN | ProxyPair | $0.000 ETH | 0.00001358 | |
| 0x51d286…bb651e | swap | 18,972,666 | 23 days agoSat, 25 Jul 2026 11:26:25 UTC | 0xf43c…d044 | IN | ProxyPair | $0.000 ETH | 0.00001354 | |
| 0xd46ddc…9d0643 | swap | 18,972,564 | 23 days agoSat, 25 Jul 2026 11:26:14 UTC | 0xf43c…d044 | IN | ProxyPair | $0.000 ETH | 0.00001358 | |
| 0xf8e8ee…56acd3 | swap | 18,972,458 | 23 days agoSat, 25 Jul 2026 11:26:04 UTC | 0xf43c…d044 | IN | ProxyPair | $0.000 ETH | 0.00001354 | |
| 0x0680bd…d3a6f7 | swap | 18,972,353 | 23 days agoSat, 25 Jul 2026 11:25:53 UTC | 0xf43c…d044 | IN | ProxyPair | $0.000 ETH | 0.00001470 |
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x0c6018a0…e920c0 | Transfer | 18,974,409 | 23 days agoSat, 25 Jul 2026 11:29:19 UTC | 0x5f49…aa8d | OUT | 0xf43c…d044 | $0.000.388878 RUSS | The Nietzschean Dog (RUSS) | |
| 0x0c6018a0…e920c0 | Transfer | 18,974,409 | 23 days agoSat, 25 Jul 2026 11:29:19 UTC | 0x5f49…aa8d | OUT | 0xf43c…d044 | $0.000.003928 RUSS | The Nietzschean Dog (RUSS) | |
| 0x0c6018a0…e920c0 | Transfer | 18,974,409 | 23 days agoSat, 25 Jul 2026 11:29:19 UTC | 0x5f49…aa8d | OUT | 0x9dfe…fa84 | 0.000000 WETH | WETH (WETH) | |
| 0x0c6018a0…e920c0 | Transfer | 18,974,409 | 23 days agoSat, 25 Jul 2026 11:29:19 UTC | 0x9dfe…fa84 | IN | 0x5f49…aa8d | $0.000.392806 RUSS | The Nietzschean Dog (RUSS) | |
| 0x79af7caa…eb09bf | Transfer | 18,974,401 | 23 days agoSat, 25 Jul 2026 11:29:18 UTC | 0xf43c…d044 | IN | 0x5f49…aa8d | 0.000000 WETH | WETH (WETH) | |
| 0xc42a6e51…aa0f72 | Transfer | 18,974,341 | 23 days agoSat, 25 Jul 2026 11:29:12 UTC | 0x5f49…aa8d | OUT | 0xf43c…d044 | $0.000.390736 RUSS | The Nietzschean Dog (RUSS) | |
| 0xc42a6e51…aa0f72 | Transfer | 18,974,341 | 23 days agoSat, 25 Jul 2026 11:29:12 UTC | 0x5f49…aa8d | OUT | 0xf43c…d044 | $0.000.003946 RUSS | The Nietzschean Dog (RUSS) | |
| 0xc42a6e51…aa0f72 | Transfer | 18,974,341 | 23 days agoSat, 25 Jul 2026 11:29:12 UTC | 0x5f49…aa8d | OUT | 0x9dfe…fa84 | 0.000000 WETH | WETH (WETH) | |
| 0xc42a6e51…aa0f72 | Transfer | 18,974,341 | 23 days agoSat, 25 Jul 2026 11:29:12 UTC | 0x9dfe…fa84 | IN | 0x5f49…aa8d | $0.000.394683 RUSS | The Nietzschean Dog (RUSS) | |
| 0x859a3bba…d48d0b | Transfer | 18,974,334 | 23 days agoSat, 25 Jul 2026 11:29:12 UTC | 0xf43c…d044 | IN | 0x5f49…aa8d | 0.000000 WETH | WETH (WETH) | |
| 0x23915a9d…17545e | Transfer | 18,974,273 | 23 days agoSat, 25 Jul 2026 11:29:06 UTC | 0x5f49…aa8d | OUT | 0xf43c…d044 | $0.000.393390 RUSS | The Nietzschean Dog (RUSS) | |
| 0x23915a9d…17545e | Transfer | 18,974,273 | 23 days agoSat, 25 Jul 2026 11:29:06 UTC | 0x5f49…aa8d | OUT | 0xf43c…d044 | $0.000.003973 RUSS | The Nietzschean Dog (RUSS) | |
| 0x23915a9d…17545e | Transfer | 18,974,273 | 23 days agoSat, 25 Jul 2026 11:29:06 UTC | 0x5f49…aa8d | OUT | 0x9dfe…fa84 | 0.000000 WETH | WETH (WETH) | |
| 0x23915a9d…17545e | Transfer | 18,974,273 | 23 days agoSat, 25 Jul 2026 11:29:06 UTC | 0x9dfe…fa84 | IN | 0x5f49…aa8d | $0.000.397364 RUSS | The Nietzschean Dog (RUSS) | |
| 0x1a00c367…0d5e21 | Transfer | 18,974,266 | 23 days agoSat, 25 Jul 2026 11:29:05 UTC | 0xf43c…d044 | IN | 0x5f49…aa8d | 0.000000 WETH | WETH (WETH) | |
| 0x2a03ac4b…d394d3 | Transfer | 18,974,202 | 23 days agoSat, 25 Jul 2026 11:28:58 UTC | 0x5f49…aa8d | OUT | 0xf43c…d044 | $0.000.395690 RUSS | The Nietzschean Dog (RUSS) | |
| 0x2a03ac4b…d394d3 | Transfer | 18,974,202 | 23 days agoSat, 25 Jul 2026 11:28:58 UTC | 0x5f49…aa8d | OUT | 0xf43c…d044 | $0.000.003996 RUSS | The Nietzschean Dog (RUSS) | |
| 0x2a03ac4b…d394d3 | Transfer | 18,974,202 | 23 days agoSat, 25 Jul 2026 11:28:58 UTC | 0x5f49…aa8d | OUT | 0x9dfe…fa84 | 0.000000 WETH | WETH (WETH) | |
| 0x2a03ac4b…d394d3 | Transfer | 18,974,202 | 23 days agoSat, 25 Jul 2026 11:28:58 UTC | 0x9dfe…fa84 | IN | 0x5f49…aa8d | $0.000.399687 RUSS | The Nietzschean Dog (RUSS) | |
| 0x95c9ca3e…121f5e | Transfer | 18,974,194 | 23 days agoSat, 25 Jul 2026 11:28:58 UTC | 0xf43c…d044 | IN | 0x5f49…aa8d | 0.000000 WETH | WETH (WETH) | |
| 0x3fb49609…07d3de | Transfer | 18,974,134 | 23 days agoSat, 25 Jul 2026 11:28:52 UTC | 0x5f49…aa8d | OUT | 0xf43c…d044 | $0.000.402185 RUSS | The Nietzschean Dog (RUSS) | |
| 0x3fb49609…07d3de | Transfer | 18,974,134 | 23 days agoSat, 25 Jul 2026 11:28:52 UTC | 0x5f49…aa8d | OUT | 0xf43c…d044 | $0.000.004062 RUSS | The Nietzschean Dog (RUSS) | |
| 0x3fb49609…07d3de | Transfer | 18,974,134 | 23 days agoSat, 25 Jul 2026 11:28:52 UTC | 0x5f49…aa8d | OUT | 0x9dfe…fa84 | 0.000000 WETH | WETH (WETH) | |
| 0x3fb49609…07d3de | Transfer | 18,974,134 | 23 days agoSat, 25 Jul 2026 11:28:52 UTC | 0x9dfe…fa84 | IN | 0x5f49…aa8d | $0.000.406247 RUSS | The Nietzschean Dog (RUSS) | |
| 0x93aca922…43b036 | Transfer | 18,974,125 | 23 days agoSat, 25 Jul 2026 11:28:51 UTC | 0xf43c…d044 | IN | 0x5f49…aa8d | 0.000000 WETH | WETH (WETH) |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 18,972,164 | 23 days agoSat, 25 Jul 2026 11:25:34 UTC | 0x414214…71f387 | CREATE | createProxyV3 | 0x82fb…aa0f | IN | 0x5f49…aa8d | 0 ETH |