tx · 9UzUvMH24J9ubK4drvLGAVxfAAvVoJwhnQv5MjLZSEdo

3P2Ckda4YyJCiiBeG4LdXbMo837qjD7Jmb6:  -0.01400000 Waves

2021.10.11 17:59 [2806739] smart account 3P2Ckda4YyJCiiBeG4LdXbMo837qjD7Jmb6 > SELF 0.00000000 Waves

{ "type": 13, "id": "9UzUvMH24J9ubK4drvLGAVxfAAvVoJwhnQv5MjLZSEdo", "fee": 1400000, "feeAssetId": null, "timestamp": 1633964409329, "version": 1, "sender": "3P2Ckda4YyJCiiBeG4LdXbMo837qjD7Jmb6", "senderPublicKey": "7M2FweLjS2LV5MARTBCybTUTS9xvvZbe78eP9Vavc7v4", "proofs": [ "2h28bh7K73ka2HA8hDTtrz9RxHhWeHQGhTsA4Q8BDw3ej6Uq5NCHTehjHYkYGJispHb54mgduRGLEM7fwKSNxVA7" ], "script": "base64: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JXNfX3ByaWNlQXNzZXQBAAAADGtleUtIaXN0b3JpYwAAAAIAAAABaAAAAAl0aW1lc3RhbXAJAAS5AAAAAgkABEwAAAACAgAAABMlcyVzJWQlZF9fS19oaXN0b3J5CQAETAAAAAIJAAGkAAAAAQUAAAABaAkABEwAAAACCQABpAAAAAEFAAAACXRpbWVzdGFtcAUAAAADbmlsBQAAAANTRVABAAAAEGtleUZhY3RvcnlDb25maWcAAAAAAgAAABElc19fZmFjdG9yeUNvbmZpZwEAAAApa2V5TWFwcGluZ1Bvb2xDb250cmFjdEFkZHJlc3NUb1Bvb2xBc3NldHMAAAABAAAAE3Bvb2xDb250cmFjdEFkZHJlc3MJAAEsAAAAAgkAASwAAAACAgAAAAglcyVzJXNfXwUAAAATcG9vbENvbnRyYWN0QWRkcmVzcwIAAAAgX19tYXBwaW5nc19fcG9vbENvbnRyYWN0MkxwQXNzZXQBAAAADWtleVBvb2xDb25maWcAAAACAAAACWlBbXRBc3NldAAAAAtpUHJpY2VBc3NldAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAglZCVkJXNfXwUAAAAJaUFtdEFzc2V0AgAAAAJfXwUAAAALaVByaWNlQXNzZXQCAAAACF9fY29uZmlnAQAAAB9rZXlNYXBwaW5nc0Jhc2VBc3NldDJpbnRlcm5hbElkAAAAAQAAAAxiYXNlQXNzZXRTdHIJAAEsAAAAAgIAAAAoJXMlcyVzX19tYXBwaW5nc19fYmFzZUFzc2V0MmludGVybmFsSWRfXwUAAAAMYmFzZUFzc2V0U3RyAQAAABNrZXlBbGxQb29sc1NodXRkb3duAAAAAAIAAAAMJXNfX3NodXRkb3duAQAAAA1rZXlQb29sV2VpZ2h0AAAAAQAAAA9jb250cmFjdEFkZHJlc3MJAAEsAAAAAgIAAAASJXMlc19fcG9vbFdlaWdodF9fBQAAAA9jb250cmFjdEFkZHJlc3MBAAAAD2dldFN0cmluZ09yRmFpbAAAAAIAAAAHYWRkcmVzcwAAAANrZXkJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAdhZGRyZXNzBQAAAANrZXkJAAS5AAAAAgkABEwAAAACAgAAAAptYW5kYXRvcnkgCQAETAAAAAIJAAQlAAAAAQUAAAAHYWRkcmVzcwkABEwAAAACAgAAAAEuCQAETAAAAAIFAAAAA2tleQkABEwAAAACAgAAAA8gaXMgbm90IGRlZmluZWQFAAAAA25pbAIAAAAAAQAAAAxnZXRJbnRPckZhaWwAAAACAAAAB2FkZHJlc3MAAAADa2V5CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAHYWRkcmVzcwUAAAADa2V5CQAEuQAAAAIJAARMAAAAAgIAAAAKbWFuZGF0b3J5IAkABEwAAAACCQAEJQAAAAEFAAAAB2FkZHJlc3MJAARMAAAAAgIAAAABLgkABEwAAAACBQAAAANrZXkJAARMAAAAAgIAAAAPIGlzIG5vdCBkZWZpbmVkBQAAAANuaWwCAAAAAAAAAAAPZmFjdG9yeUNvbnRyYWN0CQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAgUAAAAEdGhpcwkBAAAAEmtleUZhY3RvcnlDb250cmFjdAAAAAABAAAAEGlzR2xvYmFsU2h1dGRvd24AAAAACQEAAAALdmFsdWVPckVsc2UAAAACCQAEGwAAAAIFAAAAD2ZhY3RvcnlDb250cmFjdAkBAAAAE2tleUFsbFBvb2xzU2h1dGRvd24AAAAABwEAAAANZ2V0UG9vbENvbmZpZwAAAAAEAAAACGFtdEFzc2V0CQEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAgUAAAAEdGhpcwkBAAAAC2tleUFtdEFzc2V0AAAAAAQAAAAKcHJpY2VBc3NldAkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAIFAAAABHRoaXMJAQAAAA1rZXlQcmljZUFzc2V0AAAAAAQAAAALaVByaWNlQXNzZXQJAQAAAAxnZXRJbnRPckZhaWwAAAACBQAAAA9mYWN0b3J5Q29udHJhY3QJAQAAAB9rZXlNYXBwaW5nc0Jhc2VBc3NldDJpbnRlcm5hbElkAAAAAQUAAAAKcHJpY2VBc3NldAQAAAAJaUFtdEFzc2V0CQEAAAAMZ2V0SW50T3JGYWlsAAAAAgUAAAAPZmFjdG9yeUNvbnRyYWN0CQEAAAAfa2V5TWFwcGluZ3NCYXNlQXNzZXQyaW50ZXJuYWxJZAAAAAEFAAAACGFtdEFzc2V0CQAEtQAAAAIJAQAAAA9nZXRTdHJpbmdPckZhaWwAAAACBQAAAA9mYWN0b3J5Q29udHJhY3QJAQAAAA1rZXlQb29sQ29uZmlnAAAAAgkAAaQAAAABBQAAAAlpQW10QXNzZXQJAAGkAAAAAQUAAAALaVByaWNlQXNzZXQFAAAAA1NFUAEAAAAQZ2V0RmFjdG9yeUNvbmZpZwAAAAAJAAS1AAAAAgkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAIFAAAAD2ZhY3RvcnlDb250cmFjdAkBAAAAEGtleUZhY3RvcnlDb25maWcAAAAABQAAAANTRVABAAAAEWRhdGFQdXRBY3Rpb25JbmZvAAAACgAAAA1pbkFtdEFzc2V0QW10AAAAD2luUHJpY2VBc3NldEFtdAAAAAhvdXRMcEFtdAAAAAVwcmljZQAAAB1zbGlwcGFnZVRvbGVyYW5jZVBhc3NlZEJ5VXNlcgAAABVzbGlwcGFnZVRvbGVyYW5jZVJlYWwAAAAIdHhIZWlnaHQAAAALdHhUaW1lc3RhbXAAAAASc2xpcGFnZUFtdEFzc2V0QW10AAAAFHNsaXBhZ2VQcmljZUFzc2V0QW10CQAEuQAAAAIJAARMAAAAAgIAAAASJWQlZCVkJWQlZCVkJWQlZCVkCQAETAAAAAIJAAGkAAAAAQUAAAANaW5BbXRBc3NldEFtdAkABEwAAAACCQABpAAAAAEFAAAAD2luUHJpY2VBc3NldEFtdAkABEwAAAACCQABpAAAAAEFAAAACG91dExwQW10CQAETAAAAAIJAAGkAAAAAQUAAAAFcHJpY2UJAARMAAAAAgkAAaQAAAABBQAAAB1zbGlwcGFnZVRvbGVyYW5jZVBhc3NlZEJ5VXNlcgkABEwAAAACCQABpAAAAAEFAAAAFXNsaXBwYWdlVG9sZXJhbmNlUmVhbAkABEwAAAACCQABpAAAAAEFAAAACHR4SGVpZ2h0CQAETAAAAAIJAAGkAAAAAQUAAAALdHhUaW1lc3RhbXAJAARMAAAAAgkAAaQAAAABBQAAABJzbGlwYWdlQW10QXNzZXRBbXQJAARMAAAAAgkAAaQAAAABBQAAABRzbGlwYWdlUHJpY2VBc3NldEFtdAUAAAADbmlsBQAAAANTRVABAAAAEWRhdGFHZXRBY3Rpb25JbmZvAAAABgAAAA5vdXRBbXRBc3NldEFtdAAAABBvdXRQcmljZUFzc2V0QW10AAAAB2luTHBBbXQAAAAFcHJpY2UAAAAIdHhIZWlnaHQAAAALdHhUaW1lc3RhbXAJAAS5AAAAAgkABEwAAAACAgAAAAwlZCVkJWQlZCVkJWQJAARMAAAAAgkAAaQAAAABBQAAAA5vdXRBbXRBc3NldEFtdAkABEwAAAACCQABpAAAAAEFAAAAEG91dFByaWNlQXNzZXRBbXQJAARMAAAAAgkAAaQAAAABBQAAAAdpbkxwQW10CQAETAAAAAIJAAGkAAAAAQUAAAAFcHJpY2UJAARMAAAAAgkAAaQAAAABBQAAAAh0eEhlaWdodAkABEwAAAACCQABpAAAAAEFAAAAC3R4VGltZXN0YW1wBQAAAANuaWwFAAAAA1NFUAEAAAANZ2V0QWNjQmFsYW5jZQAAAAEAAAAHYXNzZXRJZAMJAAAAAAAAAgUAAAAHYXNzZXRJZAIAAAAFV0FWRVMICQAD7wAAAAEFAAAABHRoaXMAAAAJYXZhaWxhYmxlCQAD8AAAAAIFAAAABHRoaXMJAAJZAAAAAQUAAAAHYXNzZXRJZAEAAAAPY2FsY1ByaWNlQmlnSW50AAAAAgAAAAhwckFtdFgxOAAAAAhhbUFtdFgxOAkAATwAAAADBQAAAAhwckFtdFgxOAUAAAAHc2NhbGUxOAUAAAAIYW1BbXRYMTgBAAAAEHByaXZhdGVDYWxjUHJpY2UAAAAEAAAACmFtQXNzZXREY20AAAAKcHJBc3NldERjbQAAAAVhbUFtdAAAAAVwckFtdAQAAAAOYW10QXNzZXRBbXRYMTgJAQAAAAV0b1gxOAAAAAIFAAAABWFtQW10BQAAAAphbUFzc2V0RGNtBAAAABBwcmljZUFzc2V0QW10WDE4CQEAAAAFdG9YMTgAAAACBQAAAAVwckFtdAUAAAAKcHJBc3NldERjbQkBAAAAD2NhbGNQcmljZUJpZ0ludAAAAAIFAAAAEHByaWNlQXNzZXRBbXRYMTgFAAAADmFtdEFzc2V0QW10WDE4AQAAAApjYWxjUHJpY2VzAAAAAwAAAAthbXRBc3NldEFtdAAAAA1wcmljZUFzc2V0QW10AAAABWxwQW10BAAAAANjZmcJAQAAAA1nZXRQb29sQ29uZmlnAAAAAAQAAAALYW10QXNzZXREY20JAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAANjZmcFAAAADmlkeEFtdEFzc2V0RGNtBAAAAA1wcmljZUFzc2V0RGNtCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAADY2ZnBQAAABBpZHhQcmljZUFzc2V0RGNtBAAAAAlwb29sUHJpY2UJAQAAABBwcml2YXRlQ2FsY1ByaWNlAAAABAUAAAALYW10QXNzZXREY20FAAAADXByaWNlQXNzZXREY20FAAAAC2FtdEFzc2V0QW10BQAAAA1wcmljZUFzc2V0QW10BAAAAA5hbXRBc3NldEFtdFgxOAkBAAAABXRvWDE4AAAAAgUAAAALYW10QXNzZXRBbXQFAAAAC2FtdEFzc2V0RGNtBAAAABBwcmljZUFzc2V0QW10WDE4CQEAAAAFdG9YMTgAAAACBQAAAA1wcmljZUFzc2V0QW10BQAAAA1wcmljZUFzc2V0RGNtBAAAAAhscEFtdFgxOAkBAAAABXRvWDE4AAAAAgUAAAAFbHBBbXQFAAAABnNjYWxlOAQAAAARbHBQcmljZUluQW10QXNzZXQJAQAAAA9jYWxjUHJpY2VCaWdJbnQAAAACBQAAAA5hbXRBc3NldEFtdFgxOAUAAAAIbHBBbXRYMTgEAAAAE2xwUHJpY2VJblByaWNlQXNzZXQJAQAAAA9jYWxjUHJpY2VCaWdJbnQAAAACBQAAABBwcmljZUFzc2V0QW10WDE4BQAAAAhscEFtdFgxOAkABEwAAAACBQAAAAlwb29sUHJpY2UJAARMAAAAAgUAAAARbHBQcmljZUluQW10QXNzZXQJAARMAAAAAgUAAAATbHBQcmljZUluUHJpY2VBc3NldAUAAAADbmlsAQAAABRlc3RpbWF0ZUdldE9wZXJhdGlvbgAAAAQAAAAGdHhJZDU4AAAACnBtdEFzc2V0SWQAAAAIcG10THBBbXQAAAALdXNlckFkZHJlc3MEAAAAA2NmZwkBAAAADWdldFBvb2xDb25maWcAAAAABAAAAAlscEFzc2V0SWQJAAGRAAAAAgUAAAADY2ZnBQAAABBpZHhQb29sTFBBc3NldElkBAAAAAlhbUFzc2V0SWQJAAGRAAAAAgUAAAADY2ZnBQAAAA1pZHhBbXRBc3NldElkBAAAAAlwckFzc2V0SWQJAAGRAAAAAgUAAAADY2ZnBQAAAA9pZHhQcmljZUFzc2V0SWQEAAAACmFtQXNzZXREY20JAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAANjZmcFAAAADmlkeEFtdEFzc2V0RGNtBAAAAApwckFzc2V0RGNtCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAADY2ZnBQAAABBpZHhQcmljZUFzc2V0RGNtBAAAAApwb29sU3RhdHVzCQABkQAAAAIFAAAAA2NmZwUAAAANaWR4UG9vbFN0YXR1cwQAAAAKbHBFbWlzc2lvbggJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkAA+wAAAABCQACWQAAAAEFAAAACWxwQXNzZXRJZAkAASwAAAACCQABLAAAAAICAAAABkFzc2V0IAUAAAAJbHBBc3NldElkAgAAAA4gZG9lc24ndCBleGlzdAAAAAhxdWFudGl0eQMJAQAAAAIhPQAAAAIFAAAACWxwQXNzZXRJZAUAAAAKcG10QXNzZXRJZAkAAAIAAAABAgAAABVJbnZhbGlkIGFzc2V0IHBhc3NlZC4EAAAACWFtQmFsYW5jZQkBAAAADWdldEFjY0JhbGFuY2UAAAABBQAAAAlhbUFzc2V0SWQEAAAADGFtQmFsYW5jZVgxOAkBAAAABXRvWDE4AAAAAgUAAAAJYW1CYWxhbmNlBQAAAAphbUFzc2V0RGNtBAAAAAlwckJhbGFuY2UJAQAAAA1nZXRBY2NCYWxhbmNlAAAAAQUAAAAJcHJBc3NldElkBAAAAAxwckJhbGFuY2VYMTgJAQAAAAV0b1gxOAAAAAIFAAAACXByQmFsYW5jZQUAAAAKcHJBc3NldERjbQQAAAALY3VyUHJpY2VYMTgJAQAAAA9jYWxjUHJpY2VCaWdJbnQAAAACBQAAAAxwckJhbGFuY2VYMTgFAAAADGFtQmFsYW5jZVgxOAQAAAAIY3VyUHJpY2UJAQAAAAdmcm9tWDE4AAAAAgUAAAALY3VyUHJpY2VYMTgFAAAABnNjYWxlOAQAAAALcG10THBBbXRYMTgJAQAAAAV0b1gxOAAAAAIFAAAACHBtdExwQW10BQAAAAZzY2FsZTgEAAAADWxwRW1pc3Npb25YMTgJAQAAAAV0b1gxOAAAAAIFAAAACmxwRW1pc3Npb24FAAAABnNjYWxlOAQAAAALb3V0QW1BbXRYMTgJAAE8AAAAAwUAAAAMYW1CYWxhbmNlWDE4BQAAAAtwbXRMcEFtdFgxOAUAAAANbHBFbWlzc2lvblgxOAQAAAALb3V0UHJBbXRYMTgJAAE8AAAAAwUAAAAMcHJCYWxhbmNlWDE4BQAAAAtwbXRMcEFtdFgxOAUAAAANbHBFbWlzc2lvblgxOAQAAAAIb3V0QW1BbXQJAQAAAAdmcm9tWDE4AAAAAgUAAAALb3V0QW1BbXRYMTgFAAAACmFtQXNzZXREY20EAAAACG91dFByQW10CQEAAAAHZnJvbVgxOAAAAAIFAAAAC291dFByQW10WDE4BQAAAApwckFzc2V0RGNtBAAAAAVzdGF0ZQMJAAAAAAAAAgUAAAAGdHhJZDU4AgAAAAAFAAAAA25pbAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAAt1c2VyQWRkcmVzcwUAAAAIb3V0QW1BbXQDCQAAAAAAAAIFAAAACWFtQXNzZXRJZAIAAAAFV0FWRVMFAAAABHVuaXQJAAJZAAAAAQUAAAAJYW1Bc3NldElkCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAC3VzZXJBZGRyZXNzBQAAAAhvdXRQckFtdAMJAAAAAAAAAgUAAAAJcHJBc3NldElkAgAAAAVXQVZFUwUAAAAEdW5pdAkAAlkAAAABBQAAAAlwckFzc2V0SWQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEmtleUdldEFjdGlvbkJ5VXNlcgAAAAIJAAQlAAAAAQUAAAALdXNlckFkZHJlc3MFAAAABnR4SWQ1OAkBAAAAEWRhdGFHZXRBY3Rpb25JbmZvAAAABgUAAAAIb3V0QW1BbXQFAAAACG91dFByQW10BQAAAAhwbXRMcEFtdAUAAAAIY3VyUHJpY2UFAAAABmhlaWdodAgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAAxrZXlQcmljZUxhc3QAAAAABQAAAAhjdXJQcmljZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAD2tleVByaWNlSGlzdG9yeQAAAAIFAAAABmhlaWdodAgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAFAAAACGN1clByaWNlBQAAAANuaWwJAAUcAAAACgUAAAAIb3V0QW1BbXQFAAAACG91dFByQW10BQAAAAlhbUFzc2V0SWQFAAAACXByQXNzZXRJZAUAAAAJYW1CYWxhbmNlBQAAAAlwckJhbGFuY2UFAAAACmxwRW1pc3Npb24FAAAAC2N1clByaWNlWDE4BQAAAApwb29sU3RhdHVzBQAAAAVzdGF0ZQEAAAAUZXN0aW1hdGVQdXRPcGVyYXRpb24AAAAJAAAABnR4SWQ1OAAAABFzbGlwcGFnZVRvbGVyYW5jZQAAAAxpbkFtQXNzZXRBbXQAAAALaW5BbUFzc2V0SWQAAAAMaW5QckFzc2V0QW10AAAAC2luUHJBc3NldElkAAAAC3VzZXJBZGRyZXNzAAAACmlzRXZhbHVhdGUAAAAGZW1pdExwBAAAAANjZmcJAQAAAA1nZXRQb29sQ29uZmlnAAAAAAQAAAAJbHBBc3NldElkCQACWQAAAAEJAAGRAAAAAgUAAAADY2ZnBQAAABBpZHhQb29sTFBBc3NldElkBAAAAAxhbUFzc2V0SWRTdHIJAAGRAAAAAgUAAAADY2ZnBQAAAA1pZHhBbXRBc3NldElkBAAAAAxwckFzc2V0SWRTdHIJAAGRAAAAAgUAAAADY2ZnBQAAAA9pZHhQcmljZUFzc2V0SWQEAAAAC2lBbXRBc3NldElkCQABkQAAAAIFAAAAA2NmZwUAAAAOaWR4SUFtdEFzc2V0SWQEAAAADWlQcmljZUFzc2V0SWQJAAGRAAAAAgUAAAADY2ZnBQAAABBpZHhJUHJpY2VBc3NldElkBAAAAAthbXRBc3NldERjbQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAA2NmZwUAAAAOaWR4QW10QXNzZXREY20EAAAADXByaWNlQXNzZXREY20JAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAANjZmcFAAAAEGlkeFByaWNlQXNzZXREY20EAAAACnBvb2xTdGF0dXMJAAGRAAAAAgUAAAADY2ZnBQAAAA1pZHhQb29sU3RhdHVzBAAAAApscEVtaXNzaW9uCAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAD7AAAAAEFAAAACWxwQXNzZXRJZAkAASwAAAACCQABLAAAAAICAAAABkFzc2V0IAkAAlgAAAABBQAAAAlscEFzc2V0SWQCAAAADiBkb2Vzbid0IGV4aXN0AAAACHF1YW50aXR5BAAAAA5pbkFtQXNzZXRJZFN0cgkAAlgAAAABCQEAAAALdmFsdWVPckVsc2UAAAACBQAAAAtpbkFtQXNzZXRJZAkAAlkAAAABAgAAAAVXQVZFUwQAAAAOaW5QckFzc2V0SWRTdHIJAAJYAAAAAQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgUAAAALaW5QckFzc2V0SWQJAAJZAAAAAQIAAAAFV0FWRVMDAwkBAAAAAiE9AAAAAgUAAAAMYW1Bc3NldElkU3RyBQAAAA5pbkFtQXNzZXRJZFN0cgYJAQAAAAIhPQAAAAIFAAAADHByQXNzZXRJZFN0cgUAAAAOaW5QckFzc2V0SWRTdHIJAAACAAAAAQIAAAAiSW52YWxpZCBhbXQgb3IgcHJpY2UgYXNzZXQgcGFzc2VkLgQAAAAJYW1CYWxhbmNlAwUAAAAKaXNFdmFsdWF0ZQkBAAAADWdldEFjY0JhbGFuY2UAAAABBQAAAAxhbUFzc2V0SWRTdHIJAABlAAAAAgkBAAAADWdldEFjY0JhbGFuY2UAAAABBQAAAAxhbUFzc2V0SWRTdHIFAAAADGluQW1Bc3NldEFtdAQAAAAJcHJCYWxhbmNlAwUAAAAKaXNFdmFsdWF0ZQkBAAAADWdldEFjY0JhbGFuY2UAAAABBQAAAAxwckFzc2V0SWRTdHIJAABlAAAAAgkBAAAADWdldEFjY0JhbGFuY2UAAAABBQAAAAxwckFzc2V0SWRTdHIFAAAADGluUHJBc3NldEFtdAQAAAAPaW5BbUFzc2V0QW10WDE4CQEAAAAFdG9YMTgAAAACBQAAAAxpbkFtQXNzZXRBbXQFAAAAC2FtdEFzc2V0RGNtBAAAAA9pblByQXNzZXRBbXRYMTgJAQAAAAV0b1gxOAAAAAIFAAAADGluUHJBc3NldEFtdAUAAAANcHJpY2VBc3NldERjbQQAAAAMdXNlclByaWNlWDE4CQEAAAAPY2FsY1ByaWNlQmlnSW50AAAAAgUAAAAPaW5QckFzc2V0QW10WDE4BQAAAA9pbkFtQXNzZXRBbXRYMTgEAAAADGFtQmFsYW5jZVgxOAkBAAAABXRvWDE4AAAAAgUAAAAJYW1CYWxhbmNlBQAAAAthbXRBc3NldERjbQQAAAAMcHJCYWxhbmNlWDE4CQEAAAAFdG9YMTgAAAACBQAAAAlwckJhbGFuY2UFAAAADXByaWNlQXNzZXREY20EAAAAA3JlcwMJAAAAAAAAAgUAAAAKbHBFbWlzc2lvbgAAAAAAAAAAAAQAAAALY3VyUHJpY2VYMTgFAAAACnplcm9CaWdJbnQEAAAAC3NsaXBwYWdlWDE4BQAAAAp6ZXJvQmlnSW50BAAAAAhscEFtdFgxOAkAAHYAAAAGCQABOQAAAAIFAAAAD2luQW1Bc3NldEFtdFgxOAUAAAAPaW5QckFzc2V0QW10WDE4AAAAAAAAAAAACQABNgAAAAEAAAAAAAAAAAUAAAAAAAAAAAEAAAAAAAAAAAAFAAAABERPV04JAAUXAAAABQkBAAAAB2Zyb21YMTgAAAACBQAAAAhscEFtdFgxOAUAAAAGc2NhbGU4CQEAAAAHZnJvbVgxOAAAAAIFAAAAD2luQW1Bc3NldEFtdFgxOAUAAAALYW10QXNzZXREY20JAQAAAAdmcm9tWDE4AAAAAgUAAAAPaW5QckFzc2V0QW10WDE4BQAAAA1wcmljZUFzc2V0RGNtCQEAAAAPY2FsY1ByaWNlQmlnSW50AAAAAgkAATcAAAACBQAAAAxwckJhbGFuY2VYMTgFAAAAD2luUHJBc3NldEFtdFgxOAkAATcAAAACBQAAAAxhbUJhbGFuY2VYMTgFAAAAD2luQW1Bc3NldEFtdFgxOAUAAAALc2xpcHBhZ2VYMTgEAAAAC2N1clByaWNlWDE4CQEAAAAPY2FsY1ByaWNlQmlnSW50AAAAAgUAAAAMcHJCYWxhbmNlWDE4BQAAAAxhbUJhbGFuY2VYMTgEAAAAC3NsaXBwYWdlWDE4CQABPAAAAAMJAQAAAANhYnMAAAABCQABOAAAAAIFAAAAC2N1clByaWNlWDE4BQAAAAx1c2VyUHJpY2VYMTgFAAAAB3NjYWxlMTgFAAAAC2N1clByaWNlWDE4BAAAABRzbGlwcGFnZVRvbGVyYW5jZVgxOAkBAAAABXRvWDE4AAAAAgUAAAARc2xpcHBhZ2VUb2xlcmFuY2UFAAAABnNjYWxlOAMDCQEAAAACIT0AAAACBQAAAAtjdXJQcmljZVgxOAUAAAAKemVyb0JpZ0ludAkAAT8AAAACBQAAAAtzbGlwcGFnZVgxOAUAAAAUc2xpcHBhZ2VUb2xlcmFuY2VYMTgHCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAD1ByaWNlIHNsaXBwYWdlIAkAAaYAAAABBQAAAAtzbGlwcGFnZVgxOAIAAAAeIGV4Y2VlZGVkIHRoZSBwYXNzZWQgbGltaXQgb2YgCQABpgAAAAEFAAAAFHNsaXBwYWdlVG9sZXJhbmNlWDE4BAAAAA1scEVtaXNzaW9uWDE4CQEAAAAFdG9YMTgAAAACBQAAAApscEVtaXNzaW9uBQAAAAZzY2FsZTgEAAAACnByVmlhQW1YMTgJAAE8AAAAAwUAAAAPaW5BbUFzc2V0QW10WDE4BQAAAAtjdXJQcmljZVgxOAUAAAAHc2NhbGUxOAQAAAAKYW1WaWFQclgxOAkAATwAAAADBQAAAA9pblByQXNzZXRBbXRYMTgFAAAAB3NjYWxlMTgFAAAAC2N1clByaWNlWDE4BAAAAAxleHBlY3RlZEFtdHMDCQABPwAAAAIFAAAACnByVmlhQW1YMTgFAAAAD2luUHJBc3NldEFtdFgxOAkABRQAAAACBQAAAAphbVZpYVByWDE4BQAAAA9pblByQXNzZXRBbXRYMTgJAAUUAAAAAgUAAAAPaW5BbUFzc2V0QW10WDE4BQAAAApwclZpYUFtWDE4BAAAABFleHBBbXRBc3NldEFtdFgxOAgFAAAADGV4cGVjdGVkQW10cwAAAAJfMQQAAAATZXhwUHJpY2VBc3NldEFtdFgxOAgFAAAADGV4cGVjdGVkQW10cwAAAAJfMgQAAAAIbHBBbXRYMTgJAAE8AAAAAwUAAAANbHBFbWlzc2lvblgxOAUAAAATZXhwUHJpY2VBc3NldEFtdFgxOAUAAAAMcHJCYWxhbmNlWDE4CQAFFwAAAAUJAQAAAAdmcm9tWDE4AAAAAgUAAAAIbHBBbXRYMTgFAAAABnNjYWxlOAkBAAAAB2Zyb21YMTgAAAACBQAAABFleHBBbXRBc3NldEFtdFgxOAUAAAALYW10QXNzZXREY20JAQAAAAdmcm9tWDE4AAAAAgUAAAATZXhwUHJpY2VBc3NldEFtdFgxOAUAAAANcHJpY2VBc3NldERjbQUAAAALY3VyUHJpY2VYMTgFAAAAC3NsaXBwYWdlWDE4BAAAAAljYWxjTHBBbXQIBQAAAANyZXMAAAACXzEEAAAADmNhbGNBbUFzc2V0UG10CAUAAAADcmVzAAAAAl8yBAAAAA5jYWxjUHJBc3NldFBtdAgFAAAAA3JlcwAAAAJfMwQAAAAIY3VyUHJpY2UJAQAAAAdmcm9tWDE4AAAAAggFAAAAA3JlcwAAAAJfNAUAAAAGc2NhbGU4BAAAAAxzbGlwcGFnZUNhbGMJAQAAAAdmcm9tWDE4AAAAAggFAAAAA3JlcwAAAAJfNQUAAAAGc2NhbGU4AwkAAGcAAAACAAAAAAAAAAAABQAAAAljYWxjTHBBbXQJAAACAAAAAQIAAAA2SW52YWxpZCBjYWxjdWxhdGlvbnMuIExQIGNhbGN1bGF0ZWQgaXMgbGVzcyB0aGFuIHplcm8uBAAAAAllbWl0THBBbXQDCQEAAAABIQAAAAEFAAAABmVtaXRMcAAAAAAAAAAAAAUAAAAJY2FsY0xwQW10BAAAAAZhbURpZmYJAABlAAAAAgUAAAAMaW5BbUFzc2V0QW10BQAAAA5jYWxjQW1Bc3NldFBtdAQAAAAGcHJEaWZmCQAAZQAAAAIFAAAADGluUHJBc3NldEFtdAUAAAAOY2FsY1ByQXNzZXRQbXQEAAAAC2NvbW1vblN0YXRlCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAMa2V5UHJpY2VMYXN0AAAAAAUAAAAIY3VyUHJpY2UJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAA9rZXlQcmljZUhpc3RvcnkAAAACBQAAAAZoZWlnaHQIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wBQAAAAhjdXJQcmljZQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAASa2V5UHV0QWN0aW9uQnlVc2VyAAAAAgUAAAALdXNlckFkZHJlc3MFAAAABnR4SWQ1OAkBAAAAEWRhdGFQdXRBY3Rpb25JbmZvAAAACgUAAAAOY2FsY0FtQXNzZXRQbXQFAAAADmNhbGNQckFzc2V0UG10BQAAAAllbWl0THBBbXQFAAAACGN1clByaWNlBQAAABFzbGlwcGFnZVRvbGVyYW5jZQUAAAAMc2xpcHBhZ2VDYWxjBQAAAAZoZWlnaHQIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wBQAAAAZhbURpZmYFAAAABnByRGlmZgUAAAADbmlsCQAFHwAAAA0FAAAACWNhbGNMcEFtdAUAAAAJZW1pdExwQW10BQAAAAhjdXJQcmljZQUAAAAJYW1CYWxhbmNlBQAAAAlwckJhbGFuY2UFAAAACmxwRW1pc3Npb24FAAAACWxwQXNzZXRJZAUAAAAKcG9vbFN0YXR1cwUAAAALY29tbW9uU3RhdGUFAAAABmFtRGlmZgUAAAAGcHJEaWZmBQAAAAtpbkFtQXNzZXRJZAUAAAALaW5QckFzc2V0SWQBAAAAG3ZhbGlkYXRlTWF0Y2hlck9yZGVyQWxsb3dlZAAAAAEAAAAFb3JkZXIEAAAAA2NmZwkBAAAADWdldFBvb2xDb25maWcAAAAABAAAAAphbXRBc3NldElkCQABkQAAAAIFAAAAA2NmZwUAAAANaWR4QW10QXNzZXRJZAQAAAAMcHJpY2VBc3NldElkCQABkQAAAAIFAAAAA2NmZwUAAAAPaWR4UHJpY2VBc3NldElkBAAAAApwb29sU3RhdHVzCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAADY2ZnBQAAAA1pZHhQb29sU3RhdHVzBAAAAAthbXRBc3NldERjbQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAA2NmZwUAAAAOaWR4QW10QXNzZXREY20EAAAADXByaWNlQXNzZXREY20JAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAANjZmcFAAAAEGlkeFByaWNlQXNzZXREY20EAAAAEmFjY0FtdEFzc2V0QmFsYW5jZQkBAAAADWdldEFjY0JhbGFuY2UAAAABBQAAAAphbXRBc3NldElkBAAAABRhY2NQcmljZUFzc2V0QmFsYW5jZQkBAAAADWdldEFjY0JhbGFuY2UAAAABBQAAAAxwcmljZUFzc2V0SWQEAAAAC2N1clByaWNlWDE4AwkAAAAAAAACCAUAAAAFb3JkZXIAAAAJb3JkZXJUeXBlBQAAAANCdXkJAQAAABBwcml2YXRlQ2FsY1ByaWNlAAAABAUAAAALYW10QXNzZXREY20FAAAADXByaWNlQXNzZXREY20JAABkAAAAAgUAAAASYWNjQW10QXNzZXRCYWxhbmNlCAUAAAAFb3JkZXIAAAAGYW1vdW50BQAAABRhY2NQcmljZUFzc2V0QmFsYW5jZQkBAAAAEHByaXZhdGVDYWxjUHJpY2UAAAAEBQAAAAthbXRBc3NldERjbQUAAAANcHJpY2VBc3NldERjbQkAAGUAAAACBQAAABJhY2NBbXRBc3NldEJhbGFuY2UIBQAAAAVvcmRlcgAAAAZhbW91bnQFAAAAFGFjY1ByaWNlQXNzZXRCYWxhbmNlBAAAAAhjdXJQcmljZQkBAAAAB2Zyb21YMTgAAAACBQAAAAtjdXJQcmljZVgxOAUAAAAGc2NhbGU4AwMDCQEAAAAQaXNHbG9iYWxTaHV0ZG93bgAAAAAGCQAAAAAAAAIFAAAACnBvb2xTdGF0dXMFAAAAE1Bvb2xNYXRjaGVyRGlzYWJsZWQGCQAAAAAAAAIFAAAACnBvb2xTdGF0dXMFAAAADFBvb2xTaHV0ZG93bgkAAAIAAAABAgAAABxFeGNoYW5nZSBvcGVyYXRpb25zIGRpc2FibGVkBAAAAA1vcmRlckFtdEFzc2V0CAgFAAAABW9yZGVyAAAACWFzc2V0UGFpcgAAAAthbW91bnRBc3NldAQAAAAQb3JkZXJBbXRBc3NldFN0cgMJAAAAAAAAAgUAAAANb3JkZXJBbXRBc3NldAUAAAAEdW5pdAIAAAAFV0FWRVMJAAJYAAAAAQkBAAAABXZhbHVlAAAAAQUAAAANb3JkZXJBbXRBc3NldAQAAAAPb3JkZXJQcmljZUFzc2V0CAgFAAAABW9yZGVyAAAACWFzc2V0UGFpcgAAAApwcmljZUFzc2V0BAAAABJvcmRlclByaWNlQXNzZXRTdHIDCQAAAAAAAAIFAAAAD29yZGVyUHJpY2VBc3NldAUAAAAEdW5pdAIAAAAFV0FWRVMJAAJYAAAAAQkBAAAABXZhbHVlAAAAAQUAAAAPb3JkZXJQcmljZUFzc2V0AwMJAQAAAAIh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ZAgFAAAACnByQXNzZXRQbXQAAAAGYW1vdW50CAUAAAAKcHJBc3NldFBtdAAAAAdhc3NldElkCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgcFAAAABmVtaXRMcAQAAAAKcG9vbFN0YXR1cwkBAAAADXBhcnNlSW50VmFsdWUAAAABCAUAAAAGZXN0UHV0AAAAAl84AwMDCQEAAAAQaXNHbG9iYWxTaHV0ZG93bgAAAAAGCQAAAAAAAAIFAAAACnBvb2xTdGF0dXMFAAAAD1Bvb2xQdXREaXNhYmxlZAYJAAAAAAAAAgUAAAAKcG9vbFN0YXR1cwUAAAAMUG9vbFNodXRkb3duCQAAAgAAAAEJAAEsAAAAAgIAAAAsUHV0IG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IGFkbWluLiBTdGF0dXMgPSAJAAGkAAAAAQUAAAAKcG9vbFN0YXR1cwUAAAAGZXN0UHV0AAAACgAAAAFpAQAAAAtjb25zdHJ1Y3RvcgAAAAIAAAAPZmFjdG9yeUNvbnRyYWN0AAAAEG1hbmFnZXJQdWJsaWNLZXkDCQEAAAACIT0AAAACCAUAAAABaQAAAAZjYWxsZXIFAAAABHRoaXMJAAACAAAAAQIAAAAScGVybWlzc2lvbnMgZGVuaWVkCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABJrZXlGYWN0b3J5Q29udHJhY3QAAAAABQAAAA9mYWN0b3J5Q29udHJhY3QJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAE2tleU1hbmFnZXJQdWJsaWNLZXkAAAAABQAAABBtYW5hZ2VyUHVibGljS2V5BQAAAANuaWwAAAABaQEAAAADcHV0AAAAAgAAABFzbGlwcGFnZVRvbGVyYW5jZQAAAA9zaG91bGRBdXRvU3Rha2UEAAAACmZhY3RvcnlDZmcJAQAAABBnZXRGYWN0b3J5Q29uZmlnAAAAAAQAAAAPc3Rha2luZ0NvbnRyYWN0CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQmAAAAAQkAAZEAAAACBQAAAApmYWN0b3J5Q2ZnBQAAABlpZHhGYWN0b3J5U3Rha2luZ0NvbnRyYWN0AgAAACFFcnJvci4gSW5jb3JyZWN0IHN0YWtpbmcgYWRkcmVzcy4EAAAAEHNsaXBwYWdlQ29udHJhY3QJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABCQABkQAAAAIFAAAACmZhY3RvcnlDZmcFAAAAGmlkeEZhY3RvcnlTbGlwcGFnZUNvbnRyYWN0AgAAACtFcnJvci4gSW5jb3JyZWN0IHNsaXBwYWdlIGNvbnRyYWN0IGFkZHJlc3MuBAAAAAZlc3RQdXQJAQAAAAljb21tb25QdXQAAAADBQAAAAFpBQAAABFzbGlwcGFnZVRvbGVyYW5jZQYEAAAACWVtaXRMcEFtdAgFAAAABmVzdFB1dAAAAAJfMgQAAAAJbHBBc3NldElkCAUAAAAGZXN0UHV0AAAAAl83BAAAAAVzdGF0ZQgFAAAABmVzdFB1dAAAAAJfOQQAAAAGYW1EaWZmCAUAAAAGZXN0UHV0AAAAA18xMAQAAAAGcHJEaWZmCAUAAAAGZXN0UHV0AAAAA18xMQQAAAAEYW1JZAgFAAAABmVzdFB1dAAAAANfMTIEAAAABHBySWQIBQAAAAZlc3RQdXQAAAADXzEzBAAAAAdlbWl0SW52CQAD/AAAAAQFAAAAD2ZhY3RvcnlDb250cmFjdAIAAAAEZW1pdAkABEwAAAACBQAAAAllbWl0THBBbXQFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAAdlbWl0SW52BQAAAAdlbWl0SW52BAAAAAxzbGlwcGFnZUFJbnYDCQAAZgAAAAIFAAAABmFtRGlmZgAAAAAAAAAAAAkAA/wAAAAEBQAAABBzbGlwcGFnZUNvbnRyYWN0AgAAAANwdXQFAAAAA25pbAkABEwAAAACCQEAAAAPQXR0YWNoZWRQYXltZW50AAAAAgUAAAAEYW1JZAUAAAAGYW1EaWZmBQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAAMc2xpcHBhZ2VBSW52BQAAAAxzbGlwcGFnZUFJbnYEAAAADHNsaXBwYWdlUEludgMJAABmAAAAAgUAAAAGcHJEaWZmAAAAAAAAAAAACQAD/AAAAAQFAAAAEHNsaXBwYWdlQ29udHJhY3QCAAAAA3B1dAUAAAADbmlsCQAETAAAAAIJAQAAAA9BdHRhY2hlZFBheW1lbnQAAAACBQAAAARwcklkBQAAAAZwckRpZmYFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAAxzbGlwcGFnZVBJbnYFAAAADHNsaXBwYWdlUEludgQAAAAKbHBTdGFrZUludgMFAAAAD3Nob3VsZEF1dG9TdGFrZQkAA/wAAAAEBQAAAA9zdGFraW5nQ29udHJhY3QCAAAABXN0YWtlBQAAAANuaWwJAARMAAAAAgkBAAAAD0F0dGFjaGVkUGF5bWVudAAAAAIFAAAACWxwQXNzZXRJZAUAAAAJZW1pdExwQW10BQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAAKbHBTdGFrZUludgUAAAAKbHBTdGFrZUludgkABE0AAAACBQAAAAVzdGF0ZQkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAllbWl0THBBbXQFAAAACWxwQXNzZXRJZAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAKcHV0Rm9yRnJlZQAAAAAEAAAABmVzdFB1dAkBAAAACWNvbW1vblB1dAAAAAMFAAAAAWkAAAAAAAAAAAEHCAUAAAAGZXN0UHV0AAAAAl85AAAAAWkBAAAAA2dldAAAAAAEAAAAA3JlcwkBAAAACWNvbW1vbkdldAAAAAEFAAAAAWkEAAAACW91dEFtdEFtdAgFAAAAA3JlcwAAAAJfMQQAAAAIb3V0UHJBbXQIBQAAAANyZXMAAAACXzIEAAAABnBtdEFtdAgFAAAAA3JlcwAAAAJfMwQAAAAKcG10QXNzZXRJZAgFAAAAA3JlcwAAAAJfNAQAAAAFc3RhdGUIBQAAAANyZXMAAAACXzUEAAAAFGJ1cm5MUEFzc2V0T25GYWN0b3J5CQAD/AAAAAQFAAAAD2ZhY3RvcnlDb250cmFjdAIAAAAEYnVybgkABEwAAAACBQAAAAZwbXRBbXQFAAAAA25pbAkABEwAAAACCQEAAAAPQXR0YWNoZWRQYXltZW50AAAAAgUAAAAKcG10QXNzZXRJZAUAAAAGcG10QW10BQAAAANuaWwDCQAAAAAAAAIFAAAAFGJ1cm5MUEFzc2V0T25GYWN0b3J5BQAAABRidXJuTFBBc3NldE9uRmFjdG9yeQUAAAAFc3RhdGUJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAACWdldE5vTGVzcwAAAAIAAAASbm9MZXNzVGhlbkFtdEFzc2V0AAAAFG5vTGVzc1RoZW5QcmljZUFzc2V0BAAAAANyZXMJAQAAAAljb21tb25HZXQAAAABBQAAAAFpBAAAAAhvdXRBbUFtdAgFAAAAA3JlcwAAAAJfMQQAAAAIb3V0UHJBbXQIBQAAAANyZXMAAAACXzIEAAAABnBtdEFtdAgFAAAAA3JlcwAAAAJfMwQAAAAKcG10QXNzZXRJZAgFAAAAA3JlcwAAAAJfNAQAAAAFc3RhdGUIBQAAAANyZXMAAAACXzUDCQAAZgAAAAIFAAAAEm5vTGVzc1RoZW5BbXRBc3NldAUAAAAIb3V0QW1BbXQJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAcbm9MZXNzVGhlbkFtdEFzc2V0IGZhaWxlZDogIAkAAaQAAAABBQAAAAhvdXRBbUFtdAIAAAADIDwgCQABpAAAAAEFAAAAEm5vTGVzc1RoZW5BbXRBc3NldAMJAABmAAAAAgUAAAAUbm9MZXNzVGhlblByaWNlQXNzZXQFAAAACG91dFByQW10CQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAHW5vTGVzc1RoZW5QcmljZUFzc2V0IGZhaWxlZDogCQABpAAAAAEFAAAACG91dFByQW10AgAAAAMgPCAJAAGkAAAAAQUAAAAUbm9MZXNzVGhlblByaWNlQXNzZXQEAAAAFGJ1cm5MUEFzc2V0T25GYWN0b3J5CQAD/AAAAAQFAAAAD2ZhY3RvcnlDb250cmFjdAIAAAAEYnVybgkABEwAAAACBQAAAAZwbXRBbXQFAAAAA25pbAkABEwAAAACCQEAAAAPQXR0YWNoZWRQYXltZW50AAAAAgUAAAAKcG10QXNzZXRJZAUAAAAGcG10QW10BQAAAANuaWwDCQAAAAAAAAIFAAAAFGJ1cm5MUEFzc2V0T25GYWN0b3J5BQAAABRidXJuTFBBc3NldE9uRmFjdG9yeQUAAAAFc3RhdGUJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAACGFjdGl2YXRlAAAAAgAAAAthbXRBc3NldFN0cgAAAA1wcmljZUFzc2V0U3RyAwkBAAAAAiE9AAAAAgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIJAAQlAAAAAQUAAAAPZmFjdG9yeUNvbnRyYWN0CQAAAgAAAAECAAAAEnBlcm1pc3Npb25zIGRlbmllZAkABRQAAAACCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAtrZXlBbXRBc3NldAAAAAAFAAAAC2FtdEFzc2V0U3RyCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAA1rZXlQcmljZUFzc2V0AAAAAAUAAAANcHJpY2VBc3NldFN0cgUAAAADbmlsAgAAAAdzdWNjZXNzAAAAAWkBAAAADXN0YXRzUkVBRE9OTFkAAAAABAAAAANjZmcJAQAAAA1nZXRQb29sQ29uZmlnAAAAAAQAAAAJbHBBc3NldElkCQACWQAAAAEJAAGRAAAAAgUAAAADY2ZnBQAAABBpZHhQb29sTFBBc3NldElkBAAAAAphbXRBc3NldElkCQABkQAAAAIFAAAAA2NmZwUAAAANaWR4QW10QXNzZXRJZAQAAAAMcHJpY2VBc3NldElkCQABkQAAAAIFAAAAA2NmZwUAAAAPaWR4UHJpY2VBc3NldElkBAAAAAtpQW10QXNzZXRJZAkAAZEAAAACBQAAAANjZmcFAAAADmlkeElBbXRBc3NldElkBAAAAA1pUHJpY2VBc3NldElkCQABkQAAAAIFAAAAA2NmZwUAAAAQaWR4SVByaWNlQXNzZXRJZAQAAAALYW10QXNzZXREY20JAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAANjZmcFAAAADmlkeEFtdEFzc2V0RGNtBAAAAA1wcmljZUFzc2V0RGNtCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAADY2ZnBQAAABBpZHhQcmljZUFzc2V0RGNtBAAAAA1wb29sTFBCYWxhbmNlCAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAD7AAAAAEFAAAACWxwQXNzZXRJZAkAASwAAAACCQABLAAAAAICAAAABkFzc2V0IAkAAlgAAAABBQAAAAlscEFzc2V0SWQCAAAADiBkb2Vzbid0IGV4aXN0AAAACHF1YW50aXR5BAAAABJhY2NBbXRBc3NldEJhbGFuY2UJAQAAAA1nZXRBY2NCYWxhbmNlAAAAAQUAAAAKYW10QXNzZXRJZAQAAAAUYWNjUHJpY2VBc3NldEJhbGFuY2UJAQAAAA1nZXRBY2NCYWxhbmNlAAAAAQUAAAAMcHJpY2VBc3NldElkBAAAAApwcmljZXNMaXN0CQEAAAAKY2FsY1ByaWNlcwAAAAMFAAAAEmFjY0FtdEFzc2V0QmFsYW5jZQUAAAAUYWNjUHJpY2VBc3NldEJhbGFuY2UFAAAADXBvb2xMUEJhbGFuY2UEAAAACGN1clByaWNlCQABkQAAAAIFAAAACnByaWNlc0xpc3QAAAAAAAAAAAAEAAAAD2xwQW10QXNzZXRTaGFyZQkAAZEAAAACBQAAAApwcmljZXNMaXN0AAAAAAAAAAABBAAAABFscFByaWNlQXNzZXRTaGFyZQkAAZEAAAACBQAAAApwcmljZXNMaXN0AAAAAAAAAAACBAAAAApwb29sV2VpZ2h0CQEAAAAFdmFsdWUAAAABCQAEGgAAAAIFAAAAD2ZhY3RvcnlDb250cmFjdAkBAAAADWtleVBvb2xXZWlnaHQAAAABCQAEJQAAAAEFAAAABHRoaXMJAAUUAAAAAgUAAAADbmlsCQAEuQAAAAIJAARMAAAAAgIAAAAOJWQlZCVkJWQlZCVkJWQJAARMAAAAAgkAAaQAAAABBQAAABJhY2NBbXRBc3NldEJhbGFuY2UJAARMAAAAAgkAAaQAAAABBQAAABRhY2NQcmljZUFzc2V0QmFsYW5jZQkABEwAAAACCQABpAAAAAEFAAAADXBvb2xMUEJhbGFuY2UJAARMAAAAAgkAAaYAAAABBQAAAAhjdXJQcmljZQkABEwAAAACCQABpgAAAAEFAAAAD2xwQW10QXNzZXRTaGFyZQkABEwAAAACCQABpgAAAAEFAAAAEWxwUHJpY2VBc3NldFNoYXJlCQAETAAAAAIJAAGkAAAAAQUAAAAKcG9vbFdlaWdodAUAAAADbmlsBQAAAANTRVAAAAABaQEAAAAdZXZhbHVhdGVQdXRCeUFtdEFzc2V0UkVBRE9OTFkAAAADAAAAEXNsaXBwYWdlVG9sZXJhbmNlAAAADWluQW10QXNzZXRBbXQAAAALdXNlckFkZHJlc3MEAAAAA2NmZwkBAAAADWdldFBvb2xDb25maWcAAAAABAAAAAlscEFzc2V0SWQJAAJZAAAAAQkAAZEAAAACBQAAAANjZmcFAAAAEGlkeFBvb2xMUEFzc2V0SWQEAAAADGFtQXNzZXRJZFN0cgkAAZEAAAACBQAAAANjZmcFAAAADWlkeEFtdEFzc2V0SWQEAAAACWFtQXNzZXRJZAkAAlkAAAABBQAAAAxhbUFzc2V0SWRTdHIEAAAADHByQXNzZXRJZFN0cgkAAZEAAAACBQAAAANjZmcFAAAAD2lkeFByaWNlQXNzZXRJZAQAAAAJcHJBc3NldElkCQACWQAAAAEFAAAADHByQXNzZXRJZFN0cgQAAAALYW10QXNzZXREY20JAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAANjZmcFAAAADmlkeEFtdEFzc2V0RGNtBAAAAA1wcmljZUFzc2V0RGNtCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAADY2ZnBQAAABBpZHhQcmljZUFzc2V0RGNtBAAAAApwb29sU3RhdHVzCQABkQAAAAIFAAAAA2NmZwUAAAANaWR4UG9vbFN0YXR1cwQAAAANcG9vbExQQmFsYW5jZQgJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkAA+wAAAABBQAAAAlscEFzc2V0SWQJAAEsAAAAAgkAASwAAAACAgAAAAZBc3NldCAJAAJYAAAAAQUAAAAJbHBBc3NldElkAgAAAA4gZG9lc24ndCBleGlzdAAAAAhxdWFudGl0eQQAAAASYWNjQW10QXNzZXRCYWxhbmNlCQEAAAANZ2V0QWNjQmFsYW5jZQAAAAEFAAAADGFtQXNzZXRJZFN0cgQAAAAUYWNjUHJpY2VBc3NldEJhbGFuY2UJAQAAAA1nZXRBY2NCYWxhbmNlAAAAAQUAAAAMcHJBc3NldElkU3RyBAAAAA5hbXRBc3NldEFtdFgxOAkBAAAABXRvWDE4AAAAAgUAAAASYWNjQW10QXNzZXRCYWxhbmNlBQAAAAthbXRBc3NldERjbQQAAAAQcHJpY2VBc3NldEFtdFgxOAkBAAAABXRvWDE4AAAAAgUAAAAUYWNjUHJpY2VBc3NldEJhbGFuY2UFAAAADXByaWNlQXNzZXREY20EAAAAC2N1clByaWNlWDE4AwkAAAAAAAACBQAAAA1wb29sTFBCYWxhbmNlAAAAAAAAAAAABQAAAAp6ZXJvQmlnSW50CQEAAAAPY2FsY1ByaWNlQmlnSW50AAAAAgUAAAAQcHJpY2VBc3NldEFtdFgxOAUAAAAOYW10QXNzZXRBbXRYMTgEAAAAEGluQW10QXNzZXRBbXRYMTgJAQAAAAV0b1gxOAAAAAIFAAAADWluQW10QXNzZXRBbXQFAAAAC2FtdEFzc2V0RGNtBAAAABJpblByaWNlQXNzZXRBbXRYMTgJAAE8AAAAAwUAAAAQaW5BbXRBc3NldEFtdFgxOAUAAAALY3VyUHJpY2VYMTgFAAAAB3NjYWxlMTgEAAAAD2luUHJpY2VBc3NldEFtdAkBAAAAB2Zyb21YMTgAAAACBQAAABJpblByaWNlQXNzZXRBbXRYMTgFAAAADXByaWNlQXNzZXREY20EAAAABmVzdFB1dAkBAAAAFGVzdGltYXRlUHV0T3BlcmF0aW9uAAAACQIAAAAABQAAABFzbGlwcGFnZVRvbGVyYW5jZQUAAAANaW5BbXRBc3NldEFtdAUAAAAJYW1Bc3NldElkBQAAAA9pblByaWNlQXNzZXRBbXQFAAAACXByQXNzZXRJZAUAAAALdXNlckFkZHJlc3MGBwQAAAAJY2FsY0xwQW10CAUAAAAGZXN0UHV0AAAAAl8xBAAAAAxjdXJQcmljZUNhbGMIBQAAAAZlc3RQdXQAAAACXzMEAAAACWFtQmFsYW5jZQgFAAAABmVzdFB1dAAAAAJfNAQAAAAJcHJCYWxhbmNlCAUAAAAGZXN0UHV0AAAAAl81BAAAAApscEVtaXNzaW9uCAUAAAAGZXN0UHV0AAAAAl82CQAFFAAAAAIFAAAAA25pbAkABLkAAAACCQAETAAAAAICAAAADCVkJWQlZCVkJWQlZAkABEwAAAACCQABpAAAAAEFAAAACWNhbGNMcEFtdAkABEwAAAACCQABpAAAAAEJAQAAAAdmcm9tWDE4AAAAAgUAAAALY3VyUHJpY2VYMTgFAAAABnNjYWxlOAkABEwAAAACCQABpAAAAAEFAAAACWFtQmFsYW5jZQkABEwAAAACCQABpAAAAAEFAAAACXByQmFsYW5jZQkABEwAAAACCQABpAAAAAEFAAAACmxwRW1pc3Npb24JAARMAAAAAgUAAAAKcG9vbFN0YXR1cwUAAAADbmlsBQAAAANTRVAAAAABaQEAAAAfZXZhbHVhdGVQdXRCeVByaWNlQXNzZXRSRUFET05MWQAAAAMAAAARc2xpcHBhZ2VUb2xlcmFuY2UAAAAPaW5QcmljZUFzc2V0QW10AAAAC3VzZXJBZGRyZXNzBAAAAANjZmcJAQAAAA1nZXRQb29sQ29uZmlnAAAAAAQAAAAJbHBBc3NldElkCQACWQAAAAEJAAGRAAAAAgUAAAADY2ZnBQAAABBpZHhQb29sTFBBc3NldElkBAAAAAxhbUFzc2V0SWRTdHIJAAGRAAAAAgUAAAADY2ZnBQAAAA1pZHhBbXRBc3NldElkBAAAAAlhbUFzc2V0SWQJAAJZAAAAAQUAAAAMYW1Bc3NldElkU3RyBAAAAAxwckFzc2V0SWRTdHIJAAGRAAAAAgUAAAADY2ZnBQAAAA9pZHhQcmljZUFzc2V0SWQEAAAACXByQXNzZXRJZAkAAlkAAAABBQAAAAxwckFzc2V0SWRTdHIEAAAAC2FtdEFzc2V0RGNtCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAADY2ZnBQAAAA5pZHhBbXRBc3NldERjbQQAAAANcHJpY2VBc3NldERjbQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAA2NmZwUAAAAQaWR4UHJpY2VBc3NldERjbQQAAAAKcG9vbFN0YXR1cwkAAZEAAAACBQAAAANjZmcFAAAADWlkeFBvb2xTdGF0dXMEAAAADXBvb2xMUEJhbGFuY2UICQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAPsAAAAAQUAAAAJbHBBc3NldElkCQABLAAAAAIJAAEsAAAAAgIAAAAGQXNzZXQgCQACWAAAAAEFAAAACWxwQXNzZXRJZAIAAAAOIGRvZXNuJ3QgZXhpc3QAAAAIcXVhbnRpdHkEAAAAEmFjY0FtdEFzc2V0QmFsYW5jZQkBAAAADWdldEFjY0JhbGFuY2UAAAABBQAAAAxhbUFzc2V0SWRTdHIEAAAAFGFjY1ByaWNlQXNzZXRCYWxhbmNlCQEAAAANZ2V0QWNjQmFsYW5jZQAAAAEFAAAADHByQXNzZXRJZFN0cgQAAAAOYW10QXNzZXRBbXRYMTgJAQAAAAV0b1gxOAAAAAIFAAAAEmFjY0FtdEFzc2V0QmFsYW5jZQUAAAALYW10QXNzZXREY20EAAAAEHByaWNlQXNzZXRBbXRYMTgJAQAAAAV0b1gxOAAAAAIFAAAAFGFjY1ByaWNlQXNzZXRCYWxhbmNlBQAAAA1wcmljZUFzc2V0RGNtBAAAAAtjdXJQcmljZVgxOAMJAAAAAAAAAgUAAAANcG9vbExQQmFsYW5jZQAAAAAAAAAAAAUAAAAKemVyb0JpZ0ludAkBAAAAD2NhbGNQcmljZUJpZ0ludAAAAAIFAAAAEHByaWNlQXNzZXRBbXRYMTgFAAAADmFtdEFzc2V0QW10WDE4BAAAABJpblByaWNlQXNzZXRBbXRYMTgJAQAAAAV0b1gxOAAAAAIFAAAAD2luUHJpY2VBc3NldEFtdAUAAAANcHJpY2VBc3NldERjbQQAAAAQaW5BbXRBc3NldEFtdFgxOAkAATwAAAADBQAAABJpblByaWNlQXNzZXRBbXRYMTgFAAAAB3NjYWxlMTgFAAAAC2N1clByaWNlWDE4BAAAAA1pbkFtdEFzc2V0QW10CQEAAAAHZnJvbVgxOAAAAAIFAAAAEGluQW10QXNzZXRBbXRYMTgFAAAAC2FtdEFzc2V0RGNtBAAAAAZlc3RQdXQJAQAAABRlc3RpbWF0ZVB1dE9wZXJhdGlvbgAAAAkCAAAAAAUAAAARc2xpcHBhZ2VUb2xlcmFuY2UFAAAADWluQW10QXNzZXRBbXQFAAAACWFtQXNzZXRJZAUAAAAPaW5QcmljZUFzc2V0QW10BQAAAAlwckFzc2V0SWQFAAAAC3VzZXJBZGRyZXNzBgcEAAAACWNhbGNMcEFtdAgFAAAABmVzdFB1dAAAAAJfMQQAAAAMY3VyUHJpY2VDYWxjCAUAAAAGZXN0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", "chainId": 87, "height": 2806739, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: AqnEYbxSj7XwprBmSV4QTdrqNpVef56serLnh1k7izKP Next: 8BJE98Z184auHhTgWt2Tmv3PWapth466WbwtBsWTmhqo Diff:
OldNewDifferences
322322 let isOrderPriceValid = if ((order.orderType == Buy))
323323 then (curPrice >= castedOrderPrice)
324324 else (castedOrderPrice >= curPrice)
325- true
325+ if (!(isOrderPriceValid))
326+ then throw(((("Order price leads to K decrease. castedOrderPrice=" + toString(castedOrderPrice)) + " curPrice=") + toString(curPrice)))
327+ else true
326328 }
327329 }
328330 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let lPdecimals = 8
55
66 let scale8 = 100000000
77
88 let scale8BigInt = toBigInt(100000000)
99
1010 let scale18 = toBigInt(1000000000000000000)
1111
1212 let zeroBigInt = toBigInt(0)
1313
1414 let SEP = "__"
1515
1616 let EMPTY = ""
1717
1818 let PoolActive = 1
1919
2020 let PoolPutDisabled = 2
2121
2222 let PoolMatcherDisabled = 3
2323
2424 let PoolShutdown = 4
2525
2626 let idxPoolAddress = 1
2727
2828 let idxPoolStatus = 2
2929
3030 let idxPoolLPAssetId = 3
3131
3232 let idxAmtAssetId = 4
3333
3434 let idxPriceAssetId = 5
3535
3636 let idxAmtAssetDcm = 6
3737
3838 let idxPriceAssetDcm = 7
3939
4040 let idxIAmtAssetId = 8
4141
4242 let idxIPriceAssetId = 9
4343
4444 let idxLPAssetDcm = 10
4545
4646 let idxPoolAmtAssetAmt = 1
4747
4848 let idxPoolPriceAssetAmt = 2
4949
5050 let idxPoolLPAssetAmt = 3
5151
5252 let idxFactoryStakingContract = 1
5353
5454 let idxFactorySlippageContract = 7
5555
5656 func toX18 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
5757
5858
5959 func fromX18 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
6060
6161
6262 func toScale (amt,resScale,curScale) = fraction(amt, resScale, curScale)
6363
6464
6565 func abs (val) = if ((zeroBigInt > val))
6666 then -(val)
6767 else val
6868
6969
7070 func keyFactoryContract () = "%s__factoryContract"
7171
7272
7373 func keyManagerPublicKey () = "%s__managerPublicKey"
7474
7575
7676 func keyPriceLast () = "%s%s__price__last"
7777
7878
7979 func keyPriceHistory (h,timestamp) = makeString(["%s%s%d%d__price__history", toString(h), toString(timestamp)], SEP)
8080
8181
8282 func keyPutActionByUser (userAddress,txId) = ((("%s%s%s__P__" + userAddress) + "__") + txId)
8383
8484
8585 func keyGetActionByUser (userAddress,txId) = ((("%s%s%s__G__" + userAddress) + "__") + txId)
8686
8787
8888 func keyAmtAsset () = "%s__amountAsset"
8989
9090
9191 func keyPriceAsset () = "%s__priceAsset"
9292
9393
9494 func keyKHistoric (h,timestamp) = makeString(["%s%s%d%d__K_history", toString(h), toString(timestamp)], SEP)
9595
9696
9797 func keyFactoryConfig () = "%s__factoryConfig"
9898
9999
100100 func keyMappingPoolContractAddressToPoolAssets (poolContractAddress) = (("%s%s%s__" + poolContractAddress) + "__mappings__poolContract2LpAsset")
101101
102102
103103 func keyPoolConfig (iAmtAsset,iPriceAsset) = (((("%d%d%s__" + iAmtAsset) + "__") + iPriceAsset) + "__config")
104104
105105
106106 func keyMappingsBaseAsset2internalId (baseAssetStr) = ("%s%s%s__mappings__baseAsset2internalId__" + baseAssetStr)
107107
108108
109109 func keyAllPoolsShutdown () = "%s__shutdown"
110110
111111
112112 func keyPoolWeight (contractAddress) = ("%s%s__poolWeight__" + contractAddress)
113113
114114
115115 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
116116
117117
118118 func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
119119
120120
121121 let factoryContract = addressFromStringValue(getStringOrFail(this, keyFactoryContract()))
122122
123123 func isGlobalShutdown () = valueOrElse(getBoolean(factoryContract, keyAllPoolsShutdown()), false)
124124
125125
126126 func getPoolConfig () = {
127127 let amtAsset = getStringOrFail(this, keyAmtAsset())
128128 let priceAsset = getStringOrFail(this, keyPriceAsset())
129129 let iPriceAsset = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(priceAsset))
130130 let iAmtAsset = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(amtAsset))
131131 split(getStringOrFail(factoryContract, keyPoolConfig(toString(iAmtAsset), toString(iPriceAsset))), SEP)
132132 }
133133
134134
135135 func getFactoryConfig () = split(getStringOrFail(factoryContract, keyFactoryConfig()), SEP)
136136
137137
138138 func dataPutActionInfo (inAmtAssetAmt,inPriceAssetAmt,outLpAmt,price,slippageTolerancePassedByUser,slippageToleranceReal,txHeight,txTimestamp,slipageAmtAssetAmt,slipagePriceAssetAmt) = makeString(["%d%d%d%d%d%d%d%d%d", toString(inAmtAssetAmt), toString(inPriceAssetAmt), toString(outLpAmt), toString(price), toString(slippageTolerancePassedByUser), toString(slippageToleranceReal), toString(txHeight), toString(txTimestamp), toString(slipageAmtAssetAmt), toString(slipagePriceAssetAmt)], SEP)
139139
140140
141141 func dataGetActionInfo (outAmtAssetAmt,outPriceAssetAmt,inLpAmt,price,txHeight,txTimestamp) = makeString(["%d%d%d%d%d%d", toString(outAmtAssetAmt), toString(outPriceAssetAmt), toString(inLpAmt), toString(price), toString(txHeight), toString(txTimestamp)], SEP)
142142
143143
144144 func getAccBalance (assetId) = if ((assetId == "WAVES"))
145145 then wavesBalance(this).available
146146 else assetBalance(this, fromBase58String(assetId))
147147
148148
149149 func calcPriceBigInt (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
150150
151151
152152 func privateCalcPrice (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
153153 let amtAssetAmtX18 = toX18(amAmt, amAssetDcm)
154154 let priceAssetAmtX18 = toX18(prAmt, prAssetDcm)
155155 calcPriceBigInt(priceAssetAmtX18, amtAssetAmtX18)
156156 }
157157
158158
159159 func calcPrices (amtAssetAmt,priceAssetAmt,lpAmt) = {
160160 let cfg = getPoolConfig()
161161 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
162162 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
163163 let poolPrice = privateCalcPrice(amtAssetDcm, priceAssetDcm, amtAssetAmt, priceAssetAmt)
164164 let amtAssetAmtX18 = toX18(amtAssetAmt, amtAssetDcm)
165165 let priceAssetAmtX18 = toX18(priceAssetAmt, priceAssetDcm)
166166 let lpAmtX18 = toX18(lpAmt, scale8)
167167 let lpPriceInAmtAsset = calcPriceBigInt(amtAssetAmtX18, lpAmtX18)
168168 let lpPriceInPriceAsset = calcPriceBigInt(priceAssetAmtX18, lpAmtX18)
169169 [poolPrice, lpPriceInAmtAsset, lpPriceInPriceAsset]
170170 }
171171
172172
173173 func estimateGetOperation (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
174174 let cfg = getPoolConfig()
175175 let lpAssetId = cfg[idxPoolLPAssetId]
176176 let amAssetId = cfg[idxAmtAssetId]
177177 let prAssetId = cfg[idxPriceAssetId]
178178 let amAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
179179 let prAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
180180 let poolStatus = cfg[idxPoolStatus]
181181 let lpEmission = valueOrErrorMessage(assetInfo(fromBase58String(lpAssetId)), (("Asset " + lpAssetId) + " doesn't exist")).quantity
182182 if ((lpAssetId != pmtAssetId))
183183 then throw("Invalid asset passed.")
184184 else {
185185 let amBalance = getAccBalance(amAssetId)
186186 let amBalanceX18 = toX18(amBalance, amAssetDcm)
187187 let prBalance = getAccBalance(prAssetId)
188188 let prBalanceX18 = toX18(prBalance, prAssetDcm)
189189 let curPriceX18 = calcPriceBigInt(prBalanceX18, amBalanceX18)
190190 let curPrice = fromX18(curPriceX18, scale8)
191191 let pmtLpAmtX18 = toX18(pmtLpAmt, scale8)
192192 let lpEmissionX18 = toX18(lpEmission, scale8)
193193 let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissionX18)
194194 let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissionX18)
195195 let outAmAmt = fromX18(outAmAmtX18, amAssetDcm)
196196 let outPrAmt = fromX18(outPrAmtX18, prAssetDcm)
197197 let state = if ((txId58 == ""))
198198 then nil
199199 else [ScriptTransfer(userAddress, outAmAmt, if ((amAssetId == "WAVES"))
200200 then unit
201201 else fromBase58String(amAssetId)), ScriptTransfer(userAddress, outPrAmt, if ((prAssetId == "WAVES"))
202202 then unit
203203 else fromBase58String(prAssetId)), StringEntry(keyGetActionByUser(toString(userAddress), txId58), dataGetActionInfo(outAmAmt, outPrAmt, pmtLpAmt, curPrice, height, lastBlock.timestamp)), IntegerEntry(keyPriceLast(), curPrice), IntegerEntry(keyPriceHistory(height, lastBlock.timestamp), curPrice)]
204204 $Tuple10(outAmAmt, outPrAmt, amAssetId, prAssetId, amBalance, prBalance, lpEmission, curPriceX18, poolStatus, state)
205205 }
206206 }
207207
208208
209209 func estimatePutOperation (txId58,slippageTolerance,inAmAssetAmt,inAmAssetId,inPrAssetAmt,inPrAssetId,userAddress,isEvaluate,emitLp) = {
210210 let cfg = getPoolConfig()
211211 let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId])
212212 let amAssetIdStr = cfg[idxAmtAssetId]
213213 let prAssetIdStr = cfg[idxPriceAssetId]
214214 let iAmtAssetId = cfg[idxIAmtAssetId]
215215 let iPriceAssetId = cfg[idxIPriceAssetId]
216216 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
217217 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
218218 let poolStatus = cfg[idxPoolStatus]
219219 let lpEmission = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
220220 let inAmAssetIdStr = toBase58String(valueOrElse(inAmAssetId, fromBase58String("WAVES")))
221221 let inPrAssetIdStr = toBase58String(valueOrElse(inPrAssetId, fromBase58String("WAVES")))
222222 if (if ((amAssetIdStr != inAmAssetIdStr))
223223 then true
224224 else (prAssetIdStr != inPrAssetIdStr))
225225 then throw("Invalid amt or price asset passed.")
226226 else {
227227 let amBalance = if (isEvaluate)
228228 then getAccBalance(amAssetIdStr)
229229 else (getAccBalance(amAssetIdStr) - inAmAssetAmt)
230230 let prBalance = if (isEvaluate)
231231 then getAccBalance(prAssetIdStr)
232232 else (getAccBalance(prAssetIdStr) - inPrAssetAmt)
233233 let inAmAssetAmtX18 = toX18(inAmAssetAmt, amtAssetDcm)
234234 let inPrAssetAmtX18 = toX18(inPrAssetAmt, priceAssetDcm)
235235 let userPriceX18 = calcPriceBigInt(inPrAssetAmtX18, inAmAssetAmtX18)
236236 let amBalanceX18 = toX18(amBalance, amtAssetDcm)
237237 let prBalanceX18 = toX18(prBalance, priceAssetDcm)
238238 let res = if ((lpEmission == 0))
239239 then {
240240 let curPriceX18 = zeroBigInt
241241 let slippageX18 = zeroBigInt
242242 let lpAmtX18 = pow((inAmAssetAmtX18 * inPrAssetAmtX18), 0, toBigInt(5), 1, 0, DOWN)
243243 $Tuple5(fromX18(lpAmtX18, scale8), fromX18(inAmAssetAmtX18, amtAssetDcm), fromX18(inPrAssetAmtX18, priceAssetDcm), calcPriceBigInt((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
244244 }
245245 else {
246246 let curPriceX18 = calcPriceBigInt(prBalanceX18, amBalanceX18)
247247 let slippageX18 = fraction(abs((curPriceX18 - userPriceX18)), scale18, curPriceX18)
248248 let slippageToleranceX18 = toX18(slippageTolerance, scale8)
249249 if (if ((curPriceX18 != zeroBigInt))
250250 then (slippageX18 > slippageToleranceX18)
251251 else false)
252252 then throw(((("Price slippage " + toString(slippageX18)) + " exceeded the passed limit of ") + toString(slippageToleranceX18)))
253253 else {
254254 let lpEmissionX18 = toX18(lpEmission, scale8)
255255 let prViaAmX18 = fraction(inAmAssetAmtX18, curPriceX18, scale18)
256256 let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, curPriceX18)
257257 let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
258258 then $Tuple2(amViaPrX18, inPrAssetAmtX18)
259259 else $Tuple2(inAmAssetAmtX18, prViaAmX18)
260260 let expAmtAssetAmtX18 = expectedAmts._1
261261 let expPriceAssetAmtX18 = expectedAmts._2
262262 let lpAmtX18 = fraction(lpEmissionX18, expPriceAssetAmtX18, prBalanceX18)
263263 $Tuple5(fromX18(lpAmtX18, scale8), fromX18(expAmtAssetAmtX18, amtAssetDcm), fromX18(expPriceAssetAmtX18, priceAssetDcm), curPriceX18, slippageX18)
264264 }
265265 }
266266 let calcLpAmt = res._1
267267 let calcAmAssetPmt = res._2
268268 let calcPrAssetPmt = res._3
269269 let curPrice = fromX18(res._4, scale8)
270270 let slippageCalc = fromX18(res._5, scale8)
271271 if ((0 >= calcLpAmt))
272272 then throw("Invalid calculations. LP calculated is less than zero.")
273273 else {
274274 let emitLpAmt = if (!(emitLp))
275275 then 0
276276 else calcLpAmt
277277 let amDiff = (inAmAssetAmt - calcAmAssetPmt)
278278 let prDiff = (inPrAssetAmt - calcPrAssetPmt)
279279 let commonState = [IntegerEntry(keyPriceLast(), curPrice), IntegerEntry(keyPriceHistory(height, lastBlock.timestamp), curPrice), StringEntry(keyPutActionByUser(userAddress, txId58), dataPutActionInfo(calcAmAssetPmt, calcPrAssetPmt, emitLpAmt, curPrice, slippageTolerance, slippageCalc, height, lastBlock.timestamp, amDiff, prDiff))]
280280 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEmission, lpAssetId, poolStatus, commonState, amDiff, prDiff, inAmAssetId, inPrAssetId)
281281 }
282282 }
283283 }
284284
285285
286286 func validateMatcherOrderAllowed (order) = {
287287 let cfg = getPoolConfig()
288288 let amtAssetId = cfg[idxAmtAssetId]
289289 let priceAssetId = cfg[idxPriceAssetId]
290290 let poolStatus = parseIntValue(cfg[idxPoolStatus])
291291 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
292292 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
293293 let accAmtAssetBalance = getAccBalance(amtAssetId)
294294 let accPriceAssetBalance = getAccBalance(priceAssetId)
295295 let curPriceX18 = if ((order.orderType == Buy))
296296 then privateCalcPrice(amtAssetDcm, priceAssetDcm, (accAmtAssetBalance + order.amount), accPriceAssetBalance)
297297 else privateCalcPrice(amtAssetDcm, priceAssetDcm, (accAmtAssetBalance - order.amount), accPriceAssetBalance)
298298 let curPrice = fromX18(curPriceX18, scale8)
299299 if (if (if (isGlobalShutdown())
300300 then true
301301 else (poolStatus == PoolMatcherDisabled))
302302 then true
303303 else (poolStatus == PoolShutdown))
304304 then throw("Exchange operations disabled")
305305 else {
306306 let orderAmtAsset = order.assetPair.amountAsset
307307 let orderAmtAssetStr = if ((orderAmtAsset == unit))
308308 then "WAVES"
309309 else toBase58String(value(orderAmtAsset))
310310 let orderPriceAsset = order.assetPair.priceAsset
311311 let orderPriceAssetStr = if ((orderPriceAsset == unit))
312312 then "WAVES"
313313 else toBase58String(value(orderPriceAsset))
314314 if (if ((orderAmtAssetStr != amtAssetId))
315315 then true
316316 else (orderPriceAssetStr != priceAssetId))
317317 then throw("Wrong order assets.")
318318 else {
319319 let orderPrice = order.price
320320 let priceDcm = fraction(scale8, priceAssetDcm, amtAssetDcm)
321321 let castedOrderPrice = toScale(orderPrice, scale8, priceDcm)
322322 let isOrderPriceValid = if ((order.orderType == Buy))
323323 then (curPrice >= castedOrderPrice)
324324 else (castedOrderPrice >= curPrice)
325- true
325+ if (!(isOrderPriceValid))
326+ then throw(((("Order price leads to K decrease. castedOrderPrice=" + toString(castedOrderPrice)) + " curPrice=") + toString(curPrice)))
327+ else true
326328 }
327329 }
328330 }
329331
330332
331333 func commonGet (i) = if ((size(i.payments) != 1))
332334 then throw("exactly 1 payment is expected")
333335 else {
334336 let pmt = value(i.payments[0])
335337 let pmtAssetId = value(pmt.assetId)
336338 let pmtAmt = pmt.amount
337339 let res = estimateGetOperation(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
338340 let outAmAmt = res._1
339341 let outPrAmt = res._2
340342 let poolStatus = parseIntValue(res._9)
341343 let state = res._10
342344 if (if (isGlobalShutdown())
343345 then true
344346 else (poolStatus == PoolShutdown))
345347 then throw(("Get operation is blocked by admin. Status = " + toString(poolStatus)))
346348 else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state)
347349 }
348350
349351
350352 func commonPut (i,slippageTolerance,emitLp) = if ((size(i.payments) != 2))
351353 then throw("exactly 2 payments are expected")
352354 else {
353355 let amAssetPmt = value(i.payments[0])
354356 let prAssetPmt = value(i.payments[1])
355357 let estPut = estimatePutOperation(toBase58String(i.transactionId), slippageTolerance, amAssetPmt.amount, amAssetPmt.assetId, prAssetPmt.amount, prAssetPmt.assetId, toString(i.caller), false, emitLp)
356358 let poolStatus = parseIntValue(estPut._8)
357359 if (if (if (isGlobalShutdown())
358360 then true
359361 else (poolStatus == PoolPutDisabled))
360362 then true
361363 else (poolStatus == PoolShutdown))
362364 then throw(("Put operation is blocked by admin. Status = " + toString(poolStatus)))
363365 else estPut
364366 }
365367
366368
367369 @Callable(i)
368370 func constructor (factoryContract,managerPublicKey) = if ((i.caller != this))
369371 then throw("permissions denied")
370372 else [StringEntry(keyFactoryContract(), factoryContract), StringEntry(keyManagerPublicKey(), managerPublicKey)]
371373
372374
373375
374376 @Callable(i)
375377 func put (slippageTolerance,shouldAutoStake) = {
376378 let factoryCfg = getFactoryConfig()
377379 let stakingContract = valueOrErrorMessage(addressFromString(factoryCfg[idxFactoryStakingContract]), "Error. Incorrect staking address.")
378380 let slippageContract = valueOrErrorMessage(addressFromString(factoryCfg[idxFactorySlippageContract]), "Error. Incorrect slippage contract address.")
379381 let estPut = commonPut(i, slippageTolerance, true)
380382 let emitLpAmt = estPut._2
381383 let lpAssetId = estPut._7
382384 let state = estPut._9
383385 let amDiff = estPut._10
384386 let prDiff = estPut._11
385387 let amId = estPut._12
386388 let prId = estPut._13
387389 let emitInv = invoke(factoryContract, "emit", [emitLpAmt], nil)
388390 if ((emitInv == emitInv))
389391 then {
390392 let slippageAInv = if ((amDiff > 0))
391393 then invoke(slippageContract, "put", nil, [AttachedPayment(amId, amDiff)])
392394 else nil
393395 if ((slippageAInv == slippageAInv))
394396 then {
395397 let slippagePInv = if ((prDiff > 0))
396398 then invoke(slippageContract, "put", nil, [AttachedPayment(prId, prDiff)])
397399 else nil
398400 if ((slippagePInv == slippagePInv))
399401 then {
400402 let lpStakeInv = if (shouldAutoStake)
401403 then invoke(stakingContract, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
402404 else nil
403405 if ((lpStakeInv == lpStakeInv))
404406 then (state :+ ScriptTransfer(i.caller, emitLpAmt, lpAssetId))
405407 else throw("Strict value is not equal to itself.")
406408 }
407409 else throw("Strict value is not equal to itself.")
408410 }
409411 else throw("Strict value is not equal to itself.")
410412 }
411413 else throw("Strict value is not equal to itself.")
412414 }
413415
414416
415417
416418 @Callable(i)
417419 func putForFree () = {
418420 let estPut = commonPut(i, 1, false)
419421 estPut._9
420422 }
421423
422424
423425
424426 @Callable(i)
425427 func get () = {
426428 let res = commonGet(i)
427429 let outAmtAmt = res._1
428430 let outPrAmt = res._2
429431 let pmtAmt = res._3
430432 let pmtAssetId = res._4
431433 let state = res._5
432434 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
433435 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
434436 then state
435437 else throw("Strict value is not equal to itself.")
436438 }
437439
438440
439441
440442 @Callable(i)
441443 func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = {
442444 let res = commonGet(i)
443445 let outAmAmt = res._1
444446 let outPrAmt = res._2
445447 let pmtAmt = res._3
446448 let pmtAssetId = res._4
447449 let state = res._5
448450 if ((noLessThenAmtAsset > outAmAmt))
449451 then throw(((("noLessThenAmtAsset failed: " + toString(outAmAmt)) + " < ") + toString(noLessThenAmtAsset)))
450452 else if ((noLessThenPriceAsset > outPrAmt))
451453 then throw(((("noLessThenPriceAsset failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset)))
452454 else {
453455 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
454456 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
455457 then state
456458 else throw("Strict value is not equal to itself.")
457459 }
458460 }
459461
460462
461463
462464 @Callable(i)
463465 func activate (amtAssetStr,priceAssetStr) = if ((toString(i.caller) != toString(factoryContract)))
464466 then throw("permissions denied")
465467 else $Tuple2([StringEntry(keyAmtAsset(), amtAssetStr), StringEntry(keyPriceAsset(), priceAssetStr)], "success")
466468
467469
468470
469471 @Callable(i)
470472 func statsREADONLY () = {
471473 let cfg = getPoolConfig()
472474 let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId])
473475 let amtAssetId = cfg[idxAmtAssetId]
474476 let priceAssetId = cfg[idxPriceAssetId]
475477 let iAmtAssetId = cfg[idxIAmtAssetId]
476478 let iPriceAssetId = cfg[idxIPriceAssetId]
477479 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
478480 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
479481 let poolLPBalance = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
480482 let accAmtAssetBalance = getAccBalance(amtAssetId)
481483 let accPriceAssetBalance = getAccBalance(priceAssetId)
482484 let pricesList = calcPrices(accAmtAssetBalance, accPriceAssetBalance, poolLPBalance)
483485 let curPrice = pricesList[0]
484486 let lpAmtAssetShare = pricesList[1]
485487 let lpPriceAssetShare = pricesList[2]
486488 let poolWeight = value(getInteger(factoryContract, keyPoolWeight(toString(this))))
487489 $Tuple2(nil, makeString(["%d%d%d%d%d%d%d", toString(accAmtAssetBalance), toString(accPriceAssetBalance), toString(poolLPBalance), toString(curPrice), toString(lpAmtAssetShare), toString(lpPriceAssetShare), toString(poolWeight)], SEP))
488490 }
489491
490492
491493
492494 @Callable(i)
493495 func evaluatePutByAmtAssetREADONLY (slippageTolerance,inAmtAssetAmt,userAddress) = {
494496 let cfg = getPoolConfig()
495497 let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId])
496498 let amAssetIdStr = cfg[idxAmtAssetId]
497499 let amAssetId = fromBase58String(amAssetIdStr)
498500 let prAssetIdStr = cfg[idxPriceAssetId]
499501 let prAssetId = fromBase58String(prAssetIdStr)
500502 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
501503 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
502504 let poolStatus = cfg[idxPoolStatus]
503505 let poolLPBalance = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
504506 let accAmtAssetBalance = getAccBalance(amAssetIdStr)
505507 let accPriceAssetBalance = getAccBalance(prAssetIdStr)
506508 let amtAssetAmtX18 = toX18(accAmtAssetBalance, amtAssetDcm)
507509 let priceAssetAmtX18 = toX18(accPriceAssetBalance, priceAssetDcm)
508510 let curPriceX18 = if ((poolLPBalance == 0))
509511 then zeroBigInt
510512 else calcPriceBigInt(priceAssetAmtX18, amtAssetAmtX18)
511513 let inAmtAssetAmtX18 = toX18(inAmtAssetAmt, amtAssetDcm)
512514 let inPriceAssetAmtX18 = fraction(inAmtAssetAmtX18, curPriceX18, scale18)
513515 let inPriceAssetAmt = fromX18(inPriceAssetAmtX18, priceAssetDcm)
514516 let estPut = estimatePutOperation("", slippageTolerance, inAmtAssetAmt, amAssetId, inPriceAssetAmt, prAssetId, userAddress, true, false)
515517 let calcLpAmt = estPut._1
516518 let curPriceCalc = estPut._3
517519 let amBalance = estPut._4
518520 let prBalance = estPut._5
519521 let lpEmission = estPut._6
520522 $Tuple2(nil, makeString(["%d%d%d%d%d%d", toString(calcLpAmt), toString(fromX18(curPriceX18, scale8)), toString(amBalance), toString(prBalance), toString(lpEmission), poolStatus], SEP))
521523 }
522524
523525
524526
525527 @Callable(i)
526528 func evaluatePutByPriceAssetREADONLY (slippageTolerance,inPriceAssetAmt,userAddress) = {
527529 let cfg = getPoolConfig()
528530 let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId])
529531 let amAssetIdStr = cfg[idxAmtAssetId]
530532 let amAssetId = fromBase58String(amAssetIdStr)
531533 let prAssetIdStr = cfg[idxPriceAssetId]
532534 let prAssetId = fromBase58String(prAssetIdStr)
533535 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
534536 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
535537 let poolStatus = cfg[idxPoolStatus]
536538 let poolLPBalance = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
537539 let accAmtAssetBalance = getAccBalance(amAssetIdStr)
538540 let accPriceAssetBalance = getAccBalance(prAssetIdStr)
539541 let amtAssetAmtX18 = toX18(accAmtAssetBalance, amtAssetDcm)
540542 let priceAssetAmtX18 = toX18(accPriceAssetBalance, priceAssetDcm)
541543 let curPriceX18 = if ((poolLPBalance == 0))
542544 then zeroBigInt
543545 else calcPriceBigInt(priceAssetAmtX18, amtAssetAmtX18)
544546 let inPriceAssetAmtX18 = toX18(inPriceAssetAmt, priceAssetDcm)
545547 let inAmtAssetAmtX18 = fraction(inPriceAssetAmtX18, scale18, curPriceX18)
546548 let inAmtAssetAmt = fromX18(inAmtAssetAmtX18, amtAssetDcm)
547549 let estPut = estimatePutOperation("", slippageTolerance, inAmtAssetAmt, amAssetId, inPriceAssetAmt, prAssetId, userAddress, true, false)
548550 let calcLpAmt = estPut._1
549551 let curPriceCalc = estPut._3
550552 let amBalance = estPut._4
551553 let prBalance = estPut._5
552554 let lpEmission = estPut._6
553555 $Tuple2(nil, makeString(["%d%d%d%d%d%d", toString(calcLpAmt), toString(fromX18(curPriceX18, scale8)), toString(amBalance), toString(prBalance), toString(lpEmission), poolStatus], SEP))
554556 }
555557
556558
557559
558560 @Callable(i)
559561 func evaluateGetREADONLY (paymentLpAssetId,paymentLpAmt,userAddressStr) = {
560562 let res = estimateGetOperation("", paymentLpAssetId, paymentLpAmt, this)
561563 let outAmAmt = res._1
562564 let outPrAmt = res._2
563565 let amBalance = res._5
564566 let prBalance = res._6
565567 let lpEmission = res._7
566568 let curPrice = res._8
567569 let poolStatus = parseIntValue(res._9)
568570 $Tuple2(nil, makeString(["%d%d%d%d%d%d%d", toString(outAmAmt), toString(outPrAmt), toString(amBalance), toString(prBalance), toString(lpEmission), toString(curPrice), toString(poolStatus)], SEP))
569571 }
570572
571573
572574 @Verifier(tx)
573575 func verify () = match tx {
574576 case order: Order =>
575577 if (validateMatcherOrderAllowed(order))
576578 then sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
577579 else false
578580 case _ =>
579581 let managerPublic = valueOrElse(getString(this, keyManagerPublicKey()), EMPTY)
580582 if ((managerPublic == EMPTY))
581583 then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
582584 else sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(managerPublic))
583585 }
584586

github/deemru/w8io/3ef1775 
65.65 ms