tx · 4QgmdjhMxPZXE34p78bx6vtp68WYmsn4cjvEBAazfRGk

3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT:  -0.01400000 Waves

2021.12.24 13:39 [1848239] smart account 3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT > SELF 0.00000000 Waves

{ "type": 13, "id": "4QgmdjhMxPZXE34p78bx6vtp68WYmsn4cjvEBAazfRGk", "fee": 1400000, "feeAssetId": null, "timestamp": 1640342451661, "version": 1, "sender": "3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT", "senderPublicKey": "D1BL65meykxFZTCuq7jq9HSGLLnWvQamQPUNrguW5w39", "proofs": [ "5tw4BkVMXkLFfUwHtbDUCNjvXUL7Pxsysjektuk1ii6MZBKqYfZeEi1q5XdYqxAMhFX2wYudzvCA6NYsX5o3iMZw" ], "script": "base64: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ZwAAAAACAAAAESVzX19mYWN0b3J5Q29uZmlnAQAAAA1rZXlNYXRjaGVyUHViAAAAAAIAAAAYJXMlc19fbWF0Y2hlcl9fcHVibGljS2V5AQAAAA1rZXlQb29sQ29uZmlnAAAAAgAAAAlpQW10QXNzZXQAAAALaVByaWNlQXNzZXQJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAIJWQlZCVzX18FAAAACWlBbXRBc3NldAIAAAACX18FAAAAC2lQcmljZUFzc2V0AgAAAAhfX2NvbmZpZwEAAAAfa2V5TWFwcGluZ3NCYXNlQXNzZXQyaW50ZXJuYWxJZAAAAAEAAAAMYmFzZUFzc2V0U3RyCQABLAAAAAICAAAAKCVzJXMlc19fbWFwcGluZ3NfX2Jhc2VBc3NldDJpbnRlcm5hbElkX18FAAAADGJhc2VBc3NldFN0cgEAAAATa2V5QWxsUG9vbHNTaHV0ZG93bgAAAAACAAAADCVzX19zaHV0ZG93bgEAAAANa2V5UG9vbFdlaWdodAAAAAEAAAAPY29udHJhY3RBZGRyZXNzCQABLAAAAAICAAAAEiVzJXNfX3Bvb2xXZWlnaHRfXwUAAAAPY29udHJhY3RBZGRyZXNzAQAAAA90aHJvd09yZGVyRXJyb3IAAAADAAAACm9yZGVyVmFsaWQAAAALc2VuZGVyVmFsaWQAAAAMbWF0Y2hlclZhbGlkCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAACRvcmRlciB2YWxpZGF0aW9uIGZhaWxlZDogb3JkZXJWYWxpZD0JAAGlAAAAAQUAAAAKb3JkZXJWYWxpZAIAAAANIHNlbmRlclZhbGlkPQkAAaUAAAABBQAAAAtzZW5kZXJWYWxpZAIAAAAOIG1hdGNoZXJWYWxpZD0JAAGlAAAAAQUAAAAMbWF0Y2hlclZhbGlkAQAAAAhhc1N0cmluZwAAAAEAAAADdmFsBAAAAAckbWF0Y2gwBQAAAAN2YWwDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAAGdmFsU3RyBQAAAAckbWF0Y2gwBQAAAAZ2YWxTdHIJAAACAAAAAQIAAAAVZmFpbCB0byBjYXN0IGludG8gSW50AQAAAA9nZXRTdHJpbmdPckZhaWwAAAACAAAAB2FkZHJlc3MAAAADa2V5CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAHYWRkcmVzcwUAAAADa2V5CQAEuQAAAAIJAARMAAAAAgIAAAAKbWFuZGF0b3J5IAkABEwAAAACCQAEJQAAAAEFAAAAB2FkZHJlc3MJAARMAAAAAgIAAAABLgkABEwAAAACBQAAAANrZXkJAARMAAAAAgIAAAAPIGlzIG5vdCBkZWZpbmVkBQAAAANuaWwCAAAAAAEAAAAMZ2V0SW50T3JGYWlsAAAAAgAAAAdhZGRyZXNzAAAAA2tleQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAAB2FkZHJlc3MFAAAAA2tleQkABLkAAAACCQAETAAAAAICAAAACm1hbmRhdG9yeSAJAARMAAAAAgkABCUAAAABBQAAAAdhZGRyZXNzCQAETAAAAAICAAAAAS4JAARMAAAAAgUAAAADa2V5CQAETAAAAAICAAAADyBpcyBub3QgZGVmaW5lZAUAAAADbmlsAgAAAAAAAAAAD2ZhY3RvcnlDb250cmFjdAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAIFAAAABHRoaXMJAQAAAAtrZXlGYWN0Q250cgAAAAABAAAAEGlzR2xvYmFsU2h1dGRvd24AAAAACQEAAAALdmFsdWVPckVsc2UAAAACCQAEGwAAAAIFAAAAD2ZhY3RvcnlDb250cmFjdAkBAAAAE2tleUFsbFBvb2xzU2h1dGRvd24AAAAABwEAAAATZ2V0TWF0Y2hlclB1Yk9yRmFpbAAAAAAJAAJZAAAAAQkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAIFAAAAD2ZhY3RvcnlDb250cmFjdAkBAAAADWtleU1hdGNoZXJQdWIAAAAAAQAAAA1nZXRQb29sQ29uZmlnAAAAAAQAAAAFYW10QXMJAQAAAA9nZXRTdHJpbmdPckZhaWwAAAACBQAAAAR0aGlzCQEAAAALa2V5QW10QXNzZXQAAAAABAAAAAdwcmljZUFzCQEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAgUAAAAEdGhpcwkBAAAADWtleVByaWNlQXNzZXQAAAAABAAAAAhpUHJpY2VBcwkBAAAADGdldEludE9yRmFpbAAAAAIFAAAAD2ZhY3RvcnlDb250cmFjdAkBAAAAH2tleU1hcHBpbmdzQmFzZUFzc2V0MmludGVybmFsSWQAAAABBQAAAAdwcmljZUFzBAAAAAZpQW10QXMJAQAAAAxnZXRJbnRPckZhaWwAAAACBQAAAA9mYWN0b3J5Q29udHJhY3QJAQAAAB9rZXlNYXBwaW5nc0Jhc2VBc3NldDJpbnRlcm5hbElkAAAAAQUAAAAFYW10QXMJAAS1AAAAAgkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAIFAAAAD2ZhY3RvcnlDb250cmFjdAkBAAAADWtleVBvb2xDb25maWcAAAACCQABpAAAAAEFAAAABmlBbXRBcwkAAaQAAAABBQAAAAhpUHJpY2VBcwUAAAADU0VQAQAAABBnZXRGYWN0b3J5Q29uZmlnAAAAAAkABLUAAAACCQEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAgUAAAAPZmFjdG9yeUNvbnRyYWN0CQEAAAAQa2V5RmFjdG9yeUNvbmZpZwAAAAAFAAAAA1NFUAEAAAARZGF0YVB1dEFjdGlvbkluZm8AAAAKAAAADWluQW10QXNzZXRBbXQAAAAPaW5QcmljZUFzc2V0QW10AAAACG91dExwQW10AAAABXByaWNlAAAADnNsaXBwYWdlQnlVc2VyAAAADHNsaXBwYWdlUmVhbAAAAAh0eEhlaWdodAAAAAt0eFRpbWVzdGFtcAAAAAxzbGlwYWdlQW1BbXQAAAAMc2xpcGFnZVByQW10CQAEuQAAAAIJAARMAAAAAgIAAAAUJWQlZCVkJWQlZCVkJWQlZCVkJWQJAARMAAAAAgkAAaQAAAABBQAAAA1pbkFtdEFzc2V0QW10CQAETAAAAAIJAAGkAAAAAQUAAAAPaW5QcmljZUFzc2V0QW10CQAETAAAAAIJAAGkAAAAAQUAAAAIb3V0THBBbXQJAARMAAAAAgkAAaQAAAABBQAAAAVwcmljZQkABEwAAAACCQABpAAAAAEFAAAADnNsaXBwYWdlQnlVc2VyCQAETAAAAAIJAAGkAAAAAQUAAAAMc2xpcHBhZ2VSZWFsCQAETAAAAAIJAAGkAAAAAQUAAAAIdHhIZWlnaHQJAARMAAAAAgkAAaQAAAABBQAAAAt0eFRpbWVzdGFtcAkABEwAAAACCQABpAAAAAEFAAAADHNsaXBhZ2VBbUFtdAkABEwAAAACCQABpAAAAAEFAAAADHNsaXBhZ2VQckFtdAUAAAADbmlsBQAAAANTRVABAAAAEWRhdGFHZXRBY3Rpb25JbmZvAAAABgAAAA5vdXRBbXRBc3NldEFtdAAAABBvdXRQcmljZUFzc2V0QW10AAAAB2luTHBBbXQAAAAFcHJpY2UAAAAIdHhIZWlnaHQAAAALdHhUaW1lc3RhbXAJAAS5AAAAAgkABEwAAAACAgAAAAwlZCVkJWQlZCVkJWQJAARMAAAAAgkAAaQAAAABBQAAAA5vdXRBbXRBc3NldEFtdAkABEwAAAACCQABpAAAAAEFAAAAEG91dFByaWNlQXNzZXRBbXQJAARMAAAAAgkAAaQAAAABBQAAAAdpbkxwQW10CQAETAAAAAIJAAGkAAAAAQUAAAAFcHJpY2UJAARMAAAAAgkAAaQAAAABBQAAAAh0eEhlaWdodAkABEwAAAACCQABpAAAAAEFAAAAC3R4VGltZXN0YW1wBQAAAANuaWwFAAAAA1NFUAEAAAANZ2V0QWNjQmFsYW5jZQAAAAEAAAAHYXNzZXRJZAMJAAAAAAAAAgUAAAAHYXNzZXRJZAIAAAAFV0FWRVMICQAD7wAAAAEFAAAABHRoaXMAAAAJYXZhaWxhYmxlCQAD8AAAAAIFAAAABHRoaXMJAAJZAAAAAQUAAAAHYXNzZXRJZAEAAAAPY2FsY1ByaWNlQmlnSW50AAAAAgAAAAhwckFtdFgxOAAAAAhhbUFtdFgxOAkAATwAAAADBQAAAAhwckFtdFgxOAUAAAAHc2NhbGUxOAUAAAAIYW1BbXRYMTgBAAAAEHByaXZhdGVDYWxjUHJpY2UAAAAEAAAACmFtQXNzZXREY20AAAAKcHJBc3NldERjbQAAAAVhbUFtdAAAAAVwckFtdAQAAAALYW10QXNBbXRYMTgJAQAAAAV0b1gxOAAAAAIFAAAABWFtQW10BQAAAAphbUFzc2V0RGNtBAAAAApwckFzQW10WDE4CQEAAAAFdG9YMTgAAAACBQAAAAVwckFtdAUAAAAKcHJBc3NldERjbQkBAAAAD2NhbGNQcmljZUJpZ0ludAAAAAIFAAAACnByQXNBbXRYMTgFAAAAC2FtdEFzQW10WDE4AQAAAApjYWxjUHJpY2VzAAAAAwAAAAVhbUFtdAAAAAVwckFtdAAAAAVscEFtdAQAAAADY2ZnCQEAAAANZ2V0UG9vbENvbmZpZwAAAAAEAAAACGFtdEFzRGNtCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAADY2ZnBQAAAAtpZHhBbXRBc0RjbQQAAAAHcHJBc0RjbQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAA2NmZwUAAAANaWR4UHJpY2VBc0RjbQQAAAAIcHJpY2VYMTgJAQAAABBwcml2YXRlQ2FsY1ByaWNlAAAABAUAAAAIYW10QXNEY20FAAAAB3ByQXNEY20FAAAABWFtQW10BQAAAAVwckFtdAQAAAAIYW1BbXRYMTgJAQAAAAV0b1gxOAAAAAIFAAAABWFtQW10BQAAAAhhbXRBc0RjbQQAAAAIcHJBbXRYMTgJAQAAAAV0b1gxOAAAAAIFAAAABXByQW10BQAAAAdwckFzRGNtBAAAAAhscEFtdFgxOAkBAAAABXRvWDE4AAAAAgUAAAAFbHBBbXQFAAAABnNjYWxlOAQAAAANbHBQckluQW1Bc1gxOAkBAAAAD2NhbGNQcmljZUJpZ0ludAAAAAIFAAAACGFtQW10WDE4BQAAAAhscEFtdFgxOAQAAAANbHBQckluUHJBc1gxOAkBAAAAD2NhbGNQcmljZUJpZ0ludAAAAAIFAAAACHByQW10WDE4BQAAAAhscEFtdFgxOAkABEwAAAACBQAAAAhwcmljZVgxOAkABEwAAAACBQAAAA1scFBySW5BbUFzWDE4CQAETAAAAAIFAAAADWxwUHJJblByQXNYMTgFAAAAA25pbAEAAAAPY2FsY3VsYXRlUHJpY2VzAAAAAwAAAAVhbUFtdAAAAAVwckFtdAAAAAVscEFtdAQAAAAGcHJpY2VzCQEAAAAKY2FsY1ByaWNlcwAAAAMFAAAABWFtQW10BQAAAAVwckFtdAUAAAAFbHBBbXQJAARMAAAAAgkBAAAAB2Zyb21YMTgAAAACCQABkQAAAAIFAAAABnByaWNlcwAAAAAAAAAAAAUAAAAGc2NhbGU4CQAETAAAAAIJAQAAAAdmcm9tWDE4AAAAAgkAAZEAAAACBQAAAAZwcmljZXMAAAAAAAAAAAEFAAAABnNjYWxlOAkABEwAAAACCQEAAAAHZnJvbVgxOAAAAAIJAAGRAAAAAgUAAAAGcHJpY2VzAAAAAAAAAAACBQAAAAZzY2FsZTgFAAAAA25pbAEAAAAUZXN0aW1hdGVHZXRPcGVyYXRpb24AAAAEAAAABnR4SWQ1OAAAAApwbXRBc3NldElkAAAACHBtdExwQW10AAAAC3VzZXJBZGRyZXNzBAAAAANjZmcJAQAAAA1nZXRQb29sQ29uZmlnAAAAAAQAAAAEbHBJZAkAAZEAAAACBQAAAANjZmcFAAAACWlkeExQQXNJZAQAAAAEYW1JZAkAAZEAAAACBQAAAANjZmcFAAAACWlkeEFtQXNJZAQAAAAEcHJJZAkAAZEAAAACBQAAAANjZmcFAAAACWlkeFByQXNJZAQAAAAFYW1EY20JAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAANjZmcFAAAAC2lkeEFtdEFzRGNtBAAAAAVwckRjbQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAA2NmZwUAAAANaWR4UHJpY2VBc0RjbQQAAAAKcG9vbFN0YXR1cwkAAZEAAAACBQAAAANjZmcFAAAADWlkeFBvb2xTdGF0dXMEAAAACmxwRW1pc3Npb24ICQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAPsAAAAAQkAAlkAAAABBQAAAARscElkCQABLAAAAAIJAAEsAAAAAgIAAAAGQXNzZXQgBQAAAARscElkAgAAAA4gZG9lc24ndCBleGlzdAAAAAhxdWFudGl0eQMJAQAAAAIhPQAAAAIFAAAABGxwSWQFAAAACnBtdEFzc2V0SWQJAAACAAAAAQIAAAAVSW52YWxpZCBhc3NldCBwYXNzZWQuBAAAAAlhbUJhbGFuY2UJAQAAAA1nZXRBY2NCYWxhbmNlAAAAAQUAAAAEYW1JZAQAAAAMYW1CYWxhbmNlWDE4CQEAAAAFdG9YMTgAAAACBQAAAAlhbUJhbGFuY2UFAAAABWFtRGNtBAAAAAlwckJhbGFuY2UJAQAAAA1nZXRBY2NCYWxhbmNlAAAAAQUAAAAEcHJJZAQAAAAMcHJCYWxhbmNlWDE4CQEAAAAFdG9YMTgAAAACBQAAAAlwckJhbGFuY2UFAAAABXByRGNtBAAAAAtjdXJQcmljZVgxOAkBAAAAD2NhbGNQcmljZUJpZ0ludAAAAAIFAAAADHByQmFsYW5jZVgxOAUAAAAMYW1CYWxhbmNlWDE4BAAAAAhjdXJQcmljZQkBAAAAB2Zyb21YMTgAAAACBQAAAAtjdXJQcmljZVgxOAUAAAAGc2NhbGU4BAAAAAtwbXRMcEFtdFgxOAkBAAAABXRvWDE4AAAAAgUAAAAIcG10THBBbXQFAAAABnNjYWxlOAQAAAANbHBFbWlzc2lvblgxOAkBAAAABXRvWDE4AAAAAgUAAAAKbHBFbWlzc2lvbgUAAAAGc2NhbGU4BAAAAAtvdXRBbUFtdFgxOAkAATwAAAADBQAAAAxhbUJhbGFuY2VYMTgFAAAAC3BtdExwQW10WDE4BQAAAA1scEVtaXNzaW9uWDE4BAAAAAtvdXRQckFtdFgxOAkAATwAAAADBQAAAAxwckJhbGFuY2VYMTgFAAAAC3BtdExwQW10WDE4BQAAAA1scEVtaXNzaW9uWDE4BAAAAAhvdXRBbUFtdAkBAAAAB2Zyb21YMTgAAAACBQAAAAtvdXRBbUFtdFgxOAUAAAAFYW1EY20EAAAACG91dFByQW10CQEAAAAHZnJvbVgxOAAAAAIFAAAAC291dFByQW10WDE4BQAAAAVwckRjbQQAAAAFc3RhdGUDCQAAAAAAAAIFAAAABnR4SWQ1OAIAAAAABQAAAANuaWwJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAALdXNlckFkZHJlc3MFAAAACG91dEFtQW10AwkAAAAAAAACBQAAAARhbUlkAgAAAAVXQVZFUwUAAAAEdW5pdAkAAlkAAAABBQAAAARhbUlkCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAC3VzZXJBZGRyZXNzBQAAAAhvdXRQckFtdAMJAAAAAAAAAgUAAAAEcHJJZAIAAAAFV0FWRVMFAAAABHVuaXQJAAJZAAAAAQUAAAAEcHJJZAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAASa2V5R2V0QWN0aW9uQnlVc2VyAAAAAgkABCUAAAABBQAAAAt1c2VyQWRkcmVzcwUAAAAGdHhJZDU4CQEAAAARZGF0YUdldEFjdGlvbkluZm8AAAAGBQAAAAhvdXRBbUFtdAUAAAAIb3V0UHJBbXQFAAAACHBtdExwQW10BQAAAAhjdXJQcmljZQUAAAAGaGVpZ2h0CAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAADGtleVByaWNlTGFzdAAAAAAFAAAACGN1clByaWNlCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAPa2V5UHJpY2VIaXN0b3J5AAAAAgUAAAAGaGVpZ2h0CAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAUAAAAIY3VyUHJpY2UFAAAAA25pbAkABRwAAAAKBQAAAAhvdXRBbUFtdAUAAAAIb3V0UHJBbXQFAAAABGFtSWQFAAAABHBySWQFAAAACWFtQmFsYW5jZQUAAAAJcHJCYWxhbmNlBQAAAApscEVtaXNzaW9uBQAAAAtjdXJQcmljZVgxOAUAAAAKcG9vbFN0YXR1cwUAAAAFc3RhdGUBAAAAFGVzdGltYXRlUHV0T3BlcmF0aW9uAAAACQAAAAZ0eElkNTgAAAAIc2xpcHBhZ2UAAAAHaW5BbUFtdAAAAAZpbkFtSWQAAAAHaW5QckFtdAAAAAZpblBySWQAAAALdXNlckFkZHJlc3MAAAAKaXNFdmFsdWF0ZQAAAAZlbWl0THAEAAAAA2NmZwkBAAAADWdldFBvb2xDb25maWcAAAAABAAAAARscElkCQACWQAAAAEJAAGRAAAAAgUAAAADY2ZnBQAAAAlpZHhMUEFzSWQEAAAAB2FtSWRTdHIJAAGRAAAAAgUAAAADY2ZnBQAAAAlpZHhBbUFzSWQEAAAAB3BySWRTdHIJAAGRAAAAAgUAAAADY2ZnBQAAAAlpZHhQckFzSWQEAAAACWluQW1JZFN0cgkAAZEAAAACBQAAAANjZmcFAAAAC2lkeElBbXRBc0lkBAAAAAlpblBySWRTdHIJAAGRAAAAAgUAAAADY2ZnBQAAAA1pZHhJUHJpY2VBc0lkBAAAAAZhbXREY20JAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAANjZmcFAAAAC2lkeEFtdEFzRGNtBAAAAAhwcmljZURjbQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAA2NmZwUAAAANaWR4UHJpY2VBc0RjbQQAAAAKcG9vbFN0YXR1cwkAAZEAAAACBQAAAANjZmcFAAAADWlkeFBvb2xTdGF0dXMEAAAACmxwRW1pc3Npb24ICQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAPsAAAAAQUAAAAEbHBJZAIAAAAPV3JvbmcgbHAgYXNzZXQuAAAACHF1YW50aXR5BAAAAAlhbUJhbGFuY2UDBQAAAAppc0V2YWx1YXRlCQEAAAANZ2V0QWNjQmFsYW5jZQAAAAEFAAAAB2FtSWRTdHIJAABlAAAAAgkBAAAADWdldEFjY0JhbGFuY2UAAAABBQAAAAdhbUlkU3RyBQAAAAdpbkFtQW10BAAAAAlwckJhbGFuY2UDBQAAAAppc0V2YWx1YXRlCQEAAAANZ2V0QWNjQmFsYW5jZQAAAAEFAAAAB3BySWRTdHIJAABlAAAAAgkBAAAADWdldEFjY0JhbGFuY2UAAAABBQAAAAdwcklkU3RyBQAAAAdpblByQW10BAAAAA9pbkFtQXNzZXRBbXRYMTgJAQAAAAV0b1gxOAAAAAIFAAAAB2luQW1BbXQFAAAABmFtdERjbQQAAAAPaW5QckFzc2V0QW10WDE4CQEAAAAFdG9YMTgAAAACBQAAAAdpblByQW10BQAAAAhwcmljZURjbQQAAAAMdXNlclByaWNlWDE4CQEAAAAPY2FsY1ByaWNlQmlnSW50AAAAAgUAAAAPaW5QckFzc2V0QW10WDE4BQAAAA9pbkFtQXNzZXRBbXRYMTgEAAAADGFtQmFsYW5jZVgxOAkBAAAABXRvWDE4AAAAAgUAAAAJYW1CYWxhbmNlBQAAAAZhbXREY20EAAAADHByQmFsYW5jZVgxOAkBAAAABXRvWDE4AAAAAgUAAAAJcHJCYWxhbmNlBQAAAAhwcmljZURjbQQAAAADcmVzAwkAAAAAAAACBQAAAApscEVtaXNzaW9uAAAAAAAAAAAABAAAAAtjdXJQcmljZVgxOAUAAAAKemVyb0JpZ0ludAQAAAALc2xpcHBhZ2VYMTgFAAAACnplcm9CaWdJbnQEAAAACGxwQW10WDE4CQAAdgAAAAYJAAE5AAAAAgUAAAAPaW5BbUFzc2V0QW10WDE4BQAAAA9pblByQXNzZXRBbXRYMTgAAAAAAAAAAAAJAAE2AAAAAQAAAAAAAAAABQAAAAAAAAAAAQAAAAAAAAAAAAUAAAAERE9XTgkABRcAAAAFCQEAAAAHZnJvbVgxOAAAAAIFAAAACGxwQW10WDE4BQAAAAZzY2FsZTgJAQAAAAdmcm9tWDE4AAAAAgUAAAAPaW5BbUFzc2V0QW10WDE4BQAAAAZhbXREY20JAQAAAAdmcm9tWDE4AAAAAgUAAAAPaW5QckFzc2V0QW10WDE4BQAAAAhwcmljZURjbQkBAAAAD2NhbGNQcmljZUJpZ0ludAAAAAIJAAE3AAAAAgUAAAAMcHJCYWxhbmNlWDE4BQAAAA9pblByQXNzZXRBbXRYMTgJAAE3AAAAAgUAAAAMYW1CYWxhbmNlWDE4BQAAAA9pbkFtQXNzZXRBbXRYMTgFAAAAC3NsaXBwYWdlWDE4BAAAAAtjdXJQcmljZVgxOAkBAAAAD2NhbGNQcmljZUJpZ0ludAAAAAIFAAAADHByQmFsYW5jZVgxOAUAAAAMYW1CYWxhbmNlWDE4BAAAAA9zbGlwcGFnZVJlYWxYMTgJAAE8AAAAAwkBAAAAA2FicwAAAAEJAAE4AAAAAgUAAAALY3VyUHJpY2VYMTgFAAAADHVzZXJQcmljZVgxOAUAAAAHc2NhbGUxOAUAAAALY3VyUHJpY2VYMTgEAAAAC3NsaXBwYWdlWDE4CQEAAAAFdG9YMTgAAAACBQAAAAhzbGlwcGFnZQUAAAAGc2NhbGU4AwMJAQAAAAIhPQAAAAIFAAAAC2N1clByaWNlWDE4BQAAAAp6ZXJvQmlnSW50CQABPwAAAAIFAAAAD3NsaXBwYWdlUmVhbFgxOAUAAAALc2xpcHBhZ2VYMTgHCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAD1ByaWNlIHNsaXBwYWdlIAkAAaYAAAABBQAAAA9zbGlwcGFnZVJlYWxYMTgCAAAACiBleGNlZWRlZCAJAAGmAAAAAQUAAAALc2xpcHBhZ2VYMTgEAAAADWxwRW1pc3Npb25YMTgJAQAAAAV0b1gxOAAAAAIFAAAACmxwRW1pc3Npb24FAAAABnNjYWxlOAQAAAAKcHJWaWFBbVgxOAkAATwAAAADBQAAAA9pbkFtQXNzZXRBbXRYMTgFAAAAC2N1clByaWNlWDE4BQAAAAdzY2FsZTE4BAAAAAphbVZpYVByWDE4CQABPAAAAAMFAAAAD2luUHJBc3NldEFtdFgxOAUAAAAHc2NhbGUxOAUAAAALY3VyUHJpY2VYMTgEAAAADGV4cGVjdGVkQW10cwMJAAE/AAAAAgUAAAAKcHJWaWFBbVgxOAUAAAAPaW5QckFzc2V0QW10WDE4CQAFFAAAAAIFAAAACmFtVmlhUHJYMTgFAAAAD2luUHJBc3NldEFtdFgxOAkABRQAAAACBQAAAA9pbkFtQXNzZXRBbXRYMTgFAAAACnByVmlhQW1YMTgEAAAAEWV4cEFtdEFzc2V0QW10WDE4CAUAAAAMZXhwZWN0ZWRBbXRzAAAAAl8xBAAAABNleHBQcmljZUFzc2V0QW10WDE4CAUAAAAMZXhwZWN0ZWRBbXRzAAAAAl8yBAAAAAhscEFtdFgxOAkAATwAAAADBQAAAA1scEVtaXNzaW9uWDE4BQAAABNleHBQcmljZUFzc2V0QW10WDE4BQAAAAxwckJhbGFuY2VYMTgJAAUXAAAABQkBAAAAB2Zyb21YMTgAAAACBQAAAAhscEFtdFgxOAUAAAAGc2NhbGU4CQEAAAAHZnJvbVgxOAAAAAIFAAAAEWV4cEFtdEFzc2V0QW10WDE4BQAAAAZhbXREY20JAQAAAAdmcm9tWDE4AAAAAgUAAAATZXhwUHJpY2VBc3NldEFtdFgxOAUAAAAIcHJpY2VEY20FAAAAC2N1clByaWNlWDE4BQAAAAtzbGlwcGFnZVgxOAQAAAAJY2FsY0xwQW10CAUAAAADcmVzAAAAAl8xBAAAAA5jYWxjQW1Bc3NldFBtdAgFAAAAA3JlcwAAAAJfMgQAAAAOY2FsY1ByQXNzZXRQbXQIBQAAAANyZXMAAAACXzMEAAAACGN1clByaWNlCQEAAAAHZnJvbVgxOAAAAAIIBQAAAANyZXMAAAACXzQFAAAABnNjYWxlOAQAAAAMc2xpcHBhZ2VDYWxjCQEAAAAHZnJvbVgxOAAAAAIIBQAAAANyZXMAAAACXzUFAAAABnNjYWxlOAMJAABnAAAAAgAAAAAAAAAAAAUAAAAJY2FsY0xwQW10CQAAAgAAAAECAAAAFUxQIGlzIGxlc3MgdGhhbiB6ZXJvLgQAAAAJZW1pdExwQW10AwkBAAAAASEAAAABBQAAAAZlbWl0THAAAAAAAAAAAAAFAAAACWNhbGNMcEFtdAQAAAAGYW1EaWZmCQAAZQAAAAIFAAAAB2luQW1BbXQFAAAADmNhbGNBbUFzc2V0UG10BAAAAAZwckRpZmYJAABlAAAAAgUAAAAHaW5QckFtdAUAAAAOY2FsY1ByQXNzZXRQbXQEAAAAC2NvbW1vblN0YXRlCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAMa2V5UHJpY2VMYXN0AAAAAAUAAAAIY3VyUHJpY2UJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAA9rZXlQcmljZUhpc3RvcnkAAAACBQAAAAZoZWlnaHQIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wBQAAAAhjdXJQcmljZQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAASa2V5UHV0QWN0aW9uQnlVc2VyAAAAAgUAAAALdXNlckFkZHJlc3MFAAAABnR4SWQ1OAkBAAAAEWRhdGFQdXRBY3Rpb25JbmZvAAAACgUAAAAOY2FsY0FtQXNzZXRQbXQFAAAADmNhbGNQckFzc2V0UG10BQAAAAllbWl0THBBbXQFAAAACGN1clByaWNlBQAAAAhzbGlwcGFnZQUAAAAMc2xpcHBhZ2VDYWxjBQAAAAZoZWlnaHQIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wBQAAAAZhbURpZmYFAAAABnByRGlmZgUAAAADbmlsCQAFHwAAAA0FAAAACWNhbGNMcEFtdAUAAAAJZW1pdExwQW10BQAAAAhjdXJQcmljZQUAAAAJYW1CYWxhbmNlBQAAAAlwckJhbGFuY2UFAAAACmxwRW1pc3Npb24FAAAABGxwSWQFAAAACnBvb2xTdGF0dXMFAAAAC2NvbW1vblN0YXRlBQAAAAZhbURpZmYFAAAABnByRGlmZgUAAAAGaW5BbUlkBQAAAAZpblBySWQBAAAAG3ZhbGlkYXRlTWF0Y2hlck9yZGVyQWxsb3dlZAAAAAEAAAAFb3JkZXIEAAAAA2NmZwkBAAAADWdldFBvb2xDb25maWcAAAAABAAAAAphbXRBc3NldElkCQABkQAAAAIFAAAAA2NmZwUAAAAJaWR4QW1Bc0lkBAAAAAxwcmljZUFzc2V0SWQJAAGRAAAAAgUAAAADY2ZnBQAAAAlpZHhQckFzSWQEAAAACnBvb2xTdGF0dXMJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAANjZmcFAAAADWlkeFBvb2xTdGF0dXMEAAAAC2FtdEFzc2V0RGNtCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAADY2ZnBQAAAAtpZHhBbXRBc0RjbQQAAAANcHJpY2VBc3NldERjbQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAA2NmZwUAAAANaWR4UHJpY2VBc0RjbQQAAAASYWNjQW10QXNzZXRCYWxhbmNlCQEAAAANZ2V0QWNjQmFsYW5jZQAAAAEFAAAACmFtdEFzc2V0SWQEAAAAFGFjY1ByaWNlQXNzZXRCYWxhbmNlCQEAAAANZ2V0QWNjQmFsYW5jZQAAAAEFAAAADHByaWNlQXNzZXRJZAQAAAALY3VyUHJpY2VYMTgDCQAAAAAAAAIIBQAAAAVvcmRlcgAAAAlvcmRlclR5cGUFAAAAA0J1eQkBAAAAEHByaXZhdGVDYWxjUHJpY2UAAAAEBQAAAAthbXRBc3NldERjbQUAAAANcHJpY2VBc3NldERjbQkAAGQAAAACBQAAABJhY2NBbXRBc3NldEJhbGFuY2UIBQAAAAVvcmRlcgAAAAZhbW91bnQFAAAAFGFjY1ByaWNlQXNzZXRCYWxhbmNlCQEAAAAQcHJpdmF0ZUNhbGNQcmljZQAAAAQFAAAAC2FtdEFzc2V0RGNtBQAAAA1wcmljZUFzc2V0RGNtCQAAZQAAAAIFAAAAEmFjY0FtdEFzc2V0QmFsYW5jZQgFAAAABW9yZGVyAAAABmFtb3VudAUAAAAUYWNjUHJpY2VBc3NldEJhbGFuY2UEAAAACGN1clByaWNlCQEAAAAHZnJvbVgxOAAAAAIFAAAAC2N1clByaWNlWDE4BQAAAAZzY2FsZTgDAwMJAQAAABBpc0dsb2JhbFNodXRkb3duAAAAAAYJAAAAAAAAAgUAAAAKcG9vbFN0YXR1cwUAAAATUG9vbE1hdGNoZXJEaXNhYmxlZAYJAAAAAAAAAgUAAAAKcG9vbFN0YXR1cwUAAAAMUG9vbFNodXRkb3duCQAAAgAAAAECAAAAHEV4Y2hhbmdlIG9wZXJhdGlvbnMgZGlzYWJsZWQEAAAADW9yZGVyQW10QXNzZXQICAUAAAAFb3JkZXIAAAAJYXNzZXRQYWlyAAAAC2Ftb3VudEFzc2V0BAAAABBvcmRlckFtdEFzc2V0U3RyAwkAAAAAAAACBQAAAA1vcmRlckFtdEFzc2V0BQAAAAR1bml0AgAAAAVXQVZFUwkAAlgAAAABCQEAAAAFdmFsdWUAAAABBQAAAA1vcmRlckFtdEFzc2V0BAAAAA9vcmRlclByaWNlQXNzZXQICAUAAAAFb3JkZXIAAAAJYXNzZXRQYWlyAAAACnByaWNlQXNzZXQEAAAAEm9yZGVyUHJpY2VBc3NldFN0cgMJAAAAAAAAAgUAAAAPb3JkZXJQcmljZUFzc2V0BQAAAAR1bml0AgAAAAVXQVZFUwkAAlgAAAABCQEAAAAFdmFsdWUAAAABBQAAAA9vcmRlclByaWNlQXNzZXQDAwkBAAAAAiE9AAAAAgUAAAAQb3JkZXJBbXRBc3NldFN0cgUAAAAKYW10QXNzZXRJZAYJAQAAAAIhPQAAAAIFAAAAEm9yZGVyUHJpY2VBc3NldFN0cgUAAAAMcHJpY2VBc3NldElkCQAAAgAAAAECAAAAE1dyb25nIG9yZGVyIGFzc2V0cy4EAAAACm9yZGVyUHJpY2UIBQAAAAVvcmRlcgAAAAVwcmljZQQAAAAIcHJpY2VEY20JAABrAAAAAwUAAAAGc2NhbGU4BQAAAA1wcmljZUFzc2V0RGNtBQAAAAthbXRBc3NldERjbQQAAAAQY2FzdGVkT3JkZXJQcmljZQkBAAAAB3RvU2NhbGUAAAADBQAAAApvcmRlclByaWNlBQAAAAZzY2FsZTgFAAAACHByaWNlRGNtBAAAABFpc09yZGVyUHJpY2VWYWxpZAMJAAAAAAAAAggFAAAABW9yZGVyAAAACW9yZGVyVHlwZQUAAAADQnV5CQAAZwAAAAIFAAAACGN1clByaWNlBQAAABBjYXN0ZWRPcmRlclByaWNlCQAAZwAAAAIFAAAAEGNhc3RlZE9yZGVyUHJpY2UFAAAACGN1clByaWNlBgEAAAAJY29tbW9uR2V0AAAAAQAAAAFpAwkBAAAAAiE9AAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQkAAAIAAAABAgAAAB1leGFjdGx5IDEgcGF5bWVudCBpcyBleHBlY3RlZAQAAAADcG10CQEAAAAFdmFsdWUAAAABCQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAABAAAAApwbXRBc3NldElkCQEAAAAFdmFsdWUAAAABCAUAAAADcG10AAAAB2Fzc2V0SWQEAAAABnBtdEFtdAgFAAAAA3BtdAAAAAZhbW91bnQEAAAAA3JlcwkBAAAAFGVzdGltYXRlR2V0T3BlcmF0aW9uAAAABAkAAlgAAAABCAUAAAABaQAAAA10cmFuc2FjdGlvbklkCQACWAAAAAEFAAAACnBtdEFzc2V0SWQFAAAABnBtdEFtdAgFAAAAAWkAAAAGY2FsbGVyBAAAAAhvdXRBbUFtdAgFAAAAA3JlcwAAAAJfMQQAAAAIb3V0UHJBbXQIBQAAAANyZXMAAAACXzIEAAAACnBvb2xTdGF0dXMJAQAAAA1wYXJzZUludFZhbHVlAAAAAQgFAAAAA3JlcwAAAAJfOQQAAAAFc3RhdGUIBQAAAANyZXMAAAADXzEwAwMJAQAAABBpc0dsb2JhbFNodXRkb3duAAAAAAYJAAAAAAAAAgUAAAAKcG9vbFN0YXR1cwUAAAAMUG9vbFNodXRkb3duCQAAAgAAAAEJAAEsAAAAAgIAAAAsR2V0IG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IGFkbWluLiBTdGF0dXMgPSAJAAGkAAAAAQUAAAAKcG9vbFN0YXR1cwkABRcAAAAFBQAAAAhvdXRBbUFtdAUAAAAIb3V0UHJBbXQFAAAABnBtdEFtdAUAAAAKcG10QXNzZXRJZAUAAAAFc3RhdGUBAAAACWNvbW1vblB1dAAAAAYAAAAGY2FsbGVyAAAABHR4SWQAAAAHYW1Bc1BtdAAAAAdwckFzUG10AAAACHNsaXBwYWdlAAAABmVtaXRMcAQAAAAGZXN0UHV0CQEAAAAUZXN0aW1hdGVQdXRPcGVyYXRpb24AAAAJBQAAAAR0eElkBQAAAAhzbGlwcGFnZQgJAQAAAAV2YWx1ZQAAAAEFAAAAB2FtQXNQbXQAAAAGYW1vdW50CAkBAAAABXZhbHVlAAAAAQUAAAAHYW1Bc1BtdAAAAAdhc3NldElkCAkBAAAABXZhbHVlAAAAAQUAAAAHcHJBc1BtdAAAAAZhbW91bnQICQEAAAAFdmFsdWUAAAABBQAAAAdwckFzUG10AAAAB2Fzc2V0SWQFAAAABmNhbGxlcgcFAAAABmVtaXRMcAQAAAAGc3RhdHVzCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEIBQAAAAZlc3RQdXQAAAACXzgDAwMJAQAAABBpc0dsb2JhbFNodXRkb3duAAAAAAYJAAAAAAAAAgUAAAAGc3RhdHVzBQAAAA9Qb29sUHV0RGlzYWJsZWQGCQAAAAAAAAIFAAAABnN0YXR1cwUAAAAMUG9vbFNodXRkb3duCQAAAgAAAAEJAAEsAAAAAgIAAAAsUHV0IG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IGFkbWluLiBTdGF0dXMgPSAJAAGkAAAAAQUAAAAGc3RhdHVzBQAAAAZlc3RQdXQAAAARAAAAAWkBAAAAC2NvbnN0cnVjdG9yAAAAAgAAAA9mYWN0b3J5Q29udHJhY3QAAAAQbWFuYWdlclB1YmxpY0tleQMJAQAAAAIhPQAAAAIIBQAAAAFpAAAABmNhbGxlcgUAAAAEdGhpcwkAAAIAAAABAgAAABJwZXJtaXNzaW9ucyBkZW5pZWQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAC2tleUZhY3RDbnRyAAAAAAUAAAAPZmFjdG9yeUNvbnRyYWN0CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABNrZXlNYW5hZ2VyUHVibGljS2V5AAAAAAUAAAAQbWFuYWdlclB1YmxpY0tleQUAAAADbmlsAAAAAWkBAAAAA3B1dAAAAAIAAAAEc2xpcAAAAAlhdXRvU3Rha2UEAAAAB2ZhY3RDZmcJAQAAABBnZXRGYWN0b3J5Q29uZmlnAAAAAAQAAAALc3Rha2luZ0NudHIJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABCQABkQAAAAIFAAAAB2ZhY3RDZmcFAAAAD2lkeEZhY3RTdGFrQ250cgIAAAAaSW5jb3JyZWN0IHN0YWtpbmcgYWRkcmVzcy4EAAAACHNsaXBDbnRyCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAA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AA10cmFuc2FjdGlvbklkBAAAAApwbXRBc3NldElkCQEAAAAFdmFsdWUAAAABCAUAAAADcG10AAAAB2Fzc2V0SWQEAAAABnBtdEFtdAgFAAAAA3BtdAAAAAZhbW91bnQDCQEAAAACIT0AAAACBQAAAARscElkCQACWAAAAAEFAAAACnBtdEFzc2V0SWQJAAACAAAAAQIAAAAVSW52YWxpZCBhc3NldCBwYXNzZWQuBAAAAA5hbUFzc2V0U3dhcFgxOAkBAAAABXRvWDE4AAAAAgUAAAALYW1Bc3NldFN3YXAFAAAABWFtRGNtBAAAAA5wckFzc2V0U3dhcFgxOAkBAAAABXRvWDE4AAAAAgUAAAALcHJBc3NldFN3YXAFAAAABXByRGNtBAAAAAxzd2FwUHJpY2VYMTgJAQAAAA9jYWxjUHJpY2VCaWdJbnQAAAACBQAAAA5wckFzc2V0U3dhcFgxOAUAAAAOYW1Bc3NldFN3YXBYMTgEAAAAAXIJAQAAABRlc3RpbWF0ZUdldE9wZXJhdGlvbgAAAAQJAAJYAAAAAQgFAAAAAWkAAAANdHJhbnNhY3Rpb25JZAkAAlgAAAABBQAAAApwbXRBc3NldElkBQAAAAZwbXRBbXQIBQAAAAFpAAAABmNhbGxlcgQAAAAIb3V0QW1BbXQIBQAAAAFyAAAAAl8xBAAAAAhvdXRQckFtdAgFAAAAAXIAAAACXzIEAAAABnRvdGFsUgMJAAAAAAAAAgUAAAAKb3V0QXNzZXRJZAUAAAAEYW1JZAQAAAAIYW10QXNSZXMJAQAAAAdmcm9tWDE4AAAAAgkAATwAAAADCQEAAAAFdG9YMTgAAAACBQAAAAhvdXRQckFtdAUAAAAFcHJEY20FAAAAB3NjYWxlMTgFAAAADHN3YXBQcmljZVgxOAUAAAAFYW1EY20JAABkAAAAAgUAAAAIYW10QXNSZXMFAAAACG91dEFtQW10BAAAABZhbVN3b3BQYXJ0SW5QcmljZUFzc2V0CQAAZQAAAAIFAAAADnJlc3VsdFByQW1vdW50BQAAAAhvdXRQckFtdAQAAAAHY29udlJlcwkAATwAAAADCQEAAAAFdG9YMTgAAAACBQAAABZhbVN3b3BQYXJ0SW5QcmljZUFzc2V0BQAAAAVhbURjbQUAAAAHc2NhbGUxOAUAAAAMc3dhcFByaWNlWDE4BAAAAAdwckFzUmVzCQEAAAAHZnJvbVgxOAAAAAIJAAE8AAAAAwkBAAAABXRvWDE4AAAAAgUAAAAIb3V0QW1BbXQFAAAABWFtRGNtBQAAAAxzd2FwUHJpY2VYMTgFAAAAB3NjYWxlMTgFAAAABXByRGNtBAAAAAthbUFzc2V0RGlmZgkAATwAAAADCQABOAAAAAIFAAAAB2NvbnZSZXMFAAAADmFtQXNzZXRTd2FwWDE4BQAAAAxzY2FsZThCaWdJbnQFAAAADmFtQXNzZXRTd2FwWDE4CQAAZAAAAAIFAAAAB3ByQXNSZXMFAAAACG91dFByQW10BAAAAAlhbUJhbGFuY2UJAQAAAA1nZXRBY2NCYWxhbmNlAAAAAQUAAAAEYW1JZAQAAAAMYW1CYWxhbmNlWDE4CQEAAAAFdG9YMTgAAAACBQAAAAlhbUJhbGFuY2UFAAAABWFtRGNtBAAAAAlwckJhbGFuY2UJAQAAAA1nZXRBY2NCYWxhbmNlAAAAAQUAAAAEcHJJZAQAAAAMcHJCYWxhbmNlWDE4CQEAAAAFdG9YMTgAAAACBQAAAAlwckJhbGFuY2UFAAAABXByRGNtBAAAAAtjdXJQcmljZVgxOAkBAAAAD2NhbGNQcmljZUJpZ0ludAAAAAIFAAAADHByQmFsYW5jZVgxOAUAAAAMYW1CYWxhbmNlWDE4BAAAAAhjdXJQcmljZQkBAAAAB2Zyb21YMTgAAAACBQAAAAtjdXJQcmljZVgxOAUAAAAGc2NhbGU4BAAAAAVzdGF0ZQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAAt1c2VyQWRkcmVzcwUAAAAGdG90YWxSAwkAAAAAAAACBQAAAA1yZXN1bHRBc3NldElkAgAAAAVXQVZFUwUAAAAEdW5pdAkAAlkAAAABBQAAAA1yZXN1bHRBc3NldElkCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABJrZXlHZXRBY3Rpb25CeVVzZXIAAAACCQAEJQAAAAEFAAAAC3VzZXJBZGRyZXNzBQAAAAZ0eElkNTgJAQAAABFkYXRhR2V0QWN0aW9uSW5mbwAAAAYFAAAAD3Jlc3VsdEFtdEFtb3VudAUAAAAOcmVzdWx0UHJBbW91bnQFAAAABnBtdEFtdAUAAAAIY3VyUHJpY2UFAAAABmhlaWdodAgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAAxrZXlQcmljZUxhc3QAAAAABQAAAAhjdXJQcmljZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAD2tleVByaWNlSGlzdG9yeQAAAAIFAAAABmhlaWdodAgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAFAAAACGN1clByaWNlBQAAAANuaWwEAAAABGJ1cm4JAAP8AAAABAUAAAAPZmFjdG9yeUNvbnRyYWN0AgAAAARidXJuCQAETAAAAAIFAAAABnBtdEFtdAUAAAADbmlsCQAETAAAAAIJAQAAAA9BdHRhY2hlZFBheW1lbnQAAAACBQAAAApwbXRBc3NldElkBQAAAAZwbXRBbXQFAAAAA25pbAMJAAAAAAAAAgUAAAAEYnVybgUAAAAEYnVybgUAAAAFc3RhdGUJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAACWdldE5vTGVzcwAAAAIAAAASbm9MZXNzVGhlbkFtdEFzc2V0AAAAFG5vTGVzc1RoZW5QcmljZUFzc2V0BAAAAANyZXMJAQAAAAljb21tb25HZXQAAAABBQAAAAFpBAAAAAhvdXRBbUFtdAgFAAAAA3JlcwAAAAJfMQQAAAAIb3V0UHJBbXQIBQAAAANyZXMAAAACXzIEAAAABnBtdEFtdAgFAAAAA3JlcwAAAAJfMwQAAAAKcG10QXNzZXRJZAgFAAAAA3JlcwAAAAJfNAQAAAAFc3RhdGUIBQAAAANyZXMAAAACXzUDCQAAZgAAAAIFAAAAEm5vTGVzc1RoZW5BbXRBc3NldAUAAAAIb3V0QW1BbXQJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAcbm9MZXNzVGhlbkFtdEFzc2V0IGZhaWxlZDogIAkAAaQAAAABBQAAAAhvdXRBbUFtdAIAAAADIDwgCQABpAAAAAEFAAAAEm5vTGVzc1RoZW5BbXRBc3NldAMJAABmAAAAAgUAAAAUbm9MZXNzVGhlblByaWNlQXNzZXQFAAAACG91dFByQW10CQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAHW5vTGVzc1RoZW5QcmljZUFzc2V0IGZhaWxlZDogCQABpAAAAAEFAAAACG91dFByQW10AgAAAAMgPCAJAAGkAAAAAQUAAAAUbm9MZXNzVGhlblByaWNlQXNzZXQEAAAAFGJ1cm5MUEFzc2V0T25GYWN0b3J5CQAD/AAAAAQFAAAAD2ZhY3RvcnlDb250cmFjdAIAAAAEYnVybgkABEwAAAACBQAAAAZwbXRBbXQFAAAAA25pbAkABEwAAAACCQEAAAAPQXR0YWNoZWRQYXltZW50AAAAAgUAAAAKcG10QXNzZXRJZAUAAAAGcG10QW10BQAAAANuaWwDCQAAAAAAAAIFAAAAFGJ1cm5MUEFzc2V0T25GYWN0b3J5BQAAABRidXJuTFBBc3NldE9uRmFjdG9yeQUAAAAFc3RhdGUJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAADXVuc3Rha2VBbmRHZXQAAAABAAAABmFtb3VudAQAAAANY2hlY2tQYXltZW50cwMJAQAAAAIhPQAAAAIJAAGQAAAAAQgFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAJAAACAAAAAQIAAAAYTm8gcGF5bWVudHMgYXJlIGV4cGVjdGVkBgMJAAAAAAAAAgUAAAANY2hlY2tQYXltZW50cwUAAAANY2hlY2tQYXltZW50cwQAAAADY2ZnCQEAAAANZ2V0UG9vbENvbmZpZwAAAAAEAAAACmZhY3RvcnlDZmcJAQAAABBnZXRGYWN0b3J5Q29uZmlnAAAAAAQAAAAJbHBBc3NldElkCQACWQAAAAEJAAGRAAAAAgUAAAADY2ZnBQAAAAlpZHhMUEFzSWQEAAAAD3N0YWtpbmdDb250cmFjdAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEJgAAAAEJAAGRAAAAAgUAAAAKZmFjdG9yeUNmZwUAAAAPaWR4RmFjdFN0YWtDbnRyAgAAACFFcnJvci4gSW5jb3JyZWN0IHN0YWtpbmcgYWRkcmVzcy4EAAAACnVuc3Rha2VJbnYJAAP8AAAABAUAAAAPc3Rha2luZ0Nv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c3VsdFNjYWxlTXVsdAkABRQAAAACBQAAAANuaWwJAQAAAAdmcm9tWDE4AAAAAgkAAacAAAABBQAAAAN2YWwFAAAAD3Jlc3VsdFNjYWxlTXVsdAAAAAFpAQAAABR0b1gxOFdyYXBwZXJSRUFET05MWQAAAAIAAAAHb3JpZ1ZhbAAAAA1vcmlnU2NhbGVNdWx0CQAFFAAAAAIFAAAAA25pbAkAAaYAAAABCQEAAAAFdG9YMTgAAAACBQAAAAdvcmlnVmFsBQAAAA1vcmlnU2NhbGVNdWx0AAAAAWkBAAAAHmNhbGNQcmljZUJpZ0ludFdyYXBwZXJSRUFET05MWQAAAAIAAAAIcHJBbXRYMTgAAAAIYW1BbXRYMTgJAAUUAAAAAgUAAAADbmlsCQABpgAAAAEJAQAAAA9jYWxjUHJpY2VCaWdJbnQAAAACCQABpwAAAAEFAAAACHByQW10WDE4CQABpwAAAAEFAAAACGFtQW10WDE4AAAAAWkBAAAAI2VzdGltYXRlUHV0T3BlcmF0aW9uV3JhcHBlclJFQURPTkxZAAAACQAAAAZ0eElkNTgAAAAIc2xpcHBhZ2UAAAAHaW5BbUFtdAAAAAZpbkFtSWQAAAAHaW5QckFtdAAAAAZpblBySWQAAAALdXNlckFkZHJlc3MAAAAKaXNFdmFsdWF0ZQAAAAZlbWl0THAJAAUUAAAAAgUAAAADbmlsCQEAAAAUZXN0aW1hdGVQdXRPcGVyYXRpb24AAAAJBQAAAAZ0eElkNTgFAAAACHNsaXBwYWdlBQAAAAdpbkFtQW10BQAAAAZpbkFtSWQFAAAAB2luUHJBbXQFAAAABmluUHJJZAUAAAALdXNlckFkZHJlc3MFAAAACmlzRXZhbHVhdGUFAAAABmVtaXRMcAAAAAFpAQAAACNlc3RpbWF0ZUdldE9wZXJhdGlvbldyYXBwZXJSRUFET05MWQAAAAQAAAAGdHhJZDU4AAAACnBtdEFzc2V0SWQAAAAIcG10THBBbXQAAAALdXNlckFkZHJlc3MEAAAAA3JlcwkBAAAAFGVzdGltYXRlR2V0T3BlcmF0aW9uAAAABAUAAAAGdHhJZDU4BQAAAApwbXRBc3NldElkBQAAAAhwbXRMcEFtdAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAALdXNlckFkZHJlc3MJAAUUAAAAAgUAAAADbmlsCQAFHAAAAAoIBQAAAANyZXMAAAACXzEIBQAAAANyZXMAAAACXzIIBQAAAANyZXMAAAACXzMIBQAAAANyZXMAAAACXzQIBQAAAANyZXMAAAACXzUIBQAAAANyZXMAAAACXzYIBQAAAANyZXMAAAACXzcJAAGmAAAAAQgFAAAAA3JlcwAAAAJfOAgFAAAAA3JlcwAAAAJfOQgFAAAAA3JlcwAAAANfMTAAAAABAAAAAnR4AQAAAAZ2ZXJpZnkAAAAABAAAAAckbWF0Y2gwBQAAAAJ0eAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAFT3JkZXIEAAAABW9yZGVyBQAAAAckbWF0Y2gwBAAAAAptYXRjaGVyUHViCQEAAAATZ2V0TWF0Y2hlclB1Yk9yRmFpbAAAAAAEAAAACm9yZGVyVmFsaWQJAQAAABt2YWxpZGF0ZU1hdGNoZXJPcmRlckFsbG93ZWQAAAABBQAAAAVvcmRlcgQAAAALc2VuZGVyVmFsaWQJAAH0AAAAAwgFAAAABW9yZGVyAAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAAFb3JkZXIAAAAGcHJvb2ZzAAAAAAAAAAAACAUAAAAFb3JkZXIAAAAPc2VuZGVyUHVibGljS2V5BAAAAAxtYXRjaGVyVmFsaWQJAAH0AAAAAwgFAAAABW9yZGVyAAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAAFb3JkZXIAAAAGcHJvb2ZzAAAAAAAAAAABBQAAAAptYXRjaGVyUHViAwMDBQAAAApvcmRlclZhbGlkBQAAAAtzZW5kZXJWYWxpZAcFAAAADG1hdGNoZXJWYWxpZAcGCQEAAAAPdGhyb3dPcmRlckVycm9yAAAAAwUAAAAKb3JkZXJWYWxpZAUAAAALc2VuZGVyVmFsaWQFAAAADG1hdGNoZXJWYWxpZAQAAAANbWFuYWdlclB1YmxpYwkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAR0aGlzCQEAAAATa2V5TWFuYWdlclB1YmxpY0tleQAAAAAFAAAABUVNUFRZAwkAAAAAAAACBQAAAA1tYW5hZ2VyUHVibGljBQAAAAVFTVBUWQkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAIBQAAAAJ0eAAAAA9zZW5kZXJQdWJsaWNLZXkJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAACQACWQAAAAEFAAAADW1hbmFnZXJQdWJsaWN8yVxN", "chainId": 84, "height": 1848239, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 86SHyCLTPJg6YkitssZmVNwDTXTw58NP4ZGzm2yFUAuH Next: 58hvf4X26k2SBXisEXDpeF7HF9xYoA7i2BjpAEtzidjT Diff:
OldNewDifferences
474474 let amAdiff = amAssetSwapX18
475475 let dSwap = invoke(gwxCntr, "calcD", [toString((toBigInt(amBalance) - toBigInt(fromX18(amAdiff, amDcm)))), toString((toBigInt(prBalance) + toBigInt(fromX18(prAdiff, prDcm)))), "50", "100000000", "1"], nil)
476476 let invRight = parseBigIntValue(asString(dSwap))
477- if (true)
478- then throw(((((((((((("dCur = " + asString(dCur)) + " dNew = ") + asString(dSwap)) + " amBalanceX18 - amAdiff = ") + toString((amBalanceX18 - amAdiff))) + " prBalanceX18 + prAdiff= ") + toString((prBalanceX18 + prAdiff))) + "amBalanceX18 = ") + toString(amBalanceX18)) + "prBalanceX18 = ") + toString(prBalanceX18)))
479- else {
480- let invDiff = abs(fraction((invRight - invLeft), scale8BigInt, invLeft))
481- true
482- }
477+ let invDiff = abs(fraction((invRight - invLeft), scale8BigInt, invLeft))
478+ true
483479 }
484480 if (!(isValid))
485481 then throw("Errors.")
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 calcError = toBigInt(1000000)
1111
1212 let scale18 = toBigInt(1000000000000000000)
1313
1414 let zeroBigInt = toBigInt(0)
1515
1616 let oneBigInt = toBigInt(1)
1717
1818 let SEP = "__"
1919
2020 let EMPTY = ""
2121
2222 let PoolActive = 1
2323
2424 let PoolPutDisabled = 2
2525
2626 let PoolMatcherDisabled = 3
2727
2828 let PoolShutdown = 4
2929
3030 let idxPoolAddress = 1
3131
3232 let idxPoolStatus = 2
3333
3434 let idxLPAsId = 3
3535
3636 let idxAmAsId = 4
3737
3838 let idxPrAsId = 5
3939
4040 let idxAmtAsDcm = 6
4141
4242 let idxPriceAsDcm = 7
4343
4444 let idxIAmtAsId = 8
4545
4646 let idxIPriceAsId = 9
4747
4848 let idxFactStakCntr = 1
4949
5050 let idxFactSlippCntr = 7
5151
5252 let idxFactGwxRewCntr = 10
5353
5454 func toX18 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
5555
5656
5757 func fromX18 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
5858
5959
6060 func toScale (amt,resScale,curScale) = fraction(amt, resScale, curScale)
6161
6262
6363 func abs (val) = if ((zeroBigInt > val))
6464 then -(val)
6565 else val
6666
6767
6868 func keyFactCntr () = "%s__factoryContract"
6969
7070
7171 func keyManagerPublicKey () = "%s__managerPublicKey"
7272
7373
7474 func keyPriceLast () = "%s%s__price__last"
7575
7676
7777 func keyPriceHistory (h,timestamp) = makeString(["%s%s%d%d__price__history", toString(h), toString(timestamp)], SEP)
7878
7979
8080 func keyPutActionByUser (userAddress,txId) = ((("%s%s%s__P__" + userAddress) + "__") + txId)
8181
8282
8383 func keyGetActionByUser (userAddress,txId) = ((("%s%s%s__G__" + userAddress) + "__") + txId)
8484
8585
8686 func keyAmtAsset () = "%s__amountAsset"
8787
8888
8989 func keyPriceAsset () = "%s__priceAsset"
9090
9191
9292 func keyFactoryConfig () = "%s__factoryConfig"
9393
9494
9595 func keyMatcherPub () = "%s%s__matcher__publicKey"
9696
9797
9898 func keyPoolConfig (iAmtAsset,iPriceAsset) = (((("%d%d%s__" + iAmtAsset) + "__") + iPriceAsset) + "__config")
9999
100100
101101 func keyMappingsBaseAsset2internalId (baseAssetStr) = ("%s%s%s__mappings__baseAsset2internalId__" + baseAssetStr)
102102
103103
104104 func keyAllPoolsShutdown () = "%s__shutdown"
105105
106106
107107 func keyPoolWeight (contractAddress) = ("%s%s__poolWeight__" + contractAddress)
108108
109109
110110 func throwOrderError (orderValid,senderValid,matcherValid) = throw(((((("order validation failed: orderValid=" + toString(orderValid)) + " senderValid=") + toString(senderValid)) + " matcherValid=") + toString(matcherValid)))
111111
112112
113113 func asString (val) = match val {
114114 case valStr: String =>
115115 valStr
116116 case _ =>
117117 throw("fail to cast into Int")
118118 }
119119
120120
121121 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
122122
123123
124124 func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
125125
126126
127127 let factoryContract = addressFromStringValue(getStringOrFail(this, keyFactCntr()))
128128
129129 func isGlobalShutdown () = valueOrElse(getBoolean(factoryContract, keyAllPoolsShutdown()), false)
130130
131131
132132 func getMatcherPubOrFail () = fromBase58String(getStringOrFail(factoryContract, keyMatcherPub()))
133133
134134
135135 func getPoolConfig () = {
136136 let amtAs = getStringOrFail(this, keyAmtAsset())
137137 let priceAs = getStringOrFail(this, keyPriceAsset())
138138 let iPriceAs = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(priceAs))
139139 let iAmtAs = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(amtAs))
140140 split(getStringOrFail(factoryContract, keyPoolConfig(toString(iAmtAs), toString(iPriceAs))), SEP)
141141 }
142142
143143
144144 func getFactoryConfig () = split(getStringOrFail(factoryContract, keyFactoryConfig()), SEP)
145145
146146
147147 func dataPutActionInfo (inAmtAssetAmt,inPriceAssetAmt,outLpAmt,price,slippageByUser,slippageReal,txHeight,txTimestamp,slipageAmAmt,slipagePrAmt) = makeString(["%d%d%d%d%d%d%d%d%d%d", toString(inAmtAssetAmt), toString(inPriceAssetAmt), toString(outLpAmt), toString(price), toString(slippageByUser), toString(slippageReal), toString(txHeight), toString(txTimestamp), toString(slipageAmAmt), toString(slipagePrAmt)], SEP)
148148
149149
150150 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)
151151
152152
153153 func getAccBalance (assetId) = if ((assetId == "WAVES"))
154154 then wavesBalance(this).available
155155 else assetBalance(this, fromBase58String(assetId))
156156
157157
158158 func calcPriceBigInt (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
159159
160160
161161 func privateCalcPrice (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
162162 let amtAsAmtX18 = toX18(amAmt, amAssetDcm)
163163 let prAsAmtX18 = toX18(prAmt, prAssetDcm)
164164 calcPriceBigInt(prAsAmtX18, amtAsAmtX18)
165165 }
166166
167167
168168 func calcPrices (amAmt,prAmt,lpAmt) = {
169169 let cfg = getPoolConfig()
170170 let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
171171 let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
172172 let priceX18 = privateCalcPrice(amtAsDcm, prAsDcm, amAmt, prAmt)
173173 let amAmtX18 = toX18(amAmt, amtAsDcm)
174174 let prAmtX18 = toX18(prAmt, prAsDcm)
175175 let lpAmtX18 = toX18(lpAmt, scale8)
176176 let lpPrInAmAsX18 = calcPriceBigInt(amAmtX18, lpAmtX18)
177177 let lpPrInPrAsX18 = calcPriceBigInt(prAmtX18, lpAmtX18)
178178 [priceX18, lpPrInAmAsX18, lpPrInPrAsX18]
179179 }
180180
181181
182182 func calculatePrices (amAmt,prAmt,lpAmt) = {
183183 let prices = calcPrices(amAmt, prAmt, lpAmt)
184184 [fromX18(prices[0], scale8), fromX18(prices[1], scale8), fromX18(prices[2], scale8)]
185185 }
186186
187187
188188 func estimateGetOperation (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
189189 let cfg = getPoolConfig()
190190 let lpId = cfg[idxLPAsId]
191191 let amId = cfg[idxAmAsId]
192192 let prId = cfg[idxPrAsId]
193193 let amDcm = parseIntValue(cfg[idxAmtAsDcm])
194194 let prDcm = parseIntValue(cfg[idxPriceAsDcm])
195195 let poolStatus = cfg[idxPoolStatus]
196196 let lpEmission = valueOrErrorMessage(assetInfo(fromBase58String(lpId)), (("Asset " + lpId) + " doesn't exist")).quantity
197197 if ((lpId != pmtAssetId))
198198 then throw("Invalid asset passed.")
199199 else {
200200 let amBalance = getAccBalance(amId)
201201 let amBalanceX18 = toX18(amBalance, amDcm)
202202 let prBalance = getAccBalance(prId)
203203 let prBalanceX18 = toX18(prBalance, prDcm)
204204 let curPriceX18 = calcPriceBigInt(prBalanceX18, amBalanceX18)
205205 let curPrice = fromX18(curPriceX18, scale8)
206206 let pmtLpAmtX18 = toX18(pmtLpAmt, scale8)
207207 let lpEmissionX18 = toX18(lpEmission, scale8)
208208 let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissionX18)
209209 let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissionX18)
210210 let outAmAmt = fromX18(outAmAmtX18, amDcm)
211211 let outPrAmt = fromX18(outPrAmtX18, prDcm)
212212 let state = if ((txId58 == ""))
213213 then nil
214214 else [ScriptTransfer(userAddress, outAmAmt, if ((amId == "WAVES"))
215215 then unit
216216 else fromBase58String(amId)), ScriptTransfer(userAddress, outPrAmt, if ((prId == "WAVES"))
217217 then unit
218218 else fromBase58String(prId)), StringEntry(keyGetActionByUser(toString(userAddress), txId58), dataGetActionInfo(outAmAmt, outPrAmt, pmtLpAmt, curPrice, height, lastBlock.timestamp)), IntegerEntry(keyPriceLast(), curPrice), IntegerEntry(keyPriceHistory(height, lastBlock.timestamp), curPrice)]
219219 $Tuple10(outAmAmt, outPrAmt, amId, prId, amBalance, prBalance, lpEmission, curPriceX18, poolStatus, state)
220220 }
221221 }
222222
223223
224224 func estimatePutOperation (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,userAddress,isEvaluate,emitLp) = {
225225 let cfg = getPoolConfig()
226226 let lpId = fromBase58String(cfg[idxLPAsId])
227227 let amIdStr = cfg[idxAmAsId]
228228 let prIdStr = cfg[idxPrAsId]
229229 let inAmIdStr = cfg[idxIAmtAsId]
230230 let inPrIdStr = cfg[idxIPriceAsId]
231231 let amtDcm = parseIntValue(cfg[idxAmtAsDcm])
232232 let priceDcm = parseIntValue(cfg[idxPriceAsDcm])
233233 let poolStatus = cfg[idxPoolStatus]
234234 let lpEmission = valueOrErrorMessage(assetInfo(lpId), "Wrong lp asset.").quantity
235235 let amBalance = if (isEvaluate)
236236 then getAccBalance(amIdStr)
237237 else (getAccBalance(amIdStr) - inAmAmt)
238238 let prBalance = if (isEvaluate)
239239 then getAccBalance(prIdStr)
240240 else (getAccBalance(prIdStr) - inPrAmt)
241241 let inAmAssetAmtX18 = toX18(inAmAmt, amtDcm)
242242 let inPrAssetAmtX18 = toX18(inPrAmt, priceDcm)
243243 let userPriceX18 = calcPriceBigInt(inPrAssetAmtX18, inAmAssetAmtX18)
244244 let amBalanceX18 = toX18(amBalance, amtDcm)
245245 let prBalanceX18 = toX18(prBalance, priceDcm)
246246 let res = if ((lpEmission == 0))
247247 then {
248248 let curPriceX18 = zeroBigInt
249249 let slippageX18 = zeroBigInt
250250 let lpAmtX18 = pow((inAmAssetAmtX18 * inPrAssetAmtX18), 0, toBigInt(5), 1, 0, DOWN)
251251 $Tuple5(fromX18(lpAmtX18, scale8), fromX18(inAmAssetAmtX18, amtDcm), fromX18(inPrAssetAmtX18, priceDcm), calcPriceBigInt((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
252252 }
253253 else {
254254 let curPriceX18 = calcPriceBigInt(prBalanceX18, amBalanceX18)
255255 let slippageRealX18 = fraction(abs((curPriceX18 - userPriceX18)), scale18, curPriceX18)
256256 let slippageX18 = toX18(slippage, scale8)
257257 if (if ((curPriceX18 != zeroBigInt))
258258 then (slippageRealX18 > slippageX18)
259259 else false)
260260 then throw(((("Price slippage " + toString(slippageRealX18)) + " exceeded ") + toString(slippageX18)))
261261 else {
262262 let lpEmissionX18 = toX18(lpEmission, scale8)
263263 let prViaAmX18 = fraction(inAmAssetAmtX18, curPriceX18, scale18)
264264 let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, curPriceX18)
265265 let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
266266 then $Tuple2(amViaPrX18, inPrAssetAmtX18)
267267 else $Tuple2(inAmAssetAmtX18, prViaAmX18)
268268 let expAmtAssetAmtX18 = expectedAmts._1
269269 let expPriceAssetAmtX18 = expectedAmts._2
270270 let lpAmtX18 = fraction(lpEmissionX18, expPriceAssetAmtX18, prBalanceX18)
271271 $Tuple5(fromX18(lpAmtX18, scale8), fromX18(expAmtAssetAmtX18, amtDcm), fromX18(expPriceAssetAmtX18, priceDcm), curPriceX18, slippageX18)
272272 }
273273 }
274274 let calcLpAmt = res._1
275275 let calcAmAssetPmt = res._2
276276 let calcPrAssetPmt = res._3
277277 let curPrice = fromX18(res._4, scale8)
278278 let slippageCalc = fromX18(res._5, scale8)
279279 if ((0 >= calcLpAmt))
280280 then throw("LP is less than zero.")
281281 else {
282282 let emitLpAmt = if (!(emitLp))
283283 then 0
284284 else calcLpAmt
285285 let amDiff = (inAmAmt - calcAmAssetPmt)
286286 let prDiff = (inPrAmt - calcPrAssetPmt)
287287 let commonState = [IntegerEntry(keyPriceLast(), curPrice), IntegerEntry(keyPriceHistory(height, lastBlock.timestamp), curPrice), StringEntry(keyPutActionByUser(userAddress, txId58), dataPutActionInfo(calcAmAssetPmt, calcPrAssetPmt, emitLpAmt, curPrice, slippage, slippageCalc, height, lastBlock.timestamp, amDiff, prDiff))]
288288 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEmission, lpId, poolStatus, commonState, amDiff, prDiff, inAmId, inPrId)
289289 }
290290 }
291291
292292
293293 func validateMatcherOrderAllowed (order) = {
294294 let cfg = getPoolConfig()
295295 let amtAssetId = cfg[idxAmAsId]
296296 let priceAssetId = cfg[idxPrAsId]
297297 let poolStatus = parseIntValue(cfg[idxPoolStatus])
298298 let amtAssetDcm = parseIntValue(cfg[idxAmtAsDcm])
299299 let priceAssetDcm = parseIntValue(cfg[idxPriceAsDcm])
300300 let accAmtAssetBalance = getAccBalance(amtAssetId)
301301 let accPriceAssetBalance = getAccBalance(priceAssetId)
302302 let curPriceX18 = if ((order.orderType == Buy))
303303 then privateCalcPrice(amtAssetDcm, priceAssetDcm, (accAmtAssetBalance + order.amount), accPriceAssetBalance)
304304 else privateCalcPrice(amtAssetDcm, priceAssetDcm, (accAmtAssetBalance - order.amount), accPriceAssetBalance)
305305 let curPrice = fromX18(curPriceX18, scale8)
306306 if (if (if (isGlobalShutdown())
307307 then true
308308 else (poolStatus == PoolMatcherDisabled))
309309 then true
310310 else (poolStatus == PoolShutdown))
311311 then throw("Exchange operations disabled")
312312 else {
313313 let orderAmtAsset = order.assetPair.amountAsset
314314 let orderAmtAssetStr = if ((orderAmtAsset == unit))
315315 then "WAVES"
316316 else toBase58String(value(orderAmtAsset))
317317 let orderPriceAsset = order.assetPair.priceAsset
318318 let orderPriceAssetStr = if ((orderPriceAsset == unit))
319319 then "WAVES"
320320 else toBase58String(value(orderPriceAsset))
321321 if (if ((orderAmtAssetStr != amtAssetId))
322322 then true
323323 else (orderPriceAssetStr != priceAssetId))
324324 then throw("Wrong order assets.")
325325 else {
326326 let orderPrice = order.price
327327 let priceDcm = fraction(scale8, priceAssetDcm, amtAssetDcm)
328328 let castedOrderPrice = toScale(orderPrice, scale8, priceDcm)
329329 let isOrderPriceValid = if ((order.orderType == Buy))
330330 then (curPrice >= castedOrderPrice)
331331 else (castedOrderPrice >= curPrice)
332332 true
333333 }
334334 }
335335 }
336336
337337
338338 func commonGet (i) = if ((size(i.payments) != 1))
339339 then throw("exactly 1 payment is expected")
340340 else {
341341 let pmt = value(i.payments[0])
342342 let pmtAssetId = value(pmt.assetId)
343343 let pmtAmt = pmt.amount
344344 let res = estimateGetOperation(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
345345 let outAmAmt = res._1
346346 let outPrAmt = res._2
347347 let poolStatus = parseIntValue(res._9)
348348 let state = res._10
349349 if (if (isGlobalShutdown())
350350 then true
351351 else (poolStatus == PoolShutdown))
352352 then throw(("Get operation is blocked by admin. Status = " + toString(poolStatus)))
353353 else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state)
354354 }
355355
356356
357357 func commonPut (caller,txId,amAsPmt,prAsPmt,slippage,emitLp) = {
358358 let estPut = estimatePutOperation(txId, slippage, value(amAsPmt).amount, value(amAsPmt).assetId, value(prAsPmt).amount, value(prAsPmt).assetId, caller, false, emitLp)
359359 let status = parseIntValue(estPut._8)
360360 if (if (if (isGlobalShutdown())
361361 then true
362362 else (status == PoolPutDisabled))
363363 then true
364364 else (status == PoolShutdown))
365365 then throw(("Put operation is blocked by admin. Status = " + toString(status)))
366366 else estPut
367367 }
368368
369369
370370 @Callable(i)
371371 func constructor (factoryContract,managerPublicKey) = if ((i.caller != this))
372372 then throw("permissions denied")
373373 else [StringEntry(keyFactCntr(), factoryContract), StringEntry(keyManagerPublicKey(), managerPublicKey)]
374374
375375
376376
377377 @Callable(i)
378378 func put (slip,autoStake) = {
379379 let factCfg = getFactoryConfig()
380380 let stakingCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactStakCntr]), "Incorrect staking address.")
381381 let slipCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactSlippCntr]), "Incorrect slippage address.")
382382 if ((0 > slip))
383383 then throw("Invalid slippage.")
384384 else if ((size(i.payments) != 2))
385385 then throw("2 payments are expected")
386386 else {
387387 let estPut = commonPut(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], slip, true)
388388 let emitLpAmt = estPut._2
389389 let lpAssetId = estPut._7
390390 let state = estPut._9
391391 let amDiff = estPut._10
392392 let prDiff = estPut._11
393393 let amId = estPut._12
394394 let prId = estPut._13
395395 let emitInv = invoke(factoryContract, "emit", [emitLpAmt], nil)
396396 if ((emitInv == emitInv))
397397 then {
398398 let slippageAInv = if ((amDiff > 0))
399399 then invoke(slipCntr, "put", nil, [AttachedPayment(amId, amDiff)])
400400 else nil
401401 if ((slippageAInv == slippageAInv))
402402 then {
403403 let slippagePInv = if ((prDiff > 0))
404404 then invoke(slipCntr, "put", nil, [AttachedPayment(prId, prDiff)])
405405 else nil
406406 if ((slippagePInv == slippagePInv))
407407 then {
408408 let lpTrnsfr = if (autoStake)
409409 then {
410410 let slpStakeInv = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
411411 if ((slpStakeInv == slpStakeInv))
412412 then nil
413413 else throw("Strict value is not equal to itself.")
414414 }
415415 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
416416 (state ++ lpTrnsfr)
417417 }
418418 else throw("Strict value is not equal to itself.")
419419 }
420420 else throw("Strict value is not equal to itself.")
421421 }
422422 else throw("Strict value is not equal to itself.")
423423 }
424424 }
425425
426426
427427
428428 @Callable(i)
429429 func putOneTkn (inAmtAmount,inPrAmount,autoStake) = {
430430 let cfg = getFactoryConfig()
431431 let stakingCntr = valueOrErrorMessage(addressFromString(cfg[idxFactStakCntr]), "Wrong staking address")
432432 let slipCntr = valueOrErrorMessage(addressFromString(cfg[idxFactSlippCntr]), "Wrong slippage address")
433433 let gwxCntr = valueOrErrorMessage(addressFromString(cfg[idxFactGwxRewCntr]), "Wrong slippage address")
434434 let poolCfg = getPoolConfig()
435435 let amId = poolCfg[idxAmAsId]
436436 let prId = poolCfg[idxPrAsId]
437437 let amDcm = parseIntValue(poolCfg[idxAmtAsDcm])
438438 let prDcm = parseIntValue(poolCfg[idxPriceAsDcm])
439439 if ((size(i.payments) != 1))
440440 then throw("exactly 1 payment is expected")
441441 else {
442442 let pmt = value(i.payments[0])
443443 let pmtAssetId = toBase58String(value(pmt.assetId))
444444 let pmtAmt = pmt.amount
445445 let amAssetSwapX18 = toX18(inAmtAmount, amDcm)
446446 let prAssetSwapX18 = toX18(inPrAmount, prDcm)
447447 let amBalance = getAccBalance(amId)
448448 let amBalanceX18 = toX18(amBalance, amDcm)
449449 let prBalance = getAccBalance(prId)
450450 let prBalanceX18 = toX18(prBalance, prDcm)
451451 let amBalanceNow = if ((pmtAssetId == amId))
452452 then (amBalance - pmtAmt)
453453 else amBalance
454454 let prBalanceNow = if ((pmtAssetId == prId))
455455 then (prBalance - pmtAmt)
456456 else prBalance
457457 let dCur = invoke(gwxCntr, "calcD", [toString(amBalanceNow), toString(prBalanceNow), "50", "100000000", "1"], nil)
458458 let invLeft = parseBigIntValue(asString(dCur))
459459 let isValid = if ((pmtAssetId == amId))
460460 then {
461461 let pmtAmtX18 = toX18(pmtAmt, amDcm)
462462 let prAdiff = prAssetSwapX18
463463 let amAdiff = (pmtAmtX18 - amAssetSwapX18)
464464 let dSwap = invoke(gwxCntr, "calcD", [toString((toBigInt(amBalanceNow) + toBigInt(fromX18(amAdiff, amDcm)))), toString((toBigInt(prBalanceNow) - toBigInt(fromX18(prAdiff, prDcm)))), "50", "100000000", "1"], nil)
465465 let invRight = parseBigIntValue(asString(dSwap))
466466 let invDiff = abs(fraction((invRight - invLeft), scale8BigInt, invLeft))
467467 if ((invDiff > toBigInt(1000)))
468468 then throw("Wrong arguments passed. D decreased.")
469469 else true
470470 }
471471 else {
472472 let pmtPrX18 = toX18(pmtAmt, prDcm)
473473 let prAdiff = (prAssetSwapX18 - pmtPrX18)
474474 let amAdiff = amAssetSwapX18
475475 let dSwap = invoke(gwxCntr, "calcD", [toString((toBigInt(amBalance) - toBigInt(fromX18(amAdiff, amDcm)))), toString((toBigInt(prBalance) + toBigInt(fromX18(prAdiff, prDcm)))), "50", "100000000", "1"], nil)
476476 let invRight = parseBigIntValue(asString(dSwap))
477- if (true)
478- then throw(((((((((((("dCur = " + asString(dCur)) + " dNew = ") + asString(dSwap)) + " amBalanceX18 - amAdiff = ") + toString((amBalanceX18 - amAdiff))) + " prBalanceX18 + prAdiff= ") + toString((prBalanceX18 + prAdiff))) + "amBalanceX18 = ") + toString(amBalanceX18)) + "prBalanceX18 = ") + toString(prBalanceX18)))
479- else {
480- let invDiff = abs(fraction((invRight - invLeft), scale8BigInt, invLeft))
481- true
482- }
477+ let invDiff = abs(fraction((invRight - invLeft), scale8BigInt, invLeft))
478+ true
483479 }
484480 if (!(isValid))
485481 then throw("Errors.")
486482 else {
487483 let estPut = commonPut(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(fromBase58String(amId), inAmtAmount), AttachedPayment(fromBase58String(prId), inPrAmount), 50000000000, true)
488484 let emitLpAmt = estPut._2
489485 let lpAssetId = estPut._7
490486 let state = estPut._9
491487 let amDiff = estPut._10
492488 let prDiff = estPut._11
493489 let emitInv = invoke(factoryContract, "emit", [emitLpAmt], nil)
494490 if ((emitInv == emitInv))
495491 then {
496492 let slippageAInv = if ((amDiff > 0))
497493 then invoke(slipCntr, "put", nil, [AttachedPayment(fromBase58String(amId), amDiff)])
498494 else nil
499495 if ((slippageAInv == slippageAInv))
500496 then {
501497 let slippagePInv = if ((prDiff > 0))
502498 then invoke(slipCntr, "put", nil, [AttachedPayment(fromBase58String(prId), prDiff)])
503499 else nil
504500 if ((slippagePInv == slippagePInv))
505501 then {
506502 let lpTrnsfr = if (autoStake)
507503 then {
508504 let slpStakeInv = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
509505 if ((slpStakeInv == slpStakeInv))
510506 then nil
511507 else throw("Strict value is not equal to itself.")
512508 }
513509 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
514510 (state ++ lpTrnsfr)
515511 }
516512 else throw("Strict value is not equal to itself.")
517513 }
518514 else throw("Strict value is not equal to itself.")
519515 }
520516 else throw("Strict value is not equal to itself.")
521517 }
522518 }
523519 }
524520
525521
526522
527523 @Callable(i)
528524 func putForFree (maxSlippage) = if ((0 > maxSlippage))
529525 then throw("Invalid value passed")
530526 else if ((size(i.payments) != 2))
531527 then throw("exactly 2 payments are expected")
532528 else {
533529 let estPut = commonPut(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], maxSlippage, false)
534530 estPut._9
535531 }
536532
537533
538534
539535 @Callable(i)
540536 func get () = {
541537 let res = commonGet(i)
542538 let outAmtAmt = res._1
543539 let outPrAmt = res._2
544540 let pmtAmt = res._3
545541 let pmtAssetId = res._4
546542 let state = res._5
547543 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
548544 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
549545 then state
550546 else throw("Strict value is not equal to itself.")
551547 }
552548
553549
554550
555551 @Callable(i)
556552 func getOneTkn (amAssetSwap,prAssetSwap,outAmount,outAssetId) = if ((size(i.payments) != 1))
557553 then throw("exactly 1 payment is expected")
558554 else {
559555 let cfg = getPoolConfig()
560556 let lpId = cfg[idxLPAsId]
561557 let amId = cfg[idxAmAsId]
562558 let prId = cfg[idxPrAsId]
563559 let amDcm = parseIntValue(cfg[idxAmtAsDcm])
564560 let prDcm = parseIntValue(cfg[idxPriceAsDcm])
565561 let poolStatus = cfg[idxPoolStatus]
566562 if (if ((outAssetId != amId))
567563 then (outAssetId != prId)
568564 else false)
569565 then throw(("Incorrect out asset id passed: " + outAssetId))
570566 else {
571567 let resultAssetId = if ((outAssetId == amId))
572568 then amId
573569 else prId
574570 let resultAmtAmount = if ((outAssetId == amId))
575571 then outAmount
576572 else 0
577573 let resultPrAmount = if ((outAssetId == prId))
578574 then outAmount
579575 else 0
580576 let pmt = value(i.payments[0])
581577 let userAddress = i.caller
582578 let txId58 = toBase58String(i.transactionId)
583579 let pmtAssetId = value(pmt.assetId)
584580 let pmtAmt = pmt.amount
585581 if ((lpId != toBase58String(pmtAssetId)))
586582 then throw("Invalid asset passed.")
587583 else {
588584 let amAssetSwapX18 = toX18(amAssetSwap, amDcm)
589585 let prAssetSwapX18 = toX18(prAssetSwap, prDcm)
590586 let swapPriceX18 = calcPriceBigInt(prAssetSwapX18, amAssetSwapX18)
591587 let r = estimateGetOperation(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
592588 let outAmAmt = r._1
593589 let outPrAmt = r._2
594590 let totalR = if ((outAssetId == amId))
595591 then {
596592 let amtAsRes = fromX18(fraction(toX18(outPrAmt, prDcm), scale18, swapPriceX18), amDcm)
597593 (amtAsRes + outAmAmt)
598594 }
599595 else {
600596 let amSwopPartInPriceAsset = (resultPrAmount - outPrAmt)
601597 let convRes = fraction(toX18(amSwopPartInPriceAsset, amDcm), scale18, swapPriceX18)
602598 let prAsRes = fromX18(fraction(toX18(outAmAmt, amDcm), swapPriceX18, scale18), prDcm)
603599 let amAssetDiff = fraction((convRes - amAssetSwapX18), scale8BigInt, amAssetSwapX18)
604600 (prAsRes + outPrAmt)
605601 }
606602 let amBalance = getAccBalance(amId)
607603 let amBalanceX18 = toX18(amBalance, amDcm)
608604 let prBalance = getAccBalance(prId)
609605 let prBalanceX18 = toX18(prBalance, prDcm)
610606 let curPriceX18 = calcPriceBigInt(prBalanceX18, amBalanceX18)
611607 let curPrice = fromX18(curPriceX18, scale8)
612608 let state = [ScriptTransfer(userAddress, totalR, if ((resultAssetId == "WAVES"))
613609 then unit
614610 else fromBase58String(resultAssetId)), StringEntry(keyGetActionByUser(toString(userAddress), txId58), dataGetActionInfo(resultAmtAmount, resultPrAmount, pmtAmt, curPrice, height, lastBlock.timestamp)), IntegerEntry(keyPriceLast(), curPrice), IntegerEntry(keyPriceHistory(height, lastBlock.timestamp), curPrice)]
615611 let burn = invoke(factoryContract, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
616612 if ((burn == burn))
617613 then state
618614 else throw("Strict value is not equal to itself.")
619615 }
620616 }
621617 }
622618
623619
624620
625621 @Callable(i)
626622 func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = {
627623 let res = commonGet(i)
628624 let outAmAmt = res._1
629625 let outPrAmt = res._2
630626 let pmtAmt = res._3
631627 let pmtAssetId = res._4
632628 let state = res._5
633629 if ((noLessThenAmtAsset > outAmAmt))
634630 then throw(((("noLessThenAmtAsset failed: " + toString(outAmAmt)) + " < ") + toString(noLessThenAmtAsset)))
635631 else if ((noLessThenPriceAsset > outPrAmt))
636632 then throw(((("noLessThenPriceAsset failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset)))
637633 else {
638634 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
639635 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
640636 then state
641637 else throw("Strict value is not equal to itself.")
642638 }
643639 }
644640
645641
646642
647643 @Callable(i)
648644 func unstakeAndGet (amount) = {
649645 let checkPayments = if ((size(i.payments) != 0))
650646 then throw("No payments are expected")
651647 else true
652648 if ((checkPayments == checkPayments))
653649 then {
654650 let cfg = getPoolConfig()
655651 let factoryCfg = getFactoryConfig()
656652 let lpAssetId = fromBase58String(cfg[idxLPAsId])
657653 let stakingContract = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Error. Incorrect staking address.")
658654 let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(lpAssetId), amount], nil)
659655 if ((unstakeInv == unstakeInv))
660656 then {
661657 let res = estimateGetOperation(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
662658 let poolStatus = parseIntValue(res._9)
663659 let state = res._10
664660 let checkPoolStatus = if (if (isGlobalShutdown())
665661 then true
666662 else (poolStatus == PoolShutdown))
667663 then throw(("Get operation is blocked by admin. Status = " + toString(poolStatus)))
668664 else true
669665 if ((checkPoolStatus == checkPoolStatus))
670666 then {
671667 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
672668 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
673669 then state
674670 else throw("Strict value is not equal to itself.")
675671 }
676672 else throw("Strict value is not equal to itself.")
677673 }
678674 else throw("Strict value is not equal to itself.")
679675 }
680676 else throw("Strict value is not equal to itself.")
681677 }
682678
683679
684680
685681 @Callable(i)
686682 func activate (amtAssetStr,priceAssetStr) = if ((toString(i.caller) != toString(factoryContract)))
687683 then throw("permissions denied")
688684 else $Tuple2([StringEntry(keyAmtAsset(), amtAssetStr), StringEntry(keyPriceAsset(), priceAssetStr)], "success")
689685
690686
691687
692688 @Callable(i)
693689 func getPoolConfigWrapperREADONLY () = $Tuple2(nil, getPoolConfig())
694690
695691
696692
697693 @Callable(i)
698694 func getAccBalanceWrapperREADONLY (assetId) = $Tuple2(nil, getAccBalance(assetId))
699695
700696
701697
702698 @Callable(i)
703699 func calcPricesWrapperREADONLY (amAmt,prAmt,lpAmt) = {
704700 let prices = calcPrices(amAmt, prAmt, lpAmt)
705701 $Tuple2(nil, [toString(prices[0]), toString(prices[1]), toString(prices[2])])
706702 }
707703
708704
709705
710706 @Callable(i)
711707 func fromX18WrapperREADONLY (val,resultScaleMult) = $Tuple2(nil, fromX18(parseBigIntValue(val), resultScaleMult))
712708
713709
714710
715711 @Callable(i)
716712 func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(toX18(origVal, origScaleMult)))
717713
718714
719715
720716 @Callable(i)
721717 func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(calcPriceBigInt(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
722718
723719
724720
725721 @Callable(i)
726722 func estimatePutOperationWrapperREADONLY (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,userAddress,isEvaluate,emitLp) = $Tuple2(nil, estimatePutOperation(txId58, slippage, inAmAmt, inAmId, inPrAmt, inPrId, userAddress, isEvaluate, emitLp))
727723
728724
729725
730726 @Callable(i)
731727 func estimateGetOperationWrapperREADONLY (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
732728 let res = estimateGetOperation(txId58, pmtAssetId, pmtLpAmt, addressFromStringValue(userAddress))
733729 $Tuple2(nil, $Tuple10(res._1, res._2, res._3, res._4, res._5, res._6, res._7, toString(res._8), res._9, res._10))
734730 }
735731
736732
737733 @Verifier(tx)
738734 func verify () = match tx {
739735 case order: Order =>
740736 let matcherPub = getMatcherPubOrFail()
741737 let orderValid = validateMatcherOrderAllowed(order)
742738 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
743739 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
744740 if (if (if (orderValid)
745741 then senderValid
746742 else false)
747743 then matcherValid
748744 else false)
749745 then true
750746 else throwOrderError(orderValid, senderValid, matcherValid)
751747 case _ =>
752748 let managerPublic = valueOrElse(getString(this, keyManagerPublicKey()), EMPTY)
753749 if ((managerPublic == EMPTY))
754750 then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
755751 else sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(managerPublic))
756752 }
757753

github/deemru/w8io/169f3d6 
84.86 ms