2022.04.12 12:07 [3070477] smart account 3PAi1ePLQrYrY3jj9omBtT6isMkZsapbmks > SELF 0.00000000 Waves

{ "type": 13, "id": "CnCTkGviczb5Weanzq6vMXhAiuyRyYFFcKzQJtxVejKn", "fee": 1400000, "feeAssetId": null, "timestamp": 1649754462753, "version": 2, "chainId": 87, "sender": "3PAi1ePLQrYrY3jj9omBtT6isMkZsapbmks", "senderPublicKey": "XrNmTusDFaLSz3wAjmdfcyC5h6uYyVbpdh18758UpFv", "proofs": [ "4FzBd33yrkLaQ7dM9vzXL3JKFAGDWAH4r9hgecnLMHwmwzvxz22hAy4b8NAgAW4deNuB91PgbUcY3jEypEnrwGoc" ], "script": "base64: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AAJZAAAAAQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAACAAAAFXN0YXRpY19icmVlZGVyQWRkcmVzcwEAAAANZ2V0RWdnQXNzZXRJZAAAAAAJAAJZAAAAAQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAACAAAAEXN0YXRpY19lZ2dBc3NldElkAQAAABNnZXRUcnVzdGVkQ29udHJhY3RzAAAAAAkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAACAAAAF3N0YXRpY190cnVzdGVkQ29udHJhY3RzAQAAAAhhc1N0cmluZwAAAAEAAAAFdmFsdWUEAAAAByRtYXRjaDAFAAAABXZhbHVlAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAABnN0cmluZwUAAAAHJG1hdGNoMAUAAAAGc3RyaW5nCQAAAgAAAAECAAAAHHdyb25nIHR5cGUsIGV4cGVjdGVkOiBTdHJpbmcBAAAABWFzSW50AAAAAQAAAAV2YWx1ZQQAAAAHJG1hdGNoMAUAAAAFdmFsdWUDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAADaW50BQAAAAckbWF0Y2gwBQAAAANpbnQJAAACAAAAAQIAAAAZd3JvbmcgdHlwZSwgZXhwZWN0ZWQ6IEludAEAAAAObWFuaXB1bGF0ZU5hbWUAAAADAAAACWFzc2V0TmFtZQAAAAhwb3NpdGlvbgAAAARjaGFyCQABLAAAAAIJAAEsAAAAAgkAAS8AAAACBQAAAAlhc3NldE5hbWUJAABlAAAAAgUAAAAIcG9zaXRpb24AAAAAAAAAAAEFAAAABGNoYXIJAQAAAAl0YWtlUmlnaHQAAAACBQAAAAlhc3NldE5hbWUJAABlAAAAAgAAAAAAAAAAEAUAAAAIcG9zaXRpb24BAAAAEGl0ZW1Jc0luQ29vbERvd24AAAACAAAADGFydGVmYWN0TmFtZQAAAAphcnRlZmFjdElkBAAAABF1bnN0YWtlSGVpZ2h0TGFzdAkBAAAADXRyeUdldEludGVnZXIAAAABCQEAAAAQa2V5VW5zdGFrZUhlaWdodAAAAAIFAAAADGFydGVmYWN0TmFtZQUAAAAKYXJ0ZWZhY3RJZAQAAAAOY29vbGRvd25QZXJpb2QAAAAAAAAAAPADCQAAZgAAAAIFAAAABmhlaWdodAkAAGQAAAACBQAAABF1bnN0YWtlSGVpZ2h0TGFzdAUAAAAOY29vbGRvd25QZXJpb2QHBgAAABEAAAABaQEAAAAPbWFuaXB1bGF0ZUJvb3N0AAAAAgAAAAVib29zdAAAAAZkdWNrSWQEAAAAEGFsbG93ZWRDb250cmFjdHMJAQAAABNnZXRUcnVzdGVkQ29udHJhY3RzAAAAAAQAAAAUYWxsb3dlZENvbnRyYWN0c0xpc3QJAAS1AAAAAgUAAAAQYWxsb3dlZENvbnRyYWN0cwIAAAABOwQAAAAKZGFwcFRvQ2FsbAkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIDCQAAAAAAAAIJAARPAAAAAgUAAAAUYWxsb3dlZENvbnRyYWN0c0xpc3QFAAAACmRhcHBUb0NhbGwFAAAABHVuaXQJAAACAAAAAQIAAAAvVGhpcyBzbWFydCBjb250cmFjdCBjYW4ndCBtYW5pcHVsYXRlIHRoZSBib29zdCEEAAAAA2tleQkBAAAAFGtleUV4dGVybmFsQm9vc3REdWNrAAAAAQUAAAAGZHVja0lkBAAAAAthY3RpdmVCb29zdAkBAAAADXRyeUdldEludGVnZXIAAAABBQAAAANrZXkEAAAACG5ld0Jvb3N0CQAAZAAAAAIFAAAAC2FjdGl2ZUJvb3N0BQAAAAVib29zdAMJAABmAAAAAgAAAAAAAAAAAAUAAAAIbmV3Qm9vc3QJAAACAAAAAQIAAAA7U29tZXRoaW5nIHdlbnQgd3Jvbmcgd2l0aCBib29zdCwgcGxlYXNlIGNvbnRhY3QgdGhlIGFkbWlucyEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAA2tleQUAAAAIbmV3Qm9vc3QFAAAAA25pbAAAAAFpAQAAABRjaGVja0FydGVmYWN0RGV0YWlscwAAAAEAAAAHYXNzZXRJZAQAAAAFYXNzZXQJAQAAAAV2YWx1ZQAAAAEJAAPsAAAAAQkAAlkAAAABBQAAAAdhc3NldElkBAAAAAlhc3NldE5hbWUJAQAAAAV2YWx1ZQAAAAEIBQAA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AAIIBQAAAAxmaXJzdFBheW1lbnQAAAAGYW1vdW50AAAAAAAAAAABCQAAAgAAAAECAAAAE05GVCBpcyBub3QgYXR0YWNoZWQEAAAACGFydGVmYWN0CQEAAAAIYXNTdHJpbmcAAAABCQAD/AAAAAQFAAAABHRoaXMCAAAAFGNoZWNrQXJ0ZWZhY3REZXRhaWxzCQAETAAAAAIFAAAADGZpcnN0QXNzZXRJZAUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAACGFydGVmYWN0BQAAAAhhcnRlZmFjdAMJAQAAAAIhPQAAAAIFAAAACGFydGVmYWN0AgAAAAxBUlQtRlJFRUdFTkUJAAACAAAAAQIAAAAqWW91IG5lZWQgdG8gYXR0YWNoIGEgQVJULUZSRUVHRU5FIGFydGVmYWN0BAAAAAR0eElkCQACWQAAAAEFAAAAB3R4SWRTdHIEAAAAD2ZpbmlzaEhlaWdodEtleQkBAAAAGWdldFByb2Nlc3NGaW5pc2hIZWlnaHRLZXkAAAACCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgUAAAAEdHhJZAQAAAATcHJvY2Vzc0ZpbmlzaEhlaWdodAkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgkBAAAAEWdldEJyZWVkZXJBZGRyZXNzAAAAAAUAAAAPZmluaXNoSGVpZ2h0S2V5BAAAAAxzZWxlY3RlZEdlbmUJAQAAAA5nZXRSYW5kb21HZW5lcwAAAAIFAAAABHR4SWQFAAAAE3Byb2Nlc3NGaW5pc2hIZWlnaHQEAAAADnJhbmRvbVBvc2l0aW9uCQEAAAAPZ2V0UmFuZG9tTnVtYmVyAAAABAAAAAAAAAAABwUAAAAEdHhJZAUAAAATcHJvY2Vzc0ZpbmlzaEhlaWdodAAAAAAAAAAAAwQAAAAPZHVja0dlbmVzU3RyaW5nCQEAAAAIYXNTdHJpbmcAAAABCQAD/AAAAAQJAQAAABFnZXRCcmVlZGVyQWRkcmVzcwAAAAACAAAADGdlbmVyYXRlRHVjawkABEwAAAACBQAAAAd0eElkU3RyCQAETAAAAAIFAAAAE3Byb2Nlc3NGaW5pc2hIZWlnaHQJAARMAAAAAgAAAAAAAAAAAAkABEwAAAACAAAAAAAAAAAACQAETAAAAAIFAAAADHNlbGVjdGVkR2VuZQkABEwAAAACBQAAAA5yYW5kb21Qb3NpdGlvbgUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAAD2R1Y2tHZW5lc1N0cmluZwUAAAAPZHVja0dlbmVzU3RyaW5nBAAAAARjYWxsCQAD/AAAAAQJAQAAABFnZXRCcmVlZGVyQWRkcmVzcwAAAAACAAAAF2ZpbmlzaER1Y2tIYXRjaGluZ0l0ZW1zCQAETAAAAAIFAAAAB3R4SWRTdHIJAARMAAAAAgUAAAAPZHVja0dlbmVzU3RyaW5nBQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAAEY2FsbAUAAAAEY2FsbAkABEwAAAACCQEAAAAEQnVybgAAAAIJAQAAAAV2YWx1ZQAAAAEIBQAAAAxmaXJzdFBheW1lbnQAAAAHYXNzZXRJZAAAAAAAAAAAAQUAAAADbmlsCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAACGNvcHlEdWNrAAAAAAQAAAAMZmlyc3RQYXltZW50CQEAAAAFdmFsdWUAAAABCQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAABAAAAA1zZWNvbmRQYXltZW50CQEAAAAFdmFsdWUAAAABCQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABBAAAAAxmaXJzdEFzc2V0SWQJAAJYAAAAAQkBAAAABXZhbHVlAAAAAQgFAAAADGZpcnN0UGF5bWVudAAAAAdhc3NldElkBAAAAAhjaGlsZHJlbgkBAAAABWFzSW50AAAAAQkAA/wAAAAECQEAAAARZ2V0QnJlZWRlckFkZHJlc3MAAAAAAgAAABZ2YWxpZGF0ZUFuZEdldENoaWxkcmVuCQAETAAAAAIFAAAADGZpcnN0QXNzZXRJZAUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAACGNoaWxkcmVuBQAAAAhjaGlsZHJlbgMDCQEAAAACIT0AAAACCAUAAAAMZmlyc3RQYXltZW50AAAABmFtb3VudAAAAAAAAAAAAQYJAQAAAAIhPQAAAAIIBQAAAA1zZWNvbmRQYXltZW50AAAABmFtb3VudAAAAAAAAAAAAQkAAAIAAAABAgAAABNORlQgaXMgbm90IGF0dGFjaGVkBAAAAAhhcnRlZmFjdAkBAAAACGFzU3RyaW5nAAAAAQkAA/wAAAAEBQAAAAR0aGlzAgAAABRjaGVja0FydGVmYWN0RGV0YWlscwkABEwAAAACCQACWAAAAAEJAQAAAAV2YWx1ZQAAAAEIBQAAAA1zZWNvbmRQYXltZW50AAAAB2Fzc2V0SWQFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAAhhcnRlZmFjdAUAAAAIYXJ0ZWZhY3QDCQEAAAACIT0AAAACBQAAAAhhcnRlZmFjdAIAAAAKQVJULU1JUlJPUgkAAAIAAAABAgAAAChZb3UgbmVlZCB0byBhdHRhY2ggYSBBUlQtTUlSUk9SIGFydGVmYWN0BAAAAAduZnRJbmZvCQEAAAAFdmFsdWUAAAABCQAD7AAAAAEJAQAAAAV2YWx1ZQAAAAEIBQAAAAxmaXJzdFBheW1lbnQAAAAHYXNzZXRJZAQAAAAJYXNzZXQxR2VuCQAEtQAAAAIIBQAAAAduZnRJbmZvAAAABG5hbWUCAAAAAAMDCQAAAAAAAAIJAAGRAAAAAgUAAAAJYXNzZXQxR2VuAAAAAAAAAAAOAgAAAAFHBgkAAAAAAAACCQABkQAAAAIFAAAACWFzc2V0MUdlbgAAAAAAAAAADgIAAAABSgkAAAIAAAABAgAAABpZb3UgY2FuJ3QgbWlycm9yIHRoaXMgZHVjawQAAAAHZHVja0dlbggFAAAAB25mdEluZm8AAAAEbmFtZQQAAAAEY2FsbAkAA/wAAAAECQEAAAARZ2V0QnJlZWRlckFkZHJlc3MAAAAAAgAAABZjcmVhdGVEdWNrU3BlY2lhbEdlbmVzCQAETAAAAAIICAUAAAABaQAAAAZjYWxsZXIAAAAFYnl0ZXMJAARMAAAAAgUAAAAHZHVja0dlbgkABEwAAAACBQAAAAhjaGlsZHJlbgUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAABGNhbGwFAAAABGNhbGwJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyAAAAAAAAAAABCAUAAAAMZmlyc3RQYXltZW50AAAAB2Fzc2V0SWQJAARMAAAAAgkBAAAABEJ1cm4AAAACCQEAAAAFdmFsdWUAAAABCAUAAAANc2Vjb25kUGF5bWVudAAAAAdhc3NldElkAAAAAAAAAAABBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAOd2Vhckl0ZW1Ub0R1Y2sAAAAABAAAAAxmaXJzdFBheW1lbnQJAQAAAAV2YWx1ZQAAAAEJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAEAAAADXNlY29uZFBheW1lbnQJAQAAAAV2YWx1ZQAAAAEJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEEAAAABmR1Y2tJZAkAAlgAAAABCQEAAAAFdmFsdWUAAAABCAUAAAAMZmlyc3RQYXltZW50AAAAB2Fzc2V0SWQEAAAADXNlY29uZEFzc2V0SWQJAAJYAAAAAQkBAAAABXZhbHVlAAAAAQgFAAAADXNlY29uZFBheW1lbnQAAAAHYXNzZXRJZAMDCQEAAAACIT0AAAACCAUAAAAMZmlyc3RQYXltZW50AAAABmFtb3VudAAAAAAAAAAAAQYJAQAAAAIhPQAAAAIIBQAAAA1zZWNvbmRQYXltZW50AAAABmFtb3VudAAAAAAAAAAAAQkAAAIAAAABAgAAABNORlQgaXMgbm90IGF0dGFjaGVkBAAAAAhjaGlsZHJlbgkBAAAABWFzSW50AAAAAQkAA/wAAAAECQEAAAARZ2V0QnJlZWRlckFkZHJlc3MAAAAAAgAAABZ2YWxpZGF0ZUFuZEdldENoaWxkcmVuCQAETAAAAAIFAAAABmR1Y2tJZAUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAACGNoaWxkcmVuBQAAAAhjaGlsZHJlbgQAAAAMYXJ0ZWZhY3ROYW1lCQEAAAAIYXNTdHJpbmcAAAABCQAD/AAAAAQFAAAABHRoaXMCAAAAFGNoZWNrQXJ0ZWZhY3REZXRhaWxzCQAETAAAAAIFAAAADXNlY29uZEFzc2V0SWQFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAAxhcnRlZmFjdE5hbWUFAAAADGFydGVmYWN0TmFtZQMJAQAAAAIhPQAAAAIFAAAADGFydGVmYWN0TmFtZQIAAAAKQVJULVhTQ0FSRgkAAAIAAAABAgAAAChZb3UgbmVlZCB0byBhdHRhY2ggYSBBUlQtWFNDQVJGIGFydGVmYWN0BAAAAAphcnRlZmFjdElkCQEAAAAMdHJ5R2V0U3RyaW5nAAAAAQkBAAAAD2tleUFydGVmYWN0RHVjawAAAAIFAAAADGFydGVmYWN0TmFtZQUAAAAGZHVja0lkAwkAAAAAAAACBQAAAAphcnRlZmFjdElkAgAAAAAJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAD2tleUFydGVmYWN0RHVjawAAAAIFAAAADGFydGVmYWN0TmFtZQUAAAAGZHVja0lkBQAAAA1zZWNvbmRBc3NldElkCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgAAAAAAAAAAAQgFAAAADGZpcnN0UGF5bWVudAAAAAdhc3NldElkBQAAAANuaWwJAAACAAAAAQkAASwAAAACAgAAABpEdWNrIGlzIGFscmVhZHkgd2VhcmluZyBhIAUAAAAMYXJ0ZWZhY3ROYW1lCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAARYWRkQXJ0ZUZhY3RUb0R1Y2sAAAAABAAAAAxmaXJzdFBheW1lbnQJAQAAAAV2YWx1ZQAAAAEJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAEAAAADXNlY29uZFBheW1lbnQJAQAAAAV2YWx1ZQAAAAEJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEEAAAADGZpcnN0QXNzZXRJZAkAAlgAAAABCQEAAAAFdmFsdWUAAAABCAUAAAAMZmlyc3RQYXltZW50AAAAB2Fzc2V0SWQDAwkBAAAAAiE9AAAAAggFAAAADGZpcnN0UGF5bWVudAAAAAZhbW91bnQAAAAAAAAAAAEGCQEAAAACIT0AAAACCAUAAAANc2Vjb25kUGF5bWVudAAAAAZhbW91bnQAAAAAAAAAAAEJAAACAAAAAQIAAAATTkZUIGlzIG5vdCBhdHRhY2hlZAQAAAAIY2hpbGRyZW4JAQAAAAVhc0ludAAAAAEJAAP8AAAABAkBAAAAEWdldEJyZWVkZXJBZGRyZXNzAAAAAAIAAAAWdmFsaWRhdGVBbmRHZXRDaGlsZHJlbgkABEwAAAACBQAAAAxmaXJzdEFzc2V0SWQFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAAhjaGlsZHJlbgUAAAAIY2hpbGRyZW4DCQAAAAAAAAIFAAAACGNoaWxkcmVuAAAAAAAAAAAACQAAAgAAAAECAAAAJFlvdSBjYW4gb25seSBwaWNrIGEgc3RlcmlsZSBORlQtZHVjawQAAAAIYXJ0ZWZhY3QJAQAAAAhhc1N0cmluZwAAAAEJAAP8AAAABAUAAAAEdGhpcwIAAAAUY2hlY2tBcnRlZmFjdERldGFpbHMJAARMAAAAAgkAAlgAAAABCQEAAAAFdmFsdWUAAAABCAUAAAANc2Vjb25kUGF5bWVudAAAAAdhc3NldElkBQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAAIYXJ0ZWZhY3QFAAAACGFydGVmYWN0AwMJAQAAAAIhPQAAAAIFAAAACGFydGVmYWN0AgAAAAhBUlQtWEhBVAkBAAAAAiE9AAAAAgUAAAAIYXJ0ZWZhY3QCAAAACEFSVC1QT01QBwkAAAIAAAABAgAAADJZb3UgbmVlZCB0byBhdHRhY2ggYSBBUlQtWEhBVCBvciBBUlQtUE9NUCBhcnRlZmFjdAQAAAAHbmZ0SW5mbwkBAAAABXZhbHVlAAAAAQkAA+wAAAABCQEAAAAFdmFsdWUAAAABCAUAAAAMZmlyc3RQYXltZW50AAAAB2Fzc2V0SWQEAAAACWFzc2V0MUdlbgkABLUAAAACCAUAAAAHbmZ0SW5mbwAAAARuYW1lAgAAAAADAwkAAAAAAAACCQABkQAAAAIFAAAACWFzc2V0MUdlbgAAAAAAAAAADgIAAAABRwYJAAAAAAAAAgkAAZEAAAACBQAAAAlhc3NldDFHZW4AAAAAAAAAAA4CAAAAAUoJAAACAAAAAQIAAAAaWW91IGNhbid0IG1pcnJvciB0aGlzIGR1Y2sDAwkAAAAAAAACCQABkQAAAAIFAAAACWFzc2V0MUdlbgAAAAAAAAAABQIAAAABUwYJAAAAAAAAAgkAAZEAAAACBQAAAAlhc3NldDFHZW4AAAAAAAAAAAUCAAAAAVQJAAACAAAAAQIAAAAfeW91IGFscmVhZHkgYXR0YWNoZWQgYSBhcnRlZmFjdAQAAAAEY2hhcgMJAAAAAAAAAgUAAAAIYXJ0ZWZhY3QCAAAACEFSVC1YSEFUAgAAAAFUAwkAAAAAAAACBQAAAAhhcnRlZmFjdAIAAAAIQVJULVBPTVACAAAAAVMJAAACAAAAAQIAAAAPTm8gY2hhciBkZWZpbmVkBAAAAApvbGREdWNrR2VuCAUAAAAHbmZ0SW5mbwAAAARuYW1lBAAAAApvbGRGYXJtR2VuCQEAAAAIYXNTdHJpbmcAAAABCQAD/AAAAAQJAQAAABFnZXRCcmVlZGVyQWRkcmVzcwAAAAACAAAADmdldEdlbkZyb21OYW1lCQAETAAAAAIFAAAACm9sZER1Y2tHZW4FAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAApvbGRGYXJtR2VuBQAAAApvbGRGYXJtR2VuBAAAAAdkdWNrR2VuCQEAAAAObWFuaXB1bGF0ZU5hbWUAAAADBQAAAApvbGREdWNrR2VuAAAAAAAAAAAGBQAAAARjaGFyBAAAAARjYWxsCQAD/AAAAAQJAQAAABFnZXRCcmVlZGVyQWRkcmVzcwAAAAACAAAAFmNyZWF0ZUR1Y2tTcGVjaWFsR2VuZXMJAARMAAAAAggIBQAAAAFpAAAABmNhbGxlcgAAAAVieXRlcwkABEwAAAACBQAAAAdkdWNrR2VuCQAETAAAAAIFAAAACGNoaWxkcmVuBQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAAEY2FsbAUAAAAEY2FsbAQAAAAKY2FsbFJlZHVjZQkAA/wAAAAECQEAAAARZ2V0QnJlZWRlckFkZHJlc3MAAAAAAgAAAAxyZWR1Y2VSYXJpdHkJAARMAAAAAgUAAAAMZmlyc3RBc3NldElkCQAETAAAAAIFAAAACm9sZEZhcm1HZW4FAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAApjYWxsUmVkdWNlBQAAAApjYWxsUmVkdWNlCQAETAAAAAIJAQAAAARCdXJuAAAAAgkBAAAABXZhbHVlAAAAAQgFAAAADGZpcnN0UGF5bWVudAAAAAdhc3NldElkAAAAAAAAAAABCQAETAAAAAIJAQAAAARCdXJuAAAAAgkBAAAABXZhbHVlAAAAAQgFAAAADXNlY29uZFBheW1lbnQAAAAHYXNzZXRJZAAAAAAAAAAAAQUAAAADbmlsCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAJc3Rha2VJdGVtAAAAAAMDCQAAAAAAAAIJAAGQAAAAAQgFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEJAAAAAAAAAggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAGYW1vdW50AAAAAAAAAAABBwQAAAAHYXNzZXRJZAkBAAAABXZhbHVlAAAAAQgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAHYXNzZXRJZAQAAAAMYXJ0ZWZhY3ROYW1lCQEAAAAIYXNTdHJpbmcAAAABCQAD/AAAAAQFAAAABHRoaXMCAAAAFGNoZWNrQXJ0ZWZhY3REZXRhaWxzCQAETAAAAAIJAAJYAAAAAQUAAAAHYXNzZXRJZAUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAADGFydGVmYWN0TmFtZQUAAAAMYXJ0ZWZhY3ROYW1lAwkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAADGFsbFN0YWtlYWJsZQUAAAAMYXJ0ZWZhY3ROYW1lAwMJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAABFzdGFrZWFibGVXaXRoTG9jawUAAAAMYXJ0ZWZhY3ROYW1lCQEAAAAQaXRlbUlzSW5Db29sRG93bgAAAAIFAAAADGFydGVmYWN0TmFtZQkAAlgAAAABBQAAAAdhc3NldElkBwkAAAIAAAABAgAAACpJdGVtIGNhbid0IGJlIHN0YWtlZCB5ZXQsIGl0J3MgaW4gY29vbGRvd24EAAAAB2ludm9rZXIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAAphcnRlZmFjdElkCQEAAAAMdHJ5R2V0U3RyaW5nAAAAAQkBAAAAEGtleUFydGVmYWN0T3duZXIAAAACBQAAAAxhcnRlZmFjdE5hbWUFAAAAB2ludm9rZXIDCQAAAAAAAAIFAAAACmFydGVmYWN0SWQCAAAAAAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAQa2V5QXJ0ZWZhY3RPd25lcgAAAAIFAAAADGFydGVmYWN0TmFtZQUAAAAHaW52b2tlcgkAAlgAAAABBQAAAAdhc3NldElkBQAAAANuaWwJAAACAAAAAQkAASwAAAACAgAAABhZb3UgYXJlIGFscmVhZHkgc3Rha2luZyAFAAAADGFydGVmYWN0TmFtZQkAAAIAAAABAgAAAB1Zb3UgY2FuJ3Qgc3Rha2UgdGhpcyBhcnRhZmVjdAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAPSW52YWxpZCBwYXltZW50AAAAAWkBAAAAC3Vuc3Rha2VJdGVtAAAAAQAAAAxhcnRlZmFjdE5hbWUDCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAALYWxsQXJ0ZWZhY3QFAAAADGFydGVmYWN0TmFtZQQAAAAHaW52b2tlcgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAACmFydGVmYWN0SWQJAQAAAAx0cnlHZXRTdHJpbmcAAAABCQEAAAAQa2V5QXJ0ZWZhY3RPd25lcgAAAAIFAAAADGFydGVmYWN0TmFtZQUAAAAHaW52b2tlcgMJAAAAAAAAAgUAAAAKYXJ0ZWZhY3RJZAIAAAAACQAAAgAAAAEJAAEsAAAAAgIAAAAQWW91IGRpZG50IHN0YWtlIAUAAAAMYXJ0ZWZhY3ROYW1lCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAQa2V5VW5zdGFrZUhlaWdodAAAAAIFAAAADGFydGVmYWN0TmFtZQUAAAAKYXJ0ZWZhY3RJZAUAAAAGaGVpZ2h0CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgAAAAAAAAAAAQkAAlkAAAABBQAAAAphcnRlZmFjdElkCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAABBrZXlBcnRlZmFjdE93bmVyAAAAAgUAAAAMYXJ0ZWZhY3ROYW1lBQAAAAdpbnZva2VyBQAAAANuaWwJAAACAAAAAQIAAAAbVGhpcyBhcnRlZmFjdCBkb2Vzbid0IGV4aXN0AAAAAWkBAAAAB3ByZUluaXQAAAAACQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACAgAAABxzdGF0aWNfQVJULUxBS0VfZmFybWluZ1Nsb3RzAAAAAAAAAADICQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACAgAAABxzdGF0aWNfQVJULUxBS0VfZmFybWluZ0Jvb3N0AAAAAAAAAAACCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACAgAAAB1zdGF0aWNfQVJULUhPVVNFX2Zhcm1pbmdTbG90cwAAAAAAAAAABAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgIAAAAdc3RhdGljX0FSVC1IT1VTRV9mYXJtaW5nQm9vc3QAAAAAAAAAAB4JAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAICAAAAIHN0YXRpY19BUlQtQklHSE9VU0VfZmFybWluZ1Nsb3RzAAAAAAAAAAAKCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACAgAAACBzdGF0aWNfQVJULUJJR0hPVVNFX2Zhcm1pbmdCb29zdAAAAAAAAAAADwUAAAADbmlsAAAAAWkBAAAADWlzc3VlQXJ0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", "height": 3070477, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: FL6sTL6RDrXbxKQqKTYAdDbkfMZcozAJtotxjvus8qjk Next: 51R3mwNe34jWJfGMxCXo2Yd96bNZ2oJJRhestEeASh5R Diff:
OldNewDifferences
88
99
1010 func keyArtefactDuck (artefactName,duckId) = (((artefactName + "_") + duckId) + "_duck")
11+
12+
13+func keyExternalBoostDuck (duckId) = (duckId + "_duck_external_boost")
1114
1215
1316 func getProcessFinishHeightKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_fh")
6871 }
6972
7073
71-func checkArtefactDetails (assetId) = {
72- let asset = value(assetInfo(assetId))
73- let assetName = value(asset.name)
74- if (if (containsElement(allArtefact, assetName))
75- then (asset.issuer == this)
76- else false)
77- then assetName
78- else throw("Invalid artefact")
79- }
80-
81-
8274 func tryGetStringExternal (address,key) = match getString(address, key) {
8375 case a: String =>
8476 a
9486
9587
9688 func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), "static_eggAssetId"))
89+
90+
91+func getTrustedContracts () = tryGetStringExternal(getOracle(), "static_trustedContracts")
9792
9893
9994 func asString (value) = match value {
125120
126121
127122 @Callable(i)
123+func manipulateBoost (boost,duckId) = {
124+ let allowedContracts = getTrustedContracts()
125+ let allowedContractsList = split(allowedContracts, ";")
126+ let dappToCall = toString(i.caller)
127+ if ((indexOf(allowedContractsList, dappToCall) == unit))
128+ then throw("This smart contract can't manipulate the boost!")
129+ else {
130+ let key = keyExternalBoostDuck(duckId)
131+ let activeBoost = tryGetInteger(key)
132+ let newBoost = (activeBoost + boost)
133+ if ((0 > newBoost))
134+ then throw("Something went wrong with boost, please contact the admins!")
135+ else [IntegerEntry(key, newBoost)]
136+ }
137+ }
138+
139+
140+
141+@Callable(i)
142+func checkArtefactDetails (assetId) = {
143+ let asset = value(assetInfo(fromBase58String(assetId)))
144+ let assetName = value(asset.name)
145+ if (if (containsElement(allArtefact, assetName))
146+ then (asset.issuer == this)
147+ else false)
148+ then $Tuple2(nil, assetName)
149+ else throw("Invalid artefact")
150+ }
151+
152+
153+
154+@Callable(i)
128155 func configureOracle (oracle) = if ((i.caller != this))
129156 then throw("admin only")
130157 else [StringEntry("static_oracleAddress", oracle)]
142169 let scarfBoost = if ((tryGetString(keyArtefactDuck("ART-XSCARF", duckId)) != ""))
143170 then 69
144171 else 0
145- let totalBoost = ((lakeBoost + xmasTreeBoost) + scarfBoost)
172+ let externalBoost = tryGetInteger(keyExternalBoostDuck(duckId))
173+ let totalBoost = (((lakeBoost + xmasTreeBoost) + scarfBoost) + externalBoost)
146174 $Tuple2([IntegerEntry((duckId + "_last_boost"), totalBoost)], totalBoost)
147175 }
148176
155183 if ((firstPayment.amount != 1))
156184 then throw("NFT is not attached")
157185 else {
158- let artefact = checkArtefactDetails(value(firstPayment.assetId))
159- if ((artefact != "ART-FIXGENE"))
160- then throw("You need to attach a ART-FIXGENE artefact")
161- else {
162- let txId = fromBase58String(txIdStr)
163- let finishHeightKey = getProcessFinishHeightKey(toString(i.caller), txId)
164- let processFinishHeight = getIntegerValue(getBreederAddress(), finishHeightKey)
165- let duckGenesString = asString(invoke(getBreederAddress(), "generateDuck", [txIdStr, processFinishHeight, parentFixedGene, positionFixedGene, "", 0], nil))
166- if ((duckGenesString == duckGenesString))
167- then {
168- let call = invoke(getBreederAddress(), "finishDuckHatchingItems", [txIdStr, duckGenesString], nil)
169- if ((call == call))
170- then [Burn(value(firstPayment.assetId), 1)]
171- else throw("Strict value is not equal to itself.")
172- }
173- else throw("Strict value is not equal to itself.")
174- }
186+ let artefact = asString(invoke(this, "checkArtefactDetails", [firstAssetId], nil))
187+ if ((artefact == artefact))
188+ then if ((artefact != "ART-FIXGENE"))
189+ then throw("You need to attach a ART-FIXGENE artefact")
190+ else {
191+ let txId = fromBase58String(txIdStr)
192+ let finishHeightKey = getProcessFinishHeightKey(toString(i.caller), txId)
193+ let processFinishHeight = getIntegerValue(getBreederAddress(), finishHeightKey)
194+ let duckGenesString = asString(invoke(getBreederAddress(), "generateDuck", [txIdStr, processFinishHeight, parentFixedGene, positionFixedGene, "", 0], nil))
195+ if ((duckGenesString == duckGenesString))
196+ then {
197+ let call = invoke(getBreederAddress(), "finishDuckHatchingItems", [txIdStr, duckGenesString], nil)
198+ if ((call == call))
199+ then [Burn(value(firstPayment.assetId), 1)]
200+ else throw("Strict value is not equal to itself.")
201+ }
202+ else throw("Strict value is not equal to itself.")
203+ }
204+ else throw("Strict value is not equal to itself.")
175205 }
176206 }
177207
184214 if ((firstPayment.amount != 1))
185215 then throw("NFT is not attached")
186216 else {
187- let artefact = checkArtefactDetails(value(firstPayment.assetId))
188- if ((artefact != "ART-FREEGENE"))
189- then throw("You need to attach a ART-FREEGENE artefact")
190- else {
191- let txId = fromBase58String(txIdStr)
192- let finishHeightKey = getProcessFinishHeightKey(toString(i.caller), txId)
193- let processFinishHeight = getIntegerValue(getBreederAddress(), finishHeightKey)
194- let selectedGene = getRandomGenes(txId, processFinishHeight)
195- let randomPosition = getRandomNumber(7, txId, processFinishHeight, 3)
196- let duckGenesString = asString(invoke(getBreederAddress(), "generateDuck", [txIdStr, processFinishHeight, 0, 0, selectedGene, randomPosition], nil))
197- if ((duckGenesString == duckGenesString))
198- then {
199- let call = invoke(getBreederAddress(), "finishDuckHatchingItems", [txIdStr, duckGenesString], nil)
200- if ((call == call))
201- then [Burn(value(firstPayment.assetId), 1)]
202- else throw("Strict value is not equal to itself.")
203- }
204- else throw("Strict value is not equal to itself.")
205- }
217+ let artefact = asString(invoke(this, "checkArtefactDetails", [firstAssetId], nil))
218+ if ((artefact == artefact))
219+ then if ((artefact != "ART-FREEGENE"))
220+ then throw("You need to attach a ART-FREEGENE artefact")
221+ else {
222+ let txId = fromBase58String(txIdStr)
223+ let finishHeightKey = getProcessFinishHeightKey(toString(i.caller), txId)
224+ let processFinishHeight = getIntegerValue(getBreederAddress(), finishHeightKey)
225+ let selectedGene = getRandomGenes(txId, processFinishHeight)
226+ let randomPosition = getRandomNumber(7, txId, processFinishHeight, 3)
227+ let duckGenesString = asString(invoke(getBreederAddress(), "generateDuck", [txIdStr, processFinishHeight, 0, 0, selectedGene, randomPosition], nil))
228+ if ((duckGenesString == duckGenesString))
229+ then {
230+ let call = invoke(getBreederAddress(), "finishDuckHatchingItems", [txIdStr, duckGenesString], nil)
231+ if ((call == call))
232+ then [Burn(value(firstPayment.assetId), 1)]
233+ else throw("Strict value is not equal to itself.")
234+ }
235+ else throw("Strict value is not equal to itself.")
236+ }
237+ else throw("Strict value is not equal to itself.")
206238 }
207239 }
208240
220252 else (secondPayment.amount != 1))
221253 then throw("NFT is not attached")
222254 else {
223- let artefact = checkArtefactDetails(value(secondPayment.assetId))
224- if ((artefact != "ART-MIRROR"))
225- then throw("You need to attach a ART-MIRROR artefact")
226- else {
227- let nftInfo = value(assetInfo(value(firstPayment.assetId)))
228- let asset1Gen = split(nftInfo.name, "")
229- if (if ((asset1Gen[14] == "G"))
230- then true
231- else (asset1Gen[14] == "J"))
232- then throw("You can't mirror this duck")
233- else {
234- let duckGen = nftInfo.name
235- let call = invoke(getBreederAddress(), "createDuckSpecialGenes", [i.caller.bytes, duckGen, children], nil)
236- if ((call == call))
237- then [ScriptTransfer(i.caller, 1, firstPayment.assetId), Burn(value(secondPayment.assetId), 1)]
238- else throw("Strict value is not equal to itself.")
239- }
240- }
255+ let artefact = asString(invoke(this, "checkArtefactDetails", [toBase58String(value(secondPayment.assetId))], nil))
256+ if ((artefact == artefact))
257+ then if ((artefact != "ART-MIRROR"))
258+ then throw("You need to attach a ART-MIRROR artefact")
259+ else {
260+ let nftInfo = value(assetInfo(value(firstPayment.assetId)))
261+ let asset1Gen = split(nftInfo.name, "")
262+ if (if ((asset1Gen[14] == "G"))
263+ then true
264+ else (asset1Gen[14] == "J"))
265+ then throw("You can't mirror this duck")
266+ else {
267+ let duckGen = nftInfo.name
268+ let call = invoke(getBreederAddress(), "createDuckSpecialGenes", [i.caller.bytes, duckGen, children], nil)
269+ if ((call == call))
270+ then [ScriptTransfer(i.caller, 1, firstPayment.assetId), Burn(value(secondPayment.assetId), 1)]
271+ else throw("Strict value is not equal to itself.")
272+ }
273+ }
274+ else throw("Strict value is not equal to itself.")
241275 }
242276 else throw("Strict value is not equal to itself.")
243277 }
258292 let children = asInt(invoke(getBreederAddress(), "validateAndGetChildren", [duckId], nil))
259293 if ((children == children))
260294 then {
261- let artefactName = checkArtefactDetails(value(secondPayment.assetId))
262- if ((artefactName != "ART-XSCARF"))
263- then throw("You need to attach a ART-XSCARF artefact")
264- else {
265- let artefactId = tryGetString(keyArtefactDuck(artefactName, duckId))
266- if ((artefactId == ""))
267- then [StringEntry(keyArtefactDuck(artefactName, duckId), secondAssetId), ScriptTransfer(i.caller, 1, firstPayment.assetId)]
268- else throw(("Duck is already wearing a " + artefactName))
269- }
295+ let artefactName = asString(invoke(this, "checkArtefactDetails", [secondAssetId], nil))
296+ if ((artefactName == artefactName))
297+ then if ((artefactName != "ART-XSCARF"))
298+ then throw("You need to attach a ART-XSCARF artefact")
299+ else {
300+ let artefactId = tryGetString(keyArtefactDuck(artefactName, duckId))
301+ if ((artefactId == ""))
302+ then [StringEntry(keyArtefactDuck(artefactName, duckId), secondAssetId), ScriptTransfer(i.caller, 1, firstPayment.assetId)]
303+ else throw(("Duck is already wearing a " + artefactName))
304+ }
305+ else throw("Strict value is not equal to itself.")
270306 }
271307 else throw("Strict value is not equal to itself.")
272308 }
289325 then if ((children == 0))
290326 then throw("You can only pick a sterile NFT-duck")
291327 else {
292- let artefact = checkArtefactDetails(value(secondPayment.assetId))
293- if (if ((artefact != "ART-XHAT"))
294- then (artefact != "ART-POMP")
295- else false)
296- then throw("You need to attach a ART-XHAT or ART-POMP artefact")
297- else {
298- let nftInfo = value(assetInfo(value(firstPayment.assetId)))
299- let asset1Gen = split(nftInfo.name, "")
300- if (if ((asset1Gen[14] == "G"))
301- then true
302- else (asset1Gen[14] == "J"))
303- then throw("You can't mirror this duck")
304- else if (if ((asset1Gen[5] == "S"))
328+ let artefact = asString(invoke(this, "checkArtefactDetails", [toBase58String(value(secondPayment.assetId))], nil))
329+ if ((artefact == artefact))
330+ then if (if ((artefact != "ART-XHAT"))
331+ then (artefact != "ART-POMP")
332+ else false)
333+ then throw("You need to attach a ART-XHAT or ART-POMP artefact")
334+ else {
335+ let nftInfo = value(assetInfo(value(firstPayment.assetId)))
336+ let asset1Gen = split(nftInfo.name, "")
337+ if (if ((asset1Gen[14] == "G"))
305338 then true
306- else (asset1Gen[5] == "T"))
307- then throw("you already attached a artefact")
308- else {
309- let char = if ((artefact == "ART-XHAT"))
310- then "T"
311- else if ((artefact == "ART-POMP"))
312- then "S"
313- else throw("No char defined")
314- let oldDuckGen = nftInfo.name
315- let oldFarmGen = asString(invoke(getBreederAddress(), "getGenFromName", [oldDuckGen], nil))
316- if ((oldFarmGen == oldFarmGen))
317- then {
318- let duckGen = manipulateName(oldDuckGen, 6, char)
319- let call = invoke(getBreederAddress(), "createDuckSpecialGenes", [i.caller.bytes, duckGen, children], nil)
320- if ((call == call))
321- then {
322- let callReduce = invoke(getBreederAddress(), "reduceRarity", [firstAssetId, oldFarmGen], nil)
323- if ((callReduce == callReduce))
324- then [Burn(value(firstPayment.assetId), 1), Burn(value(secondPayment.assetId), 1)]
325- else throw("Strict value is not equal to itself.")
326- }
327- else throw("Strict value is not equal to itself.")
328- }
329- else throw("Strict value is not equal to itself.")
330- }
331- }
339+ else (asset1Gen[14] == "J"))
340+ then throw("You can't mirror this duck")
341+ else if (if ((asset1Gen[5] == "S"))
342+ then true
343+ else (asset1Gen[5] == "T"))
344+ then throw("you already attached a artefact")
345+ else {
346+ let char = if ((artefact == "ART-XHAT"))
347+ then "T"
348+ else if ((artefact == "ART-POMP"))
349+ then "S"
350+ else throw("No char defined")
351+ let oldDuckGen = nftInfo.name
352+ let oldFarmGen = asString(invoke(getBreederAddress(), "getGenFromName", [oldDuckGen], nil))
353+ if ((oldFarmGen == oldFarmGen))
354+ then {
355+ let duckGen = manipulateName(oldDuckGen, 6, char)
356+ let call = invoke(getBreederAddress(), "createDuckSpecialGenes", [i.caller.bytes, duckGen, children], nil)
357+ if ((call == call))
358+ then {
359+ let callReduce = invoke(getBreederAddress(), "reduceRarity", [firstAssetId, oldFarmGen], nil)
360+ if ((callReduce == callReduce))
361+ then [Burn(value(firstPayment.assetId), 1), Burn(value(secondPayment.assetId), 1)]
362+ else throw("Strict value is not equal to itself.")
363+ }
364+ else throw("Strict value is not equal to itself.")
365+ }
366+ else throw("Strict value is not equal to itself.")
367+ }
368+ }
369+ else throw("Strict value is not equal to itself.")
332370 }
333371 else throw("Strict value is not equal to itself.")
334372 }
342380 else false)
343381 then {
344382 let assetId = value(i.payments[0].assetId)
345- let artefactName = checkArtefactDetails(assetId)
346- if (containsElement(allStakeable, artefactName))
347- then if (if (containsElement(stakeableWithLock, artefactName))
348- then itemIsInCoolDown(artefactName, toBase58String(assetId))
349- else false)
350- then throw("Item can't be staked yet, it's in cooldown")
351- else {
352- let invoker = toString(i.caller)
353- let artefactId = tryGetString(keyArtefactOwner(artefactName, invoker))
354- if ((artefactId == ""))
355- then [StringEntry(keyArtefactOwner(artefactName, invoker), toBase58String(assetId))]
356- else throw(("You are already staking " + artefactName))
357- }
358- else throw("You can't stake this artafect")
383+ let artefactName = asString(invoke(this, "checkArtefactDetails", [toBase58String(assetId)], nil))
384+ if ((artefactName == artefactName))
385+ then if (containsElement(allStakeable, artefactName))
386+ then if (if (containsElement(stakeableWithLock, artefactName))
387+ then itemIsInCoolDown(artefactName, toBase58String(assetId))
388+ else false)
389+ then throw("Item can't be staked yet, it's in cooldown")
390+ else {
391+ let invoker = toString(i.caller)
392+ let artefactId = tryGetString(keyArtefactOwner(artefactName, invoker))
393+ if ((artefactId == ""))
394+ then [StringEntry(keyArtefactOwner(artefactName, invoker), toBase58String(assetId))]
395+ else throw(("You are already staking " + artefactName))
396+ }
397+ else throw("You can't stake this artafect")
398+ else throw("Strict value is not equal to itself.")
359399 }
360400 else throw("Invalid payment")
361401
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func keyArtefactOwner (artefactName,owner) = (((artefactName + "_") + owner) + "_owner")
55
66
77 func keyUnstakeHeight (artefactName,artefactId) = (((artefactName + "_") + artefactId) + "_unstake_height")
88
99
1010 func keyArtefactDuck (artefactName,duckId) = (((artefactName + "_") + duckId) + "_duck")
11+
12+
13+func keyExternalBoostDuck (duckId) = (duckId + "_duck_external_boost")
1114
1215
1316 func getProcessFinishHeightKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_fh")
1417
1518
1619 let devAddress = base58'3P44yqcpfhPF2iC1nptm2ZJCTaN7VYhz9og'
1720
1821 let eggsNeeded = (3 * 100000000)
1922
2023 let artefactsLimit = (301 + 600)
2124
2225 let freeGenes = ["A", "B", "C", "D", "E"]
2326
2427 let oldArtefacts = ["ART-LAKE", "ART-HOUSE", "ART-BIGHOUSE", "ART-FIXGENE", "ART-FREEGENE", "ART-MIRROR", "ART-POMP", "ART-CAPE", "ART-HAT", "ART-CUSTOMDUCK"]
2528
2629 let artefacts = ["ART-XMISTL", "ART-XHAT", "ART-XSCARF", "ART-XSWEATER", "ART-XSOCK", "ART-XTREE"]
2730
2831 let stakeableWithLock = ["ART-LAKE", "ART-XTREE"]
2932
3033 let stakeableWithoutLock = ["ART-XMISTL"]
3134
3235 let allStakeable = (stakeableWithoutLock ++ stakeableWithLock)
3336
3437 let allArtefact = (artefacts ++ oldArtefacts)
3538
3639 func tryGetString (key) = match getString(this, key) {
3740 case a: String =>
3841 a
3942 case _ =>
4043 ""
4144 }
4245
4346
4447 func tryGetInteger (key) = match getInteger(this, key) {
4548 case a: Int =>
4649 a
4750 case _ =>
4851 0
4952 }
5053
5154
5255 func getRandomNumber (variants,txId,finishHeight,offset) = {
5356 let randomSeedBlock = value(blockInfoByHeight((finishHeight - 1)))
5457 let randomHash = sha256(((base58'items' + txId) + value(randomSeedBlock.vrf)))
5558 (toInt(randomHash, offset) % variants)
5659 }
5760
5861
5962 func getRandomArtefact (boxId,h) = {
6063 let randomNumber = getRandomNumber(6, boxId, h, 1)
6164 artefacts[randomNumber]
6265 }
6366
6467
6568 func getRandomGenes (txId,h) = {
6669 let randomNumber = getRandomNumber(6, txId, h, 2)
6770 freeGenes[randomNumber]
6871 }
6972
7073
71-func checkArtefactDetails (assetId) = {
72- let asset = value(assetInfo(assetId))
73- let assetName = value(asset.name)
74- if (if (containsElement(allArtefact, assetName))
75- then (asset.issuer == this)
76- else false)
77- then assetName
78- else throw("Invalid artefact")
79- }
80-
81-
8274 func tryGetStringExternal (address,key) = match getString(address, key) {
8375 case a: String =>
8476 a
8577 case _ =>
8678 ""
8779 }
8880
8981
9082 func getOracle () = Address(fromBase58String(tryGetString("static_oracleAddress")))
9183
9284
9385 func getBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_breederAddress")))
9486
9587
9688 func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), "static_eggAssetId"))
89+
90+
91+func getTrustedContracts () = tryGetStringExternal(getOracle(), "static_trustedContracts")
9792
9893
9994 func asString (value) = match value {
10095 case string: String =>
10196 string
10297 case _ =>
10398 throw("wrong type, expected: String")
10499 }
105100
106101
107102 func asInt (value) = match value {
108103 case int: Int =>
109104 int
110105 case _ =>
111106 throw("wrong type, expected: Int")
112107 }
113108
114109
115110 func manipulateName (assetName,position,char) = ((take(assetName, (position - 1)) + char) + takeRight(assetName, (16 - position)))
116111
117112
118113 func itemIsInCoolDown (artefactName,artefactId) = {
119114 let unstakeHeightLast = tryGetInteger(keyUnstakeHeight(artefactName, artefactId))
120115 let cooldownPeriod = 240
121116 if ((height > (unstakeHeightLast + cooldownPeriod)))
122117 then false
123118 else true
124119 }
125120
126121
127122 @Callable(i)
123+func manipulateBoost (boost,duckId) = {
124+ let allowedContracts = getTrustedContracts()
125+ let allowedContractsList = split(allowedContracts, ";")
126+ let dappToCall = toString(i.caller)
127+ if ((indexOf(allowedContractsList, dappToCall) == unit))
128+ then throw("This smart contract can't manipulate the boost!")
129+ else {
130+ let key = keyExternalBoostDuck(duckId)
131+ let activeBoost = tryGetInteger(key)
132+ let newBoost = (activeBoost + boost)
133+ if ((0 > newBoost))
134+ then throw("Something went wrong with boost, please contact the admins!")
135+ else [IntegerEntry(key, newBoost)]
136+ }
137+ }
138+
139+
140+
141+@Callable(i)
142+func checkArtefactDetails (assetId) = {
143+ let asset = value(assetInfo(fromBase58String(assetId)))
144+ let assetName = value(asset.name)
145+ if (if (containsElement(allArtefact, assetName))
146+ then (asset.issuer == this)
147+ else false)
148+ then $Tuple2(nil, assetName)
149+ else throw("Invalid artefact")
150+ }
151+
152+
153+
154+@Callable(i)
128155 func configureOracle (oracle) = if ((i.caller != this))
129156 then throw("admin only")
130157 else [StringEntry("static_oracleAddress", oracle)]
131158
132159
133160
134161 @Callable(i)
135162 func calculateFarmingPowerBoost (duckId,address) = {
136163 let lakeBoost = if ((tryGetString(keyArtefactOwner("ART-LAKE", address)) != ""))
137164 then 2
138165 else 0
139166 let xmasTreeBoost = if ((tryGetString(keyArtefactOwner("ART-XTREE", address)) != ""))
140167 then 3
141168 else 0
142169 let scarfBoost = if ((tryGetString(keyArtefactDuck("ART-XSCARF", duckId)) != ""))
143170 then 69
144171 else 0
145- let totalBoost = ((lakeBoost + xmasTreeBoost) + scarfBoost)
172+ let externalBoost = tryGetInteger(keyExternalBoostDuck(duckId))
173+ let totalBoost = (((lakeBoost + xmasTreeBoost) + scarfBoost) + externalBoost)
146174 $Tuple2([IntegerEntry((duckId + "_last_boost"), totalBoost)], totalBoost)
147175 }
148176
149177
150178
151179 @Callable(i)
152180 func fixedGene (txIdStr,parentFixedGene,positionFixedGene) = {
153181 let firstPayment = value(i.payments[0])
154182 let firstAssetId = toBase58String(value(firstPayment.assetId))
155183 if ((firstPayment.amount != 1))
156184 then throw("NFT is not attached")
157185 else {
158- let artefact = checkArtefactDetails(value(firstPayment.assetId))
159- if ((artefact != "ART-FIXGENE"))
160- then throw("You need to attach a ART-FIXGENE artefact")
161- else {
162- let txId = fromBase58String(txIdStr)
163- let finishHeightKey = getProcessFinishHeightKey(toString(i.caller), txId)
164- let processFinishHeight = getIntegerValue(getBreederAddress(), finishHeightKey)
165- let duckGenesString = asString(invoke(getBreederAddress(), "generateDuck", [txIdStr, processFinishHeight, parentFixedGene, positionFixedGene, "", 0], nil))
166- if ((duckGenesString == duckGenesString))
167- then {
168- let call = invoke(getBreederAddress(), "finishDuckHatchingItems", [txIdStr, duckGenesString], nil)
169- if ((call == call))
170- then [Burn(value(firstPayment.assetId), 1)]
171- else throw("Strict value is not equal to itself.")
172- }
173- else throw("Strict value is not equal to itself.")
174- }
186+ let artefact = asString(invoke(this, "checkArtefactDetails", [firstAssetId], nil))
187+ if ((artefact == artefact))
188+ then if ((artefact != "ART-FIXGENE"))
189+ then throw("You need to attach a ART-FIXGENE artefact")
190+ else {
191+ let txId = fromBase58String(txIdStr)
192+ let finishHeightKey = getProcessFinishHeightKey(toString(i.caller), txId)
193+ let processFinishHeight = getIntegerValue(getBreederAddress(), finishHeightKey)
194+ let duckGenesString = asString(invoke(getBreederAddress(), "generateDuck", [txIdStr, processFinishHeight, parentFixedGene, positionFixedGene, "", 0], nil))
195+ if ((duckGenesString == duckGenesString))
196+ then {
197+ let call = invoke(getBreederAddress(), "finishDuckHatchingItems", [txIdStr, duckGenesString], nil)
198+ if ((call == call))
199+ then [Burn(value(firstPayment.assetId), 1)]
200+ else throw("Strict value is not equal to itself.")
201+ }
202+ else throw("Strict value is not equal to itself.")
203+ }
204+ else throw("Strict value is not equal to itself.")
175205 }
176206 }
177207
178208
179209
180210 @Callable(i)
181211 func freeGene (txIdStr) = {
182212 let firstPayment = value(i.payments[0])
183213 let firstAssetId = toBase58String(value(firstPayment.assetId))
184214 if ((firstPayment.amount != 1))
185215 then throw("NFT is not attached")
186216 else {
187- let artefact = checkArtefactDetails(value(firstPayment.assetId))
188- if ((artefact != "ART-FREEGENE"))
189- then throw("You need to attach a ART-FREEGENE artefact")
190- else {
191- let txId = fromBase58String(txIdStr)
192- let finishHeightKey = getProcessFinishHeightKey(toString(i.caller), txId)
193- let processFinishHeight = getIntegerValue(getBreederAddress(), finishHeightKey)
194- let selectedGene = getRandomGenes(txId, processFinishHeight)
195- let randomPosition = getRandomNumber(7, txId, processFinishHeight, 3)
196- let duckGenesString = asString(invoke(getBreederAddress(), "generateDuck", [txIdStr, processFinishHeight, 0, 0, selectedGene, randomPosition], nil))
197- if ((duckGenesString == duckGenesString))
198- then {
199- let call = invoke(getBreederAddress(), "finishDuckHatchingItems", [txIdStr, duckGenesString], nil)
200- if ((call == call))
201- then [Burn(value(firstPayment.assetId), 1)]
202- else throw("Strict value is not equal to itself.")
203- }
204- else throw("Strict value is not equal to itself.")
205- }
217+ let artefact = asString(invoke(this, "checkArtefactDetails", [firstAssetId], nil))
218+ if ((artefact == artefact))
219+ then if ((artefact != "ART-FREEGENE"))
220+ then throw("You need to attach a ART-FREEGENE artefact")
221+ else {
222+ let txId = fromBase58String(txIdStr)
223+ let finishHeightKey = getProcessFinishHeightKey(toString(i.caller), txId)
224+ let processFinishHeight = getIntegerValue(getBreederAddress(), finishHeightKey)
225+ let selectedGene = getRandomGenes(txId, processFinishHeight)
226+ let randomPosition = getRandomNumber(7, txId, processFinishHeight, 3)
227+ let duckGenesString = asString(invoke(getBreederAddress(), "generateDuck", [txIdStr, processFinishHeight, 0, 0, selectedGene, randomPosition], nil))
228+ if ((duckGenesString == duckGenesString))
229+ then {
230+ let call = invoke(getBreederAddress(), "finishDuckHatchingItems", [txIdStr, duckGenesString], nil)
231+ if ((call == call))
232+ then [Burn(value(firstPayment.assetId), 1)]
233+ else throw("Strict value is not equal to itself.")
234+ }
235+ else throw("Strict value is not equal to itself.")
236+ }
237+ else throw("Strict value is not equal to itself.")
206238 }
207239 }
208240
209241
210242
211243 @Callable(i)
212244 func copyDuck () = {
213245 let firstPayment = value(i.payments[0])
214246 let secondPayment = value(i.payments[1])
215247 let firstAssetId = toBase58String(value(firstPayment.assetId))
216248 let children = asInt(invoke(getBreederAddress(), "validateAndGetChildren", [firstAssetId], nil))
217249 if ((children == children))
218250 then if (if ((firstPayment.amount != 1))
219251 then true
220252 else (secondPayment.amount != 1))
221253 then throw("NFT is not attached")
222254 else {
223- let artefact = checkArtefactDetails(value(secondPayment.assetId))
224- if ((artefact != "ART-MIRROR"))
225- then throw("You need to attach a ART-MIRROR artefact")
226- else {
227- let nftInfo = value(assetInfo(value(firstPayment.assetId)))
228- let asset1Gen = split(nftInfo.name, "")
229- if (if ((asset1Gen[14] == "G"))
230- then true
231- else (asset1Gen[14] == "J"))
232- then throw("You can't mirror this duck")
233- else {
234- let duckGen = nftInfo.name
235- let call = invoke(getBreederAddress(), "createDuckSpecialGenes", [i.caller.bytes, duckGen, children], nil)
236- if ((call == call))
237- then [ScriptTransfer(i.caller, 1, firstPayment.assetId), Burn(value(secondPayment.assetId), 1)]
238- else throw("Strict value is not equal to itself.")
239- }
240- }
255+ let artefact = asString(invoke(this, "checkArtefactDetails", [toBase58String(value(secondPayment.assetId))], nil))
256+ if ((artefact == artefact))
257+ then if ((artefact != "ART-MIRROR"))
258+ then throw("You need to attach a ART-MIRROR artefact")
259+ else {
260+ let nftInfo = value(assetInfo(value(firstPayment.assetId)))
261+ let asset1Gen = split(nftInfo.name, "")
262+ if (if ((asset1Gen[14] == "G"))
263+ then true
264+ else (asset1Gen[14] == "J"))
265+ then throw("You can't mirror this duck")
266+ else {
267+ let duckGen = nftInfo.name
268+ let call = invoke(getBreederAddress(), "createDuckSpecialGenes", [i.caller.bytes, duckGen, children], nil)
269+ if ((call == call))
270+ then [ScriptTransfer(i.caller, 1, firstPayment.assetId), Burn(value(secondPayment.assetId), 1)]
271+ else throw("Strict value is not equal to itself.")
272+ }
273+ }
274+ else throw("Strict value is not equal to itself.")
241275 }
242276 else throw("Strict value is not equal to itself.")
243277 }
244278
245279
246280
247281 @Callable(i)
248282 func wearItemToDuck () = {
249283 let firstPayment = value(i.payments[0])
250284 let secondPayment = value(i.payments[1])
251285 let duckId = toBase58String(value(firstPayment.assetId))
252286 let secondAssetId = toBase58String(value(secondPayment.assetId))
253287 if (if ((firstPayment.amount != 1))
254288 then true
255289 else (secondPayment.amount != 1))
256290 then throw("NFT is not attached")
257291 else {
258292 let children = asInt(invoke(getBreederAddress(), "validateAndGetChildren", [duckId], nil))
259293 if ((children == children))
260294 then {
261- let artefactName = checkArtefactDetails(value(secondPayment.assetId))
262- if ((artefactName != "ART-XSCARF"))
263- then throw("You need to attach a ART-XSCARF artefact")
264- else {
265- let artefactId = tryGetString(keyArtefactDuck(artefactName, duckId))
266- if ((artefactId == ""))
267- then [StringEntry(keyArtefactDuck(artefactName, duckId), secondAssetId), ScriptTransfer(i.caller, 1, firstPayment.assetId)]
268- else throw(("Duck is already wearing a " + artefactName))
269- }
295+ let artefactName = asString(invoke(this, "checkArtefactDetails", [secondAssetId], nil))
296+ if ((artefactName == artefactName))
297+ then if ((artefactName != "ART-XSCARF"))
298+ then throw("You need to attach a ART-XSCARF artefact")
299+ else {
300+ let artefactId = tryGetString(keyArtefactDuck(artefactName, duckId))
301+ if ((artefactId == ""))
302+ then [StringEntry(keyArtefactDuck(artefactName, duckId), secondAssetId), ScriptTransfer(i.caller, 1, firstPayment.assetId)]
303+ else throw(("Duck is already wearing a " + artefactName))
304+ }
305+ else throw("Strict value is not equal to itself.")
270306 }
271307 else throw("Strict value is not equal to itself.")
272308 }
273309 }
274310
275311
276312
277313 @Callable(i)
278314 func addArteFactToDuck () = {
279315 let firstPayment = value(i.payments[0])
280316 let secondPayment = value(i.payments[1])
281317 let firstAssetId = toBase58String(value(firstPayment.assetId))
282318 if (if ((firstPayment.amount != 1))
283319 then true
284320 else (secondPayment.amount != 1))
285321 then throw("NFT is not attached")
286322 else {
287323 let children = asInt(invoke(getBreederAddress(), "validateAndGetChildren", [firstAssetId], nil))
288324 if ((children == children))
289325 then if ((children == 0))
290326 then throw("You can only pick a sterile NFT-duck")
291327 else {
292- let artefact = checkArtefactDetails(value(secondPayment.assetId))
293- if (if ((artefact != "ART-XHAT"))
294- then (artefact != "ART-POMP")
295- else false)
296- then throw("You need to attach a ART-XHAT or ART-POMP artefact")
297- else {
298- let nftInfo = value(assetInfo(value(firstPayment.assetId)))
299- let asset1Gen = split(nftInfo.name, "")
300- if (if ((asset1Gen[14] == "G"))
301- then true
302- else (asset1Gen[14] == "J"))
303- then throw("You can't mirror this duck")
304- else if (if ((asset1Gen[5] == "S"))
328+ let artefact = asString(invoke(this, "checkArtefactDetails", [toBase58String(value(secondPayment.assetId))], nil))
329+ if ((artefact == artefact))
330+ then if (if ((artefact != "ART-XHAT"))
331+ then (artefact != "ART-POMP")
332+ else false)
333+ then throw("You need to attach a ART-XHAT or ART-POMP artefact")
334+ else {
335+ let nftInfo = value(assetInfo(value(firstPayment.assetId)))
336+ let asset1Gen = split(nftInfo.name, "")
337+ if (if ((asset1Gen[14] == "G"))
305338 then true
306- else (asset1Gen[5] == "T"))
307- then throw("you already attached a artefact")
308- else {
309- let char = if ((artefact == "ART-XHAT"))
310- then "T"
311- else if ((artefact == "ART-POMP"))
312- then "S"
313- else throw("No char defined")
314- let oldDuckGen = nftInfo.name
315- let oldFarmGen = asString(invoke(getBreederAddress(), "getGenFromName", [oldDuckGen], nil))
316- if ((oldFarmGen == oldFarmGen))
317- then {
318- let duckGen = manipulateName(oldDuckGen, 6, char)
319- let call = invoke(getBreederAddress(), "createDuckSpecialGenes", [i.caller.bytes, duckGen, children], nil)
320- if ((call == call))
321- then {
322- let callReduce = invoke(getBreederAddress(), "reduceRarity", [firstAssetId, oldFarmGen], nil)
323- if ((callReduce == callReduce))
324- then [Burn(value(firstPayment.assetId), 1), Burn(value(secondPayment.assetId), 1)]
325- else throw("Strict value is not equal to itself.")
326- }
327- else throw("Strict value is not equal to itself.")
328- }
329- else throw("Strict value is not equal to itself.")
330- }
331- }
339+ else (asset1Gen[14] == "J"))
340+ then throw("You can't mirror this duck")
341+ else if (if ((asset1Gen[5] == "S"))
342+ then true
343+ else (asset1Gen[5] == "T"))
344+ then throw("you already attached a artefact")
345+ else {
346+ let char = if ((artefact == "ART-XHAT"))
347+ then "T"
348+ else if ((artefact == "ART-POMP"))
349+ then "S"
350+ else throw("No char defined")
351+ let oldDuckGen = nftInfo.name
352+ let oldFarmGen = asString(invoke(getBreederAddress(), "getGenFromName", [oldDuckGen], nil))
353+ if ((oldFarmGen == oldFarmGen))
354+ then {
355+ let duckGen = manipulateName(oldDuckGen, 6, char)
356+ let call = invoke(getBreederAddress(), "createDuckSpecialGenes", [i.caller.bytes, duckGen, children], nil)
357+ if ((call == call))
358+ then {
359+ let callReduce = invoke(getBreederAddress(), "reduceRarity", [firstAssetId, oldFarmGen], nil)
360+ if ((callReduce == callReduce))
361+ then [Burn(value(firstPayment.assetId), 1), Burn(value(secondPayment.assetId), 1)]
362+ else throw("Strict value is not equal to itself.")
363+ }
364+ else throw("Strict value is not equal to itself.")
365+ }
366+ else throw("Strict value is not equal to itself.")
367+ }
368+ }
369+ else throw("Strict value is not equal to itself.")
332370 }
333371 else throw("Strict value is not equal to itself.")
334372 }
335373 }
336374
337375
338376
339377 @Callable(i)
340378 func stakeItem () = if (if ((size(i.payments) == 1))
341379 then (i.payments[0].amount == 1)
342380 else false)
343381 then {
344382 let assetId = value(i.payments[0].assetId)
345- let artefactName = checkArtefactDetails(assetId)
346- if (containsElement(allStakeable, artefactName))
347- then if (if (containsElement(stakeableWithLock, artefactName))
348- then itemIsInCoolDown(artefactName, toBase58String(assetId))
349- else false)
350- then throw("Item can't be staked yet, it's in cooldown")
351- else {
352- let invoker = toString(i.caller)
353- let artefactId = tryGetString(keyArtefactOwner(artefactName, invoker))
354- if ((artefactId == ""))
355- then [StringEntry(keyArtefactOwner(artefactName, invoker), toBase58String(assetId))]
356- else throw(("You are already staking " + artefactName))
357- }
358- else throw("You can't stake this artafect")
383+ let artefactName = asString(invoke(this, "checkArtefactDetails", [toBase58String(assetId)], nil))
384+ if ((artefactName == artefactName))
385+ then if (containsElement(allStakeable, artefactName))
386+ then if (if (containsElement(stakeableWithLock, artefactName))
387+ then itemIsInCoolDown(artefactName, toBase58String(assetId))
388+ else false)
389+ then throw("Item can't be staked yet, it's in cooldown")
390+ else {
391+ let invoker = toString(i.caller)
392+ let artefactId = tryGetString(keyArtefactOwner(artefactName, invoker))
393+ if ((artefactId == ""))
394+ then [StringEntry(keyArtefactOwner(artefactName, invoker), toBase58String(assetId))]
395+ else throw(("You are already staking " + artefactName))
396+ }
397+ else throw("You can't stake this artafect")
398+ else throw("Strict value is not equal to itself.")
359399 }
360400 else throw("Invalid payment")
361401
362402
363403
364404 @Callable(i)
365405 func unstakeItem (artefactName) = if (containsElement(allArtefact, artefactName))
366406 then {
367407 let invoker = toString(i.caller)
368408 let artefactId = tryGetString(keyArtefactOwner(artefactName, invoker))
369409 if ((artefactId == ""))
370410 then throw(("You didnt stake " + artefactName))
371411 else [IntegerEntry(keyUnstakeHeight(artefactName, artefactId), height), ScriptTransfer(i.caller, 1, fromBase58String(artefactId)), DeleteEntry(keyArtefactOwner(artefactName, invoker))]
372412 }
373413 else throw("This artefact doesn't exist")
374414
375415
376416
377417 @Callable(i)
378418 func preInit () = [IntegerEntry("static_ART-LAKE_farmingSlots", 200), IntegerEntry("static_ART-LAKE_farmingBoost", 2), IntegerEntry("static_ART-HOUSE_farmingSlots", 4), IntegerEntry("static_ART-HOUSE_farmingBoost", 30), IntegerEntry("static_ART-BIGHOUSE_farmingSlots", 10), IntegerEntry("static_ART-BIGHOUSE_farmingBoost", 15)]
379419
380420
381421
382422 @Callable(i)
383423 func issueArtefact (type,receiver) = if ((i.caller == this))
384424 then {
385425 let txIdStr = toBase58String(i.transactionId)
386426 let address = Address(fromBase58String(receiver))
387427 let artefact = Issue(type, "NFT artefact of Waves Ducks game. Drop #2.", 1, 0, false, unit, 0)
388428 let artefactId = calculateAssetId(artefact)
389429 [artefact, StringEntry((("artefact_" + toBase58String(artefactId)) + "_type"), type), ScriptTransfer(address, 1, artefactId)]
390430 }
391431 else throw("admin only")
392432
393433
394434
395435 @Callable(i)
396436 func setLock (n) = if ((i.caller == this))
397437 then [IntegerEntry("global_locked", n)]
398438 else throw("admin only")
399439
400440
401441
402442 @Callable(i)
403443 func buyArtefact () = if ((lastBlock.timestamp > 1639742400000))
404444 then throw("There are no active sales now... ")
405445 else if ((tryGetInteger("global_locked") > 0))
406446 then throw("contract is temporarily locked")
407447 else if ((tryGetInteger("global_artAmount") >= artefactsLimit))
408448 then throw("SOLDOUT!!! Hurray!")
409449 else if (if ((1639605600000 > lastBlock.timestamp))
410450 then (i.caller != Address(devAddress))
411451 else false)
412452 then throw("Too early...")
413453 else {
414454 let firstPayment = value(i.payments[0])
415455 if ((firstPayment.assetId != getEggAssetId()))
416456 then throw(("You can attach only EGG tokens with the following asset id: " + toBase58String(getEggAssetId())))
417457 else if ((eggsNeeded > firstPayment.amount))
418458 then throw(("To hatch a duck you currently need the following amount of EGGlets: " + toString(eggsNeeded)))
419459 else [StringEntry((((toString(i.caller) + "_") + toBase58String(i.transactionId)) + "_status"), "started"), IntegerEntry((((toString(i.caller) + "_") + toBase58String(i.transactionId)) + "_finishHeight"), (height + 2)), IntegerEntry("global_artAmount", (tryGetInteger("global_artAmount") + 1))]
420460 }
421461
422462
423463
424464 @Callable(i)
425465 func setGlobalArtAmount (newAmount) = if (if ((i.caller == this))
426466 then true
427467 else (i.caller == Address(devAddress)))
428468 then [IntegerEntry("global_artAmount", newAmount)]
429469 else throw("Permission denied")
430470
431471
432472
433473 @Callable(i)
434474 func claimArtefact (boxIdStr) = {
435475 let txId = fromBase58String(boxIdStr)
436476 let statusKey = (((toString(i.caller) + "_") + boxIdStr) + "_status")
437477 let heightKey = (((toString(i.caller) + "_") + boxIdStr) + "_finishHeight")
438478 if ((getStringValue(statusKey) != "started"))
439479 then throw("claimed already")
440480 else if ((getIntegerValue(heightKey) > height))
441481 then throw("you cannot claim yet")
442482 else {
443483 let artType = getRandomArtefact(txId, getIntegerValue(heightKey))
444484 let asset = Issue(artType, "Artefact of Waves Ducks metaverse.", 1, 0, false, unit, getIntegerValue(heightKey))
445485 let assetId = calculateAssetId(asset)
446486 [StringEntry(statusKey, artType), StringEntry((((toString(i.caller) + "_") + boxIdStr) + "_artefactId"), toBase58String(assetId)), StringEntry((toBase58String(assetId) + "_type"), artType), asset, ScriptTransfer(i.caller, 1, assetId)]
447487 }
448488 }
449489
450490
451491 @Verifier(tx)
452492 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
453493

github/deemru/w8io/786bc32 
77.29 ms