tx · DyQCX1BiurAc1BGfYa3qkzrzRMeSwpxg7FZ7VgVwvwAa

3N6wAa7PMFZJu4Zrmp3avXmMnRTrRpMM9Lh:  -0.01400000 Waves

2022.03.05 11:27 [1950426] smart account 3N6wAa7PMFZJu4Zrmp3avXmMnRTrRpMM9Lh > SELF 0.00000000 Waves

{ "type": 13, "id": "DyQCX1BiurAc1BGfYa3qkzrzRMeSwpxg7FZ7VgVwvwAa", "fee": 1400000, "feeAssetId": null, "timestamp": 1646468938004, "version": 1, "sender": "3N6wAa7PMFZJu4Zrmp3avXmMnRTrRpMM9Lh", "senderPublicKey": "Cr8D7eozSzJh7XHsYTjBinPpo3SS83BrCGiBAJsjGxBo", "proofs": [ "3RYPoVZepMip8VFHDc2dtL9PvGshTCwGYAj3m4fNjMoPqZtRRgCEkXujWZvJUzvbQYdrNXcbpEX52LHjoDPqzBwu" ], "script": "base64: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dAEAAAAQa2V5RmFjdG9yeUNvbmZpZwAAAAACAAAAESVzX19mYWN0b3J5Q29uZmlnAQAAAA1rZXlNYXRjaGVyUHViAAAAAAIAAAAYJXMlc19fbWF0Y2hlcl9fcHVibGljS2V5AQAAAClrZXlNYXBwaW5nUG9vbENvbnRyYWN0QWRkcmVzc1RvUG9vbEFzc2V0cwAAAAEAAAATcG9vbENvbnRyYWN0QWRkcmVzcwkAASwAAAACCQABLAAAAAICAAAACCVzJXMlc19fBQAAABNwb29sQ29udHJhY3RBZGRyZXNzAgAAACBfX21hcHBpbmdzX19wb29sQ29udHJhY3QyTHBBc3NldAEAAAANa2V5UG9vbENvbmZpZwAAAAIAAAAJaUFtdEFzc2V0AAAAC2lQcmljZUFzc2V0CQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACCVkJWQlc19fBQAAAAlpQW10QXNzZXQCAAAAAl9fBQAAAAtpUHJpY2VBc3NldAIAAAAIX19jb25maWcBAAAAH2tleU1hcHBpbmdzQmFzZUFzc2V0MmludGVybmFsSWQAAAABAAAADGJhc2VBc3NldFN0cgkAASwAAAACAgAAACglcyVzJXNfX21hcHBpbmdzX19iYXNlQXNzZXQyaW50ZXJuYWxJZF9fBQAAAAxiYXNlQXNzZXRTdHIBAAAAE2tleUFsbFBvb2xzU2h1dGRvd24AAAAAAgAAAAwlc19fc2h1dGRvd24BAAAADWtleVBvb2xXZWlnaHQAAAABAAAAD2NvbnRyYWN0QWRkcmVzcwkAASwAAAACAgAAABIlcyVzX19wb29sV2VpZ2h0X18FAAAAD2NvbnRyYWN0QWRkcmVzcwEAAAAPdGhyb3dPcmRlckVycm9yAAAAAwAAAApvcmRlclZhbGlkAAAAC3NlbmRlclZhbGlkAAAADG1hdGNoZXJWYWxpZAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAkb3JkZXIgdmFsaWRhdGlvbiBmYWlsZWQ6IG9yZGVyVmFsaWQ9CQABpQAAAAEFAAAACm9yZGVyVmFsaWQCAAAADSBzZW5kZXJWYWxpZD0JAAGlAAAAAQUAAAALc2VuZGVyVmFsaWQCAAAADiBtYXRjaGVyVmFsaWQ9CQABpQAAAAEFAAAADG1hdGNoZXJWYWxpZAEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAgAAAAdhZGRyZXNzAAAAA2tleQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAAB2FkZHJlc3MFAAAAA2tleQkABLkAAAACCQAETAAAAAICAAAACm1hbmRhdG9yeSAJAARMAAAAAgkABCUAAAABBQAAAAdhZGRyZXNzCQAETAAAAAICAAAAAS4JAARMAAAAAgUAAAADa2V5CQAETAAAAAICAAAADyBpcyBub3QgZGVmaW5lZAUAAAADbmlsAgAAAAABAAAADGdldEludE9yRmFpbAAAAAIAAAAHYWRkcmVzcwAAAANrZXkJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAdhZGRyZXNzBQAAAANrZXkJAAS5AAAAAgkABEwAAAACAgAAAAptYW5kYXRvcnkgCQAETAAAAAIJAAQlAAAAAQUAAAAHYWRkcmVzcwkABEwAAAACAgAAAAEuCQAETAAAAAIFAAAAA2tleQkABEwAAAACAgAAAA8gaXMgbm90IGRlZmluZWQFAAAAA25pbAIAAAAAAAAAAA9mYWN0b3J5Q29udHJhY3QJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEJAQAAAA9nZXRTdHJpbmdPckZhaWwAAAACBQAAAAR0aGlzCQEAAAACZmMAAAAAAQAAABBpc0dsb2JhbFNodXRkb3duAAAAAAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBsAAAACBQAAAA9mYWN0b3J5Q29udHJhY3QJAQAAABNrZXlBbGxQb29sc1NodXRkb3duAAAAAAcBAAAAE2dldE1hdGNoZXJQdWJPckZhaWwAAAAACQACWQAAAAEJAQAAAA9nZXRTdHJpbmdPckZhaWwAAAACBQAAAA9mYWN0b3J5Q29udHJhY3QJAQAAAA1rZXlNYXRjaGVyUHViAAAAAAEAAAANZ2V0UG9vbENvbmZpZwAAAAAEAAAACGFtdEFzc2V0CQEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAgUAAAAEdGhpcwkBAAAAAmFhAAAAAAQAAAAKcHJpY2VBc3NldAkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAIFAAAABHRoaXMJAQAAAAJwYQAAAAAEAAAAC2lQcmljZUFzc2V0CQEAAAAMZ2V0SW50T3JGYWlsAAAAAgUAAAAPZmFjdG9yeUNvbnRyYWN0CQEAAAAfa2V5TWFwcGluZ3NCYXNlQXNzZXQyaW50ZXJuYWxJZAAAAAEFAAAACnByaWNlQXNzZXQEAAAACWlBbXRBc3NldAkBAAAADGdldEludE9yRmFpbAAAAAIFAAAAD2ZhY3RvcnlDb250cmFjdAkBAAAAH2tleU1hcHBpbmdzQmFzZUFzc2V0MmludGVybmFsSWQAAAABBQAAAAhhbXRBc3NldAkABLUAAAACCQEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAgUAAAAPZmFjdG9yeUNvbnRyYWN0CQEAAAANa2V5UG9vbENvbmZpZwAAAAIJAAGkAAAAAQUAAAAJaUFtdEFzc2V0CQABpAAAAAEFAAAAC2lQcmljZUFzc2V0BQAAAANTRVABAAAAEGdldEZhY3RvcnlDb25maWcAAAAACQAEtQAAAAIJAQAAAA9nZXRTdHJpbmdPckZhaWwAAAACBQAAAA9mYWN0b3J5Q29udHJhY3QJAQAAABBrZXlGYWN0b3J5Q29uZmlnAAAAAAUAAAADU0VQAQAAABFkYXRhUHV0QWN0aW9uSW5mbwAAAAoAAAANaW5BbXRBc3NldEFtdAAAAA9pblByaWNlQXNzZXRBbXQAAAAIb3V0THBBbXQAAAAFcHJpY2UAAAAdc2xpcHBhZ2VUb2xlcmFuY2VQYXNzZWRCeVVzZXIAAAAVc2xpcHBhZ2VUb2xlcmFuY2VSZWFsAAAACHR4SGVpZ2h0AAAAC3R4VGltZXN0YW1wAAAAEnNsaXBhZ2VBbXRBc3NldEFtdAAAABRzbGlwYWdlUHJpY2VBc3NldEFtdAkABLkAAAACCQAETAAAAAICAAAAFCVkJWQlZCVkJWQlZCVkJWQlZCVkCQAETAAAAAIJAAGkAAAAAQUAAAANaW5BbXRBc3NldEFtdAkABEwAAAACCQABpAAAAAEFAAAAD2luUHJpY2VBc3NldEFtdAkABEwAAAACCQABpAAAAAEFAAAACG91dExwQW10CQAETAAAAAIJAAGkAAAAAQUAAAAFcHJpY2UJAARMAAAAAgkAAaQAAAABBQAAAB1zbGlwcGFnZVRvbGVyYW5jZVBhc3NlZEJ5VXNlcgkABEwAAAACCQABpAAAAAEFAAAAFXNsaXBwYWdlVG9sZXJhbmNlUmVhbAkABEwAAAACCQABpAAAAAEFAAAACHR4SGVpZ2h0CQAETAAAAAIJAAGkAAAAAQUAAAALdHhUaW1lc3RhbXAJAARMAAAAAgkAAaQAAAABBQAAABJzbGlwYWdlQW10QXNzZXRBbXQJAARMAAAAAgkAAaQAAAABBQAAABRzbGlwYWdlUHJpY2VBc3NldEFtdAUAAAADbmlsBQAAAANTRVABAAAAEWRhdGFHZXRBY3Rpb25JbmZvAAAABgAAAA5vdXRBbXRBc3NldEFtdAAAABBvdXRQcmljZUFzc2V0QW10AAAAB2luTHBBbXQAAAAFcHJpY2UAAAAIdHhIZWlnaHQAAAALdHhUaW1lc3RhbXAJAAS5AAAAAgkABEwAAAACAgAAAAwlZCVkJWQlZCVkJWQJAARMAAAAAgkAAaQAAAABBQAAAA5vdXRBbXRBc3NldEFtdAkABEwAAAACCQABpAAAAAEFAAAAEG91dFByaWNlQXNzZXRBbXQJAARMAAAAAgkAAaQAAAABBQAAAAdpbkxwQW10CQAETAAAAAIJAAGkAAAAAQUAAAAFcHJpY2UJAARMAAAAAgkAAaQAAAABBQAAAAh0eEhlaWdodAkABEwAAAACCQABpAAAAAEFAAAAC3R4VGltZXN0YW1wBQAAAANuaWwFAAAAA1NFUAEAAAANZ2V0QWNjQmFsYW5jZQAAAAEAAAAHYXNzZXRJZAMJAAAAAAAAAgUAAAAHYXNzZXRJZAIAAAAFV0FWRVMICQAD7wAAAAEFAAAABHRoaXMAAAAJYXZhaWxhYmxlCQAD8AAAAAIFAAAABHRoaXMJAAJZAAAAAQUAAAAHYXNzZXRJZAEAAAAPY2FsY1ByaWNlQmlnSW50AAAAAgAAAAhwckFtdFgxOAAAAAhhbUFtdFgxOAkAATwAAAADBQAAAAhwckFtdFgxOAUAAAAHc2NhbGUxOAUAAAAIYW1BbXRYMTgBAAAAEHByaXZhdGVDYWxjUHJpY2UAAAAEAAAACmFtQXNzZXREY20AAAAKcHJBc3NldERjbQAAAAVhbUFtdAAAAAVwckFtdAQAAAAOYW10QXNzZXRBbXRYMTgJAQAAAAV0b1gxOAAAAAIFAAAABWFtQW10BQAAAAphbUFzc2V0RGNtBAAAABBwcmljZUFzc2V0QW10WDE4CQEAAAAFdG9YMTgAAAACBQAAAAVwckFtdAUAAAAKcHJBc3NldERjbQkBAAAAD2NhbGNQcmljZUJpZ0ludAAAAAIFAAAAEHByaWNlQXNzZXRBbXRYMTgFAAAADmFtdEFzc2V0QW10WDE4AQAAAApjYWxjUHJpY2VzAAAAAwAAAAVhbUFtdAAAAAVwckFtdAAAAAVscEFtdAQAAAADY2ZnCQEAAAANZ2V0UG9vbENvbmZpZwAAAAAEAAAAC2FtdEFzc2V0RGNtCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAADY2ZnBQAAAA5pZHhBbXRBc3NldERjbQQAAAANcHJpY2VBc3NldERjbQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAA2NmZwUAAAAQaWR4UHJpY2VBc3NldERjbQQAAAAIcHJpY2VYMTgJAQAAABBwcml2YXRlQ2FsY1ByaWNlAAAABAUAAAALYW10QXNzZXREY20FAAAADXByaWNlQXNzZXREY20FAAAABWFtQW10BQAAAAVwckFtdAQAAAAIYW1BbXRYMTgJAQAAAAV0b1gxOAAAAAIFAAAABWFtQW10BQAAAAthbXRBc3NldERjbQQAAAAIcHJBbXRYMTgJAQAAAAV0b1gxOAAAAAIFAAAABXByQW10BQAAAA1wcmljZUFzc2V0RGNtBAAAAAhscEFtdFgxOAkBAAAABXRvWDE4AAAAAgUAAAAFbHBBbXQFAAAABnNjYWxlOAQAAAATbHBQcmljZUluQW1Bc3NldFgxOAkBAAAAD2NhbGNQcmljZUJpZ0ludAAAAAIFAAAACGFtQW10WDE4BQAAAAhscEFtdFgxOAQAAAATbHBQcmljZUluUHJBc3NldFgxOAkBAAAAD2NhbGNQcmljZUJpZ0ludAAAAAIFAAAACHByQW10WDE4BQAAAAhscEFtdFgxOAkABEwAAAACBQAAAAhwcmljZVgxOAkABEwAAAACBQAAABNscFByaWNlSW5BbUFzc2V0WDE4CQAETAAAAAIFAAAAE2xwUHJpY2VJblByQXNzZXRYMTgFAAAAA25pbAEAAAAPY2FsY3VsYXRlUHJpY2VzAAAAAwAAAAVhbUFtdAAAAAVwckFtdAAAAAVscEFtdAQAAAAGcHJpY2VzCQEAAAAKY2FsY1ByaWNlcwAAAAMFAAAABWFtQW10BQAAAAVwckFtdAUAAAAFbHBBbXQJAARMAAAAAgkBAAAAB2Zyb21YMTgAAAACCQABkQAAAAIFAAAABnByaWNlcwAAAAAAAAAAAAUAAAAGc2NhbGU4CQAETAAAAAIJAQAAAAdmcm9tWDE4AAAAAgkAAZEAAAACBQAAAAZwcmljZXMAAAAAAAAAAAEFAAAABnNjYWxlOAkABEwAAAACCQEAAAAHZnJvbVgxOAAAAAIJAAGRAAAAAgUAAAAGcHJpY2VzAAAAAAAAAAACBQAAAAZzY2FsZTgFAAAAA25pbAEAAAAUZXN0aW1hdGVHZXRPcGVyYXRpb24AAAAEAAAABnR4SWQ1OAAAAApwbXRBc3NldElkAAAACHBtdExwQW10AAAAC3VzZXJBZGRyZXNzBAAAAANjZmcJAQAAAA1nZXRQb29sQ29uZmlnAAAAAAQAAAAJbHBBc3NldElkCQABkQAAAAIFAAAAA2NmZwUAAAAQaWR4UG9vbExQQXNzZXRJZAQAAAAJYW1Bc3NldElkCQABkQAAAAIFAAAAA2NmZwUAAAANaWR4QW10QXNzZXRJZAQAAAAJcHJBc3NldElkCQABkQAAAAIFAAAAA2NmZwUAAAAPaWR4UHJpY2VBc3NldElkBAAAAAphbUFzc2V0RGNtCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAADY2ZnBQAAAA5pZHhBbXRBc3NldERjbQQAAAAKcHJBc3NldERjbQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAA2NmZwUAAAAQaWR4UHJpY2VBc3NldERjbQQAAAAKcG9vbFN0YXR1cwkAAZEAAAACBQAAAANjZmcFAAAADWlkeFBvb2xTdGF0dXMEAAAACmxwRW1pc3Npb24ICQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAPsAAAAAQkAAlkAAAABBQAAAAlscEFzc2V0SWQJAAEsAAAAAgkAASwAAAACAgAAAAZBc3NldCAFAAAACWxwQXNzZXRJZAIAAAAOIGRvZXNuJ3QgZXhpc3QAAAAIcXVhbnRpdHkDCQEAAAACIT0AAAACBQAAAAlscEFzc2V0SWQFAAAACnBtdEFzc2V0SWQJAAACAAAAAQIAAAAVSW52YWxpZCBhc3NldCBwYXNzZWQuBAAAAAlhbUJhbGFuY2UJAQAAAA1nZXRBY2NCYWxhbmNlAAAAAQUAAAAJYW1Bc3NldElkBAAAAAxhbUJhbGFuY2VYMTgJAQAAAAV0b1gxOAAAAAIFAAAACWFtQmFsYW5jZQUAAAAKYW1Bc3NldERjbQQAAAAJcHJCYWxhbmNlCQEAAAANZ2V0QWNjQmFsYW5jZQAAAAEFAAAACXByQXNzZXRJZAQAAAAMcHJCYWxhbmNlWDE4CQEAAAAFdG9YMTgAAAACBQAAAAlwckJhbGFuY2UFAAAACnByQXNzZXREY20EAAAAC2N1clByaWNlWDE4CQEAAAAPY2FsY1ByaWNlQmlnSW50AAAAAgUAAAAMcHJCYWxhbmNlWDE4BQAAAAxhbUJhbGFuY2VYMTgEAAAACGN1clByaWNlCQEAAAAHZnJvbVgxOAAAAAIFAAAAC2N1clByaWNlWDE4BQAAAAZzY2FsZTgEAAAAC3BtdExwQW10WDE4CQEAAAAFdG9YMTgAAAACBQAAAAhwbXRMcEFtdAUAAAAGc2NhbGU4BAAAAA1scEVtaXNzaW9uWDE4CQEAAAAFdG9YMTgAAAACBQAAAApscEVtaXNzaW9uBQAAAAZzY2FsZTgEAAAAC291dEFtQW10WDE4CQABPAAAAAMFAAAADGFtQmFsYW5jZVgxOAUAAAALcG10THBBbXRYMTgFAAAADWxwRW1pc3Npb25YMTgEAAAAC291dFByQW10WDE4CQABPAAAAAMFAAAADHByQmFsYW5jZVgxOAUAAAALcG10THBBbXRYMTgFAAAADWxwRW1pc3Npb25YMTgEAAAACG91dEFtQW10CQEAAAAHZnJvbVgxOAAAAAIFAAAAC291dEFtQW10WDE4BQAAAAphbUFzc2V0RGNtBAAAAAhvdXRQckFtdAkBAAAAB2Zyb21YMTgAAAACBQAAAAtvdXRQckFtdFgxOAUAAAAKcHJBc3NldERjbQQAAAAFc3RhdGUDCQAAAAAAAAIFAAAABnR4SWQ1OAIAAAAABQAAAANuaWwJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAALdXNlckFkZHJlc3MFAAAACG91dEFtQW10AwkAAAAAAAACBQAAAAlhbUFzc2V0SWQCAAAABVdBVkVTBQAAAAR1bml0CQACWQAAAAEFAAAACWFtQXNzZXRJZAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAAt1c2VyQWRkcmVzcwUAAAAIb3V0UHJBbXQDCQAAAAAAAAIFAAAACXByQXNzZXRJZAIAAAAFV0FWRVMFAAAABHVuaXQJAAJZAAAAAQUAAAAJcHJBc3NldElkCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAANnYXUAAAACCQAEJQAAAAEFAAAAC3VzZXJBZGRyZXNzBQAAAAZ0eElkNTgJAQAAABFkYXRhR2V0QWN0aW9uSW5mbwAAAAYFAAAACG91dEFtQW10BQAAAAhvdXRQckFtdAUAAAAIcG10THBBbXQFAAAACGN1clByaWNlBQAAAAZoZWlnaHQIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAACcGwAAAAABQAAAAhjdXJQcmljZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAAnBoAAAAAgUAAAAGaGVpZ2h0CAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAUAAAAIY3VyUHJpY2UFAAAAA25pbAkABRwAAAAKBQAAAAhvdXRBbUFtdAUAAAAIb3V0UHJBbXQFAAAACWFtQXNzZXRJZAUAAAAJcHJBc3NldElkBQAAAAlhbUJhbGFuY2UFAAAACXByQmFsYW5jZQUAAAAKbHBFbWlzc2lvbgUAAAALY3VyUHJpY2VYMTgFAAAACnBvb2xTdGF0dXMFAAAABXN0YXRlAQAAABRlc3RpbWF0ZVB1dE9wZXJhdGlvbgAAAAkAAAAGdHhJZDU4AAAAEXNsaXBwYWdlVG9sZXJhbmNlAAAADGluQW1Bc3NldEFtdAAAAAtpbkFtQXNzZXRJZAAAAAxpblByQXNzZXRBbXQAAAALaW5QckFzc2V0SWQAAAALdXNlckFkZHJlc3MAAAAKaXNFdmFsdWF0ZQAAAAZlbWl0THAEAAAAA2NmZwkBAAAADWdldFBvb2xDb25maWcAAAAABAAAAAlscEFzc2V0SWQJAAJZAAAAAQkAAZEAAAACBQAAAANjZmcFAAAAEGlkeFBvb2xMUEFzc2V0SWQEAAAADGFtQXNzZXRJZFN0cgkAAZEAAAACBQAAAANjZmcFAAAADWlkeEFtdEFzc2V0SWQEAAAADHByQXNzZXRJZFN0cgkAAZEAAAACBQAAAANjZmcFAAAAD2lkeFByaWNlQXNzZXRJZAQAAAALaUFtdEFzc2V0SWQJAAGRAAAAAgUAAAADY2ZnBQAAAA5pZHhJQW10QXNzZXRJZAQAAAANaVByaWNlQXNzZXRJZAkAAZEAAAACBQAAAANjZmcFAAAAEGlkeElQcmljZUFzc2V0SWQEAAAAC2FtdEFzc2V0RGNtCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAADY2ZnBQAAAA5pZHhBbXRBc3NldERjbQQAAAANcHJpY2VBc3NldERjbQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAA2NmZwUAAAAQaWR4UHJpY2VBc3NldERjbQQAAAAKcG9vbFN0YXR1cwkAAZEAAAACBQAAAANjZmcFAAAADWlkeFBvb2xTdGF0dXMEAAAACmxwRW1pc3Npb24ICQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAPsAAAAAQUAAAAJbHBBc3NldElkCQABLAAAAAIJAAEsAAAAAgIAAAAGQXNzZXQgCQACWAAAAAEFAAAACWxwQXNzZXRJZAIAAAAOIGRvZXNuJ3QgZXhpc3QAAAAIcXVhbnRpdHkEAAAADmluQW1Bc3NldElkU3RyCQACWAAAAAEJAQAAAAt2YWx1ZU9yRWxzZQAAAAIFAAAAC2luQW1Bc3NldElkCQACWQAAAAECAAAABVdBVkVTBAAAAA5pblByQXNzZXRJZFN0cgkAAlgAAAABCQEAAAALdmFsdWVPckVsc2UAAAACBQAAAAtpblByQXNzZXRJZAkAAlkAAAABAgAAAAVXQVZFUwMDCQEAAAACIT0AAAACBQAAAAxhbUFzc2V0SWRTdHIFAAAADmluQW1Bc3NldElkU3RyBgkBAAAAAiE9AAAAAgUAAAAMcHJBc3NldElkU3RyBQAAAA5pblByQXNzZXRJZFN0cgkAAAIAAAABAgAAACJJbnZhbGlkIGFtdCBvciBwcmljZSBhc3NldCBwYXNzZWQuBAAAAAlhbUJhbGFuY2UDBQAAAAppc0V2YWx1YXRlCQEAAAANZ2V0QWNjQmFsYW5jZQAAAAEFAAAADGFtQXNzZXRJZFN0cgkAAGUAAAACCQEAAAANZ2V0QWNjQmFsYW5jZQAAAAEFAAAADGFtQXNzZXRJZFN0cgUAAAAMaW5BbUFzc2V0QW10BAAAAAlwckJhbGFuY2UDBQAAAAppc0V2YWx1YXRlCQEAAAANZ2V0QWNjQmFsYW5jZQAAAAEFAAAADHByQXNzZXRJZFN0cgkAAGUAAAACCQEAAAANZ2V0QWNjQmFsYW5jZQAAAAEFAAAADHByQXNzZXRJZFN0cgUAAAAMaW5QckFzc2V0QW10BAAAAA9pbkFtQXNzZXRBbXRYMTgJAQAAAAV0b1gxOAAAAAIFAAAADGluQW1Bc3NldEFtdAUAAAALYW10QXNzZXREY20EAAAAD2luUHJBc3NldEFtdFgxOAkBAAAABXRvWDE4AAAAAgUAAAAMaW5QckFzc2V0QW10BQAAAA1wcmljZUFzc2V0RGNtBAAAAAx1c2VyUHJpY2VYMTgJAQAAAA9jYWxjUHJpY2VCaWdJbnQAAAACBQAAAA9pblByQXNzZXRBbXRYMTgFAAAAD2luQW1Bc3NldEFtdFgxOAQAAAAMYW1CYWxhbmNlWDE4CQEAAAAFdG9YMTgAAAACBQAAAAlhbUJhbGFuY2UFAAAAC2FtdEFzc2V0RGNtBAAAAAxwckJhbGFuY2VYMTgJAQAAAAV0b1gxOAAAAAIFAAAACXByQmFsYW5jZQUAAAANcHJpY2VBc3NldERjbQQAAAADcmVzAwkAAAAAAAACBQAAAApscEVtaXNzaW9uAAAAAAAAAAAABAAAAAtjdXJQcmljZVgxOAUAAAAKemVyb0JpZ0ludAQAAAALc2xpcHBhZ2VYMTgFAAAACnplcm9CaWdJbnQEAAAACGxwQW10WDE4CQAAdgAAAAYJAAE5AAAAAgUAAAAPaW5BbUFzc2V0QW10WDE4BQAAAA9pblByQXNzZXRBbXRYMTgAAAAAAAAAAAAJAAE2AAAAAQAAAAAAAAAABQAAAAAAAAAAAQAAAAAAAAAAAAUAAAAERE9XTgkABRcAAAAFCQEAAAAHZnJvbVgxOAAAAAIFAAAACGxwQW10WDE4BQAAAAZzY2FsZTgJAQAAAAdmcm9tWDE4AAAAAgUAAAAPaW5BbUFzc2V0QW10WDE4BQAAAAthbXRBc3NldERjbQkBAAAAB2Zyb21YMTgAAAACBQAAAA9pblByQXNzZXRBbXRYMTgFAAAADXByaWNlQXNzZXREY20JAQAAAA9jYWxjUHJpY2VCaWdJbnQAAAACCQABNwAAAAIFAAAADHByQmFsYW5jZVgxOAUAAAAPaW5QckFzc2V0QW10WDE4CQABNwAAAAIFAAAADGFtQmFsYW5jZVgxOAUAAAAPaW5BbUFzc2V0QW10WDE4BQAAAAtzbGlwcGFnZVgxOAQAAAALY3VyUHJpY2VYMTgJAQAAAA9jYWxjUHJpY2VCaWdJbnQAAAACBQAAAAxwckJhbGFuY2VYMTgFAAAADGFtQmFsYW5jZVgxOAQAAAALc2xpcHBhZ2VYMTgJAAE8AAAAAwkBAAAAA2FicwAAAAEJAAE4AAAAAgUAAAALY3VyUHJpY2VYMTgFAAAADHVzZXJQcmljZVgxOAUAAAAHc2NhbGUxOAUAAAALY3VyUHJpY2VYMTgEAAAAFHNsaXBwYWdlVG9sZXJhbmNlWDE4CQEAAAAFdG9YMTgAAAACBQAAABFzbGlwcGFnZVRvbGVyYW5jZQUAAAAGc2NhbGU4AwMJAQAAAAIhPQAAAAIFAAAAC2N1clByaWNlWDE4BQAAAAp6ZXJvQmlnSW50CQABPwAAAAIFAAAAC3NsaXBwYWdlWDE4BQAAABRzbGlwcGFnZVRvbGVyYW5jZVgxOAcJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAPUHJpY2Ugc2xpcHBhZ2UgCQABpgAAAAEFAAAAC3NsaXBwYWdlWDE4AgAAAB4gZXhjZWVkZWQgdGhlIHBhc3NlZCBsaW1pdCBvZiAJAAGmAAAAAQUAAAAUc2xpcHBhZ2VUb2xlcmFuY2VYMTgEAAAADWxwRW1pc3Npb25YMTgJAQAAAAV0b1gxOAAAAAIFAAAACmxwRW1pc3Npb24FAAAABnNjYWxlOAQAAAAKcHJWaWFBbVgxOAkAATwAAAADBQAAAA9pbkFtQXNzZXRBbXRYMTgFAAAAC2N1clByaWNlWDE4BQAAAAdzY2FsZTE4BAAAAAphbVZpYVByWDE4CQABPAAAAAMFAAAAD2luUHJBc3NldEFtdFgxOAUAAAAHc2NhbGUxOAUAAAALY3VyUHJpY2VYMTgEAAAADGV4cGVjdGVkQW10cwMJAAE/AAAAAgUAAAAKcHJWaWFBbVgxOAUAAAAPaW5QckFzc2V0QW10WDE4CQAFFAAAAAIFAAAACmFtVmlhUHJYMTgFAAAAD2luUHJBc3NldEFtdFgxOAkABRQAAAACBQAAAA9pbkFtQXNzZXRBbXRYMTgFAAAACnByVmlhQW1YMTgEAAAAEWV4cEFtdEFzc2V0QW10WDE4CAUAAAAMZXhwZWN0ZWRBbXRzAAAAAl8xBAAAABNleHBQcmljZUFzc2V0QW10WDE4CAUAAAAMZXhwZWN0ZWRBbXRzAAAAAl8yBAAAAAhscEFtdFgxOAkAATwAAAADBQAAAA1scEVtaXNzaW9uWDE4BQAAABNleHBQcmljZUFzc2V0QW10WDE4BQAAAAxwckJhbGFuY2VYMTgJAAUXAAAABQkBAAAAB2Zyb21YMTgAAAACBQAAAAhscEFtdFgxOAUAAAAGc2NhbGU4CQEAAAAHZnJvbVgxOAAAAAIFAAAAEWV4cEFtdEFzc2V0QW10WDE4BQAAAAthbXRBc3NldERjbQkBAAAAB2Zyb21YMTgAAAACBQAAABNleHBQcmljZUFzc2V0QW10WDE4BQAAAA1wcmljZUFzc2V0RGNtBQAAAAtjdXJQcmljZVgxOAUAAAALc2xpcHBhZ2VYMTgEAAAACWNhbGNMcEFtdAgFAAAAA3JlcwAAAAJfMQQAAAAOY2FsY0FtQXNzZXRQbXQIBQAAAANyZXMAAAACXzIEAAAADmNhbGNQckFzc2V0UG10CAUAAAADcmVzAAAAAl8zBAAAAAhjdXJQcmljZQkBAAAAB2Zyb21YMTgAAAACCAUAAAADcmVzAAAAAl80BQAAAAZzY2FsZTgEAAAADHNsaXBwYWdlQ2FsYwkBAAAAB2Zyb21YMTgAAAACCAUAAAADcmVzAAAAAl81BQAAAAZzY2FsZTgDCQAAZwAAAAIAAAAAAAAAAAAFAAAACWNhbGNMcEFtdAkAAAIAAAABAgAAADZJbnZhbGlkIGNhbGN1bGF0aW9ucy4gTFAgY2FsY3VsYXRlZCBpcyBsZXNzIHRoYW4gemVyby4EAAAACWVtaXRMcEFtdAMJAQAAAAEhAAAAAQUAAAAGZW1pdExwAAAAAAAAAAAABQAAAAljYWxjTHBBbXQEAAAABmFtRGlmZgkAAGUAAAACBQAAAAxpbkFtQXNzZXRBbXQFAAAADmNhbGNBbUFzc2V0UG10BAAAAAZwckRpZmYJAABlAAAAAgUAAAAMaW5QckFzc2V0QW10BQAAAA5jYWxjUHJBc3NldFBtdAQAAAALY29tbW9uU3RhdGUJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAAJwbAAAAAAFAAAACGN1clByaWNlCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAACcGgAAAACBQAAAAZoZWlnaHQIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wBQAAAAhjdXJQcmljZQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAADcGF1AAAAAgUAAAALdXNlckFkZHJlc3MFAAAABnR4SWQ1OAkBAAAAEWRhdGFQdXRBY3Rpb25JbmZvAAAACgUAAAAOY2FsY0FtQXNzZXRQbXQFAAAADmNhbGNQckFzc2V0UG10BQAAAAllbWl0THBBbXQFAAAACGN1clByaWNlBQAAABFzbGlwcGFnZVRvbGVyYW5jZQUAAAAMc2xpcHBhZ2VDYWxjBQAAAAZoZWlnaHQIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wBQAAAAZhbURpZmYFAAAABnByRGlmZgUAAAADbmlsCQAFHwAAAA0FAAAACWNhbGNMcEFtdAUAAAAJZW1pdExwQW10BQAAAAhjdXJQcmljZQUAAAAJYW1CYWxhbmNlBQAAAAlwckJhbGFuY2UFAAAACmxwRW1pc3Npb24FAAAACWxwQXNzZXRJZAUAAAAKcG9vbFN0YXR1cwUAAAALY29tbW9uU3RhdGUFAAAABmFtRGlmZgUAAAAGcHJEaWZmBQAAAAtpbkFtQXNzZXRJZAUAAAALaW5QckFzc2V0SWQBAAAAG3ZhbGlkYXRlTWF0Y2hlck9yZGVyQWxsb3dlZAAAAAEAAAAFb3JkZXIEAAAAA2NmZwkBAAAADWdldFBvb2xDb25maWcAAAAABAAAAAphbXRBc3NldElkCQABkQAAAAIFAAAAA2NmZwUAAAANaWR4QW10QXNzZXRJZAQAAAAMcHJpY2VBc3NldElkCQABkQAAAAIFAAAAA2NmZwUAAAAPaWR4UHJpY2VBc3NldElkBAAAAApwb29sU3RhdHVzCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAADY2ZnBQAAAA1pZHhQb29sU3RhdHVzBAAAAAthbXRBc3NldERjbQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAA2NmZwUAAAAOaWR4QW10QXNzZXREY20EAAAADXByaWNlQXNzZXREY20JAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAANjZmcFAAAAEGlkeFByaWNlQXNzZXREY20EAAAAEmFjY0FtdEFzc2V0QmFsYW5jZQkBAAAADWdldEFjY0JhbGFuY2UAAAABBQAAAAphbXRBc3NldElkBAAAABRhY2NQcmljZUFzc2V0QmFsYW5jZQkBAAAADWdldEFjY0JhbGFuY2UAAAABBQAAAAxwcmljZUFzc2V0SWQEAAAAC2N1clByaWNlWDE4AwkAAAAAAAACCAUAAAAFb3JkZXIAAAAJb3JkZXJUeXBlBQAAAANCdXkJAQAAABBwcml2YXRlQ2FsY1ByaWNlAAAABAUAAAALYW10QXNzZXREY20FAAAADXByaWNlQXNzZXREY20JAABkAAAAAgUAAAASYWNjQW10QXNzZXRCYWxhbmNlCAUAAAAFb3JkZXIAAAAGYW1vdW50BQAAABRhY2NQcmljZUFzc2V0QmFsYW5jZQkBAAAAEHByaXZhdGVDYWxjUHJpY2UAAAAEBQAAAAthbXRBc3NldERjbQUAAAANcHJpY2VBc3NldERjbQkAAGUAAAACBQAAABJhY2NBbXRBc3NldEJhbGFuY2UIBQAAAAVvcmRlcgAAAAZhbW91bnQFAAAAFGFjY1ByaWNlQXNzZXRCYWxhbmNlBAAAAAhjdXJQcmljZQkBAAAAB2Zyb21YMTgAAAACBQAAAAtjdXJQcmljZVgxOAUAAAAGc2NhbGU4AwMDCQEAAAAQaXNHbG9iYWxTaHV0ZG93bgAAAAAGCQAAAAAAAAIFAAAACnBvb2xTdGF0dXMFAAAAE1Bvb2xNYXRjaGVyRGlzYWJsZWQGCQAAAAAAAAIFAAAACnBvb2xTdGF0dXMFAAAADFBvb2xTaHV0ZG93bgkAAAIAAAABAgAAABxFeGNoYW5nZSBvcGVyYXRpb25zIGRpc2FibGVkBAAAAA1vcmRlckFtdEFzc2V0CAgFAAAABW9yZGVyAAAACWFzc2V0UGFpcgAAAAthbW91bnRBc3NldAQAAAAQb3JkZXJBbXRBc3NldFN0cgMJAAAAAAAAAgUAAAANb3JkZXJBbXRBc3NldAUAAAAEdW5pdAIAAAAFV0FWRVMJAAJYAAAAAQkBAAAABXZhbHVlAAAAAQUAAAANb3JkZXJBbXRBc3NldAQAAAAPb3JkZXJQcmljZUFzc2V0CAgFAAAABW9yZGVyAAAACWFzc2V0UGFpcgAAAApwcmljZUFzc2V0BAAAABJvcmRlclByaWNlQXNzZXRTdHIDCQAAAAAAAAIFAAAAD29yZGVyUHJpY2VBc3NldAUAAAAEdW5pdAIAAAAFV0FWRVMJAAJYAAAAAQkBAAAABXZhbHVlAAAAAQUAAAAPb3JkZXJQcmljZUFzc2V0AwMJAQAAAAIhPQAAAAIFAAAAEG9yZGVyQW10QXNzZXRTdHIFAAAACmFtdEFzc2V0SWQGCQEAAAACIT0AAAACBQAAABJvcmRlclByaWNlQXNzZXRTdHIFAAAADHByaWNlQXNzZXRJZAkAAAIAAAABAgAAABNXcm9uZyBvcmRlciBhc3NldHMuBAAAAApvcmRlclByaWNlCAUAAAAFb3JkZXIAAAAFcHJpY2UEAAAACHByaWNlRGNtCQAAawAAAAMFAAAABnNjYWxlOAUAAAANcHJpY2VBc3NldERjbQUAAAALYW10QXNzZXREY20EAAAAEGNhc3RlZE9yZGVyUHJpY2UJAQAAAAd0b1NjYWxlAAAAAwUAAAAKb3JkZXJQcmljZQUAAAAGc2NhbGU4BQAAAAhwcmljZURjbQQAAAARaXNPcmRlclByaWNlVmFsaWQDCQAAAAAAAAIIBQAAAAVvcmRlcgAAAAlvcmRlclR5cGUFAAAAA0J1eQkAAGcAAAACBQAAAAhjdXJQcmljZQUAAAAQY2FzdGVkT3JkZXJQcmljZQkAAGcAAAACBQAAABBjYXN0ZWRPcmRlclByaWNlBQAAAAhjdXJQcmljZQYBAAAACWNvbW1vbkdldAAAAAEAAAABaQMJAQAAAAIhPQAAAAIJAAGQAAAAAQgFAAAAAWkA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ACFFcnJvci4gSW5jb3JyZWN0IHN0YWtpbmcgYWRkcmVzcy4EAAAAEHNsaXBwYWdlQ29udHJhY3QJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABCQABkQAAAAIFAAAACmZhY3RvcnlDZmcFAAAAGmlkeEZhY3RvcnlTbGlwcGFnZUNvbnRyYWN0AgAAACtFcnJvci4gSW5jb3JyZWN0IHNsaXBwYWdlIGNvbnRyYWN0IGFkZHJlc3MuAwkAAGYAAAACAAAAAAAAAAAABQAAABFzbGlwcGFnZVRvbGVyYW5jZQkAAAIAAAABAgAAACBJbnZhbGlkIHNsaXBwYWdlVG9sZXJhbmNlIHBhc3NlZAQAAAAGZXN0UHV0CQEAAAAJY29tbW9uUHV0AAAAAwUAAAABaQUAAAARc2xpcHBhZ2VUb2xlcmFuY2UGBAAAAAllbWl0THBBbXQIBQAAAAZlc3RQdXQAAAACXzIEAAAACWxwQXNzZXRJZAgFAAAABmVzdFB1dAAAAAJfNwQAAAAFc3RhdGUIBQAAAAZlc3RQdXQAAAACXzkEAAAABmFtRGlmZggFAAAABmVzdFB1dAAAAANfMTAEAAAABnByRGlmZggFAAAABmVzdFB1dAAAAANfMTEEAAAABGFtSWQIBQAAAAZlc3RQdXQAAAADXzEyBAAAAARwcklkCAUAAAAGZXN0UHV0AAAAA18xMwQAAAAHZW1pdEludgkAA/wAAAAEBQAAAA9mYWN0b3J5Q29udHJhY3QCAAAABGVtaXQJAARMAAAAAgUAAAAJZW1pdExwQW10BQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAAHZW1pdEludgUAAAAHZW1pdEludgQAAAANZW1pdEludkxlZ2FjeQQAAAAHJG1hdGNoMAUAAAAHZW1pdEludgMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAHQWRkcmVzcwQAAAAVbGVnYWN5RmFjdG9yeUNvbnRyYWN0BQAAAAckbWF0Y2gwCQAD/AAAAAQFAAAAFWxlZ2FjeUZhY3RvcnlDb250cmFjdAIAAAAEZW1pdAkABEwAAAACBQAAAAllbWl0THBBbXQFAAAAA25pbAUAAAADbmlsBQAAAAR1bml0AwkAAAAAAAACBQAAAA1lbWl0SW52TGVnYWN5BQAA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dFBvb2xDb25maWcAAAAABAAAAApmYWN0b3J5Q2ZnCQEAAAAQZ2V0RmFjdG9yeUNvbmZpZwAAAAAEAAAACWxwQXNzZXRJZAkAAlkAAAABCQABkQAAAAIFAAAAA2NmZwUAAAAQaWR4UG9vbExQQXNzZXRJZAQAAAAPc3Rha2luZ0NvbnRyYWN0CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQmAAAAAQkAAZEAAAACBQAAAApmYWN0b3J5Q2ZnBQAAABlpZHhGYWN0b3J5U3Rha2luZ0NvbnRyYWN0AgAAACFFcnJvci4gSW5jb3JyZWN0IHN0YWtpbmcgYWRkcmVzcy4EAAAACnVuc3Rha2VJbnYJAAP8AAAABAUAAAAPc3Rha2luZ0NvbnRyYWN0AgAAAAd1bnN0YWtlCQAETAAAAAIJAAJYAAAAAQUAAAAJbHBBc3NldElkCQAETAAAAAIFAAAABmFtb3VudAUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAACnVuc3Rha2VJbnYFAAAACnVuc3Rha2VJbnYEAAAAA3JlcwkBAAAAFGVzdGltYXRlR2V0T3BlcmF0aW9uAAAABAkAAlgAAAABCAUAAAABaQAAAA10cmFuc2FjdGlvbklkCQACWAAAAAEFAAAACWxwQXNzZXRJZAUAAAAGYW1vdW50CAUAAAABaQAAAAZjYWxsZXIEAAAACnBvb2xTdGF0dXMJAQAAAA1wYXJzZUludFZhbHVlAAAAAQgFAAAAA3JlcwAAAAJfOQQAAAAFc3RhdGUIBQAAAANyZXMAAAADXzEwBAAAAA9jaGVja1Bvb2xTdGF0dXMDAwkBAAAAEGlzR2xvYmFsU2h1dGRvd24AAAAABgkAAAAAAAACBQAAAApwb29sU3RhdHVzBQAAAAxQb29sU2h1dGRvd24JAAACAAAAAQkAASwAAAACAgAAACxHZXQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgYWRtaW4uIFN0YXR1cyA9IAkAAaQAAAABBQAAAApwb29sU3RhdHVzBgMJAAAAAAAAAgUAAAAPY2hlY2tQb29sU3RhdHVzBQAAAA9jaGVja1Bvb2xTdGF0dXMEAAAAFGJ1cm5MUEFzc2V0T25GYWN0b3J5CQAD/AAAAAQFAAAAD2ZhY3RvcnlDb250cmFj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Y2ZnBQAAAA5pZHhBbXRBc3NldERjbQQAAAANcHJpY2VBc3NldERjbQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAA2NmZwUAAAAQaWR4UHJpY2VBc3NldERjbQQAAAANcG9vbExQQmFsYW5jZQgJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkAA+wAAAABBQAAAAlscEFzc2V0SWQJAAEsAAAAAgkAASwAAAACAgAAAAZBc3NldCAJAAJYAAAAAQUAAAAJbHBBc3NldElkAgAAAA4gZG9lc24ndCBleGlzdAAAAAhxdWFudGl0eQQAAAASYWNjQW10QXNzZXRCYWxhbmNlCQEAAAANZ2V0QWNjQmFsYW5jZQAAAAEFAAAACmFtdEFzc2V0SWQEAAAAFGFjY1ByaWNlQXNzZXRCYWxhbmNlCQEAAAANZ2V0QWNjQmFsYW5jZQAAAAEFAAAADHByaWNlQXNzZXRJZAQAAAAKcHJpY2VzTGlzdAMJAAAAAAAAAgUAAAANcG9vbExQQmFsYW5jZQAAAAAAAAAAAAkABEwAAAACBQAAAAp6ZXJvQmlnSW50CQAETAAAAAIFAAAACnplcm9CaWdJbnQJAARMAAAAAgUAAAAKemVyb0JpZ0ludAUAAAADbmlsCQEAAAAKY2FsY1ByaWNlcwAAAAMFAAAAEmFjY0FtdEFzc2V0QmFsYW5jZQUAAAAUYWNjUHJpY2VBc3NldEJhbGFuY2UFAAAADXBvb2xMUEJhbGFuY2UEAAAACGN1clByaWNlAAAAAAAAAAAABAAAAA9scEFtdEFzc2V0U2hhcmUJAQAAAAdmcm9tWDE4AAAAAgkAAZEAAAACBQAAAApwcmljZXNMaXN0AAAAAAAAAAABBQAAAAZzY2FsZTgEAAAAEWxwUHJpY2VBc3NldFNoYXJlCQEAAAAHZnJvbVgxOAAAAAIJAAGRAAAAAgUAAAAKcHJpY2VzTGlzdAAAAAAAAAAAAgUAAAAGc2NhbGU4BAAAAApwb29sV2VpZ2h0CQEAAAAFdmFsdWUAAAABCQAEGgAAAAIFAAAAD2ZhY3RvcnlDb250cmFjdAkBAAAADWtleVBvb2xXZWlnaHQAAAABCQAEJQAAAAEFAAAABHRoaXMJAAUUAAAAAgUAAAADbmlsCQAEuQAAAAIJAARMAAAAAgIAAAAOJWQlZCVkJWQlZCVkJWQJAARMAAAAAgkAAaQAAAABBQAAABJhY2NBbXRBc3NldEJhbGFuY2UJAARMAAAAAgkAAaQAAAABBQAAABRhY2NQcmljZUFzc2V0QmFsYW5jZQkABEwAAAACCQABpAAAAAEFAAAADXBvb2xMUEJhbGFuY2UJAARMAAAAAgkAAaQAAAABBQAAAAhjdXJQcmljZQkABEwAAAACCQABpAAAAAEFAAAAD2xwQW10QXNzZXRTaGFyZQkABEwAAAACCQABpAAAAAEFAAAAEWxwUHJpY2VBc3NldFNoYXJlCQAETAAAAAIJAAGkAAAAAQUAAAAKcG9vbFdlaWdodAUAAAADbmlsBQAAAANTRVAAAAABaQEAAAAgZXZhbHVhdGVQdXRCeUFtb3VudEFzc2V0UkVBRE9OTFkAAAABAAAADGluQW1Bc3NldEFtdAQAAAADY2ZnCQEAAAANZ2V0UG9vbENvbmZpZwAAAAAEAAAACWxwQXNzZXRJZAkAAlkAAAABCQABkQAAAAIFAAAAA2NmZwUAAAAQaWR4UG9vbExQQXNzZXRJZAQAAAAMYW1Bc3NldElkU3RyCQABkQAAAAIFAAAAA2NmZwUAAAANaWR4QW10QXNzZXRJZAQAAAAJYW1Bc3NldElkCQACWQAAAAEFAAAADGFtQXNzZXRJZFN0cgQAAAAMcHJBc3NldElkU3RyCQABkQAAAAIFAAAAA2NmZwUAAAAPaWR4UHJpY2VBc3NldElkBAAAAAlwckFzc2V0SWQJAAJZAAAAAQUAAAAMcHJBc3NldElkU3RyBAAAAAthbXRBc3NldERjbQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAA2NmZwUAAAAOaWR4QW10QXNzZXREY20EAAAADXByaWNlQXNzZXREY20JAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAANjZmcFAAAAEGlkeFByaWNlQXNzZXREY20EAAAACnBvb2xTdGF0dXMJAAGRAAAAAgUAAAADY2ZnBQAAAA1pZHhQb29sU3RhdHVzBAAAAA1wb29sTFBCYWxhbmNlCAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAD7AAAAAEFAAAACWxwQXNzZXRJZAkAASwAAAACCQABLAAAAAICAAAABkFzc2V0IAkAAlgAAAABBQAAAAlscEFzc2V0SWQCAAAADiBkb2Vzbid0IGV4aXN0AAAACHF1YW50aXR5BAAAABJhY2NBbXRBc3NldEJhbGFuY2UJAQAAAA1nZXRBY2NCYWxhbmNlAAAAAQUAAAAMYW1Bc3NldElkU3RyBAAAABRhY2NQcmljZUFzc2V0QmFsYW5jZQkBAAAADWdldEFjY0JhbGFuY2UAAAABBQAAAAxwckFzc2V0SWRTdHIEAAAADmFtdEFzc2V0QW10WDE4CQEAAAAFdG9YMTgAAAACBQAAABJhY2NBbXRBc3NldEJhbGFuY2UFAAAAC2FtdEFzc2V0RGNtBAAAABBwcmljZUFzc2V0QW10WDE4CQEAAAAFdG9YMTgAAAACBQAAABRhY2NQcmljZUFzc2V0QmFsYW5jZQUAAAANcHJpY2VBc3NldERjbQQAAAALY3VyUHJpY2VYMTgDCQAAAAAAAAIFAAAADXBvb2xMUEJhbGFuY2UAAAAAAAAAAAAFAAAACnplcm9CaWdJbnQJAQAAAA9jYWxjUHJpY2VCaWdJbnQAAAACBQAAABBwcmljZUFzc2V0QW10WDE4BQAAAA5hbXRBc3NldEFtdFgxOAQAAAAPaW5BbUFzc2V0QW10WDE4CQEAAAAFdG9YMTgAAAACBQAAAAxpbkFtQXNzZXRBbXQFAAAAC2FtdEFzc2V0RGNtBAAAAA9pblByQXNzZXRBbXRYMTgJAAE8AAAAAwUAAAAPaW5BbUFzc2V0QW10WDE4BQAAAAtjdXJQcmljZVgxOAUAAAAHc2NhbGUxOAQAAAAMaW5QckFzc2V0QW10CQEAAAAHZnJvbVgxOAAAAAIFAAAAD2luUHJBc3NldEFtdFgxOAUAAAANcHJpY2VBc3NldERjbQQAAAAGZXN0UHV0CQEAAAAUZXN0aW1hdGVQdXRPcGVyYXRpb24AAAAJAgAAAAAAAAAAAAAHoSAFAAAADGluQW1Bc3NldEFtdAUAAAAJYW1Bc3NldElkBQAAAAxpblByQXNzZXRBbXQFAAAACXByQXNzZXRJZAIAAAAABgcEAAAACWNhbGNMcEFtdAgFAAAABmVzdFB1dAAAAAJfMQQAAAAMY3VyUHJpY2VDYWxjCAUAAAAGZXN0UHV0AAAAAl8zBAAAAAlhbUJhbGFuY2UIBQAAAAZlc3RQdXQAAAACXzQEAAAACXByQmFsYW5jZQgFAAAABmVzdFB1dAAAAAJfNQQAAAAKbHBFbWlzc2lvbggFAAAABmVzdFB1dAAAAAJfNgkABRQAAAACBQAAAANuaWwJAAS5AAAAAgkABEwAAAACAgAAABAlZCVkJWQlZCVkJWQlZCVkCQAETAAAAAIJAAGkAAAAAQUAAAAJY2FsY0xwQW10CQAETAAAAAIJAAGkAAAAAQkBAAAAB2Zyb21YMTgAAAACBQAAAAtjdXJQcmljZVgxOAUAAAAGc2NhbGU4CQAETAAAAAIJAAGkAAAAAQUAAAAJYW1CYWxhbmNlCQAETAAAAAIJAAGkAAAAAQUAAAAJcHJCYWxhbmNlCQAETAAAAAIJAAGkAAAAAQUAAAAKbHBFbWlzc2lvbgkABEwAAAACBQAAAApwb29sU3RhdHVzCQAETAAAAAIJAAGkAAAAAQUAAAAMaW5BbUFzc2V0QW10CQAETAAAAAIJAAGkAAAAAQUAAAAMaW5QckFzc2V0QW10BQAAAANuaWwFAAAAA1NFUAAAAAFpAQAAAB9ldmFsdWF0ZVB1dEJ5UHJpY2VBc3NldFJFQURPTkxZAAAAAQAAAAxpblByQXNzZXRBbXQEAAAAA2NmZwkBAAAADWdldFBvb2xDb25maWcAAAAABAAAAAlscEFzc2V0SWQJAAJZAAAAAQkAAZEAAAACBQAAAANjZmcFAAAAEGlkeFBvb2xMUEFzc2V0SWQEAAAADGFtQXNzZXRJZFN0cgkAAZEAAAACBQAAAANjZmcFAAAADWlkeEFtdEFzc2V0SWQEAAAACWFtQXNzZXRJZAkAAlkAAAABBQAAAAxhbUFzc2V0SWRTdHIEAAAADHByQXNzZXRJZFN0cgkAAZEAAAACBQAAAANjZmcFAAAAD2lkeFByaWNlQXNzZXRJZAQAAAAJcHJBc3NldElkCQACWQAAAAEFAAAADHByQXNzZXRJZFN0cgQAAAALYW10QXNzZXREY20JAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAANjZmcFAAAADmlkeEFtdEFzc2V0RGNtBAAAAA1wcmljZUFzc2V0RGNtCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAADY2ZnBQAAABBpZHhQcmljZUFzc2V0RGNtBAAAAApwb29sU3RhdHVzCQABkQAAAAIFAAAAA2NmZwUAAAANaWR4UG9vbFN0YXR1cwQAAAANcG9vbExQQmFsYW5jZQgJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkAA+wAAAABBQAAAAlscEFzc2V0SWQJAAEsAAAAAgkAASwAAAACAgAAAAZBc3NldCAJAAJYAAAAAQUAAAAJbHBBc3NldElkAgAAAA4gZG9lc24ndCBleGlzdAAAAAhxdWFudGl0eQQAAAAMYW1CYWxhbmNlUmF3CQEAAAANZ2V0QWNjQmFsYW5jZQAAAAEFAAAADGFtQXNzZXRJZFN0cgQAAAAMcHJCYWxhbmNlUmF3CQEAAAANZ2V0QWNjQmFsYW5jZQAAAAEFAAAADHByQXNzZXRJZFN0cgQAAAAPYW1CYWxhbmNlUmF3WDE4CQEAAAAFdG9YMTgAAAACBQAAAAxhbUJhbGFuY2VSYXcFAAAAC2FtdEFzc2V0RGNtBAAAAA9wckJhbGFuY2VSYXdYMTgJAQAAAAV0b1gxOAAAAAIFAAAADHByQmFsYW5jZVJhdwUAAAANcHJpY2VBc3NldERjbQQAAAALY3VyUHJpY2VYMTgDCQAAAAAAAAIFAAAADXBvb2xMUEJhbGFuY2UAAAAAAAAAAAAFAAAACnplcm9CaWdJbnQJAQAAAA9jYWxjUHJpY2VCaWdJbnQAAAACBQAAAA9wckJhbGFuY2VSYXdYMTgFAAAAD2FtQmFsYW5jZVJhd1gxOAQAAAAPaW5QckFzc2V0QW10WDE4CQEAAAAFdG9YMTgAAAACBQAAAAxpblByQXNzZXRBbXQFAAAADXByaWNlQXNzZXREY20EAAAAD2luQW1Bc3NldEFtdFgxOAkAATwAAAADBQAAAA9pblByQXNzZXRBbXRYMTgFAAAAB3NjYWxlMTgFAAAAC2N1clByaWNlWDE4BAAAAAxpbkFtQXNzZXRBbXQJAQAAAAdmcm9tWDE4AAAAAgUAAAAPaW5BbUFzc2V0QW10WDE4BQAAAAthbXRBc3NldERjbQQAAAAGZXN0UHV0CQEAAAAUZXN0aW1hdGVQdXRPcGVyYXRpb24AAAAJAgAAAAAAAAAAAAAHoSAFAAAADGluQW1Bc3NldEFtdAUAAAAJYW1Bc3NldElkBQAA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", "chainId": 84, "height": 1950426, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 6sUUqnsH1YzuPbbTcXDdsMG2vpM1ns33oe2x9unxbcvJ Next: 6Ej2GUiCPhyaDFkvLfPFARpcGTf2HBbMNbzYufsAms4y Diff:
OldNewDifferences
1212 let zeroBigInt = toBigInt(0)
1313
1414 let SEP = "__"
15-
16-let EMPTY = ""
1715
1816 let PoolActive = 1
1917
6765 else val
6866
6967
70-func keyFactoryContract () = "%s__factoryContract"
68+func fc () = "%s__factoryContract"
7169
7270
73-func keyManagerPublicKey () = "%s__managerPublicKey"
71+func mpk () = "%s__managerPublicKey"
7472
7573
76-func keyPriceLast () = "%s%s__price__last"
74+func pmpk () = "%s__pendingManagerPublicKey"
7775
7876
79-func keyPriceHistory (h,timestamp) = makeString(["%s%s%d%d__price__history", toString(h), toString(timestamp)], SEP)
77+func pl () = "%s%s__price__last"
8078
8179
82-func keyPutActionByUser (userAddress,txId) = ((("%s%s%s__P__" + userAddress) + "__") + txId)
80+func ph (h,timestamp) = makeString(["%s%s%d%d__price__history", toString(h), toString(timestamp)], SEP)
8381
8482
85-func keyGetActionByUser (userAddress,txId) = ((("%s%s%s__G__" + userAddress) + "__") + txId)
83+func pau (userAddress,txId) = ((("%s%s%s__P__" + userAddress) + "__") + txId)
8684
8785
88-func keyAmtAsset () = "%s__amountAsset"
86+func gau (userAddress,txId) = ((("%s%s%s__G__" + userAddress) + "__") + txId)
8987
9088
91-func keyPriceAsset () = "%s__priceAsset"
89+func aa () = "%s__amountAsset"
9290
9391
94-func keyKHistoric (h,timestamp) = makeString(["%s%s%d%d__K_history", toString(h), toString(timestamp)], SEP)
92+func pa () = "%s__priceAsset"
9593
9694
9795 func keyFactoryConfig () = "%s__factoryConfig"
124122 func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
125123
126124
127-let factoryContract = addressFromStringValue(getStringOrFail(this, keyFactoryContract()))
125+let factoryContract = addressFromStringValue(getStringOrFail(this, fc()))
128126
129127 func isGlobalShutdown () = valueOrElse(getBoolean(factoryContract, keyAllPoolsShutdown()), false)
130128
133131
134132
135133 func getPoolConfig () = {
136- let amtAsset = getStringOrFail(this, keyAmtAsset())
137- let priceAsset = getStringOrFail(this, keyPriceAsset())
134+ let amtAsset = getStringOrFail(this, aa())
135+ let priceAsset = getStringOrFail(this, pa())
138136 let iPriceAsset = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(priceAsset))
139137 let iAmtAsset = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(amtAsset))
140138 split(getStringOrFail(factoryContract, keyPoolConfig(toString(iAmtAsset), toString(iPriceAsset))), SEP)
215213 then unit
216214 else fromBase58String(amAssetId)), ScriptTransfer(userAddress, outPrAmt, if ((prAssetId == "WAVES"))
217215 then unit
218- else fromBase58String(prAssetId)), StringEntry(keyGetActionByUser(toString(userAddress), txId58), dataGetActionInfo(outAmAmt, outPrAmt, pmtLpAmt, curPrice, height, lastBlock.timestamp)), IntegerEntry(keyPriceLast(), curPrice), IntegerEntry(keyPriceHistory(height, lastBlock.timestamp), curPrice)]
216+ else fromBase58String(prAssetId)), StringEntry(gau(toString(userAddress), txId58), dataGetActionInfo(outAmAmt, outPrAmt, pmtLpAmt, curPrice, height, lastBlock.timestamp)), IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice)]
219217 $Tuple10(outAmAmt, outPrAmt, amAssetId, prAssetId, amBalance, prBalance, lpEmission, curPriceX18, poolStatus, state)
220218 }
221219 }
291289 else calcLpAmt
292290 let amDiff = (inAmAssetAmt - calcAmAssetPmt)
293291 let prDiff = (inPrAssetAmt - calcPrAssetPmt)
294- 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))]
292+ let commonState = [IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice), StringEntry(pau(userAddress, txId58), dataPutActionInfo(calcAmAssetPmt, calcPrAssetPmt, emitLpAmt, curPrice, slippageTolerance, slippageCalc, height, lastBlock.timestamp, amDiff, prDiff))]
295293 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEmission, lpAssetId, poolStatus, commonState, amDiff, prDiff, inAmAssetId, inPrAssetId)
296294 }
297295 }
379377 }
380378
381379
380+func managerPublicKeyOrUnit () = match getString(mpk()) {
381+ case s: String =>
382+ fromBase58String(s)
383+ case _: Unit =>
384+ unit
385+ case _ =>
386+ throw("Match error")
387+}
388+
389+
390+func pendingManagerPublicKeyOrUnit () = match getString(pmpk()) {
391+ case s: String =>
392+ fromBase58String(s)
393+ case _: Unit =>
394+ unit
395+ case _ =>
396+ throw("Match error")
397+}
398+
399+
400+func mustManager (i) = {
401+ let pd = throw("Permission denied")
402+ match managerPublicKeyOrUnit() {
403+ case pk: ByteVector =>
404+ if ((i.callerPublicKey == pk))
405+ then true
406+ else pd
407+ case _: Unit =>
408+ if ((i.caller == this))
409+ then true
410+ else pd
411+ case _ =>
412+ throw("Match error")
413+ }
414+ }
415+
416+
382417 @Callable(i)
383-func constructor (factoryContract,managerPublicKey) = if ((i.caller != this))
384- then throw("permissions denied")
385- else [StringEntry(keyFactoryContract(), factoryContract), StringEntry(keyManagerPublicKey(), managerPublicKey)]
418+func constructor (factoryContract) = {
419+ let checkCaller = mustManager(i)
420+ if ((checkCaller == checkCaller))
421+ then [StringEntry(fc(), factoryContract)]
422+ else throw("Strict value is not equal to itself.")
423+ }
424+
425+
426+
427+@Callable(i)
428+func setManager (pendingManagerPublicKey) = {
429+ let checkCaller = mustManager(i)
430+ if ((checkCaller == checkCaller))
431+ then {
432+ let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
433+ if ((checkManagerPublicKey == checkManagerPublicKey))
434+ then [StringEntry(pmpk(), pendingManagerPublicKey)]
435+ else throw("Strict value is not equal to itself.")
436+ }
437+ else throw("Strict value is not equal to itself.")
438+ }
439+
440+
441+
442+@Callable(i)
443+func confirmManager () = {
444+ let pm = pendingManagerPublicKeyOrUnit()
445+ let hasPM = if (isDefined(pm))
446+ then true
447+ else throw("No pending manager")
448+ if ((hasPM == hasPM))
449+ then {
450+ let checkPM = if ((i.callerPublicKey == value(pm)))
451+ then true
452+ else throw("You are not pending manager")
453+ if ((checkPM == checkPM))
454+ then [StringEntry(mpk(), toBase58String(value(pm))), DeleteEntry(pmpk())]
455+ else throw("Strict value is not equal to itself.")
456+ }
457+ else throw("Strict value is not equal to itself.")
458+ }
386459
387460
388461
405478 let emitInv = invoke(factoryContract, "emit", [emitLpAmt], nil)
406479 if ((emitInv == emitInv))
407480 then {
408- let slippageAInv = if ((amDiff > 0))
409- then invoke(slippageContract, "put", nil, [AttachedPayment(amId, amDiff)])
410- else nil
411- if ((slippageAInv == slippageAInv))
481+ let emitInvLegacy = match emitInv {
482+ case legacyFactoryContract: Address =>
483+ invoke(legacyFactoryContract, "emit", [emitLpAmt], nil)
484+ case _ =>
485+ unit
486+ }
487+ if ((emitInvLegacy == emitInvLegacy))
412488 then {
413- let slippagePInv = if ((prDiff > 0))
414- then invoke(slippageContract, "put", nil, [AttachedPayment(prId, prDiff)])
489+ let slippageAInv = if ((amDiff > 0))
490+ then invoke(slippageContract, "put", nil, [AttachedPayment(amId, amDiff)])
415491 else nil
416- if ((slippagePInv == slippagePInv))
492+ if ((slippageAInv == slippageAInv))
417493 then {
418- let lpTransfer = if (shouldAutoStake)
494+ let slippagePInv = if ((prDiff > 0))
495+ then invoke(slippageContract, "put", nil, [AttachedPayment(prId, prDiff)])
496+ else nil
497+ if ((slippagePInv == slippagePInv))
419498 then {
420- let slpStakeInv = invoke(stakingContract, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
421- if ((slpStakeInv == slpStakeInv))
422- then nil
423- else throw("Strict value is not equal to itself.")
499+ let lpTransfer = if (shouldAutoStake)
500+ then {
501+ let slpStakeInv = invoke(stakingContract, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
502+ if ((slpStakeInv == slpStakeInv))
503+ then nil
504+ else throw("Strict value is not equal to itself.")
505+ }
506+ else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
507+ (state ++ lpTransfer)
424508 }
425- else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
426- (state ++ lpTransfer)
509+ else throw("Strict value is not equal to itself.")
427510 }
428511 else throw("Strict value is not equal to itself.")
429512 }
524607 @Callable(i)
525608 func activate (amtAssetStr,priceAssetStr) = if ((toString(i.caller) != toString(factoryContract)))
526609 then throw("permissions denied")
527- else $Tuple2([StringEntry(keyAmtAsset(), amtAssetStr), StringEntry(keyPriceAsset(), priceAssetStr)], "success")
610+ else $Tuple2([StringEntry(aa(), amtAssetStr), StringEntry(pa(), priceAssetStr)], "success")
528611
529612
530613
694777 then true
695778 else throwOrderError(orderValid, senderValid, matcherValid)
696779 case _ =>
697- let managerPublic = valueOrElse(getString(this, keyManagerPublicKey()), EMPTY)
698- if ((managerPublic == EMPTY))
699- then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
700- else sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(managerPublic))
780+ let targetPublicKey = match managerPublicKeyOrUnit() {
781+ case pk: ByteVector =>
782+ pk
783+ case _: Unit =>
784+ tx.senderPublicKey
785+ case _ =>
786+ throw("Match error")
787+ }
788+ sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
701789 }
702790
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let lPdecimals = 8
55
66 let scale8 = 100000000
77
88 let scale8BigInt = toBigInt(100000000)
99
1010 let scale18 = toBigInt(1000000000000000000)
1111
1212 let zeroBigInt = toBigInt(0)
1313
1414 let SEP = "__"
15-
16-let EMPTY = ""
1715
1816 let PoolActive = 1
1917
2018 let PoolPutDisabled = 2
2119
2220 let PoolMatcherDisabled = 3
2321
2422 let PoolShutdown = 4
2523
2624 let idxPoolAddress = 1
2725
2826 let idxPoolStatus = 2
2927
3028 let idxPoolLPAssetId = 3
3129
3230 let idxAmtAssetId = 4
3331
3432 let idxPriceAssetId = 5
3533
3634 let idxAmtAssetDcm = 6
3735
3836 let idxPriceAssetDcm = 7
3937
4038 let idxIAmtAssetId = 8
4139
4240 let idxIPriceAssetId = 9
4341
4442 let idxLPAssetDcm = 10
4543
4644 let idxPoolAmtAssetAmt = 1
4745
4846 let idxPoolPriceAssetAmt = 2
4947
5048 let idxPoolLPAssetAmt = 3
5149
5250 let idxFactoryStakingContract = 1
5351
5452 let idxFactorySlippageContract = 7
5553
5654 func toX18 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
5755
5856
5957 func fromX18 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
6058
6159
6260 func toScale (amt,resScale,curScale) = fraction(amt, resScale, curScale)
6361
6462
6563 func abs (val) = if ((zeroBigInt > val))
6664 then -(val)
6765 else val
6866
6967
70-func keyFactoryContract () = "%s__factoryContract"
68+func fc () = "%s__factoryContract"
7169
7270
73-func keyManagerPublicKey () = "%s__managerPublicKey"
71+func mpk () = "%s__managerPublicKey"
7472
7573
76-func keyPriceLast () = "%s%s__price__last"
74+func pmpk () = "%s__pendingManagerPublicKey"
7775
7876
79-func keyPriceHistory (h,timestamp) = makeString(["%s%s%d%d__price__history", toString(h), toString(timestamp)], SEP)
77+func pl () = "%s%s__price__last"
8078
8179
82-func keyPutActionByUser (userAddress,txId) = ((("%s%s%s__P__" + userAddress) + "__") + txId)
80+func ph (h,timestamp) = makeString(["%s%s%d%d__price__history", toString(h), toString(timestamp)], SEP)
8381
8482
85-func keyGetActionByUser (userAddress,txId) = ((("%s%s%s__G__" + userAddress) + "__") + txId)
83+func pau (userAddress,txId) = ((("%s%s%s__P__" + userAddress) + "__") + txId)
8684
8785
88-func keyAmtAsset () = "%s__amountAsset"
86+func gau (userAddress,txId) = ((("%s%s%s__G__" + userAddress) + "__") + txId)
8987
9088
91-func keyPriceAsset () = "%s__priceAsset"
89+func aa () = "%s__amountAsset"
9290
9391
94-func keyKHistoric (h,timestamp) = makeString(["%s%s%d%d__K_history", toString(h), toString(timestamp)], SEP)
92+func pa () = "%s__priceAsset"
9593
9694
9795 func keyFactoryConfig () = "%s__factoryConfig"
9896
9997
10098 func keyMatcherPub () = "%s%s__matcher__publicKey"
10199
102100
103101 func keyMappingPoolContractAddressToPoolAssets (poolContractAddress) = (("%s%s%s__" + poolContractAddress) + "__mappings__poolContract2LpAsset")
104102
105103
106104 func keyPoolConfig (iAmtAsset,iPriceAsset) = (((("%d%d%s__" + iAmtAsset) + "__") + iPriceAsset) + "__config")
107105
108106
109107 func keyMappingsBaseAsset2internalId (baseAssetStr) = ("%s%s%s__mappings__baseAsset2internalId__" + baseAssetStr)
110108
111109
112110 func keyAllPoolsShutdown () = "%s__shutdown"
113111
114112
115113 func keyPoolWeight (contractAddress) = ("%s%s__poolWeight__" + contractAddress)
116114
117115
118116 func throwOrderError (orderValid,senderValid,matcherValid) = throw(((((("order validation failed: orderValid=" + toString(orderValid)) + " senderValid=") + toString(senderValid)) + " matcherValid=") + toString(matcherValid)))
119117
120118
121119 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
122120
123121
124122 func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
125123
126124
127-let factoryContract = addressFromStringValue(getStringOrFail(this, keyFactoryContract()))
125+let factoryContract = addressFromStringValue(getStringOrFail(this, fc()))
128126
129127 func isGlobalShutdown () = valueOrElse(getBoolean(factoryContract, keyAllPoolsShutdown()), false)
130128
131129
132130 func getMatcherPubOrFail () = fromBase58String(getStringOrFail(factoryContract, keyMatcherPub()))
133131
134132
135133 func getPoolConfig () = {
136- let amtAsset = getStringOrFail(this, keyAmtAsset())
137- let priceAsset = getStringOrFail(this, keyPriceAsset())
134+ let amtAsset = getStringOrFail(this, aa())
135+ let priceAsset = getStringOrFail(this, pa())
138136 let iPriceAsset = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(priceAsset))
139137 let iAmtAsset = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(amtAsset))
140138 split(getStringOrFail(factoryContract, keyPoolConfig(toString(iAmtAsset), toString(iPriceAsset))), SEP)
141139 }
142140
143141
144142 func getFactoryConfig () = split(getStringOrFail(factoryContract, keyFactoryConfig()), SEP)
145143
146144
147145 func dataPutActionInfo (inAmtAssetAmt,inPriceAssetAmt,outLpAmt,price,slippageTolerancePassedByUser,slippageToleranceReal,txHeight,txTimestamp,slipageAmtAssetAmt,slipagePriceAssetAmt) = makeString(["%d%d%d%d%d%d%d%d%d%d", toString(inAmtAssetAmt), toString(inPriceAssetAmt), toString(outLpAmt), toString(price), toString(slippageTolerancePassedByUser), toString(slippageToleranceReal), toString(txHeight), toString(txTimestamp), toString(slipageAmtAssetAmt), toString(slipagePriceAssetAmt)], SEP)
148146
149147
150148 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)
151149
152150
153151 func getAccBalance (assetId) = if ((assetId == "WAVES"))
154152 then wavesBalance(this).available
155153 else assetBalance(this, fromBase58String(assetId))
156154
157155
158156 func calcPriceBigInt (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
159157
160158
161159 func privateCalcPrice (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
162160 let amtAssetAmtX18 = toX18(amAmt, amAssetDcm)
163161 let priceAssetAmtX18 = toX18(prAmt, prAssetDcm)
164162 calcPriceBigInt(priceAssetAmtX18, amtAssetAmtX18)
165163 }
166164
167165
168166 func calcPrices (amAmt,prAmt,lpAmt) = {
169167 let cfg = getPoolConfig()
170168 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
171169 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
172170 let priceX18 = privateCalcPrice(amtAssetDcm, priceAssetDcm, amAmt, prAmt)
173171 let amAmtX18 = toX18(amAmt, amtAssetDcm)
174172 let prAmtX18 = toX18(prAmt, priceAssetDcm)
175173 let lpAmtX18 = toX18(lpAmt, scale8)
176174 let lpPriceInAmAssetX18 = calcPriceBigInt(amAmtX18, lpAmtX18)
177175 let lpPriceInPrAssetX18 = calcPriceBigInt(prAmtX18, lpAmtX18)
178176 [priceX18, lpPriceInAmAssetX18, lpPriceInPrAssetX18]
179177 }
180178
181179
182180 func calculatePrices (amAmt,prAmt,lpAmt) = {
183181 let prices = calcPrices(amAmt, prAmt, lpAmt)
184182 [fromX18(prices[0], scale8), fromX18(prices[1], scale8), fromX18(prices[2], scale8)]
185183 }
186184
187185
188186 func estimateGetOperation (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
189187 let cfg = getPoolConfig()
190188 let lpAssetId = cfg[idxPoolLPAssetId]
191189 let amAssetId = cfg[idxAmtAssetId]
192190 let prAssetId = cfg[idxPriceAssetId]
193191 let amAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
194192 let prAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
195193 let poolStatus = cfg[idxPoolStatus]
196194 let lpEmission = valueOrErrorMessage(assetInfo(fromBase58String(lpAssetId)), (("Asset " + lpAssetId) + " doesn't exist")).quantity
197195 if ((lpAssetId != pmtAssetId))
198196 then throw("Invalid asset passed.")
199197 else {
200198 let amBalance = getAccBalance(amAssetId)
201199 let amBalanceX18 = toX18(amBalance, amAssetDcm)
202200 let prBalance = getAccBalance(prAssetId)
203201 let prBalanceX18 = toX18(prBalance, prAssetDcm)
204202 let curPriceX18 = calcPriceBigInt(prBalanceX18, amBalanceX18)
205203 let curPrice = fromX18(curPriceX18, scale8)
206204 let pmtLpAmtX18 = toX18(pmtLpAmt, scale8)
207205 let lpEmissionX18 = toX18(lpEmission, scale8)
208206 let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissionX18)
209207 let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissionX18)
210208 let outAmAmt = fromX18(outAmAmtX18, amAssetDcm)
211209 let outPrAmt = fromX18(outPrAmtX18, prAssetDcm)
212210 let state = if ((txId58 == ""))
213211 then nil
214212 else [ScriptTransfer(userAddress, outAmAmt, if ((amAssetId == "WAVES"))
215213 then unit
216214 else fromBase58String(amAssetId)), ScriptTransfer(userAddress, outPrAmt, if ((prAssetId == "WAVES"))
217215 then unit
218- else fromBase58String(prAssetId)), StringEntry(keyGetActionByUser(toString(userAddress), txId58), dataGetActionInfo(outAmAmt, outPrAmt, pmtLpAmt, curPrice, height, lastBlock.timestamp)), IntegerEntry(keyPriceLast(), curPrice), IntegerEntry(keyPriceHistory(height, lastBlock.timestamp), curPrice)]
216+ else fromBase58String(prAssetId)), StringEntry(gau(toString(userAddress), txId58), dataGetActionInfo(outAmAmt, outPrAmt, pmtLpAmt, curPrice, height, lastBlock.timestamp)), IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice)]
219217 $Tuple10(outAmAmt, outPrAmt, amAssetId, prAssetId, amBalance, prBalance, lpEmission, curPriceX18, poolStatus, state)
220218 }
221219 }
222220
223221
224222 func estimatePutOperation (txId58,slippageTolerance,inAmAssetAmt,inAmAssetId,inPrAssetAmt,inPrAssetId,userAddress,isEvaluate,emitLp) = {
225223 let cfg = getPoolConfig()
226224 let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId])
227225 let amAssetIdStr = cfg[idxAmtAssetId]
228226 let prAssetIdStr = cfg[idxPriceAssetId]
229227 let iAmtAssetId = cfg[idxIAmtAssetId]
230228 let iPriceAssetId = cfg[idxIPriceAssetId]
231229 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
232230 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
233231 let poolStatus = cfg[idxPoolStatus]
234232 let lpEmission = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
235233 let inAmAssetIdStr = toBase58String(valueOrElse(inAmAssetId, fromBase58String("WAVES")))
236234 let inPrAssetIdStr = toBase58String(valueOrElse(inPrAssetId, fromBase58String("WAVES")))
237235 if (if ((amAssetIdStr != inAmAssetIdStr))
238236 then true
239237 else (prAssetIdStr != inPrAssetIdStr))
240238 then throw("Invalid amt or price asset passed.")
241239 else {
242240 let amBalance = if (isEvaluate)
243241 then getAccBalance(amAssetIdStr)
244242 else (getAccBalance(amAssetIdStr) - inAmAssetAmt)
245243 let prBalance = if (isEvaluate)
246244 then getAccBalance(prAssetIdStr)
247245 else (getAccBalance(prAssetIdStr) - inPrAssetAmt)
248246 let inAmAssetAmtX18 = toX18(inAmAssetAmt, amtAssetDcm)
249247 let inPrAssetAmtX18 = toX18(inPrAssetAmt, priceAssetDcm)
250248 let userPriceX18 = calcPriceBigInt(inPrAssetAmtX18, inAmAssetAmtX18)
251249 let amBalanceX18 = toX18(amBalance, amtAssetDcm)
252250 let prBalanceX18 = toX18(prBalance, priceAssetDcm)
253251 let res = if ((lpEmission == 0))
254252 then {
255253 let curPriceX18 = zeroBigInt
256254 let slippageX18 = zeroBigInt
257255 let lpAmtX18 = pow((inAmAssetAmtX18 * inPrAssetAmtX18), 0, toBigInt(5), 1, 0, DOWN)
258256 $Tuple5(fromX18(lpAmtX18, scale8), fromX18(inAmAssetAmtX18, amtAssetDcm), fromX18(inPrAssetAmtX18, priceAssetDcm), calcPriceBigInt((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
259257 }
260258 else {
261259 let curPriceX18 = calcPriceBigInt(prBalanceX18, amBalanceX18)
262260 let slippageX18 = fraction(abs((curPriceX18 - userPriceX18)), scale18, curPriceX18)
263261 let slippageToleranceX18 = toX18(slippageTolerance, scale8)
264262 if (if ((curPriceX18 != zeroBigInt))
265263 then (slippageX18 > slippageToleranceX18)
266264 else false)
267265 then throw(((("Price slippage " + toString(slippageX18)) + " exceeded the passed limit of ") + toString(slippageToleranceX18)))
268266 else {
269267 let lpEmissionX18 = toX18(lpEmission, scale8)
270268 let prViaAmX18 = fraction(inAmAssetAmtX18, curPriceX18, scale18)
271269 let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, curPriceX18)
272270 let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
273271 then $Tuple2(amViaPrX18, inPrAssetAmtX18)
274272 else $Tuple2(inAmAssetAmtX18, prViaAmX18)
275273 let expAmtAssetAmtX18 = expectedAmts._1
276274 let expPriceAssetAmtX18 = expectedAmts._2
277275 let lpAmtX18 = fraction(lpEmissionX18, expPriceAssetAmtX18, prBalanceX18)
278276 $Tuple5(fromX18(lpAmtX18, scale8), fromX18(expAmtAssetAmtX18, amtAssetDcm), fromX18(expPriceAssetAmtX18, priceAssetDcm), curPriceX18, slippageX18)
279277 }
280278 }
281279 let calcLpAmt = res._1
282280 let calcAmAssetPmt = res._2
283281 let calcPrAssetPmt = res._3
284282 let curPrice = fromX18(res._4, scale8)
285283 let slippageCalc = fromX18(res._5, scale8)
286284 if ((0 >= calcLpAmt))
287285 then throw("Invalid calculations. LP calculated is less than zero.")
288286 else {
289287 let emitLpAmt = if (!(emitLp))
290288 then 0
291289 else calcLpAmt
292290 let amDiff = (inAmAssetAmt - calcAmAssetPmt)
293291 let prDiff = (inPrAssetAmt - calcPrAssetPmt)
294- 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))]
292+ let commonState = [IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice), StringEntry(pau(userAddress, txId58), dataPutActionInfo(calcAmAssetPmt, calcPrAssetPmt, emitLpAmt, curPrice, slippageTolerance, slippageCalc, height, lastBlock.timestamp, amDiff, prDiff))]
295293 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEmission, lpAssetId, poolStatus, commonState, amDiff, prDiff, inAmAssetId, inPrAssetId)
296294 }
297295 }
298296 }
299297
300298
301299 func validateMatcherOrderAllowed (order) = {
302300 let cfg = getPoolConfig()
303301 let amtAssetId = cfg[idxAmtAssetId]
304302 let priceAssetId = cfg[idxPriceAssetId]
305303 let poolStatus = parseIntValue(cfg[idxPoolStatus])
306304 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
307305 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
308306 let accAmtAssetBalance = getAccBalance(amtAssetId)
309307 let accPriceAssetBalance = getAccBalance(priceAssetId)
310308 let curPriceX18 = if ((order.orderType == Buy))
311309 then privateCalcPrice(amtAssetDcm, priceAssetDcm, (accAmtAssetBalance + order.amount), accPriceAssetBalance)
312310 else privateCalcPrice(amtAssetDcm, priceAssetDcm, (accAmtAssetBalance - order.amount), accPriceAssetBalance)
313311 let curPrice = fromX18(curPriceX18, scale8)
314312 if (if (if (isGlobalShutdown())
315313 then true
316314 else (poolStatus == PoolMatcherDisabled))
317315 then true
318316 else (poolStatus == PoolShutdown))
319317 then throw("Exchange operations disabled")
320318 else {
321319 let orderAmtAsset = order.assetPair.amountAsset
322320 let orderAmtAssetStr = if ((orderAmtAsset == unit))
323321 then "WAVES"
324322 else toBase58String(value(orderAmtAsset))
325323 let orderPriceAsset = order.assetPair.priceAsset
326324 let orderPriceAssetStr = if ((orderPriceAsset == unit))
327325 then "WAVES"
328326 else toBase58String(value(orderPriceAsset))
329327 if (if ((orderAmtAssetStr != amtAssetId))
330328 then true
331329 else (orderPriceAssetStr != priceAssetId))
332330 then throw("Wrong order assets.")
333331 else {
334332 let orderPrice = order.price
335333 let priceDcm = fraction(scale8, priceAssetDcm, amtAssetDcm)
336334 let castedOrderPrice = toScale(orderPrice, scale8, priceDcm)
337335 let isOrderPriceValid = if ((order.orderType == Buy))
338336 then (curPrice >= castedOrderPrice)
339337 else (castedOrderPrice >= curPrice)
340338 true
341339 }
342340 }
343341 }
344342
345343
346344 func commonGet (i) = if ((size(i.payments) != 1))
347345 then throw("exactly 1 payment is expected")
348346 else {
349347 let pmt = value(i.payments[0])
350348 let pmtAssetId = value(pmt.assetId)
351349 let pmtAmt = pmt.amount
352350 let res = estimateGetOperation(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
353351 let outAmAmt = res._1
354352 let outPrAmt = res._2
355353 let poolStatus = parseIntValue(res._9)
356354 let state = res._10
357355 if (if (isGlobalShutdown())
358356 then true
359357 else (poolStatus == PoolShutdown))
360358 then throw(("Get operation is blocked by admin. Status = " + toString(poolStatus)))
361359 else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state)
362360 }
363361
364362
365363 func commonPut (i,slippageTolerance,emitLp) = if ((size(i.payments) != 2))
366364 then throw("exactly 2 payments are expected")
367365 else {
368366 let amAssetPmt = value(i.payments[0])
369367 let prAssetPmt = value(i.payments[1])
370368 let estPut = estimatePutOperation(toBase58String(i.transactionId), slippageTolerance, amAssetPmt.amount, amAssetPmt.assetId, prAssetPmt.amount, prAssetPmt.assetId, toString(i.caller), false, emitLp)
371369 let poolStatus = parseIntValue(estPut._8)
372370 if (if (if (isGlobalShutdown())
373371 then true
374372 else (poolStatus == PoolPutDisabled))
375373 then true
376374 else (poolStatus == PoolShutdown))
377375 then throw(("Put operation is blocked by admin. Status = " + toString(poolStatus)))
378376 else estPut
379377 }
380378
381379
380+func managerPublicKeyOrUnit () = match getString(mpk()) {
381+ case s: String =>
382+ fromBase58String(s)
383+ case _: Unit =>
384+ unit
385+ case _ =>
386+ throw("Match error")
387+}
388+
389+
390+func pendingManagerPublicKeyOrUnit () = match getString(pmpk()) {
391+ case s: String =>
392+ fromBase58String(s)
393+ case _: Unit =>
394+ unit
395+ case _ =>
396+ throw("Match error")
397+}
398+
399+
400+func mustManager (i) = {
401+ let pd = throw("Permission denied")
402+ match managerPublicKeyOrUnit() {
403+ case pk: ByteVector =>
404+ if ((i.callerPublicKey == pk))
405+ then true
406+ else pd
407+ case _: Unit =>
408+ if ((i.caller == this))
409+ then true
410+ else pd
411+ case _ =>
412+ throw("Match error")
413+ }
414+ }
415+
416+
382417 @Callable(i)
383-func constructor (factoryContract,managerPublicKey) = if ((i.caller != this))
384- then throw("permissions denied")
385- else [StringEntry(keyFactoryContract(), factoryContract), StringEntry(keyManagerPublicKey(), managerPublicKey)]
418+func constructor (factoryContract) = {
419+ let checkCaller = mustManager(i)
420+ if ((checkCaller == checkCaller))
421+ then [StringEntry(fc(), factoryContract)]
422+ else throw("Strict value is not equal to itself.")
423+ }
424+
425+
426+
427+@Callable(i)
428+func setManager (pendingManagerPublicKey) = {
429+ let checkCaller = mustManager(i)
430+ if ((checkCaller == checkCaller))
431+ then {
432+ let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
433+ if ((checkManagerPublicKey == checkManagerPublicKey))
434+ then [StringEntry(pmpk(), pendingManagerPublicKey)]
435+ else throw("Strict value is not equal to itself.")
436+ }
437+ else throw("Strict value is not equal to itself.")
438+ }
439+
440+
441+
442+@Callable(i)
443+func confirmManager () = {
444+ let pm = pendingManagerPublicKeyOrUnit()
445+ let hasPM = if (isDefined(pm))
446+ then true
447+ else throw("No pending manager")
448+ if ((hasPM == hasPM))
449+ then {
450+ let checkPM = if ((i.callerPublicKey == value(pm)))
451+ then true
452+ else throw("You are not pending manager")
453+ if ((checkPM == checkPM))
454+ then [StringEntry(mpk(), toBase58String(value(pm))), DeleteEntry(pmpk())]
455+ else throw("Strict value is not equal to itself.")
456+ }
457+ else throw("Strict value is not equal to itself.")
458+ }
386459
387460
388461
389462 @Callable(i)
390463 func put (slippageTolerance,shouldAutoStake) = {
391464 let factoryCfg = getFactoryConfig()
392465 let stakingContract = valueOrErrorMessage(addressFromString(factoryCfg[idxFactoryStakingContract]), "Error. Incorrect staking address.")
393466 let slippageContract = valueOrErrorMessage(addressFromString(factoryCfg[idxFactorySlippageContract]), "Error. Incorrect slippage contract address.")
394467 if ((0 > slippageTolerance))
395468 then throw("Invalid slippageTolerance passed")
396469 else {
397470 let estPut = commonPut(i, slippageTolerance, true)
398471 let emitLpAmt = estPut._2
399472 let lpAssetId = estPut._7
400473 let state = estPut._9
401474 let amDiff = estPut._10
402475 let prDiff = estPut._11
403476 let amId = estPut._12
404477 let prId = estPut._13
405478 let emitInv = invoke(factoryContract, "emit", [emitLpAmt], nil)
406479 if ((emitInv == emitInv))
407480 then {
408- let slippageAInv = if ((amDiff > 0))
409- then invoke(slippageContract, "put", nil, [AttachedPayment(amId, amDiff)])
410- else nil
411- if ((slippageAInv == slippageAInv))
481+ let emitInvLegacy = match emitInv {
482+ case legacyFactoryContract: Address =>
483+ invoke(legacyFactoryContract, "emit", [emitLpAmt], nil)
484+ case _ =>
485+ unit
486+ }
487+ if ((emitInvLegacy == emitInvLegacy))
412488 then {
413- let slippagePInv = if ((prDiff > 0))
414- then invoke(slippageContract, "put", nil, [AttachedPayment(prId, prDiff)])
489+ let slippageAInv = if ((amDiff > 0))
490+ then invoke(slippageContract, "put", nil, [AttachedPayment(amId, amDiff)])
415491 else nil
416- if ((slippagePInv == slippagePInv))
492+ if ((slippageAInv == slippageAInv))
417493 then {
418- let lpTransfer = if (shouldAutoStake)
494+ let slippagePInv = if ((prDiff > 0))
495+ then invoke(slippageContract, "put", nil, [AttachedPayment(prId, prDiff)])
496+ else nil
497+ if ((slippagePInv == slippagePInv))
419498 then {
420- let slpStakeInv = invoke(stakingContract, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
421- if ((slpStakeInv == slpStakeInv))
422- then nil
423- else throw("Strict value is not equal to itself.")
499+ let lpTransfer = if (shouldAutoStake)
500+ then {
501+ let slpStakeInv = invoke(stakingContract, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
502+ if ((slpStakeInv == slpStakeInv))
503+ then nil
504+ else throw("Strict value is not equal to itself.")
505+ }
506+ else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
507+ (state ++ lpTransfer)
424508 }
425- else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
426- (state ++ lpTransfer)
509+ else throw("Strict value is not equal to itself.")
427510 }
428511 else throw("Strict value is not equal to itself.")
429512 }
430513 else throw("Strict value is not equal to itself.")
431514 }
432515 else throw("Strict value is not equal to itself.")
433516 }
434517 }
435518
436519
437520
438521 @Callable(i)
439522 func putForFree (maxSlippage) = if ((0 > maxSlippage))
440523 then throw("Invalid value passed")
441524 else {
442525 let estPut = commonPut(i, maxSlippage, false)
443526 estPut._9
444527 }
445528
446529
447530
448531 @Callable(i)
449532 func get () = {
450533 let res = commonGet(i)
451534 let outAmtAmt = res._1
452535 let outPrAmt = res._2
453536 let pmtAmt = res._3
454537 let pmtAssetId = res._4
455538 let state = res._5
456539 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
457540 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
458541 then state
459542 else throw("Strict value is not equal to itself.")
460543 }
461544
462545
463546
464547 @Callable(i)
465548 func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = {
466549 let res = commonGet(i)
467550 let outAmAmt = res._1
468551 let outPrAmt = res._2
469552 let pmtAmt = res._3
470553 let pmtAssetId = res._4
471554 let state = res._5
472555 if ((noLessThenAmtAsset > outAmAmt))
473556 then throw(((("noLessThenAmtAsset failed: " + toString(outAmAmt)) + " < ") + toString(noLessThenAmtAsset)))
474557 else if ((noLessThenPriceAsset > outPrAmt))
475558 then throw(((("noLessThenPriceAsset failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset)))
476559 else {
477560 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
478561 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
479562 then state
480563 else throw("Strict value is not equal to itself.")
481564 }
482565 }
483566
484567
485568
486569 @Callable(i)
487570 func unstakeAndGet (amount) = {
488571 let checkPayments = if ((size(i.payments) != 0))
489572 then throw("No payments are expected")
490573 else true
491574 if ((checkPayments == checkPayments))
492575 then {
493576 let cfg = getPoolConfig()
494577 let factoryCfg = getFactoryConfig()
495578 let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId])
496579 let stakingContract = valueOrErrorMessage(addressFromString(factoryCfg[idxFactoryStakingContract]), "Error. Incorrect staking address.")
497580 let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(lpAssetId), amount], nil)
498581 if ((unstakeInv == unstakeInv))
499582 then {
500583 let res = estimateGetOperation(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
501584 let poolStatus = parseIntValue(res._9)
502585 let state = res._10
503586 let checkPoolStatus = if (if (isGlobalShutdown())
504587 then true
505588 else (poolStatus == PoolShutdown))
506589 then throw(("Get operation is blocked by admin. Status = " + toString(poolStatus)))
507590 else true
508591 if ((checkPoolStatus == checkPoolStatus))
509592 then {
510593 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
511594 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
512595 then state
513596 else throw("Strict value is not equal to itself.")
514597 }
515598 else throw("Strict value is not equal to itself.")
516599 }
517600 else throw("Strict value is not equal to itself.")
518601 }
519602 else throw("Strict value is not equal to itself.")
520603 }
521604
522605
523606
524607 @Callable(i)
525608 func activate (amtAssetStr,priceAssetStr) = if ((toString(i.caller) != toString(factoryContract)))
526609 then throw("permissions denied")
527- else $Tuple2([StringEntry(keyAmtAsset(), amtAssetStr), StringEntry(keyPriceAsset(), priceAssetStr)], "success")
610+ else $Tuple2([StringEntry(aa(), amtAssetStr), StringEntry(pa(), priceAssetStr)], "success")
528611
529612
530613
531614 @Callable(i)
532615 func getPoolConfigWrapperREADONLY () = $Tuple2(nil, getPoolConfig())
533616
534617
535618
536619 @Callable(i)
537620 func getAccBalanceWrapperREADONLY (assetId) = $Tuple2(nil, getAccBalance(assetId))
538621
539622
540623
541624 @Callable(i)
542625 func calcPricesWrapperREADONLY (amAmt,prAmt,lpAmt) = {
543626 let prices = calcPrices(amAmt, prAmt, lpAmt)
544627 $Tuple2(nil, [toString(prices[0]), toString(prices[1]), toString(prices[2])])
545628 }
546629
547630
548631
549632 @Callable(i)
550633 func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(toX18(origVal, origScaleMult)))
551634
552635
553636
554637 @Callable(i)
555638 func fromX18WrapperREADONLY (val,resultScaleMult) = $Tuple2(nil, fromX18(parseBigIntValue(val), resultScaleMult))
556639
557640
558641
559642 @Callable(i)
560643 func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(calcPriceBigInt(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
561644
562645
563646
564647 @Callable(i)
565648 func estimatePutOperationWrapperREADONLY (txId58,slippageTolerance,inAmAssetAmt,inAmAssetId,inPrAssetAmt,inPrAssetId,userAddress,isEvaluate,emitLp) = $Tuple2(nil, estimatePutOperation(txId58, slippageTolerance, inAmAssetAmt, inAmAssetId, inPrAssetAmt, inPrAssetId, userAddress, isEvaluate, emitLp))
566649
567650
568651
569652 @Callable(i)
570653 func estimateGetOperationWrapperREADONLY (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
571654 let res = estimateGetOperation(txId58, pmtAssetId, pmtLpAmt, addressFromStringValue(userAddress))
572655 $Tuple2(nil, $Tuple10(res._1, res._2, res._3, res._4, res._5, res._6, res._7, toString(res._8), res._9, res._10))
573656 }
574657
575658
576659
577660 @Callable(i)
578661 func statsREADONLY () = {
579662 let cfg = getPoolConfig()
580663 let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId])
581664 let amtAssetId = cfg[idxAmtAssetId]
582665 let priceAssetId = cfg[idxPriceAssetId]
583666 let iAmtAssetId = cfg[idxIAmtAssetId]
584667 let iPriceAssetId = cfg[idxIPriceAssetId]
585668 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
586669 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
587670 let poolLPBalance = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
588671 let accAmtAssetBalance = getAccBalance(amtAssetId)
589672 let accPriceAssetBalance = getAccBalance(priceAssetId)
590673 let pricesList = if ((poolLPBalance == 0))
591674 then [zeroBigInt, zeroBigInt, zeroBigInt]
592675 else calcPrices(accAmtAssetBalance, accPriceAssetBalance, poolLPBalance)
593676 let curPrice = 0
594677 let lpAmtAssetShare = fromX18(pricesList[1], scale8)
595678 let lpPriceAssetShare = fromX18(pricesList[2], scale8)
596679 let poolWeight = value(getInteger(factoryContract, keyPoolWeight(toString(this))))
597680 $Tuple2(nil, makeString(["%d%d%d%d%d%d%d", toString(accAmtAssetBalance), toString(accPriceAssetBalance), toString(poolLPBalance), toString(curPrice), toString(lpAmtAssetShare), toString(lpPriceAssetShare), toString(poolWeight)], SEP))
598681 }
599682
600683
601684
602685 @Callable(i)
603686 func evaluatePutByAmountAssetREADONLY (inAmAssetAmt) = {
604687 let cfg = getPoolConfig()
605688 let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId])
606689 let amAssetIdStr = cfg[idxAmtAssetId]
607690 let amAssetId = fromBase58String(amAssetIdStr)
608691 let prAssetIdStr = cfg[idxPriceAssetId]
609692 let prAssetId = fromBase58String(prAssetIdStr)
610693 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
611694 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
612695 let poolStatus = cfg[idxPoolStatus]
613696 let poolLPBalance = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
614697 let accAmtAssetBalance = getAccBalance(amAssetIdStr)
615698 let accPriceAssetBalance = getAccBalance(prAssetIdStr)
616699 let amtAssetAmtX18 = toX18(accAmtAssetBalance, amtAssetDcm)
617700 let priceAssetAmtX18 = toX18(accPriceAssetBalance, priceAssetDcm)
618701 let curPriceX18 = if ((poolLPBalance == 0))
619702 then zeroBigInt
620703 else calcPriceBigInt(priceAssetAmtX18, amtAssetAmtX18)
621704 let inAmAssetAmtX18 = toX18(inAmAssetAmt, amtAssetDcm)
622705 let inPrAssetAmtX18 = fraction(inAmAssetAmtX18, curPriceX18, scale18)
623706 let inPrAssetAmt = fromX18(inPrAssetAmtX18, priceAssetDcm)
624707 let estPut = estimatePutOperation("", 500000, inAmAssetAmt, amAssetId, inPrAssetAmt, prAssetId, "", true, false)
625708 let calcLpAmt = estPut._1
626709 let curPriceCalc = estPut._3
627710 let amBalance = estPut._4
628711 let prBalance = estPut._5
629712 let lpEmission = estPut._6
630713 $Tuple2(nil, makeString(["%d%d%d%d%d%d%d%d", toString(calcLpAmt), toString(fromX18(curPriceX18, scale8)), toString(amBalance), toString(prBalance), toString(lpEmission), poolStatus, toString(inAmAssetAmt), toString(inPrAssetAmt)], SEP))
631714 }
632715
633716
634717
635718 @Callable(i)
636719 func evaluatePutByPriceAssetREADONLY (inPrAssetAmt) = {
637720 let cfg = getPoolConfig()
638721 let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId])
639722 let amAssetIdStr = cfg[idxAmtAssetId]
640723 let amAssetId = fromBase58String(amAssetIdStr)
641724 let prAssetIdStr = cfg[idxPriceAssetId]
642725 let prAssetId = fromBase58String(prAssetIdStr)
643726 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
644727 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
645728 let poolStatus = cfg[idxPoolStatus]
646729 let poolLPBalance = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
647730 let amBalanceRaw = getAccBalance(amAssetIdStr)
648731 let prBalanceRaw = getAccBalance(prAssetIdStr)
649732 let amBalanceRawX18 = toX18(amBalanceRaw, amtAssetDcm)
650733 let prBalanceRawX18 = toX18(prBalanceRaw, priceAssetDcm)
651734 let curPriceX18 = if ((poolLPBalance == 0))
652735 then zeroBigInt
653736 else calcPriceBigInt(prBalanceRawX18, amBalanceRawX18)
654737 let inPrAssetAmtX18 = toX18(inPrAssetAmt, priceAssetDcm)
655738 let inAmAssetAmtX18 = fraction(inPrAssetAmtX18, scale18, curPriceX18)
656739 let inAmAssetAmt = fromX18(inAmAssetAmtX18, amtAssetDcm)
657740 let estPut = estimatePutOperation("", 500000, inAmAssetAmt, amAssetId, inPrAssetAmt, prAssetId, "", true, false)
658741 let calcLpAmt = estPut._1
659742 let curPriceCalc = estPut._3
660743 let amBalance = estPut._4
661744 let prBalance = estPut._5
662745 let lpEmission = estPut._6
663746 $Tuple2(nil, makeString(["%d%d%d%d%d%d%d%d", toString(calcLpAmt), toString(fromX18(curPriceX18, scale8)), toString(amBalance), toString(prBalance), toString(lpEmission), poolStatus, toString(inAmAssetAmt), toString(inPrAssetAmt)], SEP))
664747 }
665748
666749
667750
668751 @Callable(i)
669752 func evaluateGetREADONLY (paymentLpAssetId,paymentLpAmt) = {
670753 let res = estimateGetOperation("", paymentLpAssetId, paymentLpAmt, this)
671754 let outAmAmt = res._1
672755 let outPrAmt = res._2
673756 let amBalance = res._5
674757 let prBalance = res._6
675758 let lpEmission = res._7
676759 let curPrice = res._8
677760 let poolStatus = parseIntValue(res._9)
678761 $Tuple2(nil, makeString(["%d%d%d%d%d%d%d", toString(outAmAmt), toString(outPrAmt), toString(amBalance), toString(prBalance), toString(lpEmission), toString(curPrice), toString(poolStatus)], SEP))
679762 }
680763
681764
682765 @Verifier(tx)
683766 func verify () = match tx {
684767 case order: Order =>
685768 let matcherPub = getMatcherPubOrFail()
686769 let orderValid = validateMatcherOrderAllowed(order)
687770 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
688771 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
689772 if (if (if (orderValid)
690773 then senderValid
691774 else false)
692775 then matcherValid
693776 else false)
694777 then true
695778 else throwOrderError(orderValid, senderValid, matcherValid)
696779 case _ =>
697- let managerPublic = valueOrElse(getString(this, keyManagerPublicKey()), EMPTY)
698- if ((managerPublic == EMPTY))
699- then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
700- else sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(managerPublic))
780+ let targetPublicKey = match managerPublicKeyOrUnit() {
781+ case pk: ByteVector =>
782+ pk
783+ case _: Unit =>
784+ tx.senderPublicKey
785+ case _ =>
786+ throw("Match error")
787+ }
788+ sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
701789 }
702790

github/deemru/w8io/026f985 
106.07 ms