Smart Contract

StarlyRoyalties

A.5b82f21c0edf76e3.StarlyRoyalties

Deployed

17h ago
Feb 28, 2026, 02:30:51 AM UTC

Dependents

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