@carrot-foundation/schemas 0.2.3 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/dist/index.cjs +108 -173
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.cts +16 -16
  4. package/dist/index.d.ts +16 -16
  5. package/dist/index.js +108 -173
  6. package/dist/index.js.map +1 -1
  7. package/package.json +20 -20
  8. package/schemas/ipfs/collection/collection.example.json +3 -3
  9. package/schemas/ipfs/collection/collection.schema.json +75 -75
  10. package/schemas/ipfs/credit/credit.example.json +3 -3
  11. package/schemas/ipfs/credit/credit.schema.json +82 -82
  12. package/schemas/ipfs/credit-purchase-receipt/credit-purchase-receipt.example.json +4 -4
  13. package/schemas/ipfs/credit-purchase-receipt/credit-purchase-receipt.schema.json +394 -386
  14. package/schemas/ipfs/credit-retirement-receipt/credit-retirement-receipt.example.json +4 -4
  15. package/schemas/ipfs/credit-retirement-receipt/credit-retirement-receipt.schema.json +430 -422
  16. package/schemas/ipfs/gas-id/gas-id.example.json +4 -4
  17. package/schemas/ipfs/gas-id/gas-id.schema.json +419 -411
  18. package/schemas/ipfs/mass-id/mass-id.example.json +4 -4
  19. package/schemas/ipfs/mass-id/mass-id.schema.json +498 -494
  20. package/schemas/ipfs/mass-id-audit/mass-id-audit.example.json +3 -3
  21. package/schemas/ipfs/mass-id-audit/mass-id-audit.schema.json +220 -212
  22. package/schemas/ipfs/methodology/methodology.example.json +3 -3
  23. package/schemas/ipfs/methodology/methodology.schema.json +121 -121
  24. package/schemas/ipfs/recycled-id/recycled-id.example.json +4 -4
  25. package/schemas/ipfs/recycled-id/recycled-id.schema.json +373 -365
  26. package/schemas/schema-hashes.json +10 -10
@@ -1,58 +1,54 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "title": "CreditRetirementReceipt NFT IPFS Record",
4
- "description": "Complete CreditRetirementReceipt NFT IPFS record including attributes and credit retirement data",
5
- "$id": "https://raw.githubusercontent.com/carrot-foundation/schemas/refs/tags/0.2.3/schemas/ipfs/credit-retirement-receipt/credit-retirement-receipt.schema.json",
6
- "version": "0.2.3",
7
3
  "type": "object",
8
4
  "properties": {
9
5
  "$schema": {
6
+ "type": "string",
7
+ "format": "uri",
10
8
  "title": "JSON Schema URI",
11
9
  "description": "URI of the JSON Schema used to validate this record",
12
- "example": "https://raw.githubusercontent.com/carrot-foundation/schemas/refs/heads/main/schemas/ipfs/shared/base/base.schema.json",
13
- "type": "string",
14
- "format": "uri"
10
+ "example": "https://raw.githubusercontent.com/carrot-foundation/schemas/refs/heads/main/schemas/ipfs/shared/base/base.schema.json"
15
11
  },
16
12
  "schema": {
17
13
  "type": "object",
18
14
  "properties": {
19
15
  "hash": {
16
+ "type": "string",
17
+ "pattern": "^[0-9a-fA-F]{64}$",
20
18
  "title": "Schema Hash",
21
19
  "description": "SHA-256 hash of the JSON Schema this record was validated against",
22
20
  "examples": [
23
21
  "87f633634cc4b02f628685651f0a29b7bfa22a0bd841f725c6772dd00a58d489"
24
- ],
25
- "type": "string",
26
- "pattern": "^[0-9a-fA-F]{64}$"
22
+ ]
27
23
  },
28
24
  "type": {
29
- "title": "CreditRetirementReceipt Schema Type",
30
- "description": "Schema type identifier for this record",
31
25
  "type": "string",
32
- "const": "CreditRetirementReceipt"
26
+ "const": "CreditRetirementReceipt",
27
+ "title": "CreditRetirementReceipt Schema Type",
28
+ "description": "Schema type identifier for this record"
33
29
  },
34
30
  "version": {
31
+ "type": "string",
32
+ "minLength": 1,
33
+ "pattern": "^v?\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9.-]+)?(\\+[a-zA-Z0-9.-]+)?$",
35
34
  "title": "Schema Version",
36
35
  "description": "Version of the schema, using semantic versioning",
37
36
  "examples": [
38
37
  "0.1.0",
39
38
  "1.0.0",
40
39
  "2.1.3"
41
- ],
42
- "type": "string",
43
- "minLength": 1,
44
- "pattern": "^v?\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9.-]+)?(\\+[a-zA-Z0-9.-]+)?$"
40
+ ]
45
41
  },
46
42
  "ipfs_uri": {
43
+ "type": "string",
44
+ "minLength": 1,
45
+ "pattern": "^ipfs:\\/\\/(?:Qm[1-9A-HJ-NP-Za-km-z]{44}|[bB][a-z2-7]{58,}|[zZ][1-9A-HJ-NP-Za-km-z]{48,})(?:\\/[^\\s]*)?$",
47
46
  "title": "Schema IPFS URI",
48
47
  "description": "IPFS URI for this JSON Schema when the primary schema URI is unavailable",
49
48
  "examples": [
50
49
  "ipfs://bafybeigdyrztvzl5cceubvaxob7iqh6f3f7s36c74ojav2xsz2uib2g3vm",
51
50
  "ipfs://bafybeihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku"
52
- ],
53
- "type": "string",
54
- "minLength": 1,
55
- "pattern": "^ipfs:\\/\\/(?:Qm[1-9A-HJ-NP-Za-km-z]{44}|[bB][a-z2-7]{58,}|[zZ][1-9A-HJ-NP-Za-km-z]{48,})(?:\\/[^\\s]*)?$"
51
+ ]
56
52
  }
57
53
  },
58
54
  "required": [
@@ -64,99 +60,97 @@
64
60
  "additionalProperties": false
65
61
  },
66
62
  "created_at": {
63
+ "type": "string",
64
+ "format": "date-time",
65
+ "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
67
66
  "title": "Created At",
68
67
  "description": "ISO 8601 creation timestamp for this record",
69
68
  "examples": [
70
69
  "2024-12-05T11:02:47.000Z"
71
- ],
72
- "type": "string",
73
- "format": "date-time",
74
- "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
70
+ ]
75
71
  },
76
72
  "external_id": {
73
+ "type": "string",
74
+ "format": "uuid",
75
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
77
76
  "title": "External ID",
78
77
  "description": "UUID identifier for external system references",
79
78
  "examples": [
80
79
  "ad44dd3f-f176-4b98-bf78-5ee6e77d0530"
81
- ],
82
- "type": "string",
83
- "format": "uuid",
84
- "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$"
80
+ ]
85
81
  },
86
82
  "external_url": {
83
+ "type": "string",
84
+ "format": "uri",
87
85
  "title": "External URL",
88
86
  "description": "URL pointing to external resources",
89
87
  "examples": [
90
88
  "https://explore.carrot.eco/",
91
89
  "https://whitepaper.carrot.eco/"
92
- ],
93
- "type": "string",
94
- "format": "uri"
90
+ ]
95
91
  },
96
92
  "viewer_reference": {
97
- "title": "Metadata Viewer Reference",
98
- "description": "References to the metadata viewer dApp, including immutable and latest entry points",
99
93
  "type": "object",
100
94
  "properties": {
101
95
  "ipfs_uri": {
96
+ "type": "string",
97
+ "minLength": 1,
98
+ "pattern": "^ipfs:\\/\\/(?:Qm[1-9A-HJ-NP-Za-km-z]{44}|[bB][a-z2-7]{58,}|[zZ][1-9A-HJ-NP-Za-km-z]{48,})(?:\\/[^\\s]*)?$",
102
99
  "title": "Viewer IPFS URI",
103
100
  "description": "IPFS URI of the metadata viewer dApp build",
104
101
  "examples": [
105
102
  "ipfs://bafybeigdyrztvzl5cceubvaxob7iqh6f3f7s36c74ojav2xsz2uib2g3vm",
106
103
  "ipfs://bafybeihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku"
107
- ],
108
- "type": "string",
109
- "minLength": 1,
110
- "pattern": "^ipfs:\\/\\/(?:Qm[1-9A-HJ-NP-Za-km-z]{44}|[bB][a-z2-7]{58,}|[zZ][1-9A-HJ-NP-Za-km-z]{48,})(?:\\/[^\\s]*)?$"
104
+ ]
111
105
  },
112
106
  "integrity_hash": {
107
+ "type": "string",
108
+ "pattern": "^[0-9a-fA-F]{64}$",
113
109
  "title": "Viewer Integrity Hash",
114
110
  "description": "SHA-256 hash of the published viewer bundle to verify integrity",
115
111
  "examples": [
116
112
  "87f633634cc4b02f628685651f0a29b7bfa22a0bd841f725c6772dd00a58d489"
117
- ],
118
- "type": "string",
119
- "pattern": "^[0-9a-fA-F]{64}$"
113
+ ]
120
114
  }
