2023.04.14 10:44 [3599550] smart account 3PCENpEKe8atwELZ7oCSmcdEfcRuKTrUx99 > SELF 0.00000000 Waves

{ "type": 13, "id": "CdBnZui9EvdGaznaq61cRq7bMtpp2xNCQTgEauXwFjKT", "fee": 4200000, "feeAssetId": null, "timestamp": 1681458282605, "version": 2, "chainId": 87, "sender": "3PCENpEKe8atwELZ7oCSmcdEfcRuKTrUx99", "senderPublicKey": "24dorn126Pv4mGCgUu61v1RLxqW4VNXbuHjmCHh7tc3K", "proofs": [ "3o5mWk9LnfiU1KnxP8CgnUNiLxZxgcFmVUrGp68jpEWEwipPBLupiU1Vx9gQN8FX9yyCD1husSJC9Wt6kGqw5kyF" ], "script": "base64:BgK9NwgCEgASBQoDAQQBEgcKBQEEAQgBEgMKAQgSABIECgIBBBIDCgEBEgQKAgEEEgQKAggBEgQKAggBEgQKAggBEgUKAwEIARIAEgQKAgEBEgMKAQESBQoDAQEBEgQKAggIEgASABIDCgEIEgUKAwEBARIECgIBARIECgIIARIECgIICBILCgkIAQECAQIIBAQSBgoECAgBCBIAEgMKAQESAwoBARIECgIIASIKbFBkZWNpbWFscyIGc2NhbGU4IgxzY2FsZThCaWdJbnQiB3NjYWxlMTgiCnplcm9CaWdJbnQiBGJpZzAiBGJpZzEiBGJpZzIiC3dhdmVzU3RyaW5nIgNTRVAiClBvb2xBY3RpdmUiD1Bvb2xQdXREaXNhYmxlZCITUG9vbE1hdGNoZXJEaXNhYmxlZCIMUG9vbFNodXRkb3duIg5pZHhQb29sQWRkcmVzcyINaWR4UG9vbFN0YXR1cyIQaWR4UG9vbExQQXNzZXRJZCINaWR4QW10QXNzZXRJZCIPaWR4UHJpY2VBc3NldElkIg5pZHhBbXRBc3NldERjbSIQaWR4UHJpY2VBc3NldERjbSIOaWR4SUFtdEFzc2V0SWQiEGlkeElQcmljZUFzc2V0SWQiDWlkeExQQXNzZXREY20iEmlkeFBvb2xBbXRBc3NldEFtdCIUaWR4UG9vbFByaWNlQXNzZXRBbXQiEWlkeFBvb2xMUEFzc2V0QW10IhlpZHhGYWN0b3J5U3Rha2luZ0NvbnRyYWN0IhppZHhGYWN0b3J5U2xpcHBhZ2VDb250cmFjdCIFdG9YMTgiB29yaWdWYWwiDW9yaWdTY2FsZU11bHQiC3RvWDE4QmlnSW50Igdmcm9tWDE4IgN2YWwiD3Jlc3VsdFNjYWxlTXVsdCIMZnJvbVgxOFJvdW5kIgVyb3VuZCIHdG9TY2FsZSIDYW10IghyZXNTY2FsZSIIY3VyU2NhbGUiA2FicyIJYWJzQmlnSW50Igxzd2FwQ29udHJhY3QiAmZjIgNtcGsiBHBtcGsiAnBsIgJwaCIBaCIJdGltZXN0YW1wIgNwYXUiC3VzZXJBZGRyZXNzIgR0eElkIgNnYXUiAmFhIgJwYSIGa2V5RmVlIgpmZWVEZWZhdWx0IgNmZWUiBmtleUtMcCIVa2V5S0xwUmVmcmVzaGVkSGVpZ2h0IhJrZXlLTHBSZWZyZXNoRGVsYXkiFmtMcFJlZnJlc2hEZWxheURlZmF1bHQiD2tMcFJlZnJlc2hEZWxheSIUa2V5QWRkaXRpb25hbEJhbGFuY2UiB2Fzc2V0SWQiFmtleVN0YWtpbmdBc3NldEJhbGFuY2UiGmdldEFkZGl0aW9uYWxCYWxhbmNlT3JaZXJvIhxnZXRTdGFraW5nQXNzZXRCYWxhbmNlT3JaZXJvIhBrZXlGYWN0b3J5Q29uZmlnIg1rZXlNYXRjaGVyUHViIilrZXlNYXBwaW5nUG9vbENvbnRyYWN0QWRkcmVzc1RvUG9vbEFzc2V0cyITcG9vbENvbnRyYWN0QWRkcmVzcyINa2V5UG9vbENvbmZpZyIJaUFtdEFzc2V0IgtpUHJpY2VBc3NldCIfa2V5TWFwcGluZ3NCYXNlQXNzZXQyaW50ZXJuYWxJZCIMYmFzZUFzc2V0U3RyIhNrZXlBbGxQb29sc1NodXRkb3duIg1rZXlQb29sV2VpZ2h0Ig9jb250cmFjdEFkZHJlc3MiFmtleUFsbG93ZWRMcFNjcmlwdEhhc2giFmtleUZlZUNvbGxlY3RvckFkZHJlc3MiD3Rocm93T3JkZXJFcnJvciIKb3JkZXJWYWxpZCIOb3JkZXJWYWxpZEluZm8iC3NlbmRlclZhbGlkIgxtYXRjaGVyVmFsaWQiD2dldFN0cmluZ09yRmFpbCIHYWRkcmVzcyIDa2V5IgxnZXRJbnRPckZhaWwiCHRocm93RXJyIgNtc2ciBmZtdEVyciIPZmFjdG9yeUNvbnRyYWN0IhNmZWVDb2xsZWN0b3JBZGRyZXNzIgVpbkZlZSIBQCIGb3V0RmVlIhBpc0dsb2JhbFNodXRkb3duIhNnZXRNYXRjaGVyUHViT3JGYWlsIg1nZXRQb29sQ29uZmlnIghhbXRBc3NldCIKcHJpY2VBc3NldCIMcGFyc2VBc3NldElkIgVpbnB1dCIPYXNzZXRJZFRvU3RyaW5nIg9wYXJzZVBvb2xDb25maWciCnBvb2xDb25maWciEHBvb2xDb25maWdQYXJzZWQiCyR0MDg5NjI5MTI4Ig5jZmdQb29sQWRkcmVzcyINY2ZnUG9vbFN0YXR1cyIMY2ZnTHBBc3NldElkIhBjZmdBbW91bnRBc3NldElkIg9jZmdQcmljZUFzc2V0SWQiFmNmZ0Ftb3VudEFzc2V0RGVjaW1hbHMiFWNmZ1ByaWNlQXNzZXREZWNpbWFscyIQZ2V0RmFjdG9yeUNvbmZpZyIPc3Rha2luZ0NvbnRyYWN0IhBzbGlwcGFnZUNvbnRyYWN0IhFkYXRhUHV0QWN0aW9uSW5mbyINaW5BbXRBc3NldEFtdCIPaW5QcmljZUFzc2V0QW10IghvdXRMcEFtdCIFcHJpY2UiHXNsaXBwYWdlVG9sZXJhbmNlUGFzc2VkQnlVc2VyIhVzbGlwcGFnZVRvbGVyYW5jZVJlYWwiCHR4SGVpZ2h0Igt0eFRpbWVzdGFtcCISc2xpcGFnZUFtdEFzc2V0QW10IhRzbGlwYWdlUHJpY2VBc3NldEFtdCIRZGF0YUdldEFjdGlvbkluZm8iDm91dEFtdEFzc2V0QW10IhBvdXRQcmljZUFzc2V0QW10IgdpbkxwQW10Ig1nZXRBY2NCYWxhbmNlIg1iYWxhbmNlT25Qb29sIgx0b3RhbEJhbGFuY2UiD2NhbGNQcmljZUJpZ0ludCIIcHJBbXRYMTgiCGFtQW10WDE4IhRjYWxjUHJpY2VCaWdJbnRSb3VuZCIHZ2V0UmF0ZSIFcHJveHkiA2ludiIHJG1hdGNoMCIBciIHZGVwb3NpdCIGYW1vdW50Ig5zdGFraW5nQXNzZXRJZCIYY3VycmVudEFkZGl0aW9uYWxCYWxhbmNlIhpjdXJyZW50U3Rha2luZ0Fzc2V0QmFsYW5jZSIFYXNzZXQiDWRlcG9zaXRJbnZva2UiFHJlY2VpdmVkU3Rha2luZ0Fzc2V0IhRuZXdBZGRpdGlvbmFsQmFsYW5jZSIWbmV3U3Rha2luZ0Fzc2V0QmFsYW5jZSIId2l0aGRyYXciDHByb3h5UmF0ZU11bCINcHJvZml0QWRkcmVzcyIQY3VycmVudFByb3h5UmF0ZSIHb2xkUmF0ZSIMc3Rha2luZ0Fzc2V0IhRvbGRTZW5kU3Rha2luZ0Ftb3VudCIWc2VuZFN0YWtpbmdBc3NldEFtb3VudCIMcHJvZml0QW1vdW50Ig53aXRoZHJhd0ludm9rZSIOcmVjZWl2ZWRBc3NldHMiE2dldExlYXNlUHJveHlDb25maWciAWEiEXJlYmFsYW5jZUludGVybmFsIgt0YXJnZXRSYXRpbyIKbWluQmFsYW5jZSIUbGVhc2FibGVUb3RhbEJhbGFuY2UiF3RhcmdldEFkZGl0aW9uYWxCYWxhbmNlIgRkaWZmIg9zZW5kQXNzZXRBbW91bnQiDmdldEFzc2V0QW1vdW50Ig5yZWJhbGFuY2VBc3NldCINJHQwMTUzNjQxNTUwMCIKaXNMZWFzYWJsZSILbGVhc2VkUmF0aW8iDHByb3h5QWRkcmVzcyIMcHJveHlBc3NldElkIhRzdGFraW5nUHJvZml0QWRkcmVzcyIZd2l0aGRyYXdBbmRSZWJhbGFuY2VBc3NldCIJZ2V0QW1vdW50Ig0kdDAxNTg5OTE2MDM1IhduZXdUb3RhbExlYXNhYmxlQmFsYW5jZSIOd2l0aGRyYXdBbW91bnQiF3dpdGhkcmF3QW5kUmViYWxhbmNlQWxsIhRhbW91bnRBc3NldE91dEFtb3VudCITcHJpY2VBc3NldE91dEFtb3VudCISQW1BbXRXaXRoZHJhd1N0YXRlIhJQckFtdFdpdGhkcmF3U3RhdGUiEHByaXZhdGVDYWxjUHJpY2UiCmFtQXNzZXREY20iCnByQXNzZXREY20iBWFtQW10IgVwckFtdCIOYW10QXNzZXRBbXRYMTgiEHByaWNlQXNzZXRBbXRYMTgiCmNhbGNQcmljZXMiBWxwQW10IgNjZmciC2FtdEFzc2V0RGNtIg1wcmljZUFzc2V0RGNtIghwcmljZVgxOCIIbHBBbXRYMTgiE2xwUHJpY2VJbkFtQXNzZXRYMTgiE2xwUHJpY2VJblByQXNzZXRYMTgiD2NhbGN1bGF0ZVByaWNlcyIGcHJpY2VzIhRlc3RpbWF0ZUdldE9wZXJhdGlvbiIGdHhJZDU4IgpwbXRBc3NldElkIghwbXRMcEFtdCIJbHBBc3NldElkIglhbUFzc2V0SWQiCXByQXNzZXRJZCIKcG9vbFN0YXR1cyIKbHBFbWlzc2lvbiIJYW1CYWxhbmNlIgxhbUJhbGFuY2VYMTgiCXByQmFsYW5jZSIMcHJCYWxhbmNlWDE4IgtjdXJQcmljZVgxOCIIY3VyUHJpY2UiC3BtdExwQW10WDE4Ig1scEVtaXNzaW9uWDE4IgtvdXRBbUFtdFgxOCILb3V0UHJBbXRYMTgiCG91dEFtQW10IghvdXRQckFtdCIFc3RhdGUiFGVzdGltYXRlUHV0T3BlcmF0aW9uIhFzbGlwcGFnZVRvbGVyYW5jZSIMaW5BbUFzc2V0QW10IgtpbkFtQXNzZXRJZCIMaW5QckFzc2V0QW10IgtpblByQXNzZXRJZCIKaXNFdmFsdWF0ZSIGZW1pdExwIgxhbUFzc2V0SWRTdHIiDHByQXNzZXRJZFN0ciILaUFtdEFzc2V0SWQiDWlQcmljZUFzc2V0SWQiDmluQW1Bc3NldElkU3RyIg5pblByQXNzZXRJZFN0ciIPaW5BbUFzc2V0QW10WDE4Ig9pblByQXNzZXRBbXRYMTgiDHVzZXJQcmljZVgxOCIDcmVzIgtzbGlwcGFnZVgxOCIUc2xpcHBhZ2VUb2xlcmFuY2VYMTgiCnByVmlhQW1YMTgiCmFtVmlhUHJYMTgiDGV4cGVjdGVkQW10cyIRZXhwQW10QXNzZXRBbXRYMTgiE2V4cFByaWNlQXNzZXRBbXRYMTgiCWNhbGNMcEFtdCIOY2FsY0FtQXNzZXRQbXQiDmNhbGNQckFzc2V0UG10IgxzbGlwcGFnZUNhbGMiCWVtaXRMcEFtdCIGYW1EaWZmIgZwckRpZmYiC2NvbW1vblN0YXRlIgdjYWxjS0xwIg1hbW91bnRCYWxhbmNlIgxwcmljZUJhbGFuY2UiEGFtb3VudEJhbGFuY2VYMTgiD3ByaWNlQmFsYW5jZVgxOCIKdXBkYXRlZEtMcCIOY2FsY0N1cnJlbnRLTHAiEGFtb3VudEFzc2V0RGVsdGEiD3ByaWNlQXNzZXREZWx0YSIUbHBBc3NldEVtaXNzaW9uRGVsdGEiEmFtb3VudEFzc2V0QmFsYW5jZSIRcHJpY2VBc3NldEJhbGFuY2UiD2xwQXNzZXRFbWlzc2lvbiIKY3VycmVudEtMcCIScmVmcmVzaEtMcEludGVybmFsIhdhbW91bnRBc3NldEJhbGFuY2VEZWx0YSIWcHJpY2VBc3NldEJhbGFuY2VEZWx0YSIHYWN0aW9ucyISdmFsaWRhdGVVcGRhdGVkS0xwIgZvbGRLTHAiG3ZhbGlkYXRlTWF0Y2hlck9yZGVyQWxsb3dlZCIFb3JkZXIiEWFtb3VudEFzc2V0QW1vdW50IhBwcmljZUFzc2V0QW1vdW50Ig0kdDAyODMwMTI4NTEzIgNrTHAiDSR0MDI4OTUzMjkwNTMiDXVudXNlZEFjdGlvbnMiBmtMcE5ldyIMaXNPcmRlclZhbGlkIgRpbmZvIgljb21tb25HZXQiAWkiA3BtdCIGcG10QW10Igljb21tb25QdXQiCmFtQXNzZXRQbXQiCnByQXNzZXRQbXQiBmVzdFB1dCIEZW1pdCIHZW1pdEludiINZW1pdEludkxlZ2FjeSIVbGVnYWN5RmFjdG9yeUNvbnRyYWN0Igd0YWtlRmVlIglmZWVBbW91bnQiD2NhbGNQdXRPbmVUb2tlbiIQcGF5bWVudEFtb3VudFJhdyIOcGF5bWVudEFzc2V0SWQiBmlzRXZhbCIQYW1vdW50QmFsYW5jZVJhdyIPcHJpY2VCYWxhbmNlUmF3IhRwYXltZW50SW5BbW91bnRBc3NldCINJHQwMzIxNjYzMjQ1OSIQYW1vdW50QmFsYW5jZU9sZCIPcHJpY2VCYWxhbmNlT2xkIg0kdDAzMjQ2MzMyNjEyIhRhbW91bnRBc3NldEFtb3VudFJhdyITcHJpY2VBc3NldEFtb3VudFJhdyINJHQwMzI3NDQzMjgwOCINcGF5bWVudEFtb3VudCIQYW1vdW50QmFsYW5jZU5ldyIPcHJpY2VCYWxhbmNlTmV3IgtwcmljZU5ld1gxOCIIcHJpY2VOZXciDnBheW1lbnRCYWxhbmNlIhRwYXltZW50QmFsYW5jZUJpZ0ludCIMc3VwcGx5QmlnSW50IgtjaGVjaFN1cHBseSINZGVwb3NpdEJpZ0ludCILaXNzdWVBbW91bnQiC3ByaWNlT2xkWDE4IghwcmljZU9sZCIEbG9zcyINJHQwMzQ0ODkzNDY1NiIHYmFsYW5jZSIPaXNzdWVBbW91bnRCb3RoIg9jYWxjR2V0T25lVG9rZW4iCm91dEFzc2V0SWQiBmNoZWNrcyIQb3V0SW5BbW91bnRBc3NldCINYmFsYW5jZUJpZ0ludCIYb3V0SW5BbW91bnRBc3NldERlY2ltYWxzIgxhbUJhbGFuY2VPbGQiDHByQmFsYW5jZU9sZCIKb3V0QmFsYW5jZSIQb3V0QmFsYW5jZUJpZ0ludCIOcmVkZWVtZWRCaWdJbnQiCWFtb3VudFJhdyINJHQwMzY3MzQzNjc5MCILdG90YWxBbW91bnQiDSR0MDM2Nzk0MzcwMjAiC291dEFtQW1vdW50IgtvdXRQckFtb3VudCIMYW1CYWxhbmNlTmV3IgxwckJhbGFuY2VOZXciGGFtb3VudEJvdGhJblBheW1lbnRBc3NldCIWbWFuYWdlclB1YmxpY0tleU9yVW5pdCIBcyIdcGVuZGluZ01hbmFnZXJQdWJsaWNLZXlPclVuaXQiCWlzTWFuYWdlciICcGsiC211c3RNYW5hZ2VyIgJwZCINY2xlYW5BbW91bnRJbiIJaXNSZXZlcnNlIg1mZWVQb29sQW1vdW50Ig0kdDAzODkwNjM5MjExIghhc3NldE91dCIHYXNzZXRJbiIScG9vbEFzc2V0SW5CYWxhbmNlIhNwb29sQXNzZXRPdXRCYWxhbmNlIglhbW91bnRPdXQiBG9sZEsiBG5ld0siBmNoZWNrSyIMYW1vdW50T3V0TWluIglhZGRyZXNzVG8iC3N3YXBDb250YWN0IghjaGVja01pbiIOcmViYWxhbmNlU3RhdGUiDXdpdGhkcmF3U3RhdGUiF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5IgtjaGVja0NhbGxlciIVY2hlY2tNYW5hZ2VyUHVibGljS2V5IgJwbSIFaGFzUE0iB2NoZWNrUE0iD3Nob3VsZEF1dG9TdGFrZSIEYW1JZCIEcHJJZCIMc2xpcHBhZ2VBSW52IgxzbGlwcGFnZVBJbnYiCmxwVHJhbnNmZXIiC3NscFN0YWtlSW52Ig0kdDA0NDI1NzQ0NzE5IhFyZWZyZXNoS0xwQWN0aW9ucyIRaXNVcGRhdGVkS0xwVmFsaWQiA3JlYiILbWF4U2xpcHBhZ2UiDSR0MDQ1MzMxNDUzOTYiDG1pbk91dEFtb3VudCIJYXV0b1N0YWtlIiBpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZCINaXNQdXREaXNhYmxlZCIHcGF5bWVudCINJHQwNDY1ODQ0NjczNiIFYm9udXMiE2VtaXRBbW91bnRFc3RpbWF0ZWQiCmVtaXRBbW91bnQiCHN0YWtlSW52IgdzZW5kRmVlIg0kdDA0NzMyMjQ3NTE5Ig0kdDA0NzUyMjQ3NjMwIg0kdDA0Nzk4NTQ4MTQyIg1vdXRBc3NldElkU3RyIg1pc0dldERpc2FibGVkIg0kdDA0OTAyNzQ5MTgwIg9hbW91bnRFc3RpbWF0ZWQiB2J1cm5JbnYiDWFzc2V0VHJhbnNmZXIiDSR0MDQ5ODQ0NTAwOTEiEGZlZUFtb3VudEZvckNhbGMiDSR0MDUwMDk0NTAyMDIiDSR0MDUwNDgwNTA2MzYiDXVuc3Rha2VBbW91bnQiCnVuc3Rha2VJbnYiDSR0MDUxNTQxNTE2OTIiDSR0MDUyMzUxNTI1OTgiDSR0MDUyNjAxNTI3MDkiFGJ1cm5MUEFzc2V0T25GYWN0b3J5Ig0kdDA1MzgwNDUzODg1IhJub0xlc3NUaGVuQW10QXNzZXQiFG5vTGVzc1RoZW5QcmljZUFzc2V0Ig0kdDA1NDk4MDU1MDYxIg1jaGVja1BheW1lbnRzIg9jaGVja1Bvb2xTdGF0dXMiDSR0MDU2MzMzNTY0MTQiFW5vTGVzc1RoZW5BbW91bnRBc3NldCIMY2hlY2tBbW91bnRzIg0kdDA1Nzg1NTU3OTM2IgthbXRBc3NldFN0ciINcHJpY2VBc3NldFN0ciIYbGFzdFJlZnJlc2hlZEJsb2NrSGVpZ2h0Ih1jaGVja0xhc3RSZWZyZXNoZWRCbG9ja0hlaWdodCINJHQwNTkxNDA1OTIwNCIQa0xwVXBkYXRlQWN0aW9ucyIKYW10QXNzZXRJZCIMcHJpY2VBc3NldElkIg1wb29sTFBCYWxhbmNlIhJhY2NBbXRBc3NldEJhbGFuY2UiFGFjY1ByaWNlQXNzZXRCYWxhbmNlIgpwcmljZXNMaXN0Ig9scEFtdEFzc2V0U2hhcmUiEWxwUHJpY2VBc3NldFNoYXJlIgpwb29sV2VpZ2h0IgxjdXJQcmljZUNhbGMiDGFtQmFsYW5jZVJhdyIMcHJCYWxhbmNlUmF3Ig9hbUJhbGFuY2VSYXdYMTgiD3ByQmFsYW5jZVJhd1gxOCIQcGF5bWVudExwQXNzZXRJZCIMcGF5bWVudExwQW10IgJ0eCIGdmVyaWZ5Ig90YXJnZXRQdWJsaWNLZXkiCm1hdGNoZXJQdWIiDSR0MDY3ODY2Njc5MzUiB25ld0hhc2giC2FsbG93ZWRIYXNoIgtjdXJyZW50SGFzaH8AAWEACAABYgCAwtcvAAFjCQC2AgEAgMLXLwABZAkAtgIBAICAkLu61q3wDQABZQkAtgIBAAAAAWYJALYCAQAAAAFnCQC2AgEAAQABaAkAtgIBAAIAAWkCBVdBVkVTAAFqAgJfXwABawABAAFsAAIAAW0AAwABbgAEAAFvAAEAAXAAAgABcQADAAFyAAQAAXMABQABdAAGAAF1AAcAAXYACAABdwAJAAF4AAoAAXkAAQABegACAAFBAAMAAUIAAQABQwAHAQFEAgFFAUYJALwCAwkAtgIBBQFFBQFkCQC2AgEFAUYBAUcCAUUBRgkAvAIDBQFFBQFkBQFGAQFIAgFJAUoJAKADAQkAvAIDBQFJCQC2AgEFAUoFAWQBAUsDAUkBSgFMCQCgAwEJAL0CBAUBSQkAtgIBBQFKBQFkBQFMAQFNAwFOAU8BUAkAawMFAU4FAU8FAVABAVEBAUkDCQBmAgAABQFJCQEBLQEFAUkFAUkBAVIBAUkDCQC/AgIFAWUFAUkJAL4CAQUBSQUBSQEBUwACECVzX19zd2FwQ29udHJhY3QBAVQAAhMlc19fZmFjdG9yeUNvbnRyYWN0AQFVAAIUJXNfX21hbmFnZXJQdWJsaWNLZXkBAVYAAhslc19fcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkBAVcAAhElcyVzX19wcmljZV9fbGFzdAEBWAIBWQFaCQC5CQIJAMwIAgIYJXMlcyVkJWRfX3ByaWNlX19oaXN0b3J5CQDMCAIJAKQDAQUBWQkAzAgCCQCkAwEFAVoFA25pbAUBagECYWECAmFiAmFjCQCsAgIJAKwCAgkArAICAgslcyVzJXNfX1BfXwUCYWICAl9fBQJhYwECYWQCAmFiAmFjCQCsAgIJAKwCAgkArAICAgslcyVzJXNfX0dfXwUCYWICAl9fBQJhYwECYWUAAg8lc19fYW1vdW50QXNzZXQBAmFmAAIOJXNfX3ByaWNlQXNzZXQAAmFnAgclc19fZmVlAAJhaAkAawMACgUBYgCQTgACYWkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUCYWcFAmFoAAJhagkAuQkCCQDMCAICAiVzCQDMCAICA2tMcAUDbmlsBQFqAAJhawkAuQkCCQDMCAICAiVzCQDMCAICEmtMcFJlZnJlc2hlZEhlaWdodAUDbmlsBQFqAAJhbAkAuQkCCQDMCAICAiVzCQDMCAICD3JlZnJlc2hLTHBEZWxheQUDbmlsBQFqAAJhbQAeAAJhbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQJhbAUCYW0BAmFvAQJhcAkAuQkCCQDMCAICBCVzJXMJAMwIAgINc3Rha2VkQmFsYW5jZQkAzAgCBQJhcAUDbmlsBQFqAQJhcQECYXAJALkJAgkAzAgCAgQlcyVzCQDMCAICEXNoYXJlQXNzZXRCYWxhbmNlCQDMCAIFAmFwBQNuaWwFAWoBAmFyAQJhcAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQECYW8BBQJhcAAAAQJhcwECYXAJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBAmFxAQUCYXAAAAECYXQAAhElc19fZmFjdG9yeUNvbmZpZwECYXUAAhglcyVzX19tYXRjaGVyX19wdWJsaWNLZXkBAmF2AQJhdwkArAICCQCsAgICCCVzJXMlc19fBQJhdwIgX19tYXBwaW5nc19fcG9vbENvbnRyYWN0MkxwQXNzZXQBAmF4AgJheQJhegkArAICCQCsAgIJAKwCAgkArAICAgglZCVkJXNfXwUCYXkCAl9fBQJhegIIX19jb25maWcBAmFBAQJhQgkArAICAiglcyVzJXNfX21hcHBpbmdzX19iYXNlQXNzZXQyaW50ZXJuYWxJZF9fBQJhQgECYUMAAgwlc19fc2h1dGRvd24BAmFEAQJhRQkArAICAhIlcyVzX19wb29sV2VpZ2h0X18FAmFFAQJhRgACFyVzX19hbGxvd2VkTHBTY3JpcHRIYXNoAAJhRwIXJXNfX2ZlZUNvbGxlY3RvckFkZHJlc3MBAmFIBAJhSQJhSgJhSwJhTAkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAiRvcmRlciB2YWxpZGF0aW9uIGZhaWxlZDogb3JkZXJWYWxpZD0JAKUDAQUCYUkCAiAoBQJhSgIBKQINIHNlbmRlclZhbGlkPQkApQMBBQJhSwIOIG1hdGNoZXJWYWxpZD0JAKUDAQUCYUwBAmFNAgJhTgJhTwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFAmFOBQJhTwkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQJhTgkAzAgCAgEuCQDMCAIFAmFPCQDMCAICDyBpcyBub3QgZGVmaW5lZAUDbmlsAgABAmFQAgJhTgJhTwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFAmFOBQJhTwkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQJhTgkAzAgCAgEuCQDMCAIFAmFPCQDMCAICDyBpcyBub3QgZGVmaW5lZAUDbmlsAgABAmFRAQJhUgkAAgEJALkJAgkAzAgCAghscC5yaWRlOgkAzAgCBQJhUgUDbmlsAgEgAQJhUwECYVIJALkJAgkAzAgCAghscC5yaWRlOgkAzAgCBQJhUgUDbmlsAgEgAAJhVAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBAmFNAgUEdGhpcwkBAVQAAAJhVQkBEUBleHRyTmF0aXZlKDEwNjIpAQkBAmFNAgUCYVQFAmFHAAJhVgoAAmFXCQD8BwQFAmFUAhBnZXRJbkZlZVJFQURPTkxZCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQABAgUCYVcCA0ludAUCYVcJAAIBCQCsAgIJAAMBBQJhVwIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AAJhWAoAAmFXCQD8BwQFAmFUAhFnZXRPdXRGZWVSRUFET05MWQkAzAgCCQClCAEFBHRoaXMFA25pbAUDbmlsAwkAAQIFAmFXAgNJbnQFAmFXCQACAQkArAICCQADAQUCYVcCGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAECYVkACQELdmFsdWVPckVsc2UCCQCbCAIFAmFUCQECYUMABwECYVoACQDZBAEJAQJhTQIFAmFUCQECYXUAAQJiYQAEAmJiCQECYU0CBQR0aGlzCQECYWUABAJiYwkBAmFNAgUEdGhpcwkBAmFmAAQCYXoJAQJhUAIFAmFUCQECYUEBBQJiYwQCYXkJAQJhUAIFAmFUCQECYUEBBQJiYgkAtQkCCQECYU0CBQJhVAkBAmF4AgkApAMBBQJheQkApAMBBQJhegUBagECYmQBAmJlAwkAAAIFAmJlBQFpBQR1bml0CQDZBAEFAmJlAQJiZgECYmUDCQAAAgUCYmUFBHVuaXQFAWkJANgEAQkBBXZhbHVlAQUCYmUBAmJnAQJiaAkAmQoHCQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFAmJoBQFvCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYmgFAXAJANkEAQkAkQMCBQJiaAUBcQkBAmJkAQkAkQMCBQJiaAUBcgkBAmJkAQkAkQMCBQJiaAUBcwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJoBQF0CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYmgFAXUAAmJpCQECYmcBCQECYmEAAAJiagUCYmkAAmJrCAUCYmoCXzEAAmJsCAUCYmoCXzIAAmJtCAUCYmoCXzMAAmJuCAUCYmoCXzQAAmJvCAUCYmoCXzUAAmJwCAUCYmoCXzYAAmJxCAUCYmoCXzcBAmJyAAkAtQkCCQECYU0CBQJhVAkBAmF0AAUBagACYnMJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIJAQJicgAFAUICGWluY29ycmVjdCBzdGFraW5nIGFkZHJlc3MAAmJ0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCCQECYnIABQFDAhlpbmNvcnJlY3Qgc3Rha2luZyBhZGRyZXNzAQJidQoCYnYCYncCYngCYnkCYnoCYkECYkICYkMCYkQCYkUJALkJAgkAzAgCAhQlZCVkJWQlZCVkJWQlZCVkJWQlZAkAzAgCCQCkAwEFAmJ2CQDMCAIJAKQDAQUCYncJAMwIAgkApAMBBQJieAkAzAgCCQCkAwEFAmJ5CQDMCAIJAKQDAQUCYnoJAMwIAgkApAMBBQJiQQkAzAgCCQCkAwEFAmJCCQDMCAIJAKQDAQUCYkMJAMwIAgkApAMBBQJiRAkAzAgCCQCkAwEFAmJFBQNuaWwFAWoBAmJGBgJiRwJiSAJiSQJieQJiQgJiQwkAuQkCCQDMCAICDCVkJWQlZCVkJWQlZAkAzAgCCQCkAwEFAmJHCQDMCAIJAKQDAQUCYkgJAMwIAgkApAMBBQJiSQkAzAgCCQCkAwEFAmJ5CQDMCAIJAKQDAQUCYkIJAMwIAgkApAMBBQJiQwUDbmlsBQFqAQJiSgECYXAEAmJLAwkAAAIFAmFwAgVXQVZFUwgJAO8HAQUEdGhpcwlhdmFpbGFibGUJAPAHAgUEdGhpcwkA2QQBBQJhcAQCYkwJAGUCCQBkAgUCYksJAQJhcgEFAmFwCQECYXMBBQJhcAkAlgMBCQDMCAIAAAkAzAgCBQJiTAUDbmlsAQJiTQICYk4CYk8JALwCAwUCYk4FAWQFAmJPAQJiUAMCYk4CYk8BTAkAvQIEBQJiTgUBZAUCYk8FAUwBAmJRAQJiUgQCYlMJAPwHBAUCYlICB2dldFJhdGUFA25pbAUDbmlsAwkAAAIFAmJTBQJiUwQCYlQFAmJTAwkAAQIFAmJUAgNJbnQEAmJVBQJiVAUCYlUJAQJhUQECIHByb3h5LmdldFJhdGUoKSB1bmV4cGVjdGVkIHZhbHVlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJiVgQCYXACYlcCYlgCYlIEAmJZCQECYXIBBQJhcAMJAAACBQJiWQUCYlkEAmJaCQECYXMBBQJiWAMJAAACBQJiWgUCYloEAmNhCQECYmQBBQJhcAMJAGYCBQJiVwAABAJjYgkA/AcEBQJiUgIHZGVwb3NpdAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJjYQUCYlcFA25pbAMJAAACBQJjYgUCY2IEAmJUBQJjYgMJAAECBQJiVAIDSW50BAJjYwUCYlQEAmNkCQBkAgUCYlkFAmJXBAJjZQkAZAIFAmJaBQJjYwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFvAQUCYXAFAmNkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYXEBBQJiWAUCY2UFA25pbAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAmNmBgJhcAJiVwJiWAJiUgJjZwJjaAQCYlkJAQJhcgEFAmFwAwkAAAIFAmJZBQJiWQQCYloJAQJhcwEFAmJYAwkAAAIFAmJaBQJiWgQCY2kJAQJiUQEFAmJSAwkAAAIFAmNpBQJjaQQCY2oJAGsDBQJjZwUCYlkFAmJaBAJjawkBAmJkAQUCYlgEAmNsCQBrAwUCY2cFAmJXBQJjagQCY20JAGsDBQJjZwUCYlcFAmNpBAJjbgkAlgMBCQDMCAIAAAkAzAgCCQBlAgUCY2wFAmNtBQNuaWwDCQBmAgUCY20AAAQCY28JAPwHBAUCYlICCHdpdGhkcmF3BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmNrBQJjbQUDbmlsAwkAAAIFAmNvBQJjbwQCYlQFAmNvAwkAAQIFAmJUAgNJbnQEAmNwBQJiVAQCY2QJAGUCBQJiWQUCY3AEAmNlCQBlAgkAZQIFAmJaBQJjbQUCY24JAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhbwEFAmFwBQJjZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFxAQUCYlgFAmNlCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmNoBQJjbgkBAmJkAQUCYlgFA25pbAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAmNxAQJhcAQCYlQJAPwHBAUCYVQCGmdldFBvb2xMZWFzZUNvbmZpZ1JFQURPTkxZCQDMCAIJAKUIAQUEdGhpcwkAzAgCBQJhcAUDbmlsBQNuaWwDCQABAgUCYlQCMChCb29sZWFuLCBJbnQsIEludCwgU3RyaW5nLCBTdHJpbmcsIEludCwgU3RyaW5nKQQCY3IFAmJUBQJjcgkBAmFRAQkArAICCQCsAgICAVsFAmFwAh1dIGdldExlYXNlUHJveHlDb25maWcoKSBlcnJvcgECY3MHAmN0AmFwAmJYAmN1AmJSAmNnAmNoBAJiWQkBAmFyAQUCYXADCQAAAgUCYlkFAmJZBAJiWgkBAmFzAQUCYlgDCQAAAgUCYloFAmJaBAJjdgkAlgMBCQDMCAIAAAkAzAgCCQBlAgkBAmJKAQUCYXAFAmN1BQNuaWwEAmN3CQBrAwUCY3QFAmN2AGQEAmN4CQBlAgUCYlkFAmN3AwkAAAIFAmN4AAAFA25pbAMJAGYCAAAFAmN4BAJjeQkBAS0BBQJjeAkBAmJWBAUCYXAFAmN5BQJiWAUCYlIEAmN6BQJjeAkBAmNmBgUCYXAFAmN6BQJiWAUCYlIFAmNnBQJjaAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECY0EBAmFwBAJjQgkBAmNxAQUCYXAEAmNDCAUCY0ICXzEEAmNECAUCY0ICXzIEAmN1CAUCY0ICXzMEAmNFCAUCY0ICXzQEAmNGCAUCY0ICXzUEAmNnCAUCY0ICXzYEAmNHCAUCY0ICXzcDBQJjQwkBAmNzBwUCY0QFAmFwBQJjRgUCY3UJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAmNFBQJjZwkBEUBleHRyTmF0aXZlKDEwNjIpAQUCY0cFA25pbAECY0gCAmFwAmNJBAJjSgkBAmNxAQUCYXAEAmNDCAUCY0oCXzEEAmNECAUCY0oCXzIEAmN1CAUCY0oCXzMEAmNFCAUCY0oCXzQEAmNGCAUCY0oCXzUEAmNnCAUCY0oCXzYEAmNHCAUCY0oCXzcDBQJjQwQCY0sJAJYDAQkAzAgCAAAJAMwIAgkAZQIJAGUCCQECYkoBBQJhcAUCY0kFAmN1BQNuaWwDCQAAAgUCY0sFAmNLBAJjZAkAawMFAmNEBQJjSwBkAwkAAAIFAmNkBQJjZAQCY0wJAGUCCQECYXIBBQJhcAUCY2QDCQAAAgUCY0wFAmNMAwkAZgIAAAUCY0wJAQJiVgQFAmFwCQEBLQEFAmNMBQJjRgkBEUBleHRyTmF0aXZlKDEwNjIpAQUCY0UJAQJjZgYFAmFwBQJjTAUCY0YJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAmNFBQJjZwkBEUBleHRyTmF0aXZlKDEwNjIpAQUCY0cJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FA25pbAECY00CAmNOAmNPBAJjUAkBAmNIAgkBAmFNAgUEdGhpcwkBAmFlAAUCY04EAmNRCQECY0gCCQECYU0CBQR0aGlzCQECYWYABQJjTwkAzggCBQJjUAUCY1EBAmNSBAJjUwJjVAJjVQJjVgQCY1cJAQFEAgUCY1UFAmNTBAJjWAkBAUQCBQJjVgUCY1QJAQJiTQIFAmNYBQJjVwECY1kDAmNVAmNWAmNaBAJkYQkBAmJhAAQCZGIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJkYQUBdAQCZGMJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJkYQUBdQQCZGQJAQJjUgQFAmRiBQJkYwUCY1UFAmNWBAJiTwkBAUQCBQJjVQUCZGIEAmJOCQEBRAIFAmNWBQJkYwQCZGUJAQFEAgUCY1oFAWIEAmRmCQECYk0CBQJiTwUCZGUEAmRnCQECYk0CBQJiTgUCZGUJAMwIAgUCZGQJAMwIAgUCZGYJAMwIAgUCZGcFA25pbAECZGgDAmNVAmNWAmNaBAJkaQkBAmNZAwUCY1UFAmNWBQJjWgkAzAgCCQEBSAIJAJEDAgUCZGkAAAUBYgkAzAgCCQEBSAIJAJEDAgUCZGkAAQUBYgkAzAgCCQEBSAIJAJEDAgUCZGkAAgUBYgUDbmlsAQJkagQCZGsCZGwCZG0CYWIEAmRhCQECYmEABAJkbgkAkQMCBQJkYQUBcQQCZG8JAJEDAgUCZGEFAXIEAmRwCQCRAwIFAmRhBQFzBAJjUwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmRhBQF0BAJjVAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmRhBQF1BAJkcQkAkQMCBQJkYQUBcAQCZHIICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQJkbgkArAICCQCsAgICBkFzc2V0IAUCZG4CDiBkb2Vzbid0IGV4aXN0CHF1YW50aXR5AwkBAiE9AgUCZG4FAmRsCQACAQIVSW52YWxpZCBhc3NldCBwYXNzZWQuBAJkcwkBAmJKAQUCZG8EAmR0CQEBRAIFAmRzBQJjUwQCZHUJAQJiSgEFAmRwBAJkdgkBAUQCBQJkdQUCY1QEAmR3CQECYk0CBQJkdgUCZHQEAmR4CQEBSAIFAmR3BQFiBAJkeQkBAUQCBQJkbQUBYgQCZHoJAQFEAgUCZHIFAWIEAmRBCQC8AgMFAmR0BQJkeQUCZHoEAmRCCQC8AgMFAmR2BQJkeQUCZHoEAmRDCQEBSwMFAmRBBQJjUwUFRkxPT1IEAmRECQEBSwMFAmRCBQJjVAUFRkxPT1IEAmRFAwkAAAIFAmRrAgAFA25pbAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJhYgUCZEMDCQAAAgUCZG8CBVdBVkVTBQR1bml0CQDZBAEFAmRvCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmFiBQJkRAMJAAACBQJkcAIFV0FWRVMFBHVuaXQJANkEAQUCZHAJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFkAgkApQgBBQJhYgUCZGsJAQJiRgYFAmRDBQJkRAUCZG0FAmR4BQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBVwAFAmR4CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBWAIFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFAmR4BQNuaWwJAJwKCgUCZEMFAmREBQJkbwUCZHAFAmRzBQJkdQUCZHIFAmR3BQJkcQUCZEUBAmRGCQJkawJkRwJkSAJkSQJkSgJkSwJhYgJkTAJkTQQCZGEJAQJiYQAEAmRuCQDZBAEJAJEDAgUCZGEFAXEEAmROCQCRAwIFAmRhBQFyBAJkTwkAkQMCBQJkYQUBcwQCZFAJAJEDAgUCZGEFAXYEAmRRCQCRAwIFAmRhBQF3BAJkYgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmRhBQF0BAJkYwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmRhBQF1BAJkcQkAkQMCBQJkYQUBcAQCZHIICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUCZG4JAKwCAgkArAICAgZBc3NldCAJANgEAQUCZG4CDiBkb2Vzbid0IGV4aXN0CHF1YW50aXR5BAJkUgkA2AQBCQELdmFsdWVPckVsc2UCBQJkSQkA2QQBAgVXQVZFUwQCZFMJANgEAQkBC3ZhbHVlT3JFbHNlAgUCZEsJANkEAQIFV0FWRVMDAwkBAiE9AgUCZE4FAmRSBgkBAiE9AgUCZE8FAmRTCQACAQIiSW52YWxpZCBhbXQgb3IgcHJpY2UgYXNzZXQgcGFzc2VkLgQCZHMDBQJkTAkBAmJKAQUCZE4JAGUCCQECYkoBBQJkTgUCZEgEAmR1AwUCZEwJAQJiSgEFAmRPCQBlAgkBAmJKAQUCZE8FAmRKBAJkVAkBAUQCBQJkSAUCZGIEAmRVCQEBRAIFAmRKBQJkYwQCZFYJAQJiTQIFAmRVBQJkVAQCZHQJAQFEAgUCZHMFAmRiBAJkdgkBAUQCBQJkdQUCZGMEAmRXAwkAAAIFAmRyAAAEAmR3BQFlBAJkWAUBZQQCZGUJAHYGCQC5AgIFAmRUBQJkVQAACQC2AgEABQABAAAFBERPV04JAJcKBQkBAUgCBQJkZQUBYgkBAUgCBQJkVAUCZGIJAQFIAgUCZFUFAmRjCQECYk0CCQC3AgIFAmR2BQJkVQkAtwICBQJkdAUCZFQFAmRYBAJkdwkBAmJNAgUCZHYFAmR0BAJkWAkAvAIDCQEBUgEJALgCAgUCZHcFAmRWBQFkBQJkdwQCZFkJAQFEAgUCZEcFAWIDAwkBAiE9AgUCZHcFAWUJAL8CAgUCZFgFAmRZBwkAAgEJAKwCAgkArAICCQCsAgICD1ByaWNlIHNsaXBwYWdlIAkApgMBBQJkWAIeIGV4Y2VlZGVkIHRoZSBwYXNzZWQgbGltaXQgb2YgCQCmAwEFAmRZBAJkegkBAUQCBQJkcgUBYgQCZFoJAL0CBAUCZFQJAQJiUAMFAmR2BQJkdAUHQ0VJTElORwUBZAUHQ0VJTElORwQCZWEJAL0CBAUCZFUFAWQJAQJiUAMFAmR2BQJkdAUFRkxPT1IFB0NFSUxJTkcEAmViAwkAvwICBQJkWgUCZFUJAJQKAgUCZWEFAmRVCQCUCgIFAmRUBQJkWgQCZWMIBQJlYgJfMQQCZWQIBQJlYgJfMgQCZGUJAL0CBAUCZHoFAmVkBQJkdgUFRkxPT1IJAJcKBQkBAUsDBQJkZQUBYgUFRkxPT1IJAQFLAwUCZWMFAmRiBQdDRUlMSU5HCQEBSwMFAmVkBQJkYwUHQ0VJTElORwUCZHcFAmRYBAJlZQgFAmRXAl8xBAJlZggFAmRXAl8yBAJlZwgFAmRXAl8zBAJkeAkBAUgCCAUCZFcCXzQFAWIEAmVoCQEBSAIIBQJkVwJfNQUBYgMJAGcCAAAFAmVlCQACAQI2SW52YWxpZCBjYWxjdWxhdGlvbnMuIExQIGNhbGN1bGF0ZWQgaXMgbGVzcyB0aGFuIHplcm8uBAJlaQMJAQEhAQUCZE0AAAUCZWUEAmVqCQBlAgUCZEgFAmVmBAJlawkAZQIFAmRKBQJlZwQCZWwJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFXAAUCZHgJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFYAgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUCZHgJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFhAgUCYWIFAmRrCQECYnUKBQJlZgUCZWcFAmVpBQJkeAUCZEcFAmVoBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQJlagUCZWsFA25pbAkAnwoNBQJlZQUCZWkFAmR4BQJkcwUCZHUFAmRyBQJkbgUCZHEFAmVsBQJlagUCZWsFAmRJBQJkSwECZW0DAmVuAmVvAmRyBAJlcAkBAUcCBQJlbgkAtgIBBQJicAQCZXEJAQFHAgUCZW8JALYCAQUCYnEEAmVyCQC8AgMJAHYGCQC5AgIFAmVwBQJlcQAACQC2AgEABQABABIFBERPV04FAWcFAmRyAwkAAAIFAmRyBQFmBQFmBQJlcgECZXMDAmV0AmV1AmV2BAJldwkAuAICCQC2AgEJAQJiSgEJAQJiZgEFAmJuBQJldAQCZXgJALgCAgkAtgIBCQECYkoBCQECYmYBBQJibwUCZXUEAmV5CQC4AgIJALYCAQgJAQV2YWx1ZQEJAOwHAQUCYm0IcXVhbnRpdHkFAmV2BAJlegkBAmVtAwUCZXcFAmV4BQJleQUCZXoBAmVBAwJlQgJlQwJldgQCZXcJAGQCCQECYkoBCQECYmYBBQJibgUCZUIEAmV4CQBkAgkBAmJKAQkBAmJmAQUCYm8FAmVDBAJleQkAZAIICQEFdmFsdWUBCQDsBwEFAmJtCHF1YW50aXR5BQJldgQCZXIJAQJlbQMJALYCAQUCZXcJALYCAQUCZXgJALYCAQUCZXkEAmVECQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJhawUGaGVpZ2h0CQDMCAIJAQtTdHJpbmdFbnRyeQIFAmFqCQCmAwEFAmVyBQNuaWwJAJQKAgUCZUQFAmVyAQJlRQICZUYCZXIDCQDAAgIFAmVyBQJlRgYJAQJhUQEJALkJAgkAzAgCAiJ1cGRhdGVkIEtMcCBsb3dlciB0aGFuIGN1cnJlbnQgS0xwCQDMCAIJAKYDAQUCZUYJAMwIAgkApgMBBQJlcgUDbmlsAgEgAQJlRwECZUgEAmV3CQECYkoBCQECYmYBBQJibgQCZXgJAQJiSgEJAQJiZgEFAmJvBAJlSQgFAmVIBmFtb3VudAQCZUoJAG4ECAUCZUgGYW1vdW50CAUCZUgFcHJpY2UFAWIFBUZMT09SBAJlSwMJAAACCAUCZUgJb3JkZXJUeXBlBQNCdXkJAJQKAgUCZUkJAQEtAQUCZUoJAJQKAgkBAS0BBQJlSQUCZUoEAmVCCAUCZUsCXzEEAmVDCAUCZUsCXzIDAwMJAQJhWQAGCQAAAgUCYmwFAW0GCQAAAgUCYmwFAW4JAAIBAhxFeGNoYW5nZSBvcGVyYXRpb25zIGRpc2FibGVkAwMJAQIhPQIICAUCZUgJYXNzZXRQYWlyC2Ftb3VudEFzc2V0BQJibgYJAQIhPQIICAUCZUgJYXNzZXRQYWlyCnByaWNlQXNzZXQFAmJvCQACAQITV3Jvbmcgb3JkZXIgYXNzZXRzLgQCZUwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAqAMBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFAmFqAgEwCQECYVMBAgtpbnZhbGlkIGtMcAQCZU0JAQJlQQMFAmVCBQJlQwAABAJlTggFAmVNAl8xBAJlTwgFAmVNAl8yBAJlUAkAwAICBQJlTwUCZUwEAmVRCQC5CQIJAMwIAgIEa0xwPQkAzAgCCQCmAwEFAmVMCQDMCAICCCBrTHBOZXc9CQDMCAIJAKYDAQUCZU8JAMwIAgIUIGFtb3VudEFzc2V0QmFsYW5jZT0JAMwIAgkApAMBBQJldwkAzAgCAhMgcHJpY2VBc3NldEJhbGFuY2U9CQDMCAIJAKQDAQUCZXgJAMwIAgIZIGFtb3VudEFzc2V0QmFsYW5jZURlbHRhPQkAzAgCCQCkAwEFAmVCCQDMCAICGCBwcmljZUFzc2V0QmFsYW5jZURlbHRhPQkAzAgCCQCkAwEFAmVDCQDMCAICCCBoZWlnaHQ9CQDMCAIJAKQDAQUGaGVpZ2h0BQNuaWwCAAkAlAoCBQJlUAUCZVEBAmVSAQJlUwMJAQIhPQIJAJADAQgFAmVTCHBheW1lbnRzAAEJAAIBAh1leGFjdGx5IDEgcGF5bWVudCBpcyBleHBlY3RlZAQCZVQJAQV2YWx1ZQEJAJEDAggFAmVTCHBheW1lbnRzAAAEAmRsCQEFdmFsdWUBCAUCZVQHYXNzZXRJZAQCZVUIBQJlVAZhbW91bnQEAmRXCQECZGoECQDYBAEIBQJlUw10cmFuc2FjdGlvbklkCQDYBAEFAmRsBQJlVQgFAmVTBmNhbGxlcgQCZEMIBQJkVwJfMQQCZEQIBQJkVwJfMgQCZHEJAQ1wYXJzZUludFZhbHVlAQgFAmRXAl85BAJkRQgFAmRXA18xMAMDCQECYVkABgkAAAIFAmRxBQFuCQACAQkArAICAixHZXQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgYWRtaW4uIFN0YXR1cyA9IAkApAMBBQJkcQkAlwoFBQJkQwUCZEQFAmVVBQJkbAUCZEUBAmVWAwJlUwJkRwJkTQMJAQIhPQIJAJADAQgFAmVTCHBheW1lbnRzAAIJAAIBAh9leGFjdGx5IDIgcGF5bWVudHMgYXJlIGV4cGVjdGVkBAJlVwkBBXZhbHVlAQkAkQMCCAUCZVMIcGF5bWVudHMAAAQCZVgJAQV2YWx1ZQEJAJEDAggFAmVTCHBheW1lbnRzAAEEAmVZCQECZEYJCQDYBAEIBQJlUw10cmFuc2FjdGlvbklkBQJkRwgFAmVXBmFtb3VudAgFAmVXB2Fzc2V0SWQIBQJlWAZhbW91bnQIBQJlWAdhc3NldElkCQClCAEIBQJlUwZjYWxsZXIHBQJkTQQCZHEJAQ1wYXJzZUludFZhbHVlAQgFAmVZAl84AwMDCQECYVkABgkAAAIFAmRxBQFsBgkAAAIFAmRxBQFuCQACAQkArAICAixQdXQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgYWRtaW4uIFN0YXR1cyA9IAkApAMBBQJkcQUCZVkBAmVaAQJiVwQCZmEJAPwHBAUCYVQCBGVtaXQJAMwIAgUCYlcFA25pbAUDbmlsAwkAAAIFAmZhBQJmYQQCZmIEAmJUBQJmYQMJAAECBQJiVAIHQWRkcmVzcwQCZmMFAmJUCQD8BwQFAmZjAgRlbWl0CQDMCAIFAmJXBQNuaWwFA25pbAUEdW5pdAMJAAACBQJmYgUCZmIFAmJXCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJmZAICYlcCYWkEAmZlAwkAAAIFAmFpAAAAAAkAawMFAmJXBQJhaQUBYgkAlAoCCQBlAgUCYlcFAmZlBQJmZQECZmYEAmZnAmZoAmFiAmFjBAJmaQkAAAIFAmFjBQR1bml0BAJmagkBAmJKAQkBAmJmAQUCYm4EAmZrCQECYkoBCQECYmYBBQJibwQCZmwDCQAAAgUCZmgFAmJuBgMJAAACBQJmaAUCYm8HCQECYVEBAg1pbnZhbGlkIGFzc2V0BAJmbQMFAmZpCQCUCgIFAmZqBQJmawMFAmZsCQCUCgIJAGUCBQJmagUCZmcFAmZrCQCUCgIFAmZqCQBlAgUCZmsFAmZnBAJmbggFAmZtAl8xBAJmbwgFAmZtAl8yBAJmcAMFAmZsCQCUCgIFAmZnAAAJAJQKAgAABQJmZwQCZnEIBQJmcAJfMQQCZnIIBQJmcAJfMgQCZUkICQECZmQCBQJmcQUCYVYCXzEEAmVKCAkBAmZkAgUCZnIFAmFWAl8xBAJmcwkBAmZkAgUCZmcFAmFWBAJmdAgFAmZzAl8xBAJmZQgFAmZzAl8yBAJmdQkAZAIFAmZuBQJlSQQCZnYJAGQCBQJmbwUCZUoEAmZ3CQECYk0CCQEBRAIFAmZ2BQJicQkBAUQCBQJmdQUCYnAEAmZ4CQEBSAIFAmZ3BQFiBAJmeQMFAmZsBQJmbgUCZm8EAmZ6CQC2AgEFAmZ5BAJmQQkAtgIBCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFAmJtCQCsAgIJAKwCAgIGYXNzZXQgCQDYBAEFAmJtAg4gZG9lc24ndCBleGlzdAhxdWFudGl0eQQCZkIDCQC/AgIFAmZBBQFmBgkBAmFRAQIiaW5pdGlhbCBkZXBvc2l0IHJlcXVpcmVzIGFsbCBjb2lucwMJAAACBQJmQgUCZkIEAmZDCQC2AgEFAmZ0BAJmRAkAlgMBCQDMCAIAAAkAzAgCCQCgAwEJALoCAgkAuQICBQJmQQkAuAICCQEKc3FydEJpZ0ludAQJALcCAgUBZAkAugICCQC5AgIFAmZDBQFkBQJmegASABIFBERPV04FAWQFAWQFA25pbAQCZWwDBQJmaQUDbmlsCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBVwAFAmZ4CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBWAIFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFAmZ4CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYQIJAKUIAQkBBXZhbHVlAQUCYWIJANgEAQkBBXZhbHVlAQUCYWMJAQJidQoFAmZxBQJmcgUCZkQFAmZ4AAAAAAUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAAAAAAFA25pbAQCZkUJAQJiTQIJAQFEAgUCZm8FAmJxCQEBRAIFAmZuBQJicAQCZkYJAQFIAgUCZkUFAWIEAmZHBAJmSAMFAmZsCQCUCgIFAmZxBQJmbgkAlAoCBQJmcgUCZm8EAmJXCAUCZkgCXzEEAmZJCAUCZkgCXzIEAmZKCQCgAwEJALwCAwUCZkEJALYCAQkAaQIFAmJXAAIJALYCAQUCZkkJAGsDCQBlAgUCZkQFAmZKBQFiBQJmSgkAlwoFBQJmRAUCZWwFAmZlBQJmRwUCZmwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAmZLBQJmTAJmdAJmaAJhYgJhYwQCZmkJAAACBQJhYwUEdW5pdAQCZGEJAQJiYQAEAmRiCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZGEFAXQEAmRjCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZGEFAXUEAmZNCQDMCAIDCQAAAgUCZmgFAmJtBgkBAmFRAQIQaW52YWxpZCBscCBhc3NldAUDbmlsAwkAAAIFAmZNBQJmTQQCZk4DCQAAAgUCZkwFAmJuBgMJAAACBQJmTAUCYm8HCQECYVEBAg1pbnZhbGlkIGFzc2V0BAJmTwMFAmZOCQC2AgEJAQJiSgEJAQJiZgEFAmJuCQC2AgEJAQJiSgEJAQJiZgEFAmJvBAJmUAMFAmZOBQJkYgUCZGMEAmZRCQECYkoBCQECYmYBBQJibgQCZlIJAQJiSgEJAQJiZgEFAmJvBAJmUwMFAmZOBQJmUQUCZlIEAmZUCQC2AgEFAmZTBAJmQQkAtgIBCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFAmJtCQCsAgIJAKwCAgIGYXNzZXQgCQDYBAEFAmJtAg4gZG9lc24ndCBleGlzdAhxdWFudGl0eQQCZlUJALYCAQUCZnQEAmZWCQCWAwEJAMwIAgAACQDMCAIJAKADAQkAugICCQC5AgIFAmZPCQC4AgIFAWQJAHYGCQC4AgIFAWQJALoCAgkAuQICBQJmVQUBZAUCZkEAEgUBaAAAABIFBERPV04FAWQFA25pbAQCZlcJAQJmZAIFAmZWBQJhWAQCZlgIBQJmVwJfMQQCZmUIBQJmVwJfMgQCZlkDBQJmTgkAlgoEBQJmWAAACQBlAgUCZlEFAmZWBQJmUgkAlgoEAAAFAmZYBQJmUQkAZQIFAmZSBQJmVgQCZloIBQJmWQJfMQQCZ2EIBQJmWQJfMgQCZ2IIBQJmWQJfMwQCZ2MIBQJmWQJfNAQCZncJAQJiTQIJAQFEAgUCZ2MFAmJxCQEBRAIFAmdiBQJicAQCZngJAQFIAgUCZncFAWIEAmVsAwUCZmkFA25pbAkAzAgCCQELU3RyaW5nRW50cnkCCQECYWQCCQClCAEJAQV2YWx1ZQEFAmFiCQDYBAEJAQV2YWx1ZQEFAmFjCQECYkYGBQJmWgUCZ2EFAmZ0BQJmeAUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVcABQJmeAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVgCBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQJmeAUDbmlsBAJmRQkBAmJNAgkBAUQCBQJmUgUCYnEJAQFEAgUCZlEFAmJwBAJmRgkBAUgCBQJmRQUBYgQCZkcEAmdkCQBoAgkAoAMBCQC8AgMFAmZPBQJmVQUCZkEAAgkAawMJAGUCBQJmWAUCZ2QFAWIFAmdkCQCXCgUFAmZYBQJlbAUCZmUFAmZHBQJmTgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECZ2UABAJiVAkAoggBCQEBVQADCQABAgUCYlQCBlN0cmluZwQCZ2YFAmJUCQDZBAEFAmdmAwkAAQIFAmJUAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IBAmdnAAQCYlQJAKIIAQkBAVYAAwkAAQIFAmJUAgZTdHJpbmcEAmdmBQJiVAkA2QQBBQJnZgMJAAECBQJiVAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAQJnaAECZVMEAmJUCQECZ2UAAwkAAQIFAmJUAgpCeXRlVmVjdG9yBAJnaQUCYlQJAAACCAUCZVMPY2FsbGVyUHVibGljS2V5BQJnaQMJAAECBQJiVAIEVW5pdAkAAAIIBQJlUwZjYWxsZXIFBHRoaXMJAAIBAgtNYXRjaCBlcnJvcgECZ2oBAmVTBAJnawkAAgECEVBlcm1pc3Npb24gZGVuaWVkBAJiVAkBAmdlAAMJAAECBQJiVAIKQnl0ZVZlY3RvcgQCZ2kFAmJUAwkAAAIIBQJlUw9jYWxsZXJQdWJsaWNLZXkFAmdpBgUCZ2sDCQABAgUCYlQCBFVuaXQDCQAAAggFAmVTBmNhbGxlcgUEdGhpcwYFAmdrCQACAQILTWF0Y2ggZXJyb3IeAmVTAQlyZWJhbGFuY2UACQDOCAIJAQJjQQEJAQJhTQIFBHRoaXMJAQJhZQAJAQJjQQEJAQJhTQIFBHRoaXMJAQJhZgACZVMBIWNhbGN1bGF0ZUFtb3VudE91dEZvclN3YXBSRUFET05MWQMCZ2wCZ20CZ24EAmdvAwkAAAIFAmdtBwQCZ3AJAQJhTQIFBHRoaXMJAQJhZgAEAmdxCQECYU0CBQR0aGlzCQECYWUACQCUCgIFAmdwBQJncQQCZ3AJAQJhTQIFBHRoaXMJAQJhZQAEAmdxCQECYU0CBQR0aGlzCQECYWYACQCUCgIFAmdwBQJncQQCZ3AIBQJnbwJfMQQCZ3EIBQJnbwJfMgQCZ3IJAQJiSgEFAmdxBAJncwkBAmJKAQUCZ3AEAmd0CQBrAwUCZ3MFAmdsCQBkAgUCZ3IFAmdsBAJndQkAuQICCQC2AgEFAmdyCQC2AgEFAmdzBAJndgkAuQICCQC3AgIJALcCAgkAtgIBCQECYkoBBQJncQkAtgIBBQJnbAkAtgIBBQJnbgkAuAICCQC2AgEJAQJiSgEFAmdwCQC2AgEFAmd0BAJndwMJAMACAgUCZ3YFAmd1BgkAAgECFG5ldyBLIGlzIGZld2VyIGVycm9yAwkAAAIFAmd3BQJndwkAlAoCBQNuaWwFAmd0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmVTASZjYWxjdWxhdGVBbW91bnRPdXRGb3JTd2FwQW5kU2VuZFRva2VucwUCZ2wCZ20CZ3gCZ3kCZ24EAmd6CgACYVcJAPwHBAUCYVQCF2dldFN3YXBDb250cmFjdFJFQURPTkxZBQNuaWwFA25pbAMJAAECBQJhVwIGU3RyaW5nBQJhVwkAAgEJAKwCAgkAAwEFAmFXAhsgY291bGRuJ3QgYmUgY2FzdCB0byBTdHJpbmcEAmZNCQDMCAIDCQBnAggJAQV2YWx1ZQEJAJEDAggFAmVTCHBheW1lbnRzAAAGYW1vdW50BQJnbAYJAQJhUQECDFdyb25nIGFtb3VudAkAzAgCAwkAAAIIBQJlUwZjYWxsZXIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAmd6BgkBAmFRAQIRUGVybWlzc2lvbiBkZW5pZWQFA25pbAMJAAACBQJmTQUCZk0EAmVUCQEFdmFsdWUBCQCRAwIIBQJlUwhwYXltZW50cwAABAJncQkBAmJmAQgFAmVUB2Fzc2V0SWQEAmdwAwkAAAIFAmdtBwkBAmFNAgUEdGhpcwkBAmFmAAkBAmFNAgUEdGhpcwkBAmFlAAQCZ3IJAGUCCQECYkoBBQJncQgJAQV2YWx1ZQEJAJEDAggFAmVTCHBheW1lbnRzAAAGYW1vdW50BAJncwkBAmJKAQUCZ3AEAmd0CQBrAwUCZ3MFAmdsCQBkAgUCZ3IFAmdsBAJndQkAuQICCQC2AgEFAmdyCQC2AgEFAmdzBAJndgkAuQICCQC3AgIJALYCAQkBAmJKAQUCZ3EJALYCAQUCZ24JALgCAgkAtgIBCQECYkoBBQJncAkAtgIBBQJndAQCZ3cDCQDAAgIFAmd2BQJndQYJAAIBAhRuZXcgSyBpcyBmZXdlciBlcnJvcgMJAAACBQJndwUCZ3cEAmdBAwkAZwIFAmd0BQJneAYJAAIBAixFeGNoYW5nZSByZXN1bHQgaXMgZmV3ZXIgY29pbnMgdGhhbiBleHBlY3RlZAMJAAACBQJnQQUCZ0EEAmdCCQECY0EBBQJncQMJAAACBQJnQgUCZ0IEAmdDCQECY0gCBQJncAUCZ3QDCQAAAgUCZ0MFAmdDCQCUCgIJAM4IAgkAzggCBQJnQwUCZ0IJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUCZ3kFAmd0CQECYmQBBQJncAUDbmlsBQJndAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJlUwEKc2V0TWFuYWdlcgECZ0QEAmdFCQECZ2oBBQJlUwMJAAACBQJnRQUCZ0UEAmdGCQDZBAEFAmdEAwkAAAIFAmdGBQJnRgkAzAgCCQELU3RyaW5nRW50cnkCCQEBVgAFAmdEBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZVMBDmNvbmZpcm1NYW5hZ2VyAAQCZ0cJAQJnZwAEAmdIAwkBCWlzRGVmaW5lZAEFAmdHBgkAAgECEk5vIHBlbmRpbmcgbWFuYWdlcgMJAAACBQJnSAUCZ0gEAmdJAwkAAAIIBQJlUw9jYWxsZXJQdWJsaWNLZXkJAQV2YWx1ZQEFAmdHBgkAAgECG1lvdSBhcmUgbm90IHBlbmRpbmcgbWFuYWdlcgMJAAACBQJnSQUCZ0kJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVUACQDYBAEJAQV2YWx1ZQEFAmdHCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFWAAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmVTAQNwdXQCAmRHAmdKAwkAZgIAAAUCZEcJAAIBAiBJbnZhbGlkIHNsaXBwYWdlVG9sZXJhbmNlIHBhc3NlZAQCZVkJAQJlVgMFAmVTBQJkRwYEAmVpCAUCZVkCXzIEAmRuCAUCZVkCXzcEAmRFCAUCZVkCXzkEAmVqCAUCZVkDXzEwBAJlawgFAmVZA18xMQQCZ0sIBQJlWQNfMTIEAmdMCAUCZVkDXzEzBAJlVwkAtgIBCAkBBXZhbHVlAQkAkQMCCAUCZVMIcGF5bWVudHMAAAZhbW91bnQEAmVYCQC2AgEICQEFdmFsdWUBCQCRAwIIBQJlUwhwYXltZW50cwABBmFtb3VudAQCZXoJAQJlcwMFAmVXBQJlWAkAtgIBAAADCQAAAgUCZXoFAmV6BAJmYQkA/AcEBQJhVAIEZW1pdAkAzAgCBQJlaQUDbmlsBQNuaWwDCQAAAgUCZmEFAmZhBAJmYgQCYlQFAmZhAwkAAQIFAmJUAgdBZGRyZXNzBAJmYwUCYlQJAPwHBAUCZmMCBGVtaXQJAMwIAgUCZWkFA25pbAUDbmlsBQR1bml0AwkAAAIFAmZiBQJmYgQCZ00DCQBmAgUCZWoAAAkA/AcEBQJidAIDcHV0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmdLBQJlagUDbmlsBQNuaWwDCQAAAgUCZ00FAmdNBAJnTgMJAGYCBQJlawAACQD8BwQFAmJ0AgNwdXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCZ0wFAmVrBQNuaWwFA25pbAMJAAACBQJnTgUCZ04EAmdPAwUCZ0oEAmdQCQD8BwQFAmJzAgVzdGFrZQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJkbgUCZWkFA25pbAMJAAACBQJnUAUCZ1AFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUCZVMGY2FsbGVyBQJlaQUCZG4FA25pbAQCZ1EJAQJlQQMAAAAAAAADCQAAAgUCZ1EFAmdRBAJlcggFAmdRAl8yBAJnUggFAmdRAl8xBAJnUwkBAmVFAgUCZXoFAmVyAwkAAAIFAmdTBQJnUwQCZ1QJAPwHBAUEdGhpcwIJcmViYWxhbmNlBQNuaWwFA25pbAMJAAACBQJnVAUCZ1QJAM4IAgkAzggCBQJkRQUCZ08FAmdSCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmVTAQpwdXRGb3JGcmVlAQJnVQMJAGYCAAAFAmdVCQACAQIUSW52YWxpZCB2YWx1ZSBwYXNzZWQEAmVZCQECZVYDBQJlUwUCZ1UHBAJkRQgFAmVZAl85BAJlVwkAtgIBCAkBBXZhbHVlAQkAkQMCCAUCZVMIcGF5bWVudHMAAAZhbW91bnQEAmVYCQC2AgEICQEFdmFsdWUBCQCRAwIIBQJlUwhwYXltZW50cwABBmFtb3VudAQCZXoJAQJlcwMFAmVXBQJlWAkAtgIBAAADCQAAAgUCZXoFAmV6BAJnVgkBAmVBAwAAAAAAAAQCZ1IIBQJnVgJfMQQCZXIIBQJnVgJfMgQCZ1MJAQJlRQIFAmV6BQJlcgMJAAACBQJnUwUCZ1MJAM4IAgUCZEUFAmdSCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmVTAQlwdXRPbmVUa24CAmdXAmdYBAJnWQoAAmFXCQD8BwQFAmFUAihpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZFJFQURPTkxZCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQABAgUCYVcCB0Jvb2xlYW4FAmFXCQACAQkArAICCQADAQUCYVcCHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4EAmdaAwMDCQECYVkABgkAAAIFAmJsBQFsBgkAAAIFAmJsBQFuBgUCZ1kEAmZNCQDMCAIDAwkBASEBBQJnWgYJAQJnaAEFAmVTBgkBAmFRAQIhcHV0IG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IGFkbWluCQDMCAIDCQAAAgkAkAMBCAUCZVMIcGF5bWVudHMAAQYJAQJhUQECHmV4YWN0bHkgMSBwYXltZW50IGFyZSBleHBlY3RlZAUDbmlsAwkAAAIFAmZNBQJmTQQCaGEJAJEDAggFAmVTCHBheW1lbnRzAAAEAmZoCAUCaGEHYXNzZXRJZAQCZmcIBQJoYQZhbW91bnQEAmV6AwkAAAIFAmZoBQJibgkBAmVzAwkAtgIBBQJmZwkAtgIBAAAJALYCAQAAAwkAAAIFAmZoBQJibwkBAmVzAwkAtgIBAAAJALYCAQUCZmcJALYCAQAACQECYVEBAh5wYXltZW50IGFzc2V0IGlzIG5vdCBzdXBwb3J0ZWQDCQAAAgUCZXoFAmV6BAJhYggFAmVTBmNhbGxlcgQCYWMIBQJlUw10cmFuc2FjdGlvbklkBAJoYgkBAmZmBAUCZmcFAmZoBQJhYgUCYWMDCQAAAgUCaGIFAmhiBAJmbAgFAmhiAl81BAJoYwgFAmhiAl80BAJmZQgFAmhiAl8zBAJlbAgFAmhiAl8yBAJoZAgFAmhiAl8xBAJoZQMDCQBmAgUCZ1cAAAkAZgIFAmdXBQJoZAcJAQJhUQEJALkJAgkAzAgCAh9hbW91bnQgdG8gcmVjZWl2ZSBpcyBsZXNzIHRoYW4gCQDMCAIJAKQDAQUCZ1cFA25pbAIABQJoZAQCZmEJAQJlWgEFAmhlAwkAAAIFAmZhBQJmYQQCZ08DBQJnWAQCaGYJAPwHBAUCYnMCBXN0YWtlBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmJtBQJoZQUDbmlsAwkAAAIFAmhmBQJoZgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQJlUwZjYWxsZXIFAmhlBQJibQUDbmlsBAJoZwMJAGYCBQJmZQAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmFVBQJmZQUCZmgFA25pbAUDbmlsBAJoaAMJAAACBQR0aGlzBQJhVQkAlAoCAAAAAAMFAmZsCQCUCgIJAQEtAQUCZmUAAAkAlAoCAAAJAQEtAQUCZmUEAmVCCAUCaGgCXzEEAmVDCAUCaGgCXzIEAmhpCQECZUEDBQJlQgUCZUMAAAQCZ1IIBQJoaQJfMQQCZXIIBQJoaQJfMgQCZUwJAQV2YWx1ZQEJAKIIAQUCYWoEAmdTCQECZUUCBQJlegUCZXIDCQAAAgUCZ1MFAmdTBAJnVAkA/AcEBQR0aGlzAglyZWJhbGFuY2UFA25pbAUDbmlsAwkAAAIFAmdUBQJnVAkAlAoCCQDOCAIJAM4IAgkAzggCBQJlbAUCZ08FAmhnBQJnUgUCaGUJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZVMBEXB1dE9uZVRrblJFQURPTkxZAgJmaAJmZwQCaGoJAQJmZgQFAmZnCQECYmQBBQJmaAUEdW5pdAUEdW5pdAQCaGQIBQJoagJfMQQCZWwIBQJoagJfMgQCZmUIBQJoagJfMwQCaGMIBQJoagJfNAQCZmwIBQJoagJfNQkAlAoCBQNuaWwJAJUKAwUCaGQFAmZlBQJoYwJlUwEJZ2V0T25lVGtuAgJoawJnVwQCZ1kKAAJhVwkA/AcEBQJhVAIoaXNQb29sT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWRSRUFET05MWQkAzAgCCQClCAEFBHRoaXMFA25pbAUDbmlsAwkAAQIFAmFXAgdCb29sZWFuBQJhVwkAAgEJAKwCAgkAAwEFAmFXAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuBAJobAMDCQECYVkABgkAAAIFAmJsBQFuBgUCZ1kEAmZNCQDMCAIDAwkBASEBBQJobAYJAQJnaAEFAmVTBgkBAmFRAQIhZ2V0IG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IGFkbWluCQDMCAIDCQAAAgkAkAMBCAUCZVMIcGF5bWVudHMAAQYJAQJhUQECHmV4YWN0bHkgMSBwYXltZW50IGFyZSBleHBlY3RlZAUDbmlsAwkAAAIFAmZNBQJmTQQCZkwJAQJiZAEFAmhrBAJoYQkAkQMCCAUCZVMIcGF5bWVudHMAAAQCZmgIBQJoYQdhc3NldElkBAJmdAgFAmhhBmFtb3VudAQCZXoJAQJlcwMJALYCAQAACQC2AgEAAAkAtgIBAAADCQAAAgUCZXoFAmV6BAJhYggFAmVTBmNhbGxlcgQCYWMIBQJlUw10cmFuc2FjdGlvbklkBAJobQkBAmZLBQUCZkwFAmZ0BQJmaAUCYWIFAmFjAwkAAAIFAmhtBQJobQQCZk4IBQJobQJfNQQCaGMIBQJobQJfNAQCZmUIBQJobQJfMwQCZWwIBQJobQJfMgQCaG4IBQJobQJfMQQCYlcDAwkAZgIFAmdXAAAJAGYCBQJnVwUCaG4HCQECYVEBCQC5CQIJAMwIAgIfYW1vdW50IHRvIHJlY2VpdmUgaXMgbGVzcyB0aGFuIAkAzAgCCQCkAwEFAmdXBQNuaWwCAAUCaG4EAmhvCQD8BwQFAmFUAgRidXJuCQDMCAIFAmZ0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmZoBQJmdAUDbmlsAwkAAAIFAmhvBQJobwQCZ0MJAQJjSAIFAmhrCQBkAgUCYlcJAJYDAQkAzAgCAAAJAMwIAgUCZmUFA25pbAQCaHAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUCYWIFAmJXBQJmTAUDbmlsBAJoZwMJAGYCBQJmZQAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmFVBQJmZQUCZkwFA25pbAUDbmlsBAJocQQCaHIDCQAAAgUEdGhpcwUCYVUAAAUCZmUDBQJmTgkAlAoCCQEBLQEJAGQCBQJiVwUCaHIAAAkAlAoCAAAJAQEtAQkAZAIFAmJXBQJocgQCZUIIBQJocQJfMQQCZUMIBQJocQJfMgQCaHMJAQJlQQMFAmVCBQJlQwAABAJnUggFAmhzAl8xBAJlcggFAmhzAl8yBAJnUwkBAmVFAgUCZXoFAmVyAwkAAAIFAmdTBQJnUwkAlAoCCQDOCAIJAM4IAgkAzggCCQDOCAIFAmVsBQJnQwUCaHAFAmhnBQJnUgUCYlcJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZVMBEWdldE9uZVRrblJFQURPTkxZAgJmTAJmdAQCaHQJAQJmSwUJAQJiZAEFAmZMBQJmdAUCYm0FBHVuaXQFBHVuaXQEAmhuCAUCaHQCXzEEAmVsCAUCaHQCXzIEAmZlCAUCaHQCXzMEAmhjCAUCaHQCXzQEAmZOCAUCaHQCXzUJAJQKAgUDbmlsCQCVCgMFAmhuBQJmZQUCaGMCZVMBE3Vuc3Rha2VBbmRHZXRPbmVUa24DAmh1AmhrAmdXBAJnWQoAAmFXCQD8BwQFAmFUAihpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZFJFQURPTkxZCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQABAgUCYVcCB0Jvb2xlYW4FAmFXCQACAQkArAICCQADAQUCYVcCHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4EAmhsAwMJAQJhWQAGCQAAAgUCYmwFAW4GBQJnWQQCZk0JAMwIAgMDCQEBIQEFAmhsBgkBAmdoAQUCZVMGCQECYVEBAiFnZXQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgYWRtaW4JAMwIAgMJAAACCQCQAwEIBQJlUwhwYXltZW50cwAABgkBAmFRAQIYbm8gcGF5bWVudHMgYXJlIGV4cGVjdGVkBQNuaWwDCQAAAgUCZk0FAmZNBAJmTAkBAmJkAQUCaGsEAmFiCAUCZVMGY2FsbGVyBAJhYwgFAmVTDXRyYW5zYWN0aW9uSWQEAmV6CQECZXMDCQC2AgEAAAkAtgIBAAAJALYCAQAAAwkAAAIFAmV6BQJlegQCaHYJAPwHBAUCYnMCB3Vuc3Rha2UJAMwIAgkA2AQBBQJibQkAzAgCBQJodQUDbmlsBQNuaWwDCQAAAgUCaHYFAmh2BAJodwkBAmZLBQUCZkwFAmh1BQJibQUCYWIFAmFjAwkAAAIFAmh3BQJodwQCZk4IBQJodwJfNQQCaGMIBQJodwJfNAQCZmUIBQJodwJfMwQCZWwIBQJodwJfMgQCaG4IBQJodwJfMQQCYlcDAwkAZgIFAmdXAAAJAGYCBQJnVwUCaG4HCQECYVEBCQC5CQIJAMwIAgIfYW1vdW50IHRvIHJlY2VpdmUgaXMgbGVzcyB0aGFuIAkAzAgCCQCkAwEFAmdXBQNuaWwCAAUCaG4EAmhvCQD8BwQFAmFUAgRidXJuCQDMCAIFAmh1BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmJtBQJodQUDbmlsAwkAAAIFAmhvBQJobwQCZ0MJAQJjSAIFAmhrCQBkAgUCYlcJAJYDAQkAzAgCAAAJAMwIAgUCZmUFA25pbAQCaHAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAmVTBmNhbGxlcgUCYlcFAmZMBQNuaWwEAmhnAwkAZgIFAmZlAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUCYVUFAmZlBQJmTAUDbmlsBQNuaWwEAmh4BAJocgMJAAACBQR0aGlzBQJhVQAABQJmZQMFAmZOCQCUCgIJAQEtAQkAZAIFAmJXBQJocgAACQCUCgIAAAkBAS0BCQBkAgUCYlcFAmhyBAJlQggFAmh4Al8xBAJlQwgFAmh4Al8yBAJoeQkBAmVBAwUCZUIFAmVDAAAEAmdSCAUCaHkCXzEEAmVyCAUCaHkCXzIEAmdTCQECZUUCBQJlegUCZXIDCQAAAgUCZ1MFAmdTCQCUCgIJAM4IAgkAzggCCQDOCAIJAM4IAgUCZWwFAmdDBQJocAUCaGcFAmdSBQJiVwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJlUwEDZ2V0AAQCZFcJAQJlUgEFAmVTBAJkQwgFAmRXAl8xBAJkRAgFAmRXAl8yBAJlVQgFAmRXAl8zBAJkbAgFAmRXAl80BAJkRQgFAmRXAl81BAJnQwkBAmNNAgUCZEMFAmREBAJlegkBAmVzAwkAtgIBAAAJALYCAQAACQC2AgEAAAMJAAACBQJlegUCZXoEAmh6CQD8BwQFAmFUAgRidXJuCQDMCAIFAmVVBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmRsBQJlVQUDbmlsAwkAAAIFAmh6BQJoegQCaEEJAQJlQQMJAQEtAQUCZEMJAQEtAQUCZEQAAAQCZ1IIBQJoQQJfMQQCZXIIBQJoQQJfMgQCZ1MJAQJlRQIFAmV6BQJlcgMJAAACBQJnUwUCZ1MJAM4IAgkAzggCBQJnQwUCZEUFAmdSCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmVTAQlnZXROb0xlc3MCAmhCAmhDBAJkVwkBAmVSAQUCZVMEAmRDCAUCZFcCXzEEAmRECAUCZFcCXzIEAmVVCAUCZFcCXzMEAmRsCAUCZFcCXzQEAmRFCAUCZFcCXzUDCQBmAgUCaEIFAmRDCQACAQkArAICCQCsAgIJAKwCAgIcbm9MZXNzVGhlbkFtdEFzc2V0IGZhaWxlZDogIAkApAMBBQJkQwIDIDwgCQCkAwEFAmhCAwkAZgIFAmhDBQJkRAkAAgEJAKwCAgkArAICCQCsAgICHW5vTGVzc1RoZW5QcmljZUFzc2V0IGZhaWxlZDogCQCkAwEFAmREAgMgPCAJAKQDAQUCaEMEAmdDCQECY00CBQJkQwUCZEQEAmV6CQECZXMDCQC2AgEAAAkAtgIBAAAJALYCAQAAAwkAAAIFAmV6BQJlegQCaHoJAPwHBAUCYVQCBGJ1cm4JAMwIAgUCZVUFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCZGwFAmVVBQNuaWwDCQAAAgUCaHoFAmh6BAJoRAkBAmVBAwkBAS0BBQJkQwkBAS0BBQJkRAAABAJnUggFAmhEAl8xBAJlcggFAmhEAl8yBAJnUwkBAmVFAgUCZXoFAmVyAwkAAAIFAmdTBQJnUwkAzggCCQDOCAIFAmdDBQJkRQUCZ1IJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZVMBDXVuc3Rha2VBbmRHZXQBAmJXBAJoRQMJAQIhPQIJAJADAQgFAmVTCHBheW1lbnRzAAAJAAIBAhhObyBwYXltZW50cyBhcmUgZXhwZWN0ZWQGAwkAAAIFAmhFBQJoRQQCZGEJAQJiYQAEAmRuCQDZBAEJAJEDAgUCZGEFAXEEAmV6CQECZXMDCQC2AgEAAAkAtgIBAAAJALYCAQAAAwkAAAIFAmV6BQJlegQCaHYJAPwHBAUCYnMCB3Vuc3Rha2UJAMwIAgkA2AQBBQJkbgkAzAgCBQJiVwUDbmlsBQNuaWwDCQAAAgUCaHYFAmh2BAJkVwkBAmRqBAkA2AQBCAUCZVMNdHJhbnNhY3Rpb25JZAkA2AQBBQJkbgUCYlcIBQJlUwZjYWxsZXIEAmRDCAUCZFcCXzEEAmRECAUCZFcCXzIEAmRxCQENcGFyc2VJbnRWYWx1ZQEIBQJkVwJfOQQCZEUIBQJkVwNfMTAEAmdDCQECY00CBQJkQwUCZEQEAmhGAwMJAQJhWQAGCQAAAgUCZHEFAW4JAAIBCQCsAgICLEdldCBvcGVyYXRpb24gaXMgYmxvY2tlZCBieSBhZG1pbi4gU3RhdHVzID0gCQCkAwEFAmRxBgMJAAACBQJoRgUCaEYEAmh6CQD8BwQFAmFUAgRidXJuCQDMCAIFAmJXBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmRuBQJiVwUDbmlsAwkAAAIFAmh6BQJoegQCaEcJAQJlQQMJAQEtAQUCZEMJAQEtAQUCZEQAAAQCZ1IIBQJoRwJfMQQCZXIIBQJoRwJfMgQCZ1MJAQJlRQIFAmV6BQJlcgMJAAACBQJnUwUCZ1MJAM4IAgkAzggCBQJnQwUCZEUFAmdSCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmVTARN1bnN0YWtlQW5kR2V0Tm9MZXNzAwJodQJoSAJoQwQCaGwDCQECYVkABgkAAAIFAmJsBQFuBAJmTQkAzAgCAwkBASEBBQJobAYJAAIBAiFnZXQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgYWRtaW4JAMwIAgMJAAACCQCQAwEIBQJlUwhwYXltZW50cwAABgkAAgECGG5vIHBheW1lbnRzIGFyZSBleHBlY3RlZAUDbmlsAwkAAAIFAmZNBQJmTQQCZXoJAQJlcwMJALYCAQAACQC2AgEAAAkAtgIBAAADCQAAAgUCZXoFAmV6BAJodgkA/AcEBQJicwIHdW5zdGFrZQkAzAgCCQDYBAEFAmJtCQDMCAIFAmh1BQNuaWwFA25pbAMJAAACBQJodgUCaHYEAmRXCQECZGoECQDYBAEIBQJlUw10cmFuc2FjdGlvbklkCQDYBAEFAmJtBQJodQgFAmVTBmNhbGxlcgQCZEMIBQJkVwJfMQQCZEQIBQJkVwJfMgQCZEUIBQJkVwNfMTAEAmdDCQECY00CBQJkQwUCZEQEAmhJCQDMCAIDCQBnAgUCZEMFAmhIBgkAAgEJALkJAgkAzAgCAixhbW91bnQgYXNzZXQgYW1vdW50IHRvIHJlY2VpdmUgaXMgbGVzcyB0aGFuIAkAzAgCCQCkAwEFAmhIBQNuaWwCAAkAzAgCAwkAZwIFAmREBQJoQwYJAAIBCQC5CQIJAMwIAgIrcHJpY2UgYXNzZXQgYW1vdW50IHRvIHJlY2VpdmUgaXMgbGVzcyB0aGFuIAkAzAgCCQCkAwEFAmhDBQNuaWwCAAUDbmlsAwkAAAIFAmhJBQJoSQQCaHoJAPwHBAUCYVQCBGJ1cm4JAMwIAgUCaHUFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCYm0FAmh1BQNuaWwDCQAAAgUCaHoFAmh6BAJoSgkBAmVBAwkBAS0BBQJkQwkBAS0BBQJkRAAABAJnUggFAmhKAl8xBAJlcggFAmhKAl8yBAJnUwkBAmVFAgUCZXoFAmVyAwkAAAIFAmdTBQJnUwkAzggCCQDOCAIFAmdDBQJkRQUCZ1IJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZVMBCGFjdGl2YXRlAgJoSwJoTAMJAQIhPQIJAKUIAQgFAmVTBmNhbGxlcgkApQgBBQJhVAkAAgECEnBlcm1pc3Npb25zIGRlbmllZAkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhZQAFAmhLCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhZgAFAmhMBQNuaWwCB3N1Y2Nlc3MCZVMBCnJlZnJlc2hLTHAABAJoTQkBC3ZhbHVlT3JFbHNlAgkAnwgBBQJhawAABAJoTgMJAGcCCQBlAgUGaGVpZ2h0BQJoTQUCYW4FBHVuaXQJAQJhUQEJALkJAgkAzAgCCQCkAwEFAmFuCQDMCAICLyBibG9ja3MgaGF2ZSBub3QgcGFzc2VkIHNpbmNlIHRoZSBwcmV2aW91cyBjYWxsBQNuaWwCAAMJAAACBQJoTgUCaE4EAmVMCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKgDAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQJhagIBMAkBAmFTAQILaW52YWxpZCBrTHAEAmhPCQECZUEDAAAAAAAABAJoUAgFAmhPAl8xBAJlcggFAmhPAl8yBAJlRAMJAQIhPQIFAmVMBQJlcgUCaFAJAQJhUQECEm5vdGhpbmcgdG8gcmVmcmVzaAkAlAoCBQJlRAkApgMBBQJlcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJlUwEcZ2V0UG9vbENvbmZpZ1dyYXBwZXJSRUFET05MWQAJAJQKAgUDbmlsCQECYmEAAmVTARxnZXRBY2NCYWxhbmNlV3JhcHBlclJFQURPTkxZAQJhcAkAlAoCBQNuaWwJAQJiSgEFAmFwAmVTARljYWxjUHJpY2VzV3JhcHBlclJFQURPTkxZAwJjVQJjVgJjWgQCZGkJAQJjWQMFAmNVBQJjVgUCY1oJAJQKAgUDbmlsCQDMCAIJAKYDAQkAkQMCBQJkaQAACQDMCAIJAKYDAQkAkQMCBQJkaQABCQDMCAIJAKYDAQkAkQMCBQJkaQACBQNuaWwCZVMBFHRvWDE4V3JhcHBlclJFQURPTkxZAgFFAUYJAJQKAgUDbmlsCQCmAwEJAQFEAgUBRQUBRgJlUwEWZnJvbVgxOFdyYXBwZXJSRUFET05MWQIBSQFKCQCUCgIFA25pbAkBAUgCCQCnAwEFAUkFAUoCZVMBHmNhbGNQcmljZUJpZ0ludFdyYXBwZXJSRUFET05MWQICYk4CYk8JAJQKAgUDbmlsCQCmAwEJAQJiTQIJAKcDAQUCYk4JAKcDAQUCYk8CZVMBI2VzdGltYXRlUHV0T3BlcmF0aW9uV3JhcHBlclJFQURPTkxZCQJkawJkRwJkSAJkSQJkSgJkSwJhYgJkTAJkTQkAlAoCBQNuaWwJAQJkRgkFAmRrBQJkRwUCZEgFAmRJBQJkSgUCZEsFAmFiBQJkTAUCZE0CZVMBI2VzdGltYXRlR2V0T3BlcmF0aW9uV3JhcHBlclJFQURPTkxZBAJkawJkbAJkbQJhYgQCZFcJAQJkagQFAmRrBQJkbAUCZG0JARFAZXh0ck5hdGl2ZSgxMDYyKQEFAmFiCQCUCgIFA25pbAkAnAoKCAUCZFcCXzEIBQJkVwJfMggFAmRXAl8zCAUCZFcCXzQIBQJkVwJfNQgFAmRXAl82CAUCZFcCXzcJAKYDAQgFAmRXAl84CAUCZFcCXzkIBQJkVwNfMTACZVMBDXN0YXRzUkVBRE9OTFkABAJkYQkBAmJhAAQCZG4JANkEAQkAkQMCBQJkYQUBcQQCaFEJAJEDAgUCZGEFAXIEAmhSCQCRAwIFAmRhBQFzBAJkUAkAkQMCBQJkYQUBdgQCZFEJAJEDAgUCZGEFAXcEAmRiCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZGEFAXQEAmRjCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZGEFAXUEAmhTCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFAmRuCQCsAgIJAKwCAgIGQXNzZXQgCQDYBAEFAmRuAg4gZG9lc24ndCBleGlzdAhxdWFudGl0eQQCaFQJAQJiSgEFAmhRBAJoVQkBAmJKAQUCaFIEAmhWAwkAAAIFAmhTAAAJAMwIAgUBZQkAzAgCBQFlCQDMCAIFAWUFA25pbAkBAmNZAwUCaFQFAmhVBQJoUwQCZHgAAAQCaFcJAQFIAgkAkQMCBQJoVgABBQFiBAJoWAkBAUgCCQCRAwIFAmhWAAIFAWIEAmhZCQEFdmFsdWUBCQCaCAIFAmFUCQECYUQBCQClCAEFBHRoaXMJAJQKAgUDbmlsCQC5CQIJAMwIAgIOJWQlZCVkJWQlZCVkJWQJAMwIAgkApAMBBQJoVAkAzAgCCQCkAwEFAmhVCQDMCAIJAKQDAQUCaFMJAMwIAgkApAMBBQJkeAkAzAgCCQCkAwEFAmhXCQDMCAIJAKQDAQUCaFgJAMwIAgkApAMBBQJoWQUDbmlsBQFqAmVTASBldmFsdWF0ZVB1dEJ5QW1vdW50QXNzZXRSRUFET05MWQECZEgEAmRhCQECYmEABAJkbgkA2QQBCQCRAwIFAmRhBQFxBAJkTgkAkQMCBQJkYQUBcgQCZG8JANkEAQUCZE4EAmRPCQCRAwIFAmRhBQFzBAJkcAkA2QQBBQJkTwQCZGIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJkYQUBdAQCZGMJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJkYQUBdQQCZHEJAJEDAgUCZGEFAXAEAmhTCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFAmRuCQCsAgIJAKwCAgIGQXNzZXQgCQDYBAEFAmRuAg4gZG9lc24ndCBleGlzdAhxdWFudGl0eQQCaFQJAQJiSgEFAmROBAJoVQkBAmJKAQUCZE8EAmNXCQEBRAIFAmhUBQJkYgQCY1gJAQFEAgUCaFUFAmRjBAJkdwMJAAACBQJoUwAABQFlCQECYk0CBQJjWAUCY1cEAmRUCQEBRAIFAmRIBQJkYgQCZFUJALwCAwUCZFQFAmR3BQFkBAJkSgkBAUgCBQJkVQUCZGMEAmVZCQECZEYJAgAAoMIeBQJkSAUCZG8FAmRKBQJkcAIABgcEAmVlCAUCZVkCXzEEAmhaCAUCZVkCXzMEAmRzCAUCZVkCXzQEAmR1CAUCZVkCXzUEAmRyCAUCZVkCXzYJAJQKAgUDbmlsCQC5CQIJAMwIAgIQJWQlZCVkJWQlZCVkJWQlZAkAzAgCCQCkAwEFAmVlCQDMCAIJAKQDAQkBAUgCBQJkdwUBYgkAzAgCCQCkAwEFAmRzCQDMCAIJAKQDAQUCZHUJAMwIAgkApAMBBQJkcgkAzAgCBQJkcQkAzAgCCQCkAwEFAmRICQDMCAIJAKQDAQUCZEoFA25pbAUBagJlUwEfZXZhbHVhdGVQdXRCeVByaWNlQXNzZXRSRUFET05MWQECZEoEAmRhCQECYmEABAJkbgkA2QQBCQCRAwIFAmRhBQFxBAJkTgkAkQMCBQJkYQUBcgQCZG8JANkEAQUCZE4EAmRPCQCRAwIFAmRhBQFzBAJkcAkA2QQBBQJkTwQCZGIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJkYQUBdAQCZGMJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJkYQUBdQQCZHEJAJEDAgUCZGEFAXAEAmhTCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFAmRuCQCsAgIJAKwCAgIGQXNzZXQgCQDYBAEFAmRuAg4gZG9lc24ndCBleGlzdAhxdWFudGl0eQQCaWEJAQJiSgEFAmROBAJpYgkBAmJKAQUCZE8EAmljCQEBRAIFAmlhBQJkYgQCaWQJAQFEAgUCaWIFAmRjBAJkdwMJAAACBQJoUwAABQFlCQECYk0CBQJpZAUCaWMEAmRVCQEBRAIFAmRKBQJkYwQCZFQJALwCAwUCZFUFAWQFAmR3BAJkSAkBAUgCBQJkVAUCZGIEAmVZCQECZEYJAgAAoMIeBQJkSAUCZG8FAmRKBQJkcAIABgcEAmVlCAUCZVkCXzEEAmhaCAUCZVkCXzMEAmRzCAUCZVkCXzQEAmR1CAUCZVkCXzUEAmRyCAUCZVkCXzYJAJQKAgUDbmlsCQC5CQIJAMwIAgIQJWQlZCVkJWQlZCVkJWQlZAkAzAgCCQCkAwEFAmVlCQDMCAIJAKQDAQkBAUgCBQJkdwUBYgkAzAgCCQCkAwEFAmRzCQDMCAIJAKQDAQUCZHUJAMwIAgkApAMBBQJkcgkAzAgCBQJkcQkAzAgCCQCkAwEFAmRICQDMCAIJAKQDAQUCZEoFA25pbAUBagJlUwETZXZhbHVhdGVHZXRSRUFET05MWQICaWUCaWYEAmRXCQECZGoEAgAFAmllBQJpZgUEdGhpcwQCZEMIBQJkVwJfMQQCZEQIBQJkVwJfMgQCZHMIBQJkVwJfNQQCZHUIBQJkVwJfNgQCZHIIBQJkVwJfNwQCZHgIBQJkVwJfOAQCZHEJAQ1wYXJzZUludFZhbHVlAQgFAmRXAl85CQCUCgIFA25pbAkAuQkCCQDMCAICDiVkJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQUCZEMJAMwIAgkApAMBBQJkRAkAzAgCCQCkAwEFAmRzCQDMCAIJAKQDAQUCZHUJAMwIAgkApAMBBQJkcgkAzAgCCQCmAwEFAmR4CQDMCAIJAKQDAQUCZHEFA25pbAUBagECaWcBAmloAAQCaWkEAmJUCQECZ2UAAwkAAQIFAmJUAgpCeXRlVmVjdG9yBAJnaQUCYlQFAmdpAwkAAQIFAmJUAgRVbml0CAUCaWcPc2VuZGVyUHVibGljS2V5CQACAQILTWF0Y2ggZXJyb3IEAmJUBQJpZwMJAAECBQJiVAIFT3JkZXIEAmVIBQJiVAQCaWoJAQJhWgAEAmlrCQECZUcBBQJlSAQCYUkIBQJpawJfMQQCYUoIBQJpawJfMgQCYUsJAPQDAwgFAmVICWJvZHlCeXRlcwkAkQMCCAUCZUgGcHJvb2ZzAAAIBQJlSA9zZW5kZXJQdWJsaWNLZXkEAmFMCQD0AwMIBQJlSAlib2R5Qnl0ZXMJAJEDAggFAmVIBnByb29mcwABBQJpagMDAwUCYUkFAmFLBwUCYUwHBgkBAmFIBAUCYUkFAmFKBQJhSwUCYUwDCQABAgUCYlQCFFNldFNjcmlwdFRyYW5zYWN0aW9uBAJnZgUCYlQDCQD0AwMIBQJpZwlib2R5Qnl0ZXMJAJEDAggFAmlnBnByb29mcwAABQJpaQYEAmlsCQD2AwEJAQV2YWx1ZQEIBQJnZgZzY3JpcHQEAmltCQDbBAEJAQV2YWx1ZQEJAJ0IAgUCYVQJAQJhRgAEAmluCQDxBwEFBHRoaXMDCQAAAgUCaW0FAmlsCQECIT0CBQJpbgUCaWwHCQD0AwMIBQJpZwlib2R5Qnl0ZXMJAJEDAggFAmlnBnByb29mcwAABQJpaQh2GPI=", "height": 3599550, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 5Wb5KNm5xVeRQtFXmXpvE1pzQSpJTiptjFdhYdNk12Se Next: FuLzmJKimNgjqvspr85YvHJBWqB14X3ePPdNHAnUyob3 Diff:
OldNewDifferences
130130
131131 let kLpRefreshDelay = valueOrElse(getInteger(this, keyKLpRefreshDelay), kLpRefreshDelayDefault)
132132
133+func keyAdditionalBalance (assetId) = makeString(["%s%s", "stakedBalance", assetId], SEP)
134+
135+
136+func keyStakingAssetBalance (assetId) = makeString(["%s%s", "shareAssetBalance", assetId], SEP)
137+
138+
139+func getAdditionalBalanceOrZero (assetId) = valueOrElse(getInteger(this, keyAdditionalBalance(assetId)), 0)
140+
141+
142+func getStakingAssetBalanceOrZero (assetId) = valueOrElse(getInteger(this, keyStakingAssetBalance(assetId)), 0)
143+
144+
133145 func keyFactoryConfig () = "%s__factoryConfig"
134146
135147
219231
220232 let poolConfigParsed = parsePoolConfig(getPoolConfig())
221233
222-let $t084698635 = poolConfigParsed
234+let $t089629128 = poolConfigParsed
223235
224-let cfgPoolAddress = $t084698635._1
236+let cfgPoolAddress = $t089629128._1
225237
226-let cfgPoolStatus = $t084698635._2
238+let cfgPoolStatus = $t089629128._2
227239
228-let cfgLpAssetId = $t084698635._3
240+let cfgLpAssetId = $t089629128._3
229241
230-let cfgAmountAssetId = $t084698635._4
242+let cfgAmountAssetId = $t089629128._4
231243
232-let cfgPriceAssetId = $t084698635._5
244+let cfgPriceAssetId = $t089629128._5
233245
234-let cfgAmountAssetDecimals = $t084698635._6
246+let cfgAmountAssetDecimals = $t089629128._6
235247
236-let cfgPriceAssetDecimals = $t084698635._7
248+let cfgPriceAssetDecimals = $t089629128._7
237249
238250 func getFactoryConfig () = split(getStringOrFail(factoryContract, keyFactoryConfig()), SEP)
239251
248260 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)
249261
250262
251-func getAccBalance (assetId) = if ((assetId == "WAVES"))
252- then wavesBalance(this).available
253- else assetBalance(this, fromBase58String(assetId))
263+func getAccBalance (assetId) = {
264+ let balanceOnPool = if ((assetId == "WAVES"))
265+ then wavesBalance(this).available
266+ else assetBalance(this, fromBase58String(assetId))
267+ let totalBalance = ((balanceOnPool + getAdditionalBalanceOrZero(assetId)) - getStakingAssetBalanceOrZero(assetId))
268+ max([0, totalBalance])
269+ }
254270
255271
256272 func calcPriceBigInt (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
257273
258274
259275 func calcPriceBigIntRound (prAmtX18,amAmtX18,round) = fraction(prAmtX18, scale18, amAmtX18, round)
276+
277+
278+func getRate (proxy) = {
279+ let inv = invoke(proxy, "getRate", nil, nil)
280+ if ((inv == inv))
281+ then match inv {
282+ case r: Int =>
283+ r
284+ case _ =>
285+ throwErr("proxy.getRate() unexpected value")
286+ }
287+ else throw("Strict value is not equal to itself.")
288+ }
289+
290+
291+func deposit (assetId,amount,stakingAssetId,proxy) = {
292+ let currentAdditionalBalance = getAdditionalBalanceOrZero(assetId)
293+ if ((currentAdditionalBalance == currentAdditionalBalance))
294+ then {
295+ let currentStakingAssetBalance = getStakingAssetBalanceOrZero(stakingAssetId)
296+ if ((currentStakingAssetBalance == currentStakingAssetBalance))
297+ then {
298+ let asset = parseAssetId(assetId)
299+ if ((amount > 0))
300+ then {
301+ let depositInvoke = invoke(proxy, "deposit", nil, [AttachedPayment(asset, amount)])
302+ if ((depositInvoke == depositInvoke))
303+ then match depositInvoke {
304+ case receivedStakingAsset: Int =>
305+ let newAdditionalBalance = (currentAdditionalBalance + amount)
306+ let newStakingAssetBalance = (currentStakingAssetBalance + receivedStakingAsset)
307+[IntegerEntry(keyAdditionalBalance(assetId), newAdditionalBalance), IntegerEntry(keyStakingAssetBalance(stakingAssetId), newStakingAssetBalance)]
308+ case _ =>
309+ nil
310+ }
311+ else throw("Strict value is not equal to itself.")
312+ }
313+ else nil
314+ }
315+ else throw("Strict value is not equal to itself.")
316+ }
317+ else throw("Strict value is not equal to itself.")
318+ }
319+
320+
321+func withdraw (assetId,amount,stakingAssetId,proxy,proxyRateMul,profitAddress) = {
322+ let currentAdditionalBalance = getAdditionalBalanceOrZero(assetId)
323+ if ((currentAdditionalBalance == currentAdditionalBalance))
324+ then {
325+ let currentStakingAssetBalance = getStakingAssetBalanceOrZero(stakingAssetId)
326+ if ((currentStakingAssetBalance == currentStakingAssetBalance))
327+ then {
328+ let currentProxyRate = getRate(proxy)
329+ if ((currentProxyRate == currentProxyRate))
330+ then {
331+ let oldRate = fraction(proxyRateMul, currentAdditionalBalance, currentStakingAssetBalance)
332+ let stakingAsset = parseAssetId(stakingAssetId)
333+ let oldSendStakingAmount = fraction(proxyRateMul, amount, oldRate)
334+ let sendStakingAssetAmount = fraction(proxyRateMul, amount, currentProxyRate)
335+ let profitAmount = max([0, (oldSendStakingAmount - sendStakingAssetAmount)])
336+ if ((sendStakingAssetAmount > 0))
337+ then {
338+ let withdrawInvoke = invoke(proxy, "withdraw", nil, [AttachedPayment(stakingAsset, sendStakingAssetAmount)])
339+ if ((withdrawInvoke == withdrawInvoke))
340+ then match withdrawInvoke {
341+ case receivedAssets: Int =>
342+ let newAdditionalBalance = (currentAdditionalBalance - receivedAssets)
343+ let newStakingAssetBalance = ((currentStakingAssetBalance - sendStakingAssetAmount) - profitAmount)
344+[IntegerEntry(keyAdditionalBalance(assetId), newAdditionalBalance), IntegerEntry(keyStakingAssetBalance(stakingAssetId), newStakingAssetBalance), ScriptTransfer(profitAddress, profitAmount, parseAssetId(stakingAssetId))]
345+ case _ =>
346+ nil
347+ }
348+ else throw("Strict value is not equal to itself.")
349+ }
350+ else nil
351+ }
352+ else throw("Strict value is not equal to itself.")
353+ }
354+ else throw("Strict value is not equal to itself.")
355+ }
356+ else throw("Strict value is not equal to itself.")
357+ }
358+
359+
360+func getLeaseProxyConfig (assetId) = match invoke(factoryContract, "getPoolLeaseConfigREADONLY", [toString(this), assetId], nil) {
361+ case a: (Boolean, Int, Int, String, String, Int, String) =>
362+ a
363+ case _ =>
364+ throwErr((("[" + assetId) + "] getLeaseProxyConfig() error"))
365+}
366+
367+
368+func rebalanceInternal (targetRatio,assetId,stakingAssetId,minBalance,proxy,proxyRateMul,profitAddress) = {
369+ let currentAdditionalBalance = getAdditionalBalanceOrZero(assetId)
370+ if ((currentAdditionalBalance == currentAdditionalBalance))
371+ then {
372+ let currentStakingAssetBalance = getStakingAssetBalanceOrZero(stakingAssetId)
373+ if ((currentStakingAssetBalance == currentStakingAssetBalance))
374+ then {
375+ let leasableTotalBalance = max([0, (getAccBalance(assetId) - minBalance)])
376+ let targetAdditionalBalance = fraction(targetRatio, leasableTotalBalance, 100)
377+ let diff = (currentAdditionalBalance - targetAdditionalBalance)
378+ if ((diff == 0))
379+ then nil
380+ else if ((0 > diff))
381+ then {
382+ let sendAssetAmount = -(diff)
383+ deposit(assetId, sendAssetAmount, stakingAssetId, proxy)
384+ }
385+ else {
386+ let getAssetAmount = diff
387+ withdraw(assetId, getAssetAmount, stakingAssetId, proxy, proxyRateMul, profitAddress)
388+ }
389+ }
390+ else throw("Strict value is not equal to itself.")
391+ }
392+ else throw("Strict value is not equal to itself.")
393+ }
394+
395+
396+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
405+ if (isLeasable)
406+ then rebalanceInternal(leasedRatio, assetId, proxyAssetId, minBalance, addressFromStringValue(proxyAddress), proxyRateMul, addressFromStringValue(stakingProfitAddress))
407+ else nil
408+ }
409+
410+
411+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
420+ if (isLeasable)
421+ then {
422+ let newTotalLeasableBalance = max([0, ((getAccBalance(assetId) - getAmount) - minBalance)])
423+ if ((newTotalLeasableBalance == newTotalLeasableBalance))
424+ then {
425+ let newAdditionalBalance = fraction(leasedRatio, newTotalLeasableBalance, 100)
426+ if ((newAdditionalBalance == newAdditionalBalance))
427+ then {
428+ let withdrawAmount = (getAdditionalBalanceOrZero(assetId) - newAdditionalBalance)
429+ if ((withdrawAmount == withdrawAmount))
430+ then if ((0 > withdrawAmount))
431+ then deposit(assetId, -(withdrawAmount), proxyAssetId, addressFromStringValue(proxyAddress))
432+ else withdraw(assetId, withdrawAmount, proxyAssetId, addressFromStringValue(proxyAddress), proxyRateMul, addressFromStringValue(stakingProfitAddress))
433+ else throw("Strict value is not equal to itself.")
434+ }
435+ else throw("Strict value is not equal to itself.")
436+ }
437+ else throw("Strict value is not equal to itself.")
438+ }
439+ else nil
440+ }
441+
442+
443+func withdrawAndRebalanceAll (amountAssetOutAmount,priceAssetOutAmount) = {
444+ let AmAmtWithdrawState = withdrawAndRebalanceAsset(getStringOrFail(this, aa()), amountAssetOutAmount)
445+ let PrAmtWithdrawState = withdrawAndRebalanceAsset(getStringOrFail(this, pa()), priceAssetOutAmount)
446+ (AmAmtWithdrawState ++ PrAmtWithdrawState)
447+ }
260448
261449
262450 func privateCalcPrice (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
438626 let priceAssetBalance = getAccBalance(assetIdToString(cfgPriceAssetId))
439627 let amountAssetAmount = order.amount
440628 let priceAssetAmount = fraction(order.amount, order.price, scale8, FLOOR)
441- let $t02154121753 = if ((order.orderType == Buy))
629+ let $t02830128513 = if ((order.orderType == Buy))
442630 then $Tuple2(amountAssetAmount, -(priceAssetAmount))
443631 else $Tuple2(-(amountAssetAmount), priceAssetAmount)
444- let amountAssetBalanceDelta = $t02154121753._1
445- let priceAssetBalanceDelta = $t02154121753._2
632+ let amountAssetBalanceDelta = $t02830128513._1
633+ let priceAssetBalanceDelta = $t02830128513._2
446634 if (if (if (isGlobalShutdown())
447635 then true
448636 else (cfgPoolStatus == PoolMatcherDisabled))
455643 then throw("Wrong order assets.")
456644 else {
457645 let kLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyKLp), "0")), fmtErr("invalid kLp"))
458- let $t02219322293 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
459- let unusedActions = $t02219322293._1
460- let kLpNew = $t02219322293._2
646+ let $t02895329053 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
647+ let unusedActions = $t02895329053._1
648+ let kLpNew = $t02895329053._2
461649 let isOrderValid = (kLpNew >= kLp)
462650 let info = makeString(["kLp=", toString(kLp), " kLpNew=", toString(kLpNew), " amountAssetBalance=", toString(amountAssetBalance), " priceAssetBalance=", toString(priceAssetBalance), " amountAssetBalanceDelta=", toString(amountAssetBalanceDelta), " priceAssetBalanceDelta=", toString(priceAssetBalanceDelta), " height=", toString(height)], "")
463651 $Tuple2(isOrderValid, info)
536724 else if ((paymentAssetId == cfgPriceAssetId))
537725 then false
538726 else throwErr("invalid asset")
539- let $t02540625699 = if (isEval)
727+ let $t03216632459 = if (isEval)
540728 then $Tuple2(amountBalanceRaw, priceBalanceRaw)
541729 else if (paymentInAmountAsset)
542730 then $Tuple2((amountBalanceRaw - paymentAmountRaw), priceBalanceRaw)
543731 else $Tuple2(amountBalanceRaw, (priceBalanceRaw - paymentAmountRaw))
544- let amountBalanceOld = $t02540625699._1
545- let priceBalanceOld = $t02540625699._2
546- let $t02570325852 = if (paymentInAmountAsset)
732+ let amountBalanceOld = $t03216632459._1
733+ let priceBalanceOld = $t03216632459._2
734+ let $t03246332612 = if (paymentInAmountAsset)
547735 then $Tuple2(paymentAmountRaw, 0)
548736 else $Tuple2(0, paymentAmountRaw)
549- let amountAssetAmountRaw = $t02570325852._1
550- let priceAssetAmountRaw = $t02570325852._2
737+ let amountAssetAmountRaw = $t03246332612._1
738+ let priceAssetAmountRaw = $t03246332612._2
551739 let amountAssetAmount = takeFee(amountAssetAmountRaw, inFee)._1
552740 let priceAssetAmount = takeFee(priceAssetAmountRaw, inFee)._1
553- let $t02598426048 = takeFee(paymentAmountRaw, inFee)
554- let paymentAmount = $t02598426048._1
555- let feeAmount = $t02598426048._2
741+ let $t03274432808 = takeFee(paymentAmountRaw, inFee)
742+ let paymentAmount = $t03274432808._1
743+ let feeAmount = $t03274432808._2
556744 let amountBalanceNew = (amountBalanceOld + amountAssetAmount)
557745 let priceBalanceNew = (priceBalanceOld + priceAssetAmount)
558746 let priceNewX18 = calcPriceBigInt(toX18(priceBalanceNew, cfgPriceAssetDecimals), toX18(amountBalanceNew, cfgAmountAssetDecimals))
575763 let priceOldX18 = calcPriceBigInt(toX18(priceBalanceOld, cfgPriceAssetDecimals), toX18(amountBalanceOld, cfgAmountAssetDecimals))
576764 let priceOld = fromX18(priceOldX18, scale8)
577765 let loss = {
578- let $t02772927896 = if (paymentInAmountAsset)
766+ let $t03448934656 = if (paymentInAmountAsset)
579767 then $Tuple2(amountAssetAmountRaw, amountBalanceOld)
580768 else $Tuple2(priceAssetAmountRaw, priceBalanceOld)
581- let amount = $t02772927896._1
582- let balance = $t02772927896._2
769+ let amount = $t03448934656._1
770+ let balance = $t03448934656._2
583771 let issueAmountBoth = toInt(fraction(supplyBigInt, toBigInt((amount / 2)), toBigInt(balance)))
584772 fraction((issueAmount - issueAmountBoth), scale8, issueAmountBoth)
585773 }
619807 let supplyBigInt = toBigInt(valueOrErrorMessage(assetInfo(cfgLpAssetId), (("asset " + toBase58String(cfgLpAssetId)) + " doesn't exist")).quantity)
620808 let redeemedBigInt = toBigInt(paymentAmount)
621809 let amountRaw = max([0, toInt(((balanceBigInt * (scale18 - pow((scale18 - ((redeemedBigInt * scale18) / supplyBigInt)), 18, big2, 0, 18, DOWN))) / scale18))])
622- let $t02997430030 = takeFee(amountRaw, outFee)
623- let totalAmount = $t02997430030._1
624- let feeAmount = $t02997430030._2
625- let $t03003430260 = if (outInAmountAsset)
810+ let $t03673436790 = takeFee(amountRaw, outFee)
811+ let totalAmount = $t03673436790._1
812+ let feeAmount = $t03673436790._2
813+ let $t03679437020 = if (outInAmountAsset)
626814 then $Tuple4(totalAmount, 0, (amBalanceOld - amountRaw), prBalanceOld)
627815 else $Tuple4(0, totalAmount, amBalanceOld, (prBalanceOld - amountRaw))
628- let outAmAmount = $t03003430260._1
629- let outPrAmount = $t03003430260._2
630- let amBalanceNew = $t03003430260._3
631- let prBalanceNew = $t03003430260._4
816+ let outAmAmount = $t03679437020._1
817+ let outPrAmount = $t03679437020._2
818+ let amBalanceNew = $t03679437020._3
819+ let prBalanceNew = $t03679437020._4
632820 let priceNewX18 = calcPriceBigInt(toX18(prBalanceNew, cfgPriceAssetDecimals), toX18(amBalanceNew, cfgAmountAssetDecimals))
633821 let priceNew = fromX18(priceNewX18, scale8)
634822 let commonState = if (isEval)
694882
695883
696884 @Callable(i)
885+func rebalance () = (rebalanceAsset(getStringOrFail(this, aa())) ++ rebalanceAsset(getStringOrFail(this, pa())))
886+
887+
888+
889+@Callable(i)
697890 func calculateAmountOutForSwapREADONLY (cleanAmountIn,isReverse,feePoolAmount) = {
698- let $t03197732282 = if ((isReverse == false))
891+ let $t03890639211 = if ((isReverse == false))
699892 then {
700893 let assetOut = getStringOrFail(this, pa())
701894 let assetIn = getStringOrFail(this, aa())
706899 let assetIn = getStringOrFail(this, pa())
707900 $Tuple2(assetOut, assetIn)
708901 }
709- let assetOut = $t03197732282._1
710- let assetIn = $t03197732282._2
902+ let assetOut = $t03890639211._1
903+ let assetIn = $t03890639211._2
711904 let poolAssetInBalance = getAccBalance(assetIn)
712905 let poolAssetOutBalance = getAccBalance(assetOut)
713906 let amountOut = fraction(poolAssetOutBalance, cleanAmountIn, (poolAssetInBalance + cleanAmountIn))
757950 then true
758951 else throw("Exchange result is fewer coins than expected")
759952 if ((checkMin == checkMin))
760- then $Tuple2([ScriptTransfer(addressFromStringValue(addressTo), amountOut, parseAssetId(assetOut))], amountOut)
953+ then {
954+ let rebalanceState = rebalanceAsset(assetIn)
955+ if ((rebalanceState == rebalanceState))
956+ then {
957+ let withdrawState = withdrawAndRebalanceAsset(assetOut, amountOut)
958+ if ((withdrawState == withdrawState))
959+ then $Tuple2(((withdrawState ++ rebalanceState) ++ [ScriptTransfer(addressFromStringValue(addressTo), amountOut, parseAssetId(assetOut))]), amountOut)
960+ else throw("Strict value is not equal to itself.")
961+ }
962+ else throw("Strict value is not equal to itself.")
963+ }
761964 else throw("Strict value is not equal to itself.")
762965 }
763966 else throw("Strict value is not equal to itself.")
8481051 else throw("Strict value is not equal to itself.")
8491052 }
8501053 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
851- let $t03716637628 = refreshKLpInternal(0, 0, 0)
852- if (($t03716637628 == $t03716637628))
1054+ let $t04425744719 = refreshKLpInternal(0, 0, 0)
1055+ if (($t04425744719 == $t04425744719))
8531056 then {
854- let updatedKLp = $t03716637628._2
855- let refreshKLpActions = $t03716637628._1
1057+ let updatedKLp = $t04425744719._2
1058+ let refreshKLpActions = $t04425744719._1
8561059 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
8571060 if ((isUpdatedKLpValid == isUpdatedKLpValid))
858- then ((state ++ lpTransfer) ++ refreshKLpActions)
1061+ then {
1062+ let reb = invoke(this, "rebalance", nil, nil)
1063+ if ((reb == reb))
1064+ then ((state ++ lpTransfer) ++ refreshKLpActions)
1065+ else throw("Strict value is not equal to itself.")
1066+ }
8591067 else throw("Strict value is not equal to itself.")
8601068 }
8611069 else throw("Strict value is not equal to itself.")
8841092 let currentKLp = calcCurrentKLp(amAssetPmt, prAssetPmt, toBigInt(0))
8851093 if ((currentKLp == currentKLp))
8861094 then {
887- let $t03819038255 = refreshKLpInternal(0, 0, 0)
888- let refreshKLpActions = $t03819038255._1
889- let updatedKLp = $t03819038255._2
1095+ let $t04533145396 = refreshKLpInternal(0, 0, 0)
1096+ let refreshKLpActions = $t04533145396._1
1097+ let updatedKLp = $t04533145396._2
8901098 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
8911099 if ((isUpdatedKLpValid == isUpdatedKLpValid))
8921100 then (state ++ refreshKLpActions)
9331141 then {
9341142 let userAddress = i.caller
9351143 let txId = i.transactionId
936- let $t03944339595 = calcPutOneToken(paymentAmountRaw, paymentAssetId, userAddress, txId)
937- if (($t03944339595 == $t03944339595))
1144+ let $t04658446736 = calcPutOneToken(paymentAmountRaw, paymentAssetId, userAddress, txId)
1145+ if (($t04658446736 == $t04658446736))
9381146 then {
939- let paymentInAmountAsset = $t03944339595._5
940- let bonus = $t03944339595._4
941- let feeAmount = $t03944339595._3
942- let commonState = $t03944339595._2
943- let emitAmountEstimated = $t03944339595._1
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
9441152 let emitAmount = if (if ((minOutAmount > 0))
9451153 then (minOutAmount > emitAmountEstimated)
9461154 else false)
9601168 let sendFee = if ((feeAmount > 0))
9611169 then [ScriptTransfer(feeCollectorAddress, feeAmount, paymentAssetId)]
9621170 else nil
963- let $t04018140378 = if ((this == feeCollectorAddress))
1171+ let $t04732247519 = if ((this == feeCollectorAddress))
9641172 then $Tuple2(0, 0)
9651173 else if (paymentInAmountAsset)
9661174 then $Tuple2(-(feeAmount), 0)
9671175 else $Tuple2(0, -(feeAmount))
968- let amountAssetBalanceDelta = $t04018140378._1
969- let priceAssetBalanceDelta = $t04018140378._2
970- let $t04038140489 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
971- let refreshKLpActions = $t04038140489._1
972- let updatedKLp = $t04038140489._2
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
9731181 let kLp = value(getString(keyKLp))
9741182 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
9751183 if ((isUpdatedKLpValid == isUpdatedKLpValid))
976- then $Tuple2((((commonState ++ lpTransfer) ++ sendFee) ++ refreshKLpActions), emitAmount)
1184+ then {
1185+ let reb = invoke(this, "rebalance", nil, nil)
1186+ if ((reb == reb))
1187+ then $Tuple2((((commonState ++ lpTransfer) ++ sendFee) ++ refreshKLpActions), emitAmount)
1188+ else throw("Strict value is not equal to itself.")
1189+ }
9771190 else throw("Strict value is not equal to itself.")
9781191 }
9791192 else throw("Strict value is not equal to itself.")
9891202
9901203 @Callable(i)
9911204 func putOneTknREADONLY (paymentAssetId,paymentAmountRaw) = {
992- let $t04079540952 = calcPutOneToken(paymentAmountRaw, parseAssetId(paymentAssetId), unit, unit)
993- let emitAmountEstimated = $t04079540952._1
994- let commonState = $t04079540952._2
995- let feeAmount = $t04079540952._3
996- let bonus = $t04079540952._4
997- let paymentInAmountAsset = $t04079540952._5
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
9981211 $Tuple2(nil, $Tuple3(emitAmountEstimated, feeAmount, bonus))
9991212 }
10001213
10311244 then {
10321245 let userAddress = i.caller
10331246 let txId = i.transactionId
1034- let $t04183741990 = calcGetOneToken(outAssetId, paymentAmount, paymentAssetId, userAddress, txId)
1035- if (($t04183741990 == $t04183741990))
1247+ let $t04902749180 = calcGetOneToken(outAssetId, paymentAmount, paymentAssetId, userAddress, txId)
1248+ if (($t04902749180 == $t04902749180))
10361249 then {
1037- let outInAmountAsset = $t04183741990._5
1038- let bonus = $t04183741990._4
1039- let feeAmount = $t04183741990._3
1040- let commonState = $t04183741990._2
1041- let amountEstimated = $t04183741990._1
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
10421255 let amount = if (if ((minOutAmount > 0))
10431256 then (minOutAmount > amountEstimated)
10441257 else false)
10471260 let burnInv = invoke(factoryContract, "burn", [paymentAmount], [AttachedPayment(paymentAssetId, paymentAmount)])
10481261 if ((burnInv == burnInv))
10491262 then {
1263+ let withdrawState = withdrawAndRebalanceAsset(outAssetIdStr, (amount + max([0, feeAmount])))
10501264 let assetTransfer = [ScriptTransfer(userAddress, amount, outAssetId)]
10511265 let sendFee = if ((feeAmount > 0))
10521266 then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetId)]
10531267 else nil
1054- let $t04249042737 = {
1268+ let $t04984450091 = {
10551269 let feeAmountForCalc = if ((this == feeCollectorAddress))
10561270 then 0
10571271 else feeAmount
10591273 then $Tuple2(-((amount + feeAmountForCalc)), 0)
10601274 else $Tuple2(0, -((amount + feeAmountForCalc)))
10611275 }
1062- let amountAssetBalanceDelta = $t04249042737._1
1063- let priceAssetBalanceDelta = $t04249042737._2
1064- let $t04274042848 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1065- let refreshKLpActions = $t04274042848._1
1066- let updatedKLp = $t04274042848._2
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
10671281 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
10681282 if ((isUpdatedKLpValid == isUpdatedKLpValid))
1069- then $Tuple2((((commonState ++ assetTransfer) ++ sendFee) ++ refreshKLpActions), amount)
1283+ then $Tuple2(((((commonState ++ withdrawState) ++ assetTransfer) ++ sendFee) ++ refreshKLpActions), amount)
10701284 else throw("Strict value is not equal to itself.")
10711285 }
10721286 else throw("Strict value is not equal to itself.")
10821296
10831297 @Callable(i)
10841298 func getOneTknREADONLY (outAssetId,paymentAmount) = {
1085- let $t04310543261 = calcGetOneToken(parseAssetId(outAssetId), paymentAmount, cfgLpAssetId, unit, unit)
1086- let amountEstimated = $t04310543261._1
1087- let commonState = $t04310543261._2
1088- let feeAmount = $t04310543261._3
1089- let bonus = $t04310543261._4
1090- let outInAmountAsset = $t04310543261._5
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
10911305 $Tuple2(nil, $Tuple3(amountEstimated, feeAmount, bonus))
10921306 }
10931307
11241338 let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(cfgLpAssetId), unstakeAmount], nil)
11251339 if ((unstakeInv == unstakeInv))
11261340 then {
1127- let $t04416644317 = calcGetOneToken(outAssetId, unstakeAmount, cfgLpAssetId, userAddress, txId)
1128- if (($t04416644317 == $t04416644317))
1341+ let $t05154151692 = calcGetOneToken(outAssetId, unstakeAmount, cfgLpAssetId, userAddress, txId)
1342+ if (($t05154151692 == $t05154151692))
11291343 then {
1130- let outInAmountAsset = $t04416644317._5
1131- let bonus = $t04416644317._4
1132- let feeAmount = $t04416644317._3
1133- let commonState = $t04416644317._2
1134- let amountEstimated = $t04416644317._1
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
11351349 let amount = if (if ((minOutAmount > 0))
11361350 then (minOutAmount > amountEstimated)
11371351 else false)
11401354 let burnInv = invoke(factoryContract, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
11411355 if ((burnInv == burnInv))
11421356 then {
1357+ let withdrawState = withdrawAndRebalanceAsset(outAssetIdStr, (amount + max([0, feeAmount])))
11431358 let assetTransfer = [ScriptTransfer(i.caller, amount, outAssetId)]
11441359 let sendFee = if ((feeAmount > 0))
11451360 then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetId)]
11461361 else nil
1147- let $t04481245059 = {
1362+ let $t05235152598 = {
11481363 let feeAmountForCalc = if ((this == feeCollectorAddress))
11491364 then 0
11501365 else feeAmount
11521367 then $Tuple2(-((amount + feeAmountForCalc)), 0)
11531368 else $Tuple2(0, -((amount + feeAmountForCalc)))
11541369 }
1155- let amountAssetBalanceDelta = $t04481245059._1
1156- let priceAssetBalanceDelta = $t04481245059._2
1157- let $t04506245170 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1158- let refreshKLpActions = $t04506245170._1
1159- let updatedKLp = $t04506245170._2
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
11601375 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
11611376 if ((isUpdatedKLpValid == isUpdatedKLpValid))
1162- then $Tuple2((((commonState ++ assetTransfer) ++ sendFee) ++ refreshKLpActions), amount)
1377+ then $Tuple2(((((commonState ++ withdrawState) ++ assetTransfer) ++ sendFee) ++ refreshKLpActions), amount)
11631378 else throw("Strict value is not equal to itself.")
11641379 }
11651380 else throw("Strict value is not equal to itself.")
11781393 @Callable(i)
11791394 func get () = {
11801395 let res = commonGet(i)
1181- let outAmtAmt = res._1
1396+ let outAmAmt = res._1
11821397 let outPrAmt = res._2
11831398 let pmtAmt = res._3
11841399 let pmtAssetId = res._4
11851400 let state = res._5
1401+ let withdrawState = withdrawAndRebalanceAll(outAmAmt, outPrAmt)
11861402 let currentKLp = calcCurrentKLp(toBigInt(0), toBigInt(0), toBigInt(0))
11871403 if ((currentKLp == currentKLp))
11881404 then {
11891405 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
11901406 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
11911407 then {
1192- let $t04611646198 = refreshKLpInternal(-(outAmtAmt), -(outPrAmt), 0)
1193- let refreshKLpActions = $t04611646198._1
1194- let updatedKLp = $t04611646198._2
1408+ let $t05380453885 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1409+ let refreshKLpActions = $t05380453885._1
1410+ let updatedKLp = $t05380453885._2
11951411 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
11961412 if ((isUpdatedKLpValid == isUpdatedKLpValid))
1197- then (state ++ refreshKLpActions)
1413+ then ((withdrawState ++ state) ++ refreshKLpActions)
11981414 else throw("Strict value is not equal to itself.")
11991415 }
12001416 else throw("Strict value is not equal to itself.")
12171433 else if ((noLessThenPriceAsset > outPrAmt))
12181434 then throw(((("noLessThenPriceAsset failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset)))
12191435 else {
1436+ let withdrawState = withdrawAndRebalanceAll(outAmAmt, outPrAmt)
12201437 let currentKLp = calcCurrentKLp(toBigInt(0), toBigInt(0), toBigInt(0))
12211438 if ((currentKLp == currentKLp))
12221439 then {
12231440 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
12241441 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
12251442 then {
1226- let $t04714747228 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1227- let refreshKLpActions = $t04714747228._1
1228- let updatedKLp = $t04714747228._2
1443+ let $t05498055061 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1444+ let refreshKLpActions = $t05498055061._1
1445+ let updatedKLp = $t05498055061._2
12291446 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
12301447 if ((isUpdatedKLpValid == isUpdatedKLpValid))
1231- then (state ++ refreshKLpActions)
1448+ then ((withdrawState ++ state) ++ refreshKLpActions)
12321449 else throw("Strict value is not equal to itself.")
12331450 }
12341451 else throw("Strict value is not equal to itself.")
12591476 let outPrAmt = res._2
12601477 let poolStatus = parseIntValue(res._9)
12611478 let state = res._10
1479+ let withdrawState = withdrawAndRebalanceAll(outAmAmt, outPrAmt)
12621480 let checkPoolStatus = if (if (isGlobalShutdown())
12631481 then true
12641482 else (poolStatus == PoolShutdown))
12691487 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
12701488 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
12711489 then {
1272- let $t04835448435 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1273- let refreshKLpActions = $t04835448435._1
1274- let updatedKLp = $t04835448435._2
1490+ let $t05633356414 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1491+ let refreshKLpActions = $t05633356414._1
1492+ let updatedKLp = $t05633356414._2
12751493 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
12761494 if ((isUpdatedKLpValid == isUpdatedKLpValid))
1277- then (state ++ refreshKLpActions)
1495+ then ((withdrawState ++ state) ++ refreshKLpActions)
12781496 else throw("Strict value is not equal to itself.")
12791497 }
12801498 else throw("Strict value is not equal to itself.")
13121530 let outAmAmt = res._1
13131531 let outPrAmt = res._2
13141532 let state = res._10
1533+ let withdrawState = withdrawAndRebalanceAll(outAmAmt, outPrAmt)
13151534 let checkAmounts = [if ((outAmAmt >= noLessThenAmountAsset))
13161535 then true
13171536 else throw(makeString(["amount asset amount to receive is less than ", toString(noLessThenAmountAsset)], "")), if ((outPrAmt >= noLessThenPriceAsset))
13221541 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
13231542 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
13241543 then {
1325- let $t04973049811 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1326- let refreshKLpActions = $t04973049811._1
1327- let updatedKLp = $t04973049811._2
1544+ let $t05785557936 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1545+ let refreshKLpActions = $t05785557936._1
1546+ let updatedKLp = $t05785557936._2
13281547 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
13291548 if ((isUpdatedKLpValid == isUpdatedKLpValid))
1330- then (state ++ refreshKLpActions)
1549+ then ((withdrawState ++ state) ++ refreshKLpActions)
13311550 else throw("Strict value is not equal to itself.")
13321551 }
13331552 else throw("Strict value is not equal to itself.")
13591578 if ((checkLastRefreshedBlockHeight == checkLastRefreshedBlockHeight))
13601579 then {
13611580 let kLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyKLp), "0")), fmtErr("invalid kLp"))
1362- let $t05099851062 = refreshKLpInternal(0, 0, 0)
1363- let kLpUpdateActions = $t05099851062._1
1364- let updatedKLp = $t05099851062._2
1581+ let $t05914059204 = refreshKLpInternal(0, 0, 0)
1582+ let kLpUpdateActions = $t05914059204._1
1583+ let updatedKLp = $t05914059204._2
13651584 let actions = if ((kLp != updatedKLp))
13661585 then kLpUpdateActions
13671586 else throwErr("nothing to refresh")
15361755 match tx {
15371756 case order: Order =>
15381757 let matcherPub = getMatcherPubOrFail()
1539- let $t05972459793 = validateMatcherOrderAllowed(order)
1540- let orderValid = $t05972459793._1
1541- let orderValidInfo = $t05972459793._2
1758+ let $t06786667935 = validateMatcherOrderAllowed(order)
1759+ let orderValid = $t06786667935._1
1760+ let orderValidInfo = $t06786667935._2
15421761 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
15431762 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
15441763 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
9393 func mpk () = "%s__managerPublicKey"
9494
9595
9696 func pmpk () = "%s__pendingManagerPublicKey"
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
133+func keyAdditionalBalance (assetId) = makeString(["%s%s", "stakedBalance", assetId], SEP)
134+
135+
136+func keyStakingAssetBalance (assetId) = makeString(["%s%s", "shareAssetBalance", assetId], SEP)
137+
138+
139+func getAdditionalBalanceOrZero (assetId) = valueOrElse(getInteger(this, keyAdditionalBalance(assetId)), 0)
140+
141+
142+func getStakingAssetBalanceOrZero (assetId) = valueOrElse(getInteger(this, keyStakingAssetBalance(assetId)), 0)
143+
144+
133145 func keyFactoryConfig () = "%s__factoryConfig"
134146
135147
136148 func keyMatcherPub () = "%s%s__matcher__publicKey"
137149
138150
139151 func keyMappingPoolContractAddressToPoolAssets (poolContractAddress) = (("%s%s%s__" + poolContractAddress) + "__mappings__poolContract2LpAsset")
140152
141153
142154 func keyPoolConfig (iAmtAsset,iPriceAsset) = (((("%d%d%s__" + iAmtAsset) + "__") + iPriceAsset) + "__config")
143155
144156
145157 func keyMappingsBaseAsset2internalId (baseAssetStr) = ("%s%s%s__mappings__baseAsset2internalId__" + baseAssetStr)
146158
147159
148160 func keyAllPoolsShutdown () = "%s__shutdown"
149161
150162
151163 func keyPoolWeight (contractAddress) = ("%s%s__poolWeight__" + contractAddress)
152164
153165
154166 func keyAllowedLpScriptHash () = "%s__allowedLpScriptHash"
155167
156168
157169 let keyFeeCollectorAddress = "%s__feeCollectorAddress"
158170
159171 func throwOrderError (orderValid,orderValidInfo,senderValid,matcherValid) = throw((((((((("order validation failed: orderValid=" + toString(orderValid)) + " (") + orderValidInfo) + ")") + " senderValid=") + toString(senderValid)) + " matcherValid=") + toString(matcherValid)))
160172
161173
162174 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
163175
164176
165177 func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
166178
167179
168180 func throwErr (msg) = throw(makeString(["lp.ride:", msg], " "))
169181
170182
171183 func fmtErr (msg) = makeString(["lp.ride:", msg], " ")
172184
173185
174186 let factoryContract = addressFromStringValue(getStringOrFail(this, fc()))
175187
176188 let feeCollectorAddress = addressFromStringValue(getStringOrFail(factoryContract, keyFeeCollectorAddress))
177189
178190 let inFee = {
179191 let @ = invoke(factoryContract, "getInFeeREADONLY", [toString(this)], nil)
180192 if ($isInstanceOf(@, "Int"))
181193 then @
182194 else throw(($getType(@) + " couldn't be cast to Int"))
183195 }
184196
185197 let outFee = {
186198 let @ = invoke(factoryContract, "getOutFeeREADONLY", [toString(this)], nil)
187199 if ($isInstanceOf(@, "Int"))
188200 then @
189201 else throw(($getType(@) + " couldn't be cast to Int"))
190202 }
191203
192204 func isGlobalShutdown () = valueOrElse(getBoolean(factoryContract, keyAllPoolsShutdown()), false)
193205
194206
195207 func getMatcherPubOrFail () = fromBase58String(getStringOrFail(factoryContract, keyMatcherPub()))
196208
197209
198210 func getPoolConfig () = {
199211 let amtAsset = getStringOrFail(this, aa())
200212 let priceAsset = getStringOrFail(this, pa())
201213 let iPriceAsset = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(priceAsset))
202214 let iAmtAsset = getIntOrFail(factoryContract, keyMappingsBaseAsset2internalId(amtAsset))
203215 split(getStringOrFail(factoryContract, keyPoolConfig(toString(iAmtAsset), toString(iPriceAsset))), SEP)
204216 }
205217
206218
207219 func parseAssetId (input) = if ((input == wavesString))
208220 then unit
209221 else fromBase58String(input)
210222
211223
212224 func assetIdToString (input) = if ((input == unit))
213225 then wavesString
214226 else toBase58String(value(input))
215227
216228
217229 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]))
218230
219231
220232 let poolConfigParsed = parsePoolConfig(getPoolConfig())
221233
222-let $t084698635 = poolConfigParsed
234+let $t089629128 = poolConfigParsed
223235
224-let cfgPoolAddress = $t084698635._1
236+let cfgPoolAddress = $t089629128._1
225237
226-let cfgPoolStatus = $t084698635._2
238+let cfgPoolStatus = $t089629128._2
227239
228-let cfgLpAssetId = $t084698635._3
240+let cfgLpAssetId = $t089629128._3
229241
230-let cfgAmountAssetId = $t084698635._4
242+let cfgAmountAssetId = $t089629128._4
231243
232-let cfgPriceAssetId = $t084698635._5
244+let cfgPriceAssetId = $t089629128._5
233245
234-let cfgAmountAssetDecimals = $t084698635._6
246+let cfgAmountAssetDecimals = $t089629128._6
235247
236-let cfgPriceAssetDecimals = $t084698635._7
248+let cfgPriceAssetDecimals = $t089629128._7
237249
238250 func getFactoryConfig () = split(getStringOrFail(factoryContract, keyFactoryConfig()), SEP)
239251
240252
241253 let stakingContract = valueOrErrorMessage(addressFromString(getFactoryConfig()[idxFactoryStakingContract]), "incorrect staking address")
242254
243255 let slippageContract = valueOrErrorMessage(addressFromString(getFactoryConfig()[idxFactorySlippageContract]), "incorrect staking address")
244256
245257 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)
246258
247259
248260 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)
249261
250262
251-func getAccBalance (assetId) = if ((assetId == "WAVES"))
252- then wavesBalance(this).available
253- else assetBalance(this, fromBase58String(assetId))
263+func getAccBalance (assetId) = {
264+ let balanceOnPool = if ((assetId == "WAVES"))
265+ then wavesBalance(this).available
266+ else assetBalance(this, fromBase58String(assetId))
267+ let totalBalance = ((balanceOnPool + getAdditionalBalanceOrZero(assetId)) - getStakingAssetBalanceOrZero(assetId))
268+ max([0, totalBalance])
269+ }
254270
255271
256272 func calcPriceBigInt (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
257273
258274
259275 func calcPriceBigIntRound (prAmtX18,amAmtX18,round) = fraction(prAmtX18, scale18, amAmtX18, round)
276+
277+
278+func getRate (proxy) = {
279+ let inv = invoke(proxy, "getRate", nil, nil)
280+ if ((inv == inv))
281+ then match inv {
282+ case r: Int =>
283+ r
284+ case _ =>
285+ throwErr("proxy.getRate() unexpected value")
286+ }
287+ else throw("Strict value is not equal to itself.")
288+ }
289+
290+
291+func deposit (assetId,amount,stakingAssetId,proxy) = {
292+ let currentAdditionalBalance = getAdditionalBalanceOrZero(assetId)
293+ if ((currentAdditionalBalance == currentAdditionalBalance))
294+ then {
295+ let currentStakingAssetBalance = getStakingAssetBalanceOrZero(stakingAssetId)
296+ if ((currentStakingAssetBalance == currentStakingAssetBalance))
297+ then {
298+ let asset = parseAssetId(assetId)
299+ if ((amount > 0))
300+ then {
301+ let depositInvoke = invoke(proxy, "deposit", nil, [AttachedPayment(asset, amount)])
302+ if ((depositInvoke == depositInvoke))
303+ then match depositInvoke {
304+ case receivedStakingAsset: Int =>
305+ let newAdditionalBalance = (currentAdditionalBalance + amount)
306+ let newStakingAssetBalance = (currentStakingAssetBalance + receivedStakingAsset)
307+[IntegerEntry(keyAdditionalBalance(assetId), newAdditionalBalance), IntegerEntry(keyStakingAssetBalance(stakingAssetId), newStakingAssetBalance)]
308+ case _ =>
309+ nil
310+ }
311+ else throw("Strict value is not equal to itself.")
312+ }
313+ else nil
314+ }
315+ else throw("Strict value is not equal to itself.")
316+ }
317+ else throw("Strict value is not equal to itself.")
318+ }
319+
320+
321+func withdraw (assetId,amount,stakingAssetId,proxy,proxyRateMul,profitAddress) = {
322+ let currentAdditionalBalance = getAdditionalBalanceOrZero(assetId)
323+ if ((currentAdditionalBalance == currentAdditionalBalance))
324+ then {
325+ let currentStakingAssetBalance = getStakingAssetBalanceOrZero(stakingAssetId)
326+ if ((currentStakingAssetBalance == currentStakingAssetBalance))
327+ then {
328+ let currentProxyRate = getRate(proxy)
329+ if ((currentProxyRate == currentProxyRate))
330+ then {
331+ let oldRate = fraction(proxyRateMul, currentAdditionalBalance, currentStakingAssetBalance)
332+ let stakingAsset = parseAssetId(stakingAssetId)
333+ let oldSendStakingAmount = fraction(proxyRateMul, amount, oldRate)
334+ let sendStakingAssetAmount = fraction(proxyRateMul, amount, currentProxyRate)
335+ let profitAmount = max([0, (oldSendStakingAmount - sendStakingAssetAmount)])
336+ if ((sendStakingAssetAmount > 0))
337+ then {
338+ let withdrawInvoke = invoke(proxy, "withdraw", nil, [AttachedPayment(stakingAsset, sendStakingAssetAmount)])
339+ if ((withdrawInvoke == withdrawInvoke))
340+ then match withdrawInvoke {
341+ case receivedAssets: Int =>
342+ let newAdditionalBalance = (currentAdditionalBalance - receivedAssets)
343+ let newStakingAssetBalance = ((currentStakingAssetBalance - sendStakingAssetAmount) - profitAmount)
344+[IntegerEntry(keyAdditionalBalance(assetId), newAdditionalBalance), IntegerEntry(keyStakingAssetBalance(stakingAssetId), newStakingAssetBalance), ScriptTransfer(profitAddress, profitAmount, parseAssetId(stakingAssetId))]
345+ case _ =>
346+ nil
347+ }
348+ else throw("Strict value is not equal to itself.")
349+ }
350+ else nil
351+ }
352+ else throw("Strict value is not equal to itself.")
353+ }
354+ else throw("Strict value is not equal to itself.")
355+ }
356+ else throw("Strict value is not equal to itself.")
357+ }
358+
359+
360+func getLeaseProxyConfig (assetId) = match invoke(factoryContract, "getPoolLeaseConfigREADONLY", [toString(this), assetId], nil) {
361+ case a: (Boolean, Int, Int, String, String, Int, String) =>
362+ a
363+ case _ =>
364+ throwErr((("[" + assetId) + "] getLeaseProxyConfig() error"))
365+}
366+
367+
368+func rebalanceInternal (targetRatio,assetId,stakingAssetId,minBalance,proxy,proxyRateMul,profitAddress) = {
369+ let currentAdditionalBalance = getAdditionalBalanceOrZero(assetId)
370+ if ((currentAdditionalBalance == currentAdditionalBalance))
371+ then {
372+ let currentStakingAssetBalance = getStakingAssetBalanceOrZero(stakingAssetId)
373+ if ((currentStakingAssetBalance == currentStakingAssetBalance))
374+ then {
375+ let leasableTotalBalance = max([0, (getAccBalance(assetId) - minBalance)])
376+ let targetAdditionalBalance = fraction(targetRatio, leasableTotalBalance, 100)
377+ let diff = (currentAdditionalBalance - targetAdditionalBalance)
378+ if ((diff == 0))
379+ then nil
380+ else if ((0 > diff))
381+ then {
382+ let sendAssetAmount = -(diff)
383+ deposit(assetId, sendAssetAmount, stakingAssetId, proxy)
384+ }
385+ else {
386+ let getAssetAmount = diff
387+ withdraw(assetId, getAssetAmount, stakingAssetId, proxy, proxyRateMul, profitAddress)
388+ }
389+ }
390+ else throw("Strict value is not equal to itself.")
391+ }
392+ else throw("Strict value is not equal to itself.")
393+ }
394+
395+
396+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
405+ if (isLeasable)
406+ then rebalanceInternal(leasedRatio, assetId, proxyAssetId, minBalance, addressFromStringValue(proxyAddress), proxyRateMul, addressFromStringValue(stakingProfitAddress))
407+ else nil
408+ }
409+
410+
411+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
420+ if (isLeasable)
421+ then {
422+ let newTotalLeasableBalance = max([0, ((getAccBalance(assetId) - getAmount) - minBalance)])
423+ if ((newTotalLeasableBalance == newTotalLeasableBalance))
424+ then {
425+ let newAdditionalBalance = fraction(leasedRatio, newTotalLeasableBalance, 100)
426+ if ((newAdditionalBalance == newAdditionalBalance))
427+ then {
428+ let withdrawAmount = (getAdditionalBalanceOrZero(assetId) - newAdditionalBalance)
429+ if ((withdrawAmount == withdrawAmount))
430+ then if ((0 > withdrawAmount))
431+ then deposit(assetId, -(withdrawAmount), proxyAssetId, addressFromStringValue(proxyAddress))
432+ else withdraw(assetId, withdrawAmount, proxyAssetId, addressFromStringValue(proxyAddress), proxyRateMul, addressFromStringValue(stakingProfitAddress))
433+ else throw("Strict value is not equal to itself.")
434+ }
435+ else throw("Strict value is not equal to itself.")
436+ }
437+ else throw("Strict value is not equal to itself.")
438+ }
439+ else nil
440+ }
441+
442+
443+func withdrawAndRebalanceAll (amountAssetOutAmount,priceAssetOutAmount) = {
444+ let AmAmtWithdrawState = withdrawAndRebalanceAsset(getStringOrFail(this, aa()), amountAssetOutAmount)
445+ let PrAmtWithdrawState = withdrawAndRebalanceAsset(getStringOrFail(this, pa()), priceAssetOutAmount)
446+ (AmAmtWithdrawState ++ PrAmtWithdrawState)
447+ }
260448
261449
262450 func privateCalcPrice (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
263451 let amtAssetAmtX18 = toX18(amAmt, amAssetDcm)
264452 let priceAssetAmtX18 = toX18(prAmt, prAssetDcm)
265453 calcPriceBigInt(priceAssetAmtX18, amtAssetAmtX18)
266454 }
267455
268456
269457 func calcPrices (amAmt,prAmt,lpAmt) = {
270458 let cfg = getPoolConfig()
271459 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
272460 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
273461 let priceX18 = privateCalcPrice(amtAssetDcm, priceAssetDcm, amAmt, prAmt)
274462 let amAmtX18 = toX18(amAmt, amtAssetDcm)
275463 let prAmtX18 = toX18(prAmt, priceAssetDcm)
276464 let lpAmtX18 = toX18(lpAmt, scale8)
277465 let lpPriceInAmAssetX18 = calcPriceBigInt(amAmtX18, lpAmtX18)
278466 let lpPriceInPrAssetX18 = calcPriceBigInt(prAmtX18, lpAmtX18)
279467 [priceX18, lpPriceInAmAssetX18, lpPriceInPrAssetX18]
280468 }
281469
282470
283471 func calculatePrices (amAmt,prAmt,lpAmt) = {
284472 let prices = calcPrices(amAmt, prAmt, lpAmt)
285473 [fromX18(prices[0], scale8), fromX18(prices[1], scale8), fromX18(prices[2], scale8)]
286474 }
287475
288476
289477 func estimateGetOperation (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
290478 let cfg = getPoolConfig()
291479 let lpAssetId = cfg[idxPoolLPAssetId]
292480 let amAssetId = cfg[idxAmtAssetId]
293481 let prAssetId = cfg[idxPriceAssetId]
294482 let amAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
295483 let prAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
296484 let poolStatus = cfg[idxPoolStatus]
297485 let lpEmission = valueOrErrorMessage(assetInfo(fromBase58String(lpAssetId)), (("Asset " + lpAssetId) + " doesn't exist")).quantity
298486 if ((lpAssetId != pmtAssetId))
299487 then throw("Invalid asset passed.")
300488 else {
301489 let amBalance = getAccBalance(amAssetId)
302490 let amBalanceX18 = toX18(amBalance, amAssetDcm)
303491 let prBalance = getAccBalance(prAssetId)
304492 let prBalanceX18 = toX18(prBalance, prAssetDcm)
305493 let curPriceX18 = calcPriceBigInt(prBalanceX18, amBalanceX18)
306494 let curPrice = fromX18(curPriceX18, scale8)
307495 let pmtLpAmtX18 = toX18(pmtLpAmt, scale8)
308496 let lpEmissionX18 = toX18(lpEmission, scale8)
309497 let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissionX18)
310498 let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissionX18)
311499 let outAmAmt = fromX18Round(outAmAmtX18, amAssetDcm, FLOOR)
312500 let outPrAmt = fromX18Round(outPrAmtX18, prAssetDcm, FLOOR)
313501 let state = if ((txId58 == ""))
314502 then nil
315503 else [ScriptTransfer(userAddress, outAmAmt, if ((amAssetId == "WAVES"))
316504 then unit
317505 else fromBase58String(amAssetId)), ScriptTransfer(userAddress, outPrAmt, if ((prAssetId == "WAVES"))
318506 then unit
319507 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)]
320508 $Tuple10(outAmAmt, outPrAmt, amAssetId, prAssetId, amBalance, prBalance, lpEmission, curPriceX18, poolStatus, state)
321509 }
322510 }
323511
324512
325513 func estimatePutOperation (txId58,slippageTolerance,inAmAssetAmt,inAmAssetId,inPrAssetAmt,inPrAssetId,userAddress,isEvaluate,emitLp) = {
326514 let cfg = getPoolConfig()
327515 let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId])
328516 let amAssetIdStr = cfg[idxAmtAssetId]
329517 let prAssetIdStr = cfg[idxPriceAssetId]
330518 let iAmtAssetId = cfg[idxIAmtAssetId]
331519 let iPriceAssetId = cfg[idxIPriceAssetId]
332520 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
333521 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
334522 let poolStatus = cfg[idxPoolStatus]
335523 let lpEmission = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
336524 let inAmAssetIdStr = toBase58String(valueOrElse(inAmAssetId, fromBase58String("WAVES")))
337525 let inPrAssetIdStr = toBase58String(valueOrElse(inPrAssetId, fromBase58String("WAVES")))
338526 if (if ((amAssetIdStr != inAmAssetIdStr))
339527 then true
340528 else (prAssetIdStr != inPrAssetIdStr))
341529 then throw("Invalid amt or price asset passed.")
342530 else {
343531 let amBalance = if (isEvaluate)
344532 then getAccBalance(amAssetIdStr)
345533 else (getAccBalance(amAssetIdStr) - inAmAssetAmt)
346534 let prBalance = if (isEvaluate)
347535 then getAccBalance(prAssetIdStr)
348536 else (getAccBalance(prAssetIdStr) - inPrAssetAmt)
349537 let inAmAssetAmtX18 = toX18(inAmAssetAmt, amtAssetDcm)
350538 let inPrAssetAmtX18 = toX18(inPrAssetAmt, priceAssetDcm)
351539 let userPriceX18 = calcPriceBigInt(inPrAssetAmtX18, inAmAssetAmtX18)
352540 let amBalanceX18 = toX18(amBalance, amtAssetDcm)
353541 let prBalanceX18 = toX18(prBalance, priceAssetDcm)
354542 let res = if ((lpEmission == 0))
355543 then {
356544 let curPriceX18 = zeroBigInt
357545 let slippageX18 = zeroBigInt
358546 let lpAmtX18 = pow((inAmAssetAmtX18 * inPrAssetAmtX18), 0, toBigInt(5), 1, 0, DOWN)
359547 $Tuple5(fromX18(lpAmtX18, scale8), fromX18(inAmAssetAmtX18, amtAssetDcm), fromX18(inPrAssetAmtX18, priceAssetDcm), calcPriceBigInt((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
360548 }
361549 else {
362550 let curPriceX18 = calcPriceBigInt(prBalanceX18, amBalanceX18)
363551 let slippageX18 = fraction(absBigInt((curPriceX18 - userPriceX18)), scale18, curPriceX18)
364552 let slippageToleranceX18 = toX18(slippageTolerance, scale8)
365553 if (if ((curPriceX18 != zeroBigInt))
366554 then (slippageX18 > slippageToleranceX18)
367555 else false)
368556 then throw(((("Price slippage " + toString(slippageX18)) + " exceeded the passed limit of ") + toString(slippageToleranceX18)))
369557 else {
370558 let lpEmissionX18 = toX18(lpEmission, scale8)
371559 let prViaAmX18 = fraction(inAmAssetAmtX18, calcPriceBigIntRound(prBalanceX18, amBalanceX18, CEILING), scale18, CEILING)
372560 let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, calcPriceBigIntRound(prBalanceX18, amBalanceX18, FLOOR), CEILING)
373561 let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
374562 then $Tuple2(amViaPrX18, inPrAssetAmtX18)
375563 else $Tuple2(inAmAssetAmtX18, prViaAmX18)
376564 let expAmtAssetAmtX18 = expectedAmts._1
377565 let expPriceAssetAmtX18 = expectedAmts._2
378566 let lpAmtX18 = fraction(lpEmissionX18, expPriceAssetAmtX18, prBalanceX18, FLOOR)
379567 $Tuple5(fromX18Round(lpAmtX18, scale8, FLOOR), fromX18Round(expAmtAssetAmtX18, amtAssetDcm, CEILING), fromX18Round(expPriceAssetAmtX18, priceAssetDcm, CEILING), curPriceX18, slippageX18)
380568 }
381569 }
382570 let calcLpAmt = res._1
383571 let calcAmAssetPmt = res._2
384572 let calcPrAssetPmt = res._3
385573 let curPrice = fromX18(res._4, scale8)
386574 let slippageCalc = fromX18(res._5, scale8)
387575 if ((0 >= calcLpAmt))
388576 then throw("Invalid calculations. LP calculated is less than zero.")
389577 else {
390578 let emitLpAmt = if (!(emitLp))
391579 then 0
392580 else calcLpAmt
393581 let amDiff = (inAmAssetAmt - calcAmAssetPmt)
394582 let prDiff = (inPrAssetAmt - calcPrAssetPmt)
395583 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))]
396584 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEmission, lpAssetId, poolStatus, commonState, amDiff, prDiff, inAmAssetId, inPrAssetId)
397585 }
398586 }
399587 }
400588
401589
402590 func calcKLp (amountBalance,priceBalance,lpEmission) = {
403591 let amountBalanceX18 = toX18BigInt(amountBalance, toBigInt(cfgAmountAssetDecimals))
404592 let priceBalanceX18 = toX18BigInt(priceBalance, toBigInt(cfgPriceAssetDecimals))
405593 let updatedKLp = fraction(pow((amountBalanceX18 * priceBalanceX18), 0, toBigInt(5), 1, 18, DOWN), big1, lpEmission)
406594 if ((lpEmission == big0))
407595 then big0
408596 else updatedKLp
409597 }
410598
411599
412600 func calcCurrentKLp (amountAssetDelta,priceAssetDelta,lpAssetEmissionDelta) = {
413601 let amountAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgAmountAssetId))) - amountAssetDelta)
414602 let priceAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgPriceAssetId))) - priceAssetDelta)
415603 let lpAssetEmission = (toBigInt(value(assetInfo(cfgLpAssetId)).quantity) - lpAssetEmissionDelta)
416604 let currentKLp = calcKLp(amountAssetBalance, priceAssetBalance, lpAssetEmission)
417605 currentKLp
418606 }
419607
420608
421609 func refreshKLpInternal (amountAssetBalanceDelta,priceAssetBalanceDelta,lpAssetEmissionDelta) = {
422610 let amountAssetBalance = (getAccBalance(assetIdToString(cfgAmountAssetId)) + amountAssetBalanceDelta)
423611 let priceAssetBalance = (getAccBalance(assetIdToString(cfgPriceAssetId)) + priceAssetBalanceDelta)
424612 let lpAssetEmission = (value(assetInfo(cfgLpAssetId)).quantity + lpAssetEmissionDelta)
425613 let updatedKLp = calcKLp(toBigInt(amountAssetBalance), toBigInt(priceAssetBalance), toBigInt(lpAssetEmission))
426614 let actions = [IntegerEntry(keyKLpRefreshedHeight, height), StringEntry(keyKLp, toString(updatedKLp))]
427615 $Tuple2(actions, updatedKLp)
428616 }
429617
430618
431619 func validateUpdatedKLp (oldKLp,updatedKLp) = if ((updatedKLp >= oldKLp))
432620 then true
433621 else throwErr(makeString(["updated KLp lower than current KLp", toString(oldKLp), toString(updatedKLp)], " "))
434622
435623
436624 func validateMatcherOrderAllowed (order) = {
437625 let amountAssetBalance = getAccBalance(assetIdToString(cfgAmountAssetId))
438626 let priceAssetBalance = getAccBalance(assetIdToString(cfgPriceAssetId))
439627 let amountAssetAmount = order.amount
440628 let priceAssetAmount = fraction(order.amount, order.price, scale8, FLOOR)
441- let $t02154121753 = if ((order.orderType == Buy))
629+ let $t02830128513 = if ((order.orderType == Buy))
442630 then $Tuple2(amountAssetAmount, -(priceAssetAmount))
443631 else $Tuple2(-(amountAssetAmount), priceAssetAmount)
444- let amountAssetBalanceDelta = $t02154121753._1
445- let priceAssetBalanceDelta = $t02154121753._2
632+ let amountAssetBalanceDelta = $t02830128513._1
633+ let priceAssetBalanceDelta = $t02830128513._2
446634 if (if (if (isGlobalShutdown())
447635 then true
448636 else (cfgPoolStatus == PoolMatcherDisabled))
449637 then true
450638 else (cfgPoolStatus == PoolShutdown))
451639 then throw("Exchange operations disabled")
452640 else if (if ((order.assetPair.amountAsset != cfgAmountAssetId))
453641 then true
454642 else (order.assetPair.priceAsset != cfgPriceAssetId))
455643 then throw("Wrong order assets.")
456644 else {
457645 let kLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyKLp), "0")), fmtErr("invalid kLp"))
458- let $t02219322293 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
459- let unusedActions = $t02219322293._1
460- let kLpNew = $t02219322293._2
646+ let $t02895329053 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
647+ let unusedActions = $t02895329053._1
648+ let kLpNew = $t02895329053._2
461649 let isOrderValid = (kLpNew >= kLp)
462650 let info = makeString(["kLp=", toString(kLp), " kLpNew=", toString(kLpNew), " amountAssetBalance=", toString(amountAssetBalance), " priceAssetBalance=", toString(priceAssetBalance), " amountAssetBalanceDelta=", toString(amountAssetBalanceDelta), " priceAssetBalanceDelta=", toString(priceAssetBalanceDelta), " height=", toString(height)], "")
463651 $Tuple2(isOrderValid, info)
464652 }
465653 }
466654
467655
468656 func commonGet (i) = if ((size(i.payments) != 1))
469657 then throw("exactly 1 payment is expected")
470658 else {
471659 let pmt = value(i.payments[0])
472660 let pmtAssetId = value(pmt.assetId)
473661 let pmtAmt = pmt.amount
474662 let res = estimateGetOperation(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
475663 let outAmAmt = res._1
476664 let outPrAmt = res._2
477665 let poolStatus = parseIntValue(res._9)
478666 let state = res._10
479667 if (if (isGlobalShutdown())
480668 then true
481669 else (poolStatus == PoolShutdown))
482670 then throw(("Get operation is blocked by admin. Status = " + toString(poolStatus)))
483671 else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state)
484672 }
485673
486674
487675 func commonPut (i,slippageTolerance,emitLp) = if ((size(i.payments) != 2))
488676 then throw("exactly 2 payments are expected")
489677 else {
490678 let amAssetPmt = value(i.payments[0])
491679 let prAssetPmt = value(i.payments[1])
492680 let estPut = estimatePutOperation(toBase58String(i.transactionId), slippageTolerance, amAssetPmt.amount, amAssetPmt.assetId, prAssetPmt.amount, prAssetPmt.assetId, toString(i.caller), false, emitLp)
493681 let poolStatus = parseIntValue(estPut._8)
494682 if (if (if (isGlobalShutdown())
495683 then true
496684 else (poolStatus == PoolPutDisabled))
497685 then true
498686 else (poolStatus == PoolShutdown))
499687 then throw(("Put operation is blocked by admin. Status = " + toString(poolStatus)))
500688 else estPut
501689 }
502690
503691
504692 func emit (amount) = {
505693 let emitInv = invoke(factoryContract, "emit", [amount], nil)
506694 if ((emitInv == emitInv))
507695 then {
508696 let emitInvLegacy = match emitInv {
509697 case legacyFactoryContract: Address =>
510698 invoke(legacyFactoryContract, "emit", [amount], nil)
511699 case _ =>
512700 unit
513701 }
514702 if ((emitInvLegacy == emitInvLegacy))
515703 then amount
516704 else throw("Strict value is not equal to itself.")
517705 }
518706 else throw("Strict value is not equal to itself.")
519707 }
520708
521709
522710 func takeFee (amount,fee) = {
523711 let feeAmount = if ((fee == 0))
524712 then 0
525713 else fraction(amount, fee, scale8)
526714 $Tuple2((amount - feeAmount), feeAmount)
527715 }
528716
529717
530718 func calcPutOneToken (paymentAmountRaw,paymentAssetId,userAddress,txId) = {
531719 let isEval = (txId == unit)
532720 let amountBalanceRaw = getAccBalance(assetIdToString(cfgAmountAssetId))
533721 let priceBalanceRaw = getAccBalance(assetIdToString(cfgPriceAssetId))
534722 let paymentInAmountAsset = if ((paymentAssetId == cfgAmountAssetId))
535723 then true
536724 else if ((paymentAssetId == cfgPriceAssetId))
537725 then false
538726 else throwErr("invalid asset")
539- let $t02540625699 = if (isEval)
727+ let $t03216632459 = if (isEval)
540728 then $Tuple2(amountBalanceRaw, priceBalanceRaw)
541729 else if (paymentInAmountAsset)
542730 then $Tuple2((amountBalanceRaw - paymentAmountRaw), priceBalanceRaw)
543731 else $Tuple2(amountBalanceRaw, (priceBalanceRaw - paymentAmountRaw))
544- let amountBalanceOld = $t02540625699._1
545- let priceBalanceOld = $t02540625699._2
546- let $t02570325852 = if (paymentInAmountAsset)
732+ let amountBalanceOld = $t03216632459._1
733+ let priceBalanceOld = $t03216632459._2
734+ let $t03246332612 = if (paymentInAmountAsset)
547735 then $Tuple2(paymentAmountRaw, 0)
548736 else $Tuple2(0, paymentAmountRaw)
549- let amountAssetAmountRaw = $t02570325852._1
550- let priceAssetAmountRaw = $t02570325852._2
737+ let amountAssetAmountRaw = $t03246332612._1
738+ let priceAssetAmountRaw = $t03246332612._2
551739 let amountAssetAmount = takeFee(amountAssetAmountRaw, inFee)._1
552740 let priceAssetAmount = takeFee(priceAssetAmountRaw, inFee)._1
553- let $t02598426048 = takeFee(paymentAmountRaw, inFee)
554- let paymentAmount = $t02598426048._1
555- let feeAmount = $t02598426048._2
741+ let $t03274432808 = takeFee(paymentAmountRaw, inFee)
742+ let paymentAmount = $t03274432808._1
743+ let feeAmount = $t03274432808._2
556744 let amountBalanceNew = (amountBalanceOld + amountAssetAmount)
557745 let priceBalanceNew = (priceBalanceOld + priceAssetAmount)
558746 let priceNewX18 = calcPriceBigInt(toX18(priceBalanceNew, cfgPriceAssetDecimals), toX18(amountBalanceNew, cfgAmountAssetDecimals))
559747 let priceNew = fromX18(priceNewX18, scale8)
560748 let paymentBalance = if (paymentInAmountAsset)
561749 then amountBalanceOld
562750 else priceBalanceOld
563751 let paymentBalanceBigInt = toBigInt(paymentBalance)
564752 let supplyBigInt = toBigInt(valueOrErrorMessage(assetInfo(cfgLpAssetId), (("asset " + toBase58String(cfgLpAssetId)) + " doesn't exist")).quantity)
565753 let chechSupply = if ((supplyBigInt > big0))
566754 then true
567755 else throwErr("initial deposit requires all coins")
568756 if ((chechSupply == chechSupply))
569757 then {
570758 let depositBigInt = toBigInt(paymentAmount)
571759 let issueAmount = max([0, toInt(((supplyBigInt * (sqrtBigInt((scale18 + ((depositBigInt * scale18) / paymentBalanceBigInt)), 18, 18, DOWN) - scale18)) / scale18))])
572760 let commonState = if (isEval)
573761 then nil
574762 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))]
575763 let priceOldX18 = calcPriceBigInt(toX18(priceBalanceOld, cfgPriceAssetDecimals), toX18(amountBalanceOld, cfgAmountAssetDecimals))
576764 let priceOld = fromX18(priceOldX18, scale8)
577765 let loss = {
578- let $t02772927896 = if (paymentInAmountAsset)
766+ let $t03448934656 = if (paymentInAmountAsset)
579767 then $Tuple2(amountAssetAmountRaw, amountBalanceOld)
580768 else $Tuple2(priceAssetAmountRaw, priceBalanceOld)
581- let amount = $t02772927896._1
582- let balance = $t02772927896._2
769+ let amount = $t03448934656._1
770+ let balance = $t03448934656._2
583771 let issueAmountBoth = toInt(fraction(supplyBigInt, toBigInt((amount / 2)), toBigInt(balance)))
584772 fraction((issueAmount - issueAmountBoth), scale8, issueAmountBoth)
585773 }
586774 $Tuple5(issueAmount, commonState, feeAmount, loss, paymentInAmountAsset)
587775 }
588776 else throw("Strict value is not equal to itself.")
589777 }
590778
591779
592780 func calcGetOneToken (outAssetId,paymentAmount,paymentAssetId,userAddress,txId) = {
593781 let isEval = (txId == unit)
594782 let cfg = getPoolConfig()
595783 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
596784 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
597785 let checks = [if ((paymentAssetId == cfgLpAssetId))
598786 then true
599787 else throwErr("invalid lp asset")]
600788 if ((checks == checks))
601789 then {
602790 let outInAmountAsset = if ((outAssetId == cfgAmountAssetId))
603791 then true
604792 else if ((outAssetId == cfgPriceAssetId))
605793 then false
606794 else throwErr("invalid asset")
607795 let balanceBigInt = if (outInAmountAsset)
608796 then toBigInt(getAccBalance(assetIdToString(cfgAmountAssetId)))
609797 else toBigInt(getAccBalance(assetIdToString(cfgPriceAssetId)))
610798 let outInAmountAssetDecimals = if (outInAmountAsset)
611799 then amtAssetDcm
612800 else priceAssetDcm
613801 let amBalanceOld = getAccBalance(assetIdToString(cfgAmountAssetId))
614802 let prBalanceOld = getAccBalance(assetIdToString(cfgPriceAssetId))
615803 let outBalance = if (outInAmountAsset)
616804 then amBalanceOld
617805 else prBalanceOld
618806 let outBalanceBigInt = toBigInt(outBalance)
619807 let supplyBigInt = toBigInt(valueOrErrorMessage(assetInfo(cfgLpAssetId), (("asset " + toBase58String(cfgLpAssetId)) + " doesn't exist")).quantity)
620808 let redeemedBigInt = toBigInt(paymentAmount)
621809 let amountRaw = max([0, toInt(((balanceBigInt * (scale18 - pow((scale18 - ((redeemedBigInt * scale18) / supplyBigInt)), 18, big2, 0, 18, DOWN))) / scale18))])
622- let $t02997430030 = takeFee(amountRaw, outFee)
623- let totalAmount = $t02997430030._1
624- let feeAmount = $t02997430030._2
625- let $t03003430260 = if (outInAmountAsset)
810+ let $t03673436790 = takeFee(amountRaw, outFee)
811+ let totalAmount = $t03673436790._1
812+ let feeAmount = $t03673436790._2
813+ let $t03679437020 = if (outInAmountAsset)
626814 then $Tuple4(totalAmount, 0, (amBalanceOld - amountRaw), prBalanceOld)
627815 else $Tuple4(0, totalAmount, amBalanceOld, (prBalanceOld - amountRaw))
628- let outAmAmount = $t03003430260._1
629- let outPrAmount = $t03003430260._2
630- let amBalanceNew = $t03003430260._3
631- let prBalanceNew = $t03003430260._4
816+ let outAmAmount = $t03679437020._1
817+ let outPrAmount = $t03679437020._2
818+ let amBalanceNew = $t03679437020._3
819+ let prBalanceNew = $t03679437020._4
632820 let priceNewX18 = calcPriceBigInt(toX18(prBalanceNew, cfgPriceAssetDecimals), toX18(amBalanceNew, cfgAmountAssetDecimals))
633821 let priceNew = fromX18(priceNewX18, scale8)
634822 let commonState = if (isEval)
635823 then nil
636824 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)]
637825 let priceOldX18 = calcPriceBigInt(toX18(prBalanceOld, cfgPriceAssetDecimals), toX18(amBalanceOld, cfgAmountAssetDecimals))
638826 let priceOld = fromX18(priceOldX18, scale8)
639827 let loss = {
640828 let amountBothInPaymentAsset = (toInt(fraction(balanceBigInt, redeemedBigInt, supplyBigInt)) * 2)
641829 fraction((totalAmount - amountBothInPaymentAsset), scale8, amountBothInPaymentAsset)
642830 }
643831 $Tuple5(totalAmount, commonState, feeAmount, loss, outInAmountAsset)
644832 }
645833 else throw("Strict value is not equal to itself.")
646834 }
647835
648836
649837 func managerPublicKeyOrUnit () = match getString(mpk()) {
650838 case s: String =>
651839 fromBase58String(s)
652840 case _: Unit =>
653841 unit
654842 case _ =>
655843 throw("Match error")
656844 }
657845
658846
659847 func pendingManagerPublicKeyOrUnit () = match getString(pmpk()) {
660848 case s: String =>
661849 fromBase58String(s)
662850 case _: Unit =>
663851 unit
664852 case _ =>
665853 throw("Match error")
666854 }
667855
668856
669857 func isManager (i) = match managerPublicKeyOrUnit() {
670858 case pk: ByteVector =>
671859 (i.callerPublicKey == pk)
672860 case _: Unit =>
673861 (i.caller == this)
674862 case _ =>
675863 throw("Match error")
676864 }
677865
678866
679867 func mustManager (i) = {
680868 let pd = throw("Permission denied")
681869 match managerPublicKeyOrUnit() {
682870 case pk: ByteVector =>
683871 if ((i.callerPublicKey == pk))
684872 then true
685873 else pd
686874 case _: Unit =>
687875 if ((i.caller == this))
688876 then true
689877 else pd
690878 case _ =>
691879 throw("Match error")
692880 }
693881 }
694882
695883
696884 @Callable(i)
885+func rebalance () = (rebalanceAsset(getStringOrFail(this, aa())) ++ rebalanceAsset(getStringOrFail(this, pa())))
886+
887+
888+
889+@Callable(i)
697890 func calculateAmountOutForSwapREADONLY (cleanAmountIn,isReverse,feePoolAmount) = {
698- let $t03197732282 = if ((isReverse == false))
891+ let $t03890639211 = if ((isReverse == false))
699892 then {
700893 let assetOut = getStringOrFail(this, pa())
701894 let assetIn = getStringOrFail(this, aa())
702895 $Tuple2(assetOut, assetIn)
703896 }
704897 else {
705898 let assetOut = getStringOrFail(this, aa())
706899 let assetIn = getStringOrFail(this, pa())
707900 $Tuple2(assetOut, assetIn)
708901 }
709- let assetOut = $t03197732282._1
710- let assetIn = $t03197732282._2
902+ let assetOut = $t03890639211._1
903+ let assetIn = $t03890639211._2
711904 let poolAssetInBalance = getAccBalance(assetIn)
712905 let poolAssetOutBalance = getAccBalance(assetOut)
713906 let amountOut = fraction(poolAssetOutBalance, cleanAmountIn, (poolAssetInBalance + cleanAmountIn))
714907 let oldK = (toBigInt(poolAssetInBalance) * toBigInt(poolAssetOutBalance))
715908 let newK = (((toBigInt(getAccBalance(assetIn)) + toBigInt(cleanAmountIn)) + toBigInt(feePoolAmount)) * (toBigInt(getAccBalance(assetOut)) - toBigInt(amountOut)))
716909 let checkK = if ((newK >= oldK))
717910 then true
718911 else throw("new K is fewer error")
719912 if ((checkK == checkK))
720913 then $Tuple2(nil, amountOut)
721914 else throw("Strict value is not equal to itself.")
722915 }
723916
724917
725918
726919 @Callable(i)
727920 func calculateAmountOutForSwapAndSendTokens (cleanAmountIn,isReverse,amountOutMin,addressTo,feePoolAmount) = {
728921 let swapContact = {
729922 let @ = invoke(factoryContract, "getSwapContractREADONLY", nil, nil)
730923 if ($isInstanceOf(@, "String"))
731924 then @
732925 else throw(($getType(@) + " couldn't be cast to String"))
733926 }
734927 let checks = [if ((value(i.payments[0]).amount >= cleanAmountIn))
735928 then true
736929 else throwErr("Wrong amount"), if ((i.caller == addressFromStringValue(swapContact)))
737930 then true
738931 else throwErr("Permission denied")]
739932 if ((checks == checks))
740933 then {
741934 let pmt = value(i.payments[0])
742935 let assetIn = assetIdToString(pmt.assetId)
743936 let assetOut = if ((isReverse == false))
744937 then getStringOrFail(this, pa())
745938 else getStringOrFail(this, aa())
746939 let poolAssetInBalance = (getAccBalance(assetIn) - value(i.payments[0]).amount)
747940 let poolAssetOutBalance = getAccBalance(assetOut)
748941 let amountOut = fraction(poolAssetOutBalance, cleanAmountIn, (poolAssetInBalance + cleanAmountIn))
749942 let oldK = (toBigInt(poolAssetInBalance) * toBigInt(poolAssetOutBalance))
750943 let newK = ((toBigInt(getAccBalance(assetIn)) + toBigInt(feePoolAmount)) * (toBigInt(getAccBalance(assetOut)) - toBigInt(amountOut)))
751944 let checkK = if ((newK >= oldK))
752945 then true
753946 else throw("new K is fewer error")
754947 if ((checkK == checkK))
755948 then {
756949 let checkMin = if ((amountOut >= amountOutMin))
757950 then true
758951 else throw("Exchange result is fewer coins than expected")
759952 if ((checkMin == checkMin))
760- then $Tuple2([ScriptTransfer(addressFromStringValue(addressTo), amountOut, parseAssetId(assetOut))], amountOut)
953+ then {
954+ let rebalanceState = rebalanceAsset(assetIn)
955+ if ((rebalanceState == rebalanceState))
956+ then {
957+ let withdrawState = withdrawAndRebalanceAsset(assetOut, amountOut)
958+ if ((withdrawState == withdrawState))
959+ then $Tuple2(((withdrawState ++ rebalanceState) ++ [ScriptTransfer(addressFromStringValue(addressTo), amountOut, parseAssetId(assetOut))]), amountOut)
960+ else throw("Strict value is not equal to itself.")
961+ }
962+ else throw("Strict value is not equal to itself.")
963+ }
761964 else throw("Strict value is not equal to itself.")
762965 }
763966 else throw("Strict value is not equal to itself.")
764967 }
765968 else throw("Strict value is not equal to itself.")
766969 }
767970
768971
769972
770973 @Callable(i)
771974 func setManager (pendingManagerPublicKey) = {
772975 let checkCaller = mustManager(i)
773976 if ((checkCaller == checkCaller))
774977 then {
775978 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
776979 if ((checkManagerPublicKey == checkManagerPublicKey))
777980 then [StringEntry(pmpk(), pendingManagerPublicKey)]
778981 else throw("Strict value is not equal to itself.")
779982 }
780983 else throw("Strict value is not equal to itself.")
781984 }
782985
783986
784987
785988 @Callable(i)
786989 func confirmManager () = {
787990 let pm = pendingManagerPublicKeyOrUnit()
788991 let hasPM = if (isDefined(pm))
789992 then true
790993 else throw("No pending manager")
791994 if ((hasPM == hasPM))
792995 then {
793996 let checkPM = if ((i.callerPublicKey == value(pm)))
794997 then true
795998 else throw("You are not pending manager")
796999 if ((checkPM == checkPM))
7971000 then [StringEntry(mpk(), toBase58String(value(pm))), DeleteEntry(pmpk())]
7981001 else throw("Strict value is not equal to itself.")
7991002 }
8001003 else throw("Strict value is not equal to itself.")
8011004 }
8021005
8031006
8041007
8051008 @Callable(i)
8061009 func put (slippageTolerance,shouldAutoStake) = if ((0 > slippageTolerance))
8071010 then throw("Invalid slippageTolerance passed")
8081011 else {
8091012 let estPut = commonPut(i, slippageTolerance, true)
8101013 let emitLpAmt = estPut._2
8111014 let lpAssetId = estPut._7
8121015 let state = estPut._9
8131016 let amDiff = estPut._10
8141017 let prDiff = estPut._11
8151018 let amId = estPut._12
8161019 let prId = estPut._13
8171020 let amAssetPmt = toBigInt(value(i.payments[0]).amount)
8181021 let prAssetPmt = toBigInt(value(i.payments[1]).amount)
8191022 let currentKLp = calcCurrentKLp(amAssetPmt, prAssetPmt, toBigInt(0))
8201023 if ((currentKLp == currentKLp))
8211024 then {
8221025 let emitInv = invoke(factoryContract, "emit", [emitLpAmt], nil)
8231026 if ((emitInv == emitInv))
8241027 then {
8251028 let emitInvLegacy = match emitInv {
8261029 case legacyFactoryContract: Address =>
8271030 invoke(legacyFactoryContract, "emit", [emitLpAmt], nil)
8281031 case _ =>
8291032 unit
8301033 }
8311034 if ((emitInvLegacy == emitInvLegacy))
8321035 then {
8331036 let slippageAInv = if ((amDiff > 0))
8341037 then invoke(slippageContract, "put", nil, [AttachedPayment(amId, amDiff)])
8351038 else nil
8361039 if ((slippageAInv == slippageAInv))
8371040 then {
8381041 let slippagePInv = if ((prDiff > 0))
8391042 then invoke(slippageContract, "put", nil, [AttachedPayment(prId, prDiff)])
8401043 else nil
8411044 if ((slippagePInv == slippagePInv))
8421045 then {
8431046 let lpTransfer = if (shouldAutoStake)
8441047 then {
8451048 let slpStakeInv = invoke(stakingContract, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
8461049 if ((slpStakeInv == slpStakeInv))
8471050 then nil
8481051 else throw("Strict value is not equal to itself.")
8491052 }
8501053 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
851- let $t03716637628 = refreshKLpInternal(0, 0, 0)
852- if (($t03716637628 == $t03716637628))
1054+ let $t04425744719 = refreshKLpInternal(0, 0, 0)
1055+ if (($t04425744719 == $t04425744719))
8531056 then {
854- let updatedKLp = $t03716637628._2
855- let refreshKLpActions = $t03716637628._1
1057+ let updatedKLp = $t04425744719._2
1058+ let refreshKLpActions = $t04425744719._1
8561059 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
8571060 if ((isUpdatedKLpValid == isUpdatedKLpValid))
858- then ((state ++ lpTransfer) ++ refreshKLpActions)
1061+ then {
1062+ let reb = invoke(this, "rebalance", nil, nil)
1063+ if ((reb == reb))
1064+ then ((state ++ lpTransfer) ++ refreshKLpActions)
1065+ else throw("Strict value is not equal to itself.")
1066+ }
8591067 else throw("Strict value is not equal to itself.")
8601068 }
8611069 else throw("Strict value is not equal to itself.")
8621070 }
8631071 else throw("Strict value is not equal to itself.")
8641072 }
8651073 else throw("Strict value is not equal to itself.")
8661074 }
8671075 else throw("Strict value is not equal to itself.")
8681076 }
8691077 else throw("Strict value is not equal to itself.")
8701078 }
8711079 else throw("Strict value is not equal to itself.")
8721080 }
8731081
8741082
8751083
8761084 @Callable(i)
8771085 func putForFree (maxSlippage) = if ((0 > maxSlippage))
8781086 then throw("Invalid value passed")
8791087 else {
8801088 let estPut = commonPut(i, maxSlippage, false)
8811089 let state = estPut._9
8821090 let amAssetPmt = toBigInt(value(i.payments[0]).amount)
8831091 let prAssetPmt = toBigInt(value(i.payments[1]).amount)
8841092 let currentKLp = calcCurrentKLp(amAssetPmt, prAssetPmt, toBigInt(0))
8851093 if ((currentKLp == currentKLp))
8861094 then {
887- let $t03819038255 = refreshKLpInternal(0, 0, 0)
888- let refreshKLpActions = $t03819038255._1
889- let updatedKLp = $t03819038255._2
1095+ let $t04533145396 = refreshKLpInternal(0, 0, 0)
1096+ let refreshKLpActions = $t04533145396._1
1097+ let updatedKLp = $t04533145396._2
8901098 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
8911099 if ((isUpdatedKLpValid == isUpdatedKLpValid))
8921100 then (state ++ refreshKLpActions)
8931101 else throw("Strict value is not equal to itself.")
8941102 }
8951103 else throw("Strict value is not equal to itself.")
8961104 }
8971105
8981106
8991107
9001108 @Callable(i)
9011109 func putOneTkn (minOutAmount,autoStake) = {
9021110 let isPoolOneTokenOperationsDisabled = {
9031111 let @ = invoke(factoryContract, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
9041112 if ($isInstanceOf(@, "Boolean"))
9051113 then @
9061114 else throw(($getType(@) + " couldn't be cast to Boolean"))
9071115 }
9081116 let isPutDisabled = if (if (if (isGlobalShutdown())
9091117 then true
9101118 else (cfgPoolStatus == PoolPutDisabled))
9111119 then true
9121120 else (cfgPoolStatus == PoolShutdown))
9131121 then true
9141122 else isPoolOneTokenOperationsDisabled
9151123 let checks = [if (if (!(isPutDisabled))
9161124 then true
9171125 else isManager(i))
9181126 then true
9191127 else throwErr("put operation is blocked by admin"), if ((size(i.payments) == 1))
9201128 then true
9211129 else throwErr("exactly 1 payment are expected")]
9221130 if ((checks == checks))
9231131 then {
9241132 let payment = i.payments[0]
9251133 let paymentAssetId = payment.assetId
9261134 let paymentAmountRaw = payment.amount
9271135 let currentKLp = if ((paymentAssetId == cfgAmountAssetId))
9281136 then calcCurrentKLp(toBigInt(paymentAmountRaw), toBigInt(0), toBigInt(0))
9291137 else if ((paymentAssetId == cfgPriceAssetId))
9301138 then calcCurrentKLp(toBigInt(0), toBigInt(paymentAmountRaw), toBigInt(0))
9311139 else throwErr("payment asset is not supported")
9321140 if ((currentKLp == currentKLp))
9331141 then {
9341142 let userAddress = i.caller
9351143 let txId = i.transactionId
936- let $t03944339595 = calcPutOneToken(paymentAmountRaw, paymentAssetId, userAddress, txId)
937- if (($t03944339595 == $t03944339595))
1144+ let $t04658446736 = calcPutOneToken(paymentAmountRaw, paymentAssetId, userAddress, txId)
1145+ if (($t04658446736 == $t04658446736))
9381146 then {
939- let paymentInAmountAsset = $t03944339595._5
940- let bonus = $t03944339595._4
941- let feeAmount = $t03944339595._3
942- let commonState = $t03944339595._2
943- let emitAmountEstimated = $t03944339595._1
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
9441152 let emitAmount = if (if ((minOutAmount > 0))
9451153 then (minOutAmount > emitAmountEstimated)
9461154 else false)
9471155 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
9481156 else emitAmountEstimated
9491157 let emitInv = emit(emitAmount)
9501158 if ((emitInv == emitInv))
9511159 then {
9521160 let lpTransfer = if (autoStake)
9531161 then {
9541162 let stakeInv = invoke(stakingContract, "stake", nil, [AttachedPayment(cfgLpAssetId, emitAmount)])
9551163 if ((stakeInv == stakeInv))
9561164 then nil
9571165 else throw("Strict value is not equal to itself.")
9581166 }
9591167 else [ScriptTransfer(i.caller, emitAmount, cfgLpAssetId)]
9601168 let sendFee = if ((feeAmount > 0))
9611169 then [ScriptTransfer(feeCollectorAddress, feeAmount, paymentAssetId)]
9621170 else nil
963- let $t04018140378 = if ((this == feeCollectorAddress))
1171+ let $t04732247519 = if ((this == feeCollectorAddress))
9641172 then $Tuple2(0, 0)
9651173 else if (paymentInAmountAsset)
9661174 then $Tuple2(-(feeAmount), 0)
9671175 else $Tuple2(0, -(feeAmount))
968- let amountAssetBalanceDelta = $t04018140378._1
969- let priceAssetBalanceDelta = $t04018140378._2
970- let $t04038140489 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
971- let refreshKLpActions = $t04038140489._1
972- let updatedKLp = $t04038140489._2
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
9731181 let kLp = value(getString(keyKLp))
9741182 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
9751183 if ((isUpdatedKLpValid == isUpdatedKLpValid))
976- then $Tuple2((((commonState ++ lpTransfer) ++ sendFee) ++ refreshKLpActions), emitAmount)
1184+ then {
1185+ let reb = invoke(this, "rebalance", nil, nil)
1186+ if ((reb == reb))
1187+ then $Tuple2((((commonState ++ lpTransfer) ++ sendFee) ++ refreshKLpActions), emitAmount)
1188+ else throw("Strict value is not equal to itself.")
1189+ }
9771190 else throw("Strict value is not equal to itself.")
9781191 }
9791192 else throw("Strict value is not equal to itself.")
9801193 }
9811194 else throw("Strict value is not equal to itself.")
9821195 }
9831196 else throw("Strict value is not equal to itself.")
9841197 }
9851198 else throw("Strict value is not equal to itself.")
9861199 }
9871200
9881201
9891202
9901203 @Callable(i)
9911204 func putOneTknREADONLY (paymentAssetId,paymentAmountRaw) = {
992- let $t04079540952 = calcPutOneToken(paymentAmountRaw, parseAssetId(paymentAssetId), unit, unit)
993- let emitAmountEstimated = $t04079540952._1
994- let commonState = $t04079540952._2
995- let feeAmount = $t04079540952._3
996- let bonus = $t04079540952._4
997- let paymentInAmountAsset = $t04079540952._5
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
9981211 $Tuple2(nil, $Tuple3(emitAmountEstimated, feeAmount, bonus))
9991212 }
10001213
10011214
10021215
10031216 @Callable(i)
10041217 func getOneTkn (outAssetIdStr,minOutAmount) = {
10051218 let isPoolOneTokenOperationsDisabled = {
10061219 let @ = invoke(factoryContract, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
10071220 if ($isInstanceOf(@, "Boolean"))
10081221 then @
10091222 else throw(($getType(@) + " couldn't be cast to Boolean"))
10101223 }
10111224 let isGetDisabled = if (if (isGlobalShutdown())
10121225 then true
10131226 else (cfgPoolStatus == PoolShutdown))
10141227 then true
10151228 else isPoolOneTokenOperationsDisabled
10161229 let checks = [if (if (!(isGetDisabled))
10171230 then true
10181231 else isManager(i))
10191232 then true
10201233 else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 1))
10211234 then true
10221235 else throwErr("exactly 1 payment are expected")]
10231236 if ((checks == checks))
10241237 then {
10251238 let outAssetId = parseAssetId(outAssetIdStr)
10261239 let payment = i.payments[0]
10271240 let paymentAssetId = payment.assetId
10281241 let paymentAmount = payment.amount
10291242 let currentKLp = calcCurrentKLp(toBigInt(0), toBigInt(0), toBigInt(0))
10301243 if ((currentKLp == currentKLp))
10311244 then {
10321245 let userAddress = i.caller
10331246 let txId = i.transactionId
1034- let $t04183741990 = calcGetOneToken(outAssetId, paymentAmount, paymentAssetId, userAddress, txId)
1035- if (($t04183741990 == $t04183741990))
1247+ let $t04902749180 = calcGetOneToken(outAssetId, paymentAmount, paymentAssetId, userAddress, txId)
1248+ if (($t04902749180 == $t04902749180))
10361249 then {
1037- let outInAmountAsset = $t04183741990._5
1038- let bonus = $t04183741990._4
1039- let feeAmount = $t04183741990._3
1040- let commonState = $t04183741990._2
1041- let amountEstimated = $t04183741990._1
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
10421255 let amount = if (if ((minOutAmount > 0))
10431256 then (minOutAmount > amountEstimated)
10441257 else false)
10451258 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
10461259 else amountEstimated
10471260 let burnInv = invoke(factoryContract, "burn", [paymentAmount], [AttachedPayment(paymentAssetId, paymentAmount)])
10481261 if ((burnInv == burnInv))
10491262 then {
1263+ let withdrawState = withdrawAndRebalanceAsset(outAssetIdStr, (amount + max([0, feeAmount])))
10501264 let assetTransfer = [ScriptTransfer(userAddress, amount, outAssetId)]
10511265 let sendFee = if ((feeAmount > 0))
10521266 then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetId)]
10531267 else nil
1054- let $t04249042737 = {
1268+ let $t04984450091 = {
10551269 let feeAmountForCalc = if ((this == feeCollectorAddress))
10561270 then 0
10571271 else feeAmount
10581272 if (outInAmountAsset)
10591273 then $Tuple2(-((amount + feeAmountForCalc)), 0)
10601274 else $Tuple2(0, -((amount + feeAmountForCalc)))
10611275 }
1062- let amountAssetBalanceDelta = $t04249042737._1
1063- let priceAssetBalanceDelta = $t04249042737._2
1064- let $t04274042848 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1065- let refreshKLpActions = $t04274042848._1
1066- let updatedKLp = $t04274042848._2
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
10671281 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
10681282 if ((isUpdatedKLpValid == isUpdatedKLpValid))
1069- then $Tuple2((((commonState ++ assetTransfer) ++ sendFee) ++ refreshKLpActions), amount)
1283+ then $Tuple2(((((commonState ++ withdrawState) ++ assetTransfer) ++ sendFee) ++ refreshKLpActions), amount)
10701284 else throw("Strict value is not equal to itself.")
10711285 }
10721286 else throw("Strict value is not equal to itself.")
10731287 }
10741288 else throw("Strict value is not equal to itself.")
10751289 }
10761290 else throw("Strict value is not equal to itself.")
10771291 }
10781292 else throw("Strict value is not equal to itself.")
10791293 }
10801294
10811295
10821296
10831297 @Callable(i)
10841298 func getOneTknREADONLY (outAssetId,paymentAmount) = {
1085- let $t04310543261 = calcGetOneToken(parseAssetId(outAssetId), paymentAmount, cfgLpAssetId, unit, unit)
1086- let amountEstimated = $t04310543261._1
1087- let commonState = $t04310543261._2
1088- let feeAmount = $t04310543261._3
1089- let bonus = $t04310543261._4
1090- let outInAmountAsset = $t04310543261._5
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
10911305 $Tuple2(nil, $Tuple3(amountEstimated, feeAmount, bonus))
10921306 }
10931307
10941308
10951309
10961310 @Callable(i)
10971311 func unstakeAndGetOneTkn (unstakeAmount,outAssetIdStr,minOutAmount) = {
10981312 let isPoolOneTokenOperationsDisabled = {
10991313 let @ = invoke(factoryContract, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
11001314 if ($isInstanceOf(@, "Boolean"))
11011315 then @
11021316 else throw(($getType(@) + " couldn't be cast to Boolean"))
11031317 }
11041318 let isGetDisabled = if (if (isGlobalShutdown())
11051319 then true
11061320 else (cfgPoolStatus == PoolShutdown))
11071321 then true
11081322 else isPoolOneTokenOperationsDisabled
11091323 let checks = [if (if (!(isGetDisabled))
11101324 then true
11111325 else isManager(i))
11121326 then true
11131327 else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 0))
11141328 then true
11151329 else throwErr("no payments are expected")]
11161330 if ((checks == checks))
11171331 then {
11181332 let outAssetId = parseAssetId(outAssetIdStr)
11191333 let userAddress = i.caller
11201334 let txId = i.transactionId
11211335 let currentKLp = calcCurrentKLp(toBigInt(0), toBigInt(0), toBigInt(0))
11221336 if ((currentKLp == currentKLp))
11231337 then {
11241338 let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(cfgLpAssetId), unstakeAmount], nil)
11251339 if ((unstakeInv == unstakeInv))
11261340 then {
1127- let $t04416644317 = calcGetOneToken(outAssetId, unstakeAmount, cfgLpAssetId, userAddress, txId)
1128- if (($t04416644317 == $t04416644317))
1341+ let $t05154151692 = calcGetOneToken(outAssetId, unstakeAmount, cfgLpAssetId, userAddress, txId)
1342+ if (($t05154151692 == $t05154151692))
11291343 then {
1130- let outInAmountAsset = $t04416644317._5
1131- let bonus = $t04416644317._4
1132- let feeAmount = $t04416644317._3
1133- let commonState = $t04416644317._2
1134- let amountEstimated = $t04416644317._1
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
11351349 let amount = if (if ((minOutAmount > 0))
11361350 then (minOutAmount > amountEstimated)
11371351 else false)
11381352 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
11391353 else amountEstimated
11401354 let burnInv = invoke(factoryContract, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
11411355 if ((burnInv == burnInv))
11421356 then {
1357+ let withdrawState = withdrawAndRebalanceAsset(outAssetIdStr, (amount + max([0, feeAmount])))
11431358 let assetTransfer = [ScriptTransfer(i.caller, amount, outAssetId)]
11441359 let sendFee = if ((feeAmount > 0))
11451360 then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetId)]
11461361 else nil
1147- let $t04481245059 = {
1362+ let $t05235152598 = {
11481363 let feeAmountForCalc = if ((this == feeCollectorAddress))
11491364 then 0
11501365 else feeAmount
11511366 if (outInAmountAsset)
11521367 then $Tuple2(-((amount + feeAmountForCalc)), 0)
11531368 else $Tuple2(0, -((amount + feeAmountForCalc)))
11541369 }
1155- let amountAssetBalanceDelta = $t04481245059._1
1156- let priceAssetBalanceDelta = $t04481245059._2
1157- let $t04506245170 = refreshKLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1158- let refreshKLpActions = $t04506245170._1
1159- let updatedKLp = $t04506245170._2
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
11601375 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
11611376 if ((isUpdatedKLpValid == isUpdatedKLpValid))
1162- then $Tuple2((((commonState ++ assetTransfer) ++ sendFee) ++ refreshKLpActions), amount)
1377+ then $Tuple2(((((commonState ++ withdrawState) ++ assetTransfer) ++ sendFee) ++ refreshKLpActions), amount)
11631378 else throw("Strict value is not equal to itself.")
11641379 }
11651380 else throw("Strict value is not equal to itself.")
11661381 }
11671382 else throw("Strict value is not equal to itself.")
11681383 }
11691384 else throw("Strict value is not equal to itself.")
11701385 }
11711386 else throw("Strict value is not equal to itself.")
11721387 }
11731388 else throw("Strict value is not equal to itself.")
11741389 }
11751390
11761391
11771392
11781393 @Callable(i)
11791394 func get () = {
11801395 let res = commonGet(i)
1181- let outAmtAmt = res._1
1396+ let outAmAmt = res._1
11821397 let outPrAmt = res._2
11831398 let pmtAmt = res._3
11841399 let pmtAssetId = res._4
11851400 let state = res._5
1401+ let withdrawState = withdrawAndRebalanceAll(outAmAmt, outPrAmt)
11861402 let currentKLp = calcCurrentKLp(toBigInt(0), toBigInt(0), toBigInt(0))
11871403 if ((currentKLp == currentKLp))
11881404 then {
11891405 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
11901406 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
11911407 then {
1192- let $t04611646198 = refreshKLpInternal(-(outAmtAmt), -(outPrAmt), 0)
1193- let refreshKLpActions = $t04611646198._1
1194- let updatedKLp = $t04611646198._2
1408+ let $t05380453885 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1409+ let refreshKLpActions = $t05380453885._1
1410+ let updatedKLp = $t05380453885._2
11951411 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
11961412 if ((isUpdatedKLpValid == isUpdatedKLpValid))
1197- then (state ++ refreshKLpActions)
1413+ then ((withdrawState ++ state) ++ refreshKLpActions)
11981414 else throw("Strict value is not equal to itself.")
11991415 }
12001416 else throw("Strict value is not equal to itself.")
12011417 }
12021418 else throw("Strict value is not equal to itself.")
12031419 }
12041420
12051421
12061422
12071423 @Callable(i)
12081424 func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = {
12091425 let res = commonGet(i)
12101426 let outAmAmt = res._1
12111427 let outPrAmt = res._2
12121428 let pmtAmt = res._3
12131429 let pmtAssetId = res._4
12141430 let state = res._5
12151431 if ((noLessThenAmtAsset > outAmAmt))
12161432 then throw(((("noLessThenAmtAsset failed: " + toString(outAmAmt)) + " < ") + toString(noLessThenAmtAsset)))
12171433 else if ((noLessThenPriceAsset > outPrAmt))
12181434 then throw(((("noLessThenPriceAsset failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset)))
12191435 else {
1436+ let withdrawState = withdrawAndRebalanceAll(outAmAmt, outPrAmt)
12201437 let currentKLp = calcCurrentKLp(toBigInt(0), toBigInt(0), toBigInt(0))
12211438 if ((currentKLp == currentKLp))
12221439 then {
12231440 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
12241441 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
12251442 then {
1226- let $t04714747228 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1227- let refreshKLpActions = $t04714747228._1
1228- let updatedKLp = $t04714747228._2
1443+ let $t05498055061 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1444+ let refreshKLpActions = $t05498055061._1
1445+ let updatedKLp = $t05498055061._2
12291446 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
12301447 if ((isUpdatedKLpValid == isUpdatedKLpValid))
1231- then (state ++ refreshKLpActions)
1448+ then ((withdrawState ++ state) ++ refreshKLpActions)
12321449 else throw("Strict value is not equal to itself.")
12331450 }
12341451 else throw("Strict value is not equal to itself.")
12351452 }
12361453 else throw("Strict value is not equal to itself.")
12371454 }
12381455 }
12391456
12401457
12411458
12421459 @Callable(i)
12431460 func unstakeAndGet (amount) = {
12441461 let checkPayments = if ((size(i.payments) != 0))
12451462 then throw("No payments are expected")
12461463 else true
12471464 if ((checkPayments == checkPayments))
12481465 then {
12491466 let cfg = getPoolConfig()
12501467 let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId])
12511468 let currentKLp = calcCurrentKLp(toBigInt(0), toBigInt(0), toBigInt(0))
12521469 if ((currentKLp == currentKLp))
12531470 then {
12541471 let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(lpAssetId), amount], nil)
12551472 if ((unstakeInv == unstakeInv))
12561473 then {
12571474 let res = estimateGetOperation(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
12581475 let outAmAmt = res._1
12591476 let outPrAmt = res._2
12601477 let poolStatus = parseIntValue(res._9)
12611478 let state = res._10
1479+ let withdrawState = withdrawAndRebalanceAll(outAmAmt, outPrAmt)
12621480 let checkPoolStatus = if (if (isGlobalShutdown())
12631481 then true
12641482 else (poolStatus == PoolShutdown))
12651483 then throw(("Get operation is blocked by admin. Status = " + toString(poolStatus)))
12661484 else true
12671485 if ((checkPoolStatus == checkPoolStatus))
12681486 then {
12691487 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
12701488 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
12711489 then {
1272- let $t04835448435 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1273- let refreshKLpActions = $t04835448435._1
1274- let updatedKLp = $t04835448435._2
1490+ let $t05633356414 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1491+ let refreshKLpActions = $t05633356414._1
1492+ let updatedKLp = $t05633356414._2
12751493 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
12761494 if ((isUpdatedKLpValid == isUpdatedKLpValid))
1277- then (state ++ refreshKLpActions)
1495+ then ((withdrawState ++ state) ++ refreshKLpActions)
12781496 else throw("Strict value is not equal to itself.")
12791497 }
12801498 else throw("Strict value is not equal to itself.")
12811499 }
12821500 else throw("Strict value is not equal to itself.")
12831501 }
12841502 else throw("Strict value is not equal to itself.")
12851503 }
12861504 else throw("Strict value is not equal to itself.")
12871505 }
12881506 else throw("Strict value is not equal to itself.")
12891507 }
12901508
12911509
12921510
12931511 @Callable(i)
12941512 func unstakeAndGetNoLess (unstakeAmount,noLessThenAmountAsset,noLessThenPriceAsset) = {
12951513 let isGetDisabled = if (isGlobalShutdown())
12961514 then true
12971515 else (cfgPoolStatus == PoolShutdown)
12981516 let checks = [if (!(isGetDisabled))
12991517 then true
13001518 else throw("get operation is blocked by admin"), if ((size(i.payments) == 0))
13011519 then true
13021520 else throw("no payments are expected")]
13031521 if ((checks == checks))
13041522 then {
13051523 let currentKLp = calcCurrentKLp(toBigInt(0), toBigInt(0), toBigInt(0))
13061524 if ((currentKLp == currentKLp))
13071525 then {
13081526 let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(cfgLpAssetId), unstakeAmount], nil)
13091527 if ((unstakeInv == unstakeInv))
13101528 then {
13111529 let res = estimateGetOperation(toBase58String(i.transactionId), toBase58String(cfgLpAssetId), unstakeAmount, i.caller)
13121530 let outAmAmt = res._1
13131531 let outPrAmt = res._2
13141532 let state = res._10
1533+ let withdrawState = withdrawAndRebalanceAll(outAmAmt, outPrAmt)
13151534 let checkAmounts = [if ((outAmAmt >= noLessThenAmountAsset))
13161535 then true
13171536 else throw(makeString(["amount asset amount to receive is less than ", toString(noLessThenAmountAsset)], "")), if ((outPrAmt >= noLessThenPriceAsset))
13181537 then true
13191538 else throw(makeString(["price asset amount to receive is less than ", toString(noLessThenPriceAsset)], ""))]
13201539 if ((checkAmounts == checkAmounts))
13211540 then {
13221541 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
13231542 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
13241543 then {
1325- let $t04973049811 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1326- let refreshKLpActions = $t04973049811._1
1327- let updatedKLp = $t04973049811._2
1544+ let $t05785557936 = refreshKLpInternal(-(outAmAmt), -(outPrAmt), 0)
1545+ let refreshKLpActions = $t05785557936._1
1546+ let updatedKLp = $t05785557936._2
13281547 let isUpdatedKLpValid = validateUpdatedKLp(currentKLp, updatedKLp)
13291548 if ((isUpdatedKLpValid == isUpdatedKLpValid))
1330- then (state ++ refreshKLpActions)
1549+ then ((withdrawState ++ state) ++ refreshKLpActions)
13311550 else throw("Strict value is not equal to itself.")
13321551 }
13331552 else throw("Strict value is not equal to itself.")
13341553 }
13351554 else throw("Strict value is not equal to itself.")
13361555 }
13371556 else throw("Strict value is not equal to itself.")
13381557 }
13391558 else throw("Strict value is not equal to itself.")
13401559 }
13411560 else throw("Strict value is not equal to itself.")
13421561 }
13431562
13441563
13451564
13461565 @Callable(i)
13471566 func activate (amtAssetStr,priceAssetStr) = if ((toString(i.caller) != toString(factoryContract)))
13481567 then throw("permissions denied")
13491568 else $Tuple2([StringEntry(aa(), amtAssetStr), StringEntry(pa(), priceAssetStr)], "success")
13501569
13511570
13521571
13531572 @Callable(i)
13541573 func refreshKLp () = {
13551574 let lastRefreshedBlockHeight = valueOrElse(getInteger(keyKLpRefreshedHeight), 0)
13561575 let checkLastRefreshedBlockHeight = if (((height - lastRefreshedBlockHeight) >= kLpRefreshDelay))
13571576 then unit
13581577 else throwErr(makeString([toString(kLpRefreshDelay), " blocks have not passed since the previous call"], ""))
13591578 if ((checkLastRefreshedBlockHeight == checkLastRefreshedBlockHeight))
13601579 then {
13611580 let kLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyKLp), "0")), fmtErr("invalid kLp"))
1362- let $t05099851062 = refreshKLpInternal(0, 0, 0)
1363- let kLpUpdateActions = $t05099851062._1
1364- let updatedKLp = $t05099851062._2
1581+ let $t05914059204 = refreshKLpInternal(0, 0, 0)
1582+ let kLpUpdateActions = $t05914059204._1
1583+ let updatedKLp = $t05914059204._2
13651584 let actions = if ((kLp != updatedKLp))
13661585 then kLpUpdateActions
13671586 else throwErr("nothing to refresh")
13681587 $Tuple2(actions, toString(updatedKLp))
13691588 }
13701589 else throw("Strict value is not equal to itself.")
13711590 }
13721591
13731592
13741593
13751594 @Callable(i)
13761595 func getPoolConfigWrapperREADONLY () = $Tuple2(nil, getPoolConfig())
13771596
13781597
13791598
13801599 @Callable(i)
13811600 func getAccBalanceWrapperREADONLY (assetId) = $Tuple2(nil, getAccBalance(assetId))
13821601
13831602
13841603
13851604 @Callable(i)
13861605 func calcPricesWrapperREADONLY (amAmt,prAmt,lpAmt) = {
13871606 let prices = calcPrices(amAmt, prAmt, lpAmt)
13881607 $Tuple2(nil, [toString(prices[0]), toString(prices[1]), toString(prices[2])])
13891608 }
13901609
13911610
13921611
13931612 @Callable(i)
13941613 func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(toX18(origVal, origScaleMult)))
13951614
13961615
13971616
13981617 @Callable(i)
13991618 func fromX18WrapperREADONLY (val,resultScaleMult) = $Tuple2(nil, fromX18(parseBigIntValue(val), resultScaleMult))
14001619
14011620
14021621
14031622 @Callable(i)
14041623 func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(calcPriceBigInt(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
14051624
14061625
14071626
14081627 @Callable(i)
14091628 func estimatePutOperationWrapperREADONLY (txId58,slippageTolerance,inAmAssetAmt,inAmAssetId,inPrAssetAmt,inPrAssetId,userAddress,isEvaluate,emitLp) = $Tuple2(nil, estimatePutOperation(txId58, slippageTolerance, inAmAssetAmt, inAmAssetId, inPrAssetAmt, inPrAssetId, userAddress, isEvaluate, emitLp))
14101629
14111630
14121631
14131632 @Callable(i)
14141633 func estimateGetOperationWrapperREADONLY (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
14151634 let res = estimateGetOperation(txId58, pmtAssetId, pmtLpAmt, addressFromStringValue(userAddress))
14161635 $Tuple2(nil, $Tuple10(res._1, res._2, res._3, res._4, res._5, res._6, res._7, toString(res._8), res._9, res._10))
14171636 }
14181637
14191638
14201639
14211640 @Callable(i)
14221641 func statsREADONLY () = {
14231642 let cfg = getPoolConfig()
14241643 let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId])
14251644 let amtAssetId = cfg[idxAmtAssetId]
14261645 let priceAssetId = cfg[idxPriceAssetId]
14271646 let iAmtAssetId = cfg[idxIAmtAssetId]
14281647 let iPriceAssetId = cfg[idxIPriceAssetId]
14291648 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
14301649 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
14311650 let poolLPBalance = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
14321651 let accAmtAssetBalance = getAccBalance(amtAssetId)
14331652 let accPriceAssetBalance = getAccBalance(priceAssetId)
14341653 let pricesList = if ((poolLPBalance == 0))
14351654 then [zeroBigInt, zeroBigInt, zeroBigInt]
14361655 else calcPrices(accAmtAssetBalance, accPriceAssetBalance, poolLPBalance)
14371656 let curPrice = 0
14381657 let lpAmtAssetShare = fromX18(pricesList[1], scale8)
14391658 let lpPriceAssetShare = fromX18(pricesList[2], scale8)
14401659 let poolWeight = value(getInteger(factoryContract, keyPoolWeight(toString(this))))
14411660 $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))
14421661 }
14431662
14441663
14451664
14461665 @Callable(i)
14471666 func evaluatePutByAmountAssetREADONLY (inAmAssetAmt) = {
14481667 let cfg = getPoolConfig()
14491668 let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId])
14501669 let amAssetIdStr = cfg[idxAmtAssetId]
14511670 let amAssetId = fromBase58String(amAssetIdStr)
14521671 let prAssetIdStr = cfg[idxPriceAssetId]
14531672 let prAssetId = fromBase58String(prAssetIdStr)
14541673 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
14551674 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
14561675 let poolStatus = cfg[idxPoolStatus]
14571676 let poolLPBalance = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
14581677 let accAmtAssetBalance = getAccBalance(amAssetIdStr)
14591678 let accPriceAssetBalance = getAccBalance(prAssetIdStr)
14601679 let amtAssetAmtX18 = toX18(accAmtAssetBalance, amtAssetDcm)
14611680 let priceAssetAmtX18 = toX18(accPriceAssetBalance, priceAssetDcm)
14621681 let curPriceX18 = if ((poolLPBalance == 0))
14631682 then zeroBigInt
14641683 else calcPriceBigInt(priceAssetAmtX18, amtAssetAmtX18)
14651684 let inAmAssetAmtX18 = toX18(inAmAssetAmt, amtAssetDcm)
14661685 let inPrAssetAmtX18 = fraction(inAmAssetAmtX18, curPriceX18, scale18)
14671686 let inPrAssetAmt = fromX18(inPrAssetAmtX18, priceAssetDcm)
14681687 let estPut = estimatePutOperation("", 500000, inAmAssetAmt, amAssetId, inPrAssetAmt, prAssetId, "", true, false)
14691688 let calcLpAmt = estPut._1
14701689 let curPriceCalc = estPut._3
14711690 let amBalance = estPut._4
14721691 let prBalance = estPut._5
14731692 let lpEmission = estPut._6
14741693 $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))
14751694 }
14761695
14771696
14781697
14791698 @Callable(i)
14801699 func evaluatePutByPriceAssetREADONLY (inPrAssetAmt) = {
14811700 let cfg = getPoolConfig()
14821701 let lpAssetId = fromBase58String(cfg[idxPoolLPAssetId])
14831702 let amAssetIdStr = cfg[idxAmtAssetId]
14841703 let amAssetId = fromBase58String(amAssetIdStr)
14851704 let prAssetIdStr = cfg[idxPriceAssetId]
14861705 let prAssetId = fromBase58String(prAssetIdStr)
14871706 let amtAssetDcm = parseIntValue(cfg[idxAmtAssetDcm])
14881707 let priceAssetDcm = parseIntValue(cfg[idxPriceAssetDcm])
14891708 let poolStatus = cfg[idxPoolStatus]
14901709 let poolLPBalance = valueOrErrorMessage(assetInfo(lpAssetId), (("Asset " + toBase58String(lpAssetId)) + " doesn't exist")).quantity
14911710 let amBalanceRaw = getAccBalance(amAssetIdStr)
14921711 let prBalanceRaw = getAccBalance(prAssetIdStr)
14931712 let amBalanceRawX18 = toX18(amBalanceRaw, amtAssetDcm)
14941713 let prBalanceRawX18 = toX18(prBalanceRaw, priceAssetDcm)
14951714 let curPriceX18 = if ((poolLPBalance == 0))
14961715 then zeroBigInt
14971716 else calcPriceBigInt(prBalanceRawX18, amBalanceRawX18)
14981717 let inPrAssetAmtX18 = toX18(inPrAssetAmt, priceAssetDcm)
14991718 let inAmAssetAmtX18 = fraction(inPrAssetAmtX18, scale18, curPriceX18)
15001719 let inAmAssetAmt = fromX18(inAmAssetAmtX18, amtAssetDcm)
15011720 let estPut = estimatePutOperation("", 500000, inAmAssetAmt, amAssetId, inPrAssetAmt, prAssetId, "", true, false)
15021721 let calcLpAmt = estPut._1
15031722 let curPriceCalc = estPut._3
15041723 let amBalance = estPut._4
15051724 let prBalance = estPut._5
15061725 let lpEmission = estPut._6
15071726 $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))
15081727 }
15091728
15101729
15111730
15121731 @Callable(i)
15131732 func evaluateGetREADONLY (paymentLpAssetId,paymentLpAmt) = {
15141733 let res = estimateGetOperation("", paymentLpAssetId, paymentLpAmt, this)
15151734 let outAmAmt = res._1
15161735 let outPrAmt = res._2
15171736 let amBalance = res._5
15181737 let prBalance = res._6
15191738 let lpEmission = res._7
15201739 let curPrice = res._8
15211740 let poolStatus = parseIntValue(res._9)
15221741 $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))
15231742 }
15241743
15251744
15261745 @Verifier(tx)
15271746 func verify () = {
15281747 let targetPublicKey = match managerPublicKeyOrUnit() {
15291748 case pk: ByteVector =>
15301749 pk
15311750 case _: Unit =>
15321751 tx.senderPublicKey
15331752 case _ =>
15341753 throw("Match error")
15351754 }
15361755 match tx {
15371756 case order: Order =>
15381757 let matcherPub = getMatcherPubOrFail()
1539- let $t05972459793 = validateMatcherOrderAllowed(order)
1540- let orderValid = $t05972459793._1
1541- let orderValidInfo = $t05972459793._2
1758+ let $t06786667935 = validateMatcherOrderAllowed(order)
1759+ let orderValid = $t06786667935._1
1760+ let orderValidInfo = $t06786667935._2
15421761 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
15431762 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
15441763 if (if (if (orderValid)
15451764 then senderValid
15461765 else false)
15471766 then matcherValid
15481767 else false)
15491768 then true
15501769 else throwOrderError(orderValid, orderValidInfo, senderValid, matcherValid)
15511770 case s: SetScriptTransaction =>
15521771 if (sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey))
15531772 then true
15541773 else {
15551774 let newHash = blake2b256(value(s.script))
15561775 let allowedHash = fromBase64String(value(getString(factoryContract, keyAllowedLpScriptHash())))
15571776 let currentHash = scriptHash(this)
15581777 if ((allowedHash == newHash))
15591778 then (currentHash != newHash)
15601779 else false
15611780 }
15621781 case _ =>
15631782 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
15641783 }
15651784 }
15661785

github/deemru/w8io/786bc32 
250.19 ms