@carrot-foundation/schemas 0.1.34 → 0.1.36

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.
@@ -1,29 +1,1664 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "https://raw.githubusercontent.com/carrot-foundation/schemas/refs/heads/main/schemas/ipfs/recycled-id/recycled-id.schema.json",
4
3
  "title": "RecycledID NFT IPFS Record",
5
- "unevaluatedProperties": false,
6
- "allOf": [
7
- {
8
- "$ref": "../shared/nft/nft.schema.json"
4
+ "description": "Complete RecycledID NFT IPFS record including fixed attributes and recycling outcome data",
5
+ "$id": "https://raw.githubusercontent.com/carrot-foundation/schemas/refs/tags/0.1.36/schemas/ipfs/recycled-id/recycled-id.schema.json",
6
+ "version": "0.1.36",
7
+ "type": "object",
8
+ "properties": {
9
+ "$schema": {
10
+ "title": "JSON Schema URI",
11
+ "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"
9
15
  },
10
- {
16
+ "schema": {
11
17
  "type": "object",
12
18
  "properties": {
13
- "schema": {
19
+ "hash": {
20
+ "title": "Schema Hash",
21
+ "description": "Keccak256 hash of the JSON Schema this record was validated against",
22
+ "examples": [
23
+ "ac08c3cf2e175e55961d6affdb38bc24591b84ceef7f3707c69ae3d52c148b2f",
24
+ "0xac08c3cf2e175e55961d6affdb38bc24591b84ceef7f3707c69ae3d52c148b2f"
25
+ ],
26
+ "anyOf": [
27
+ {
28
+ "title": "Keccak256 Hash",
29
+ "description": "Keccak256 cryptographic hash as hexadecimal string",
30
+ "examples": [
31
+ "ac08c3cf2e175e55961d6affdb38bc24591b84ceef7f3707c69ae3d52c148b2f",
32
+ "b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2"
33
+ ],
34
+ "type": "string",
35
+ "pattern": "^[0-9a-fA-F]{64}$"
36
+ },
37
+ {
38
+ "type": "string",
39
+ "pattern": "^0x[a-fA-F0-9]{64}$"
40
+ }
41
+ ]
42
+ },
43
+ "type": {
44
+ "title": "RecycledID Schema Type",
45
+ "description": "RecycledID NFT schema type",
46
+ "type": "string",
47
+ "const": "RecycledID"
48
+ },
49
+ "version": {
50
+ "title": "Schema Version",
51
+ "description": "Version of the schema, using semantic versioning",
52
+ "examples": [
53
+ "0.1.0",
54
+ "1.0.0",
55
+ "2.1.3"
56
+ ],
57
+ "type": "string",
58
+ "minLength": 1,
59
+ "pattern": "^v?\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9.-]+)?(\\+[a-zA-Z0-9.-]+)?$"
60
+ }
61
+ },
62
+ "required": [
63
+ "hash",
64
+ "type",
65
+ "version"
66
+ ],
67
+ "additionalProperties": false
68
+ },
69
+ "created_at": {
70
+ "title": "Created At",
71
+ "description": "ISO 8601 creation timestamp for this record",
72
+ "examples": [
73
+ "2024-12-05T11:02:47.000Z",
74
+ "2025-02-22T10:35:12.000Z"
75
+ ],
76
+ "type": "string",
77
+ "format": "date-time",
78
+ "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))$"
79
+ },
80
+ "external_id": {
81
+ "title": "External ID",
82
+ "description": "Off-chain reference ID (UUID from Carrot backend)",
83
+ "examples": [
84
+ "ad44dd3f-f176-4b98-bf78-5ee6e77d0530",
85
+ "b2c4e6f8-a1b3-4c5d-9e8f-123456789abc"
86
+ ],
87
+ "type": "string",
88
+ "format": "uuid",
89
+ "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})$"
90
+ },
91
+ "external_url": {
92
+ "title": "External URL",
93
+ "description": "External URL of the content",
94
+ "examples": [
95
+ "https://explore.carrot.eco/document/ad44dd3f-f176-4b98-bf78-5ee6e77d0530",
96
+ "https://carrot.eco/whitepaper.pdf"
97
+ ],
98
+ "type": "string",
99
+ "format": "uri"
100
+ },
101
+ "original_content_hash": {
102
+ "title": "Original Content Hash",
103
+ "description": "SHA-256 hash of the original JSON content including private data before schema validation",
104
+ "examples": [
105
+ "87f633634cc4b02f628685651f0a29b7bfa22a0bd841f725c6772dd00a58d489",
106
+ "6e83b8e6373847bbdc056549bedda38dc88854ce41ba4fca11e0fc6ce3e07ef6"
107
+ ],
108
+ "type": "string",
109
+ "pattern": "^[0-9a-fA-F]{64}$"
110
+ },
111
+ "content_hash": {
112
+ "title": "Content Hash",
113
+ "description": "SHA-256 hash of RFC 8785 canonicalized JSON after schema validation",
114
+ "examples": [
115
+ "87f633634cc4b02f628685651f0a29b7bfa22a0bd841f725c6772dd00a58d489",
116
+ "6e83b8e6373847bbdc056549bedda38dc88854ce41ba4fca11e0fc6ce3e07ef6"
117
+ ],
118
+ "type": "string",
119
+ "pattern": "^[0-9a-fA-F]{64}$"
120
+ },
121
+ "creator": {
122
+ "title": "Creator",
123
+ "description": "Entity that created this record",
124
+ "type": "object",
125
+ "properties": {
126
+ "name": {
127
+ "title": "Creator Name",
128
+ "description": "Company or individual name that created this record",
129
+ "examples": [
130
+ "Carrot Foundation"
131
+ ],
132
+ "type": "string"
133
+ },
134
+ "id": {
135
+ "title": "Creator ID",
136
+ "description": "Unique identifier for the creator",
137
+ "examples": [
138
+ "ad44dd3f-f176-4b98-bf78-5ee6e77d0530",
139
+ "6f520d88-864d-432d-bf9f-5c3166c4818f",
140
+ "f77afa89-1c58-40fd-9bf5-8a86703a8af4"
141
+ ],
142
+ "type": "string",
143
+ "format": "uuid",
144
+ "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})$"
145
+ }
146
+ },
147
+ "required": [
148
+ "name",
149
+ "id"
150
+ ],
151
+ "additionalProperties": false
152
+ },
153
+ "relationships": {
154
+ "title": "Relationships",
155
+ "description": "References to other IPFS records this record relates to",
156
+ "type": "array",
157
+ "items": {
158
+ "title": "Relationship",
159
+ "description": "Relationship to another IPFS record",
160
+ "type": "object",
161
+ "properties": {
162
+ "target_uri": {
163
+ "title": "Target IPFS URI",
164
+ "description": "Target IPFS URI of the referenced record",
165
+ "examples": [
166
+ "ipfs://QmTy8w65yBXgyfG2ZBg5TrfB2hPjrDQH3RCQFJGkARStJb/mass-id-organic.png",
167
+ "ipfs://QmYjtig7VJQ6XsnUjqqJvj7QaMcCAwtrgNdahSiFofrE7o"
168
+ ],
169
+ "type": "string",
170
+ "minLength": 1,
171
+ "pattern": "^ipfs:\\/\\/[a-zA-Z0-9]+(\\/.*)?$"
172
+ },
173
+ "type": {
174
+ "title": "Relationship Type",
175
+ "description": "Type of relationship to the referenced record",
176
+ "examples": [
177
+ "mass-id",
178
+ "audit",
179
+ "collection"
180
+ ],
181
+ "type": "string",
182
+ "enum": [
183
+ "collection",
184
+ "credit",
185
+ "gas-id",
186
+ "mass-id",
187
+ "mass-id-audit",
188
+ "methodology",
189
+ "purchase-id",
190
+ "recycled-id"
191
+ ]
192
+ },
193
+ "description": {
194
+ "title": "Relationship Description",
195
+ "description": "Human-readable description of the relationship",
196
+ "examples": [
197
+ "This record supersedes the previous version",
198
+ "Related carbon credit batch",
199
+ "Source document for this verification",
200
+ "Child record derived from this parent",
201
+ "Updated version of original record"
202
+ ],
203
+ "type": "string"
204
+ }
205
+ },
206
+ "required": [
207
+ "target_uri",
208
+ "type"
209
+ ],
210
+ "additionalProperties": false
211
+ }
212
+ },
213
+ "environment": {
214
+ "title": "Environment",
215
+ "description": "Environment information",
216
+ "type": "object",
217
+ "properties": {
218
+ "blockchain_network": {
219
+ "title": "Blockchain Network",
220
+ "description": "Blockchain Network Environment",
221
+ "type": "string",
222
+ "enum": [
223
+ "mainnet",
224
+ "testnet"
225
+ ]
226
+ },
227
+ "deployment": {
228
+ "title": "Deployment Environment",
229
+ "description": "System environment where this record was generated",
230
+ "type": "string",
231
+ "enum": [
232
+ "production",
233
+ "development",
234
+ "testing"
235
+ ]
236
+ },
237
+ "data_set_name": {
238
+ "title": "Data Set Name",
239
+ "description": "Name of the data set for this record",
240
+ "type": "string",
241
+ "enum": [
242
+ "TEST",
243
+ "PROD"
244
+ ]
245
+ }
246
+ },
247
+ "required": [
248
+ "blockchain_network",
249
+ "deployment",
250
+ "data_set_name"
251
+ ],
252
+ "additionalProperties": false
253
+ },
254
+ "data": {
255
+ "title": "RecycledID Data",
256
+ "description": "Complete data structure for RecycledID certificate",
257
+ "type": "object",
258
+ "properties": {
259
+ "summary": {
260
+ "title": "RecycledID Summary",
261
+ "description": "Summary information for the RecycledID certificate",
262
+ "type": "object",
263
+ "properties": {
264
+ "recycled_mass_kg": {
265
+ "title": "Recycled Mass Weight",
266
+ "description": "Total weight of materials successfully recycled",
267
+ "examples": [
268
+ 3000,
269
+ 1500,
270
+ 500
271
+ ],
272
+ "type": "number",
273
+ "minimum": 0
274
+ },
275
+ "credit_type": {
276
+ "title": "Credit Type",
277
+ "description": "Type of credit issued",
278
+ "examples": [
279
+ "Organic",
280
+ "Carbon (CH₄)"
281
+ ],
282
+ "type": "string",
283
+ "minLength": 1,
284
+ "maxLength": 100
285
+ },
286
+ "credit_amount": {
287
+ "title": "Credit Amount",
288
+ "description": "Amount of credits issued",
289
+ "examples": [
290
+ 0,
291
+ 45.2,
292
+ 72.5
293
+ ],
294
+ "type": "number",
295
+ "minimum": 0
296
+ }
297
+ },
298
+ "required": [
299
+ "recycled_mass_kg",
300
+ "credit_type",
301
+ "credit_amount"
302
+ ],
303
+ "additionalProperties": false
304
+ },
305
+ "methodology": {
306
+ "title": "Methodology Reference",
307
+ "description": "Reference to a methodology record",
308
+ "type": "object",
309
+ "properties": {
310
+ "external_id": {
311
+ "title": "Methodology External ID",
312
+ "description": "Unique identifier for the methodology",
313
+ "examples": [
314
+ "ad44dd3f-f176-4b98-bf78-5ee6e77d0530",
315
+ "b2c4e6f8-a1b3-4c5d-9e8f-123456789abc"
316
+ ],
317
+ "type": "string",
318
+ "format": "uuid",
319
+ "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})$"
320
+ },
321
+ "name": {
322
+ "title": "Methodology Name",
323
+ "description": "Human-readable name of the methodology",
324
+ "examples": [
325
+ "BOLD Carbon (CH₄)",
326
+ "BOLD Recycling"
327
+ ],
328
+ "type": "string",
329
+ "minLength": 5,
330
+ "maxLength": 150
331
+ },
332
+ "version": {
333
+ "title": "Methodology Version",
334
+ "description": "Version of the methodology",
335
+ "examples": [
336
+ "0.1.0",
337
+ "1.0.0",
338
+ "2.1.3"
339
+ ],
340
+ "type": "string",
341
+ "minLength": 1,
342
+ "pattern": "^v?\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9.-]+)?(\\+[a-zA-Z0-9.-]+)?$"
343
+ },
344
+ "external_url": {
345
+ "title": "Methodology External URL",
346
+ "description": "URL to view the methodology on Carrot Explorer",
347
+ "examples": [
348
+ "https://explore.carrot.eco/document/ad44dd3f-f176-4b98-bf78-5ee6e77d0530",
349
+ "https://carrot.eco/whitepaper.pdf"
350
+ ],
351
+ "type": "string",
352
+ "format": "uri"
353
+ },
354
+ "uri": {
355
+ "title": "Methodology IPFS URI",
356
+ "description": "IPFS URI to the methodology record",
357
+ "examples": [
358
+ "ipfs://QmTy8w65yBXgyfG2ZBg5TrfB2hPjrDQH3RCQFJGkARStJb/mass-id-organic.png",
359
+ "ipfs://QmYjtig7VJQ6XsnUjqqJvj7QaMcCAwtrgNdahSiFofrE7o"
360
+ ],
361
+ "type": "string",
362
+ "minLength": 1,
363
+ "pattern": "^ipfs:\\/\\/[a-zA-Z0-9]+(\\/.*)?$"
364
+ }
365
+ },
366
+ "required": [
367
+ "external_id",
368
+ "name",
369
+ "version",
370
+ "external_url"
371
+ ],
372
+ "additionalProperties": false
373
+ },
374
+ "audit": {
375
+ "title": "Audit Reference",
376
+ "description": "Reference to an audit record",
377
+ "type": "object",
378
+ "properties": {
379
+ "date": {
380
+ "title": "Audit Date",
381
+ "description": "Date when the audit was completed",
382
+ "examples": [
383
+ "2024-12-05",
384
+ "2025-02-22",
385
+ "2024-02-10"
386
+ ],
387
+ "type": "string",
388
+ "format": "date",
389
+ "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])))$"
390
+ },
391
+ "external_id": {
392
+ "title": "Audit External ID",
393
+ "description": "Unique identifier for the audit",
394
+ "examples": [
395
+ "ad44dd3f-f176-4b98-bf78-5ee6e77d0530",
396
+ "b2c4e6f8-a1b3-4c5d-9e8f-123456789abc"
397
+ ],
398
+ "type": "string",
399
+ "format": "uuid",
400
+ "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})$"
401
+ },
402
+ "external_url": {
403
+ "title": "Audit External URL",
404
+ "description": "URL to view the audit on Carrot Explorer",
405
+ "examples": [
406
+ "https://explore.carrot.eco/document/ad44dd3f-f176-4b98-bf78-5ee6e77d0530",
407
+ "https://carrot.eco/whitepaper.pdf"
408
+ ],
409
+ "type": "string",
410
+ "format": "uri"
411
+ },
412
+ "methodology_compliance": {
413
+ "title": "Methodology Compliance",
414
+ "description": "Result of methodology compliance check",
415
+ "examples": [
416
+ "PASSED",
417
+ "FAILED"
418
+ ],
419
+ "type": "string",
420
+ "enum": [
421
+ "PASSED",
422
+ "FAILED"
423
+ ]
424
+ },
425
+ "rules_executed": {
426
+ "title": "Rules Executed",
427
+ "description": "Number of rules executed during the audit",
428
+ "examples": [
429
+ 0,
430
+ 123,
431
+ 4126
432
+ ],
433
+ "type": "integer",
434
+ "minimum": 0,
435
+ "maximum": 9007199254740991
436
+ },
437
+ "report": {
438
+ "title": "Audit Report",
439
+ "description": "IPFS URI of the audit report",
440
+ "examples": [
441
+ "ipfs://QmTy8w65yBXgyfG2ZBg5TrfB2hPjrDQH3RCQFJGkARStJb/mass-id-organic.png",
442
+ "ipfs://QmYjtig7VJQ6XsnUjqqJvj7QaMcCAwtrgNdahSiFofrE7o"
443
+ ],
444
+ "type": "string",
445
+ "minLength": 1,
446
+ "pattern": "^ipfs:\\/\\/[a-zA-Z0-9]+(\\/.*)?$"
447
+ }
448
+ },
449
+ "required": [
450
+ "date",
451
+ "external_id",
452
+ "external_url",
453
+ "methodology_compliance",
454
+ "rules_executed",
455
+ "report"
456
+ ],
457
+ "additionalProperties": false
458
+ },
459
+ "mass_id": {
460
+ "title": "MassID Reference",
461
+ "description": "Reference to a MassID record",
462
+ "type": "object",
14
463
  "properties": {
15
- "type": {
16
- "const": "RecycledID"
464
+ "external_id": {
465
+ "title": "MassID External ID",
466
+ "description": "Unique identifier for the MassID",
467
+ "examples": [
468
+ "ad44dd3f-f176-4b98-bf78-5ee6e77d0530",
469
+ "b2c4e6f8-a1b3-4c5d-9e8f-123456789abc"
470
+ ],
471
+ "type": "string",
472
+ "format": "uuid",
473
+ "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})$"
474
+ },
475
+ "token_id": {
476
+ "title": "MassID Token ID",
477
+ "description": "NFT token ID of the MassID",
478
+ "examples": [
479
+ "123",
480
+ "456789",
481
+ "1000000"
482
+ ],
483
+ "type": "string",
484
+ "minLength": 1,
485
+ "pattern": "^\\d+$"
486
+ },
487
+ "external_url": {
488
+ "title": "MassID External URL",
489
+ "description": "URL to view the MassID on Carrot Explorer",
490
+ "examples": [
491
+ "https://explore.carrot.eco/document/ad44dd3f-f176-4b98-bf78-5ee6e77d0530",
492
+ "https://carrot.eco/whitepaper.pdf"
493
+ ],
494
+ "type": "string",
495
+ "format": "uri"
496
+ },
497
+ "uri": {
498
+ "title": "MassID IPFS URI",
499
+ "description": "IPFS URI of the MassID record",
500
+ "examples": [
501
+ "ipfs://QmTy8w65yBXgyfG2ZBg5TrfB2hPjrDQH3RCQFJGkARStJb/mass-id-organic.png",
502
+ "ipfs://QmYjtig7VJQ6XsnUjqqJvj7QaMcCAwtrgNdahSiFofrE7o"
503
+ ],
504
+ "type": "string",
505
+ "minLength": 1,
506
+ "pattern": "^ipfs:\\/\\/[a-zA-Z0-9]+(\\/.*)?$"
17
507
  }
508
+ },
509
+ "required": [
510
+ "external_id",
511
+ "token_id",
512
+ "external_url",
513
+ "uri"
514
+ ],
515
+ "additionalProperties": false
516
+ },
517
+ "waste_classification": {
518
+ "title": "Waste Classification",
519
+ "description": "Classification of the source waste (MassID)",
520
+ "type": "object",
521
+ "properties": {
522
+ "primary_type": {
523
+ "title": "Source Waste Primary Type",
524
+ "description": "Primary type of the source waste",
525
+ "examples": [
526
+ "Organic",
527
+ "Plastic",
528
+ "Metal"
529
+ ],
530
+ "type": "string",
531
+ "minLength": 1,
532
+ "maxLength": 100
533
+ },
534
+ "subtype": {
535
+ "title": "Source Waste Subtype",
536
+ "description": "Subtype of the source waste",
537
+ "examples": [
538
+ "Food, Food Waste and Beverages",
539
+ "PET Bottles",
540
+ "Aluminum Cans"
541
+ ],
542
+ "type": "string",
543
+ "minLength": 1,
544
+ "maxLength": 100
545
+ },
546
+ "net_weight_kg": {
547
+ "title": "Source Waste Net Weight",
548
+ "description": "Net weight of the source waste",
549
+ "examples": [
550
+ 3000,
551
+ 1500,
552
+ 500
553
+ ],
554
+ "type": "number",
555
+ "minimum": 0
556
+ }
557
+ },
558
+ "required": [
559
+ "primary_type",
560
+ "subtype",
561
+ "net_weight_kg"
562
+ ],
563
+ "additionalProperties": false
564
+ },
565
+ "origin_location": {
566
+ "title": "RecycledID Origin Location",
567
+ "description": "Source waste origin location details",
568
+ "type": "object",
569
+ "properties": {
570
+ "id_hash": {
571
+ "title": "Location ID Hash",
572
+ "description": "Anonymized identifier for the location",
573
+ "examples": [
574
+ "87f633634cc4b02f628685651f0a29b7bfa22a0bd841f725c6772dd00a58d489",
575
+ "6e83b8e6373847bbdc056549bedda38dc88854ce41ba4fca11e0fc6ce3e07ef6"
576
+ ],
577
+ "type": "string",
578
+ "pattern": "^[0-9a-fA-F]{64}$"
579
+ },
580
+ "municipality": {
581
+ "title": "Municipality",
582
+ "description": "Municipality or city name",
583
+ "examples": [
584
+ "Macapá",
585
+ "São Paulo",
586
+ "New York",
587
+ "Berlin",
588
+ "Tokyo"
589
+ ],
590
+ "type": "string",
591
+ "minLength": 1,
592
+ "maxLength": 50
593
+ },
594
+ "administrative_division": {
595
+ "title": "Administrative Division",
596
+ "description": "State, province, or administrative region name",
597
+ "examples": [
598
+ "Amapá",
599
+ "California",
600
+ "Bavaria"
601
+ ],
602
+ "type": "string",
603
+ "minLength": 1,
604
+ "maxLength": 50
605
+ },
606
+ "administrative_division_code": {
607
+ "title": "ISO Administrative Division Code",
608
+ "description": "Administrative division code following ISO 3166-2 standard",
609
+ "examples": [
610
+ "BR-AP",
611
+ "BR-ES",
612
+ "US-CA"
613
+ ],
614
+ "type": "string",
615
+ "pattern": "^[A-Z]{2}-[A-Z0-9]{1,3}$"
616
+ },
617
+ "country": {
618
+ "title": "Country",
619
+ "description": "Full country name in English",
620
+ "examples": [
621
+ "Brazil",
622
+ "United States",
623
+ "Germany",
624
+ "Japan"
625
+ ],
626
+ "type": "string",
627
+ "minLength": 1,
628
+ "maxLength": 50
629
+ },
630
+ "country_code": {
631
+ "title": "ISO Country Code",
632
+ "description": "Two-letter country code following ISO 3166-1 alpha-2 standard",
633
+ "examples": [
634
+ "BR",
635
+ "US",
636
+ "DE"
637
+ ],
638
+ "type": "string",
639
+ "pattern": "^[A-Z]{2}$"
640
+ },
641
+ "responsible_participant_id_hash": {
642
+ "title": "Responsible Participant ID Hash",
643
+ "description": "Anonymized ID of the participant responsible for this location",
644
+ "examples": [
645
+ "87f633634cc4b02f628685651f0a29b7bfa22a0bd841f725c6772dd00a58d489",
646
+ "6e83b8e6373847bbdc056549bedda38dc88854ce41ba4fca11e0fc6ce3e07ef6"
647
+ ],
648
+ "type": "string",
649
+ "pattern": "^[0-9a-fA-F]{64}$"
650
+ },
651
+ "coordinates": {
652
+ "title": "Coordinates",
653
+ "description": "GPS coordinates of the location",
654
+ "type": "object",
655
+ "properties": {
656
+ "latitude": {
657
+ "title": "Latitude",
658
+ "description": "Geographic latitude coordinate in decimal degrees with maximum 3 decimal places precision (~100m-1km accuracy for city-level, non-PII compliance)",
659
+ "examples": [
660
+ -0.02,
661
+ -20.38,
662
+ 40.713
663
+ ],
664
+ "type": "number",
665
+ "minimum": -90,
666
+ "maximum": 90,
667
+ "multipleOf": 0.001
668
+ },
669
+ "longitude": {
670
+ "title": "Longitude",
671
+ "description": "Geographic longitude coordinate in decimal degrees with maximum 3 decimal places precision (~100m-1km accuracy for city-level, non-PII compliance)",
672
+ "examples": [
673
+ -51.06,
674
+ -40.34,
675
+ -74.006
676
+ ],
677
+ "type": "number",
678
+ "minimum": -180,
679
+ "maximum": 180,
680
+ "multipleOf": 0.001
681
+ },
682
+ "precision_level": {
683
+ "title": "Coordinate Precision Level",
684
+ "description": "Level of coordinate precision",
685
+ "examples": [
686
+ "city",
687
+ "exact",
688
+ "neighborhood"
689
+ ],
690
+ "type": "string",
691
+ "enum": [
692
+ "exact",
693
+ "neighborhood",
694
+ "city",
695
+ "region",
696
+ "country"
697
+ ]
698
+ }
699
+ },
700
+ "required": [
701
+ "latitude",
702
+ "longitude",
703
+ "precision_level"
704
+ ],
705
+ "additionalProperties": false
706
+ },
707
+ "facility_type": {
708
+ "title": "Facility Type",
709
+ "description": "Type of facility in the waste management chain",
710
+ "examples": [
711
+ "Collection Point",
712
+ "Recycling Facility",
713
+ "Administrative Office"
714
+ ],
715
+ "type": "string",
716
+ "enum": [
717
+ "Collection Point",
718
+ "Recycling Facility",
719
+ "Administrative Office",
720
+ "Other"
721
+ ]
722
+ }
723
+ },
724
+ "required": [
725
+ "id_hash",
726
+ "municipality",
727
+ "administrative_division",
728
+ "country",
729
+ "country_code",
730
+ "responsible_participant_id_hash",
731
+ "coordinates"
732
+ ],
733
+ "additionalProperties": false
734
+ },
735
+ "accredited_participants": {
736
+ "title": "Accredited Participants",
737
+ "description": "List of participants with valid accreditations",
738
+ "minItems": 1,
739
+ "type": "array",
740
+ "items": {
741
+ "title": "Accredited Participant",
742
+ "description": "Participant with valid accreditation in the supply chain",
743
+ "type": "object",
744
+ "properties": {
745
+ "participant_id": {
746
+ "title": "Participant ID",
747
+ "description": "Unique identifier for the participant",
748
+ "examples": [
749
+ "ad44dd3f-f176-4b98-bf78-5ee6e77d0530",
750
+ "6f520d88-864d-432d-bf9f-5c3166c4818f",
751
+ "f77afa89-1c58-40fd-9bf5-8a86703a8af4"
752
+ ],
753
+ "type": "string",
754
+ "format": "uuid",
755
+ "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
+ },
757
+ "name": {
758
+ "title": "Participant Name",
759
+ "description": "Name of the participant",
760
+ "examples": [
761
+ "Enlatados Produção",
762
+ "Eco Reciclagem",
763
+ "Green Tech Corp"
764
+ ],
765
+ "type": "string",
766
+ "minLength": 1,
767
+ "maxLength": 100
768
+ },
769
+ "role": {
770
+ "title": "Participant Role",
771
+ "description": "Role of the participant in the supply chain",
772
+ "examples": [
773
+ "Waste Generator",
774
+ "Hauler",
775
+ "Recycler"
776
+ ],
777
+ "type": "string",
778
+ "minLength": 1,
779
+ "maxLength": 100
780
+ },
781
+ "accreditation_id": {
782
+ "title": "Accreditation ID",
783
+ "description": "Unique identifier for the participant accreditation",
784
+ "examples": [
785
+ "ad44dd3f-f176-4b98-bf78-5ee6e77d0530",
786
+ "6f520d88-864d-432d-bf9f-5c3166c4818f",
787
+ "f77afa89-1c58-40fd-9bf5-8a86703a8af4"
788
+ ],
789
+ "type": "string",
790
+ "format": "uuid",
791
+ "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})$"
792
+ },
793
+ "external_url": {
794
+ "title": "Participant Accreditation External URL",
795
+ "description": "URL to view the participant accreditation on Carrot Explorer",
796
+ "examples": [
797
+ "https://explore.carrot.eco/document/ad44dd3f-f176-4b98-bf78-5ee6e77d0530",
798
+ "https://carrot.eco/whitepaper.pdf"
799
+ ],
800
+ "type": "string",
801
+ "format": "uri"
802
+ }
803
+ },
804
+ "required": [
805
+ "participant_id",
806
+ "name",
807
+ "role",
808
+ "accreditation_id",
809
+ "external_url"
810
+ ],
811
+ "additionalProperties": false
18
812
  }
19
813
  },
20
- "attributes": {
21
- "$ref": "./recycled-id.attributes.schema.json"
814
+ "participant_rewards": {
815
+ "title": "Participant Rewards",
816
+ "description": "Rewards distribution to participants",
817
+ "type": "object",
818
+ "properties": {
819
+ "distribution_basis": {
820
+ "title": "Distribution Basis",
821
+ "description": "Basis for the rewards distribution",
822
+ "type": "string",
823
+ "minLength": 1,
824
+ "maxLength": 200
825
+ },
826
+ "reward_allocations": {
827
+ "title": "Reward Allocations",
828
+ "description": "Rewards percentage allocated to each participant",
829
+ "minItems": 1,
830
+ "type": "array",
831
+ "items": {
832
+ "title": "Reward Allocation",
833
+ "description": "Reward allocation for a specific participant",
834
+ "type": "object",
835
+ "properties": {
836
+ "participant_id": {
837
+ "title": "Participant ID",
838
+ "description": "Unique identifier for the participant receiving the reward",
839
+ "examples": [
840
+ "ad44dd3f-f176-4b98-bf78-5ee6e77d0530",
841
+ "6f520d88-864d-432d-bf9f-5c3166c4818f",
842
+ "f77afa89-1c58-40fd-9bf5-8a86703a8af4"
843
+ ],
844
+ "type": "string",
845
+ "format": "uuid",
846
+ "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})$"
847
+ },
848
+ "participant_name": {
849
+ "title": "Participant Name",
850
+ "description": "Name of the participant receiving the reward",
851
+ "examples": [
852
+ "Enlatados Produção",
853
+ "Eco Reciclagem",
854
+ "Green Tech Corp"
855
+ ],
856
+ "type": "string",
857
+ "minLength": 1,
858
+ "maxLength": 100
859
+ },
860
+ "role": {
861
+ "title": "Participant Role",
862
+ "description": "Role of the participant in the supply chain",
863
+ "examples": [
864
+ "Waste Generator",
865
+ "Hauler",
866
+ "Recycler"
867
+ ],
868
+ "type": "string",
869
+ "minLength": 1,
870
+ "maxLength": 100
871
+ },
872
+ "reward_percentage": {
873
+ "title": "Reward Percentage",
874
+ "description": "Reward percentage allocated to the participant",
875
+ "examples": [
876
+ 50,
877
+ 75.5,
878
+ 100
879
+ ],
880
+ "type": "number",
881
+ "minimum": 0,
882
+ "maximum": 100
883
+ },
884
+ "large_business_discount_applied": {
885
+ "title": "Large Business Discount Applied",
886
+ "description": "Whether the large business discount was applied",
887
+ "type": "boolean"
888
+ },
889
+ "effective_percentage": {
890
+ "title": "Effective Percentage",
891
+ "description": "Effective percentage of the reward after discounts",
892
+ "examples": [
893
+ 50,
894
+ 75.5,
895
+ 100
896
+ ],
897
+ "type": "number",
898
+ "minimum": 0,
899
+ "maximum": 100
900
+ }
901
+ },
902
+ "required": [
903
+ "participant_id",
904
+ "participant_name",
905
+ "role",
906
+ "reward_percentage",
907
+ "effective_percentage"
908
+ ],
909
+ "additionalProperties": false
910
+ }
911
+ },
912
+ "distribution_notes": {
913
+ "title": "Distribution Notes",
914
+ "description": "Additional notes about the reward distribution",
915
+ "type": "object",
916
+ "properties": {
917
+ "large_business_discount_applied": {
918
+ "title": "Large Business Discount Applied",
919
+ "description": "Description of the large business discount applied",
920
+ "examples": [
921
+ "50% reduction applied to participants with >$4M annual revenue"
922
+ ],
923
+ "type": "string",
924
+ "minLength": 1
925
+ },
926
+ "redirected_rewards": {
927
+ "title": "Redirected Rewards",
928
+ "description": "Description of the redirected rewards",
929
+ "examples": [
930
+ "Discounted rewards from large businesses redirected to accredited NGOs"
931
+ ],
932
+ "type": "string",
933
+ "minLength": 1
934
+ }
935
+ },
936
+ "additionalProperties": false
937
+ }
938
+ },
939
+ "required": [
940
+ "distribution_basis",
941
+ "reward_allocations"
942
+ ],
943
+ "additionalProperties": false
944
+ }
945
+ },
946
+ "required": [
947
+ "summary",
948
+ "methodology",
949
+ "audit",
950
+ "mass_id",
951
+ "waste_classification",
952
+ "origin_location",
953
+ "accredited_participants"
954
+ ],
955
+ "additionalProperties": false
956
+ },
957
+ "blockchain": {
958
+ "title": "Blockchain Information",
959
+ "description": "Blockchain-specific information for the NFT",
960
+ "type": "object",
961
+ "properties": {
962
+ "smart_contract_address": {
963
+ "title": "Smart Contract Address",
964
+ "description": "A valid Ethereum address in hexadecimal format",
965
+ "examples": [
966
+ "0x1234567890abcdef1234567890abcdef12345678",
967
+ "0xabcdef1234567890abcdef1234567890abcdef12"
968
+ ],
969
+ "type": "string",
970
+ "pattern": "^0x[a-fA-F0-9]{40}$"
971
+ },
972
+ "chain_id": {
973
+ "title": "Chain ID",
974
+ "description": "Blockchain chain ID",
975
+ "examples": [
976
+ 1,
977
+ 137,
978
+ 11155111
979
+ ],
980
+ "type": "integer",
981
+ "minimum": 1,
982
+ "maximum": 9007199254740991
983
+ },
984
+ "network_name": {
985
+ "title": "Network Name",
986
+ "description": "Name of the blockchain network",
987
+ "type": "string",
988
+ "minLength": 5,
989
+ "maxLength": 100
22
990
  },
23
- "data": {
24
- "$ref": "./recycled-id.data.schema.json"
991
+ "token_id": {
992
+ "title": "Token ID",
993
+ "description": "NFT token ID",
994
+ "examples": [
995
+ "123",
996
+ "456789",
997
+ "1000000"
998
+ ],
999
+ "type": "string",
1000
+ "minLength": 1,
1001
+ "pattern": "^\\d+$"
25
1002
  }
1003
+ },
1004
+ "required": [
1005
+ "smart_contract_address",
1006
+ "chain_id",
1007
+ "network_name",
1008
+ "token_id"
1009
+ ],
1010
+ "additionalProperties": false
1011
+ },
1012
+ "name": {
1013
+ "title": "NFT Name",
1014
+ "description": "Full display name for this NFT, including extra context",
1015
+ "examples": [
1016
+ "MassID #123 • Organic • 3.0t",
1017
+ "RecycledID #456 • Plastic • 2.5t",
1018
+ "GasID #789 • Methane • 1000 m³"
1019
+ ],
1020
+ "type": "string",
1021
+ "minLength": 1,
1022
+ "maxLength": 100
1023
+ },
1024
+ "short_name": {
1025
+ "title": "Short Name",
1026
+ "description": "Compact name for UI summaries, tables, or tooltips",
1027
+ "examples": [
1028
+ "MassID #123",
1029
+ "RecycledID #456",
1030
+ "GasID #789"
1031
+ ],
1032
+ "type": "string",
1033
+ "minLength": 1,
1034
+ "maxLength": 50
1035
+ },
1036
+ "description": {
1037
+ "title": "Description",
1038
+ "description": "Human-readable summary of the NFT's role and context. Ideally, maximum 300 characters.",
1039
+ "examples": [
1040
+ "This MassID represents 3 metric tons of organic food waste from Enlatados Produção, tracked through complete chain of custody from generation to composting.",
1041
+ "This RecycledID represents 2.5 metric tons of recycled plastic bottles processed by Green Solutions Ltd."
1042
+ ],
1043
+ "type": "string",
1044
+ "minLength": 10,
1045
+ "maxLength": 500
1046
+ },
1047
+ "image": {
1048
+ "title": "Image URI",
1049
+ "description": "IPFS URI pointing to the preview image",
1050
+ "examples": [
1051
+ "ipfs://QmTy8w65yBXgyfG2ZBg5TrfB2hPjrDQH3RCQFJGkARStJb/mass-id-organic.png",
1052
+ "ipfs://QmYjtig7VJQ6XsnUjqqJvj7QaMcCAwtrgNdahSiFofrE7o"
1053
+ ],
1054
+ "type": "string",
1055
+ "minLength": 1,
1056
+ "pattern": "^ipfs:\\/\\/[a-zA-Z0-9]+(\\/.*)?$"
1057
+ },
1058
+ "background_color": {
1059
+ "title": "Background Color",
1060
+ "description": "Hex color code for marketplace background display",
1061
+ "examples": [
1062
+ "#2D5A27",
1063
+ "#FF5733",
1064
+ "#1E90FF"
1065
+ ],
1066
+ "type": "string",
1067
+ "minLength": 1,
1068
+ "pattern": "^#[0-9A-F]{6}$"
1069
+ },
1070
+ "animation_url": {
1071
+ "title": "Animation URL",
1072
+ "description": "IPFS URI pointing to an animated or interactive media file",
1073
+ "examples": [
1074
+ "ipfs://QmAnimation123/mass-id-animation.mp4",
1075
+ "ipfs://QmInteractive456/recycled-visualization.webm"
1076
+ ],
1077
+ "type": "string",
1078
+ "minLength": 1,
1079
+ "pattern": "^ipfs:\\/\\/[a-zA-Z0-9]+(\\/.*)?$"
1080
+ },
1081
+ "external_links": {
1082
+ "title": "External Links",
1083
+ "description": "Optional list of public resource links with labels",
1084
+ "examples": [
1085
+ [
1086
+ {
1087
+ "label": "Carrot Explorer",
1088
+ "url": "https://explore.carrot.eco/document/ad44dd3f-f176-4b98-bf78-5ee6e77d0530",
1089
+ "description": "Complete chain of custody and audit trail"
1090
+ },
1091
+ {
1092
+ "label": "Carrot White Paper",
1093
+ "url": "https://carrot.eco/whitepaper.pdf",
1094
+ "description": "Carrot Foundation technical and impact white paper"
1095
+ }
1096
+ ]
1097
+ ],
1098
+ "maxItems": 10,
1099
+ "type": "array",
1100
+ "items": {
1101
+ "title": "External Link",
1102
+ "description": "External link with label and description",
1103
+ "type": "object",
1104
+ "properties": {
1105
+ "label": {
1106
+ "title": "Link Label",
1107
+ "description": "Display name for the external link",
1108
+ "type": "string",
1109
+ "minLength": 1,
1110
+ "maxLength": 50
1111
+ },
1112
+ "url": {
1113
+ "title": "Link URL",
1114
+ "description": "Direct URI to the linked resource",
1115
+ "type": "string",
1116
+ "format": "uri"
1117
+ },
1118
+ "description": {
1119
+ "title": "Link Description",
1120
+ "description": "Optional context about what the link provides",
1121
+ "type": "string",
1122
+ "minLength": 10,
1123
+ "maxLength": 100
1124
+ }
1125
+ },
1126
+ "required": [
1127
+ "label",
1128
+ "url"
1129
+ ],
1130
+ "additionalProperties": false
26
1131
  }
1132
+ },
1133
+ "attributes": {
1134
+ "title": "RecycledID NFT Attribute Array",
1135
+ "description": "Schema for the fixed set of RecycledID NFT attributes, enforcing order and type for each trait",
1136
+ "type": "array",
1137
+ "prefixItems": [
1138
+ {
1139
+ "title": "Methodology Attribute",
1140
+ "description": "Methodology used for certification",
1141
+ "type": "object",
1142
+ "properties": {
1143
+ "trait_type": {
1144
+ "type": "string",
1145
+ "const": "Methodology"
1146
+ },
1147
+ "value": {
1148
+ "title": "Methodology Name",
1149
+ "description": "Name of the methodology used for certification",
1150
+ "examples": [
1151
+ "BOLD Recycling",
1152
+ "BOLD Carbon (CH₄)"
1153
+ ],
1154
+ "type": "string",
1155
+ "minLength": 1,
1156
+ "maxLength": 100
1157
+ },
1158
+ "display_type": {
1159
+ "title": "Display Type",
1160
+ "description": "How the trait should be displayed in marketplace UIs",
1161
+ "type": "string",
1162
+ "enum": [
1163
+ "number",
1164
+ "date",
1165
+ "boost_number",
1166
+ "boost_percentage"
1167
+ ]
1168
+ },
1169
+ "max_value": {
1170
+ "title": "Max Value",
1171
+ "description": "Maximum possible value for numeric traits",
1172
+ "examples": [
1173
+ 0,
1174
+ 45.2,
1175
+ 72.5
1176
+ ],
1177
+ "type": "number",
1178
+ "minimum": 0
1179
+ }
1180
+ },
1181
+ "required": [
1182
+ "trait_type",
1183
+ "value"
1184
+ ],
1185
+ "additionalProperties": false
1186
+ },
1187
+ {
1188
+ "title": "Recycled Mass Weight Attribute",
1189
+ "description": "Recycled mass weight attribute with numeric display",
1190
+ "type": "object",
1191
+ "properties": {
1192
+ "trait_type": {
1193
+ "type": "string",
1194
+ "const": "Recycled Mass Weight (kg)"
1195
+ },
1196
+ "value": {
1197
+ "title": "Recycled Mass Weight",
1198
+ "description": "Total weight of recycled materials in kilograms",
1199
+ "examples": [
1200
+ 3000,
1201
+ 1500,
1202
+ 500
1203
+ ],
1204
+ "type": "number",
1205
+ "minimum": 0
1206
+ },
1207
+ "display_type": {
1208
+ "type": "string",
1209
+ "const": "number"
1210
+ },
1211
+ "max_value": {
1212
+ "title": "Max Value",
1213
+ "description": "Maximum possible value for numeric traits",
1214
+ "examples": [
1215
+ 0,
1216
+ 45.2,
1217
+ 72.5
1218
+ ],
1219
+ "type": "number",
1220
+ "minimum": 0
1221
+ }
1222
+ },
1223
+ "required": [
1224
+ "trait_type",
1225
+ "value",
1226
+ "display_type"
1227
+ ],
1228
+ "additionalProperties": false
1229
+ },
1230
+ {
1231
+ "title": "Credit Amount Attribute",
1232
+ "description": "Credit amount attribute with numeric display",
1233
+ "type": "object",
1234
+ "properties": {
1235
+ "trait_type": {
1236
+ "type": "string",
1237
+ "const": "Credit Amount"
1238
+ },
1239
+ "value": {
1240
+ "title": "Credit Amount",
1241
+ "description": "Amount of credits issued",
1242
+ "examples": [
1243
+ 0,
1244
+ 45.2,
1245
+ 72.5
1246
+ ],
1247
+ "type": "number",
1248
+ "minimum": 0
1249
+ },
1250
+ "display_type": {
1251
+ "type": "string",
1252
+ "const": "number"
1253
+ },
1254
+ "max_value": {
1255
+ "title": "Max Value",
1256
+ "description": "Maximum possible value for numeric traits",
1257
+ "examples": [
1258
+ 0,
1259
+ 45.2,
1260
+ 72.5
1261
+ ],
1262
+ "type": "number",
1263
+ "minimum": 0
1264
+ }
1265
+ },
1266
+ "required": [
1267
+ "trait_type",
1268
+ "value",
1269
+ "display_type"
1270
+ ],
1271
+ "additionalProperties": false
1272
+ },
1273
+ {
1274
+ "title": "Credit Type Attribute",
1275
+ "description": "Credit type attribute",
1276
+ "type": "object",
1277
+ "properties": {
1278
+ "trait_type": {
1279
+ "type": "string",
1280
+ "const": "Credit Type"
1281
+ },
1282
+ "value": {
1283
+ "title": "Credit Type",
1284
+ "description": "Type of credit issued",
1285
+ "examples": [
1286
+ "Organic",
1287
+ "Carbon (CH₄)"
1288
+ ],
1289
+ "type": "string",
1290
+ "minLength": 1,
1291
+ "maxLength": 100
1292
+ },
1293
+ "display_type": {
1294
+ "title": "Display Type",
1295
+ "description": "How the trait should be displayed in marketplace UIs",
1296
+ "type": "string",
1297
+ "enum": [
1298
+ "number",
1299
+ "date",
1300
+ "boost_number",
1301
+ "boost_percentage"
1302
+ ]
1303
+ },
1304
+ "max_value": {
1305
+ "title": "Max Value",
1306
+ "description": "Maximum possible value for numeric traits",
1307
+ "examples": [
1308
+ 0,
1309
+ 45.2,
1310
+ 72.5
1311
+ ],
1312
+ "type": "number",
1313
+ "minimum": 0
1314
+ }
1315
+ },
1316
+ "required": [
1317
+ "trait_type",
1318
+ "value"
1319
+ ],
1320
+ "additionalProperties": false
1321
+ },
1322
+ {
1323
+ "title": "Source Waste Type Attribute",
1324
+ "description": "Source waste type attribute",
1325
+ "type": "object",
1326
+ "properties": {
1327
+ "trait_type": {
1328
+ "type": "string",
1329
+ "const": "Source Waste Type"
1330
+ },
1331
+ "value": {
1332
+ "title": "Waste Type",
1333
+ "description": "Category or type of waste material",
1334
+ "examples": [
1335
+ "Organic",
1336
+ "Plastic",
1337
+ "Metal"
1338
+ ],
1339
+ "type": "string",
1340
+ "minLength": 1,
1341
+ "maxLength": 100
1342
+ },
1343
+ "display_type": {
1344
+ "title": "Display Type",
1345
+ "description": "How the trait should be displayed in marketplace UIs",
1346
+ "type": "string",
1347
+ "enum": [
1348
+ "number",
1349
+ "date",
1350
+ "boost_number",
1351
+ "boost_percentage"
1352
+ ]
1353
+ },
1354
+ "max_value": {
1355
+ "title": "Max Value",
1356
+ "description": "Maximum possible value for numeric traits",
1357
+ "examples": [
1358
+ 0,
1359
+ 45.2,
1360
+ 72.5
1361
+ ],
1362
+ "type": "number",
1363
+ "minimum": 0
1364
+ }
1365
+ },
1366
+ "required": [
1367
+ "trait_type",
1368
+ "value"
1369
+ ],
1370
+ "additionalProperties": false
1371
+ },
1372
+ {
1373
+ "title": "Source Weight Attribute",
1374
+ "description": "Source weight attribute with numeric display",
1375
+ "type": "object",
1376
+ "properties": {
1377
+ "trait_type": {
1378
+ "type": "string",
1379
+ "const": "Source Weight (kg)"
1380
+ },
1381
+ "value": {
1382
+ "title": "Source Weight",
1383
+ "description": "Weight of the source waste in kilograms",
1384
+ "examples": [
1385
+ 3000,
1386
+ 1500,
1387
+ 500
1388
+ ],
1389
+ "type": "number",
1390
+ "minimum": 0
1391
+ },
1392
+ "display_type": {
1393
+ "type": "string",
1394
+ "const": "number"
1395
+ },
1396
+ "max_value": {
1397
+ "title": "Max Value",
1398
+ "description": "Maximum possible value for numeric traits",
1399
+ "examples": [
1400
+ 0,
1401
+ 45.2,
1402
+ 72.5
1403
+ ],
1404
+ "type": "number",
1405
+ "minimum": 0
1406
+ }
1407
+ },
1408
+ "required": [
1409
+ "trait_type",
1410
+ "value",
1411
+ "display_type"
1412
+ ],
1413
+ "additionalProperties": false
1414
+ },
1415
+ {
1416
+ "title": "Origin Country Attribute",
1417
+ "description": "Origin country attribute",
1418
+ "type": "object",
1419
+ "properties": {
1420
+ "trait_type": {
1421
+ "type": "string",
1422
+ "const": "Origin Country"
1423
+ },
1424
+ "value": {
1425
+ "title": "Country",
1426
+ "description": "Full country name in English",
1427
+ "examples": [
1428
+ "Brazil",
1429
+ "United States",
1430
+ "Germany",
1431
+ "Japan"
1432
+ ],
1433
+ "type": "string",
1434
+ "minLength": 1,
1435
+ "maxLength": 50
1436
+ },
1437
+ "display_type": {
1438
+ "title": "Display Type",
1439
+ "description": "How the trait should be displayed in marketplace UIs",
1440
+ "type": "string",
1441
+ "enum": [
1442
+ "number",
1443
+ "date",
1444
+ "boost_number",
1445
+ "boost_percentage"
1446
+ ]
1447
+ },
1448
+ "max_value": {
1449
+ "title": "Max Value",
1450
+ "description": "Maximum possible value for numeric traits",
1451
+ "examples": [
1452
+ 0,
1453
+ 45.2,
1454
+ 72.5
1455
+ ],
1456
+ "type": "number",
1457
+ "minimum": 0
1458
+ }
1459
+ },
1460
+ "required": [
1461
+ "trait_type",
1462
+ "value"
1463
+ ],
1464
+ "additionalProperties": false
1465
+ },
1466
+ {
1467
+ "title": "Origin Municipality Attribute",
1468
+ "description": "Origin municipality attribute",
1469
+ "type": "object",
1470
+ "properties": {
1471
+ "trait_type": {
1472
+ "type": "string",
1473
+ "const": "Origin Municipality"
1474
+ },
1475
+ "value": {
1476
+ "title": "Municipality",
1477
+ "description": "Municipality or city name",
1478
+ "examples": [
1479
+ "Macapá",
1480
+ "São Paulo",
1481
+ "New York",
1482
+ "Berlin",
1483
+ "Tokyo"
1484
+ ],
1485
+ "type": "string",
1486
+ "minLength": 1,
1487
+ "maxLength": 50
1488
+ },
1489
+ "display_type": {
1490
+ "title": "Display Type",
1491
+ "description": "How the trait should be displayed in marketplace UIs",
1492
+ "type": "string",
1493
+ "enum": [
1494
+ "number",
1495
+ "date",
1496
+ "boost_number",
1497
+ "boost_percentage"
1498
+ ]
1499
+ },
1500
+ "max_value": {
1501
+ "title": "Max Value",
1502
+ "description": "Maximum possible value for numeric traits",
1503
+ "examples": [
1504
+ 0,
1505
+ 45.2,
1506
+ 72.5
1507
+ ],
1508
+ "type": "number",
1509
+ "minimum": 0
1510
+ }
1511
+ },
1512
+ "required": [
1513
+ "trait_type",
1514
+ "value"
1515
+ ],
1516
+ "additionalProperties": false
1517
+ },
1518
+ {
1519
+ "title": "Recycler Attribute",
1520
+ "description": "Recycler attribute",
1521
+ "type": "object",
1522
+ "properties": {
1523
+ "trait_type": {
1524
+ "type": "string",
1525
+ "const": "Recycler"
1526
+ },
1527
+ "value": {
1528
+ "title": "Recycler",
1529
+ "description": "Organization that processed the waste",
1530
+ "example": "Eco Reciclagem",
1531
+ "type": "string",
1532
+ "minLength": 1,
1533
+ "maxLength": 100
1534
+ },
1535
+ "display_type": {
1536
+ "title": "Display Type",
1537
+ "description": "How the trait should be displayed in marketplace UIs",
1538
+ "type": "string",
1539
+ "enum": [
1540
+ "number",
1541
+ "date",
1542
+ "boost_number",
1543
+ "boost_percentage"
1544
+ ]
1545
+ },
1546
+ "max_value": {
1547
+ "title": "Max Value",
1548
+ "description": "Maximum possible value for numeric traits",
1549
+ "examples": [
1550
+ 0,
1551
+ 45.2,
1552
+ 72.5
1553
+ ],
1554
+ "type": "number",
1555
+ "minimum": 0
1556
+ }
1557
+ },
1558
+ "required": [
1559
+ "trait_type",
1560
+ "value"
1561
+ ],
1562
+ "additionalProperties": false
1563
+ },
1564
+ {
1565
+ "title": "MassID Token ID Attribute",
1566
+ "description": "MassID token ID attribute",
1567
+ "type": "object",
1568
+ "properties": {
1569
+ "trait_type": {
1570
+ "type": "string",
1571
+ "const": "MassID"
1572
+ },
1573
+ "value": {
1574
+ "title": "MassID Token ID",
1575
+ "description": "Token ID of the source MassID NFT as #<token_id>",
1576
+ "example": "#123",
1577
+ "type": "string",
1578
+ "minLength": 1,
1579
+ "pattern": "^#\\d+$"
1580
+ },
1581
+ "display_type": {
1582
+ "title": "Display Type",
1583
+ "description": "How the trait should be displayed in marketplace UIs",
1584
+ "type": "string",
1585
+ "enum": [
1586
+ "number",
1587
+ "date",
1588
+ "boost_number",
1589
+ "boost_percentage"
1590
+ ]
1591
+ },
1592
+ "max_value": {
1593
+ "title": "Max Value",
1594
+ "description": "Maximum possible value for numeric traits",
1595
+ "examples": [
1596
+ 0,
1597
+ 45.2,
1598
+ 72.5
1599
+ ],
1600
+ "type": "number",
1601
+ "minimum": 0
1602
+ }
1603
+ },
1604
+ "required": [
1605
+ "trait_type",
1606
+ "value"
1607
+ ],
1608
+ "additionalProperties": false
1609
+ },
1610
+ {
1611
+ "title": "MassID Recycling Date Attribute",
1612
+ "description": "MassID recycling date attribute using Unix timestamp in milliseconds",
1613
+ "type": "object",
1614
+ "properties": {
1615
+ "trait_type": {
1616
+ "type": "string",
1617
+ "const": "MassID Recycling Date"
1618
+ },
1619
+ "value": {
1620
+ "title": "MassID Recycling Date",
1621
+ "description": "Unix timestamp in milliseconds when the source waste was recycled",
1622
+ "examples": [
1623
+ 1704067200000,
1624
+ 1735689600000,
1625
+ 1762371245149
1626
+ ],
1627
+ "type": "integer",
1628
+ "exclusiveMinimum": 0,
1629
+ "maximum": 9007199254740991
1630
+ },
1631
+ "display_type": {
1632
+ "type": "string",
1633
+ "const": "date"
1634
+ }
1635
+ },
1636
+ "required": [
1637
+ "trait_type",
1638
+ "value",
1639
+ "display_type"
1640
+ ],
1641
+ "additionalProperties": false
1642
+ }
1643
+ ],
1644
+ "items": false
27
1645
  }
28
- ]
29
- }
1646
+ },
1647
+ "required": [
1648
+ "$schema",
1649
+ "schema",
1650
+ "created_at",
1651
+ "external_id",
1652
+ "external_url",
1653
+ "original_content_hash",
1654
+ "content_hash",
1655
+ "data",
1656
+ "blockchain",
1657
+ "name",
1658
+ "short_name",
1659
+ "description",
1660
+ "image",
1661
+ "attributes"
1662
+ ],
1663
+ "additionalProperties": false
1664
+ }