tx · D41fYaLveb5T3jVc2koyTGtsWRfNNHtQLsJZsW7t6zPD

3PKwLVb8jYk58oYbfXxs2dUjD3YEKeqGWrX:  -0.01400000 Waves

2022.06.11 19:18 [3157542] smart account 3PKwLVb8jYk58oYbfXxs2dUjD3YEKeqGWrX > SELF 0.00000000 Waves

{ "type": 13, "id": "D41fYaLveb5T3jVc2koyTGtsWRfNNHtQLsJZsW7t6zPD", "fee": 1400000, "feeAssetId": null, "timestamp": 1654964364077, "version": 2, "chainId": 87, "sender": "3PKwLVb8jYk58oYbfXxs2dUjD3YEKeqGWrX", "senderPublicKey": "27DK15MykfnsVojpifD1gbr8kRr8rpY5mw6EH4zL8R25", "proofs": [ "5XHWDeFfXZQFzoeNCG2osVr1u7Ku7Pd4c5WrBAdzYKKTmAd9GuyoDqkqVAitoHzE8AWzueTwjZJ1gvoWA91MVGyW" ], "script": "base64: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ZHVja2xpbmdJZENoZWNrAAAAAmlkAAAAAAAAAAABCQAAAgAAAAECAAAAJFlvdSdyZSBub3QgdGhlIG93bmVyIG9mIHRoZSBkdWNrbGluZwMJAQAAAAIhPQAAAAIIBQAAAA9kdWNrbGluZ0lkQ2hlY2sAAAAGaXNzdWVyBQAAAAR0aGlzCQAAAgAAAAECAAAAH0NhbnQgZmluZCBkdWNrbGluZyB3aXRoIHN1Y2ggaWQEAAAAEGR1Y2tsaW5nSWRTdHJpbmcJAAJYAAAAAQgFAAAAD2R1Y2tsaW5nSWRDaGVjawAAAAJpZAUAAAAQZHVja2xpbmdJZFN0cmluZwQAAAASa0R1Y2tsaW5nTGFzdEZlZFRzCQEAAAAba2V5RHVja2xpbmdGZWRMYXN0VGltZXN0YW1wAAAAAQUAAAAKZHVja2xpbmdJZAQAAAAJbGFzdEZlZFRzCQEAAAATZ2V0TGFzdEZlZFRpbWVzdGFtcAAAAAEFAAAADnJlYWxEdWNrbGluZ0lkBAAAAA5jdXJyZW50UGF5bWVudAgJAQAAAAV2YWx1ZQAAAAEJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAGYW1vdW50BAAAAAlrTmV3TGV2ZWwJAQAAABBrZXlEdWNrbGluZ0xldmVsAAAAAQUAAAAOcmVhbER1Y2tsaW5nSWQEAAAACmtUb3RhbEZlZWQJAQAAAAxrZXlUb3RhbEZlZWQAAAABBQAAAA5yZWFsRHVja2xpbmdJZAQAAAAJdG90YWxGZWVkCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEFAAAACmtUb3RhbEZlZWQEAAAADGtGZWVkVHhTdGF0cwkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAJZHVja2xpbmdfBQAAAA5yZWFsRHVja2xpbmdJZAIAAAAGX3N0YXRfCQABpAAAAAEIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wBAAAABRrQWRkcmVzc0ZlZFRpbWVzdGFtcAkBAAAAFmtleUFkZHJlc3NGZWRUaW1lc3RhbXAAAAADBQAAAA1hZGRyZXNzU3RyaW5nCQEAAAANZ2V0Q3VycmVudExhcAAAAAAIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wBAAAABhrRHVja2xpbmdGZWRMYXBUaW1lc3RhbXAJAQAAABprZXlEdWNrbGluZ0ZlZExhcFRpbWVzdGFtcAAAAAIFAAAADnJlYWxEdWNrbGluZ0lkCQEAAAANZ2V0Q3VycmVudExhcAAAAAAEAAAAD2tEdWNrbGluZ0ZlZExhcAkBAAAAEWtleUR1Y2tsaW5nRmVkTGFwAAAAAQUAAAAOcmVhbER1Y2tsaW5nSWQDCQAAZgAAAAIFAAAADmN1cnJlbnRQYXltZW50BQAAAA1tYXhGZWVkQW1vdW50CQAAAgAAAAEJAAEsAAAAAgIAAAA6Q2Fubm90IGZlZWQgZHVja2xpbmcgZm9yIHN1Y2ggYW1vdW50LCBtYXggZmVlZCBhbW91bnQgaXM6IAkAAaQAAAABBQAAAA1tYXhGZWVkQW1vdW50BAAAABBjYWxjdWxhdGVSZXN1bHRzCQEAAAAZY2FsY3VsYXRlTmV3RHVja2xpbmdMZXZlbAAAAAIFAAAADnJlYWxEdWNrbGluZ0lkBQAAAA5jdXJyZW50UGF5bWVudAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAANa0FkZHJlc3NOb25jZQkAAGQAAAACBQAAAAxjdXJyZW50Tm9uY2UAAAAAAAAAAAEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAEmtEdWNrbGluZ0xhc3RGZWRUcwgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAACmtUb3RhbEZlZWQJAABkAAAAAgUAAAAJdG90YWxGZWVkBQAAAA5jdXJyZW50UGF5bWVudAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAMa0ZlZWRUeFN0YXRzBQAAAA5jdXJyZW50UGF5bWVudAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAUa0FkZHJlc3NGZWRUaW1lc3RhbXAFAAAADmN1cnJlbnRQYXltZW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABhrRHVja2xpbmdGZWRMYXBUaW1lc3RhbXAFAAAADmN1cnJlbnRQYXltZW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAAC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", "height": 3157542, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: G5YF42gu6PsmSMtZ1tD2Xr2TD5uppwSXCmZH2o9BKkbB Next: HfHPiKyPxxMmqzK4ihsCogm3QDC77kHT4TPyCPjBQaez Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let incubatorAddress = base58'3P6TwNU39Ykkbeqhn5TE4a2736xsA1vXemM'
4+let rebirthAddress = base58'3PCC6fVHNa6289DTDmcUo3RuLaFmteZZsmQ'
55
6-let backendPubKey = base58'BnKJTqkWD69SotKhJXdKu76NRtkdQJEpThqGGeFwF9EL'
6+let incubatorAddress = base58'3PEktVux2RhchSN63DsDo4b4mz4QqzKSeDv'
7+
8+let backendPubKey = base58'BmKAXRQy7jZm44fa1YxNQDTcAwNSb74EpQwP5CT7UHdV'
79
810 let STARTTIMESTAMP = 1632474000000
911
1012 let LAPLENGTH = 21600000
1113
12-let EGGASSETID = base58'3v7zGkeHS6KrsvmTRzEzvCxm5cdzkCtM7z5cM6efcjCB'
14+let EGGASSETID = base58'C1iWsKGqLwjHUndiQ7iXpdmPum9PeCDFfyXBdJJosDRS'
1315
1416 let DUCKLINGPRICE = 80000000
1517
2729 func keyDucklingFedLap (ducklingId) = (("duckling_" + ducklingId) + "_fedLap")
2830
2931
32+func keyDucklingFedTimestamp (ducklingId) = (("duckling_" + ducklingId) + "_fedTs")
33+
34+
3035 func keyDucklingFedLapTimestamp (ducklingId,lap) = (((("duckling_" + ducklingId) + "_lap_") + toString(lap)) + "_fedTs")
3136
3237
4247 func keyDucklingLevel (ducklingId) = (("duckling_" + ducklingId) + "_level")
4348
4449
50+func keyFeedForLap (address,lap) = (((("address_" + address) + "_lap_") + toString(lap)) + "_feed")
51+
52+
4553 func keyDucklingGrown (ducklingId) = (("duckling_" + ducklingId) + "_grown")
54+
55+
56+func keyStartHatchingId (ducklingId) = (("duckling_" + ducklingId) + "_grown")
4657
4758
4859 func tryGetInteger (key) = {
95106 let currentTs = lastBlock.timestamp
96107 let lastFedTimestampChecked = getLastFedTimestamp(ducklingId)
97108 let fedDiff = (currentTs - lastFedTimestampChecked)
98- let penalty = if (if ((fedDiff == 0))
99- then true
100- else ((MSINDAY * 2) >= fedDiff))
101- then toBigInt(0)
102- else (toBigInt((fedDiff / MSINDAY)) * toBigInt((existingDuckPrecision / 10)))
109+ let penalty = toBigInt(0)
103110 let growth = fraction(toBigInt(paymentAmount), toBigInt(percentGrowthPrecision), toBigInt(DUCKLINGPRICE))
104111 let currentLevel = getCurrentLevelBigInt(ducklingId)
105112 let newLevel = ((currentLevel - penalty) + growth)
114121
115122
116123 @Callable(i)
117-func issueFreeDuckling (address,txIdStr) = {
118- let asset = Issue("BABY-11111111-GZ", "", 1, 0, false, unit, height)
119- let assetId = calculateAssetId(asset)
120- $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))
121- }
124+func issueFreeDuckling (address,txIdStr,percentage) = if (if ((i.caller != this))
125+ then (i.caller.bytes != rebirthAddress)
126+ else false)
127+ then throw("You can't issue free duckling")
128+ else {
129+ let asset = Issue("BABY-11111111-GZ", "", 1, 0, false, unit, height)
130+ let assetId = calculateAssetId(asset)
131+ $Tuple2([StringEntry((((address + "_") + txIdStr) + "_di"), toBase58String(assetId)), IntegerEntry("stats_amount", (tryGetInteger("stats_amount") + 1)), BooleanEntry((("duckling_" + toBase58String(assetId)) + "_issuedByFeedCall"), (i.caller == this)), IntegerEntry((("duckling_" + toBase58String(assetId)) + "_startPercentage"), percentage), asset, ScriptTransfer(value(addressFromString(address)), 1, assetId)], toBase58String(assetId))
132+ }
122133
123134
124135
140151 then throw(((("User Nonce should be " + toString(currentNonce)) + " + 1, while received ") + toString(userNonce)))
141152 else if ((ducklingId == ""))
142153 then {
143- let ducklingAssetId = invoke(this, "issueFreeDuckling", [toString(i.originCaller), toBase58String(i.transactionId)], nil)
154+ let ducklingAssetId = invoke(this, "issueFreeDuckling", [toString(i.originCaller), toBase58String(i.transactionId), 0], nil)
144155 if ((ducklingAssetId == ducklingAssetId))
145156 then {
146157 let id = match ducklingAssetId {
195206 let kNewLevel = keyDucklingLevel(id)
196207 let startingLevel = match getBoolean((("duckling_" + id) + "_issuedByFeedCall")) {
197208 case b: Boolean =>
198- toBigInt(0)
209+ if ((b == true))
210+ then toBigInt(0)
211+ else toBigInt((20 * existingDuckPrecision))
199212 case _ =>
200213 toBigInt((20 * existingDuckPrecision))
201214 }
224237 let address = toString(i.caller)
225238 let txId = toBase58String(i.transactionId)
226239 let lastIssuedDucklingTs = tryGetInteger(KGlobalIssuedTimestamp)
227- let fiveMinInMs = ((5 * 60) * 1000)
240+ let fiveMinInMs = ((60 * 60) * 1000)
228241 if (if ((lastIssuedDucklingTs > 0))
229242 then (fiveMinInMs > (lastBlock.timestamp - lastIssuedDucklingTs))
230243 else false)
233246 then throw("Bad payment attached (asset[s] or amount)")
234247 else {
235248 let pmt = value(assetInfo(value(value(i.payments[0]).assetId)))
236- if ((pmt.issuer != this))
237- then throw("Can use only ducklings from this dApp")
238- else {
239- let call = invoke(Address(incubatorAddress), "startDuckHatching", [""], nil)
240- if ((call == call))
241- then {
242- let kDucklingGrown = keyDucklingGrown(toBase58String(pmt.id))
249+ if ((toBigInt(100) > getCurrentLevelBigInt(toBase58String(pmt.id))))
250+ then throw("Duckling is not grown yet...")
251+ else if ((pmt.issuer != this))
252+ then throw("Can use only ducklings from this dApp")
253+ else {
254+ let call = invoke(Address(incubatorAddress), "startDuckHatching", [""], nil)
255+ if ((call == call))
256+ then {
257+ let kDucklingGrown = keyDucklingGrown(toBase58String(pmt.id))
243258 [BooleanEntry(kDucklingGrown, true), IntegerEntry(KGlobalIssuedTimestamp, lastBlock.timestamp)]
244- }
245- else throw("Strict value is not equal to itself.")
246- }
259+ }
260+ else throw("Strict value is not equal to itself.")
261+ }
247262 }
248263 }
249264
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let incubatorAddress = base58'3P6TwNU39Ykkbeqhn5TE4a2736xsA1vXemM'
4+let rebirthAddress = base58'3PCC6fVHNa6289DTDmcUo3RuLaFmteZZsmQ'
55
6-let backendPubKey = base58'BnKJTqkWD69SotKhJXdKu76NRtkdQJEpThqGGeFwF9EL'
6+let incubatorAddress = base58'3PEktVux2RhchSN63DsDo4b4mz4QqzKSeDv'
7+
8+let backendPubKey = base58'BmKAXRQy7jZm44fa1YxNQDTcAwNSb74EpQwP5CT7UHdV'
79
810 let STARTTIMESTAMP = 1632474000000
911
1012 let LAPLENGTH = 21600000
1113
12-let EGGASSETID = base58'3v7zGkeHS6KrsvmTRzEzvCxm5cdzkCtM7z5cM6efcjCB'
14+let EGGASSETID = base58'C1iWsKGqLwjHUndiQ7iXpdmPum9PeCDFfyXBdJJosDRS'
1315
1416 let DUCKLINGPRICE = 80000000
1517
1618 let percentGrowthPrecision = 10000000000000000
1719
1820 let existingDuckPrecision = 100000000000000
1921
2022 let KGlobalIssuedTimestamp = "global_issued_timestamp"
2123
2224 let MSINDAY = 86400000
2325
2426 func keyTotalFeed (ducklingId) = (("duckling_" + ducklingId) + "_feed")
2527
2628
2729 func keyDucklingFedLap (ducklingId) = (("duckling_" + ducklingId) + "_fedLap")
2830
2931
32+func keyDucklingFedTimestamp (ducklingId) = (("duckling_" + ducklingId) + "_fedTs")
33+
34+
3035 func keyDucklingFedLapTimestamp (ducklingId,lap) = (((("duckling_" + ducklingId) + "_lap_") + toString(lap)) + "_fedTs")
3136
3237
3338 func keyAddressFedTimestamp (address,lap,timestamp) = ((((("address_" + address) + "_lap_") + toString(lap)) + "_fedTs_") + toString(timestamp))
3439
3540
3641 func keyAddressNonce (address) = (("address_" + address) + "_nonce")
3742
3843
3944 func keyDucklingFedLastTimestamp (ducklingId) = (("duckling_" + ducklingId) + "_fedLastTs")
4045
4146
4247 func keyDucklingLevel (ducklingId) = (("duckling_" + ducklingId) + "_level")
4348
4449
50+func keyFeedForLap (address,lap) = (((("address_" + address) + "_lap_") + toString(lap)) + "_feed")
51+
52+
4553 func keyDucklingGrown (ducklingId) = (("duckling_" + ducklingId) + "_grown")
54+
55+
56+func keyStartHatchingId (ducklingId) = (("duckling_" + ducklingId) + "_grown")
4657
4758
4859 func tryGetInteger (key) = {
4960 let val = match getInteger(this, key) {
5061 case b: Int =>
5162 b
5263 case _ =>
5364 0
5465 }
5566 val
5667 }
5768
5869
5970 func getBool (key) = match getBoolean(this, key) {
6071 case b: Boolean =>
6172 b
6273 case _ =>
6374 false
6475 }
6576
6677
6778 func getCurrentLevelBigInt (ducklingId) = {
6879 let kDuckLevel = keyDucklingLevel(ducklingId)
6980 match getString(kDuckLevel) {
7081 case s: String =>
7182 parseBigIntValue(s)
7283 case _ =>
7384 match getBoolean((("duckling_" + ducklingId) + "_issuedByFeedCall")) {
7485 case b: Boolean =>
7586 toBigInt(0)
7687 case _ =>
7788 toBigInt((20 * existingDuckPrecision))
7889 }
7990 }
8091 }
8192
8293
8394 func getCurrentLap () = (((lastBlock.timestamp - STARTTIMESTAMP) / LAPLENGTH) + 1)
8495
8596
8697 func getLastFedTimestamp (ducklingId) = {
8798 let lastFedTimestamp = tryGetInteger(keyDucklingFedLastTimestamp(ducklingId))
8899 if ((lastFedTimestamp > 0))
89100 then lastFedTimestamp
90101 else lastBlock.timestamp
91102 }
92103
93104
94105 func calculateNewDucklingLevel (ducklingId,paymentAmount) = {
95106 let currentTs = lastBlock.timestamp
96107 let lastFedTimestampChecked = getLastFedTimestamp(ducklingId)
97108 let fedDiff = (currentTs - lastFedTimestampChecked)
98- let penalty = if (if ((fedDiff == 0))
99- then true
100- else ((MSINDAY * 2) >= fedDiff))
101- then toBigInt(0)
102- else (toBigInt((fedDiff / MSINDAY)) * toBigInt((existingDuckPrecision / 10)))
109+ let penalty = toBigInt(0)
103110 let growth = fraction(toBigInt(paymentAmount), toBigInt(percentGrowthPrecision), toBigInt(DUCKLINGPRICE))
104111 let currentLevel = getCurrentLevelBigInt(ducklingId)
105112 let newLevel = ((currentLevel - penalty) + growth)
106113 let result = if ((toBigInt(0) > newLevel))
107114 then toString(growth)
108115 else toString(newLevel)
109116 $Tuple2(result, [("currentLevel=" + toString(currentLevel)), ("newLevel=" + toString(newLevel)), ("growth=" + toString(growth)), ("penalty=" + toString(penalty)), ("lastFedTs=" + toString(lastFedTimestampChecked)), ("fedDiff=" + toString(fedDiff))])
110117 }
111118
112119
113120 func getBackendProof (maxFeedAmount,userNonce,address) = makeString([toString(maxFeedAmount), toString(userNonce), address], ";")
114121
115122
116123 @Callable(i)
117-func issueFreeDuckling (address,txIdStr) = {
118- let asset = Issue("BABY-11111111-GZ", "", 1, 0, false, unit, height)
119- let assetId = calculateAssetId(asset)
120- $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))
121- }
124+func issueFreeDuckling (address,txIdStr,percentage) = if (if ((i.caller != this))
125+ then (i.caller.bytes != rebirthAddress)
126+ else false)
127+ then throw("You can't issue free duckling")
128+ else {
129+ let asset = Issue("BABY-11111111-GZ", "", 1, 0, false, unit, height)
130+ let assetId = calculateAssetId(asset)
131+ $Tuple2([StringEntry((((address + "_") + txIdStr) + "_di"), toBase58String(assetId)), IntegerEntry("stats_amount", (tryGetInteger("stats_amount") + 1)), BooleanEntry((("duckling_" + toBase58String(assetId)) + "_issuedByFeedCall"), (i.caller == this)), IntegerEntry((("duckling_" + toBase58String(assetId)) + "_startPercentage"), percentage), asset, ScriptTransfer(value(addressFromString(address)), 1, assetId)], toBase58String(assetId))
132+ }
122133
123134
124135
125136 @Callable(i)
126137 func feedDuckling (ducklingId,backendSignature,maxFeedAmount,userNonce) = {
127138 let addressString = toString(i.caller)
128139 let backendProof = getBackendProof(maxFeedAmount, userNonce, addressString)
129140 let kAddressNonce = keyAddressNonce(addressString)
130141 let currentNonce = tryGetInteger(kAddressNonce)
131142 let realDucklingId = if (!(sigVerify_8Kb(toBytes(backendProof), fromBase58String(backendSignature), backendPubKey)))
132143 then throw("Invalid proof from backend")
133144 else if (if ((size(i.payments) != 1))
134145 then true
135146 else (value(i.payments[0]).assetId != EGGASSETID))
136147 then throw("Bad payment attached (asset[s] or amount)")
137148 else if (getBool(keyDucklingGrown(ducklingId)))
138149 then throw("Duckling is already grown")
139150 else if ((userNonce != (currentNonce + 1)))
140151 then throw(((("User Nonce should be " + toString(currentNonce)) + " + 1, while received ") + toString(userNonce)))
141152 else if ((ducklingId == ""))
142153 then {
143- let ducklingAssetId = invoke(this, "issueFreeDuckling", [toString(i.originCaller), toBase58String(i.transactionId)], nil)
154+ let ducklingAssetId = invoke(this, "issueFreeDuckling", [toString(i.originCaller), toBase58String(i.transactionId), 0], nil)
144155 if ((ducklingAssetId == ducklingAssetId))
145156 then {
146157 let id = match ducklingAssetId {
147158 case v: String =>
148159 v
149160 case _ =>
150161 throw("Can't generate NFT")
151162 }
152163 id
153164 }
154165 else throw("Strict value is not equal to itself.")
155166 }
156167 else {
157168 let ducklingIdCheck = value(assetInfo(fromBase58String(ducklingId)))
158169 if ((assetBalance(i.caller, ducklingIdCheck.id) != 1))
159170 then throw("You're not the owner of the duckling")
160171 else if ((ducklingIdCheck.issuer != this))
161172 then throw("Cant find duckling with such id")
162173 else {
163174 let ducklingIdString = toBase58String(ducklingIdCheck.id)
164175 ducklingIdString
165176 }
166177 }
167178 let kDucklingLastFedTs = keyDucklingFedLastTimestamp(ducklingId)
168179 let lastFedTs = getLastFedTimestamp(realDucklingId)
169180 let currentPayment = value(i.payments[0]).amount
170181 let kNewLevel = keyDucklingLevel(realDucklingId)
171182 let kTotalFeed = keyTotalFeed(realDucklingId)
172183 let totalFeed = tryGetInteger(kTotalFeed)
173184 let kFeedTxStats = ((("duckling_" + realDucklingId) + "_stat_") + toString(lastBlock.timestamp))
174185 let kAddressFedTimestamp = keyAddressFedTimestamp(addressString, getCurrentLap(), lastBlock.timestamp)
175186 let kDucklingFedLapTimestamp = keyDucklingFedLapTimestamp(realDucklingId, getCurrentLap())
176187 let kDucklingFedLap = keyDucklingFedLap(realDucklingId)
177188 if ((currentPayment > maxFeedAmount))
178189 then throw(("Cannot feed duckling for such amount, max feed amount is: " + toString(maxFeedAmount)))
179190 else {
180191 let calculateResults = calculateNewDucklingLevel(realDucklingId, currentPayment)
181192 [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, ";"))]
182193 }
183194 }
184195
185196
186197
187198 @Callable(i)
188199 func fixLevels (ducklingIds) = if ((i.callerPublicKey != base58'GDxBbsDRmeY39quNrDsTXKJzFWbQVtjxHseF4ikxZ7n9'))
189200 then throw("")
190201 else {
191202 let ducklingIdsList = value(split(ducklingIds, ","))
192203 func handleId (acc,id) = {
193204 let kTotalFeed = keyTotalFeed(id)
194205 let totalFeed = tryGetInteger(kTotalFeed)
195206 let kNewLevel = keyDucklingLevel(id)
196207 let startingLevel = match getBoolean((("duckling_" + id) + "_issuedByFeedCall")) {
197208 case b: Boolean =>
198- toBigInt(0)
209+ if ((b == true))
210+ then toBigInt(0)
211+ else toBigInt((20 * existingDuckPrecision))
199212 case _ =>
200213 toBigInt((20 * existingDuckPrecision))
201214 }
202215 let growth = fraction(toBigInt(totalFeed), toBigInt(percentGrowthPrecision), toBigInt(DUCKLINGPRICE))
203216 (acc ++ [StringEntry(kNewLevel, toString((startingLevel + growth)))])
204217 }
205218
206219 let $l = ducklingIdsList
207220 let $s = size($l)
208221 let $acc0 = nil
209222 func $f0_1 ($a,$i) = if (($i >= $s))
210223 then $a
211224 else handleId($a, $l[$i])
212225
213226 func $f0_2 ($a,$i) = if (($i >= $s))
214227 then $a
215228 else throw("List size exceeds 20")
216229
217230 $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)
218231 }
219232
220233
221234
222235 @Callable(i)
223236 func turnDucklingIntoDuck () = {
224237 let address = toString(i.caller)
225238 let txId = toBase58String(i.transactionId)
226239 let lastIssuedDucklingTs = tryGetInteger(KGlobalIssuedTimestamp)
227- let fiveMinInMs = ((5 * 60) * 1000)
240+ let fiveMinInMs = ((60 * 60) * 1000)
228241 if (if ((lastIssuedDucklingTs > 0))
229242 then (fiveMinInMs > (lastBlock.timestamp - lastIssuedDucklingTs))
230243 else false)
231244 then throw(("Can issue ducklings only once per 5 minutes, please wait for " + toString((fiveMinInMs - (lastBlock.timestamp - lastIssuedDucklingTs)))))
232245 else if ((size(i.payments) != 1))
233246 then throw("Bad payment attached (asset[s] or amount)")
234247 else {
235248 let pmt = value(assetInfo(value(value(i.payments[0]).assetId)))
236- if ((pmt.issuer != this))
237- then throw("Can use only ducklings from this dApp")
238- else {
239- let call = invoke(Address(incubatorAddress), "startDuckHatching", [""], nil)
240- if ((call == call))
241- then {
242- let kDucklingGrown = keyDucklingGrown(toBase58String(pmt.id))
249+ if ((toBigInt(100) > getCurrentLevelBigInt(toBase58String(pmt.id))))
250+ then throw("Duckling is not grown yet...")
251+ else if ((pmt.issuer != this))
252+ then throw("Can use only ducklings from this dApp")
253+ else {
254+ let call = invoke(Address(incubatorAddress), "startDuckHatching", [""], nil)
255+ if ((call == call))
256+ then {
257+ let kDucklingGrown = keyDucklingGrown(toBase58String(pmt.id))
243258 [BooleanEntry(kDucklingGrown, true), IntegerEntry(KGlobalIssuedTimestamp, lastBlock.timestamp)]
244- }
245- else throw("Strict value is not equal to itself.")
246- }
259+ }
260+ else throw("Strict value is not equal to itself.")
261+ }
247262 }
248263 }
249264
250265
251266 @Verifier(tx)
252267 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
253268

github/deemru/w8io/3ef1775 
75.16 ms