121
115
  },
122
116
  "required": [
123
117
  "ipfs_uri",
124
118
  "integrity_hash"
125
119
  ],
126
- "additionalProperties": false
120
+ "additionalProperties": false,
121
+ "title": "Metadata Viewer Reference",
122
+ "description": "References to the metadata viewer dApp, including immutable and latest entry points"
127
123
  },
128
124
  "environment": {
129
- "title": "Record Environment",
130
- "description": "Environment information for the record",
131
125
  "type": "object",
132
126
  "properties": {
133
127
  "blockchain_network": {
134
- "title": "Blockchain Network",
135
- "description": "Blockchain network where this record is deployed",
136
128
  "type": "string",
137
129
  "enum": [
138
130
  "mainnet",
139
131
  "testnet"
140
- ]
132
+ ],
133
+ "title": "Blockchain Network",
134
+ "description": "Blockchain network where this record is deployed"
141
135
  },
142
136
  "deployment": {
143
- "title": "Deployment Environment",
144
- "description": "System environment where this record was generated",
145
137
  "type": "string",
146
138
  "enum": [
147
139
  "production",
148
140
  "development",
149
141
  "testing"
150
- ]
142
+ ],
143
+ "title": "Deployment Environment",
144
+ "description": "System environment where this record was generated"
151
145
  },
152
146
  "data_set_name": {
153
- "title": "Data Set Name",
154
- "description": "Name of the data set for this record",
155
147
  "type": "string",
156
148
  "enum": [
157
149
  "TEST",
158
150
  "PROD"
159
- ]
151
+ ],
152
+ "title": "Data Set Name",
153
+ "description": "Name of the data set for this record"
160
154
  }
161
155
  },
162
156
  "required": [
@@ -164,50 +158,48 @@
164
158
  "deployment",
165
159
  "data_set_name"
166
160
  ],
167
- "additionalProperties": false
161
+ "additionalProperties": false,
162
+ "title": "Record Environment",
163
+ "description": "Environment information for the record"
168
164
  },
169
165
  "data": {
170
- "title": "Credit Retirement Receipt Data",
171
- "description": "Complete data structure for a credit retirement receipt",
172
166
  "type": "object",
173
167
  "properties": {
174
168
  "summary": {
175
- "title": "Credit Retirement Receipt Summary",
176
- "description": "Summary totals for the credit retirement including amounts and collections represented",
177
169
  "type": "object",
178
170
  "properties": {
179
171
  "total_certificates": {
172
+ "type": "integer",
173
+ "minimum": 1,
174
+ "maximum": 9007199254740991,
180
175
  "title": "Total Certificates",
181
176
  "description": "Total number of certificates represented in the receipt",
182
177
  "examples": [
183
178
  1,
184
179
  123,
185
180
  456
186
- ],
187
- "type": "integer",
188
- "minimum": 1,
189
- "maximum": 9007199254740991
181
+ ]
190
182
  },
191
183
  "total_credits_retired": {
184
+ "type": "number",
185
+ "minimum": 0,
192
186
  "title": "Total Credits Retired",
193
187
  "description": "Total amount of credits retired",
194
188
  "examples": [
195
189
  0,
196
190
  45.2,
197
191
  72.5
198
- ],
199
- "type": "number",
200
- "minimum": 0
192
+ ]
201
193
  },
202
194
  "retired_at": {
195
+ "type": "string",
196
+ "format": "date-time",
197
+ "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$",
203
198
  "title": "Retired At",
204
199
  "description": "ISO 8601 timestamp when the retirement occurred",
205
200
  "examples": [
206
201
  "2024-12-05T11:02:47.000Z"
207
- ],
208
- "type": "string",
209
- "format": "date-time",
210
- "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
202
+ ]
211
203
  }
212
204
  },
213
205
  "required": [
@@ -215,58 +207,56 @@
215
207
  "total_credits_retired",
216
208
  "retired_at"
217
209
  ],
218
- "additionalProperties": false
210
+ "additionalProperties": false,
211
+ "title": "Credit Retirement Receipt Summary",
212
+ "description": "Summary totals for the credit retirement including amounts and collections represented"
219
213
  },
220
214
  "beneficiary": {
221
- "title": "Beneficiary",
222
- "description": "Beneficiary receiving the retirement benefit",
223
215
  "type": "object",
224
216
  "properties": {
225
217
  "beneficiary_id": {
218
+ "type": "string",
219
+ "format": "uuid",
220
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
226
221
  "title": "Retirement Beneficiary ID",
227
222
  "description": "UUID identifying the beneficiary of the retirement (bytes16 normalized to UUID)",
228
223
  "examples": [
229
224
  "ad44dd3f-f176-4b98-bf78-5ee6e77d0530"
230
- ],
231
- "type": "string",
232
- "format": "uuid",
233
- "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$"
225
+ ]
234
226
  },
235
227
  "identity": {
236
- "title": "Identity",
237
- "description": "Participant identity information",
238
228
  "type": "object",
239
229
  "properties": {
240
230
  "name": {
231
+ "type": "string",
232
+ "minLength": 1,
233
+ "maxLength": 100,
241
234
  "title": "Identity Name",
242
235
  "description": "Display name for the participant",
243
236
  "examples": [
244
237
  "EcoTech Solutions Inc.",
245
238
  "Climate Action Corp"
246
- ],
247
- "type": "string",
248
- "minLength": 1,
249
- "maxLength": 100
239
+ ]
250
240
  },
251
241
  "external_id": {
242
+ "type": "string",
243
+ "format": "uuid",
244
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
252
245
  "title": "Identity External ID",
253
246
  "description": "External identifier for the participant",
254
247
  "examples": [
255
248
  "ad44dd3f-f176-4b98-bf78-5ee6e77d0530"
256
- ],
257
- "type": "string",
258
- "format": "uuid",
259
- "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$"
249
+ ]
260
250
  },
261
251
  "external_url": {
252
+ "type": "string",
253
+ "format": "uri",
262
254
  "title": "Identity External URL",
263
255
  "description": "External URL for the participant profile",
264
256
  "examples": [
265
257
  "https://explore.carrot.eco/",
266
258
  "https://whitepaper.carrot.eco/"
267
- ],
268
- "type": "string",
269
- "format": "uri"
259
+ ]
270
260
  }
271
261
  },
272
262
  "required": [
@@ -274,64 +264,64 @@
274
264
  "external_id",
275
265
  "external_url"
276
266
  ],
277
- "additionalProperties": false
267
+ "additionalProperties": false,
268
+ "title": "Identity",
269
+ "description": "Participant identity information"
278
270
  }
279
271
  },
280
272
  "required": [
281
273
  "beneficiary_id",
282
274
  "identity"
283
275
  ],
284
- "additionalProperties": false
276
+ "additionalProperties": false,
277
+ "title": "Beneficiary",
278
+ "description": "Beneficiary receiving the retirement benefit"
285
279
  },
286
280
  "credit_holder": {
287
- "title": "Credit Holder",
288
- "description": "Credit holder wallet and optional identity information",
289
281
  "type": "object",
290
282
  "properties": {
291
283
  "wallet_address": {
284
+ "type": "string",
285
+ "pattern": "^0x[a-f0-9]{40}$",
292
286
  "title": "Credit Holder Wallet Address",
293
287
  "description": "Ethereum address of the credit holder surrendering credits",
294
288
  "examples": [
295
289
  "0x1234567890abcdef1234567890abcdef12345678"
296
- ],
297
- "type": "string",
298
- "pattern": "^0x[a-f0-9]{40}$"
290
+ ]
299
291
  },
300
292
  "identity": {
301
- "title": "Identity",
302
- "description": "Participant identity information",
303
293
  "type": "object",
304
294
  "properties": {
305
295
  "name": {
296
+ "type": "string",
297
+ "minLength": 1,
298
+ "maxLength": 100,
306
299
  "title": "Identity Name",
307
300
  "description": "Display name for the participant",
308
301
  "examples": [
309
302
  "EcoTech Solutions Inc.",
310
303
  "Climate Action Corp"
311
- ],
312
- "type": "string",
313
- "minLength": 1,
314
- "maxLength": 100
304
+ ]
315
305
  },
316
306
  "external_id": {
307
+ "type": "string",
308
+ "format": "uuid",
309
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
317
310
  "title": "Identity External ID",
318
311
  "description": "External identifier for the participant",
319
312
  "examples": [
320
313
  "ad44dd3f-f176-4b98-bf78-5ee6e77d0530"
321
- ],
322
- "type": "string",
323
- "format": "uuid",
324
- "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$"
314
+ ]
325
315
  },
326
316
  "external_url": {
317
+ "type": "string",
318
+ "format": "uri",
327
319
  "title": "Identity External URL",
328
320
  "description": "External URL for the participant profile",
329
321
  "examples": [
330
322
  "https://explore.carrot.eco/",
331
323
  "https://whitepaper.carrot.eco/"
332
- ],
333
- "type": "string",
334
- "format": "uri"
324
+ ]
335
325
  }
