---
# This file is licensed under the MIT License (MIT) available on
# http://opensource.org/licenses/MIT.
id: https://bitcoin.org/quality-assurance/schemas/wallets.yaml
description: The wallet object
type: object
required:
  - id
  - title
  - titleshort
  - compat
  - level
  - platform
# additionalProperties can not be true, as then the wallet fails due to license

properties:
  id:
    description: The page identifier to use for translations
    type: string

  title:
    description: The full wallet name; displayed when you view the full listing
    type: string
    minLength: 1
    maxLength: 100

  titleshort:
    description: A short name displayed on the overview page
    type: string
    minLength: 1
    maxLength: 20

  ## TODO: change this into an array so we can practically test values
  compat:
    description: A complete list of platforms supported by the wallet
    type: string
    minLength: 1

  ## TODO: we should probably use names here and translate to
  ##       numbers (if required) in the template
  level:
    description: |
      The wallet's overall security level.
        1 - full nodes
        2 - SPV using random servers (e.g. P2P SPV, Electrum servers, etc...)
        3 - Hybrid & multisig wallets
        4 - Web wallets

    type: integer
    minimum: 1
    maximum: 4

  ## The platforms the wallet supports
  platform:
    description: the platforms the wallet supports
    type: array
    additionalProperties: false
    items:
      type: object
      additionalProperties:
        - default

      required:
        - os
        - name

      properties:
        name:
          type: string
          enum:
            - desktop
            - mobile
            - hardware
            - web
        os:
          description: The specific operating systems the wallet supports
          type: array
          uniqueItems: true
          items:
            description: List of operating systems with wallet details
            type: object
            required: &required
              - name
              - text
              - link
              - screenshot
              - check
              ## TODO: Not currently required, but we should aim for making it required #
              # - source
            additionalProperties:
              - privacycheck
            properties:
              name:
                type: string
                enum:
                  # mobile os
                  - android
                  - windowsphone
                  - blackberry
                  - ios
                  # desktop os
                  - windows
                  - mac
                  - linux
                  # pseudo web os
                  - web
                  # pseudo hardware os
                  - hardware
              text: &text
                description: >
                  The identifier for the wallet's translation string.
                  Also used for the wallet's icon within the /img/wallet/
                  directory.
                type: string
              link: &link
                description: The download URL
                type: string
                format: uri
              source: &source
                description: The source code download URL
                type: string
                format: uri
              screenshot: &screenshot
                description: File name for screenshot within the /img/screenshots/ directory
                type: string
              check: &check
                description: The wallet's features (or lack thereof)
                type: object
                required:
                  - control
                  - validation
                  - transparency
                  - environment
                  - privacy
                  ## TODO: make required when web wallets moved
                  # - fees
                additionalProperties: false
                properties:
                  control:
                    description: How much control the user has over their money (e.g. private keys)
                    type: string
                    enum:
                      - checkgoodcontrolfull
                      - checkpasscontrolhybrid
                      - checkpasscontrolmulti
                      - checkfailcontrolthirdpartyinsured
                      - checkfailcontrolthirdparty
                  validation:
                    description: How much assurance the user has that their bitcoins are real
                    type: string
                    enum:
                      - checkgoodvalidationfullnode
                      - checkgoodvalidationfullnoderequired
                      - checkneutralvalidationvariable
                      - checkpassvalidationspvp2p
                      - checkpassvalidationspvservers
                      - checkpassvalidationservers
                      - checkfailvalidationcentralized
                  transparency:
                    description: How much insight the user has into the code they run
                    type: string
                    enum:
                      - checkgoodtransparencydeterministic
                      - checkpasstransparencyopensource
                      - checkpasstransparencyopensourcehardware
                      - checkpasstransparencyopenspechardware
                      - checkfailtransparencyclosedsource
                      - checkfailtransparencyremote
                      - checkfailtransparencynew
                  environment:
                    description: How secure is the environment the wallet runs in
                    type: string
                    enum:
                      - checkgoodenvironmenthardware
                      - checkpassenvironmentmobile
                      - checkpassenvironmenttwofactor
                      - checkfailenvironmentdesktop
                  privacy:
                    description: How much privacy the wallet gives the user
                    type: string
                    enum:
                      - checkgoodprivacyimproved
                      - checkpassprivacybasic
                      - checkneutralprivacyvariable
                      - checkfailprivacyweak
                  fees:
                    description: How does the wallet decide what fee to pay
                    type: string
                    enum:
                      - checkgoodfeecontrolfull
                      - checkpassfeecontroldynamic
                      - checkpassfeecontroloverride
                      - checkneutralfeecontrolvariable
                      - checkfailfeecontrolstatic
              privacycheck: &privacycheck
                description: Details about the wallet's privacy settings
                type: object
                required:
                  - privacyaddressreuse
                  - privacydisclosure
                  - privacynetwork
                additionalProperties: false
                properties:
                  privacyaddressreuse:
                    description: Does the wallet default to address reuse?
                    type: string
                    enum:
                      - checkpassprivacyaddressrotation
                      - checkfailprivacyaddressrotation
                  privacydisclosure:
                    description: To whom, if anyone, does the wallet reveal the addresses it uses?
                    type: string
                    enum:
                      - checkpassprivacydisclosurefullnode
                      - checkfailprivacydisclosurespv
                      - checkfailprivacydisclosurecentralized
                      - checkfailprivacydisclosureaccount
                  privacynetwork:
                    description: What network-level privacy options does the wallet support
                    type: string
                    enum:
                      - checkpassprivacynetworksupporttorproxy
                      - checkfailprivacynetworknosupporttor
