// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
// ─── THE LIVE SEAM ─────────────────────────────────────────────────────────
// The real hand behind ISwapAdapter: exact-input native ETH into $TAPE across
// a Uniswap v4 pool, with a slippage floor and a hard refusal of partial
// fills (no wei may ever strand on this ownerless contract). Stateless beyond
// its immutable wiring; nothing here can rug.
// ───────────────────────────────────────────────────────────────────────────
import {ISwapAdapter} from "./ISwapAdapter.sol";
import {IPoolManager} from "v4-core/interfaces/IPoolManager.sol";
import {IUnlockCallback} from "v4-core/interfaces/callback/IUnlockCallback.sol";
import {PoolKey} from "v4-core/types/PoolKey.sol";
import {PoolId, PoolIdLibrary} from "v4-core/types/PoolId.sol";
import {Currency} from "v4-core/types/Currency.sol";
import {IHooks} from "v4-core/interfaces/IHooks.sol";
import {SwapParams} from "v4-core/types/PoolOperation.sol";
import {BalanceDelta, BalanceDeltaLibrary} from "v4-core/types/BalanceDelta.sol";
import {TickMath} from "v4-core/libraries/TickMath.sol";
import {FullMath} from "v4-core/libraries/FullMath.sol";
import {FixedPoint96} from "v4-core/libraries/FixedPoint96.sol";
interface IERC20A {
function transfer(address to, uint256 amount) external returns (bool);
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}
/// @title UniV4SwapAdapter — the live seam behind ISwapAdapter for the deck.
/// @notice Swaps exactly `msg.value` native ETH into $TAPE through a Uniswap v4
/// ETH/$TAPE pool (native currency0 = ETH, currency1 = $TAPE) and
/// forwards the $TAPE to the caller. ONLY the deck's tiny per-mint
/// auto-buy runs through here. The adapter is stateless beyond the
/// immutable pool wiring: no owner, no admin, nothing to rug. The
/// `minTapeOut` floor is enforced on the real settled output, and the
/// deck additionally re-checks the floor against the actual balance
/// delta it receives (defense in depth).
contract UniV4SwapAdapter is ISwapAdapter, IUnlockCallback {
using PoolIdLibrary for PoolKey;
using BalanceDeltaLibrary for BalanceDelta;
// v4 PoolManager storage layout: `pools` mapping lives at slot 6, and each
// pool's State struct begins with the packed Slot0 (sqrtPriceX96 in the low
// 160 bits). We read it via the MIT IExtsload seam rather than importing
// the BUSL-licensed StateLibrary — our own code, documented layout.
uint256 private constant POOLS_SLOT = 6;
IPoolManager public immutable MANAGER;
address public immutable TAPE;
PoolKey internal _key; // ETH(native)/TAPE pool key, fixed at deploy
bool internal immutable _tapeIsZero; // false: ETH is currency0 (always, since address(0) sorts first)
error NotManager();
error ZeroIn();
error Slippage();
error EthSendFailed();
/// @param manager the live v4 PoolManager on this chain.
/// @param tape_ the $TAPE token (currency1; native ETH is currency0).
/// @param fee pool fee tier in hundredths of a bip (e.g. 10000 = 1%).
/// @param tickSpacing pool tick spacing matching the fee tier.
/// @param hooks hook contract (address(0) for the hookless launch pool).
constructor(IPoolManager manager, address tape_, uint24 fee, int24 tickSpacing, address hooks) {
MANAGER = manager;
TAPE = tape_;
// address(0) (native ETH) always sorts below any token, so ETH is
// currency0 and $TAPE is currency1. Asserted for clarity.
require(tape_ != address(0), "tape zero");
_tapeIsZero = false;
_key = PoolKey({
currency0: Currency.wrap(address(0)),
currency1: Currency.wrap(tape_),
fee: fee,
tickSpacing: tickSpacing,
hooks: IHooks(hooks)
});
}
function tape() external view returns (address) {
return TAPE;
}
function poolKey() external view returns (PoolKey memory) {
return _key;
}
/// Advisory spot quote from slot0. NOT a slippage oracle within the same tx
/// it guards (see ISwapAdapter): it reflects the current — possibly already
/// manipulated — spot price. $TAPE (currency1) out per `ethIn` of currency0.
function quoteTapeOut(uint256 ethIn) external view returns (uint256) {
bytes32 stateSlot = keccak256(abi.encodePacked(PoolId.unwrap(_key.toId()), bytes32(POOLS_SLOT)));
uint160 sqrtPriceX96 = uint160(uint256(MANAGER.extsload(stateSlot))); // low 160 bits of Slot0
if (sqrtPriceX96 == 0) return 0; // uninitialized pool
// price1/0 = (sqrtP^2) / 2^192; compute in two Q96 steps to avoid overflow
uint256 half = FullMath.mulDiv(ethIn, sqrtPriceX96, FixedPoint96.Q96);
return FullMath.mulDiv(half, sqrtPriceX96, FixedPoint96.Q96);
}
/// Advisory spot quote for the sell side: ETH out per `tapeIn` of $TAPE.
/// Same caveats as quoteTapeOut - never a same-tx slippage oracle.
function quoteEthOut(uint256 tapeIn) external view returns (uint256) {
bytes32 stateSlot = keccak256(abi.encodePacked(PoolId.unwrap(_key.toId()), bytes32(POOLS_SLOT)));
uint160 sqrtPriceX96 = uint160(uint256(MANAGER.extsload(stateSlot)));
if (sqrtPriceX96 == 0) return 0;
// price0/1 = 2^192 / sqrtP^2; two Q96 steps, division last
uint256 half = FullMath.mulDiv(tapeIn, FixedPoint96.Q96, sqrtPriceX96);
return FullMath.mulDiv(half, FixedPoint96.Q96, sqrtPriceX96);
}
/// Swap exactly msg.value ETH -> $TAPE, send to `to`, revert under the floor.
function buyTape(uint256 minTapeOut, address to) external payable returns (uint256 tapeOut) {
if (msg.value == 0) revert ZeroIn();
bytes memory res = MANAGER.unlock(abi.encode(uint8(0), msg.value, minTapeOut, to));
tapeOut = abi.decode(res, (uint256));
}
/// Swap exactly `tapeIn` $TAPE -> native ETH, send to `to`, revert under
/// the floor. Caller approves this adapter for `tapeIn` first; the tokens
/// are pulled with transferFrom and every wei of output leaves in the same
/// transaction - the adapter holds nothing between calls.
function sellTape(uint256 tapeIn, uint256 minEthOut, address to) external returns (uint256 ethOut) {
if (tapeIn == 0) revert ZeroIn();
if (!IERC20A(TAPE).transferFrom(msg.sender, address(this), tapeIn)) revert Slippage();
bytes memory res = MANAGER.unlock(abi.encode(uint8(1), tapeIn, minEthOut, to));
ethOut = abi.decode(res, (uint256));
}
/// v4 flash-accounting callback: perform the swap, settle what we owe,
/// take what we are owed, straight to the recipient. Manager-only.
function unlockCallback(bytes calldata data) external returns (bytes memory) {
if (msg.sender != address(MANAGER)) revert NotManager();
(uint8 op, uint256 amtIn, uint256 minOut, address to) =
abi.decode(data, (uint8, uint256, uint256, address));
BalanceDelta delta = MANAGER.swap(
_key,
SwapParams({
zeroForOne: op == 0, // 0: ETH -> $TAPE, 1: $TAPE -> ETH
amountSpecified: -int256(amtIn), // negative = EXACT INPUT
sqrtPriceLimitX96: op == 0 ? TickMath.MIN_SQRT_PRICE + 1 : TickMath.MAX_SQRT_PRICE - 1
}),
""
);
int128 a0 = delta.amount0();
int128 a1 = delta.amount1();
uint256 owed = op == 0 ? uint256(uint128(-a0)) : uint256(uint128(-a1));
uint256 out = op == 0 ? uint256(uint128(a1)) : uint256(uint128(a0));
// A partial fill (exact-input ran out of pool liquidity before the
// price limit) would strand input on this ownerless adapter forever.
// Refuse it outright; callers see a clean revert and keep their funds.
if (owed != amtIn) revert Slippage();
if (out < minOut) revert Slippage();
if (op == 0) {
// pay native ETH into the pool, take $TAPE out to the recipient
MANAGER.settle{value: owed}();
MANAGER.take(Currency.wrap(TAPE), to, out);
} else {
// pay $TAPE into the pool, take native ETH out to the recipient
MANAGER.sync(Currency.wrap(TAPE));
if (!IERC20A(TAPE).transfer(address(MANAGER), owed)) revert Slippage();
MANAGER.settle();
MANAGER.take(Currency.wrap(address(0)), to, out);
}
return abi.encode(out);
}
/// Only ever holds ETH transiently inside a swap; accept refunds from the
/// manager (e.g. a settle over-pay is returned as native value).
receive() external payable {}
}[
{
"type": "constructor",
"inputs": [
{
"name": "manager",
"type": "address",
"internalType": "contract IPoolManager"
},
{
"name": "tape_",
"type": "address",
"internalType": "address"
},
{
"name": "fee",
"type": "uint24",
"internalType": "uint24"
},
{
"name": "tickSpacing",
"type": "int24",
"internalType": "int24"
},
{
"name": "hooks",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"name": "EthSendFailed",
"type": "error",
"inputs": []
},
{
"name": "NotManager",
"type": "error",
"inputs": []
},
{
"name": "Slippage",
"type": "error",
"inputs": []
},
{
"name": "ZeroIn",
"type": "error",
"inputs": []
},
{
"name": "MANAGER",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IPoolManager"
}
],
"stateMutability": "view"
},
{
"name": "TAPE",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "buyTape",
"type": "function",
"inputs": [
{
"name": "minTapeOut",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "to",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "tapeOut",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "payable"
},
{
"name": "poolKey",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "tuple",
"components": [
{
"name": "currency0",
"type": "address",
"internalType": "Currency"
},
{
"name": "currency1",
"type": "address",
"internalType": "Currency"
},
{
"name": "fee",
"type": "uint24",
"internalType": "uint24"
},
{
"name": "tickSpacing",
"type": "int24",
"internalType": "int24"
},
{
"name": "hooks",
"type": "address",
"internalType": "contract IHooks"
}
],
"internalType": "struct PoolKey"
}
],
"stateMutability": "view"
},
{
"name": "quoteEthOut",
"type": "function",
"inputs": [
{
"name": "tapeIn",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "quoteTapeOut",
"type": "function",
"inputs": [
{
"name": "ethIn",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "sellTape",
"type": "function",
"inputs": [
{
"name": "tapeIn",
"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"
},
{
"name": "tape",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "unlockCallback",
"type": "function",
"inputs": [
{
"name": "data",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [
{
"name": "",
"type": "bytes",
"internalType": "bytes"
}
],
"stateMutability": "nonpayable"
},
{
"type": "receive",
"stateMutability": "payable"
}
]0x60e0346101c657601f61106138819003918201601f1916830192916001600160401b0391828511848610176101cb578160a092859260409788528339810103126101c65781516001600160a01b039290919083831683036101c657610066602082016101e1565b93858201519262ffffff8416958685036101c6576060840151938460020b918286036101c65761009960808693016101e1565b976080528060a05216928315610196576000968760c052169688519260a08401908482109082111761018257918893916080938b528883528560208401528a8301526060820152015260018060a01b0319938481541690556001549160b81b62ffffff60b81b169262ffffff60a01b9060a01b169160018060d01b031916171717600155600254161760025551610e6b90816101f682396080518181816101050152818161021a0152818161081b015281816108e401528181610bd10152610ceb015260a0518181816103cd015281816104a90152818161079601526109ac015260c051815050f35b634e487b7160e01b88526041600452602488fd5b885162461bcd60e51b815260206004820152600960248201526874617065207a65726f60b81b6044820152606490fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b03821682036101c65756fe60406080815260049081361015610020575b5050361561001e57600080fd5b005b600091823560e01c80630919f84614610996578063182148ef146109135780631b2df850146108cf5780632fc05c9f1461073a57806350e7ea971461073557806354bc4eab1461071557806391dd7346146101c2578063c5980bf4146101985763c710efb9146100905750610011565b81600319360112610194576001600160a01b0360243581811692908390036101515734156101865791849161010193855192600060208501523487850152813560608501526080840152608083526100e783610a2a565b8386518096819582946348c8949160e01b845283016109fe565b03927f0000000000000000000000000000000000000000000000000000000000000000165af192831561017b578093610156575b5050602082805181010312610151576020809201519051908152f35b600080fd5b6101739293503d8091833e61016b8183610a8c565b810190610b13565b903880610135565b8251903d90823e3d90fd5b8351635c13dc6d60e01b8152fd5b8280fd5b5091346101bf5760203660031901126101bf57506101b860209235610c99565b9051908152f35b80fd5b50903461019457602092836003193601126101bf5782359267ffffffffffffffff9485851161019457366023860112156101945784820135928684116101bf5760249386013685820111610711576001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811691338390036107015788608091031261019457858801359060ff821680920361046c576044890135986084810135928284168094036106fd5715600160ff1b8b146106eb5780156106d0576401000276a4915b8a5192606084018e8111858210176106be578c528284528c8803898501908152908516848d019081528c51633cf3645360e21b8152895487168c8201526001548088168e83015260a081901c62ffffff16604483015260b81c600290810b606483015254871660848201529451151560a4860152905160c485015251841660e484015261012061010484015261012483018790528783610144818a8a5af19283156106b4578793610681575b506fffffffffffffffffffffffffffffffff8360801d938360001461066d578161036386610c62565b16945b84156106645750169b5b830361065457606401358b106106445787918791156104a3578a51630476982d60e21b81529283918290885af1801561049957908691610470575b5050823b1561046c579060648492838a519586948593630b0d9c0960e01b85527f0000000000000000000000000000000000000000000000000000000000000000168b8501528b8401528c60448401525af180156104625761044e575b50505b835194818601528452828401948486109086111761043b575050829052603f199061043681846109fe565b030190f35b604190634e487b7160e01b600052526000fd5b6104588291610a5c565b6101bf5780610408565b86513d84823e3d90fd5b8380fd5b813d8311610492575b6104838183610a8c565b810103126101515784386103ab565b503d610479565b89513d87823e3d90fd5b929150507f00000000000000000000000000000000000000000000000000000000000000001690833b15610640578851632961046560e21b815287810183905285818a8183895af1801561063657908793929161061c575b509060448693928b51948593849263a9059cbb60e01b8452898d8501528d8401525af19081156105d55784916105ef575b50156105df578651630476982d60e21b81528481878187875af180156105d5579085916105ac575b5050813b156101945782916064839289519485938492630b0d9c0960e01b845260008b8501528b8401528c60448401525af1801561046257610598575b505061040b565b6105a28291610a5c565b6101bf5780610591565b813d83116105ce575b6105bf8183610a8c565b81010312610151578338610554565b503d6105b5565b88513d86823e3d90fd5b86516307dd37f760e41b81528590fd5b61060f9150853d8711610615575b6106078183610a8c565b810190610afb565b3861052c565b503d6105fd565b9561062c60449794939294610a5c565b95929091926104fb565b8a513d88823e3d90fd5b8480fd5b89516307dd37f760e41b81528890fd5b8a516307dd37f760e41b81528990fd5b9050169b610370565b8161067a82600f0b610c62565b1694610366565b9092508781813d83116106ad575b6106998183610a8c565b810103126106a95751913861033a565b8680fd5b503d61068f565b8b513d89823e3d90fd5b634e487b7160e01b895260418b528b89fd5b73fffd8963efd1fc6a506488495d951d5263988d259161028e565b634e487b7160e01b8652601188528886fd5b8580fd5b875163607e454560e11b81528690fd5b5080fd5b5091346101bf5760203660031901126101bf57506101b860209235610b7f565b610996565b5091346101bf5760603660031901126101bf576044356001600160a01b038181169480359286900361046c5782156108c15784516323b872dd60e01b8152338282015230602482015260448101849052602096908781606481897f000000000000000000000000000000000000000000000000000000000000000089165af19081156108b757869161089a575b501561088b5791849391610817959387519360018a8601528885015260243560608501526080840152608083526107fd83610a2a565b8387518097819582946348c8949160e01b845283016109fe565b03927f0000000000000000000000000000000000000000000000000000000000000000165af191821561087f578192610863575b5083828051810103126101bf57508201519051908152f35b6108789192503d8084833e61016b8183610a8c565b903861084b565b508251903d90823e3d90fd5b5084516307dd37f760e41b8152fd5b6108b19150883d8a11610615576106078183610a8c565b386107c7565b87513d88823e3d90fd5b8451635c13dc6d60e01b8152fd5b505034610711578160031936011261071157517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50503461071157816003193601126107115760a0916080825161093581610a2a565b82815282602082015282848201528260608201520152610953610aae565b906080815192600180861b039283825116855283602083015116602086015262ffffff818301511690850152606081015160020b60608501520151166080820152f35b34610151576000366003190112610151576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b60005b8381106109ee5750506000910152565b81810151838201526020016109de565b60409160208252610a1e81518092816020860152602086860191016109db565b601f01601f1916010190565b60a0810190811067ffffffffffffffff821117610a4657604052565b634e487b7160e01b600052604160045260246000fd5b67ffffffffffffffff8111610a4657604052565b6060810190811067ffffffffffffffff821117610a4657604052565b90601f8019910116810190811067ffffffffffffffff821117610a4657604052565b60405190610abb82610a2a565b6000546001600160a01b039081168352600154808216602085015260a081901c62ffffff16604085015260b81c600290810b606085015254166080830152565b90816020910312610151575180151581036101515790565b60208183031261015157805167ffffffffffffffff9182821161015157019082601f83011215610151578151908111610a465760405192610b5e601f8301601f191660200185610a8c565b8184526020828401011161015157610b7c91602080850191016109db565b90565b60a0610b89610aae565b20604051602081019182526006604082015260408152610ba881610a70565b519020604051631e2eaeaf60e01b815260048101919091526001600160a01b03906020816024817f000000000000000000000000000000000000000000000000000000000000000086165afa908115610c5657600091610c24575b50168015610c1d57610c1881610b7c93610d69565b610d69565b5050600090565b90506020813d602011610c4e575b81610c3f60209383610a8c565b81010312610151575138610c03565b3d9150610c32565b6040513d6000823e3d90fd5b600f0b6f7fffffffffffffffffffffffffffffff198114610c835760000390565b634e487b7160e01b600052601160045260246000fd5b60a0610ca3610aae565b20604051602081019182526006604082015260408152610cc281610a70565b519020604051631e2eaeaf60e01b815260048101919091526001600160a01b03906020816024817f000000000000000000000000000000000000000000000000000000000000000086165afa908115610c5657600091610d37575b50168015610c1d57610d3281610b7c93610dee565b610dee565b90506020813d602011610d61575b81610d5260209383610a8c565b81010312610151575138610d1d565b3d9150610d45565b90606082901b90600160601b600019818509938380861095039480860395868511156101515714610de6579082910981806000031680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b505091500490565b8181029190600019828209918380841093039183830393600160601b93858511156101515714610e2b570990828211900360a01b910360601c1790565b5050505060601c9056fea26469706673582212206dec63f93f59b4ee595c0bda1c51f559746b662541c4851e785252b365d922a164736f6c634300081800330000000000000000000000008366a39cc670b4001a1121b8f6a443a643e40951000000000000000000000000f2115ece77c82b94f6f5c9561367737d4e8bb350000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000000000000000000000c80000000000000000000000000000000000000000000000000000000000000000
0x60406080815260049081361015610020575b5050361561001e57600080fd5b005b600091823560e01c80630919f84614610996578063182148ef146109135780631b2df850146108cf5780632fc05c9f1461073a57806350e7ea971461073557806354bc4eab1461071557806391dd7346146101c2578063c5980bf4146101985763c710efb9146100905750610011565b81600319360112610194576001600160a01b0360243581811692908390036101515734156101865791849161010193855192600060208501523487850152813560608501526080840152608083526100e783610a2a565b8386518096819582946348c8949160e01b845283016109fe565b03927f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e40951165af192831561017b578093610156575b5050602082805181010312610151576020809201519051908152f35b600080fd5b6101739293503d8091833e61016b8183610a8c565b810190610b13565b903880610135565b8251903d90823e3d90fd5b8351635c13dc6d60e01b8152fd5b8280fd5b5091346101bf5760203660031901126101bf57506101b860209235610c99565b9051908152f35b80fd5b50903461019457602092836003193601126101bf5782359267ffffffffffffffff9485851161019457366023860112156101945784820135928684116101bf5760249386013685820111610711576001600160a01b037f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e40951811691338390036107015788608091031261019457858801359060ff821680920361046c576044890135986084810135928284168094036106fd5715600160ff1b8b146106eb5780156106d0576401000276a4915b8a5192606084018e8111858210176106be578c528284528c8803898501908152908516848d019081528c51633cf3645360e21b8152895487168c8201526001548088168e83015260a081901c62ffffff16604483015260b81c600290810b606483015254871660848201529451151560a4860152905160c485015251841660e484015261012061010484015261012483018790528783610144818a8a5af19283156106b4578793610681575b506fffffffffffffffffffffffffffffffff8360801d938360001461066d578161036386610c62565b16945b84156106645750169b5b830361065457606401358b106106445787918791156104a3578a51630476982d60e21b81529283918290885af1801561049957908691610470575b5050823b1561046c579060648492838a519586948593630b0d9c0960e01b85527f000000000000000000000000f2115ece77c82b94f6f5c9561367737d4e8bb350168b8501528b8401528c60448401525af180156104625761044e575b50505b835194818601528452828401948486109086111761043b575050829052603f199061043681846109fe565b030190f35b604190634e487b7160e01b600052526000fd5b6104588291610a5c565b6101bf5780610408565b86513d84823e3d90fd5b8380fd5b813d8311610492575b6104838183610a8c565b810103126101515784386103ab565b503d610479565b89513d87823e3d90fd5b929150507f000000000000000000000000f2115ece77c82b94f6f5c9561367737d4e8bb3501690833b15610640578851632961046560e21b815287810183905285818a8183895af1801561063657908793929161061c575b509060448693928b51948593849263a9059cbb60e01b8452898d8501528d8401525af19081156105d55784916105ef575b50156105df578651630476982d60e21b81528481878187875af180156105d5579085916105ac575b5050813b156101945782916064839289519485938492630b0d9c0960e01b845260008b8501528b8401528c60448401525af1801561046257610598575b505061040b565b6105a28291610a5c565b6101bf5780610591565b813d83116105ce575b6105bf8183610a8c565b81010312610151578338610554565b503d6105b5565b88513d86823e3d90fd5b86516307dd37f760e41b81528590fd5b61060f9150853d8711610615575b6106078183610a8c565b810190610afb565b3861052c565b503d6105fd565b9561062c60449794939294610a5c565b95929091926104fb565b8a513d88823e3d90fd5b8480fd5b89516307dd37f760e41b81528890fd5b8a516307dd37f760e41b81528990fd5b9050169b610370565b8161067a82600f0b610c62565b1694610366565b9092508781813d83116106ad575b6106998183610a8c565b810103126106a95751913861033a565b8680fd5b503d61068f565b8b513d89823e3d90fd5b634e487b7160e01b895260418b528b89fd5b73fffd8963efd1fc6a506488495d951d5263988d259161028e565b634e487b7160e01b8652601188528886fd5b8580fd5b875163607e454560e11b81528690fd5b5080fd5b5091346101bf5760203660031901126101bf57506101b860209235610b7f565b610996565b5091346101bf5760603660031901126101bf576044356001600160a01b038181169480359286900361046c5782156108c15784516323b872dd60e01b8152338282015230602482015260448101849052602096908781606481897f000000000000000000000000f2115ece77c82b94f6f5c9561367737d4e8bb35089165af19081156108b757869161089a575b501561088b5791849391610817959387519360018a8601528885015260243560608501526080840152608083526107fd83610a2a565b8387518097819582946348c8949160e01b845283016109fe565b03927f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e40951165af191821561087f578192610863575b5083828051810103126101bf57508201519051908152f35b6108789192503d8084833e61016b8183610a8c565b903861084b565b508251903d90823e3d90fd5b5084516307dd37f760e41b8152fd5b6108b19150883d8a11610615576106078183610a8c565b386107c7565b87513d88823e3d90fd5b8451635c13dc6d60e01b8152fd5b505034610711578160031936011261071157517f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409516001600160a01b03168152602090f35b50503461071157816003193601126107115760a0916080825161093581610a2a565b82815282602082015282848201528260608201520152610953610aae565b906080815192600180861b039283825116855283602083015116602086015262ffffff818301511690850152606081015160020b60608501520151166080820152f35b34610151576000366003190112610151576040517f000000000000000000000000f2115ece77c82b94f6f5c9561367737d4e8bb3506001600160a01b03168152602090f35b60005b8381106109ee5750506000910152565b81810151838201526020016109de565b60409160208252610a1e81518092816020860152602086860191016109db565b601f01601f1916010190565b60a0810190811067ffffffffffffffff821117610a4657604052565b634e487b7160e01b600052604160045260246000fd5b67ffffffffffffffff8111610a4657604052565b6060810190811067ffffffffffffffff821117610a4657604052565b90601f8019910116810190811067ffffffffffffffff821117610a4657604052565b60405190610abb82610a2a565b6000546001600160a01b039081168352600154808216602085015260a081901c62ffffff16604085015260b81c600290810b606085015254166080830152565b90816020910312610151575180151581036101515790565b60208183031261015157805167ffffffffffffffff9182821161015157019082601f83011215610151578151908111610a465760405192610b5e601f8301601f191660200185610a8c565b8184526020828401011161015157610b7c91602080850191016109db565b90565b60a0610b89610aae565b20604051602081019182526006604082015260408152610ba881610a70565b519020604051631e2eaeaf60e01b815260048101919091526001600160a01b03906020816024817f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095186165afa908115610c5657600091610c24575b50168015610c1d57610c1881610b7c93610d69565b610d69565b5050600090565b90506020813d602011610c4e575b81610c3f60209383610a8c565b81010312610151575138610c03565b3d9150610c32565b6040513d6000823e3d90fd5b600f0b6f7fffffffffffffffffffffffffffffff198114610c835760000390565b634e487b7160e01b600052601160045260246000fd5b60a0610ca3610aae565b20604051602081019182526006604082015260408152610cc281610a70565b519020604051631e2eaeaf60e01b815260048101919091526001600160a01b03906020816024817f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095186165afa908115610c5657600091610d37575b50168015610c1d57610d3281610b7c93610dee565b610dee565b90506020813d602011610d61575b81610d5260209383610a8c565b81010312610151575138610d1d565b3d9150610d45565b90606082901b90600160601b600019818509938380861095039480860395868511156101515714610de6579082910981806000031680920460028082600302188083028203028083028203028083028203028083028203028083028203028092029003029360018380600003040190848311900302920304170290565b505091500490565b8181029190600019828209918380841093039183830393600160601b93858511156101515714610e2b570990828211900360a01b910360601c1790565b5050505060601c9056fea26469706673582212206dec63f93f59b4ee595c0bda1c51f559746b662541c4851e785252b365d922a164736f6c63430008180033
| 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 |
|---|---|---|---|
| no event logs emitted by this address | |||
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x29c50d26…eac3de | Transfer | 38,771,259 | 19 hrs agoMon, 17 Aug 2026 10:39:07 UTC | 0x147d…4ace | OUT | 0x8366…0951 | 802.774920 TAPE | MARKET ARCANA TAPE (TAPE) | |
| 0x29c50d26…eac3de | Transfer | 38,771,259 | 19 hrs agoMon, 17 Aug 2026 10:39:07 UTC | 0xd238…346f | IN | 0x147d…4ace | 802.774920 TAPE | MARKET ARCANA TAPE (TAPE) | |
| 0x69850623…505a3c | Transfer | 38,758,112 | 19 hrs agoMon, 17 Aug 2026 10:17:08 UTC | 0x147d…4ace | OUT | 0x8366…0951 | 218.931734 TAPE | MARKET ARCANA TAPE (TAPE) | |
| 0x69850623…505a3c | Transfer | 38,758,112 | 19 hrs agoMon, 17 Aug 2026 10:17:08 UTC | 0xb9b0…f25e | IN | 0x147d…4ace | 218.931734 TAPE | MARKET ARCANA TAPE (TAPE) | |
| 0xd80a42ba…01bccd | Transfer | 38,756,880 | 19 hrs agoMon, 17 Aug 2026 10:15:04 UTC | 0x147d…4ace | OUT | 0x8366…0951 | 1,289.282886 TAPE | MARKET ARCANA TAPE (TAPE) | |
| 0xd80a42ba…01bccd | Transfer | 38,756,880 | 19 hrs agoMon, 17 Aug 2026 10:15:04 UTC | 0xb9b0…f25e | IN | 0x147d…4ace | 1,289.282886 TAPE | MARKET ARCANA TAPE (TAPE) | |
| 0x2ab26e0a…cb6468 | Transfer | 38,754,178 | 19 hrs agoMon, 17 Aug 2026 10:10:33 UTC | 0x147d…4ace | OUT | 0x8366…0951 | 218.940677 TAPE | MARKET ARCANA TAPE (TAPE) | |
| 0x2ab26e0a…cb6468 | Transfer | 38,754,178 | 19 hrs agoMon, 17 Aug 2026 10:10:33 UTC | 0xf649…fc27 | IN | 0x147d…4ace | 218.940677 TAPE | MARKET ARCANA TAPE (TAPE) | |
| 0xba0b763e…855861 | Transfer | 38,750,763 | 19 hrs agoMon, 17 Aug 2026 10:04:49 UTC | 0x147d…4ace | OUT | 0x8366…0951 | 656.834669 TAPE | MARKET ARCANA TAPE (TAPE) | |
| 0xba0b763e…855861 | Transfer | 38,750,763 | 19 hrs agoMon, 17 Aug 2026 10:04:49 UTC | 0xcbb5…bbcd | IN | 0x147d…4ace | 656.834669 TAPE | MARKET ARCANA TAPE (TAPE) | |
| 0xab6cad9c…d741ea | Transfer | 38,749,902 | 19 hrs agoMon, 17 Aug 2026 10:03:23 UTC | 0x147d…4ace | OUT | 0x8366…0951 | 218.940907 TAPE | MARKET ARCANA TAPE (TAPE) | |
| 0xab6cad9c…d741ea | Transfer | 38,749,902 | 19 hrs agoMon, 17 Aug 2026 10:03:23 UTC | 0x0649…3c5b | IN | 0x147d…4ace | 218.940907 TAPE | MARKET ARCANA TAPE (TAPE) |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x99742a…b2476c | buyTape | 38,781,018 | 18 hrs agoMon, 17 Aug 2026 10:55:27 UTC | 0x3d75…04bb | IN | UniV4SwapAdapter | $2.840.0015 ETH | 0.00000226 | |
| 0x29c50d…eac3de | sellTape | 38,771,259 | 19 hrs agoMon, 17 Aug 2026 10:39:07 UTC | 0xd238…346f | IN | UniV4SwapAdapter | $0.000 ETH | 0.00000210 | |
| 0xf5b2c4…67cd6e | buyTape | 38,766,740 | 19 hrs agoMon, 17 Aug 2026 10:31:33 UTC | 0xc88a…4a73 | IN | UniV4SwapAdapter | $94.630.05 ETH | 0.00000228 | |
| 0xaeffd5…dfb206 | buyTape | 38,765,866 | 19 hrs agoMon, 17 Aug 2026 10:30:06 UTC | 0x844f…18c2 | IN | UniV4SwapAdapter | $0.190.0001 ETH | 0.00000227 | |
| 0x698506…505a3c | sellTape | 38,758,112 | 19 hrs agoMon, 17 Aug 2026 10:17:08 UTC | 0xb9b0…f25e | IN | UniV4SwapAdapter | $0.000 ETH | 0.00000216 | |
| 0xd80a42…01bccd | sellTape | 38,756,880 | 19 hrs agoMon, 17 Aug 2026 10:15:04 UTC | 0xb9b0…f25e | IN | UniV4SwapAdapter | $0.000 ETH | 0.00000215 | |
| 0x807f71…12338e | buyTape | 38,755,624 | 19 hrs agoMon, 17 Aug 2026 10:12:57 UTC | 0xb9b0…f25e | IN | UniV4SwapAdapter | $2.080.0011 ETH | 0.00000228 | |
| 0x2ab26e…cb6468 | sellTape | 38,754,178 | 19 hrs agoMon, 17 Aug 2026 10:10:33 UTC | 0xf649…fc27 | IN | UniV4SwapAdapter | $0.000 ETH | 0.00000209 | |
| 0xba0b76…855861 | sellTape | 38,750,763 | 19 hrs agoMon, 17 Aug 2026 10:04:49 UTC | 0xcbb5…bbcd | IN | UniV4SwapAdapter | $0.000 ETH | 0.00000215 | |
| 0xab6cad…d741ea | sellTape | 38,749,902 | 19 hrs agoMon, 17 Aug 2026 10:03:23 UTC | 0x0649…3c5b | IN | UniV4SwapAdapter | $0.000 ETH | 0.00000210 | |
| 0x02d9cf…a1a764 | buyTape | 38,748,509 | 19 hrs agoMon, 17 Aug 2026 10:01:03 UTC | 0xaca1…30fd | IN | UniV4SwapAdapter | $0.190.0001 ETH | 0.00000192 | |
| 0xcbed7b…9ad620 | buyTape | 38,748,074 | 19 hrs agoMon, 17 Aug 2026 10:00:19 UTC | 0xd238…346f | IN | UniV4SwapAdapter | $1.140.0006 ETH | 0.00000227 | |
| !0xb383fb…628155 | sellTape | 36,213,034 | 3 days agoFri, 14 Aug 2026 11:22:08 UTC | 0x9c28…a85b | IN | UniV4SwapAdapter | $0.000 ETH | 0.00000583 |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 37,859,048 | 1 day agoSun, 16 Aug 2026 09:13:08 UTC | 0x7e31d8…7553ae | CALL | fulfill | 0x147d…4ace | OUT | 0x8366…0951 | 0.0003 ETH |
| 37,859,048 | 1 day agoSun, 16 Aug 2026 09:13:08 UTC | 0x7e31d8…7553ae | CALL | fulfill | 0x7748…642b | IN | 0x147d…4ace | 0.0003 ETH |
| 37,854,510 | 1 day agoSun, 16 Aug 2026 09:05:32 UTC | 0xf3c001…bdcc1d | CALL | Mint | 0x147d…4ace | OUT | 0x8366…0951 | 0.0003 ETH |
| 37,854,510 | 1 day agoSun, 16 Aug 2026 09:05:32 UTC | 0xf3c001…bdcc1d | CALL | Mint | 0x7748…642b | IN | 0x147d…4ace | 0.0003 ETH |
| 36,580,569 | 3 days agoFri, 14 Aug 2026 21:35:50 UTC | 0x43491d…259472 | CALL | Mint | 0x147d…4ace | OUT | 0x8366…0951 | 0.0003 ETH |
| 36,580,569 | 3 days agoFri, 14 Aug 2026 21:35:50 UTC | 0x43491d…259472 | CALL | Mint | 0x7748…642b | IN | 0x147d…4ace | 0.0003 ETH |
| 36,184,300 | 3 days agoFri, 14 Aug 2026 10:34:06 UTC | 0xb155d6…940272 | CALL | fulfill | 0x147d…4ace | OUT | 0x8366…0951 | 0.0003 ETH |
| 36,184,300 | 3 days agoFri, 14 Aug 2026 10:34:06 UTC | 0xb155d6…940272 | CALL | fulfill | 0x7748…642b | IN | 0x147d…4ace | 0.0003 ETH |