336
326
  },
337
327
  "required": [
@@ -339,84 +329,84 @@
339
329
  "external_id",
340
330
  "external_url"
341
331
  ],
342
- "additionalProperties": false
332
+ "additionalProperties": false,
333
+ "title": "Identity",
334
+ "description": "Participant identity information"
343
335
  }
344
336
  },
345
337
  "required": [
346
338
  "wallet_address"
347
339
  ],
348
- "additionalProperties": false
340
+ "additionalProperties": false,
341
+ "title": "Credit Holder",
342
+ "description": "Credit holder wallet and optional identity information"
349
343
  },
350
344
  "collections": {
351
- "title": "Collections",
352
- "description": "Collections included in the retirement",
353
345
  "minItems": 1,
354
346
  "type": "array",
355
347
  "items": {
356
- "title": "Collection",
357
- "description": "Collection included in the retirement",
358
348
  "type": "object",
359
349
  "properties": {
360
350
  "slug": {
361
- "title": "Collection Slug",
362
- "description": "URL-friendly identifier for a collection",
363
- "examples": [
364
- "bold-cold-start-carazinho",
365
- "bold-brazil"
366
- ],
367
351
  "type": "string",
368
352
  "enum": [
369
353
  "bold-innovators",
370
354
  "bold-cold-start-jundiai",
371
355
  "bold-cold-start-carazinho",
372
356
  "bold-brazil"
357
+ ],
358
+ "title": "Collection Slug",
359
+ "description": "URL-friendly identifier for a collection",
360
+ "examples": [
361
+ "bold-cold-start-carazinho",
362
+ "bold-brazil"
373
363
  ]
374
364
  },
375
365
  "external_id": {
366
+ "type": "string",
367
+ "format": "uuid",
368
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
376
369
  "title": "Collection External ID",
377
370
  "description": "External identifier for the collection",
378
371
  "examples": [
379
372
  "ad44dd3f-f176-4b98-bf78-5ee6e77d0530"
380
- ],
381
- "type": "string",
382
- "format": "uuid",
383
- "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$"
373
+ ]
384
374
  },
385
375
  "name": {
386
- "title": "Collection Name",
387
- "description": "Display name of the collection",
388
- "examples": [
389
- "BOLD Cold Start - Carazinho",
390
- "BOLD Brazil"
391
- ],
392
376
  "type": "string",
393
377
  "enum": [
394
378
  "BOLD Innovators",
395
379
  "BOLD Cold Start - Carazinho",
396
380
  "BOLD Cold Start - Jundiaí",
397
381
  "BOLD Brazil"
382
+ ],
383
+ "title": "Collection Name",
384
+ "description": "Display name of the collection",
385
+ "examples": [
386
+ "BOLD Cold Start - Carazinho",
387
+ "BOLD Brazil"
398
388
  ]
399
389
  },
400
390
  "external_url": {
391
+ "type": "string",
392
+ "format": "uri",
401
393
  "title": "Collection External URL",
402
394
  "description": "External URL for the collection",
403
395
  "examples": [
404
396
  "https://explore.carrot.eco/",
405
397
  "https://whitepaper.carrot.eco/"
406
- ],
407
- "type": "string",
408
- "format": "uri"
398
+ ]
409
399
  },
410
400
  "ipfs_uri": {
401
+ "type": "string",
402
+ "minLength": 1,
403
+ "pattern": "^ipfs:\\/\\/(?:Qm[1-9A-HJ-NP-Za-km-z]{44}|[bB][a-z2-7]{58,}|[zZ][1-9A-HJ-NP-Za-km-z]{48,})(?:\\/[^\\s]*)?$",
411
404
  "title": "Collection IPFS URI",
412
405
  "description": "IPFS URI for the collection metadata",
413
406
  "examples": [
414
407
  "ipfs://bafybeigdyrztvzl5cceubvaxob7iqh6f3f7s36c74ojav2xsz2uib2g3vm",
415
408
  "ipfs://bafybeihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku"
416
- ],
417
- "type": "string",
418
- "minLength": 1,
419
- "pattern": "^ipfs:\\/\\/(?:Qm[1-9A-HJ-NP-Za-km-z]{44}|[bB][a-z2-7]{58,}|[zZ][1-9A-HJ-NP-Za-km-z]{48,})(?:\\/[^\\s]*)?$"
409
+ ]
420
410
  }
421
411
  },
422
412
  "required": [
@@ -426,81 +416,81 @@
426
416
  "external_url",
427
417
  "ipfs_uri"
428
418
  ],
429
- "additionalProperties": false
430
- }
419
+ "additionalProperties": false,
420
+ "title": "Collection",
421
+ "description": "Collection included in the retirement"
422
+ },
423
+ "title": "Collections",
424
+ "description": "Collections included in the retirement"
431
425
  },
432
426
  "credits": {
433
- "title": "Credits",
434
- "description": "Credits included in the retirement",
435
427
  "minItems": 1,
436
428
  "type": "array",
437
429
  "items": {
438
- "title": "Credit",
439
- "description": "Credit token retired in this receipt",
440
430
  "type": "object",
441
431
  "properties": {
442
432
  "external_id": {
433
+ "type": "string",
434
+ "format": "uuid",
435
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
443
436
  "title": "External ID",
444
437
  "description": "UUID identifier for external system references",
445
438
  "examples": [
446
439
  "ad44dd3f-f176-4b98-bf78-5ee6e77d0530"
447
- ],
448
- "type": "string",
449
- "format": "uuid",
450
- "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$"
440
+ ]
451
441
  },
452
442
  "external_url": {
443
+ "type": "string",
444
+ "format": "uri",
453
445
  "title": "External URL",
454
446
  "description": "URL pointing to external resources",
455
447
  "examples": [
456
448
  "https://explore.carrot.eco/",
457
449
  "https://whitepaper.carrot.eco/"
458
- ],
459
- "type": "string",
460
- "format": "uri"
450
+ ]
461
451
  },
462
452
  "ipfs_uri": {
453
+ "type": "string",
454
+ "minLength": 1,
455
+ "pattern": "^ipfs:\\/\\/(?:Qm[1-9A-HJ-NP-Za-km-z]{44}|[bB][a-z2-7]{58,}|[zZ][1-9A-HJ-NP-Za-km-z]{48,})(?:\\/[^\\s]*)?$",
463
456
  "title": "IPFS URI",
464
457
  "description": "InterPlanetary File System URI pointing to distributed content",
465
458
  "examples": [
466
459
  "ipfs://bafybeigdyrztvzl5cceubvaxob7iqh6f3f7s36c74ojav2xsz2uib2g3vm",
467
460
  "ipfs://bafybeihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku"
468
- ],
469
- "type": "string",
470
- "minLength": 1,
471
- "pattern": "^ipfs:\\/\\/(?:Qm[1-9A-HJ-NP-Za-km-z]{44}|[bB][a-z2-7]{58,}|[zZ][1-9A-HJ-NP-Za-km-z]{48,})(?:\\/[^\\s]*)?$"
461
+ ]
472
462
  },
473
463
  "smart_contract_address": {
464
+ "type": "string",
465
+ "pattern": "^0x[a-f0-9]{40}$",
474
466
  "title": "Smart Contract Address",
475
467
  "description": "Ethereum-compatible address of the smart contract that mints and manages this token",
476
468
  "examples": [
477
469
  "0x1234567890abcdef1234567890abcdef12345678"
478
- ],
479
- "type": "string",
480
- "pattern": "^0x[a-f0-9]{40}$"
470
+ ]
481
471
  },
