Smart Contract

TheFabricantNFTAccess

A.7752ea736384322f.TheFabricantNFTAccess

Deployed

3h ago
Feb 28, 2026, 08:14:46 PM UTC

Dependents

0 imports
1import NonFungibleToken from 0x1d7e57aa55817448
2import FungibleToken from 0xf233dcee88fe0abe
3pub contract TheFabricantNFTAccess {
4
5    // -----------------------------------------------------------------------
6    // TheFabricantNFTAccess contract Events
7    // -----------------------------------------------------------------------
8    pub let AdminStoragePath: StoragePath
9
10    pub let RedeemerStoragePath: StoragePath
11
12    pub event EventAdded(eventName: String, types: [Type])
13
14    pub event EventRedemption(eventName: String, address: Address, nftID: UInt64, nftType: Type, nftUuid: UInt64)
15
16    pub event AccessListChanged(eventName: String, addresses: [Address])
17
18    // eventName: {redeemerAddress: nftUuid}
19    access(self) var event: {String: {Address: UInt64}} 
20
21    // eventName: [nftTypes]
22    access(self) var eventToTypes: {String: [Type]}
23
24    // eventName: [addresses]
25    access(self) var accessList: {String: [Address]}
26
27
28    pub resource Admin{
29
30        //add event to event dictionary
31        pub fun addEvent(eventName: String, types: [Type]){
32            pre {
33                TheFabricantNFTAccess.event[eventName] == nil:
34                "eventName already exists"
35            }
36            TheFabricantNFTAccess.event[eventName] = {}
37            TheFabricantNFTAccess.eventToTypes[eventName] = types
38
39            emit EventAdded(eventName: eventName, types: types)
40        }
41
42        pub fun changeAccessList(eventName: String, addresses: [Address]){
43            TheFabricantNFTAccess.accessList[eventName] = addresses
44
45            emit AccessListChanged(eventName: eventName, addresses: addresses)
46        }
47
48        pub fun createNewAdmin(): @Admin {
49            return <-create Admin()
50        }
51
52    }
53
54    pub resource Redeemer {
55
56        // user redeems an nft for an event
57        pub fun redeem(eventName: String, nftRef: &NonFungibleToken.NFT) {
58            pre {
59                nftRef.owner!.address == self.owner!.address:
60                "redeemer is not owner of nft"
61                TheFabricantNFTAccess.event[eventName] != nil:
62                "event does exist"
63                !TheFabricantNFTAccess.event[eventName]!.keys.contains(self.owner!.address):
64                "address already redeemed for this event"
65                !TheFabricantNFTAccess.event[eventName]!.values.contains(nftRef.uuid):
66                "nft is already used for redemption for this event"
67            }
68
69            let array = TheFabricantNFTAccess.getEventToTypes()[eventName]!
70
71            if (array.contains(nftRef.getType())) {
72                let oldAddressToUUID = TheFabricantNFTAccess.event[eventName]!
73                oldAddressToUUID[self.owner!.address] = nftRef.uuid
74                TheFabricantNFTAccess.event[eventName] = oldAddressToUUID
75                emit EventRedemption(
76                    eventName: eventName,
77                    address: self.owner!.address, 
78                    nftID: nftRef.id, 
79                    nftType: nftRef.getType(), 
80                    nftUuid: nftRef.uuid
81                )
82                return
83            } else {
84                panic ("the nft you have provided is not a redeemable type for this event")
85            }
86        }
87
88        // destructor
89        //
90        destroy () {}
91
92        // initializer
93        //
94        init () {}
95    }
96
97    pub fun createNewRedeemer(): @Redeemer {
98        return <-create Redeemer()
99    }
100
101    pub fun getEvent(): {String: {Address: UInt64}} {
102        return TheFabricantNFTAccess.event
103    }
104
105    pub fun getEventToTypes(): {String: [Type]} {
106        return TheFabricantNFTAccess.eventToTypes
107    }
108
109    pub fun getAccessList(): {String: [Address]} {
110        return TheFabricantNFTAccess.accessList
111    }
112
113    // -----------------------------------------------------------------------
114    // initialization function
115    // -----------------------------------------------------------------------
116    //
117    init() {
118        self.event = {}
119        self.eventToTypes = {}
120        self.accessList = {}
121        self.AdminStoragePath = /storage/NFTAccessAdmin0022
122        self.RedeemerStoragePath = /storage/NFTAccessRedeemer0022
123        self.account.save<@Admin>(<- create Admin(), to: self.AdminStoragePath)
124    }
125}