2023.05.10 14:22 [3637188] smart account 3PCENpEKe8atwELZ7oCSmcdEfcRuKTrUx99 > SELF 0.00000000 Waves

{ "type": 13, "id": "FuLzmJKimNgjqvspr85YvHJBWqB14X3ePPdNHAnUyob3", "fee": 4200000, "feeAssetId": null, "timestamp": 1683717732980, "version": 2, "chainId": 87, "sender": "3PCENpEKe8atwELZ7oCSmcdEfcRuKTrUx99", "senderPublicKey": "24dorn126Pv4mGCgUu61v1RLxqW4VNXbuHjmCHh7tc3K", "proofs": [ "3h6BCDcjY7EJX2DKJmJVJXftkZjxRCzQ3rc2m2rsWZVp19FnZhRZofpRZcwWpdQ1Ct5YhpzfLKvQnjFBanKYR1Hu" ], "script": "base64:BgKSOAgCEgASBQoDAQQBEgcKBQEEAQgBEgQKAgEEEgMKAQESBAoCAQQSBAoCCAESBAoCCAESBAoCCAESBQoDAQgBEgASBAoCAQESAwoBARIFCgMBAQESBAoCCAgSABIAEgMKAQgSBQoDAQEBEgQKAgEBEgQKAggBEgQKAggIEgsKCQgBAQIBAggEBBIGCgQICAEIEgASAwoBARIDCgEBEgQKAggBIgpsUGRlY2ltYWxzIgZzY2FsZTgiDHNjYWxlOEJpZ0ludCIHc2NhbGUxOCIKemVyb0JpZ0ludCIEYmlnMCIEYmlnMSIEYmlnMiILd2F2ZXNTdHJpbmciA1NFUCIKUG9vbEFjdGl2ZSIPUG9vbFB1dERpc2FibGVkIhNQb29sTWF0Y2hlckRpc2FibGVkIgxQb29sU2h1dGRvd24iDmlkeFBvb2xBZGRyZXNzIg1pZHhQb29sU3RhdHVzIhBpZHhQb29sTFBBc3NldElkIg1pZHhBbXRBc3NldElkIg9pZHhQcmljZUFzc2V0SWQiDmlkeEFtdEFzc2V0RGNtIhBpZHhQcmljZUFzc2V0RGNtIg5pZHhJQW10QXNzZXRJZCIQaWR4SVByaWNlQXNzZXRJZCINaWR4TFBBc3NldERjbSISaWR4UG9vbEFtdEFzc2V0QW10IhRpZHhQb29sUHJpY2VBc3NldEFtdCIRaWR4UG9vbExQQXNzZXRBbXQiGWlkeEZhY3RvcnlTdGFraW5nQ29udHJhY3QiGmlkeEZhY3RvcnlTbGlwcGFnZUNvbnRyYWN0IgV0b1gxOCIHb3JpZ1ZhbCINb3JpZ1NjYWxlTXVsdCILdG9YMThCaWdJbnQiB2Zyb21YMTgiA3ZhbCIPcmVzdWx0U2NhbGVNdWx0Igxmcm9tWDE4Um91bmQiBXJvdW5kIgd0b1NjYWxlIgNhbXQiCHJlc1NjYWxlIghjdXJTY2FsZSIDYWJzIglhYnNCaWdJbnQiDHN3YXBDb250cmFjdCICZmMiE2tleU1hbmFnZXJQdWJsaWNLZXkiFmtleU1hbmFnZXJWYXVsdEFkZHJlc3MiAnBsIgJwaCIBaCIJdGltZXN0YW1wIgNwYXUiC3VzZXJBZGRyZXNzIgR0eElkIgNnYXUiAmFhIgJwYSIGa2V5RmVlIgpmZWVEZWZhdWx0IgNmZWUiBmtleUtMcCIVa2V5S0xwUmVmcmVzaGVkSGVpZ2h0IhJrZXlLTHBSZWZyZXNoRGVsYXkiFmtMcFJlZnJlc2hEZWxheURlZmF1bHQiD2tMcFJlZnJlc2hEZWxheSIUa2V5QWRkaXRpb25hbEJhbGFuY2UiB2Fzc2V0SWQiFmtleVN0YWtpbmdBc3NldEJhbGFuY2UiGmdldEFkZGl0aW9uYWxCYWxhbmNlT3JaZXJvIhxnZXRTdGFraW5nQXNzZXRCYWxhbmNlT3JaZXJvIhBrZXlGYWN0b3J5Q29uZmlnIg1rZXlNYXRjaGVyUHViIilrZXlNYXBwaW5nUG9vbENvbnRyYWN0QWRkcmVzc1RvUG9vbEFzc2V0cyITcG9vbENvbnRyYWN0QWRkcmVzcyINa2V5UG9vbENvbmZpZyIJaUFtdEFzc2V0IgtpUHJpY2VBc3NldCIfa2V5TWFwcGluZ3NCYXNlQXNzZXQyaW50ZXJuYWxJZCIMYmFzZUFzc2V0U3RyIhNrZXlBbGxQb29sc1NodXRkb3duIg1rZXlQb29sV2VpZ2h0Ig9jb250cmFjdEFkZHJlc3MiFmtleUFsbG93ZWRMcFNjcmlwdEhhc2giFmtleUZlZUNvbGxlY3RvckFkZHJlc3MiFmtleVNraXBPcmRlclZhbGlkYXRpb24iC3Bvb2xBZGRyZXNzIg90aHJvd09yZGVyRXJyb3IiCm9yZGVyVmFsaWQiDm9yZGVyVmFsaWRJbmZvIgtzZW5kZXJWYWxpZCIMbWF0Y2hlclZhbGlkIhdhZGRyZXNzRnJvbVN0cmluZ09yVGhpcyINYWRkcmVzc1N0cmluZyIHJG1hdGNoMCIBYSIcZ2V0TWFuYWdlclZhdWx0QWRkcmVzc09yVGhpcyIOZmFjdG9yeUFkZHJlc3MiA2ZjYSIBcyIPZ2V0U3RyaW5nT3JGYWlsIgdhZGRyZXNzIgNrZXkiDGdldEludE9yRmFpbCIIdGhyb3dFcnIiA21zZyIGZm10RXJyIg9mYWN0b3J5Q29udHJhY3QiE2ZlZUNvbGxlY3RvckFkZHJlc3MiBWluRmVlIgFAIgZvdXRGZWUiEGlzR2xvYmFsU2h1dGRvd24iE2dldE1hdGNoZXJQdWJPckZhaWwiDWdldFBvb2xDb25maWciCGFtdEFzc2V0IgpwcmljZUFzc2V0IgxwYXJzZUFzc2V0SWQiBWlucHV0Ig9hc3NldElkVG9TdHJpbmciD3BhcnNlUG9vbENvbmZpZyIKcG9vbENvbmZpZyIQcG9vbENvbmZpZ1BhcnNlZCILJHQwOTUyOTk2OTUiDmNmZ1Bvb2xBZGRyZXNzIg1jZmdQb29sU3RhdHVzIgxjZmdMcEFzc2V0SWQiEGNmZ0Ftb3VudEFzc2V0SWQiD2NmZ1ByaWNlQXNzZXRJZCIWY2ZnQW1vdW50QXNzZXREZWNpbWFscyIVY2ZnUHJpY2VBc3NldERlY2ltYWxzIhBnZXRGYWN0b3J5Q29uZmlnIg9zdGFraW5nQ29udHJhY3QiEHNsaXBwYWdlQ29udHJhY3QiEWRhdGFQdXRBY3Rpb25JbmZvIg1pbkFtdEFzc2V0QW10Ig9pblByaWNlQXNzZXRBbXQiCG91dExwQW10IgVwcmljZSIdc2xpcHBhZ2VUb2xlcmFuY2VQYXNzZWRCeVVzZXIiFXNsaXBwYWdlVG9sZXJhbmNlUmVhbCIIdHhIZWlnaHQiC3R4VGltZXN0YW1wIhJzbGlwYWdlQW10QXNzZXRBbXQiFHNsaXBhZ2VQcmljZUFzc2V0QW10IhFkYXRhR2V0QWN0aW9uSW5mbyIOb3V0QW10QXNzZXRBbXQiEG91dFByaWNlQXNzZXRBbXQiB2luTHBBbXQiDWdldEFjY0JhbGFuY2UiDWJhbGFuY2VPblBvb2wiDHRvdGFsQmFsYW5jZSIPY2FsY1ByaWNlQmlnSW50IghwckFtdFgxOCIIYW1BbXRYMTgiFGNhbGNQcmljZUJpZ0ludFJvdW5kIgdnZXRSYXRlIgVwcm94eSIDaW52IgFyIgdkZXBvc2l0IgZhbW91bnQiDnN0YWtpbmdBc3NldElkIhhjdXJyZW50QWRkaXRpb25hbEJhbGFuY2UiGmN1cnJlbnRTdGFraW5nQXNzZXRCYWxhbmNlIgVhc3NldCINZGVwb3NpdEludm9rZSIUcmVjZWl2ZWRTdGFraW5nQXNzZXQiFG5ld0FkZGl0aW9uYWxCYWxhbmNlIhZuZXdTdGFraW5nQXNzZXRCYWxhbmNlIgh3aXRoZHJhdyIMcHJveHlSYXRlTXVsIg1wcm9maXRBZGRyZXNzIhBjdXJyZW50UHJveHlSYXRlIgdvbGRSYXRlIgxzdGFraW5nQXNzZXQiFG9sZFNlbmRTdGFraW5nQW1vdW50IhZzZW5kU3Rha2luZ0Fzc2V0QW1vdW50Igxwcm9maXRBbW91bnQiDndpdGhkcmF3SW52b2tlIg5yZWNlaXZlZEFzc2V0cyITZ2V0TGVhc2VQcm94eUNvbmZpZyIRcmViYWxhbmNlSW50ZXJuYWwiC3RhcmdldFJhdGlvIgptaW5CYWxhbmNlIhRsZWFzYWJsZVRvdGFsQmFsYW5jZSIXdGFyZ2V0QWRkaXRpb25hbEJhbGFuY2UiBGRpZmYiD3NlbmRBc3NldEFtb3VudCIOZ2V0QXNzZXRBbW91bnQiDnJlYmFsYW5jZUFzc2V0Ig0kdDAxNTkzMTE2MDY3Igppc0xlYXNhYmxlIgtsZWFzZWRSYXRpbyIMcHJveHlBZGRyZXNzIgxwcm94eUFzc2V0SWQiFHN0YWtpbmdQcm9maXRBZGRyZXNzIhl3aXRoZHJhd0FuZFJlYmFsYW5jZUFzc2V0IglnZXRBbW91bnQiDSR0MDE2NDY2MTY2MDIiF25ld1RvdGFsTGVhc2FibGVCYWxhbmNlIg53aXRoZHJhd0Ftb3VudCIXd2l0aGRyYXdBbmRSZWJhbGFuY2VBbGwiFGFtb3VudEFzc2V0T3V0QW1vdW50IhNwcmljZUFzc2V0T3V0QW1vdW50IhJBbUFtdFdpdGhkcmF3U3RhdGUiElByQW10V2l0aGRyYXdTdGF0ZSIQcHJpdmF0ZUNhbGNQcmljZSIKYW1Bc3NldERjbSIKcHJBc3NldERjbSIFYW1BbXQiBXByQW10Ig5hbXRBc3NldEFtdFgxOCIQcHJpY2VBc3NldEFtdFgxOCIKY2FsY1ByaWNlcyIFbHBBbXQiA2NmZyILYW10QXNzZXREY20iDXByaWNlQXNzZXREY20iCHByaWNlWDE4IghscEFtdFgxOCITbHBQcmljZUluQW1Bc3NldFgxOCITbHBQcmljZUluUHJBc3NldFgxOCIPY2FsY3VsYXRlUHJpY2VzIgZwcmljZXMiFGVzdGltYXRlR2V0T3BlcmF0aW9uIgZ0eElkNTgiCnBtdEFzc2V0SWQiCHBtdExwQW10IglscEFzc2V0SWQiCWFtQXNzZXRJZCIJcHJBc3NldElkIgpwb29sU3RhdHVzIgpscEVtaXNzaW9uIglhbUJhbGFuY2UiDGFtQmFsYW5jZVgxOCIJcHJCYWxhbmNlIgxwckJhbGFuY2VYMTgiC2N1clByaWNlWDE4IghjdXJQcmljZSILcG10THBBbXRYMTgiDWxwRW1pc3Npb25YMTgiC291dEFtQW10WDE4IgtvdXRQckFtdFgxOCIIb3V0QW1BbXQiCG91dFByQW10IgVzdGF0ZSIUZXN0aW1hdGVQdXRPcGVyYXRpb24iEXNsaXBwYWdlVG9sZXJhbmNlIgxpbkFtQXNzZXRBbXQiC2luQW1Bc3NldElkIgxpblByQXNzZXRBbXQiC2luUHJBc3NldElkIgppc0V2YWx1YXRlIgZlbWl0THAiDGFtQXNzZXRJZFN0ciIMcHJBc3NldElkU3RyIgtpQW10QXNzZXRJZCINaVByaWNlQXNzZXRJZCIOaW5BbUFzc2V0SWRTdHIiDmluUHJBc3NldElkU3RyIg9pbkFtQXNzZXRBbXRYMTgiD2luUHJBc3NldEFtdFgxOCIMdXNlclByaWNlWDE4IgNyZXMiC3NsaXBwYWdlWDE4IhRzbGlwcGFnZVRvbGVyYW5jZVgxOCIKcHJWaWFBbVgxOCIKYW1WaWFQclgxOCIMZXhwZWN0ZWRBbXRzIhFleHBBbXRBc3NldEFtdFgxOCITZXhwUHJpY2VBc3NldEFtdFgxOCIJY2FsY0xwQW10Ig5jYWxjQW1Bc3NldFBtdCIOY2FsY1ByQXNzZXRQbXQiDHNsaXBwYWdlQ2FsYyIJZW1pdExwQW10IgZhbURpZmYiBnByRGlmZiILY29tbW9uU3RhdGUiB2NhbGNLTHAiDWFtb3VudEJhbGFuY2UiDHByaWNlQmFsYW5jZSIQYW1vdW50QmFsYW5jZVgxOCIPcHJpY2VCYWxhbmNlWDE4Igp1cGRhdGVkS0xwIg5jYWxjQ3VycmVudEtMcCIQYW1vdW50QXNzZXREZWx0YSIPcHJpY2VBc3NldERlbHRhIhRscEFzc2V0RW1pc3Npb25EZWx0YSISYW1vdW50QXNzZXRCYWxhbmNlIhFwcmljZUFzc2V0QmFsYW5jZSIPbHBBc3NldEVtaXNzaW9uIgpjdXJyZW50S0xwIhJyZWZyZXNoS0xwSW50ZXJuYWwiF2Ftb3VudEFzc2V0QmFsYW5jZURlbHRhIhZwcmljZUFzc2V0QmFsYW5jZURlbHRhIgdhY3Rpb25zIhNza2lwT3JkZXJWYWxpZGF0aW9uIhJ2YWxpZGF0ZVVwZGF0ZWRLTHAiBm9sZEtMcCIbdmFsaWRhdGVNYXRjaGVyT3JkZXJBbGxvd2VkIgVvcmRlciIRYW1vdW50QXNzZXRBbW91bnQiEHByaWNlQXNzZXRBbW91bnQiDSR0MDI4OTkxMjkyMDMiA2tMcCINJHQwMjk2NDMyOTc0MyINdW51c2VkQWN0aW9ucyIGa0xwTmV3Igxpc09yZGVyVmFsaWQiBGluZm8iCWNvbW1vbkdldCIBaSIDcG10IgZwbXRBbXQiCWNvbW1vblB1dCIKYW1Bc3NldFBtdCIKcHJBc3NldFBtdCIGZXN0UHV0IgRlbWl0IgdlbWl0SW52Ig1lbWl0SW52TGVnYWN5IhVsZWdhY3lGYWN0b3J5Q29udHJhY3QiB3Rha2VGZWUiCWZlZUFtb3VudCIPY2FsY1B1dE9uZVRva2VuIhBwYXltZW50QW1vdW50UmF3Ig5wYXltZW50QXNzZXRJZCIGaXNFdmFsIhBhbW91bnRCYWxhbmNlUmF3Ig9wcmljZUJhbGFuY2VSYXciFHBheW1lbnRJbkFtb3VudEFzc2V0Ig0kdDAzMjg1NjMzMTQ5IhBhbW91bnRCYWxhbmNlT2xkIg9wcmljZUJhbGFuY2VPbGQiDSR0MDMzMTUzMzMzMDIiFGFtb3VudEFzc2V0QW1vdW50UmF3IhNwcmljZUFzc2V0QW1vdW50UmF3Ig0kdDAzMzQzNDMzNDk4Ig1wYXltZW50QW1vdW50IhBhbW91bnRCYWxhbmNlTmV3Ig9wcmljZUJhbGFuY2VOZXciC3ByaWNlTmV3WDE4IghwcmljZU5ldyIOcGF5bWVudEJhbGFuY2UiFHBheW1lbnRCYWxhbmNlQmlnSW50IgxzdXBwbHlCaWdJbnQiC2NoZWNoU3VwcGx5Ig1kZXBvc2l0QmlnSW50Igtpc3N1ZUFtb3VudCILcHJpY2VPbGRYMTgiCHByaWNlT2xkIgRsb3NzIg0kdDAzNTE3OTM1MzQ2IgdiYWxhbmNlIg9pc3N1ZUFtb3VudEJvdGgiD2NhbGNHZXRPbmVUb2tlbiIKb3V0QXNzZXRJZCIGY2hlY2tzIhBvdXRJbkFtb3VudEFzc2V0Ig1iYWxhbmNlQmlnSW50IhhvdXRJbkFtb3VudEFzc2V0RGVjaW1hbHMiDGFtQmFsYW5jZU9sZCIMcHJCYWxhbmNlT2xkIgpvdXRCYWxhbmNlIhBvdXRCYWxhbmNlQmlnSW50Ig5yZWRlZW1lZEJpZ0ludCIJYW1vdW50UmF3Ig0kdDAzNzQyNDM3NDgwIgt0b3RhbEFtb3VudCINJHQwMzc0ODQzNzcxMCILb3V0QW1BbW91bnQiC291dFByQW1vdW50IgxhbUJhbGFuY2VOZXciDHByQmFsYW5jZU5ldyIYYW1vdW50Qm90aEluUGF5bWVudEFzc2V0IhZtYW5hZ2VyUHVibGljS2V5T3JVbml0IhNtYW5hZ2VyVmF1bHRBZGRyZXNzIglpc01hbmFnZXIiAnBrIgttdXN0TWFuYWdlciICcGQiDWNsZWFuQW1vdW50SW4iCWlzUmV2ZXJzZSINZmVlUG9vbEFtb3VudCINJHQwMzk1NjkzOTg3NCIIYXNzZXRPdXQiB2Fzc2V0SW4iEnBvb2xBc3NldEluQmFsYW5jZSITcG9vbEFzc2V0T3V0QmFsYW5jZSIJYW1vdW50T3V0IgRvbGRLIgRuZXdLIgZjaGVja0siDGFtb3VudE91dE1pbiIJYWRkcmVzc1RvIgtzd2FwQ29udGFjdCIIY2hlY2tNaW4iDnJlYmFsYW5jZVN0YXRlIg13aXRoZHJhd1N0YXRlIg9zaG91bGRBdXRvU3Rha2UiBGFtSWQiBHBySWQiDHNsaXBwYWdlQUludiIMc2xpcHBhZ2VQSW52IgpscFRyYW5zZmVyIgtzbHBTdGFrZUludiINJHQwNDQzNjE0NDgyMyIRcmVmcmVzaEtMcEFjdGlvbnMiEWlzVXBkYXRlZEtMcFZhbGlkIgNyZWIiC21heFNsaXBwYWdlIg0kdDA0NTQzNTQ1NTAwIgxtaW5PdXRBbW91bnQiCWF1dG9TdGFrZSIgaXNQb29sT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWQiDWlzUHV0RGlzYWJsZWQiB3BheW1lbnQiDSR0MDQ2Njg4NDY4NDAiBWJvbnVzIhNlbWl0QW1vdW50RXN0aW1hdGVkIgplbWl0QW1vdW50IghzdGFrZUludiIHc2VuZEZlZSINJHQwNDc0MjY0NzYyMyINJHQwNDc2MjY0NzczNCINJHQwNDgwODk0ODI0NiINb3V0QXNzZXRJZFN0ciINaXNHZXREaXNhYmxlZCINJHQwNDkxMzE0OTI4NCIPYW1vdW50RXN0aW1hdGVkIgdidXJuSW52Ig1hc3NldFRyYW5zZmVyIg0kdDA0OTk0ODUwMTk1IhBmZWVBbW91bnRGb3JDYWxjIg0kdDA1MDE5ODUwMzA2Ig0kdDA1MDU4NDUwNzQwIg11bnN0YWtlQW1vdW50Igp1bnN0YWtlSW52Ig0kdDA1MTY0NTUxNzk2Ig0kdDA1MjQ1NTUyNzAyIg0kdDA1MjcwNTUyODEzIhRidXJuTFBBc3NldE9uRmFjdG9yeSINJHQwNTM5MDg1Mzk4OSISbm9MZXNzVGhlbkFtdEFzc2V0IhRub0xlc3NUaGVuUHJpY2VBc3NldCINJHQwNTUwODQ1NTE2NSINY2hlY2tQYXltZW50cyIPY2hlY2tQb29sU3RhdHVzIg0kdDA1NjQzNzU2NTE4IhVub0xlc3NUaGVuQW1vdW50QXNzZXQiDGNoZWNrQW1vdW50cyINJHQwNTc5NTk1ODA0MCILYW10QXNzZXRTdHIiDXByaWNlQXNzZXRTdHIiGGxhc3RSZWZyZXNoZWRCbG9ja0hlaWdodCIdY2hlY2tMYXN0UmVmcmVzaGVkQmxvY2tIZWlnaHQiDSR0MDU5MjQ0NTkzMDgiEGtMcFVwZGF0ZUFjdGlvbnMiCmFtdEFzc2V0SWQiDHByaWNlQXNzZXRJZCINcG9vbExQQmFsYW5jZSISYWNjQW10QXNzZXRCYWxhbmNlIhRhY2NQcmljZUFzc2V0QmFsYW5jZSIKcHJpY2VzTGlzdCIPbHBBbXRBc3NldFNoYXJlIhFscFByaWNlQXNzZXRTaGFyZSIKcG9vbFdlaWdodCIMY3VyUHJpY2VDYWxjIgxhbUJhbGFuY2VSYXciDHByQmFsYW5jZVJhdyIPYW1CYWxhbmNlUmF3WDE4Ig9wckJhbGFuY2VSYXdYMTgiEHBheW1lbnRMcEFzc2V0SWQiDHBheW1lbnRMcEFtdCICdHgiBnZlcmlmeSIPdGFyZ2V0UHVibGljS2V5IgptYXRjaGVyUHViIg0kdDA2Nzk3MDY4MDg3IgduZXdIYXNoIgthbGxvd2VkSGFzaCILY3VycmVudEhhc2iCAQABYQAIAAFiAIDC1y8AAWMJALYCAQCAwtcvAAFkCQC2AgEAgICQu7rWrfANAAFlCQC2AgEAAAABZgkAtgIBAAAAAWcJALYCAQABAAFoCQC2AgEAAgABaQIFV0FWRVMAAWoCAl9fAAFrAAEAAWwAAgABbQADAAFuAAQAAW8AAQABcAACAAFxAAMAAXIABAABcwAFAAF0AAYAAXUABwABdgAIAAF3AAkAAXgACgABeQABAAF6AAIAAUEAAwABQgABAAFDAAcBAUQCAUUBRgkAvAIDCQC2AgEFAUUFAWQJALYCAQUBRgEBRwIBRQFGCQC8AgMFAUUFAWQFAUYBAUgCAUkBSgkAoAMBCQC8AgMFAUkJALYCAQUBSgUBZAEBSwMBSQFKAUwJAKADAQkAvQIEBQFJCQC2AgEFAUoFAWQFAUwBAU0DAU4BTwFQCQBrAwUBTgUBTwUBUAEBUQEBSQMJAGYCAAAFAUkJAQEtAQUBSQUBSQEBUgEBSQMJAL8CAgUBZQUBSQkAvgIBBQFJBQFJAQFTAAIQJXNfX3N3YXBDb250cmFjdAEBVAACEyVzX19mYWN0b3J5Q29udHJhY3QBAVUAAhQlc19fbWFuYWdlclB1YmxpY0tleQEBVgACFyVzX19tYW5hZ2VyVmF1bHRBZGRyZXNzAQFXAAIRJXMlc19fcHJpY2VfX2xhc3QBAVgCAVkBWgkAuQkCCQDMCAICGCVzJXMlZCVkX19wcmljZV9faGlzdG9yeQkAzAgCCQCkAwEFAVkJAMwIAgkApAMBBQFaBQNuaWwFAWoBAmFhAgJhYgJhYwkArAICCQCsAgIJAKwCAgILJXMlcyVzX19QX18FAmFiAgJfXwUCYWMBAmFkAgJhYgJhYwkArAICCQCsAgIJAKwCAgILJXMlcyVzX19HX18FAmFiAgJfXwUCYWMBAmFlAAIPJXNfX2Ftb3VudEFzc2V0AQJhZgACDiVzX19wcmljZUFzc2V0AAJhZwIHJXNfX2ZlZQACYWgJAGsDAAoFAWIAkE4AAmFpCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFAmFnBQJhaAACYWoJALkJAgkAzAgCAgIlcwkAzAgCAgNrTHAFA25pbAUBagACYWsJALkJAgkAzAgCAgIlcwkAzAgCAhJrTHBSZWZyZXNoZWRIZWlnaHQFA25pbAUBagACYWwJALkJAgkAzAgCAgIlcwkAzAgCAg9yZWZyZXNoS0xwRGVsYXkFA25pbAUBagACYW0AHgACYW4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUCYWwFAmFtAQJhbwECYXAJALkJAgkAzAgCAgQlcyVzCQDMCAICDXN0YWtlZEJhbGFuY2UJAMwIAgUCYXAFA25pbAUBagECYXEBAmFwCQC5CQIJAMwIAgIEJXMlcwkAzAgCAhFzaGFyZUFzc2V0QmFsYW5jZQkAzAgCBQJhcAUDbmlsBQFqAQJhcgECYXAJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAmFvAQUCYXAAAAECYXMBAmFwCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQJhcQEFAmFwAAABAmF0AAIRJXNfX2ZhY3RvcnlDb25maWcBAmF1AAIYJXMlc19fbWF0Y2hlcl9fcHVibGljS2V5AQJhdgECYXcJAKwCAgkArAICAgglcyVzJXNfXwUCYXcCIF9fbWFwcGluZ3NfX3Bvb2xDb250cmFjdDJMcEFzc2V0AQJheAICYXkCYXoJAKwCAgkArAICCQCsAgIJAKwCAgIIJWQlZCVzX18FAmF5AgJfXwUCYXoCCF9fY29uZmlnAQJhQQECYUIJAKwCAgIoJXMlcyVzX19tYXBwaW5nc19fYmFzZUFzc2V0MmludGVybmFsSWRfXwUCYUIBAmFDAAIMJXNfX3NodXRkb3duAQJhRAECYUUJAKwCAgISJXMlc19fcG9vbFdlaWdodF9fBQJhRQECYUYAAhclc19fYWxsb3dlZExwU2NyaXB0SGFzaAACYUcCFyVzX19mZWVDb2xsZWN0b3JBZGRyZXNzAQJhSAECYUkJAKwCAgIbJXMlc19fc2tpcE9yZGVyVmFsaWRhdGlvbl9fBQJhSQECYUoEAmFLAmFMAmFNAmFOCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICJG9yZGVyIHZhbGlkYXRpb24gZmFpbGVkOiBvcmRlclZhbGlkPQkApQMBBQJhSwICICgFAmFMAgEpAg0gc2VuZGVyVmFsaWQ9CQClAwEFAmFNAg4gbWF0Y2hlclZhbGlkPQkApQMBBQJhTgECYU8BAmFQBAJhUQkApggBBQJhUAMJAAECBQJhUQIHQWRkcmVzcwQCYVIFAmFRBQJhUgUEdGhpcwECYVMABAJhVAQCYVEJAKIIAQkBAVQAAwkAAQIFAmFRAgZTdHJpbmcEAmFVBQJhUQkBAmFPAQUCYVUFBHRoaXMEAmFRCQCdCAIFAmFUCQEBVgADCQABAgUCYVECBlN0cmluZwQCYVYFAmFRCQECYU8BBQJhVgUEdGhpcwECYVcCAmFYAmFZCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUCYVgFAmFZCQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFAmFYCQDMCAICAS4JAMwIAgUCYVkJAMwIAgIPIGlzIG5vdCBkZWZpbmVkBQNuaWwCAAECYVoCAmFYAmFZCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUCYVgFAmFZCQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFAmFYCQDMCAICAS4JAMwIAgUCYVkJAMwIAgIPIGlzIG5vdCBkZWZpbmVkBQNuaWwCAAECYmEBAmJiCQACAQkAuQkCCQDMCAICCGxwLnJpZGU6CQDMCAIFAmJiBQNuaWwCASABAmJjAQJiYgkAuQkCCQDMCAICCGxwLnJpZGU6CQDMCAIFAmJiBQNuaWwCASAAAmJkCQERQGV4dHJOYXRpdmUoMTA2MikBCQECYVcCBQR0aGlzCQEBVAAAAmJlCQERQGV4dHJOYXRpdmUoMTA2MikBCQECYVcCBQJiZAUCYUcAAmJmCgACYmcJAPwHBAUCYmQCEGdldEluRmVlUkVBRE9OTFkJAMwIAgkApQgBBQR0aGlzBQNuaWwFA25pbAMJAAECBQJiZwIDSW50BQJiZwkAAgEJAKwCAgkAAwEFAmJnAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQAAmJoCgACYmcJAPwHBAUCYmQCEWdldE91dEZlZVJFQURPTkxZCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQABAgUCYmcCA0ludAUCYmcJAAIBCQCsAgIJAAMBBQJiZwIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AQJiaQAJAQt2YWx1ZU9yRWxzZQIJAJsIAgUCYmQJAQJhQwAHAQJiagAJANkEAQkBAmFXAgUCYmQJAQJhdQABAmJrAAQCYmwJAQJhVwIFBHRoaXMJAQJhZQAEAmJtCQECYVcCBQR0aGlzCQECYWYABAJhegkBAmFaAgUCYmQJAQJhQQEFAmJtBAJheQkBAmFaAgUCYmQJAQJhQQEFAmJsCQC1CQIJAQJhVwIFAmJkCQECYXgCCQCkAwEFAmF5CQCkAwEFAmF6BQFqAQJibgECYm8DCQAAAgUCYm8FAWkFBHVuaXQJANkEAQUCYm8BAmJwAQJibwMJAAACBQJibwUEdW5pdAUBaQkA2AQBCQEFdmFsdWUBBQJibwECYnEBAmJyCQCZCgcJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUCYnIFAW8JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJicgUBcAkA2QQBCQCRAwIFAmJyBQFxCQECYm4BCQCRAwIFAmJyBQFyCQECYm4BCQCRAwIFAmJyBQFzCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYnIFAXQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJicgUBdQACYnMJAQJicQEJAQJiawAAAmJ0BQJicwACYnUIBQJidAJfMQACYnYIBQJidAJfMgACYncIBQJidAJfMwACYngIBQJidAJfNAACYnkIBQJidAJfNQACYnoIBQJidAJfNgACYkEIBQJidAJfNwECYkIACQC1CQIJAQJhVwIFAmJkCQECYXQABQFqAAJiQwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgkBAmJCAAUBQgIZaW5jb3JyZWN0IHN0YWtpbmcgYWRkcmVzcwACYkQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIJAQJiQgAFAUMCGWluY29ycmVjdCBzdGFraW5nIGFkZHJlc3MBAmJFCgJiRgJiRwJiSAJiSQJiSgJiSwJiTAJiTQJiTgJiTwkAuQkCCQDMCAICFCVkJWQlZCVkJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQUCYkYJAMwIAgkApAMBBQJiRwkAzAgCCQCkAwEFAmJICQDMCAIJAKQDAQUCYkkJAMwIAgkApAMBBQJiSgkAzAgCCQCkAwEFAmJLCQDMCAIJAKQDAQUCYkwJAMwIAgkApAMBBQJiTQkAzAgCCQCkAwEFAmJOCQDMCAIJAKQDAQUCYk8FA25pbAUBagECYlAGAmJRAmJSAmJTAmJJAmJMAmJNCQC5CQIJAMwIAgIMJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQUCYlEJAMwIAgkApAMBBQJiUgkAzAgCCQCkAwEFAmJTCQDMCAIJAKQDAQUCYkkJAMwIAgkApAMBBQJiTAkAzAgCCQCkAwEFAmJNBQNuaWwFAWoBAmJUAQJhcAQCYlUDCQAAAgUCYXACBVdBVkVTCAkA7wcBBQR0aGlzCWF2YWlsYWJsZQkA8AcCBQR0aGlzCQDZBAEFAmFwBAJiVgkAZQIJAGQCBQJiVQkBAmFyAQUCYXAJAQJhcwEFAmFwCQCWAwEJAMwIAgAACQDMCAIFAmJWBQNuaWwBAmJXAgJiWAJiWQkAvAIDBQJiWAUBZAUCYlkBAmJaAwJiWAJiWQFMCQC9AgQFAmJYBQFkBQJiWQUBTAECY2EBAmNiBAJjYwkA/AcEBQJjYgIHZ2V0UmF0ZQUDbmlsBQNuaWwDCQAAAgUCY2MFAmNjBAJhUQUCY2MDCQABAgUCYVECA0ludAQCY2QFAmFRBQJjZAkBAmJhAQIgcHJveHkuZ2V0UmF0ZSgpIHVuZXhwZWN0ZWQgdmFsdWUJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAmNlBAJhcAJjZgJjZwJjYgQCY2gJAQJhcgEFAmFwAwkAAAIFAmNoBQJjaAQCY2kJAQJhcwEFAmNnAwkAAAIFAmNpBQJjaQQCY2oJAQJibgEFAmFwAwkAZgIFAmNmAAAEAmNrCQD8BwQFAmNiAgdkZXBvc2l0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmNqBQJjZgUDbmlsAwkAAAIFAmNrBQJjawQCYVEFAmNrAwkAAQIFAmFRAgNJbnQEAmNsBQJhUQQCY20JAGQCBQJjaAUCY2YEAmNuCQBkAgUCY2kFAmNsCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYW8BBQJhcAUCY20JAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhcQEFAmNnBQJjbgUDbmlsBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECY28GAmFwAmNmAmNnAmNiAmNwAmNxBAJjaAkBAmFyAQUCYXADCQAAAgUCY2gFAmNoBAJjaQkBAmFzAQUCY2cDCQAAAgUCY2kFAmNpBAJjcgkBAmNhAQUCY2IDCQAAAgUCY3IFAmNyBAJjcwkAawMFAmNwBQJjaAUCY2kEAmN0CQECYm4BBQJjZwQCY3UJAGsDBQJjcAUCY2YFAmNzBAJjdgkAawMFAmNwBQJjZgUCY3IEAmN3CQCWAwEJAMwIAgAACQDMCAIJAGUCBQJjdQUCY3YFA25pbAMJAGYCBQJjdgAABAJjeAkA/AcEBQJjYgIId2l0aGRyYXcFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCY3QFAmN2BQNuaWwDCQAAAgUCY3gFAmN4BAJhUQUCY3gDCQABAgUCYVECA0ludAQCY3kFAmFRBAJjbQkAZQIFAmNoBQJjeQQCY24JAGUCCQBlAgUCY2kFAmN2BQJjdwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFvAQUCYXAFAmNtCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYXEBBQJjZwUCY24JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUCY3EFAmN3CQECYm4BBQJjZwUDbmlsBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECY3oBAmFwBAJhUQkA/AcEBQJiZAIaZ2V0UG9vbExlYXNlQ29uZmlnUkVBRE9OTFkJAMwIAgkApQgBBQR0aGlzCQDMCAIFAmFwBQNuaWwFA25pbAMJAAECBQJhUQIwKEJvb2xlYW4sIEludCwgSW50LCBTdHJpbmcsIFN0cmluZywgSW50LCBTdHJpbmcpBAJhUgUCYVEFAmFSCQECYmEBCQCsAgIJAKwCAgIBWwUCYXACHV0gZ2V0TGVhc2VQcm94eUNvbmZpZygpIGVycm9yAQJjQQcCY0ICYXACY2cCY0MCY2ICY3ACY3EEAmNoCQECYXIBBQJhcAMJAAACBQJjaAUCY2gEAmNpCQECYXMBBQJjZwMJAAACBQJjaQUCY2kEAmNECQCWAwEJAMwIAgAACQDMCAIJAGUCCQECYlQBBQJhcAUCY0MFA25pbAQCY0UJAGsDBQJjQgUCY0QAZAQCY0YJAGUCBQJjaAUCY0UDCQAAAgUCY0YAAAUDbmlsAwkAZgIAAAUCY0YEAmNHCQEBLQEFAmNGCQECY2UEBQJhcAUCY0cFAmNnBQJjYgQCY0gFAmNGCQECY28GBQJhcAUCY0gFAmNnBQJjYgUCY3AFAmNxCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJjSQECYXAEAmNKCQECY3oBBQJhcAQCY0sIBQJjSgJfMQQCY0wIBQJjSgJfMgQCY0MIBQJjSgJfMwQCY00IBQJjSgJfNAQCY04IBQJjSgJfNQQCY3AIBQJjSgJfNgQCY08IBQJjSgJfNwMFAmNLCQECY0EHBQJjTAUCYXAFAmNOBQJjQwkBEUBleHRyTmF0aXZlKDEwNjIpAQUCY00FAmNwCQERQGV4dHJOYXRpdmUoMTA2MikBBQJjTwUDbmlsAQJjUAICYXACY1EEAmNSCQECY3oBBQJhcAQCY0sIBQJjUgJfMQQCY0wIBQJjUgJfMgQCY0MIBQJjUgJfMwQCY00IBQJjUgJfNAQCY04IBQJjUgJfNQQCY3AIBQJjUgJfNgQCY08IBQJjUgJfNwMFAmNLBAJjUwkAlgMBCQDMCAIAAAkAzAgCCQBlAgkAZQIJAQJiVAEFAmFwBQJjUQUCY0MFA25pbAMJAAACBQJjUwUCY1MEAmNtCQBrAwUCY0wFAmNTAGQDCQAAAgUCY20FAmNtBAJjVAkAZQIJAQJhcgEFAmFwBQJjbQMJAAACBQJjVAUCY1QDCQBmAgAABQJjVAkBAmNlBAUCYXAJAQEtAQUCY1QFAmNOCQERQGV4dHJOYXRpdmUoMTA2MikBBQJjTQkBAmNvBgUCYXAFAmNUBQJjTgkBEUBleHRyTmF0aXZlKDEwNjIpAQUCY00FAmNwCQERQGV4dHJOYXRpdmUoMTA2MikBBQJjTwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUDbmlsAQJjVQICY1YCY1cEAmNYCQECY1ACCQECYVcCBQR0aGlzCQECYWUABQJjVgQCY1kJAQJjUAIJAQJhVwIFBHRoaXMJAQJhZgAFAmNXCQDOCAIFAmNYBQJjWQECY1oEAmRhAmRiAmRjAmRkBAJkZQkBAUQCBQJkYwUCZGEEAmRmCQEBRAIFAmRkBQJkYgkBAmJXAgUCZGYFAmRlAQJkZwMCZGMCZGQCZGgEAmRpCQECYmsABAJkagkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmRpBQF0BAJkawkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmRpBQF1BAJkbAkBAmNaBAUCZGoFAmRrBQJkYwUCZGQEAmJZCQEBRAIFAmRjBQJkagQCYlgJAQFEAgUCZGQFAmRrBAJkbQkBAUQCBQJkaAUBYgQCZG4JAQJiVwIFAmJZBQJkbQQCZG8JAQJiVwIFAmJYBQJkbQkAzAgCBQJkbAkAzAgCBQJkbgkAzAgCBQJkbwUDbmlsAQJkcAMCZGMCZGQCZGgEAmRxCQECZGcDBQJkYwUCZGQFAmRoCQDMCAIJAQFIAgkAkQMCBQJkcQAABQFiCQDMCAIJAQFIAgkAkQMCBQJkcQABBQFiCQDMCAIJAQFIAgkAkQMCBQJkcQACBQFiBQNuaWwBAmRyBAJkcwJkdAJkdQJhYgQCZGkJAQJiawAEAmR2CQCRAwIFAmRpBQFxBAJkdwkAkQMCBQJkaQUBcgQCZHgJAJEDAgUCZGkFAXMEAmRhCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZGkFAXQEAmRiCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZGkFAXUEAmR5CQCRAwIFAmRpBQFwBAJkeggJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBCQDZBAEFAmR2CQCsAgIJAKwCAgIGQXNzZXQgBQJkdgIOIGRvZXNuJ3QgZXhpc3QIcXVhbnRpdHkDCQECIT0CBQJkdgUCZHQJAAIBAhVJbnZhbGlkIGFzc2V0IHBhc3NlZC4EAmRBCQECYlQBBQJkdwQCZEIJAQFEAgUCZEEFAmRhBAJkQwkBAmJUAQUCZHgEAmRECQEBRAIFAmRDBQJkYgQCZEUJAQJiVwIFAmREBQJkQgQCZEYJAQFIAgUCZEUFAWIEAmRHCQEBRAIFAmR1BQFiBAJkSAkBAUQCBQJkegUBYgQCZEkJALwCAwUCZEIFAmRHBQJkSAQCZEoJALwCAwUCZEQFAmRHBQJkSAQCZEsJAQFLAwUCZEkFAmRhBQVGTE9PUgQCZEwJAQFLAwUCZEoFAmRiBQVGTE9PUgQCZE0DCQAAAgUCZHMCAAUDbmlsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmFiBQJkSwMJAAACBQJkdwIFV0FWRVMFBHVuaXQJANkEAQUCZHcJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUCYWIFAmRMAwkAAAIFAmR4AgVXQVZFUwUEdW5pdAkA2QQBBQJkeAkAzAgCCQELU3RyaW5nRW50cnkCCQECYWQCCQClCAEFAmFiBQJkcwkBAmJQBgUCZEsFAmRMBQJkdQUCZEYFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFXAAUCZEYJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFYAgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUCZEYFA25pbAkAnAoKBQJkSwUCZEwFAmR3BQJkeAUCZEEFAmRDBQJkegUCZEUFAmR5BQJkTQECZE4JAmRzAmRPAmRQAmRRAmRSAmRTAmFiAmRUAmRVBAJkaQkBAmJrAAQCZHYJANkEAQkAkQMCBQJkaQUBcQQCZFYJAJEDAgUCZGkFAXIEAmRXCQCRAwIFAmRpBQFzBAJkWAkAkQMCBQJkaQUBdgQCZFkJAJEDAgUCZGkFAXcEAmRqCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZGkFAXQEAmRrCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZGkFAXUEAmR5CQCRAwIFAmRpBQFwBAJkeggJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBBQJkdgkArAICCQCsAgICBkFzc2V0IAkA2AQBBQJkdgIOIGRvZXNuJ3QgZXhpc3QIcXVhbnRpdHkEAmRaCQDYBAEJAQt2YWx1ZU9yRWxzZQIFAmRRCQDZBAECBVdBVkVTBAJlYQkA2AQBCQELdmFsdWVPckVsc2UCBQJkUwkA2QQBAgVXQVZFUwMDCQECIT0CBQJkVgUCZFoGCQECIT0CBQJkVwUCZWEJAAIBAiJJbnZhbGlkIGFtdCBvciBwcmljZSBhc3NldCBwYXNzZWQuBAJkQQMFAmRUCQECYlQBBQJkVgkAZQIJAQJiVAEFAmRWBQJkUAQCZEMDBQJkVAkBAmJUAQUCZFcJAGUCCQECYlQBBQJkVwUCZFIEAmViCQEBRAIFAmRQBQJkagQCZWMJAQFEAgUCZFIFAmRrBAJlZAkBAmJXAgUCZWMFAmViBAJkQgkBAUQCBQJkQQUCZGoEAmRECQEBRAIFAmRDBQJkawQCZWUDCQAAAgUCZHoAAAQCZEUFAWUEAmVmBQFlBAJkbQkAdgYJALkCAgUCZWIFAmVjAAAJALYCAQAFAAEAAAUERE9XTgkAlwoFCQEBSAIFAmRtBQFiCQEBSAIFAmViBQJkagkBAUgCBQJlYwUCZGsJAQJiVwIJALcCAgUCZEQFAmVjCQC3AgIFAmRCBQJlYgUCZWYEAmRFCQECYlcCBQJkRAUCZEIEAmVmCQC8AgMJAQFSAQkAuAICBQJkRQUCZWQFAWQFAmRFBAJlZwkBAUQCBQJkTwUBYgMDCQECIT0CBQJkRQUBZQkAvwICBQJlZgUCZWcHCQACAQkArAICCQCsAgIJAKwCAgIPUHJpY2Ugc2xpcHBhZ2UgCQCmAwEFAmVmAh4gZXhjZWVkZWQgdGhlIHBhc3NlZCBsaW1pdCBvZiAJAKYDAQUCZWcEAmRICQEBRAIFAmR6BQFiBAJlaAkAvQIEBQJlYgkBAmJaAwUCZEQFAmRCBQdDRUlMSU5HBQFkBQdDRUlMSU5HBAJlaQkAvQIEBQJlYwUBZAkBAmJaAwUCZEQFAmRCBQVGTE9PUgUHQ0VJTElORwQCZWoDCQC/AgIFAmVoBQJlYwkAlAoCBQJlaQUCZWMJAJQKAgUCZWIFAmVoBAJlawgFAmVqAl8xBAJlbAgFAmVqAl8yBAJkbQkAvQIEBQJkSAUCZWwFAmREBQVGTE9PUgkAlwoFCQEBSwMFAmRtBQFiBQVGTE9PUgkBAUsDBQJlawUCZGoFB0NFSUxJTkcJAQFLAwUCZWwFAmRrBQdDRUlMSU5HBQJkRQUCZWYEAmVtCAUCZWUCXzEEAmVuCAUCZWUCXzIEAmVvCAUCZWUCXzMEAmRGCQEBSAIIBQJlZQJfNAUBYgQCZXAJAQFIAggFAmVlAl81BQFiAwkAZwIAAAUCZW0JAAIBAjZJbnZhbGlkIGNhbGN1bGF0aW9ucy4gTFAgY2FsY3VsYXRlZCBpcyBsZXNzIHRoYW4gemVyby4EAmVxAwkBASEBBQJkVQAABQJlbQQCZXIJAGUCBQJkUAUCZW4EAmVzCQBlAgUCZFIFAmVvBAJldAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVcABQJkRgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVgCBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQJkRgkAzAgCCQELU3RyaW5nRW50cnkCCQECYWECBQJhYgUCZHMJAQJiRQoFAmVuBQJlbwUCZXEFAmRGBQJkTwUCZXAFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFAmVyBQJlcwUDbmlsCQCfCg0FAmVtBQJlcQUCZEYFAmRBBQJkQwUCZHoFAmR2BQJkeQUCZXQFAmVyBQJlcwUCZFEFAmRTAQJldQMCZXYCZXcCZHoEAmV4CQEBRwIFAmV2CQC2AgEFAmJ6BAJleQkBAUcCBQJldwkAtgIBBQJiQQQCZXoJALwCAwkAdgYJALkCAgUCZXgFAmV5AAAJALYCAQAFAAEAEgUERE9XTgUBZwUCZHoDCQAAAgUCZHoFAWYFAWYFAmV6AQJlQQMCZUICZUMCZUQEAmVFCQC4AgIJALYCAQkBAmJUAQkBAmJwAQUCYngFAmVCBAJlRgkAuAICCQC2AgEJAQJiVAEJAQJicAEFAmJ5BQJlQwQCZUcJALgCAgkAtgIBCAkBBXZhbHVlAQkA7AcBBQJidwhxdWFudGl0eQUCZUQEAmVICQECZXUDBQJlRQUCZUYFAmVHBQJlSAECZUkDAmVKAmVLAmVEBAJlRQkAZAIJAQJiVAEJAQJicAEFAmJ4BQJlSgQCZUYJAGQCCQECYlQBCQECYnABBQJieQUCZUsEAmVHCQBkAggJAQV2YWx1ZQEJAOwHAQUCYncIcXVhbnRpdHkFAmVEBAJlegkBAmV1AwkAtgIBBQJlRQkAtgIBBQJlRgkAtgIBBQJlRwQCZUwJAMwIAgkBDEludGVnZXJFbnRyeQIFAmFrBQZoZWlnaHQJAMwIAgkBC1N0cmluZ0VudHJ5AgUCYWoJAKYDAQUCZXoFA25pbAkAlAoCBQJlTAUCZXoBAmVNAAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQJiZAkBAmFIAQkApQgBBQR0aGlzBwECZU4CAmVPAmV6AwkAwAICBQJlegUCZU8GCQECYmEBCQC5CQIJAMwIAgIidXBkYXRlZCBLTHAgbG93ZXIgdGhhbiBjdXJyZW50IEtMcAkAzAgCCQCmAwEFAmVPCQDMCAIJAKYDAQUCZXoFA25pbAIBIAECZVABAmVRBAJlRQkBAmJUAQkBAmJwAQUCYngEAmVGCQECYlQBCQECYnABBQJieQQCZVIIBQJlUQZhbW91bnQEAmVTCQBuBAgFAmVRBmFtb3VudAgFAmVRBXByaWNlBQFiBQVGTE9PUgQCZVQDCQAAAggFAmVRCW9yZGVyVHlwZQUDQnV5CQCUCgIFAmVSCQEBLQEFAmVTCQCUCgIJAQEtAQUCZVIFAmVTBAJlSggFAmVUAl8xBAJlSwgFAmVUAl8yAwMDCQECYmkABgkAAAIFAmJ2BQFtBgkAAAIFAmJ2BQFuCQACAQIcRXhjaGFuZ2Ugb3BlcmF0aW9ucyBkaXNhYmxlZAMDCQECIT0CCAgFAmVRCWFzc2V0UGFpcgthbW91bnRBc3NldAUCYngGCQECIT0CCAgFAmVRCWFzc2V0UGFpcgpwcmljZUFzc2V0BQJieQkAAgECE1dyb25nIG9yZGVyIGFzc2V0cy4EAmVVCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKgDAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQJhagIBMAkBAmJjAQILaW52YWxpZCBrTHAEAmVWCQECZUkDBQJlSgUCZUsAAAQCZVcIBQJlVgJfMQQCZVgIBQJlVgJfMgQCZVkJAMACAgUCZVgFAmVVBAJlWgkAuQkCCQDMCAICBGtMcD0JAMwIAgkApgMBBQJlVQkAzAgCAggga0xwTmV3PQkAzAgCCQCmAwEFAmVYCQDMCAICFCBhbW91bnRBc3NldEJhbGFuY2U9CQDMCAIJAKQDAQUCZUUJAMwIAgITIHByaWNlQXNzZXRCYWxhbmNlPQkAzAgCCQCkAwEFAmVGCQDMCAICGSBhbW91bnRBc3NldEJhbGFuY2VEZWx0YT0JAMwIAgkApAMBBQJlSgkAzAgCAhggcHJpY2VBc3NldEJhbGFuY2VEZWx0YT0JAMwIAgkApAMBBQJlSwkAzAgCAgggaGVpZ2h0PQkAzAgCCQCkAwEFBmhlaWdodAUDbmlsAgAJAJQKAgUCZVkFAmVaAQJmYQECZmIDCQECIT0CCQCQAwEIBQJmYghwYXltZW50cwABCQACAQIdZXhhY3RseSAxIHBheW1lbnQgaXMgZXhwZWN0ZWQEAmZjCQEFdmFsdWUBCQCRAwIIBQJmYghwYXltZW50cwAABAJkdAkBBXZhbHVlAQgFAmZjB2Fzc2V0SWQEAmZkCAUCZmMGYW1vdW50BAJlZQkBAmRyBAkA2AQBCAUCZmINdHJhbnNhY3Rpb25JZAkA2AQBBQJkdAUCZmQIBQJmYgZjYWxsZXIEAmRLCAUCZWUCXzEEAmRMCAUCZWUCXzIEAmR5CQENcGFyc2VJbnRWYWx1ZQEIBQJlZQJfOQQCZE0IBQJlZQNfMTADAwkBAmJpAAYJAAACBQJkeQUBbgkAAgEJAKwCAgIsR2V0IG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IGFkbWluLiBTdGF0dXMgPSAJAKQDAQUCZHkJAJcKBQUCZEsFAmRMBQJmZAUCZHQFAmRNAQJmZQMCZmICZE8CZFUDCQECIT0CCQCQAwEIBQJmYghwYXltZW50cwACCQACAQIfZXhhY3RseSAyIHBheW1lbnRzIGFyZSBleHBlY3RlZAQCZmYJAQV2YWx1ZQEJAJEDAggFAmZiCHBheW1lbnRzAAAEAmZnCQEFdmFsdWUBCQCRAwIIBQJmYghwYXltZW50cwABBAJmaAkBAmROCQkA2AQBCAUCZmINdHJhbnNhY3Rpb25JZAUCZE8IBQJmZgZhbW91bnQIBQJmZgdhc3NldElkCAUCZmcGYW1vdW50CAUCZmcHYXNzZXRJZAkApQgBCAUCZmIGY2FsbGVyBwUCZFUEAmR5CQENcGFyc2VJbnRWYWx1ZQEIBQJmaAJfOAMDAwkBAmJpAAYJAAACBQJkeQUBbAYJAAACBQJkeQUBbgkAAgEJAKwCAgIsUHV0IG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IGFkbWluLiBTdGF0dXMgPSAJAKQDAQUCZHkFAmZoAQJmaQECY2YEAmZqCQD8BwQFAmJkAgRlbWl0CQDMCAIFAmNmBQNuaWwFA25pbAMJAAACBQJmagUCZmoEAmZrBAJhUQUCZmoDCQABAgUCYVECB0FkZHJlc3MEAmZsBQJhUQkA/AcEBQJmbAIEZW1pdAkAzAgCBQJjZgUDbmlsBQNuaWwFBHVuaXQDCQAAAgUCZmsFAmZrBQJjZgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECZm0CAmNmAmFpBAJmbgMJAAACBQJhaQAAAAAJAGsDBQJjZgUCYWkFAWIJAJQKAgkAZQIFAmNmBQJmbgUCZm4BAmZvBAJmcAJmcQJhYgJhYwQCZnIJAAACBQJhYwUEdW5pdAQCZnMJAQJiVAEJAQJicAEFAmJ4BAJmdAkBAmJUAQkBAmJwAQUCYnkEAmZ1AwkAAAIFAmZxBQJieAYDCQAAAgUCZnEFAmJ5BwkBAmJhAQINaW52YWxpZCBhc3NldAQCZnYDBQJmcgkAlAoCBQJmcwUCZnQDBQJmdQkAlAoCCQBlAgUCZnMFAmZwBQJmdAkAlAoCBQJmcwkAZQIFAmZ0BQJmcAQCZncIBQJmdgJfMQQCZngIBQJmdgJfMgQCZnkDBQJmdQkAlAoCBQJmcAAACQCUCgIAAAUCZnAEAmZ6CAUCZnkCXzEEAmZBCAUCZnkCXzIEAmVSCAkBAmZtAgUCZnoFAmJmAl8xBAJlUwgJAQJmbQIFAmZBBQJiZgJfMQQCZkIJAQJmbQIFAmZwBQJiZgQCZkMIBQJmQgJfMQQCZm4IBQJmQgJfMgQCZkQJAGQCBQJmdwUCZVIEAmZFCQBkAgUCZngFAmVTBAJmRgkBAmJXAgkBAUQCBQJmRQUCYkEJAQFEAgUCZkQFAmJ6BAJmRwkBAUgCBQJmRgUBYgQCZkgDBQJmdQUCZncFAmZ4BAJmSQkAtgIBBQJmSAQCZkoJALYCAQgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBBQJidwkArAICCQCsAgICBmFzc2V0IAkA2AQBBQJidwIOIGRvZXNuJ3QgZXhpc3QIcXVhbnRpdHkEAmZLAwkAvwICBQJmSgUBZgYJAQJiYQECImluaXRpYWwgZGVwb3NpdCByZXF1aXJlcyBhbGwgY29pbnMDCQAAAgUCZksFAmZLBAJmTAkAtgIBBQJmQwQCZk0JAJYDAQkAzAgCAAAJAMwIAgkAoAMBCQC6AgIJALkCAgUCZkoJALgCAgkBCnNxcnRCaWdJbnQECQC3AgIFAWQJALoCAgkAuQICBQJmTAUBZAUCZkkAEgASBQRET1dOBQFkBQFkBQNuaWwEAmV0AwUCZnIFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVcABQJmRwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVgCBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQJmRwkAzAgCCQELU3RyaW5nRW50cnkCCQECYWECCQClCAEJAQV2YWx1ZQEFAmFiCQDYBAEJAQV2YWx1ZQEFAmFjCQECYkUKBQJmegUCZkEFAmZNBQJmRwAAAAAFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAAAAAABQNuaWwEAmZOCQECYlcCCQEBRAIFAmZ4BQJiQQkBAUQCBQJmdwUCYnoEAmZPCQEBSAIFAmZOBQFiBAJmUAQCZlEDBQJmdQkAlAoCBQJmegUCZncJAJQKAgUCZkEFAmZ4BAJjZggFAmZRAl8xBAJmUggFAmZRAl8yBAJmUwkAoAMBCQC8AgMFAmZKCQC2AgEJAGkCBQJjZgACCQC2AgEFAmZSCQBrAwkAZQIFAmZNBQJmUwUBYgUCZlMJAJcKBQUCZk0FAmV0BQJmbgUCZlAFAmZ1CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJmVAUCZlUCZkMCZnECYWICYWMEAmZyCQAAAgUCYWMFBHVuaXQEAmRpCQECYmsABAJkagkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmRpBQF0BAJkawkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmRpBQF1BAJmVgkAzAgCAwkAAAIFAmZxBQJidwYJAQJiYQECEGludmFsaWQgbHAgYXNzZXQFA25pbAMJAAACBQJmVgUCZlYEAmZXAwkAAAIFAmZVBQJieAYDCQAAAgUCZlUFAmJ5BwkBAmJhAQINaW52YWxpZCBhc3NldAQCZlgDBQJmVwkAtgIBCQECYlQBCQECYnABBQJieAkAtgIBCQECYlQBCQECYnABBQJieQQCZlkDBQJmVwUCZGoFAmRrBAJmWgkBAmJUAQkBAmJwAQUCYngEAmdhCQECYlQBCQECYnABBQJieQQCZ2IDBQJmVwUCZloFAmdhBAJnYwkAtgIBBQJnYgQCZkoJALYCAQgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBBQJidwkArAICCQCsAgICBmFzc2V0IAkA2AQBBQJidwIOIGRvZXNuJ3QgZXhpc3QIcXVhbnRpdHkEAmdkCQC2AgEFAmZDBAJnZQkAlgMBCQDMCAIAAAkAzAgCCQCgAwEJALoCAgkAuQICBQJmWAkAuAICBQFkCQB2BgkAuAICBQFkCQC6AgIJALkCAgUCZ2QFAWQFAmZKABIFAWgAAAASBQRET1dOBQFkBQNuaWwEAmdmCQECZm0CBQJnZQUCYmgEAmdnCAUCZ2YCXzEEAmZuCAUCZ2YCXzIEAmdoAwUCZlcJAJYKBAUCZ2cAAAkAZQIFAmZaBQJnZQUCZ2EJAJYKBAAABQJnZwUCZloJAGUCBQJnYQUCZ2UEAmdpCAUCZ2gCXzEEAmdqCAUCZ2gCXzIEAmdrCAUCZ2gCXzMEAmdsCAUCZ2gCXzQEAmZGCQECYlcCCQEBRAIFAmdsBQJiQQkBAUQCBQJnawUCYnoEAmZHCQEBSAIFAmZGBQFiBAJldAMFAmZyBQNuaWwJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFkAgkApQgBCQEFdmFsdWUBBQJhYgkA2AQBCQEFdmFsdWUBBQJhYwkBAmJQBgUCZ2kFAmdqBQJmQwUCZkcFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFXAAUCZkcJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFYAgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUCZkcFA25pbAQCZk4JAQJiVwIJAQFEAgUCZ2EFAmJBCQEBRAIFAmZaBQJiegQCZk8JAQFIAgUCZk4FAWIEAmZQBAJnbQkAaAIJAKADAQkAvAIDBQJmWAUCZ2QFAmZKAAIJAGsDCQBlAgUCZ2cFAmdtBQFiBQJnbQkAlwoFBQJnZwUCZXQFAmZuBQJmUAUCZlcJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAmduAAQCZ28JAQJhUwAEAmFRCQCdCAIFAmdvCQEBVQADCQABAgUCYVECBlN0cmluZwQCYVYFAmFRCQDZBAEFAmFWAwkAAQIFAmFRAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IBAmdwAQJmYgQCYVEJAQJnbgADCQABAgUCYVECCkJ5dGVWZWN0b3IEAmdxBQJhUQkAAAIIBQJmYg9jYWxsZXJQdWJsaWNLZXkFAmdxAwkAAQIFAmFRAgRVbml0CQAAAggFAmZiBmNhbGxlcgUEdGhpcwkAAgECC01hdGNoIGVycm9yAQJncgECZmIEAmdzCQACAQIRUGVybWlzc2lvbiBkZW5pZWQEAmFRCQECZ24AAwkAAQIFAmFRAgpCeXRlVmVjdG9yBAJncQUCYVEDCQAAAggFAmZiD2NhbGxlclB1YmxpY0tleQUCZ3EGBQJncwMJAAECBQJhUQIEVW5pdAMJAAACCAUCZmIGY2FsbGVyBQR0aGlzBgUCZ3MJAAIBAgtNYXRjaCBlcnJvchwCZmIBCXJlYmFsYW5jZQAJAM4IAgkBAmNJAQkBAmFXAgUEdGhpcwkBAmFlAAkBAmNJAQkBAmFXAgUEdGhpcwkBAmFmAAJmYgEhY2FsY3VsYXRlQW1vdW50T3V0Rm9yU3dhcFJFQURPTkxZAwJndAJndQJndgQCZ3cDCQAAAgUCZ3UHBAJneAkBAmFXAgUEdGhpcwkBAmFmAAQCZ3kJAQJhVwIFBHRoaXMJAQJhZQAJAJQKAgUCZ3gFAmd5BAJneAkBAmFXAgUEdGhpcwkBAmFlAAQCZ3kJAQJhVwIFBHRoaXMJAQJhZgAJAJQKAgUCZ3gFAmd5BAJneAgFAmd3Al8xBAJneQgFAmd3Al8yBAJnegkBAmJUAQUCZ3kEAmdBCQECYlQBBQJneAQCZ0IJAGsDBQJnQQUCZ3QJAGQCBQJnegUCZ3QEAmdDCQC5AgIJALYCAQUCZ3oJALYCAQUCZ0EEAmdECQC5AgIJALcCAgkAtwICCQC2AgEJAQJiVAEFAmd5CQC2AgEFAmd0CQC2AgEFAmd2CQC4AgIJALYCAQkBAmJUAQUCZ3gJALYCAQUCZ0IEAmdFAwkAwAICBQJnRAUCZ0MGCQACAQIUbmV3IEsgaXMgZmV3ZXIgZXJyb3IDCQAAAgUCZ0UFAmdFCQCUCgIFA25pbAUCZ0IJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZmIBJmNhbGN1bGF0ZUFtb3VudE91dEZvclN3YXBBbmRTZW5kVG9rZW5zBQJndAJndQJnRgJnRwJndgQCZ0gKAAJiZwkA/AcEBQJiZAIXZ2V0U3dhcENvbnRyYWN0UkVBRE9OTFkFA25pbAUDbmlsAwkAAQIFAmJnAgZTdHJpbmcFAmJnCQACAQkArAICCQADAQUCYmcCGyBjb3VsZG4ndCBiZSBjYXN0IHRvIFN0cmluZwQCZlYJAMwIAgMJAGcCCAkBBXZhbHVlAQkAkQMCCAUCZmIIcGF5bWVudHMAAAZhbW91bnQFAmd0BgkBAmJhAQIMV3JvbmcgYW1vdW50CQDMCAIDCQAAAggFAmZiBmNhbGxlcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUCZ0gGCQECYmEBAhFQZXJtaXNzaW9uIGRlbmllZAUDbmlsAwkAAAIFAmZWBQJmVgQCZmMJAQV2YWx1ZQEJAJEDAggFAmZiCHBheW1lbnRzAAAEAmd5CQECYnABCAUCZmMHYXNzZXRJZAQCZ3gDCQAAAgUCZ3UHCQECYVcCBQR0aGlzCQECYWYACQECYVcCBQR0aGlzCQECYWUABAJnegkAZQIJAQJiVAEFAmd5CAkBBXZhbHVlAQkAkQMCCAUCZmIIcGF5bWVudHMAAAZhbW91bnQEAmdBCQECYlQBBQJneAQCZ0IJAGsDBQJnQQUCZ3QJAGQCBQJnegUCZ3QEAmdDCQC5AgIJALYCAQUCZ3oJALYCAQUCZ0EEAmdECQC5AgIJALcCAgkAtgIBCQECYlQBBQJneQkAtgIBBQJndgkAuAICCQC2AgEJAQJiVAEFAmd4CQC2AgEFAmdCBAJnRQMJAMACAgUCZ0QFAmdDBgkAAgECFG5ldyBLIGlzIGZld2VyIGVycm9yAwkAAAIFAmdFBQJnRQQCZ0kDCQBnAgUCZ0IFAmdGBgkAAgECLEV4Y2hhbmdlIHJlc3VsdCBpcyBmZXdlciBjb2lucyB0aGFuIGV4cGVjdGVkAwkAAAIFAmdJBQJnSQQCZ0oJAQJjSQEFAmd5AwkAAAIFAmdKBQJnSgQCZ0sJAQJjUAIFAmd4BQJnQgMJAAACBQJnSwUCZ0sJAJQKAgkAzggCCQDOCAIFAmdLBQJnSgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQJnRwUCZ0IJAQJibgEFAmd4BQNuaWwFAmdCCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmZiAQNwdXQCAmRPAmdMAwkAZgIAAAUCZE8JAAIBAiBJbnZhbGlkIHNsaXBwYWdlVG9sZXJhbmNlIHBhc3NlZAQCZmgJAQJmZQMFAmZiBQJkTwYEAmVxCAUCZmgCXzIEAmR2CAUCZmgCXzcEAmRNCAUCZmgCXzkEAmVyCAUCZmgDXzEwBAJlcwgFAmZoA18xMQQCZ00IBQJmaANfMTIEAmdOCAUCZmgDXzEzBAJmZgkAtgIBCAkBBXZhbHVlAQkAkQMCCAUCZmIIcGF5bWVudHMAAAZhbW91bnQEAmZnCQC2AgEICQEFdmFsdWUBCQCRAwIIBQJmYghwYXltZW50cwABBmFtb3VudAQCZUgJAQJlQQMFAmZmBQJmZwkAtgIBAAADCQAAAgUCZUgFAmVIBAJmagkA/AcEBQJiZAIEZW1pdAkAzAgCBQJlcQUDbmlsBQNuaWwDCQAAAgUCZmoFAmZqBAJmawQCYVEFAmZqAwkAAQIFAmFRAgdBZGRyZXNzBAJmbAUCYVEJAPwHBAUCZmwCBGVtaXQJAMwIAgUCZXEFA25pbAUDbmlsBQR1bml0AwkAAAIFAmZrBQJmawQCZ08DCQBmAgUCZXIAAAkA/AcEBQJiRAIDcHV0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmdNBQJlcgUDbmlsBQNuaWwDCQAAAgUCZ08FAmdPBAJnUAMJAGYCBQJlcwAACQD8BwQFAmJEAgNwdXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCZ04FAmVzBQNuaWwFA25pbAMJAAACBQJnUAUCZ1AEAmdRAwUCZ0wEAmdSCQD8BwQFAmJDAgVzdGFrZQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJkdgUCZXEFA25pbAMJAAACBQJnUgUCZ1IFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUCZmIGY2FsbGVyBQJlcQUCZHYFA25pbAQCZ1MJAQJlSQMAAAAAAAADCQAAAgUCZ1MFAmdTBAJleggFAmdTAl8yBAJnVAgFAmdTAl8xBAJnVQkBAmVOAgUCZUgFAmV6AwkAAAIFAmdVBQJnVQQCZ1YJAPwHBAUEdGhpcwIJcmViYWxhbmNlBQNuaWwFA25pbAMJAAACBQJnVgUCZ1YJAM4IAgkAzggCBQJkTQUCZ1EFAmdUCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmZiAQpwdXRGb3JGcmVlAQJnVwMJAGYCAAAFAmdXCQACAQIUSW52YWxpZCB2YWx1ZSBwYXNzZWQEAmZoCQECZmUDBQJmYgUCZ1cHBAJkTQgFAmZoAl85BAJmZgkAtgIBCAkBBXZhbHVlAQkAkQMCCAUCZmIIcGF5bWVudHMAAAZhbW91bnQEAmZnCQC2AgEICQEFdmFsdWUBCQCRAwIIBQJmYghwYXltZW50cwABBmFtb3VudAQCZUgJAQJlQQMFAmZmBQJmZwkAtgIBAAADCQAAAgUCZUgFAmVIBAJnWAkBAmVJAwAAAAAAAAQCZ1QIBQJnWAJfMQQCZXoIBQJnWAJfMgQCZ1UJAQJlTgIFAmVIBQJlegMJAAACBQJnVQUCZ1UJAM4IAgUCZE0FAmdUCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmZiAQlwdXRPbmVUa24CAmdZAmdaBAJoYQoAAmJnCQD8BwQFAmJkAihpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZFJFQURPTkxZCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQABAgUCYmcCB0Jvb2xlYW4FAmJnCQACAQkArAICCQADAQUCYmcCHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4EAmhiAwMDCQECYmkABgkAAAIFAmJ2BQFsBgkAAAIFAmJ2BQFuBgUCaGEEAmZWCQDMCAIDAwkBASEBBQJoYgYJAQJncAEFAmZiBgkBAmJhAQIhcHV0IG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IGFkbWluCQDMCAIDCQAAAgkAkAMBCAUCZmIIcGF5bWVudHMAAQYJAQJiYQECHmV4YWN0bHkgMSBwYXltZW50IGFyZSBleHBlY3RlZAUDbmlsAwkAAAIFAmZWBQJmVgQCaGMJAJEDAggFAmZiCHBheW1lbnRzAAAEAmZxCAUCaGMHYXNzZXRJZAQCZnAIBQJoYwZhbW91bnQEAmVIAwkAAAIFAmZxBQJieAkBAmVBAwkAtgIBBQJmcAkAtgIBAAAJALYCAQAAAwkAAAIFAmZxBQJieQkBAmVBAwkAtgIBAAAJALYCAQUCZnAJALYCAQAACQECYmEBAh5wYXltZW50IGFzc2V0IGlzIG5vdCBzdXBwb3J0ZWQDCQAAAgUCZUgFAmVIBAJhYggFAmZiBmNhbGxlcgQCYWMIBQJmYg10cmFuc2FjdGlvbklkBAJoZAkBAmZvBAUCZnAFAmZxBQJhYgUCYWMDCQAAAgUCaGQFAmhkBAJmdQgFAmhkAl81BAJoZQgFAmhkAl80BAJmbggFAmhkAl8zBAJldAgFAmhkAl8yBAJoZggFAmhkAl8xBAJoZwMDCQBmAgUCZ1kAAAkAZgIFAmdZBQJoZgcJAQJiYQEJALkJAgkAzAgCAh9hbW91bnQgdG8gcmVjZWl2ZSBpcyBsZXNzIHRoYW4gCQDMCAIJAKQDAQUCZ1kFA25pbAIABQJoZgQCZmoJAQJmaQEFAmhnAwkAAAIFAmZqBQJmagQCZ1EDBQJnWgQCaGgJAPwHBAUCYkMCBXN0YWtlBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmJ3BQJoZwUDbmlsAwkAAAIFAmhoBQJoaAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQJmYgZjYWxsZXIFAmhnBQJidwUDbmlsBAJoaQMJAGYCBQJmbgAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmJlBQJmbgUCZnEFA25pbAUDbmlsBAJoagMJAAACBQR0aGlzBQJiZQkAlAoCAAAAAAMFAmZ1CQCUCgIJAQEtAQUCZm4AAAkAlAoCAAAJAQEtAQUCZm4EAmVKCAUCaGoCXzEEAmVLCAUCaGoCXzIEAmhrCQECZUkDBQJlSgUCZUsAAAQCZ1QIBQJoawJfMQQCZXoIBQJoawJfMgQCZVUJAQV2YWx1ZQEJAKIIAQUCYWoEAmdVCQECZU4CBQJlSAUCZXoDCQAAAgUCZ1UFAmdVBAJnVgkA/AcEBQR0aGlzAglyZWJhbGFuY2UFA25pbAUDbmlsAwkAAAIFAmdWBQJnVgkAlAoCCQDOCAIJAM4IAgkAzggCBQJldAUCZ1EFAmhpBQJnVAUCaGcJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZmIBEXB1dE9uZVRrblJFQURPTkxZAgJmcQJmcAQCaGwJAQJmbwQFAmZwCQECYm4BBQJmcQUEdW5pdAUEdW5pdAQCaGYIBQJobAJfMQQCZXQIBQJobAJfMgQCZm4IBQJobAJfMwQCaGUIBQJobAJfNAQCZnUIBQJobAJfNQkAlAoCBQNuaWwJAJUKAwUCaGYFAmZuBQJoZQJmYgEJZ2V0T25lVGtuAgJobQJnWQQCaGEKAAJiZwkA/AcEBQJiZAIoaXNQb29sT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWRSRUFET05MWQkAzAgCCQClCAEFBHRoaXMFA25pbAUDbmlsAwkAAQIFAmJnAgdCb29sZWFuBQJiZwkAAgEJAKwCAgkAAwEFAmJnAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuBAJobgMDCQECYmkABgkAAAIFAmJ2BQFuBgUCaGEEAmZWCQDMCAIDAwkBASEBBQJobgYJAQJncAEFAmZiBgkBAmJhAQIhZ2V0IG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IGFkbWluCQDMCAIDCQAAAgkAkAMBCAUCZmIIcGF5bWVudHMAAQYJAQJiYQECHmV4YWN0bHkgMSBwYXltZW50IGFyZSBleHBlY3RlZAUDbmlsAwkAAAIFAmZWBQJmVgQCZlUJAQJibgEFAmhtBAJoYwkAkQMCCAUCZmIIcGF5bWVudHMAAAQCZnEIBQJoYwdhc3NldElkBAJmQwgFAmhjBmFtb3VudAQCZUgJAQJlQQMJALYCAQAACQC2AgEAAAkAtgIBAAADCQAAAgUCZUgFAmVIBAJhYggFAmZiBmNhbGxlcgQCYWMIBQJmYg10cmFuc2FjdGlvbklkBAJobwkBAmZUBQUCZlUFAmZDBQJmcQUCYWIFAmFjAwkAAAIFAmhvBQJobwQCZlcIBQJobwJfNQQCaGUIBQJobwJfNAQCZm4IBQJobwJfMwQCZXQIBQJobwJfMgQCaHAIBQJobwJfMQQCY2YDAwkAZgIFAmdZAAAJAGYCBQJnWQUCaHAHCQECYmEBCQC5CQIJAMwIAgIfYW1vdW50IHRvIHJlY2VpdmUgaXMgbGVzcyB0aGFuIAkAzAgCCQCkAwEFAmdZBQNuaWwCAAUCaHAEAmhxCQD8BwQFAmJkAgRidXJuCQDMCAIFAmZDBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmZxBQJmQwUDbmlsAwkAAAIFAmhxBQJocQQCZ0sJAQJjUAIFAmhtCQBkAgUCY2YJAJYDAQkAzAgCAAAJAMwIAgUCZm4FA25pbAQCaHIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUCYWIFAmNmBQJmVQUDbmlsBAJoaQMJAGYCBQJmbgAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmJlBQJmbgUCZlUFA25pbAUDbmlsBAJocwQCaHQDCQAAAgUEdGhpcwUCYmUAAAUCZm4DBQJmVwkAlAoCCQEBLQEJAGQCBQJjZgUCaHQAAAkAlAoCAAAJAQEtAQkAZAIFAmNmBQJodAQCZUoIBQJocwJfMQQCZUsIBQJocwJfMgQCaHUJAQJlSQMFAmVKBQJlSwAABAJnVAgFAmh1Al8xBAJleggFAmh1Al8yBAJnVQkBAmVOAgUCZUgFAmV6AwkAAAIFAmdVBQJnVQkAlAoCCQDOCAIJAM4IAgkAzggCCQDOCAIFAmV0BQJnSwUCaHIFAmhpBQJnVAUCY2YJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZmIBEWdldE9uZVRrblJFQURPTkxZAgJmVQJmQwQCaHYJAQJmVAUJAQJibgEFAmZVBQJmQwUCYncFBHVuaXQFBHVuaXQEAmhwCAUCaHYCXzEEAmV0CAUCaHYCXzIEAmZuCAUCaHYCXzMEAmhlCAUCaHYCXzQEAmZXCAUCaHYCXzUJAJQKAgUDbmlsCQCVCgMFAmhwBQJmbgUCaGUCZmIBE3Vuc3Rha2VBbmRHZXRPbmVUa24DAmh3AmhtAmdZBAJoYQoAAmJnCQD8BwQFAmJkAihpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZFJFQURPTkxZCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQABAgUCYmcCB0Jvb2xlYW4FAmJnCQACAQkArAICCQADAQUCYmcCHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4EAmhuAwMJAQJiaQAGCQAAAgUCYnYFAW4GBQJoYQQCZlYJAMwIAgMDCQEBIQEFAmhuBgkBAmdwAQUCZmIGCQECYmEBAiFnZXQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgYWRtaW4JAMwIAgMJAAACCQCQAwEIBQJmYghwYXltZW50cwAABgkBAmJhAQIYbm8gcGF5bWVudHMgYXJlIGV4cGVjdGVkBQNuaWwDCQAAAgUCZlYFAmZWBAJmVQkBAmJuAQUCaG0EAmFiCAUCZmIGY2FsbGVyBAJhYwgFAmZiDXRyYW5zYWN0aW9uSWQEAmVICQECZUEDCQC2AgEAAAkAtgIBAAAJALYCAQAAAwkAAAIFAmVIBQJlSAQCaHgJAPwHBAUCYkMCB3Vuc3Rha2UJAMwIAgkA2AQBBQJidwkAzAgCBQJodwUDbmlsBQNuaWwDCQAAAgUCaHgFAmh4BAJoeQkBAmZUBQUCZlUFAmh3BQJidwUCYWIFAmFjAwkAAAIFAmh5BQJoeQQCZlcIBQJoeQJfNQQCaGUIBQJoeQJfNAQCZm4IBQJoeQJfMwQCZXQIBQJoeQJfMgQCaHAIBQJoeQJfMQQCY2YDAwkAZgIFAmdZAAAJAGYCBQJnWQUCaHAHCQECYmEBCQC5CQIJAMwIAgIfYW1vdW50IHRvIHJlY2VpdmUgaXMgbGVzcyB0aGFuIAkAzAgCCQCkAwEFAmdZBQNuaWwCAAUCaHAEAmhxCQD8BwQFAmJkAgRidXJuCQDMCAIFAmh3BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmJ3BQJodwUDbmlsAwkAAAIFAmhxBQJocQQCZ0sJAQJjUAIFAmhtCQBkAgUCY2YJAJYDAQkAzAgCAAAJAMwIAgUCZm4FA25pbAQCaHIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAmZiBmNhbGxlcgUCY2YFAmZVBQNuaWwEAmhpAwkAZgIFAmZuAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUCYmUFAmZuBQJmVQUDbmlsBQNuaWwEAmh6BAJodAMJAAACBQR0aGlzBQJiZQAABQJmbgMFAmZXCQCUCgIJAQEtAQkAZAIFAmNmBQJodAAACQCUCgIAAAkBAS0BCQBkAgUCY2YFAmh0BAJlSggFAmh6Al8xBAJlSwgFAmh6Al8yBAJoQQkBAmVJAwUCZUoFAmVLAAAEAmdUCAUCaEECXzEEAmV6CAUCaEECXzIEAmdVCQECZU4CBQJlSAUCZXoDCQAAAgUCZ1UFAmdVCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgUCZXQFAmdLBQJocgUCaGkFAmdUBQJjZgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJmYgEDZ2V0AAQCZWUJAQJmYQEFAmZiBAJkSwgFAmVlAl8xBAJkTAgFAmVlAl8yBAJmZAgFAmVlAl8zBAJkdAgFAmVlAl80BAJkTQgFAmVlAl81BAJnSwkBAmNVAgUCZEsFAmRMBAJlSAkBAmVBAwkAtgIBAAAJALYCAQAACQC2AgEAAAMJAAACBQJlSAUCZUgEAmhCCQD8BwQFAmJkAgRidXJuCQDMCAIFAmZkBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmR0BQJmZAUDbmlsAwkAAAIFAmhCBQJoQgQCaEMJAQJlSQMJAQEtAQUCZEsJAQEtAQUCZEwAAAQCZ1QIBQJoQwJfMQQCZXoIBQJoQwJfMgQCZ1UJAQJlTgIFAmVIBQJlegMJAAACBQJnVQUCZ1UJAM4IAgkAzggCBQJnSwUCZE0FAmdUCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmZiAQlnZXROb0xlc3MCAmhEAmhFBAJlZQkBAmZhAQUCZmIEAmRLCAUCZWUCXzEEAmRMCAUCZWUCXzIEAmZkCAUCZWUCXzMEAmR0CAUCZWUCXzQEAmRNCAUCZWUCXzUDCQBmAgUCaEQFAmRLCQACAQkArAICCQCsAgIJAKwCAgIcbm9MZXNzVGhlbkFtdEFzc2V0IGZhaWxlZDogIAkApAMBBQJkSwIDIDwgCQCkAwEFAmhEAwkAZgIFAmhFBQJkTAkAAgEJAKwCAgkArAICCQCsAgICHW5vTGVzc1RoZW5QcmljZUFzc2V0IGZhaWxlZDogCQCkAwEFAmRMAgMgPCAJAKQDAQUCaEUEAmdLCQECY1UCBQJkSwUCZEwEAmVICQECZUEDCQC2AgEAAAkAtgIBAAAJALYCAQAAAwkAAAIFAmVIBQJlSAQCaEIJAPwHBAUCYmQCBGJ1cm4JAMwIAgUCZmQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCZHQFAmZkBQNuaWwDCQAAAgUCaEIFAmhCBAJoRgkBAmVJAwkBAS0BBQJkSwkBAS0BBQJkTAAABAJnVAgFAmhGAl8xBAJleggFAmhGAl8yBAJnVQkBAmVOAgUCZUgFAmV6AwkAAAIFAmdVBQJnVQkAzggCCQDOCAIFAmdLBQJkTQUCZ1QJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZmIBDXVuc3Rha2VBbmRHZXQBAmNmBAJoRwMJAQIhPQIJAJADAQgFAmZiCHBheW1lbnRzAAAJAAIBAhhObyBwYXltZW50cyBhcmUgZXhwZWN0ZWQGAwkAAAIFAmhHBQJoRwQCZGkJAQJiawAEAmR2CQDZBAEJAJEDAgUCZGkFAXEEAmVICQECZUEDCQC2AgEAAAkAtgIBAAAJALYCAQAAAwkAAAIFAmVIBQJlSAQCaHgJAPwHBAUCYkMCB3Vuc3Rha2UJAMwIAgkA2AQBBQJkdgkAzAgCBQJjZgUDbmlsBQNuaWwDCQAAAgUCaHgFAmh4BAJlZQkBAmRyBAkA2AQBCAUCZmINdHJhbnNhY3Rpb25JZAkA2AQBBQJkdgUCY2YIBQJmYgZjYWxsZXIEAmRLCAUCZWUCXzEEAmRMCAUCZWUCXzIEAmR5CQENcGFyc2VJbnRWYWx1ZQEIBQJlZQJfOQQCZE0IBQJlZQNfMTAEAmdLCQECY1UCBQJkSwUCZEwEAmhIAwMJAQJiaQAGCQAAAgUCZHkFAW4JAAIBCQCsAgICLEdldCBvcGVyYXRpb24gaXMgYmxvY2tlZCBieSBhZG1pbi4gU3RhdHVzID0gCQCkAwEFAmR5BgMJAAACBQJoSAUCaEgEAmhCCQD8BwQFAmJkAgRidXJuCQDMCAIFAmNmBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmR2BQJjZgUDbmlsAwkAAAIFAmhCBQJoQgQCaEkJAQJlSQMJAQEtAQUCZEsJAQEtAQUCZEwAAAQCZ1QIBQJoSQJfMQQCZXoIBQJoSQJfMgQCZ1UJAQJlTgIFAmVIBQJlegMJAAACBQJnVQUCZ1UJAM4IAgkAzggCBQJnSwUCZE0FAmdUCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmZiARN1bnN0YWtlQW5kR2V0Tm9MZXNzAwJodwJoSgJoRQQCaG4DCQECYmkABgkAAAIFAmJ2BQFuBAJmVgkAzAgCAwkBASEBBQJobgYJAAIBAiFnZXQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgYWRtaW4JAMwIAgMJAAACCQCQAwEIBQJmYghwYXltZW50cwAABgkAAgECGG5vIHBheW1lbnRzIGFyZSBleHBlY3RlZAUDbmlsAwkAAAIFAmZWBQJmVgQCZUgJAQJlQQMJALYCAQAACQC2AgEAAAkAtgIBAAADCQAAAgUCZUgFAmVIBAJoeAkA/AcEBQJiQwIHdW5zdGFrZQkAzAgCCQDYBAEFAmJ3CQDMCAIFAmh3BQNuaWwFA25pbAMJAAACBQJoeAUCaHgEAmVlCQECZHIECQDYBAEIBQJmYg10cmFuc2FjdGlvbklkCQDYBAEFAmJ3BQJodwgFAmZiBmNhbGxlcgQCZEsIBQJlZQJfMQQCZEwIBQJlZQJfMgQCZE0IBQJlZQNfMTAEAmdLCQECY1UCBQJkSwUCZEwEAmhLCQDMCAIDCQBnAgUCZEsFAmhKBgkAAgEJALkJAgkAzAgCAixhbW91bnQgYXNzZXQgYW1vdW50IHRvIHJlY2VpdmUgaXMgbGVzcyB0aGFuIAkAzAgCCQCkAwEFAmhKBQNuaWwCAAkAzAgCAwkAZwIFAmRMBQJoRQYJAAIBCQC5CQIJAMwIAgIrcHJpY2UgYXNzZXQgYW1vdW50IHRvIHJlY2VpdmUgaXMgbGVzcyB0aGFuIAkAzAgCCQCkAwEFAmhFBQNuaWwCAAUDbmlsAwkAAAIFAmhLBQJoSwQCaEIJAPwHBAUCYmQCBGJ1cm4JAMwIAgUCaHcFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCYncFAmh3BQNuaWwDCQAAAgUCaEIFAmhCBAJoTAkBAmVJAwkBAS0BBQJkSwkBAS0BBQJkTAAABAJnVAgFAmhMAl8xBAJleggFAmhMAl8yBAJnVQkBAmVOAgUCZUgFAmV6AwkAAAIFAmdVBQJnVQkAzggCCQDOCAIFAmdLBQJkTQUCZ1QJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZmIBCGFjdGl2YXRlAgJoTQJoTgMJAQIhPQIJAKUIAQgFAmZiBmNhbGxlcgkApQgBBQJiZAkAAgECEnBlcm1pc3Npb25zIGRlbmllZAkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhZQAFAmhNCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhZgAFAmhOBQNuaWwCB3N1Y2Nlc3MCZmIBCnJlZnJlc2hLTHAABAJoTwkBC3ZhbHVlT3JFbHNlAgkAnwgBBQJhawAABAJoUAMJAGcCCQBlAgUGaGVpZ2h0BQJoTwUCYW4FBHVuaXQJAQJiYQEJALkJAgkAzAgCCQCkAwEFAmFuCQDMCAICLyBibG9ja3MgaGF2ZSBub3QgcGFzc2VkIHNpbmNlIHRoZSBwcmV2aW91cyBjYWxsBQNuaWwCAAMJAAACBQJoUAUCaFAEAmVVCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKgDAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQJhagIBMAkBAmJjAQILaW52YWxpZCBrTHAEAmhRCQECZUkDAAAAAAAABAJoUggFAmhRAl8xBAJleggFAmhRAl8yBAJlTAMJAQIhPQIFAmVVBQJlegUCaFIJAQJiYQECEm5vdGhpbmcgdG8gcmVmcmVzaAkAlAoCBQJlTAkApgMBBQJlegkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJmYgEcZ2V0UG9vbENvbmZpZ1dyYXBwZXJSRUFET05MWQAJAJQKAgUDbmlsCQECYmsAAmZiARxnZXRBY2NCYWxhbmNlV3JhcHBlclJFQURPTkxZAQJhcAkAlAoCBQNuaWwJAQJiVAEFAmFwAmZiARljYWxjUHJpY2VzV3JhcHBlclJFQURPTkxZAwJkYwJkZAJkaAQCZHEJAQJkZwMFAmRjBQJkZAUCZGgJAJQKAgUDbmlsCQDMCAIJAKYDAQkAkQMCBQJkcQAACQDMCAIJAKYDAQkAkQMCBQJkcQABCQDMCAIJAKYDAQkAkQMCBQJkcQACBQNuaWwCZmIBFHRvWDE4V3JhcHBlclJFQURPTkxZAgFFAUYJAJQKAgUDbmlsCQCmAwEJAQFEAgUBRQUBRgJmYgEWZnJvbVgxOFdyYXBwZXJSRUFET05MWQIBSQFKCQCUCgIFA25pbAkBAUgCCQCnAwEFAUkFAUoCZmIBHmNhbGNQcmljZUJpZ0ludFdyYXBwZXJSRUFET05MWQICYlgCYlkJAJQKAgUDbmlsCQCmAwEJAQJiVwIJAKcDAQUCYlgJAKcDAQUCYlkCZmIBI2VzdGltYXRlUHV0T3BlcmF0aW9uV3JhcHBlclJFQURPTkxZCQJkcwJkTwJkUAJkUQJkUgJkUwJhYgJkVAJkVQkAlAoCBQNuaWwJAQJkTgkFAmRzBQJkTwUCZFAFAmRRBQJkUgUCZFMFAmFiBQJkVAUCZFUCZmIBI2VzdGltYXRlR2V0T3BlcmF0aW9uV3JhcHBlclJFQURPTkxZBAJkcwJkdAJkdQJhYgQCZWUJAQJkcgQFAmRzBQJkdAUCZHUJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAmFiCQCUCgIFA25pbAkAnAoKCAUCZWUCXzEIBQJlZQJfMggFAmVlAl8zCAUCZWUCXzQIBQJlZQJfNQgFAmVlAl82CAUCZWUCXzcJAKYDAQgFAmVlAl84CAUCZWUCXzkIBQJlZQNfMTACZmIBDXN0YXRzUkVBRE9OTFkABAJkaQkBAmJrAAQCZHYJANkEAQkAkQMCBQJkaQUBcQQCaFMJAJEDAgUCZGkFAXIEAmhUCQCRAwIFAmRpBQFzBAJkWAkAkQMCBQJkaQUBdgQCZFkJAJEDAgUCZGkFAXcEAmRqCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZGkFAXQEAmRrCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZGkFAXUEAmhVCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFAmR2CQCsAgIJAKwCAgIGQXNzZXQgCQDYBAEFAmR2Ag4gZG9lc24ndCBleGlzdAhxdWFudGl0eQQCaFYJAQJiVAEFAmhTBAJoVwkBAmJUAQUCaFQEAmhYAwkAAAIFAmhVAAAJAMwIAgUBZQkAzAgCBQFlCQDMCAIFAWUFA25pbAkBAmRnAwUCaFYFAmhXBQJoVQQCZEYAAAQCaFkJAQFIAgkAkQMCBQJoWAABBQFiBAJoWgkBAUgCCQCRAwIFAmhYAAIFAWIEAmlhCQEFdmFsdWUBCQCaCAIFAmJkCQECYUQBCQClCAEFBHRoaXMJAJQKAgUDbmlsCQC5CQIJAMwIAgIOJWQlZCVkJWQlZCVkJWQJAMwIAgkApAMBBQJoVgkAzAgCCQCkAwEFAmhXCQDMCAIJAKQDAQUCaFUJAMwIAgkApAMBBQJkRgkAzAgCCQCkAwEFAmhZCQDMCAIJAKQDAQUCaFoJAMwIAgkApAMBBQJpYQUDbmlsBQFqAmZiASBldmFsdWF0ZVB1dEJ5QW1vdW50QXNzZXRSRUFET05MWQECZFAEAmRpCQECYmsABAJkdgkA2QQBCQCRAwIFAmRpBQFxBAJkVgkAkQMCBQJkaQUBcgQCZHcJANkEAQUCZFYEAmRXCQCRAwIFAmRpBQFzBAJkeAkA2QQBBQJkVwQCZGoJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJkaQUBdAQCZGsJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJkaQUBdQQCZHkJAJEDAgUCZGkFAXAEAmhVCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFAmR2CQCsAgIJAKwCAgIGQXNzZXQgCQDYBAEFAmR2Ag4gZG9lc24ndCBleGlzdAhxdWFudGl0eQQCaFYJAQJiVAEFAmRWBAJoVwkBAmJUAQUCZFcEAmRlCQEBRAIFAmhWBQJkagQCZGYJAQFEAgUCaFcFAmRrBAJkRQMJAAACBQJoVQAABQFlCQECYlcCBQJkZgUCZGUEAmViCQEBRAIFAmRQBQJkagQCZWMJALwCAwUCZWIFAmRFBQFkBAJkUgkBAUgCBQJlYwUCZGsEAmZoCQECZE4JAgAAoMIeBQJkUAUCZHcFAmRSBQJkeAIABgcEAmVtCAUCZmgCXzEEAmliCAUCZmgCXzMEAmRBCAUCZmgCXzQEAmRDCAUCZmgCXzUEAmR6CAUCZmgCXzYJAJQKAgUDbmlsCQC5CQIJAMwIAgIQJWQlZCVkJWQlZCVkJWQlZAkAzAgCCQCkAwEFAmVtCQDMCAIJAKQDAQkBAUgCBQJkRQUBYgkAzAgCCQCkAwEFAmRBCQDMCAIJAKQDAQUCZEMJAMwIAgkApAMBBQJkegkAzAgCBQJkeQkAzAgCCQCkAwEFAmRQCQDMCAIJAKQDAQUCZFIFA25pbAUBagJmYgEfZXZhbHVhdGVQdXRCeVByaWNlQXNzZXRSRUFET05MWQECZFIEAmRpCQECYmsABAJkdgkA2QQBCQCRAwIFAmRpBQFxBAJkVgkAkQMCBQJkaQUBcgQCZHcJANkEAQUCZFYEAmRXCQCRAwIFAmRpBQFzBAJkeAkA2QQBBQJkVwQCZGoJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJkaQUBdAQCZGsJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJkaQUBdQQCZHkJAJEDAgUCZGkFAXAEAmhVCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFAmR2CQCsAgIJAKwCAgIGQXNzZXQgCQDYBAEFAmR2Ag4gZG9lc24ndCBleGlzdAhxdWFudGl0eQQCaWMJAQJiVAEFAmRWBAJpZAkBAmJUAQUCZFcEAmllCQEBRAIFAmljBQJkagQCaWYJAQFEAgUCaWQFAmRrBAJkRQMJAAACBQJoVQAABQFlCQECYlcCBQJpZgUCaWUEAmVjCQEBRAIFAmRSBQJkawQCZWIJALwCAwUCZWMFAWQFAmRFBAJkUAkBAUgCBQJlYgUCZGoEAmZoCQECZE4JAgAAoMIeBQJkUAUCZHcFAmRSBQJkeAIABgcEAmVtCAUCZmgCXzEEAmliCAUCZmgCXzMEAmRBCAUCZmgCXzQEAmRDCAUCZmgCXzUEAmR6CAUCZmgCXzYJAJQKAgUDbmlsCQC5CQIJAMwIAgIQJWQlZCVkJWQlZCVkJWQlZAkAzAgCCQCkAwEFAmVtCQDMCAIJAKQDAQkBAUgCBQJkRQUBYgkAzAgCCQCkAwEFAmRBCQDMCAIJAKQDAQUCZEMJAMwIAgkApAMBBQJkegkAzAgCBQJkeQkAzAgCCQCkAwEFAmRQCQDMCAIJAKQDAQUCZFIFA25pbAUBagJmYgETZXZhbHVhdGVHZXRSRUFET05MWQICaWcCaWgEAmVlCQECZHIEAgAFAmlnBQJpaAUEdGhpcwQCZEsIBQJlZQJfMQQCZEwIBQJlZQJfMgQCZEEIBQJlZQJfNQQCZEMIBQJlZQJfNgQCZHoIBQJlZQJfNwQCZEYIBQJlZQJfOAQCZHkJAQ1wYXJzZUludFZhbHVlAQgFAmVlAl85CQCUCgIFA25pbAkAuQkCCQDMCAICDiVkJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQUCZEsJAMwIAgkApAMBBQJkTAkAzAgCCQCkAwEFAmRBCQDMCAIJAKQDAQUCZEMJAMwIAgkApAMBBQJkegkAzAgCCQCmAwEFAmRGCQDMCAIJAKQDAQUCZHkFA25pbAUBagECaWkBAmlqAAQCaWsEAmFRCQECZ24AAwkAAQIFAmFRAgpCeXRlVmVjdG9yBAJncQUCYVEFAmdxAwkAAQIFAmFRAgRVbml0CAUCaWkPc2VuZGVyUHVibGljS2V5CQACAQILTWF0Y2ggZXJyb3IEAmFRBQJpaQMJAAECBQJhUQIFT3JkZXIEAmVRBQJhUQQCaWwJAQJiagAEAmltAwkBAmVNAAkAlAoCBgIACQECZVABBQJlUQQCYUsIBQJpbQJfMQQCYUwIBQJpbQJfMgQCYU0JAPQDAwgFAmVRCWJvZHlCeXRlcwkAkQMCCAUCZVEGcHJvb2ZzAAAIBQJlUQ9zZW5kZXJQdWJsaWNLZXkEAmFOCQD0AwMIBQJlUQlib2R5Qnl0ZXMJAJEDAggFAmVRBnByb29mcwABBQJpbAMDAwUCYUsFAmFNBwUCYU4HBgkBAmFKBAUCYUsFAmFMBQJhTQUCYU4DCQABAgUCYVECFFNldFNjcmlwdFRyYW5zYWN0aW9uBAJhVgUCYVEDCQD0AwMIBQJpaQlib2R5Qnl0ZXMJAJEDAggFAmlpBnByb29mcwAABQJpawYEAmluCQD2AwEJAQV2YWx1ZQEIBQJhVgZzY3JpcHQEAmlvCQDbBAEJAQV2YWx1ZQEJAJ0IAgUCYmQJAQJhRgAEAmlwCQDxBwEFBHRoaXMDCQAAAgUCaW8FAmluCQECIT0CBQJpcAUCaW4HCQD0AwMIBQJpaQlib2R5Qnl0ZXMJAJEDAggFAmlpBnByb29mcwAABQJpaybyJ24=", "height": 3637188, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: CdBnZui9EvdGaznaq61cRq7bMtpp2xNCQTgEauXwFjKT Next: 5nZx8PGnASnCrGJe54dEQ5BDWYVp6s321UBgNRWrzDUW Diff:
OldNewDifferences
9090 func fc () = "%s__factoryContract"
9191
9292
93-func mpk () = "%s__managerPublicKey"
93+func keyManagerPublicKey () = "%s__managerPublicKey"
9494
9595
96-func pmpk () = "%s__pendingManagerPublicKey"
96+func keyManagerVaultAddress () = "%s__managerVaultAddress"
9797
9898
9999 func pl () = "%s%s__price__last"
168168
169169 let keyFeeCollectorAddress = "%s__feeCollectorAddress"
170170
171+func keySkipOrderValidation (poolAddress) = ("%s%s__skipOrderValidation__" + poolAddress)
172+
173+
171174 func throwOrderError (orderValid,orderValidInfo,senderValid,matcherValid) = throw((((((((("order validation failed: orderValid=" + toString(orderValid)) + " (") + orderValidInfo) + ")") + " senderValid=") + toString(senderValid)) + " matcherValid=") + toString(matcherValid)))
175+
176+
177+func addressFromStringOrThis (addressString) = match addressFromString(addressString) {
178+ case a: Address =>
179+ a
180+ case _ =>
181+ this
182+}
183+
184+
185+func getManagerVaultAddressOrThis () = {
186+ let factoryAddress = match getString(fc()) {
187+ case fca: String =>
188+ addressFromStringOrThis(fca)
189+ case _ =>
190+ this
191+ }
192+ match getString(factoryAddress, keyManagerVaultAddress()) {
193+ case s: String =>
194+ addressFromStringOrThis(s)
195+ case _ =>
196+ this
197+ }
198+ }
172199
173200
174201 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
231258
232259 let poolConfigParsed = parsePoolConfig(getPoolConfig())
233260
234-let $t089629128 = poolConfigParsed
261+let $t095299695 = poolConfigParsed
235262
236-let cfgPoolAddress = $t089629128._1
263+let cfgPoolAddress = $t095299695._1
237264
238-let cfgPoolStatus = $t089629128._2
265+let cfgPoolStatus = $t095299695._2
239266
240-let cfgLpAssetId = $t089629128._3
267+let cfgLpAssetId = $t095299695._3
241268
242-let cfgAmountAssetId = $t089629128._4
269+let cfgAmountAssetId = $t095299695._4
243270
244-let cfgPriceAssetId = $t089629128._5
271+let cfgPriceAssetId = $t095299695._5
245272
246-let cfgAmountAssetDecimals = $t089629128._6
273+let cfgAmountAssetDecimals = $t095299695._6
247274
248-let cfgPriceAssetDecimals = $t089629128._7
275+let cfgPriceAssetDecimals = $t095299695._7
249276
250277 func getFactoryConfig () = split(getStringOrFail(factoryContract, keyFactoryConfig()), SEP)
251278
394421
395422
396423 func rebalanceAsset (assetId) = {
397- let $t01536415500 = getLeaseProxyConfig(assetId)
398- let isLeasable = $t01536415500._1
399- let leasedRatio = $t01536415500._2
400- let minBalance = $t01536415500._3
401- let proxyAddress = $t01536415500._4
402- let proxyAssetId = $t01536415500._5
403- let proxyRateMul = $t01536415500._6
404- let stakingProfitAddress = $t01536415500._7
424+ let $t01593116067 = getLeaseProxyConfig(assetId)
425+ let isLeasable = $t01593116067._1
426+ let leasedRatio = $t01593116067._2
427+ let minBalance = $t01593116067._3
428+ let proxyAddress = $t01593116067._4
429+ let proxyAssetId = $t01593116067._5
430+ let proxyRateMul = $t01593116067._6
431+ let stakingProfitAddress = $t01593116067._7
405432 if (isLeasable)
406433 then rebalanceInternal(leasedRatio, assetId, proxyAssetId, minBalance, addressFromStringValue(proxyAddress), proxyRateMul, addressFromStringValue(stakingProfitAddress))
407434 else nil
409436
410437
411438 func withdrawAndRebalanceAsset (assetId,getAmount) = {
412- let $t01589916035 = getLeaseProxyConfig(assetId)
413- let isLeasable = $t01589916035._1
414- let leasedRatio = $t01589916035._2
415- let minBalance = $t01589916035._3
416- let proxyAddress = $t01589916035._4
417- let proxyAssetId = $t01589916035._5
418- let proxyRateMul = $t01589916035._6
419- let stakingProfitAddress = $t01589916035._7
439+ let $t01646616602 = getLeaseProxyConfig(assetId)
440+ let isLeasable = $t01646616602._1
441+ let leasedRatio = $t01646616602._2
442+ let minBalance = $t01646616602._3
443+ let proxyAddress = $t01646616602._4
444+ let proxyAssetId = $t01646616602._5
445+ let proxyRateMul = $t01646616602._6
446+ let stakingProfitAddress = $t01646616602._7
420447 if (isLeasable)
421448 then {
422449 let newTotalLeasableBalance = max([0, ((getAccBalance(assetId) - getAmount) - minBalance)])
616643 }
617644
618645
646+func skipOrderValidation () = valueOrElse(getBoolean(factoryContract, keySkipOrderValidation(toString(this))), false)
647+
648+
619649 func validateUpdatedKLp (oldKLp,updatedKLp) = if ((updatedKLp >= oldKLp))
620650 then true
621651 else throwErr(makeString(["updated KLp lower than current KLp", toString(oldKLp), toString(updatedKLp)], " "))
626656 let priceAssetBalance = getAccBalance(assetIdToString(cfgPriceAssetId))
627657 let amountAssetAmount = order.amount
628658 let priceAssetAmount = fraction(order.amount, order.price, scale8, FLOOR)
629- let $t02830128513 = if ((order.orderType == Buy))
659+ let $t02899129203 = if ((order.orderType == Buy))
630660 then $Tuple2(amountAssetAmount, -(priceAssetAmount))
631661 else $Tuple2(-(amountAssetAmount), priceAssetAmount)
632- let amountAssetBalanceDelta = $t02830128513._1
633- let priceAssetBalanceDelta = $t02830128513._2
662+ let amountAssetBalanceDelta = $t02899129203._1
663+ let priceAssetBalanceDelta = $t02899129203._2
634664 if (if (if (isGlobalShutdown())
635665 then true
636666 else (cfgPoolStatus == PoolMatcherDisabled))
643673 then throw("Wrong order assets.")
644674 else {
645675 let kLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyKLp), "0")), fmtErr("invalid kLp"))
646- let $t02895329053 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
647- let unusedActions = $t02895329053._1
648- let kLpNew = $t02895329053._2
676+ let $t02964329743 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
677+ let unusedActions = $t02964329743._1
678+ let kLpNew = $t02964329743._2
649679 let isOrderValid = (kLpNew >= kLp)
650680 let info = makeString(["kLp=", toString(kLp), " kLpNew=", toString(kLpNew), " amountAssetBalance=", toString(amountAssetBalance), " priceAssetBalance=", toString(priceAssetBalance), " amountAssetBalanceDelta=", toString(amountAssetBalanceDelta), " priceAssetBalanceDelta=", toString(priceAssetBalanceDelta), " height=", toString(height)], "")
651681 $Tuple2(isOrderValid, info)
724754 else if ((paymentAssetId == cfgPriceAssetId))
725755 then false
726756 else throwErr("invalid asset")
727- let $t03216632459 = if (isEval)
757+ let $t03285633149 = if (isEval)
728758 then $Tuple2(amountBalanceRaw, priceBalanceRaw)
729759 else if (paymentInAmountAsset)
730760 then $Tuple2((amountBalanceRaw - paymentAmountRaw), priceBalanceRaw)
731761 else $Tuple2(amountBalanceRaw, (priceBalanceRaw - paymentAmountRaw))
732- let amountBalanceOld = $t03216632459._1
733- let priceBalanceOld = $t03216632459._2
734- let $t03246332612 = if (paymentInAmountAsset)
762+ let amountBalanceOld = $t03285633149._1
763+ let priceBalanceOld = $t03285633149._2
764+ let $t03315333302 = if (paymentInAmountAsset)
735765 then $Tuple2(paymentAmountRaw, 0)
736766 else $Tuple2(0, paymentAmountRaw)
737- let amountAssetAmountRaw = $t03246332612._1
738- let priceAssetAmountRaw = $t03246332612._2
767+ let amountAssetAmountRaw = $t03315333302._1
768+ let priceAssetAmountRaw = $t03315333302._2
739769 let amountAssetAmount = takeFee(amountAssetAmountRaw, inFee)._1
740770 let priceAssetAmount = takeFee(priceAssetAmountRaw, inFee)._1
741- let $t03274432808 = takeFee(paymentAmountRaw, inFee)
742- let paymentAmount = $t03274432808._1
743- let feeAmount = $t03274432808._2
771+ let $t03343433498 = takeFee(paymentAmountRaw, inFee)
772+ let paymentAmount = $t03343433498._1
773+ let feeAmount = $t03343433498._2
744774 let amountBalanceNew = (amountBalanceOld + amountAssetAmount)
745775 let priceBalanceNew = (priceBalanceOld + priceAssetAmount)
746776 let priceNewX18 = calcPriceBigInt(toX18(priceBalanceNew, cfgPriceAssetDecimals), toX18(amountBalanceNew, cfgAmountAssetDecimals))
763793 let priceOldX18 = calcPriceBigInt(toX18(priceBalanceOld, cfgPriceAssetDecimals), toX18(amountBalanceOld, cfgAmountAssetDecimals))
764794 let priceOld = fromX18(priceOldX18, scale8)
765795 let loss = {
766- let $t03448934656 = if (paymentInAmountAsset)
796+ let $t03517935346 = if (paymentInAmountAsset)
767797 then $Tuple2(amountAssetAmountRaw, amountBalanceOld)
768798 else $Tuple2(priceAssetAmountRaw, priceBalanceOld)
769- let amount = $t03448934656._1
770- let balance = $t03448934656._2
799+ let amount = $t03517935346._1
800+ let balance = $t03517935346._2
771801 let issueAmountBoth = toInt(fraction(supplyBigInt, toBigInt((amount / 2)), toBigInt(balance)))
772802 fraction((issueAmount - issueAmountBoth), scale8, issueAmountBoth)
773803 }
807837 let supplyBigInt = toBigInt(valueOrErrorMessage(assetInfo(cfgLpAssetId), (("asset " + toBase58String(cfgLpAssetId)) + " doesn't exist")).quantity)
808838 let redeemedBigInt = toBigInt(paymentAmount)
809839 let amountRaw = max([0, toInt(((balanceBigInt * (scale18 - pow((scale18 - ((redeemedBigInt * scale18) / supplyBigInt)), 18, big2, 0, 18, DOWN))) / scale18))])
810- let $t03673436790 = takeFee(amountRaw, outFee)
811- let totalAmount = $t03673436790._1
812- let feeAmount = $t03673436790._2
813- let $t03679437020 = if (outInAmountAsset)
840+ let $t03742437480 = takeFee(amountRaw, outFee)
841+ let totalAmount = $t03742437480._1
842+ let feeAmount = $t03742437480._2
843+ let $t03748437710 = if (outInAmountAsset)
814844 then $Tuple4(totalAmount, 0, (amBalanceOld - amountRaw), prBalanceOld)
815845 else $Tuple4(0, totalAmount, amBalanceOld, (prBalanceOld - amountRaw))
816- let outAmAmount = $t03679437020._1
817- let outPrAmount = $t03679437020._2
818- let amBalanceNew = $t03679437020._3
819- let prBalanceNew = $t03679437020._4
846+ let outAmAmount = $t03748437710._1
847+ let outPrAmount = $t03748437710._2
848+ let amBalanceNew = $t03748437710._3
849+ let prBalanceNew = $t03748437710._4
820850 let priceNewX18 = calcPriceBigInt(toX18(prBalanceNew, cfgPriceAssetDecimals), toX18(amBalanceNew, cfgAmountAssetDecimals))
821851 let priceNew = fromX18(priceNewX18, scale8)
822852 let commonState = if (isEval)
834864 }
835865
836866
837-func managerPublicKeyOrUnit () = match getString(mpk()) {
838- case s: String =>
839- fromBase58String(s)
840- case _: Unit =>
841- unit
842- case _ =>
843- throw("Match error")
844-}
845-
846-
847-func pendingManagerPublicKeyOrUnit () = match getString(pmpk()) {
848- case s: String =>
849- fromBase58String(s)
850- case _: Unit =>
851- unit
852- case _ =>
853- throw("Match error")
854-}
867+func managerPublicKeyOrUnit () = {
868+ let managerVaultAddress = getManagerVaultAddressOrThis()
869+ match getString(managerVaultAddress, keyManagerPublicKey()) {
870+ case s: String =>
871+ fromBase58String(s)
872+ case _: Unit =>
873+ unit
874+ case _ =>
875+ throw("Match error")
876+ }
877+ }
855878
856879
857880 func isManager (i) = match managerPublicKeyOrUnit() {
888911
889912 @Callable(i)
890913 func calculateAmountOutForSwapREADONLY (cleanAmountIn,isReverse,feePoolAmount) = {
891- let $t03890639211 = if ((isReverse == false))
914+ let $t03956939874 = if ((isReverse == false))
892915 then {
893916 let assetOut = getStringOrFail(this, pa())
894917 let assetIn = getStringOrFail(this, aa())
899922 let assetIn = getStringOrFail(this, pa())
900923 $Tuple2(assetOut, assetIn)
901924 }
902- let assetOut = $t03890639211._1
903- let assetIn = $t03890639211._2
925+ let assetOut = $t03956939874._1
926+ let assetIn = $t03956939874._2
904927 let poolAssetInBalance = getAccBalance(assetIn)
905928 let poolAssetOutBalance = getAccBalance(assetOut)
906929 let amountOut = fraction(poolAssetOutBalance, cleanAmountIn, (poolAssetInBalance + cleanAmountIn))
971994
972995
973996 @Callable(i)
974-func setManager (pendingManagerPublicKey) = {
975- let checkCaller = mustManager(i)
976- if ((checkCaller == checkCaller))
977- then {
978- let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
979- if ((checkManagerPublicKey == checkManagerPublicKey))
980- then [StringEntry(pmpk(), pendingManagerPublicKey)]
981- else throw("Strict value is not equal to itself.")
982- }
983- else throw("Strict value is not equal to itself.")
984- }
985-
986-
987-
988-@Callable(i)
989-func confirmManager () = {
990- let pm = pendingManagerPublicKeyOrUnit()
991- let hasPM = if (isDefined(pm))
992- then true
993- else throw("No pending manager")
994- if ((hasPM == hasPM))
995- then {
996- let checkPM = if ((i.callerPublicKey == value(pm)))
997- then true
998- else throw("You are not pending manager")
999- if ((checkPM == checkPM))
1000- then [StringEntry(mpk(), toBase58String(value(pm))), DeleteEntry(pmpk())]
1001- else throw("Strict value is not equal to itself.")
1002- }
1003- else throw("Strict value is not equal to itself.")
1004- }
1005-
1006-
1007-
1008-@Callable(i)
1009997 func put (slippageTolerance,shouldAutoStake) = if ((0 > slippageTolerance))
1010998 then throw("Invalid slippageTolerance passed")
1011999 else {
10511039 else throw("Strict value is not equal to itself.")
10521040 }
10531041 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
1054- let $t04425744719 = refreshKLpInternal(0, 0, 0)
1055- if (($t04425744719 == $t04425744719))
1042+ let $t04436144823 = refreshKLpInternal(0, 0, 0)
1043+ if (($t04436144823 == $t04436144823))
10561044 then {
1057- let updatedKLp = $t04425744719._2
1058- let refreshKLpActions = $t04425744719._1
1045+ let updatedKLp = $t04436144823._2
1046+ let refreshKLpActions = $t04436144823._1
10591047 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
10601048 if ((isUpdatedKLpValid == isUpdatedKLpValid))
10611049 then {
10921080 let currentKLp = calcCurrentKLp(amAssetPmt, prAssetPmt, toBigInt(0))
10931081 if ((currentKLp == currentKLp))
10941082 then {
1095- let $t04533145396 = refreshKLpInternal(0, 0, 0)
1096- let refreshKLpActions = $t04533145396._1
1097- let updatedKLp = $t04533145396._2
1083+ let $t04543545500 = refreshKLpInternal(0, 0, 0)
1084+ let refreshKLpActions = $t04543545500._1
1085+ let updatedKLp = $t04543545500._2
10981086 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
10991087 if ((isUpdatedKLpValid == isUpdatedKLpValid))
11001088 then (state ++ refreshKLpActions)
11411129 then {
11421130 let userAddress = i.caller
11431131 let txId = i.transactionId
1144- let $t04658446736 = calcPutOneToken(paymentAmountRaw, paymentAssetId, userAddress, txId)
1145- if (($t04658446736 == $t04658446736))
1132+ let $t04668846840 = calcPutOneToken(paymentAmountRaw, paymentAssetId, userAddress, txId)
1133+ if (($t04668846840 == $t04668846840))
11461134 then {
1147- let paymentInAmountAsset = $t04658446736._5
1148- let bonus = $t04658446736._4
1149- let feeAmount = $t04658446736._3
1150- let commonState = $t04658446736._2
1151- let emitAmountEstimated = $t04658446736._1
1135+ let paymentInAmountAsset = $t04668846840._5
1136+ let bonus = $t04668846840._4
1137+ let feeAmount = $t04668846840._3
1138+ let commonState = $t04668846840._2
1139+ let emitAmountEstimated = $t04668846840._1
11521140 let emitAmount = if (if ((minOutAmount > 0))
11531141 then (minOutAmount > emitAmountEstimated)
11541142 else false)
11681156 let sendFee = if ((feeAmount > 0))
11691157 then [ScriptTransfer(feeCollectorAddress, feeAmount, paymentAssetId)]
11701158 else nil
1171- let $t04732247519 = if ((this == feeCollectorAddress))
1159+ let $t04742647623 = if ((this == feeCollectorAddress))
11721160 then $Tuple2(0, 0)
11731161 else if (paymentInAmountAsset)
11741162 then $Tuple2(-(feeAmount), 0)
11751163 else $Tuple2(0, -(feeAmount))
1176- let amountAssetBalanceDelta = $t04732247519._1
1177- let priceAssetBalanceDelta = $t04732247519._2
1178- let $t04752247630 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1179- let refreshKLpActions = $t04752247630._1
1180- let updatedKLp = $t04752247630._2
1164+ let amountAssetBalanceDelta = $t04742647623._1
1165+ let priceAssetBalanceDelta = $t04742647623._2
1166+ let $t04762647734 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1167+ let refreshKLpActions = $t04762647734._1
1168+ let updatedKLp = $t04762647734._2
11811169 let kLp = value(getString(keyKLp))
11821170 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
11831171 if ((isUpdatedKLpValid == isUpdatedKLpValid))
12021190
12031191 @Callable(i)
12041192 func putOneTknREADONLY (paymentAssetId,paymentAmountRaw) = {
1205- let $t04798548142 = calcPutOneToken(paymentAmountRaw, parseAssetId(paymentAssetId), unit, unit)
1206- let emitAmountEstimated = $t04798548142._1
1207- let commonState = $t04798548142._2
1208- let feeAmount = $t04798548142._3
1209- let bonus = $t04798548142._4
1210- let paymentInAmountAsset = $t04798548142._5
1193+ let $t04808948246 = calcPutOneToken(paymentAmountRaw, parseAssetId(paymentAssetId), unit, unit)
1194+ let emitAmountEstimated = $t04808948246._1
1195+ let commonState = $t04808948246._2
1196+ let feeAmount = $t04808948246._3
1197+ let bonus = $t04808948246._4
1198+ let paymentInAmountAsset = $t04808948246._5
12111199 $Tuple2(nil, $Tuple3(emitAmountEstimated, feeAmount, bonus))
12121200 }
12131201
12441232 then {
12451233 let userAddress = i.caller
12461234 let txId = i.transactionId
1247- let $t04902749180 = calcGetOneToken(outAssetId, paymentAmount, paymentAssetId, userAddress, txId)
1248- if (($t04902749180 == $t04902749180))
1235+ let $t04913149284 = calcGetOneToken(outAssetId, paymentAmount, paymentAssetId, userAddress, txId)
1236+ if (($t04913149284 == $t04913149284))
12491237 then {
1250- let outInAmountAsset = $t04902749180._5
1251- let bonus = $t04902749180._4
1252- let feeAmount = $t04902749180._3
1253- let commonState = $t04902749180._2
1254- let amountEstimated = $t04902749180._1
1238+ let outInAmountAsset = $t04913149284._5
1239+ let bonus = $t04913149284._4
1240+ let feeAmount = $t04913149284._3
1241+ let commonState = $t04913149284._2
1242+ let amountEstimated = $t04913149284._1
12551243 let amount = if (if ((minOutAmount > 0))
12561244 then (minOutAmount > amountEstimated)
12571245 else false)
12651253 let sendFee = if ((feeAmount > 0))
12661254 then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetId)]
12671255 else nil
1268- let $t04984450091 = {
1256+ let $t04994850195 = {
12691257 let feeAmountForCalc = if ((this == feeCollectorAddress))
12701258 then 0
12711259 else feeAmount
12731261 then $Tuple2(-((amount + feeAmountForCalc)), 0)
12741262 else $Tuple2(0, -((amount + feeAmountForCalc)))
12751263 }
1276- let amountAssetBalanceDelta = $t04984450091._1
1277- let priceAssetBalanceDelta = $t04984450091._2
1278- let $t05009450202 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1279- let refreshKLpActions = $t05009450202._1
1280- let updatedKLp = $t05009450202._2
1264+ let amountAssetBalanceDelta = $t04994850195._1
1265+ let priceAssetBalanceDelta = $t04994850195._2
1266+ let $t05019850306 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1267+ let refreshKLpActions = $t05019850306._1
1268+ let updatedKLp = $t05019850306._2
12811269 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
12821270 if ((isUpdatedKLpValid == isUpdatedKLpValid))
12831271 then $Tuple2(((((commonState ++ withdrawState) ++ assetTransfer) ++ sendFee) ++ refreshKLpActions), amount)
12961284
12971285 @Callable(i)
12981286 func getOneTknREADONLY (outAssetId,paymentAmount) = {
1299- let $t05048050636 = calcGetOneToken(parseAssetId(outAssetId), paymentAmount, cfgLpAssetId, unit, unit)
1300- let amountEstimated = $t05048050636._1
1301- let commonState = $t05048050636._2
1302- let feeAmount = $t05048050636._3
1303- let bonus = $t05048050636._4
1304- let outInAmountAsset = $t05048050636._5
1287+ let $t05058450740 = calcGetOneToken(parseAssetId(outAssetId), paymentAmount, cfgLpAssetId, unit, unit)
1288+ let amountEstimated = $t05058450740._1
1289+ let commonState = $t05058450740._2
1290+ let feeAmount = $t05058450740._3
1291+ let bonus = $t05058450740._4
1292+ let outInAmountAsset = $t05058450740._5
13051293 $Tuple2(nil, $Tuple3(amountEstimated, feeAmount, bonus))
13061294 }
13071295
13381326 let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(cfgLpAssetId), unstakeAmount], nil)
13391327 if ((unstakeInv == unstakeInv))
13401328 then {
1341- let $t05154151692 = calcGetOneToken(outAssetId, unstakeAmount, cfgLpAssetId, userAddress, txId)
1342- if (($t05154151692 == $t05154151692))
1329+ let $t05164551796 = calcGetOneToken(outAssetId, unstakeAmount, cfgLpAssetId, userAddress, txId)
1330+ if (($t05164551796 == $t05164551796))
13431331 then {
1344- let outInAmountAsset = $t05154151692._5
1345- let bonus = $t05154151692._4
1346- let feeAmount = $t05154151692._3
1347- let commonState = $t05154151692._2
1348- let amountEstimated = $t05154151692._1
1332+ let outInAmountAsset = $t05164551796._5
1333+ let bonus = $t05164551796._4
1334+ let feeAmount = $t05164551796._3
1335+ let commonState = $t05164551796._2
1336+ let amountEstimated = $t05164551796._1
13491337 let amount = if (if ((minOutAmount > 0))
13501338 then (minOutAmount > amountEstimated)
13511339 else false)
13591347 let sendFee = if ((feeAmount > 0))
13601348 then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetId)]
13611349 else nil
1362- let $t05235152598 = {
1350+ let $t05245552702 = {
13631351 let feeAmountForCalc = if ((this == feeCollectorAddress))
13641352 then 0
13651353 else feeAmount
13671355 then $Tuple2(-((amount + feeAmountForCalc)), 0)
13681356 else $Tuple2(0, -((amount + feeAmountForCalc)))
13691357 }
1370- let amountAssetBalanceDelta = $t05235152598._1
1371- let priceAssetBalanceDelta = $t05235152598._2
1372- let $t05260152709 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1373- let refreshKLpActions = $t05260152709._1
1374- let updatedKLp = $t05260152709._2
1358+ let amountAssetBalanceDelta = $t05245552702._1
1359+ let priceAssetBalanceDelta = $t05245552702._2
1360+ let $t05270552813 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1361+ let refreshKLpActions = $t05270552813._1
1362+ let updatedKLp = $t05270552813._2
13751363 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
13761364 if ((isUpdatedKLpValid == isUpdatedKLpValid))
13771365 then $Tuple2(((((commonState ++ withdrawState) ++ assetTransfer) ++ sendFee) ++ refreshKLpActions), amount)
14051393 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
14061394 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
14071395 then {
1408- let $t05380453885 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1409- let refreshKLpActions = $t05380453885._1
1410- let updatedKLp = $t05380453885._2
1396+ let $t05390853989 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1397+ let refreshKLpActions = $t05390853989._1
1398+ let updatedKLp = $t05390853989._2
14111399 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
14121400 if ((isUpdatedKLpValid == isUpdatedKLpValid))
14131401 then ((withdrawState ++ state) ++ refreshKLpActions)
14401428 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
14411429 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
14421430 then {
1443- let $t05498055061 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1444- let refreshKLpActions = $t05498055061._1
1445- let updatedKLp = $t05498055061._2
1431+ let $t05508455165 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1432+ let refreshKLpActions = $t05508455165._1
1433+ let updatedKLp = $t05508455165._2
14461434 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
14471435 if ((isUpdatedKLpValid == isUpdatedKLpValid))
14481436 then ((withdrawState ++ state) ++ refreshKLpActions)
14871475 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
14881476 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
14891477 then {
1490- let $t05633356414 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1491- let refreshKLpActions = $t05633356414._1
1492- let updatedKLp = $t05633356414._2
1478+ let $t05643756518 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1479+ let refreshKLpActions = $t05643756518._1
1480+ let updatedKLp = $t05643756518._2
14931481 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
14941482 if ((isUpdatedKLpValid == isUpdatedKLpValid))
14951483 then ((withdrawState ++ state) ++ refreshKLpActions)
15411529 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
15421530 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
15431531 then {
1544- let $t05785557936 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1545- let refreshKLpActions = $t05785557936._1
1546- let updatedKLp = $t05785557936._2
1532+ let $t05795958040 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1533+ let refreshKLpActions = $t05795958040._1
1534+ let updatedKLp = $t05795958040._2
15471535 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
15481536 if ((isUpdatedKLpValid == isUpdatedKLpValid))
15491537 then ((withdrawState ++ state) ++ refreshKLpActions)
15781566 if ((checkLastRefreshedBlockHeight == checkLastRefreshedBlockHeight))
15791567 then {
15801568 let kLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyKLp), "0")), fmtErr("invalid kLp"))
1581- let $t05914059204 = refreshKLpInternal(0, 0, 0)
1582- let kLpUpdateActions = $t05914059204._1
1583- let updatedKLp = $t05914059204._2
1569+ let $t05924459308 = refreshKLpInternal(0, 0, 0)
1570+ let kLpUpdateActions = $t05924459308._1
1571+ let updatedKLp = $t05924459308._2
15841572 let actions = if ((kLp != updatedKLp))
15851573 then kLpUpdateActions
15861574 else throwErr("nothing to refresh")
17551743 match tx {
17561744 case order: Order =>
17571745 let matcherPub = getMatcherPubOrFail()
1758- let $t06786667935 = validateMatcherOrderAllowed(order)
1759- let orderValid = $t06786667935._1
1760- let orderValidInfo = $t06786667935._2
1746+ let $t06797068087 = if (skipOrderValidation())
1747+ then $Tuple2(true, "")
1748+ else validateMatcherOrderAllowed(order)
1749+ let orderValid = $t06797068087._1
1750+ let orderValidInfo = $t06797068087._2
17611751 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
17621752 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
17631753 if (if (if (orderValid)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
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 big0 = toBigInt(0)
1515
1616 let big1 = toBigInt(1)
1717
1818 let big2 = toBigInt(2)
1919
2020 let wavesString = "WAVES"
2121
2222 let SEP = "__"
2323
2424 let PoolActive = 1
2525
2626 let PoolPutDisabled = 2
2727
2828 let PoolMatcherDisabled = 3
2929
3030 let PoolShutdown = 4
3131
3232 let idxPoolAddress = 1
3333
3434 let idxPoolStatus = 2
3535
3636 let idxPoolLPAssetId = 3
3737
3838 let idxAmtAssetId = 4
3939
4040 let idxPriceAssetId = 5
4141
4242 let idxAmtAssetDcm = 6
4343
4444 let idxPriceAssetDcm = 7
4545
4646 let idxIAmtAssetId = 8
4747
4848 let idxIPriceAssetId = 9
4949
5050 let idxLPAssetDcm = 10
5151
5252 let idxPoolAmtAssetAmt = 1
5353
5454 let idxPoolPriceAssetAmt = 2
5555
5656 let idxPoolLPAssetAmt = 3
5757
5858 let idxFactoryStakingContract = 1
5959
6060 let idxFactorySlippageContract = 7
6161
6262 func toX18 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
6363
6464
6565 func toX18BigInt (origVal,origScaleMult) = fraction(origVal, scale18, origScaleMult)
6666
6767
6868 func fromX18 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
6969
7070
7171 func fromX18Round (val,resultScaleMult,round) = toInt(fraction(val, toBigInt(resultScaleMult), scale18, round))
7272
7373
7474 func toScale (amt,resScale,curScale) = fraction(amt, resScale, curScale)
7575
7676
7777 func abs (val) = if ((0 > val))
7878 then -(val)
7979 else val
8080
8181
8282 func absBigInt (val) = if ((zeroBigInt > val))
8383 then -(val)
8484 else val
8585
8686
8787 func swapContract () = "%s__swapContract"
8888
8989
9090 func fc () = "%s__factoryContract"
9191
9292
93-func mpk () = "%s__managerPublicKey"
93+func keyManagerPublicKey () = "%s__managerPublicKey"
9494
9595
96-func pmpk () = "%s__pendingManagerPublicKey"
96+func keyManagerVaultAddress () = "%s__managerVaultAddress"
9797
9898
9999 func pl () = "%s%s__price__last"
100100
101101
102102 func ph (h,timestamp) = makeString(["%s%s%d%d__price__history", toString(h), toString(timestamp)], SEP)
103103
104104
105105 func pau (userAddress,txId) = ((("%s%s%s__P__" + userAddress) + "__") + txId)
106106
107107
108108 func gau (userAddress,txId) = ((("%s%s%s__G__" + userAddress) + "__") + txId)
109109
110110
111111 func aa () = "%s__amountAsset"
112112
113113
114114 func pa () = "%s__priceAsset"
115115
116116
117117 let keyFee = "%s__fee"
118118
119119 let feeDefault = fraction(10, scale8, 10000)
120120
121121 let fee = valueOrElse(getInteger(this, keyFee), feeDefault)
122122
123123 let keyKLp = makeString(["%s", "kLp"], SEP)
124124
125125 let keyKLpRefreshedHeight = makeString(["%s", "kLpRefreshedHeight"], SEP)
126126
127127 let keyKLpRefreshDelay = makeString(["%s", "refreshKLpDelay"], SEP)
128128
129129 let kLpRefreshDelayDefault = 30
130130
131131 let kLpRefreshDelay = valueOrElse(getInteger(this, keyKLpRefreshDelay), kLpRefreshDelayDefault)
132132
133133 func keyAdditionalBalance (assetId) = makeString(["%s%s", "stakedBalance", assetId], SEP)
134134
135135
136136 func keyStakingAssetBalance (assetId) = makeString(["%s%s", "shareAssetBalance", assetId], SEP)
137137
138138
139139 func getAdditionalBalanceOrZero (assetId) = valueOrElse(getInteger(this, keyAdditionalBalance(assetId)), 0)
140140
141141
142142 func getStakingAssetBalanceOrZero (assetId) = valueOrElse(getInteger(this, keyStakingAssetBalance(assetId)), 0)
143143
144144
145145 func keyFactoryConfig () = "%s__factoryConfig"
146146
147147
148148 func keyMatcherPub () = "%s%s__matcher__publicKey"
149149
150150
151151 func keyMappingPoolContractAddressToPoolAssets (poolContractAddress) = (("%s%s%s__" + poolContractAddress) + "__mappings__poolContract2LpAsset")
152152
153153
154154 func keyPoolConfig (iAmtAsset,iPriceAsset) = (((("%d%d%s__" + iAmtAsset) + "__") + iPriceAsset) + "__config")
155155
156156
157157 func keyMappingsBaseAsset2internalId (baseAssetStr) = ("%s%s%s__mappings__baseAsset2internalId__" + baseAssetStr)
158158
159159
160160 func keyAllPoolsShutdown () = "%s__shutdown"
161161
162162
163163 func keyPoolWeight (contractAddress) = ("%s%s__poolWeight__" + contractAddress)
164164
165165
166166 func keyAllowedLpScriptHash () = "%s__allowedLpScriptHash"
167167
168168
169169 let keyFeeCollectorAddress = "%s__feeCollectorAddress"
170170
171+func keySkipOrderValidation (poolAddress) = ("%s%s__skipOrderValidation__" + poolAddress)
172+
173+
171174 func throwOrderError (orderValid,orderValidInfo,senderValid,matcherValid) = throw((((((((("order validation failed: orderValid=" + toString(orderValid)) + " (") + orderValidInfo) + ")") + " senderValid=") + toString(senderValid)) + " matcherValid=") + toString(matcherValid)))
175+
176+
177+func addressFromStringOrThis (addressString) = match addressFromString(addressString) {
178+ case a: Address =>
179+ a
180+ case _ =>
181+ this
182+}
183+
184+
185+func getManagerVaultAddressOrThis () = {
186+ let factoryAddress = match getString(fc()) {
187+ case fca: String =>
188+ addressFromStringOrThis(fca)
189+ case _ =>
190+ this
191+ }
192+ match getString(factoryAddress, keyManagerVaultAddress()) {
193+ case s: String =>
194+ addressFromStringOrThis(s)
195+ case _ =>
196+ this
197+ }
198+ }
172199
173200
174201 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
175202
176203
177204 func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
178205
179206
180207 func throwErr (msg) = throw(makeString(["lp.ride:", msg], " "))
181208
182209
183210 func fmtErr (msg) = makeString(["lp.ride:", msg], " ")
184211
185212
186213 let factoryContract = addressFromStringValue(getStringOrFail(this, fc()))
187214
188215 let feeCollectorAddress = addressFromStringValue(getStringOrFail(factoryContract, keyFeeCollectorAddress))
189216
190217 let inFee = {
191218 let @ = invoke(factoryContract, "getInFeeREADONLY", [toString(this)], nil)
192219 if ($isInstanceOf(@, "Int"))
193220 then @
194221 else throw(($getType(@) + " couldn't be cast to Int"))
195222 }
196223
197224 let outFee = {
198225 let @ = invoke(factoryContract, "getOutFeeREADONLY", [toString(this)], nil)
199226 if ($isInstanceOf(@, "Int"))
200227 then @
201228 else throw(($getType(@) + " couldn't be cast to Int"))
202229 }
203230
204231 func isGlobalShutdown () = valueOrElse(getBoolean(factoryContract, keyAllPoolsShutdown()), false)
205232
206233
207234 func getMatcherPubOrFail () = fromBase58String(getStringOrFail(factoryContract, keyMatcherPub()))
208235
209236
210237 func getPoolConfig () = {
211238 let amtAsset = getStringOrFail(this, aa())
212239 let priceAsset = getStringOrFail(this, pa())
213240 let iPriceAsset = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(priceAsset))
214241 let iAmtAsset = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(amtAsset))
215242 split(getStringOrFail(factoryContract, keyPoolConfig(toString(iAmtAsset), toString(iPriceAsset))), SEP)
216243 }
217244
218245
219246 func parseAssetId (input) = if ((input == wavesString))
220247 then unit
221248 else fromBase58String(input)
222249
223250
224251 func assetIdToString (input) = if ((input == unit))
225252 then wavesString
226253 else toBase58String(value(input))
227254
228255
229256 func parsePoolConfig (poolConfig) = $Tuple7(addressFromStringValue(poolConfig[idxPoolAddress]), parseIntValue(poolConfig[idxPoolStatus]), fromBase58String(poolConfig[idxPoolLPAssetId]), parseAssetId(poolConfig[idxAmtAssetId]), parseAssetId(poolConfig[idxPriceAssetId]), parseIntValue(poolConfig[idxAmtAssetDcm]), parseIntValue(poolConfig[idxPriceAssetDcm]))
230257
231258
232259 let poolConfigParsed = parsePoolConfig(getPoolConfig())
233260
234-let $t089629128 = poolConfigParsed
261+let $t095299695 = poolConfigParsed
235262
236-let cfgPoolAddress = $t089629128._1
263+let cfgPoolAddress = $t095299695._1
237264
238-let cfgPoolStatus = $t089629128._2
265+let cfgPoolStatus = $t095299695._2
239266
240-let cfgLpAssetId = $t089629128._3
267+let cfgLpAssetId = $t095299695._3
241268
242-let cfgAmountAssetId = $t089629128._4
269+let cfgAmountAssetId = $t095299695._4
243270
244-let cfgPriceAssetId = $t089629128._5
271+let cfgPriceAssetId = $t095299695._5
245272
246-let cfgAmountAssetDecimals = $t089629128._6
273+let cfgAmountAssetDecimals = $t095299695._6
247274
248-let cfgPriceAssetDecimals = $t089629128._7
275+let cfgPriceAssetDecimals = $t095299695._7
249276
250277 func getFactoryConfig () = split(getStringOrFail(factoryContract, keyFactoryConfig()), SEP)
251278
252279
253280 let stakingContract = valueOrErrorMessage(addressFromString(getFactoryConfig()[idxFactoryStakingContract]), "incorrect staking address")
254281
255282 let slippageContract = valueOrErrorMessage(addressFromString(getFactoryConfig()[idxFactorySlippageContract]), "incorrect staking address")
256283
257284 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)
258285
259286
260287 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)
261288
262289
263290 func getAccBalance (assetId) = {
264291 let balanceOnPool = if ((assetId == "WAVES"))
265292 then wavesBalance(this).available
266293 else assetBalance(this, fromBase58String(assetId))
267294 let totalBalance = ((balanceOnPool + getAdditionalBalanceOrZero(assetId)) - getStakingAssetBalanceOrZero(assetId))
268295 max([0, totalBalance])
269296 }
270297
271298
272299 func calcPriceBigInt (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
273300
274301
275302 func calcPriceBigIntRound (prAmtX18,amAmtX18,round) = fraction(prAmtX18, scale18, amAmtX18, round)
276303
277304
278305 func getRate (proxy) = {
279306 let inv = invoke(proxy, "getRate", nil, nil)
280307 if ((inv == inv))
281308 then match inv {
282309 case r: Int =>
283310 r
284311 case _ =>
285312 throwErr("proxy.getRate() unexpected value")
286313 }
287314 else throw("Strict value is not equal to itself.")
288315 }
289316
290317
291318 func deposit (assetId,amount,stakingAssetId,proxy) = {
292319 let currentAdditionalBalance = getAdditionalBalanceOrZero(assetId)
293320 if ((currentAdditionalBalance == currentAdditionalBalance))
294321 then {
295322 let currentStakingAssetBalance = getStakingAssetBalanceOrZero(stakingAssetId)
296323 if ((currentStakingAssetBalance == currentStakingAssetBalance))
297324 then {
298325 let asset = parseAssetId(assetId)
299326 if ((amount > 0))
300327 then {
301328 let depositInvoke = invoke(proxy, "deposit", nil, [AttachedPayment(asset, amount)])
302329 if ((depositInvoke == depositInvoke))
303330 then match depositInvoke {
304331 case receivedStakingAsset: Int =>
305332 let newAdditionalBalance = (currentAdditionalBalance + amount)
306333 let newStakingAssetBalance = (currentStakingAssetBalance + receivedStakingAsset)
307334 [IntegerEntry(keyAdditionalBalance(assetId), newAdditionalBalance), IntegerEntry(keyStakingAssetBalance(stakingAssetId), newStakingAssetBalance)]
308335 case _ =>
309336 nil
310337 }
311338 else throw("Strict value is not equal to itself.")
312339 }
313340 else nil
314341 }
315342 else throw("Strict value is not equal to itself.")
316343 }
317344 else throw("Strict value is not equal to itself.")
318345 }
319346
320347
321348 func withdraw (assetId,amount,stakingAssetId,proxy,proxyRateMul,profitAddress) = {
322349 let currentAdditionalBalance = getAdditionalBalanceOrZero(assetId)
323350 if ((currentAdditionalBalance == currentAdditionalBalance))
324351 then {
325352 let currentStakingAssetBalance = getStakingAssetBalanceOrZero(stakingAssetId)
326353 if ((currentStakingAssetBalance == currentStakingAssetBalance))
327354 then {
328355 let currentProxyRate = getRate(proxy)
329356 if ((currentProxyRate == currentProxyRate))
330357 then {
331358 let oldRate = fraction(proxyRateMul, currentAdditionalBalance, currentStakingAssetBalance)
332359 let stakingAsset = parseAssetId(stakingAssetId)
333360 let oldSendStakingAmount = fraction(proxyRateMul, amount, oldRate)
334361 let sendStakingAssetAmount = fraction(proxyRateMul, amount, currentProxyRate)
335362 let profitAmount = max([0, (oldSendStakingAmount - sendStakingAssetAmount)])
336363 if ((sendStakingAssetAmount > 0))
337364 then {
338365 let withdrawInvoke = invoke(proxy, "withdraw", nil, [AttachedPayment(stakingAsset, sendStakingAssetAmount)])
339366 if ((withdrawInvoke == withdrawInvoke))
340367 then match withdrawInvoke {
341368 case receivedAssets: Int =>
342369 let newAdditionalBalance = (currentAdditionalBalance - receivedAssets)
343370 let newStakingAssetBalance = ((currentStakingAssetBalance - sendStakingAssetAmount) - profitAmount)
344371 [IntegerEntry(keyAdditionalBalance(assetId), newAdditionalBalance), IntegerEntry(keyStakingAssetBalance(stakingAssetId), newStakingAssetBalance), ScriptTransfer(profitAddress, profitAmount, parseAssetId(stakingAssetId))]
345372 case _ =>
346373 nil
347374 }
348375 else throw("Strict value is not equal to itself.")
349376 }
350377 else nil
351378 }
352379 else throw("Strict value is not equal to itself.")
353380 }
354381 else throw("Strict value is not equal to itself.")
355382 }
356383 else throw("Strict value is not equal to itself.")
357384 }
358385
359386
360387 func getLeaseProxyConfig (assetId) = match invoke(factoryContract, "getPoolLeaseConfigREADONLY", [toString(this), assetId], nil) {
361388 case a: (Boolean, Int, Int, String, String, Int, String) =>
362389 a
363390 case _ =>
364391 throwErr((("[" + assetId) + "] getLeaseProxyConfig() error"))
365392 }
366393
367394
368395 func rebalanceInternal (targetRatio,assetId,stakingAssetId,minBalance,proxy,proxyRateMul,profitAddress) = {
369396 let currentAdditionalBalance = getAdditionalBalanceOrZero(assetId)
370397 if ((currentAdditionalBalance == currentAdditionalBalance))
371398 then {
372399 let currentStakingAssetBalance = getStakingAssetBalanceOrZero(stakingAssetId)
373400 if ((currentStakingAssetBalance == currentStakingAssetBalance))
374401 then {
375402 let leasableTotalBalance = max([0, (getAccBalance(assetId) - minBalance)])
376403 let targetAdditionalBalance = fraction(targetRatio, leasableTotalBalance, 100)
377404 let diff = (currentAdditionalBalance - targetAdditionalBalance)
378405 if ((diff == 0))
379406 then nil
380407 else if ((0 > diff))
381408 then {
382409 let sendAssetAmount = -(diff)
383410 deposit(assetId, sendAssetAmount, stakingAssetId, proxy)
384411 }
385412 else {
386413 let getAssetAmount = diff
387414 withdraw(assetId, getAssetAmount, stakingAssetId, proxy, proxyRateMul, profitAddress)
388415 }
389416 }
390417 else throw("Strict value is not equal to itself.")
391418 }
392419 else throw("Strict value is not equal to itself.")
393420 }
394421
395422
396423 func rebalanceAsset (assetId) = {
397- let $t01536415500 = getLeaseProxyConfig(assetId)
398- let isLeasable = $t01536415500._1
399- let leasedRatio = $t01536415500._2
400- let minBalance = $t01536415500._3
401- let proxyAddress = $t01536415500._4
402- let proxyAssetId = $t01536415500._5
403- let proxyRateMul = $t01536415500._6
404- let stakingProfitAddress = $t01536415500._7
424+ let $t01593116067 = getLeaseProxyConfig(assetId)
425+ let isLeasable = $t01593116067._1
426+ let leasedRatio = $t01593116067._2
427+ let minBalance = $t01593116067._3
428+ let proxyAddress = $t01593116067._4
429+ let proxyAssetId = $t01593116067._5
430+ let proxyRateMul = $t01593116067._6
431+ let stakingProfitAddress = $t01593116067._7
405432 if (isLeasable)
406433 then rebalanceInternal(leasedRatio, assetId, proxyAssetId, minBalance, addressFromStringValue(proxyAddress), proxyRateMul, addressFromStringValue(stakingProfitAddress))
407434 else nil
408435 }
409436
410437
411438 func withdrawAndRebalanceAsset (assetId,getAmount) = {
412- let $t01589916035 = getLeaseProxyConfig(assetId)
413- let isLeasable = $t01589916035._1
414- let leasedRatio = $t01589916035._2
415- let minBalance = $t01589916035._3
416- let proxyAddress = $t01589916035._4
417- let proxyAssetId = $t01589916035._5
418- let proxyRateMul = $t01589916035._6
419- let stakingProfitAddress = $t01589916035._7
439+ let $t01646616602 = getLeaseProxyConfig(assetId)
440+ let isLeasable = $t01646616602._1
441+ let leasedRatio = $t01646616602._2
442+ let minBalance = $t01646616602._3
443+ let proxyAddress = $t01646616602._4
444+ let proxyAssetId = $t01646616602._5
445+ let proxyRateMul = $t01646616602._6
446+ let stakingProfitAddress = $t01646616602._7
420447 if (isLeasable)
421448 then {
422449 let newTotalLeasableBalance = max([0, ((getAccBalance(assetId) - getAmount) - minBalance)])
423450 if ((newTotalLeasableBalance == newTotalLeasableBalance))
424451 then {
425452 let newAdditionalBalance = fraction(leasedRatio, newTotalLeasableBalance, 100)
426453 if ((newAdditionalBalance == newAdditionalBalance))
427454 then {
428455 let withdrawAmount = (getAdditionalBalanceOrZero(assetId) - newAdditionalBalance)
429456 if ((withdrawAmount == withdrawAmount))
430457 then if ((0 > withdrawAmount))
431458 then deposit(assetId, -(withdrawAmount), proxyAssetId, addressFromStringValue(proxyAddress))
432459 else withdraw(assetId, withdrawAmount, proxyAssetId, addressFromStringValue(proxyAddress), proxyRateMul, addressFromStringValue(stakingProfitAddress))
433460 else throw("Strict value is not equal to itself.")
434461 }
435462 else throw("Strict value is not equal to itself.")
436463 }
437464 else throw("Strict value is not equal to itself.")
438465 }
439466 else nil
440467 }
441468
442469
443470 func withdrawAndRebalanceAll (amountAssetOutAmount,priceAssetOutAmount) = {
444471 let AmAmtWithdrawState = withdrawAndRebalanceAsset(getStringOrFail(this, aa()), amountAssetOutAmount)
445472 let PrAmtWithdrawState = withdrawAndRebalanceAsset(getStringOrFail(this, pa()), priceAssetOutAmount)
446473 (AmAmtWithdrawState ++ PrAmtWithdrawState)
447474 }
448475
449476
450477 func privateCalcPrice (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
451478 let amtAssetAmtX18 = toX18(amAmt, amAssetDcm)
452479 let priceAssetAmtX18 = toX18(prAmt, prAssetDcm)
453480 calcPriceBigInt(priceAssetAmtX18, amtAssetAmtX18)
454481 }
455482
456483
457484 func calcPrices (amAmt,prAmt,lpAmt) = {
458485 let cfg = getPoolConfig()
459486 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
460487 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
461488 let priceX18 = privateCalcPrice(amtAssetDcm, priceAssetDcm, amAmt, prAmt)
462489 let amAmtX18 = toX18(amAmt, amtAssetDcm)
463490 let prAmtX18 = toX18(prAmt, priceAssetDcm)
464491 let lpAmtX18 = toX18(lpAmt, scale8)
465492 let lpPriceInAmAssetX18 = calcPriceBigInt(amAmtX18, lpAmtX18)
466493 let lpPriceInPrAssetX18 = calcPriceBigInt(prAmtX18, lpAmtX18)
467494 [priceX18, lpPriceInAmAssetX18, lpPriceInPrAssetX18]
468495 }
469496
470497
471498 func calculatePrices (amAmt,prAmt,lpAmt) = {
472499 let prices = calcPrices(amAmt, prAmt, lpAmt)
473500 [fromX18(prices[0], scale8), fromX18(prices[1], scale8), fromX18(prices[2], scale8)]
474501 }
475502
476503
477504 func estimateGetOperation (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
478505 let cfg = getPoolConfig()
479506 let lpAssetId = cfg[idxPoolLPAssetId]
480507 let amAssetId = cfg[idxAmtAssetId]
481508 let prAssetId = cfg[idxPriceAssetId]
482509 let amAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
483510 let prAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
484511 let poolStatus = cfg[idxPoolStatus]
485512 let lpEmission = valueOrErrorMessage(assetInfo(fromBase58String(lpAssetId)), (("Asset " + lpAssetId) + " doesn't exist")).quantity
486513 if ((lpAssetId != pmtAssetId))
487514 then throw("Invalid asset passed.")
488515 else {
489516 let amBalance = getAccBalance(amAssetId)
490517 let amBalanceX18 = toX18(amBalance, amAssetDcm)
491518 let prBalance = getAccBalance(prAssetId)
492519 let prBalanceX18 = toX18(prBalance, prAssetDcm)
493520 let curPriceX18 = calcPriceBigInt(prBalanceX18, amBalanceX18)
494521 let curPrice = fromX18(curPriceX18, scale8)
495522 let pmtLpAmtX18 = toX18(pmtLpAmt, scale8)
496523 let lpEmissionX18 = toX18(lpEmission, scale8)
497524 let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissionX18)
498525 let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissionX18)
499526 let outAmAmt = fromX18Round(outAmAmtX18, amAssetDcm, FLOOR)
500527 let outPrAmt = fromX18Round(outPrAmtX18, prAssetDcm, FLOOR)
501528 let state = if ((txId58 == ""))
502529 then nil
503530 else [ScriptTransfer(userAddress, outAmAmt, if ((amAssetId == "WAVES"))
504531 then unit
505532 else fromBase58String(amAssetId)), ScriptTransfer(userAddress, outPrAmt, if ((prAssetId == "WAVES"))
506533 then unit
507534 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)]
508535 $Tuple10(outAmAmt, outPrAmt, amAssetId, prAssetId, amBalance, prBalance, lpEmission, curPriceX18, poolStatus, state)
509536 }
510537 }
511538
512539
513540 func estimatePutOperation (txId58,slippageTolerance,inAmAssetAmt,inAmAssetId,inPrAssetAmt,inPrAssetId,userAddress,isEvaluate,emitLp) = {
514541 let cfg = getPoolConfig()
515542 let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId])
516543 let amAssetIdStr = cfg[idxAmtAssetId]
517544 let prAssetIdStr = cfg[idxPriceAssetId]
518545 let iAmtAssetId = cfg[idxIAmtAssetId]
519546 let iPriceAssetId = cfg[idxIPriceAssetId]
520547 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
521548 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
522549 let poolStatus = cfg[idxPoolStatus]
523550 let lpEmission = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
524551 let inAmAssetIdStr = toBase58String(valueOrElse(inAmAssetId, fromBase58String("WAVES")))
525552 let inPrAssetIdStr = toBase58String(valueOrElse(inPrAssetId, fromBase58String("WAVES")))
526553 if (if ((amAssetIdStr != inAmAssetIdStr))
527554 then true
528555 else (prAssetIdStr != inPrAssetIdStr))
529556 then throw("Invalid amt or price asset passed.")
530557 else {
531558 let amBalance = if (isEvaluate)
532559 then getAccBalance(amAssetIdStr)
533560 else (getAccBalance(amAssetIdStr) - inAmAssetAmt)
534561 let prBalance = if (isEvaluate)
535562 then getAccBalance(prAssetIdStr)
536563 else (getAccBalance(prAssetIdStr) - inPrAssetAmt)
537564 let inAmAssetAmtX18 = toX18(inAmAssetAmt, amtAssetDcm)
538565 let inPrAssetAmtX18 = toX18(inPrAssetAmt, priceAssetDcm)
539566 let userPriceX18 = calcPriceBigInt(inPrAssetAmtX18, inAmAssetAmtX18)
540567 let amBalanceX18 = toX18(amBalance, amtAssetDcm)
541568 let prBalanceX18 = toX18(prBalance, priceAssetDcm)
542569 let res = if ((lpEmission == 0))
543570 then {
544571 let curPriceX18 = zeroBigInt
545572 let slippageX18 = zeroBigInt
546573 let lpAmtX18 = pow((inAmAssetAmtX18 * inPrAssetAmtX18), 0, toBigInt(5), 1, 0, DOWN)
547574 $Tuple5(fromX18(lpAmtX18, scale8), fromX18(inAmAssetAmtX18, amtAssetDcm), fromX18(inPrAssetAmtX18, priceAssetDcm), calcPriceBigInt((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
548575 }
549576 else {
550577 let curPriceX18 = calcPriceBigInt(prBalanceX18, amBalanceX18)
551578 let slippageX18 = fraction(absBigInt((curPriceX18 - userPriceX18)), scale18, curPriceX18)
552579 let slippageToleranceX18 = toX18(slippageTolerance, scale8)
553580 if (if ((curPriceX18 != zeroBigInt))
554581 then (slippageX18 > slippageToleranceX18)
555582 else false)
556583 then throw(((("Price slippage " + toString(slippageX18)) + " exceeded the passed limit of ") + toString(slippageToleranceX18)))
557584 else {
558585 let lpEmissionX18 = toX18(lpEmission, scale8)
559586 let prViaAmX18 = fraction(inAmAssetAmtX18, calcPriceBigIntRound(prBalanceX18, amBalanceX18, CEILING), scale18, CEILING)
560587 let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, calcPriceBigIntRound(prBalanceX18, amBalanceX18, FLOOR), CEILING)
561588 let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
562589 then $Tuple2(amViaPrX18, inPrAssetAmtX18)
563590 else $Tuple2(inAmAssetAmtX18, prViaAmX18)
564591 let expAmtAssetAmtX18 = expectedAmts._1
565592 let expPriceAssetAmtX18 = expectedAmts._2
566593 let lpAmtX18 = fraction(lpEmissionX18, expPriceAssetAmtX18, prBalanceX18, FLOOR)
567594 $Tuple5(fromX18Round(lpAmtX18, scale8, FLOOR), fromX18Round(expAmtAssetAmtX18, amtAssetDcm, CEILING), fromX18Round(expPriceAssetAmtX18, priceAssetDcm, CEILING), curPriceX18, slippageX18)
568595 }
569596 }
570597 let calcLpAmt = res._1
571598 let calcAmAssetPmt = res._2
572599 let calcPrAssetPmt = res._3
573600 let curPrice = fromX18(res._4, scale8)
574601 let slippageCalc = fromX18(res._5, scale8)
575602 if ((0 >= calcLpAmt))
576603 then throw("Invalid calculations. LP calculated is less than zero.")
577604 else {
578605 let emitLpAmt = if (!(emitLp))
579606 then 0
580607 else calcLpAmt
581608 let amDiff = (inAmAssetAmt - calcAmAssetPmt)
582609 let prDiff = (inPrAssetAmt - calcPrAssetPmt)
583610 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))]
584611 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEmission, lpAssetId, poolStatus, commonState, amDiff, prDiff, inAmAssetId, inPrAssetId)
585612 }
586613 }
587614 }
588615
589616
590617 func calcKLp (amountBalance,priceBalance,lpEmission) = {
591618 let amountBalanceX18 = toX18BigInt(amountBalance, toBigInt(cfgAmountAssetDecimals))
592619 let priceBalanceX18 = toX18BigInt(priceBalance, toBigInt(cfgPriceAssetDecimals))
593620 let updatedKLp = fraction(pow((amountBalanceX18 * priceBalanceX18), 0, toBigInt(5), 1, 18, DOWN), big1, lpEmission)
594621 if ((lpEmission == big0))
595622 then big0
596623 else updatedKLp
597624 }
598625
599626
600627 func calcCurrentKLp (amountAssetDelta,priceAssetDelta,lpAssetEmissionDelta) = {
601628 let amountAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgAmountAssetId))) - amountAssetDelta)
602629 let priceAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgPriceAssetId))) - priceAssetDelta)
603630 let lpAssetEmission = (toBigInt(value(assetInfo(cfgLpAssetId)).quantity) - lpAssetEmissionDelta)
604631 let currentKLp = calcKLp(amountAssetBalance, priceAssetBalance, lpAssetEmission)
605632 currentKLp
606633 }
607634
608635
609636 func refreshKLpInternal (amountAssetBalanceDelta,priceAssetBalanceDelta,lpAssetEmissionDelta) = {
610637 let amountAssetBalance = (getAccBalance(assetIdToString(cfgAmountAssetId)) + amountAssetBalanceDelta)
611638 let priceAssetBalance = (getAccBalance(assetIdToString(cfgPriceAssetId)) + priceAssetBalanceDelta)
612639 let lpAssetEmission = (value(assetInfo(cfgLpAssetId)).quantity + lpAssetEmissionDelta)
613640 let updatedKLp = calcKLp(toBigInt(amountAssetBalance), toBigInt(priceAssetBalance), toBigInt(lpAssetEmission))
614641 let actions = [IntegerEntry(keyKLpRefreshedHeight, height), StringEntry(keyKLp, toString(updatedKLp))]
615642 $Tuple2(actions, updatedKLp)
616643 }
617644
618645
646+func skipOrderValidation () = valueOrElse(getBoolean(factoryContract, keySkipOrderValidation(toString(this))), false)
647+
648+
619649 func validateUpdatedKLp (oldKLp,updatedKLp) = if ((updatedKLp >= oldKLp))
620650 then true
621651 else throwErr(makeString(["updated KLp lower than current KLp", toString(oldKLp), toString(updatedKLp)], " "))
622652
623653
624654 func validateMatcherOrderAllowed (order) = {
625655 let amountAssetBalance = getAccBalance(assetIdToString(cfgAmountAssetId))
626656 let priceAssetBalance = getAccBalance(assetIdToString(cfgPriceAssetId))
627657 let amountAssetAmount = order.amount
628658 let priceAssetAmount = fraction(order.amount, order.price, scale8, FLOOR)
629- let $t02830128513 = if ((order.orderType == Buy))
659+ let $t02899129203 = if ((order.orderType == Buy))
630660 then $Tuple2(amountAssetAmount, -(priceAssetAmount))
631661 else $Tuple2(-(amountAssetAmount), priceAssetAmount)
632- let amountAssetBalanceDelta = $t02830128513._1
633- let priceAssetBalanceDelta = $t02830128513._2
662+ let amountAssetBalanceDelta = $t02899129203._1
663+ let priceAssetBalanceDelta = $t02899129203._2
634664 if (if (if (isGlobalShutdown())
635665 then true
636666 else (cfgPoolStatus == PoolMatcherDisabled))
637667 then true
638668 else (cfgPoolStatus == PoolShutdown))
639669 then throw("Exchange operations disabled")
640670 else if (if ((order.assetPair.amountAsset != cfgAmountAssetId))
641671 then true
642672 else (order.assetPair.priceAsset != cfgPriceAssetId))
643673 then throw("Wrong order assets.")
644674 else {
645675 let kLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyKLp), "0")), fmtErr("invalid kLp"))
646- let $t02895329053 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
647- let unusedActions = $t02895329053._1
648- let kLpNew = $t02895329053._2
676+ let $t02964329743 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
677+ let unusedActions = $t02964329743._1
678+ let kLpNew = $t02964329743._2
649679 let isOrderValid = (kLpNew >= kLp)
650680 let info = makeString(["kLp=", toString(kLp), " kLpNew=", toString(kLpNew), " amountAssetBalance=", toString(amountAssetBalance), " priceAssetBalance=", toString(priceAssetBalance), " amountAssetBalanceDelta=", toString(amountAssetBalanceDelta), " priceAssetBalanceDelta=", toString(priceAssetBalanceDelta), " height=", toString(height)], "")
651681 $Tuple2(isOrderValid, info)
652682 }
653683 }
654684
655685
656686 func commonGet (i) = if ((size(i.payments) != 1))
657687 then throw("exactly 1 payment is expected")
658688 else {
659689 let pmt = value(i.payments[0])
660690 let pmtAssetId = value(pmt.assetId)
661691 let pmtAmt = pmt.amount
662692 let res = estimateGetOperation(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
663693 let outAmAmt = res._1
664694 let outPrAmt = res._2
665695 let poolStatus = parseIntValue(res._9)
666696 let state = res._10
667697 if (if (isGlobalShutdown())
668698 then true
669699 else (poolStatus == PoolShutdown))
670700 then throw(("Get operation is blocked by admin. Status = " + toString(poolStatus)))
671701 else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state)
672702 }
673703
674704
675705 func commonPut (i,slippageTolerance,emitLp) = if ((size(i.payments) != 2))
676706 then throw("exactly 2 payments are expected")
677707 else {
678708 let amAssetPmt = value(i.payments[0])
679709 let prAssetPmt = value(i.payments[1])
680710 let estPut = estimatePutOperation(toBase58String(i.transactionId), slippageTolerance, amAssetPmt.amount, amAssetPmt.assetId, prAssetPmt.amount, prAssetPmt.assetId, toString(i.caller), false, emitLp)
681711 let poolStatus = parseIntValue(estPut._8)
682712 if (if (if (isGlobalShutdown())
683713 then true
684714 else (poolStatus == PoolPutDisabled))
685715 then true
686716 else (poolStatus == PoolShutdown))
687717 then throw(("Put operation is blocked by admin. Status = " + toString(poolStatus)))
688718 else estPut
689719 }
690720
691721
692722 func emit (amount) = {
693723 let emitInv = invoke(factoryContract, "emit", [amount], nil)
694724 if ((emitInv == emitInv))
695725 then {
696726 let emitInvLegacy = match emitInv {
697727 case legacyFactoryContract: Address =>
698728 invoke(legacyFactoryContract, "emit", [amount], nil)
699729 case _ =>
700730 unit
701731 }
702732 if ((emitInvLegacy == emitInvLegacy))
703733 then amount
704734 else throw("Strict value is not equal to itself.")
705735 }
706736 else throw("Strict value is not equal to itself.")
707737 }
708738
709739
710740 func takeFee (amount,fee) = {
711741 let feeAmount = if ((fee == 0))
712742 then 0
713743 else fraction(amount, fee, scale8)
714744 $Tuple2((amount - feeAmount), feeAmount)
715745 }
716746
717747
718748 func calcPutOneToken (paymentAmountRaw,paymentAssetId,userAddress,txId) = {
719749 let isEval = (txId == unit)
720750 let amountBalanceRaw = getAccBalance(assetIdToString(cfgAmountAssetId))
721751 let priceBalanceRaw = getAccBalance(assetIdToString(cfgPriceAssetId))
722752 let paymentInAmountAsset = if ((paymentAssetId == cfgAmountAssetId))
723753 then true
724754 else if ((paymentAssetId == cfgPriceAssetId))
725755 then false
726756 else throwErr("invalid asset")
727- let $t03216632459 = if (isEval)
757+ let $t03285633149 = if (isEval)
728758 then $Tuple2(amountBalanceRaw, priceBalanceRaw)
729759 else if (paymentInAmountAsset)
730760 then $Tuple2((amountBalanceRaw - paymentAmountRaw), priceBalanceRaw)
731761 else $Tuple2(amountBalanceRaw, (priceBalanceRaw - paymentAmountRaw))
732- let amountBalanceOld = $t03216632459._1
733- let priceBalanceOld = $t03216632459._2
734- let $t03246332612 = if (paymentInAmountAsset)
762+ let amountBalanceOld = $t03285633149._1
763+ let priceBalanceOld = $t03285633149._2
764+ let $t03315333302 = if (paymentInAmountAsset)
735765 then $Tuple2(paymentAmountRaw, 0)
736766 else $Tuple2(0, paymentAmountRaw)
737- let amountAssetAmountRaw = $t03246332612._1
738- let priceAssetAmountRaw = $t03246332612._2
767+ let amountAssetAmountRaw = $t03315333302._1
768+ let priceAssetAmountRaw = $t03315333302._2
739769 let amountAssetAmount = takeFee(amountAssetAmountRaw, inFee)._1
740770 let priceAssetAmount = takeFee(priceAssetAmountRaw, inFee)._1
741- let $t03274432808 = takeFee(paymentAmountRaw, inFee)
742- let paymentAmount = $t03274432808._1
743- let feeAmount = $t03274432808._2
771+ let $t03343433498 = takeFee(paymentAmountRaw, inFee)
772+ let paymentAmount = $t03343433498._1
773+ let feeAmount = $t03343433498._2
744774 let amountBalanceNew = (amountBalanceOld + amountAssetAmount)
745775 let priceBalanceNew = (priceBalanceOld + priceAssetAmount)
746776 let priceNewX18 = calcPriceBigInt(toX18(priceBalanceNew, cfgPriceAssetDecimals), toX18(amountBalanceNew, cfgAmountAssetDecimals))
747777 let priceNew = fromX18(priceNewX18, scale8)
748778 let paymentBalance = if (paymentInAmountAsset)
749779 then amountBalanceOld
750780 else priceBalanceOld
751781 let paymentBalanceBigInt = toBigInt(paymentBalance)
752782 let supplyBigInt = toBigInt(valueOrErrorMessage(assetInfo(cfgLpAssetId), (("asset " + toBase58String(cfgLpAssetId)) + " doesn't exist")).quantity)
753783 let chechSupply = if ((supplyBigInt > big0))
754784 then true
755785 else throwErr("initial deposit requires all coins")
756786 if ((chechSupply == chechSupply))
757787 then {
758788 let depositBigInt = toBigInt(paymentAmount)
759789 let issueAmount = max([0, toInt(((supplyBigInt * (sqrtBigInt((scale18 + ((depositBigInt * scale18) / paymentBalanceBigInt)), 18, 18, DOWN) - scale18)) / scale18))])
760790 let commonState = if (isEval)
761791 then nil
762792 else [IntegerEntry(pl(), priceNew), IntegerEntry(ph(height, lastBlock.timestamp), priceNew), StringEntry(pau(toString(value(userAddress)), toBase58String(value(txId))), dataPutActionInfo(amountAssetAmountRaw, priceAssetAmountRaw, issueAmount, priceNew, 0, 0, height, lastBlock.timestamp, 0, 0))]
763793 let priceOldX18 = calcPriceBigInt(toX18(priceBalanceOld, cfgPriceAssetDecimals), toX18(amountBalanceOld, cfgAmountAssetDecimals))
764794 let priceOld = fromX18(priceOldX18, scale8)
765795 let loss = {
766- let $t03448934656 = if (paymentInAmountAsset)
796+ let $t03517935346 = if (paymentInAmountAsset)
767797 then $Tuple2(amountAssetAmountRaw, amountBalanceOld)
768798 else $Tuple2(priceAssetAmountRaw, priceBalanceOld)
769- let amount = $t03448934656._1
770- let balance = $t03448934656._2
799+ let amount = $t03517935346._1
800+ let balance = $t03517935346._2
771801 let issueAmountBoth = toInt(fraction(supplyBigInt, toBigInt((amount / 2)), toBigInt(balance)))
772802 fraction((issueAmount - issueAmountBoth), scale8, issueAmountBoth)
773803 }
774804 $Tuple5(issueAmount, commonState, feeAmount, loss, paymentInAmountAsset)
775805 }
776806 else throw("Strict value is not equal to itself.")
777807 }
778808
779809
780810 func calcGetOneToken (outAssetId,paymentAmount,paymentAssetId,userAddress,txId) = {
781811 let isEval = (txId == unit)
782812 let cfg = getPoolConfig()
783813 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
784814 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
785815 let checks = [if ((paymentAssetId == cfgLpAssetId))
786816 then true
787817 else throwErr("invalid lp asset")]
788818 if ((checks == checks))
789819 then {
790820 let outInAmountAsset = if ((outAssetId == cfgAmountAssetId))
791821 then true
792822 else if ((outAssetId == cfgPriceAssetId))
793823 then false
794824 else throwErr("invalid asset")
795825 let balanceBigInt = if (outInAmountAsset)
796826 then toBigInt(getAccBalance(assetIdToString(cfgAmountAssetId)))
797827 else toBigInt(getAccBalance(assetIdToString(cfgPriceAssetId)))
798828 let outInAmountAssetDecimals = if (outInAmountAsset)
799829 then amtAssetDcm
800830 else priceAssetDcm
801831 let amBalanceOld = getAccBalance(assetIdToString(cfgAmountAssetId))
802832 let prBalanceOld = getAccBalance(assetIdToString(cfgPriceAssetId))
803833 let outBalance = if (outInAmountAsset)
804834 then amBalanceOld
805835 else prBalanceOld
806836 let outBalanceBigInt = toBigInt(outBalance)
807837 let supplyBigInt = toBigInt(valueOrErrorMessage(assetInfo(cfgLpAssetId), (("asset " + toBase58String(cfgLpAssetId)) + " doesn't exist")).quantity)
808838 let redeemedBigInt = toBigInt(paymentAmount)
809839 let amountRaw = max([0, toInt(((balanceBigInt * (scale18 - pow((scale18 - ((redeemedBigInt * scale18) / supplyBigInt)), 18, big2, 0, 18, DOWN))) / scale18))])
810- let $t03673436790 = takeFee(amountRaw, outFee)
811- let totalAmount = $t03673436790._1
812- let feeAmount = $t03673436790._2
813- let $t03679437020 = if (outInAmountAsset)
840+ let $t03742437480 = takeFee(amountRaw, outFee)
841+ let totalAmount = $t03742437480._1
842+ let feeAmount = $t03742437480._2
843+ let $t03748437710 = if (outInAmountAsset)
814844 then $Tuple4(totalAmount, 0, (amBalanceOld - amountRaw), prBalanceOld)
815845 else $Tuple4(0, totalAmount, amBalanceOld, (prBalanceOld - amountRaw))
816- let outAmAmount = $t03679437020._1
817- let outPrAmount = $t03679437020._2
818- let amBalanceNew = $t03679437020._3
819- let prBalanceNew = $t03679437020._4
846+ let outAmAmount = $t03748437710._1
847+ let outPrAmount = $t03748437710._2
848+ let amBalanceNew = $t03748437710._3
849+ let prBalanceNew = $t03748437710._4
820850 let priceNewX18 = calcPriceBigInt(toX18(prBalanceNew, cfgPriceAssetDecimals), toX18(amBalanceNew, cfgAmountAssetDecimals))
821851 let priceNew = fromX18(priceNewX18, scale8)
822852 let commonState = if (isEval)
823853 then nil
824854 else [StringEntry(gau(toString(value(userAddress)), toBase58String(value(txId))), dataGetActionInfo(outAmAmount, outPrAmount, paymentAmount, priceNew, height, lastBlock.timestamp)), IntegerEntry(pl(), priceNew), IntegerEntry(ph(height, lastBlock.timestamp), priceNew)]
825855 let priceOldX18 = calcPriceBigInt(toX18(prBalanceOld, cfgPriceAssetDecimals), toX18(amBalanceOld, cfgAmountAssetDecimals))
826856 let priceOld = fromX18(priceOldX18, scale8)
827857 let loss = {
828858 let amountBothInPaymentAsset = (toInt(fraction(balanceBigInt, redeemedBigInt, supplyBigInt)) * 2)
829859 fraction((totalAmount - amountBothInPaymentAsset), scale8, amountBothInPaymentAsset)
830860 }
831861 $Tuple5(totalAmount, commonState, feeAmount, loss, outInAmountAsset)
832862 }
833863 else throw("Strict value is not equal to itself.")
834864 }
835865
836866
837-func managerPublicKeyOrUnit () = match getString(mpk()) {
838- case s: String =>
839- fromBase58String(s)
840- case _: Unit =>
841- unit
842- case _ =>
843- throw("Match error")
844-}
845-
846-
847-func pendingManagerPublicKeyOrUnit () = match getString(pmpk()) {
848- case s: String =>
849- fromBase58String(s)
850- case _: Unit =>
851- unit
852- case _ =>
853- throw("Match error")
854-}
867+func managerPublicKeyOrUnit () = {
868+ let managerVaultAddress = getManagerVaultAddressOrThis()
869+ match getString(managerVaultAddress, keyManagerPublicKey()) {
870+ case s: String =>
871+ fromBase58String(s)
872+ case _: Unit =>
873+ unit
874+ case _ =>
875+ throw("Match error")
876+ }
877+ }
855878
856879
857880 func isManager (i) = match managerPublicKeyOrUnit() {
858881 case pk: ByteVector =>
859882 (i.callerPublicKey == pk)
860883 case _: Unit =>
861884 (i.caller == this)
862885 case _ =>
863886 throw("Match error")
864887 }
865888
866889
867890 func mustManager (i) = {
868891 let pd = throw("Permission denied")
869892 match managerPublicKeyOrUnit() {
870893 case pk: ByteVector =>
871894 if ((i.callerPublicKey == pk))
872895 then true
873896 else pd
874897 case _: Unit =>
875898 if ((i.caller == this))
876899 then true
877900 else pd
878901 case _ =>
879902 throw("Match error")
880903 }
881904 }
882905
883906
884907 @Callable(i)
885908 func rebalance () = (rebalanceAsset(getStringOrFail(this, aa())) ++ rebalanceAsset(getStringOrFail(this, pa())))
886909
887910
888911
889912 @Callable(i)
890913 func calculateAmountOutForSwapREADONLY (cleanAmountIn,isReverse,feePoolAmount) = {
891- let $t03890639211 = if ((isReverse == false))
914+ let $t03956939874 = if ((isReverse == false))
892915 then {
893916 let assetOut = getStringOrFail(this, pa())
894917 let assetIn = getStringOrFail(this, aa())
895918 $Tuple2(assetOut, assetIn)
896919 }
897920 else {
898921 let assetOut = getStringOrFail(this, aa())
899922 let assetIn = getStringOrFail(this, pa())
900923 $Tuple2(assetOut, assetIn)
901924 }
902- let assetOut = $t03890639211._1
903- let assetIn = $t03890639211._2
925+ let assetOut = $t03956939874._1
926+ let assetIn = $t03956939874._2
904927 let poolAssetInBalance = getAccBalance(assetIn)
905928 let poolAssetOutBalance = getAccBalance(assetOut)
906929 let amountOut = fraction(poolAssetOutBalance, cleanAmountIn, (poolAssetInBalance + cleanAmountIn))
907930 let oldK = (toBigInt(poolAssetInBalance) * toBigInt(poolAssetOutBalance))
908931 let newK = (((toBigInt(getAccBalance(assetIn)) + toBigInt(cleanAmountIn)) + toBigInt(feePoolAmount)) * (toBigInt(getAccBalance(assetOut)) - toBigInt(amountOut)))
909932 let checkK = if ((newK >= oldK))
910933 then true
911934 else throw("new K is fewer error")
912935 if ((checkK == checkK))
913936 then $Tuple2(nil, amountOut)
914937 else throw("Strict value is not equal to itself.")
915938 }
916939
917940
918941
919942 @Callable(i)
920943 func calculateAmountOutForSwapAndSendTokens (cleanAmountIn,isReverse,amountOutMin,addressTo,feePoolAmount) = {
921944 let swapContact = {
922945 let @ = invoke(factoryContract, "getSwapContractREADONLY", nil, nil)
923946 if ($isInstanceOf(@, "String"))
924947 then @
925948 else throw(($getType(@) + " couldn't be cast to String"))
926949 }
927950 let checks = [if ((value(i.payments[0]).amount >= cleanAmountIn))
928951 then true
929952 else throwErr("Wrong amount"), if ((i.caller == addressFromStringValue(swapContact)))
930953 then true
931954 else throwErr("Permission denied")]
932955 if ((checks == checks))
933956 then {
934957 let pmt = value(i.payments[0])
935958 let assetIn = assetIdToString(pmt.assetId)
936959 let assetOut = if ((isReverse == false))
937960 then getStringOrFail(this, pa())
938961 else getStringOrFail(this, aa())
939962 let poolAssetInBalance = (getAccBalance(assetIn) - value(i.payments[0]).amount)
940963 let poolAssetOutBalance = getAccBalance(assetOut)
941964 let amountOut = fraction(poolAssetOutBalance, cleanAmountIn, (poolAssetInBalance + cleanAmountIn))
942965 let oldK = (toBigInt(poolAssetInBalance) * toBigInt(poolAssetOutBalance))
943966 let newK = ((toBigInt(getAccBalance(assetIn)) + toBigInt(feePoolAmount)) * (toBigInt(getAccBalance(assetOut)) - toBigInt(amountOut)))
944967 let checkK = if ((newK >= oldK))
945968 then true
946969 else throw("new K is fewer error")
947970 if ((checkK == checkK))
948971 then {
949972 let checkMin = if ((amountOut >= amountOutMin))
950973 then true
951974 else throw("Exchange result is fewer coins than expected")
952975 if ((checkMin == checkMin))
953976 then {
954977 let rebalanceState = rebalanceAsset(assetIn)
955978 if ((rebalanceState == rebalanceState))
956979 then {
957980 let withdrawState = withdrawAndRebalanceAsset(assetOut, amountOut)
958981 if ((withdrawState == withdrawState))
959982 then $Tuple2(((withdrawState ++ rebalanceState) ++ [ScriptTransfer(addressFromStringValue(addressTo), amountOut, parseAssetId(assetOut))]), amountOut)
960983 else throw("Strict value is not equal to itself.")
961984 }
962985 else throw("Strict value is not equal to itself.")
963986 }
964987 else throw("Strict value is not equal to itself.")
965988 }
966989 else throw("Strict value is not equal to itself.")
967990 }
968991 else throw("Strict value is not equal to itself.")
969992 }
970993
971994
972995
973996 @Callable(i)
974-func setManager (pendingManagerPublicKey) = {
975- let checkCaller = mustManager(i)
976- if ((checkCaller == checkCaller))
977- then {
978- let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
979- if ((checkManagerPublicKey == checkManagerPublicKey))
980- then [StringEntry(pmpk(), pendingManagerPublicKey)]
981- else throw("Strict value is not equal to itself.")
982- }
983- else throw("Strict value is not equal to itself.")
984- }
985-
986-
987-
988-@Callable(i)
989-func confirmManager () = {
990- let pm = pendingManagerPublicKeyOrUnit()
991- let hasPM = if (isDefined(pm))
992- then true
993- else throw("No pending manager")
994- if ((hasPM == hasPM))
995- then {
996- let checkPM = if ((i.callerPublicKey == value(pm)))
997- then true
998- else throw("You are not pending manager")
999- if ((checkPM == checkPM))
1000- then [StringEntry(mpk(), toBase58String(value(pm))), DeleteEntry(pmpk())]
1001- else throw("Strict value is not equal to itself.")
1002- }
1003- else throw("Strict value is not equal to itself.")
1004- }
1005-
1006-
1007-
1008-@Callable(i)
1009997 func put (slippageTolerance,shouldAutoStake) = if ((0 > slippageTolerance))
1010998 then throw("Invalid slippageTolerance passed")
1011999 else {
10121000 let estPut = commonPut(i, slippageTolerance, true)
10131001 let emitLpAmt = estPut._2
10141002 let lpAssetId = estPut._7
10151003 let state = estPut._9
10161004 let amDiff = estPut._10
10171005 let prDiff = estPut._11
10181006 let amId = estPut._12
10191007 let prId = estPut._13
10201008 let amAssetPmt = toBigInt(value(i.payments[0]).amount)
10211009 let prAssetPmt = toBigInt(value(i.payments[1]).amount)
10221010 let currentKLp = calcCurrentKLp(amAssetPmt, prAssetPmt, toBigInt(0))
10231011 if ((currentKLp == currentKLp))
10241012 then {
10251013 let emitInv = invoke(factoryContract, "emit", [emitLpAmt], nil)
10261014 if ((emitInv == emitInv))
10271015 then {
10281016 let emitInvLegacy = match emitInv {
10291017 case legacyFactoryContract: Address =>
10301018 invoke(legacyFactoryContract, "emit", [emitLpAmt], nil)
10311019 case _ =>
10321020 unit
10331021 }
10341022 if ((emitInvLegacy == emitInvLegacy))
10351023 then {
10361024 let slippageAInv = if ((amDiff > 0))
10371025 then invoke(slippageContract, "put", nil, [AttachedPayment(amId, amDiff)])
10381026 else nil
10391027 if ((slippageAInv == slippageAInv))
10401028 then {
10411029 let slippagePInv = if ((prDiff > 0))
10421030 then invoke(slippageContract, "put", nil, [AttachedPayment(prId, prDiff)])
10431031 else nil
10441032 if ((slippagePInv == slippagePInv))
10451033 then {
10461034 let lpTransfer = if (shouldAutoStake)
10471035 then {
10481036 let slpStakeInv = invoke(stakingContract, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
10491037 if ((slpStakeInv == slpStakeInv))
10501038 then nil
10511039 else throw("Strict value is not equal to itself.")
10521040 }
10531041 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
1054- let $t04425744719 = refreshKLpInternal(0, 0, 0)
1055- if (($t04425744719 == $t04425744719))
1042+ let $t04436144823 = refreshKLpInternal(0, 0, 0)
1043+ if (($t04436144823 == $t04436144823))
10561044 then {
1057- let updatedKLp = $t04425744719._2
1058- let refreshKLpActions = $t04425744719._1
1045+ let updatedKLp = $t04436144823._2
1046+ let refreshKLpActions = $t04436144823._1
10591047 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
10601048 if ((isUpdatedKLpValid == isUpdatedKLpValid))
10611049 then {
10621050 let reb = invoke(this, "rebalance", nil, nil)
10631051 if ((reb == reb))
10641052 then ((state ++ lpTransfer) ++ refreshKLpActions)
10651053 else throw("Strict value is not equal to itself.")
10661054 }
10671055 else throw("Strict value is not equal to itself.")
10681056 }
10691057 else throw("Strict value is not equal to itself.")
10701058 }
10711059 else throw("Strict value is not equal to itself.")
10721060 }
10731061 else throw("Strict value is not equal to itself.")
10741062 }
10751063 else throw("Strict value is not equal to itself.")
10761064 }
10771065 else throw("Strict value is not equal to itself.")
10781066 }
10791067 else throw("Strict value is not equal to itself.")
10801068 }
10811069
10821070
10831071
10841072 @Callable(i)
10851073 func putForFree (maxSlippage) = if ((0 > maxSlippage))
10861074 then throw("Invalid value passed")
10871075 else {
10881076 let estPut = commonPut(i, maxSlippage, false)
10891077 let state = estPut._9
10901078 let amAssetPmt = toBigInt(value(i.payments[0]).amount)
10911079 let prAssetPmt = toBigInt(value(i.payments[1]).amount)
10921080 let currentKLp = calcCurrentKLp(amAssetPmt, prAssetPmt, toBigInt(0))
10931081 if ((currentKLp == currentKLp))
10941082 then {
1095- let $t04533145396 = refreshKLpInternal(0, 0, 0)
1096- let refreshKLpActions = $t04533145396._1
1097- let updatedKLp = $t04533145396._2
1083+ let $t04543545500 = refreshKLpInternal(0, 0, 0)
1084+ let refreshKLpActions = $t04543545500._1
1085+ let updatedKLp = $t04543545500._2
10981086 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
10991087 if ((isUpdatedKLpValid == isUpdatedKLpValid))
11001088 then (state ++ refreshKLpActions)
11011089 else throw("Strict value is not equal to itself.")
11021090 }
11031091 else throw("Strict value is not equal to itself.")
11041092 }
11051093
11061094
11071095
11081096 @Callable(i)
11091097 func putOneTkn (minOutAmount,autoStake) = {
11101098 let isPoolOneTokenOperationsDisabled = {
11111099 let @ = invoke(factoryContract, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
11121100 if ($isInstanceOf(@, "Boolean"))
11131101 then @
11141102 else throw(($getType(@) + " couldn't be cast to Boolean"))
11151103 }
11161104 let isPutDisabled = if (if (if (isGlobalShutdown())
11171105 then true
11181106 else (cfgPoolStatus == PoolPutDisabled))
11191107 then true
11201108 else (cfgPoolStatus == PoolShutdown))
11211109 then true
11221110 else isPoolOneTokenOperationsDisabled
11231111 let checks = [if (if (!(isPutDisabled))
11241112 then true
11251113 else isManager(i))
11261114 then true
11271115 else throwErr("put operation is blocked by admin"), if ((size(i.payments) == 1))
11281116 then true
11291117 else throwErr("exactly 1 payment are expected")]
11301118 if ((checks == checks))
11311119 then {
11321120 let payment = i.payments[0]
11331121 let paymentAssetId = payment.assetId
11341122 let paymentAmountRaw = payment.amount
11351123 let currentKLp = if ((paymentAssetId == cfgAmountAssetId))
11361124 then calcCurrentKLp(toBigInt(paymentAmountRaw), toBigInt(0), toBigInt(0))
11371125 else if ((paymentAssetId == cfgPriceAssetId))
11381126 then calcCurrentKLp(toBigInt(0), toBigInt(paymentAmountRaw), toBigInt(0))
11391127 else throwErr("payment asset is not supported")
11401128 if ((currentKLp == currentKLp))
11411129 then {
11421130 let userAddress = i.caller
11431131 let txId = i.transactionId
1144- let $t04658446736 = calcPutOneToken(paymentAmountRaw, paymentAssetId, userAddress, txId)
1145- if (($t04658446736 == $t04658446736))
1132+ let $t04668846840 = calcPutOneToken(paymentAmountRaw, paymentAssetId, userAddress, txId)
1133+ if (($t04668846840 == $t04668846840))
11461134 then {
1147- let paymentInAmountAsset = $t04658446736._5
1148- let bonus = $t04658446736._4
1149- let feeAmount = $t04658446736._3
1150- let commonState = $t04658446736._2
1151- let emitAmountEstimated = $t04658446736._1
1135+ let paymentInAmountAsset = $t04668846840._5
1136+ let bonus = $t04668846840._4
1137+ let feeAmount = $t04668846840._3
1138+ let commonState = $t04668846840._2
1139+ let emitAmountEstimated = $t04668846840._1
11521140 let emitAmount = if (if ((minOutAmount > 0))
11531141 then (minOutAmount > emitAmountEstimated)
11541142 else false)
11551143 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
11561144 else emitAmountEstimated
11571145 let emitInv = emit(emitAmount)
11581146 if ((emitInv == emitInv))
11591147 then {
11601148 let lpTransfer = if (autoStake)
11611149 then {
11621150 let stakeInv = invoke(stakingContract, "stake", nil, [AttachedPayment(cfgLpAssetId, emitAmount)])
11631151 if ((stakeInv == stakeInv))
11641152 then nil
11651153 else throw("Strict value is not equal to itself.")
11661154 }
11671155 else [ScriptTransfer(i.caller, emitAmount, cfgLpAssetId)]
11681156 let sendFee = if ((feeAmount > 0))
11691157 then [ScriptTransfer(feeCollectorAddress, feeAmount, paymentAssetId)]
11701158 else nil
1171- let $t04732247519 = if ((this == feeCollectorAddress))
1159+ let $t04742647623 = if ((this == feeCollectorAddress))
11721160 then $Tuple2(0, 0)
11731161 else if (paymentInAmountAsset)
11741162 then $Tuple2(-(feeAmount), 0)
11751163 else $Tuple2(0, -(feeAmount))
1176- let amountAssetBalanceDelta = $t04732247519._1
1177- let priceAssetBalanceDelta = $t04732247519._2
1178- let $t04752247630 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1179- let refreshKLpActions = $t04752247630._1
1180- let updatedKLp = $t04752247630._2
1164+ let amountAssetBalanceDelta = $t04742647623._1
1165+ let priceAssetBalanceDelta = $t04742647623._2
1166+ let $t04762647734 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1167+ let refreshKLpActions = $t04762647734._1
1168+ let updatedKLp = $t04762647734._2
11811169 let kLp = value(getString(keyKLp))
11821170 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
11831171 if ((isUpdatedKLpValid == isUpdatedKLpValid))
11841172 then {
11851173 let reb = invoke(this, "rebalance", nil, nil)
11861174 if ((reb == reb))
11871175 then $Tuple2((((commonState ++ lpTransfer) ++ sendFee) ++ refreshKLpActions), emitAmount)
11881176 else throw("Strict value is not equal to itself.")
11891177 }
11901178 else throw("Strict value is not equal to itself.")
11911179 }
11921180 else throw("Strict value is not equal to itself.")
11931181 }
11941182 else throw("Strict value is not equal to itself.")
11951183 }
11961184 else throw("Strict value is not equal to itself.")
11971185 }
11981186 else throw("Strict value is not equal to itself.")
11991187 }
12001188
12011189
12021190
12031191 @Callable(i)
12041192 func putOneTknREADONLY (paymentAssetId,paymentAmountRaw) = {
1205- let $t04798548142 = calcPutOneToken(paymentAmountRaw, parseAssetId(paymentAssetId), unit, unit)
1206- let emitAmountEstimated = $t04798548142._1
1207- let commonState = $t04798548142._2
1208- let feeAmount = $t04798548142._3
1209- let bonus = $t04798548142._4
1210- let paymentInAmountAsset = $t04798548142._5
1193+ let $t04808948246 = calcPutOneToken(paymentAmountRaw, parseAssetId(paymentAssetId), unit, unit)
1194+ let emitAmountEstimated = $t04808948246._1
1195+ let commonState = $t04808948246._2
1196+ let feeAmount = $t04808948246._3
1197+ let bonus = $t04808948246._4
1198+ let paymentInAmountAsset = $t04808948246._5
12111199 $Tuple2(nil, $Tuple3(emitAmountEstimated, feeAmount, bonus))
12121200 }
12131201
12141202
12151203
12161204 @Callable(i)
12171205 func getOneTkn (outAssetIdStr,minOutAmount) = {
12181206 let isPoolOneTokenOperationsDisabled = {
12191207 let @ = invoke(factoryContract, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
12201208 if ($isInstanceOf(@, "Boolean"))
12211209 then @
12221210 else throw(($getType(@) + " couldn't be cast to Boolean"))
12231211 }
12241212 let isGetDisabled = if (if (isGlobalShutdown())
12251213 then true
12261214 else (cfgPoolStatus == PoolShutdown))
12271215 then true
12281216 else isPoolOneTokenOperationsDisabled
12291217 let checks = [if (if (!(isGetDisabled))
12301218 then true
12311219 else isManager(i))
12321220 then true
12331221 else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 1))
12341222 then true
12351223 else throwErr("exactly 1 payment are expected")]
12361224 if ((checks == checks))
12371225 then {
12381226 let outAssetId = parseAssetId(outAssetIdStr)
12391227 let payment = i.payments[0]
12401228 let paymentAssetId = payment.assetId
12411229 let paymentAmount = payment.amount
12421230 let currentKLp = calcCurrentKLp(toBigInt(0), toBigInt(0), toBigInt(0))
12431231 if ((currentKLp == currentKLp))
12441232 then {
12451233 let userAddress = i.caller
12461234 let txId = i.transactionId
1247- let $t04902749180 = calcGetOneToken(outAssetId, paymentAmount, paymentAssetId, userAddress, txId)
1248- if (($t04902749180 == $t04902749180))
1235+ let $t04913149284 = calcGetOneToken(outAssetId, paymentAmount, paymentAssetId, userAddress, txId)
1236+ if (($t04913149284 == $t04913149284))
12491237 then {
1250- let outInAmountAsset = $t04902749180._5
1251- let bonus = $t04902749180._4
1252- let feeAmount = $t04902749180._3
1253- let commonState = $t04902749180._2
1254- let amountEstimated = $t04902749180._1
1238+ let outInAmountAsset = $t04913149284._5
1239+ let bonus = $t04913149284._4
1240+ let feeAmount = $t04913149284._3
1241+ let commonState = $t04913149284._2
1242+ let amountEstimated = $t04913149284._1
12551243 let amount = if (if ((minOutAmount > 0))
12561244 then (minOutAmount > amountEstimated)
12571245 else false)
12581246 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
12591247 else amountEstimated
12601248 let burnInv = invoke(factoryContract, "burn", [paymentAmount], [AttachedPayment(paymentAssetId, paymentAmount)])
12611249 if ((burnInv == burnInv))
12621250 then {
12631251 let withdrawState = withdrawAndRebalanceAsset(outAssetIdStr, (amount + max([0, feeAmount])))
12641252 let assetTransfer = [ScriptTransfer(userAddress, amount, outAssetId)]
12651253 let sendFee = if ((feeAmount > 0))
12661254 then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetId)]
12671255 else nil
1268- let $t04984450091 = {
1256+ let $t04994850195 = {
12691257 let feeAmountForCalc = if ((this == feeCollectorAddress))
12701258 then 0
12711259 else feeAmount
12721260 if (outInAmountAsset)
12731261 then $Tuple2(-((amount + feeAmountForCalc)), 0)
12741262 else $Tuple2(0, -((amount + feeAmountForCalc)))
12751263 }
1276- let amountAssetBalanceDelta = $t04984450091._1
1277- let priceAssetBalanceDelta = $t04984450091._2
1278- let $t05009450202 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1279- let refreshKLpActions = $t05009450202._1
1280- let updatedKLp = $t05009450202._2
1264+ let amountAssetBalanceDelta = $t04994850195._1
1265+ let priceAssetBalanceDelta = $t04994850195._2
1266+ let $t05019850306 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1267+ let refreshKLpActions = $t05019850306._1
1268+ let updatedKLp = $t05019850306._2
12811269 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
12821270 if ((isUpdatedKLpValid == isUpdatedKLpValid))
12831271 then $Tuple2(((((commonState ++ withdrawState) ++ assetTransfer) ++ sendFee) ++ refreshKLpActions), amount)
12841272 else throw("Strict value is not equal to itself.")
12851273 }
12861274 else throw("Strict value is not equal to itself.")
12871275 }
12881276 else throw("Strict value is not equal to itself.")
12891277 }
12901278 else throw("Strict value is not equal to itself.")
12911279 }
12921280 else throw("Strict value is not equal to itself.")
12931281 }
12941282
12951283
12961284
12971285 @Callable(i)
12981286 func getOneTknREADONLY (outAssetId,paymentAmount) = {
1299- let $t05048050636 = calcGetOneToken(parseAssetId(outAssetId), paymentAmount, cfgLpAssetId, unit, unit)
1300- let amountEstimated = $t05048050636._1
1301- let commonState = $t05048050636._2
1302- let feeAmount = $t05048050636._3
1303- let bonus = $t05048050636._4
1304- let outInAmountAsset = $t05048050636._5
1287+ let $t05058450740 = calcGetOneToken(parseAssetId(outAssetId), paymentAmount, cfgLpAssetId, unit, unit)
1288+ let amountEstimated = $t05058450740._1
1289+ let commonState = $t05058450740._2
1290+ let feeAmount = $t05058450740._3
1291+ let bonus = $t05058450740._4
1292+ let outInAmountAsset = $t05058450740._5
13051293 $Tuple2(nil, $Tuple3(amountEstimated, feeAmount, bonus))
13061294 }
13071295
13081296
13091297
13101298 @Callable(i)
13111299 func unstakeAndGetOneTkn (unstakeAmount,outAssetIdStr,minOutAmount) = {
13121300 let isPoolOneTokenOperationsDisabled = {
13131301 let @ = invoke(factoryContract, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
13141302 if ($isInstanceOf(@, "Boolean"))
13151303 then @
13161304 else throw(($getType(@) + " couldn't be cast to Boolean"))
13171305 }
13181306 let isGetDisabled = if (if (isGlobalShutdown())
13191307 then true
13201308 else (cfgPoolStatus == PoolShutdown))
13211309 then true
13221310 else isPoolOneTokenOperationsDisabled
13231311 let checks = [if (if (!(isGetDisabled))
13241312 then true
13251313 else isManager(i))
13261314 then true
13271315 else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 0))
13281316 then true
13291317 else throwErr("no payments are expected")]
13301318 if ((checks == checks))
13311319 then {
13321320 let outAssetId = parseAssetId(outAssetIdStr)
13331321 let userAddress = i.caller
13341322 let txId = i.transactionId
13351323 let currentKLp = calcCurrentKLp(toBigInt(0), toBigInt(0), toBigInt(0))
13361324 if ((currentKLp == currentKLp))
13371325 then {
13381326 let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(cfgLpAssetId), unstakeAmount], nil)
13391327 if ((unstakeInv == unstakeInv))
13401328 then {
1341- let $t05154151692 = calcGetOneToken(outAssetId, unstakeAmount, cfgLpAssetId, userAddress, txId)
1342- if (($t05154151692 == $t05154151692))
1329+ let $t05164551796 = calcGetOneToken(outAssetId, unstakeAmount, cfgLpAssetId, userAddress, txId)
1330+ if (($t05164551796 == $t05164551796))
13431331 then {
1344- let outInAmountAsset = $t05154151692._5
1345- let bonus = $t05154151692._4
1346- let feeAmount = $t05154151692._3
1347- let commonState = $t05154151692._2
1348- let amountEstimated = $t05154151692._1
1332+ let outInAmountAsset = $t05164551796._5
1333+ let bonus = $t05164551796._4
1334+ let feeAmount = $t05164551796._3
1335+ let commonState = $t05164551796._2
1336+ let amountEstimated = $t05164551796._1
13491337 let amount = if (if ((minOutAmount > 0))
13501338 then (minOutAmount > amountEstimated)
13511339 else false)
13521340 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
13531341 else amountEstimated
13541342 let burnInv = invoke(factoryContract, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
13551343 if ((burnInv == burnInv))
13561344 then {
13571345 let withdrawState = withdrawAndRebalanceAsset(outAssetIdStr, (amount + max([0, feeAmount])))
13581346 let assetTransfer = [ScriptTransfer(i.caller, amount, outAssetId)]
13591347 let sendFee = if ((feeAmount > 0))
13601348 then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetId)]
13611349 else nil
1362- let $t05235152598 = {
1350+ let $t05245552702 = {
13631351 let feeAmountForCalc = if ((this == feeCollectorAddress))
13641352 then 0
13651353 else feeAmount
13661354 if (outInAmountAsset)
13671355 then $Tuple2(-((amount + feeAmountForCalc)), 0)
13681356 else $Tuple2(0, -((amount + feeAmountForCalc)))
13691357 }
1370- let amountAssetBalanceDelta = $t05235152598._1
1371- let priceAssetBalanceDelta = $t05235152598._2
1372- let $t05260152709 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1373- let refreshKLpActions = $t05260152709._1
1374- let updatedKLp = $t05260152709._2
1358+ let amountAssetBalanceDelta = $t05245552702._1
1359+ let priceAssetBalanceDelta = $t05245552702._2
1360+ let $t05270552813 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1361+ let refreshKLpActions = $t05270552813._1
1362+ let updatedKLp = $t05270552813._2
13751363 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
13761364 if ((isUpdatedKLpValid == isUpdatedKLpValid))
13771365 then $Tuple2(((((commonState ++ withdrawState) ++ assetTransfer) ++ sendFee) ++ refreshKLpActions), amount)
13781366 else throw("Strict value is not equal to itself.")
13791367 }
13801368 else throw("Strict value is not equal to itself.")
13811369 }
13821370 else throw("Strict value is not equal to itself.")
13831371 }
13841372 else throw("Strict value is not equal to itself.")
13851373 }
13861374 else throw("Strict value is not equal to itself.")
13871375 }
13881376 else throw("Strict value is not equal to itself.")
13891377 }
13901378
13911379
13921380
13931381 @Callable(i)
13941382 func get () = {
13951383 let res = commonGet(i)
13961384 let outAmAmt = res._1
13971385 let outPrAmt = res._2
13981386 let pmtAmt = res._3
13991387 let pmtAssetId = res._4
14001388 let state = res._5
14011389 let withdrawState = withdrawAndRebalanceAll(outAmAmt, outPrAmt)
14021390 let currentKLp = calcCurrentKLp(toBigInt(0), toBigInt(0), toBigInt(0))
14031391 if ((currentKLp == currentKLp))
14041392 then {
14051393 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
14061394 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
14071395 then {
1408- let $t05380453885 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1409- let refreshKLpActions = $t05380453885._1
1410- let updatedKLp = $t05380453885._2
1396+ let $t05390853989 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1397+ let refreshKLpActions = $t05390853989._1
1398+ let updatedKLp = $t05390853989._2
14111399 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
14121400 if ((isUpdatedKLpValid == isUpdatedKLpValid))
14131401 then ((withdrawState ++ state) ++ refreshKLpActions)
14141402 else throw("Strict value is not equal to itself.")
14151403 }
14161404 else throw("Strict value is not equal to itself.")
14171405 }
14181406 else throw("Strict value is not equal to itself.")
14191407 }
14201408
14211409
14221410
14231411 @Callable(i)
14241412 func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = {
14251413 let res = commonGet(i)
14261414 let outAmAmt = res._1
14271415 let outPrAmt = res._2
14281416 let pmtAmt = res._3
14291417 let pmtAssetId = res._4
14301418 let state = res._5
14311419 if ((noLessThenAmtAsset > outAmAmt))
14321420 then throw(((("noLessThenAmtAsset failed: " + toString(outAmAmt)) + " < ") + toString(noLessThenAmtAsset)))
14331421 else if ((noLessThenPriceAsset > outPrAmt))
14341422 then throw(((("noLessThenPriceAsset failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset)))
14351423 else {
14361424 let withdrawState = withdrawAndRebalanceAll(outAmAmt, outPrAmt)
14371425 let currentKLp = calcCurrentKLp(toBigInt(0), toBigInt(0), toBigInt(0))
14381426 if ((currentKLp == currentKLp))
14391427 then {
14401428 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
14411429 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
14421430 then {
1443- let $t05498055061 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1444- let refreshKLpActions = $t05498055061._1
1445- let updatedKLp = $t05498055061._2
1431+ let $t05508455165 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1432+ let refreshKLpActions = $t05508455165._1
1433+ let updatedKLp = $t05508455165._2
14461434 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
14471435 if ((isUpdatedKLpValid == isUpdatedKLpValid))
14481436 then ((withdrawState ++ state) ++ refreshKLpActions)
14491437 else throw("Strict value is not equal to itself.")
14501438 }
14511439 else throw("Strict value is not equal to itself.")
14521440 }
14531441 else throw("Strict value is not equal to itself.")
14541442 }
14551443 }
14561444
14571445
14581446
14591447 @Callable(i)
14601448 func unstakeAndGet (amount) = {
14611449 let checkPayments = if ((size(i.payments) != 0))
14621450 then throw("No payments are expected")
14631451 else true
14641452 if ((checkPayments == checkPayments))
14651453 then {
14661454 let cfg = getPoolConfig()
14671455 let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId])
14681456 let currentKLp = calcCurrentKLp(toBigInt(0), toBigInt(0), toBigInt(0))
14691457 if ((currentKLp == currentKLp))
14701458 then {
14711459 let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(lpAssetId), amount], nil)
14721460 if ((unstakeInv == unstakeInv))
14731461 then {
14741462 let res = estimateGetOperation(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
14751463 let outAmAmt = res._1
14761464 let outPrAmt = res._2
14771465 let poolStatus = parseIntValue(res._9)
14781466 let state = res._10
14791467 let withdrawState = withdrawAndRebalanceAll(outAmAmt, outPrAmt)
14801468 let checkPoolStatus = if (if (isGlobalShutdown())
14811469 then true
14821470 else (poolStatus == PoolShutdown))
14831471 then throw(("Get operation is blocked by admin. Status = " + toString(poolStatus)))
14841472 else true
14851473 if ((checkPoolStatus == checkPoolStatus))
14861474 then {
14871475 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
14881476 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
14891477 then {
1490- let $t05633356414 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1491- let refreshKLpActions = $t05633356414._1
1492- let updatedKLp = $t05633356414._2
1478+ let $t05643756518 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1479+ let refreshKLpActions = $t05643756518._1
1480+ let updatedKLp = $t05643756518._2
14931481 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
14941482 if ((isUpdatedKLpValid == isUpdatedKLpValid))
14951483 then ((withdrawState ++ state) ++ refreshKLpActions)
14961484 else throw("Strict value is not equal to itself.")
14971485 }
14981486 else throw("Strict value is not equal to itself.")
14991487 }
15001488 else throw("Strict value is not equal to itself.")
15011489 }
15021490 else throw("Strict value is not equal to itself.")
15031491 }
15041492 else throw("Strict value is not equal to itself.")
15051493 }
15061494 else throw("Strict value is not equal to itself.")
15071495 }
15081496
15091497
15101498
15111499 @Callable(i)
15121500 func unstakeAndGetNoLess (unstakeAmount,noLessThenAmountAsset,noLessThenPriceAsset) = {
15131501 let isGetDisabled = if (isGlobalShutdown())
15141502 then true
15151503 else (cfgPoolStatus == PoolShutdown)
15161504 let checks = [if (!(isGetDisabled))
15171505 then true
15181506 else throw("get operation is blocked by admin"), if ((size(i.payments) == 0))
15191507 then true
15201508 else throw("no payments are expected")]
15211509 if ((checks == checks))
15221510 then {
15231511 let currentKLp = calcCurrentKLp(toBigInt(0), toBigInt(0), toBigInt(0))
15241512 if ((currentKLp == currentKLp))
15251513 then {
15261514 let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(cfgLpAssetId), unstakeAmount], nil)
15271515 if ((unstakeInv == unstakeInv))
15281516 then {
15291517 let res = estimateGetOperation(toBase58String(i.transactionId), toBase58String(cfgLpAssetId), unstakeAmount, i.caller)
15301518 let outAmAmt = res._1
15311519 let outPrAmt = res._2
15321520 let state = res._10
15331521 let withdrawState = withdrawAndRebalanceAll(outAmAmt, outPrAmt)
15341522 let checkAmounts = [if ((outAmAmt >= noLessThenAmountAsset))
15351523 then true
15361524 else throw(makeString(["amount asset amount to receive is less than ", toString(noLessThenAmountAsset)], "")), if ((outPrAmt >= noLessThenPriceAsset))
15371525 then true
15381526 else throw(makeString(["price asset amount to receive is less than ", toString(noLessThenPriceAsset)], ""))]
15391527 if ((checkAmounts == checkAmounts))
15401528 then {
15411529 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
15421530 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
15431531 then {
1544- let $t05785557936 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1545- let refreshKLpActions = $t05785557936._1
1546- let updatedKLp = $t05785557936._2
1532+ let $t05795958040 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1533+ let refreshKLpActions = $t05795958040._1
1534+ let updatedKLp = $t05795958040._2
15471535 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
15481536 if ((isUpdatedKLpValid == isUpdatedKLpValid))
15491537 then ((withdrawState ++ state) ++ refreshKLpActions)
15501538 else throw("Strict value is not equal to itself.")
15511539 }
15521540 else throw("Strict value is not equal to itself.")
15531541 }
15541542 else throw("Strict value is not equal to itself.")
15551543 }
15561544 else throw("Strict value is not equal to itself.")
15571545 }
15581546 else throw("Strict value is not equal to itself.")
15591547 }
15601548 else throw("Strict value is not equal to itself.")
15611549 }
15621550
15631551
15641552
15651553 @Callable(i)
15661554 func activate (amtAssetStr,priceAssetStr) = if ((toString(i.caller) != toString(factoryContract)))
15671555 then throw("permissions denied")
15681556 else $Tuple2([StringEntry(aa(), amtAssetStr), StringEntry(pa(), priceAssetStr)], "success")
15691557
15701558
15711559
15721560 @Callable(i)
15731561 func refreshKLp () = {
15741562 let lastRefreshedBlockHeight = valueOrElse(getInteger(keyKLpRefreshedHeight), 0)
15751563 let checkLastRefreshedBlockHeight = if (((height - lastRefreshedBlockHeight) >= kLpRefreshDelay))
15761564 then unit
15771565 else throwErr(makeString([toString(kLpRefreshDelay), " blocks have not passed since the previous call"], ""))
15781566 if ((checkLastRefreshedBlockHeight == checkLastRefreshedBlockHeight))
15791567 then {
15801568 let kLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyKLp), "0")), fmtErr("invalid kLp"))
1581- let $t05914059204 = refreshKLpInternal(0, 0, 0)
1582- let kLpUpdateActions = $t05914059204._1
1583- let updatedKLp = $t05914059204._2
1569+ let $t05924459308 = refreshKLpInternal(0, 0, 0)
1570+ let kLpUpdateActions = $t05924459308._1
1571+ let updatedKLp = $t05924459308._2
15841572 let actions = if ((kLp != updatedKLp))
15851573 then kLpUpdateActions
15861574 else throwErr("nothing to refresh")
15871575 $Tuple2(actions, toString(updatedKLp))
15881576 }
15891577 else throw("Strict value is not equal to itself.")
15901578 }
15911579
15921580
15931581
15941582 @Callable(i)
15951583 func getPoolConfigWrapperREADONLY () = $Tuple2(nil, getPoolConfig())
15961584
15971585
15981586
15991587 @Callable(i)
16001588 func getAccBalanceWrapperREADONLY (assetId) = $Tuple2(nil, getAccBalance(assetId))
16011589
16021590
16031591
16041592 @Callable(i)
16051593 func calcPricesWrapperREADONLY (amAmt,prAmt,lpAmt) = {
16061594 let prices = calcPrices(amAmt, prAmt, lpAmt)
16071595 $Tuple2(nil, [toString(prices[0]), toString(prices[1]), toString(prices[2])])
16081596 }
16091597
16101598
16111599
16121600 @Callable(i)
16131601 func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(toX18(origVal, origScaleMult)))
16141602
16151603
16161604
16171605 @Callable(i)
16181606 func fromX18WrapperREADONLY (val,resultScaleMult) = $Tuple2(nil, fromX18(parseBigIntValue(val), resultScaleMult))
16191607
16201608
16211609
16221610 @Callable(i)
16231611 func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(calcPriceBigInt(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
16241612
16251613
16261614
16271615 @Callable(i)
16281616 func estimatePutOperationWrapperREADONLY (txId58,slippageTolerance,inAmAssetAmt,inAmAssetId,inPrAssetAmt,inPrAssetId,userAddress,isEvaluate,emitLp) = $Tuple2(nil, estimatePutOperation(txId58, slippageTolerance, inAmAssetAmt, inAmAssetId, inPrAssetAmt, inPrAssetId, userAddress, isEvaluate, emitLp))
16291617
16301618
16311619
16321620 @Callable(i)
16331621 func estimateGetOperationWrapperREADONLY (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
16341622 let res = estimateGetOperation(txId58, pmtAssetId, pmtLpAmt, addressFromStringValue(userAddress))
16351623 $Tuple2(nil, $Tuple10(res._1, res._2, res._3, res._4, res._5, res._6, res._7, toString(res._8), res._9, res._10))
16361624 }
16371625
16381626
16391627
16401628 @Callable(i)
16411629 func statsREADONLY () = {
16421630 let cfg = getPoolConfig()
16431631 let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId])
16441632 let amtAssetId = cfg[idxAmtAssetId]
16451633 let priceAssetId = cfg[idxPriceAssetId]
16461634 let iAmtAssetId = cfg[idxIAmtAssetId]
16471635 let iPriceAssetId = cfg[idxIPriceAssetId]
16481636 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
16491637 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
16501638 let poolLPBalance = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
16511639 let accAmtAssetBalance = getAccBalance(amtAssetId)
16521640 let accPriceAssetBalance = getAccBalance(priceAssetId)
16531641 let pricesList = if ((poolLPBalance == 0))
16541642 then [zeroBigInt, zeroBigInt, zeroBigInt]
16551643 else calcPrices(accAmtAssetBalance, accPriceAssetBalance, poolLPBalance)
16561644 let curPrice = 0
16571645 let lpAmtAssetShare = fromX18(pricesList[1], scale8)
16581646 let lpPriceAssetShare = fromX18(pricesList[2], scale8)
16591647 let poolWeight = value(getInteger(factoryContract, keyPoolWeight(toString(this))))
16601648 $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))
16611649 }
16621650
16631651
16641652
16651653 @Callable(i)
16661654 func evaluatePutByAmountAssetREADONLY (inAmAssetAmt) = {
16671655 let cfg = getPoolConfig()
16681656 let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId])
16691657 let amAssetIdStr = cfg[idxAmtAssetId]
16701658 let amAssetId = fromBase58String(amAssetIdStr)
16711659 let prAssetIdStr = cfg[idxPriceAssetId]
16721660 let prAssetId = fromBase58String(prAssetIdStr)
16731661 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
16741662 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
16751663 let poolStatus = cfg[idxPoolStatus]
16761664 let poolLPBalance = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
16771665 let accAmtAssetBalance = getAccBalance(amAssetIdStr)
16781666 let accPriceAssetBalance = getAccBalance(prAssetIdStr)
16791667 let amtAssetAmtX18 = toX18(accAmtAssetBalance, amtAssetDcm)
16801668 let priceAssetAmtX18 = toX18(accPriceAssetBalance, priceAssetDcm)
16811669 let curPriceX18 = if ((poolLPBalance == 0))
16821670 then zeroBigInt
16831671 else calcPriceBigInt(priceAssetAmtX18, amtAssetAmtX18)
16841672 let inAmAssetAmtX18 = toX18(inAmAssetAmt, amtAssetDcm)
16851673 let inPrAssetAmtX18 = fraction(inAmAssetAmtX18, curPriceX18, scale18)
16861674 let inPrAssetAmt = fromX18(inPrAssetAmtX18, priceAssetDcm)
16871675 let estPut = estimatePutOperation("", 500000, inAmAssetAmt, amAssetId, inPrAssetAmt, prAssetId, "", true, false)
16881676 let calcLpAmt = estPut._1
16891677 let curPriceCalc = estPut._3
16901678 let amBalance = estPut._4
16911679 let prBalance = estPut._5
16921680 let lpEmission = estPut._6
16931681 $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))
16941682 }
16951683
16961684
16971685
16981686 @Callable(i)
16991687 func evaluatePutByPriceAssetREADONLY (inPrAssetAmt) = {
17001688 let cfg = getPoolConfig()
17011689 let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId])
17021690 let amAssetIdStr = cfg[idxAmtAssetId]
17031691 let amAssetId = fromBase58String(amAssetIdStr)
17041692 let prAssetIdStr = cfg[idxPriceAssetId]
17051693 let prAssetId = fromBase58String(prAssetIdStr)
17061694 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
17071695 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
17081696 let poolStatus = cfg[idxPoolStatus]
17091697 let poolLPBalance = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
17101698 let amBalanceRaw = getAccBalance(amAssetIdStr)
17111699 let prBalanceRaw = getAccBalance(prAssetIdStr)
17121700 let amBalanceRawX18 = toX18(amBalanceRaw, amtAssetDcm)
17131701 let prBalanceRawX18 = toX18(prBalanceRaw, priceAssetDcm)
17141702 let curPriceX18 = if ((poolLPBalance == 0))
17151703 then zeroBigInt
17161704 else calcPriceBigInt(prBalanceRawX18, amBalanceRawX18)
17171705 let inPrAssetAmtX18 = toX18(inPrAssetAmt, priceAssetDcm)
17181706 let inAmAssetAmtX18 = fraction(inPrAssetAmtX18, scale18, curPriceX18)
17191707 let inAmAssetAmt = fromX18(inAmAssetAmtX18, amtAssetDcm)
17201708 let estPut = estimatePutOperation("", 500000, inAmAssetAmt, amAssetId, inPrAssetAmt, prAssetId, "", true, false)
17211709 let calcLpAmt = estPut._1
17221710 let curPriceCalc = estPut._3
17231711 let amBalance = estPut._4
17241712 let prBalance = estPut._5
17251713 let lpEmission = estPut._6
17261714 $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))
17271715 }
17281716
17291717
17301718
17311719 @Callable(i)
17321720 func evaluateGetREADONLY (paymentLpAssetId,paymentLpAmt) = {
17331721 let res = estimateGetOperation("", paymentLpAssetId, paymentLpAmt, this)
17341722 let outAmAmt = res._1
17351723 let outPrAmt = res._2
17361724 let amBalance = res._5
17371725 let prBalance = res._6
17381726 let lpEmission = res._7
17391727 let curPrice = res._8
17401728 let poolStatus = parseIntValue(res._9)
17411729 $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))
17421730 }
17431731
17441732
17451733 @Verifier(tx)
17461734 func verify () = {
17471735 let targetPublicKey = match managerPublicKeyOrUnit() {
17481736 case pk: ByteVector =>
17491737 pk
17501738 case _: Unit =>
17511739 tx.senderPublicKey
17521740 case _ =>
17531741 throw("Match error")
17541742 }
17551743 match tx {
17561744 case order: Order =>
17571745 let matcherPub = getMatcherPubOrFail()
1758- let $t06786667935 = validateMatcherOrderAllowed(order)
1759- let orderValid = $t06786667935._1
1760- let orderValidInfo = $t06786667935._2
1746+ let $t06797068087 = if (skipOrderValidation())
1747+ then $Tuple2(true, "")
1748+ else validateMatcherOrderAllowed(order)
1749+ let orderValid = $t06797068087._1
1750+ let orderValidInfo = $t06797068087._2
17611751 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
17621752 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
17631753 if (if (if (orderValid)
17641754 then senderValid
17651755 else false)
17661756 then matcherValid
17671757 else false)
17681758 then true
17691759 else throwOrderError(orderValid, orderValidInfo, senderValid, matcherValid)
17701760 case s: SetScriptTransaction =>
17711761 if (sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey))
17721762 then true
17731763 else {
17741764 let newHash = blake2b256(value(s.script))
17751765 let allowedHash = fromBase64String(value(getString(factoryContract, keyAllowedLpScriptHash())))
17761766 let currentHash = scriptHash(this)
17771767 if ((allowedHash == newHash))
17781768 then (currentHash != newHash)
17791769 else false
17801770 }
17811771 case _ =>
17821772 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
17831773 }
17841774 }
17851775

github/deemru/w8io/786bc32 
262.51 ms