tx · 6os2Pq35hAnqinRsngabuYepg1q5u5ecXRiiLTwc1VsC

3PKmLiGEfqLWMC1H9xhzqvAZKUXfFm8uoeg:  -0.00900000 Waves

2022.07.26 15:37 [3222315] smart account 3PKmLiGEfqLWMC1H9xhzqvAZKUXfFm8uoeg > SELF 0.00000000 Waves

{ "type": 13, "id": "6os2Pq35hAnqinRsngabuYepg1q5u5ecXRiiLTwc1VsC", "fee": 900000, "feeAssetId": null, "timestamp": 1658839010107, "version": 2, "chainId": 87, "sender": "3PKmLiGEfqLWMC1H9xhzqvAZKUXfFm8uoeg", "senderPublicKey": "HhKF4aqirtdmzKKDA2qraDLtSG2n9RbkZrpjnGMZkEDm", "proofs": [ "2Ky996SU2teJt9xb13ekJkvteDMgHKq4UUW3qaFMgZj2FH3dzd7MTjbpVQ9uubaz5UpQ9Nt4vVvG1dp1p9HtzVC9" ], "script": "base64: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", "height": 3222315, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Fr2v97aFd7Kbvg64mxik1Cm6v2gWMwtrnJRW31QorS5R Next: 5ZqxArzKXicZsVDkAynXBw2ybnM58xEgFZL1CZV4BH5o Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-func tryGetStringExternal (address,key) = match getString(address, key) {
5- case a: String =>
6- a
7- case _ =>
8- ""
9-}
4+let rebirthAddress = base58'3PCC6fVHNa6289DTDmcUo3RuLaFmteZZsmQ'
105
11-
12-func tryGetString (key) = tryGetStringExternal(this, key)
13-
14-
15-func getOracle () = Address(fromBase58String(tryGetString("static_oracleAddress")))
16-
17-
18-func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), "static_eggAssetId"))
19-
20-
21-func getRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_rebirthAddress")))
22-
23-
24-func getIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_incubatorAddress")))
25-
6+let incubatorAddress = base58'3PEktVux2RhchSN63DsDo4b4mz4QqzKSeDv'
267
278 let backendPubKey = base58'BmKAXRQy7jZm44fa1YxNQDTcAwNSb74EpQwP5CT7UHdV'
289
2910 let STARTTIMESTAMP = 1632474000000
3011
3112 let LAPLENGTH = 21600000
13+
14+let EGGASSETID = base58'C1iWsKGqLwjHUndiQ7iXpdmPum9PeCDFfyXBdJJosDRS'
3215
3316 let DUCKLINGPRICE = 80000000
3417
7356 func keyStartHatchingId (ducklingId) = (("duckling_" + ducklingId) + "_grown")
7457
7558
76-func keyStartPercentage (ducklingId) = (("duckling_" + ducklingId) + "_startPercentage")
77-
78-
7959 func tryGetInteger (key) = {
8060 let val = match getInteger(this, key) {
8161 case b: Int =>
9575 }
9676
9777
98-func getDucklingPercentage (ducklingId) = {
99- let percentageDuckling = tryGetInteger(keyStartPercentage(ducklingId))
100- let base = if ((percentageDuckling != 0))
101- then percentageDuckling
102- else 20
103- toBigInt((base * existingDuckPrecision))
104- }
105-
106-
10778 func getCurrentLevelBigInt (ducklingId) = {
10879 let kDuckLevel = keyDucklingLevel(ducklingId)
10980 match getString(kDuckLevel) {
11283 case _ =>
11384 match getBoolean((("duckling_" + ducklingId) + "_issuedByFeedCall")) {
11485 case b: Boolean =>
115- if ((b == true))
116- then toBigInt(0)
117- else getDucklingPercentage(ducklingId)
86+ toBigInt(0)
11887 case _ =>
119- getDucklingPercentage(ducklingId)
88+ toBigInt((20 * existingDuckPrecision))
12089 }
12190 }
12291 }
137106 let currentTs = lastBlock.timestamp
138107 let lastFedTimestampChecked = getLastFedTimestamp(ducklingId)
139108 let fedDiff = (currentTs - lastFedTimestampChecked)
140- let penalty = toBigInt(0)
109+ let penalty = if (if ((fedDiff == 0))
110+ then true
111+ else ((MSINDAY * 2) >= fedDiff))
112+ then toBigInt(0)
113+ else (toBigInt((fedDiff / MSINDAY)) * toBigInt((existingDuckPrecision / 10)))
141114 let growth = fraction(toBigInt(paymentAmount), toBigInt(percentGrowthPrecision), toBigInt(DUCKLINGPRICE))
142115 let currentLevel = getCurrentLevelBigInt(ducklingId)
143116 let newLevel = ((currentLevel - penalty) + growth)
152125
153126
154127 @Callable(i)
155-func configureOracle (oracle) = if ((i.caller != this))
156- then throw("admin only")
157- else [StringEntry("static_oracleAddress", oracle)]
128+func issueFreeDuckling (address,txIdStr) = throw("Paused")
158129
159130
160131
161132 @Callable(i)
162-func issueFreeDuckling (address,txIdStr,percentage) = if (if ((i.caller != this))
163- then (i.caller != getRebirthAddress())
164- else false)
165- then throw("You can't issue free duckling")
166- else {
167- let asset = Issue("BABY-11111111-GZ", "", 1, 0, false, unit, height)
168- let assetId = calculateAssetId(asset)
169- $Tuple2([StringEntry((((address + "_") + txIdStr) + "_di"), toBase58String(assetId)), IntegerEntry("stats_amount", (tryGetInteger("stats_amount") + 1)), BooleanEntry((("duckling_" + toBase58String(assetId)) + "_issuedByFeedCall"), (i.caller == this)), IntegerEntry(keyStartPercentage(toBase58String(assetId)), percentage), asset, ScriptTransfer(value(addressFromString(address)), 1, assetId)], toBase58String(assetId))
170- }
133+func feedDuckling (ducklingId,backendSignature,maxFeedAmount,userNonce) = throw("Paused")
171134
172135
173136
174137 @Callable(i)
175-func feedDuckling (ducklingId,backendSignature,maxFeedAmount,userNonce) = {
176- let addressString = toString(i.caller)
177- let backendProof = getBackendProof(maxFeedAmount, userNonce, addressString)
178- let kAddressNonce = keyAddressNonce(addressString)
179- let currentNonce = tryGetInteger(kAddressNonce)
180- let realDucklingId = if (!(sigVerify_8Kb(toBytes(backendProof), fromBase58String(backendSignature), backendPubKey)))
181- then throw("Invalid proof from backend")
182- else if (if ((size(i.payments) != 1))
183- then true
184- else (value(i.payments[0]).assetId != getEggAssetId()))
185- then throw("Bad payment attached (asset[s] or amount)")
186- else if (getBool(keyDucklingGrown(ducklingId)))
187- then throw("Duckling is already grown")
188- else if ((userNonce != (currentNonce + 1)))
189- then throw(((("User Nonce should be " + toString(currentNonce)) + " + 1, while received ") + toString(userNonce)))
190- else if ((ducklingId == ""))
191- then {
192- let ducklingAssetId = invoke(this, "issueFreeDuckling", [toString(i.originCaller), toBase58String(i.transactionId), 0], nil)
193- if ((ducklingAssetId == ducklingAssetId))
194- then {
195- let id = match ducklingAssetId {
196- case v: String =>
197- v
198- case _ =>
199- throw("Can't generate NFT")
200- }
201- id
202- }
203- else throw("Strict value is not equal to itself.")
204- }
205- else {
206- let ducklingIdCheck = value(assetInfo(fromBase58String(ducklingId)))
207- if ((assetBalance(i.caller, ducklingIdCheck.id) != 1))
208- then throw("You're not the owner of the duckling")
209- else if ((ducklingIdCheck.issuer != this))
210- then throw("Cant find duckling with such id")
211- else {
212- let ducklingIdString = toBase58String(ducklingIdCheck.id)
213- ducklingIdString
214- }
215- }
216- let kDucklingLastFedTs = keyDucklingFedLastTimestamp(ducklingId)
217- let lastFedTs = getLastFedTimestamp(realDucklingId)
218- let currentPayment = value(i.payments[0]).amount
219- let kNewLevel = keyDucklingLevel(realDucklingId)
220- let kTotalFeed = keyTotalFeed(realDucklingId)
221- let totalFeed = tryGetInteger(kTotalFeed)
222- let kFeedTxStats = ((("duckling_" + realDucklingId) + "_stat_") + toString(lastBlock.timestamp))
223- let kAddressFedTimestamp = keyAddressFedTimestamp(addressString, getCurrentLap(), lastBlock.timestamp)
224- let kDucklingFedLapTimestamp = keyDucklingFedLapTimestamp(realDucklingId, getCurrentLap())
225- let kDucklingFedLap = keyDucklingFedLap(realDucklingId)
226- if ((currentPayment > maxFeedAmount))
227- then throw(("Cannot feed duckling for such amount, max feed amount is: " + toString(maxFeedAmount)))
228- else {
229- let calculateResults = calculateNewDucklingLevel(realDucklingId, currentPayment)
230-[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, ";"))]
231- }
232- }
233-
234-
235-
236-@Callable(i)
237-func fixLevels (ducklingIds) = if (if ((i.callerPublicKey != base58'GDxBbsDRmeY39quNrDsTXKJzFWbQVtjxHseF4ikxZ7n9'))
238- then (i.caller != this)
239- else false)
240- then throw("BFL: Not authorized")
241- else {
242- let ducklingIdsList = value(split(ducklingIds, ","))
243- func handleId (acc,id) = {
244- let kTotalFeed = keyTotalFeed(id)
245- let totalFeed = tryGetInteger(kTotalFeed)
246- let kNewLevel = keyDucklingLevel(id)
247- let startingLevel = match getBoolean((("duckling_" + id) + "_issuedByFeedCall")) {
248- case b: Boolean =>
249- if ((b == true))
250- then toBigInt(0)
251- else getDucklingPercentage(id)
252- case _ =>
253- getDucklingPercentage(id)
254- }
255- let growth = fraction(toBigInt(totalFeed), toBigInt(percentGrowthPrecision), toBigInt(DUCKLINGPRICE))
256- (acc ++ [StringEntry(kNewLevel, toString((startingLevel + growth)))])
257- }
258-
259- let $l = ducklingIdsList
260- let $s = size($l)
261- let $acc0 = nil
262- func $f0_1 ($a,$i) = if (($i >= $s))
263- then $a
264- else handleId($a, $l[$i])
265-
266- func $f0_2 ($a,$i) = if (($i >= $s))
267- then $a
268- else throw("List size exceeds 20")
269-
270- $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)
271- }
272-
273-
274-
275-@Callable(i)
276-func turnDucklingIntoDuck () = {
277- let address = toString(i.caller)
278- let txId = toBase58String(i.transactionId)
279- let lastIssuedDucklingTs = tryGetInteger(KGlobalIssuedTimestamp)
280- let fiveMinInMs = ((60 * 60) * 1000)
281- if (if ((lastIssuedDucklingTs > 0))
282- then (fiveMinInMs > (lastBlock.timestamp - lastIssuedDucklingTs))
283- else false)
284- then throw(("Can issue ducklings only once per 5 minutes, please wait for " + toString((fiveMinInMs - (lastBlock.timestamp - lastIssuedDucklingTs)))))
285- else if ((size(i.payments) != 1))
286- then throw("Bad payment attached (asset[s] or amount)")
287- else {
288- let pmt = value(assetInfo(value(value(i.payments[0]).assetId)))
289- if ((toBigInt(100) > getCurrentLevelBigInt(toBase58String(pmt.id))))
290- then throw("Duckling is not grown yet...")
291- else if ((pmt.issuer != this))
292- then throw("Can use only ducklings from this dApp")
293- else {
294- let call = invoke(getIncubatorAddress(), "startDuckHatching", [""], nil)
295- if ((call == call))
296- then {
297- let kDucklingGrown = keyDucklingGrown(toBase58String(pmt.id))
298-[BooleanEntry(kDucklingGrown, true), IntegerEntry(KGlobalIssuedTimestamp, lastBlock.timestamp)]
299- }
300- else throw("Strict value is not equal to itself.")
301- }
302- }
303- }
138+func turnDucklingIntoDuck () = throw("Paused")
304139
305140
306141 @Verifier(tx)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-func tryGetStringExternal (address,key) = match getString(address, key) {
5- case a: String =>
6- a
7- case _ =>
8- ""
9-}
4+let rebirthAddress = base58'3PCC6fVHNa6289DTDmcUo3RuLaFmteZZsmQ'
105
11-
12-func tryGetString (key) = tryGetStringExternal(this, key)
13-
14-
15-func getOracle () = Address(fromBase58String(tryGetString("static_oracleAddress")))
16-
17-
18-func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), "static_eggAssetId"))
19-
20-
21-func getRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_rebirthAddress")))
22-
23-
24-func getIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_incubatorAddress")))
25-
6+let incubatorAddress = base58'3PEktVux2RhchSN63DsDo4b4mz4QqzKSeDv'
267
278 let backendPubKey = base58'BmKAXRQy7jZm44fa1YxNQDTcAwNSb74EpQwP5CT7UHdV'
289
2910 let STARTTIMESTAMP = 1632474000000
3011
3112 let LAPLENGTH = 21600000
13+
14+let EGGASSETID = base58'C1iWsKGqLwjHUndiQ7iXpdmPum9PeCDFfyXBdJJosDRS'
3215
3316 let DUCKLINGPRICE = 80000000
3417
3518 let percentGrowthPrecision = 10000000000000000
3619
3720 let existingDuckPrecision = 100000000000000
3821
3922 let KGlobalIssuedTimestamp = "global_issued_timestamp"
4023
4124 let MSINDAY = 86400000
4225
4326 func keyTotalFeed (ducklingId) = (("duckling_" + ducklingId) + "_feed")
4427
4528
4629 func keyDucklingFedLap (ducklingId) = (("duckling_" + ducklingId) + "_fedLap")
4730
4831
4932 func keyDucklingFedTimestamp (ducklingId) = (("duckling_" + ducklingId) + "_fedTs")
5033
5134
5235 func keyDucklingFedLapTimestamp (ducklingId,lap) = (((("duckling_" + ducklingId) + "_lap_") + toString(lap)) + "_fedTs")
5336
5437
5538 func keyAddressFedTimestamp (address,lap,timestamp) = ((((("address_" + address) + "_lap_") + toString(lap)) + "_fedTs_") + toString(timestamp))
5639
5740
5841 func keyAddressNonce (address) = (("address_" + address) + "_nonce")
5942
6043
6144 func keyDucklingFedLastTimestamp (ducklingId) = (("duckling_" + ducklingId) + "_fedLastTs")
6245
6346
6447 func keyDucklingLevel (ducklingId) = (("duckling_" + ducklingId) + "_level")
6548
6649
6750 func keyFeedForLap (address,lap) = (((("address_" + address) + "_lap_") + toString(lap)) + "_feed")
6851
6952
7053 func keyDucklingGrown (ducklingId) = (("duckling_" + ducklingId) + "_grown")
7154
7255
7356 func keyStartHatchingId (ducklingId) = (("duckling_" + ducklingId) + "_grown")
7457
7558
76-func keyStartPercentage (ducklingId) = (("duckling_" + ducklingId) + "_startPercentage")
77-
78-
7959 func tryGetInteger (key) = {
8060 let val = match getInteger(this, key) {
8161 case b: Int =>
8262 b
8363 case _ =>
8464 0
8565 }
8666 val
8767 }
8868
8969
9070 func getBool (key) = match getBoolean(this, key) {
9171 case b: Boolean =>
9272 b
9373 case _ =>
9474 false
9575 }
9676
9777
98-func getDucklingPercentage (ducklingId) = {
99- let percentageDuckling = tryGetInteger(keyStartPercentage(ducklingId))
100- let base = if ((percentageDuckling != 0))
101- then percentageDuckling
102- else 20
103- toBigInt((base * existingDuckPrecision))
104- }
105-
106-
10778 func getCurrentLevelBigInt (ducklingId) = {
10879 let kDuckLevel = keyDucklingLevel(ducklingId)
10980 match getString(kDuckLevel) {
11081 case s: String =>
11182 parseBigIntValue(s)
11283 case _ =>
11384 match getBoolean((("duckling_" + ducklingId) + "_issuedByFeedCall")) {
11485 case b: Boolean =>
115- if ((b == true))
116- then toBigInt(0)
117- else getDucklingPercentage(ducklingId)
86+ toBigInt(0)
11887 case _ =>
119- getDucklingPercentage(ducklingId)
88+ toBigInt((20 * existingDuckPrecision))
12089 }
12190 }
12291 }
12392
12493
12594 func getCurrentLap () = (((lastBlock.timestamp - STARTTIMESTAMP) / LAPLENGTH) + 1)
12695
12796
12897 func getLastFedTimestamp (ducklingId) = {
12998 let lastFedTimestamp = tryGetInteger(keyDucklingFedLastTimestamp(ducklingId))
13099 if ((lastFedTimestamp > 0))
131100 then lastFedTimestamp
132101 else lastBlock.timestamp
133102 }
134103
135104
136105 func calculateNewDucklingLevel (ducklingId,paymentAmount) = {
137106 let currentTs = lastBlock.timestamp
138107 let lastFedTimestampChecked = getLastFedTimestamp(ducklingId)
139108 let fedDiff = (currentTs - lastFedTimestampChecked)
140- let penalty = toBigInt(0)
109+ let penalty = if (if ((fedDiff == 0))
110+ then true
111+ else ((MSINDAY * 2) >= fedDiff))
112+ then toBigInt(0)
113+ else (toBigInt((fedDiff / MSINDAY)) * toBigInt((existingDuckPrecision / 10)))
141114 let growth = fraction(toBigInt(paymentAmount), toBigInt(percentGrowthPrecision), toBigInt(DUCKLINGPRICE))
142115 let currentLevel = getCurrentLevelBigInt(ducklingId)
143116 let newLevel = ((currentLevel - penalty) + growth)
144117 let result = if ((toBigInt(0) > newLevel))
145118 then toString(growth)
146119 else toString(newLevel)
147120 $Tuple2(result, [("currentLevel=" + toString(currentLevel)), ("newLevel=" + toString(newLevel)), ("growth=" + toString(growth)), ("penalty=" + toString(penalty)), ("lastFedTs=" + toString(lastFedTimestampChecked)), ("fedDiff=" + toString(fedDiff))])
148121 }
149122
150123
151124 func getBackendProof (maxFeedAmount,userNonce,address) = makeString([toString(maxFeedAmount), toString(userNonce), address], ";")
152125
153126
154127 @Callable(i)
155-func configureOracle (oracle) = if ((i.caller != this))
156- then throw("admin only")
157- else [StringEntry("static_oracleAddress", oracle)]
128+func issueFreeDuckling (address,txIdStr) = throw("Paused")
158129
159130
160131
161132 @Callable(i)
162-func issueFreeDuckling (address,txIdStr,percentage) = if (if ((i.caller != this))
163- then (i.caller != getRebirthAddress())
164- else false)
165- then throw("You can't issue free duckling")
166- else {
167- let asset = Issue("BABY-11111111-GZ", "", 1, 0, false, unit, height)
168- let assetId = calculateAssetId(asset)
169- $Tuple2([StringEntry((((address + "_") + txIdStr) + "_di"), toBase58String(assetId)), IntegerEntry("stats_amount", (tryGetInteger("stats_amount") + 1)), BooleanEntry((("duckling_" + toBase58String(assetId)) + "_issuedByFeedCall"), (i.caller == this)), IntegerEntry(keyStartPercentage(toBase58String(assetId)), percentage), asset, ScriptTransfer(value(addressFromString(address)), 1, assetId)], toBase58String(assetId))
170- }
133+func feedDuckling (ducklingId,backendSignature,maxFeedAmount,userNonce) = throw("Paused")
171134
172135
173136
174137 @Callable(i)
175-func feedDuckling (ducklingId,backendSignature,maxFeedAmount,userNonce) = {
176- let addressString = toString(i.caller)
177- let backendProof = getBackendProof(maxFeedAmount, userNonce, addressString)
178- let kAddressNonce = keyAddressNonce(addressString)
179- let currentNonce = tryGetInteger(kAddressNonce)
180- let realDucklingId = if (!(sigVerify_8Kb(toBytes(backendProof), fromBase58String(backendSignature), backendPubKey)))
181- then throw("Invalid proof from backend")
182- else if (if ((size(i.payments) != 1))
183- then true
184- else (value(i.payments[0]).assetId != getEggAssetId()))
185- then throw("Bad payment attached (asset[s] or amount)")
186- else if (getBool(keyDucklingGrown(ducklingId)))
187- then throw("Duckling is already grown")
188- else if ((userNonce != (currentNonce + 1)))
189- then throw(((("User Nonce should be " + toString(currentNonce)) + " + 1, while received ") + toString(userNonce)))
190- else if ((ducklingId == ""))
191- then {
192- let ducklingAssetId = invoke(this, "issueFreeDuckling", [toString(i.originCaller), toBase58String(i.transactionId), 0], nil)
193- if ((ducklingAssetId == ducklingAssetId))
194- then {
195- let id = match ducklingAssetId {
196- case v: String =>
197- v
198- case _ =>
199- throw("Can't generate NFT")
200- }
201- id
202- }
203- else throw("Strict value is not equal to itself.")
204- }
205- else {
206- let ducklingIdCheck = value(assetInfo(fromBase58String(ducklingId)))
207- if ((assetBalance(i.caller, ducklingIdCheck.id) != 1))
208- then throw("You're not the owner of the duckling")
209- else if ((ducklingIdCheck.issuer != this))
210- then throw("Cant find duckling with such id")
211- else {
212- let ducklingIdString = toBase58String(ducklingIdCheck.id)
213- ducklingIdString
214- }
215- }
216- let kDucklingLastFedTs = keyDucklingFedLastTimestamp(ducklingId)
217- let lastFedTs = getLastFedTimestamp(realDucklingId)
218- let currentPayment = value(i.payments[0]).amount
219- let kNewLevel = keyDucklingLevel(realDucklingId)
220- let kTotalFeed = keyTotalFeed(realDucklingId)
221- let totalFeed = tryGetInteger(kTotalFeed)
222- let kFeedTxStats = ((("duckling_" + realDucklingId) + "_stat_") + toString(lastBlock.timestamp))
223- let kAddressFedTimestamp = keyAddressFedTimestamp(addressString, getCurrentLap(), lastBlock.timestamp)
224- let kDucklingFedLapTimestamp = keyDucklingFedLapTimestamp(realDucklingId, getCurrentLap())
225- let kDucklingFedLap = keyDucklingFedLap(realDucklingId)
226- if ((currentPayment > maxFeedAmount))
227- then throw(("Cannot feed duckling for such amount, max feed amount is: " + toString(maxFeedAmount)))
228- else {
229- let calculateResults = calculateNewDucklingLevel(realDucklingId, currentPayment)
230-[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, ";"))]
231- }
232- }
233-
234-
235-
236-@Callable(i)
237-func fixLevels (ducklingIds) = if (if ((i.callerPublicKey != base58'GDxBbsDRmeY39quNrDsTXKJzFWbQVtjxHseF4ikxZ7n9'))
238- then (i.caller != this)
239- else false)
240- then throw("BFL: Not authorized")
241- else {
242- let ducklingIdsList = value(split(ducklingIds, ","))
243- func handleId (acc,id) = {
244- let kTotalFeed = keyTotalFeed(id)
245- let totalFeed = tryGetInteger(kTotalFeed)
246- let kNewLevel = keyDucklingLevel(id)
247- let startingLevel = match getBoolean((("duckling_" + id) + "_issuedByFeedCall")) {
248- case b: Boolean =>
249- if ((b == true))
250- then toBigInt(0)
251- else getDucklingPercentage(id)
252- case _ =>
253- getDucklingPercentage(id)
254- }
255- let growth = fraction(toBigInt(totalFeed), toBigInt(percentGrowthPrecision), toBigInt(DUCKLINGPRICE))
256- (acc ++ [StringEntry(kNewLevel, toString((startingLevel + growth)))])
257- }
258-
259- let $l = ducklingIdsList
260- let $s = size($l)
261- let $acc0 = nil
262- func $f0_1 ($a,$i) = if (($i >= $s))
263- then $a
264- else handleId($a, $l[$i])
265-
266- func $f0_2 ($a,$i) = if (($i >= $s))
267- then $a
268- else throw("List size exceeds 20")
269-
270- $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)
271- }
272-
273-
274-
275-@Callable(i)
276-func turnDucklingIntoDuck () = {
277- let address = toString(i.caller)
278- let txId = toBase58String(i.transactionId)
279- let lastIssuedDucklingTs = tryGetInteger(KGlobalIssuedTimestamp)
280- let fiveMinInMs = ((60 * 60) * 1000)
281- if (if ((lastIssuedDucklingTs > 0))
282- then (fiveMinInMs > (lastBlock.timestamp - lastIssuedDucklingTs))
283- else false)
284- then throw(("Can issue ducklings only once per 5 minutes, please wait for " + toString((fiveMinInMs - (lastBlock.timestamp - lastIssuedDucklingTs)))))
285- else if ((size(i.payments) != 1))
286- then throw("Bad payment attached (asset[s] or amount)")
287- else {
288- let pmt = value(assetInfo(value(value(i.payments[0]).assetId)))
289- if ((toBigInt(100) > getCurrentLevelBigInt(toBase58String(pmt.id))))
290- then throw("Duckling is not grown yet...")
291- else if ((pmt.issuer != this))
292- then throw("Can use only ducklings from this dApp")
293- else {
294- let call = invoke(getIncubatorAddress(), "startDuckHatching", [""], nil)
295- if ((call == call))
296- then {
297- let kDucklingGrown = keyDucklingGrown(toBase58String(pmt.id))
298-[BooleanEntry(kDucklingGrown, true), IntegerEntry(KGlobalIssuedTimestamp, lastBlock.timestamp)]
299- }
300- else throw("Strict value is not equal to itself.")
301- }
302- }
303- }
138+func turnDucklingIntoDuck () = throw("Paused")
304139
305140
306141 @Verifier(tx)
307142 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
308143

github/deemru/w8io/6500d08 
45.91 ms