{"sources":{"MemeDrop.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\n// MemeDrop — auto-deployed meme NFT with random free/paid mint.\n// Paid mint ETH goes straight to owner (no claim). Agent-ID gated (owner exempt).\n// Royalty 10% EIP-2981. Max 2 per wallet. Supply set at deploy.\ninterface IRegistry { function balanceOf(address) external view returns (uint256); }\n\ncontract MemeDrop {\n    string public name;\n    string public symbol;\n    uint256 public constant MAX_PER_WALLET = 2;\n    uint256 public immutable maxSupply;\n    uint256 public mintPrice;      // 0 = free\n    uint16 public constant ROYALTY_BPS = 1000; // 10%\n    address public owner;\n    IRegistry public registry;\n    bool public mintOpen;\n    uint256 public totalMinted;\n\n    string private _baseURI_;\n\n    mapping(address => uint256) public mintedCount;\n    mapping(uint256 => address) public ownerOf;\n\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\n\n    constructor(\n        string memory _name,\n        string memory _sym,\n        uint256 _supply,\n        uint256 _price,\n        address _registry,\n        string memory baseURI_\n    ) {\n        owner = msg.sender;\n        name = _name;\n        symbol = _sym;\n        maxSupply = _supply;\n        mintPrice = _price;\n        registry = IRegistry(_registry);\n        _baseURI_ = baseURI_;\n    }\n\n    function openMint() external {\n        require(msg.sender == owner, \"!owner\");\n        mintOpen = true;\n    }\n\n    function mint() external payable {\n        require(mintOpen, \"closed\");\n        require(totalMinted + 1 <= maxSupply, \"supply\");\n        require(msg.sender == owner || registry.balanceOf(msg.sender) > 0, \"need agent id\");\n        require(mintedCount[msg.sender] < MAX_PER_WALLET, \"wallet cap\");\n        require(msg.value >= mintPrice, \"underpaid\");\n        // paid mint goes straight to owner — no claim needed\n        if (msg.value > 0) {\n            (bool ok, ) = owner.call{value: msg.value}(\"\");\n            require(ok, \"fwd fail\");\n        }\n        uint256 tokenId = ++totalMinted;\n        mintedCount[msg.sender]++;\n        ownerOf[tokenId] = msg.sender;\n        emit Transfer(address(0), msg.sender, tokenId);\n    }\n\n    function balanceOf(address who) external view returns (uint256) {\n        uint256 count;\n        for (uint256 i = 1; i <= totalMinted; i++) { if (ownerOf[i] == who) count++; }\n        return count;\n    }\n    function totalSupply() external view returns (uint256) { return totalMinted; }\n\n    function tokenURI(uint256 tokenId) external view returns (string memory) {\n        require(ownerOf[tokenId] != address(0), \"no token\");\n        return string(abi.encodePacked(_baseURI_, _u2s(tokenId), \".json\"));\n    }\n\n    function royaltyInfo(uint256, uint256 salePrice) external view returns (address, uint256) {\n        return (owner, salePrice * ROYALTY_BPS / 10000);\n    }\n\n    function _u2s(uint256 v) internal pure returns (string memory) {\n        if (v == 0) return \"0\";\n        uint256 len; uint256 t = v;\n        while (t > 0) { len++; t /= 10; }\n        bytes memory b = new bytes(len);\n        while (v > 0) { b[--len] = bytes1(uint8(48 + v % 10)); v /= 10; }\n        return string(b);\n    }\n}\n"}},"abi":[{"type":"constructor","inputs":[{"name":"_name","type":"string","internalType":"string"},{"name":"_sym","type":"string","internalType":"string"},{"name":"_supply","type":"uint256","internalType":"uint256"},{"name":"_price","type":"uint256","internalType":"uint256"},{"name":"_registry","type":"address","internalType":"address"},{"name":"baseURI_","type":"string","internalType":"string"}],"stateMutability":"nonpayable"},{"name":"Transfer","type":"event","inputs":[{"name":"from","type":"address","indexed":true,"internalType":"address"},{"name":"to","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"name":"MAX_PER_WALLET","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"ROYALTY_BPS","type":"function","inputs":[],"outputs":[{"name":"","type":"uint16","internalType":"uint16"}],"stateMutability":"view"},{"name":"balanceOf","type":"function","inputs":[{"name":"who","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"maxSupply","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"mint","type":"function","inputs":[],"outputs":[],"stateMutability":"payable"},{"name":"mintOpen","type":"function","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"mintPrice","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"mintedCount","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"name","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"openMint","type":"function","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"name":"owner","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"ownerOf","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"registry","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IRegistry"}],"stateMutability":"view"},{"name":"royaltyInfo","type":"function","inputs":[{"name":"","type":"uint256","internalType":"uint256"},{"name":"salePrice","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"},{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"symbol","type":"function","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"tokenURI","type":"function","inputs":[{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"name":"totalMinted","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"name":"totalSupply","type":"function","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"}],"matchId":"58214265","creationMatch":"exact_match","runtimeMatch":"exact_match","verifiedAt":"2026-11-03T12:29:56Z","match":"exact_match","chainId":"56","address":"0x801d7C27fe11A43a041CDdbcFC7f481cdE0cA92d"}