tx · HfHPiKyPxxMmqzK4ihsCogm3QDC77kHT4TPyCPjBQaez 3PKwLVb8jYk58oYbfXxs2dUjD3YEKeqGWrX: -0.01400000 Waves 2022.06.11 19:41 [3157565] smart account 3PKwLVb8jYk58oYbfXxs2dUjD3YEKeqGWrX > SELF 0.00000000 Waves
{ "type": 13, "id": "HfHPiKyPxxMmqzK4ihsCogm3QDC77kHT4TPyCPjBQaez", "fee": 1400000, "feeAssetId": null, "timestamp": 1654965721599, "version": 2, "chainId": 87, "sender": "3PKwLVb8jYk58oYbfXxs2dUjD3YEKeqGWrX", "senderPublicKey": "27DK15MykfnsVojpifD1gbr8kRr8rpY5mw6EH4zL8R25", "proofs": [ "5kmx1vWWyzHJCPwXzTAEeB9sXZ9gR11WWXuFQJ3SNCRZDvjwxJgEcEZS7EW5E1tttexyFfmr8m9Nn24affjaYrLt" ], "script": "base64:AAIFAAAAAAAAAB0IAhIDCgEIEgUKAwgIARIGCgQICAEBEgMKAQgSAAAAACABAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgAAAAdhZGRyZXNzAAAAA2tleQQAAAAHJG1hdGNoMAkABB0AAAACBQAAAAdhZGRyZXNzBQAAAANrZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQIAAAAAAQAAAAx0cnlHZXRTdHJpbmcAAAABAAAAA2tleQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgUAAAAEdGhpcwUAAAADa2V5AQAAAAlnZXRPcmFjbGUAAAAACQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQkBAAAADHRyeUdldFN0cmluZwAAAAECAAAAFHN0YXRpY19vcmFjbGVBZGRyZXNzAQAAAA1nZXRFZ2dBc3NldElkAAAAAAkAAlkAAAABCQEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACCQEAAAAJZ2V0T3JhY2xlAAAAAAIAAAARc3RhdGljX2VnZ0Fzc2V0SWQBAAAAEWdldFJlYmlydGhBZGRyZXNzAAAAAAkBAAAAB0FkZHJlc3MAAAABCQACWQAAAAEJAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIJAQAAAAlnZXRPcmFjbGUAAAAAAgAAABVzdGF0aWNfcmViaXJ0aEFkZHJlc3MBAAAAE2dldEluY3ViYXRvckFkZHJlc3MAAAAACQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAACAAAAF3N0YXRpY19pbmN1YmF0b3JBZGRyZXNzAAAAAA1iYWNrZW5kUHViS2V5AQAAACCf7vaUt+AJS9sVtSQ4zwau7SC/xOobnnBsYkl08mziHAAAAAAOU1RBUlRUSU1FU1RBTVAAAAABfBcIaoAAAAAACUxBUExFTkdUSAAAAAAAAUmXAAAAAAANRFVDS0xJTkdQUklDRQAAAAAABMS0AAAAAAAWcGVyY2VudEdyb3d0aFByZWNpc2lvbgAAI4byb8EAAAAAAAAVZXhpc3RpbmdEdWNrUHJlY2lzaW9uAAAAWvMQekAAAAAAABZLR2xvYmFsSXNzdWVkVGltZXN0YW1wAgAAABdnbG9iYWxfaXNzdWVkX3RpbWVzdGFtcAAAAAAHTVNJTkRBWQAAAAAABSZcAAEAAAAMa2V5VG90YWxGZWVkAAAAAQAAAApkdWNrbGluZ0lkCQABLAAAAAIJAAEsAAAAAgIAAAAJZHVja2xpbmdfBQAAAApkdWNrbGluZ0lkAgAAAAVfZmVlZAEAAAARa2V5RHVja2xpbmdGZWRMYXAAAAABAAAACmR1Y2tsaW5nSWQJAAEsAAAAAgkAASwAAAACAgAAAAlkdWNrbGluZ18FAAAACmR1Y2tsaW5nSWQCAAAAB19mZWRMYXABAAAAF2tleUR1Y2tsaW5nRmVkVGltZXN0YW1wAAAAAQAAAApkdWNrbGluZ0lkCQABLAAAAAIJAAEsAAAAAgIAAAAJZHVja2xpbmdfBQAAAApkdWNrbGluZ0lkAgAAAAZfZmVkVHMBAAAAGmtleUR1Y2tsaW5nRmVkTGFwVGltZXN0YW1wAAAAAgAAAApkdWNrbGluZ0lkAAAAA2xhcAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAlkdWNrbGluZ18FAAAACmR1Y2tsaW5nSWQCAAAABV9sYXBfCQABpAAAAAEFAAAAA2xhcAIAAAAGX2ZlZFRzAQAAABZrZXlBZGRyZXNzRmVkVGltZXN0YW1wAAAAAwAAAAdhZGRyZXNzAAAAA2xhcAAAAAl0aW1lc3RhbXAJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAhhZGRyZXNzXwUAAAAHYWRkcmVzcwIAAAAFX2xhcF8JAAGkAAAAAQUAAAADbGFwAgAAAAdfZmVkVHNfCQABpAAAAAEFAAAACXRpbWVzdGFtcAEAAAAPa2V5QWRkcmVzc05vbmNlAAAAAQAAAAdhZGRyZXNzCQABLAAAAAIJAAEsAAAAAgIAAAAIYWRkcmVzc18FAAAAB2FkZHJlc3MCAAAABl9ub25jZQEAAAAba2V5RHVja2xpbmdGZWRMYXN0VGltZXN0YW1wAAAAAQAAAApkdWNrbGluZ0lkCQABLAAAAAIJAAEsAAAAAgIAAAAJZHVja2xpbmdfBQAAAApkdWNrbGluZ0lkAgAAAApfZmVkTGFzdFRzAQAAABBrZXlEdWNrbGluZ0xldmVsAAAAAQAAAApkdWNrbGluZ0lkCQABLAAAAAIJAAEsAAAAAgIAAAAJZHVja2xpbmdfBQAAAApkdWNrbGluZ0lkAgAAAAZfbGV2ZWwBAAAADWtleUZlZWRGb3JMYXAAAAACAAAAB2FkZHJlc3MAAAADbGFwCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACGFkZHJlc3NfBQAAAAdhZGRyZXNzAgAAAAVfbGFwXwkAAaQAAAABBQAAAANsYXACAAAABV9mZWVkAQAAABBrZXlEdWNrbGluZ0dyb3duAAAAAQAAAApkdWNrbGluZ0lkCQABLAAAAAIJAAEsAAAAAgIAAAAJZHVja2xpbmdfBQAAAApkdWNrbGluZ0lkAgAAAAZfZ3Jvd24BAAAAEmtleVN0YXJ0SGF0Y2hpbmdJZAAAAAEAAAAKZHVja2xpbmdJZAkAASwAAAACCQABLAAAAAICAAAACWR1Y2tsaW5nXwUAAAAKZHVja2xpbmdJZAIAAAAGX2dyb3duAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQAAAANrZXkEAAAAA3ZhbAQAAAAHJG1hdGNoMAkABBoAAAACBQAAAAR0aGlzBQAAAANrZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABYgUAAAAHJG1hdGNoMAUAAAABYgAAAAAAAAAAAAUAAAADdmFsAQAAAAdnZXRCb29sAAAAAQAAAANrZXkEAAAAByRtYXRjaDAJAAQbAAAAAgUAAAAEdGhpcwUAAAADa2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAdCb29sZWFuBAAAAAFiBQAAAAckbWF0Y2gwBQAAAAFiBwEAAAAVZ2V0Q3VycmVudExldmVsQmlnSW50AAAAAQAAAApkdWNrbGluZ0lkBAAAAAprRHVja0xldmVsCQEAAAAQa2V5RHVja2xpbmdMZXZlbAAAAAEFAAAACmR1Y2tsaW5nSWQEAAAAByRtYXRjaDAJAAQiAAAAAQUAAAAKa0R1Y2tMZXZlbAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFzBQAAAAckbWF0Y2gwCQABpwAAAAEFAAAAAXMEAAAAByRtYXRjaDEJAAQgAAAAAQkAASwAAAACCQABLAAAAAICAAAACWR1Y2tsaW5nXwUAAAAKZHVja2xpbmdJZAIAAAARX2lzc3VlZEJ5RmVlZENhbGwDCQAAAQAAAAIFAAAAByRtYXRjaDECAAAAB0Jvb2xlYW4EAAAAAWIFAAAAByRtYXRjaDEJAAE2AAAAAQAAAAAAAAAAAAkAATYAAAABCQAAaAAAAAIAAAAAAAAAABQFAAAAFWV4aXN0aW5nRHVja1ByZWNpc2lvbgEAAAANZ2V0Q3VycmVudExhcAAAAAAJAABkAAAAAgkAAGkAAAACCQAAZQAAAAIIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wBQAAAA5TVEFSVFRJTUVTVEFNUAUAAAAJTEFQTEVOR1RIAAAAAAAAAAABAQAAABNnZXRMYXN0RmVkVGltZXN0YW1wAAAAAQAAAApkdWNrbGluZ0lkBAAAABBsYXN0RmVkVGltZXN0YW1wCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAQAAABtrZXlEdWNrbGluZ0ZlZExhc3RUaW1lc3RhbXAAAAABBQAAAApkdWNrbGluZ0lkAwkAAGYAAAACBQAAABBsYXN0RmVkVGltZXN0YW1wAAAAAAAAAAAABQAAABBsYXN0RmVkVGltZXN0YW1wCAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAEAAAAZY2FsY3VsYXRlTmV3RHVja2xpbmdMZXZlbAAAAAIAAAAKZHVja2xpbmdJZAAAAA1wYXltZW50QW1vdW50BAAAAAljdXJyZW50VHMIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wBAAAABdsYXN0RmVkVGltZXN0YW1wQ2hlY2tlZAkBAAAAE2dldExhc3RGZWRUaW1lc3RhbXAAAAABBQAAAApkdWNrbGluZ0lkBAAAAAdmZWREaWZmCQAAZQAAAAIFAAAACWN1cnJlbnRUcwUAAAAXbGFzdEZlZFRpbWVzdGFtcENoZWNrZWQEAAAAB3BlbmFsdHkJAAE2AAAAAQAAAAAAAAAAAAQAAAAGZ3Jvd3RoCQABPAAAAAMJAAE2AAAAAQUAAAANcGF5bWVudEFtb3VudAkAATYAAAABBQAAABZwZXJjZW50R3Jvd3RoUHJlY2lzaW9u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AlgAAAABCAUAAAAPZHVja2xpbmdJZENoZWNrAAAAAmlkBQAAABBkdWNrbGluZ0lkU3RyaW5nBAAAABJrRHVja2xpbmdMYXN0RmVkVHMJAQAAABtrZXlEdWNrbGluZ0ZlZExhc3RUaW1lc3RhbXAAAAABBQAAAApkdWNrbGluZ0lkBAAAAAlsYXN0RmVkVHMJAQAAABNnZXRMYXN0RmVkVGltZXN0YW1wAAAAAQUAAAAOcmVhbER1Y2tsaW5nSWQEAAAADmN1cnJlbnRQYXltZW50CAkBAAAABXZhbHVlAAAAAQkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQEAAAACWtOZXdMZXZlbAkBAAAAEGtleUR1Y2tsaW5nTGV2ZWwAAAABBQAAAA5yZWFsRHVja2xpbmdJZAQAAAAKa1RvdGFsRmVlZAkBAAAADGtleVRvdGFsRmVlZAAAAAEFAAAADnJlYWxEdWNrbGluZ0lkBAAAAAl0b3RhbEZlZWQJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQUAAAAKa1RvdGFsRmVlZAQAAAAMa0ZlZWRUeFN0YXRzCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAlkdWNrbGluZ18FAAAADnJlYWxEdWNrbGluZ0lkAgAAAAZfc3RhdF8JAAGkAAAAAQgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAEAAAAFGtBZGRyZXNzRmVkVGltZXN0YW1wCQEAAAAWa2V5QWRkcmVzc0ZlZFRpbWVzdGFtcAAAAAMFAAAADWFkZHJlc3NTdHJpbmcJAQAAAA1nZXRDdXJyZW50TGFwAAAAAAgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAEAAAAGGtEdWNrbGluZ0ZlZExhcFRpbWVzdGFtcAkBAAAAGmtleUR1Y2tsaW5nRmVkTGFwVGltZXN0YW1wAAAAAgUAAAAOcmVhbER1Y2tsaW5nSWQJAQAAAA1nZXRDdXJyZW50TGFwAAAAAAQAAAAPa0R1Y2tsaW5nRmVkTGFwCQEAAAARa2V5RHVja2xpbmdGZWRMYXAAAAABBQAAAA5yZWFsRHVja2xpbmdJZAMJAABmAAAAAgUAAAAOY3VycmVudFBheW1lbnQFAAAADW1heEZlZWRBbW91bnQJAAACAAAAAQkAASwAAAACAgAAADpDYW5ub3QgZmVlZCBkdWNrbGluZyBmb3Igc3VjaCBhbW91bnQsIG1heCBmZWVkIGFtb3VudCBpczogCQABpAAAAAEFAAAADW1heEZlZWRBbW91bnQEAAAAEGNhbGN1bGF0ZVJlc3VsdHMJAQAAABljYWxjdWxhdGVOZXdEdWNrbGluZ0xldmVsAAAAAgUAAAAOcmVhbER1Y2tsaW5nSWQFAAAADmN1cnJlbnRQYXltZW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAA1rQWRkcmVzc05vbmNlCQAAZAAAAAIFAAAADGN1cnJlbnROb25jZQAAAAAAAAAAAQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAASa0R1Y2tsaW5nTGFzdEZlZFRzCAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAKa1RvdGFsRmVlZAkAAGQAAAACBQAAAAl0b3RhbEZlZWQFAAAADmN1cnJlbnRQYXltZW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAxrRmVlZFR4U3RhdHMFAAAADmN1cnJlbnRQYXltZW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABRrQWRkcmVzc0ZlZFRpbWVzdGFtcAUAAAAOY3VycmVudFBheW1lbnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAGGtEdWNrbGluZ0ZlZExhcFRpbWVzdGFtcAUAAAAOY3VycmVudFBheW1lbnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAD2tEdWNrbGluZ0ZlZExhcAkBAAAADWdldEN1cnJlbnRMYXAAAAAACQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAACWtOZXdMZXZlbAgFAAAAEGNhbGN1bGF0ZVJlc3VsdHMAAAACXzEJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkAASwAAAACBQAAAAxrRmVlZFR4U3RhdHMCAAAABl9kZWJ1ZwkABLkAAAACCAUAAAAQY2FsY3Vs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", "height": 3157565, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: D41fYaLveb5T3jVc2koyTGtsWRfNNHtQLsJZsW7t6zPD Next: FxVR63SbjW6At4wbbN2ghF9KfE9KhofeDWQJKida7NgG Diff:
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 5 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | - | let rebirthAddress = base58'3PCC6fVHNa6289DTDmcUo3RuLaFmteZZsmQ' | |
4 | + | func tryGetStringExternal (address,key) = match getString(address, key) { | |
5 | + | case a: String => | |
6 | + | a | |
7 | + | case _ => | |
8 | + | "" | |
9 | + | } | |
5 | 10 | ||
6 | - | let incubatorAddress = base58'3PEktVux2RhchSN63DsDo4b4mz4QqzKSeDv' | |
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 | + | ||
7 | 26 | ||
8 | 27 | let backendPubKey = base58'BmKAXRQy7jZm44fa1YxNQDTcAwNSb74EpQwP5CT7UHdV' | |
9 | 28 | ||
10 | 29 | let STARTTIMESTAMP = 1632474000000 | |
11 | 30 | ||
12 | 31 | let LAPLENGTH = 21600000 | |
13 | - | ||
14 | - | let EGGASSETID = base58'C1iWsKGqLwjHUndiQ7iXpdmPum9PeCDFfyXBdJJosDRS' | |
15 | 32 | ||
16 | 33 | let DUCKLINGPRICE = 80000000 | |
17 | 34 | ||
121 | 138 | ||
122 | 139 | ||
123 | 140 | @Callable(i) | |
141 | + | func configureOracle (oracle) = if ((i.caller != this)) | |
142 | + | then throw("admin only") | |
143 | + | else [StringEntry("static_oracleAddress", oracle)] | |
144 | + | ||
145 | + | ||
146 | + | ||
147 | + | @Callable(i) | |
124 | 148 | func issueFreeDuckling (address,txIdStr,percentage) = if (if ((i.caller != this)) | |
125 | - | then (i.caller | |
149 | + | then (i.caller != getRebirthAddress()) | |
126 | 150 | else false) | |
127 | 151 | then throw("You can't issue free duckling") | |
128 | 152 | else { | |
143 | 167 | then throw("Invalid proof from backend") | |
144 | 168 | else if (if ((size(i.payments) != 1)) | |
145 | 169 | then true | |
146 | - | else (value(i.payments[0]).assetId != | |
170 | + | else (value(i.payments[0]).assetId != getEggAssetId())) | |
147 | 171 | then throw("Bad payment attached (asset[s] or amount)") | |
148 | 172 | else if (getBool(keyDucklingGrown(ducklingId))) | |
149 | 173 | then throw("Duckling is already grown") | |
251 | 275 | else if ((pmt.issuer != this)) | |
252 | 276 | then throw("Can use only ducklings from this dApp") | |
253 | 277 | else { | |
254 | - | let call = invoke( | |
278 | + | let call = invoke(getIncubatorAddress(), "startDuckHatching", [""], nil) | |
255 | 279 | if ((call == call)) | |
256 | 280 | then { | |
257 | 281 | let kDucklingGrown = keyDucklingGrown(toBase58String(pmt.id)) |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 5 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | - | let rebirthAddress = base58'3PCC6fVHNa6289DTDmcUo3RuLaFmteZZsmQ' | |
4 | + | func tryGetStringExternal (address,key) = match getString(address, key) { | |
5 | + | case a: String => | |
6 | + | a | |
7 | + | case _ => | |
8 | + | "" | |
9 | + | } | |
5 | 10 | ||
6 | - | let incubatorAddress = base58'3PEktVux2RhchSN63DsDo4b4mz4QqzKSeDv' | |
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 | + | ||
7 | 26 | ||
8 | 27 | let backendPubKey = base58'BmKAXRQy7jZm44fa1YxNQDTcAwNSb74EpQwP5CT7UHdV' | |
9 | 28 | ||
10 | 29 | let STARTTIMESTAMP = 1632474000000 | |
11 | 30 | ||
12 | 31 | let LAPLENGTH = 21600000 | |
13 | - | ||
14 | - | let EGGASSETID = base58'C1iWsKGqLwjHUndiQ7iXpdmPum9PeCDFfyXBdJJosDRS' | |
15 | 32 | ||
16 | 33 | let DUCKLINGPRICE = 80000000 | |
17 | 34 | ||
18 | 35 | let percentGrowthPrecision = 10000000000000000 | |
19 | 36 | ||
20 | 37 | let existingDuckPrecision = 100000000000000 | |
21 | 38 | ||
22 | 39 | let KGlobalIssuedTimestamp = "global_issued_timestamp" | |
23 | 40 | ||
24 | 41 | let MSINDAY = 86400000 | |
25 | 42 | ||
26 | 43 | func keyTotalFeed (ducklingId) = (("duckling_" + ducklingId) + "_feed") | |
27 | 44 | ||
28 | 45 | ||
29 | 46 | func keyDucklingFedLap (ducklingId) = (("duckling_" + ducklingId) + "_fedLap") | |
30 | 47 | ||
31 | 48 | ||
32 | 49 | func keyDucklingFedTimestamp (ducklingId) = (("duckling_" + ducklingId) + "_fedTs") | |
33 | 50 | ||
34 | 51 | ||
35 | 52 | func keyDucklingFedLapTimestamp (ducklingId,lap) = (((("duckling_" + ducklingId) + "_lap_") + toString(lap)) + "_fedTs") | |
36 | 53 | ||
37 | 54 | ||
38 | 55 | func keyAddressFedTimestamp (address,lap,timestamp) = ((((("address_" + address) + "_lap_") + toString(lap)) + "_fedTs_") + toString(timestamp)) | |
39 | 56 | ||
40 | 57 | ||
41 | 58 | func keyAddressNonce (address) = (("address_" + address) + "_nonce") | |
42 | 59 | ||
43 | 60 | ||
44 | 61 | func keyDucklingFedLastTimestamp (ducklingId) = (("duckling_" + ducklingId) + "_fedLastTs") | |
45 | 62 | ||
46 | 63 | ||
47 | 64 | func keyDucklingLevel (ducklingId) = (("duckling_" + ducklingId) + "_level") | |
48 | 65 | ||
49 | 66 | ||
50 | 67 | func keyFeedForLap (address,lap) = (((("address_" + address) + "_lap_") + toString(lap)) + "_feed") | |
51 | 68 | ||
52 | 69 | ||
53 | 70 | func keyDucklingGrown (ducklingId) = (("duckling_" + ducklingId) + "_grown") | |
54 | 71 | ||
55 | 72 | ||
56 | 73 | func keyStartHatchingId (ducklingId) = (("duckling_" + ducklingId) + "_grown") | |
57 | 74 | ||
58 | 75 | ||
59 | 76 | func tryGetInteger (key) = { | |
60 | 77 | let val = match getInteger(this, key) { | |
61 | 78 | case b: Int => | |
62 | 79 | b | |
63 | 80 | case _ => | |
64 | 81 | 0 | |
65 | 82 | } | |
66 | 83 | val | |
67 | 84 | } | |
68 | 85 | ||
69 | 86 | ||
70 | 87 | func getBool (key) = match getBoolean(this, key) { | |
71 | 88 | case b: Boolean => | |
72 | 89 | b | |
73 | 90 | case _ => | |
74 | 91 | false | |
75 | 92 | } | |
76 | 93 | ||
77 | 94 | ||
78 | 95 | func getCurrentLevelBigInt (ducklingId) = { | |
79 | 96 | let kDuckLevel = keyDucklingLevel(ducklingId) | |
80 | 97 | match getString(kDuckLevel) { | |
81 | 98 | case s: String => | |
82 | 99 | parseBigIntValue(s) | |
83 | 100 | case _ => | |
84 | 101 | match getBoolean((("duckling_" + ducklingId) + "_issuedByFeedCall")) { | |
85 | 102 | case b: Boolean => | |
86 | 103 | toBigInt(0) | |
87 | 104 | case _ => | |
88 | 105 | toBigInt((20 * existingDuckPrecision)) | |
89 | 106 | } | |
90 | 107 | } | |
91 | 108 | } | |
92 | 109 | ||
93 | 110 | ||
94 | 111 | func getCurrentLap () = (((lastBlock.timestamp - STARTTIMESTAMP) / LAPLENGTH) + 1) | |
95 | 112 | ||
96 | 113 | ||
97 | 114 | func getLastFedTimestamp (ducklingId) = { | |
98 | 115 | let lastFedTimestamp = tryGetInteger(keyDucklingFedLastTimestamp(ducklingId)) | |
99 | 116 | if ((lastFedTimestamp > 0)) | |
100 | 117 | then lastFedTimestamp | |
101 | 118 | else lastBlock.timestamp | |
102 | 119 | } | |
103 | 120 | ||
104 | 121 | ||
105 | 122 | func calculateNewDucklingLevel (ducklingId,paymentAmount) = { | |
106 | 123 | let currentTs = lastBlock.timestamp | |
107 | 124 | let lastFedTimestampChecked = getLastFedTimestamp(ducklingId) | |
108 | 125 | let fedDiff = (currentTs - lastFedTimestampChecked) | |
109 | 126 | let penalty = toBigInt(0) | |
110 | 127 | let growth = fraction(toBigInt(paymentAmount), toBigInt(percentGrowthPrecision), toBigInt(DUCKLINGPRICE)) | |
111 | 128 | let currentLevel = getCurrentLevelBigInt(ducklingId) | |
112 | 129 | let newLevel = ((currentLevel - penalty) + growth) | |
113 | 130 | let result = if ((toBigInt(0) > newLevel)) | |
114 | 131 | then toString(growth) | |
115 | 132 | else toString(newLevel) | |
116 | 133 | $Tuple2(result, [("currentLevel=" + toString(currentLevel)), ("newLevel=" + toString(newLevel)), ("growth=" + toString(growth)), ("penalty=" + toString(penalty)), ("lastFedTs=" + toString(lastFedTimestampChecked)), ("fedDiff=" + toString(fedDiff))]) | |
117 | 134 | } | |
118 | 135 | ||
119 | 136 | ||
120 | 137 | func getBackendProof (maxFeedAmount,userNonce,address) = makeString([toString(maxFeedAmount), toString(userNonce), address], ";") | |
121 | 138 | ||
122 | 139 | ||
123 | 140 | @Callable(i) | |
141 | + | func configureOracle (oracle) = if ((i.caller != this)) | |
142 | + | then throw("admin only") | |
143 | + | else [StringEntry("static_oracleAddress", oracle)] | |
144 | + | ||
145 | + | ||
146 | + | ||
147 | + | @Callable(i) | |
124 | 148 | func issueFreeDuckling (address,txIdStr,percentage) = if (if ((i.caller != this)) | |
125 | - | then (i.caller | |
149 | + | then (i.caller != getRebirthAddress()) | |
126 | 150 | else false) | |
127 | 151 | then throw("You can't issue free duckling") | |
128 | 152 | else { | |
129 | 153 | let asset = Issue("BABY-11111111-GZ", "", 1, 0, false, unit, height) | |
130 | 154 | let assetId = calculateAssetId(asset) | |
131 | 155 | $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 | 156 | } | |
133 | 157 | ||
134 | 158 | ||
135 | 159 | ||
136 | 160 | @Callable(i) | |
137 | 161 | func feedDuckling (ducklingId,backendSignature,maxFeedAmount,userNonce) = { | |
138 | 162 | let addressString = toString(i.caller) | |
139 | 163 | let backendProof = getBackendProof(maxFeedAmount, userNonce, addressString) | |
140 | 164 | let kAddressNonce = keyAddressNonce(addressString) | |
141 | 165 | let currentNonce = tryGetInteger(kAddressNonce) | |
142 | 166 | let realDucklingId = if (!(sigVerify_8Kb(toBytes(backendProof), fromBase58String(backendSignature), backendPubKey))) | |
143 | 167 | then throw("Invalid proof from backend") | |
144 | 168 | else if (if ((size(i.payments) != 1)) | |
145 | 169 | then true | |
146 | - | else (value(i.payments[0]).assetId != | |
170 | + | else (value(i.payments[0]).assetId != getEggAssetId())) | |
147 | 171 | then throw("Bad payment attached (asset[s] or amount)") | |
148 | 172 | else if (getBool(keyDucklingGrown(ducklingId))) | |
149 | 173 | then throw("Duckling is already grown") | |
150 | 174 | else if ((userNonce != (currentNonce + 1))) | |
151 | 175 | then throw(((("User Nonce should be " + toString(currentNonce)) + " + 1, while received ") + toString(userNonce))) | |
152 | 176 | else if ((ducklingId == "")) | |
153 | 177 | then { | |
154 | 178 | let ducklingAssetId = invoke(this, "issueFreeDuckling", [toString(i.originCaller), toBase58String(i.transactionId), 0], nil) | |
155 | 179 | if ((ducklingAssetId == ducklingAssetId)) | |
156 | 180 | then { | |
157 | 181 | let id = match ducklingAssetId { | |
158 | 182 | case v: String => | |
159 | 183 | v | |
160 | 184 | case _ => | |
161 | 185 | throw("Can't generate NFT") | |
162 | 186 | } | |
163 | 187 | id | |
164 | 188 | } | |
165 | 189 | else throw("Strict value is not equal to itself.") | |
166 | 190 | } | |
167 | 191 | else { | |
168 | 192 | let ducklingIdCheck = value(assetInfo(fromBase58String(ducklingId))) | |
169 | 193 | if ((assetBalance(i.caller, ducklingIdCheck.id) != 1)) | |
170 | 194 | then throw("You're not the owner of the duckling") | |
171 | 195 | else if ((ducklingIdCheck.issuer != this)) | |
172 | 196 | then throw("Cant find duckling with such id") | |
173 | 197 | else { | |
174 | 198 | let ducklingIdString = toBase58String(ducklingIdCheck.id) | |
175 | 199 | ducklingIdString | |
176 | 200 | } | |
177 | 201 | } | |
178 | 202 | let kDucklingLastFedTs = keyDucklingFedLastTimestamp(ducklingId) | |
179 | 203 | let lastFedTs = getLastFedTimestamp(realDucklingId) | |
180 | 204 | let currentPayment = value(i.payments[0]).amount | |
181 | 205 | let kNewLevel = keyDucklingLevel(realDucklingId) | |
182 | 206 | let kTotalFeed = keyTotalFeed(realDucklingId) | |
183 | 207 | let totalFeed = tryGetInteger(kTotalFeed) | |
184 | 208 | let kFeedTxStats = ((("duckling_" + realDucklingId) + "_stat_") + toString(lastBlock.timestamp)) | |
185 | 209 | let kAddressFedTimestamp = keyAddressFedTimestamp(addressString, getCurrentLap(), lastBlock.timestamp) | |
186 | 210 | let kDucklingFedLapTimestamp = keyDucklingFedLapTimestamp(realDucklingId, getCurrentLap()) | |
187 | 211 | let kDucklingFedLap = keyDucklingFedLap(realDucklingId) | |
188 | 212 | if ((currentPayment > maxFeedAmount)) | |
189 | 213 | then throw(("Cannot feed duckling for such amount, max feed amount is: " + toString(maxFeedAmount))) | |
190 | 214 | else { | |
191 | 215 | let calculateResults = calculateNewDucklingLevel(realDucklingId, currentPayment) | |
192 | 216 | [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, ";"))] | |
193 | 217 | } | |
194 | 218 | } | |
195 | 219 | ||
196 | 220 | ||
197 | 221 | ||
198 | 222 | @Callable(i) | |
199 | 223 | func fixLevels (ducklingIds) = if ((i.callerPublicKey != base58'GDxBbsDRmeY39quNrDsTXKJzFWbQVtjxHseF4ikxZ7n9')) | |
200 | 224 | then throw("") | |
201 | 225 | else { | |
202 | 226 | let ducklingIdsList = value(split(ducklingIds, ",")) | |
203 | 227 | func handleId (acc,id) = { | |
204 | 228 | let kTotalFeed = keyTotalFeed(id) | |
205 | 229 | let totalFeed = tryGetInteger(kTotalFeed) | |
206 | 230 | let kNewLevel = keyDucklingLevel(id) | |
207 | 231 | let startingLevel = match getBoolean((("duckling_" + id) + "_issuedByFeedCall")) { | |
208 | 232 | case b: Boolean => | |
209 | 233 | if ((b == true)) | |
210 | 234 | then toBigInt(0) | |
211 | 235 | else toBigInt((20 * existingDuckPrecision)) | |
212 | 236 | case _ => | |
213 | 237 | toBigInt((20 * existingDuckPrecision)) | |
214 | 238 | } | |
215 | 239 | let growth = fraction(toBigInt(totalFeed), toBigInt(percentGrowthPrecision), toBigInt(DUCKLINGPRICE)) | |
216 | 240 | (acc ++ [StringEntry(kNewLevel, toString((startingLevel + growth)))]) | |
217 | 241 | } | |
218 | 242 | ||
219 | 243 | let $l = ducklingIdsList | |
220 | 244 | let $s = size($l) | |
221 | 245 | let $acc0 = nil | |
222 | 246 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
223 | 247 | then $a | |
224 | 248 | else handleId($a, $l[$i]) | |
225 | 249 | ||
226 | 250 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
227 | 251 | then $a | |
228 | 252 | else throw("List size exceeds 20") | |
229 | 253 | ||
230 | 254 | $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) | |
231 | 255 | } | |
232 | 256 | ||
233 | 257 | ||
234 | 258 | ||
235 | 259 | @Callable(i) | |
236 | 260 | func turnDucklingIntoDuck () = { | |
237 | 261 | let address = toString(i.caller) | |
238 | 262 | let txId = toBase58String(i.transactionId) | |
239 | 263 | let lastIssuedDucklingTs = tryGetInteger(KGlobalIssuedTimestamp) | |
240 | 264 | let fiveMinInMs = ((60 * 60) * 1000) | |
241 | 265 | if (if ((lastIssuedDucklingTs > 0)) | |
242 | 266 | then (fiveMinInMs > (lastBlock.timestamp - lastIssuedDucklingTs)) | |
243 | 267 | else false) | |
244 | 268 | then throw(("Can issue ducklings only once per 5 minutes, please wait for " + toString((fiveMinInMs - (lastBlock.timestamp - lastIssuedDucklingTs))))) | |
245 | 269 | else if ((size(i.payments) != 1)) | |
246 | 270 | then throw("Bad payment attached (asset[s] or amount)") | |
247 | 271 | else { | |
248 | 272 | let pmt = value(assetInfo(value(value(i.payments[0]).assetId))) | |
249 | 273 | if ((toBigInt(100) > getCurrentLevelBigInt(toBase58String(pmt.id)))) | |
250 | 274 | then throw("Duckling is not grown yet...") | |
251 | 275 | else if ((pmt.issuer != this)) | |
252 | 276 | then throw("Can use only ducklings from this dApp") | |
253 | 277 | else { | |
254 | - | let call = invoke( | |
278 | + | let call = invoke(getIncubatorAddress(), "startDuckHatching", [""], nil) | |
255 | 279 | if ((call == call)) | |
256 | 280 | then { | |
257 | 281 | let kDucklingGrown = keyDucklingGrown(toBase58String(pmt.id)) | |
258 | 282 | [BooleanEntry(kDucklingGrown, true), IntegerEntry(KGlobalIssuedTimestamp, lastBlock.timestamp)] | |
259 | 283 | } | |
260 | 284 | else throw("Strict value is not equal to itself.") | |
261 | 285 | } | |
262 | 286 | } | |
263 | 287 | } | |
264 | 288 | ||
265 | 289 | ||
266 | 290 | @Verifier(tx) | |
267 | 291 | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
268 | 292 |
github/deemru/w8io/3ef1775 60.12 ms ◑