// SPDX-License-Identifier: BUSL-1.1
// Copyright (c) 2026 Quiver (quiver-app.io)
// Licensed under the Business Source License 1.1, see LICENSE.
// Production use and forks are not permitted without a written grant
// from Quiver.
pragma solidity 0.8.26;
interface IQuiverGateMinimal {
function isApproved(address buyer) external view returns (bool);
}
interface IUniswapV3FactoryGetPool {
function getPool(
address tokenA,
address tokenB,
uint24 fee
) external view returns (address);
}
/// @title QuiverToken
/// @notice Fixed-supply ERC-20, deployed once per Quiver launch. No owner,
/// no minting, no burning. The whole supply goes to the deployer (the
/// QuiverLauncher) in the constructor.
///
/// Metadata lives on-chain: name/symbol/imageURI are set in the constructor
/// and contractURI() exposes them as ERC-7572 contract-level metadata (a
/// data-URI JSON), so explorers and tooling can pick up the token image
/// without any off-chain registry.
///
/// Launch guard - two OPT-IN, ONE-WAY toggles, both fixed at launch and only
/// ever switchable OFF (never back on) by the creator:
///
/// - gated: buys (transfers out of the main launch pool) require the
/// recipient to be approved by the QuiverGate for the current
/// transaction (an API-signed per-wallet voucher). Sells and
/// wallet-to-wallet transfers are NEVER blocked - gating can
/// never trap a holder. endGating() opens public trading
/// forever (the "end bonding" moment).
/// - exclusive: transfers to any OTHER Uniswap v3 pool of this token
/// revert (a pool that cannot receive tokens can never hold
/// liquidity), so the main launch pool captures all volume
/// and its fee tier can't be undercut by a rival pool. This
/// is POOL exclusivity, not position exclusivity: anyone can
/// still LP inside the main pool and share its fees (v3
/// pools are permissionless). disableExclusivity() lifts
/// this forever.
///
/// A public launch deploys with both flags false and behaves exactly like a
/// plain ERC-20: the guard short-circuits on a single storage read. All
/// guard config lives in STORAGE (not immutables) so every launch - public
/// or guarded - shares one canonical runtime bytecode, which is what the
/// Quiver API exact-matches before listing a pool.
contract QuiverToken {
string public name;
string public symbol;
uint8 public constant decimals = 18;
uint256 public immutable totalSupply;
/// @notice Token image URI (any scheme: https, ipfs, ...). Fixed at
/// deployment; consumers decide which sources they trust.
string public imageURI;
mapping(address => uint256) public balanceOf;
mapping(address => mapping(address => uint256)) public allowance;
// ------------------------------------------------------------------
// Launch guard state. `pool`/`gated`/`exclusive` pack into ONE slot,
// so the unguarded hot path costs a single extra sload.
// ------------------------------------------------------------------
/// @notice The main launch pool (token/WETH at the launch's fee tier),
/// set once by the launcher right after pool creation. address(0) on
/// public launches (the guard never needs it there).
address public pool;
/// @notice Buys-only gate toggle. One-way: endGating() only.
bool public gated;
/// @notice Rival-v3-pool block toggle. One-way: disableExclusivity() only.
bool public exclusive;
/// @notice The deployer (QuiverLauncher); only authority is setPool once.
address public launcher;
/// @notice The launch creator; can only ever LOOSEN the guard.
address public creator;
/// @notice The QuiverGate consulted for buy approval while gated.
address public gate;
/// @notice Canonical Uniswap v3 factory, used to identify rival pools.
address public factory;
/// @notice Addresses exempt from the buy gate as recipients. Set at
/// launch to infrastructure that legitimately receives tokens FROM the
/// pool while gated: the PermaLock (fee collection routes token-side
/// fees pool -> PermaLock), the QuoterV2 (buy quotes simulate a
/// pool -> quoter transfer via eth_call; a real transfer there only
/// strands the tokens, so this is not a bypass), and - when the launch
/// carried an atomic first buy - the QuiverLauncher (the first-buy swap
/// lands there before being forwarded to the creator; any later
/// transfer there only strands tokens too).
mapping(address => bool) public guardExempt;
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
/// @notice The one-way "end bonding" moment: public trading is open forever.
event GatingEnded();
/// @notice One-way: other v3 pools of this token may exist from now on.
event ExclusivityDisabled();
error OnlyLauncher();
error OnlyCreator();
error PoolAlreadySet();
error GuardConfigInvalid();
error BuyNotApproved();
error RivalPoolBlocked();
error TransferToZeroAddress();
/// @notice Guard configuration, fixed at deployment (an all-zero config
/// is a public launch). Grouped into a struct to keep the constructor's
/// stack shallow.
struct GuardConfig {
bool gated;
bool exclusive;
/// The QuiverGate; required iff gated.
address gate;
/// The launch creator (endGating/disableExclusivity authority);
/// required iff any toggle is on.
address creator;
/// The canonical Uniswap v3 factory; required iff exclusive.
address factory;
/// Recipients exempt from the buy gate (launch infrastructure).
address[] exempt;
}
constructor(
string memory name_,
string memory symbol_,
uint256 totalSupply_,
string memory imageURI_,
GuardConfig memory guard_
) {
name = name_;
symbol = symbol_;
totalSupply = totalSupply_;
imageURI = imageURI_;
// Guard wiring, written only when a toggle is on (public launches
// pay no storage for config they don't use).
if (guard_.gated && guard_.gate == address(0))
revert GuardConfigInvalid();
if (guard_.exclusive && guard_.factory == address(0))
revert GuardConfigInvalid();
if ((guard_.gated || guard_.exclusive) && guard_.creator == address(0))
revert GuardConfigInvalid();
if (guard_.gated || guard_.exclusive) {
launcher = msg.sender;
creator = guard_.creator;
gated = guard_.gated;
exclusive = guard_.exclusive;
if (guard_.gated) {
gate = guard_.gate;
for (uint256 i = 0; i < guard_.exempt.length; i++) {
guardExempt[guard_.exempt[i]] = true;
}
}
if (guard_.exclusive) factory = guard_.factory;
}
balanceOf[msg.sender] = totalSupply_;
emit Transfer(address(0), msg.sender, totalSupply_);
}
// ========================================================================
// Launch guard
// ========================================================================
/// @notice Launcher-only, once: records the main launch pool so the
/// guard can tell buys/sells apart. Called between pool creation and
/// the LP mint inside the atomic launch transaction.
function setPool(address pool_) external {
if (msg.sender != launcher) revert OnlyLauncher();
if (pool != address(0)) revert PoolAlreadySet();
if (pool_ == address(0)) revert GuardConfigInvalid();
pool = pool_;
}
/// @notice Creator-only, one-way: opens public trading forever. There
/// is no way to re-enable gating.
function endGating() external {
if (msg.sender != creator) revert OnlyCreator();
if (!gated) revert GuardConfigInvalid();
gated = false;
emit GatingEnded();
}
/// @notice Creator-only, one-way: allows other v3 pools of this token
/// forever. There is no way to re-enable exclusivity.
function disableExclusivity() external {
if (msg.sender != creator) revert OnlyCreator();
if (!exclusive) revert GuardConfigInvalid();
exclusive = false;
emit ExclusivityDisabled();
}
/// @dev The transfer guard. Rules, in order:
/// 1. both toggles off (every public launch, and every guarded launch
/// after the creator ends both) -> plain ERC-20, one sload;
/// 2. transfers TO the main pool (sells, the launch LP mint) always
/// pass - no configuration can ever block an exit;
/// 3. while gated, transfers FROM the pool (buys) require the
/// recipient to be gate-approved for this transaction, unless the
/// recipient is launch-exempt infrastructure (PermaLock, quoter);
/// 4. while exclusive, transfers to a contract that proves to be a
/// canonical v3 pool of this token (self-reported token0/token1/
/// fee confirmed via factory.getPool == recipient) revert.
function _checkGuard(address from, address to) private view {
// pool + gated + exclusive share one slot: one sload for all three.
address pool_ = pool;
bool gated_ = gated;
bool exclusive_ = exclusive;
if (!gated_ && !exclusive_) return;
// UNCONDITIONAL EXIT GUARANTEE: a Uniswap v3 sell transfers tokens
// from the holder/router TO the pool. Return before every gate,
// exemption, exclusivity, or external-contract check, so neither the
// creator nor any configured dependency can ever block that sell.
if (to == pool_) return;
// The gate is deliberately the opposite direction only: pool -> buyer.
// It can reject a buy, but is unreachable for sells and wallet transfers.
if (gated_ && from == pool_ && !guardExempt[to]) {
if (!IQuiverGateMinimal(gate).isApproved(to))
revert BuyNotApproved();
}
if (exclusive_ && to.code.length > 0 && _isRivalV3Pool(to))
revert RivalPoolBlocked();
}
/// @dev True when `to` is a canonical Uniswap v3 pool with this token
/// on one side. The recipient's self-reported token0/token1/fee are
/// only trusted after factory.getPool(token0, token1, fee) confirms the
/// recipient IS that pool: a real pool reports its true immutables (so
/// no false negatives), and a liar gets a different address back from
/// the factory (so no false positives).
function _isRivalV3Pool(address to) private view returns (bool) {
(bool ok0, bytes memory data0) = to.staticcall(
abi.encodeWithSignature("token0()")
);
if (!ok0 || data0.length != 32) return false;
(bool ok1, bytes memory data1) = to.staticcall(
abi.encodeWithSignature("token1()")
);
if (!ok1 || data1.length != 32) return false;
address token0 = _asAddress(data0);
address token1 = _asAddress(data1);
if (token0 != address(this) && token1 != address(this)) return false;
(bool okFee, bytes memory dataFee) = to.staticcall(
abi.encodeWithSignature("fee()")
);
if (!okFee || dataFee.length != 32) return false;
uint24 fee = uint24(uint256(bytes32(dataFee)));
return
IUniswapV3FactoryGetPool(factory).getPool(token0, token1, fee) ==
to;
}
/// @dev Lower-160-bits decode that can't revert on dirty return data.
function _asAddress(bytes memory data) private pure returns (address) {
return address(uint160(uint256(bytes32(data))));
}
// ========================================================================
// ERC-20
// ========================================================================
/// @notice ERC-7572 contract-level metadata as a self-contained data URI,
/// so there's no off-chain JSON to host. name/symbol/imageURI are user
/// input and get JSON-escaped before embedding.
function contractURI() external view returns (string memory) {
return
string(
abi.encodePacked(
'data:application/json;utf8,{"name":"',
_jsonEscape(name),
'","symbol":"',
_jsonEscape(symbol),
'","image":"',
_jsonEscape(imageURI),
'"}'
)
);
}
function transfer(address to, uint256 value) external returns (bool) {
_transfer(msg.sender, to, value);
return true;
}
function approve(address spender, uint256 value) external returns (bool) {
allowance[msg.sender][spender] = value;
emit Approval(msg.sender, spender, value);
return true;
}
function transferFrom(
address from,
address to,
uint256 value
) external returns (bool) {
uint256 allowed = allowance[from][msg.sender];
if (allowed != type(uint256).max) {
allowance[from][msg.sender] = allowed - value;
}
_transfer(from, to, value);
return true;
}
function _transfer(address from, address to, uint256 value) internal {
// Reject the zero address (OpenZeppelin ERC-20 behavior): the supply
// is fixed and there is no burn, so tokens must never be strandable
// at address(0) either.
if (to == address(0)) revert TransferToZeroAddress();
_checkGuard(from, to);
balanceOf[from] -= value;
balanceOf[to] += value;
emit Transfer(from, to, value);
}
/// @dev Escapes `"` and `\` and strips control characters. That's enough
/// to keep the contractURI JSON well-formed for arbitrary user strings.
function _jsonEscape(
string memory value
) private pure returns (string memory) {
bytes memory input = bytes(value);
bytes memory out = new bytes(input.length * 2);
uint256 j;
for (uint256 i = 0; i < input.length; i++) {
bytes1 c = input[i];
if (c == '"' || c == "\\") {
out[j++] = "\\";
out[j++] = c;
} else if (uint8(c) >= 0x20) {
out[j++] = c;
}
}
assembly {
mstore(out, j)
}
return string(out);
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "name_",
"type": "string",
"internalType": "string"
},
{
"name": "symbol_",
"type": "string",
"internalType": "string"
},
{
"name": "totalSupply_",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "imageURI_",
"type": "string",
"internalType": "string"
},
{
"name": "guard_",
"type": "tuple",
"components": [
{
"name": "gated",
"type": "bool",
"internalType": "bool"
},
{
"name": "exclusive",
"type": "bool",
"internalType": "bool"
},
{
"name": "gate",
"type": "address",
"internalType": "address"
},
{
"name": "creator",
"type": "address",
"internalType": "address"
},
{
"name": "factory",
"type": "address",
"internalType": "address"
},
{
"name": "exempt",
"type": "address[]",
"internalType": "address[]"
}
],
"internalType": "struct QuiverToken.GuardConfig"
}
],
"stateMutability": "nonpayable"
},
{
"name": "BuyNotApproved",
"type": "error",
"inputs": []
},
{
"name": "GuardConfigInvalid",
"type": "error",
"inputs": []
},
{
"name": "OnlyCreator",
"type": "error",
"inputs": []
},
{
"name": "OnlyLauncher",
"type": "error",
"inputs": []
},
{
"name": "PoolAlreadySet",
"type": "error",
"inputs": []
},
{
"name": "RivalPoolBlocked",
"type": "error",
"inputs": []
},
{
"name": "TransferToZeroAddress",
"type": "error",
"inputs": []
},
{
"name": "Approval",
"type": "event",
"inputs": [
{
"name": "owner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "spender",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "ExclusivityDisabled",
"type": "event",
"inputs": [],
"anonymous": false
},
{
"name": "GatingEnded",
"type": "event",
"inputs": [],
"anonymous": false
},
{
"name": "Transfer",
"type": "event",
"inputs": [
{
"name": "from",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "allowance",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
},
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "approve",
"type": "function",
"inputs": [
{
"name": "spender",
"type": "address",
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"name": "balanceOf",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "contractURI",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "creator",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "decimals",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"stateMutability": "view"
},
{
"name": "disableExclusivity",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "endGating",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "exclusive",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "factory",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "gate",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "gated",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "guardExempt",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "imageURI",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "launcher",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "name",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "pool",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "setPool",
"type": "function",
"inputs": [
{
"name": "pool_",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "symbol",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "totalSupply",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "transfer",
"type": "function",
"inputs": [
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"name": "transferFrom",
"type": "function",
"inputs": [
{
"name": "from",
"type": "address",
"internalType": "address"
},
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
}
]0x608060405234801561001057600080fd5b50600436106101825760003560e01c80634437152a116100d857806395d89b411161008c578063c45a015511610066578063c45a0155146103a1578063dd62ed3e146103c1578063e8a3d485146103ec57600080fd5b806395d89b4114610363578063a9059cbb1461036b578063a90c28581461037e57600080fd5b806370a08231116100bd57806370a08231146102fe5780637a0ebc881461031e578063907cf3181461033e57600080fd5b80634437152a146102e35780636efa4d7b146102f657600080fd5b806316eebd1e1161013a57806323b872dd1161011457806323b872dd146102ac5780632ca15515146102bf578063313ce567146102c957600080fd5b806316eebd1e1461023757806316f0115b1461025757806318160ddd1461027757600080fd5b806306fdde031161016b57806306fdde0314610207578063095ea7b31461021c578063135d088d1461022f57600080fd5b806301ff74f71461018757806302d05d3f146101c2575b600080fd5b6005546101ad907501000000000000000000000000000000000000000000900460ff1681565b60405190151581526020015b60405180910390f35b6007546101e29073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101b9565b61020f6103f4565b6040516101b991906113c8565b6101ad61022a36600461143e565b610482565b61020f6104fc565b6006546101e29073ffffffffffffffffffffffffffffffffffffffff1681565b6005546101e29073ffffffffffffffffffffffffffffffffffffffff1681565b61029e7f0000000000000000000000000000000000000000033b2e3c9fd0803ce800000081565b6040519081526020016101b9565b6101ad6102ba36600461146a565b610509565b6102c76105b3565b005b6102d1601281565b60405160ff90911681526020016101b9565b6102c76102f13660046114ab565b6106ab565b6102c76107e0565b61029e61030c3660046114ab565b60036020526000908152604090205481565b6008546101e29073ffffffffffffffffffffffffffffffffffffffff1681565b6005546101ad9074010000000000000000000000000000000000000000900460ff1681565b61020f6108d9565b6101ad61037936600461143e565b6108e6565b6101ad61038c3660046114ab565b600a6020526000908152604090205460ff1681565b6009546101e29073ffffffffffffffffffffffffffffffffffffffff1681565b61029e6103cf3660046114cf565b600460209081526000928352604080842090915290825290205481565b61020f6108fc565b6000805461040190611508565b80601f016020809104026020016040519081016040528092919081815260200182805461042d90611508565b801561047a5780601f1061044f5761010080835404028352916020019161047a565b820191906000526020600020905b81548152906001019060200180831161045d57829003601f168201915b505050505081565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906104ea9086815260200190565b60405180910390a35060015b92915050565b6002805461040190611508565b73ffffffffffffffffffffffffffffffffffffffff831660009081526004602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461059d5761056b838261158a565b73ffffffffffffffffffffffffffffffffffffffff861660009081526004602090815260408083203384529091529020555b6105a88585856109d7565b506001949350505050565b60075473ffffffffffffffffffffffffffffffffffffffff163314610604576040517f47bc7cc800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055474010000000000000000000000000000000000000000900460ff16610658576040517fe19c6f8900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600580547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040517f93ff2ca84134a4b8c0583a4beacd92861cc8111a50159fe08d369ffb0a965ebb90600090a1565b60065473ffffffffffffffffffffffffffffffffffffffff1633146106fc576040517f04e255a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055473ffffffffffffffffffffffffffffffffffffffff161561074c576040517f5f801a3e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610799576040517fe19c6f8900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60075473ffffffffffffffffffffffffffffffffffffffff163314610831576040517f47bc7cc800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005547501000000000000000000000000000000000000000000900460ff16610886576040517fe19c6f8900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600580547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690556040517f984707f00ef95d43c91b4abcc09ef71899622542d892574ad548f1876b5b77e690600090a1565b6001805461040190611508565b60006108f33384846109d7565b50600192915050565b60606109916000805461090e90611508565b80601f016020809104026020016040519081016040528092919081815260200182805461093a90611508565b80156109875780601f1061095c57610100808354040283529160200191610987565b820191906000526020600020905b81548152906001019060200180831161096a57829003601f168201915b5050505050610b10565b6109a16001805461090e90611508565b6109b16002805461090e90611508565b6040516020016109c39392919061159d565b604051602081830303815290604052905090565b73ffffffffffffffffffffffffffffffffffffffff8216610a24576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a2e8383610d54565b73ffffffffffffffffffffffffffffffffffffffff831660009081526003602052604081208054839290610a6390849061158a565b909155505073ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604081208054839290610a9d9084906116b1565b925050819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610b0391815260200190565b60405180910390a3505050565b80516060908290600090610b259060026116c4565b67ffffffffffffffff811115610b3d57610b3d6116db565b6040519080825280601f01601f191660200182016040528015610b67576020820181803683370190505b5090506000805b8351811015610d4a576000848281518110610b8b57610b8b61170a565b01602001517fff000000000000000000000000000000000000000000000000000000000000001690507f2200000000000000000000000000000000000000000000000000000000000000811480610c2357507f5c000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000008216145b15610ce7577f5c000000000000000000000000000000000000000000000000000000000000008484610c5481611739565b955081518110610c6657610c6661170a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350808484610ca181611739565b955081518110610cb357610cb361170a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350610d41565b602060f882901c10610d4157808484610cff81611739565b955081518110610d1157610d1161170a565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b50600101610b6e565b5081529392505050565b60055473ffffffffffffffffffffffffffffffffffffffff81169060ff740100000000000000000000000000000000000000008204811691750100000000000000000000000000000000000000000090041681158015610db2575080155b15610dbe575050505050565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610df8575050505050565b818015610e3057508273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b8015610e62575073ffffffffffffffffffffffffffffffffffffffff84166000908152600a602052604090205460ff16155b15610f31576008546040517f673448dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301529091169063673448dd90602401602060405180830381865afa158015610ed7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610efb9190611771565b610f31576040517f84b28f7c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808015610f55575060008473ffffffffffffffffffffffffffffffffffffffff163b115b8015610f655750610f6584610fa3565b15610f9c576040517f39db753600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0dfe16810000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff8616916110249190611793565b600060405180830381855afa9150503d806000811461105f576040519150601f19603f3d011682016040523d82523d6000602084013e611064565b606091505b509150915081158061107857508051602014155b15611087575060009392505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd21220a7000000000000000000000000000000000000000000000000000000001790529051600091829173ffffffffffffffffffffffffffffffffffffffff88169161110591611793565b600060405180830381855afa9150503d8060008114611140576040519150601f19603f3d011682016040523d82523d6000602084013e611145565b606091505b509150915081158061115957508051602014155b1561116a5750600095945050505050565b600061117584611399565b9050600061118283611399565b905073ffffffffffffffffffffffffffffffffffffffff821630148015906111c0575073ffffffffffffffffffffffffffffffffffffffff81163014155b156111d357506000979650505050505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fddca3f43000000000000000000000000000000000000000000000000000000001790529051600091829173ffffffffffffffffffffffffffffffffffffffff8c169161125191611793565b600060405180830381855afa9150503d806000811461128c576040519150601f19603f3d011682016040523d82523d6000602084013e611291565b606091505b50915091508115806112a557508051602014155b156112ba575060009998505050505050505050565b60006112c5826117af565b6009546040517f1698ee8200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152878116602483015262ffffff841660448301529293508d83169290911690631698ee8290606401602060405180830381865afa15801561134f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137391906117f1565b73ffffffffffffffffffffffffffffffffffffffff16149b9a5050505050505050505050565b60006104f6826117af565b60005b838110156113bf5781810151838201526020016113a7565b50506000910152565b60208152600082518060208401526113e78160408501602087016113a4565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461143b57600080fd5b50565b6000806040838503121561145157600080fd5b823561145c81611419565b946020939093013593505050565b60008060006060848603121561147f57600080fd5b833561148a81611419565b9250602084013561149a81611419565b929592945050506040919091013590565b6000602082840312156114bd57600080fd5b81356114c881611419565b9392505050565b600080604083850312156114e257600080fd5b82356114ed81611419565b915060208301356114fd81611419565b809150509250929050565b600181811c9082168061151c57607f821691505b602082108103611555577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156104f6576104f661155b565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c7b226e616d81527f65223a22000000000000000000000000000000000000000000000000000000006020820152600084516115fb8160248501602089016113a4565b7f222c2273796d626f6c223a22000000000000000000000000000000000000000060249184019182015284516116388160308401602089016113a4565b6024818301019150507f222c22696d616765223a22000000000000000000000000000000000000000000600c820152835161167a8160178401602088016113a4565b7f227d0000000000000000000000000000000000000000000000000000000000006017929091019182015260190195945050505050565b808201808211156104f6576104f661155b565b80820281158282048414176104f6576104f661155b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361176a5761176a61155b565b5060010190565b60006020828403121561178357600080fd5b815180151581146114c857600080fd5b600082516117a58184602087016113a4565b9190910192915050565b80516020808301519190811015611555577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60209190910360031b1b16919050565b60006020828403121561180357600080fd5b81516114c88161141956
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| DIH | 1 | $0.0000102 | $0 |
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xce655b0e…6f1e49 | Transfer | 17,311,746 | 25 days agoThu, 23 Jul 2026 13:09:04 UTC | 0xcaf7…5d11 | IN | 0xc7a8…7579 | $0.001 DIH |
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x2d7470…551c41 | 20 days agoTue, 28 Jul 2026 23:57:54 UTC | Transfer | [0] 0x000000000000…f82f50aa [1] 0x000000000000…43e40951 data: 0x000000000000000000…9d36bdd0 |
| 0xf46e77…a18fd7 | 20 days agoTue, 28 Jul 2026 23:57:52 UTC | Approval | [0] 0x000000000000…f82f50aa [1] 0x000000000000…3ac78ba3 data: 0x000000000000000000…fb6584e6 |
| 0xfaea69…927f1b | 20 days agoTue, 28 Jul 2026 23:57:39 UTC | Transfer | [0] 0x000000000000…43e40951 [1] 0x000000000000…f82f50aa data: 0x000000000000000000…886f73d6 |
| 0x0647da…2a68d2 | 20 days agoTue, 28 Jul 2026 07:15:01 UTC | Transfer | [0] 0x000000000000…a5729e0c [1] 0x000000000000…c4a555d4 data: 0x000000000000000000…7e523bac |
| 0x0647da…2a68d2 | 20 days agoTue, 28 Jul 2026 07:15:01 UTC | Transfer | [0] 0x000000000000…a5729e0c [1] 0x000000000000…9b08f582 data: 0x000000000000000000…f948eeb3 |
| 0x0647da…2a68d2 | 20 days agoTue, 28 Jul 2026 07:15:01 UTC | Transfer | [0] 0x000000000000…214eae87 [1] 0x000000000000…a5729e0c data: 0x000000000000000000…779b2a5f |
| 0x70331b…e08ad9 | 20 days agoTue, 28 Jul 2026 07:14:55 UTC | Transfer | [0] 0x000000000000…6afd7751 [1] 0x000000000000…214eae87 data: 0x000000000000000000…bc4e0fdd |
| 0xe0828b…aa10cb | 20 days agoTue, 28 Jul 2026 07:14:53 UTC | Approval | [0] 0x000000000000…6afd7751 [1] 0x000000000000…959e5cb2 data: 0xffffffffffffffffff…ffffffff |
| 0x10ce80…c67f58 | 20 days agoTue, 28 Jul 2026 07:14:48 UTC | Transfer | [0] 0x000000000000…59b74e52 [1] 0x000000000000…214eae87 data: 0x000000000000000000…ea4ab5c8 |
| 0x9da310…e97a94 | 20 days agoTue, 28 Jul 2026 07:14:44 UTC | Transfer | [0] 0x000000000000…e7768f70 [1] 0x000000000000…214eae87 data: 0x000000000000000000…37a24fa2 |
| 0x05a1a6…d170ba | 20 days agoTue, 28 Jul 2026 07:14:39 UTC | Transfer | [0] 0x000000000000…9d8cdfd5 [1] 0x000000000000…214eae87 data: 0x000000000000000000…2809f611 |
| 0x69e161…3f302e | 20 days agoTue, 28 Jul 2026 07:14:35 UTC | Transfer | [0] 0x000000000000…1acf8c3f [1] 0x000000000000…214eae87 data: 0x000000000000000000…837cb0cf |
| 0x485cc4…b28839 | 20 days agoTue, 28 Jul 2026 07:14:30 UTC | Transfer | [0] 0x000000000000…a3f4ef41 [1] 0x000000000000…214eae87 data: 0x000000000000000000…94c584eb |
| 0x323785…2040f4 | 20 days agoTue, 28 Jul 2026 07:14:25 UTC | Transfer | [0] 0x000000000000…363ec489 [1] 0x000000000000…214eae87 data: 0x000000000000000000…b3c0ce8e |
| 0xffaeb3…fcf903 | 20 days agoTue, 28 Jul 2026 07:14:20 UTC | Transfer | [0] 0x000000000000…9ed2291a [1] 0x000000000000…214eae87 data: 0x000000000000000000…8b9b9f99 |
| 0x74ee68…52b31c | 20 days agoTue, 28 Jul 2026 07:14:16 UTC | Transfer | [0] 0x000000000000…195878b5 [1] 0x000000000000…214eae87 data: 0x000000000000000000…a0f75533 |
| 0x2da8ca…3e300e | 20 days agoTue, 28 Jul 2026 07:14:11 UTC | Transfer | [0] 0x000000000000…74f48ed1 [1] 0x000000000000…214eae87 data: 0x000000000000000000…44d4de5b |
| 0x91e07b…a66c02 | 20 days agoTue, 28 Jul 2026 07:14:05 UTC | Transfer | [0] 0x000000000000…d6af9efb [1] 0x000000000000…214eae87 data: 0x000000000000000000…20a3bed4 |
| 0x4eaf1a…44e564 | 20 days agoTue, 28 Jul 2026 07:14:01 UTC | Transfer | [0] 0x000000000000…a45f6f67 [1] 0x000000000000…214eae87 data: 0x000000000000000000…e980d11e |
| 0x9800cf…58b8d7 | 20 days agoTue, 28 Jul 2026 07:13:56 UTC | Transfer | [0] 0x000000000000…b52bc49c [1] 0x000000000000…214eae87 data: 0x000000000000000000…07c0f034 |
| 0x12c11e…35d3f5 | 20 days agoTue, 28 Jul 2026 07:13:52 UTC | Transfer | [0] 0x000000000000…0a449bda [1] 0x000000000000…214eae87 data: 0x000000000000000000…0197126a |
| 0xce8a8c…e83f7a | 20 days agoTue, 28 Jul 2026 07:13:47 UTC | Transfer | [0] 0x000000000000…309f41bc [1] 0x000000000000…214eae87 data: 0x000000000000000000…89b1b381 |
| 0x78f531…2ad154 | 20 days agoTue, 28 Jul 2026 07:13:42 UTC | Transfer | [0] 0x000000000000…45900688 [1] 0x000000000000…214eae87 data: 0x000000000000000000…9960c178 |
| 0xff5f7c…d31ac7 | 20 days agoTue, 28 Jul 2026 07:13:37 UTC | Transfer | [0] 0x000000000000…9c4ad985 [1] 0x000000000000…214eae87 data: 0x000000000000000000…a7c3f69e |
| 0x09ed3c…4779a4 | 20 days agoTue, 28 Jul 2026 07:13:32 UTC | Transfer | [0] 0x000000000000…f47ce8b2 [1] 0x000000000000…214eae87 data: 0x000000000000000000…3dde3912 |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xf46e77…a18fd7 | Approve | 22,004,752 | 20 days agoTue, 28 Jul 2026 23:57:52 UTC | 0x6d14…50aa | IN | Quiver guild | $0.000 ETH | 0.00000083 | |
| 0xe0828b…aa10cb | Approve | 21,404,641 | 20 days agoTue, 28 Jul 2026 07:14:53 UTC | 0xa57c…7751 | IN | Quiver guild | $0.000 ETH | 0.00000153 | |
| 0x74e2c4…0e99cf | Approve | 20,039,726 | 22 days agoSun, 26 Jul 2026 17:10:48 UTC | 0x6d14…50aa | IN | Quiver guild | $0.000 ETH | 0.00000148 | |
| 0x3c7531…cc4a6c | Approve | 19,563,759 | 22 days agoSun, 26 Jul 2026 03:54:56 UTC | 0x4b05…a782 | IN | Quiver guild | $0.000 ETH | 0.00000297 | |
| 0x368457…8bd570 | Transfer | 17,619,283 | 25 days agoThu, 23 Jul 2026 21:42:39 UTC | 0xd4c0…e5a8 | IN | Quiver guild | $0.000 ETH | 0.00000390 | |
| 0x649b2e…1ad413 | Transfer | 17,619,271 | 25 days agoThu, 23 Jul 2026 21:42:38 UTC | 0x3076…12e1 | IN | Quiver guild | $0.000 ETH | 0.00000390 | |
| 0xe460da…e62719 | Transfer | 17,619,259 | 25 days agoThu, 23 Jul 2026 21:42:36 UTC | 0x029a…ba31 | IN | Quiver guild | $0.000 ETH | 0.00000390 | |
| 0xe25ebd…24069c | Transfer | 17,619,213 | 25 days agoThu, 23 Jul 2026 21:42:32 UTC | 0xe717…7b63 | IN | Quiver guild | $0.000 ETH | 0.00000391 | |
| 0x9559ab…7477e0 | Transfer | 17,619,198 | 25 days agoThu, 23 Jul 2026 21:42:30 UTC | 0x68bb…bd3b | IN | Quiver guild | $0.000 ETH | 0.00000391 | |
| 0xf1e1de…1d8441 | Transfer | 17,619,186 | 25 days agoThu, 23 Jul 2026 21:42:29 UTC | 0x560d…6026 | IN | Quiver guild | $0.000 ETH | 0.00000391 | |
| 0x1a5b4b…70ac97 | Transfer | 17,619,174 | 25 days agoThu, 23 Jul 2026 21:42:28 UTC | 0x50d6…2664 | IN | Quiver guild | $0.000 ETH | 0.00000390 | |
| 0x0928a0…a1aff9 | Transfer | 17,619,162 | 25 days agoThu, 23 Jul 2026 21:42:27 UTC | 0xfc12…4524 | IN | Quiver guild | $0.000 ETH | 0.00000390 | |
| 0x5d3156…73434e | Transfer | 17,619,119 | 25 days agoThu, 23 Jul 2026 21:42:22 UTC | 0x8c8f…74ac | IN | Quiver guild | $0.000 ETH | 0.00000390 | |
| 0x76f5f5…c0abd8 | Transfer | 17,619,107 | 25 days agoThu, 23 Jul 2026 21:42:21 UTC | 0x7850…7f15 | IN | Quiver guild | $0.000 ETH | 0.00000397 | |
| 0xadea3f…28ad24 | Transfer | 17,619,095 | 25 days agoThu, 23 Jul 2026 21:42:20 UTC | 0xe57d…bdd2 | IN | Quiver guild | $0.000 ETH | 0.00000390 | |
| 0xd7f289…0bec24 | Transfer | 17,619,083 | 25 days agoThu, 23 Jul 2026 21:42:19 UTC | 0x28a4…2e2f | IN | Quiver guild | $0.000 ETH | 0.00000389 | |
| 0x3a16c4…4b2afc | Transfer | 17,619,071 | 25 days agoThu, 23 Jul 2026 21:42:18 UTC | 0x2821…1145 | IN | Quiver guild | $0.000 ETH | 0.00000393 | |
| 0x2d2d1d…a05515 | Transfer | 17,619,028 | 25 days agoThu, 23 Jul 2026 21:42:13 UTC | 0x5552…5cdc | IN | Quiver guild | $0.000 ETH | 0.00000390 | |
| 0xde30ec…abaebb | Transfer | 17,619,016 | 25 days agoThu, 23 Jul 2026 21:42:12 UTC | 0x85ba…1f35 | IN | Quiver guild | $0.000 ETH | 0.00000390 | |
| 0x91886e…e827d0 | Transfer | 17,619,004 | 25 days agoThu, 23 Jul 2026 21:42:11 UTC | 0xe583…2b95 | IN | Quiver guild | $0.000 ETH | 0.00000389 | |
| 0x65bbfc…dc8bbf | Transfer | 17,618,992 | 25 days agoThu, 23 Jul 2026 21:42:10 UTC | 0xa2f8…cd4b | IN | Quiver guild | $0.000 ETH | 0.00000389 | |
| 0xdf97b0…ddc689 | Transfer | 17,618,980 | 25 days agoThu, 23 Jul 2026 21:42:08 UTC | 0xfcc1…b575 | IN | Quiver guild | $0.000 ETH | 0.00000396 | |
| 0xac4dd3…514ec9 | Transfer | 17,618,940 | 25 days agoThu, 23 Jul 2026 21:42:04 UTC | 0xaf4c…8b78 | IN | Quiver guild | $0.000 ETH | 0.00000392 | |
| 0x1b0569…f70f4d | Transfer | 17,618,928 | 25 days agoThu, 23 Jul 2026 21:42:03 UTC | 0x8e07…e455 | IN | Quiver guild | $0.000 ETH | 0.00000391 | |
| 0x8af305…f98124 | Transfer | 17,618,916 | 25 days agoThu, 23 Jul 2026 21:42:02 UTC | 0x3076…6f06 | IN | Quiver guild | $0.000 ETH | 0.00000390 |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 13,106,325 | 30 days agoSat, 18 Jul 2026 15:59:18 UTC | 0xd33755…9d5de0 | CREATE2 | 0x44cee1be | 0xf67e…090f | IN | 0xc7a8…7579 | 0 ETH |