482
472
  "slug": {
483
- "title": "Credit Token Slug",
484
- "description": "URL-friendly identifier for the credit token",
485
- "examples": [
473
+ "type": "string",
474
+ "enum": [
486
475
  "carbon-methane",
487
476
  "biowaste"
488
477
  ],
489
- "type": "string",
490
- "enum": [
478
+ "title": "Credit Token Slug",
479
+ "description": "URL-friendly identifier for the credit token",
480
+ "examples": [
491
481
  "carbon-methane",
492
482
  "biowaste"
493
483
  ]
494
484
  },
495
485
  "symbol": {
496
- "title": "Credit Token Symbol",
497
- "description": "ERC20 token symbol identifier",
498
- "examples": [
486
+ "type": "string",
487
+ "enum": [
499
488
  "C-CARB.CH4",
500
489
  "C-BIOW"
501
490
  ],
502
- "type": "string",
503
- "enum": [
491
+ "title": "Credit Token Symbol",
492
+ "description": "ERC20 token symbol identifier",
493
+ "examples": [
504
494
  "C-CARB.CH4",
505
495
  "C-BIOW"
506
496
  ]
@@ -514,149 +504,147 @@
514
504
  "slug",
515
505
  "symbol"
516
506
  ],
517
- "additionalProperties": false
518
- }
507
+ "additionalProperties": false,
508
+ "title": "Credit",
509
+ "description": "Credit token retired in this receipt"
510
+ },
511
+ "title": "Credits",
512
+ "description": "Credits included in the retirement"
519
513
  },
520
514
  "certificates": {
521
- "title": "Certificates",
522
- "description": "Certificates retired in this receipt",
523
515
  "minItems": 1,
524
516
  "type": "array",
525
517
  "items": {
526
- "title": "Certificate",
527
- "description": "Certificate associated with the retirement",
528
518
  "type": "object",
529
519
  "properties": {
530
520
  "external_id": {
521
+ "type": "string",
522
+ "format": "uuid",
523
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
531
524
  "title": "External ID",
532
525
  "description": "UUID identifier for external system references",
533
526
  "examples": [
534
527
  "ad44dd3f-f176-4b98-bf78-5ee6e77d0530"
535
- ],
536
- "type": "string",
537
- "format": "uuid",
538
- "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$"
528
+ ]
539
529
  },
540
530
  "external_url": {
531
+ "type": "string",
532
+ "format": "uri",
541
533
  "title": "External URL",
542
534
  "description": "URL pointing to external resources",
543
535
  "examples": [
544
536
  "https://explore.carrot.eco/",
545
537
  "https://whitepaper.carrot.eco/"
546
- ],
547
- "type": "string",
548
- "format": "uri"
538
+ ]
549
539
  },
550
540
  "ipfs_uri": {
541
+ "type": "string",
542
+ "minLength": 1,
543
+ "pattern": "^ipfs:\\/\\/(?:Qm[1-9A-HJ-NP-Za-km-z]{44}|[bB][a-z2-7]{58,}|[zZ][1-9A-HJ-NP-Za-km-z]{48,})(?:\\/[^\\s]*)?$",
551
544
  "title": "IPFS URI",
552
545
  "description": "InterPlanetary File System URI pointing to distributed content",
553
546
  "examples": [
554
547
  "ipfs://bafybeigdyrztvzl5cceubvaxob7iqh6f3f7s36c74ojav2xsz2uib2g3vm",
555
548
  "ipfs://bafybeihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku"
556
- ],
557
- "type": "string",
558
- "minLength": 1,
559
- "pattern": "^ipfs:\\/\\/(?:Qm[1-9A-HJ-NP-Za-km-z]{44}|[bB][a-z2-7]{58,}|[zZ][1-9A-HJ-NP-Za-km-z]{48,})(?:\\/[^\\s]*)?$"
549
+ ]
560
550
  },
561
551
  "smart_contract_address": {
552
+ "type": "string",
553
+ "pattern": "^0x[a-f0-9]{40}$",
562
554
  "title": "Smart Contract Address",
563
555
  "description": "Ethereum-compatible address of the smart contract that mints and manages this token",
564
556
  "examples": [
565
557
  "0x1234567890abcdef1234567890abcdef12345678"
566
- ],
567
- "type": "string",
568
- "pattern": "^0x[a-f0-9]{40}$"
558
+ ]
569
559
  },
570
560
  "token_id": {
561
+ "type": "string",
562
+ "minLength": 1,
563
+ "pattern": "^\\d+$",
571
564
  "title": "Token ID",
572
565
  "description": "Unique token identifier for this NFT within the smart contract",
573
566
  "examples": [
574
567
  "456789",
575
568
  "1000000"
576
- ],
577
- "type": "string",
578
- "minLength": 1,
579
- "pattern": "^\\d+$"
569
+ ]
580
570
  },
581
571
  "type": {
582
- "title": "Certificate Type",
583
- "description": "Type of certificate (e.g., GasID, RecycledID)",
584
- "examples": [
572
+ "type": "string",
573
+ "enum": [
585
574
  "GasID",
586
575
  "RecycledID"
587
576
  ],
588
- "type": "string",
589
- "enum": [
577
+ "title": "Certificate Type",
578
+ "description": "Type of certificate (e.g., GasID, RecycledID)",
579
+ "examples": [
590
580
  "GasID",
591
581
  "RecycledID"
592
582
  ]
593
583
  },
594
584
  "total_amount": {
585
+ "type": "number",
586
+ "minimum": 0,
595
587
  "title": "Certificate Total Amount",
596
588
  "description": "Total credits available in this certificate",
597
589
  "examples": [
598
590
  0,
599
591
  45.2,
600
592
  72.5
601
- ],
602
- "type": "number",
603
- "minimum": 0
593
+ ]
604
594
  },
605
595
  "mass_id": {
606
- "title": "MassID Reference",
607
- "description": "Reference to a MassID record",
608
596
  "type": "object",
609
597
  "properties": {
610
598
  "external_id": {
599
+ "type": "string",
600
+ "format": "uuid",
601
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
611
602
  "title": "External ID",
612
603
  "description": "UUID identifier for external system references",
613
604
  "examples": [
614
605
  "ad44dd3f-f176-4b98-bf78-5ee6e77d0530"
615
- ],
616
- "type": "string",
617
- "format": "uuid",
618
- "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$"
606
+ ]
619
607
  },
620
608
  "external_url": {
609
+ "type": "string",
610
+ "format": "uri",
621
611
  "title": "External URL",
622
612
  "description": "URL pointing to external resources",
623
613
  "examples": [
624
614
  "https://explore.carrot.eco/",
625
615
  "https://whitepaper.carrot.eco/"
626
- ],
627
- "type": "string",
628
- "format": "uri"
616
+ ]
629
617
  },
630
618
  "ipfs_uri": {
619
+ "type": "string",
620
+ "minLength": 1,
621
+ "pattern": "^ipfs:\\/\\/(?:Qm[1-9A-HJ-NP-Za-km-z]{44}|[bB][a-z2-7]{58,}|[zZ][1-9A-HJ-NP-Za-km-z]{48,})(?:\\/[^\\s]*)?$",
631
622
  "title": "IPFS URI",
632
623
  "description": "InterPlanetary File System URI pointing to distributed content",
633
624
  "examples": [
634
625
  "ipfs://bafybeigdyrztvzl5cceubvaxob7iqh6f3f7s36c74ojav2xsz2uib2g3vm",
635
626
  "ipfs://bafybeihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku"
636
- ],
637
- "type": "string",
638
- "minLength": 1,
639
- "pattern": "^ipfs:\\/\\/(?:Qm[1-9A-HJ-NP-Za-km-z]{44}|[bB][a-z2-7]{58,}|[zZ][1-9A-HJ-NP-Za-km-z]{48,})(?:\\/[^\\s]*)?$"
627
+ ]
640
628
  },
641
629
  "smart_contract_address": {
630
+ "type": "string",
631
+ "pattern": "^0x[a-f0-9]{40}$",
642
632
  "title": "Smart Contract Address",
643
633
  "description": "Ethereum-compatible address of the smart contract that mints and manages this token",
644
634
  "examples": [
645
635
  "0x1234567890abcdef1234567890abcdef12345678"
646
- ],
647
- "type": "string",
648
- "pattern": "^0x[a-f0-9]{40}$"
636
+ ]
649
637
  },
650
638
  "token_id": {
639
+ "type": "string",
640
+ "minLength": 1,
641
+ "pattern": "^\\d+$",
651
642
  "title": "Token ID",
652
643
  "description": "Unique token identifier for this NFT within the smart contract",
653
644
  "examples": [
654
645
  "456789",
655
646
  "1000000"
656
- ],
657
- "type": "string",
658
- "minLength": 1,
659
- "pattern": "^\\d+$"
647
+ ]
660
648
  }
661
649
  },
662
650
  "required": [
@@ -666,118 +654,116 @@
666
654
  "smart_contract_address",
667
655
  "token_id"
668
656
  ],
669
- "additionalProperties": false
657
+ "additionalProperties": false,
658
+ "title": "MassID Reference",
659
+ "description": "Reference to a MassID record"
670
660
  },
