{
  "version": "v1",
  "license": "CC0-1.0",
  "docs": "https://normiesyachtclub.com/developers.html",
  "generatedAt": "2026-08-13T12:04:00.630Z",
  "name": "Normies Yacht Club",
  "symbol": "NYC",
  "standard": "ERC-721",
  "royalties": "ERC-2981",
  "chainId": 1,
  "network": "ethereum-mainnet",
  "address": "0x87306c282eBd62Fe1c80AA69Dd9408331Dc11f64",
  "deployBlock": 25514828,
  "artOnChain": true,
  "rendererLocked": true,
  "note": "The art is rendered fully on-chain: call tokenURI(id) for the official, immutable image. This is the source of truth for ownership too — read ownerOf/balanceOf/claimed.",
  "transferEventTopic": "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
  "agents": {
    "standard": "ERC-6551",
    "note": "Every yacht owns an account — a token-bound account it keeps for life. The account's owner is whoever holds the yacht right now: transfer the yacht and the account goes with it, contents included.",
    "registry": "0x000000006551c19487814612e58FE06813775758",
    "implementation": "0x41C8f39463A868d3A88af00cd0fe7102F30E44eC",
    "implementationNote": "Tokenbound v3 reference account. This pair is FIXED: changing either one moves every agent address.",
    "salt": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "chainId": 1,
    "tokenContract": "0x87306c282eBd62Fe1c80AA69Dd9408331Dc11f64",
    "derivation": "create2 by the registry over the ERC-6551 proxy initcode; equivalently call registry.account(implementation, salt, chainId, tokenContract, tokenId) — a view, valid before deployment.",
    "addressInEveryYacht": "/api/v1/yacht/{id}.json → onchain.agent",
    "deployed": "Accounts exist as addresses before they are deployed. Check code size, or call registry.createAccount(...) with the same arguments — it is idempotent.",
    "abi": [
      {
        "type": "function",
        "name": "account",
        "stateMutability": "view",
        "inputs": [
          {
            "name": "implementation",
            "type": "address"
          },
          {
            "name": "salt",
            "type": "bytes32"
          },
          {
            "name": "chainId",
            "type": "uint256"
          },
          {
            "name": "tokenContract",
            "type": "address"
          },
          {
            "name": "tokenId",
            "type": "uint256"
          }
        ],
        "outputs": [
          {
            "type": "address"
          }
        ]
      },
      {
        "type": "function",
        "name": "createAccount",
        "stateMutability": "nonpayable",
        "inputs": [
          {
            "name": "implementation",
            "type": "address"
          },
          {
            "name": "salt",
            "type": "bytes32"
          },
          {
            "name": "chainId",
            "type": "uint256"
          },
          {
            "name": "tokenContract",
            "type": "address"
          },
          {
            "name": "tokenId",
            "type": "uint256"
          }
        ],
        "outputs": [
          {
            "type": "address"
          }
        ]
      }
    ],
    "examples": [
      {
        "tokenId": 0,
        "account": "0x313546e6C941B41F80DeFB7F11199ed874a6fF28"
      },
      {
        "tokenId": 17,
        "account": "0x3E1939a1531B9bD370AfB7B0a6D82f24178e915A"
      },
      {
        "tokenId": 2698,
        "account": "0xC3D8A18516d1fBe276784B172b2c0ee84c7Fd7cC"
      }
    ],
    "examplesNote": "Test vectors. If your derivation does not reproduce these three, it is wrong — do not publish addresses from it."
  },
  "abi": [
    {
      "type": "function",
      "name": "tokenURI",
      "stateMutability": "view",
      "inputs": [
        {
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "outputs": [
        {
          "type": "string"
        }
      ]
    },
    {
      "type": "function",
      "name": "ownerOf",
      "stateMutability": "view",
      "inputs": [
        {
          "name": "tokenId",
          "type": "uint256"
        }
      ],
      "outputs": [
        {
          "type": "address"
        }
      ]
    },
    {
      "type": "function",
      "name": "balanceOf",
      "stateMutability": "view",
      "inputs": [
        {
          "name": "owner",
          "type": "address"
        }
      ],
      "outputs": [
        {
          "type": "uint256"
        }
      ]
    },
    {
      "type": "function",
      "name": "claimed",
      "stateMutability": "view",
      "inputs": [
        {
          "name": "yachtId",
          "type": "uint256"
        }
      ],
      "outputs": [
        {
          "type": "bool"
        }
      ]
    },
    {
      "type": "function",
      "name": "totalMinted",
      "stateMutability": "view",
      "inputs": [],
      "outputs": [
        {
          "type": "uint256"
        }
      ]
    },
    {
      "type": "function",
      "name": "name",
      "stateMutability": "view",
      "inputs": [],
      "outputs": [
        {
          "type": "string"
        }
      ]
    },
    {
      "type": "function",
      "name": "symbol",
      "stateMutability": "view",
      "inputs": [],
      "outputs": [
        {
          "type": "string"
        }
      ]
    },
    {
      "type": "event",
      "name": "Transfer",
      "inputs": [
        {
          "name": "from",
          "type": "address",
          "indexed": true
        },
        {
          "name": "to",
          "type": "address",
          "indexed": true
        },
        {
          "name": "tokenId",
          "type": "uint256",
          "indexed": true
        }
      ]
    }
  ]
}
