tx · 3AV734REgzz9uYw3CoxCFTr8FUmKWZaM2H5hbQJrdTTb

3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT:  -0.01400000 Waves

2021.12.21 19:46 [1844282] smart account 3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT > SELF 0.00000000 Waves

{ "type": 13, "id": "3AV734REgzz9uYw3CoxCFTr8FUmKWZaM2H5hbQJrdTTb", "fee": 1400000, "feeAssetId": null, "timestamp": 1640105183186, "version": 1, "sender": "3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT", "senderPublicKey": "D1BL65meykxFZTCuq7jq9HSGLLnWvQamQPUNrguW5w39", "proofs": [ "23g9RVajWpMK1y2p5rhf1yohKSbTzQBtKxRcQS61gFDqK3gRAKmfxcrgttRnKjy5Hk4sK6B7LUVqQ3g2Nq3xPdkM" ], "script": "base64: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AA1rZXlNYXRjaGVyUHViAAAAAAIAAAAYJXMlc19fbWF0Y2hlcl9fcHVibGljS2V5AQAAAA1rZXlQb29sQ29uZmlnAAAAAgAAAAlpQW10QXNzZXQAAAALaVByaWNlQXNzZXQJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAIJWQlZCVzX18FAAAACWlBbXRBc3NldAIAAAACX18FAAAAC2lQcmljZUFzc2V0AgAAAAhfX2NvbmZpZwEAAAAfa2V5TWFwcGluZ3NCYXNlQXNzZXQyaW50ZXJuYWxJZAAAAAEAAAAMYmFzZUFzc2V0U3RyCQABLAAAAAICAAAAKCVzJXMlc19fbWFwcGluZ3NfX2Jhc2VBc3NldDJpbnRlcm5hbElkX18FAAAADGJhc2VBc3NldFN0cgEAAAATa2V5QWxsUG9vbHNTaHV0ZG93bgAAAAACAAAADCVzX19zaHV0ZG93bgEAAAANa2V5UG9vbFdlaWdodAAAAAEAAAAPY29udHJhY3RBZGRyZXNzCQABLAAAAAICAAAAEiVzJXNfX3Bvb2xXZWlnaHRfXwUAAAAPY29udHJhY3RBZGRyZXNzAQAAAA90aHJvd09yZGVyRXJyb3IAAAADAAAACm9yZGVyVmFsaWQAAAALc2VuZGVyVmFsaWQAAAAMbWF0Y2hlclZhbGlkCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAACRvcmRlciB2YWxpZGF0aW9uIGZhaWxlZDogb3JkZXJWYWxpZD0JAAGlAAAAAQUAAAAKb3JkZXJWYWxpZAIAAAANIHNlbmRlclZhbGlkPQkAAaUAAAABBQAAAAtzZW5kZXJWYWxpZAIAAAAOIG1hdGNoZXJWYWxpZD0JAAGlAAAAAQUAAAAMbWF0Y2hlclZhbGlkAQAAAA9nZXRTdHJpbmdPckZhaWwAAAACAAAAB2FkZHJlc3MAAAADa2V5CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAHYWRkcmVzcwUAAAADa2V5CQAEuQAAAAIJAARMAAAAAgIAAAAKbWFuZGF0b3J5IAkABEwAAAACCQAEJQAAAAEFAAAAB2FkZHJlc3MJAARMAAAAAgIAAAABLgkABEwA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dFgxOAkBAAAABXRvWDE4AAAAAgUAAAAIcG10THBBbXQFAAAABnNjYWxlOAQAAAANbHBFbWlzc2lvblgxOAkBAAAABXRvWDE4AAAAAgUAAAAKbHBFbWlzc2lvbgUAAAAGc2NhbGU4BAAAAAtvdXRBbUFtdFgxOAkAATwAAAADBQAAAAxhbUJhbGFuY2VYMTgFAAAAC3BtdExwQW10WDE4BQAAAA1scEVtaXNzaW9uWDE4BAAAAAtvdXRQckFtdFgxOAkAATwAAAADBQAAAAxwckJhbGFuY2VYMTgFAAAAC3BtdExwQW10WDE4BQAAAA1scEVtaXNzaW9uWDE4BAAAAAhvdXRBbUFtdAkBAAAAB2Zyb21YMTgAAAACBQAAAAtvdXRBbUFtdFgxOAUAAAAFYW1EY20EAAAACG91dFByQW10CQEAAAAHZnJvbVgxOAAAAAIFAAAAC291dFByQW10WDE4BQAAAAVwckRjbQQAAAAFc3RhdGUDCQAAAAAAAAIFAAAABnR4SWQ1OAIAAAAABQAAAANuaWwJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAALdXNlckFkZHJlc3MFAAAACG91dEFtQW10AwkAAAAAAAACBQAAAARhbUlkAgAAAAVXQVZFUwUAAAAEdW5pdAkAAlkAAAABBQAAAARhbUlkCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAC3VzZXJBZGRyZXNzBQAAAAhvdXRQckFtdAMJAAAAAAAAAgUAAAAEcHJJZAIAAAAFV0FWRVMFAAAABHVuaXQJAAJZAAAAAQUAAAAEcHJJZAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAASa2V5R2V0QWN0aW9uQnlVc2VyAAAAAgkABCUAAAABBQAAAAt1c2VyQWRkcmVzcwUAAAAGdHhJZDU4CQEAAAARZGF0YUdldEFjdGlvbkluZm8AAAAGBQAAAAhvdXRBbUFtdAUAAAAIb3V0UHJBbXQFAAAACHBtdExwQW10BQAAAAhjdXJQcmljZQUAAAAGaGVpZ2h0CAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAADGtleVByaWNlTGFzdAAAAAAFAAAACGN1clByaWNlCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAPa2V5UHJpY2VIaXN0b3J5AAAAAgUAAAAGaGVpZ2h0CAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAUAAAAIY3VyUHJpY2UFAAAAA25pbAkABRwAAAAKBQAAAAhvdXRBbUFtdAUAAAAIb3V0UHJBbXQFAAAABGFtSWQFAAAABHBySWQFAAAACWFtQmFsYW5jZQUAAAAJcHJCYWxhbmNlBQAAAApscEVtaXNzaW9uBQAAAAtjdXJQcmljZVgxOAUAAAAKcG9vbFN0YXR1cwUAAAAFc3RhdGUBAAAAFGVzdGltYXRlUHV0T3BlcmF0aW9uAAAACgAAAAZ0eElkNTgAAAARc2xpcHBhZ2VUb2xlcmFuY2UAAAAHaW5BbUFtdAAAAAZpbkFtSWQAAAAHaW5QckFtdAAAAAZpblBySWQAAAALdXNlckFkZHJlc3MAAAAKaXNFdmFsdWF0ZQAAAAZlbWl0THAAAAAKaXNPbmVBc3NldAQAAAADY2ZnCQEAAAANZ2V0UG9vbENvbmZpZwAAAAAEAAAABGxwSWQJAAJZAAAAAQkAAZEAAAACBQAAAANjZmcFAAAACWlkeExQQXNJZAQAAAAHYW1JZFN0cgkAAZEAAAACBQAAAANjZmcFAAAACWlkeEFtQXNJZAQAAAAHcHJJZFN0cgkAAZEAAAACBQAAAANjZmcFAAAACWlkeFByQXNJZAQAAAAJaW5BbUlkU3RyCQABkQAAAAIFAAAAA2NmZwUAAAALaWR4SUFtdEFzSWQEAAAACWluUHJJZFN0cgkAAZEAAAACBQAAAANjZmcFAAAADWlkeElQcmljZUFzSWQEAAAABmFtdERjbQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAA2NmZwUAAAALaWR4QW10QXNEY20EAAAACHByaWNlRGNtCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAADY2ZnBQAAAA1pZHhQcmljZUFzRGNtBAAAAApwb29sU3RhdHVzCQABkQAAAAIFAAAAA2NmZwUAAAANaWR4UG9vbFN0YXR1cwQAAAAKbHBFbWlzc2lvbggJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkAA+wAAAABBQAAAARscElkCQABLAAAAAIJAAEsAAAAAgIAAAAGQXNzZXQgCQACWAAAAAEFAAAABGxwSWQCAAAADiBkb2Vzbid0IGV4aXN0AAAACHF1YW50aXR5BAAAAAlhbUJhbGFuY2UDBQAAAAppc0V2YWx1YXRlCQEAAAANZ2V0QWNjQmFsYW5jZQAAAAEFAAAAB2FtSWRTdHIJAABlAAAAAgkBAAAADWdldEFjY0JhbGFuY2UAAAABBQAAAAdhbUlkU3RyBQAAAAdpbkFtQW10BAAAAAlwckJhbGFuY2UDBQAAAAppc0V2YWx1YXRlCQEAAAANZ2V0QWNjQmFsYW5jZQAAAAEFAAAAB3BySWRTdHIJAABlAAAAAgkBAAAADWdldEFjY0JhbGFuY2UAAAABBQAAAAdwcklkU3RyBQAAAAdpblByQW10BAAAAA9pbkFtQXNzZXRBbXRYMTgJAQAAAAV0b1gxOAAAAAIFAAAAB2luQW1BbXQFAAAABmFtdERjbQQAAAAPaW5QckFzc2V0QW10WDE4CQEAAAAFdG9YMTgAAAACBQAAAAdpblByQW10BQAAAAhwcmljZURjbQQAAAAMdXNlclByaWNlWDE4CQEAAAAPY2FsY1ByaWNlQmlnSW50AAAAAgUAAAAPaW5QckFzc2V0QW10WDE4BQAAAA9pbkFtQXNzZXRBbXRYMTgEAAAADGFtQmFsYW5jZVgxOAkBAAAABXRvWDE4AAAAAgUAAAAJYW1CYWxhbmNlBQAAAAZhbXREY20EAAAADHByQmFsYW5jZVgxOAkBAAAABXRvWDE4AAAAAgUAAAAJcHJCYWxhbmNlBQAAAAhwcmljZURjbQQAAAADcmVzAwkAAAAAAAACBQAAAApscEVtaXNzaW9uAAAAAAAAAAAABAAAAAtjdXJQcmljZVgxOAUAAAAKemVyb0JpZ0ludAQAAAALc2xpcHBhZ2VYMTgFAAAACnplcm9CaWdJbnQEAAAACGxwQW10WDE4CQAAdgAAAAYJAAE5AAAAAgUAAAAPaW5BbUFzc2V0QW10WDE4BQAAAA9pblByQXNzZXRBbXRYMTgAAAAAAAAAAAAJAAE2AAAAAQAAAAAAAAAABQAAAAAAAAAAAQAAAAAAAAAAAAUAAAAERE9XTgkABRcAAAAFCQEAAAAHZnJvbVgxOAAAAAIFAAAACGxwQW10WDE4BQAAAAZzY2FsZTgJAQAAAAdmcm9tWDE4AAAAAgUAAAAPaW5BbUFzc2V0QW10WDE4BQAAAAZhbXREY20JAQAAAAdmcm9tWDE4AAAAAgUAAAAPaW5QckFzc2V0QW10WDE4BQAAAAhwcmljZURjbQkBAAAAD2NhbGNQcmljZUJpZ0ludAAAAAIJAAE3AAAAAgUAAAAMcHJCYWxhbmNlWDE4BQAAAA9pblByQXNzZXRBbXRYMTgJAAE3AAAAAgUAAAAMYW1CYWxhbmNlWDE4BQAAAA9pbkFtQXNzZXRBbXRYMTgFAAAAC3NsaXBwYWdlWDE4BAAAAAR0UmVzAwUAAAAKaXNPbmVBc3NldAQAAAANbHBFbWlzc2lvblgxOAkBAAAABXRvWDE4AAAAAgUAAAAKbHBFbWlzc2lvbgUAAAAGc2NhbGU4BAAAAAtzdW1JbkFzc2V0cwkAATcAAAACBQAAAA9pbkFtQXNzZXRBbXRYMTgFAAAAD2luUHJBc3NldEFtdFgxOAQAAAAPc3VtUG9vbEJhbGFuY2VzCQABNwAAAAIFAAAADGFtQmFsYW5jZVgxOAUAAAAMcHJCYWxhbmNlWDE4BAAAAAhscEFtdFgxOAkAATwAAAADBQAAAA1scEVtaXNzaW9uWDE4BQAAAAtzdW1JbkFzc2V0cwUAAAAPc3VtUG9vbEJhbGFuY2VzBAAAAAtjdXJQcmljZVgxOAkBAAAAD2NhbGNQcmljZUJpZ0ludAAAAAIFAAAADHByQmFsYW5jZVgxOAUAAAAMYW1CYWxhbmNlWDE4CQAFFwAAAAUJAQAAAAdmcm9tWDE4AAAAAgUAAAAIbHBBbXRYMTgFAAAABnNjYWxlOAUAAAAHaW5BbUFtdAUAAAAHaW5QckFtdAUAAAALY3VyUHJpY2VYMTgJAAE2AAAAAQAAAAAAAAAAAAQAAAALY3VyUHJpY2VYMTgJAQAAAA9jYWxjUHJpY2VCaWdJbnQAAAACBQAAAAxwckJhbGFuY2VYMTgFAAAADGFtQmFsYW5jZVgxOAQAAAALc2xpcHBhZ2VYMTgJAAE8AAAAAwkBAAAAA2FicwAAAAEJAAE4AAAAAgUAAAALY3VyUHJpY2VYMTgFAAAADHVzZXJQcmljZVgxOAUAAAAHc2NhbGUxOAUAAAALY3VyUHJpY2VYMTgEAAAAFHNsaXBwYWdlVG9sZXJhbmNlWDE4CQEAAAAFdG9YMTgAAAACBQAAABFzbGlwcGFnZVRvbGVyYW5jZQUAAAAGc2NhbGU4AwMJAQAAAAIhPQAAAAIFAAAAC2N1clByaWNlWDE4BQAAAAp6ZXJvQmlnSW50CQABPwAAAAIFAAAAC3NsaXBwYWdlWDE4BQAAABRzbGlwcGFnZVRvbGVyYW5jZVgxOAcJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAPUHJpY2Ugc2xpcHBhZ2UgCQABpgAAAAEFAAAAC3NsaXBwYWdlWDE4AgAAAB4gZXhjZWVkZWQgdGhlIHBhc3NlZCBsaW1pdCBvZiAJAAGmAAAAAQUAAAAUc2xpcHBhZ2VUb2xlcmFuY2VYMTgEAAAADWxwRW1pc3Npb25YMTgJAQAAAAV0b1gxOAAAAAIFAAAACmxwRW1pc3Npb24FAAAABnNjYWxlOAQAAAAKcHJWaWFBbVgxOAkAATwAAAADBQAAAA9pbkFtQXNzZXRBbXRYMTgFAAAAC2N1clByaWNlWDE4BQAAAAdzY2FsZTE4BAAAAAphbVZpYVByWDE4CQABPAAAAAMFAAAAD2luUHJBc3NldEFtdFgxOAUAAAAHc2NhbGUxOAUAAAALY3VyUHJpY2VYMTgEAAAADGV4cGVjdGVkQW10cwMJAAE/AAAAAgUAAAAKcHJWaWFBbVgxOAUAAAAPaW5QckFzc2V0QW10WDE4CQAFFAAAAAIFAAAACmFtVmlhUHJYMTgFAAAAD2luUHJBc3NldEFtdFgxOAkABRQAAAACBQAAAA9pbkFtQXNzZXRBbXRYMTgFAAAACnByVmlhQW1YMTgEAAAAEWV4cEFtdEFzc2V0QW10WDE4CAUAAAAMZXhwZWN0ZWRBbXRzAAAAAl8xBAAAABNleHBQcmljZUFzc2V0QW10WDE4CAUAAAAMZXhwZWN0ZWRBbXRzAAAAAl8yBAAAAAhscEFtdFgxOAkAATwAAAADBQAAAA1scEVtaXNzaW9uWDE4BQAAABNleHBQcmljZUFzc2V0QW10WDE4BQAAAAxwckJhbGFuY2VYMTgJAAUXAAAABQkBAAAAB2Zyb21YMTgAAAACBQAAAAhscEFtdFgxOAUAAAAGc2NhbGU4CQEAAAAHZnJvbVgxOAAAAAIFAAAAEWV4cEFtdEFzc2V0QW10WDE4BQAAAAZhbXREY20JAQAAAAdmcm9tWDE4AAAAAgUAAAATZXhwUHJpY2VBc3NldEFtdFgxOAUAAAAIcHJpY2VEY20FAAAAC2N1clByaWNlWDE4BQAAAAtzbGlwcGFnZVgxOAUAAAAEdFJlcwQAAAAJY2FsY0xwQW10CAUAAAADcmVzAAAAAl8xBAAAAA5jYWxjQW1Bc3NldFBtdAgFAAAAA3JlcwAAAAJfMgQAAAAOY2FsY1ByQXNzZXRQbXQIBQAAAANyZXMAAAACXzMEAAAACGN1clByaWNlCQEAAAAHZnJvbVgxOAAAAAIIBQAAAANyZXMAAAACXzQFAAAABnNjYWxlOAQAAAAMc2xpcHBhZ2VDYWxjCQEAAAAHZnJvbVgxOAAAAAIIBQAAAANyZXMAAAACXzUFAAAABnNjYWxlOAMJAABnAAAAAgAAAAAAAAAAAAUAAAAJY2FsY0xwQW10CQAAAgAAAAECAAAANkludmFsaWQgY2FsY3VsYXRpb25zLiBMUCBjYWxjdWxhdGVkIGlzIGxlc3MgdGhhbiB6ZXJvLgQAAAAJZW1pdExwQW10AwkBAAAAASEAAAABBQAAAAZlbWl0THAAAAAAAAAAAAAFAAAACWNhbGNMcEFtdAQAAAAGYW1EaWZmCQAAZQAAAAIFAAAAB2luQW1BbXQFAAAADmNhbGNBbUFzc2V0UG10BAAAAAZwckRpZmYJAABlAAAAAgUAAAAHaW5QckFtdAUAAAAOY2FsY1ByQXNzZXRQbXQEAAAAC2NvbW1vblN0YXRlCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAMa2V5UHJpY2VMYXN0AAAAAAUAAAAIY3VyUHJpY2UJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAA9rZXlQcmljZUhpc3RvcnkAAAACBQAAAAZoZWlnaHQIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wBQAAAAhjdXJQcmljZQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAASa2V5UHV0QWN0aW9uQnlVc2VyAAAAAgUAAAALdXNlckFkZHJlc3MFAAAABnR4SWQ1OAkBAAAAEWRhdGFQdXRBY3Rpb25JbmZvAAAACgUAAAAOY2FsY0FtQXNzZXRQbXQFAAAADmNhbGNQckFzc2V0UG10BQAAAAllbWl0THBBbXQFAAAACGN1clByaWNlBQAAABFzbGlwcGFnZVRvbGVyYW5jZQUAAAAMc2xpcHBhZ2VDYWxjBQAAAAZoZWlnaHQIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wBQAAAAZhbURpZmYFAAAABnByRGlmZgUAAAADbmlsCQAFHwAAAA0FAAAACWNhbGNMcEFtdAUAAAAJZW1pdExwQW10BQAAAAhjdXJQcmljZQUAAAAJYW1CYWxhbmNlBQAAAAlwckJhbGFuY2UFAAAACmxwRW1pc3Npb24FAAAABGxwSWQFAAAACnBvb2xTdGF0dXMFAAAAC2NvbW1vblN0YXRlBQAAAAZhbURpZmYFAAAABnByRGlmZgUAAAAGaW5BbUlkBQAAAAZpblBySWQBAAAAG3ZhbGlkYXRlTWF0Y2hlck9yZGVyQWxsb3dlZAAAAAEAAAAFb3JkZXIEAAAAA2NmZwkBAAAADWdldFBvb2xDb25maWcAAAAABAAAAAphbXRBc3NldElkCQABkQAAAAIFAAAAA2NmZwUAAAAJaWR4QW1Bc0lkBAAAAAxwcmljZUFzc2V0SWQJAAGRAAAAAgUAAAADY2ZnBQAAAAlpZHhQckFzSWQEAAAACnBvb2xTdGF0dXMJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAANjZmcFAAAADWlkeFBvb2xTdGF0dXMEAAAAC2FtdEFzc2V0RGNtCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAADY2ZnBQAAAAtpZHhBbXRBc0RjbQQAAAANcHJpY2VBc3NldERjbQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAA2NmZwUAAAANaWR4UHJpY2VBc0RjbQQAAAASYWNjQW10QXNzZXRCYWxhbmNlCQEAAAANZ2V0QWNjQmFsYW5jZQAAAAEFAAAACmFtdEFzc2V0SWQEAAAAFGFjY1ByaWNlQXNzZXRCYWxhbmNlCQEAAAANZ2V0QWNjQmFsYW5jZQAAAAEFAAAADHByaWNlQXNzZXRJZAQAAAALY3VyUHJpY2VYMTgDCQAAAAAAAAIIBQAAAAVvcmRlcgAAAAlvcmRlclR5cGUFAAAAA0J1eQkBAAAAEHByaXZhdGVDYWxjUHJpY2UAAAAEBQAAAAthbXRBc3NldERjbQUAAAANcHJpY2VBc3NldERjbQkAAGQAAAACBQAAABJhY2NBbXRBc3NldEJhbGFuY2UIBQAAAAVvcmRlcgAAAAZhbW91bnQFAAAAFGFjY1ByaWNlQXNzZXRCYWxhbmNlCQEAAAAQcHJpdmF0ZUNhbGNQcmljZQAAAAQFAAAAC2FtdEFzc2V0RGNtBQAAAA1wcmljZUFzc2V0RGNtCQAAZQAAAAIFAAAAEmFjY0FtdEFzc2V0QmFsYW5jZQgFAAAABW9yZGVyAAAABmFtb3VudAUAAAAUYWNjUHJpY2VBc3NldEJhbGFuY2UEAAAACGN1clByaWNlCQEAAAAHZnJvbVgxOAAAAAIFAAAAC2N1clByaWNlWDE4BQAAAAZzY2FsZTgDAwMJAQAAABBpc0dsb2JhbFNodXRkb3duAAAAAAYJAAAAAAAAAgUAAAAKcG9vbFN0YXR1cwUAAAATUG9vbE1hdGNoZXJEaXNhYmxlZAYJAAAAAAAAAgUAAAAKcG9vbFN0YXR1cwUAAAAMUG9vbFNodXRkb3duCQAAAgAAAAECAAAAHEV4Y2hhbmdlIG9wZXJhdGlvbnMgZGlzYWJsZWQEAAAADW9yZGVyQW10QXNzZXQICAUAAAAFb3JkZXIAAAAJYXNzZXRQYWlyAAAAC2Ftb3VudEFzc2V0BAAAABBvcmRlckFtdEFzc2V0U3RyAwkAAAAAAAACBQAAAA1vcmRlckFtdEFzc2V0BQAAAAR1bml0AgAAAAVXQVZFUwkAAlgAAAABCQEAAAAFdmFsdWUAAAABBQAAAA1vcmRlckFtdEFzc2V0BAAAAA9vcmRlclByaWNlQXNzZXQICAUAAAAFb3JkZXIAAAAJYXNzZXRQYWlyAAAACnByaWNlQXNzZXQEAAAAEm9yZGVyUHJpY2VBc3NldFN0cgMJAAAAAAAAAgUAAAAPb3JkZXJQcmljZUFzc2V0BQAAAAR1bml0AgAAAAVXQVZFUwkAAlgAAAABCQEAAAAFdmFsdWUAAAABBQAAAA9vcmRlclByaWNlQXNzZXQDAwkBAAAAAiE9AAAAAgUAAAAQb3JkZXJBbXRBc3NldFN0cgUAAAAKYW10QXNzZXRJZAYJ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AAIJAAE5AAAAAgkAATkAAAACCQABNgAAAAEA//////////wFAAAAA0FtQgUAAAAHZGl2UGFydAUAAAABTQAAABEAAAABaQEAAAALY29uc3RydWN0b3IAAAACAAAAD2ZhY3RvcnlDb250cmFjdAAAABBtYW5hZ2VyUHVibGljS2V5AwkBAAAAAiE9AAAAAggFAAAAAWkAAAAGY2FsbGVyBQAAAAR0aGlzCQAAAgAAAAECAAAAEnBlcm1pc3Npb25zIGRlbmllZAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAALa2V5RmFjdENudHIAAAAABQAAAA9mYWN0b3J5Q29udHJhY3QJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAE2tleU1hbmFnZXJQdWJsaWNLZXkAAAAABQAAABBtYW5hZ2VyUHVibGljS2V5BQAAAANuaWwAAAABaQEAAAADcHV0AAAAAgAAAAhzbGlwcGFnZQAAAAlhdXRvU3Rha2UEAAAAB2ZhY3RDZmcJAQAAABBnZXRGYWN0b3J5Q29uZmlnAAAAAAQAAAALc3Rha2luZ0NudHIJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABCQABkQAAAAIFAAAAB2ZhY3RDZmcFAAAAD2lkeEZhY3RTdGFrQ250cgIAAAAhRXJyb3IuIEluY29ycmVjdCBzdGFraW5nIGFkZHJlc3MuBAAAAAhzbGlwQ250cgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEJgAAAAEJAAGRAAAAAgUAAAAHZmFjdENmZwUAAAAQaWR4RmFjdFNsaXBwQ250cgIAAAArRXJyb3IuIEluY29ycmVjdCBzbGlwcGFnZSBjb250cmFjdCBhZGRyZXNzLgMJAABmAAAAAgAAAAAAAAAAAAUAAAAIc2xpcHBhZ2UJAAACAAAAAQIAAAAgSW52YWxpZCBzbGlwcGFnZVRvbGVyYW5jZSBwYXNzZWQEAAAABmVzdFB1dAkBAAAACWNvbW1vblB1dAAAAAMFAAAAAWkFAAAACHNsaXBwYWdlBgQAAAAJZW1pdExwQW10CAUAAAAGZXN0UHV0AAAAAl8yBAAAAAlscEFzc2V0SWQIBQAAAAZlc3RQdXQAAAACXzcEAAAA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AAAAAAAAAAQAAAAKcG10QXNzZXRJZAkAAlgAAAABCQEAAAAFdmFsdWUAAAABCAUAAAADcG10AAAAB2Fzc2V0SWQEAAAABnBtdEFtdAgFAAAAA3BtdAAAAAZhbW91bnQEAAAADmFtQXNzZXRTd2FwWDE4CQEAAAAFdG9YMTgAAAACBQAAAAtpbkFtdEFtb3VudAUAAAAFYW1EY20EAAAADnByQXNzZXRTd2FwWDE4CQEAAAAFdG9YMTgAAAACBQAAAAppblByQW1vdW50BQAAAAVwckRjbQQAAAAHaW5QcmljZQkBAAAAD2NhbGNQcmljZUJpZ0ludAAAAAIFAAAADnByQXNzZXRTd2FwWDE4BQAAAA5hbUFzc2V0U3dhcFgxOAQAAAAJYW1CYWxhbmNlCQEAAAANZ2V0QWNjQmFsYW5jZQAAAAEFAAAABGFtSWQEAAAADGFtQmFsYW5jZVgxOAkBAAAABXRvWDE4AAAAAgUAAAAJYW1CYWxhbmNlBQAAAAVhbURjbQQAAAAJcHJCYWxhbmNlCQEAAAANZ2V0QWNjQmFsYW5jZQAAAAEFAAAABHBySWQEAAAADHByQmFsYW5jZVgxOAkBAAAABXRvWDE4AAAAAgUAAAAJcHJCYWxhbmNlBQAAAAVwckRjbQQAAAAEZEN1cgkBAAAABWNhbGNEAAAABQUAAAAMYW1CYWxhbmNlWDE4BQAAAAVhbURjbQUAAAAMcHJCYWxhbmNlWDE4BQAAAAVwckRjbQAAAAAAAAAAMgQAAAAHaXNWYWxpZAMJAAAAAAAAAgUAAAAKcG10QXNzZXRJZAUAAAAEYW1JZAQAAAAJcG10QW10WDE4CQEAAAAFdG9YMTgAAAACBQAAAAZwbXRBbXQFAAAABWFtRGNtBAAAAAdwckFkaWZmBQAAAA5wckFzc2V0U3dhcFgxOAQAAAAHYW1BZGlmZgkAATgAAAACBQAAAAlwbXRBbXRYMTgFAAAADmFtQXNzZXRTd2FwWDE4BAAAAARkTmV3CQEAAAAFY2FsY0QAAAAFCQABNwAAAAIFAAAADGFtQmFsYW5jZVgxOAUAAAAHYW1BZGlmZgUAAAAFYW1EY20JAAE4AAAAAgUAAAAMcHJCYWxhbmNlWDE4BQAAAAdwckFkaWZmBQAAAAVwckRjbQAAAAAAAAAAMgMGCQAAAgAAAAEJAAEs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BQAAAARhbUlkBAAAABdwclN3b3BQYXJ0SW5BbW91bnRBc3NldAkAAGUAAAACBQAAAA9yZXN1bHRBbXRBbW91bnQFAAAACG91dEFtQW10BAAAAAdjb252UmVzCQABPAAAAAMJAQAAAAV0b1gxOAAAAAIFAAAAF3ByU3dvcFBhcnRJbkFtb3VudEFzc2V0BQAAAAVhbURjbQUAAAAMc3dhcFByaWNlWDE4BQAAAAdzY2FsZTE4BAAAAAtwckFzc2V0RGlmZgkAATwAAAADCQABOAAAAAIFAAAAB2NvbnZSZXMFAAAADnByQXNzZXRTd2FwWDE4BQAAAAxzY2FsZThCaWdJbnQFAAAADnByQXNzZXRTd2FwWDE4BAAAAAhhbXRBc1JlcwkBAAAAB2Zyb21YMTgAAAACCQABPAAAAAMJAQAAAAV0b1gxOAAAAAIFAAAACG91dFByQW10BQAAAAVwckRjbQUAAAAHc2NhbGUxOAUAAAAMc3dhcFByaWNlWDE4BQAAAAVhbURjbQMDCQABPwAAAAIFAAAAC3ByQXNzZXREaWZmBQAAAAljYWxjRXJyb3IGCQABPwAAAAIJAAE+AAAAAQUAAAAJY2FsY0Vycm9yBQAAAAtwckFzc2V0RGlmZgkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAABtTbGlwcGFnZSBleGVlZGVkIHRoZSB2YWx1ZSAJAAGmAAAAAQUAAAAJY2FsY0Vycm9yAgAAAA4gYW5kIGVxdWFsIHRvIAkAAaYAAAABBQAAAAtwckFzc2V0RGlmZgkAAGQAAAACBQAAAAhhbXRBc1JlcwUAAAAIb3V0QW1BbXQEAAAAFmFtU3dvcFBhcnRJblByaWNlQXNzZXQJAABlAAAAAgUAAAAOcmVzdWx0UHJBbW91bnQFAAAACG91dFByQW10BAAAAAdjb252UmVzCQABPAAAAAMJAQAAAAV0b1gxOAAAAAIFAAAAFmFtU3dvcFBhcnRJblByaWNlQXNzZXQFAAAABWFtRGNtBQAAAAdzY2FsZTE4BQAAAAxzd2FwUHJpY2VYMTgEAAAAB3ByQXNSZXMJAQAAAAdmcm9tWDE4AAAAAgkAATwAAAADCQEAAAAFdG9YMTgAAAACBQAAAAhvdXRBbUFtdAUAAAAFYW1EY20FAAAADHN3YXBQcmljZVgxOAUAAAAHc2NhbGUxOAUAAAAFcHJEY20EAAAAC2FtQXNzZXREaWZmCQABPAAAAAMJAAE4AAAAAgUAAAAHY29udlJlcwUAAAAOYW1Bc3NldFN3YXBYMTgFAAAADHNjYWxlOEJpZ0ludAUAAAAOYW1Bc3NldFN3YXBYMTgDAwkAAT8AAAACBQAAAAthbUFzc2V0RGlmZgUAAAAJY2FsY0Vycm9yBgkAAT8AAAACCQABPgAAAAEFAAAACWNhbGNFcnJvcgUAAAALYW1Bc3NldERpZmYJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAbU2xpcHBhZ2UgZXhlZWRlZCB0aGUgdmFsdWUgCQABpgAAAAEFAAAACWNhbGNFcnJvcgIAAAAOIGFuZCBlcXVhbCB0byAJAAGmAAAAAQUAAAALYW1Bc3NldERpZmYJAABkAAAAAgUAAAAHcHJBc1JlcwUAAAAIb3V0UHJBbXQEAAAACWFtQmFsYW5jZQkBAAAADWdldEFjY0JhbGFuY2UAAAABBQAAAARhbUlkBAAAAAxhbUJhbGFuY2VYMTgJAQAAAAV0b1gxOAAAAAIFAAAACWFtQmFsYW5jZQUAAAAFYW1EY20EAAAACXByQmFsYW5jZQkBAAAADWdldEFjY0JhbGFuY2UAAAABBQAAAARwcklkBAAAAAxwckJhbGFuY2VYMTgJAQAAAAV0b1gxOAAAAAIFAAAACXByQmFsYW5jZQUAAAAFcHJEY20EAAAAC2N1clByaWNlWDE4CQEAAAAPY2FsY1ByaWNlQmlnSW50AAAAAgUAAAAMcHJCYWxhbmNlWDE4BQAAAAxhbUJhbGFuY2VYMTgEAAAACGN1clByaWNlCQEAAAAHZnJvbVgxOAAAAAIFAAAAC2N1clByaWNlWDE4BQAAAAZzY2FsZTgEAAAABXN0YXRlCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAC3VzZXJBZGRyZXNzBQAAAAZ0b3RhbFIDCQAAAAAAAAIFAAAADXJlc3VsdEFzc2V0SWQCAAAABVdBVkVTBQAAAAR1bml0CQACWQAAAAEFAAAADXJlc3VsdEFzc2V0SWQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEmtleUdldEFjdGlvbkJ5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AgUAAAAGcHJpY2VzAAAAAAAAAAABCQAETAAAAAIJAAGmAAAAAQkAAZEAAAACBQAAAAZwcmljZXMAAAAAAAAAAAIFAAAAA25pbAAAAAFpAQAAABZmcm9tWDE4V3JhcHBlclJFQURPTkxZAAAAAgAAAAN2YWwAAAAPcmVzdWx0U2NhbGVNdWx0CQAFFAAAAAIFAAAAA25pbAkBAAAAB2Zyb21YMTgAAAACCQABpwAAAAEFAAAAA3ZhbAUAAAAPcmVzdWx0U2NhbGVNdWx0AAAAAWkBAAAAFHRvWDE4V3JhcHBlclJFQURPTkxZAAAAAgAAAAdvcmlnVmFsAAAADW9yaWdTY2FsZU11bHQJAAUUAAAAAgUAAAADbmlsCQABpgAAAAEJAQAAAAV0b1gxOAAAAAIFAAAAB29yaWdWYWwFAAAADW9yaWdTY2FsZU11bHQAAAABaQEAAAAeY2FsY1ByaWNlQmlnSW50V3JhcHBlclJFQURPTkxZAAAAAgAAAAhwckFtdFgxOAAAAAhhbUFtdFgxOAkABRQAAAACBQAAAANuaWwJAAGmAAAAAQkBAAAAD2NhbGNQcmljZUJpZ0ludAAAAAIJAAGnAAAAAQUAAAAIcHJBbXRYMTgJAAGnAAAAAQUAAAAIYW1BbXRYMTgAAAABaQEAAAAjZXN0aW1hdGVQdXRPcGVyYXRpb25XcmFwcGVyUkVBRE9OTFkAAAAKAAAABnR4SWQ1OAAAAAhzbGlwcGFnZQAAAAdpbkFtQW10AAAABmluQW1JZAAAAAdpblByQW10AAAABmluUHJJZAAAAAt1c2VyQWRkcmVzcwAAAAppc0V2YWx1YXRlAAAABmVtaXRMcAAAAAppc09uZUFzc2V0CQAFFAAAAAIFAAAAA25pbAkBAAAAFGVzdGltYXRlUHV0T3BlcmF0aW9uAAAACgUAAAAGdHhJZDU4BQAAAAhzbGlwcGFnZQUAAAAHaW5BbUFtdAUAAAAGaW5BbUlkBQAAAAdpblByQW10BQAAAAZpblBySWQFAAAAC3VzZXJBZGRyZXNzBQAAAAppc0V2YWx1YXRlBQAAAAZlbWl0THAFAAAACmlzT25lQXNzZXQAAAABaQEAAAAjZXN0aW1hdGVHZXRPcGVyYXRpb25XcmFwcGVyUkVBRE9OTFkAAAAEAAAABnR4SWQ1OAAAAApwbXRBc3NldElkAAAACHBtdExwQW10AAAAC3VzZXJBZGRyZXNzBAAAAANyZXMJAQAAABRlc3RpbWF0ZUdldE9wZXJhdGlvbgAAAAQFAAAABnR4SWQ1OAUAAAAKcG10QXNzZXRJZAUAAAAIcG10THBBbXQJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAAC3VzZXJBZGRyZXNzCQAFFAAAAAIFAAAAA25pbAkABRwAAAAKCAUAAAADcmVzAAAAAl8xCAUAAAADcmVzAAAAAl8yCAUAAAADcmVzAAAAAl8zCAUAAAADcmVzAAAAAl80CAUAAAADcmVzAAAAAl81CAUAAAADcmVzAAAAAl82CAUAAAADcmVzAAAAAl83CQABpgAAAAEIBQAAAANyZXMAAAACXzgIBQAAAANyZXMAAAACXzkIBQAAAANyZXMAAAADXzEwAAAAAQAAAAJ0eAEAAAAGdmVyaWZ5AAAAAAQAAAAHJG1hdGNoMAUAAAACdHgDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABU9yZGVyBAAAAAVvcmRlcgUAAAAHJG1hdGNoMAQAAAAKbWF0Y2hlclB1YgkBAAAAE2dldE1hdGNoZXJQdWJPckZhaWwAAAAABAAAAApvcmRlclZhbGlkCQEAAAAbdmFsaWRhdGVNYXRjaGVyT3JkZXJBbGxvd2VkAAAAAQUAAAAFb3JkZXIEAAAAC3NlbmRlclZhbGlkCQAB9AAAAAMIBQAAAAVvcmRlcgAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAABW9yZGVyAAAABnByb29mcwAAAAAAAAAAAAgFAAAABW9yZGVyAAAAD3NlbmRlclB1YmxpY0tleQQAAAAMbWF0Y2hlclZhbGlkCQAB9AAAAAMIBQAAAAVvcmRlcgAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAABW9yZGVyAAAABnByb29mcwAAAAAAAAAAAQUAAAAKbWF0Y2hlclB1YgMDAwUAAAAKb3JkZXJWYWxpZAUAAAALc2VuZGVyVmFsaWQHBQAAAAxtYXRjaGVyVmFsaWQHBgkBAAAAD3Rocm93T3JkZXJFcnJvcgAAAAMFAAAACm9yZGVyVmFsaWQFAAAAC3NlbmRlclZhbGlkBQAAAAxtYXRjaGVyVmFsaWQEAAAADW1hbmFnZXJQdWJsaWMJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwkBAAAAE2tleU1hbmFnZXJQdWJsaWNLZXkAAAAABQAAAAVFTVBUWQMJAAAAAAAAAgUAAAANbWFuYWdlclB1YmxpYwUAAAAFRU1QVFkJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAACAUAAAACdHgAAAAPc2VuZGVyUHVibGljS2V5CQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAkAAlkAAAABBQAAAA1tYW5hZ2VyUHVibGljOPnLGQ==", "chainId": 84, "height": 1844282, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8H9sdnZngpi31dMnsgTzNGJXtTqjkgcUMSwJ14VvWh4Q Next: A4dWsfNTcv9eMyDMVcjVi6gibE39ZHRJ8yQLh4tsieFZ Diff:
OldNewDifferences
477477 let amAdiff = (pmtAmtX18 - amAssetSwapX18)
478478 let dNew = calcD((amBalanceX18 + amAdiff), amDcm, (prBalanceX18 - prAdiff), prDcm, 50)
479479 if (true)
480- then throw(((((((((((("dCur = " + toString(dCur)) + " dNew = ") + toString(dNew)) + " amBalanceX18 - amAdiff = ") + toString((amBalanceX18 - amAdiff))) + " prBalanceX18 + prAdiff= ") + toString((prBalanceX18 + prAdiff))) + "amBalanceX18 = ") + toString(amBalanceX18)) + "prBalanceX18 = ") + toString(prBalanceX18)))
480+ then throw(((((((((((("dCur = " + toString(dCur)) + " dNew = ") + toString(dNew)) + " amBalanceX18 + amAdiff = ") + toString((amBalanceX18 - amAdiff))) + " prBalanceX18 - prAdiff= ") + toString((prBalanceX18 + prAdiff))) + "amBalanceX18 = ") + toString(amBalanceX18)) + "prBalanceX18 = ") + toString(prBalanceX18)))
481481 else if ((dNew > dCur))
482482 then throw("Incorrect argiments passed. Deposit lead to D decrease.")
483483 else true
486486 let pmtPrX18 = toX18(pmtAmt, prDcm)
487487 let prAdiff = (prAssetSwapX18 - pmtPrX18)
488488 let amAdiff = amAssetSwapX18
489- let dNew = calcD((amBalanceX18 + amAdiff), amDcm, (prBalanceX18 - prAdiff), prDcm, 50)
489+ let dNew = calcD((amBalanceX18 - amAdiff), amDcm, (prBalanceX18 + prAdiff), prDcm, 50)
490490 if (true)
491- then throw(((("dCur = " + toString(dCur)) + " dNew") + toString(dNew)))
491+ then throw(((((((((((("dCur = " + toString(dCur)) + " dNew = ") + toString(dNew)) + " amBalanceX18 - amAdiff = ") + toString((amBalanceX18 - amAdiff))) + " prBalanceX18 + prAdiff= ") + toString((prBalanceX18 + prAdiff))) + "amBalanceX18 = ") + toString(amBalanceX18)) + "prBalanceX18 = ") + toString(prBalanceX18)))
492492 else if ((dNew > dCur))
493493 then throw("Incorrect argiments passed. Deposit lead to D decrease.")
494494 else true
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 func toX18 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
5353
5454
5555 func fromX18 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
5656
5757
5858 func toScale (amt,resScale,curScale) = fraction(amt, resScale, curScale)
5959
6060
6161 func abs (val) = if ((zeroBigInt > val))
6262 then -(val)
6363 else val
6464
6565
6666 func keyFactCntr () = "%s__factoryContract"
6767
6868
6969 func keyManagerPublicKey () = "%s__managerPublicKey"
7070
7171
7272 func keyPriceLast () = "%s%s__price__last"
7373
7474
7575 func keyPriceHistory (h,timestamp) = makeString(["%s%s%d%d__price__history", toString(h), toString(timestamp)], SEP)
7676
7777
7878 func keyPutActionByUser (userAddress,txId) = ((("%s%s%s__P__" + userAddress) + "__") + txId)
7979
8080
8181 func keyGetActionByUser (userAddress,txId) = ((("%s%s%s__G__" + userAddress) + "__") + txId)
8282
8383
8484 func keyAmtAsset () = "%s__amountAsset"
8585
8686
8787 func keyPriceAsset () = "%s__priceAsset"
8888
8989
9090 func keyFactoryConfig () = "%s__factoryConfig"
9191
9292
9393 func keyMatcherPub () = "%s%s__matcher__publicKey"
9494
9595
9696 func keyPoolConfig (iAmtAsset,iPriceAsset) = (((("%d%d%s__" + iAmtAsset) + "__") + iPriceAsset) + "__config")
9797
9898
9999 func keyMappingsBaseAsset2internalId (baseAssetStr) = ("%s%s%s__mappings__baseAsset2internalId__" + baseAssetStr)
100100
101101
102102 func keyAllPoolsShutdown () = "%s__shutdown"
103103
104104
105105 func keyPoolWeight (contractAddress) = ("%s%s__poolWeight__" + contractAddress)
106106
107107
108108 func throwOrderError (orderValid,senderValid,matcherValid) = throw(((((("order validation failed: orderValid=" + toString(orderValid)) + " senderValid=") + toString(senderValid)) + " matcherValid=") + toString(matcherValid)))
109109
110110
111111 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
112112
113113
114114 func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
115115
116116
117117 let factoryContract = addressFromStringValue(getStringOrFail(this, keyFactCntr()))
118118
119119 func isGlobalShutdown () = valueOrElse(getBoolean(factoryContract, keyAllPoolsShutdown()), false)
120120
121121
122122 func getMatcherPubOrFail () = fromBase58String(getStringOrFail(factoryContract, keyMatcherPub()))
123123
124124
125125 func getPoolConfig () = {
126126 let amtAs = getStringOrFail(this, keyAmtAsset())
127127 let priceAs = getStringOrFail(this, keyPriceAsset())
128128 let iPriceAs = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(priceAs))
129129 let iAmtAs = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(amtAs))
130130 split(getStringOrFail(factoryContract, keyPoolConfig(toString(iAmtAs), toString(iPriceAs))), SEP)
131131 }
132132
133133
134134 func getFactoryConfig () = split(getStringOrFail(factoryContract, keyFactoryConfig()), SEP)
135135
136136
137137 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)
138138
139139
140140 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)
141141
142142
143143 func getAccBalance (assetId) = if ((assetId == "WAVES"))
144144 then wavesBalance(this).available
145145 else assetBalance(this, fromBase58String(assetId))
146146
147147
148148 func calcPriceBigInt (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
149149
150150
151151 func privateCalcPrice (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
152152 let amtAsAmtX18 = toX18(amAmt, amAssetDcm)
153153 let prAsAmtX18 = toX18(prAmt, prAssetDcm)
154154 calcPriceBigInt(prAsAmtX18, amtAsAmtX18)
155155 }
156156
157157
158158 func calcPrices (amAmt,prAmt,lpAmt) = {
159159 let cfg = getPoolConfig()
160160 let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
161161 let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
162162 let priceX18 = privateCalcPrice(amtAsDcm, prAsDcm, amAmt, prAmt)
163163 let amAmtX18 = toX18(amAmt, amtAsDcm)
164164 let prAmtX18 = toX18(prAmt, prAsDcm)
165165 let lpAmtX18 = toX18(lpAmt, scale8)
166166 let lpPrInAmAsX18 = calcPriceBigInt(amAmtX18, lpAmtX18)
167167 let lpPrInPrAsX18 = calcPriceBigInt(prAmtX18, lpAmtX18)
168168 [priceX18, lpPrInAmAsX18, lpPrInPrAsX18]
169169 }
170170
171171
172172 func calculatePrices (amAmt,prAmt,lpAmt) = {
173173 let prices = calcPrices(amAmt, prAmt, lpAmt)
174174 [fromX18(prices[0], scale8), fromX18(prices[1], scale8), fromX18(prices[2], scale8)]
175175 }
176176
177177
178178 func estimateGetOperation (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
179179 let cfg = getPoolConfig()
180180 let lpId = cfg[idxLPAsId]
181181 let amId = cfg[idxAmAsId]
182182 let prId = cfg[idxPrAsId]
183183 let amDcm = parseIntValue(cfg[idxAmtAsDcm])
184184 let prDcm = parseIntValue(cfg[idxPriceAsDcm])
185185 let poolStatus = cfg[idxPoolStatus]
186186 let lpEmission = valueOrErrorMessage(assetInfo(fromBase58String(lpId)), (("Asset " + lpId) + " doesn't exist")).quantity
187187 if ((lpId != pmtAssetId))
188188 then throw("Invalid asset passed.")
189189 else {
190190 let amBalance = getAccBalance(amId)
191191 let amBalanceX18 = toX18(amBalance, amDcm)
192192 let prBalance = getAccBalance(prId)
193193 let prBalanceX18 = toX18(prBalance, prDcm)
194194 let curPriceX18 = calcPriceBigInt(prBalanceX18, amBalanceX18)
195195 let curPrice = fromX18(curPriceX18, scale8)
196196 let pmtLpAmtX18 = toX18(pmtLpAmt, scale8)
197197 let lpEmissionX18 = toX18(lpEmission, scale8)
198198 let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissionX18)
199199 let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissionX18)
200200 let outAmAmt = fromX18(outAmAmtX18, amDcm)
201201 let outPrAmt = fromX18(outPrAmtX18, prDcm)
202202 let state = if ((txId58 == ""))
203203 then nil
204204 else [ScriptTransfer(userAddress, outAmAmt, if ((amId == "WAVES"))
205205 then unit
206206 else fromBase58String(amId)), ScriptTransfer(userAddress, outPrAmt, if ((prId == "WAVES"))
207207 then unit
208208 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)]
209209 $Tuple10(outAmAmt, outPrAmt, amId, prId, amBalance, prBalance, lpEmission, curPriceX18, poolStatus, state)
210210 }
211211 }
212212
213213
214214 func estimatePutOperation (txId58,slippageTolerance,inAmAmt,inAmId,inPrAmt,inPrId,userAddress,isEvaluate,emitLp,isOneAsset) = {
215215 let cfg = getPoolConfig()
216216 let lpId = fromBase58String(cfg[idxLPAsId])
217217 let amIdStr = cfg[idxAmAsId]
218218 let prIdStr = cfg[idxPrAsId]
219219 let inAmIdStr = cfg[idxIAmtAsId]
220220 let inPrIdStr = cfg[idxIPriceAsId]
221221 let amtDcm = parseIntValue(cfg[idxAmtAsDcm])
222222 let priceDcm = parseIntValue(cfg[idxPriceAsDcm])
223223 let poolStatus = cfg[idxPoolStatus]
224224 let lpEmission = valueOrErrorMessage(assetInfo(lpId), (("Asset " + toBase58String(lpId)) + " doesn't exist")).quantity
225225 let amBalance = if (isEvaluate)
226226 then getAccBalance(amIdStr)
227227 else (getAccBalance(amIdStr) - inAmAmt)
228228 let prBalance = if (isEvaluate)
229229 then getAccBalance(prIdStr)
230230 else (getAccBalance(prIdStr) - inPrAmt)
231231 let inAmAssetAmtX18 = toX18(inAmAmt, amtDcm)
232232 let inPrAssetAmtX18 = toX18(inPrAmt, priceDcm)
233233 let userPriceX18 = calcPriceBigInt(inPrAssetAmtX18, inAmAssetAmtX18)
234234 let amBalanceX18 = toX18(amBalance, amtDcm)
235235 let prBalanceX18 = toX18(prBalance, priceDcm)
236236 let res = if ((lpEmission == 0))
237237 then {
238238 let curPriceX18 = zeroBigInt
239239 let slippageX18 = zeroBigInt
240240 let lpAmtX18 = pow((inAmAssetAmtX18 * inPrAssetAmtX18), 0, toBigInt(5), 1, 0, DOWN)
241241 $Tuple5(fromX18(lpAmtX18, scale8), fromX18(inAmAssetAmtX18, amtDcm), fromX18(inPrAssetAmtX18, priceDcm), calcPriceBigInt((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
242242 }
243243 else {
244244 let tRes = if (isOneAsset)
245245 then {
246246 let lpEmissionX18 = toX18(lpEmission, scale8)
247247 let sumInAssets = (inAmAssetAmtX18 + inPrAssetAmtX18)
248248 let sumPoolBalances = (amBalanceX18 + prBalanceX18)
249249 let lpAmtX18 = fraction(lpEmissionX18, sumInAssets, sumPoolBalances)
250250 let curPriceX18 = calcPriceBigInt(prBalanceX18, amBalanceX18)
251251 $Tuple5(fromX18(lpAmtX18, scale8), inAmAmt, inPrAmt, curPriceX18, toBigInt(0))
252252 }
253253 else {
254254 let curPriceX18 = calcPriceBigInt(prBalanceX18, amBalanceX18)
255255 let slippageX18 = fraction(abs((curPriceX18 - userPriceX18)), scale18, curPriceX18)
256256 let slippageToleranceX18 = toX18(slippageTolerance, scale8)
257257 if (if ((curPriceX18 != zeroBigInt))
258258 then (slippageX18 > slippageToleranceX18)
259259 else false)
260260 then throw(((("Price slippage " + toString(slippageX18)) + " exceeded the passed limit of ") + toString(slippageToleranceX18)))
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 tRes
275275 }
276276 let calcLpAmt = res._1
277277 let calcAmAssetPmt = res._2
278278 let calcPrAssetPmt = res._3
279279 let curPrice = fromX18(res._4, scale8)
280280 let slippageCalc = fromX18(res._5, scale8)
281281 if ((0 >= calcLpAmt))
282282 then throw("Invalid calculations. LP calculated is less than zero.")
283283 else {
284284 let emitLpAmt = if (!(emitLp))
285285 then 0
286286 else calcLpAmt
287287 let amDiff = (inAmAmt - calcAmAssetPmt)
288288 let prDiff = (inPrAmt - calcPrAssetPmt)
289289 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))]
290290 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEmission, lpId, poolStatus, commonState, amDiff, prDiff, inAmId, inPrId)
291291 }
292292 }
293293
294294
295295 func validateMatcherOrderAllowed (order) = {
296296 let cfg = getPoolConfig()
297297 let amtAssetId = cfg[idxAmAsId]
298298 let priceAssetId = cfg[idxPrAsId]
299299 let poolStatus = parseIntValue(cfg[idxPoolStatus])
300300 let amtAssetDcm = parseIntValue(cfg[idxAmtAsDcm])
301301 let priceAssetDcm = parseIntValue(cfg[idxPriceAsDcm])
302302 let accAmtAssetBalance = getAccBalance(amtAssetId)
303303 let accPriceAssetBalance = getAccBalance(priceAssetId)
304304 let curPriceX18 = if ((order.orderType == Buy))
305305 then privateCalcPrice(amtAssetDcm, priceAssetDcm, (accAmtAssetBalance + order.amount), accPriceAssetBalance)
306306 else privateCalcPrice(amtAssetDcm, priceAssetDcm, (accAmtAssetBalance - order.amount), accPriceAssetBalance)
307307 let curPrice = fromX18(curPriceX18, scale8)
308308 if (if (if (isGlobalShutdown())
309309 then true
310310 else (poolStatus == PoolMatcherDisabled))
311311 then true
312312 else (poolStatus == PoolShutdown))
313313 then throw("Exchange operations disabled")
314314 else {
315315 let orderAmtAsset = order.assetPair.amountAsset
316316 let orderAmtAssetStr = if ((orderAmtAsset == unit))
317317 then "WAVES"
318318 else toBase58String(value(orderAmtAsset))
319319 let orderPriceAsset = order.assetPair.priceAsset
320320 let orderPriceAssetStr = if ((orderPriceAsset == unit))
321321 then "WAVES"
322322 else toBase58String(value(orderPriceAsset))
323323 if (if ((orderAmtAssetStr != amtAssetId))
324324 then true
325325 else (orderPriceAssetStr != priceAssetId))
326326 then throw("Wrong order assets.")
327327 else {
328328 let orderPrice = order.price
329329 let priceDcm = fraction(scale8, priceAssetDcm, amtAssetDcm)
330330 let castedOrderPrice = toScale(orderPrice, scale8, priceDcm)
331331 let isOrderPriceValid = if ((order.orderType == Buy))
332332 then (curPrice >= castedOrderPrice)
333333 else (castedOrderPrice >= curPrice)
334334 true
335335 }
336336 }
337337 }
338338
339339
340340 func commonGet (i) = if ((size(i.payments) != 1))
341341 then throw("exactly 1 payment is expected")
342342 else {
343343 let pmt = value(i.payments[0])
344344 let pmtAssetId = value(pmt.assetId)
345345 let pmtAmt = pmt.amount
346346 let res = estimateGetOperation(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
347347 let outAmAmt = res._1
348348 let outPrAmt = res._2
349349 let poolStatus = parseIntValue(res._9)
350350 let state = res._10
351351 if (if (isGlobalShutdown())
352352 then true
353353 else (poolStatus == PoolShutdown))
354354 then throw(("Get operation is blocked by admin. Status = " + toString(poolStatus)))
355355 else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state)
356356 }
357357
358358
359359 func commonPut (i,slippageTolerance,emitLp) = if ((size(i.payments) != 2))
360360 then throw("exactly 2 payments are expected")
361361 else {
362362 let amAssetPmt = value(i.payments[0])
363363 let prAssetPmt = value(i.payments[1])
364364 let estPut = estimatePutOperation(toBase58String(i.transactionId), slippageTolerance, amAssetPmt.amount, amAssetPmt.assetId, prAssetPmt.amount, prAssetPmt.assetId, toString(i.caller), false, emitLp, false)
365365 let status = parseIntValue(estPut._8)
366366 if (if (if (isGlobalShutdown())
367367 then true
368368 else (status == PoolPutDisabled))
369369 then true
370370 else (status == PoolShutdown))
371371 then throw(("Put operation is blocked by admin. Status = " + toString(status)))
372372 else estPut
373373 }
374374
375375
376376 func calcD (a,aDec,b,bDec,lVal) = {
377377 let l = toBigInt(lVal)
378378 let val4 = toBigInt(4)
379379 let val2 = toBigInt(2)
380380 let val3 = toBigInt(3)
381381 let ApB = (a + b)
382382 let AmB = fraction(a, b, scale18)
383383 let l41 = ((val4 * l) - oneBigInt)
384384 let lApBpow = (((l * l) * ApB) * ApB)
385385 let AmbL41pow = (AmB * pow((l41 / val3), 0, val3, 0, 0, DOWN))
386386 let lAmpApb = ((l * AmB) * ApB)
387387 let rPart = (AmB * pow((AmbL41pow + lApBpow), 0, toBigInt(5), 1, 0, DOWN))
388388 let M = (val2 * pow((lAmpApb + rPart), 0, toBigInt(333), 3, 0, DOWN))
389389 let divPart = (l41 / (val3 * M))
390390 (((toBigInt(-4) * AmB) * divPart) + M)
391391 }
392392
393393
394394 @Callable(i)
395395 func constructor (factoryContract,managerPublicKey) = if ((i.caller != this))
396396 then throw("permissions denied")
397397 else [StringEntry(keyFactCntr(), factoryContract), StringEntry(keyManagerPublicKey(), managerPublicKey)]
398398
399399
400400
401401 @Callable(i)
402402 func put (slippage,autoStake) = {
403403 let factCfg = getFactoryConfig()
404404 let stakingCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactStakCntr]), "Error. Incorrect staking address.")
405405 let slipCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactSlippCntr]), "Error. Incorrect slippage contract address.")
406406 if ((0 > slippage))
407407 then throw("Invalid slippageTolerance passed")
408408 else {
409409 let estPut = commonPut(i, slippage, true)
410410 let emitLpAmt = estPut._2
411411 let lpAssetId = estPut._7
412412 let state = estPut._9
413413 let amDiff = estPut._10
414414 let prDiff = estPut._11
415415 let amId = estPut._12
416416 let prId = estPut._13
417417 let emitInv = invoke(factoryContract, "emit", [emitLpAmt], nil)
418418 if ((emitInv == emitInv))
419419 then {
420420 let slippageAInv = if ((amDiff > 0))
421421 then invoke(slipCntr, "put", nil, [AttachedPayment(amId, amDiff)])
422422 else nil
423423 if ((slippageAInv == slippageAInv))
424424 then {
425425 let slippagePInv = if ((prDiff > 0))
426426 then invoke(slipCntr, "put", nil, [AttachedPayment(prId, prDiff)])
427427 else nil
428428 if ((slippagePInv == slippagePInv))
429429 then {
430430 let lpTrnsfr = if (autoStake)
431431 then {
432432 let slpStakeInv = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
433433 if ((slpStakeInv == slpStakeInv))
434434 then nil
435435 else throw("Strict value is not equal to itself.")
436436 }
437437 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
438438 (state ++ lpTrnsfr)
439439 }
440440 else throw("Strict value is not equal to itself.")
441441 }
442442 else throw("Strict value is not equal to itself.")
443443 }
444444 else throw("Strict value is not equal to itself.")
445445 }
446446 }
447447
448448
449449
450450 @Callable(i)
451451 func putOneTkn (inAmtAmount,inPrAmount,autoStake) = {
452452 let cfg = getFactoryConfig()
453453 let stakingContract = valueOrErrorMessage(addressFromString(cfg[idxFactStakCntr]), "Error. Incorrect staking address.")
454454 let poolCfg = getPoolConfig()
455455 let amId = poolCfg[idxAmAsId]
456456 let prId = poolCfg[idxPrAsId]
457457 let amDcm = parseIntValue(poolCfg[idxAmtAsDcm])
458458 let prDcm = parseIntValue(poolCfg[idxPriceAsDcm])
459459 if ((size(i.payments) != 1))
460460 then throw("exactly 1 payment is expected")
461461 else {
462462 let pmt = value(i.payments[0])
463463 let pmtAssetId = toBase58String(value(pmt.assetId))
464464 let pmtAmt = pmt.amount
465465 let amAssetSwapX18 = toX18(inAmtAmount, amDcm)
466466 let prAssetSwapX18 = toX18(inPrAmount, prDcm)
467467 let inPrice = calcPriceBigInt(prAssetSwapX18, amAssetSwapX18)
468468 let amBalance = getAccBalance(amId)
469469 let amBalanceX18 = toX18(amBalance, amDcm)
470470 let prBalance = getAccBalance(prId)
471471 let prBalanceX18 = toX18(prBalance, prDcm)
472472 let dCur = calcD(amBalanceX18, amDcm, prBalanceX18, prDcm, 50)
473473 let isValid = if ((pmtAssetId == amId))
474474 then {
475475 let pmtAmtX18 = toX18(pmtAmt, amDcm)
476476 let prAdiff = prAssetSwapX18
477477 let amAdiff = (pmtAmtX18 - amAssetSwapX18)
478478 let dNew = calcD((amBalanceX18 + amAdiff), amDcm, (prBalanceX18 - prAdiff), prDcm, 50)
479479 if (true)
480- then throw(((((((((((("dCur = " + toString(dCur)) + " dNew = ") + toString(dNew)) + " amBalanceX18 - amAdiff = ") + toString((amBalanceX18 - amAdiff))) + " prBalanceX18 + prAdiff= ") + toString((prBalanceX18 + prAdiff))) + "amBalanceX18 = ") + toString(amBalanceX18)) + "prBalanceX18 = ") + toString(prBalanceX18)))
480+ then throw(((((((((((("dCur = " + toString(dCur)) + " dNew = ") + toString(dNew)) + " amBalanceX18 + amAdiff = ") + toString((amBalanceX18 - amAdiff))) + " prBalanceX18 - prAdiff= ") + toString((prBalanceX18 + prAdiff))) + "amBalanceX18 = ") + toString(amBalanceX18)) + "prBalanceX18 = ") + toString(prBalanceX18)))
481481 else if ((dNew > dCur))
482482 then throw("Incorrect argiments passed. Deposit lead to D decrease.")
483483 else true
484484 }
485485 else {
486486 let pmtPrX18 = toX18(pmtAmt, prDcm)
487487 let prAdiff = (prAssetSwapX18 - pmtPrX18)
488488 let amAdiff = amAssetSwapX18
489- let dNew = calcD((amBalanceX18 + amAdiff), amDcm, (prBalanceX18 - prAdiff), prDcm, 50)
489+ let dNew = calcD((amBalanceX18 - amAdiff), amDcm, (prBalanceX18 + prAdiff), prDcm, 50)
490490 if (true)
491- then throw(((("dCur = " + toString(dCur)) + " dNew") + toString(dNew)))
491+ then throw(((((((((((("dCur = " + toString(dCur)) + " dNew = ") + toString(dNew)) + " amBalanceX18 - amAdiff = ") + toString((amBalanceX18 - amAdiff))) + " prBalanceX18 + prAdiff= ") + toString((prBalanceX18 + prAdiff))) + "amBalanceX18 = ") + toString(amBalanceX18)) + "prBalanceX18 = ") + toString(prBalanceX18)))
492492 else if ((dNew > dCur))
493493 then throw("Incorrect argiments passed. Deposit lead to D decrease.")
494494 else true
495495 }
496496 if (!(isValid))
497497 then throw("Errors.")
498498 else {
499499 let estPut = estimatePutOperation(toBase58String(i.transactionId), 0, inAmtAmount, fromBase58String(amId), inPrAmount, fromBase58String(prId), toString(i.caller), false, true, true)
500500 let emitLpAmt = estPut._2
501501 let lpAssetId = estPut._7
502502 let status = parseIntValue(estPut._8)
503503 if (if (if (isGlobalShutdown())
504504 then true
505505 else (status == PoolPutDisabled))
506506 then true
507507 else (status == PoolShutdown))
508508 then throw(("Put operation is blocked by admin. Status = " + toString(status)))
509509 else {
510510 let emitInv = invoke(factoryContract, "emit", [emitLpAmt], nil)
511511 if ((emitInv == emitInv))
512512 then {
513513 let lpTrnsfr = if (autoStake)
514514 then {
515515 let stakeInv = invoke(stakingContract, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
516516 if ((stakeInv == stakeInv))
517517 then nil
518518 else throw("Strict value is not equal to itself.")
519519 }
520520 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
521521 (estPut._9 ++ lpTrnsfr)
522522 }
523523 else throw("Strict value is not equal to itself.")
524524 }
525525 }
526526 }
527527 }
528528
529529
530530
531531 @Callable(i)
532532 func putForFree (maxSlippage) = if ((0 > maxSlippage))
533533 then throw("Invalid value passed")
534534 else {
535535 let estPut = commonPut(i, maxSlippage, false)
536536 estPut._9
537537 }
538538
539539
540540
541541 @Callable(i)
542542 func get () = {
543543 let res = commonGet(i)
544544 let outAmtAmt = res._1
545545 let outPrAmt = res._2
546546 let pmtAmt = res._3
547547 let pmtAssetId = res._4
548548 let state = res._5
549549 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
550550 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
551551 then state
552552 else throw("Strict value is not equal to itself.")
553553 }
554554
555555
556556
557557 @Callable(i)
558558 func getOneTkn (amAssetSwap,prAssetSwap,outAmount,outAssetId) = if ((size(i.payments) != 1))
559559 then throw("exactly 1 payment is expected")
560560 else {
561561 let cfg = getPoolConfig()
562562 let lpId = cfg[idxLPAsId]
563563 let amId = cfg[idxAmAsId]
564564 let prId = cfg[idxPrAsId]
565565 let amDcm = parseIntValue(cfg[idxAmtAsDcm])
566566 let prDcm = parseIntValue(cfg[idxPriceAsDcm])
567567 let poolStatus = cfg[idxPoolStatus]
568568 if (if ((outAssetId != amId))
569569 then (outAssetId != prId)
570570 else false)
571571 then throw(("Incorrect out asset id passed: " + outAssetId))
572572 else {
573573 let resultAssetId = if ((outAssetId == amId))
574574 then amId
575575 else prId
576576 let resultAmtAmount = if ((outAssetId == amId))
577577 then outAmount
578578 else 0
579579 let resultPrAmount = if ((outAssetId == prId))
580580 then outAmount
581581 else 0
582582 let pmt = value(i.payments[0])
583583 let userAddress = i.caller
584584 let txId58 = toBase58String(i.transactionId)
585585 let pmtAssetId = value(pmt.assetId)
586586 let pmtAmt = pmt.amount
587587 if ((lpId != toBase58String(pmtAssetId)))
588588 then throw("Invalid asset passed.")
589589 else {
590590 let amAssetSwapX18 = toX18(amAssetSwap, amDcm)
591591 let prAssetSwapX18 = toX18(prAssetSwap, prDcm)
592592 let swapPriceX18 = calcPriceBigInt(prAssetSwapX18, amAssetSwapX18)
593593 let r = estimateGetOperation(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
594594 let outAmAmt = r._1
595595 let outPrAmt = r._2
596596 let totalR = if ((outAssetId == amId))
597597 then {
598598 let prSwopPartInAmountAsset = (resultAmtAmount - outAmAmt)
599599 let convRes = fraction(toX18(prSwopPartInAmountAsset, amDcm), swapPriceX18, scale18)
600600 let prAssetDiff = fraction((convRes - prAssetSwapX18), scale8BigInt, prAssetSwapX18)
601601 let amtAsRes = fromX18(fraction(toX18(outPrAmt, prDcm), scale18, swapPriceX18), amDcm)
602602 if (if ((prAssetDiff > calcError))
603603 then true
604604 else (-(calcError) > prAssetDiff))
605605 then throw(((("Slippage exeeded the value " + toString(calcError)) + " and equal to ") + toString(prAssetDiff)))
606606 else (amtAsRes + outAmAmt)
607607 }
608608 else {
609609 let amSwopPartInPriceAsset = (resultPrAmount - outPrAmt)
610610 let convRes = fraction(toX18(amSwopPartInPriceAsset, amDcm), scale18, swapPriceX18)
611611 let prAsRes = fromX18(fraction(toX18(outAmAmt, amDcm), swapPriceX18, scale18), prDcm)
612612 let amAssetDiff = fraction((convRes - amAssetSwapX18), scale8BigInt, amAssetSwapX18)
613613 if (if ((amAssetDiff > calcError))
614614 then true
615615 else (-(calcError) > amAssetDiff))
616616 then throw(((("Slippage exeeded the value " + toString(calcError)) + " and equal to ") + toString(amAssetDiff)))
617617 else (prAsRes + outPrAmt)
618618 }
619619 let amBalance = getAccBalance(amId)
620620 let amBalanceX18 = toX18(amBalance, amDcm)
621621 let prBalance = getAccBalance(prId)
622622 let prBalanceX18 = toX18(prBalance, prDcm)
623623 let curPriceX18 = calcPriceBigInt(prBalanceX18, amBalanceX18)
624624 let curPrice = fromX18(curPriceX18, scale8)
625625 let state = [ScriptTransfer(userAddress, totalR, if ((resultAssetId == "WAVES"))
626626 then unit
627627 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)]
628628 let burn = invoke(factoryContract, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
629629 if ((burn == burn))
630630 then state
631631 else throw("Strict value is not equal to itself.")
632632 }
633633 }
634634 }
635635
636636
637637
638638 @Callable(i)
639639 func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = {
640640 let res = commonGet(i)
641641 let outAmAmt = res._1
642642 let outPrAmt = res._2
643643 let pmtAmt = res._3
644644 let pmtAssetId = res._4
645645 let state = res._5
646646 if ((noLessThenAmtAsset > outAmAmt))
647647 then throw(((("noLessThenAmtAsset failed: " + toString(outAmAmt)) + " < ") + toString(noLessThenAmtAsset)))
648648 else if ((noLessThenPriceAsset > outPrAmt))
649649 then throw(((("noLessThenPriceAsset failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset)))
650650 else {
651651 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
652652 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
653653 then state
654654 else throw("Strict value is not equal to itself.")
655655 }
656656 }
657657
658658
659659
660660 @Callable(i)
661661 func unstakeAndGet (amount) = {
662662 let checkPayments = if ((size(i.payments) != 0))
663663 then throw("No payments are expected")
664664 else true
665665 if ((checkPayments == checkPayments))
666666 then {
667667 let cfg = getPoolConfig()
668668 let factoryCfg = getFactoryConfig()
669669 let lpAssetId = fromBase58String(cfg[idxLPAsId])
670670 let stakingContract = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Error. Incorrect staking address.")
671671 let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(lpAssetId), amount], nil)
672672 if ((unstakeInv == unstakeInv))
673673 then {
674674 let res = estimateGetOperation(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
675675 let poolStatus = parseIntValue(res._9)
676676 let state = res._10
677677 let checkPoolStatus = if (if (isGlobalShutdown())
678678 then true
679679 else (poolStatus == PoolShutdown))
680680 then throw(("Get operation is blocked by admin. Status = " + toString(poolStatus)))
681681 else true
682682 if ((checkPoolStatus == checkPoolStatus))
683683 then {
684684 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
685685 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
686686 then state
687687 else throw("Strict value is not equal to itself.")
688688 }
689689 else throw("Strict value is not equal to itself.")
690690 }
691691 else throw("Strict value is not equal to itself.")
692692 }
693693 else throw("Strict value is not equal to itself.")
694694 }
695695
696696
697697
698698 @Callable(i)
699699 func activate (amtAssetStr,priceAssetStr) = if ((toString(i.caller) != toString(factoryContract)))
700700 then throw("permissions denied")
701701 else $Tuple2([StringEntry(keyAmtAsset(), amtAssetStr), StringEntry(keyPriceAsset(), priceAssetStr)], "success")
702702
703703
704704
705705 @Callable(i)
706706 func getPoolConfigWrapperREADONLY () = $Tuple2(nil, getPoolConfig())
707707
708708
709709
710710 @Callable(i)
711711 func getAccBalanceWrapperREADONLY (assetId) = $Tuple2(nil, getAccBalance(assetId))
712712
713713
714714
715715 @Callable(i)
716716 func calcPricesWrapperREADONLY (amAmt,prAmt,lpAmt) = {
717717 let prices = calcPrices(amAmt, prAmt, lpAmt)
718718 $Tuple2(nil, [toString(prices[0]), toString(prices[1]), toString(prices[2])])
719719 }
720720
721721
722722
723723 @Callable(i)
724724 func fromX18WrapperREADONLY (val,resultScaleMult) = $Tuple2(nil, fromX18(parseBigIntValue(val), resultScaleMult))
725725
726726
727727
728728 @Callable(i)
729729 func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(toX18(origVal, origScaleMult)))
730730
731731
732732
733733 @Callable(i)
734734 func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(calcPriceBigInt(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
735735
736736
737737
738738 @Callable(i)
739739 func estimatePutOperationWrapperREADONLY (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,userAddress,isEvaluate,emitLp,isOneAsset) = $Tuple2(nil, estimatePutOperation(txId58, slippage, inAmAmt, inAmId, inPrAmt, inPrId, userAddress, isEvaluate, emitLp, isOneAsset))
740740
741741
742742
743743 @Callable(i)
744744 func estimateGetOperationWrapperREADONLY (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
745745 let res = estimateGetOperation(txId58, pmtAssetId, pmtLpAmt, addressFromStringValue(userAddress))
746746 $Tuple2(nil, $Tuple10(res._1, res._2, res._3, res._4, res._5, res._6, res._7, toString(res._8), res._9, res._10))
747747 }
748748
749749
750750 @Verifier(tx)
751751 func verify () = match tx {
752752 case order: Order =>
753753 let matcherPub = getMatcherPubOrFail()
754754 let orderValid = validateMatcherOrderAllowed(order)
755755 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
756756 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
757757 if (if (if (orderValid)
758758 then senderValid
759759 else false)
760760 then matcherValid
761761 else false)
762762 then true
763763 else throwOrderError(orderValid, senderValid, matcherValid)
764764 case _ =>
765765 let managerPublic = valueOrElse(getString(this, keyManagerPublicKey()), EMPTY)
766766 if ((managerPublic == EMPTY))
767767 then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
768768 else sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(managerPublic))
769769 }
770770

github/deemru/w8io/026f985 
99.77 ms