| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
interface IERC20V2 {
function approve(address spender, uint256 amount) external returns (bool);
function transfer(address to, uint256 amount) external returns (bool);
}
interface IERC1271V2 {
function isValidSignature(bytes32 hash, bytes calldata signature) external view returns (bytes4 magicValue);
}
interface IUniswapV3PoolV2 {
function slot0() external view returns (uint160, int24);
function liquidity() external view returns (uint128);
}
interface INonfungiblePositionManagerV2 {
struct MintParams {
address token0; address token1; uint24 fee; int24 tickLower; int24 tickUpper;
uint256 amount0Desired; uint256 amount1Desired; uint256 amount0Min; uint256 amount1Min;
address recipient; uint256 deadline;
}
function createAndInitializePoolIfNecessary(address, address, uint24, uint160) external payable returns (address);
function mint(MintParams calldata) external payable returns (uint256, uint128, uint256, uint256);
}
contract SilkPadTokenV2 is IERC20V2 {
string public name;
string public symbol;
uint8 public constant decimals = 18;
uint256 public immutable totalSupply;
mapping(address => uint256) public balanceOf;
mapping(address => mapping(address => uint256)) public allowance;
event Transfer(address indexed from, address indexed to, uint256 amount);
event Approval(address indexed owner, address indexed spender, uint256 amount);
constructor(string memory name_, string memory symbol_, uint256 supply_, address receiver_) {
name = name_; symbol = symbol_; totalSupply = supply_; balanceOf[receiver_] = supply_;
emit Transfer(address(0), receiver_, supply_);
}
function approve(address spender, uint256 amount) external returns (bool) {
allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true;
}
function transfer(address to, uint256 amount) external returns (bool) { _transfer(msg.sender, to, amount); return true; }
function transferFrom(address from, address to, uint256 amount) external returns (bool) {
uint256 permitted = allowance[from][msg.sender];
if (permitted != type(uint256).max) { require(permitted >= amount, "ALLOWANCE"); allowance[from][msg.sender] = permitted - amount; }
_transfer(from, to, amount); return true;
}
function _transfer(address from, address to, uint256 amount) internal {
require(to != address(0), "ZERO_ADDRESS"); require(balanceOf[from] >= amount, "BALANCE");
unchecked { balanceOf[from] -= amount; balanceOf[to] += amount; }
emit Transfer(from, to, amount);
}
}
/// @notice Timelocked allowlist for canonical quote assets. A delayed two-step
/// update prevents an operator key from instantly substituting a fake stock.
contract SilkQuoteRegistryV2 {
struct Quote { bytes12 symbol; uint8 decimals; uint64 enabledAt; bool stockToken; bool disabled; }
uint64 public immutable updateDelay;
address public owner;
address public pendingOwner;
mapping(address => Quote) private quotes;
mapping(address => Quote) private pendingQuotes;
event QuoteScheduled(address indexed token, bytes12 symbol, uint8 decimals, bool stockToken, uint64 enabledAt);
event QuoteActivated(address indexed token, bytes12 symbol, uint8 decimals, bool stockToken);
event QuoteDisabled(address indexed token);
event OwnershipTransferStarted(address indexed pendingOwner);
event OwnershipTransferred(address indexed owner);
constructor(address owner_, uint64 updateDelay_) {
require(owner_ != address(0), "ZERO_OWNER"); require(updateDelay_ >= 1 hours && updateDelay_ <= 30 days, "UPDATE_DELAY");
owner = owner_; updateDelay = updateDelay_;
}
modifier onlyOwner() { require(msg.sender == owner, "OWNER_ONLY"); _; }
function scheduleQuote(address token, bytes12 symbol, uint8 decimals, bool stockToken) external onlyOwner {
require(token.code.length != 0, "INVALID_TOKEN"); require(symbol != bytes12(0), "EMPTY_SYMBOL"); require(decimals <= 18, "DECIMALS");
uint64 enabledAt = uint64(block.timestamp) + updateDelay;
pendingQuotes[token] = Quote(symbol, decimals, enabledAt, stockToken, false);
emit QuoteScheduled(token, symbol, decimals, stockToken, enabledAt);
}
function activateQuote(address token) external {
Quote memory item = pendingQuotes[token];
require(item.symbol != bytes12(0) && block.timestamp >= item.enabledAt, "QUOTE_DELAY");
quotes[token] = Quote(item.symbol, item.decimals, item.enabledAt, item.stockToken, false);
delete pendingQuotes[token]; emit QuoteActivated(token, item.symbol, item.decimals, item.stockToken);
}
function disableQuote(address token) external onlyOwner { quotes[token].disabled = true; emit QuoteDisabled(token); }
function quote(address token) external view returns (Quote memory) { return quotes[token]; }
function pendingQuote(address token) external view returns (Quote memory) { return pendingQuotes[token]; }
function isEnabled(address token) public view returns (bool) {
Quote memory item = quotes[token]; return item.symbol != bytes12(0) && !item.disabled && block.timestamp >= item.enabledAt;
}
function transferOwnership(address next) external onlyOwner { require(next != address(0), "ZERO_OWNER"); pendingOwner = next; emit OwnershipTransferStarted(next); }
function acceptOwnership() external { require(msg.sender == pendingOwner, "PENDING_OWNER_ONLY"); owner = msg.sender; pendingOwner = address(0); emit OwnershipTransferred(msg.sender); }
}
/// @notice EIP-1271 adapter that gives the factory an immutable verification
/// address while allowing a governance-controlled, delayed signer rotation and
/// immediate incident pause.
contract SilkPriceAuthorityV2 is IERC1271V2 {
bytes4 private constant MAGIC = IERC1271V2.isValidSignature.selector;
uint64 public immutable updateDelay;
address public owner;
address public pendingOwner;
address public signer;
address public pendingSigner;
uint64 public signerActivatesAt;
bool public paused;
event SignerScheduled(address indexed signer, uint64 activatesAt);
event SignerActivated(address indexed signer);
event PauseChanged(bool paused);
event OwnershipTransferStarted(address indexed pendingOwner);
event OwnershipTransferred(address indexed owner);
constructor(address owner_, address signer_, uint64 updateDelay_) {
require(owner_ != address(0) && signer_ != address(0), "ZERO_ADDRESS");
require(updateDelay_ >= 1 hours && updateDelay_ <= 30 days, "UPDATE_DELAY");
owner = owner_; signer = signer_; updateDelay = updateDelay_;
}
modifier onlyOwner() { require(msg.sender == owner, "OWNER_ONLY"); _; }
function scheduleSigner(address next) external onlyOwner {
require(next != address(0), "ZERO_SIGNER"); pendingSigner = next; signerActivatesAt = uint64(block.timestamp) + updateDelay;
emit SignerScheduled(next, signerActivatesAt);
}
function activateSigner() external {
require(pendingSigner != address(0) && block.timestamp >= signerActivatesAt, "SIGNER_DELAY");
signer = pendingSigner; pendingSigner = address(0); signerActivatesAt = 0; emit SignerActivated(signer);
}
function setPaused(bool value) external onlyOwner { paused = value; emit PauseChanged(value); }
function transferOwnership(address next) external onlyOwner { require(next != address(0), "ZERO_OWNER"); pendingOwner = next; emit OwnershipTransferStarted(next); }
function acceptOwnership() external { require(msg.sender == pendingOwner, "PENDING_OWNER_ONLY"); owner = msg.sender; pendingOwner = address(0); emit OwnershipTransferred(msg.sender); }
function isValidSignature(bytes32 digest, bytes calldata signature) external view returns (bytes4) {
return !paused && _recover(digest, signature) == signer ? MAGIC : bytes4(0xffffffff);
}
function _recover(bytes32 digest, bytes calldata signature) private pure returns (address) {
if (signature.length != 65) return address(0); bytes32 r; bytes32 s; uint8 v;
assembly { r := calldataload(signature.offset) s := calldataload(add(signature.offset, 32)) v := byte(0, calldataload(add(signature.offset, 64))) }
if (v < 27) v += 27; if (v != 27 && v != 28) return address(0);
if (uint256(s) > 0x7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0) return address(0);
return ecrecover(digest, v, r, s);
}
}
/// @notice Creates fixed-supply tokens with token-only, permanently locked
/// Uniswap V3 liquidity against an approved quote asset. Opening price and
/// range are authorized offchain and bound to every launch field, caller,
/// chain, factory, nonce and deadline.
contract SilkPadMultiQuoteFactoryV2 {
struct Launch {
address token; address quoteToken; address pool; address creator; string name; string symbol;
string imageURI; string description; uint256 totalSupply; uint256 creatorAllocation; uint256 createdAt;
}
struct Authorization {
address creator; address quoteToken; bytes32 launchHash;
uint160 token0SqrtPriceX96; int24 token0TickLower; int24 token0StartTick; int24 token0TickUpper;
uint160 token1SqrtPriceX96; int24 token1TickLower; int24 token1StartTick; int24 token1TickUpper;
uint64 deadline; uint256 nonce;
}
bytes32 private constant AUTH_TYPEHASH = keccak256("SilkPadLaunch(address creator,address quoteToken,bytes32 launchHash,uint160 token0SqrtPriceX96,int24 token0TickLower,int24 token0StartTick,int24 token0TickUpper,uint160 token1SqrtPriceX96,int24 token1TickLower,int24 token1StartTick,int24 token1TickUpper,uint64 deadline,uint256 nonce,uint256 chainId,address factory)");
INonfungiblePositionManagerV2 public immutable positionManager;
SilkQuoteRegistryV2 public immutable quoteRegistry;
address public immutable priceSigner;
address payable public immutable feeReceiver;
uint24 public immutable poolFee;
int24 public immutable tickSpacing;
uint256 public immutable launchFee;
uint64 public immutable maxAuthorizationLifetime;
Launch[] private launches;
mapping(uint256 => uint256) public positionIdByLaunch;
mapping(address => mapping(uint256 => bool)) public nonceUsed;
uint256 public accruedFees;
bool private entered;
event LaunchCreated(uint256 indexed launchId, address indexed token, address indexed quoteToken, address pool, address creator, uint256 positionId, uint128 liquidity);
modifier nonReentrant() { require(!entered, "REENTRANCY"); entered = true; _; entered = false; }
constructor(address manager, address registry, address signer, address payable receiver, uint24 fee, int24 spacing, uint256 feeWei, uint64 maxLifetime) {
require(manager.code.length != 0 && registry.code.length != 0, "INVALID_CONTRACT");
require(signer != address(0) && receiver != address(0), "ZERO_ADDRESS");
require(spacing > 0 && fee != 0 && maxLifetime >= 30 && maxLifetime <= 30 minutes, "CONFIG");
positionManager = INonfungiblePositionManagerV2(manager); quoteRegistry = SilkQuoteRegistryV2(registry);
priceSigner = signer; feeReceiver = receiver; poolFee = fee; tickSpacing = spacing; launchFee = feeWei; maxAuthorizationLifetime = maxLifetime;
}
function getLaunchCount() external view returns (uint256) { return launches.length; }
function getLaunch(uint256 id) external view returns (Launch memory) { return launches[id]; }
function launchHash(string calldata name, string calldata symbol, string calldata imageURI, string calldata description, uint256 supply, uint256 creatorBps) public pure returns (bytes32) {
return keccak256(abi.encode(keccak256(bytes(name)), keccak256(bytes(symbol)), keccak256(bytes(imageURI)), keccak256(bytes(description)), supply, creatorBps));
}
function authorizationBodyHash(Authorization calldata auth) public view returns (bytes32) {
return keccak256(abi.encode(AUTH_TYPEHASH, auth.creator, auth.quoteToken, auth.launchHash,
auth.token0SqrtPriceX96, auth.token0TickLower, auth.token0StartTick, auth.token0TickUpper,
auth.token1SqrtPriceX96, auth.token1TickLower, auth.token1StartTick, auth.token1TickUpper,
auth.deadline, auth.nonce, block.chainid, address(this)));
}
function authorizationDigest(Authorization calldata auth) public view returns (bytes32) {
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", authorizationBodyHash(auth)));
}
function createLaunch(
string calldata name, string calldata symbol, string calldata imageURI, string calldata description,
uint256 totalSupply, uint256 creatorAllocationBps, Authorization calldata auth, bytes calldata signature
) external payable nonReentrant returns (uint256 launchId, address tokenAddress, address pool, uint256 positionId) {
require(msg.value == launchFee, "LAUNCH_FEE"); require(quoteRegistry.isEnabled(auth.quoteToken), "QUOTE_DISABLED");
require(auth.creator == msg.sender, "CREATOR"); require(auth.launchHash == launchHash(name, symbol, imageURI, description, totalSupply, creatorAllocationBps), "LAUNCH_HASH");
require(auth.deadline >= block.timestamp && auth.deadline <= block.timestamp + maxAuthorizationLifetime, "AUTH_DEADLINE");
require(!nonceUsed[msg.sender][auth.nonce], "NONCE_USED"); require(_validPriceSignature(authorizationDigest(auth), signature), "PRICE_SIGNATURE");
require(auth.token0SqrtPriceX96 != 0 && auth.token1SqrtPriceX96 != 0, "PRICE_RANGE");
// A token0-only position starts at its lower boundary; a token1-only
// position starts at its upper boundary. Requiring an interior start
// tick would silently require some of the quote asset at mint time.
require(auth.token0TickLower == auth.token0StartTick && auth.token0StartTick < auth.token0TickUpper, "PRICE_RANGE");
require(auth.token1TickLower < auth.token1StartTick && auth.token1StartTick == auth.token1TickUpper, "PRICE_RANGE");
require(auth.token0TickLower % tickSpacing == 0 && auth.token0StartTick % tickSpacing == 0 && auth.token0TickUpper % tickSpacing == 0, "TICK_SPACING");
require(auth.token1TickLower % tickSpacing == 0 && auth.token1StartTick % tickSpacing == 0 && auth.token1TickUpper % tickSpacing == 0, "TICK_SPACING");
require(bytes(name).length != 0 && bytes(name).length <= 48, "NAME"); require(_validSymbol(symbol), "SYMBOL");
require(bytes(imageURI).length <= 500 && bytes(description).length <= 500, "METADATA");
require(totalSupply > 0 && totalSupply <= type(uint128).max, "SUPPLY"); require(creatorAllocationBps <= 2_000, "CREATOR_ALLOCATION");
nonceUsed[msg.sender][auth.nonce] = true;
SilkPadTokenV2 token = new SilkPadTokenV2(name, symbol, totalSupply, address(this)); tokenAddress = address(token);
uint256 allocation = totalSupply * creatorAllocationBps / 10_000; uint256 liquidityTokens = totalSupply - allocation;
if (allocation != 0) require(token.transfer(msg.sender, allocation), "CREATOR_TRANSFER");
require(token.approve(address(positionManager), liquidityTokens), "APPROVE");
bool launchedIsToken0 = tokenAddress < auth.quoteToken;
address token0 = launchedIsToken0 ? tokenAddress : auth.quoteToken; address token1 = launchedIsToken0 ? auth.quoteToken : tokenAddress;
uint160 expectedPrice = launchedIsToken0 ? auth.token0SqrtPriceX96 : auth.token1SqrtPriceX96;
int24 expectedTick = launchedIsToken0 ? auth.token0StartTick : auth.token1StartTick;
int24 lowerTick = launchedIsToken0 ? auth.token0TickLower : auth.token1TickLower;
int24 upperTick = launchedIsToken0 ? auth.token0TickUpper : auth.token1TickUpper;
pool = positionManager.createAndInitializePoolIfNecessary(token0, token1, poolFee, expectedPrice);
(uint160 actualPrice, int24 actualTick) = IUniswapV3PoolV2(pool).slot0();
require(actualPrice == expectedPrice && actualTick == expectedTick, "POOL_PRICE"); require(IUniswapV3PoolV2(pool).liquidity() == 0, "POOL_NOT_EMPTY");
INonfungiblePositionManagerV2.MintParams memory params = INonfungiblePositionManagerV2.MintParams({
token0: token0, token1: token1, fee: poolFee, tickLower: lowerTick, tickUpper: upperTick,
amount0Desired: launchedIsToken0 ? liquidityTokens : 0, amount1Desired: launchedIsToken0 ? 0 : liquidityTokens,
amount0Min: 0, amount1Min: 0, recipient: address(this), deadline: block.timestamp
});
uint128 liquidity; uint256 amount0; uint256 amount1; (positionId, liquidity, amount0, amount1) = positionManager.mint(params);
require(liquidity != 0, "NO_LIQUIDITY"); uint256 consumed = launchedIsToken0 ? amount0 : amount1;
require(consumed != 0 && consumed <= liquidityTokens, "TOKEN_DEPOSIT"); uint256 dust = liquidityTokens - consumed;
require(dust <= liquidityTokens / 1e12 + 1, "EXCESS_TOKEN_DUST"); require(token.approve(address(positionManager), 0), "REVOKE_APPROVAL");
if (dust != 0) require(token.transfer(address(0x000000000000000000000000000000000000dEaD), dust), "DUST_BURN");
launchId = launches.length; launches.push(Launch(tokenAddress, auth.quoteToken, pool, msg.sender, name, symbol, imageURI, description, totalSupply, allocation, block.timestamp));
positionIdByLaunch[launchId] = positionId; accruedFees += msg.value;
emit LaunchCreated(launchId, tokenAddress, auth.quoteToken, pool, msg.sender, positionId, liquidity);
}
function withdrawFees() external nonReentrant {
require(msg.sender == feeReceiver, "FEE_RECEIVER_ONLY"); uint256 amount = accruedFees; accruedFees = 0;
(bool paid,) = feeReceiver.call{value: amount}(""); require(paid, "FEE_TRANSFER");
}
function _recover(bytes32 digest, bytes calldata signature) private pure returns (address) {
if (signature.length != 65) return address(0); bytes32 r; bytes32 s; uint8 v;
assembly { r := calldataload(signature.offset) s := calldataload(add(signature.offset, 32)) v := byte(0, calldataload(add(signature.offset, 64))) }
if (v < 27) v += 27; if (v != 27 && v != 28) return address(0);
if (uint256(s) > 0x7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0) return address(0);
return ecrecover(digest, v, r, s);
}
function _validPriceSignature(bytes32 digest, bytes calldata signature) private view returns (bool) {
if (priceSigner.code.length == 0) return _recover(digest, signature) == priceSigner;
try IERC1271V2(priceSigner).isValidSignature(digest, signature) returns (bytes4 magicValue) {
return magicValue == IERC1271V2.isValidSignature.selector;
} catch { return false; }
}
function _validSymbol(string calldata value) private pure returns (bool) {
bytes calldata chars = bytes(value); if (chars.length < 2 || chars.length > 12) return false;
for (uint256 i; i < chars.length; ++i) { bytes1 c = chars[i]; if (!((c >= 0x41 && c <= 0x5A) || (c >= 0x30 && c <= 0x39))) return false; }
return true;
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "name_",
"type": "string",
"internalType": "string"
},
{
"name": "symbol_",
"type": "string",
"internalType": "string"
},
{
"name": "supply_",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "receiver_",
"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": "amount",
"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": "amount",
"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": "amount",
"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": "decimals",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"stateMutability": "view"
},
{
"name": "name",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"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": "amount",
"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": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
}
]0x60806040526004361015610011575f80fd5b5f3560e01c806306fdde031461040b578063095ea7b31461039357806318160ddd1461035957806323b872dd14610276578063313ce5671461025b57806370a082311461022357806395d89b4114610105578063a9059cbb146100d45763dd62ed3e1461007c575f80fd5b346100d05760403660031901126100d057610095610507565b6001600160a01b036100a561051d565b91165f5260036020526001600160a01b0360405f2091165f52602052602060405f2054604051908152f35b5f80fd5b346100d05760403660031901126100d0576100fa6100f0610507565b6024359033610533565b602060405160018152f35b346100d0575f3660031901126100d0576040515f6001548060011c90600181168015610219575b602083108114610205578285529081156101e95750600114610193575b50819003601f01601f191681019067ffffffffffffffff82118183101761017f576040829052819061017b90826104dd565b0390f35b634e487b7160e01b5f52604160045260245ffd5b60015f9081529091507fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b8282106101d357506020915082010182610149565b60018160209254838588010152019101906101be565b90506020925060ff191682840152151560051b82010182610149565b634e487b7160e01b5f52602260045260245ffd5b91607f169161012c565b346100d05760203660031901126100d0576001600160a01b03610244610507565b165f526002602052602060405f2054604051908152f35b346100d0575f3660031901126100d057602060405160128152f35b346100d05760603660031901126100d05761028f610507565b61029761051d565b604435906001600160a01b03831692835f52600360205260405f206001600160a01b0333165f5260205260405f20545f1981036102da575b506100fa9350610533565b83811061032857838103908111610314576100fa945f52600360205260405f206001600160a01b0333165f5260205260405f2055846102cf565b634e487b7160e01b5f52601160045260245ffd5b60405162461bcd60e51b8152602060048201526009602482015268414c4c4f57414e434560b81b6044820152606490fd5b346100d0575f3660031901126100d05760206040517f0000000000000000000000000000000000000000033b2e3c9fd0803ce80000008152f35b346100d05760403660031901126100d0576103ac610507565b6001600160a01b0360243591335f52600360205260405f208282165f526020528260405f205560405192835216907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b346100d0575f3660031901126100d0576040515f5f548060011c906001811680156104d3575b602083108114610205578285529081156101e9575060011461047f5750819003601f01601f191681019067ffffffffffffffff82118183101761017f576040829052819061017b90826104dd565b5f8080529091507f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5635b8282106104bd57506020915082010182610149565b60018160209254838588010152019101906104a8565b91607f1691610431565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036100d057565b602435906001600160a01b03821682036100d057565b91906001600160a01b03169182156105e0576001600160a01b031690815f5260026020528060405f2054106105b15760207fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91835f526002825260405f20818154039055845f526002825260405f20818154019055604051908152a3565b60405162461bcd60e51b815260206004820152600760248201526642414c414e434560c81b6044820152606490fd5b60405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b6044820152606490fdfea26469706673582212201401bf53148b8b0aa2024466bd419082b6a5cd3ed9e08435ad7fee9eba487bb264736f6c634300081c0033
| 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 | |||||||||
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x5db07a…9b935c | 22 hrs agoSat, 15 Aug 2026 22:59:47 UTC | Transfer | [0] 0x000000000000…a9f8e4bf [1] 0x000000000000…3391cca0 data: 0x000000000000000000…eae10f75 |
| 0x5db07a…9b935c | 22 hrs agoSat, 15 Aug 2026 22:59:47 UTC | Approval | [0] 0x000000000000…a9f8e4bf [1] 0x000000000000…959e5cb2 data: 0x000000000000000000…eae10f75 |
| 0x5db07a…9b935c | 22 hrs agoSat, 15 Aug 2026 22:59:47 UTC | Transfer | [0] 0x000000000000…1e12086b [1] 0x000000000000…a9f8e4bf data: 0x000000000000000000…eae10f75 |
| 0x1619ea…7c41d9 | 2 days agoThu, 13 Aug 2026 22:16:28 UTC | Approval | [0] 0x000000000000…1e12086b [1] 0x000000000000…a9f8e4bf data: 0xffffffffffffffffff…ffffffff |
| 0x6e93e2…52b4da | 2 days agoThu, 13 Aug 2026 22:16:28 UTC | Transfer | [0] 0x000000000000…3391cca0 [1] 0x000000000000…1e12086b data: 0x000000000000000000…eae10f75 |
| 0x8b3cc6…a6f2a2 | 2 days agoThu, 13 Aug 2026 22:12:46 UTC | Transfer | [0] 0x000000000000…c8aebb4f [1] 0x000000000000…3391cca0 data: 0x000000000000000000…067bc84d |
| 0x8b3cc6…a6f2a2 | 2 days agoThu, 13 Aug 2026 22:12:46 UTC | Transfer | [0] 0x000000000000…9a51394c [1] 0x000000000000…c8aebb4f data: 0x000000000000000000…067bc84d |
| 0x603bf5…582d1a | 2 days agoThu, 13 Aug 2026 22:12:46 UTC | Approval | [0] 0x000000000000…9a51394c [1] 0x000000000000…e1a4f53d data: 0xffffffffffffffffff…ffffffff |
| 0x1e3165…d4eef0 | 2 days agoThu, 13 Aug 2026 22:04:27 UTC | Transfer | [0] 0x000000000000…3391cca0 [1] 0x000000000000…9a51394c data: 0x000000000000000000…174355d4 |
| 0x93d028…0241e5 | 2 days agoThu, 13 Aug 2026 22:01:43 UTC | Transfer | [0] 0x000000000000…3391cca0 [1] 0x000000000000…9a51394c data: 0x000000000000000000…ce196330 |
| 0xd7dcf1…cb3c24 | 2 days agoThu, 13 Aug 2026 21:58:27 UTC | Transfer | [0] 0x000000000000…3391cca0 [1] 0x000000000000…9a51394c data: 0x000000000000000000…211f0f49 |
| 0xdae6c1…dc1695 | 2 days agoThu, 13 Aug 2026 21:39:42 UTC | Transfer | [0] 0x000000000000…36cda6c3 [1] 0x000000000000…d698a86f data: 0x000000000000000000…3a99cafe |
| 0xdae6c1…dc1695 | 2 days agoThu, 13 Aug 2026 21:39:42 UTC | Transfer | [0] 0x000000000000…20cbbe5f [1] 0x000000000000…36cda6c3 data: 0x000000000000000000…3a99cafe |
| 0xdae6c1…dc1695 | 2 days agoThu, 13 Aug 2026 21:39:42 UTC | Transfer | [0] 0x000000000000…3391cca0 [1] 0x000000000000…20cbbe5f data: 0x000000000000000000…3a99cafe |
| 0xc944f2…b69e16 | 2 days agoThu, 13 Aug 2026 21:38:58 UTC | Transfer | [0] 0x000000000000…ae3213a0 [1] 0x000000000000…0000dead data: 0x000000000000000000…0000091a |
| 0xc944f2…b69e16 | 2 days agoThu, 13 Aug 2026 21:38:58 UTC | Approval | [0] 0x000000000000…ae3213a0 [1] 0x000000000000…638de0d3 data: 0x000000000000000000…00000000 |
| 0xc944f2…b69e16 | 2 days agoThu, 13 Aug 2026 21:38:58 UTC | Transfer | [0] 0x000000000000…ae3213a0 [1] 0x000000000000…3391cca0 data: 0x000000000000000000…e7fff6e6 |
| 0xc944f2…b69e16 | 2 days agoThu, 13 Aug 2026 21:38:58 UTC | Approval | [0] 0x000000000000…ae3213a0 [1] 0x000000000000…638de0d3 data: 0x000000000000000000…e8000000 |
| 0xc944f2…b69e16 | 2 days agoThu, 13 Aug 2026 21:38:58 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…ae3213a0 data: 0x000000000000000000…e8000000 |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x1619ea…7c41d9 | Approve | 35,742,529 | 2 days agoThu, 13 Aug 2026 22:16:28 UTC | 0xa5a6…086b | IN | Robinhood Silver | $0.000 ETH | 0.00000204 | |
| 0x603bf5…582d1a | Approve | 35,740,301 | 2 days agoThu, 13 Aug 2026 22:12:46 UTC | 0x337b…394c | IN | Robinhood Silver | $0.000 ETH | 0.00000200 |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 35,720,058 | 2 days agoThu, 13 Aug 2026 21:38:58 UTC | 0xc944f2…b69e16 | CREATE | 0xf5128c21 | 0x0f28…13a0 | IN | 0x2fa6…f6a4 | 0 ETH |