From
bafyreiaqvs4htzpth2tp2vpsped3u32h25vffsajddihj6224ihobw4v5q
indexed 2026-07-26 20:13 UTC
View this version
To
bafyreib6pi36fybrjg55sztdoh3pivl3fhv4kqxxxriyfoyalscnpfefge
indexed 2026-10-27 05:10 UTC
View this version
Compatibility
breaking 3 breaking changes, 17 non-breaking changes.
Breaking changes (3)
- RequiredEdgeRemoved RequiredEdgeRemoved { vertex_id: "org.hypercerts.funding.receipt:body", src: "org.hypercerts.funding.receipt:body", tgt: "org.hypercerts.funding.receipt:body.amount", kind: "prop", name: Some("amount") }
- RequiredEdgeRemoved RequiredEdgeRemoved { vertex_id: "org.hypercerts.funding.receipt:body", src: "org.hypercerts.funding.receipt:body", tgt: "org.hypercerts.funding.receipt:body.currency", kind: "prop", name: Some("currency") }
- ConstraintAdded ConstraintAdded { vertex_id: "org.hypercerts.funding.receipt:body.paymentRail", sort: "knownValues", value: "[\"onchain\",\"bank_transfer\",\"card\",\"direct_debit\",\"mobile_money\",\"payment_processor\",\"cash\",\"check\"]" }
Non-breaking changes (17)
- AddedVertex AddedVertex { vertex_id: "org.hypercerts.funding.receipt:body.netAmount" }
- AddedVertex AddedVertex { vertex_id: "org.hypercerts.funding.receipt:body.netCurrency" }
- AddedVertex AddedVertex { vertex_id: "org.hypercerts.funding.receipt:body.type" }
- AddedVertex AddedVertex { vertex_id: "org.hypercerts.funding.receipt:body.via" }
- AddedVertex AddedVertex { vertex_id: "org.hypercerts.funding.receipt:body.via:variant0" }
- AddedVertex AddedVertex { vertex_id: "org.hypercerts.funding.receipt:body.via:variant1" }
- AddedVertex AddedVertex { vertex_id: "org.hypercerts.funding.receipt:body.via:variant2" }
- AddedEdge AddedEdge { src: "org.hypercerts.funding.receipt:body", tgt: "org.hypercerts.funding.receipt:body.netAmount", kind: "prop", name: Some("netAmount") }
- AddedEdge AddedEdge { src: "org.hypercerts.funding.receipt:body", tgt: "org.hypercerts.funding.receipt:body.netCurrency", kind: "prop", name: Some("netCurrency") }
- AddedEdge AddedEdge { src: "org.hypercerts.funding.receipt:body", tgt: "org.hypercerts.funding.receipt:body.type", kind: "prop", name: Some("type") }
- AddedEdge AddedEdge { src: "org.hypercerts.funding.receipt:body", tgt: "org.hypercerts.funding.receipt:body.via", kind: "prop", name: Some("via") }
- AddedEdge AddedEdge { src: "org.hypercerts.funding.receipt:body.via", tgt: "org.hypercerts.funding.receipt:body.via:variant0", kind: "variant", name: Some("#text") }
- AddedEdge AddedEdge { src: "org.hypercerts.funding.receipt:body.via", tgt: "org.hypercerts.funding.receipt:body.via:variant1", kind: "variant", name: Some("app.certified.defs#did") }
- AddedEdge AddedEdge { src: "org.hypercerts.funding.receipt:body.via", tgt: "org.hypercerts.funding.receipt:body.via:variant2", kind: "variant", name: Some("com.atproto.repo.strongRef") }
- AddedEdge AddedEdge { src: "org.hypercerts.funding.receipt:body.via:variant0", tgt: "org.hypercerts.funding.receipt#text", kind: "ref", name: None }
- AddedEdge AddedEdge { src: "org.hypercerts.funding.receipt:body.via:variant1", tgt: "app.certified.defs#did", kind: "ref", name: None }
- AddedEdge AddedEdge { src: "org.hypercerts.funding.receipt:body.via:variant2", tgt: "com.atproto.repo.strongRef", kind: "ref", name: None }
Migration guidance
Added
AddedVertex { vertex_id: "org.hypercerts.funding.receipt:body.netAmount" }AddedVertex { vertex_id: "org.hypercerts.funding.receipt:body.netCurrency" }AddedVertex { vertex_id: "org.hypercerts.funding.receipt:body.type" }AddedVertex { vertex_id: "org.hypercerts.funding.receipt:body.via" }AddedVertex { vertex_id: "org.hypercerts.funding.receipt:body.via:variant0" }AddedVertex { vertex_id: "org.hypercerts.funding.receipt:body.via:variant1" }AddedVertex { vertex_id: "org.hypercerts.funding.receipt:body.via:variant2" }
Constraint changes
- ConstraintAdded ConstraintAdded { vertex_id: "org.hypercerts.funding.receipt:body.paymentRail", sort: "knownValues", value: "[\"onchain\",\"bank_transfer\",\"card\",\"direct_debit\",\"mobile_money\",\"payment_processor\",\"cash\",\"check\"]" }
Notes
- Breaking: RequiredEdgeRemoved { vertex_id: "org.hypercerts.funding.receipt:body", src: "org.hypercerts.funding.receipt:body", tgt: "org.hypercerts.funding.receipt:body.amount", kind: "prop", name: Some("amount") }
- Breaking: RequiredEdgeRemoved { vertex_id: "org.hypercerts.funding.receipt:body", src: "org.hypercerts.funding.receipt:body", tgt: "org.hypercerts.funding.receipt:body.currency", kind: "prop", name: Some("currency") }
- Non-breaking: AddedEdge { src: "org.hypercerts.funding.receipt:body", tgt: "org.hypercerts.funding.receipt:body.netAmount", kind: "prop", name: Some("netAmount") }
- Non-breaking: AddedEdge { src: "org.hypercerts.funding.receipt:body", tgt: "org.hypercerts.funding.receipt:body.netCurrency", kind: "prop", name: Some("netCurrency") }
- Non-breaking: AddedEdge { src: "org.hypercerts.funding.receipt:body", tgt: "org.hypercerts.funding.receipt:body.type", kind: "prop", name: Some("type") }
- Non-breaking: AddedEdge { src: "org.hypercerts.funding.receipt:body", tgt: "org.hypercerts.funding.receipt:body.via", kind: "prop", name: Some("via") }
- Non-breaking: AddedEdge { src: "org.hypercerts.funding.receipt:body.via", tgt: "org.hypercerts.funding.receipt:body.via:variant0", kind: "variant", name: Some("#text") }
- Non-breaking: AddedEdge { src: "org.hypercerts.funding.receipt:body.via", tgt: "org.hypercerts.funding.receipt:body.via:variant1", kind: "variant", name: Some("app.certified.defs#did") }
- Non-breaking: AddedEdge { src: "org.hypercerts.funding.receipt:body.via", tgt: "org.hypercerts.funding.receipt:body.via:variant2", kind: "variant", name: Some("com.atproto.repo.strongRef") }
- Non-breaking: AddedEdge { src: "org.hypercerts.funding.receipt:body.via:variant0", tgt: "org.hypercerts.funding.receipt#text", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "org.hypercerts.funding.receipt:body.via:variant1", tgt: "app.certified.defs#did", kind: "ref", name: None }
- Non-breaking: AddedEdge { src: "org.hypercerts.funding.receipt:body.via:variant2", tgt: "com.atproto.repo.strongRef", kind: "ref", name: None }
Changes
11
{22
"$type": "com.atproto.lexicon.schema",33
"defs": {44
"main": {5
"description": "Records a funding receipt for a payment from one user to another user. It may be recorded by the recipient, by the sender, or by a third party. The sender may remain anonymous.",5
"description": "Records a payment from a sender to a recipient. Any party may record it, and the sender may stay anonymous. When the sender chose the recipient, record one receipt to the final recipient even if platforms or hosts passed the funds on. When an intermediary chose (regranting), record the payment into it and each onward payment as separate receipts. A receipt may be updated in place under the same record key: its URI does not change, so references by URI keep resolving, but a strongRef (as likes and reposts use) still pins the earlier CID, and signatures bind to content and must be renewed. An earlier version cannot be recalled from readers that kept it.",66
"key": "tid",77
"record": {88
"properties": {99
"amount": {10
"description": "Amount of funding received as a numeric string (e.g. '1000.50').",10
"description": "Gross amount the sender paid, before fees, as a numeric string (e.g. '1000.50'). Omit if unknown, and set netAmount instead.",1111
"maxLength": 50,1212
"type": "string"1313
},1414
"createdAt": {1515
"description": "Client-declared timestamp when this receipt record was created.",1616
"format": "datetime",1717
"type": "string"1818
},1919
"currency": {20
"description": "Currency of the payment (e.g. EUR, USD, ETH).",20
"description": "Currency of amount: an ISO 4217 code for fiat (e.g. EUR), a token ticker for digital assets (e.g. USDC). This is what marks the funds as fiat or digital. Set it whenever amount is set.",2121
"maxLength": 10,2222
"type": "string"2323
},2424
"for": {2525
"description": "Optional strong reference to the activity, project, or organization this funding relates to.",2626
"ref": "com.atproto.repo.strongRef",2727
"type": "ref"2828
},2929
"from": {30
"description": "The sender of the funds (a free-text string, an account DID, or a strong reference to a record). Optional — omit to represent anonymity.",30
"description": "The sender of the funds (a free-text string, an account DID, or a strong reference to a record). Optional — omit to represent anonymity. Name a sender only if they chose to be named: from can be added later by updating the receipt in place, but removing it later only hides the name from the current version, and an onchain transactionId still names the sending wallet.",3131
"refs": [3232
"#text",3333
"app.certified.defs#did",3434
"com.atproto.repo.strongRef"3535
],3636
"type": "union"3737
},38
"netAmount": {39
"description": "What the recipient received after fees and conversion, as a numeric string in netCurrency.",40
"maxLength": 50,41
"type": "string"42
},43
"netCurrency": {44
"description": "Currency of netAmount: an ISO 4217 code for fiat, a token ticker for digital assets. Set it whenever netAmount is set.",45
"maxLength": 10,46
"type": "string"47
},3848
"notes": {3949
"description": "Optional notes or additional context for this funding receipt.",4050
"maxLength": 500,4151
"type": "string"4252
},4353
"occurredAt": {4454
"description": "Timestamp when the payment occurred.",4555
"format": "datetime",4656
"type": "string"4757
},4858
"paymentNetwork": {49
"description": "Optional network within the payment rail (e.g. arbitrum, ethereum, sepa, visa, paypal).",59
"description": "Where transactionId can be looked up: the chain for onchain payments, preferably as a CAIP-2 ID (e.g. 'eip155:1'), otherwise the processor or scheme (e.g. stripe, sepa). Set it whenever transactionId is a transaction hash.",5060
"maxLength": 50,5161
"type": "string"5262
},5363
"paymentRail": {54
"description": "How the funds were transferred (e.g. bank_transfer, credit_card, onchain, cash, check, payment_processor).",64
"description": "How the sender paid. Use 'payment_processor' only when the underlying method is unknown.",65
"knownValues": [66
"onchain",67
"bank_transfer",68
"card",69
"direct_debit",70
"mobile_money",71
"payment_processor",72
"cash",73
"check"74
],5575
"maxLength": 50,5676
"type": "string"5777
},5878
"signatures": {5979
"description": "Optional cryptographic signatures attesting to this record's content.",6080
"ref": "app.certified.signature.defs#list",6181
"type": "ref"6282
},6383
"to": {6484
"description": "The recipient of the funds (a free-text string, an account DID, or a strong reference to a record).",6585
"refs": [6686
"#text",6787
"app.certified.defs#did",6888
"com.atproto.repo.strongRef"6989
],7090
"type": "union"7191
},7292
"transactionId": {73
"description": "Identifier of the underlying payment transaction (e.g. bank reference, onchain transaction hash, or processor-specific ID). Use paymentNetwork to specify the network where applicable.",93
"description": "ID of the sender's payment, not of a platform's later payout: a transaction hash for onchain payments, otherwise the processor's or scheme's reference. Receipts are public: prefer opaque processor IDs to bank references, and note that a hash reveals the sender's wallet even when from is omitted.",7494
"maxLength": 256,7595
"type": "string"96
},97
"type": {98
"description": "What the payment is: a donation (a gift from the sender), a match (funds a matching pool allocated on the strength of other gifts) or a grant (funds awarded through a selection process). Values beyond the known set are permitted. Omit if unknown.",99
"knownValues": [100
"donation",101
"match",102
"grant"103
],104
"maxLength": 50,105
"type": "string"106
},107
"via": {108
"description": "Optional intermediary that facilitated or processed the payment (funding platform, payment servicer, broker).",109
"refs": [110
"#text",111
"app.certified.defs#did",112
"com.atproto.repo.strongRef"113
],114
"type": "union"76115
}77116
},78117
"required": [79118
"to",80
"amount",81
"currency",82119
"createdAt"83120
],84121
"type": "object"85122
},86123
"type": "record"87124
},88125
"text": {89126
"description": "A free-text string value (e.g. a display name, wallet address, or other identifier).",90127
"properties": {91128
"value": {92129
"description": "The string value.",93130
"maxLength": 2048,94131
"type": "string"95132
}96133
},97134
"required": [98135
"value"99136
],100137
"type": "object"101138
}102139
},103140
"id": "org.hypercerts.funding.receipt",104141
"lexicon": 1105142
}