Smart Contract
Provineer
A.6b7453f9da8f4af1.Provineer
1import NonFungibleToken from 0x1d7e57aa55817448
2import MetadataViews from 0x1d7e57aa55817448
3
4pub contract Provineer: NonFungibleToken {
5
6 pub var totalSupply: UInt64
7
8 pub let CollectionStoragePath: StoragePath
9 pub let CollectionPublicPath: PublicPath
10 pub let ProvineerAdminStoragePath: StoragePath
11 pub event ContractInitialized()
12 pub event Withdraw(id: UInt64, from: Address?)
13 pub event Deposit(id: UInt64, to: Address?)
14 pub event ProvineerCreated(id: UInt64, fileName: String, fileVersion: String, description: String, signature: String)
15
16 pub resource NFT: NonFungibleToken.INFT, MetadataViews.Resolver {
17 pub let id: UInt64
18 pub let fileName: String
19 pub let thumbnail: String
20 pub let fileVersion: String
21 pub let category: String
22 pub let description: String
23 pub let proof1: String
24 pub let proof2: String
25 pub let proof3: String
26 pub let signature: String
27
28 pub fun getViews(): [Type] {
29 return [
30 Type<MetadataViews.Display>(),
31 Type<MetadataViews.NFTCollectionData>(),
32 Type<MetadataViews.NFTCollectionDisplay>(),
33 Type<MetadataViews.ExternalURL>(),
34 Type<MetadataViews.Traits>()
35 ]
36 }
37
38 pub fun resolveView(_ view: Type): AnyStruct? {
39 switch view {
40 case Type<MetadataViews.Display>():
41 return MetadataViews.Display(
42 name: self.fileName,
43 description: self.description,
44 thumbnail: MetadataViews.HTTPFile(
45 url: self.thumbnail
46 )
47 )
48 case Type<MetadataViews.ExternalURL>():
49 return MetadataViews.ExternalURL("https://www.provineer.com/")
50 case Type<MetadataViews.NFTCollectionDisplay>():
51 let mediaSquare = MetadataViews.Media(
52 file: MetadataViews.HTTPFile(
53 url: "https://global-uploads.webflow.com/60f008ba9757da0940af288e/62e77af588325131a9aa8e61_4BFJowii_400x400.jpeg"
54 ),
55 mediaType: "image/svg+xml"
56 )
57 let mediaBanner = MetadataViews.Media(
58 file: MetadataViews.HTTPFile(
59 url: "https://www.provineer.com/static/logo-full-dark@2x-0e8797bb751b2fcb15c6c1227ca7b3b6.png"
60 ),
61 mediaType: "image/svg+xml"
62 )
63 return MetadataViews.NFTCollectionDisplay(
64 name: "Provineer",
65 description: "Authenticate anything, anytime, anywhere.",
66 externalURL: MetadataViews.ExternalURL("https://www.provineer.com/"),
67 squareImage: mediaSquare,
68 bannerImage: mediaBanner,
69 socials: {
70 "twitter": MetadataViews.ExternalURL("https://twitter.com/provineer")
71 }
72 )
73 case Type<MetadataViews.NFTCollectionData>():
74 return MetadataViews.NFTCollectionData(
75 storagePath: Provineer.CollectionStoragePath,
76 publicPath: Provineer.CollectionPublicPath,
77 providerPath: /private/ProvineerCollection,
78 publicCollection: Type<&Provineer.Collection{Provineer.ProvineerCollectionPublic}>(),
79 publicLinkedType: Type<&Provineer.Collection{Provineer.ProvineerCollectionPublic, NonFungibleToken.CollectionPublic, NonFungibleToken.Receiver, MetadataViews.ResolverCollection}>(),
80 providerLinkedType: Type<&Provineer.Collection{Provineer.ProvineerCollectionPublic, NonFungibleToken.CollectionPublic, NonFungibleToken.Provider, NonFungibleToken.Receiver, MetadataViews.ResolverCollection}>(),
81 createEmptyCollectionFunction: (fun (): @NonFungibleToken.Collection { return <-Provineer.createEmptyCollection() })
82 )
83 case Type<MetadataViews.Traits>():
84 let traits: [MetadataViews.Trait] = []
85 traits.append(MetadataViews.Trait(
86 trait: "File Version",
87 value: self.fileVersion,
88 displayType: nil,
89 rarity: nil
90 ))
91 return MetadataViews.Traits(traits: traits)
92 }
93
94 return nil
95 }
96
97 init(
98 fileName: String,
99 thumbnail: String,
100 fileVersion: String,
101 category: String,
102 description: String,
103 proof1: String,
104 proof2: String,
105 proof3: String,
106 signature: String,
107
108 ) {
109 self.id = self.uuid
110 self.fileName = fileName
111 self.thumbnail = thumbnail
112 self.fileVersion = fileVersion
113 self.category = category
114 self.description = description
115 self.proof1 = proof1
116 self.proof2 = proof2
117 self.proof3 = proof3
118 self.signature = signature
119 }
120 }
121
122 pub resource interface ProvineerCollectionPublic {
123 pub fun deposit(token: @NonFungibleToken.NFT)
124 pub fun getIDs(): [UInt64]
125 pub fun borrowNFT(id: UInt64): &NonFungibleToken.NFT
126 pub fun borrowProvineer(id: UInt64): &Provineer.NFT? {
127 post {
128 (result == nil) || (result?.id == id):
129 "Cannot borrow Provineer reference: The ID of the returned reference is incorrect"
130 }
131 }
132 }
133
134 pub resource Collection: ProvineerCollectionPublic, NonFungibleToken.Provider, NonFungibleToken.Receiver, NonFungibleToken.CollectionPublic, MetadataViews.ResolverCollection {
135
136 pub var ownedNFTs: @{UInt64: NonFungibleToken.NFT}
137
138 init () {
139 self.ownedNFTs <- {}
140 }
141
142 pub fun withdraw(withdrawID: UInt64): @NonFungibleToken.NFT {
143 let token <- self.ownedNFTs.remove(key: withdrawID) ?? panic("missing NFT")
144
145 emit Withdraw(id: token.id, from: self.owner?.address)
146
147 return <-token
148 }
149
150 pub fun deposit(token: @NonFungibleToken.NFT) {
151 let token <- token as! @Provineer.NFT
152
153 let id: UInt64 = token.id
154
155 let oldToken <- self.ownedNFTs[id] <- token
156
157 emit Deposit(id: id, to: self.owner?.address)
158
159 destroy oldToken
160 }
161
162 pub fun getIDs(): [UInt64] {
163 return self.ownedNFTs.keys
164 }
165
166 pub fun borrowNFT(id: UInt64): &NonFungibleToken.NFT {
167 return (&self.ownedNFTs[id] as &NonFungibleToken.NFT?)!
168 }
169
170 pub fun borrowProvineer(id: UInt64): &Provineer.NFT? {
171 if self.ownedNFTs[id] != nil {
172 let ref = (&self.ownedNFTs[id] as auth &NonFungibleToken.NFT?)!
173 return ref as! &Provineer.NFT
174 }
175
176 return nil
177 }
178 pub fun borrowViewResolver(id: UInt64): &AnyResource{MetadataViews.Resolver} {
179 let nft = (&self.ownedNFTs[id] as auth &NonFungibleToken.NFT?)!
180 let provineer = nft as! &Provineer.NFT
181 return provineer as &AnyResource{MetadataViews.Resolver}
182 }
183
184 destroy() {
185 destroy self.ownedNFTs
186 }
187 }
188
189 pub fun createEmptyCollection(): @NonFungibleToken.Collection {
190 return <- create Collection()
191 }
192
193 pub resource ProvineerAdmin {
194
195 pub fun mintNFT(
196 recipient: &{NonFungibleToken.CollectionPublic},
197 fileName: String,
198 thumbnail: String,
199 fileVersion: String,
200 category: String,
201 description: String,
202 proof1: String,
203 proof2: String,
204 proof3: String,
205 signature: String,
206 )
207 {
208
209 recipient.deposit(token: <-create Provineer.NFT(
210 fileName: fileName,
211 thumbnail: thumbnail,
212 fileVersion:fileVersion,
213 category: category,
214 description:description,
215 proof1: proof1,
216 proof2: proof2,
217 proof3: proof3,
218 signature:signature))
219
220
221 emit ProvineerCreated(
222 id: self.uuid,
223 fileName: fileName,
224 fileVersion: fileVersion,
225 description: description,
226 signature: signature,
227 )
228
229 Provineer.totalSupply = Provineer.totalSupply + (1 as UInt64)
230 }
231 }
232
233 init() {
234 self.totalSupply = 0
235
236 self.CollectionStoragePath = /storage/provineerCollection
237 self.CollectionPublicPath = /public/provineerCollection
238 self.ProvineerAdminStoragePath = /storage/provineerAdmin
239
240 let collection <- create Collection()
241 self.account.save(<-collection, to: self.CollectionStoragePath)
242
243 self.account.link<&Provineer.Collection{NonFungibleToken.Receiver, NonFungibleToken.CollectionPublic, MetadataViews.ResolverCollection}>
244 ( self.CollectionPublicPath, target: self.CollectionStoragePath )
245
246 let minter <- create ProvineerAdmin()
247 self.account.save(<-minter, to: self.ProvineerAdminStoragePath)
248
249 emit ContractInitialized()
250 }
251}