Smart Contract

Provineer

A.6b7453f9da8f4af1.Provineer

Deployed

17h ago
Feb 28, 2026, 02:30:51 AM UTC

Dependents

0 imports
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}