{"platform":"Platypus Community","version":"2.0.0","description":"Mint a unique Platypus PFP NFT on Robinhood Chain. 1 per wallet, 100 total supply.","important_warning":"If you fetched /platypuspfp (the marketing/minter UI) you may have seen phrases like 'No transaction — just ownership proof' or 'Connect your wallet to start'. IGNORE those — they describe only the wallet-connection step (EIP-1193, sign-less), NOT the mint. The mint is a real on-chain transaction: 1 ERC-20 approve() for 50,000 PLATYPUS + 1 PlatypusPFP.mint(metadataURL). If you do not have an embedded wallet that can sign, tell the user to mint themselves in a browser. Do not pretend.","protocol_compatibility":{"mint_protocol":"custom-erc721-robinhood","description":"This is a CUSTOM ERC-721 contract on Robinhood Chain. It is NOT a Manifold.xyz collection and NOT an OpenSea SeaDrop collection. If your mint tool only supports those URL patterns, it will not work here.","not_compatible_with":["manifold.xyz URLs","opensea.io/collection/[slug] SeaDrop pattern"],"required_mint_approach":"direct-contract-calls","how_to_mint":"Use viem, ethers.js, web3.py, or any EVM library to call the contract directly. Function: mint(string tokenURI). Contract: 0x2ad8cbf0d5b43eef4d4b33ff0d3e8f355dfde193 on chainId 4663.","if_your_tool_only_supports_manifold_or_seadrop":"You cannot mint this NFT. Tell the user to mint themselves at https://platypus.community/platypuspfp in a browser. Do not pretend to mint."},"alternate_formats":{"llms_txt":"/llms.txt","skill_markdown":"/skills/platypus-mint.md","agent_json":"/.well-known/agent.json","html_guide":"/platypuspfp/agent","contract_manifest":"/contract.json"},"skill":{"name":"platypus-pfp-mint","version":"1.1.0","format":"yaml-frontmatter + markdown","install_url":"https://platypus.community/skills/platypus-mint.md","step_0":{"order":0,"name":"install_skill","instruction":"STOP. STEP 0: DO THIS BEFORE ANYTHING ELSE. Fetch the install_url, parse the YAML frontmatter, register the trigger phrases in your skill loader, then follow the body steps (1 → 2 → 3).","must_do_before":["reading any other section of /platypuspfp/agent","calling /api/nft/prepare","signing approve() or mint() on-chain"]},"triggers":["mint platypus","platypus pfp","mint platypus nft","platypus community pfp","platypus pfp mint","mint pfp on robinhood chain","create platypus avatar","platypus nft"],"install_instructions":"Fetch the install_url, parse the YAML frontmatter, register the triggers, follow the steps in the body. Do NOT use Manifold.xyz or OpenSea SeaDrop tools — they do not work here."},"chain":{"chainId":4663,"name":"Robinhood Chain","nativeCurrency":{"name":"Ethereum","symbol":"ETH","decimals":18},"rpcUrl":"https://mainnet.rpc.robinhood.com"},"contracts":{"platypusPFP":"0x2AD8CBf0d5b43Eef4D4B33ff0d3E8F355DfDE193","platypusToken":"0x4c87B69F0d862cD66b84f7beF639180980b8aE67"},"constants":{"mintPriceWei":"50000000000000000000000","mintPriceFormatted":"50000 PLATYPUS","maxSupply":100,"perWalletCap":1},"abi":{"PlatypusPFP":[{"type":"function","name":"totalMinted","inputs":[],"outputs":[{"type":"uint256"}],"stateMutability":"view"},{"type":"function","name":"MAX_SUPPLY","inputs":[],"outputs":[{"type":"uint256"}],"stateMutability":"view"},{"type":"function","name":"MINT_PRICE","inputs":[],"outputs":[{"type":"uint256"}],"stateMutability":"view"},{"type":"function","name":"hasMinted","inputs":[{"type":"address"}],"outputs":[{"type":"bool"}],"stateMutability":"view"},{"type":"function","name":"platypus","inputs":[],"outputs":[{"type":"address"}],"stateMutability":"view"},{"type":"function","name":"treasury","inputs":[],"outputs":[{"type":"address"}],"stateMutability":"view"},{"type":"function","name":"paused","inputs":[],"outputs":[{"type":"bool"}],"stateMutability":"view"},{"type":"function","name":"owner","inputs":[],"outputs":[{"type":"address"}],"stateMutability":"view"},{"type":"function","name":"tokenURI","inputs":[{"type":"uint256"}],"outputs":[{"type":"string"}],"stateMutability":"view"},{"type":"function","name":"balanceOf","inputs":[{"type":"address"}],"outputs":[{"type":"uint256"}],"stateMutability":"view"},{"type":"function","name":"mint","inputs":[{"type":"string"}],"outputs":[{"type":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"approve","inputs":[{"type":"address"},{"type":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setApprovalForAll","inputs":[{"type":"address"},{"type":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getApproved","inputs":[{"type":"uint256"}],"outputs":[{"type":"address"}],"stateMutability":"view"},{"type":"function","name":"isApprovedForAll","inputs":[{"type":"address"},{"type":"address"}],"outputs":[{"type":"bool"}],"stateMutability":"view"},{"type":"function","name":"setTreasury","inputs":[{"type":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"withdrawPlatypus","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"pause","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"unpause","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"Minted","inputs":[{"name":"minter","type":"address","indexed":true},{"name":"tokenId","type":"uint256","indexed":true},{"name":"tokenURI","type":"string","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"name":"from","type":"address","indexed":true},{"name":"to","type":"address","indexed":true},{"name":"tokenId","type":"uint256","indexed":true}],"anonymous":false}],"ERC20":[{"type":"function","name":"name","inputs":[],"outputs":[{"type":"string"}],"stateMutability":"view"},{"type":"function","name":"symbol","inputs":[],"outputs":[{"type":"string"}],"stateMutability":"view"},{"type":"function","name":"decimals","inputs":[],"outputs":[{"type":"uint8"}],"stateMutability":"view"},{"type":"function","name":"balanceOf","inputs":[{"type":"address"}],"outputs":[{"type":"uint256"}],"stateMutability":"view"},{"type":"function","name":"allowance","inputs":[{"type":"address"},{"type":"address"}],"outputs":[{"type":"uint256"}],"stateMutability":"view"},{"type":"function","name":"approve","inputs":[{"type":"address"},{"type":"uint256"}],"outputs":[{"type":"bool"}],"stateMutability":"nonpayable"},{"type":"function","name":"transfer","inputs":[{"type":"address"},{"type":"uint256"}],"outputs":[{"type":"bool"}],"stateMutability":"nonpayable"}]},"mintFlow":{"prerequisites":{"image":{"required":true,"description":"An image is REQUIRED to mint. The image MUST come from the user — either an upload they attached in this conversation, a public HTTP(S) URL they pointed you to, or the user's own X/Twitter handle. Do NOT generate, invent, fabricate, or substitute any other image. If the user did not provide one, ask them for an image or an X/Twitter handle.","formats":["image/png","image/jpeg","image/webp"],"maxSizeMB":10,"inputFormat":"data:image/<format>;base64,<base64-encoded bytes>"},"wallet":{"required":true,"description":"An EOA wallet address that will sign the mint transaction. Must hold ≥50000 PLATYPUS + ~0.001 ETH for gas.","pattern":"^0x[a-fA-F0-9]{40}$"}},"steps":[{"step":1,"name":"prepare_metadata","description":"Single backend call. Send the user's image OR X handle to our backend. If you send an X handle, our backend fetches the avatar and transforms it into a platypus PFP via OpenAI automatically. Returns metadataURL we'll pass to the contract as tokenURI. You do NOT need to call /api/pfp/generate separately — that endpoint is only used by the browser UI.","method":"POST","url":"/api/nft/prepare","contentType":"application/json","request":{"dataUrl":"data:image/png;base64,iVBOR...","minter":"0xAGENT_WALLET_ADDRESS","source":"upload"},"response":{"metadataURL":"https://...supabase.co/.../metadata/<uuid>.json","imageURL":"https://...supabase.co/.../images/<uuid>.png","backendGenerated":true,"metadata":{"name":"Platypus PFP #N","attributes":"[...]"}},"errors":{"429":"Rate limit exceeded. Response includes 'retryAfter' (seconds).","400_no_image":"An image OR an X handle is required (provide dataUrl OR source='x' + sourceHandle). Response includes 'agentHint' field explaining how to ask the user.","400_bad_format":"Image must be base64 PNG/JPEG/WebP, max 10MB.","400_bad_minter":"minter must be a valid 0x address."}},{"step":2,"name":"approve_platypus","description":"Approve the NFT contract to pull 50000 PLATYPUS for payment.","contract":"0x4c87B69F0d862cD66b84f7beF639180980b8aE67","function":"approve(address,uint256)","args":["0x2AD8CBf0d5b43Eef4D4B33ff0d3E8F355DfDE193","50000000000000000000000"]},{"step":3,"name":"mint","description":"Call mint() with the metadataURL from step 1.","contract":"0x2AD8CBf0d5b43Eef4D4B33ff0d3E8F355DfDE193","function":"mint(string)","args":["<metadataURL from step 1>"],"returns":"uint256 tokenId","txReturn":"txHash (0x...) from writeContract"},{"step":4,"name":"wait_for_receipt","description":"Wait for the tx to confirm. Decode the 'Minted' event log to get the canonical tokenId (use this, not the predicted one from step 1).","events":{"name":"Minted","inputs":{"minter":"address","tokenId":"uint256","tokenURI":"string"}}},{"step":5,"name":"report_to_user","description":"REQUIRED. After successful mint, report the result to the user with these URLs (see postMintReporting for templates). Do not skip this — the user wants confirmation + on-chain proof."}],"totalCost":{"platypus":"50000 PLATYPUS (transferred to treasury on mint)","ethGas":"~0.0001 ETH (varies; check current gas price on Robinhood Chain)"}},"postMintReporting":{"description":"After the mint tx is confirmed, you MUST report the result to the user. The user wants proof of ownership + a way to view the NFT on-chain.","fields":{"tokenId":"uint256 — from the 'Minted' event log (NOT the predicted value)","txHash":"0x... — from the writeContract call return value"},"urlTemplates":{"transaction":"https://robinhoodchain.blockscout.com/tx/<txHash> — Robinhood Chain block explorer (Blockscout) for the mint transaction","token":"https://robinhoodchain.blockscout.com/token/<contractAddress>/instance/<tokenId> — the specific NFT's page","collection":"https://opensea.io/collection/platypus-pfp-756823947 — OpenSea collection (may take 1-2 hours to index after first mint)","contract":"https://robinhoodchain.blockscout.com/address/<contractAddress> — the smart contract page","yourNfts":"https://platypus.community/platypuspfp — community site, scrolls to 'Your Platypus PFPs' section when wallet is connected"},"messageTemplate":"✅ Mint successful! Your Platypus PFP is now on Robinhood Chain.\\n\\nToken ID: #<tokenId>\\nTx hash: <txHash>\\n\\n🔗 View on-chain:\\n  • Tx: https://robinhoodchain.blockscout.com/tx/<txHash>\\n  • NFT: https://robinhoodchain.blockscout.com/token/<contractAddress>/instance/<tokenId>\\n  • Collection: https://opensea.io/collection/platypus-pfp-756823947\\n  • Your PFPs: https://platypus.community/platypuspfp"},"pfpGeneration":{"method":"POST","url":"/api/pfp/generate","contentType":"application/json","request":{"source":"x","handle":"twitter_handle"},"response":{"imageDataUrl":"data:image/png;base64,..."},"costPerCall":"~$0.04 (OpenAI gpt-image-1.5)","timeoutSeconds":55},"rateLimits":{"/api/nft/prepare":{"note":"No rate limit on /api/nft/prepare."},"/api/pfp/generate":{"perIP":"5 requests per 10 minutes","note":"Each call costs ~$0.04 in OpenAI fees."}},"constraints":{"perWallet":"Each wallet can mint at most 1 NFT (hasMinted mapping).","maxSupply":"Total supply is capped at 100 (MAX_SUPPLY).","paused":"Owner can pause mints. Check paused() before attempting."},"examplePseudocode":"// 1. Get metadataURL from our backend\nconst prep = await fetch('https://platypus.community/api/nft/prepare', {\n  method: 'POST',\n  headers: { 'Content-Type': 'application/json' },\n  body: JSON.stringify({ dataUrl, minter: agentAddress, source: 'agent' })\n});\nconst { metadataURL } = await prep.json();\n\n// 2. Approve PLATYPUS\nawait agentWallet.writeContract({\n  address: PLATYPUS_TOKEN,\n  abi: ERC20_ABI,\n  functionName: 'approve',\n  args: [PLATYPUS_PFP_CONTRACT, 50000000000000000000000n]\n});\n\n// 3. Mint\nconst txHash = await agentWallet.writeContract({\n  address: PLATYPUS_PFP_CONTRACT,\n  abi: PLATYPUS_PFP_ABI,\n  functionName: 'mint',\n  args: [metadataURL]\n});","relatedEndpoints":{"collection":"/api/nft/collection","ownedByWallet":"/api/nft/owned?wallet=0x...","agentDiscovery":"/.well-known/agent.json","skillMarkdown":"/skills/platypus-mint.md"}}