Smart Contract
FINDNFTCatalogAdmin
A.097bafa4e0b48eef.FINDNFTCatalogAdmin
1import FINDNFTCatalog from 0x097bafa4e0b48eef
2import NFTCatalog from 0x49a7cda3a1eecc29
3
4// NFTCatalogAdmin
5//
6// An admin contract that defines an admin resource and
7// a proxy resource to receive a capability that lets you make changes to the NFT Catalog
8// and manage proposals
9
10access(all) contract FINDNFTCatalogAdmin {
11
12 access(all) let AdminStoragePath: StoragePath
13
14 access(all) let AdminProxyPublicPath: PublicPath
15 access(all) let AdminProxyStoragePath: StoragePath
16
17 // Admin
18 // Admin resource to manage NFT Catalog
19 access(all) resource Admin {
20 access(all) fun addCatalogEntry(collectionIdentifier: String, metadata : NFTCatalog.NFTCatalogMetadata) {
21 FINDNFTCatalog.addCatalogEntry(collectionIdentifier: collectionIdentifier, metadata : metadata)
22 }
23
24 access(all) fun updateCatalogEntry(collectionIdentifier : String , metadata : NFTCatalog.NFTCatalogMetadata) {
25 FINDNFTCatalog.updateCatalogEntry(collectionIdentifier: collectionIdentifier, metadata : metadata)
26 }
27
28 access(all) fun removeCatalogEntry(collectionIdentifier : String) {
29 FINDNFTCatalog.removeCatalogEntry(collectionIdentifier : collectionIdentifier)
30 }
31
32 access(all) fun approveCatalogProposal(proposalID : UInt64) {
33 if (FINDNFTCatalog.getCatalogProposalEntry(proposalID : proposalID) == nil) {
34 panic("Invalid Proposal ID")
35 }
36 if (FINDNFTCatalog.getCatalogProposalEntry(proposalID : proposalID)!.status != "IN_REVIEW") {
37 panic("Invalid Proposal")
38 }
39 let catalogProposalEntry = FINDNFTCatalog.getCatalogProposalEntry(proposalID : proposalID)!
40 let newCatalogProposalEntry = NFTCatalog.NFTCatalogProposal(collectionIdentifier : catalogProposalEntry.collectionIdentifier, metadata : catalogProposalEntry.metadata, message : catalogProposalEntry.message, status: "APPROVED", proposer: catalogProposalEntry.proposer)
41 FINDNFTCatalog.updateCatalogProposal(proposalID : proposalID, proposalMetadata : newCatalogProposalEntry)
42
43 if FINDNFTCatalog.getCatalogEntry(collectionIdentifier : FINDNFTCatalog.getCatalogProposalEntry(proposalID : proposalID)!.collectionIdentifier) == nil {
44 FINDNFTCatalog.addCatalogEntry(collectionIdentifier: newCatalogProposalEntry.collectionIdentifier, metadata : newCatalogProposalEntry.metadata)
45 } else {
46 FINDNFTCatalog.updateCatalogEntry(collectionIdentifier: newCatalogProposalEntry.collectionIdentifier, metadata: newCatalogProposalEntry.metadata)
47 }
48 }
49
50 access(all) fun rejectCatalogProposal(proposalID : UInt64) {
51 if (FINDNFTCatalog.getCatalogProposalEntry(proposalID : proposalID) == nil) {
52 panic("Invalid Proposal ID")
53 }
54 if (FINDNFTCatalog.getCatalogProposalEntry(proposalID : proposalID)!.status != "IN_REVIEW") {
55 panic("Invalid Proposal")
56 }
57 let catalogProposalEntry = FINDNFTCatalog.getCatalogProposalEntry(proposalID : proposalID)!
58 let newCatalogProposalEntry = NFTCatalog.NFTCatalogProposal(collectionIdentifier : catalogProposalEntry.collectionIdentifier, metadata : catalogProposalEntry.metadata, message : catalogProposalEntry.message, status: "REJECTED", proposer: catalogProposalEntry.proposer)
59 FINDNFTCatalog.updateCatalogProposal(proposalID : proposalID, proposalMetadata : newCatalogProposalEntry)
60 }
61
62 access(all) fun removeCatalogProposal(proposalID : UInt64) {
63 if (FINDNFTCatalog.getCatalogProposalEntry(proposalID : proposalID) == nil) {
64 panic("Invalid Proposal ID")
65 }
66 FINDNFTCatalog.removeCatalogProposal(proposalID : proposalID)
67 }
68
69 init () {}
70
71 }
72
73 // AdminProxy
74 // A proxy resource that can store
75 // a capability to admin controls
76 access(all) resource interface IAdminProxy {
77 access(all) fun addCapability(capability : Capability<&Admin>)
78 access(all) fun hasCapability() : Bool
79 }
80
81 access(all) resource AdminProxy : IAdminProxy {
82
83 access(self) var capability : Capability<&Admin>?
84
85 access(all) fun addCapability(capability : Capability<&Admin>) {
86 pre {
87 capability.check() : "Invalid Admin Capability"
88 self.capability == nil : "Admin Proxy already set"
89 }
90 self.capability = capability
91 }
92
93 access(all) fun getCapability() : Capability<&Admin>? {
94 return self.capability
95 }
96
97 access(all) fun hasCapability() : Bool {
98 return self.capability != nil
99 }
100
101 init() {
102 self.capability = nil
103 }
104
105 }
106
107 access(all) fun createAdminProxy() : @AdminProxy {
108 return <- create AdminProxy()
109 }
110
111 init () {
112 self.AdminProxyPublicPath = /public/FINDnftCatalogAdminProxy
113 self.AdminProxyStoragePath = /storage/FINDnftCatalogAdminProxy
114
115 self.AdminStoragePath = /storage/FINDnftCatalogAdmin
116
117 let admin <- create Admin()
118
119 self.account.storage.save(<-admin, to: self.AdminStoragePath)
120 let adminCap = self.account.capabilities.storage.issue<&Admin>(self.AdminStoragePath)
121 }
122}
123