dev.malpercio.cards.witness

An appview's signed observation of a card changing hands, written into the appview's own repo. Triggered by a dev.malpercio.cards.item appearing on the firehose. Accepted witnesses form a prev-linked chain per give; exactly one accepted witness exists per (give, hop). Rejected witnesses explain why a claimant's item is not recognized. The chain is durable against player-side deletions and auditable by replaying the firehose.

Details · record, key tid
Kindrecord
Record keytid
Authoritycards.malpercio.dev
Indexed
cid bafyreif4azxoism3verd4lodaaztjkiwedf6774i2exosu2ldd4dq2acpe

Checks

Valid
  • unlimited-string defs.main.record.properties.reasonNo maxLength, maxGraphemes or format limits this string.
  • unlimited-string defs.main.record.properties.statusNo maxLength, maxGraphemes or format limits this string.
JSONDownload
{
  "$type": "com.atproto.lexicon.schema",
  "defs": {
    "main": {
      "description": "An appview's signed observation of a card changing hands, written into the appview's own repo. Triggered by a dev.malpercio.cards.item appearing on the firehose. Accepted witnesses form a prev-linked chain per give; exactly one accepted witness exists per (give, hop). Rejected witnesses explain why a claimant's item is not recognized. The chain is durable against player-side deletions and auditable by replaying the firehose.",
      "key": "tid",
      "record": {
        "properties": {
          "detail": {
            "description": "Rejected only. Human-readable specifics, e.g. the URI of the item that won.",
            "maxLength": 512,
            "type": "string"
          },
          "from": {
            "description": "Sender of the transfer, if any.",
            "format": "did",
            "type": "string"
          },
          "give": {
            "description": "Root give this observation concerns.",
            "format": "at-uri",
            "type": "string"
          },
          "holder": {
            "description": "Repo owner of item. For accepted witnesses, the recognized holder after this hop.",
            "format": "did",
            "type": "string"
          },
          "hop": {
            "description": "Accepted only. 0 = received from provider, n = nth transfer.",
            "minimum": 0,
            "type": "integer"
          },
          "item": {
            "description": "The claimant's item as seen. Pinned so the observation stands even if the item is later deleted.",
            "ref": "com.atproto.repo.strongRef",
            "type": "ref"
          },
          "prev": {
            "description": "Accepted only. The accepted witness for hop-1.",
            "ref": "com.atproto.repo.strongRef",
            "type": "ref"
          },
          "reason": {
            "description": "Rejected only. superseded: another item was already accepted at this hop. not-holder: the transfer's sender was not the recognized holder. expired: transfer.expiresAt passed before the item appeared. invalid: the records fail structural verification (recipient, CID, revoked give).",
            "knownValues": [
              "superseded",
              "not-holder",
              "expired",
              "invalid"
            ],
            "type": "string"
          },
          "seenAt": {
            "format": "datetime",
            "type": "string"
          },
          "status": {
            "knownValues": [
              "accepted",
              "rejected"
            ],
            "type": "string"
          },
          "transfer": {
            "description": "The transfer as seen, absent at hop 0.",
            "ref": "com.atproto.repo.strongRef",
            "type": "ref"
          }
        },
        "required": [
          "give",
          "item",
          "holder",
          "status",
          "seenAt"
        ],
        "type": "object"
      },
      "type": "record"
    }
  },
  "id": "dev.malpercio.cards.witness",
  "lexicon": 1
}