ETH Price: $Gas: GweiBase: 0.0206 GweiPriority: 0.0000 GweiTotal: 0.0000 Gwei

Address

aaaa(AAA)0xc7105f5f3c71439beecac4f8ae0974ef352524de
Overview
ETH Balance
0 ETH
ETH Value
$0.00 (@ $0/ETH)
Token Holdings
More Info
Private Name Tags
Token Tracker
Transactions Sent
Additional Info
Funded By
0x124f…4bb4 · 5 days ago
Token Approvals
TransactionsInternal TransactionsToken Transfers (ERC-20)NFT TransfersOther TransactionsAnalyticsAssetsHoldersCardsInfo
✓ VerifiedExact Matchaaaa⤢ Open full
Contract Name
PonsLauncherToken (aaaa)
Compiler
solidity · v0.8.30+commit.73712a01
Optimization
Yes · 300 runs
EVM Version
cancun
Source
Mirrored from Robinhood Chain explorer
Contract Source Code
Outline
C PonsLauncherToken
ƒ liquidityPool
ƒ socials
ƒ getTokenInfo
ƒ maxWalletLimit
ƒ maxWalletAmount
ƒ maxTxLimit
ƒ maxTxAmount
ƒ setInitialBuyRecipient
ƒ _update
ƒ _isPairPool
PonsLauncherToken.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;

import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {IUniswapV3FactoryLike, IUniswapV3PoolImmutablesLike} from "./interfaces/ILaunchpad.sol";

/**
 * @title PonsLauncherToken
 * @notice Fixed-supply ERC-20 deployed by PonsLaunchFactory for a V3 launch.
 * Launch protections only apply to buys from the canonical pool during the
 * configured restriction window. Afterward the token behaves as a plain ERC-20.
 */