671
661
  "collections": {
672
- "title": "Certificate Collections",
673
- "description": "Collections associated with this certificate, each with retired amounts",
674
662
  "minItems": 1,
675
663
  "type": "array",
676
664
  "items": {
677
- "title": "Certificate Collection Item (Retirement)",
678
- "description": "Collection reference with retired amount for a certificate in a retirement receipt",
679
665
  "type": "object",
680
666
  "properties": {
681
667
  "slug": {
682
- "title": "Collection Slug",
683
- "description": "URL-friendly identifier for a collection",
684
- "examples": [
685
- "bold-cold-start-carazinho",
686
- "bold-brazil"
687
- ],
688
668
  "type": "string",
689
669
  "enum": [
690
670
  "bold-innovators",
691
671
  "bold-cold-start-jundiai",
692
672
  "bold-cold-start-carazinho",
693
673
  "bold-brazil"
674
+ ],
675
+ "title": "Collection Slug",
676
+ "description": "URL-friendly identifier for a collection",
677
+ "examples": [
678
+ "bold-cold-start-carazinho",
679
+ "bold-brazil"
694
680
  ]
695
681
  },
696
682
  "retired_amount": {
683
+ "type": "number",
684
+ "minimum": 0,
697
685
  "title": "Collection Retired Amount",
698
686
  "description": "Credits retired from this collection for this certificate",
699
687
  "examples": [
700
688
  0,
701
689
  45.2,
702
690
  72.5
703
- ],
704
- "type": "number",
705
- "minimum": 0
691
+ ]
706
692
  }
707
693
  },
708
694
  "required": [
709
695
  "slug",
710
696
  "retired_amount"
711
697
  ],
712
- "additionalProperties": false
713
- }
698
+ "additionalProperties": false,
699
+ "title": "Certificate Collection Item (Retirement)",
700
+ "description": "Collection reference with retired amount for a certificate in a retirement receipt"
701
+ },
702
+ "title": "Certificate Collections",
703
+ "description": "Collections associated with this certificate, each with retired amounts"
714
704
  },
715
705
  "credits_retired": {
716
- "title": "Credits Retired",
717
- "description": "Breakdown of credits retired from this certificate by symbol",
718
706
  "minItems": 1,
719
707
  "type": "array",
720
708
  "items": {
721
- "title": "Certificate Credit Retirement",
722
- "description": "Credit retirement breakdown for a certificate",
723
709
  "type": "object",
724
710
  "properties": {
725
711
  "credit_symbol": {
726
- "title": "Credit Token Symbol",
727
- "description": "Symbol of the credit token retired from the certificate",
728
- "examples": [
712
+ "type": "string",
713
+ "enum": [
729
714
  "C-CARB.CH4",
730
715
  "C-BIOW"
731
716
  ],
732
- "type": "string",
733
- "enum": [
717
+ "title": "Credit Token Symbol",
718
+ "description": "Symbol of the credit token retired from the certificate",
719
+ "examples": [
734
720
  "C-CARB.CH4",
735
721
  "C-BIOW"
736
722
  ]
737
723
  },
738
724
  "credit_slug": {
739
- "title": "Credit Token Slug",
740
- "description": "Slug of the credit type retired from the certificate",
741
- "examples": [
725
+ "type": "string",
726
+ "enum": [
742
727
  "carbon-methane",
743
728
  "biowaste"
744
729
  ],
745
- "type": "string",
746
- "enum": [
730
+ "title": "Credit Token Slug",
731
+ "description": "Slug of the credit type retired from the certificate",
732
+ "examples": [
747
733
  "carbon-methane",
748
734
  "biowaste"
749
735
  ]
750
736
  },
751
737
  "amount": {
738
+ "type": "number",
739
+ "minimum": 0,
752
740
  "title": "Retired Credit Amount",
753
741
  "description": "Credits retired of this type from the certificate",
754
742
  "examples": [
755
743
  0,
756
744
  45.2,
757
745
  72.5
758
- ],
759
- "type": "number",
760
- "minimum": 0
746
+ ]
761
747
  },
762
748
  "external_id": {
749
+ "type": "string",
750
+ "format": "uuid",
751
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
763
752
  "title": "Retired Credit External ID",
764
753
  "description": "External identifier for the retired credit entry",
765
754
  "examples": [
766
755
  "ad44dd3f-f176-4b98-bf78-5ee6e77d0530"
767
- ],
768
- "type": "string",
769
- "format": "uuid",
770
- "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$"
756
+ ]
771
757
  },
772
758
  "external_url": {
759
+ "type": "string",
760
+ "format": "uri",
773
761
  "title": "Retired Credit External URL",
774
762
  "description": "External URL for the retired credit entry",
775
763
  "examples": [
776
764
  "https://explore.carrot.eco/",
777
765
  "https://whitepaper.carrot.eco/"
778
- ],
779
- "type": "string",
780
- "format": "uri"
766
+ ]
781
767
  }
782
768
  },
783
769
  "required": [
@@ -787,8 +773,12 @@
787
773
  "external_id",
788
774
  "external_url"
789
775
  ],
790
- "additionalProperties": false
791
- }
776
+ "additionalProperties": false,
777
+ "title": "Certificate Credit Retirement",
778
+ "description": "Credit retirement breakdown for a certificate"
779
+ },
780
+ "title": "Credits Retired",
781
+ "description": "Breakdown of credits retired from this certificate by symbol"
792
782
  }
793
783
  },
794
784
  "required": [
@@ -803,64 +793,66 @@
803
793
  "collections",
804
794
  "credits_retired"
805
795
  ],
806
- "additionalProperties": false
807
- }
796
+ "additionalProperties": false,
797
+ "title": "Certificate",
798
+ "description": "Certificate associated with the retirement"
799
+ },
800
+ "title": "Certificates",
801
+ "description": "Certificates retired in this receipt"
808
802
  },
809
803
  "purchase_receipt": {
810
- "title": "Credit Purchase Receipt Reference",
811
- "description": "Reference to the credit purchase receipt when retirement occurs during purchase",
812
804
  "type": "object",
813
805
  "properties": {
814
806
  "external_id": {
807
+ "type": "string",
808
+ "format": "uuid",
809
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$",
815
810
  "title": "External ID",
816
811
  "description": "UUID identifier for external system references",
817
812
  "examples": [
818
813
  "ad44dd3f-f176-4b98-bf78-5ee6e77d0530"
819
- ],
820
- "type": "string",
821
- "format": "uuid",
822
- "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12})$"
814
+ ]
823
815
  },
824
816
  "external_url": {
817
+ "type": "string",
818
+ "format": "uri",
825
819
  "title": "External URL",
826
820
  "description": "URL pointing to external resources",
827
821
  "examples": [
828
822
  "https://explore.carrot.eco/",
829
823
  "https://whitepaper.carrot.eco/"
830
- ],
831
- "type": "string",
832
- "format": "uri"
824
+ ]
833
825
  },
834
826
  "ipfs_uri": {
827
+ "type": "string",
828
+ "minLength": 1,
829
+ "pattern": "^ipfs:\\/\\/(?:Qm[1-9A-HJ-NP-Za-km-z]{44}|[bB][a-z2-7]{58,}|[zZ][1-9A-HJ-NP-Za-km-z]{48,})(?:\\/[^\\s]*)?$",
835
830
  "title": "IPFS URI",
836
831
  "description": "InterPlanetary File System URI pointing to distributed content",
837
832
  "examples": [
838
833
  "ipfs://bafybeigdyrztvzl5cceubvaxob7iqh6f3f7s36c74ojav2xsz2uib2g3vm",
839
834
  "ipfs://bafybeihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku"
840
- ],
841
- "type": "string",
842
- "minLength": 1,
843
- "pattern": "^ipfs:\\/\\/(?:Qm[1-9A-HJ-NP-Za-km-z]{44}|[bB][a-z2-7]{58,}|[zZ][1-9A-HJ-NP-Za-km-z]{48,})(?:\\/[^\\s]*)?$"
835
+ ]
844
836
  },
845
837
  "smart_contract_address": {
838
+ "type": "string",
839
+ "pattern": "^0x[a-f0-9]{40}$",
846
840
  "title": "Smart Contract Address",
847
841
  "description": "Ethereum-compatible address of the smart contract that mints and manages this token",
848
842
  "examples": [
849
843
  "0x1234567890abcdef1234567890abcdef12345678"
850
- ],
851
- "type": "string",
852
- "pattern": "^0x[a-f0-9]{40}$"
844
+ ]
853
845
  },
854
846
  "token_id": {
847
+ "type": "string",
848
+ "minLength": 1,
849
+ "pattern": "^\\d+$",
855
850
  "title": "Token ID",
856
851
  "description": "Unique token identifier for this NFT within the smart contract",
857
852
  "examples": [
858
853
  "456789",
859
854
  "1000000"
860
- ],
861
- "type": "string",
862
- "minLength": 1,
863
- "pattern": "^\\d+$"
855
+ ]
864
856
  }
865
857
  },
866
858
  "required": [
@@ -870,7 +862,9 @@
870
862
  "smart_contract_address",
871
863
  "token_id"
872
864
  ],
