2022.05.17 13:51 [3121038] smart account 3PH75p2rmMKCV2nyW4TsAdFgFtmc61mJaqA > SELF 0.00000000 Waves
{ "type": 13, "id": "G9AQL12BEAm3BY88dUPtArMGunLtJeCecTm9BeuhGrBe", "fee": 1400000, "feeAssetId": null, "timestamp": 1652784708071, "version": 2, "chainId": 87, "sender": "3PH75p2rmMKCV2nyW4TsAdFgFtmc61mJaqA", "senderPublicKey": "3GtkwhnMmG1yeozW51o4dJ1x3BDToPaLBXyBWKGdAc2e", "proofs": [ "2cTM5spYzK6UuBzBRJcoViWEeMYVCXeaeDWiZAd5xwpitjhGFKyA8ppnnpzQdV6gwR8nYEs6cKF4jGm4c8trP927" ], "script": "base64:AAIFAAAAAAAAAC0IAhIDCgEIEgASBAoCCAgSBAoCCAgSABIAEgMKAQgSAwoBCBIDCgEIEgMKAQgAAAAmAAAAAApwZXJjaFByaWNlCQAAaAAAAAIAAAAAAAAAAGQAAAAAAAAPQkAAAAAABXNjYWxlAAAAAAAAACcQAAAAAAZzY2FsZTIAAAAAAAAPQkABAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgAAAAdhZGRyZXNzAAAAA2tleQQAAAAHJG1hdGNoMAkABB0AAAACBQAAAAdhZGRyZXNzBQAAAANrZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQIAAAAAAQAAAAx0cnlHZXRTdHJpbmcAAAABAAAAA2tleQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgUAAAAEdGhpcwUAAAADa2V5AQAAAAlnZXRPcmFjbGUAAAAACQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQkBAAAADHRyeUdldFN0cmluZwAAAAECAAAAFHN0YXRpY19vcmFjbGVBZGRyZXNzAQAAAA1nZXRFZ2dBc3NldElkAAAAAAkAAlkAAAABCQEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACCQEAAAAJZ2V0T3JhY2xlAAAAAAIAAAARc3RhdGljX2VnZ0Fzc2V0SWQBAAAAE2dldEluY3ViYXRvckFkZHJlc3MAAAAACQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAACAAAAF3N0YXRpY19pbmN1YmF0b3JBZGRyZXNzAQAAABFnZXRSZWJpcnRoQWRkcmVzcwAAAAAJAQAAAAdBZGRyZXNzAAAAAQkAAlkAAAABCQEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACCQEAAAAJZ2V0T3JhY2xlAAAAAAIAAAAVc3RhdGljX3JlYmlydGhBZGRyZXNzAQAAABNnZXRTd29wUHJvbW9BZGRyZXNzAAAAAAkBAAAAB0FkZHJlc3MAAAABCQACWQAAAAEJAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIJAQAAAAlnZXRPcmFjbGUAAAAAAgAAABdzdGF0aWNfc3dvcFByb21vQWRkcmVzcwEAAAARZ2V0QnJlZWRlckFkZHJlc3MAAAAACQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAACAAAAFXN0YXRpY19icmVlZGVyQWRkcmVzcwEAAAAVZ2V0UmVmQ29udHJhY3RBZGRyZXNzAAAAAAkBAAAAB0FkZHJlc3MAAAABCQACWQAAAAEJAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIJAQAAAAlnZXRPcmFjbGUAAAAAAgAAABlzdGF0aWNfcmVmQ29udHJhY3RBZGRyZXNzAQAAAA9nZXRJdGVtc0FkZHJlc3MAAAAACQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAACAAAAE3N0YXRpY19pdGVtc0FkZHJlc3MBAAAAEmdldE1ldGFyYWNlQWRkcmVzcwAAAAAJAQAAAAdBZGRyZXNzAAAAAQkAAlkAAAABCQEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACCQEAAAAJZ2V0T3JhY2xlAAAAAAIAAAAWc3RhdGljX21ldGFSYWNlQWRkcmVzcwEAAAAUZ2V0QWNjQm9vc3RlckFkZHJlc3MAAAAACQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAACAAAAGHN0YXRpY19hY2NCb29zdGVyQWRkcmVzcwEAAAATZ2V0VHJ1c3RlZENvbnRyYWN0cwAAAAAJAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIJAQAAAAlnZXRPcmFjbGUAAAAAAgAAABdzdGF0aWNfdHJ1c3RlZENvbnRyYWN0cwEAAAAOZ2V0TWFpbnRlbmFuY2UAAAAACQEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACCQEAAAAJZ2V0T3JhY2xlAAAAAAIAAAASc3RhdGljX21haW50ZW5hbmNlAQAAABJnZXRDZk1hc3RlckFk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AAEsAQAAAAxjYWxjSW50ZXJlc3QAAAADAAAAEHByZXZpb3VzSW50ZXJlc3QAAAAWcHJldmlvdXNJbnRlcmVzdEhlaWdodAAAABF0b3RhbEZhcm1pbmdQb3dlcgkAAGQAAAACBQAAABBwcmV2aW91c0ludGVyZXN0CQAAaQAAAAIJAABoAAAAAgkAAGgAAAACBQAAAAVzY2FsZQkBAAAAEWdldFJld2FyZFBlckJsb2NrAAAAAAkAAGUAAAACBQAAAAZoZWlnaHQFAAAAFnByZXZpb3VzSW50ZXJlc3RIZWlnaHQFAAAAEXRvdGFsRmFybWluZ1Bvd2VyAQAAABJnZXRDdXJyZW50SW50ZXJlc3QAAAAAAwkAAGYAAAACCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAECAAAAEnRvdGFsX2Zhcm1pbmdQb3dlcgAAAAAAAAAAAAQAAAAQcHJldmlvdXNJbnRlcmVzdAkBAAAADXRyeUdldEludGVnZXIAAAABAgAAABd0b3RhbF9sYXN0Q2hlY2tJbnRlcmVzdAQAAAAWcHJldmlvdXNJbnRlcmVzdEhlaWdodAkBAAAADXRyeUdldEludGVnZXIAAAABAgAAAB10b3RhbF9sYXN0Q2hlY2tJbnRlcmVzdEhlaWdodAQAAAARdG90YWxGYXJtaW5nUG93ZXIJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQIAAAASdG90YWxfZmFybWluZ1Bvd2VyCQEAAAAMY2FsY0ludGVyZXN0AAAAAwUAAAAQcHJldmlvdXNJbnRlcmVzdAUAAAAWcHJldmlvdXNJbnRlcmVzdEhlaWdodAUAAAARdG90YWxGYXJtaW5nUG93ZXIDCQEAAAACIT0AAAACCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAECAAAAEXRvdGFsX3N0YXJ0SGVpZ2h0AAAAAAAAAAAACQEAAAANdHJ5R2V0SW50ZWdlcgAAAAECAAAAF3RvdGFsX2xhc3RDaGVja0ludGVyZXN0CQAAAgAAAAECAAAAHGZhcm1pbmcgaXMgbm90IGxhdW5jaGVkLCB5ZXQBAAAAFGNhbGNBc3NldFJld2FyZERlbHRhAAAAAwAAAAdhZGRyZXNzAAAAB2Fzc2V0SWQAAAARYXNzZXRGYXJtaW5nUG93ZXIEAAAAFmxhc3RDaGVja0Fzc2V0SW50ZXJlc3QJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAhhZGRyZXNzXwUAAAAHYWRkcmVzcwIAAAAHX2Fzc2V0XwUAAAAHYXNzZXRJZAIAAAASX2xhc3RDaGVja0ludGVyZXN0BAAAAA9jdXJyZW50SW50ZXJlc3QJAQAAABJnZXRDdXJyZW50SW50ZXJlc3QAAAAACQAAaAAAAAIFAAAAEWFzc2V0RmFybWluZ1Bvd2VyCQAAZQAAAAIFAAAAD2N1cnJlbnRJbnRlcmVzdAUAAAAWbGFzdENoZWNrQXNzZXRJbnRlcmVzdAEAAAAUYWRkQXNzZXRJZFRvR2VuRW50cnkAAAACAAAAB2Fzc2V0SWQAAAAIYXNzZXRHZW4EAAAADGN1cnJlbnRWYWx1ZQkBAAAADHRyeUdldFN0cmluZwAAAAEJAAEsAAAAAgkAASwAAAACAgAAAAdhc3NldHNfBQAAAAhhc3NldEdlbgIAAAAHX2xvY2tlZAMJAAAAAAAAAgUAAAAMY3VycmVudFZhbHVlAgAAAAAFAAAAB2Fzc2V0SWQJAAEsAAAAAgkAASwAAAACBQAAAAxjdXJyZW50VmFsdWUCAAAAASwFAAAAB2Fzc2V0SWQBAAAADmdldFN0YWtlUmVzdWx0AAAABAAAAAdhZGRyZXNzAAAAB2Fzc2V0SWQAAAARYXNzZXRGYXJtaW5nUG93ZXIAAAAIdW5zdGFrZXIEAAAABWFzc2V0CQACWAAAAAEFAAAAB2Fzc2V0SWQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAICAAAAEnRvdGFsX2Zhcm1pbmdQb3dlcgkAAGQAAAACCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAECAAAAEnRvdGFsX2Zhcm1pbmdQb3dlcgUAAAARYXNzZXRGYXJtaW5nUG93ZXIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAICAAAAF3RvdGFsX2xhc3RDaGVja0ludGVyZXN0CQEAAAASZ2V0Q3VycmVudEludGVyZXN0AAAAAAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgIAAAAddG90YWxfbGFzdENoZWNrSW50ZXJlc3RIZWlnaHQFAAAABmhlaWdodAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAhhZGRyZXNzXwUAAAAHYWRkcmVzcwIAAAAHX2Fzc2V0XwUAAAAFYXNzZXQCAAAADV9mYXJtaW5nUG93ZXIFAAAAEWFzc2V0RmFybWluZ1Bvd2VyCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACGFkZHJlc3NfBQAAAAdhZGRyZXNzAgAAAAdfYXNzZXRfBQAAAAVhc3NldAIAAAASX2xhc3RDaGVja0ludGVyZXN0CQEAAAASZ2V0Q3VycmVudEludGVyZXN0AAAAAAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACGFkZHJlc3NfBQAAAAdhZGRyZXNzAgAAAAdfYXNzZXRfBQAAAAVhc3NldAIAAAAJX3Vuc3Rha2VyBQAAAAh1bnN0YWtlcgUAAAADbmlsAQAAABBnZXRVbnN0YWtlUmVzdWx0AAAABQAAAAdhZGRyZXNzAAAAB2Fzc2V0SWQAAAALcmV3YXJkRGVsdGEAAAAPd2l0aGRyYXduQW1vdW50AAAAEWFzc2V0RmFybWluZ1Bvd2VyBAAAAAVhc3NldAkAAlgAAAABBQAAAAdhc3NldElkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACAgAAABJ0b3RhbF9mYXJtaW5nUG93ZXIJAABlAAAAAgkBAAAADXRyeUdldEludGVnZXIAAAABAgAAABJ0b3RhbF9mYXJtaW5nUG93ZXIFAAAAEWFzc2V0RmFybWluZ1Bvd2VyCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACAgAAABd0b3RhbF9sYXN0Q2hlY2tJbnRlcmVzdAkBAAAAEmdldEN1cnJlbnRJbnRlcmVzdAAAAAAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAICAAAAHXRvdGFsX2xhc3RDaGVja0ludGVyZXN0SGVpZ2h0BQAAAAZoZWlnaHQJAARMAAAAAgkBAAAADElu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YWR5IGtub3csIGFueSBsb3NzIGhhcyBpdHMgY29uc2VxdWVuY2VzLCBzbyB5b3Ugd2lsbCBiZSBub3QgYWJsZSB0byBjbGFpbSB5b3VyIGZhcm1pbmcgcmV3YXJkcyB0aWxsIHRoZSBlbmQgb2YgRHVja1NxdWlkIGdhbWUuIFF1YWNrIGluIHBlYWNlIQQAAAAHYXNzZXRJZAkAAlkAAAABBQAAAAVhc3NldAQAAAAIdW5zdGFrZXIJAQAAAAx0cnlHZXRTdHJpbmcAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACGFkZHJlc3NfBQAAAANhZGQCAAAAB19hc3NldF8FAAAABWFzc2V0AgAAAAlfdW5zdGFrZXIEAAAAB2FkZHJlc3MDCQAAAAAAAAIJAQAAABJnZXRNZXRhcmFjZUFkZHJlc3MAAAAACAUAAAABaQAAAAZjYWxsZXIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBQAAAANhZGQEAAAAEWFzc2V0RmFybWluZ1Bvd2VyCQEAAAAdZ2V0TGFzdEtub3duQXNzZXRGYXJtaW5nUG93ZXIAAAACBQAAAAdhZGRyZXNzBQAAAAVhc3NldAQAAAAQYXNzZXRSZXdhcmREZWx0YQkBAAAAFGNhbGNBc3NldFJld2FyZERlbHRhAAAAAwUAAAAHYWRkcmVzcwUAAAAFYXNzZXQFAAAAEWFzc2V0RmFybWluZ1Bvd2VyBAAAAAxmYXJtZWRBbW91bnQJAABkAAAAAgUAAAAQYXNzZXRSZXdhcmREZWx0YQkBAAAADXRyeUdldEludGVnZXIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACGFkZHJlc3NfBQAAAAdhZGRyZXNzAgAAAAdfYXNzZXRfBQAAAAVhc3NldAIAAAAWX2xhc3RDaGVja0Zhcm1lZEFtb3VudAQAAAAPd2l0aGRyYXduQW1vdW50CQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAIYWRkcmVzc18FAAAAB2FkZHJlc3MCAAAAB19hc3NldF8FAAAABWFzc2V0AgAAABBfd2l0aGRyYXduQW1vdW50BAAAAAZyZXdh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ZXRGYXJtaW5nUG93ZXIJAQAAAB1nZXRMYXN0S25vd25Bc3NldEZhcm1pbmdQb3dlcgAAAAIFAAAAB2FkZHJlc3MFAAAABWFzc2V0BAAAABBhc3NldFJld2FyZERlbHRhCQEAAAAUY2FsY0Fzc2V0UmV3YXJkRGVsdGEAAAADBQAAAAdhZGRyZXNzBQAAAAVhc3NldAUAAAARYXNzZXRGYXJtaW5nUG93ZXIEAAAADGZhcm1lZEFtb3VudAkAAGQAAAACBQAAABBhc3NldFJld2FyZERlbHRhCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAIYWRkcmVzc18FAAAAB2FkZHJlc3MCAAAAB19hc3NldF8FAAAABWFzc2V0AgAAABZfbGFzdENoZWNrRmFybWVkQW1vdW50BAAAAA93aXRoZHJhd25BbW91bnQJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAhhZGRyZXNzXwUAAAAHYWRkcmVzcwIAAAAHX2Fzc2V0XwUAAAAFYXNzZXQCAAAAEF93aXRoZHJhd25BbW91bnQEAAAABnJld2FyZAkAAGkAAAACCQAAZQAAAAIFAAAADGZhcm1lZEFtb3VudAUAAAAPd2l0aGRyYXduQW1vdW50CQAAaAAAAAIFAAAABXNjYWxlAAAAAAAAAABkBAAAAAh1bnN0YWtlcgkBAAAADHRyeUdldFN0cmluZwAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAIYWRkcmVzc18FAAAAB2FkZHJlc3MCAAAAB19hc3NldF8FAAAABWFzc2V0AgAAAAlfdW5zdGFrZXIDAwkBAAAAAiE9AAAAAgUAAAAIdW5zdGFrZXICAAAAAAkBAAAAAiE9AAAAAgUAAAAIdW5zdGFrZXIFAAAACnJlYWxDYWxsZXIHCQAAAgAAAAECAAAAUkl0IHNlZW1zIGR1Y2sgd2FzIHN0YWtlZCB0aHJvdWggYSBkYXBwLCBub3QgZGlyZWN0bHksIHBsZWFzZSB1bnN0YWtlIHRocm91Z2ggZGFwcCEDCQEAAAACIT0AAAACCQEAAAAJdGFrZVJp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", "height": 3121038, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 2kavK9wcWV7ZC4eUhtCPKtPTbtEZfi5aGX8GDgHjnmBc Next: CPsNQUsi7JHBHuThqPASgbSfCzU1kz2s2pyZ5Lw98Rjm Diff:
Old | New | Differences | |
---|---|---|---|
52 | 52 | ||
53 | 53 | ||
54 | 54 | func getMaintenance () = tryGetStringExternal(getOracle(), "static_maintenance") | |
55 | + | ||
56 | + | ||
57 | + | func getCfMasterAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_cfMasterAddress"))) | |
55 | 58 | ||
56 | 59 | ||
57 | 60 | let RefererReward = 5 | |
281 | 284 | else if ((0 >= availablePerches)) | |
282 | 285 | then throw(("no perches available for the color " + color)) | |
283 | 286 | else { | |
284 | - | let $ | |
285 | - | let assetGen = $ | |
286 | - | let assetFarmingPower = $ | |
287 | + | let $t01023810311 = getAssetFarmingPower(assetId, address) | |
288 | + | let assetGen = $t01023810311._1 | |
289 | + | let assetFarmingPower = $t01023810311._2 | |
287 | 290 | (getStakeResult(address, assetId, assetFarmingPower, realCaller) ++ [IntegerEntry(((("address_" + address) + "_perchesAvailable_") + color), (availablePerches - 1))]) | |
288 | 291 | } | |
289 | 292 | } | |
302 | 305 | let dappToCall = toString(i.caller) | |
303 | 306 | if ((indexOf(allowedContractsList, dappToCall) == unit)) | |
304 | 307 | then throw("Only trusted smart contracts can stake without a perch!") | |
305 | - | else if ((isLocked() > 0)) | |
306 | - | then throw("EGG operations are temporarily locked") | |
307 | - | else { | |
308 | - | let pmt = value(i.payments[0]) | |
309 | - | let assetId = value(value(i.payments[0]).assetId) | |
310 | - | let address = toString(i.originCaller) | |
311 | - | if ((pmt.amount != 1)) | |
312 | - | then throw("NFT is not attached") | |
313 | - | else { | |
314 | - | let $t01102511098 = getAssetFarmingPower(assetId, address) | |
315 | - | let assetGen = $t01102511098._1 | |
316 | - | let assetFarmingPower = $t01102511098._2 | |
317 | - | let asset = toBase58String(assetId) | |
318 | - | let realCaller = toString(i.caller) | |
319 | - | (getStakeResult(address, assetId, assetFarmingPower, realCaller) ++ [BooleanEntry((((("address_" + address) + "_asset_") + asset) + "_without_perch"), true)]) | |
320 | - | } | |
321 | - | } | |
308 | + | else { | |
309 | + | let pmt = value(i.payments[0]) | |
310 | + | let assetId = value(value(i.payments[0]).assetId) | |
311 | + | let address = toString(i.originCaller) | |
312 | + | if ((pmt.amount != 1)) | |
313 | + | then throw("NFT is not attached") | |
314 | + | else { | |
315 | + | let $t01105111124 = getAssetFarmingPower(assetId, address) | |
316 | + | let assetGen = $t01105111124._1 | |
317 | + | let assetFarmingPower = $t01105111124._2 | |
318 | + | let asset = toBase58String(assetId) | |
319 | + | let realCaller = toString(i.caller) | |
320 | + | (getStakeResult(address, assetId, assetFarmingPower, realCaller) ++ [BooleanEntry((((("address_" + address) + "_asset_") + asset) + "_without_perch"), true)]) | |
321 | + | } | |
322 | + | } | |
322 | 323 | } | |
323 | 324 | else throw("Strict value is not equal to itself.") | |
324 | 325 | } | |
333 | 334 | let add = toString(i.originCaller) | |
334 | 335 | if (isUserBlacklisted(add)) | |
335 | 336 | then throw("Ooops, looks like you lost in one of the Ducksquid games! As you already know, any loss has its consequences, so you will be not able to claim your farming rewards till the end of DuckSquid game. Quack in peace!") | |
336 | - | else if ((isLocked() > 0)) | |
337 | - | then throw("EGG operations are temporarily locked") | |
338 | - | else { | |
339 | - | let assetId = fromBase58String(asset) | |
340 | - | let unstaker = tryGetString((((("address_" + add) + "_asset_") + asset) + "_unstaker")) | |
341 | - | let address = if (if ((unstaker == "")) | |
342 | - | then (getMetaraceAddress() == i.caller) | |
343 | - | else false) | |
344 | - | then toString(i.caller) | |
345 | - | else add | |
346 | - | let assetFarmingPower = getLastKnownAssetFarmingPower(address, asset) | |
347 | - | let assetRewardDelta = calcAssetRewardDelta(address, asset, assetFarmingPower) | |
348 | - | let farmedAmount = (assetRewardDelta + tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_lastCheckFarmedAmount"))) | |
349 | - | let withdrawnAmount = tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount")) | |
350 | - | let reward = ((farmedAmount - withdrawnAmount) / (scale * 100)) | |
351 | - | let color = takeRight(value(assetInfo(assetId)).name, 1) | |
352 | - | let realCaller = toString(i.caller) | |
353 | - | if (if ((unstaker != "")) | |
354 | - | then (unstaker != realCaller) | |
355 | - | else false) | |
356 | - | then throw("It seems duck was staked throuh a dapp, not directly, please unstake through dapp!") | |
357 | - | else if ((0 >= assetFarmingPower)) | |
358 | - | then throw("asset not available") | |
359 | - | else { | |
360 | - | let isWithoutPerch = tryGetBoolean((((("address_" + address) + "_asset_") + asset) + "_without_perch")) | |
361 | - | if ((color == "U")) | |
362 | - | then throw("use another function to unstake Jackpot NFT") | |
363 | - | else { | |
364 | - | let result = getUnstakeResult(address, assetId, assetRewardDelta, reward, assetFarmingPower) | |
365 | - | let appendPerches = if (isWithoutPerch) | |
366 | - | then [DeleteEntry((((("address_" + address) + "_asset_") + asset) + "_without_perch"))] | |
367 | - | else [IntegerEntry(((("address_" + address) + "_perchesAvailable_") + color), (tryGetInteger(((("address_" + address) + "_perchesAvailable_") + color)) + 1))] | |
368 | - | $Tuple2(((result ++ [ScriptTransfer(i.caller, (reward * 1000000), getEggAssetId()), ScriptTransfer(i.caller, 1, assetId)]) ++ appendPerches), (reward * 1000000)) | |
369 | - | } | |
370 | - | } | |
371 | - | } | |
337 | + | else { | |
338 | + | let assetId = fromBase58String(asset) | |
339 | + | let unstaker = tryGetString((((("address_" + add) + "_asset_") + asset) + "_unstaker")) | |
340 | + | let address = if ((getMetaraceAddress() == i.caller)) | |
341 | + | then toString(i.caller) | |
342 | + | else add | |
343 | + | let assetFarmingPower = getLastKnownAssetFarmingPower(address, asset) | |
344 | + | let assetRewardDelta = calcAssetRewardDelta(address, asset, assetFarmingPower) | |
345 | + | let farmedAmount = (assetRewardDelta + tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_lastCheckFarmedAmount"))) | |
346 | + | let withdrawnAmount = tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount")) | |
347 | + | let reward = ((farmedAmount - withdrawnAmount) / (scale * 100)) | |
348 | + | let color = takeRight(value(assetInfo(assetId)).name, 1) | |
349 | + | let realCaller = toString(i.caller) | |
350 | + | if (if ((unstaker != "")) | |
351 | + | then (unstaker != realCaller) | |
352 | + | else false) | |
353 | + | then throw("It seems duck was staked throuh a dapp, not directly, please unstake through dapp!") | |
354 | + | else if ((0 >= assetFarmingPower)) | |
355 | + | then throw("asset not available") | |
356 | + | else { | |
357 | + | let isWithoutPerch = tryGetBoolean((((("address_" + address) + "_asset_") + asset) + "_without_perch")) | |
358 | + | if ((color == "U")) | |
359 | + | then throw("use another function to unstake Jackpot NFT") | |
360 | + | else { | |
361 | + | let result = getUnstakeResult(address, assetId, assetRewardDelta, reward, assetFarmingPower) | |
362 | + | let appendPerches = if (isWithoutPerch) | |
363 | + | then [DeleteEntry((((("address_" + address) + "_asset_") + asset) + "_without_perch"))] | |
364 | + | else [IntegerEntry(((("address_" + address) + "_perchesAvailable_") + color), (tryGetInteger(((("address_" + address) + "_perchesAvailable_") + color)) + 1))] | |
365 | + | $Tuple2(((result ++ [ScriptTransfer(i.caller, (reward * 1000000), getEggAssetId()), ScriptTransfer(i.caller, 1, assetId)]) ++ appendPerches), (reward * 1000000)) | |
366 | + | } | |
367 | + | } | |
368 | + | } | |
372 | 369 | } | |
373 | 370 | else throw("Strict value is not equal to itself.") | |
374 | 371 | } | |
453 | 450 | let locked = isLocked() | |
454 | 451 | if ((locked == locked)) | |
455 | 452 | then { | |
456 | - | let address = toString(i.originCaller) | |
453 | + | let address = if ((i.originCaller == getCfMasterAddress())) | |
454 | + | then toString(i.caller) | |
455 | + | else toString(i.originCaller) | |
457 | 456 | if (isUserBlacklisted(address)) | |
458 | 457 | then throw("Ooops, looks like you lost in one of the Ducksquid games! As you already know, any loss has its consequences, so you will be not able to claim your farming rewards till the end of DuckSquid game. Quack in peace!") | |
459 | 458 | else { |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 5 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let perchPrice = (100 * 1000000) | |
5 | 5 | ||
6 | 6 | let scale = 10000 | |
7 | 7 | ||
8 | 8 | let scale2 = 1000000 | |
9 | 9 | ||
10 | 10 | func tryGetStringExternal (address,key) = match getString(address, key) { | |
11 | 11 | case a: String => | |
12 | 12 | a | |
13 | 13 | case _ => | |
14 | 14 | "" | |
15 | 15 | } | |
16 | 16 | ||
17 | 17 | ||
18 | 18 | func tryGetString (key) = tryGetStringExternal(this, key) | |
19 | 19 | ||
20 | 20 | ||
21 | 21 | func getOracle () = Address(fromBase58String(tryGetString("static_oracleAddress"))) | |
22 | 22 | ||
23 | 23 | ||
24 | 24 | func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), "static_eggAssetId")) | |
25 | 25 | ||
26 | 26 | ||
27 | 27 | func getIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_incubatorAddress"))) | |
28 | 28 | ||
29 | 29 | ||
30 | 30 | func getRebirthAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_rebirthAddress"))) | |
31 | 31 | ||
32 | 32 | ||
33 | 33 | func getSwopPromoAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_swopPromoAddress"))) | |
34 | 34 | ||
35 | 35 | ||
36 | 36 | func getBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_breederAddress"))) | |
37 | 37 | ||
38 | 38 | ||
39 | 39 | func getRefContractAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_refContractAddress"))) | |
40 | 40 | ||
41 | 41 | ||
42 | 42 | func getItemsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_itemsAddress"))) | |
43 | 43 | ||
44 | 44 | ||
45 | 45 | func getMetaraceAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_metaRaceAddress"))) | |
46 | 46 | ||
47 | 47 | ||
48 | 48 | func getAccBoosterAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_accBoosterAddress"))) | |
49 | 49 | ||
50 | 50 | ||
51 | 51 | func getTrustedContracts () = tryGetStringExternal(getOracle(), "static_trustedContracts") | |
52 | 52 | ||
53 | 53 | ||
54 | 54 | func getMaintenance () = tryGetStringExternal(getOracle(), "static_maintenance") | |
55 | + | ||
56 | + | ||
57 | + | func getCfMasterAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_cfMasterAddress"))) | |
55 | 58 | ||
56 | 59 | ||
57 | 60 | let RefererReward = 5 | |
58 | 61 | ||
59 | 62 | func getRewardPerBlock () = 684 | |
60 | 63 | ||
61 | 64 | ||
62 | 65 | func isLocked () = if ((getMaintenance() != "")) | |
63 | 66 | then throw(getMaintenance()) | |
64 | 67 | else 0 | |
65 | 68 | ||
66 | 69 | ||
67 | 70 | func tryGetInteger (key) = match getInteger(this, key) { | |
68 | 71 | case b: Int => | |
69 | 72 | b | |
70 | 73 | case _ => | |
71 | 74 | 0 | |
72 | 75 | } | |
73 | 76 | ||
74 | 77 | ||
75 | 78 | func tryGetBoolean (key) = match getBoolean(this, key) { | |
76 | 79 | case b: Boolean => | |
77 | 80 | b | |
78 | 81 | case _ => | |
79 | 82 | false | |
80 | 83 | } | |
81 | 84 | ||
82 | 85 | ||
83 | 86 | func isUserBlacklisted (address) = false | |
84 | 87 | ||
85 | 88 | ||
86 | 89 | func getAssetOrigin (generation) = if ((generation == "G")) | |
87 | 90 | then getIncubatorAddress() | |
88 | 91 | else getBreederAddress() | |
89 | 92 | ||
90 | 93 | ||
91 | 94 | func getAssetRarity (genotype,generation) = { | |
92 | 95 | let quantity = valueOrErrorMessage(getInteger(getAssetOrigin(generation), (("stats_" + genotype) + "_quantity")), (("stats_" + genotype) + "_quantity not found")) | |
93 | 96 | let power = pow((10000 / quantity), 4, 5, 1, 2, FLOOR) | |
94 | 97 | if ((power > 0)) | |
95 | 98 | then power | |
96 | 99 | else 2 | |
97 | 100 | } | |
98 | 101 | ||
99 | 102 | ||
100 | 103 | func asString (value) = match value { | |
101 | 104 | case string: String => | |
102 | 105 | string | |
103 | 106 | case _ => | |
104 | 107 | throw("wrong type, expected: String") | |
105 | 108 | } | |
106 | 109 | ||
107 | 110 | ||
108 | 111 | func asInt (value) = match value { | |
109 | 112 | case int: Int => | |
110 | 113 | int | |
111 | 114 | case _ => | |
112 | 115 | throw("wrong type, expected: Int") | |
113 | 116 | } | |
114 | 117 | ||
115 | 118 | ||
116 | 119 | func getAssetFarmingPower (assetId,address) = if (if ((value(assetInfo(assetId)).issuer == getBreederAddress())) | |
117 | 120 | then true | |
118 | 121 | else (value(assetInfo(assetId)).issuer == getIncubatorAddress())) | |
119 | 122 | then { | |
120 | 123 | let assetName = value(assetInfo(assetId)).name | |
121 | 124 | let generation = take(takeRight(assetName, 2), 1) | |
122 | 125 | let farmGen = asString(invoke(getBreederAddress(), "getGenFromName", [assetName], nil)) | |
123 | 126 | if ((farmGen == farmGen)) | |
124 | 127 | then { | |
125 | 128 | let farmBoost = asInt(invoke(getItemsAddress(), "calculateFarmingPowerBoost", [toBase58String(assetId), address], nil)) | |
126 | 129 | if ((farmBoost == farmBoost)) | |
127 | 130 | then { | |
128 | 131 | let rarity = getAssetRarity(farmGen, generation) | |
129 | 132 | let totalFarmingPower = (rarity + fraction(rarity, farmBoost, 100)) | |
130 | 133 | $Tuple2(farmGen, totalFarmingPower) | |
131 | 134 | } | |
132 | 135 | else throw("Strict value is not equal to itself.") | |
133 | 136 | } | |
134 | 137 | else throw("Strict value is not equal to itself.") | |
135 | 138 | } | |
136 | 139 | else throw("not valid NFT") | |
137 | 140 | ||
138 | 141 | ||
139 | 142 | func getLastKnownAssetFarmingPower (address,assetId) = tryGetInteger((((("address_" + address) + "_asset_") + assetId) + "_farmingPower")) | |
140 | 143 | ||
141 | 144 | ||
142 | 145 | func getAssetsByGen (gen) = { | |
143 | 146 | let s = tryGetString(("assets_" + gen)) | |
144 | 147 | if ((s == "")) | |
145 | 148 | then nil | |
146 | 149 | else split(s, ",") | |
147 | 150 | } | |
148 | 151 | ||
149 | 152 | ||
150 | 153 | func calcInterest (previousInterest,previousInterestHeight,totalFarmingPower) = (previousInterest + (((scale * getRewardPerBlock()) * (height - previousInterestHeight)) / totalFarmingPower)) | |
151 | 154 | ||
152 | 155 | ||
153 | 156 | func getCurrentInterest () = if ((tryGetInteger("total_farmingPower") > 0)) | |
154 | 157 | then { | |
155 | 158 | let previousInterest = tryGetInteger("total_lastCheckInterest") | |
156 | 159 | let previousInterestHeight = tryGetInteger("total_lastCheckInterestHeight") | |
157 | 160 | let totalFarmingPower = tryGetInteger("total_farmingPower") | |
158 | 161 | calcInterest(previousInterest, previousInterestHeight, totalFarmingPower) | |
159 | 162 | } | |
160 | 163 | else if ((tryGetInteger("total_startHeight") != 0)) | |
161 | 164 | then tryGetInteger("total_lastCheckInterest") | |
162 | 165 | else throw("farming is not launched, yet") | |
163 | 166 | ||
164 | 167 | ||
165 | 168 | func calcAssetRewardDelta (address,assetId,assetFarmingPower) = { | |
166 | 169 | let lastCheckAssetInterest = tryGetInteger((((("address_" + address) + "_asset_") + assetId) + "_lastCheckInterest")) | |
167 | 170 | let currentInterest = getCurrentInterest() | |
168 | 171 | (assetFarmingPower * (currentInterest - lastCheckAssetInterest)) | |
169 | 172 | } | |
170 | 173 | ||
171 | 174 | ||
172 | 175 | func addAssetIdToGenEntry (assetId,assetGen) = { | |
173 | 176 | let currentValue = tryGetString((("assets_" + assetGen) + "_locked")) | |
174 | 177 | if ((currentValue == "")) | |
175 | 178 | then assetId | |
176 | 179 | else ((currentValue + ",") + assetId) | |
177 | 180 | } | |
178 | 181 | ||
179 | 182 | ||
180 | 183 | func getStakeResult (address,assetId,assetFarmingPower,unstaker) = { | |
181 | 184 | let asset = toBase58String(assetId) | |
182 | 185 | [IntegerEntry("total_farmingPower", (tryGetInteger("total_farmingPower") + assetFarmingPower)), IntegerEntry("total_lastCheckInterest", getCurrentInterest()), IntegerEntry("total_lastCheckInterestHeight", height), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_farmingPower"), assetFarmingPower), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_lastCheckInterest"), getCurrentInterest()), StringEntry((((("address_" + address) + "_asset_") + asset) + "_unstaker"), unstaker)] | |
183 | 186 | } | |
184 | 187 | ||
185 | 188 | ||
186 | 189 | func getUnstakeResult (address,assetId,rewardDelta,withdrawnAmount,assetFarmingPower) = { | |
187 | 190 | let asset = toBase58String(assetId) | |
188 | 191 | [IntegerEntry("total_farmingPower", (tryGetInteger("total_farmingPower") - assetFarmingPower)), IntegerEntry("total_lastCheckInterest", getCurrentInterest()), IntegerEntry("total_lastCheckInterestHeight", height), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_farmingPower"), 0), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_lastCheckInterest"), getCurrentInterest()), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount"), (tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount")) + (withdrawnAmount * scale2))), IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_lastCheckFarmedAmount"), (tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_lastCheckFarmedAmount")) + rewardDelta))] | |
189 | 192 | } | |
190 | 193 | ||
191 | 194 | ||
192 | 195 | func calculatePerchPrice (address) = { | |
193 | 196 | let hasArtefactStaked = tryGetStringExternal(getAccBoosterAddress(), (("ART-XMISTL_" + address) + "_owner")) | |
194 | 197 | if ((hasArtefactStaked == "")) | |
195 | 198 | then perchPrice | |
196 | 199 | else ((perchPrice / 10) * 9) | |
197 | 200 | } | |
198 | 201 | ||
199 | 202 | ||
200 | 203 | @Callable(i) | |
201 | 204 | func configureOracle (oracle) = if ((i.caller != this)) | |
202 | 205 | then throw("admin only") | |
203 | 206 | else [StringEntry("static_oracleAddress", oracle)] | |
204 | 207 | ||
205 | 208 | ||
206 | 209 | ||
207 | 210 | @Callable(i) | |
208 | 211 | func init () = if ((i.caller != this)) | |
209 | 212 | then throw("admin only") | |
210 | 213 | else [IntegerEntry("total_startHeight", height)] | |
211 | 214 | ||
212 | 215 | ||
213 | 216 | ||
214 | 217 | @Callable(i) | |
215 | 218 | func buyPerch (color,refererAddress) = { | |
216 | 219 | let locked = isLocked() | |
217 | 220 | if ((locked == locked)) | |
218 | 221 | then if ((0 > value(indexOf(["B", "R", "G", "Y"], color)))) | |
219 | 222 | then throw("you need to set color properly") | |
220 | 223 | else { | |
221 | 224 | let firstPayment = value(i.payments[0]) | |
222 | 225 | let exactPrice = calculatePerchPrice(toString(i.caller)) | |
223 | 226 | if ((firstPayment.assetId != getEggAssetId())) | |
224 | 227 | then throw(("You can attach only EGG tokens with the following asset id: " + toBase58String(getEggAssetId()))) | |
225 | 228 | else if ((firstPayment.amount != exactPrice)) | |
226 | 229 | then throw(("To buy a perch you currently need the following amount of EGGlets: " + toString(exactPrice))) | |
227 | 230 | else { | |
228 | 231 | let refererRewardForPerch = fraction(firstPayment.amount, RefererReward, 100) | |
229 | 232 | let refCall = invoke(getRefContractAddress(), "refPayment", [refererAddress], [AttachedPayment(getEggAssetId(), refererRewardForPerch)]) | |
230 | 233 | if ((refCall == refCall)) | |
231 | 234 | then { | |
232 | 235 | let perchAmountKey = ((("address_" + toString(i.caller)) + "_perchesAvailable_") + color) | |
233 | 236 | let perchAmount = tryGetInteger(perchAmountKey) | |
234 | 237 | [IntegerEntry(perchAmountKey, (perchAmount + 1))] | |
235 | 238 | } | |
236 | 239 | else throw("Strict value is not equal to itself.") | |
237 | 240 | } | |
238 | 241 | } | |
239 | 242 | else throw("Strict value is not equal to itself.") | |
240 | 243 | } | |
241 | 244 | ||
242 | 245 | ||
243 | 246 | ||
244 | 247 | @Callable(i) | |
245 | 248 | func addFreePerch (address,color) = { | |
246 | 249 | let locked = isLocked() | |
247 | 250 | if ((locked == locked)) | |
248 | 251 | then if ((0 > value(indexOf(["B", "R", "G", "Y"], color)))) | |
249 | 252 | then throw("you need to set color properly") | |
250 | 253 | else if (if (if ((i.caller != getRebirthAddress())) | |
251 | 254 | then (i.caller != this) | |
252 | 255 | else false) | |
253 | 256 | then (i.caller != getSwopPromoAddress()) | |
254 | 257 | else false) | |
255 | 258 | then throw("rebirth and swop promo only") | |
256 | 259 | else { | |
257 | 260 | let perchAmountKey = ((("address_" + address) + "_perchesAvailable_") + color) | |
258 | 261 | let perchAmount = tryGetInteger(perchAmountKey) | |
259 | 262 | $Tuple2([IntegerEntry(perchAmountKey, (perchAmount + 1))], "") | |
260 | 263 | } | |
261 | 264 | else throw("Strict value is not equal to itself.") | |
262 | 265 | } | |
263 | 266 | ||
264 | 267 | ||
265 | 268 | ||
266 | 269 | @Callable(i) | |
267 | 270 | func stakeNFT () = { | |
268 | 271 | let locked = isLocked() | |
269 | 272 | if ((locked == locked)) | |
270 | 273 | then { | |
271 | 274 | let pmt = value(i.payments[0]) | |
272 | 275 | let assetId = value(value(i.payments[0]).assetId) | |
273 | 276 | let realCaller = toString(i.caller) | |
274 | 277 | let address = if ((getMetaraceAddress() == i.caller)) | |
275 | 278 | then realCaller | |
276 | 279 | else toString(i.originCaller) | |
277 | 280 | let color = takeRight(value(assetInfo(assetId)).name, 1) | |
278 | 281 | let availablePerches = tryGetInteger(((("address_" + address) + "_perchesAvailable_") + color)) | |
279 | 282 | if ((pmt.amount != 1)) | |
280 | 283 | then throw("NFT is not attached") | |
281 | 284 | else if ((0 >= availablePerches)) | |
282 | 285 | then throw(("no perches available for the color " + color)) | |
283 | 286 | else { | |
284 | - | let $ | |
285 | - | let assetGen = $ | |
286 | - | let assetFarmingPower = $ | |
287 | + | let $t01023810311 = getAssetFarmingPower(assetId, address) | |
288 | + | let assetGen = $t01023810311._1 | |
289 | + | let assetFarmingPower = $t01023810311._2 | |
287 | 290 | (getStakeResult(address, assetId, assetFarmingPower, realCaller) ++ [IntegerEntry(((("address_" + address) + "_perchesAvailable_") + color), (availablePerches - 1))]) | |
288 | 291 | } | |
289 | 292 | } | |
290 | 293 | else throw("Strict value is not equal to itself.") | |
291 | 294 | } | |
292 | 295 | ||
293 | 296 | ||
294 | 297 | ||
295 | 298 | @Callable(i) | |
296 | 299 | func stakeNFTWithoutPerch () = { | |
297 | 300 | let locked = isLocked() | |
298 | 301 | if ((locked == locked)) | |
299 | 302 | then { | |
300 | 303 | let allowedContracts = getTrustedContracts() | |
301 | 304 | let allowedContractsList = split(allowedContracts, ";") | |
302 | 305 | let dappToCall = toString(i.caller) | |
303 | 306 | if ((indexOf(allowedContractsList, dappToCall) == unit)) | |
304 | 307 | then throw("Only trusted smart contracts can stake without a perch!") | |
305 | - | else if ((isLocked() > 0)) | |
306 | - | then throw("EGG operations are temporarily locked") | |
307 | - | else { | |
308 | - | let pmt = value(i.payments[0]) | |
309 | - | let assetId = value(value(i.payments[0]).assetId) | |
310 | - | let address = toString(i.originCaller) | |
311 | - | if ((pmt.amount != 1)) | |
312 | - | then throw("NFT is not attached") | |
313 | - | else { | |
314 | - | let $t01102511098 = getAssetFarmingPower(assetId, address) | |
315 | - | let assetGen = $t01102511098._1 | |
316 | - | let assetFarmingPower = $t01102511098._2 | |
317 | - | let asset = toBase58String(assetId) | |
318 | - | let realCaller = toString(i.caller) | |
319 | - | (getStakeResult(address, assetId, assetFarmingPower, realCaller) ++ [BooleanEntry((((("address_" + address) + "_asset_") + asset) + "_without_perch"), true)]) | |
320 | - | } | |
321 | - | } | |
308 | + | else { | |
309 | + | let pmt = value(i.payments[0]) | |
310 | + | let assetId = value(value(i.payments[0]).assetId) | |
311 | + | let address = toString(i.originCaller) | |
312 | + | if ((pmt.amount != 1)) | |
313 | + | then throw("NFT is not attached") | |
314 | + | else { | |
315 | + | let $t01105111124 = getAssetFarmingPower(assetId, address) | |
316 | + | let assetGen = $t01105111124._1 | |
317 | + | let assetFarmingPower = $t01105111124._2 | |
318 | + | let asset = toBase58String(assetId) | |
319 | + | let realCaller = toString(i.caller) | |
320 | + | (getStakeResult(address, assetId, assetFarmingPower, realCaller) ++ [BooleanEntry((((("address_" + address) + "_asset_") + asset) + "_without_perch"), true)]) | |
321 | + | } | |
322 | + | } | |
322 | 323 | } | |
323 | 324 | else throw("Strict value is not equal to itself.") | |
324 | 325 | } | |
325 | 326 | ||
326 | 327 | ||
327 | 328 | ||
328 | 329 | @Callable(i) | |
329 | 330 | func unstakeNFT (asset) = { | |
330 | 331 | let locked = isLocked() | |
331 | 332 | if ((locked == locked)) | |
332 | 333 | then { | |
333 | 334 | let add = toString(i.originCaller) | |
334 | 335 | if (isUserBlacklisted(add)) | |
335 | 336 | then throw("Ooops, looks like you lost in one of the Ducksquid games! As you already know, any loss has its consequences, so you will be not able to claim your farming rewards till the end of DuckSquid game. Quack in peace!") | |
336 | - | else if ((isLocked() > 0)) | |
337 | - | then throw("EGG operations are temporarily locked") | |
338 | - | else { | |
339 | - | let assetId = fromBase58String(asset) | |
340 | - | let unstaker = tryGetString((((("address_" + add) + "_asset_") + asset) + "_unstaker")) | |
341 | - | let address = if (if ((unstaker == "")) | |
342 | - | then (getMetaraceAddress() == i.caller) | |
343 | - | else false) | |
344 | - | then toString(i.caller) | |
345 | - | else add | |
346 | - | let assetFarmingPower = getLastKnownAssetFarmingPower(address, asset) | |
347 | - | let assetRewardDelta = calcAssetRewardDelta(address, asset, assetFarmingPower) | |
348 | - | let farmedAmount = (assetRewardDelta + tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_lastCheckFarmedAmount"))) | |
349 | - | let withdrawnAmount = tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount")) | |
350 | - | let reward = ((farmedAmount - withdrawnAmount) / (scale * 100)) | |
351 | - | let color = takeRight(value(assetInfo(assetId)).name, 1) | |
352 | - | let realCaller = toString(i.caller) | |
353 | - | if (if ((unstaker != "")) | |
354 | - | then (unstaker != realCaller) | |
355 | - | else false) | |
356 | - | then throw("It seems duck was staked throuh a dapp, not directly, please unstake through dapp!") | |
357 | - | else if ((0 >= assetFarmingPower)) | |
358 | - | then throw("asset not available") | |
359 | - | else { | |
360 | - | let isWithoutPerch = tryGetBoolean((((("address_" + address) + "_asset_") + asset) + "_without_perch")) | |
361 | - | if ((color == "U")) | |
362 | - | then throw("use another function to unstake Jackpot NFT") | |
363 | - | else { | |
364 | - | let result = getUnstakeResult(address, assetId, assetRewardDelta, reward, assetFarmingPower) | |
365 | - | let appendPerches = if (isWithoutPerch) | |
366 | - | then [DeleteEntry((((("address_" + address) + "_asset_") + asset) + "_without_perch"))] | |
367 | - | else [IntegerEntry(((("address_" + address) + "_perchesAvailable_") + color), (tryGetInteger(((("address_" + address) + "_perchesAvailable_") + color)) + 1))] | |
368 | - | $Tuple2(((result ++ [ScriptTransfer(i.caller, (reward * 1000000), getEggAssetId()), ScriptTransfer(i.caller, 1, assetId)]) ++ appendPerches), (reward * 1000000)) | |
369 | - | } | |
370 | - | } | |
371 | - | } | |
337 | + | else { | |
338 | + | let assetId = fromBase58String(asset) | |
339 | + | let unstaker = tryGetString((((("address_" + add) + "_asset_") + asset) + "_unstaker")) | |
340 | + | let address = if ((getMetaraceAddress() == i.caller)) | |
341 | + | then toString(i.caller) | |
342 | + | else add | |
343 | + | let assetFarmingPower = getLastKnownAssetFarmingPower(address, asset) | |
344 | + | let assetRewardDelta = calcAssetRewardDelta(address, asset, assetFarmingPower) | |
345 | + | let farmedAmount = (assetRewardDelta + tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_lastCheckFarmedAmount"))) | |
346 | + | let withdrawnAmount = tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount")) | |
347 | + | let reward = ((farmedAmount - withdrawnAmount) / (scale * 100)) | |
348 | + | let color = takeRight(value(assetInfo(assetId)).name, 1) | |
349 | + | let realCaller = toString(i.caller) | |
350 | + | if (if ((unstaker != "")) | |
351 | + | then (unstaker != realCaller) | |
352 | + | else false) | |
353 | + | then throw("It seems duck was staked throuh a dapp, not directly, please unstake through dapp!") | |
354 | + | else if ((0 >= assetFarmingPower)) | |
355 | + | then throw("asset not available") | |
356 | + | else { | |
357 | + | let isWithoutPerch = tryGetBoolean((((("address_" + address) + "_asset_") + asset) + "_without_perch")) | |
358 | + | if ((color == "U")) | |
359 | + | then throw("use another function to unstake Jackpot NFT") | |
360 | + | else { | |
361 | + | let result = getUnstakeResult(address, assetId, assetRewardDelta, reward, assetFarmingPower) | |
362 | + | let appendPerches = if (isWithoutPerch) | |
363 | + | then [DeleteEntry((((("address_" + address) + "_asset_") + asset) + "_without_perch"))] | |
364 | + | else [IntegerEntry(((("address_" + address) + "_perchesAvailable_") + color), (tryGetInteger(((("address_" + address) + "_perchesAvailable_") + color)) + 1))] | |
365 | + | $Tuple2(((result ++ [ScriptTransfer(i.caller, (reward * 1000000), getEggAssetId()), ScriptTransfer(i.caller, 1, assetId)]) ++ appendPerches), (reward * 1000000)) | |
366 | + | } | |
367 | + | } | |
368 | + | } | |
372 | 369 | } | |
373 | 370 | else throw("Strict value is not equal to itself.") | |
374 | 371 | } | |
375 | 372 | ||
376 | 373 | ||
377 | 374 | ||
378 | 375 | @Callable(i) | |
379 | 376 | func stakeJackpot (color) = { | |
380 | 377 | let locked = isLocked() | |
381 | 378 | if ((locked == locked)) | |
382 | 379 | then { | |
383 | 380 | let pmt = value(i.payments[0]) | |
384 | 381 | let assetId = value(pmt.assetId) | |
385 | 382 | let realCaller = toString(i.caller) | |
386 | 383 | let address = if ((getMetaraceAddress() == i.caller)) | |
387 | 384 | then realCaller | |
388 | 385 | else toString(i.originCaller) | |
389 | 386 | let availablePerches = tryGetInteger(((("address_" + address) + "_perchesAvailable_") + color)) | |
390 | 387 | let assetIssuer = value(assetInfo(assetId)).issuer | |
391 | 388 | if ((pmt.amount != 1)) | |
392 | 389 | then throw("NFT is not attached") | |
393 | 390 | else if (if ((assetIssuer == getIncubatorAddress())) | |
394 | 391 | then true | |
395 | 392 | else (assetIssuer == getBreederAddress())) | |
396 | 393 | then if ((takeRight(value(value(assetInfo(assetId)).name), 1) != "U")) | |
397 | 394 | then throw("jackpot only") | |
398 | 395 | else if ((0 >= availablePerches)) | |
399 | 396 | then throw(("no perches available for the color " + color)) | |
400 | 397 | else (getStakeResult(address, assetId, 100, realCaller) ++ [IntegerEntry(((("address_" + address) + "_perchesAvailable_") + color), (availablePerches - 1)), StringEntry((((("address_" + address) + "_asset_") + toBase58String(assetId)) + "_perchColor"), color)]) | |
401 | 398 | else throw("asset is not valid") | |
402 | 399 | } | |
403 | 400 | else throw("Strict value is not equal to itself.") | |
404 | 401 | } | |
405 | 402 | ||
406 | 403 | ||
407 | 404 | ||
408 | 405 | @Callable(i) | |
409 | 406 | func unstakeJackpot (asset) = { | |
410 | 407 | let locked = isLocked() | |
411 | 408 | if ((locked == locked)) | |
412 | 409 | then { | |
413 | 410 | let realCaller = toString(i.caller) | |
414 | 411 | let address = if ((getMetaraceAddress() == i.caller)) | |
415 | 412 | then realCaller | |
416 | 413 | else toString(i.originCaller) | |
417 | 414 | if (isUserBlacklisted(address)) | |
418 | 415 | then throw("Ooops, looks like you lost in one of the Ducksquid games! As you already know, any loss has its consequences, so you will be not able to claim your farming rewards till the end of DuckSquid game. Quack in peace!") | |
419 | 416 | else { | |
420 | 417 | let assetId = fromBase58String(asset) | |
421 | 418 | let color = tryGetString((((("address_" + address) + "_asset_") + asset) + "_perchColor")) | |
422 | 419 | let assetFarmingPower = getLastKnownAssetFarmingPower(address, asset) | |
423 | 420 | let assetRewardDelta = calcAssetRewardDelta(address, asset, assetFarmingPower) | |
424 | 421 | let farmedAmount = (assetRewardDelta + tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_lastCheckFarmedAmount"))) | |
425 | 422 | let withdrawnAmount = tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount")) | |
426 | 423 | let reward = ((farmedAmount - withdrawnAmount) / (scale * 100)) | |
427 | 424 | let unstaker = tryGetString((((("address_" + address) + "_asset_") + asset) + "_unstaker")) | |
428 | 425 | if (if ((unstaker != "")) | |
429 | 426 | then (unstaker != realCaller) | |
430 | 427 | else false) | |
431 | 428 | then throw("It seems duck was staked throuh a dapp, not directly, please unstake through dapp!") | |
432 | 429 | else if ((takeRight(value(value(assetInfo(assetId)).name), 1) != "U")) | |
433 | 430 | then throw("jackpot only") | |
434 | 431 | else if ((assetFarmingPower > 0)) | |
435 | 432 | then { | |
436 | 433 | let result = getUnstakeResult(address, assetId, assetRewardDelta, reward, assetFarmingPower) | |
437 | 434 | let isWithoutPerch = tryGetBoolean((((("address_" + address) + "_asset_") + asset) + "_without_perch")) | |
438 | 435 | let appendPerches = if (isWithoutPerch) | |
439 | 436 | then [DeleteEntry((((("address_" + address) + "_asset_") + asset) + "_without_perch"))] | |
440 | 437 | else [IntegerEntry(((("address_" + address) + "_perchesAvailable_") + color), (tryGetInteger(((("address_" + address) + "_perchesAvailable_") + color)) + 1))] | |
441 | 438 | $Tuple2(((result ++ appendPerches) ++ [ScriptTransfer(i.caller, (reward * 1000000), getEggAssetId()), ScriptTransfer(i.caller, 1, assetId)]), (reward * 1000000)) | |
442 | 439 | } | |
443 | 440 | else throw("") | |
444 | 441 | } | |
445 | 442 | } | |
446 | 443 | else throw("Strict value is not equal to itself.") | |
447 | 444 | } | |
448 | 445 | ||
449 | 446 | ||
450 | 447 | ||
451 | 448 | @Callable(i) | |
452 | 449 | func claimReward (asset) = { | |
453 | 450 | let locked = isLocked() | |
454 | 451 | if ((locked == locked)) | |
455 | 452 | then { | |
456 | - | let address = toString(i.originCaller) | |
453 | + | let address = if ((i.originCaller == getCfMasterAddress())) | |
454 | + | then toString(i.caller) | |
455 | + | else toString(i.originCaller) | |
457 | 456 | if (isUserBlacklisted(address)) | |
458 | 457 | then throw("Ooops, looks like you lost in one of the Ducksquid games! As you already know, any loss has its consequences, so you will be not able to claim your farming rewards till the end of DuckSquid game. Quack in peace!") | |
459 | 458 | else { | |
460 | 459 | let assetId = fromBase58String(asset) | |
461 | 460 | let assetFarmingPower = getLastKnownAssetFarmingPower(address, asset) | |
462 | 461 | let assetRewardDelta = calcAssetRewardDelta(address, asset, assetFarmingPower) | |
463 | 462 | let farmedAmount = (assetRewardDelta + tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_lastCheckFarmedAmount"))) | |
464 | 463 | let withdrawnAmount = tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount")) | |
465 | 464 | let reward = ((farmedAmount - withdrawnAmount) / (scale * 100)) | |
466 | 465 | if ((0 >= reward)) | |
467 | 466 | then throw("you have no EGGs to withdraw") | |
468 | 467 | else $Tuple2([IntegerEntry((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount"), (tryGetInteger((((("address_" + address) + "_asset_") + asset) + "_withdrawnAmount")) + (reward * scale2))), ScriptTransfer(Address(fromBase58String(address)), (reward * 1000000), getEggAssetId())], (reward * 1000000)) | |
469 | 468 | } | |
470 | 469 | } | |
471 | 470 | else throw("Strict value is not equal to itself.") | |
472 | 471 | } | |
473 | 472 | ||
474 | 473 |
github/deemru/w8io/786bc32 95.42 ms ◑