tx · G5YF42gu6PsmSMtZ1tD2Xr2TD5uppwSXCmZH2o9BKkbB

3PKwLVb8jYk58oYbfXxs2dUjD3YEKeqGWrX:  -0.01400000 Waves

2021.12.15 14:23 [2900286] smart account 3PKwLVb8jYk58oYbfXxs2dUjD3YEKeqGWrX > SELF 0.00000000 Waves

{ "type": 13, "id": "G5YF42gu6PsmSMtZ1tD2Xr2TD5uppwSXCmZH2o9BKkbB", "fee": 1400000, "feeAssetId": null, "timestamp": 1639567501051, "version": 2, "chainId": 87, "sender": "3PKwLVb8jYk58oYbfXxs2dUjD3YEKeqGWrX", "senderPublicKey": "27DK15MykfnsVojpifD1gbr8kRr8rpY5mw6EH4zL8R25", "proofs": [ "45CgZ72dfWW7L8rhNwYBpzCBMZ3nbwGkGDHSiC6RHhQrFscREhvFRmqnboZjQvXapPyxgvpkWa4JTKn3tVFc5U1t" ], "script": "base64:AAIFAAAAAAAABuYIAhIECgIICBIGCgQICAEBEgMKAQgSABoGCgFBEgFiGgwKAUISB2dldEJvb2waGgoBQxIVZ2V0Q3VycmVudExldmVsQmlnSW50Gg8KAUQSCmtEdWNrTGV2ZWwaBgoBRRIBcxoMCgFGEgckbWF0Y2gxGhIKAUcSDWdldEN1cnJlbnRMYXAaGAoBSBITZ2V0TGFzdEZlZFRpbWVzdGFtcBoVCgFJEhBsYXN0RmVkVGltZXN0YW1wGh4KAUoSGWNhbGN1bGF0ZU5ld0R1Y2tsaW5nTGV2ZWwaEgoBSxINcGF5bWVudEFtb3VudBoOCgFMEgljdXJyZW50VHMaHAoBTRIXbGFzdEZlZFRpbWVzdGFtcENoZWNrZWQaDAoBThIHZmVkRGlmZhoMCgFPEgdwZW5hbHR5GgsKAVASBmdyb3d0aBoRCgFREgxjdXJyZW50TGV2ZWwaDQoBUhIIbmV3TGV2ZWwaCwoBUxIGcmVzdWx0GhQKAVQSD2dldEJhY2tlbmRQcm9vZhoSCgFVEg1tYXhGZWVkQW1vdW50Gg4KAVYSCXVzZXJOb25jZRoGCgFXEgFpGgwKAVgSB3R4SWRTdHIaCgoBWRIFYXNzZXQaDAoBWhIHYXNzZXRJZBoVCgFhEhBpbmN1YmF0b3JBZGRyZXNzGhMKAmFBEg1zdGFydGluZ0xldmVsGggKAmFCEgIkbBoICgJhQxICJHMaCwoCYUQSBSRhY2MwGgsKAmFFEgUkZjBfMRoICgJhRhICJGEaCAoCYUcSAiRpGgsKAmFIEgUkZjBfMhoKCgJhSRIEdHhJZBoaCgJhShIUbGFzdElzc3VlZER1Y2tsaW5nVHMaEQoCYUsSC2ZpdmVNaW5Jbk1zGgkKAmFMEgNwbXQaCgoCYU0SBGNhbGwaFAoCYU4SDmtEdWNrbGluZ0dyb3duGggKAmFPEgJ0eBoMCgJhUBIGdmVyaWZ5GhYKAmFhEhBiYWNrZW5kU2lnbmF0dXJlGhMKAmFiEg1hZGRyZXNzU3RyaW5nGhIKAmFjEgxiYWNrZW5kUHJvb2YaEwoCYWQSDWtBZGRyZXNzTm9uY2UaEgoCYWUSDGN1cnJlbnROb25jZRoUCgJhZhIOcmVhbER1Y2tsaW5nSWQaFQoCYWcSD2R1Y2tsaW5nQXNzZXRJZBoICgJhaBICaWQaBwoCYWkSAXYaFQoCYWoSD2R1Y2tsaW5nSWRDaGVjaxoWCgJhaxIQZHVja2xpbmdJZFN0cmluZxoYCgJhbBISa0R1Y2tsaW5nTGFzdEZlZFRzGg8KAmFtEglsYXN0RmVkVHMaFAoCYW4SDmN1cnJlbnRQYXltZW50Gg8KAmFvEglrTmV3TGV2ZWwaEAoCYXASCmtUb3RhbEZlZWQaDwoCYXESCXRvdGFsRmVlZBoSCgJhchIMa0ZlZWRUeFN0YXRzGhoKAmFzEhRrQWRkcmVzc0ZlZFRpbWVzdGFtcBoeCgJhdBIYa0R1Y2tsaW5nRmVkTGFwVGltZXN0YW1wGhUKAmF1Eg9rRHVja2xpbmdGZWRMYXAaFgoCYXYSEGNhbGN1bGF0ZVJlc3VsdHMaEQoCYXcSC2R1Y2tsaW5nSWRzGhUKAmF4Eg9kdWNrbGluZ0lkc0xpc3QaDgoCYXkSCGhhbmRsZUlkGgkKAmF6EgNhY2MaEgoBYhINYmFja2VuZFB1YktleRoTCgFjEg5TVEFSVFRJTUVTVEFNUBoOCgFkEglMQVBMRU5HVEgaDwoBZRIKRUdHQVNTRVRJRBoSCgFmEg1EVUNLTElOR1BSSUNFGhsKAWcSFnBlcmNlbnRHcm93dGhQcmVjaXNpb24aGgoBaBIVZXhpc3RpbmdEdWNrUHJlY2lzaW9uGhsKAWkSFktHbG9iYWxJc3N1ZWRUaW1lc3RhbXAaDAoBahIHTVNJTkRBWRoRCgFrEgxrZXlUb3RhbEZlZWQaDwoBbBIKZHVja2xpbmdJZBoWCgFtEhFrZXlEdWNrbGluZ0ZlZExhcBofCgFuEhprZXlEdWNrbGluZ0ZlZExhcFRpbWVzdGFtcBoICgFvEgNsYXAaGwoBcBIWa2V5QWRkcmVzc0ZlZFRpbWVzdGFtcBoMCgFxEgdhZGRyZXNzGg4KAXISCXRpbWVzdGFtcBoUCgFzEg9rZXlBZGRyZXNzTm9uY2UaIAoBdBIba2V5RHVja2xpbmdGZWRMYXN0VGltZXN0YW1wGhUKAXUSEGtleUR1Y2tsaW5nTGV2ZWwaFQoBdhIQa2V5RHVja2xpbmdHcm93bhoSCgF3Eg10cnlHZXRJbnRlZ2VyGggKAXgSA2tleRoICgF5EgN2YWwaDAoBehIHJG1hdGNoMAAAABkAAAAAAWEBAAAAGgFXMb+aaLkw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", "height": 2900286, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Dp4qTr567719AeMEq7xxyTHCgPKFcbzaob8XgKmk8ieJ Next: D41fYaLveb5T3jVc2koyTGtsWRfNNHtQLsJZsW7t6zPD Diff:
OldNewDifferences
2222 let MSINDAY = 86400000
2323
2424 func keyTotalFeed (ducklingId) = (("duckling_" + ducklingId) + "_feed")
25+
26+
27+func keyDucklingFedLap (ducklingId) = (("duckling_" + ducklingId) + "_fedLap")
2528
2629
2730 func keyDucklingFedLapTimestamp (ducklingId,lap) = (((("duckling_" + ducklingId) + "_lap_") + toString(lap)) + "_fedTs")
170173 let kFeedTxStats = ((("duckling_" + realDucklingId) + "_stat_") + toString(lastBlock.timestamp))
171174 let kAddressFedTimestamp = keyAddressFedTimestamp(addressString, getCurrentLap(), lastBlock.timestamp)
172175 let kDucklingFedLapTimestamp = keyDucklingFedLapTimestamp(realDucklingId, getCurrentLap())
176+ let kDucklingFedLap = keyDucklingFedLap(realDucklingId)
173177 if ((currentPayment > maxFeedAmount))
174178 then throw(("Cannot feed duckling for such amount, max feed amount is: " + toString(maxFeedAmount)))
175179 else {
176180 let calculateResults = calculateNewDucklingLevel(realDucklingId, currentPayment)
177-[IntegerEntry(kAddressNonce, (currentNonce + 1)), IntegerEntry(kDucklingLastFedTs, lastBlock.timestamp), IntegerEntry(kTotalFeed, (totalFeed + currentPayment)), IntegerEntry(kFeedTxStats, currentPayment), IntegerEntry(kAddressFedTimestamp, currentPayment), IntegerEntry(kDucklingFedLapTimestamp, currentPayment), StringEntry(kNewLevel, calculateResults._1), StringEntry((kFeedTxStats + "_debug"), makeString(calculateResults._2, ";"))]
181+[IntegerEntry(kAddressNonce, (currentNonce + 1)), IntegerEntry(kDucklingLastFedTs, lastBlock.timestamp), IntegerEntry(kTotalFeed, (totalFeed + currentPayment)), IntegerEntry(kFeedTxStats, currentPayment), IntegerEntry(kAddressFedTimestamp, currentPayment), IntegerEntry(kDucklingFedLapTimestamp, currentPayment), IntegerEntry(kDucklingFedLap, getCurrentLap()), StringEntry(kNewLevel, calculateResults._1), StringEntry((kFeedTxStats + "_debug"), makeString(calculateResults._2, ";"))]
178182 }
179183 }
180184
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let incubatorAddress = base58'3P6TwNU39Ykkbeqhn5TE4a2736xsA1vXemM'
55
66 let backendPubKey = base58'BnKJTqkWD69SotKhJXdKu76NRtkdQJEpThqGGeFwF9EL'
77
88 let STARTTIMESTAMP = 1632474000000
99
1010 let LAPLENGTH = 21600000
1111
1212 let EGGASSETID = base58'3v7zGkeHS6KrsvmTRzEzvCxm5cdzkCtM7z5cM6efcjCB'
1313
1414 let DUCKLINGPRICE = 80000000
1515
1616 let percentGrowthPrecision = 10000000000000000
1717
1818 let existingDuckPrecision = 100000000000000
1919
2020 let KGlobalIssuedTimestamp = "global_issued_timestamp"
2121
2222 let MSINDAY = 86400000
2323
2424 func keyTotalFeed (ducklingId) = (("duckling_" + ducklingId) + "_feed")
25+
26+
27+func keyDucklingFedLap (ducklingId) = (("duckling_" + ducklingId) + "_fedLap")
2528
2629
2730 func keyDucklingFedLapTimestamp (ducklingId,lap) = (((("duckling_" + ducklingId) + "_lap_") + toString(lap)) + "_fedTs")
2831
2932
3033 func keyAddressFedTimestamp (address,lap,timestamp) = ((((("address_" + address) + "_lap_") + toString(lap)) + "_fedTs_") + toString(timestamp))
3134
3235
3336 func keyAddressNonce (address) = (("address_" + address) + "_nonce")
3437
3538
3639 func keyDucklingFedLastTimestamp (ducklingId) = (("duckling_" + ducklingId) + "_fedLastTs")
3740
3841
3942 func keyDucklingLevel (ducklingId) = (("duckling_" + ducklingId) + "_level")
4043
4144
4245 func keyDucklingGrown (ducklingId) = (("duckling_" + ducklingId) + "_grown")
4346
4447
4548 func tryGetInteger (key) = {
4649 let val = match getInteger(this, key) {
4750 case b: Int =>
4851 b
4952 case _ =>
5053 0
5154 }
5255 val
5356 }
5457
5558
5659 func getBool (key) = match getBoolean(this, key) {
5760 case b: Boolean =>
5861 b
5962 case _ =>
6063 false
6164 }
6265
6366
6467 func getCurrentLevelBigInt (ducklingId) = {
6568 let kDuckLevel = keyDucklingLevel(ducklingId)
6669 match getString(kDuckLevel) {
6770 case s: String =>
6871 parseBigIntValue(s)
6972 case _ =>
7073 match getBoolean((("duckling_" + ducklingId) + "_issuedByFeedCall")) {
7174 case b: Boolean =>
7275 toBigInt(0)
7376 case _ =>
7477 toBigInt((20 * existingDuckPrecision))
7578 }
7679 }
7780 }
7881
7982
8083 func getCurrentLap () = (((lastBlock.timestamp - STARTTIMESTAMP) / LAPLENGTH) + 1)
8184
8285
8386 func getLastFedTimestamp (ducklingId) = {
8487 let lastFedTimestamp = tryGetInteger(keyDucklingFedLastTimestamp(ducklingId))
8588 if ((lastFedTimestamp > 0))
8689 then lastFedTimestamp
8790 else lastBlock.timestamp
8891 }
8992
9093
9194 func calculateNewDucklingLevel (ducklingId,paymentAmount) = {
9295 let currentTs = lastBlock.timestamp
9396 let lastFedTimestampChecked = getLastFedTimestamp(ducklingId)
9497 let fedDiff = (currentTs - lastFedTimestampChecked)
9598 let penalty = if (if ((fedDiff == 0))
9699 then true
97100 else ((MSINDAY * 2) >= fedDiff))
98101 then toBigInt(0)
99102 else (toBigInt((fedDiff / MSINDAY)) * toBigInt((existingDuckPrecision / 10)))
100103 let growth = fraction(toBigInt(paymentAmount), toBigInt(percentGrowthPrecision), toBigInt(DUCKLINGPRICE))
101104 let currentLevel = getCurrentLevelBigInt(ducklingId)
102105 let newLevel = ((currentLevel - penalty) + growth)
103106 let result = if ((toBigInt(0) > newLevel))
104107 then toString(growth)
105108 else toString(newLevel)
106109 $Tuple2(result, [("currentLevel=" + toString(currentLevel)), ("newLevel=" + toString(newLevel)), ("growth=" + toString(growth)), ("penalty=" + toString(penalty)), ("lastFedTs=" + toString(lastFedTimestampChecked)), ("fedDiff=" + toString(fedDiff))])
107110 }
108111
109112
110113 func getBackendProof (maxFeedAmount,userNonce,address) = makeString([toString(maxFeedAmount), toString(userNonce), address], ";")
111114
112115
113116 @Callable(i)
114117 func issueFreeDuckling (address,txIdStr) = {
115118 let asset = Issue("BABY-11111111-GZ", "", 1, 0, false, unit, height)
116119 let assetId = calculateAssetId(asset)
117120 $Tuple2([StringEntry((((address + "_") + txIdStr) + "_di"), toBase58String(assetId)), IntegerEntry("stats_amount", (tryGetInteger("stats_amount") + 1)), BooleanEntry((("duckling_" + toBase58String(assetId)) + "_issuedByFeedCall"), (i.caller == this)), asset, ScriptTransfer(value(addressFromString(address)), 1, assetId)], toBase58String(assetId))
118121 }
119122
120123
121124
122125 @Callable(i)
123126 func feedDuckling (ducklingId,backendSignature,maxFeedAmount,userNonce) = {
124127 let addressString = toString(i.caller)
125128 let backendProof = getBackendProof(maxFeedAmount, userNonce, addressString)
126129 let kAddressNonce = keyAddressNonce(addressString)
127130 let currentNonce = tryGetInteger(kAddressNonce)
128131 let realDucklingId = if (!(sigVerify_8Kb(toBytes(backendProof), fromBase58String(backendSignature), backendPubKey)))
129132 then throw("Invalid proof from backend")
130133 else if (if ((size(i.payments) != 1))
131134 then true
132135 else (value(i.payments[0]).assetId != EGGASSETID))
133136 then throw("Bad payment attached (asset[s] or amount)")
134137 else if (getBool(keyDucklingGrown(ducklingId)))
135138 then throw("Duckling is already grown")
136139 else if ((userNonce != (currentNonce + 1)))
137140 then throw(((("User Nonce should be " + toString(currentNonce)) + " + 1, while received ") + toString(userNonce)))
138141 else if ((ducklingId == ""))
139142 then {
140143 let ducklingAssetId = invoke(this, "issueFreeDuckling", [toString(i.originCaller), toBase58String(i.transactionId)], nil)
141144 if ((ducklingAssetId == ducklingAssetId))
142145 then {
143146 let id = match ducklingAssetId {
144147 case v: String =>
145148 v
146149 case _ =>
147150 throw("Can't generate NFT")
148151 }
149152 id
150153 }
151154 else throw("Strict value is not equal to itself.")
152155 }
153156 else {
154157 let ducklingIdCheck = value(assetInfo(fromBase58String(ducklingId)))
155158 if ((assetBalance(i.caller, ducklingIdCheck.id) != 1))
156159 then throw("You're not the owner of the duckling")
157160 else if ((ducklingIdCheck.issuer != this))
158161 then throw("Cant find duckling with such id")
159162 else {
160163 let ducklingIdString = toBase58String(ducklingIdCheck.id)
161164 ducklingIdString
162165 }
163166 }
164167 let kDucklingLastFedTs = keyDucklingFedLastTimestamp(ducklingId)
165168 let lastFedTs = getLastFedTimestamp(realDucklingId)
166169 let currentPayment = value(i.payments[0]).amount
167170 let kNewLevel = keyDucklingLevel(realDucklingId)
168171 let kTotalFeed = keyTotalFeed(realDucklingId)
169172 let totalFeed = tryGetInteger(kTotalFeed)
170173 let kFeedTxStats = ((("duckling_" + realDucklingId) + "_stat_") + toString(lastBlock.timestamp))
171174 let kAddressFedTimestamp = keyAddressFedTimestamp(addressString, getCurrentLap(), lastBlock.timestamp)
172175 let kDucklingFedLapTimestamp = keyDucklingFedLapTimestamp(realDucklingId, getCurrentLap())
176+ let kDucklingFedLap = keyDucklingFedLap(realDucklingId)
173177 if ((currentPayment > maxFeedAmount))
174178 then throw(("Cannot feed duckling for such amount, max feed amount is: " + toString(maxFeedAmount)))
175179 else {
176180 let calculateResults = calculateNewDucklingLevel(realDucklingId, currentPayment)
177-[IntegerEntry(kAddressNonce, (currentNonce + 1)), IntegerEntry(kDucklingLastFedTs, lastBlock.timestamp), IntegerEntry(kTotalFeed, (totalFeed + currentPayment)), IntegerEntry(kFeedTxStats, currentPayment), IntegerEntry(kAddressFedTimestamp, currentPayment), IntegerEntry(kDucklingFedLapTimestamp, currentPayment), StringEntry(kNewLevel, calculateResults._1), StringEntry((kFeedTxStats + "_debug"), makeString(calculateResults._2, ";"))]
181+[IntegerEntry(kAddressNonce, (currentNonce + 1)), IntegerEntry(kDucklingLastFedTs, lastBlock.timestamp), IntegerEntry(kTotalFeed, (totalFeed + currentPayment)), IntegerEntry(kFeedTxStats, currentPayment), IntegerEntry(kAddressFedTimestamp, currentPayment), IntegerEntry(kDucklingFedLapTimestamp, currentPayment), IntegerEntry(kDucklingFedLap, getCurrentLap()), StringEntry(kNewLevel, calculateResults._1), StringEntry((kFeedTxStats + "_debug"), makeString(calculateResults._2, ";"))]
178182 }
179183 }
180184
181185
182186
183187 @Callable(i)
184188 func fixLevels (ducklingIds) = if ((i.callerPublicKey != base58'GDxBbsDRmeY39quNrDsTXKJzFWbQVtjxHseF4ikxZ7n9'))
185189 then throw("")
186190 else {
187191 let ducklingIdsList = value(split(ducklingIds, ","))
188192 func handleId (acc,id) = {
189193 let kTotalFeed = keyTotalFeed(id)
190194 let totalFeed = tryGetInteger(kTotalFeed)
191195 let kNewLevel = keyDucklingLevel(id)
192196 let startingLevel = match getBoolean((("duckling_" + id) + "_issuedByFeedCall")) {
193197 case b: Boolean =>
194198 toBigInt(0)
195199 case _ =>
196200 toBigInt((20 * existingDuckPrecision))
197201 }
198202 let growth = fraction(toBigInt(totalFeed), toBigInt(percentGrowthPrecision), toBigInt(DUCKLINGPRICE))
199203 (acc ++ [StringEntry(kNewLevel, toString((startingLevel + growth)))])
200204 }
201205
202206 let $l = ducklingIdsList
203207 let $s = size($l)
204208 let $acc0 = nil
205209 func $f0_1 ($a,$i) = if (($i >= $s))
206210 then $a
207211 else handleId($a, $l[$i])
208212
209213 func $f0_2 ($a,$i) = if (($i >= $s))
210214 then $a
211215 else throw("List size exceeds 20")
212216
213217 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
214218 }
215219
216220
217221
218222 @Callable(i)
219223 func turnDucklingIntoDuck () = {
220224 let address = toString(i.caller)
221225 let txId = toBase58String(i.transactionId)
222226 let lastIssuedDucklingTs = tryGetInteger(KGlobalIssuedTimestamp)
223227 let fiveMinInMs = ((5 * 60) * 1000)
224228 if (if ((lastIssuedDucklingTs > 0))
225229 then (fiveMinInMs > (lastBlock.timestamp - lastIssuedDucklingTs))
226230 else false)
227231 then throw(("Can issue ducklings only once per 5 minutes, please wait for " + toString((fiveMinInMs - (lastBlock.timestamp - lastIssuedDucklingTs)))))
228232 else if ((size(i.payments) != 1))
229233 then throw("Bad payment attached (asset[s] or amount)")
230234 else {
231235 let pmt = value(assetInfo(value(value(i.payments[0]).assetId)))
232236 if ((pmt.issuer != this))
233237 then throw("Can use only ducklings from this dApp")
234238 else {
235239 let call = invoke(Address(incubatorAddress), "startDuckHatching", [""], nil)
236240 if ((call == call))
237241 then {
238242 let kDucklingGrown = keyDucklingGrown(toBase58String(pmt.id))
239243 [BooleanEntry(kDucklingGrown, true), IntegerEntry(KGlobalIssuedTimestamp, lastBlock.timestamp)]
240244 }
241245 else throw("Strict value is not equal to itself.")
242246 }
243247 }
244248 }
245249
246250
247251 @Verifier(tx)
248252 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
249253

github/deemru/w8io/3ef1775 
38.21 ms