// SPDX-License-Identifier: MIT
pragma solidity 0.8.26;
import {IUniswapV2Router02, IUniswapV2Pair} from "./interfaces/IUniswapV2.sol";
/// @title RobinToken
/// @notice Fixed-supply ERC20 with a 1% fee-on-transfer that, after graduation, is auto-swapped
/// to ETH and split 50/50 creator / treasury.
///
/// BEFORE graduation: the factory is fee-exempt, so all curve trades and the initial
/// liquidity add use exact amounts. The curve trade fee is taken in ETH by the factory.
///
/// AFTER graduation (token live on Uniswap V2): every non-exempt transfer (i.e. swaps)
/// charges 1%, accumulating tokens in THIS contract. When the accumulated tokens are worth
/// at least $5 (valued via the live pool reserves + the factory's ethUsdPrice), the
/// contract sells them for ETH and pays the creator and treasury 50/50 in ETH.
///
/// The auto-swap only runs when `from` is NOT the pair (i.e. on sells / normal transfers),
/// never inside a buy, to avoid reentering the pair mid-swap.
contract RobinTokenV2 {
string public name;
string public symbol;
uint8 public constant decimals = 18;
uint256 public immutable totalSupply;
address public immutable factory;
address public immutable creator;
/// @notice where the creator's 50% of the post-DEX auto-swap fee is sent. Chosen by the creator
/// at launch (defaults to the creator if they didn't pick a different address).
address public feeRecipient; // mutable ONLY via factory CTO (was immutable)
address public immutable treasury;
uint256 public constant FEE_BPS = 100; // 1% total
mapping(address => uint256) public balanceOf;
mapping(address => mapping(address => uint256)) public allowance;
mapping(address => bool) public feeExempt;
// --- DEX auto-swap config (set by factory at graduation) ---
IUniswapV2Router02 public router;
address public pair;
address public weth;
bool public dexLive; // true once graduated & pair is set
/// @notice USD price of ETH with 8 decimals (snapshotted at graduation; mirrors the factory).
uint256 public ethUsdPrice8;
/// @notice swap-back threshold in USD (8 decimals). $5 = 5e8.
uint256 public constant SWAP_THRESHOLD_USD = 5 * 1e8;
bool private _swapping; // reentrancy guard for the auto-swap
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
event FeeSwapped(uint256 tokensSold, uint256 ethToCreator, uint256 ethToTreasury);
event DexConfigured(address pair, address router);
constructor(
string memory _name,
string memory _symbol,
uint256 _supply,
address _creator,
address _feeRecipient,
address _treasury
) {
name = _name;
symbol = _symbol;
totalSupply = _supply;
factory = msg.sender;
creator = _creator;
// fall back to the creator if no explicit recipient was chosen
feeRecipient = _feeRecipient == address(0) ? _creator : _feeRecipient;
treasury = _treasury;
feeExempt[msg.sender] = true; // factory exempt -> exact curve + liquidity math
feeExempt[address(this)] = true; // this contract (holds + sells fee tokens) exempt
balanceOf[msg.sender] = _supply;
emit Transfer(address(0), msg.sender, _supply);
}
modifier onlyFactory() {
require(msg.sender == factory, "ONLY_FACTORY");
_;
}
function setFeeExempt(address account, bool exempt) external onlyFactory {
feeExempt[account] = exempt;
}
/// @notice Called by the factory at graduation to wire up the DEX auto-swap.
function configureDex(address _router, address _pair, address _weth, uint256 _ethUsdPrice8)
external
onlyFactory
{
require(!dexLive, "ALREADY_CONFIGURED"); // graduation is one-time
router = IUniswapV2Router02(_router);
pair = _pair;
weth = _weth;
ethUsdPrice8 = _ethUsdPrice8;
dexLive = true;
// approve router once to sell accumulated fee tokens
allowance[address(this)][_router] = type(uint256).max;
emit Approval(address(this), _router, type(uint256).max);
emit DexConfigured(_pair, _router);
}
/// @notice Owner-side (factory) may refresh the ETH/USD price used for the $5 threshold.
function setEthUsdPrice(uint256 _ethUsdPrice8) external onlyFactory {
ethUsdPrice8 = _ethUsdPrice8;
}
/// @notice CTO: the factory (owner-gated) redirects where the creator's fee half is paid on the
/// post-graduation DEX auto-swap. Only the factory can call it.
function setFeeRecipient(address r) external onlyFactory {
require(r != address(0), "ZERO");
feeRecipient = r;
}
function approve(address spender, uint256 value) external returns (bool) {
allowance[msg.sender][spender] = value;
emit Approval(msg.sender, spender, value);
return true;
}
function transfer(address to, uint256 value) external returns (bool) {
return _transfer(msg.sender, to, value);
}
function transferFrom(address from, address to, uint256 value) external returns (bool) {
uint256 allowed = allowance[from][msg.sender];
if (allowed != type(uint256).max) {
require(allowed >= value, "ERC20: insufficient allowance");
allowance[from][msg.sender] = allowed - value;
}
return _transfer(from, to, value);
}
function _transfer(address from, address to, uint256 value) internal returns (bool) {
require(to != address(0), "ERC20: transfer to zero");
uint256 bal = balanceOf[from];
require(bal >= value, "ERC20: insufficient balance");
// Try the auto-swap BEFORE applying this transfer's fee, but only on sells (to == pair)
// and never while already swapping or during a buy (from == pair).
if (dexLive && !_swapping && from != pair && to == pair) {
_maybeSwapBack();
}
unchecked {
balanceOf[from] = bal - value;
}
// Tax ONLY DEX trades: a transfer is taxed when one side is the pair (1% per buy, 1% per
// sell). Plain wallet-to-wallet transfers are NOT taxed. Exempt addresses are never taxed.
uint256 fee = 0;
bool isDexTrade = (from == pair || to == pair);
if (isDexTrade && !feeExempt[from] && !feeExempt[to] && FEE_BPS > 0) {
fee = (value * FEE_BPS) / 10_000;
}
if (fee > 0) {
unchecked {
balanceOf[address(this)] += fee; // accumulate fee tokens in this contract
balanceOf[to] += value - fee;
}
emit Transfer(from, address(this), fee);
emit Transfer(from, to, value - fee);
} else {
unchecked {
balanceOf[to] += value;
}
emit Transfer(from, to, value);
}
return true;
}
/// @dev If the accumulated fee tokens are worth >= $5, sell them for ETH and pay
/// creator/treasury 50/50. Valued via the live pool reserves + ethUsdPrice8.
function _maybeSwapBack() internal {
uint256 tokenBal = balanceOf[address(this)];
if (tokenBal == 0) return;
// value the accumulated tokens in USD (8 dec) using the pool's ETH/token ratio
(uint112 r0, uint112 r1,) = IUniswapV2Pair(pair).getReserves();
address t0 = IUniswapV2Pair(pair).token0();
uint256 tokenReserve = t0 == address(this) ? uint256(r0) : uint256(r1);
uint256 wethReserve = t0 == address(this) ? uint256(r1) : uint256(r0);
if (tokenReserve == 0 || wethReserve == 0) return;
// ethValue (wei) of tokenBal at spot = tokenBal * wethReserve / tokenReserve
uint256 ethValueWei = (tokenBal * wethReserve) / tokenReserve;
// usdValue (8 dec) = ethValueWei * ethUsdPrice8 / 1e18
uint256 usdValue8 = (ethValueWei * ethUsdPrice8) / 1e18;
if (usdValue8 < SWAP_THRESHOLD_USD) return;
// don't dump more than ~1% of the pool's token reserve in one go (limit price impact);
// a large accumulation clears over several swaps.
uint256 maxSell = tokenReserve / 100; // 1% of reserve
uint256 sellAmount = tokenBal > maxSell && maxSell > 0 ? maxSell : tokenBal;
// slippage floor: expected ETH out via constant product (0.3% pool fee), minus 10%.
// If the real out would breach this (sandwich / thin liquidity), the swap reverts and the
// tokens are simply retained for a later attempt — the user's transfer is never bricked.
uint256 amountInWithFee = sellAmount * 997;
uint256 expectedOut = (amountInWithFee * wethReserve) / (tokenReserve * 1000 + amountInWithFee);
uint256 minOut = (expectedOut * 90) / 100; // 10% tolerance
_swapping = true;
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = weth;
// sell tokens for ETH (this token is fee-exempt for its own transfers; router/pair exact).
try router.swapExactTokensForETHSupportingFeeOnTransferTokens(
sellAmount, minOut, path, address(this), block.timestamp
) {
// Pay out the ENTIRE ETH balance (sweeps any ETH orphaned by a prior failed payout),
// split 50/50 between the creator's chosen feeRecipient and the treasury. Best-effort:
// a failed leg never reverts the user's transfer.
uint256 ethBal = address(this).balance;
if (ethBal > 0) {
uint256 half = ethBal / 2;
uint256 paidCreator = 0;
(bool okC,) = feeRecipient.call{value: half}("");
if (okC) paidCreator = half;
uint256 toTreasury = ethBal - paidCreator; // creator's failed share folds in
uint256 paidTreasury = 0;
if (toTreasury > 0) {
(bool okT,) = treasury.call{value: toTreasury}("");
if (okT) paidTreasury = toTreasury;
}
emit FeeSwapped(sellAmount, paidCreator, paidTreasury);
}
} catch {
// swap failed (e.g. thin liquidity / slippage floor) — keep tokens for a later attempt
}
_swapping = false;
}
receive() external payable {}
}[
{
"type": "constructor",
"inputs": [
{
"name": "_name",
"type": "string",
"internalType": "string"
},
{
"name": "_symbol",
"type": "string",
"internalType": "string"
},
{
"name": "_supply",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "_creator",
"type": "address",
"internalType": "address"
},
{
"name": "_feeRecipient",
"type": "address",
"internalType": "address"
},
{
"name": "_treasury",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"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": "DexConfigured",
"type": "event",
"inputs": [
{
"name": "pair",
"type": "address",
"indexed": false,
"internalType": "address"
},
{
"name": "router",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "FeeSwapped",
"type": "event",
"inputs": [
{
"name": "tokensSold",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "ethToCreator",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "ethToTreasury",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"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": "FEE_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "SWAP_THRESHOLD_USD",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"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": "configureDex",
"type": "function",
"inputs": [
{
"name": "_router",
"type": "address",
"internalType": "address"
},
{
"name": "_pair",
"type": "address",
"internalType": "address"
},
{
"name": "_weth",
"type": "address",
"internalType": "address"
},
{
"name": "_ethUsdPrice8",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"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": "dexLive",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "ethUsdPrice8",
"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": "feeExempt",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "feeRecipient",
"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": "pair",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "router",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IUniswapV2Router02"
}
],
"stateMutability": "view"
},
{
"name": "setEthUsdPrice",
"type": "function",
"inputs": [
{
"name": "_ethUsdPrice8",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setFeeExempt",
"type": "function",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
},
{
"name": "exempt",
"type": "bool",
"internalType": "bool"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setFeeRecipient",
"type": "function",
"inputs": [
{
"name": "r",
"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"
},
{
"name": "treasury",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "weth",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"type": "receive",
"stateMutability": "payable"
}
]0x608080604052600436101561001c575b50361561001a575f80fd5b005b5f3560e01c90816302d05d3f14610a355750806306fdde031461097d578063095ea7b3146109045780631754cdb7146108e657806318160ddd146108ac57806323b872dd146107ca578063313ce567146107af578063398daa85146107725780633fc8cef31461074a57806346904840146107225780634da7e450146106fd57806361d027b3146106b957806370a08231146106815780638ebfc7961461060257806395d89b41146104fe578063a589f28c146104e1578063a8aa1b31146104b9578063a9059cbb14610487578063b951883a1461043a578063bf333f2c1461041f578063c45a0155146103db578063dd62ed3e1461038b578063e74b981b146102ed578063f09399f2146101675763f887ea401461013b575f61000f565b34610163575f366003190112610163576006546040516001600160a01b039091168152602090f35b5f80fd5b3461016357608036600319011261016357610180610ad6565b610188610aec565b906044356001600160a01b03811690819003610163576101d2337f000000000000000000000000d861cb5dc71a0171e8f0f6586cadb069f3a35e4d6001600160a01b031614610b23565b6008549260ff8460a01c166102b3577fbd1f56340e71693e2714ef366858f586d668634bbaa3720ebf8b0faf0b1aa82c9360409360018060a01b031691826001600160601b0360a01b600654161760065560018060a01b031692836001600160601b0360a01b6007541617600755606435600955600160a01b916affffffffffffffffffffff60a81b161717600855305f526004602052825f20815f52602052825f205f1990558083515f1981527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203092a382519182526020820152a1005b60405162461bcd60e51b81526020600482015260126024820152711053149150511657d0d3d3919251d554915160721b6044820152606490fd5b3461016357602036600319011261016357610306610ad6565b61033a337f000000000000000000000000d861cb5dc71a0171e8f0f6586cadb069f3a35e4d6001600160a01b031614610b23565b6001600160a01b03168015610360576001600160601b0360a01b60025416176002555f80f35b606460405162461bcd60e51b81526020600482015260046024820152635a45524f60e01b6044820152fd5b34610163576040366003190112610163576103a4610ad6565b6103ac610aec565b6001600160a01b039182165f908152600460209081526040808320949093168252928352819020549051908152f35b34610163575f366003190112610163576040517f000000000000000000000000d861cb5dc71a0171e8f0f6586cadb069f3a35e4d6001600160a01b03168152602090f35b34610163575f36600319011261016357602060405160648152f35b346101635760203660031901126101635761047f337f000000000000000000000000d861cb5dc71a0171e8f0f6586cadb069f3a35e4d6001600160a01b031614610b23565b600435600955005b346101635760403660031901126101635760206104af6104a5610ad6565b6024359033610b8f565b6040519015158152f35b34610163575f366003190112610163576007546040516001600160a01b039091168152602090f35b34610163575f366003190112610163576020600954604051908152f35b34610163575f366003190112610163576040515f6001548060011c906001811680156105f8575b6020831081146105e4578285529081156105c05750600114610562575b61055e8361055281850382610a76565b60405191829182610aac565b0390f35b60015f9081527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6939250905b8082106105a657509091508101602001610552610542565b91926001816020925483858801015201910190929161058e565b60ff191660208086019190915291151560051b840190910191506105529050610542565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610525565b346101635760403660031901126101635761061b610ad6565b602435908115158092036101635761065d337f000000000000000000000000d861cb5dc71a0171e8f0f6586cadb069f3a35e4d6001600160a01b031614610b23565b60018060a01b03165f52600560205260405f209060ff801983541691161790555f80f35b34610163576020366003190112610163576001600160a01b036106a2610ad6565b165f526003602052602060405f2054604051908152f35b34610163575f366003190112610163576040517f000000000000000000000000f94a68b1d082b786f85e65466e9b9ffd5fc588216001600160a01b03168152602090f35b34610163575f36600319011261016357602060ff60085460a01c166040519015158152f35b34610163575f366003190112610163576002546040516001600160a01b039091168152602090f35b34610163575f366003190112610163576008546040516001600160a01b039091168152602090f35b34610163576020366003190112610163576001600160a01b03610793610ad6565b165f526005602052602060ff60405f2054166040519015158152f35b34610163575f36600319011261016357602060405160128152f35b34610163576060366003190112610163576107e3610ad6565b6107eb610aec565b6001600160a01b0382165f8181526004602090815260408083203384529091529020546044359391906001810161082a575b60206104af868686610b8f565b9290939182841061086757602094610845846104af96610b02565b5f9182526004875260408083203384528852909120559193909250829061081d565b60405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606490fd5b34610163575f3660031901126101635760206040517f0000000000000000000000000000000000000000033b2e3c9fd0803ce80000008152f35b34610163575f366003190112610163576020604051631dcd65008152f35b346101635760403660031901126101635761091d610ad6565b335f8181526004602090815260408083206001600160a01b03909516808452948252918290206024359081905591519182527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a3602060405160018152f35b34610163575f366003190112610163576040515f80548060011c90600181168015610a2b575b6020831081146105e4578285529081156105c057506001146109cf5761055e8361055281850382610a76565b5f8080527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563939250905b808210610a1157509091508101602001610552610542565b9192600181602092548385880101520191019092916109f9565b91607f16916109a3565b34610163575f366003190112610163577f00000000000000000000000056938a6863902cb4a7c875cc735efd3293117b2d6001600160a01b03168152602090f35b90601f8019910116810190811067ffffffffffffffff821117610a9857604052565b634e487b7160e01b5f52604160045260245ffd5b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361016357565b602435906001600160a01b038216820361016357565b91908203918211610b0f57565b634e487b7160e01b5f52601160045260245ffd5b15610b2a57565b60405162461bcd60e51b815260206004820152600c60248201526b4f4e4c595f464143544f525960a01b6044820152606490fd5b81810292918115918404141715610b0f57565b8115610b7b570490565b634e487b7160e01b5f52601260045260245ffd5b6001600160a01b0390911691908215610d95576001600160a01b03165f81815260036020526040902054909190818110610d5057819060ff60085460a01c1680610d43575b80610d2e575b80610d1a575b610d0d575b835f5260036020520360405f20555f60018060a01b0360075416808414908115610d03575b5080610cec575b80610cd5575b80610ccd575b610cb0575b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef916020918015610c9257610c8691305f526003845260405f20828154019055865f526003845260405f2082820381540190556040518281528686863093a3610b02565b604051908152a3600190565b50845f526003825260405f20818154019055604051908152a3600190565b506064810281810460641482151715610b0f576127109004610c22565b506001610c1d565b50835f52600560205260ff60405f20541615610c17565b50825f52600560205260ff60405f20541615610c11565b905084145f610c0a565b610d15610e2d565b610be5565b506007546001600160a01b03168514610be0565b506007546001600160a01b0316841415610bda565b5060ff600a541615610bd4565b60405162461bcd60e51b815260206004820152601b60248201527f45524332303a20696e73756666696369656e742062616c616e636500000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601760248201527f45524332303a207472616e7366657220746f207a65726f0000000000000000006044820152606490fd5b51906001600160701b038216820361016357565b3d15610e28573d9067ffffffffffffffff8211610a985760405191610e1d601f8201601f191660200184610a76565b82523d5f602084013e565b606090565b5f305f52600360205260405f2054801561124d57600754604051630240bc6b60e21b815291906001600160a01b0316606083600481845afa9081156111e4575f935f926111ef575b5090602060049260405193848092630dfe168160e01b82525afa80156111e4575f90611199575b6001600160a01b03163014936001600160701b039250841561119057828116945b15611187575016915b80159182801561117f575b61117857631dcd6500670de0b6b3a7640000610f02610ef985610ef48987610b5e565b610b71565b60095490610b5e565b04106111785760648204908181118061116f575b156111675750925b6103e58402908482046103e51485151715610b0f57610f3d9082610b5e565b926103e883029283046103e8141715610b0f578101809111610b0f57610f6291610b71565b605a810290808204605a1490151715610b0f57600160ff19600a541617600a5560405190610f91606083610a76565b600282526020820160403682378251156111535730815260018060a01b03600854168351600110156111535760408401526006546001600160a01b031691823b156101635760405163791ac94760e01b8152600481018690526064909104602482015260a06044820152925160a48401819052839160c48301915f5b8181106111315750505091815f81819530606483015242608483015203925af1908161111c575b50611048575b505060ff19600a5416600a55565b479081611056575b5061103a565b7f1bf43034432a4e4d1e77b2bf34a1d403013579df51c91bdb17240f48c7ffac14928260609360011c908291838080808460018060a01b03600254165af161109c610dee565b50611112575b50816110ad91610b02565b82816110cf575b505060405192835260208301526040820152a15f8080611050565b808080847f000000000000000000000000f94a68b1d082b786f85e65466e9b9ffd5fc588215af16110fe610dee565b5061110a575b806110b4565b91505f611104565b91506110ad6110a2565b6111299193505f90610a76565b5f915f611034565b82516001600160a01b031684528694506020938401939092019160010161100d565b634e487b7160e01b5f52603260045260245ffd5b905092610f1e565b50811515610f16565b5050505050565b508315610ed1565b90501691610ec6565b82821694610ebd565b50906020813d6020116111dc575b816111b460209383610a76565b810103126101635751906001600160a01b0382168203610163576001600160701b0391610e9c565b3d91506111a7565b6040513d5f823e3d90fd5b935090506060833d606011611245575b8161120c60609383610a76565b810103126101635761121d83610dda565b90604061122c60208601610dda565b94015163ffffffff811603610163579092906020610e75565b3d91506111ff565b505056fea2646970667358221220dc3221b0ccee5f14dded5a8bd7ffd3ebee6ce281fa1f4adf17ca062fadc5c26364736f6c634300081a0033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| no token transfers for this address yet | |||||||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x05693b…7a641a | 36 days agoFri, 10 Jul 2026 18:01:53 UTC | Transfer | [0] 0x000000000000…93117b2d [1] 0x000000000000…f3a35e4d data: 0x000000000000000000…af1bcb3d |
| 0xc98911…04b919 | 36 days agoFri, 10 Jul 2026 18:01:47 UTC | Approval | [0] 0x000000000000…93117b2d [1] 0x000000000000…f3a35e4d data: 0x000000000000000000…af1bcb3d |
| 0xfbb5a5…7f9e77 | 36 days agoFri, 10 Jul 2026 18:01:15 UTC | Transfer | [0] 0x000000000000…9da80784 [1] 0x000000000000…f3a35e4d data: 0x000000000000000000…ca7b1d32 |
| 0xc8f772…56d6d7 | 36 days agoFri, 10 Jul 2026 18:00:41 UTC | Approval | [0] 0x000000000000…9da80784 [1] 0x000000000000…f3a35e4d data: 0xffffffffffffffffff…ffffffff |
| 0x8548ea…8aa4c8 | 36 days agoFri, 10 Jul 2026 18:00:40 UTC | Transfer | [0] 0x000000000000…f3a35e4d [1] 0x000000000000…9da80784 data: 0x000000000000000000…ca7b1d32 |
| 0xf6f5ea…e71439 | 36 days agoFri, 10 Jul 2026 18:00:36 UTC | Transfer | [0] 0x000000000000…f3a35e4d [1] 0x000000000000…93117b2d data: 0x000000000000000000…af1bcb3d |
| 0xf6f5ea…e71439 | 36 days agoFri, 10 Jul 2026 18:00:36 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…f3a35e4d data: 0x000000000000000000…e8000000 |
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| no internal transactions found for this address yet (traced blocks + on-demand) | ||||||||
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xc98911…04b919 | Approve | 6,279,599 | 36 days agoFri, 10 Jul 2026 18:01:47 UTC | 0x5693…7b2d | IN | RobinCraft | $0.000 ETH | 0.00001401 | |
| 0xc8f772…56d6d7 | Approve | 6,278,945 | 36 days agoFri, 10 Jul 2026 18:00:41 UTC | 0xb7b2…0784 | IN | RobinCraft | $0.000 ETH | 0.00001422 |