873
- "additionalProperties": false
865
+ "additionalProperties": false,
866
+ "title": "Credit Purchase Receipt Reference",
867
+ "description": "Reference to the credit purchase receipt when retirement occurs during purchase"
874
868
  }
875
869
  },
876
870
  "required": [
@@ -881,38 +875,32 @@
881
875
  "credits",
882
876
  "certificates"
883
877
  ],
884
- "additionalProperties": false
878
+ "additionalProperties": false,
879
+ "title": "Credit Retirement Receipt Data",
880
+ "description": "Complete data structure for a credit retirement receipt"
885
881
  },
886
882
  "audit_data_hash": {
883
+ "type": "string",
884
+ "pattern": "^[0-9a-fA-F]{64}$",
887
885
  "title": "Audit Data Hash",
888
886
  "description": "SHA-256 hash of the original JSON content including private data before schema validation, used for data audit purposes",
889
887
  "examples": [
890
888
  "87f633634cc4b02f628685651f0a29b7bfa22a0bd841f725c6772dd00a58d489"
891
- ],
892
- "type": "string",
893
- "pattern": "^[0-9a-fA-F]{64}$"
889
+ ]
894
890
  },
895
891
  "blockchain": {
896
- "title": "Blockchain Information",
897
- "description": "Blockchain deployment information including smart contract address, network, and token identifier",
898
892
  "type": "object",
899
893
  "properties": {
900
894
  "smart_contract_address": {
895
+ "type": "string",
896
+ "pattern": "^0x[a-f0-9]{40}$",
901
897
  "title": "Smart Contract Address",
902
898
  "description": "Ethereum-compatible address of the smart contract that mints and manages this token",
903
899
  "examples": [
904
900
  "0x1234567890abcdef1234567890abcdef12345678"
905
- ],
906
- "type": "string",
907
- "pattern": "^0x[a-f0-9]{40}$"
901
+ ]
908
902
  },
909
903
  "chain_id": {
910
- "title": "Chain ID",
911
- "description": "Blockchain network chain identifier (e.g., 137 for Polygon mainnet, 80002 for Amoy testnet)",
912
- "examples": [
913
- 137,
914
- 80002
915
- ],
916
904
  "anyOf": [
917
905
  {
918
906
  "type": "number",
@@ -922,31 +910,37 @@
922
910
  "type": "number",
923
911
  "const": 80002
924
912
  }
913
+ ],
914
+ "title": "Chain ID",
915
+ "description": "Blockchain network chain identifier (e.g., 137 for Polygon mainnet, 80002 for Amoy testnet)",
916
+ "examples": [
917
+ 137,
918
+ 80002
925
919
  ]
926
920
  },
927
921
  "network_name": {
928
- "title": "Blockchain Network Name",
929
- "description": "Blockchain network name. Supported values include Polygon and Amoy",
930
- "examples": [
922
+ "type": "string",
923
+ "enum": [
931
924
  "Polygon",
932
925
  "Amoy"
933
926
  ],
934
- "type": "string",
935
- "enum": [
927
+ "title": "Blockchain Network Name",
928
+ "description": "Blockchain network name. Supported values include Polygon and Amoy",
929
+ "examples": [
936
930
  "Polygon",
937
931
  "Amoy"
938
932
  ]
939
933
  },
940
934
  "token_id": {
935
+ "type": "string",
936
+ "minLength": 1,
937
+ "pattern": "^\\d+$",
941
938
  "title": "Token ID",
942
939
  "description": "NFT token ID",
943
940
  "examples": [
944
941
  "456789",
945
942
  "1000000"
946
- ],
947
- "type": "string",
948
- "minLength": 1,
949
- "pattern": "^\\d+$"
943
+ ]
950
944
  }
951
945
  },
952
946
  "required": [
@@ -955,64 +949,66 @@
955
949
  "network_name",
956
950
  "token_id"
957
951
  ],
958
- "additionalProperties": false
952
+ "additionalProperties": false,
953
+ "title": "Blockchain Information",
954
+ "description": "Blockchain deployment information including smart contract address, network, and token identifier"
959
955
  },
960
956
  "name": {
957
+ "type": "string",
958
+ "minLength": 1,
959
+ "maxLength": 100,
960
+ "pattern": "^Credit Retirement Receipt #\\d+ • .+ Credits Retired$",
961
961
  "title": "Credit Retirement Receipt Name",
962
962
  "description": "Full display name for this Credit Retirement Receipt NFT. Format: \"Credit Retirement Receipt #[token_id] • [amount] Credits Retired\"",
963
963
  "examples": [
964
964
  "Credit Retirement Receipt #1245 • 10.5 Credits Retired",
965
965
  "Credit Retirement Receipt #1200 • 3.0 Credits Retired"
966
- ],
967
- "type": "string",
968
- "minLength": 1,
969
- "maxLength": 100,
970
- "pattern": "^Credit Retirement Receipt #\\d+ • .+ Credits Retired$"
966
+ ]
971
967
  },
972
968
  "short_name": {
969
+ "type": "string",
970
+ "minLength": 1,
971
+ "maxLength": 50,
972
+ "pattern": "^Retirement Receipt #\\d+$",
973
973
  "title": "Credit Retirement Receipt Short Name",
974
974
  "description": "Compact name for UI summaries, tables, or tooltips. Format: \"Retirement Receipt #[token_id]\"",
975
975
  "examples": [
976
976
  "Retirement Receipt #1245",
977
977
  "Retirement Receipt #1200"
978
- ],
979
- "type": "string",
980
- "minLength": 1,
981
- "maxLength": 50,
982
- "pattern": "^Retirement Receipt #\\d+$"
978
+ ]
983
979
  },
984
980
  "description": {
981
+ "type": "string",
982
+ "minLength": 1,
983
+ "maxLength": 500,
985
984
  "title": "Description",
986
985
  "description": "Human-readable summary describing the waste batch, origin, processing method, and chain of custody. Ideally, maximum 300 characters.",
987
986
  "examples": [
988
987
  "This MassID represents 3 metric tons of organic food waste from Enlatados Produção, tracked through complete chain of custody from generation to composting.",
989
988
  "This RecycledID represents 2.5 metric tons of recycled plastic bottles processed by Green Solutions Ltd."
990
- ],
991
- "type": "string",
992
- "minLength": 1,
993
- "maxLength": 500
989
+ ]
994
990
  },
995
991
  "image": {
992
+ "type": "string",
993
+ "minLength": 1,
994
+ "pattern": "^ipfs:\\/\\/(?:Qm[1-9A-HJ-NP-Za-km-z]{44}|[bB][a-z2-7]{58,}|[zZ][1-9A-HJ-NP-Za-km-z]{48,})(?:\\/[^\\s]*)?$",
996
995
  "title": "Image URI",
997
996
  "description": "IPFS URI pointing to the NFT preview image displayed in marketplaces and wallets",
998
997
  "examples": [
999
998
  "ipfs://bafybeigdyrztvzl5cceubvaxob7iqh6f3f7s36c74ojav2xsz2uib2g3vm",
1000
999
  "ipfs://bafybeihdwdcefgh4dqkjv67uzcmw7ojee6xedzdetojuzjevtenxquvyku"
1001
- ],
1002
- "type": "string",
1003
- "minLength": 1,
1004
- "pattern": "^ipfs:\\/\\/(?:Qm[1-9A-HJ-NP-Za-km-z]{44}|[bB][a-z2-7]{58,}|[zZ][1-9A-HJ-NP-Za-km-z]{48,})(?:\\/[^\\s]*)?$"
1000
+ ]
1005
1001
  },
1006
1002
  "background_color": {
1007
1003
  "title": "Background Color",
1008
1004
  "description": "Hexadecimal color code used as background color in NFT marketplace displays",
1005
+ "type": "string",
1006
+ "minLength": 1,
1007
+ "pattern": "^#[0-9A-F]{6}$",
1009
1008
  "examples": [
1010
1009
  "#2D5A27",
1011
1010
  "#FF5733"
1012
- ],
1013
- "type": "string",
1014
- "minLength": 1,
1015
- "pattern": "^#[0-9A-F]{6}$"
1011
+ ]
1016
1012
  },
