// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {IUniswapV3Factory} from "./interfaces/IExternal.sol";
import {IUniswapV3PoolImmutablesLike} from "./interfaces/IRainLaunch.sol";
contract RainLaunchToken is ERC20 {
struct Socials {
string twitter;
string telegram;
string discord;
string website;
string farcaster;
}
error LaunchBlockBuyBlocked(address recipient);
error MaxWalletExceeded(address account, uint256 balance, uint256 limit);
error NotLaunchFactory();
error ZeroAddress();
address public immutable deployer;
address public immutable launchFactory;
address public immutable dexFactory;
address public immutable positionManager;
address public immutable pairToken;
uint24 public immutable poolFee;
uint256 public immutable launchBlock;
uint256 public immutable restrictionBlocks;
uint256 public immutable restrictionEndBlock;
uint16 public immutable maxWalletBps;
string public logo;
string public description;
Socials private _socials;
address private _initialBuyRecipient;
constructor(
string memory name_,
string memory symbol_,
string memory logo_,
string memory description_,
Socials memory socials_,
address deployer_,
address dexFactory_,
address positionManager_,
address pairToken_,
uint24 poolFee_,
uint256 supply_,
uint16 maxWalletBps_,
uint32 restrictionBlocks_
) ERC20(name_, symbol_) {
if (
deployer_ == address(0) || dexFactory_ == address(0) || positionManager_ == address(0)
|| pairToken_ == address(0)
) {
revert ZeroAddress();
}
deployer = deployer_;
launchFactory = msg.sender;
dexFactory = dexFactory_;
positionManager = positionManager_;
pairToken = pairToken_;
poolFee = poolFee_;
launchBlock = block.number;
restrictionBlocks = restrictionBlocks_;
restrictionEndBlock = block.number + restrictionBlocks_;
maxWalletBps = maxWalletBps_;
logo = logo_;
description = description_;
_socials = socials_;
_mint(msg.sender, supply_);
}
function liquidityPool() public view returns (address) {
return IUniswapV3Factory(dexFactory).getPool(address(this), pairToken, poolFee);
}
function socials()
external
view
returns (
string memory twitter,
string memory telegram,
string memory discord,
string memory website,
string memory farcaster
)
{
Socials memory values = _socials;
return (values.twitter, values.telegram, values.discord, values.website, values.farcaster);
}
function getTokenInfo()
external
view
returns (
address tokenDeployer,
string memory tokenLogo,
string memory tokenDescription,
Socials memory tokenSocials
)
{
return (deployer, logo, description, _socials);
}
function maxWalletLimit() public view returns (uint256) {
return (totalSupply() * maxWalletBps) / 10_000;
}
function maxWalletAmount() external view returns (uint256) {
return maxWalletLimit();
}
/// The address whose holdings the launch-window cap is enforced against — ALWAYS the actual
/// token recipient. It previously returned tx.origin for contract recipients (K84), but that
/// let a contract buy-and-HOLD past the cap: the cap read balanceOf(tx.origin), which stayed
/// ~0 while the tokens piled up in the contract. Keying on the recipient bounds the address
/// that truly holds the tokens. RainSwapper reads this to size partial-fill room, so the
/// token and the swapper stay in lock-step.
function restrictionKeyOf(address recipient) public pure returns (address) {
return recipient;
}
function setInitialBuyRecipient(address recipient) external {
if (msg.sender != launchFactory) revert NotLaunchFactory();
_initialBuyRecipient = recipient;
}
function _update(address from, address to, uint256 value) internal override {
if (from != address(0) && to != address(0) && block.number <= restrictionEndBlock) {
bool isRestrictedBuy = _isPairPool(from);
if (!isRestrictedBuy) {
super._update(from, to, value);
return;
}
bool isAtomicLaunchBuy =
block.number == launchBlock && _initialBuyRecipient != address(0) && to == _initialBuyRecipient;
if (!isAtomicLaunchBuy && block.number == launchBlock) {
revert LaunchBlockBuyBlocked(to);
}
if (!isAtomicLaunchBuy) {
address key = restrictionKeyOf(to);
// The ONE launch-window rule: the RECIPIENT may never HOLD more than maxWallet
// (2%). Checked against the recipient's live balance, so selling frees the room
// again — buy 2% -> sell -> buy 2% works. Keying on the recipient (not tx.origin)
// means a contract that buys and keeps the tokens is bounded by its own balance.
uint256 walletLimit = maxWalletLimit();
uint256 resultingBalance = balanceOf(key) + value;
if (resultingBalance > walletLimit) {
revert MaxWalletExceeded(key, resultingBalance, walletLimit);
}
}
}
super._update(from, to, value);
}
function _isPairPool(address candidate) private view returns (bool) {
address canonicalPool = liquidityPool();
if (candidate == canonicalPool && canonicalPool != address(0)) return true;
if (candidate.code.length == 0) return false;
(bool feeRead, bytes memory feeData) =
candidate.staticcall(abi.encodeCall(IUniswapV3PoolImmutablesLike.fee, ()));
if (!feeRead || feeData.length < 32) return false;
uint24 candidateFee = abi.decode(feeData, (uint24));
return IUniswapV3Factory(dexFactory).getPool(address(this), pairToken, candidateFee) == candidate;
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "name_",
"type": "string",
"internalType": "string"
},
{
"name": "symbol_",
"type": "string",
"internalType": "string"
},
{
"name": "logo_",
"type": "string",
"internalType": "string"
},
{
"name": "description_",
"type": "string",
"internalType": "string"
},
{
"name": "socials_",
"type": "tuple",
"components": [
{
"name": "twitter",
"type": "string",
"internalType": "string"
},
{
"name": "telegram",
"type": "string",
"internalType": "string"
},
{
"name": "discord",
"type": "string",
"internalType": "string"
},
{
"name": "website",
"type": "string",
"internalType": "string"
},
{
"name": "farcaster",
"type": "string",
"internalType": "string"
}
],
"internalType": "struct RainLaunchToken.Socials"
},
{
"name": "deployer_",
"type": "address",
"internalType": "address"
},
{
"name": "dexFactory_",
"type": "address",
"internalType": "address"
},
{
"name": "positionManager_",
"type": "address",
"internalType": "address"
},
{
"name": "pairToken_",
"type": "address",
"internalType": "address"
},
{
"name": "poolFee_",
"type": "uint24",
"internalType": "uint24"
},
{
"name": "supply_",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "maxWalletBps_",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "restrictionBlocks_",
"type": "uint32",
"internalType": "uint32"
}
],
"stateMutability": "nonpayable"
},
{
"name": "ERC20InsufficientAllowance",
"type": "error",
"inputs": [
{
"name": "spender",
"type": "address",
"internalType": "address"
},
{
"name": "allowance",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "needed",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ERC20InsufficientBalance",
"type": "error",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
},
{
"name": "balance",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "needed",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ERC20InvalidApprover",
"type": "error",
"inputs": [
{
"name": "approver",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC20InvalidReceiver",
"type": "error",
"inputs": [
{
"name": "receiver",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC20InvalidSender",
"type": "error",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC20InvalidSpender",
"type": "error",
"inputs": [
{
"name": "spender",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "LaunchBlockBuyBlocked",
"type": "error",
"inputs": [
{
"name": "recipient",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "MaxWalletExceeded",
"type": "error",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
},
{
"name": "balance",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "limit",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "NotLaunchFactory",
"type": "error",
"inputs": []
},
{
"name": "ZeroAddress",
"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": "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": "owner",
"type": "address",
"internalType": "address"
},
{
"name": "spender",
"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": "account",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "decimals",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"stateMutability": "view"
},
{
"name": "deployer",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "description",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "dexFactory",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "getTokenInfo",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "tokenDeployer",
"type": "address",
"internalType": "address"
},
{
"name": "tokenLogo",
"type": "string",
"internalType": "string"
},
{
"name": "tokenDescription",
"type": "string",
"internalType": "string"
},
{
"name": "tokenSocials",
"type": "tuple",
"components": [
{
"name": "twitter",
"type": "string",
"internalType": "string"
},
{
"name": "telegram",
"type": "string",
"internalType": "string"
},
{
"name": "discord",
"type": "string",
"internalType": "string"
},
{
"name": "website",
"type": "string",
"internalType": "string"
},
{
"name": "farcaster",
"type": "string",
"internalType": "string"
}
],
"internalType": "struct RainLaunchToken.Socials"
}
],
"stateMutability": "view"
},
{
"name": "launchBlock",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "launchFactory",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "liquidityPool",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "logo",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "maxWalletAmount",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "maxWalletBps",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "maxWalletLimit",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "name",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "pairToken",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "poolFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint24",
"internalType": "uint24"
}
],
"stateMutability": "view"
},
{
"name": "positionManager",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "restrictionBlocks",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "restrictionEndBlock",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "restrictionKeyOf",
"type": "function",
"inputs": [
{
"name": "recipient",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "pure"
},
{
"name": "setInitialBuyRecipient",
"type": "function",
"inputs": [
{
"name": "recipient",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "socials",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "twitter",
"type": "string",
"internalType": "string"
},
{
"name": "telegram",
"type": "string",
"internalType": "string"
},
{
"name": "discord",
"type": "string",
"internalType": "string"
},
{
"name": "website",
"type": "string",
"internalType": "string"
},
{
"name": "farcaster",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"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"
}
]0x60806040526004361015610011575f80fd5b5f3560e01c806306fdde03146109ca5780630861ac6114610990578063089fe6aa14610951578063095ea7b3146108cf57806312f16a071461089157806318160ddd1461087457806323b872dd14610795578063313ce5671461077a5780633de35b79146107365780635302bf241461071b578063536dac9b146106d757806353cd512a1461064b578063665a11ca1461061f57806366a88d96146103e557806370a08231146105e857806370bffe1b1461056e5780637284e41614610553578063791b98bc1461050f57806395d89b411461041b578063a9059cbb146103ea578063aa4bde28146103e5578063abb1dc44146102d0578063b8d8fbb41461028c578063baed076514610252578063d00efb2f14610218578063d5f39488146101d4578063dd62ed3e146101845763fb7f21eb1461014d575f80fd5b34610180575f3660031901126101805761017c610168610c17565b604051918291602083526020830190610a85565b0390f35b5f80fd5b346101805760403660031901126101805761019d610aa9565b6101a5610abf565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b34610180575f366003190112610180576040517f000000000000000000000000bcb0d713d77d0f415c9bd924761679677c7e20326001600160a01b03168152602090f35b34610180575f3660031901126101805760206040517f00000000000000000000000000000000000000000000000000000000018646268152f35b34610180575f3660031901126101805760206040517f00000000000000000000000000000000000000000000000000000000000000968152f35b34610180575f366003190112610180576040517f0000000000000000000000001f7d7550b1b028f7571e69a784071f0205fd2efa6001600160a01b03168152602090f35b34610180575f36600319011261018057606060806040516102f081610af7565b8281528260208201528260408201528280820152015261036a610311610c17565b61017c61031c610b49565b610378610327610d79565b9160405195869560018060a01b037f000000000000000000000000bcb0d713d77d0f415c9bd924761679677c7e2032168752608060208801526080870190610a85565b908582036040870152610a85565b838103606085015260806103d46103c26103b061039e865160a0875260a0870190610a85565b60208701518682036020880152610a85565b60408601518582036040870152610a85565b60608501518482036060860152610a85565b920151906080818403910152610a85565b610ad5565b3461018057604036600319011261018057610410610406610aa9565b6024359033610f30565b602060405160018152f35b34610180575f366003190112610180576040515f6004548060011c90600181168015610505575b6020831081146104f1578285529081156104cd575060011461046f575b61017c8361016881850382610b27565b60045f9081527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b939250905b8082106104b35750909150810160200161016861045f565b91926001816020925483858801015201910190929161049b565b60ff191660208086019190915291151560051b84019091019150610168905061045f565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610442565b34610180575f366003190112610180576040517f00000000000000000000000073991a25c818bf1f1128deaab1492d45638de0d36001600160a01b03168152602090f35b34610180575f3660031901126101805761017c610168610b49565b3461018057602036600319011261018057610587610aa9565b7f000000000000000000000000e67bef2a23384e05139184c76b0a77f2e9acb29f6001600160a01b031633036105d957600c80546001600160a01b0319166001600160a01b0392909216919091179055005b639f5f2caf60e01b5f5260045ffd5b34610180576020366003190112610180576001600160a01b03610609610aa9565b165f525f602052602060405f2054604051908152f35b34610180575f366003190112610180576020610639610df0565b6040516001600160a01b039091168152f35b34610180575f3660031901126101805761069f610666610d79565b61017c8151916106c96020820151916106bb60408201516106ad6080606085015194015195604051998a9960a08b5260a08b0190610a85565b9089820360208b0152610a85565b908782036040890152610a85565b908582036060870152610a85565b908382036080850152610a85565b34610180575f366003190112610180576040517f000000000000000000000000e67bef2a23384e05139184c76b0a77f2e9acb29f6001600160a01b03168152602090f35b34610180576020366003190112610180576020610639610aa9565b34610180575f366003190112610180576040517f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b03168152602090f35b34610180575f36600319011261018057602060405160128152f35b34610180576060366003190112610180576107ae610aa9565b6107b6610abf565b6001600160a01b0382165f818152600160209081526040808320338452909152902054909260443592915f1981106107f4575b506104109350610f30565b83811061085957841561084657331561083357610410945f52600160205260405f2060018060a01b0333165f526020528360405f2091039055846107e9565b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b8390637dc7a0d960e11b5f523360045260245260445260645ffd5b34610180575f366003190112610180576020600254604051908152f35b34610180575f36600319011261018057602060405161ffff7f00000000000000000000000000000000000000000000000000000000000000c8168152f35b34610180576040366003190112610180576108e8610aa9565b602435903315610846576001600160a01b031690811561083357335f52600160205260405f20825f526020528060405f20556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b34610180575f36600319011261018057602060405162ffffff7f0000000000000000000000000000000000000000000000000000000000002710168152f35b34610180575f3660031901126101805760206040517f00000000000000000000000000000000000000000000000000000000018646bc8152f35b34610180575f366003190112610180576040515f6003548060011c90600181168015610a7b575b6020831081146104f1578285529081156104cd5750600114610a1d5761017c8361016881850382610b27565b60035f9081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b939250905b808210610a615750909150810160200161016861045f565b919260018160209254838588010152019101909291610a49565b91607f16916109f1565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361018057565b602435906001600160a01b038216820361018057565b34610180575f366003190112610180576020610aef610edb565b604051908152f35b60a0810190811067ffffffffffffffff821117610b1357604052565b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff821117610b1357604052565b604051905f6006548060011c9160018216918215610c0d575b6020841083146104f1578386528592908115610bee5750600114610b8f575b610b8d92500383610b27565b565b5060065f90815290917ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f5b818310610bd2575050906020610b8d92820101610b81565b6020919350806001915483858901015201910190918492610bba565b60209250610b8d94915060ff191682840152151560051b820101610b81565b92607f1692610b62565b604051905f6005548060011c9160018216918215610cb9575b6020841083146104f1578386528592908115610bee5750600114610c5a57610b8d92500383610b27565b5060055f90815290917f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db05b818310610c9d575050906020610b8d92820101610b81565b6020919350806001915483858901015201910190918492610c85565b92607f1692610c30565b90604051915f8154908160011c9260018316928315610d6f575b6020851084146104f1578487528693908115610d4d5750600114610d09575b50610b8d92500383610b27565b90505f9291925260205f20905f915b818310610d31575050906020610b8d928201015f610cfc565b6020919350806001915483858901015201910190918492610d18565b905060209250610b8d94915060ff191682840152151560051b8201015f610cfc565b93607f1693610cdd565b60405190610d8682610af7565b81610d916007610cc3565b8152610d9d6008610cc3565b6020820152610dac6009610cc3565b6040820152610dbb600a610cc3565b60608201526080610dcc600b610cc3565b910152565b9081602091031261018057516001600160a01b03811681036101805790565b604051630b4c774160e11b81523060048201526001600160a01b037f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad7316602482015262ffffff7f0000000000000000000000000000000000000000000000000000000000002710166044820152602081806064810103817f0000000000000000000000001f7d7550b1b028f7571e69a784071f0205fd2efa6001600160a01b03165afa908115610ed0575f91610ea4575090565b610ec6915060203d602011610ec9575b610ebe8183610b27565b810190610dd1565b90565b503d610eb4565b6040513d5f823e3d90fd5b60025461ffff7f00000000000000000000000000000000000000000000000000000000000000c81690818102918183041490151715610f1c57612710900490565b634e487b7160e01b5f52601160045260245ffd5b91906001600160a01b03831615610f6c576001600160a01b03811615610f5957610b8d92610f8c565b63ec442f0560e01b5f525f60045260245ffd5b634b637e8f60e11b5f525f60045260245ffd5b91908201809211610f1c57565b9291906001600160a01b0384161515806110d9575b806110af575b610fb6575b610b8d9293611291565b610fbf846110eb565b15610fac57437f000000000000000000000000000000000000000000000000000000000186462614808061109b575b80611084575b158091819261107c575b5061105b5715610fac57611010610edb565b9360018060a01b038216805f525f60205261102f8460405f2054610f7f565b908682116110405750509350610fac565b8692506304a43e8b60e51b5f5260045260245260445260645ffd5b506385234f9760e01b5f9081526001600160a01b0391909116600452602490fd5b90505f610ffe565b50600c546001600160a01b03838116911614610ff4565b50600c546001600160a01b03161515610fee565b507f00000000000000000000000000000000000000000000000000000000018646bc431115610fa7565b506001600160a01b0381161515610fa1565b6001600160a01b036110fb610df0565b6001600160a01b0383169291168281149081611287575b5061128057803b15611267575f8091604051602081019063ddca3f4360e01b825260048152611142602482610b27565b51915afa3d15611278573d9067ffffffffffffffff8211610b135760405191611175601f8201601f191660200184610b27565b82523d5f602084013e5b15801561126d575b61126757602081805181010312610180576020015162ffffff8116810361018057604051630b4c774160e11b81523060048201526001600160a01b037f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad7316602482015262ffffff9091166044820152602081806064810103817f0000000000000000000000001f7d7550b1b028f7571e69a784071f0205fd2efa6001600160a01b03165afa908115610ed0575f91611248575b506001600160a01b03161490565b611261915060203d602011610ec957610ebe8183610b27565b5f61123a565b50505f90565b506020815110611187565b60609061117f565b5050600190565b905015155f611112565b6001600160a01b0316908161130a5760207fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef916112d085600254610f7f565b6002555b6001600160a01b031693846112f55780600254036002555b604051908152a3565b845f525f825260405f208181540190556112ec565b815f525f60205260405f2054838110611354577fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9184602092855f525f84520360405f20556112d4565b91905063391434e360e21b5f5260045260245260445260645ffdfea2646970667358221220ff9f37b9f3f70608faf8394d1b02a8e1b13db3cc3a0e388ad741ec48009b05ca64736f6c634300081c0033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x6bddad…da5c20 | Approve | 15,080,391 | 26 days agoMon, 20 Jul 2026 23:01:43 UTC | 0xbcb0…2032 | IN | H | $0.000 ETH | 0.00000265 |
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| no token transfers for this address yet | |||||||||
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x526c67…1ea125 | 26 days agoMon, 20 Jul 2026 23:02:06 UTC | Transfer | [0] 0x000000000000…f02a66d3 [1] 0x000000000000…0000dead data: 0x000000000000000000…0122b2fc |
| 0x526c67…1ea125 | 26 days agoMon, 20 Jul 2026 23:02:06 UTC | Transfer | [0] 0x000000000000…ee8ac8d9 [1] 0x000000000000…f02a66d3 data: 0x000000000000000000…0122b2fc |
| 0xaa6a65…c4da84 | 26 days agoMon, 20 Jul 2026 23:01:45 UTC | Transfer | [0] 0x000000000000…918c0529 [1] 0x000000000000…ee8ac8d9 data: 0x000000000000000000…718dea7f |
| 0xaa6a65…c4da84 | 26 days agoMon, 20 Jul 2026 23:01:45 UTC | Transfer | [0] 0x000000000000…7c7e2032 [1] 0x000000000000…918c0529 data: 0x000000000000000000…718dea7f |
| 0x6bddad…da5c20 | 26 days agoMon, 20 Jul 2026 23:01:43 UTC | Approval | [0] 0x000000000000…7c7e2032 [1] 0x000000000000…918c0529 data: 0x000000000000000000…718dea7f |
| 0x2db224…d04042 | 26 days agoMon, 20 Jul 2026 22:45:53 UTC | Transfer | [0] 0x000000000000…ee8ac8d9 [1] 0x000000000000…7c7e2032 data: 0x000000000000000000…718dea7f |
| 0x2db224…d04042 | 26 days agoMon, 20 Jul 2026 22:45:53 UTC | Transfer | [0] 0x000000000000…e9acb29f [1] 0x000000000000…0000dead data: 0x000000000000000000…00002fe8 |
| 0x2db224…d04042 | 26 days agoMon, 20 Jul 2026 22:45:53 UTC | Approval | [0] 0x000000000000…e9acb29f [1] 0x000000000000…638de0d3 data: 0x000000000000000000…00000000 |
| 0x2db224…d04042 | 26 days agoMon, 20 Jul 2026 22:45:53 UTC | Transfer | [0] 0x000000000000…e9acb29f [1] 0x000000000000…ee8ac8d9 data: 0x000000000000000000…e7ffd018 |
| 0x2db224…d04042 | 26 days agoMon, 20 Jul 2026 22:45:53 UTC | Approval | [0] 0x000000000000…e9acb29f [1] 0x000000000000…638de0d3 data: 0x000000000000000000…e8000000 |
| 0x2db224…d04042 | 26 days agoMon, 20 Jul 2026 22:45:53 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…e9acb29f 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 | |
|---|---|---|---|---|---|---|---|---|
| 15,070,893 | 26 days agoMon, 20 Jul 2026 22:45:53 UTC | 0x2db224…d04042 | CREATE2 | launchToken | 0xe67b…b29f | IN | 0x986b…87d2 | 0 ETH |