// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;
import {Ownable2Step, Ownable} from "openzeppelin-contracts/contracts/access/Ownable2Step.sol";
import {IERC20} from "openzeppelin-contracts/contracts/token/ERC20/IERC20.sol";
import {SafeERC20} from "openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol";
import {ISlopFactory, ISlopPair, IWETH} from "./interfaces.sol";
/// @title GraduationMigrator — seeds a DEX pool at graduation and holds the LP
/// as PROTOCOL-OWNED LIQUIDITY (POL).
/// @notice When a token graduates on the launchpad, its contract-locked reserve
/// tokens + the paired ETH from the curve are deposited here into a new
/// SlopPair. The resulting LP tokens are minted TO THIS CONTRACT and
/// **there is deliberately no function that can transfer, burn, or
/// remove them** — the liquidity is permanent. The protocol earns swap
/// fees forever as the LP position's claim on the pool's reserves grows
/// with volume; it never sells into holders (see docs/monetization.md,
/// docs/roadmap.md — the "POL, not a sellable allocation" model).
///
/// This is the intentional design point vs. taking a raw token
/// allocation: POL cannot be dumped, deepens the market, and aligns the
/// protocol with holders. Audit note: the absence of any LP-exit path is
/// a feature — verify no code path moves `pair` LP out of this contract.
contract GraduationMigrator is Ownable2Step {
using SafeERC20 for IERC20;
ISlopFactory public immutable factory;
address public immutable WETH;
/// @notice Launchpads permitted to trigger migration (set by owner).
mapping(address => bool) public isLaunchpad;
struct Position {
address pair;
uint256 liquidity; // LP minted to this contract (permanent)
uint256 ethSeeded;
uint256 tokensSeeded;
uint64 migratedAt;
address creator; // attributed ON-CHAIN at graduation (from the launchpad)
}
mapping(address token => Position) public positions;
address[] public allMigrated;
event LaunchpadSet(address indexed launchpad, bool allowed);
event Migrated(
address indexed token,
address indexed pair,
uint256 tokenAmount,
uint256 ethAmount,
uint256 liquidity
);
error NotLaunchpad();
error AlreadyMigrated();
error NothingToMigrate();
error PairAlreadyExists();
error NoLiquidityMinted();
constructor(address owner_, address factory_, address weth_) Ownable(owner_) {
factory = ISlopFactory(factory_);
WETH = weth_;
}
function setLaunchpad(address launchpad, bool allowed) external onlyOwner {
isLaunchpad[launchpad] = allowed;
emit LaunchpadSet(launchpad, allowed);
}
/// @notice Called by an authorized launchpad at graduation. The launchpad must
/// have APPROVED this migrator for `tokenAmount` of `token` (pulled via
/// transferFrom below) and sends the paired ETH as msg.value. Creates +
/// seeds a FRESH TOKEN/WETH pool and locks the LP here as POL.
/// @param creator the token's creator, attributed on-chain here at graduation
/// (immutable once recorded) so the FeeSplitter can pay their post-grad
/// share with no owner key ever setting who earns.
/// @dev "Seed at final curve price" (founder decision 2026-07-11): we seed the
/// pool organically with the 200M reserve + the FULL raised ETH — no
/// chosen/arbitrary price, no ETH diverted out of the pool. The pool
/// therefore opens NEAR the curve's final spot price; the small residual
/// (the curve prices against virtual reserves, the pool against real
/// reserves) opens the pool a hair ABOVE the last curve price, so it
/// favors exiting holders, never the protocol. All raised ETH becomes
/// permanent POL depth. Audit note: verify no path removes that ETH.
function migrate(address token, uint256 tokenAmount, address creator)
external
payable
returns (address pair, uint256 liquidity)
{
if (!isLaunchpad[msg.sender]) revert NotLaunchpad();
if (positions[token].pair != address(0)) revert AlreadyMigrated();
if (tokenAmount == 0 || msg.value == 0) revert NothingToMigrate();
// audit C-1: the graduation pair MUST be freshly created HERE. Factory pair
// creation is gated to this migrator, so no attacker-controlled pre-seeded /
// skewed pool can exist for `token`; this guard is belt-and-suspenders —
// we NEVER mint into a pre-existing pool (which would let its LPs siphon the
// seeded liquidity via v2's excess-donation on mint).
if (factory.getPair(token, WETH) != address(0)) revert PairAlreadyExists();
pair = factory.createPair(token, WETH);
require(ISlopPair(pair).totalSupply() == 0, "GraduationMigrator: pair not fresh");
// Pull the reserve tokens from the launchpad. Using a pull (transferFrom)
// rather than assuming a prior push means a reverting migration rolls back
// ATOMICALLY — the launchpad keeps the tokens and can retry (finalizeMigration).
IERC20(token).safeTransferFrom(msg.sender, address(this), tokenAmount);
// Seed the fresh pool: both sides in, LP minted to THIS contract (POL). On a
// fresh pool, mint sets the price from exactly these amounts (no skew), so
// the pool opens at the curve's final price and the migrator receives the
// full first-mint LP.
IERC20(token).safeTransfer(pair, tokenAmount);
IWETH(WETH).deposit{value: msg.value}();
IWETH(WETH).transfer(pair, msg.value);
liquidity = ISlopPair(pair).mint(address(this));
if (liquidity == 0) revert NoLiquidityMinted();
positions[token] = Position({
pair: pair,
liquidity: liquidity,
ethSeeded: msg.value,
tokensSeeded: tokenAmount,
migratedAt: uint64(block.timestamp),
creator: creator
});
allMigrated.push(token);
emit Migrated(token, pair, tokenAmount, msg.value, liquidity);
}
// ---- views (POL is transparent + on-chain) ----
function migratedCount() external view returns (uint256) {
return allMigrated.length;
}
function pairOf(address token) external view returns (address) {
return positions[token].pair;
}
/// @notice The creator attributed on-chain at graduation. Read by the
/// FeeSplitter to route the post-graduation creator fee share. Zero if
/// the token has not graduated through this migrator.
function creatorOf(address token) external view returns (address) {
return positions[token].creator;
}
/// @notice Current redeemable value of the protocol's permanent LP position,
/// for transparency/reporting. This value grows as swap fees accrue;
/// the protocol never actually redeems it.
function polValue(address token) external view returns (uint256 tokenAmt, uint256 ethAmt) {
Position memory p = positions[token];
if (p.pair == address(0)) return (0, 0);
ISlopPair pair = ISlopPair(p.pair);
uint256 supply = pair.totalSupply();
if (supply == 0) return (0, 0);
(uint112 r0, uint112 r1,) = pair.getReserves();
(uint256 rToken, uint256 rEth) =
pair.token0() == token ? (uint256(r0), uint256(r1)) : (uint256(r1), uint256(r0));
tokenAmt = p.liquidity * rToken / supply;
ethAmt = p.liquidity * rEth / supply;
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "owner_",
"type": "address",
"internalType": "address"
},
{
"name": "factory_",
"type": "address",
"internalType": "address"
},
{
"name": "weth_",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"name": "AlreadyMigrated",
"type": "error",
"inputs": []
},
{
"name": "NoLiquidityMinted",
"type": "error",
"inputs": []
},
{
"name": "NotLaunchpad",
"type": "error",
"inputs": []
},
{
"name": "NothingToMigrate",
"type": "error",
"inputs": []
},
{
"name": "OwnableInvalidOwner",
"type": "error",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "OwnableUnauthorizedAccount",
"type": "error",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "PairAlreadyExists",
"type": "error",
"inputs": []
},
{
"name": "SafeERC20FailedOperation",
"type": "error",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "LaunchpadSet",
"type": "event",
"inputs": [
{
"name": "launchpad",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "allowed",
"type": "bool",
"indexed": false,
"internalType": "bool"
}
],
"anonymous": false
},
{
"name": "Migrated",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "pair",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "tokenAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "ethAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "liquidity",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "OwnershipTransferStarted",
"type": "event",
"inputs": [
{
"name": "previousOwner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "OwnershipTransferred",
"type": "event",
"inputs": [
{
"name": "previousOwner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "WETH",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "acceptOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "allMigrated",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "creatorOf",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "factory",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract ISlopFactory"
}
],
"stateMutability": "view"
},
{
"name": "isLaunchpad",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "migrate",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "tokenAmount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "creator",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "pair",
"type": "address",
"internalType": "address"
},
{
"name": "liquidity",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "payable"
},
{
"name": "migratedCount",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "owner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "pairOf",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "pendingOwner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "polValue",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "tokenAmt",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "ethAmt",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "positions",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "pair",
"type": "address",
"internalType": "address"
},
{
"name": "liquidity",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "ethSeeded",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "tokensSeeded",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "migratedAt",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "creator",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "renounceOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setLaunchpad",
"type": "function",
"inputs": [
{
"name": "launchpad",
"type": "address",
"internalType": "address"
},
{
"name": "allowed",
"type": "bool",
"internalType": "bool"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "transferOwnership",
"type": "function",
"inputs": [
{
"name": "newOwner",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
}
]0x60c060405234801561000f575f5ffd5b5060405161137b38038061137b83398101604081905261002e91610104565b826001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161007e565b506001600160a01b039182166080521660a05250610144565b600180546001600160a01b03191690556100978161009a565b50565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146100ff575f5ffd5b919050565b5f5f5f60608486031215610116575f5ffd5b61011f846100e9565b925061012d602085016100e9565b915061013b604085016100e9565b90509250925092565b60805160a0516111ec61018f5f395f81816102ef015281816104cd015281816105a80152818161072401526107b401525f818161033f015281816104f701526105d001526111ec5ff3fe6080604052600436106100ef575f3560e01c8063a7465bdb11610087578063dea5c2e011610057578063dea5c2e014610361578063e30c3978146103a2578063e4606ec1146103bf578063f2fde38b146103fd575f5ffd5b8063a7465bdb146102a7578063ad5c4648146102de578063be56bf3b14610311578063c45a01551461032e575f5ffd5b8063715018a6116100c2578063715018a61461022f57806379ba5097146102435780638da5cb5b14610257578063a0f8be8514610273575f5ffd5b80633b9ca2d0146100f3578063467273fe1461012a5780634836a7961461016157806355f5751014610182575b5f5ffd5b610106610101366004611009565b61041c565b604080516001600160a01b0390931683526020830191909152015b60405180910390f35b348015610135575f5ffd5b50610149610144366004611048565b610a6c565b6040516001600160a01b039091168152602001610121565b34801561016c575f5ffd5b5061018061017b36600461106c565b610a94565b005b34801561018d575f5ffd5b506101e961019c3660046110a3565b600360208190525f9182526040909120805460018201546002830154938301546004909301546001600160a01b03928316949193919267ffffffffffffffff821691600160401b90041686565b604080516001600160a01b0397881681526020810196909652850193909352606084019190915267ffffffffffffffff16608083015290911660a082015260c001610121565b34801561023a575f5ffd5b50610180610afa565b34801561024e575f5ffd5b50610180610b0d565b348015610262575f5ffd5b505f546001600160a01b0316610149565b34801561027e575f5ffd5b5061029261028d3660046110a3565b610b51565b60408051928352602083019190915201610121565b3480156102b2575f5ffd5b506101496102c13660046110a3565b6001600160a01b039081165f908152600360205260409020541690565b3480156102e9575f5ffd5b506101497f000000000000000000000000000000000000000000000000000000000000000081565b34801561031c575f5ffd5b50600454604051908152602001610121565b348015610339575f5ffd5b506101497f000000000000000000000000000000000000000000000000000000000000000081565b34801561036c575f5ffd5b5061014961037b3660046110a3565b6001600160a01b039081165f90815260036020526040902060040154600160401b90041690565b3480156103ad575f5ffd5b506001546001600160a01b0316610149565b3480156103ca575f5ffd5b506103ed6103d93660046110a3565b60026020525f908152604090205460ff1681565b6040519015158152602001610121565b348015610408575f5ffd5b506101806104173660046110a3565b610dac565b335f90815260026020526040812054819060ff1661044d5760405163ed6fcad960e01b815260040160405180910390fd5b6001600160a01b038581165f908152600360205260409020541615610485576040516332870f2f60e21b815260040160405180910390fd5b831580610490575034155b156104ae57604051631a7b9b9560e01b815260040160405180910390fd5b60405163e6a4390560e01b81526001600160a01b0386811660048301527f0000000000000000000000000000000000000000000000000000000000000000811660248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063e6a4390590604401602060405180830381865afa15801561053e573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061056291906110c5565b6001600160a01b0316146105895760405163c9bb25eb60e01b815260040160405180910390fd5b6040516364e329cb60e11b81526001600160a01b0386811660048301527f0000000000000000000000000000000000000000000000000000000000000000811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303815f875af1158015610616573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061063a91906110c5565b9150816001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610678573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061069c91906110e0565b156106f95760405162461bcd60e51b815260206004820152602260248201527f47726164756174696f6e4d69677261746f723a2070616972206e6f74206672656044820152610e6d60f31b60648201526084015b60405180910390fd5b61070e6001600160a01b038616333087610e1c565b6107226001600160a01b0386168386610e58565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004015f604051808303818588803b15801561077b575f5ffd5b505af115801561078d573d5f5f3e3d5ffd5b505060405163a9059cbb60e01b81526001600160a01b0386811660048301523460248301527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303815f875af11580156107fe573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061082291906110f7565b506040516335313c2160e11b81523060048201526001600160a01b03831690636a627842906024016020604051808303815f875af1158015610866573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061088a91906110e0565b9050805f036108ac5760405163f564880560e01b815260040160405180910390fd5b6040518060c00160405280836001600160a01b031681526020018281526020013481526020018581526020014267ffffffffffffffff168152602001846001600160a01b031681525060035f876001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060a08201518160040160086101000a8154816001600160a01b0302191690836001600160a01b03160217905550905050600485908060018154018082558091505060019003905f5260205f20015f9091909190916101000a8154816001600160a01b0302191690836001600160a01b03160217905550816001600160a01b0316856001600160a01b03167f57aa04076c8e8e00f17b6f082eb7c65ec1aa90f07da036638ccfcb07dcae6cc8863485604051610a5c939291909283526020830191909152604082015260600190565b60405180910390a3935093915050565b60048181548110610a7b575f80fd5b5f918252602090912001546001600160a01b0316905081565b610a9c610e92565b6001600160a01b0382165f81815260026020908152604091829020805460ff191685151590811790915591519182527f6bce717262ad8d508f67dc3376d3a257125260f8a426f2afef7296415f64850a910160405180910390a25050565b610b02610e92565b610b0b5f610ebe565b565b60015433906001600160a01b03168114610b455760405163118cdaa760e01b81526001600160a01b03821660048201526024016106f0565b610b4e81610ebe565b50565b6001600160a01b038082165f908152600360208181526040808420815160c0810183528154871680825260018301549482019490945260028201549281019290925292830154606082015260049092015467ffffffffffffffff81166080840152600160401b900490931660a08201529091829190610bd557505f93849350915050565b5f815f015190505f816001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c19573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c3d91906110e0565b9050805f03610c5357505f958695509350505050565b5f5f836001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015610c91573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cb5919061112d565b50915091505f5f896001600160a01b0316866001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d2691906110c5565b6001600160a01b031614610d4d57826001600160701b0316846001600160701b0316610d62565b836001600160701b0316836001600160701b03165b9150915084828860200151610d77919061116e565b610d819190611197565b985084818860200151610d94919061116e565b610d9e9190611197565b975050505050505050915091565b610db4610e92565b600180546001600160a01b0383166001600160a01b03199091168117909155610de45f546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b610e2a848484846001610ed7565b610e5257604051635274afe760e01b81526001600160a01b03851660048201526024016106f0565b50505050565b610e658383836001610f44565b610e8d57604051635274afe760e01b81526001600160a01b03841660048201526024016106f0565b505050565b5f546001600160a01b03163314610b0b5760405163118cdaa760e01b81523360048201526024016106f0565b600180546001600160a01b0319169055610b4e81610fa6565b6040516323b872dd60e01b5f8181526001600160a01b038781166004528616602452604485905291602083606481808c5af1925060015f51148316610f33578383151615610f27573d5f823e3d81fd5b5f883b113d1516831692505b604052505f60605295945050505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610f9a578383151615610f8e573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114610b4e575f5ffd5b5f5f5f6060848603121561101b575f5ffd5b833561102681610ff5565b925060208401359150604084013561103d81610ff5565b809150509250925092565b5f60208284031215611058575f5ffd5b5035919050565b8015158114610b4e575f5ffd5b5f5f6040838503121561107d575f5ffd5b823561108881610ff5565b915060208301356110988161105f565b809150509250929050565b5f602082840312156110b3575f5ffd5b81356110be81610ff5565b9392505050565b5f602082840312156110d5575f5ffd5b81516110be81610ff5565b5f602082840312156110f0575f5ffd5b5051919050565b5f60208284031215611107575f5ffd5b81516110be8161105f565b80516001600160701b0381168114611128575f5ffd5b919050565b5f5f5f6060848603121561113f575f5ffd5b61114884611112565b925061115660208501611112565b9150604084015163ffffffff8116811461103d575f5ffd5b808202811582820484141761119157634e487b7160e01b5f52601160045260245ffd5b92915050565b5f826111b157634e487b7160e01b5f52601260045260245ffd5b50049056fea2646970667358221220a67cf41b71facac13f71c5a0a2379c695ee94cff8bbc7ac39dac9ddcfb59646a64736f6c634300081c0033000000000000000000000000132d80667bac16fac8d918f117203cbd91b068a400000000000000000000000033408b932da33fea5f42dc1a16ae4425326912750000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73
0x6080604052600436106100ef575f3560e01c8063a7465bdb11610087578063dea5c2e011610057578063dea5c2e014610361578063e30c3978146103a2578063e4606ec1146103bf578063f2fde38b146103fd575f5ffd5b8063a7465bdb146102a7578063ad5c4648146102de578063be56bf3b14610311578063c45a01551461032e575f5ffd5b8063715018a6116100c2578063715018a61461022f57806379ba5097146102435780638da5cb5b14610257578063a0f8be8514610273575f5ffd5b80633b9ca2d0146100f3578063467273fe1461012a5780634836a7961461016157806355f5751014610182575b5f5ffd5b610106610101366004611009565b61041c565b604080516001600160a01b0390931683526020830191909152015b60405180910390f35b348015610135575f5ffd5b50610149610144366004611048565b610a6c565b6040516001600160a01b039091168152602001610121565b34801561016c575f5ffd5b5061018061017b36600461106c565b610a94565b005b34801561018d575f5ffd5b506101e961019c3660046110a3565b600360208190525f9182526040909120805460018201546002830154938301546004909301546001600160a01b03928316949193919267ffffffffffffffff821691600160401b90041686565b604080516001600160a01b0397881681526020810196909652850193909352606084019190915267ffffffffffffffff16608083015290911660a082015260c001610121565b34801561023a575f5ffd5b50610180610afa565b34801561024e575f5ffd5b50610180610b0d565b348015610262575f5ffd5b505f546001600160a01b0316610149565b34801561027e575f5ffd5b5061029261028d3660046110a3565b610b51565b60408051928352602083019190915201610121565b3480156102b2575f5ffd5b506101496102c13660046110a3565b6001600160a01b039081165f908152600360205260409020541690565b3480156102e9575f5ffd5b506101497f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad7381565b34801561031c575f5ffd5b50600454604051908152602001610121565b348015610339575f5ffd5b506101497f00000000000000000000000033408b932da33fea5f42dc1a16ae44253269127581565b34801561036c575f5ffd5b5061014961037b3660046110a3565b6001600160a01b039081165f90815260036020526040902060040154600160401b90041690565b3480156103ad575f5ffd5b506001546001600160a01b0316610149565b3480156103ca575f5ffd5b506103ed6103d93660046110a3565b60026020525f908152604090205460ff1681565b6040519015158152602001610121565b348015610408575f5ffd5b506101806104173660046110a3565b610dac565b335f90815260026020526040812054819060ff1661044d5760405163ed6fcad960e01b815260040160405180910390fd5b6001600160a01b038581165f908152600360205260409020541615610485576040516332870f2f60e21b815260040160405180910390fd5b831580610490575034155b156104ae57604051631a7b9b9560e01b815260040160405180910390fd5b60405163e6a4390560e01b81526001600160a01b0386811660048301527f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73811660248301525f917f00000000000000000000000033408b932da33fea5f42dc1a16ae4425326912759091169063e6a4390590604401602060405180830381865afa15801561053e573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061056291906110c5565b6001600160a01b0316146105895760405163c9bb25eb60e01b815260040160405180910390fd5b6040516364e329cb60e11b81526001600160a01b0386811660048301527f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73811660248301527f00000000000000000000000033408b932da33fea5f42dc1a16ae442532691275169063c9c65396906044016020604051808303815f875af1158015610616573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061063a91906110c5565b9150816001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610678573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061069c91906110e0565b156106f95760405162461bcd60e51b815260206004820152602260248201527f47726164756174696f6e4d69677261746f723a2070616972206e6f74206672656044820152610e6d60f31b60648201526084015b60405180910390fd5b61070e6001600160a01b038616333087610e1c565b6107226001600160a01b0386168386610e58565b7f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004015f604051808303818588803b15801561077b575f5ffd5b505af115801561078d573d5f5f3e3d5ffd5b505060405163a9059cbb60e01b81526001600160a01b0386811660048301523460248301527f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad7316935063a9059cbb925060440190506020604051808303815f875af11580156107fe573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061082291906110f7565b506040516335313c2160e11b81523060048201526001600160a01b03831690636a627842906024016020604051808303815f875af1158015610866573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061088a91906110e0565b9050805f036108ac5760405163f564880560e01b815260040160405180910390fd5b6040518060c00160405280836001600160a01b031681526020018281526020013481526020018581526020014267ffffffffffffffff168152602001846001600160a01b031681525060035f876001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060a08201518160040160086101000a8154816001600160a01b0302191690836001600160a01b03160217905550905050600485908060018154018082558091505060019003905f5260205f20015f9091909190916101000a8154816001600160a01b0302191690836001600160a01b03160217905550816001600160a01b0316856001600160a01b03167f57aa04076c8e8e00f17b6f082eb7c65ec1aa90f07da036638ccfcb07dcae6cc8863485604051610a5c939291909283526020830191909152604082015260600190565b60405180910390a3935093915050565b60048181548110610a7b575f80fd5b5f918252602090912001546001600160a01b0316905081565b610a9c610e92565b6001600160a01b0382165f81815260026020908152604091829020805460ff191685151590811790915591519182527f6bce717262ad8d508f67dc3376d3a257125260f8a426f2afef7296415f64850a910160405180910390a25050565b610b02610e92565b610b0b5f610ebe565b565b60015433906001600160a01b03168114610b455760405163118cdaa760e01b81526001600160a01b03821660048201526024016106f0565b610b4e81610ebe565b50565b6001600160a01b038082165f908152600360208181526040808420815160c0810183528154871680825260018301549482019490945260028201549281019290925292830154606082015260049092015467ffffffffffffffff81166080840152600160401b900490931660a08201529091829190610bd557505f93849350915050565b5f815f015190505f816001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c19573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c3d91906110e0565b9050805f03610c5357505f958695509350505050565b5f5f836001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015610c91573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cb5919061112d565b50915091505f5f896001600160a01b0316866001600160a01b0316630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d02573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d2691906110c5565b6001600160a01b031614610d4d57826001600160701b0316846001600160701b0316610d62565b836001600160701b0316836001600160701b03165b9150915084828860200151610d77919061116e565b610d819190611197565b985084818860200151610d94919061116e565b610d9e9190611197565b975050505050505050915091565b610db4610e92565b600180546001600160a01b0383166001600160a01b03199091168117909155610de45f546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b610e2a848484846001610ed7565b610e5257604051635274afe760e01b81526001600160a01b03851660048201526024016106f0565b50505050565b610e658383836001610f44565b610e8d57604051635274afe760e01b81526001600160a01b03841660048201526024016106f0565b505050565b5f546001600160a01b03163314610b0b5760405163118cdaa760e01b81523360048201526024016106f0565b600180546001600160a01b0319169055610b4e81610fa6565b6040516323b872dd60e01b5f8181526001600160a01b038781166004528616602452604485905291602083606481808c5af1925060015f51148316610f33578383151615610f27573d5f823e3d81fd5b5f883b113d1516831692505b604052505f60605295945050505050565b60405163a9059cbb60e01b5f8181526001600160a01b038616600452602485905291602083604481808b5af1925060015f51148316610f9a578383151615610f8e573d5f823e3d81fd5b5f873b113d1516831692505b60405250949350505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114610b4e575f5ffd5b5f5f5f6060848603121561101b575f5ffd5b833561102681610ff5565b925060208401359150604084013561103d81610ff5565b809150509250925092565b5f60208284031215611058575f5ffd5b5035919050565b8015158114610b4e575f5ffd5b5f5f6040838503121561107d575f5ffd5b823561108881610ff5565b915060208301356110988161105f565b809150509250929050565b5f602082840312156110b3575f5ffd5b81356110be81610ff5565b9392505050565b5f602082840312156110d5575f5ffd5b81516110be81610ff5565b5f602082840312156110f0575f5ffd5b5051919050565b5f60208284031215611107575f5ffd5b81516110be8161105f565b80516001600160701b0381168114611128575f5ffd5b919050565b5f5f5f6060848603121561113f575f5ffd5b61114884611112565b925061115660208501611112565b9150604084015163ffffffff8116811461103d575f5ffd5b808202811582820484141761119157634e487b7160e01b5f52601160045260245ffd5b92915050565b5f826111b157634e487b7160e01b5f52601260045260245ffd5b50049056fea2646970667358221220a67cf41b71facac13f71c5a0a2379c695ee94cff8bbc7ac39dac9ddcfb59646a64736f6c634300081c0033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| no internal transactions found for this address yet (traced blocks + on-demand) | ||||||||
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| no token transfers for this address yet | |||||||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0x32666a…d33314 | 34 days agoTue, 14 Jul 2026 19:15:30 UTC | 0x8be007…57e0 | [0] 0x000000000000…91b068a4 [1] 0x000000000000…876cfc17 |
| 0x7f9639…a65973 | 34 days agoTue, 14 Jul 2026 19:06:55 UTC | 0x38d16b…2700 | [0] 0x000000000000…91b068a4 [1] 0x000000000000…876cfc17 |
| 0xfc80b3…f23527 | 34 days agoTue, 14 Jul 2026 19:06:50 UTC | 0x6bce71…850a | [0] 0x000000000000…bec83ca5 data: 0x000000000000000000…00000001 |
| 0x5c4777…373989 | 34 days agoTue, 14 Jul 2026 19:06:44 UTC | 0x8be007…57e0 | [0] 0x000000000000…00000000 [1] 0x000000000000…91b068a4 |
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x32666a…d33314 | acceptOwnership | 9,773,574 | 34 days agoTue, 14 Jul 2026 19:15:30 UTC | 0x988d…fc17 | IN | GraduationMigrator | $0.000 ETH | 0.00000150 | |
| 0x7f9639…a65973 | transferOwnership | 9,768,430 | 34 days agoTue, 14 Jul 2026 19:06:55 UTC | 0x132d…68a4 | IN | GraduationMigrator | $0.000 ETH | 0.00000252 | |
| 0xfc80b3…f23527 | setLaunchpad | 9,768,386 | 34 days agoTue, 14 Jul 2026 19:06:50 UTC | 0x132d…68a4 | IN | GraduationMigrator | $0.000 ETH | 0.00000253 |