// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
/// @notice Minimal ERC20 surface used by the vault.
interface IERC20Min {
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 amount) external returns (bool);
function approve(address spender, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
}
interface IWETHMin is IERC20Min {
function deposit() external payable;
}
/// @notice Uniswap V3 SwapRouter (router02 style, no deadline field).
interface ISwapRouterMin {
struct ExactInputSingleParams {
address tokenIn;
address tokenOut;
uint24 fee;
address recipient;
uint256 amountIn;
uint256 amountOutMinimum;
uint160 sqrtPriceLimitX96;
}
function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut);
struct ExactInputParams {
bytes path;
address recipient;
uint256 amountIn;
uint256 amountOutMinimum;
}
function exactInput(ExactInputParams calldata params) external payable returns (uint256 amountOut);
}
/// @title StockDividendVault
/// @notice Receives LP/creator fees from a lemon.fun launch, converts them into a
/// tokenized stock (e.g. AAPLx on Robinhood Chain) and distributes the stock
/// to token holders in merkle epochs. Holders must hold at least
/// `minShareBalance` of the launch token at snapshot time to be eligible;
/// that rule is enforced by the off-chain snapshotter and recorded here for
/// transparency.
/// @dev Deliberately standalone: the lemon.fun launch factory and LP locker are
/// NOT modified, so existing GMGN / scanner verification stays intact. The
/// locker simply redirects the creator fee share to this address.
contract StockDividendVault {
// ---------------------------------------------------------------- config
address public immutable stockToken;
address public immutable creator;
address public immutable platform;
address public immutable weth;
address public immutable swapRouter;
/// @notice Second V3 router used for the launch-token leg when the launch pool
/// and the stock pool live on different DEXes (BNB: Uniswap launch pool,
/// PancakeSwap bStock pools). Equals `swapRouter` on single-DEX chains.
address public immutable altRouter;
/// @notice Stable asset the stock pools are quoted in (USDG / USDT).
address public immutable stable;
uint24 public immutable poolFee;
/// @notice Basis points of every converted stock batch paid to the creator.
uint16 public immutable creatorBps;
/// @notice Basis points of every converted stock batch paid to the platform.
uint16 public immutable platformBps;
/// @notice Minimum launch-token balance a wallet must hold to be eligible.
uint256 public immutable minShareBalance;
/// @notice The launch token this vault pays dividends for. Bound once after launch
/// because the token address is only known after the factory call.
address public launchToken;
address public keeper;
/// @notice Factory that deployed this vault (may bind the launch token).
address public immutable deployer;
/// @notice Seconds after publication before unclaimed stock can be recycled.
uint256 public constant CLAIM_WINDOW = 180 days;
// ---------------------------------------------------------------- epochs
struct Epoch {
bytes32 merkleRoot;
uint256 totalAmount; // stock reserved for holders
uint256 claimedAmount;
uint64 publishedAt;
uint32 holderCount;
bool swept;
}
uint256 public epochCount;
mapping(uint256 => Epoch) public epochs;
mapping(uint256 => mapping(address => bool)) public claimed;
/// @notice Stock reserved across all live epochs; cannot be re-published or swept.
uint256 public reserved;
/// @notice Lifetime stock paid out to holders.
uint256 public totalDistributed;
/// @notice Lifetime stock converted from fees.
uint256 public totalConverted;
// ---------------------------------------------------------------- events
event LaunchTokenBound(address indexed token);
event KeeperChanged(address indexed keeper);
event Converted(address indexed tokenIn, uint256 amountIn, uint256 stockOut);
event TokenRecovered(address indexed token, address indexed to, uint256 amount);
event EpochPublished(uint256 indexed epoch, bytes32 merkleRoot, uint256 holderAmount, uint32 holderCount);
event Claimed(uint256 indexed epoch, address indexed account, uint256 amount);
event EpochSwept(uint256 indexed epoch, uint256 amount);
event FeeSplit(uint256 creatorAmount, uint256 platformAmount);
// ---------------------------------------------------------------- errors
error NotAuthorized();
error AlreadyBound();
error ZeroAddress();
error BadBps();
error NothingToConvert();
error EpochExists();
error EpochMissing();
error InsufficientBalance();
error AlreadyClaimed();
error BadProof();
error TooEarly();
error TransferFailed();
error BadPath();
modifier onlyKeeper() {
if (msg.sender != keeper) revert NotAuthorized();
_;
}
constructor(
address _stockToken,
address _creator,
address _platform,
address _keeper,
address _weth,
address _swapRouter,
address _altRouter,
address _stable,
uint24 _poolFee,
uint16 _creatorBps,
uint16 _platformBps,
uint256 _minShareBalance
) {
if (
_stockToken == address(0) || _creator == address(0) || _platform == address(0)
|| _keeper == address(0) || _swapRouter == address(0) || _weth == address(0)
|| _altRouter == address(0) || _stable == address(0)
) revert ZeroAddress();
if (uint256(_creatorBps) + uint256(_platformBps) > 5000) revert BadBps();
stockToken = _stockToken;
creator = _creator;
platform = _platform;
keeper = _keeper;
weth = _weth;
swapRouter = _swapRouter;
altRouter = _altRouter;
stable = _stable;
poolFee = _poolFee;
creatorBps = _creatorBps;
platformBps = _platformBps;
minShareBalance = _minShareBalance;
deployer = msg.sender;
}
receive() external payable {}
// ------------------------------------------------------------ admin/bind
/// @notice Bind the launch token once the factory has deployed it.
function bindLaunchToken(address token) external {
if (msg.sender != creator && msg.sender != keeper && msg.sender != platform && msg.sender != deployer) {
revert NotAuthorized();
}
if (launchToken != address(0)) revert AlreadyBound();
if (token == address(0)) revert ZeroAddress();
launchToken = token;
emit LaunchTokenBound(token);
}
/// @notice Rotate the automation keeper. Platform-controlled.
function setKeeper(address newKeeper) external {
if (msg.sender != platform) revert NotAuthorized();
if (newKeeper == address(0)) revert ZeroAddress();
keeper = newKeeper;
emit KeeperChanged(newKeeper);
}
// -------------------------------------------------------------- converts
/// @notice Wrap any native fees so they can be routed through the V3 router.
function wrapNative() external onlyKeeper returns (uint256 wrapped) {
wrapped = address(this).balance;
if (wrapped == 0) revert NothingToConvert();
IWETHMin(weth).deposit{value: wrapped}();
}
/// @notice Swap a fee asset held by the vault into the tokenized stock.
/// @param tokenIn Asset to sell (launch token, WETH, or any fee asset).
/// @param fee Pool fee tier for the tokenIn/stockToken pool.
/// @param amountIn Amount to sell; 0 sells the whole balance.
/// @param minOut Slippage floor, computed off-chain against the oracle price.
function convert(address tokenIn, uint24 fee, uint256 amountIn, uint256 minOut)
external
onlyKeeper
returns (uint256 stockOut)
{
if (tokenIn == stockToken || tokenIn == address(0)) revert NothingToConvert();
uint256 bal = IERC20Min(tokenIn).balanceOf(address(this));
if (amountIn == 0 || amountIn > bal) amountIn = bal;
if (amountIn == 0) revert NothingToConvert();
_approveMax(tokenIn, swapRouter, amountIn);
stockOut = ISwapRouterMin(swapRouter).exactInputSingle(
ISwapRouterMin.ExactInputSingleParams({
tokenIn: tokenIn,
tokenOut: stockToken,
fee: fee == 0 ? poolFee : fee,
recipient: address(this),
amountIn: amountIn,
amountOutMinimum: minOut,
sqrtPriceLimitX96: 0
})
);
totalConverted += stockOut;
emit Converted(tokenIn, amountIn, stockOut);
}
/// @notice Convert through a verified V3 path, for example
/// launchToken -> WETH -> USDG -> tokenized stock. This makes stock
/// dividends independent of a direct WETH/stock pool.
function convertPath(bytes calldata path, uint256 amountIn, uint256 minOut)
external
onlyKeeper
returns (uint256 stockOut)
{
if (path.length < 43 || (path.length - 20) % 23 != 0) revert BadPath();
address tokenIn;
address tokenOut;
assembly {
tokenIn := shr(96, calldataload(path.offset))
tokenOut := shr(96, calldataload(add(path.offset, sub(path.length, 20))))
}
if (tokenIn == address(0) || tokenIn == stockToken || tokenOut != stockToken) revert BadPath();
uint256 bal = IERC20Min(tokenIn).balanceOf(address(this));
if (amountIn == 0 || amountIn > bal) amountIn = bal;
if (amountIn == 0) revert NothingToConvert();
_approveMax(tokenIn, swapRouter, amountIn);
stockOut = ISwapRouterMin(swapRouter).exactInput(
ISwapRouterMin.ExactInputParams({
path: path,
recipient: address(this),
amountIn: amountIn,
amountOutMinimum: minOut
})
);
totalConverted += stockOut;
emit Converted(tokenIn, amountIn, stockOut);
}
/// @notice Convert one leg of a cross-DEX route through a chosen router.
/// @dev Needed on chains where the launch pool and the stock pool live on
/// different V3 deployments (BNB Chain: Uniswap launch pool,
/// PancakeSwap bStock pools). The router must be one of the two
/// immutables set at deployment, and the final output must be the
/// wrapped native, the stable, or the stock token, so a keeper can
/// never route vault assets to an arbitrary destination.
/// @param router Either `swapRouter` or `altRouter`.
/// @param path Packed V3 path starting at an asset the vault holds.
/// @param amountIn Amount to sell; 0 sells the whole balance.
/// @param minOut Slippage floor computed off-chain from an on-chain quote.
function convertLeg(address router, bytes calldata path, uint256 amountIn, uint256 minOut)
external
onlyKeeper
returns (uint256 amountOut)
{
if (router != swapRouter && router != altRouter) revert NotAuthorized();
if (path.length < 43 || (path.length - 20) % 23 != 0) revert BadPath();
address tokenIn;
address tokenOut;
assembly {
tokenIn := shr(96, calldataload(path.offset))
tokenOut := shr(96, calldataload(add(path.offset, sub(path.length, 20))))
}
if (tokenIn == address(0) || tokenIn == stockToken) revert BadPath();
if (tokenOut != stockToken && tokenOut != weth && tokenOut != stable) revert BadPath();
uint256 bal = IERC20Min(tokenIn).balanceOf(address(this));
if (amountIn == 0 || amountIn > bal) amountIn = bal;
if (amountIn == 0) revert NothingToConvert();
_approveMax(tokenIn, router, amountIn);
amountOut = ISwapRouterMin(router).exactInput(
ISwapRouterMin.ExactInputParams({
path: path,
recipient: address(this),
amountIn: amountIn,
amountOutMinimum: minOut
})
);
if (tokenOut == stockToken) totalConverted += amountOut;
emit Converted(tokenIn, amountIn, tokenOut == stockToken ? amountOut : 0);
}
// ---------------------------------------------------------------- epochs
/// @notice Stock currently free to be reserved for a new epoch.
function distributable() public view returns (uint256) {
uint256 bal = IERC20Min(stockToken).balanceOf(address(this));
return bal > reserved ? bal - reserved : 0;
}
/// @notice Publish a dividend epoch. Creator + platform cuts are paid out
/// immediately, the remainder is reserved for merkle claims.
/// @param epoch Sequential epoch id (must equal epochCount).
/// @param merkleRoot Root over keccak256(abi.encode(account, amount)) leaves.
/// @param totalAmount Gross stock amount for this epoch (0 uses everything free).
/// @param holderCount Number of eligible holders, recorded for the UI.
function publishEpoch(uint256 epoch, bytes32 merkleRoot, uint256 totalAmount, uint32 holderCount)
external
onlyKeeper
returns (uint256 holderAmount)
{
if (epoch != epochCount) revert EpochExists();
if (merkleRoot == bytes32(0)) revert BadProof();
uint256 free = distributable();
if (totalAmount == 0 || totalAmount > free) totalAmount = free;
if (totalAmount == 0) revert InsufficientBalance();
uint256 creatorAmount = (totalAmount * creatorBps) / 10_000;
uint256 platformAmount = (totalAmount * platformBps) / 10_000;
holderAmount = totalAmount - creatorAmount - platformAmount;
if (holderAmount == 0) revert InsufficientBalance();
epochs[epoch] = Epoch({
merkleRoot: merkleRoot,
totalAmount: holderAmount,
claimedAmount: 0,
publishedAt: uint64(block.timestamp),
holderCount: holderCount,
swept: false
});
reserved += holderAmount;
epochCount = epoch + 1;
if (creatorAmount > 0) _safeTransfer(stockToken, creator, creatorAmount);
if (platformAmount > 0) _safeTransfer(stockToken, platform, platformAmount);
if (creatorAmount > 0 || platformAmount > 0) emit FeeSplit(creatorAmount, platformAmount);
emit EpochPublished(epoch, merkleRoot, holderAmount, holderCount);
}
/// @notice Claim a holder allocation for one epoch.
function claim(uint256 epoch, uint256 amount, bytes32[] calldata proof) external {
_claim(epoch, msg.sender, amount, proof);
}
/// @notice Claim several epochs in one transaction.
function claimMany(
uint256[] calldata epochIds,
uint256[] calldata amounts,
bytes32[][] calldata proofs
) external returns (uint256 total) {
for (uint256 i; i < epochIds.length; ++i) {
total += _claim(epochIds[i], msg.sender, amounts[i], proofs[i]);
}
}
function _claim(uint256 epoch, address account, uint256 amount, bytes32[] calldata proof)
internal
returns (uint256)
{
Epoch storage e = epochs[epoch];
if (e.merkleRoot == bytes32(0)) revert EpochMissing();
if (claimed[epoch][account]) revert AlreadyClaimed();
bytes32 leaf = keccak256(bytes.concat(keccak256(abi.encode(account, amount))));
if (!_verify(proof, e.merkleRoot, leaf)) revert BadProof();
claimed[epoch][account] = true;
e.claimedAmount += amount;
reserved -= amount;
totalDistributed += amount;
_safeTransfer(stockToken, account, amount);
emit Claimed(epoch, account, amount);
return amount;
}
/// @notice Recycle unclaimed stock from an expired epoch back into the pool.
function sweepEpoch(uint256 epoch) external onlyKeeper returns (uint256 amount) {
Epoch storage e = epochs[epoch];
if (e.merkleRoot == bytes32(0)) revert EpochMissing();
if (e.swept) revert AlreadyClaimed();
if (block.timestamp < uint256(e.publishedAt) + CLAIM_WINDOW) revert TooEarly();
amount = e.totalAmount - e.claimedAmount;
e.swept = true;
if (amount > 0) reserved -= amount;
emit EpochSwept(epoch, amount);
}
/// @notice Rescue an arbitrary ERC-20 stranded in this vault (e.g. dev-buy tokens that
/// were misrouted here by an older factory). The dividend asset can never be
/// pulled, so holder claims stay fully backed.
function recoverToken(address token, address to, uint256 amount) external returns (uint256 sent) {
if (msg.sender != platform && msg.sender != keeper) revert NotAuthorized();
if (to == address(0) || token == address(0)) revert ZeroAddress();
if (token == stockToken) revert NotAuthorized();
uint256 bal = IERC20Min(token).balanceOf(address(this));
sent = amount == 0 || amount > bal ? bal : amount;
if (sent == 0) revert InsufficientBalance();
_safeTransfer(token, to, sent);
emit TokenRecovered(token, to, sent);
}
// ---------------------------------------------------------------- views
function epochInfo(uint256 epoch)
external
view
returns (bytes32 merkleRoot, uint256 totalAmount, uint256 claimedAmount, uint64 publishedAt, uint32 holderCount, bool swept)
{
Epoch storage e = epochs[epoch];
return (e.merkleRoot, e.totalAmount, e.claimedAmount, e.publishedAt, e.holderCount, e.swept);
}
function vaultStats()
external
view
returns (
address _launchToken,
address _stockToken,
uint256 _minShareBalance,
uint256 _epochCount,
uint256 _totalDistributed,
uint256 _reserved,
uint256 _pendingStock
)
{
return (
launchToken,
stockToken,
minShareBalance,
epochCount,
totalDistributed,
reserved,
distributable()
);
}
// -------------------------------------------------------------- internal
function _verify(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
bytes32 computed = leaf;
for (uint256 i; i < proof.length; ++i) {
bytes32 p = proof[i];
computed = computed <= p ? keccak256(abi.encode(computed, p)) : keccak256(abi.encode(p, computed));
}
return computed == root;
}
function _approveMax(address token, address spender, uint256 amount) internal {
if (IERC20Min(token).allowance(address(this), spender) < amount) {
(bool ok,) = token.call(abi.encodeWithSelector(IERC20Min.approve.selector, spender, 0));
ok;
(bool ok2, bytes memory data) =
token.call(abi.encodeWithSelector(IERC20Min.approve.selector, spender, type(uint256).max));
if (!ok2 || (data.length != 0 && !abi.decode(data, (bool)))) revert TransferFailed();
}
}
function _safeTransfer(address token, address to, uint256 amount) internal {
(bool ok, bytes memory data) =
token.call(abi.encodeWithSelector(IERC20Min.transfer.selector, to, amount));
if (!ok || (data.length != 0 && !abi.decode(data, (bool)))) revert TransferFailed();
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "_stockToken",
"type": "address",
"internalType": "address"
},
{
"name": "_creator",
"type": "address",
"internalType": "address"
},
{
"name": "_platform",
"type": "address",
"internalType": "address"
},
{
"name": "_keeper",
"type": "address",
"internalType": "address"
},
{
"name": "_weth",
"type": "address",
"internalType": "address"
},
{
"name": "_swapRouter",
"type": "address",
"internalType": "address"
},
{
"name": "_altRouter",
"type": "address",
"internalType": "address"
},
{
"name": "_stable",
"type": "address",
"internalType": "address"
},
{
"name": "_poolFee",
"type": "uint24",
"internalType": "uint24"
},
{
"name": "_creatorBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "_platformBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "_minShareBalance",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "AlreadyBound",
"type": "error",
"inputs": []
},
{
"name": "AlreadyClaimed",
"type": "error",
"inputs": []
},
{
"name": "BadBps",
"type": "error",
"inputs": []
},
{
"name": "BadPath",
"type": "error",
"inputs": []
},
{
"name": "BadProof",
"type": "error",
"inputs": []
},
{
"name": "EpochExists",
"type": "error",
"inputs": []
},
{
"name": "EpochMissing",
"type": "error",
"inputs": []
},
{
"name": "InsufficientBalance",
"type": "error",
"inputs": []
},
{
"name": "NotAuthorized",
"type": "error",
"inputs": []
},
{
"name": "NothingToConvert",
"type": "error",
"inputs": []
},
{
"name": "TooEarly",
"type": "error",
"inputs": []
},
{
"name": "TransferFailed",
"type": "error",
"inputs": []
},
{
"name": "ZeroAddress",
"type": "error",
"inputs": []
},
{
"name": "Claimed",
"type": "event",
"inputs": [
{
"name": "epoch",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "account",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Converted",
"type": "event",
"inputs": [
{
"name": "tokenIn",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "amountIn",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "stockOut",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "EpochPublished",
"type": "event",
"inputs": [
{
"name": "epoch",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "merkleRoot",
"type": "bytes32",
"indexed": false,
"internalType": "bytes32"
},
{
"name": "holderAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "holderCount",
"type": "uint32",
"indexed": false,
"internalType": "uint32"
}
],
"anonymous": false
},
{
"name": "EpochSwept",
"type": "event",
"inputs": [
{
"name": "epoch",
"type": "uint256",
"indexed": true,
"internalType": "uint256"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "FeeSplit",
"type": "event",
"inputs": [
{
"name": "creatorAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "platformAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "KeeperChanged",
"type": "event",
"inputs": [
{
"name": "keeper",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "LaunchTokenBound",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "TokenRecovered",
"type": "event",
"inputs": [
{
"name": "token",
"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": "CLAIM_WINDOW",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "altRouter",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "bindLaunchToken",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "claim",
"type": "function",
"inputs": [
{
"name": "epoch",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "proof",
"type": "bytes32[]",
"internalType": "bytes32[]"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "claimMany",
"type": "function",
"inputs": [
{
"name": "epochIds",
"type": "uint256[]",
"internalType": "uint256[]"
},
{
"name": "amounts",
"type": "uint256[]",
"internalType": "uint256[]"
},
{
"name": "proofs",
"type": "bytes32[][]",
"internalType": "bytes32[][]"
}
],
"outputs": [
{
"name": "total",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "claimed",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "convert",
"type": "function",
"inputs": [
{
"name": "tokenIn",
"type": "address",
"internalType": "address"
},
{
"name": "fee",
"type": "uint24",
"internalType": "uint24"
},
{
"name": "amountIn",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "minOut",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "stockOut",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "convertLeg",
"type": "function",
"inputs": [
{
"name": "router",
"type": "address",
"internalType": "address"
},
{
"name": "path",
"type": "bytes",
"internalType": "bytes"
},
{
"name": "amountIn",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "minOut",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "amountOut",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "convertPath",
"type": "function",
"inputs": [
{
"name": "path",
"type": "bytes",
"internalType": "bytes"
},
{
"name": "amountIn",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "minOut",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "stockOut",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "creator",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "creatorBps",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "deployer",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "distributable",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "epochCount",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "epochInfo",
"type": "function",
"inputs": [
{
"name": "epoch",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "merkleRoot",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "totalAmount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "claimedAmount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "publishedAt",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "holderCount",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "swept",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "epochs",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "merkleRoot",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "totalAmount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "claimedAmount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "publishedAt",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "holderCount",
"type": "uint32",
"internalType": "uint32"
},
{
"name": "swept",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "keeper",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "launchToken",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "minShareBalance",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "platform",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "platformBps",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "poolFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint24",
"internalType": "uint24"
}
],
"stateMutability": "view"
},
{
"name": "publishEpoch",
"type": "function",
"inputs": [
{
"name": "epoch",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "merkleRoot",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "totalAmount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "holderCount",
"type": "uint32",
"internalType": "uint32"
}
],
"outputs": [
{
"name": "holderAmount",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "recoverToken",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "sent",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "reserved",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "setKeeper",
"type": "function",
"inputs": [
{
"name": "newKeeper",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "stable",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "stockToken",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "swapRouter",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "sweepEpoch",
"type": "function",
"inputs": [
{
"name": "epoch",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"name": "totalConverted",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "totalDistributed",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "vaultStats",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "_launchToken",
"type": "address",
"internalType": "address"
},
{
"name": "_stockToken",
"type": "address",
"internalType": "address"
},
{
"name": "_minShareBalance",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "_epochCount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "_totalDistributed",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "_reserved",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "_pendingStock",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "weth",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "wrapNative",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "wrapped",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "nonpayable"
},
{
"type": "receive",
"stateMutability": "payable"
}
]0x608080604052600436101561001c575b50361561001a575f80fd5b005b5f905f3560e01c90816302d05d3f14611b2257508063089fe6aa14611ae3578063120aa87714611a9a5780631a8280fd146118435780631be2f781146114d657806322be3de1146114925780633818bbd9146113685780633894228e146112ea5780633fc8cef3146112a65780634bde38c8146112625780635ed382f51461121e5780636710fb28146111fc5780636ad481f3146111395780636f65173b14610e695780636ff4ab8a14610dc4578063748747e614610d23578063804e5d9814610bc8578063829965cc14610baa578063877421f814610a7b57806397fd361314610a5d5780639f34fc8014610a3f578063a28a4d8614610a18578063a7229fd914610839578063aced166114610810578063ae0b51df146107cb578063baa8e78614610786578063c31c9c0714610741578063c3b9b88c1461035e578063c6b61e4c146102e1578063d5f394881461029c578063de90e29b1461025d578063efca2eed1461023f578063f4e15ee714610204578063f76835e6146101c55763fe60d12c0361000f57346101c257806003193601126101c2576020600554604051908152f35b80fd5b50346101c257806003193601126101c257602060405161ffff7f00000000000000000000000000000000000000000000000000000000000001f4168152f35b50346101c257806003193601126101c25760206040517f00000000000000000000000000000000000000000000152d02c7e14af68000008152f35b50346101c257806003193601126101c2576020600654604051908152f35b50346101c257806003193601126101c257602060405161ffff7f00000000000000000000000000000000000000000000000000000000000007d0168152f35b50346101c257806003193601126101c2576040517f000000000000000000000000910710491e53c1e086e1e72878532125e3cfffd36001600160a01b03168152602090f35b50346101c25760203660031901126101c2576004358152600360208181526040928390208054600182015460028301549290940154855191825292810193909352828401526001600160401b0381166060808401919091529281901c63ffffffff16608083015290911c60ff16151560a08201528060c081010390f35b50346101c25760803660031901126101c257610378611b79565b906024356001600160401b03811161073d57610398903690600401611bbf565b600154909391604435916001600160a01b0316330361072e57909384916001600160a01b038481169291907f000000000000000000000000caf681a66d020601342297493863e78c959e5cb216831415806106fb575b6106ec57602b821080156106c0575b6106b157803560601c94601319838301013560601c948615801561067f575b610608577f0000000000000000000000004a0e65a3eccec6dbe60ae065f2e7bb85fae35eea6001600160a01b03168614958615908161064b575b81610617575b50610608576040516370a0823160e01b8152306004820152906020826024818b5afa9182156105fd5789926105c9575b508181159182156105bf575b50506105b7575b5087156105a857926020926104d2610503936104be8b8b99988b611dfa565b604051926104cb84611bec565b3691611d23565b81523084820152886040820152606435606082015260405197888094819363b858183f60e01b835260048301611d59565b03925af193841561059d578294610564575b506020945f805160206121778339815191529282604093610550575b1561054b5750845b825191825286820152a2604051908152f35b610539565b61055c87600754611c28565b600755610531565b9093506020813d602011610595575b8161058060209383611c07565b810103126105915751926020610515565b5f80fd5b3d9150610573565b6040513d84823e3d90fd5b630603367f60e31b8752600487fd5b97505f61049f565b119050815f610498565b9091506020813d6020116105f5575b816105e560209383611c07565b810103126105915751905f61048c565b3d91506105d8565b6040513d8b823e3d90fd5b6364325c9160e01b8852600488fd5b7f0000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d1686001600160a01b0316141590505f61045c565b7f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b03168114159150610456565b507f0000000000000000000000004a0e65a3eccec6dbe60ae065f2e7bb85fae35eea6001600160a01b0316871461041c565b6364325c9160e01b8652600486fd5b5060131982018281116106d8576017900615156103fd565b634e487b7160e01b87526011600452602487fd5b63ea8e4eb560e01b8652600486fd5b507f000000000000000000000000caf681a66d020601342297493863e78c959e5cb26001600160a01b03168314156103ee565b63ea8e4eb560e01b8452600484fd5b5080fd5b50346101c257806003193601126101c2576040517f000000000000000000000000caf681a66d020601342297493863e78c959e5cb26001600160a01b03168152602090f35b50346101c257806003193601126101c2576040517f0000000000000000000000004a0e65a3eccec6dbe60ae065f2e7bb85fae35eea6001600160a01b03168152602090f35b50346101c25760603660031901126101c2576044356001600160401b03811161073d576107ff61080c913690600401611b8f565b9060243533600435611f90565b5080f35b50346101c257806003193601126101c2576001546040516001600160a01b039091168152602090f35b50346101c25760603660031901126101c257610853611b79565b9061085c611b63565b91604435337f000000000000000000000000ef2c099803fff879443009722aa2b9c46e020ab66001600160a01b0316141580610a03575b6109f4576001600160a01b03841691821580156109e3575b6109d4576001600160a01b0381811692907f0000000000000000000000004a0e65a3eccec6dbe60ae065f2e7bb85fae35eea1683146109c5576040516370a0823160e01b815230600482015290602082602481875afa9182156109ba578692610986575b508015801561097d575b156109755750935b841561096657508360209561093592611f48565b7f879f92dded0f26b83c3e00b12e0395dc72cfc3077343d1854ed6988edd1f909684604051858152a3604051908152f35b631e9acf1760e31b8152600490fd5b905093610921565b50818111610919565b9091506020813d6020116109b2575b816109a260209383611c07565b810103126105915751905f61090f565b3d9150610995565b6040513d88823e3d90fd5b63ea8e4eb560e01b8552600485fd5b63d92e233d60e01b8452600484fd5b506001600160a01b038116156108ab565b63ea8e4eb560e01b8352600483fd5b506001546001600160a01b0316331415610893565b50346101c257806003193601126101c257546040516001600160a01b039091168152602090f35b50346101c257806003193601126101c257602060405162ed4e008152f35b50346101c257806003193601126101c2576020600754604051908152f35b50346101c25760203660031901126101c25760015460043591906001600160a01b03163303610b9b5781815260036020526040812091825415610b8c576003830180549260ff8460601c16610b7d576001600160401b03841662ed4e008101809111610b69574210610b5a5750610afe8460026001602097015491015490611c48565b60ff60601b19909316600160601b17905581610b46575b7f5a1f62da9fcd142772230f17a5efa0dd258d5420a44edae1d581903879b8142383604051848152a2604051908152f35b610b5282600554611c48565b600555610b15565b63085de62560e01b8152600490fd5b634e487b7160e01b82526011600452602482fd5b630c8d9eab60e31b8152600490fd5b6375a7971d60e11b8252600482fd5b63ea8e4eb560e01b8152600490fd5b50346101c257806003193601126101c2576020600254604051908152f35b50346101c25760203660031901126101c257610be2611b79565b337f0000000000000000000000006c89269aeb93654c397d684b9f0265d5185ce9bc6001600160a01b0316141580610d0e575b80610cdb575b80610ca8575b610c99578154906001600160a01b038216610c8a576001600160a01b0316908115610c7b576001600160a01b031916811782557f4a58f529601885177194a5a37c25d7b7a3ae95e81d43621f48d80ae7b43cd9828280a280f35b63d92e233d60e01b8352600483fd5b63682a906560e01b8352600483fd5b63ea8e4eb560e01b8252600482fd5b50337f000000000000000000000000910710491e53c1e086e1e72878532125e3cfffd36001600160a01b03161415610c21565b50337f000000000000000000000000ef2c099803fff879443009722aa2b9c46e020ab66001600160a01b03161415610c1b565b506001546001600160a01b0316331415610c15565b50346101c25760203660031901126101c257610d3d611b79565b7f000000000000000000000000ef2c099803fff879443009722aa2b9c46e020ab66001600160a01b03163303610c99576001600160a01b03168015610db557600180546001600160a01b031916821790557fccbb340100ae0231275bbc78f96bf86cd6924bfdc95af2988f131406f33e18a08280a280f35b63d92e233d60e01b8252600482fd5b50346101c257806003193601126101c2575460025460065460055460e0936001600160a01b03169291610df5611c65565b604080519586527f0000000000000000000000004a0e65a3eccec6dbe60ae065f2e7bb85fae35eea6001600160a01b031660208701527f00000000000000000000000000000000000000000000152d02c7e14af6800000908601526060850193909352608084015260a083015260c0820152f35b50346101c25760603660031901126101c2576004356001600160401b03811161073d57610e9a903690600401611bbf565b600154909291602435916001600160a01b031633036109f4578193602b8110801561110d575b6110fe57813560601c92831580156110cc575b801561108f575b611080576040516370a0823160e01b815230600482015290602082602481885afa9182156109ba57869261104c575b50818115918215611042575b505061103a575b50841561102b57610f8c8492602092610f5b7f000000000000000000000000caf681a66d020601342297493863e78c959e5cb2926104be8a858a611dfa565b81523084820152876040820152604435606082015260405194858094819363b858183f60e01b835260048301611d59565b03926001600160a01b03165af192831561101f5792610fdc575b505f805160206121778339815191526040602094610fc685600754611c28565b60075581519081528486820152a2604051908152f35b9291506020833d602011611017575b81610ff860209383611c07565b8101031261059157915190915f80516020612177833981519152610fa6565b3d9150610feb565b604051903d90823e3d90fd5b630603367f60e31b8452600484fd5b94505f610f1c565b119050815f610f15565b9091506020813d602011611078575b8161106860209383611c07565b810103126105915751905f610f09565b3d915061105b565b6364325c9160e01b8552600485fd5b50828201601319013560601c7f0000000000000000000000004a0e65a3eccec6dbe60ae065f2e7bb85fae35eea6001600160a01b03161415610eda565b507f0000000000000000000000004a0e65a3eccec6dbe60ae065f2e7bb85fae35eea6001600160a01b03168414610ed3565b6364325c9160e01b8452600484fd5b50601319810181811161112557601790061515610ec0565b634e487b7160e01b85526011600452602485fd5b34610591575f366003190112610591576001546001600160a01b031633036111ed574780156111de577f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b0316803b15610591575f8291600460405180958193630d0e30db60e41b83525af19182156111d3576020926111c3575b50604051908152f35b5f6111cd91611c07565b5f6111ba565b6040513d5f823e3d90fd5b630603367f60e31b5f5260045ffd5b63ea8e4eb560e01b5f5260045ffd5b34610591575f366003190112610591576020611216611c65565b604051908152f35b34610591575f366003190112610591576040517f000000000000000000000000caf681a66d020601342297493863e78c959e5cb26001600160a01b03168152602090f35b34610591575f366003190112610591576040517f000000000000000000000000ef2c099803fff879443009722aa2b9c46e020ab66001600160a01b03168152602090f35b34610591575f366003190112610591576040517f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b03168152602090f35b34610591576020366003190112610591576004355f908152600360208181526040928390208054600182015460028301549290940154855191825292810193909352828401526001600160401b0381166060808401919091529281901c63ffffffff16608083015290911c60ff16151560a08201528060c081010390f35b34610591576060366003190112610591576004356001600160401b03811161059157611398903690600401611b8f565b6024356001600160401b038111610591576113b7903690600401611b8f565b9190926044356001600160401b038111610591576113dc909392933690600401611b8f565b90935f945f94601e1982360301925b8087106113fd57602088604051908152f35b9091929394959661140f888389611c55565b359061141c89858c611c55565b3590878a101561147e578960051b86013587811215610591578601928335936001600160401b03851161059157602001938060051b36038513610591576001946114719461146b933390611f90565b90611c28565b97019594939291906113eb565b634e487b7160e01b5f52603260045260245ffd5b34610591575f366003190112610591576040517f0000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d1686001600160a01b03168152602090f35b3461059157608036600319011261059157600435602435604435916064359263ffffffff8416809403610591576001546001600160a01b031633036111ed578060025483036118345783156118255761152d611c65565b9081811591821561181b575b5050611813575b508015611804576115c29361271061157c61ffff7f00000000000000000000000000000000000000000000000000000000000007d01684611c35565b049485926115bd6127106115b461ffff7f00000000000000000000000000000000000000000000000000000000000001f41684611c35565b04948592611c48565b611c48565b9384156118045760405160c081018181106001600160401b038211176117f05760405281815260208101868152604082015f81526001600160401b03600360608501948242168652608081019388855260a08201955f87528b5f528360205260405f2092518355516001830155516002820155019351166bffffffff00000000000000008454925160401b16916bffffffffffffffffffffffff19161717825551151581549060ff60601b9060601b169060ff60601b191617905561168985600554611c28565b60055560018401918285116117dc576020967f415dbc1bcee5eafc30f86dcfe22101d47881c4ad4e05d43a99680848d1b1b80394606094600255811580158061178c575b821515908161173c575b91611734575b506116fe575b505060405191825285878301526040820152a2604051908152f35b7fe3d1bc957029c183464081fe664746cbab35398d3abf32c333f85dfc4165ee4d9160409182519182528a820152a187806116e3565b90508a6116dd565b611787847f000000000000000000000000ef2c099803fff879443009722aa2b9c46e020ab67f0000000000000000000000004a0e65a3eccec6dbe60ae065f2e7bb85fae35eea611f48565b6116d7565b6117d7847f0000000000000000000000006c89269aeb93654c397d684b9f0265d5185ce9bc7f0000000000000000000000004a0e65a3eccec6dbe60ae065f2e7bb85fae35eea611f48565b6116cd565b634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b631e9acf1760e31b5f5260045ffd5b905084611540565b1190508187611539565b637ca55c7760e01b5f5260045ffd5b63ab53881960e01b5f5260045ffd5b346105915760803660031901126105915761185c611b79565b6024359062ffffff8216908183036105915760015460443591906001600160a01b031633036111ed5790926001600160a01b037f0000000000000000000000004a0e65a3eccec6dbe60ae065f2e7bb85fae35eea811693908316929190858486148015611a92575b6111de576040516370a0823160e01b815230600482015290602082602481895afa9182156111d3575f92611a5e575b50818115918215611a54575b5050611a4c575b5085156111de57611939867f000000000000000000000000caf681a66d020601342297493863e78c959e5cb28095611dfa565b611a4657507f0000000000000000000000000000000000000000000000000000000000002710925b6040519160e08301928084106001600160401b038511176117f0576040938452848152602081810193845262ffffff9687168286019081523060608401908152608084018a81526064803560a087019081525f60c088018181529a516304e45aaf60e01b815297516001600160a01b0390811660048a015299518a1660248901529451909b1660448701529151871691850191909152516084840152965160a48301529351831660c482015294859260e492849291165af19182156111d3575f92610fdc57505f805160206121778339815191526040602094610fc685600754611c28565b92611961565b955086611906565b11905081896118ff565b9091506020813d602011611a8a575b81611a7a60209383611c07565b81010312610591575190886118f3565b3d9150611a6d565b5084156118c4565b3461059157604036600319011261059157611ab3611b63565b6004355f52600460205260405f209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b34610591575f36600319011261059157602060405162ffffff7f0000000000000000000000000000000000000000000000000000000000002710168152f35b34610591575f366003190112610591577f0000000000000000000000006c89269aeb93654c397d684b9f0265d5185ce9bc6001600160a01b03168152602090f35b602435906001600160a01b038216820361059157565b600435906001600160a01b038216820361059157565b9181601f84011215610591578235916001600160401b038311610591576020808501948460051b01011161059157565b9181601f84011215610591578235916001600160401b038311610591576020838186019501011161059157565b608081019081106001600160401b038211176117f057604052565b90601f801991011681019081106001600160401b038211176117f057604052565b919082018092116117dc57565b818102929181159184041417156117dc57565b919082039182116117dc57565b919081101561147e5760051b0190565b6040516370a0823160e01b81523060048201526020816024817f0000000000000000000000004a0e65a3eccec6dbe60ae065f2e7bb85fae35eea6001600160a01b03165afa9081156111d3575f91611cd6575b5060055480821115611cd057611ccd91611c48565b90565b50505f90565b90506020813d602011611d00575b81611cf160209383611c07565b8101031261059157515f611cb8565b3d9150611ce4565b6001600160401b0381116117f057601f01601f191660200190565b929192611d2f82611d08565b91611d3d6040519384611c07565b829481845281830111610591578281602093845f960137010152565b6020606060c093828452805160808486015280519384918260a0880152018686015e5f84840186015260208101516001600160a01b03166040808601919091528101518285015201516080830152601f01601f1916010190565b3d15611ddd573d90611dc482611d08565b91611dd26040519384611c07565b82523d5f602084013e565b606090565b90816020910312610591575180151581036105915790565b604051636eb1769f60e11b81523060048201526001600160a01b0392831660248201819052919391926020908290604490829088165afa9081156111d3575f91611f16575b5010611e49575050565b5f9182918280604051602081019063095ea7b360e01b825284602482015282604482015260448152611e7c606482611c07565b519082865af150611e8b611db3565b5082604051602081019263095ea7b360e01b845260248201528119604482015260448152611eba606482611c07565b51925af1611ec6611db3565b9015908115611ee6575b50611ed757565b6312171d8360e31b5f5260045ffd5b8051801515925082611efb575b50505f611ed0565b611f0e9250602080918301019101611de2565b155f80611ef3565b90506020813d602011611f40575b81611f3160209383611c07565b8101031261059157515f611e3f565b3d9150611f24565b60405163a9059cbb60e01b602082019081526001600160a01b03909316602482015260448101939093525f928392908390611eba81606481015b03601f198101835282611c07565b91939092825f52600360205260405f2091825491821561216757845f52600460205260405f2060018060a01b0387165f5260205260ff60405f20541661215857604080516001600160a01b03881660208201908152918101899052919291611ffb8160608101611f82565b5190206040516020810191825260208152612017604082611c07565b519020915f915b8083106120eb575050500361182557600290825f52600460205260405f2060018060a01b0385165f5260205260405f20600160ff1982541617905501612065848254611c28565b905561207383600554611c48565b60055561208283600654611c28565b6006556120b083837f0000000000000000000000004a0e65a3eccec6dbe60ae065f2e7bb85fae35eea611f48565b6040518381526001600160a01b03909216917f4ec90e965519d92681267467f775ada5bd214aa92c0dc93d90a5e880ce9ed02690602090a390565b9091926001906120fc858486611c55565b35808211612130576040519060208201928352604082015260408152612123606082611c07565b5190205b9301919061201e565b906040519060208201928352604082015260408152612150606082611c07565b519020612127565b630c8d9eab60e31b5f5260045ffd5b6375a7971d60e11b5f5260045ffdfee6a45eea08a42f7c3f90f290e8ecf15e16174981943adf509fc9ea49808a64c6a264697066735822122083c9639aee3f3fd5b8b1accf86177123299ac4cdb387976ab358cb9ab581d44164736f6c634300081a0033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| Asteroid the Shiba (ASTEROID) | ASTEROID | 35,227,361.211893 | $0.00000274 | $96.36 |
WETH (WETH) | WETH | 0.000000 | $1,884.38 | $0 |
Space Exploration Technologies Corp. Class A Common Stock • Robinhood Token (SPCX) | SPCX | 0.031331 | — | — |
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x218be4…512ac0 | 1 day agoSat, 15 Aug 2026 15:10:16 UTC | 0x879f92…9096 | [0] 0x000000000000…867a7a70 [1] 0x000000000000…185ce9bc data: 0x000000000000000000…74016562 |
| 0x5c0b7b…16a91c | 1 day agoSat, 15 Aug 2026 14:45:16 UTC | 0xe6a45e…64c6 | [0] 0x000000000000…867a7a70 data: 0x000000000000000000…a0811b8c |
| 0x41b352…d3e2ea | 1 day agoSat, 15 Aug 2026 14:15:22 UTC | 0xe6a45e…64c6 | [0] 0x000000000000…867a7a70 data: 0x000000000000000000…41e93320 |
| 0x37f1d8…5dde3e | 1 day agoSat, 15 Aug 2026 12:10:12 UTC | 0x879f92…9096 | [0] 0x000000000000…867a7a70 [1] 0x000000000000…185ce9bc data: 0x000000000000000000…b56deaaa |
| 0x78e8b4…2d1d4a | 1 day agoSat, 15 Aug 2026 11:45:13 UTC | 0xe6a45e…64c6 | [0] 0x000000000000…867a7a70 data: 0x000000000000000000…74257e79 |
| 0xfb900b…65aeec | 1 day agoSat, 15 Aug 2026 11:15:16 UTC | 0xe6a45e…64c6 | [0] 0x000000000000…867a7a70 data: 0x000000000000000000…d4601891 |
| 0xe9e9fc…b729d9 | 1 day agoSat, 15 Aug 2026 11:00:10 UTC | 0xe6a45e…64c6 | [0] 0x000000000000…867a7a70 data: 0x000000000000000000…e4c75f64 |
| 0xe00036…7d6364 | 1 day agoSat, 15 Aug 2026 04:10:09 UTC | 0x879f92…9096 | [0] 0x000000000000…867a7a70 [1] 0x000000000000…185ce9bc data: 0x000000000000000000…4e440c67 |
| 0x07e6a0…e13a09 | 1 day agoSat, 15 Aug 2026 03:45:12 UTC | 0xe6a45e…64c6 | [0] 0x000000000000…867a7a70 data: 0x000000000000000000…fda82bcf |
| 0xbc7b6b…858794 | 1 day agoSat, 15 Aug 2026 03:15:12 UTC | 0xe6a45e…64c6 | [0] 0x000000000000…867a7a70 data: 0x000000000000000000…f7fe546d |
| 0xffd668…a178cf | 1 day agoFri, 14 Aug 2026 22:15:17 UTC | 0xe6a45e…64c6 | [0] 0x000000000000…1eacad73 data: 0x000000000000000000…44940a9f |
| 0xec572a…82caf7 | 1 day agoFri, 14 Aug 2026 22:03:36 UTC | 0x879f92…9096 | [0] 0x000000000000…867a7a70 [1] 0x000000000000…185ce9bc data: 0x000000000000000000…9c72714b |
| 0xc24cdc…d74746 | 1 day agoFri, 14 Aug 2026 22:03:04 UTC | 0x879f92…9096 | [0] 0x000000000000…867a7a70 [1] 0x000000000000…185ce9bc data: 0x000000000000000000…0a485000 |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x218be4…512ac0 | recoverToken | 37,211,421 | 1 day agoSat, 15 Aug 2026 15:10:16 UTC | 0x6b73…91a5 | IN | StockDividendVault | $0.000 ETH | 0.00000172 | |
| 0x5c0b7b…16a91c | convertPath | 37,196,458 | 1 day agoSat, 15 Aug 2026 14:45:16 UTC | 0x6b73…91a5 | IN | StockDividendVault | $0.000 ETH | 0.00000945 | |
| 0x41b352…d3e2ea | convertPath | 37,178,579 | 1 day agoSat, 15 Aug 2026 14:15:22 UTC | 0x6b73…91a5 | IN | StockDividendVault | $0.000 ETH | 0.00000993 | |
| 0x37f1d8…5dde3e | recoverToken | 37,103,674 | 1 day agoSat, 15 Aug 2026 12:10:12 UTC | 0x6b73…91a5 | IN | StockDividendVault | $0.000 ETH | 0.00000125 | |
| 0x78e8b4…2d1d4a | convertPath | 37,088,744 | 1 day agoSat, 15 Aug 2026 11:45:13 UTC | 0x6b73…91a5 | IN | StockDividendVault | $0.000 ETH | 0.00000980 | |
| 0xfb900b…65aeec | convertPath | 37,070,827 | 1 day agoSat, 15 Aug 2026 11:15:16 UTC | 0x6b73…91a5 | IN | StockDividendVault | $0.000 ETH | 0.00001010 | |
| 0xe9e9fc…b729d9 | convertPath | 37,061,804 | 1 day agoSat, 15 Aug 2026 11:00:10 UTC | 0x6b73…91a5 | IN | StockDividendVault | $0.000 ETH | 0.00001027 | |
| 0xe00036…7d6364 | recoverToken | 36,816,734 | 1 day agoSat, 15 Aug 2026 04:10:09 UTC | 0x6b73…91a5 | IN | StockDividendVault | $0.000 ETH | 0.00000148 | |
| 0x07e6a0…e13a09 | convertPath | 36,801,811 | 1 day agoSat, 15 Aug 2026 03:45:12 UTC | 0x6b73…91a5 | IN | StockDividendVault | $0.000 ETH | 0.00001169 | |
| 0xbc7b6b…858794 | convertPath | 36,783,842 | 1 day agoSat, 15 Aug 2026 03:15:12 UTC | 0x6b73…91a5 | IN | StockDividendVault | $0.000 ETH | 0.00001268 | |
| 0xffd668…a178cf | convertPath | 36,604,283 | 1 day agoFri, 14 Aug 2026 22:15:17 UTC | 0x6b73…91a5 | IN | StockDividendVault | $0.000 ETH | 0.00001236 | |
| 0xec572a…82caf7 | recoverToken | 36,597,253 | 1 day agoFri, 14 Aug 2026 22:03:36 UTC | 0x6b73…91a5 | IN | StockDividendVault | $0.000 ETH | 0.00000159 | |
| 0xc24cdc…d74746 | recoverToken | 36,596,934 | 1 day agoFri, 14 Aug 2026 22:03:04 UTC | 0x6b73…91a5 | IN | StockDividendVault | $0.000 ETH | 0.00000245 |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 36,445,274 | 2 days agoFri, 14 Aug 2026 17:50:03 UTC | 0xb788fd…7d9531 | CREATE2 | createVault | 0x9107…ffd3 | IN | 0x7a4f…7070 | 0 ETH |