{
  "name": "Platypus PFP",
  "platform": "Platypus Community",
  "version": "2.0.0",
  "description": "Mint unique Platypus PFP NFTs on Robinhood Chain. 1 per wallet, 100 total supply, 50,000 PLATYPUS mint price. Custom ERC-721 contract (not Manifold, not SeaDrop). Optional staking via PlatypusStream for USDG stream rewards.",
  "protocolCompatibility": {
    "mintProtocol": "custom-erc721-robinhood",
    "notCompatibleWith": ["manifold.xyz", "opensea-seadrop"],
    "requiredMintApproach": "direct-contract-calls",
    "ifYourToolOnlySupportsManifoldOrSeaDrop": "You cannot mint this NFT. Tell the user to mint at https://platypus.community/platypuspfp in a browser.",
    "mandatoryFlowSequence": {
      "order": "non-negotiable",
      "steps": [
        "1) POST /api/nft/prepare (HTTP, no signing) -> get metadataURL",
        "2) approve(spender=0x2ad8cbf0d5b43eef4d4b33ff0d3e8f355dfde193, amount=50000e18) on PLATYPUS token 0x4c87B69F0d862cD66b84f7beF639180980b8aE67",
        "3) mint(metadataURL) on PlatypusPFP 0x2ad8cbf0d5b43eef4d4b33ff0d3e8f355dfde193"
      ]
    }
  },
  "chain": {
    "chainId": 4663,
    "name": "Robinhood Chain",
    "nativeCurrency": { "name": "Ethereum", "symbol": "ETH", "decimals": 18 },
    "rpcUrl": "https://mainnet.rpc.robinhood.com",
    "explorer": "https://robinhoodchain.blockscout.com"
  },
  "contracts": {
    "paymentToken": {
      "label": "$PLATYPUS token (ERC-20)",
      "address": "0x4c87B69F0d862cD66b84f7beF639180980b8aE67",
      "symbol": "PLATYPUS",
      "decimals": 18,
      "function": "approve(address spender, uint256 amount)",
      "purpose": "Approve this contract to spend 50000 PLATYPUS for mint payment"
    },
    "nft": {
      "label": "Platypus PFP NFT (ERC-721, v2)",
      "address": "0x2ad8cbf0d5b43eef4d4b33ff0d3e8f355dfde193",
      "standard": "ERC-721",
      "function": "mint(string tokenURI)",
      "purpose": "Call this function with the metadataURL to mint a PFP NFT. After mint, NFT can be staked in PlatypusStream for USDG rewards.",
      "tierUpgrades": "Sequential tier upgrades (1 -> 10) handled in PlatypusStream. Each upgrade costs PLATYPUS (cumulative 20k + 30k + ... + 100k = 540k for max tier 10)."
    },
    "stream": {
      "label": "PlatypusStream v3.1.2 (staking + tier + USDG rewards)",
      "address": "0x4ba3b3a8a08e1c3425dad42e65ab733199936c42",
      "version": "v3.1.2",
      "standard": "Custom",
      "purpose": "Custodial NFT staking with 10-tier upgrade system and USDG stream rewards. Pure tier-based reward (reward = tierCap x elapsedDays). Reverts claim/unstake when pool is empty (no partial / no debt).",
      "rewardToken": "0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168 (USDG, 6 decimals)",
      "tierCapsUsdgPerDay": {
        "1": "0.5", "2": "1.0", "3": "1.5", "4": "2.0", "5": "2.5",
        "6": "3.0", "7": "3.5", "8": "4.0", "9": "4.5", "10": "5.0"
      },
      "keyFunctions": {
        "stake(uint256 tokenId)": "Owner stakes their NFT (transfers to contract)",
        "unstake(uint256 tokenId)": "Claim + return NFT to owner (reverts if pool empty)",
        "claim(uint256 tokenId)": "Claim accrued USDG rewards (NFT stays staked; reverts if pool empty)",
        "upgrade(uint256 tokenId)": "Pay PLATYPUS to upgrade to next tier (sequential)",
        "unstakeWithoutClaim(uint256 tokenId)": "v3.1.2 escape hatch: staker-only, exits when pool empty by forfeiting pending reward",
        "deposit(uint256 amount)": "Anyone can fund the USDG reward pool (must approve USDG first)"
      },
      "v312Features": {
        "perNftCapAtStakeTime": "Each NFT's reward cap is locked at stake time. Owner setTierConfig changes don't break existing stakes.",
        "symmetricMonotonicCostCheck": "setTierConfig enforces both 'newCost > prev' AND 'newCost < next' to prevent any underflow in upgrade path.",
        "migrateTier": "Owner-only one-shot helper to preserve tierOf when migrating from v2 (legacy: 0x3cc6ac...)."
      }
    },
    "streamLegacyV2": {
      "label": "PlatypusStream v2 (DEPRECATED - read-only for migration)",
      "address": "0x3cc6ac623de5c7404fd8b6cde5cf340f736083e5",
      "purpose": "Legacy staking contract. Has totalActiveCap underflow bug in unstake. Admin applied setTierConfig(2/5/10, 1, 0) as escape hatch. Do NOT stake here. Use v3.1.2 for all new stakes."
    },
    "feeRouter": {
      "label": "FeeRouter (per-token fee vault)",
      "address": "0x7806d76217847D7d286Af11297eebB2E2b98D9E6",
      "purpose": "Routes PLATYPUS + USDG platform fees. USDG recipient should point to PlatypusStream for staking rewards."
    }
  },
  "mintPrice": {
    "human": "50000 PLATYPUS",
    "raw": "50000000000000000000000"
  },
  "supply": {
    "max": 100,
    "perWalletCap": 1
  },
  "maxInvestment": {
    "human": "640000 PLATYPUS (50k mint + 540k max tier upgrades)",
    "note": "To reach tier 10 from scratch: 50,000 (mint) + 540,000 (sequential upgrades) = 590,000 PLATYPUS. Plus 50k mint = 590k to own at max tier. (We list 640k as the upper ceiling including any edge cases.)"
  },
  "marketplace": {
    "opensea": "https://opensea.io/collection/platypus-pfp-756823947",
    "explorerInstance": "https://robinhoodchain.blockscout.com/token/0x2ad8cbf0d5b43eef4d4b33ff0d3e8f355dfde193/instance/{tokenId}",
    "explorerTx": "https://robinhoodchain.blockscout.com/tx/{txHash}",
    "streamExplorer": "https://robinhoodchain.blockscout.com/address/0x4ba3b3a8a08e1c3425dad42e65ab733199936c42"
  },
  "endpoints": {
    "prepare": "POST https://platypus.community/api/nft/prepare",
    "spec": "GET https://platypus.community/api/agent/spec",
    "skill": "https://platypus.community/skills/platypus-mint.md",
    "llms": "https://platypus.community/llms.txt",
    "agentJson": "https://platypus.community/.well-known/agent.json",
    "guide": "https://platypus.community/platypuspfp/agent"
  },
  "imageFlow": "Single backend call. Send user image (dataUrl) OR X handle (source='x' + sourceHandle) to /api/nft/prepare. If X handle, our backend fetches the avatar from unavatar.io and transforms it into a platypus PFP via OpenAI automatically. You do NOT call /api/pfp/generate yourself — that endpoint is only used by the browser UI.",
  "stakingFlow": "After minting, NFTs can be staked in PlatypusStream v3.1.2 (0x4ba3b3a8a08e1c3425dad42e65ab733199936c42). Stake via stream.stake(tokenId), claim USDG via stream.claim(tokenId), upgrade tier via stream.upgrade(tokenId) (sequential, pays PLATYPUS). If the reward pool is empty, claim/unstake will revert — use stream.unstakeWithoutClaim(tokenId) to exit by forfeiting the pending reward. All write operations require the user wallet to sign.",
  "abiReference": "https://platypus.community/api/agent/spec"
}