contract PonsLauncherToken is ERC20 {
    struct Socials {
        string twitter;
        string telegram;
        string discord;
        string website;
        string farcaster;
    }

    error LaunchBlockBuyBlocked(address recipient);
    error MaxWalletExceeded(address account, uint256 balance, uint256 limit);
    error MaxTxExceeded(address recipient, uint256 attempted, uint256 limit);
    error NotLaunchFactory();
    error ZeroAddress();

    address public immutable deployer;
    address public immutable launchFactory;
    address public immutable dexFactory;
    address public immutable positionManager;
    address public immutable pairToken;
    uint24 public immutable poolFee;

    uint256 public immutable launchBlock;
    uint256 public immutable restrictionBlocks;
    uint256 public immutable restrictionEndBlock;
    uint16 public immutable maxWalletBps;
    uint16 public immutable maxTxBps;

    string public logo;
    string public description;

    Socials private _socials;
    address private _initialBuyRecipient;
    mapping(address recipient => uint256 amount) private _restrictedPoolBuys;

    /**
     * @notice Creates a launch token and mints its entire supply to the factory.
     */
    constructor(
        string memory name_,
        string memory symbol_,
        string memory logo_,
        string memory description_,
        Socials memory socials_,
        address deployer_,
        address dexFactory_,
        address positionManager_,
        address pairToken_,
        uint24 poolFee_,
        uint256 supply_,
        uint16 maxWalletBps_,
        uint16 maxTxBps_,
        uint32 restrictionBlocks_
    ) ERC20(name_, symbol_) {
        if (
            deployer_ == address(0) || dexFactory_ == address(0) || positionManager_ == address(0)
                || pairToken_ == address(0)
        ) {
            revert ZeroAddress();
        }

        deployer = deployer_;
        launchFactory = msg.sender;
        dexFactory = dexFactory_;
        positionManager = positionManager_;
        pairToken = pairToken_;
        poolFee = poolFee_;
        launchBlock = block.number;
        restrictionBlocks = restrictionBlocks_;
        restrictionEndBlock = block.number + restrictionBlocks_;
        maxWalletBps = maxWalletBps_;
        maxTxBps = maxTxBps_;
        logo = logo_;
        description = description_;
        _socials = socials_;

        _mint(msg.sender, supply_);
    }

    /**
     * @notice Returns the canonical V3 pool once the factory has created it.
     */
    function liquidityPool() public view returns (address) {
        return IUniswapV3FactoryLike(dexFactory).getPool(address(this), pairToken, poolFee);
    }

    /**
     * @notice Returns the launch token's five social metadata fields.
     */
    function socials()
        external
        view
        returns (
            string memory twitter,
            string memory telegram,
            string memory discord,
            string memory website,
            string memory farcaster
        )
    {
        Socials memory values = _socials;
        return (values.twitter, values.telegram, values.discord, values.website, values.farcaster);
    }

    /**
     * @notice Returns creator and metadata in the launcher-compatible tuple.
     */
    function getTokenInfo()
        external
        view
        returns (
            address tokenDeployer,
            string memory tokenLogo,
            string memory tokenDescription,
            Socials memory tokenSocials
        )
    {
        return (deployer, logo, description, _socials);
    }

    /**
     * @notice Maximum recipient balance during the restricted launch window.
     */
    function maxWalletLimit() public view returns (uint256) {
        return (totalSupply() * maxWalletBps) / 10_000;
    }

    /**
     * @notice Compatibility alias for maxWalletLimit.
     */
    function maxWalletAmount() external view returns (uint256) {
        return maxWalletLimit();
    }

    /**
     * @notice Base cumulative pool-buy limit during the restricted window.
     */
    function maxTxLimit() public view returns (uint256) {
        return (totalSupply() * maxTxBps) / 10_000;
    }

    /**
     * @notice Compatibility alias for maxTxLimit.
     */
    function maxTxAmount() external view returns (uint256) {
        return maxTxLimit();
    }

    /**
     * @notice Opens or closes the one-call exemption used by the factory's atomic initial buy.
     */
    function setInitialBuyRecipient(address recipient) external {
        if (msg.sender != launchFactory) revert NotLaunchFactory();
        _initialBuyRecipient = recipient;
    }

    /**
     * @dev Applies the observed launch restrictions only to pool-to-user buys.
     * The factory opens a narrow recipient exemption only while its atomic
     * initial buy is executing.
     */
    function _update(address from, address to, uint256 value) internal override {
        if (from != address(0) && to != address(0) && block.number <= restrictionEndBlock) {
            bool isRestrictedBuy = _isPairPool(from);
            if (!isRestrictedBuy) {
                super._update(from, to, value);
                return;
            }

            bool isAtomicLaunchBuy =
                block.number == launchBlock && _initialBuyRecipient != address(0) && to == _initialBuyRecipient;
            if (!isAtomicLaunchBuy && block.number == launchBlock) {
                revert LaunchBlockBuyBlocked(to);
            }

            if (!isAtomicLaunchBuy) {
                uint256 walletLimit = maxWalletLimit();
                uint256 resultingBalance = balanceOf(to) + value;
                if (resultingBalance > walletLimit) {
                    revert MaxWalletExceeded(to, resultingBalance, walletLimit);
                }

                uint256 cumulative = _restrictedPoolBuys[to] + value;
                uint256 cumulativeLimit = maxTxLimit();
                if (cumulative > cumulativeLimit) {
                    revert MaxTxExceeded(to, cumulative, cumulativeLimit);
                }
                _restrictedPoolBuys[to] = cumulative;
            }
        }

        super._update(from, to, value);
    }

    /**
     * @notice Identifies any V3 pool registered by the configured factory for
     * this token and its paired asset, regardless of fee tier.
     */
    function _isPairPool(address candidate) private view returns (bool) {
        address canonicalPool = liquidityPool();
        if (candidate == canonicalPool && canonicalPool != address(0)) return true;
        if (candidate.code.length == 0) return false;

        (bool feeRead, bytes memory feeData) =
            candidate.staticcall(abi.encodeCall(IUniswapV3PoolImmutablesLike.fee, ()));
        if (!feeRead || feeData.length < 32) return false;

        uint24 candidateFee = abi.decode(feeData, (uint24));
        return IUniswapV3FactoryLike(dexFactory).getPool(address(this), pairToken, candidateFee) == candidate;
    }
}
Contract ABI
[
 {
  "type": "constructor",
  "inputs": [
   {
    "name": "name_",
    "type": "string",
    "internalType": "string"
   },
   {
    "name": "symbol_",
    "type": "string",
    "internalType": "string"
   },
   {
    "name": "logo_",
    "type": "string",
    "internalType": "string"
   },
   {
    "name": "description_",
    "type": "string",
    "internalType": "string"
   },
   {
    "name": "socials_",
    "type": "tuple",
    "components": [
     {
      "name": "twitter",
      "type": "string",
      "internalType": "string"
     },
     {
      "name": "telegram",
      "type": "string",
      "internalType": "string"
     },
     {
      "name": "discord",
      "type": "string",
      "internalType": "string"
     },
     {
      "name": "website",
      "type": "string",
      "internalType": "string"
     },
     {
      "name": "farcaster",
      "type": "string",
      "internalType": "string"
     }
    ],
    "internalType": "struct PonsLauncherToken.Socials"
   },
   {
    "name": "deployer_",
    "type": "address",
    "internalType": "address"
   },
   {
    "name": "dexFactory_",
    "type": "address",
    "internalType": "address"
   },
   {
    "name": "positionManager_",
    "type": "address",
    "internalType": "address"
   },
   {
    "name": "pairToken_",
    "type": "address",
    "internalType": "address"
   },
   {
    "name": "poolFee_",
    "type": "uint24",
    "internalType": "uint24"
   },
   {
    "name": "supply_",
    "type": "uint256",
    "internalType": "uint256"
   },
   {
    "name": "maxWalletBps_",
    "type": "uint16",
    "internalType": "uint16"
   },
   {
    "name": "maxTxBps_",
    "type": "uint16",
    "internalType": "uint16"
   },
   {
    "name": "restrictionBlocks_",
    "type": "uint32",
    "internalType": "uint32"
   }
  ],
  "stateMutability": "nonpayable"
 },
 {
  "name": "ERC20InsufficientAllowance",
  "type": "error",
  "inputs": [
   {
    "name": "spender",
    "type": "address",
    "internalType": "address"
   },
   {
    "name": "allowance",
    "type": "uint256",
    "internalType": "uint256"
   },
   {
    "name": "needed",
    "type": "uint256",
    "internalType": "uint256"
   }
  ]
 },
 {
  "name": "ERC20InsufficientBalance",
  "type": "error",
  "inputs": [
   {
    "name": "sender",
    "type": "address",
    "internalType": "address"
   },
   {
    "name": "balance",
    "type": "uint256",
    "internalType": "uint256"
   },
   {
    "name": "needed",
    "type": "uint256",
    "internalType": "uint256"
   }
  ]
 },
 {
  "name": "ERC20InvalidApprover",
  "type": "error",
  "inputs": [
   {
    "name": "approver",
    "type": "address",
    "internalType": "address"
   }
  ]
 },
 {
  "name": "ERC20InvalidReceiver",
  "type": "error",
  "inputs": [
   {
    "name": "receiver",
    "type": "address",
    "internalType": "address"
   }
  ]
 },
 {
  "name": "ERC20InvalidSender",
  "type": "error",
  "inputs": [
   {
    "name": "sender",
    "type": "address",
    "internalType": "address"
   }
  ]
 },
 {
  "name": "ERC20InvalidSpender",
  "type": "error",
  "inputs": [
   {
    "name": "spender",
    "type": "address",
    "internalType": "address"
   }
  ]
 },
 {
  "name": "LaunchBlockBuyBlocked",
  "type": "error",
  "inputs": [
   {
    "name": "recipient",
    "type": "address",
    "internalType": "address"
   }
  ]
 },
 {
  "name": "MaxTxExceeded",
  "type": "error",
  "inputs": [
   {
    "name": "recipient",
    "type": "address",
    "internalType": "address"
   },
   {
    "name": "attempted",
    "type": "uint256",
    "internalType": "uint256"
   },
   {
    "name": "limit",
    "type": "uint256",
    "internalType": "uint256"
   }
  ]
 },
 {
  "name": "MaxWalletExceeded",
  "type": "error",
  "inputs": [
   {
    "name": "account",
    "type": "address",
    "internalType": "address"
   },
   {
    "name": "balance",
    "type": "uint256",
    "internalType": "uint256"
   },
   {
    "name": "limit",
    "type": "uint256",
    "internalType": "uint256"
   }
  ]
 },
 {
  "name": "NotLaunchFactory",
  "type": "error",
  "inputs": []
 },
 {
  "name": "ZeroAddress",
  "type": "error",
  "inputs": []
 },
 {
  "name": "Approval",
  "type": "event",
  "inputs": [
   {
    "name": "owner",
    "type": "address",
    "indexed": true,
    "internalType": "address"
   },
   {
    "name": "spender",
    "type": "address",
    "indexed": true,
    "internalType": "address"
   },
   {
    "name": "value",
    "type": "uint256",
    "indexed": false,
    "internalType": "uint256"
   }
  ],
  "anonymous": false
 },
 {
  "name": "Transfer",
  "type": "event",
  "inputs": [
   {
    "name": "from",
    "type": "address",
    "indexed": true,
    "internalType": "address"
   },
   {
    "name": "to",
    "type": "address",
    "indexed": true,
    "internalType": "address"
   },
   {
    "name": "value",
    "type": "uint256",
    "indexed": false,
    "internalType": "uint256"
   }
  ],
  "anonymous": false
 },
 {
  "name": "allowance",
  "type": "function",
  "inputs": [
   {
    "name": "owner",
    "type": "address",
    "internalType": "address"
   },
   {
    "name": "spender",
    "type": "address",
    "internalType": "address"
   }
  ],
  "outputs": [
   {
    "name": "",
    "type": "uint256",
    "internalType": "uint256"
   }
  ],
  "stateMutability": "view"
 },
 {
  "name": "approve",
  "type": "function",
  "inputs": [
   {
    "name": "spender",
    "type": "address",
    "internalType": "address"
   },
   {
    "name": "value",
    "type": "uint256",
    "internalType": "uint256"
   }
  ],
  "outputs": [
   {
    "name": "",
    "type": "bool",
    "internalType": "bool"
   }
  ],
  "stateMutability": "nonpayable"
 },
 {
  "name": "balanceOf",
  "type": "function",
  "inputs": [
   {
    "name": "account",
    "type": "address",
    "internalType": "address"
   }
  ],
  "outputs": [
   {
    "name": "",
    "type": "uint256",
    "internalType": "uint256"
   }
  ],
  "stateMutability": "view"
 },
 {
  "name": "decimals",
  "type": "function",
  "inputs": [],
  "outputs": [
   {
    "name": "",
    "type": "uint8",
    "internalType": "uint8"
   }
  ],
  "stateMutability": "view"
 },
 {
  "name": "deployer",
  "type": "function",
  "inputs": [],
  "outputs": [
   {
    "name": "",
    "type": "address",
    "internalType": "address"
   }
  ],
  "stateMutability": "view"
 },
 {
  "name": "description",
  "type": "function",
  "inputs": [],
  "outputs": [
   {
    "name": "",
    "type": "string",
    "internalType": "string"
   }
  ],
  "stateMutability": "view"
 },
 {
  "name": "dexFactory",
  "type": "function",
  "inputs": [],
  "outputs": [
   {
    "name": "",
    "type": "address",
    "internalType": "address"
   }
  ],
  "stateMutability": "view"
 },
 {
  "name": "getTokenInfo",
  "type": "function",
  "inputs": [],
  "outputs": [
   {
    "name": "tokenDeployer",
    "type": "address",
    "internalType": "address"
   },
   {
    "name": "tokenLogo",
    "type": "string",
    "internalType": "string"
   },
   {
    "name": "tokenDescription",
    "type": "string",
    "internalType": "string"
   },
   {
    "name": "tokenSocials",
    "type": "tuple",
    "components": [
     {
      "name": "twitter",
      "type": "string",
      "internalType": "string"
     },
     {
      "name": "telegram",
      "type": "string",
      "internalType": "string"
     },
     {
      "name": "discord",
      "type": "string",
      "internalType": "string"
     },
     {
      "name": "website",
      "type": "string",
      "internalType": "string"
     },
     {
      "name": "farcaster",
      "type": "string",
      "internalType": "string"
     }
    ],
    "internalType": "struct PonsLauncherToken.Socials"
   }
  ],
  "stateMutability": "view"
 },
 {
  "name": "launchBlock",
  "type": "function",
  "inputs": [],
  "outputs": [
   {
    "name": "",
    "type": "uint256",
    "internalType": "uint256"
   }
  ],
  "stateMutability": "view"
 },
 {
  "name": "launchFactory",
  "type": "function",
  "inputs": [],
  "outputs": [
   {
    "name": "",
    "type": "address",
    "internalType": "address"
   }
  ],
  "stateMutability": "view"
 },
 {
  "name": "liquidityPool",
  "type": "function",
  "inputs": [],
  "outputs": [
   {
    "name": "",
    "type": "address",
    "internalType": "address"
   }
  ],
  "stateMutability": "view"
 },
 {
  "name": "logo",
  "type": "function",
  "inputs": [],
  "outputs": [
   {
    "name": "",
    "type": "string",
    "internalType": "string"
   }
  ],
  "stateMutability": "view"
 },
 {
  "name": "maxTxAmount",
  "type": "function",
  "inputs": [],
  "outputs": [
   {
    "name": "",
    "type": "uint256",
    "internalType": "uint256"
   }
  ],
  "stateMutability": "view"
 },
 {
  "name": "maxTxBps",
  "type": "function",
  "inputs": [],
  "outputs": [
   {
    "name": "",
    "type": "uint16",
    "internalType": "uint16"
   }
  ],
  "stateMutability": "view"
 },
 {
  "name": "maxTxLimit",
  "type": "function",
  "inputs": [],
  "outputs": [
   {
    "name": "",
    "type": "uint256",
    "internalType": "uint256"
   }
  ],
  "stateMutability": "view"
 },
 {
  "name": "maxWalletAmount",
  "type": "function",
  "inputs": [],
  "outputs": [
   {
    "name": "",
    "type": "uint256",
    "internalType": "uint256"
   }
  ],
  "stateMutability": "view"
 },
 {
  "name": "maxWalletBps",
  "type": "function",
  "inputs": [],
  "outputs": [
   {
    "name": "",
    "type": "uint16",
    "internalType": "uint16"
   }
  ],
  "stateMutability": "view"
 },
 {
  "name": "maxWalletLimit",
  "type": "function",
  "inputs": [],
  "outputs": [
   {
    "name": "",
    "type": "uint256",
    "internalType": "uint256"
   }
  ],
  "stateMutability": "view"
 },
 {
  "name": "name",
  "type": "function",
  "inputs": [],
  "outputs": [
   {
    "name": "",
    "type": "string",
    "internalType": "string"
   }
  ],
  "stateMutability": "view"
 },
 {
  "name": "pairToken",
  "type": "function",
  "inputs": [],
  "outputs": [
   {
    "name": "",
    "type": "address",
    "internalType": "address"
   }
  ],
  "stateMutability": "view"
 },
 {
  "name": "poolFee",
  "type": "function",
  "inputs": [],
  "outputs": [
   {
    "name": "",
    "type": "uint24",
    "internalType": "uint24"
   }
  ],
  "stateMutability": "view"
 },
 {
  "name": "positionManager",
  "type": "function",
  "inputs": [],
  "outputs": [
   {
    "name": "",
    "type": "address",
    "internalType": "address"
   }
  ],
  "stateMutability": "view"
 },
 {
  "name": "restrictionBlocks",
  "type": "function",
  "inputs": [],
  "outputs": [
   {
    "name": "",
    "type": "uint256",
    "internalType": "uint256"
   }
  ],
  "stateMutability": "view"
 },
 {
  "name": "restrictionEndBlock",
  "type": "function",
  "inputs": [],
  "outputs": [
   {
    "name": "",
    "type": "uint256",
    "internalType": "uint256"
   }
  ],
  "stateMutability": "view"
 },
 {
  "name": "setInitialBuyRecipient",
  "type": "function",
  "inputs": [
   {
    "name": "recipient",
    "type": "address",
    "internalType": "address"
   }
  ],
  "outputs": [],
  "stateMutability": "nonpayable"
 },
 {
  "name": "socials",
  "type": "function",
  "inputs": [],
  "outputs": [
   {
    "name": "twitter",
    "type": "string",
    "internalType": "string"
   },
   {
    "name": "telegram",
    "type": "string",
    "internalType": "string"
   },
   {
    "name": "discord",
    "type": "string",
    "internalType": "string"
   },
   {
    "name": "website",
    "type": "string",
    "internalType": "string"
   },
   {
    "name": "farcaster",
    "type": "string",
    "internalType": "string"
   }
  ],
  "stateMutability": "view"
 },
 {
  "name": "symbol",
  "type": "function",
  "inputs": [],
  "outputs": [
   {
    "name": "",
    "type": "string",
    "internalType": "string"
   }
  ],
  "stateMutability": "view"
 },
 {
  "name": "totalSupply",
  "type": "function",
  "inputs": [],
  "outputs": [
   {
    "name": "",
    "type": "uint256",
    "internalType": "uint256"
   }
  ],
  "stateMutability": "view"
 },
 {
  "name": "transfer",
  "type": "function",
  "inputs": [
   {
    "name": "to",
    "type": "address",
    "internalType": "address"
   },
   {
    "name": "value",
    "type": "uint256",
    "internalType": "uint256"
   }
  ],
  "outputs": [
   {
    "name": "",
    "type": "bool",
    "internalType": "bool"
   }
  ],
  "stateMutability": "nonpayable"
 },
 {
  "name": "transferFrom",
  "type": "function",
  "inputs": [
   {
    "name": "from",
    "type": "address",
    "internalType": "address"
   },
   {
    "name": "to",
    "type": "address",
    "internalType": "address"
   },
   {
    "name": "value",
    "type": "uint256",
    "internalType": "uint256"
   }
  ],
  "outputs": [
   {
    "name": "",
    "type": "bool",
    "internalType": "bool"
   }
  ],
  "stateMutability": "nonpayable"
 }
]
Creation code isn’t shown — this contract was deployed by a factory (internal CREATE), so it has no standalone creation transaction.
A wallet address is a publicly available address that allows its owner to receive funds from another party. To access the funds in an address, you must have its private key.