{
    "$schema": "http://json-schema.org/draft-07/schema#",
    "$id": "https://raw.githubusercontent.com/traderjoe-xyz/joe-tokenlists/main/schema.tokenlist-v2.json",
    "title": "Joe V2 Token List",
    "description": "Schema for lists of tokens compatible with the Joe V2 Interface",
    "definitions": {
        "Version": {
            "type": "object",
            "description": "The version of the list, used in change detection",
            "examples": [
                {
                    "major": 1,
                    "minor": 0,
                    "patch": 0
                }
            ],
            "additionalProperties": false,
            "properties": {
                "major": {
                    "type": "integer",
                    "description": "The major version of the list. Must be incremented when tokens are removed from the list or token addresses are changed.",
                    "minimum": 0,
                    "examples": [1, 2]
                },
                "minor": {
                    "type": "integer",
                    "description": "The minor version of the list. Must be incremented when tokens are added to the list.",
                    "minimum": 0,
                    "examples": [0, 1]
                },
                "patch": {
                    "type": "integer",
                    "description": "The patch version of the list. Must be incremented for any changes to the list.",
                    "minimum": 0,
                    "examples": [0, 1]
                }
            },
            "required": ["major", "minor", "patch"]
        },
        "TagName": {
            "type": "string",
            "description": "The unique identifier of a tag",
            "minLength": 1,
            "maxLength": 20,
            "pattern": "^[A-Za-z]+\\s?[A-Za-z]*$",
            "examples": ["Large Cap", "Stablecoins"]
        },
        "ExtensionIdentifier": {
            "type": "string",
            "description": "The name of a token extension property",
            "minLength": 1,
            "maxLength": 40,
            "pattern": "^[\\w]+$",
            "examples": ["color", "is_fee_on_transfer", "aliases"]
        },
        "ExtensionMap": {
            "type": "object",
            "description": "An object containing any arbitrary or vendor-specific token metadata",
            "maxProperties": 10,
            "propertyNames": {
                "$ref": "#/definitions/ExtensionIdentifier"
            },
            "additionalProperties": {
                "$ref": "#/definitions/ExtensionValue"
            },
            "examples": [
                {
                    "color": "#000000",
                    "is_verified_by_me": true
                },
                {
                    "x-bridged-addresses-by-chain": {
                        "1": {
                            "bridgeAddress": "0x4200000000000000000000000000000000000010",
                            "tokenAddress": "0x4200000000000000000000000000000000000010"
                        }
                    }
                }
            ]
        },
        "ExtensionPrimitiveValue": {
            "anyOf": [
                {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 42,
                    "examples": ["#00000"]
                },
                {
                    "type": "boolean",
                    "examples": [true]
                },
                {
                    "type": "number",
                    "examples": [15]
                },
                {
                    "type": "null"
                }
            ]
        },
        "ExtensionValue": {
            "anyOf": [
                {
                    "$ref": "#/definitions/ExtensionPrimitiveValue"
                },
                {
                    "type": "object",
                    "maxProperties": 10,
                    "propertyNames": {
                        "$ref": "#/definitions/ExtensionIdentifier"
                    },
                    "additionalProperties": {
                        "$ref": "#/definitions/ExtensionValueInner0"
                    }
                }
            ]
        },
        "ExtensionValueInner0": {
            "anyOf": [
                {
                    "$ref": "#/definitions/ExtensionPrimitiveValue"
                },
                {
                    "type": "object",
                    "maxProperties": 10,
                    "propertyNames": {
                        "$ref": "#/definitions/ExtensionIdentifier"
                    },
                    "additionalProperties": {
                        "$ref": "#/definitions/ExtensionValueInner1"
                    }
                }
            ]
        },
        "ExtensionValueInner1": {
            "anyOf": [
                {
                    "$ref": "#/definitions/ExtensionPrimitiveValue"
                }
            ]
        },
        "TokenInfo": {
            "type": "object",
            "description": "Metadata for a single token in a token list",
            "additionalProperties": false,
            "properties": {
                "chainId": {
                    "type": "integer",
                    "description": "The chain ID of the Ethereum network where this token is deployed",
                    "minimum": 1,
                    "examples": [1, 42]
                },
                "address": {
                    "type": "string",
                    "description": "The checksummed address of the token on the specified chain ID",
                    "pattern": "^0x[a-fA-F0-9]{40}$",
                    "examples": ["0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"]
                },
                "decimals": {
                    "type": "integer",
                    "description": "The number of decimals for the token balance",
                    "minimum": 0,
                    "maximum": 255,
                    "examples": [18]
                },
                "name": {
                    "type": "string",
                    "description": "The name of the token",
                    "minLength": 1,
                    "maxLength": 40,
                    "pattern": "^[ \\w.'+\\-%/À-ÖØ-öø-ÿ:&\\[\\]\\(\\)]+$",
                    "examples": ["USD Coin"]
                },
                "symbol": {
                    "type": "string",
                    "description": "The symbol for the token; must be alphanumeric",
                    "pattern": "^[a-zA-Z0-9+\\-%/$.]+$",
                    "minLength": 1,
                    "maxLength": 20,
                    "examples": ["USDC"]
                },
                "logoURI": {
                    "type": "string",
                    "description": "A URI to the token logo asset; if not set, interface will attempt to find a logo based on the token address; suggest SVG or PNG of size 64x64",
                    "format": "uri",
                    "examples": ["ipfs://QmXfzKRvjZz3u5JRgC4v5mGVbm9ahrUiB4DgzHBsnWbTMM"]
                },
                "tags": {
                    "type": "array",
                    "description": "An array of tag identifiers associated with the token; tags are defined at the list level",
                    "items": {
                        "$ref": "#/definitions/TagName"
                    },
                    "maxItems": 3,
                    "examples": ["Large Cap", "Stablecoins"]
                },
                "extensions": {
                    "$ref": "#/definitions/ExtensionMap"
                }
            },
            "required": ["chainId", "address", "decimals", "name", "symbol"]
        }
    },
    "type": "object",
    "additionalProperties": false,
    "properties": {
        "name": {
            "type": "string",
            "description": "The name of the token list",
            "minLength": 1,
            "maxLength": 30,
            "pattern": "^[\\w ]+$",
            "examples": ["My Token List"]
        },
        "timestamp": {
            "type": "string",
            "format": "date-time",
            "description": "The timestamp of this list version; i.e. when this immutable version of the list was created"
        },
        "version": {
            "$ref": "#/definitions/Version"
        },
        "tokens": {
            "type": "array",
            "description": "The list of tokens included in the list",
            "items": {
                "$ref": "#/definitions/TokenInfo"
            },
            "minItems": 1,
            "maxItems": 10000
        },
        "keywords": {
            "type": "array",
            "description": "Keywords associated with the contents of the list; may be used in list discoverability",
            "items": {
                "type": "string",
                "description": "A keyword to describe the contents of the list",
                "minLength": 1,
                "maxLength": 20,
                "pattern": "^[\\w ]+$",
                "examples": ["compound", "lending", "personal tokens"]
            },
            "maxItems": 20,
            "uniqueItems": true
        },
        "tags": {
            "type": "array",
            "description": "Definition of a tag that can be associated with a token",
            "items": {
                "$ref": "#/definitions/TagName"
            },
            "maxItems": 3,
            "uniqueItems": true,
            "examples": ["Large Cap", "Stablecoins"]
        },
        "logoURI": {
            "type": "string",
            "description": "A URI for the logo of the token list; prefer SVG or PNG of size 256x256",
            "format": "uri",
            "examples": ["ipfs://QmXfzKRvjZz3u5JRgC4v5mGVbm9ahrUiB4DgzHBsnWbTMM"]
        }
    },
    "required": ["name", "timestamp", "version", "tokens"]
}