1017
1013
  "animation_url": {
1018
1014
  "title": "Animation URL",
@@ -1030,26 +1026,28 @@
1030
1026
  "description": "Optional list of public resource links with labels",
1031
1027
  "type": "array",
1032
1028
  "items": {
1033
- "title": "External Link",
1034
- "description": "External link with label and description",
1035
1029
  "type": "object",
1036
1030
  "properties": {
1037
1031
  "label": {
1038
- "title": "Link Label",
1039
- "description": "Display name for the external link",
1040
1032
  "type": "string",
1041
1033
  "minLength": 1,
1042
- "maxLength": 50
1034
+ "maxLength": 50,
1035
+ "title": "Link Label",
1036
+ "description": "Display name for the external link",
1037
+ "examples": [
1038
+ "Example text",
1039
+ "Sample value"
1040
+ ]
1043
1041
  },
1044
1042
  "url": {
1043
+ "type": "string",
1044
+ "format": "uri",
1045
1045
  "title": "Link URL",
1046
1046
  "description": "Direct URI to the linked resource",
1047
1047
  "examples": [
1048
1048
  "https://explore.carrot.eco/",
1049
1049
  "https://whitepaper.carrot.eco/"
1050
- ],
1051
- "type": "string",
1052
- "format": "uri"
1050
+ ]
1053
1051
  },
1054
1052
  "description": {
1055
1053
  "title": "Link Description",
@@ -1063,19 +1061,17 @@
1063
1061
  "label",
1064
1062
  "url"
1065
1063
  ],
1066
- "additionalProperties": false
1064
+ "additionalProperties": false,
1065
+ "title": "External Link",
1066
+ "description": "External link with label and description"
1067
1067
  }
1068
1068
  },
1069
1069
  "attributes": {
1070
- "title": "Credit Retirement Receipt NFT Attribute Array",
1071
- "description": "Attributes for credit retirement receipts including per-credit breakdowns, totals, beneficiary, credit holder, retirement date, certificate count, and optional purchase info. Fixed required attributes: Total Credits Retired, Beneficiary, Retirement Date, Certificates Retired. Conditional attributes: Credit Holder (required when credit_holder.identity.name is provided), Purchase Date (optional, when purchase_receipt is present), Purchase Receipt (optional, when purchase_receipt is present). Dynamic attributes: Credit attributes (one per credit symbol in data.credits).\n\nRequired attributes (4): Total Credits Retired, Beneficiary, Retirement Date, Certificates Retired",
1072
1070
  "minItems": 4,
1073
1071
  "type": "array",
1074
1072
  "items": {
1075
1073
  "anyOf": [
1076
1074
  {
1077
- "title": "Total Credits Retired Attribute",
1078
- "description": "Total number of credits retired across all tokens attribute with numeric display",
1079
1075
  "type": "object",
1080
1076
  "properties": {
1081
1077
  "trait_type": {
@@ -1083,15 +1079,15 @@
1083
1079
  "const": "Total Credits Retired"
1084
1080
  },
1085
1081
  "value": {
1082
+ "type": "number",
1083
+ "minimum": 0,
1086
1084
  "title": "Total Credits Retired",
1087
1085
  "description": "Total number of credits retired across all tokens",
1088
1086
  "examples": [
1089
1087
  0,
1090
1088
  45.2,
1091
1089
  72.5
1092
- ],
1093
- "type": "number",
1094
- "minimum": 0
1090
+ ]
1095
1091
  },
1096
1092
  "display_type": {
1097
1093
  "type": "string",
@@ -1100,13 +1096,13 @@
1100
1096
  "max_value": {
1101
1097
  "title": "Max Value",
1102
1098
  "description": "Maximum possible value for numeric traits",
1099
+ "type": "number",
1100
+ "minimum": 0,
1103
1101
  "examples": [
1104
1102
  0,
1105
1103
  45.2,
1106
1104
  72.5
1107
- ],
1108
- "type": "number",
1109
- "minimum": 0
1105
+ ]
1110
1106
  }
1111
1107
  },
1112
1108
  "required": [
@@ -1114,11 +1110,11 @@
1114
1110
  "value",
1115
1111
  "display_type"
1116
1112
  ],
1117
- "additionalProperties": false
1113
+ "additionalProperties": false,
1114
+ "title": "Total Credits Retired Attribute",
1115
+ "description": "Total number of credits retired across all tokens attribute with numeric display"
1118
1116
  },
1119
1117
  {
1120
- "title": "Beneficiary Attribute",
1121
- "description": "Attribute containing the beneficiary display name",
1122
1118
  "type": "object",
1123
1119
  "properties": {
1124
1120
  "trait_type": {
@@ -1126,14 +1122,14 @@
1126
1122
  "const": "Beneficiary"
1127
1123
  },
1128
1124
  "value": {
1125
+ "type": "string",
1126
+ "minLength": 1,
1127
+ "maxLength": 100,
1129
1128
  "title": "Beneficiary",
1130
1129
  "description": "Beneficiary receiving the retirement benefit",
1131
1130
  "examples": [
1132
1131
  "Climate Action Corp"
1133
- ],
1134
- "type": "string",
1135
- "minLength": 1,
1136
- "maxLength": 100
1132
+ ]
1137
1133
  },
1138
1134
  "display_type": {
1139
1135
  "title": "Display Type",
@@ -1149,24 +1145,24 @@
1149
1145
  "max_value": {
1150
1146
  "title": "Max Value",
1151
1147
  "description": "Maximum possible value for numeric traits",
1148
+ "type": "number",
1149
+ "minimum": 0,
1152
1150
  "examples": [
1153
1151
  0,
1154
1152
  45.2,
1155
1153
  72.5
1156
- ],
1157
- "type": "number",
1158
- "minimum": 0
1154
+ ]
1159
1155
  }
1160
1156
  },
1161
1157
  "required": [
1162
1158
  "trait_type",
1163
1159
  "value"
1164
1160
  ],
1165
- "additionalProperties": false
1161
+ "additionalProperties": false,
1162
+ "title": "Beneficiary Attribute",
1163
+ "description": "Attribute containing the beneficiary display name"
1166
1164
  },
1167
1165
  {
1168
- "title": "Retirement Date Attribute",
1169
- "description": "Unix timestamp in milliseconds when the retirement was completed attribute",
1170
1166
  "type": "object",
1171
1167
  "properties": {
1172
1168
  "trait_type": {
@@ -1174,14 +1170,14 @@
1174
1170
  "const": "Retirement Date"
1175
1171
  },
1176
1172
  "value": {
1173
+ "type": "integer",
1174
+ "exclusiveMinimum": 0,
1175
+ "maximum": 9007199254740991,
1177
1176
  "title": "Retirement Date",
1178
1177
  "description": "Unix timestamp in milliseconds when the retirement was completed",
1179
1178
  "examples": [
1180
1179
  1704067200000
1181
- ],
1182
- "type": "integer",
1183
- "exclusiveMinimum": 0,
1184
- "maximum": 9007199254740991
1180
+ ]
1185
1181
  },
1186
1182
  "display_type": {
1187
1183
  "type": "string",
@@ -1193,11 +1189,11 @@
1193
1189
  "value",
1194
1190
  "display_type"
1195
1191
  ],
1196
- "additionalProperties": false
1192
+ "additionalProperties": false,
1193
+ "title": "Retirement Date Attribute",
1194
+ "description": "Unix timestamp in milliseconds when the retirement was completed attribute"
1197
1195
  },
1198
1196
  {
1199
- "title": "Certificates Retired Attribute",
1200
- "description": "Total number of certificates retired attribute with numeric display",
1201
1197
  "type": "object",
1202
1198
  "properties": {
1203
1199
  "trait_type": {
@@ -1205,16 +1201,16 @@
1205
1201
  "const": "Certificates Retired"
1206
1202
  },
1207
1203
  "value": {
1204
+ "type": "integer",
1205
+ "minimum": 1,
1206
+ "maximum": 9007199254740991,
1208
1207
  "title": "Certificates Retired",
1209
1208
  "description": "Total number of certificates retired",
1210
1209
  "examples": [
1211
1210
  1,
1212
1211
  123,
1213
1212
  456
1214
- ],
1215
- "type": "integer",
1216
- "minimum": 1,
1217
- "maximum": 9007199254740991
1213
+ ]
1218
1214
  },
1219
1215
  "display_type": {
1220
1216
  "type": "string",
@@ -1223,13 +1219,13 @@
1223
1219
  "max_value": {
1224
1220
  "title": "Max Value",
1225
1221
  "description": "Maximum possible value for numeric traits",
1222
+ "type": "number",
1223
+ "minimum": 0,
1226
1224
  "examples": [
1227
1225
  0,
1228
1226
  45.2,
1229
1227
  72.5
1230
- ],
1231
- "type": "number",
1232
- "minimum": 0
1228
+ ]
1233
1229
  }
1234
1230
  },
1235
1231
  "required": [
@@ -1237,11 +1233,11 @@
1237
1233
  "value",
1238
1234
  "display_type"
1239
1235
  ],
1240
- "additionalProperties": false
1236
+ "additionalProperties": false,
1237
+ "title": "Certificates Retired Attribute",
1238
+ "description": "Total number of certificates retired attribute with numeric display"
1241
1239
  },
