tx · quD6he62NydGksnG2U9Cgp7Jdn99xNvwo2aS5mmACpX 3MucnifgqjCVTQDsVvyBbDfUYL4NzUJme6c: -0.01400000 Waves 2022.02.04 16:40 [1908939] smart account 3MucnifgqjCVTQDsVvyBbDfUYL4NzUJme6c > SELF 0.00000000 Waves
{ "type": 13, "id": "quD6he62NydGksnG2U9Cgp7Jdn99xNvwo2aS5mmACpX", "fee": 1400000, "feeAssetId": null, "timestamp": 1643982044762, "version": 2, "chainId": 84, "sender": "3MucnifgqjCVTQDsVvyBbDfUYL4NzUJme6c", "senderPublicKey": "5VeehaC8J2hY5k7GyMevtfCSC4on8kxpPvqqQqNe5erh", "proofs": [ "4TePTm6aMmbxWB4Eqe2p6JcH95eYV3KyTGGiMEFQBtL7eMWsKd13W1w9YExNf6TnKyiTCGoDQfaWynd85EyxwYh4" ], "script": "base64:AAIFAAAAAAAAAAwIAhIICgYIAQEBAQEAAABGAAAAAAZwYXJhbXMJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAECAAAAIzNOMmpaYUgxakxaNXVoS2tOaWs2Z2VBNTdIek1Hdzk4aWdSAAAAAA1rZXlJbml0VjFEb25lAgAAAAxpbml0X3YxX2RvbmUAAAAACmtleVRva2VuSWQCAAAAB3Rva2VuSWQAAAAAG2tleUluaXRpYWxDaGFyQ3JlYXRpb25TdGF0cwIAAAAYaW5pdGlhbENoYXJDcmVhdGlvblN0YXRzAAAAAAlzZXBhcmF0b3ICAAAAAV8AAAAAEGtleUl0ZW1zSWRzQ291bnQCAAAADWl0ZW1zSWRzQ291bnQAAAAAEWtleVNwZWxsc0lkc0NvdW50AgAAAA5zcGVsbHNJZHNDb3VudAAAAAAPa2V5TW9ic0lkc0NvdW50AgAAAAxtb2JzSWRzQ291bnQAAAAAC2tleUl0ZW1UeXBlAgAAAAhpdGVtVHlwZQAAAAAQa2V5SXRlbVN0YXQxVHlwZQIAAAANaXRlbVN0YXQxVHlwZQAAAAAQa2V5SXRlbVN0YXQyVHlwZQIAAAANaXRlbVN0YXQyVHlwZQAAAAAQa2V5SXRlbVN0YXQzVHlwZQIAAAANaXRlbVN0YXQzVHlwZQAAAAARa2V5SXRlbVN0YXQxVmFsdWUCAAAADml0ZW1TdGF0MVZhbHVlAAAAABFrZXlJdGVtU3RhdDJWYWx1ZQIAAAAOaXRlbVN0YXQyVmFsdWUAAAAAEWtleUl0ZW1TdGF0M1ZhbHVlAgAAAA5pdGVtU3RhdDNWYWx1ZQAAAAAPa2V5U3BlbGxEbWdUeXBlAgAAAAlzcGVsbEVsZW0AAAAADmtleVNwZWxsTWluRG1nAgAAAAtzcGVsbE1pbkRtZwAAAAAOa2V5U3BlbGxNYXhEbWcCAAAAC3NwZWxsTWF4RG1nAAAAABFrZXlTcGVsbFN0YXQxVHlwZQIAAAAOc3BlbGxTdGF0MVR5cGUAAAAAEWtleVNwZWxsU3RhdDJUeXBlAgAAAA5zcGVsbFN0YXQyVHlwZQAAAAARa2V5U3BlbGxTdGF0M1R5cGUCAAAADnNwZWxsU3RhdDNUeXBlAAAAABJrZXlTcGVsbFN0YXQxVmFsdWUCAAAAD3NwZWxsU3RhdDFWYWx1ZQAAAAASa2V5U3BlbGxTdGF0MlZhbHVlAgAAAA9zcGVsbFN0YXQyVmFsdWUAAAAAEmtleVNwZWxsU3RhdDNWYWx1ZQIAAAAPc3BlbGxTdGF0M1ZhbHVlAAAAABNrZXlNb2JDdXJyZW50SGVhbHRoAgAAABBtb2JDdXJyZW50SGVhbHRoAAAAAA9rZXlNb2JNYXhIZWFsdGgCAAAADG1vYk1heEhlYWx0aAAAAAAPa2V5TW9iRXhwUG9pbnRzAgAAAAxtb2JFeHBQb2ludHMAAAAACmtleU1vYkdvbGQCAAAAB21vYkdvbGQAAAAAEGtleU1vYkxvb3RDaGFuY2UCAAAADW1vYkxvb3RDaGFuY2UAAAAADWtleU1vYlN0YWZmSWQCAAAACm1vYlN0YWZmSWQAAAAADGtleU1vYlJvYmVJZAIAAAAJbW9iUm9iZUlkAAAAAAxrZXlNb2JSaW5nSWQCAAAACW1vYlJpbmdJZAAAAAAOa2V5TW9iU3BlbGwxSWQCAAAAC21vYlNwZWxsMUlkAAAAAA5rZXlNb2JTcGVsbDJJZAIAAAALbW9iU3BlbGwySWQAAAAADmtleU1vYlNwZWxsM0lkAgAAAAttb2JTcGVsbDNJZAAAAAAHa2V5TmFtZQIAAAAEbmFtZQAAAAAGa2V5U2V4AgAAAANzZXgAAAAAB2tleVJhbmsCAAAABHJhbmsAAAAAEGtleUhlYWx0aEN1cnJlbnQCAAAADWhlYWx0aEN1cnJlbnQAAAAADGtleUhlYWx0aE1heAIAAAAJaGVhbHRoTWF4AAAAABNrZXlNaW5IZWFsdGhQZXJSYW5rAgAAABBtaW5IZWFsdGhQZXJSYW5rAAAAABNrZXlNYXhIZWFsdGhQZXJSYW5rAgAAABBtYXhIZWFsdGhQZXJSYW5rAAAAAA5rZXlIZWFsdGhSZWdlbgIAAAALaGVhbHRoUmVnZW4AAAAAGGtleU1pbkhlYWx0aFJlZ2VuUGVyUmFuawIAAAAVbWluSGVhbHRoUmVnZW5QZXJSYW5rAAAAABhrZXlNYXhIZWFsdGhSZWdlblBlclJhbmsCAAAAFW1heEhlYWx0aFJlZ2VuUGVyUmFuawAAAAAOa2V5TWFuYUN1cnJlbnQCAAAAC21hbmFDdXJyZW50AAAAAAprZXlNYW5hTWF4AgAAAAdtYW5hTWF4AAAAABFrZXlNaW5NYW5hUGVyUmFuawIAAAAObWluTWFuYVBlclJhbmsAAAAAEWtleU1heE1hbmFQZXJSYW5rAgAAAA5tYXhNYW5hUGVyUmFuawAAAAAMa2V5TWFuYVJlZ2VuAgAAAAltYW5hUmVnZW4AAAAAFmtleU1pbk1hbmFSZWdlblBlclJhbmsCAAAAE21pbk1hbmFSZWdlblBlclJhbmsAAAAAFmtleU1heE1hbmFSZWdlblBlclJhbmsCAAAAE21heE1hbmFSZWdlblBlclJhbmsAAAAAB2tleVB5cm8CAAAABHB5cm8AAAAAEWtleU1pblB5cm9QZXJSYW5rAgAAAA5taW5QeXJvUGVyUmFuawAAAAARa2V5TWF4UHlyb1BlclJhbmsCAAAADm1heFB5cm9QZXJSYW5rAAAAAAdrZXlBZXJvAgAAAARhZXJvAAAAABFrZXlNaW5BZXJvUGVyUmFuawIAAAAObWluQWVyb1BlclJhbmsAAAAAEWtleU1heEFlcm9QZXJSYW5rAgAAAA5tYXhBZXJvUGVyUmFuawAAAAAHa2V5QXF1YQIAAAAEYXF1YQAAAAARa2V5TWluQXF1YVBlclJhbmsCAAAADm1pbkFxdWFQZXJSYW5rAAAAABFrZXlNYXhBcXVhUGVyUmFuawIAAAAObWF4QXF1YVBlclJhbmsAAAAACGtleVRlcnJhAgAAAAV0ZXJyYQAAAAASa2V5TWluVGVycmFQZXJSYW5rAgAAAA9taW5UZXJyYVBlclJhbmsAAAAAEmtleU1heFRlcnJhUGVyUmFuawIAAAAPbWF4VGVycmFQZXJSYW5rAQAAAAR3aXRoAAAAAgAAAARzdHIxAAAABHN0cjIJAAEsAAAAAgkAASwAAAACBQAAAARzdHIxBQAAAAlzZXBhcmF0b3IFAAAABHN0cjIBAAAAEmdldEN1cnJlbnRSYW5kSGFzaAAAAAEAAAAEdHhJZAkAC1QAAAABCQAAywAAAAIJAQAAAAV2YWx1ZQAAAAEICQEAAAAFdmFsdWUAAAABCQAD7QAAAAEFAAAABmhlaWdodAAAAAN2cmYFAAAABHR4SWQBAAAAB3JhbmRJbnQAAAAEAAAAA21pbgAAAANtYXgAAAAIcmFuZEhhc2gAAAAFbm9uY2UJAABkAAAAAgkAAGoAAAACCQAE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U3RhdDNUeXBlBQAAAApzcGVsbElkU3RyBQAAAAJzMwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAABHdpdGgAAAACBQAAABJrZXlTcGVsbFN0YXQxVmFsdWUFAAAACnNwZWxsSWRTdHIFAAAAAnYxCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAEd2l0aAAAAAIFAAAAEmtleVNwZWxsU3RhdDJWYWx1ZQUAAAAKc3BlbGxJZFN0cgUAAAACdjIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAAR3aXRoAAAAAgUAAAASa2V5U3BlbGxTdGF0M1ZhbHVlBQAAAApzcGVsbElkU3RyBQAAAAJ2MwUAAAADbmlsAQAAABBnZW5lcmF0ZU1vYkVudHJ5AAAAAgAAAAhyYW5kSGFzaAAAAAxjdXJyZW50Tm9uY2UEAAAADWN1cnJlbnRJdGVtSWQJAQAAABFAZXh0ck5hdGl2ZSgxMDU1KQAAAAEFAAAAEGtleUl0ZW1zSWRzQ291bnQEAAAADmN1cnJlbnRTcGVsbElkCQEAAAARQGV4dHJOYXRpdmUoMTA1NSkAAAABBQAAABFrZXlTcGVsbHNJZHNDb3VudAQAAAAMY3VycmVudE1vYklkCQEAAAARQGV4dHJOYXRpdmUoMTA1NSkAAAABBQAAAA9rZXlNb2JzSWRzQ291bnQEAAAAD2N1cnJlbnRNb2JJZFN0cgkAAaQAAAABBQAAAAxjdXJyZW50TW9iSWQEAAAABXN0YWZmCQEAAAAMZ2VuZXJhdGVJdGVtAAAABAAAAAAAAAAAAAUAAAANY3VycmVudEl0ZW1JZAUAAAAIcmFuZEhhc2gJAABkAAAAAgUAAAAMY3VycmVudE5vbmNlAAAAAAAAAABkBAAAAARyb2JlCQEAAAAMZ2VuZXJhdGVJdGVtAAAABAAAAAAAAAAAAQkAAGQAAAACBQAAAA1jdXJyZW50SXRlbUlkAAAAAAAAAAABBQAAAAhyYW5kSGFzaAkAAGQAAAACBQAAAAxjdXJyZW50Tm9uY2UAAAAAAAAAAMgEAAAABHJpbmcJAQAAAAxnZW5lcmF0ZUl0ZW0AAAAEAAAAAAAAAAACCQAAZAAAAAIFAAAADWN1cnJlbnRJdGVtSWQAAAAAAAAAAAIFAAAACHJhbmRIYXNoCQAAZAAAAAIFAAAADGN1cnJlbnROb25jZQAAAAAAAAABLAQAAAAGc3BlbGwxCQEAAAANZ2VuZXJhdGVTcGVsbAAAAAMFAAAADmN1cnJlbnRTcGVsbElkBQAAAAhyYW5kSGFzaAkAAGQAAAACBQAAAAxjdXJyZW50Tm9uY2UAAAAAAAAAAZAEAAAABnNwZWxsMgkBAAAADWdlbmVyYXRlU3BlbGwAAAADCQAAZAAAAAIFAAAADmN1cnJlbnRTcGVsbElkAAAAAAAAAAABBQAAAAhyYW5kSGFzaAkAAGQAAAACBQAAAAxjdXJyZW50Tm9uY2UAAAAAAAAAAfQEAAAABnNwZWxsMwkBAAAADWdlbmVyYXRlU3BlbGwAAAADCQAAZAAAAAIFAAAADmN1cnJlbnRTcGVsbElkAAAAAAAAAAACBQAAAAhyYW5kSGFzaAkAAGQAAAACBQAAAAxjdXJyZW50Tm9uY2UAAAAAAAAAAlgEAAAACW1vYkhlYWx0aAkBAAAAB3JhbmRJbnQAAAAEAAAAAAAAAAPoAAAAAAAAAAXcBQAAAAhyYW5kSGFzaAkAAGQAAAACBQAAAAxjdXJyZW50Tm9uY2UAAAAAAAAAArwEAAAABm1vYkV4cAkBAAAAB3JhbmRJbnQAAAAEAAAAAAAAAABkAAAAAAAAAADIBQAAAAhyYW5kSGFzaAkAAGQAAAACBQAAAAxjdXJyZW50Tm9uY2UAAAAAAAAAAr0EAAAAB21vYkdvbGQJAQAAAAdyYW5kSW50AAAABAAAAAAAAAAB9AAAAAAAAAAH0AUAAAAIcmFuZEhhc2gJAABkAAAAAgUAAAAMY3VycmVudE5vbmNlAAAAAAAAAAK+BAAAAA1tb2JMb290Q2hhbmNlCQEAAAAHcmFuZEludAAAAAQAAAAAAAAAAAUAAAAAAAAAABQFAAAACHJhbmRIYXNoCQAAZAAAAAIFAAAADGN1cnJlbnROb25jZQAAAAAAAAACvwkABE4AAAACCQAETgAAAAIJAAROAAAAAgkABE4AAAACCQAETgAAAAIJAAROAAAAAgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAABHdpdGgAAAACBQAAABNrZXlNb2JDdXJyZW50SGVhbHRoBQAAAA9jdXJyZW50TW9iSWRTdHIFAAAACW1vYkhlYWx0aAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAABHdpdGgAAAACBQAAAA9rZXlNb2JNYXhIZWFsdGgFAAAAD2N1cnJlbnRNb2JJZFN0cgUAAAAJbW9iSGVhbHRoCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAEd2l0aAAAAAIFAAAAD2tleU1vYkV4cFBvaW50cwUAAAAPY3VycmVudE1vYklkU3RyBQAAAAZtb2JFeHAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAAR3aXRoAAAAAgUAAAAKa2V5TW9iR29sZAUAAAAPY3VycmVudE1vYklkU3RyBQAAAAdtb2JHb2xkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAEd2l0aAAAAAIFAAAAEGtleU1vYkxvb3RDaGFuY2UFAAAAD2N1cnJlbnRNb2JJZFN0cgUAAAANbW9iTG9vdENoYW5jZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAABHdpdGgAAAACBQAAAA1rZXlNb2JTdGFmZklkBQAAAA9jdXJyZW50TW9iSWRTdHIFAAAADWN1cnJlbnRJdGVtSWQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAAR3aXRoAAAAAgUAAAAMa2V5TW9iUm9iZUlkBQAAAA9jdXJyZW50TW9iSWRTdHIJAABkAAAAAgUAAAANY3VycmVudEl0ZW1JZAAAAAAAAAAAAQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAABHdpdGgAAAACBQAAAAxrZXlNb2JSaW5nSWQFAAAAD2N1cnJlbnRNb2JJZFN0cgkAAGQAAAACBQAAAA1jdXJyZW50SXRlbUlkAAAAAAAAAAACCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAEd2l0aAAAAAIFAAAADmtleU1vYlNwZWxsMUlkBQAAAA9jdXJyZW50TW9iSWRTdHIFAAAADmN1cnJlbnRTcGVsbElkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAEd2l0aAAAAAIFAAAADmtleU1vYlNwZWxs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blRlcnJhBQAAAAV0ZXJyYQUAAAAIcmFuZEhhc2gAAAAAAAAAAAcEAAAACG1vYkVudHJ5CQEAAAAQZ2VuZXJhdGVNb2JFbnRyeQAAAAIFAAAACHJhbmRIYXNoAAAAAAAAAABkCQAETgAAAAIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAABHdpdGgAAAACBQAAAAdrZXlOYW1lBQAAAAljaGFySWRTdHIFAAAABG5hbWUJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAAR3aXRoAAAAAgUAAAAGa2V5U2V4BQAAAAljaGFySWRTdHIFAAAAA3NleAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAABHdpdGgAAAACBQAAAAdrZXlSYW5rBQAAAAljaGFySWRTdHIAAAAAAAAAAAEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAAR3aXRoAAAAAgUAAAAQa2V5SGVhbHRoQ3VycmVudAUAAAAJY2hhcklkU3RyBQAAAApyYW5kSGVhbHRoCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAEd2l0aAAAAAIFAAAADGtleUhlYWx0aE1heAUAAAAJY2hhcklkU3RyBQAAAApyYW5kSGVhbHRoCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAEd2l0aAAAAAIFAAAAE2tleU1pbkhlYWx0aFBlclJhbmsFAAAACWNoYXJJZFN0cgUAAAAJbWluSGVhbHRoCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAEd2l0aAAAAAIFAAAAE2tleU1heEhlYWx0aFBlclJhbmsFAAAACWNoYXJJZFN0cgUAAAAJbWluSGVhbHRoCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAEd2l0aAAAAAIFAAAADmtleUhlYWx0aFJlZ2VuBQAAAAljaGFySWRTdHIFAAAAD3JhbmRIZWFsdGhSZWdlbgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAABHdpdGgAAAACBQAAABhrZXlNaW5IZWFsdGhSZWdlblBlclJhbmsFAAAACWNoYXJJZFN0cgUAAAAObWluSGVhbHRoUmVnZW4JAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAAR3aXRoAAAAAgUAAAAYa2V5TWF4SGVhbHRoUmVnZW5QZXJSYW5rBQAAAAljaGFySWRTdHIFAAAADm1heEhlYWx0aFJlZ2VuCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAEd2l0aAAAAAIFAAAADmtleU1hbmFDdXJyZW50BQAAAAljaGFySWRTdHIFAAAACHJhbmRNYW5hCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAEd2l0aAAAAAIFAAAACmtleU1hbmFNYXgFAAAACWNoYXJJZFN0cgUAAAAIcmFuZE1hbmEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAAR3aXRoAAAAAgUAAAARa2V5TWluTWFuYVBlclJhbmsFAAAACWNoYXJJZFN0cgUAAAAHbWluTWFuYQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAABHdpdGgAAAACBQAAABFrZXlNYXhNYW5hUGVyUmFuawUAAAAJY2hhcklkU3RyBQAAAAdtYXhNYW5hCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAEd2l0aAAAAAIFAAAADGtleU1hbmFSZWdlbgUAAAAJY2hhcklkU3RyBQAAAA1yYW5kTWFuYVJlZ2VuCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAEd2l0aAAAAAIFAAAAFmtleU1pbk1hbmFSZWdlblBlclJhbmsFAAAACWNoYXJJZFN0cgUAAAAMbWluTWFuYVJlZ2VuCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAEd2l0aAAAAAIFAAAAFmtleU1heE1hbmFSZWdlblBlclJhbmsFAAAACWNoYXJJZFN0cgUAAAAMbWF4TWFuYVJlZ2VuCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAEd2l0aAAAAAIFAAAAB2tleVB5cm8FAAAACWNoYXJJZFN0cgUAAAAIcmFuZFB5cm8JAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAAR3aXRoAAAAAgUAAAARa2V5TWluUHlyb1BlclJhbmsFAAAACWNoYXJJZFN0cgUAAAAHbWluUHlybwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAABHdpdGgAAAACBQAAABFrZXlNYXhQeXJvUGVyUmFuawUAAAAJY2hhcklkU3RyBQAAAARweXJvCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAEd2l0aAAAAAIFAAAAB2tleUFlcm8FAAAACWNoYXJJZFN0cgUAAAAIcmFuZEFlcm8JAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAAR3aXRoAAAAAgUAAAARa2V5TWluQWVyb1BlclJhbmsFAAAACWNoYXJJZFN0cgUAAAAHbWluQWVybwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAABHdpdGgAAAACBQAAABFrZXlNYXhBZXJvUGVyUmFuawUAAAAJY2hhcklkU3RyBQAAAARhZXJvCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAEd2l0aAAAAAIFAAAAB2tleUFxdWEFAAAACWNoYXJJZFN0cgUAAAAIcmFuZEFxdWEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAAR3aXRoAAAAAgUAAAARa2V5TWluQXF1YVBlclJhbmsFAAAACWNoYXJJZFN0cgUAAAAHbWluQXF1YQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAABHdpdGgAAAACBQAAABFrZXlNYXhBcXVhUGVyUmFuawUAAAAJY2hhcklkU3RyBQAAAARhcXVhCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAEd2l0aAAAAAIFAAAACGtleVRlcnJhBQAAAAljaGFySWRTdHIFAAAACXJhbmRUZXJyYQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAABHdpdGgAAAACBQAAABJrZXlNaW5UZXJyYVBlclJhbmsFAAAACWNoYXJJZFN0cgUAAAAIbWluVGVycmEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAAR3aXRoAAAAAgUAAAASa2V5TWF4VGVycmFQZXJSYW5rBQAAAAljaGFySWRTdHIFAAAABXRlcnJhCQAETAAAAAIFAAAACWNoYXJJc3N1ZQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIAAAAAAAAAAAEFAAAABmNoYXJJZAUAAAADbmlsBQAAAAhtb2JFbnRyeQAAAAEAAAACdHgBAAAABnZlcmlmeQAAAAAJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAACAUAAAACdHgAAAAPc2VuZGVyUHVibGljS2V5dQsvQQ==", "height": 1908939, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GsrYNRJs4Q5w4vdjaKKv11HytnEvJcCqSkMWuxiHNmoh Next: 2Ho5XorzWUpkp24CvTFdf2BawSUYBYR57uZ8ny9n1HEV Diff:
Old | New | Differences | |
---|---|---|---|
10 | 10 | let keyInitialCharCreationStats = "initialCharCreationStats" | |
11 | 11 | ||
12 | 12 | let separator = "_" | |
13 | + | ||
14 | + | let keyItemsIdsCount = "itemsIdsCount" | |
15 | + | ||
16 | + | let keySpellsIdsCount = "spellsIdsCount" | |
17 | + | ||
18 | + | let keyMobsIdsCount = "mobsIdsCount" | |
19 | + | ||
20 | + | let keyItemType = "itemType" | |
21 | + | ||
22 | + | let keyItemStat1Type = "itemStat1Type" | |
23 | + | ||
24 | + | let keyItemStat2Type = "itemStat2Type" | |
25 | + | ||
26 | + | let keyItemStat3Type = "itemStat3Type" | |
27 | + | ||
28 | + | let keyItemStat1Value = "itemStat1Value" | |
29 | + | ||
30 | + | let keyItemStat2Value = "itemStat2Value" | |
31 | + | ||
32 | + | let keyItemStat3Value = "itemStat3Value" | |
33 | + | ||
34 | + | let keySpellDmgType = "spellElem" | |
35 | + | ||
36 | + | let keySpellMinDmg = "spellMinDmg" | |
37 | + | ||
38 | + | let keySpellMaxDmg = "spellMaxDmg" | |
39 | + | ||
40 | + | let keySpellStat1Type = "spellStat1Type" | |
41 | + | ||
42 | + | let keySpellStat2Type = "spellStat2Type" | |
43 | + | ||
44 | + | let keySpellStat3Type = "spellStat3Type" | |
45 | + | ||
46 | + | let keySpellStat1Value = "spellStat1Value" | |
47 | + | ||
48 | + | let keySpellStat2Value = "spellStat2Value" | |
49 | + | ||
50 | + | let keySpellStat3Value = "spellStat3Value" | |
51 | + | ||
52 | + | let keyMobCurrentHealth = "mobCurrentHealth" | |
53 | + | ||
54 | + | let keyMobMaxHealth = "mobMaxHealth" | |
55 | + | ||
56 | + | let keyMobExpPoints = "mobExpPoints" | |
57 | + | ||
58 | + | let keyMobGold = "mobGold" | |
59 | + | ||
60 | + | let keyMobLootChance = "mobLootChance" | |
61 | + | ||
62 | + | let keyMobStaffId = "mobStaffId" | |
63 | + | ||
64 | + | let keyMobRobeId = "mobRobeId" | |
65 | + | ||
66 | + | let keyMobRingId = "mobRingId" | |
67 | + | ||
68 | + | let keyMobSpell1Id = "mobSpell1Id" | |
69 | + | ||
70 | + | let keyMobSpell2Id = "mobSpell2Id" | |
71 | + | ||
72 | + | let keyMobSpell3Id = "mobSpell3Id" | |
13 | 73 | ||
14 | 74 | let keyName = "name" | |
15 | 75 | ||
72 | 132 | func with (str1,str2) = ((str1 + separator) + str2) | |
73 | 133 | ||
74 | 134 | ||
75 | - | func randInt (min,max,txId,nonce) = ((toInt(sha256_16Kb((value(value(blockInfoByHeight(height)).vrf) + txId)), nonce) % ((max - min) + 1)) + min) | |
135 | + | func getCurrentRandHash (txId) = sha256_16Kb((value(value(blockInfoByHeight(height)).vrf) + txId)) | |
136 | + | ||
137 | + | ||
138 | + | func randInt (min,max,randHash,nonce) = ((toInt(randHash, nonce) % ((max - min) + 1)) + min) | |
139 | + | ||
140 | + | ||
141 | + | func generateItem (type,itemId,randHash,currentNonce) = { | |
142 | + | let statsRange = [[1, 5], [5, 25], [1, 5], [1, 5], [1, 5], [1, 5], [1, 5], [1, 5], [1, 5], [1, 5], [5, 15], [5, 15], [5, 15], [1, 5], [5, 10]] | |
143 | + | let statsAvailable = if ((type == 0)) | |
144 | + | then [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 14] | |
145 | + | else if ((type == 1)) | |
146 | + | then [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 13] | |
147 | + | else if ((type == 2)) | |
148 | + | then [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] | |
149 | + | else throw("Unknown item type") | |
150 | + | let statsAmount = size(statsAvailable) | |
151 | + | let s1 = statsAvailable[randInt(0, (statsAmount - 1), randHash, (currentNonce + 1))] | |
152 | + | let s2 = statsAvailable[randInt(0, (statsAmount - 1), randHash, (currentNonce + 2))] | |
153 | + | let s3 = statsAvailable[randInt(0, (statsAmount - 1), randHash, (currentNonce + 3))] | |
154 | + | let v1 = randInt(statsRange[s1][0], statsRange[s1][1], randHash, (currentNonce + 4)) | |
155 | + | let v2 = randInt(statsRange[s2][0], statsRange[s2][1], randHash, (currentNonce + 5)) | |
156 | + | let v3 = randInt(statsRange[s3][0], statsRange[s3][1], randHash, (currentNonce + 6)) | |
157 | + | let itemIdStr = toString(itemId) | |
158 | + | [IntegerEntry(with(keyItemType, itemIdStr), type), IntegerEntry(with(keyItemStat1Type, itemIdStr), s1), IntegerEntry(with(keyItemStat2Type, itemIdStr), s2), IntegerEntry(with(keyItemStat3Type, itemIdStr), s3), IntegerEntry(with(keyItemStat1Value, itemIdStr), v1), IntegerEntry(with(keyItemStat2Value, itemIdStr), v2), IntegerEntry(with(keyItemStat3Value, itemIdStr), v3)] | |
159 | + | } | |
160 | + | ||
161 | + | ||
162 | + | func generateSpell (spellId,randHash,currentNonce) = { | |
163 | + | let statsRange = [[1, 5], [5, 25], [100, 200], [100, 150], [1, 5], [1, 5], [1, 5], [1, 5], [5, 10]] | |
164 | + | let dmgType = randInt(0, 3, randHash, (currentNonce + 1)) | |
165 | + | let dmgMinRange = randInt(200, 250, randHash, (currentNonce + 2)) | |
166 | + | let dmgMaxRange = randInt(251, 400, randHash, (currentNonce + 3)) | |
167 | + | let s1 = randInt(0, 8, randHash, (currentNonce + 4)) | |
168 | + | let s2 = randInt(0, 8, randHash, (currentNonce + 5)) | |
169 | + | let s3 = randInt(0, 8, randHash, (currentNonce + 6)) | |
170 | + | let v1 = randInt(statsRange[s1][0], statsRange[s1][1], randHash, (currentNonce + 7)) | |
171 | + | let v2 = randInt(statsRange[s2][0], statsRange[s2][1], randHash, (currentNonce + 8)) | |
172 | + | let v3 = randInt(statsRange[s3][0], statsRange[s3][1], randHash, (currentNonce + 9)) | |
173 | + | let spellIdStr = toString(spellId) | |
174 | + | [IntegerEntry(with(keySpellDmgType, spellIdStr), dmgType), IntegerEntry(with(keySpellMinDmg, spellIdStr), dmgMinRange), IntegerEntry(with(keySpellMaxDmg, spellIdStr), dmgMaxRange), IntegerEntry(with(keySpellStat1Type, spellIdStr), s1), IntegerEntry(with(keySpellStat2Type, spellIdStr), s2), IntegerEntry(with(keySpellStat3Type, spellIdStr), s3), IntegerEntry(with(keySpellStat1Value, spellIdStr), v1), IntegerEntry(with(keySpellStat2Value, spellIdStr), v2), IntegerEntry(with(keySpellStat3Value, spellIdStr), v3)] | |
175 | + | } | |
176 | + | ||
177 | + | ||
178 | + | func generateMobEntry (randHash,currentNonce) = { | |
179 | + | let currentItemId = getIntegerValue(keyItemsIdsCount) | |
180 | + | let currentSpellId = getIntegerValue(keySpellsIdsCount) | |
181 | + | let currentMobId = getIntegerValue(keyMobsIdsCount) | |
182 | + | let currentMobIdStr = toString(currentMobId) | |
183 | + | let staff = generateItem(0, currentItemId, randHash, (currentNonce + 100)) | |
184 | + | let robe = generateItem(1, (currentItemId + 1), randHash, (currentNonce + 200)) | |
185 | + | let ring = generateItem(2, (currentItemId + 2), randHash, (currentNonce + 300)) | |
186 | + | let spell1 = generateSpell(currentSpellId, randHash, (currentNonce + 400)) | |
187 | + | let spell2 = generateSpell((currentSpellId + 1), randHash, (currentNonce + 500)) | |
188 | + | let spell3 = generateSpell((currentSpellId + 2), randHash, (currentNonce + 600)) | |
189 | + | let mobHealth = randInt(1000, 1500, randHash, (currentNonce + 700)) | |
190 | + | let mobExp = randInt(100, 200, randHash, (currentNonce + 701)) | |
191 | + | let mobGold = randInt(500, 2000, randHash, (currentNonce + 702)) | |
192 | + | let mobLootChance = randInt(5, 20, randHash, (currentNonce + 703)) | |
193 | + | (((((([IntegerEntry(with(keyMobCurrentHealth, currentMobIdStr), mobHealth), IntegerEntry(with(keyMobMaxHealth, currentMobIdStr), mobHealth), IntegerEntry(with(keyMobExpPoints, currentMobIdStr), mobExp), IntegerEntry(with(keyMobGold, currentMobIdStr), mobGold), IntegerEntry(with(keyMobLootChance, currentMobIdStr), mobLootChance), IntegerEntry(with(keyMobStaffId, currentMobIdStr), currentItemId), IntegerEntry(with(keyMobRobeId, currentMobIdStr), (currentItemId + 1)), IntegerEntry(with(keyMobRingId, currentMobIdStr), (currentItemId + 2)), IntegerEntry(with(keyMobSpell1Id, currentMobIdStr), currentSpellId), IntegerEntry(with(keyMobSpell2Id, currentMobIdStr), (currentSpellId + 1)), IntegerEntry(with(keyMobSpell3Id, currentMobIdStr), (currentSpellId + 2)), IntegerEntry(keyItemsIdsCount, (currentItemId + 3)), IntegerEntry(keySpellsIdsCount, (currentSpellId + 3)), IntegerEntry(keyMobsIdsCount, (currentMobId + 1))] ++ staff) ++ robe) ++ ring) ++ spell1) ++ spell2) ++ spell3) | |
194 | + | } | |
76 | 195 | ||
77 | 196 | ||
78 | 197 | @Callable(i) | |
125 | 244 | let charIssue = Issue(name, "", 1, 0, false, unit, 0) | |
126 | 245 | let charId = calculateAssetId(charIssue) | |
127 | 246 | let charIdStr = toBase58String(charId) | |
128 | - | let | |
247 | + | let randHash = getCurrentRandHash(i.transactionId) | |
129 | 248 | let minHealth = parseIntValue(initialStats[3]) | |
130 | 249 | let maxHealth = parseIntValue(initialStats[4]) | |
131 | - | let randHealth = (parseIntValue(initialStats[2]) + randInt(minHealth, maxHealth, | |
250 | + | let randHealth = (parseIntValue(initialStats[2]) + randInt(minHealth, maxHealth, randHash, 0)) | |
132 | 251 | let minHealthRegen = parseIntValue(initialStats[6]) | |
133 | 252 | let maxHealthRegen = parseIntValue(initialStats[7]) | |
134 | - | let randHealthRegen = (parseIntValue(initialStats[5]) + randInt(minHealthRegen, maxHealthRegen, | |
253 | + | let randHealthRegen = (parseIntValue(initialStats[5]) + randInt(minHealthRegen, maxHealthRegen, randHash, 1)) | |
135 | 254 | let minMana = parseIntValue(initialStats[9]) | |
136 | 255 | let maxMana = parseIntValue(initialStats[10]) | |
137 | - | let randMana = (parseIntValue(initialStats[8]) + randInt(minMana, maxMana, | |
256 | + | let randMana = (parseIntValue(initialStats[8]) + randInt(minMana, maxMana, randHash, 2)) | |
138 | 257 | let minManaRegen = parseIntValue(initialStats[12]) | |
139 | 258 | let maxManaRegen = parseIntValue(initialStats[13]) | |
140 | - | let randManaRegen = (parseIntValue(initialStats[11]) + randInt(minManaRegen, maxManaRegen, | |
259 | + | let randManaRegen = (parseIntValue(initialStats[11]) + randInt(minManaRegen, maxManaRegen, randHash, 3)) | |
141 | 260 | let minPyro = parseIntValue(initialStats[14]) | |
142 | - | let randPyro = randInt(minPyro, pyro, | |
261 | + | let randPyro = randInt(minPyro, pyro, randHash, 4) | |
143 | 262 | let minAero = parseIntValue(initialStats[15]) | |
144 | - | let randAero = randInt(minAero, aero, | |
263 | + | let randAero = randInt(minAero, aero, randHash, 5) | |
145 | 264 | let minAqua = parseIntValue(initialStats[16]) | |
146 | - | let randAqua = randInt(minAqua, aqua, | |
265 | + | let randAqua = randInt(minAqua, aqua, randHash, 6) | |
147 | 266 | let minTerra = parseIntValue(initialStats[17]) | |
148 | - | let randTerra = randInt(minTerra, terra, tx, 7) | |
149 | - | [StringEntry(with(keyName, charIdStr), name), IntegerEntry(with(keySex, charIdStr), sex), IntegerEntry(with(keyRank, charIdStr), 1), IntegerEntry(with(keyHealthCurrent, charIdStr), randHealth), IntegerEntry(with(keyHealthMax, charIdStr), randHealth), IntegerEntry(with(keyMinHealthPerRank, charIdStr), minHealth), IntegerEntry(with(keyMaxHealthPerRank, charIdStr), minHealth), IntegerEntry(with(keyHealthRegen, charIdStr), randHealthRegen), IntegerEntry(with(keyMinHealthRegenPerRank, charIdStr), minHealthRegen), IntegerEntry(with(keyMaxHealthRegenPerRank, charIdStr), maxHealthRegen), IntegerEntry(with(keyManaCurrent, charIdStr), randMana), IntegerEntry(with(keyManaMax, charIdStr), randMana), IntegerEntry(with(keyMinManaPerRank, charIdStr), minMana), IntegerEntry(with(keyMaxManaPerRank, charIdStr), maxMana), IntegerEntry(with(keyManaRegen, charIdStr), randManaRegen), IntegerEntry(with(keyMinManaRegenPerRank, charIdStr), minManaRegen), IntegerEntry(with(keyMaxManaRegenPerRank, charIdStr), maxManaRegen), IntegerEntry(with(keyPyro, charIdStr), randPyro), IntegerEntry(with(keyMinPyroPerRank, charIdStr), minPyro), IntegerEntry(with(keyMaxPyroPerRank, charIdStr), pyro), IntegerEntry(with(keyAero, charIdStr), randAero), IntegerEntry(with(keyMinAeroPerRank, charIdStr), minAero), IntegerEntry(with(keyMaxAeroPerRank, charIdStr), aero), IntegerEntry(with(keyAqua, charIdStr), randAqua), IntegerEntry(with(keyMinAquaPerRank, charIdStr), minAqua), IntegerEntry(with(keyMaxAquaPerRank, charIdStr), aqua), IntegerEntry(with(keyTerra, charIdStr), randTerra), IntegerEntry(with(keyMinTerraPerRank, charIdStr), minTerra), IntegerEntry(with(keyMaxTerraPerRank, charIdStr), terra), charIssue, ScriptTransfer(i.caller, 1, charId), IntegerEntry("test", toInt(value(value(blockInfoByHeight(height)).vrf))), IntegerEntry("test2", toInt(value(value(blockInfoByHeight(height)).vrf))), IntegerEntry("test3", toInt(value(value(blockInfoByHeight(height)).vrf)))] | |
267 | + | let randTerra = randInt(minTerra, terra, randHash, 7) | |
268 | + | let mobEntry = generateMobEntry(randHash, 100) | |
269 | + | ([StringEntry(with(keyName, charIdStr), name), IntegerEntry(with(keySex, charIdStr), sex), IntegerEntry(with(keyRank, charIdStr), 1), IntegerEntry(with(keyHealthCurrent, charIdStr), randHealth), IntegerEntry(with(keyHealthMax, charIdStr), randHealth), IntegerEntry(with(keyMinHealthPerRank, charIdStr), minHealth), IntegerEntry(with(keyMaxHealthPerRank, charIdStr), minHealth), IntegerEntry(with(keyHealthRegen, charIdStr), randHealthRegen), IntegerEntry(with(keyMinHealthRegenPerRank, charIdStr), minHealthRegen), IntegerEntry(with(keyMaxHealthRegenPerRank, charIdStr), maxHealthRegen), IntegerEntry(with(keyManaCurrent, charIdStr), randMana), IntegerEntry(with(keyManaMax, charIdStr), randMana), IntegerEntry(with(keyMinManaPerRank, charIdStr), minMana), IntegerEntry(with(keyMaxManaPerRank, charIdStr), maxMana), IntegerEntry(with(keyManaRegen, charIdStr), randManaRegen), IntegerEntry(with(keyMinManaRegenPerRank, charIdStr), minManaRegen), IntegerEntry(with(keyMaxManaRegenPerRank, charIdStr), maxManaRegen), IntegerEntry(with(keyPyro, charIdStr), randPyro), IntegerEntry(with(keyMinPyroPerRank, charIdStr), minPyro), IntegerEntry(with(keyMaxPyroPerRank, charIdStr), pyro), IntegerEntry(with(keyAero, charIdStr), randAero), IntegerEntry(with(keyMinAeroPerRank, charIdStr), minAero), IntegerEntry(with(keyMaxAeroPerRank, charIdStr), aero), IntegerEntry(with(keyAqua, charIdStr), randAqua), IntegerEntry(with(keyMinAquaPerRank, charIdStr), minAqua), IntegerEntry(with(keyMaxAquaPerRank, charIdStr), aqua), IntegerEntry(with(keyTerra, charIdStr), randTerra), IntegerEntry(with(keyMinTerraPerRank, charIdStr), minTerra), IntegerEntry(with(keyMaxTerraPerRank, charIdStr), terra), charIssue, ScriptTransfer(i.caller, 1, charId)] ++ mobEntry) | |
150 | 270 | } | |
151 | 271 | } | |
152 | 272 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 5 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let params = addressFromStringValue("3N2jZaH1jLZ5uhKkNik6geA57HzMGw98igR") | |
5 | 5 | ||
6 | 6 | let keyInitV1Done = "init_v1_done" | |
7 | 7 | ||
8 | 8 | let keyTokenId = "tokenId" | |
9 | 9 | ||
10 | 10 | let keyInitialCharCreationStats = "initialCharCreationStats" | |
11 | 11 | ||
12 | 12 | let separator = "_" | |
13 | + | ||
14 | + | let keyItemsIdsCount = "itemsIdsCount" | |
15 | + | ||
16 | + | let keySpellsIdsCount = "spellsIdsCount" | |
17 | + | ||
18 | + | let keyMobsIdsCount = "mobsIdsCount" | |
19 | + | ||
20 | + | let keyItemType = "itemType" | |
21 | + | ||
22 | + | let keyItemStat1Type = "itemStat1Type" | |
23 | + | ||
24 | + | let keyItemStat2Type = "itemStat2Type" | |
25 | + | ||
26 | + | let keyItemStat3Type = "itemStat3Type" | |
27 | + | ||
28 | + | let keyItemStat1Value = "itemStat1Value" | |
29 | + | ||
30 | + | let keyItemStat2Value = "itemStat2Value" | |
31 | + | ||
32 | + | let keyItemStat3Value = "itemStat3Value" | |
33 | + | ||
34 | + | let keySpellDmgType = "spellElem" | |
35 | + | ||
36 | + | let keySpellMinDmg = "spellMinDmg" | |
37 | + | ||
38 | + | let keySpellMaxDmg = "spellMaxDmg" | |
39 | + | ||
40 | + | let keySpellStat1Type = "spellStat1Type" | |
41 | + | ||
42 | + | let keySpellStat2Type = "spellStat2Type" | |
43 | + | ||
44 | + | let keySpellStat3Type = "spellStat3Type" | |
45 | + | ||
46 | + | let keySpellStat1Value = "spellStat1Value" | |
47 | + | ||
48 | + | let keySpellStat2Value = "spellStat2Value" | |
49 | + | ||
50 | + | let keySpellStat3Value = "spellStat3Value" | |
51 | + | ||
52 | + | let keyMobCurrentHealth = "mobCurrentHealth" | |
53 | + | ||
54 | + | let keyMobMaxHealth = "mobMaxHealth" | |
55 | + | ||
56 | + | let keyMobExpPoints = "mobExpPoints" | |
57 | + | ||
58 | + | let keyMobGold = "mobGold" | |
59 | + | ||
60 | + | let keyMobLootChance = "mobLootChance" | |
61 | + | ||
62 | + | let keyMobStaffId = "mobStaffId" | |
63 | + | ||
64 | + | let keyMobRobeId = "mobRobeId" | |
65 | + | ||
66 | + | let keyMobRingId = "mobRingId" | |
67 | + | ||
68 | + | let keyMobSpell1Id = "mobSpell1Id" | |
69 | + | ||
70 | + | let keyMobSpell2Id = "mobSpell2Id" | |
71 | + | ||
72 | + | let keyMobSpell3Id = "mobSpell3Id" | |
13 | 73 | ||
14 | 74 | let keyName = "name" | |
15 | 75 | ||
16 | 76 | let keySex = "sex" | |
17 | 77 | ||
18 | 78 | let keyRank = "rank" | |
19 | 79 | ||
20 | 80 | let keyHealthCurrent = "healthCurrent" | |
21 | 81 | ||
22 | 82 | let keyHealthMax = "healthMax" | |
23 | 83 | ||
24 | 84 | let keyMinHealthPerRank = "minHealthPerRank" | |
25 | 85 | ||
26 | 86 | let keyMaxHealthPerRank = "maxHealthPerRank" | |
27 | 87 | ||
28 | 88 | let keyHealthRegen = "healthRegen" | |
29 | 89 | ||
30 | 90 | let keyMinHealthRegenPerRank = "minHealthRegenPerRank" | |
31 | 91 | ||
32 | 92 | let keyMaxHealthRegenPerRank = "maxHealthRegenPerRank" | |
33 | 93 | ||
34 | 94 | let keyManaCurrent = "manaCurrent" | |
35 | 95 | ||
36 | 96 | let keyManaMax = "manaMax" | |
37 | 97 | ||
38 | 98 | let keyMinManaPerRank = "minManaPerRank" | |
39 | 99 | ||
40 | 100 | let keyMaxManaPerRank = "maxManaPerRank" | |
41 | 101 | ||
42 | 102 | let keyManaRegen = "manaRegen" | |
43 | 103 | ||
44 | 104 | let keyMinManaRegenPerRank = "minManaRegenPerRank" | |
45 | 105 | ||
46 | 106 | let keyMaxManaRegenPerRank = "maxManaRegenPerRank" | |
47 | 107 | ||
48 | 108 | let keyPyro = "pyro" | |
49 | 109 | ||
50 | 110 | let keyMinPyroPerRank = "minPyroPerRank" | |
51 | 111 | ||
52 | 112 | let keyMaxPyroPerRank = "maxPyroPerRank" | |
53 | 113 | ||
54 | 114 | let keyAero = "aero" | |
55 | 115 | ||
56 | 116 | let keyMinAeroPerRank = "minAeroPerRank" | |
57 | 117 | ||
58 | 118 | let keyMaxAeroPerRank = "maxAeroPerRank" | |
59 | 119 | ||
60 | 120 | let keyAqua = "aqua" | |
61 | 121 | ||
62 | 122 | let keyMinAquaPerRank = "minAquaPerRank" | |
63 | 123 | ||
64 | 124 | let keyMaxAquaPerRank = "maxAquaPerRank" | |
65 | 125 | ||
66 | 126 | let keyTerra = "terra" | |
67 | 127 | ||
68 | 128 | let keyMinTerraPerRank = "minTerraPerRank" | |
69 | 129 | ||
70 | 130 | let keyMaxTerraPerRank = "maxTerraPerRank" | |
71 | 131 | ||
72 | 132 | func with (str1,str2) = ((str1 + separator) + str2) | |
73 | 133 | ||
74 | 134 | ||
75 | - | func randInt (min,max,txId,nonce) = ((toInt(sha256_16Kb((value(value(blockInfoByHeight(height)).vrf) + txId)), nonce) % ((max - min) + 1)) + min) | |
135 | + | func getCurrentRandHash (txId) = sha256_16Kb((value(value(blockInfoByHeight(height)).vrf) + txId)) | |
136 | + | ||
137 | + | ||
138 | + | func randInt (min,max,randHash,nonce) = ((toInt(randHash, nonce) % ((max - min) + 1)) + min) | |
139 | + | ||
140 | + | ||
141 | + | func generateItem (type,itemId,randHash,currentNonce) = { | |
142 | + | let statsRange = [[1, 5], [5, 25], [1, 5], [1, 5], [1, 5], [1, 5], [1, 5], [1, 5], [1, 5], [1, 5], [5, 15], [5, 15], [5, 15], [1, 5], [5, 10]] | |
143 | + | let statsAvailable = if ((type == 0)) | |
144 | + | then [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 14] | |
145 | + | else if ((type == 1)) | |
146 | + | then [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 13] | |
147 | + | else if ((type == 2)) | |
148 | + | then [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] | |
149 | + | else throw("Unknown item type") | |
150 | + | let statsAmount = size(statsAvailable) | |
151 | + | let s1 = statsAvailable[randInt(0, (statsAmount - 1), randHash, (currentNonce + 1))] | |
152 | + | let s2 = statsAvailable[randInt(0, (statsAmount - 1), randHash, (currentNonce + 2))] | |
153 | + | let s3 = statsAvailable[randInt(0, (statsAmount - 1), randHash, (currentNonce + 3))] | |
154 | + | let v1 = randInt(statsRange[s1][0], statsRange[s1][1], randHash, (currentNonce + 4)) | |
155 | + | let v2 = randInt(statsRange[s2][0], statsRange[s2][1], randHash, (currentNonce + 5)) | |
156 | + | let v3 = randInt(statsRange[s3][0], statsRange[s3][1], randHash, (currentNonce + 6)) | |
157 | + | let itemIdStr = toString(itemId) | |
158 | + | [IntegerEntry(with(keyItemType, itemIdStr), type), IntegerEntry(with(keyItemStat1Type, itemIdStr), s1), IntegerEntry(with(keyItemStat2Type, itemIdStr), s2), IntegerEntry(with(keyItemStat3Type, itemIdStr), s3), IntegerEntry(with(keyItemStat1Value, itemIdStr), v1), IntegerEntry(with(keyItemStat2Value, itemIdStr), v2), IntegerEntry(with(keyItemStat3Value, itemIdStr), v3)] | |
159 | + | } | |
160 | + | ||
161 | + | ||
162 | + | func generateSpell (spellId,randHash,currentNonce) = { | |
163 | + | let statsRange = [[1, 5], [5, 25], [100, 200], [100, 150], [1, 5], [1, 5], [1, 5], [1, 5], [5, 10]] | |
164 | + | let dmgType = randInt(0, 3, randHash, (currentNonce + 1)) | |
165 | + | let dmgMinRange = randInt(200, 250, randHash, (currentNonce + 2)) | |
166 | + | let dmgMaxRange = randInt(251, 400, randHash, (currentNonce + 3)) | |
167 | + | let s1 = randInt(0, 8, randHash, (currentNonce + 4)) | |
168 | + | let s2 = randInt(0, 8, randHash, (currentNonce + 5)) | |
169 | + | let s3 = randInt(0, 8, randHash, (currentNonce + 6)) | |
170 | + | let v1 = randInt(statsRange[s1][0], statsRange[s1][1], randHash, (currentNonce + 7)) | |
171 | + | let v2 = randInt(statsRange[s2][0], statsRange[s2][1], randHash, (currentNonce + 8)) | |
172 | + | let v3 = randInt(statsRange[s3][0], statsRange[s3][1], randHash, (currentNonce + 9)) | |
173 | + | let spellIdStr = toString(spellId) | |
174 | + | [IntegerEntry(with(keySpellDmgType, spellIdStr), dmgType), IntegerEntry(with(keySpellMinDmg, spellIdStr), dmgMinRange), IntegerEntry(with(keySpellMaxDmg, spellIdStr), dmgMaxRange), IntegerEntry(with(keySpellStat1Type, spellIdStr), s1), IntegerEntry(with(keySpellStat2Type, spellIdStr), s2), IntegerEntry(with(keySpellStat3Type, spellIdStr), s3), IntegerEntry(with(keySpellStat1Value, spellIdStr), v1), IntegerEntry(with(keySpellStat2Value, spellIdStr), v2), IntegerEntry(with(keySpellStat3Value, spellIdStr), v3)] | |
175 | + | } | |
176 | + | ||
177 | + | ||
178 | + | func generateMobEntry (randHash,currentNonce) = { | |
179 | + | let currentItemId = getIntegerValue(keyItemsIdsCount) | |
180 | + | let currentSpellId = getIntegerValue(keySpellsIdsCount) | |
181 | + | let currentMobId = getIntegerValue(keyMobsIdsCount) | |
182 | + | let currentMobIdStr = toString(currentMobId) | |
183 | + | let staff = generateItem(0, currentItemId, randHash, (currentNonce + 100)) | |
184 | + | let robe = generateItem(1, (currentItemId + 1), randHash, (currentNonce + 200)) | |
185 | + | let ring = generateItem(2, (currentItemId + 2), randHash, (currentNonce + 300)) | |
186 | + | let spell1 = generateSpell(currentSpellId, randHash, (currentNonce + 400)) | |
187 | + | let spell2 = generateSpell((currentSpellId + 1), randHash, (currentNonce + 500)) | |
188 | + | let spell3 = generateSpell((currentSpellId + 2), randHash, (currentNonce + 600)) | |
189 | + | let mobHealth = randInt(1000, 1500, randHash, (currentNonce + 700)) | |
190 | + | let mobExp = randInt(100, 200, randHash, (currentNonce + 701)) | |
191 | + | let mobGold = randInt(500, 2000, randHash, (currentNonce + 702)) | |
192 | + | let mobLootChance = randInt(5, 20, randHash, (currentNonce + 703)) | |
193 | + | (((((([IntegerEntry(with(keyMobCurrentHealth, currentMobIdStr), mobHealth), IntegerEntry(with(keyMobMaxHealth, currentMobIdStr), mobHealth), IntegerEntry(with(keyMobExpPoints, currentMobIdStr), mobExp), IntegerEntry(with(keyMobGold, currentMobIdStr), mobGold), IntegerEntry(with(keyMobLootChance, currentMobIdStr), mobLootChance), IntegerEntry(with(keyMobStaffId, currentMobIdStr), currentItemId), IntegerEntry(with(keyMobRobeId, currentMobIdStr), (currentItemId + 1)), IntegerEntry(with(keyMobRingId, currentMobIdStr), (currentItemId + 2)), IntegerEntry(with(keyMobSpell1Id, currentMobIdStr), currentSpellId), IntegerEntry(with(keyMobSpell2Id, currentMobIdStr), (currentSpellId + 1)), IntegerEntry(with(keyMobSpell3Id, currentMobIdStr), (currentSpellId + 2)), IntegerEntry(keyItemsIdsCount, (currentItemId + 3)), IntegerEntry(keySpellsIdsCount, (currentSpellId + 3)), IntegerEntry(keyMobsIdsCount, (currentMobId + 1))] ++ staff) ++ robe) ++ ring) ++ spell1) ++ spell2) ++ spell3) | |
194 | + | } | |
76 | 195 | ||
77 | 196 | ||
78 | 197 | @Callable(i) | |
79 | 198 | func create (name,sex,pyro,aero,aqua,terra) = { | |
80 | 199 | let initialStats = split(getStringValue(params, keyInitialCharCreationStats), separator) | |
81 | 200 | let nameSize = size(name) | |
82 | 201 | if (if ((parseIntValue(initialStats[0]) > nameSize)) | |
83 | 202 | then true | |
84 | 203 | else (nameSize > parseIntValue(initialStats[1]))) | |
85 | 204 | then throw("Char name size not valid") | |
86 | 205 | else if (if (contains(name, " ")) | |
87 | 206 | then true | |
88 | 207 | else contains(name, separator)) | |
89 | 208 | then throw((("Whitespaces or " + separator) + " not allowed")) | |
90 | 209 | else if (if ((sex != 1)) | |
91 | 210 | then (sex != 2) | |
92 | 211 | else false) | |
93 | 212 | then throw("Somethings wrong with char sex") | |
94 | 213 | else if (if (if (if (if (if (if (if (if (if (if (if (if (if (if (((((pyro + aero) + aqua) + terra) != 14)) | |
95 | 214 | then true | |
96 | 215 | else (2 > pyro)) | |
97 | 216 | then true | |
98 | 217 | else (pyro > 5)) | |
99 | 218 | then true | |
100 | 219 | else (2 > aero)) | |
101 | 220 | then true | |
102 | 221 | else (aero > 5)) | |
103 | 222 | then true | |
104 | 223 | else (2 > aqua)) | |
105 | 224 | then true | |
106 | 225 | else (aqua > 5)) | |
107 | 226 | then true | |
108 | 227 | else (2 > terra)) | |
109 | 228 | then true | |
110 | 229 | else (terra > 5)) | |
111 | 230 | then true | |
112 | 231 | else (pyro == aero)) | |
113 | 232 | then true | |
114 | 233 | else (pyro == aqua)) | |
115 | 234 | then true | |
116 | 235 | else (pyro == terra)) | |
117 | 236 | then true | |
118 | 237 | else (aero == aqua)) | |
119 | 238 | then true | |
120 | 239 | else (aero == terra)) | |
121 | 240 | then true | |
122 | 241 | else (aqua == terra)) | |
123 | 242 | then throw("Elem spec issue") | |
124 | 243 | else { | |
125 | 244 | let charIssue = Issue(name, "", 1, 0, false, unit, 0) | |
126 | 245 | let charId = calculateAssetId(charIssue) | |
127 | 246 | let charIdStr = toBase58String(charId) | |
128 | - | let | |
247 | + | let randHash = getCurrentRandHash(i.transactionId) | |
129 | 248 | let minHealth = parseIntValue(initialStats[3]) | |
130 | 249 | let maxHealth = parseIntValue(initialStats[4]) | |
131 | - | let randHealth = (parseIntValue(initialStats[2]) + randInt(minHealth, maxHealth, | |
250 | + | let randHealth = (parseIntValue(initialStats[2]) + randInt(minHealth, maxHealth, randHash, 0)) | |
132 | 251 | let minHealthRegen = parseIntValue(initialStats[6]) | |
133 | 252 | let maxHealthRegen = parseIntValue(initialStats[7]) | |
134 | - | let randHealthRegen = (parseIntValue(initialStats[5]) + randInt(minHealthRegen, maxHealthRegen, | |
253 | + | let randHealthRegen = (parseIntValue(initialStats[5]) + randInt(minHealthRegen, maxHealthRegen, randHash, 1)) | |
135 | 254 | let minMana = parseIntValue(initialStats[9]) | |
136 | 255 | let maxMana = parseIntValue(initialStats[10]) | |
137 | - | let randMana = (parseIntValue(initialStats[8]) + randInt(minMana, maxMana, | |
256 | + | let randMana = (parseIntValue(initialStats[8]) + randInt(minMana, maxMana, randHash, 2)) | |
138 | 257 | let minManaRegen = parseIntValue(initialStats[12]) | |
139 | 258 | let maxManaRegen = parseIntValue(initialStats[13]) | |
140 | - | let randManaRegen = (parseIntValue(initialStats[11]) + randInt(minManaRegen, maxManaRegen, | |
259 | + | let randManaRegen = (parseIntValue(initialStats[11]) + randInt(minManaRegen, maxManaRegen, randHash, 3)) | |
141 | 260 | let minPyro = parseIntValue(initialStats[14]) | |
142 | - | let randPyro = randInt(minPyro, pyro, | |
261 | + | let randPyro = randInt(minPyro, pyro, randHash, 4) | |
143 | 262 | let minAero = parseIntValue(initialStats[15]) | |
144 | - | let randAero = randInt(minAero, aero, | |
263 | + | let randAero = randInt(minAero, aero, randHash, 5) | |
145 | 264 | let minAqua = parseIntValue(initialStats[16]) | |
146 | - | let randAqua = randInt(minAqua, aqua, | |
265 | + | let randAqua = randInt(minAqua, aqua, randHash, 6) | |
147 | 266 | let minTerra = parseIntValue(initialStats[17]) | |
148 | - | let randTerra = randInt(minTerra, terra, tx, 7) | |
149 | - | [StringEntry(with(keyName, charIdStr), name), IntegerEntry(with(keySex, charIdStr), sex), IntegerEntry(with(keyRank, charIdStr), 1), IntegerEntry(with(keyHealthCurrent, charIdStr), randHealth), IntegerEntry(with(keyHealthMax, charIdStr), randHealth), IntegerEntry(with(keyMinHealthPerRank, charIdStr), minHealth), IntegerEntry(with(keyMaxHealthPerRank, charIdStr), minHealth), IntegerEntry(with(keyHealthRegen, charIdStr), randHealthRegen), IntegerEntry(with(keyMinHealthRegenPerRank, charIdStr), minHealthRegen), IntegerEntry(with(keyMaxHealthRegenPerRank, charIdStr), maxHealthRegen), IntegerEntry(with(keyManaCurrent, charIdStr), randMana), IntegerEntry(with(keyManaMax, charIdStr), randMana), IntegerEntry(with(keyMinManaPerRank, charIdStr), minMana), IntegerEntry(with(keyMaxManaPerRank, charIdStr), maxMana), IntegerEntry(with(keyManaRegen, charIdStr), randManaRegen), IntegerEntry(with(keyMinManaRegenPerRank, charIdStr), minManaRegen), IntegerEntry(with(keyMaxManaRegenPerRank, charIdStr), maxManaRegen), IntegerEntry(with(keyPyro, charIdStr), randPyro), IntegerEntry(with(keyMinPyroPerRank, charIdStr), minPyro), IntegerEntry(with(keyMaxPyroPerRank, charIdStr), pyro), IntegerEntry(with(keyAero, charIdStr), randAero), IntegerEntry(with(keyMinAeroPerRank, charIdStr), minAero), IntegerEntry(with(keyMaxAeroPerRank, charIdStr), aero), IntegerEntry(with(keyAqua, charIdStr), randAqua), IntegerEntry(with(keyMinAquaPerRank, charIdStr), minAqua), IntegerEntry(with(keyMaxAquaPerRank, charIdStr), aqua), IntegerEntry(with(keyTerra, charIdStr), randTerra), IntegerEntry(with(keyMinTerraPerRank, charIdStr), minTerra), IntegerEntry(with(keyMaxTerraPerRank, charIdStr), terra), charIssue, ScriptTransfer(i.caller, 1, charId), IntegerEntry("test", toInt(value(value(blockInfoByHeight(height)).vrf))), IntegerEntry("test2", toInt(value(value(blockInfoByHeight(height)).vrf))), IntegerEntry("test3", toInt(value(value(blockInfoByHeight(height)).vrf)))] | |
267 | + | let randTerra = randInt(minTerra, terra, randHash, 7) | |
268 | + | let mobEntry = generateMobEntry(randHash, 100) | |
269 | + | ([StringEntry(with(keyName, charIdStr), name), IntegerEntry(with(keySex, charIdStr), sex), IntegerEntry(with(keyRank, charIdStr), 1), IntegerEntry(with(keyHealthCurrent, charIdStr), randHealth), IntegerEntry(with(keyHealthMax, charIdStr), randHealth), IntegerEntry(with(keyMinHealthPerRank, charIdStr), minHealth), IntegerEntry(with(keyMaxHealthPerRank, charIdStr), minHealth), IntegerEntry(with(keyHealthRegen, charIdStr), randHealthRegen), IntegerEntry(with(keyMinHealthRegenPerRank, charIdStr), minHealthRegen), IntegerEntry(with(keyMaxHealthRegenPerRank, charIdStr), maxHealthRegen), IntegerEntry(with(keyManaCurrent, charIdStr), randMana), IntegerEntry(with(keyManaMax, charIdStr), randMana), IntegerEntry(with(keyMinManaPerRank, charIdStr), minMana), IntegerEntry(with(keyMaxManaPerRank, charIdStr), maxMana), IntegerEntry(with(keyManaRegen, charIdStr), randManaRegen), IntegerEntry(with(keyMinManaRegenPerRank, charIdStr), minManaRegen), IntegerEntry(with(keyMaxManaRegenPerRank, charIdStr), maxManaRegen), IntegerEntry(with(keyPyro, charIdStr), randPyro), IntegerEntry(with(keyMinPyroPerRank, charIdStr), minPyro), IntegerEntry(with(keyMaxPyroPerRank, charIdStr), pyro), IntegerEntry(with(keyAero, charIdStr), randAero), IntegerEntry(with(keyMinAeroPerRank, charIdStr), minAero), IntegerEntry(with(keyMaxAeroPerRank, charIdStr), aero), IntegerEntry(with(keyAqua, charIdStr), randAqua), IntegerEntry(with(keyMinAquaPerRank, charIdStr), minAqua), IntegerEntry(with(keyMaxAquaPerRank, charIdStr), aqua), IntegerEntry(with(keyTerra, charIdStr), randTerra), IntegerEntry(with(keyMinTerraPerRank, charIdStr), minTerra), IntegerEntry(with(keyMaxTerraPerRank, charIdStr), terra), charIssue, ScriptTransfer(i.caller, 1, charId)] ++ mobEntry) | |
150 | 270 | } | |
151 | 271 | } | |
152 | 272 | ||
153 | 273 | ||
154 | 274 | @Verifier(tx) | |
155 | 275 | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
156 | 276 |
github/deemru/w8io/169f3d6 62.00 ms ◑