DocsThe data protocol

mark/v1

packages/core/schema/mark.schema.json
On this page

What tells one organisation on the map from another: its name, its token's symbol and its logo, each with where it came from (Elco, 11 Nov: 'a better module or strategy to grab the names and the token symbols or any logos of these organizations'; board #85, research/org-names-logos-2026-11-11.md, strategy 2: the chain first, then curated lists). One per map, named by the map's address. Each part says whether the thing declared it itself (self-declared), a curated list holds it (verified), or Petals worked it out (inferred).

Fields

Field Type or allowed values Presence in its parent Description
petal "mark/v1" Required
about string Required the map it marks, by its address: chain:address, or chain:population for a whole network (the map card's id)
name choice Required the organisation's name, or null when nothing names it beyond the map's own name
name (variant 1) object Required
name (variant 1).value string Required
name (variant 1).status "self-declared" / "verified" / "inferred" Required self-declared: the contract, the DAO or the account says it of itself. verified: a curated list holds this address (verified_by names which). inferred: Petals worked it out (ref says how).
name (variant 1).source string Required where it came from, in a word: chain, poster, daohaus, metaplex, ft_metadata, trustwallet, uniswap, coingecko, cow, superchain, arbitrum, jupiter, defillama, petals
name (variant 1).ref string Required exactly where: the call it answered (symbol() on eip155:1:0x…), or the list and its version, or the page
name (variant 1).verified_by array Optional the curated lists that hold this address, each with its version: what makes a self-declared value verified
name (variant 1).verified_by[] string Required
name (variant 1).at string Required when it was read there
name (variant 2) null Required
symbol choice Required its token's symbol, or null
symbol (variant 1) object Required
symbol (variant 1).value string Required
symbol (variant 1).status "self-declared" / "verified" / "inferred" Required self-declared: the contract, the DAO or the account says it of itself. verified: a curated list holds this address (verified_by names which). inferred: Petals worked it out (ref says how).
symbol (variant 1).source string Required where it came from, in a word: chain, poster, daohaus, metaplex, ft_metadata, trustwallet, uniswap, coingecko, cow, superchain, arbitrum, jupiter, defillama, petals
symbol (variant 1).ref string Required exactly where: the call it answered (symbol() on eip155:1:0x…), or the list and its version, or the page
symbol (variant 1).verified_by array Optional the curated lists that hold this address, each with its version: what makes a self-declared value verified
symbol (variant 1).verified_by[] string Required
symbol (variant 1).at string Required when it was read there
symbol (variant 2) null Required
logo choice Required its logo, kept by Petals as a picture named by its sha256, or null
logo (variant 1) object Required
logo (variant 1).sha256 string Required
logo (variant 1).media_type "image/png" / "image/jpeg" / "image/webp" Required
logo (variant 1).status "self-declared" / "verified" / "inferred" Required self-declared: the contract, the DAO or the account says it of itself. verified: a curated list holds this address (verified_by names which). inferred: Petals worked it out (ref says how).
logo (variant 1).source string Required where it came from, in a word: chain, poster, daohaus, metaplex, ft_metadata, trustwallet, uniswap, coingecko, cow, superchain, arbitrum, jupiter, defillama, petals
logo (variant 1).ref string Required the address it was read from
logo (variant 1).at string Required
logo (variant 2) null Required
read_at string Required when it was read

Examples

mark.v1.json

Fixture source

{
  "petal": "mark/v1",
  "about": "eip155:1:0x1f9840a85d5af5bf1d1762f925bdaddc4201f984",
  "name": {
    "value": "Uniswap",
    "status": "verified",
    "source": "chain",
    "ref": "name() on eip155:1:0x1f9840a85d5af5bf1d1762f925bdaddc4201f984",
    "verified_by": [
      "uniswap: Uniswap Labs Default v22.34.0 (https://tokens.uniswap.org)",
      "cow: CoW Swap v7.12.0 (https://files.cow.fi/tokens/CowSwap.json)",
      "coingecko: CoinGecko v1638.0.0 (https://tokens.coingecko.com/uniswap/all.json)",
      "trustwallet: https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984/info.json",
      "defillama: https://api.llama.fi/protocols (Uniswap V3)"
    ],
    "at": "2026-11-11T13:08:51.147Z"
  },
  "symbol": {
    "value": "UNI",
    "status": "verified",
    "source": "chain",
    "ref": "symbol() on eip155:1:0x1f9840a85d5af5bf1d1762f925bdaddc4201f984",
    "verified_by": [
      "uniswap: Uniswap Labs Default v22.34.0 (https://tokens.uniswap.org)",
      "cow: CoW Swap v7.12.0 (https://files.cow.fi/tokens/CowSwap.json)",
      "coingecko: CoinGecko v1638.0.0 (https://tokens.coingecko.com/uniswap/all.json)",
      "trustwallet: https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984/info.json",
      "defillama: https://api.llama.fi/protocols (Uniswap V3)"
    ],
    "at": "2026-11-11T13:08:51.147Z"
  },
  "logo": {
    "sha256": "8eaddfb8ec20f7792036f88e88ebf216d5b8eb5e09c4dbfd3c5790ce6f7dc001",
    "media_type": "image/png",
    "status": "verified",
    "source": "cow",
    "ref": "https://files.cow.fi/token-lists/images/1/0x1f9840a85d5af5bf1d1762f925bdaddc4201f984/logo.png",
    "at": "2026-11-11T13:08:51.147Z"
  },
  "read_at": "2026-11-11T13:08:51.147Z"
}

Full schema

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "urn:petal:schema:mark:v1",
  "title": "Petal mark v1",
  "description": "What tells one organisation on the map from another: its name, its token's symbol and its logo, each with where it came from (Elco, 11 Nov: 'a better module or strategy to grab the names and the token symbols or any logos of these organizations'; board #85, research/org-names-logos-2026-11-11.md, strategy 2: the chain first, then curated lists). One per map, named by the map's address. Each part says whether the thing declared it itself (self-declared), a curated list holds it (verified), or Petals worked it out (inferred).",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "petal",
    "about",
    "name",
    "symbol",
    "logo",
    "read_at"
  ],
  "properties": {
    "petal": {
      "const": "mark/v1"
    },
    "about": {
      "description": "the map it marks, by its address: chain:address, or chain:population for a whole network (the map card's id)",
      "type": "string",
      "minLength": 3
    },
    "name": {
      "description": "the organisation's name, or null when nothing names it beyond the map's own name",
      "oneOf": [
        {
          "$ref": "#/$defs/said"
        },
        {
          "type": "null"
        }
      ]
    },
    "symbol": {
      "description": "its token's symbol, or null",
      "oneOf": [
        {
          "$ref": "#/$defs/said"
        },
        {
          "type": "null"
        }
      ]
    },
    "logo": {
      "description": "its logo, kept by Petals as a picture named by its sha256, or null",
      "oneOf": [
        {
          "$ref": "#/$defs/logo"
        },
        {
          "type": "null"
        }
      ]
    },
    "read_at": {
      "description": "when it was read",
      "type": "string",
      "format": "date-time"
    }
  },
  "$defs": {
    "status": {
      "description": "self-declared: the contract, the DAO or the account says it of itself. verified: a curated list holds this address (verified_by names which). inferred: Petals worked it out (ref says how).",
      "enum": [
        "self-declared",
        "verified",
        "inferred"
      ]
    },
    "source": {
      "description": "where it came from, in a word: chain, poster, daohaus, metaplex, ft_metadata, trustwallet, uniswap, coingecko, cow, superchain, arbitrum, jupiter, defillama, petals",
      "type": "string",
      "pattern": "^[a-z0-9_-]+$"
    },
    "said": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "value",
        "status",
        "source",
        "ref",
        "at"
      ],
      "properties": {
        "value": {
          "type": "string",
          "minLength": 1,
          "maxLength": 200
        },
        "status": {
          "$ref": "#/$defs/status"
        },
        "source": {
          "$ref": "#/$defs/source"
        },
        "ref": {
          "description": "exactly where: the call it answered (symbol() on eip155:1:0x…), or the list and its version, or the page",
          "type": "string",
          "minLength": 1
        },
        "verified_by": {
          "description": "the curated lists that hold this address, each with its version: what makes a self-declared value verified",
          "type": "array",
          "items": {
            "type": "string",
            "minLength": 1
          },
          "minItems": 1
        },
        "at": {
          "description": "when it was read there",
          "type": "string",
          "format": "date-time"
        }
      }
    },
    "logo": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "sha256",
        "media_type",
        "status",
        "source",
        "ref",
        "at"
      ],
      "properties": {
        "sha256": {
          "type": "string",
          "pattern": "^[0-9a-f]{64}$"
        },
        "media_type": {
          "enum": [
            "image/png",
            "image/jpeg",
            "image/webp"
          ]
        },
        "status": {
          "$ref": "#/$defs/status"
        },
        "source": {
          "$ref": "#/$defs/source"
        },
        "ref": {
          "description": "the address it was read from",
          "type": "string",
          "minLength": 1
        },
        "at": {
          "type": "string",
          "format": "date-time"
        }
      }
    }
  }
}