Smart Contract
FLOATIncinerator
A.2d4c3caffbeab845.FLOATIncinerator
1import FLOAT from 0x2d4c3caffbeab845
2
3pub contract FLOATIncinerator {
4
5 pub let IncineratorStoragePath: StoragePath
6 pub let IncineratorPublicPath: PublicPath
7
8 pub var flameStrength: UInt64
9 pub var totalIncinerated: UInt64
10
11 pub resource interface IncineratorPublic {
12 pub var individualIncinerated: UInt64
13 pub var contributedStrength: UInt64
14 pub fun getExtraMetadata(): {String: String}
15 }
16
17 pub resource Incinerator: IncineratorPublic {
18 pub var individualIncinerated: UInt64
19 pub var contributedStrength: UInt64
20 access(self) var extraMetadata: {String: String}
21
22 pub fun burn(collection: &FLOAT.Collection, ids: [UInt64]) {
23 let length = ids.length
24
25 for id in ids {
26 let float: &FLOAT.NFT = collection.borrowFLOAT(id: id) ?? panic("This FLOAT does not exist.")
27 let score = FLOATIncinerator.calculateScore(dateReceived: float.dateReceived, serial: float.serial)
28 self.contributedStrength = self.contributedStrength + score
29 FLOATIncinerator.flameStrength = FLOATIncinerator.flameStrength + score
30 collection.delete(id: id)
31 }
32
33 self.individualIncinerated = self.individualIncinerated + UInt64(length)
34 FLOATIncinerator.totalIncinerated = FLOATIncinerator.totalIncinerated + UInt64(length)
35 }
36
37 pub fun getExtraMetadata(): {String: String} {
38 return self.extraMetadata
39 }
40
41 init() {
42 self.individualIncinerated = 0
43 self.contributedStrength = 0
44 self.extraMetadata = {}
45 }
46 }
47
48 pub fun createIncinerator(): @Incinerator {
49 return <- create Incinerator()
50 }
51
52 pub fun calculateScore(dateReceived: UFix64, serial: UInt64): UInt64 {
53 // Serial
54 var serialScore: UInt64 = 0
55 if (serial < 10) {
56 serialScore = 5
57 } else if (serial < 100) {
58 serialScore = 4
59 } else if (serial < 1000) {
60 serialScore = 3
61 } else if (serial < 10000) {
62 serialScore = 2
63 } else if (serial < 100000) {
64 serialScore = 1
65 }
66
67 // Time
68 var timeScore: UInt64 = 0
69 var difference = getCurrentBlock().timestamp - dateReceived
70 if (difference > 31556926.0) { // a year
71 timeScore = 5
72 } else if (difference > 2629743.0) { // a month
73 timeScore = 4
74 } else if (difference > 604800.0) { // a week
75 timeScore = 3
76 } else if (difference > 86400.0) { // a day
77 timeScore = 2
78 } else if (difference > 3600.0) { // an hour
79 timeScore = 1
80 }
81
82 return serialScore + timeScore
83 }
84
85 init() {
86 self.IncineratorStoragePath = /storage/FLOATIncineratorStoragePath
87 self.IncineratorPublicPath = /public/FLOATIncineratorPublicPath
88 self.totalIncinerated = 0
89 self.flameStrength = 0
90 }
91
92}