1242
1240
  {
1243
- "title": "Credit Holder Attribute",
1244
- "description": "Attribute containing the credit holder display name",
1245
1241
  "type": "object",
1246
1242
  "properties": {
1247
1243
  "trait_type": {
@@ -1249,14 +1245,14 @@
1249
1245
  "const": "Credit Holder"
1250
1246
  },
1251
1247
  "value": {
1248
+ "type": "string",
1249
+ "minLength": 1,
1250
+ "maxLength": 100,
1252
1251
  "title": "Credit Holder",
1253
1252
  "description": "Entity that surrendered the credits",
1254
1253
  "examples": [
1255
1254
  "EcoTech Solutions Inc."
1256
- ],
1257
- "type": "string",
1258
- "minLength": 1,
1259
- "maxLength": 100
1255
+ ]
1260
1256
  },
1261
1257
  "display_type": {
1262
1258
  "title": "Display Type",
@@ -1272,24 +1268,24 @@
1272
1268
  "max_value": {
1273
1269
  "title": "Max Value",
1274
1270
  "description": "Maximum possible value for numeric traits",
1271
+ "type": "number",
1272
+ "minimum": 0,
1275
1273
  "examples": [
1276
1274
  0,
1277
1275
  45.2,
1278
1276
  72.5
1279
- ],
1280
- "type": "number",
1281
- "minimum": 0
1277
+ ]
1282
1278
  }
1283
1279
  },
1284
1280
  "required": [
1285
1281
  "trait_type",
1286
1282
  "value"
1287
1283
  ],
1288
- "additionalProperties": false
1284
+ "additionalProperties": false,
1285
+ "title": "Credit Holder Attribute",
1286
+ "description": "Attribute containing the credit holder display name"
1289
1287
  },
1290
1288
  {
1291
- "title": "Purchase Date Attribute",
1292
- "description": "Unix timestamp in milliseconds when credits were purchased (if purchase_receipt is present) attribute",
1293
1289
  "type": "object",
1294
1290
  "properties": {
1295
1291
  "trait_type": {
@@ -1297,14 +1293,14 @@
1297
1293
  "const": "Purchase Date"
1298
1294
  },
1299
1295
  "value": {
1296
+ "type": "integer",
1297
+ "exclusiveMinimum": 0,
1298
+ "maximum": 9007199254740991,
1300
1299
  "title": "Purchase Date",
1301
1300
  "description": "Unix timestamp in milliseconds when credits were purchased (if purchase_receipt is present)",
1302
1301
  "examples": [
1303
1302
  1704067200000
1304
- ],
1305
- "type": "integer",
1306
- "exclusiveMinimum": 0,
1307
- "maximum": 9007199254740991
1303
+ ]
1308
1304
  },
1309
1305
  "display_type": {
1310
1306
  "type": "string",
@@ -1316,11 +1312,11 @@
1316
1312
  "value",
1317
1313
  "display_type"
1318
1314
  ],
1319
- "additionalProperties": false
1315
+ "additionalProperties": false,
1316
+ "title": "Purchase Date Attribute",
1317
+ "description": "Unix timestamp in milliseconds when credits were purchased (if purchase_receipt is present) attribute"
1320
1318
  },
1321
1319
  {
1322
- "title": "Purchase Receipt Attribute",
1323
- "description": "Attribute representing the purchase receipt token ID",
1324
1320
  "type": "object",
1325
1321
  "properties": {
1326
1322
  "trait_type": {
@@ -1328,12 +1324,16 @@
1328
1324
  "const": "Purchase Receipt"
1329
1325
  },
1330
1326
  "value": {
1331
- "title": "Purchase Receipt Token ID",
1332
- "description": "Token ID of the purchase receipt NFT as #<token_id> (if purchase_receipt is present)",
1333
- "example": "#123",
1334
1327
  "type": "string",
1335
1328
  "minLength": 1,
1336
- "pattern": "^#\\d+$"
1329
+ "pattern": "^#\\d+$",
1330
+ "title": "Purchase Receipt Token ID",
1331
+ "description": "Token ID of the purchase receipt NFT as #<token_id> (if purchase_receipt is present)",
1332
+ "examples": [
1333
+ "Example text",
1334
+ "Sample value"
1335
+ ],
1336
+ "example": "#123"
1337
1337
  },
1338
1338
  "display_type": {
1339
1339
  "title": "Display Type",
@@ -1349,49 +1349,49 @@
1349
1349
  "max_value": {
1350
1350
  "title": "Max Value",
1351
1351
  "description": "Maximum possible value for numeric traits",
1352
+ "type": "number",
1353
+ "minimum": 0,
1352
1354
  "examples": [
1353
1355
  0,
1354
1356
  45.2,
1355
1357
  72.5
1356
- ],
1357
- "type": "number",
1358
- "minimum": 0
1358
+ ]
1359
1359
  }
1360
1360
  },
1361
1361
  "required": [
1362
1362
  "trait_type",
1363
1363
  "value"
1364
1364
  ],
1365
- "additionalProperties": false
1365
+ "additionalProperties": false,
1366
+ "title": "Purchase Receipt Attribute",
1367
+ "description": "Attribute representing the purchase receipt token ID"
1366
1368
  },
1367
1369
  {
1368
- "title": "Credit Attribute",
1369
- "description": "Attribute representing retired amount per credit token symbol",
1370
1370
  "type": "object",
1371
1371
  "properties": {
1372
1372
  "trait_type": {
1373
- "title": "Credit Token Symbol",
1374
- "description": "ERC20 token symbol identifier",
1375
- "examples": [
1373
+ "type": "string",
1374
+ "enum": [
1376
1375
  "C-CARB.CH4",
1377
1376
  "C-BIOW"
1378
1377
  ],
1379
- "type": "string",
1380
- "enum": [
1378
+ "title": "Credit Token Symbol",
1379
+ "description": "ERC20 token symbol identifier",
1380
+ "examples": [
1381
1381
  "C-CARB.CH4",
1382
1382
  "C-BIOW"
1383
1383
  ]
1384
1384
  },
1385
1385
  "value": {
1386
+ "type": "number",
1387
+ "minimum": 0,
1386
1388
  "title": "Credit Retirement Amount",
1387
1389
  "description": "Amount of credits retired for the token symbol",
1388
1390
  "examples": [
1389
1391
  0,
1390
1392
  45.2,
1391
1393
  72.5
1392
- ],
1393
- "type": "number",
1394
- "minimum": 0
1394
+ ]
1395
1395
  },
1396
1396
  "display_type": {
1397
1397
  "type": "string",
@@ -1400,13 +1400,13 @@
1400
1400
  "max_value": {
1401
1401
  "title": "Max Value",
1402
1402
  "description": "Maximum possible value for numeric traits",
1403
+ "type": "number",
1404
+ "minimum": 0,
1403
1405
  "examples": [
1404
1406
  0,
1405
1407
  45.2,
1406
1408
  72.5
1407
- ],
1408
- "type": "number",
1409
- "minimum": 0
1409
+ ]
1410
1410
  }
1411
1411
  },
1412
1412
  "required": [
@@ -1414,10 +1414,14 @@
1414
1414
  "value",
1415
1415
  "display_type"
1416
1416
  ],
1417
- "additionalProperties": false
1417
+ "additionalProperties": false,
1418
+ "title": "Credit Attribute",
1419
+ "description": "Attribute representing retired amount per credit token symbol"
1418
1420
  }
1419
1421
  ]
1420
- }
1422
+ },
1423
+ "title": "Credit Retirement Receipt NFT Attribute Array",
1424
+ "description": "Attributes for credit retirement receipts including per-credit breakdowns, totals, beneficiary, credit holder, retirement date, certificate count, and optional purchase info. Fixed required attributes: Total Credits Retired, Beneficiary, Retirement Date, Certificates Retired. Conditional attributes: Credit Holder (required when credit_holder.identity.name is provided), Purchase Date (optional, when purchase_receipt is present), Purchase Receipt (optional, when purchase_receipt is present). Dynamic attributes: Credit attributes (one per credit symbol in data.credits).\n\nRequired attributes (4): Total Credits Retired, Beneficiary, Retirement Date, Certificates Retired"
1421
1425
  }
1422
1426
  },
1423
1427
  "required": [
@@ -1437,5 +1441,9 @@
1437
1441
  "image",
1438
1442
  "attributes"
1439
1443
  ],
1440
- "additionalProperties": false
1444
+ "additionalProperties": false,
1445
+ "title": "CreditRetirementReceipt NFT IPFS Record",
1446
+ "description": "Complete CreditRetirementReceipt NFT IPFS record including attributes and credit retirement data",
1447
+ "$id": "https://raw.githubusercontent.com/carrot-foundation/schemas/refs/tags/0.2.4/schemas/ipfs/credit-retirement-receipt/credit-retirement-receipt.schema.json",
1448
+ "version": "0.2.4"
1441
1449
  }