/
schema.ts
135 lines (126 loc) · 2.92 KB
/
schema.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
import { JSONSchemaType } from 'ajv'
export interface Attribute {
trait_type: string
value: string | number
display_type?: string
max_value?: number
trait_count?: number
}
export interface FileDescription {
uri: string
type: string
cdn?: boolean
}
export interface CreatorInfo {
address: string
share: number
}
/**
* See https://docs.metaplex.com/nft-standard#collections
*/
export interface CollectionInfo {
name: string
family: string
}
/**
* Interface for valid Metaplex NFT metadata, as defined at https://docs.metaplex.com/nft-standard.
*/
export interface MetaplexMetadata {
name: string
symbol?: string
description?: string
seller_fee_basis_points?: number
image: string
animation_url?: string
external_url?: string
attributes?: Attribute[]
collection?: CollectionInfo
properties: {
category?: string
files: Array<FileDescription>
creators?: CreatorInfo[]
}
}
const fileSchema: JSONSchemaType<FileDescription> = {
type: 'object',
properties: {
uri: { type: 'string' },
type: { type: 'string' },
cdn: { type: 'boolean', nullable: true },
},
required: ['uri', 'type'],
}
const attributeSchema: JSONSchemaType<Attribute> = {
type: 'object',
properties: {
trait_type: { type: 'string' },
value: {
anyOf: [{ type: 'string' }, { type: 'number' }],
},
display_type: {
type: 'string',
nullable: true,
},
max_value: {
type: 'number',
nullable: true,
},
trait_count: {
type: 'number',
nullable: true,
},
},
required: ['trait_type', 'value'],
}
const creatorSchema: JSONSchemaType<CreatorInfo> = {
type: 'object',
properties: {
address: { type: 'string' },
share: { type: 'number' },
},
required: ['address', 'share'],
}
export const metadataSchema: JSONSchemaType<MetaplexMetadata> = {
type: 'object',
properties: {
name: { type: 'string' },
symbol: { type: 'string', nullable: true },
description: { type: 'string', nullable: true },
seller_fee_basis_points: { type: 'number', nullable: true },
image: { type: 'string' },
animation_url: { type: 'string', nullable: true },
external_url: { type: 'string', nullable: true },
attributes: {
type: 'array',
nullable: true,
items: attributeSchema,
},
properties: {
type: 'object',
properties: {
files: {
type: 'array',
items: fileSchema,
},
category: { type: 'string', nullable: true },
creators: {
type: 'array',
items: creatorSchema,
nullable: true,
},
},
additionalProperties: true,
required: ['files'],
},
collection: {
type: 'object',
nullable: true,
properties: {
name: { type: 'string' },
family: { type: 'string' },
},
required: ['name', 'family'],
},
},
required: ['name', 'image', 'properties'],
}