Smart Contract
TheFabricantNFTAccess
A.7752ea736384322f.TheFabricantNFTAccess
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}