Smart Contract

FINDNFTCatalogAdmin

A.097bafa4e0b48eef.FINDNFTCatalogAdmin

Deployed

2d ago
Feb 26, 2026, 03:12:51 AM UTC

Dependents

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