Smart Contract
StarlyRoyalties
A.5b82f21c0edf76e3.StarlyRoyalties
1access(all) contract StarlyRoyalties {
2
3 access(all) struct Royalty {
4 access(all) let address: Address
5 access(all) let cut: UFix64
6
7 init(address: Address, cut: UFix64) {
8 self.address = address
9 self.cut = cut
10 }
11 }
12
13 access(all) var starlyRoyalty: Royalty
14 access(contract) let collectionRoyalties: {String: Royalty}
15 access(contract) let minterRoyalties: {String: {String: Royalty}}
16
17 access(all) let AdminStoragePath: StoragePath
18 access(all) let EditorStoragePath: StoragePath
19 access(all) let EditorProxyStoragePath: StoragePath
20 access(all) let EditorProxyPublicPath: PublicPath
21
22 access(all) fun getRoyalties(collectionID: String, starlyID: String): [Royalty] {
23 let royalties = [self.starlyRoyalty]
24 if let collectionRoyalty = self.collectionRoyalties[collectionID] {
25 royalties.append(collectionRoyalty)
26 }
27 if let minterRoyaltiesForCollection = self.minterRoyalties[collectionID] {
28 if let minterRoyalty = minterRoyaltiesForCollection[starlyID] {
29 royalties.append(minterRoyalty)
30 }
31 }
32 return royalties
33 }
34
35 access(all) fun getStarlyRoyalty(): Royalty {
36 return self.starlyRoyalty
37 }
38
39 access(all) fun getCollectionRoyalty(collectionID: String): Royalty? {
40 return self.collectionRoyalties[collectionID]
41 }
42
43 access(all) fun getMinterRoyalty(collectionID: String, starlyID: String): Royalty? {
44 if let minterRoyaltiesForCollection = self.minterRoyalties[collectionID] {
45 return minterRoyaltiesForCollection[starlyID]
46 }
47 return nil
48 }
49
50 access(all) resource interface IEditor {
51 access(all) fun setStarlyRoyalty(address: Address, cut: UFix64)
52 access(all) fun setCollectionRoyalty(collectionID: String, address: Address, cut: UFix64)
53 access(all) fun deleteCollectionRoyalty(collectionID: String)
54 access(all) fun setMinterRoyalty(collectionID: String, starlyID: String, address: Address, cut: UFix64)
55 access(all) fun deleteMinterRoyalty(collectionID: String, starlyID: String)
56 }
57
58 access(all) resource Editor: IEditor {
59 access(all) fun setStarlyRoyalty(address: Address, cut: UFix64) {
60 StarlyRoyalties.starlyRoyalty = Royalty(address: address, cut: cut)
61 }
62
63 access(all) fun setCollectionRoyalty(collectionID: String, address: Address, cut: UFix64) {
64 StarlyRoyalties.collectionRoyalties.insert(key: collectionID, Royalty(address: address, cut: cut))
65 }
66
67 access(all) fun deleteCollectionRoyalty(collectionID: String) {
68 StarlyRoyalties.collectionRoyalties.remove(key: collectionID)
69 }
70
71 access(all) fun setMinterRoyalty(collectionID: String, starlyID: String, address: Address, cut: UFix64) {
72 if !StarlyRoyalties.minterRoyalties.containsKey(collectionID) {
73 StarlyRoyalties.minterRoyalties.insert(key: collectionID, {
74 starlyID: Royalty(address: address, cut: cut)
75 })
76 } else {
77 StarlyRoyalties.minterRoyalties[collectionID]!.insert(key: starlyID, Royalty(address: address, cut: cut))
78 }
79 }
80
81 access(all) fun deleteMinterRoyalty(collectionID: String, starlyID: String) {
82 StarlyRoyalties.minterRoyalties[collectionID]?.remove(key: starlyID)
83 }
84 }
85
86 access(all) resource interface EditorProxyPublic {
87 access(all) fun setEditorCapability(cap: Capability<&Editor>)
88 }
89
90 access(all) resource EditorProxy: IEditor, EditorProxyPublic {
91 access(self) var editorCapability: Capability<&Editor>?
92
93 access(all) fun setEditorCapability(cap: Capability<&Editor>) {
94 self.editorCapability = cap
95 }
96
97 access(all) fun setStarlyRoyalty(address: Address, cut: UFix64) {
98 self.editorCapability!.borrow()!
99 .setStarlyRoyalty(address: address, cut: cut)
100 }
101
102 access(all) fun setCollectionRoyalty(collectionID: String, address: Address, cut: UFix64) {
103 self.editorCapability!.borrow()!
104 .setCollectionRoyalty(collectionID: collectionID, address: address, cut: cut)
105 }
106
107 access(all) fun deleteCollectionRoyalty(collectionID: String) {
108 self.editorCapability!.borrow()!
109 .deleteCollectionRoyalty(collectionID: collectionID)
110 }
111
112 access(all) fun setMinterRoyalty(collectionID: String, starlyID: String, address: Address, cut: UFix64) {
113 self.editorCapability!.borrow()!
114 .setMinterRoyalty(collectionID: collectionID, starlyID: starlyID, address: address, cut: cut)
115 }
116
117 access(all) fun deleteMinterRoyalty(collectionID: String, starlyID: String) {
118 self.editorCapability!.borrow()!
119 .deleteMinterRoyalty(collectionID: collectionID, starlyID: starlyID)
120 }
121
122 init() {
123 self.editorCapability = nil
124 }
125 }
126
127 access(all) fun createEditorProxy(): @EditorProxy {
128 return <- create EditorProxy()
129 }
130
131 access(all) resource Admin {
132 access(all)
133 fun createNewEditor(): @Editor {
134 return <- create Editor()
135 }
136 }
137
138 init() {
139 self.starlyRoyalty = Royalty(address: 0x12c122ca9266c278, cut: 0.05)
140 self.collectionRoyalties = {}
141 self.minterRoyalties = {}
142
143 self.AdminStoragePath = /storage/starlyRoyaltiesAdmin
144 self.EditorStoragePath = /storage/starlyRoyaltiesEditor
145 self.EditorProxyPublicPath = /public/starlyRoyaltiesEditorProxy
146 self.EditorProxyStoragePath = /storage/starlyRoyaltiesEditorProxy
147
148 let admin <- create Admin()
149 let editor <- admin.createNewEditor()
150 self.account.storage.save(<-admin, to: self.AdminStoragePath)
151 self.account.storage.save(<-editor, to: self.EditorStoragePath)
152 }
153}
154