2023.10.16 17:56 [3867170] smart account 3P5muaLnF5EB3QEZTzkPYFDBdMeH8EnNkXs > SELF 0.00000000 Waves

{ "type": 13, "id": "5HjSL8sJRyRJPbmg9szrVyc7ybKRXy4wqivZJQTfpq6Q", "fee": 4200000, "feeAssetId": null, "timestamp": 1697468176236, "version": 2, "chainId": 87, "sender": "3P5muaLnF5EB3QEZTzkPYFDBdMeH8EnNkXs", "senderPublicKey": "4Ehd2yvuqp3EmRgQpRKmpb8D7FskicPp35nK7GCGZTuM", "proofs": [ "4rg6c8VqWzQWk9FCPkBBNJSB3vXQTkeH88w3EZUQ2K4UTvPt9HKQMwq2bRCRpJb7C42PWfHcWqtrzgW92jvrq8NZ" ], "script": "base64:BgLnLQgCEgUKAwEEARIHCgUBBAEIARIDCgEIEgQKAgEEEgQKAgEEEgMKAQESABIECgIIARIAEgQKAggBEgQKAggBEgQKAgEBEgMKAQESBQoDAQEBEgUKAwEIARIECgIBCBIECgIBCBIECgIICBIAEgMKAQgSBQoDAQEBEgQKAggBEgQKAgEBEgQKAggIEgsKCQgBAQIBAggEBBIGCgQICAEIEgAiBnNjYWxlOCIMc2NhbGU4QmlnSW50IgdzY2FsZTE4Igp6ZXJvQmlnSW50IgRiaWcwIgRiaWcxIgRiaWcyIgRiaWczIgRiaWc0IgpzbGlwcGFnZTREIgt3YXZlc1N0cmluZyIKYW1wSW5pdGlhbCIFQW11bHQiBURjb252IgNTRVAiBUVNUFRZIgpQb29sQWN0aXZlIgpQb29sUHV0RGlzIg5Qb29sTWF0Y2hlckRpcyIMUG9vbFNodXRkb3duIg5pZHhQb29sQWRkcmVzcyIJaWR4UG9vbFN0IglpZHhMUEFzSWQiCWlkeEFtQXNJZCIJaWR4UHJBc0lkIgtpZHhBbXRBc0RjbSINaWR4UHJpY2VBc0RjbSILaWR4SUFtdEFzSWQiDWlkeElQcmljZUFzSWQiD2lkeEZhY3RTdGFrQ250ciISaWR4RmFjdG9yeVJlc3RDbnRyIhBpZHhGYWN0U2xpcHBDbnRyIhFpZHhGYWN0R3d4UmV3Q250ciIKZmVlRGVmYXVsdCICdDEiB29yaWdWYWwiDW9yaWdTY2FsZU11bHQiCHQxQmlnSW50IgJmMSIDdmFsIg9yZXN1bHRTY2FsZU11bHQiDGZyb21YMThSb3VuZCIFcm91bmQiAnQyIgJmMiICdHMiA2FtdCIIcmVzU2NhbGUiCGN1clNjYWxlIgNhYnMiCWFic0JpZ0ludCICZmMiE2tleU1hbmFnZXJQdWJsaWNLZXkiFmtleU1hbmFnZXJWYXVsdEFkZHJlc3MiAnBsIgJwaCIBaCIBdCIDcGF1IgJ1YSIEdHhJZCIDZ2F1IgJhYSICcGEiA2FtcCINa2V5QW1wSGlzdG9yeSIMaGVpZ2h0QmxvY2tzIhRrZXlDaGFuZ2VBbXBMYXN0Q2FsbCIGa2V5RmVlIgNmZWUiBmtleURMcCIVa2V5RExwUmVmcmVzaGVkSGVpZ2h0IhJrZXlETHBSZWZyZXNoRGVsYXkiFmRMcFJlZnJlc2hEZWxheURlZmF1bHQiD2RMcFJlZnJlc2hEZWxheSIEZmNmZyIEbXRwayICcGMiBmlBbXRBcyIFaVByQXMiA21iYSIFYkFTdHIiA2FwcyIca2V5QWxsb3dlZExwU3RhYmxlU2NyaXB0SGFzaCIWa2V5RmVlQ29sbGVjdG9yQWRkcmVzcyIWa2V5U2tpcE9yZGVyVmFsaWRhdGlvbiILcG9vbEFkZHJlc3MiD3Rocm93T3JkZXJFcnJvciIKb3JkZXJWYWxpZCIOb3JkZXJWYWxpZEluZm8iC3NlbmRlclZhbGlkIgxtYXRjaGVyVmFsaWQiF2FkZHJlc3NGcm9tU3RyaW5nT3JUaGlzIg1hZGRyZXNzU3RyaW5nIgckbWF0Y2gwIgFhIhxnZXRNYW5hZ2VyVmF1bHRBZGRyZXNzT3JUaGlzIg5mYWN0b3J5QWRkcmVzcyIDZmNhIgFzIgRzdHJmIgRhZGRyIgNrZXkiBGludGYiCHRocm93RXJyIgNtc2ciBmZtdEVyciIFaW5GZWUiAUAiBm91dEZlZSIVa2V5QWRkcmVzc1doaXRlbGlzdGVkIgdhZGRyZXNzIhRpc0FkZHJlc3NXaGl0ZWxpc3RlZCIBQSIDaWdzIgJtcCITZmVlQ29sbGVjdG9yQWRkcmVzcyIDZ3BjIgVhbXRBcyIHcHJpY2VBcyIIaVByaWNlQXMiDHBhcnNlQXNzZXRJZCIFaW5wdXQiD2Fzc2V0SWRUb1N0cmluZyIPcGFyc2VQb29sQ29uZmlnIgpwb29sQ29uZmlnIhBwb29sQ29uZmlnUGFyc2VkIgskdDA4ODM2OTAyMiIOY2ZnUG9vbEFkZHJlc3MiDWNmZ1Bvb2xTdGF0dXMiDGNmZ0xwQXNzZXRJZCIQY2ZnQW1vdW50QXNzZXRJZCIPY2ZnUHJpY2VBc3NldElkIhZjZmdBbW91bnRBc3NldERlY2ltYWxzIhVjZmdQcmljZUFzc2V0RGVjaW1hbHMiA2dmYyINZmFjdG9yeUNvbmZpZyIPc3Rha2luZ0NvbnRyYWN0Ig9zbGlwYWdlQ29udHJhY3QiC2d3eENvbnRyYWN0IgxyZXN0Q29udHJhY3QiEWRhdGFQdXRBY3Rpb25JbmZvIg1pbkFtdEFzc2V0QW10Ig9pblByaWNlQXNzZXRBbXQiCG91dExwQW10IgVwcmljZSIKc2xpcEJ5VXNlciIMc2xpcHBhZ2VSZWFsIgh0eEhlaWdodCILdHhUaW1lc3RhbXAiDHNsaXBhZ2VBbUFtdCIMc2xpcGFnZVByQW10IhFkYXRhR2V0QWN0aW9uSW5mbyIOb3V0QW10QXNzZXRBbXQiEG91dFByaWNlQXNzZXRBbXQiB2luTHBBbXQiDWdldEFjY0JhbGFuY2UiB2Fzc2V0SWQiBGNwYmkiCHByQW10WDE4IghhbUFtdFgxOCIFY3BiaXIiA3ZhZCICQTEiAkEyIghzbGlwcGFnZSIEZGlmZiIEcGFzcyICdmQiAkQxIgJEMCIEc2xwZyIEZmFpbCIDcGNwIgphbUFzc2V0RGNtIgpwckFzc2V0RGNtIgVhbUFtdCIFcHJBbXQiC2FtdEFzQW10WDE4IgpwckFzQW10WDE4IgpjYWxjUHJpY2VzIgVscEFtdCIIYW10QXNEY20iB3ByQXNEY20iCHByaWNlWDE4IghscEFtdFgxOCINbHBQckluQW1Bc1gxOCINbHBQckluUHJBc1gxOCIPY2FsY3VsYXRlUHJpY2VzIgFwIgd0YWtlRmVlIgZhbW91bnQiCWZlZUFtb3VudCIEZ2V0RCICeHAiA3hwMCIDeHAxIgNhbm4iC3hwMF94cDFfbl9uIgVhbm5fcyIFYW5uXzEiCWNhbGNETmV4dCIBZCICZGQiA2RkZCICZHAiBGNhbGMiA2FjYyIBaSIFZE5leHQiCGREaWZmUmF3IgVkRGlmZiIDYXJyIg0kdDAxMzUyNzEzNTc1IgIkbCICJHMiBSRhY2MwIgUkZjBfMSICJGEiAiRpIgUkZjBfMiIFZm91bmQiA2VnbyIGdHhJZDU4IgpwbXRBc3NldElkIghwbXRMcEFtdCILdXNlckFkZHJlc3MiBGxwSWQiBGFtSWQiBHBySWQiBWFtRGNtIgVwckRjbSIDc3RzIgdscEVtaXNzIglhbUJhbGFuY2UiDGFtQmFsYW5jZVgxOCIJcHJCYWxhbmNlIgxwckJhbGFuY2VYMTgiC2N1clByaWNlWDE4IghjdXJQcmljZSILcG10THBBbXRYMTgiCmxwRW1pc3NYMTgiC291dEFtQW10WDE4IgtvdXRQckFtdFgxOCIIb3V0QW1BbXQiCG91dFByQW10IgVzdGF0ZSIDZXBvIgdpbkFtQW10IgZpbkFtSWQiB2luUHJBbXQiBmluUHJJZCIGaXNFdmFsIgZlbWl0THAiCmlzT25lQXNzZXQiEHZhbGlkYXRlU2xpcHBhZ2UiBnBtdEFtdCIFcG10SWQiB2FtSWRTdHIiB3BySWRTdHIiBmFtdERjbSIIcHJpY2VEY20iBGxwRW0iC2NoZWNrQXNzZXRzIg9pbkFtQXNzZXRBbXRYMTgiD2luUHJBc3NldEFtdFgxOCIMdXNlclByaWNlWDE4IgFyIgZjaGVja0QiC3NsaXBwYWdlWDE4Ig9zbGlwcGFnZVJlYWxYMTgiDWxwRW1pc3Npb25YMTgiCnByVmlhQW1YMTgiCmFtVmlhUHJYMTgiDGV4cGVjdGVkQW10cyIRZXhwQW10QXNzZXRBbXRYMTgiE2V4cFByaWNlQXNzZXRBbXRYMTgiCWNhbGNMcEFtdCIOY2FsY0FtQXNzZXRQbXQiDmNhbGNQckFzc2V0UG10IgxzbGlwcGFnZUNhbGMiCWVtaXRMcEFtdCIGYW1EaWZmIgZwckRpZmYiDSR0MDIxNDk4MjE4NDMiCndyaXRlQW1BbXQiCndyaXRlUHJBbXQiC2NvbW1vblN0YXRlIgVnZXRZRCIBRCIBbiIBeCIKYVByZWNpc2lvbiIBYyIBYiIDY3VyIg0kdDAyMzAzODIzMDU4IgF5IgV5TmV4dCIFeURpZmYiDSR0MDIzMzY1MjM0MTIiB2NhbGNETHAiDWFtb3VudEJhbGFuY2UiDHByaWNlQmFsYW5jZSIKbHBFbWlzc2lvbiIKdXBkYXRlZERMcCIOY2FsY0N1cnJlbnRETHAiEGFtb3VudEFzc2V0RGVsdGEiD3ByaWNlQXNzZXREZWx0YSIUbHBBc3NldEVtaXNzaW9uRGVsdGEiEmFtb3VudEFzc2V0QmFsYW5jZSIRcHJpY2VBc3NldEJhbGFuY2UiD2xwQXNzZXRFbWlzc2lvbiIKY3VycmVudERMcCIScmVmcmVzaERMcEludGVybmFsIhdhbW91bnRBc3NldEJhbGFuY2VEZWx0YSIWcHJpY2VBc3NldEJhbGFuY2VEZWx0YSIHYWN0aW9ucyISdmFsaWRhdGVVcGRhdGVkRExwIgZvbGRETHAiG3ZhbGlkYXRlTWF0Y2hlck9yZGVyQWxsb3dlZCIFb3JkZXIiEWFtb3VudEFzc2V0QW1vdW50IhBwcmljZUFzc2V0QW1vdW50Ig0kdDAyNTYxMDI1ODIyIgNkTHAiDSR0MDI2MTY0MjYyNjQiDXVudXNlZEFjdGlvbnMiBmRMcE5ldyIMaXNPcmRlclZhbGlkIgRpbmZvIgJjZyIDcG10Ig1pc0dldERpc2FibGVkIgJjcCIGY2FsbGVyIgdhbUFzUG10IgdwckFzUG10Ig1pc1B1dERpc2FibGVkIg1jYWxjUHV0T25lVGtuIglwbXRBbXRSYXciC3dpdGhUYWtlRmVlIg1jaGVjaEVtaXNzaW9uIg0kdDAyOTEyMzI5NTg1IgxhbUJhbGFuY2VPbGQiDHByQmFsYW5jZU9sZCINJHQwMjk1OTEyOTc2NyILYW1BbW91bnRSYXciC3ByQW1vdW50UmF3Ig0kdDAyOTc3MTMwMDI1IghhbUFtb3VudCIIcHJBbW91bnQiDGFtQmFsYW5jZU5ldyIMcHJCYWxhbmNlTmV3IghscEFtb3VudCIOcG9vbFByb3BvcnRpb24iD2Ftb3VudEFzc2V0UGFydCIOcHJpY2VBc3NldFBhcnQiCWxwQW10Qm90aCIFYm9udXMiE2dldE9uZVRrblYySW50ZXJuYWwiCm91dEFzc2V0SWQiDG1pbk91dEFtb3VudCIIcGF5bWVudHMiDG9yaWdpbkNhbGxlciINdHJhbnNhY3Rpb25JZCIKYW1EZWNpbWFscyIKcHJEZWNpbWFscyIKcG9vbFN0YXR1cyINJHQwMzIxMzczMjI0OCIIdG90YWxHZXQiC3RvdGFsQW1vdW50Ig0kdDAzMjQzODMyNzQ1IgVvdXRBbSIFb3V0UHIiCGN1clByWDE4IgVjdXJQciIRb3V0QXNzZXRJZE9yV2F2ZXMiEHNlbmRGZWVUb01hdGNoZXIiBGJ1cm4iDSR0MDMzNTMwMzM4ODAiEGZlZUFtb3VudEZvckNhbGMiEG91dEluQW1vdW50QXNzZXQiDSR0MDMzODgzMzM5OTEiEXJlZnJlc2hETHBBY3Rpb25zIhFpc1VwZGF0ZWRETHBWYWxpZCIWbWFuYWdlclB1YmxpY0tleU9yVW5pdCITbWFuYWdlclZhdWx0QWRkcmVzcyICcGQiCWlzTWFuYWdlciICcGsiC211c3RNYW5hZ2VyIgRnZXRZIglpc1JldmVyc2UiE3Bvb2xBbW91bnRJbkJhbGFuY2UiDSR0MDM1NDc4MzU0OTgiDSR0MDM1ODI5MzU4NzYiE3NraXBPcmRlclZhbGlkYXRpb24iDWNsZWFuQW1vdW50SW4iDWZlZVBvb2xBbW91bnQiDSR0MDM2MjI4MzY2NTIiCGFzc2V0T3V0IgJkeSILdG90YWxHZXRSYXciBW5ld1hwIgRuZXdEIgxhbW91bnRPdXRNaW4iCWFkZHJlc3NUbyILc3dhcENvbnRhY3QiEmlzUG9vbFN3YXBEaXNhYmxlZCIOaXNTd2FwRGlzYWJsZWQiBmNoZWNrcyIHYXNzZXRJbiINJHQwMzg0MjQzODgxOCIIY2hlY2tNaW4iBHNsaXAiCWF1dG9TdGFrZSIHZmFjdENmZyILc3Rha2luZ0NudHIiCHNsaXBDbnRyIgphbUFzc2V0UG10IgpwckFzc2V0UG10IgFlIglscEFzc2V0SWQiAmVsIgZsZWdhY3kiAnNhIgJzcCIIbHBUcm5zZnIiAnNzIg0kdDA0MzI3MzQzNDE1IgVjaGVjayIUbHBBc3NldEVtaXNzaW9uQWZ0ZXIiIGlzUG9vbE9uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkIg0kdDA0NTA5MzQ1MjUxIgdlc3RpbUxQIg0kdDA0NjEzNjQ2NDg1IhRwYXltZW50SW5BbW91bnRBc3NldCINJHQwNDY0ODg0NjU5NiIHbWF4U2xwZyIGZXN0UHV0Ig0kdDA0NzYyNjQ3NjkxIglvdXRBbXRBbXQiDSR0MDQ4ODY0NDg5NDYiDSR0MDQ5NjAxNDk3NTYiGGxhc3RSZWZyZXNoZWRCbG9ja0hlaWdodCIdY2hlY2tMYXN0UmVmcmVzaGVkQmxvY2tIZWlnaHQiDSR0MDUwMjgwNTAzNDQiEGRMcFVwZGF0ZUFjdGlvbnMiDWxwQXNzZXRBbW91bnQiBWluZGV4IgRuZXdZIg0kdDA1MTM1NDUxNDA5Ig0kdDA1MTc4NDUxODk5Ig5zdW1PZkdldEFzc2V0cyISbm9MZXNzVGhlbkFtdEFzc2V0IhRub0xlc3NUaGVuUHJpY2VBc3NldCIUYnVybkxQQXNzZXRPbkZhY3RvcnkiDSR0MDUzMDY1NTMxNDYiDWNoZWNrUGF5bWVudHMiCmZhY3RvcnlDZmciB3N0YWtpbmciCnVuc3Rha2VJbnYiAXYiBWJ1cm5BIg0kdDA1NDI1NjU0MzM3Ig11bnN0YWtlQW1vdW50IhVub0xlc3NUaGVuQW1vdW50QXNzZXQiA3JlcyIMY2hlY2tBbW91bnRzIg0kdDA1NTYyNTU1NzA2IhdscEFzc2V0UmVjaXBpZW50QWRkcmVzcyINJHQwNTY3NjU1Njk1MyIQcGF5bWVudEFtb3VudFJhdyIOcGF5bWVudEFzc2V0SWQiDSR0MDU3MDgxNTcxODQiDSR0MDU3MzMyNTc0MzYiCGFtdEFzU3RyIgdwckFzU3RyIgJwciIMcmVzU2NhbGVNdWx0Igd1c3JBZGRyIgdwbXRBc0lkIgNjZmciDSR0MDU5OTE2NjAxMTUiBGxpc3QiBWRlbGF5IgVkZWx0YSIGdGFyZ2V0IgZjdXJBbXAiCW5ld0FtcFJhdyIGbmV3QW1wIghsYXN0Q2FsbCIEd2FpdCICdHgiBnZlcmlmeSIPdGFyZ2V0UHVibGljS2V5IgptYXRjaGVyUHViIg0kdDA2MTA0ODYxMTY1IgduZXdIYXNoIgthbGxvd2VkSGFzaCILY3VycmVudEhhc2iHAQABYQCAwtcvAAFiCQC2AgEAgMLXLwABYwkAtgIBAICAkLu61q3wDQABZAkAtgIBAAAAAWUJALYCAQAAAAFmCQC2AgEAAQABZwkAtgIBAAIAAWgJALYCAQADAAFpCQC2AgEABAABagkAtgIBCQBlAgUBYQkAaQIJAGgCBQFhAAEFAWEAAWsCBVdBVkVTAAFsADIAAW0CAzEwMAABbgIBMQABbwICX18AAXACAAABcQABAAFyAAIAAXMAAwABdAAEAAF1AAEAAXYAAgABdwADAAF4AAQAAXkABQABegAGAAFBAAcAAUIACAABQwAJAAFEAAEAAUUABgABRgAHAAFHAAoAAUgJAGsDAAoFAWEAkE4BAUkCAUoBSwkAvAIDCQC2AgEFAUoFAWMJALYCAQUBSwEBTAIBSgFLCQC8AgMFAUoFAWMFAUsBAU0CAU4BTwkAoAMBCQC8AgMFAU4JALYCAQUBTwUBYwEBUAMBTgFPAVEJAKADAQkAvQIEBQFOCQC2AgEFAU8FAWMFAVEBAVICAUoBSwkAvAIDBQFKBQFjCQC2AgEFAUsBAVMCAU4BTwkAvAIDBQFOCQC2AgEFAU8FAWMBAVQDAVUBVgFXCQBrAwUBVQUBVgUBVwEBWAEBTgMJAL8CAgUBZAUBTgkAvgIBBQFOBQFOAQFZAQFOAwkAvwICBQFkBQFOCQC+AgEFAU4FAU4BAVoAAhMlc19fZmFjdG9yeUNvbnRyYWN0AQJhYQACFCVzX19tYW5hZ2VyUHVibGljS2V5AQJhYgACFyVzX19tYW5hZ2VyVmF1bHRBZGRyZXNzAQJhYwACESVzJXNfX3ByaWNlX19sYXN0AQJhZAICYWUCYWYJALkJAgkAzAgCAhglcyVzJWQlZF9fcHJpY2VfX2hpc3RvcnkJAMwIAgkApAMBBQJhZQkAzAgCCQCkAwEFAmFmBQNuaWwFAW8BAmFnAgJhaAJhaQkArAICCQCsAgIJAKwCAgILJXMlcyVzX19QX18FAmFoAgJfXwUCYWkBAmFqAgJhaAJhaQkArAICCQCsAgIJAKwCAgILJXMlcyVzX19HX18FAmFoAgJfXwUCYWkBAmFrAAIPJXNfX2Ftb3VudEFzc2V0AQJhbAACDiVzX19wcmljZUFzc2V0AQJhbQACByVzX19hbXABAmFuAQJhbwkArAICAgslcyVkX19hbXBfXwkApAMBBQJhbwECYXAAAhUlc19fY2hhbmdlQW1wTGFzdENhbGwAAmFxAgclc19fZmVlAAJhcgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQJhcQUBSAACYXMJALkJAgkAzAgCAgIlcwkAzAgCAgNkTHAFA25pbAUBbwACYXQJALkJAgkAzAgCAgIlcwkAzAgCAhJkTHBSZWZyZXNoZWRIZWlnaHQFA25pbAUBbwACYXUJALkJAgkAzAgCAgIlcwkAzAgCAg9yZWZyZXNoRExwRGVsYXkFA25pbAUBbwACYXYAHgACYXcJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUCYXUFAmF2AQJheAACESVzX19mYWN0b3J5Q29uZmlnAQJheQACGCVzJXNfX21hdGNoZXJfX3B1YmxpY0tleQECYXoCAmFBAmFCCQCsAgIJAKwCAgkArAICCQCsAgICCCVkJWQlc19fBQJhQQICX18FAmFCAghfX2NvbmZpZwECYUMBAmFECQCsAgICKCVzJXMlc19fbWFwcGluZ3NfX2Jhc2VBc3NldDJpbnRlcm5hbElkX18FAmFEAQJhRQACDCVzX19zaHV0ZG93bgECYUYAAh0lc19fYWxsb3dlZExwU3RhYmxlU2NyaXB0SGFzaAECYUcAAhclc19fZmVlQ29sbGVjdG9yQWRkcmVzcwECYUgBAmFJCQCsAgICGyVzJXNfX3NraXBPcmRlclZhbGlkYXRpb25fXwUCYUkBAmFKBAJhSwJhTAJhTQJhTgkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAiRvcmRlciB2YWxpZGF0aW9uIGZhaWxlZDogb3JkZXJWYWxpZD0JAKUDAQUCYUsCAiAoBQJhTAIBKQINIHNlbmRlclZhbGlkPQkApQMBBQJhTQIOIG1hdGNoZXJWYWxpZD0JAKUDAQUCYU4BAmFPAQJhUAQCYVEJAKYIAQUCYVADCQABAgUCYVECB0FkZHJlc3MEAmFSBQJhUQUCYVIFBHRoaXMBAmFTAAQCYVQEAmFRCQCiCAEJAQFaAAMJAAECBQJhUQIGU3RyaW5nBAJhVQUCYVEJAQJhTwEFAmFVBQR0aGlzBAJhUQkAnQgCBQJhVAkBAmFiAAMJAAECBQJhUQIGU3RyaW5nBAJhVgUCYVEJAQJhTwEFAmFWBQR0aGlzAQJhVwICYVgCYVkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQJhWAUCYVkJALkJAgkAzAgCAgptYW5kYXRvcnkgCQDMCAIJAKUIAQUCYVgJAMwIAgIBLgkAzAgCBQJhWQkAzAgCAgwgbm90IGRlZmluZWQFA25pbAIAAQJhWgICYVgCYVkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQJhWAUCYVkJALkJAgkAzAgCAgptYW5kYXRvcnkgCQDMCAIJAKUIAQUCYVgJAMwIAgIBLgkAzAgCBQJhWQkAzAgCAgwgbm90IGRlZmluZWQFA25pbAIAAQJiYQECYmIJAAIBCQC5CQIJAMwIAgIPbHBfc3RhYmxlLnJpZGU6CQDMCAIFAmJiBQNuaWwCASABAmJjAQJiYgkAuQkCCQDMCAICD2xwX3N0YWJsZS5yaWRlOgkAzAgCBQJiYgUDbmlsAgEgAAJhVQkBEUBleHRyTmF0aXZlKDEwNjIpAQkBAmFXAgUEdGhpcwkBAVoAAAJiZAoAAmJlCQD8BwQFAmFVAhBnZXRJbkZlZVJFQURPTkxZCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQABAgUCYmUCA0ludAUCYmUJAAIBCQCsAgIJAAMBBQJiZQIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AAJiZgoAAmJlCQD8BwQFAmFVAhFnZXRPdXRGZWVSRUFET05MWQkAzAgCCQClCAEFBHRoaXMFA25pbAUDbmlsAwkAAQIFAmJlAgNJbnQFAmJlCQACAQkArAICCQADAQUCYmUCGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAECYmcBAmJoCQC5CQIJAMwIAgIEJXMlcwkAzAgCAgt3aGl0ZWxpc3RlZAkAzAgCCQClCAEFAmJoBQNuaWwFAW8BAmJpAQJiaAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQJhVQkBAmJnAQUCYmgHAAJiagkBAmFXAgUEdGhpcwkBAmFtAAECYmsACQELdmFsdWVPckVsc2UCCQCbCAIFAmFVCQECYUUABwECYmwACQDZBAEJAQJhVwIFAmFVCQECYXkAAAJibQkBEUBleHRyTmF0aXZlKDEwNjIpAQkBAmFXAgUCYVUJAQJhRwABAmJuAAQCYm8JAQJhVwIFBHRoaXMJAQJhawAEAmJwCQECYVcCBQR0aGlzCQECYWwABAJicQkBAmFaAgUCYVUJAQJhQwEFAmJwBAJhQQkBAmFaAgUCYVUJAQJhQwEFAmJvCQC1CQIJAQJhVwIFAmFVCQECYXoCCQCkAwEFAmFBCQCkAwEFAmJxBQFvAQJicgECYnMDCQAAAgUCYnMFAWsFBHVuaXQJANkEAQUCYnMBAmJ0AQJicwMJAAACBQJicwUEdW5pdAUBawkA2AQBCQEFdmFsdWUBBQJicwECYnUBAmJ2CQCZCgcJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUCYnYFAXUJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJidgUBdgkA2QQBCQCRAwIFAmJ2BQF3CQECYnIBCQCRAwIFAmJ2BQF4CQECYnIBCQCRAwIFAmJ2BQF5CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYnYFAXoJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJidgUBQQACYncJAQJidQEJAQJibgAAAmJ4BQJidwACYnkIBQJieAJfMQACYnoIBQJieAJfMgACYkEIBQJieAJfMwACYkIIBQJieAJfNAACYkMIBQJieAJfNQACYkQIBQJieAJfNgACYkUIBQJieAJfNwECYkYACQC1CQIJAQJhVwIFAmFVCQECYXgABQFvAAJiRwkBAmJGAAACYkgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmJHBQFEAiBJbnZhbGlkIHN0YWtpbmcgY29udHJhY3QgYWRkcmVzcwACYkkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmJHBQFGAiBJbnZhbGlkIHNsaXBhZ2UgY29udHJhY3QgYWRkcmVzcwACYkoJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmJHBQFHAhxJbnZhbGlkIGd3eCBjb250cmFjdCBhZGRyZXNzAAJiSwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCYkcFAUUCHEludmFsaWQgZ3d4IGNvbnRyYWN0IGFkZHJlc3MBAmJMCgJiTQJiTgJiTwJiUAJiUQJiUgJiUwJiVAJiVQJiVgkAuQkCCQDMCAICFCVkJWQlZCVkJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQUCYk0JAMwIAgkApAMBBQJiTgkAzAgCCQCkAwEFAmJPCQDMCAIJAKQDAQUCYlAJAMwIAgkApAMBBQJiUQkAzAgCCQCkAwEFAmJSCQDMCAIJAKQDAQUCYlMJAMwIAgkApAMBBQJiVAkAzAgCCQCkAwEFAmJVCQDMCAIJAKQDAQUCYlYFA25pbAUBbwECYlcGAmJYAmJZAmJaAmJQAmJTAmJUCQC5CQIJAMwIAgIMJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQUCYlgJAMwIAgkApAMBBQJiWQkAzAgCCQCkAwEFAmJaCQDMCAIJAKQDAQUCYlAJAMwIAgkApAMBBQJiUwkAzAgCCQCkAwEFAmJUBQNuaWwFAW8BAmNhAQJjYgMJAAACBQJjYgIFV0FWRVMICQDvBwEFBHRoaXMJYXZhaWxhYmxlCQDwBwIFBHRoaXMJANkEAQUCY2IBAmNjAgJjZAJjZQkAvAIDBQJjZAUBYwUCY2UBAmNmAwJjZAJjZQFRCQC9AgQFAmNkBQFjBQJjZQUBUQECY2cDAmNoAmNpAmNqBAJjawkAvAIDCQC4AgIFAmNoBQJjaQUBYgUCY2kEAmNsCQC/AgIJALgCAgUCY2oJAQFYAQUCY2sFAWQDCQEBIQEFAmNsCQACAQkArAICAgpCaWcgc2xwZzogCQCmAwEFAmNrCQCUCgIFAmNsCQCZAwEJAMwIAgUCY2gJAMwIAgUCY2kFA25pbAECY20DAmNuAmNvAmNwBAJjawkAvAIDBQJjbwUBYgUCY24EAmNxCQC/AgIFAmNwBQJjawMDBQJjcQYJAL8CAgUCY28FAmNuCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApgMBBQJjbwIBIAkApgMBBQJjbgIBIAkApgMBBQJjawIBIAkApgMBBQJjcAUCY3EBAmNyBAJjcwJjdAJjdQJjdgQCY3cJAQFJAgUCY3UFAmNzBAJjeAkBAUkCBQJjdgUCY3QJAQJjYwIFAmN4BQJjdwECY3kDAmN1AmN2AmN6BAJjQQUCYkQEAmNCBQJiRQQCY0MJAQJjcgQFAmNBBQJjQgUCY3UFAmN2BAJjZQkBAUkCBQJjdQUCY0EEAmNkCQEBSQIFAmN2BQJjQgQCY0QJAQFJAgUCY3oFAWEEAmNFCQECY2MCBQJjZQUCY0QEAmNGCQECY2MCBQJjZAUCY0QJAMwIAgUCY0MJAMwIAgUCY0UJAMwIAgUCY0YFA25pbAECY0cDAmN1AmN2AmN6BAJjSAkBAmN5AwUCY3UFAmN2BQJjegkAzAgCCQEBTQIJAJEDAgUCY0gAAAUBYQkAzAgCCQEBTQIJAJEDAgUCY0gAAQUBYQkAzAgCCQEBTQIJAJEDAgUCY0gAAgUBYQUDbmlsAQJjSQICY0oCYXIEAmNLAwkAAAIFAmFyAAAAAAkAawMFAmNKBQJhcgUBYQkAlAoCCQBlAgUCY0oFAmNLBQJjSwECY0wBAmNNBAJjTgkAkQMCBQJjTQAABAJjTwkAkQMCBQJjTQABBAJhVgkAtwICBQJjTgUCY08DCQAAAgUCYVYFAWUFAWUEAmFSCQENcGFyc2VJbnRWYWx1ZQEFAmJqBAJjUAkAaAIFAmFSAAIEAmNICQC8AgMFAmNOBQJjTwUBZgQCY1EJALwCAwUCY0gFAWkFAWYEAmNSCQC8AgMJALYCAQUCY1AFAmFWBQFmBAJjUwkAtgIBCQBlAgUCY1AAAQoBAmNUAQJjVQQCY1YJALwCAwUCY1UFAmNVBQFmBAJjVwkAvAIDBQJjVgUCY1UFAWYEAmNYCQC8AgMFAmNXBQFmBQJjUQkAvAIDCQC3AgIFAmNSCQC8AgMFAmNYBQFnBQFmBQJjVQkAtwICCQC8AgMFAmNTBQJjVQUBZgkAvAIDBQFoBQJjWAUBZgoBAmNZAgJjWgJkYQMIBQJjWgJfMgUCY1oEAmNVCAUCY1oCXzEEAmRiCQECY1QBBQJjVQQCZGMJALgCAgUCZGIJAQV2YWx1ZQEFAmNVBAJkZAMJAL8CAgUBZQUCZGMJAL4CAQUCZGMFAmRjAwkAwAICBQFmBQJkZAkAlAoCBQJkYgYJAJQKAgUCZGIHBAJkZQkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQkAzAgCAAYJAMwIAgAHCQDMCAIACAkAzAgCAAkJAMwIAgAKCQDMCAIACwkAzAgCAAwJAMwIAgANCQDMCAIADgkAzAgCAA8JAMwIAgAQBQNuaWwEAmRmCgACZGcFAmRlCgACZGgJAJADAQUCZGcKAAJkaQkAlAoCBQJhVgcKAQJkagICZGsCZGwDCQBnAgUCZGwFAmRoBQJkawkBAmNZAgUCZGsJAJEDAgUCZGcFAmRsCgECZG0CAmRrAmRsAwkAZwIFAmRsBQJkaAUCZGsJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNwkBAmRtAgkBAmRqAgkBAmRqAgkBAmRqAgkBAmRqAgkBAmRqAgkBAmRqAgkBAmRqAgkBAmRqAgkBAmRqAgkBAmRqAgkBAmRqAgkBAmRqAgkBAmRqAgkBAmRqAgkBAmRqAgkBAmRqAgkBAmRqAgUCZGkAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEEAmNVCAUCZGYCXzEEAmRuCAUCZGYCXzIDBQJkbgUCY1UJAAIBCQCsAgICGUQgY2FsY3VsYXRpb24gZXJyb3IsIEQgPSAJAKYDAQUCY1UBAmRvBAJkcAJkcQJkcgJkcwQCZHQFAmJBBAJkdQkA2AQBCQEFdmFsdWUBBQJiQgQCZHYJANgEAQkBBXZhbHVlAQUCYkMEAmR3BQJiRAQCZHgFAmJFBAJkeQkApAMBBQJiegQCZHoICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUCZHQCC1dyb25nIExQIGlkCHF1YW50aXR5AwkBAiE9AgkA2AQBBQJkdAUCZHEJAAIBAg9Xcm9uZyBwbXQgYXNzZXQEAmRBCQECY2EBBQJkdQQCZEIJAQFJAgUCZEEFAmR3BAJkQwkBAmNhAQUCZHYEAmRECQEBSQIFAmRDBQJkeAQCZEUJAQJjYwIFAmREBQJkQgQCZEYJAQFNAgUCZEUFAWEEAmRHCQEBSQIFAmRyBQFhBAJkSAkBAUkCBQJkegUBYQQCZEkJALwCAwUCZEIFAmRHBQJkSAQCZEoJALwCAwUCZEQFAmRHBQJkSAQCZEsJAQFQAwUCZEkFAmR3BQVGTE9PUgQCZEwJAQFQAwUCZEoFAmR4BQVGTE9PUgQCZE0DCQAAAgUCZHACAAUDbmlsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmRzBQJkSwMJAAACBQJkdQIFV0FWRVMFBHVuaXQJANkEAQUCZHUJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUCZHMFAmRMAwkAAAIFAmR2AgVXQVZFUwUEdW5pdAkA2QQBBQJkdgkAzAgCCQELU3RyaW5nRW50cnkCCQECYWoCCQClCAEFAmRzBQJkcAkBAmJXBgUCZEsFAmRMBQJkcgUCZEYFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhYwAFAmRGCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYWQCBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQJkRgUDbmlsCQCcCgoFAmRLBQJkTAUCZHUFAmR2BQJkQQUCZEMFAmR6BQJkRQUCZHkFAmRNAQJkTg0CZHACY2oCZE8CZFACZFECZFICZHMCZFMCZFQCZFUCZFYCZFcCZFgEAmR0BQJiQQQCZFkJANgEAQkBBXZhbHVlAQUCYkIEAmRaCQDYBAEJAQV2YWx1ZQEFAmJDBAJlYQUCYkQEAmViBQJiRQQCZHkJAKQDAQUCYnoEAmVjCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFAmR0AghXciBscCBhcwhxdWFudGl0eQQCZWQJAMwIAgMDCQAAAgUCZFAJAQJicgEFAmRZCQAAAgUCZFIJAQJicgEFAmRaBwYJAQJiYQECIkludmFsaWQgYW10IG9yIHByaWNlIGFzc2V0IHBhc3NlZC4FA25pbAMJAAACBQJlZAUCZWQEAmRBAwUCZFMJAQJjYQEFAmRZAwMFAmRVCQAAAgUCZFgFAmRZBwkAZQIJAQJjYQEFAmRZBQJkVwMFAmRVCQECY2EBBQJkWQkAZQIJAQJjYQEFAmRZBQJkTwQCZEMDBQJkUwkBAmNhAQUCZFoDAwUCZFUJAAACBQJkWAUCZFoHCQBlAgkBAmNhAQUCZFoFAmRXAwUCZFUJAQJjYQEFAmRaCQBlAgkBAmNhAQUCZFoFAmRRBAJlZQkBAUkCBQJkTwUCZWEEAmVmCQEBSQIFAmRRBQJlYgQCZWcJAQJjYwIFAmVmBQJlZQQCZEIJAQFJAgUCZEEFAmVhBAJkRAkBAUkCBQJkQwUCZWIEAmNvCQECY0wBCQDMCAIFAmRCCQDMCAIFAmREBQNuaWwEAmVoAwkAAAIFAmVjAAAEAmNuCQECY0wBCQDMCAIJALcCAgUCZEIFAmVlCQDMCAIJALcCAgUCZEQFAmVmBQNuaWwEAmVpAwkAvwICBQJjbgUCY28GCQACAQIcRDEgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiBEMAMJAAACBQJlaQUCZWkEAmRFBQFkBAJlagUBZAQCY0QFAmNuCQCXCgUJAQFNAgUCY0QFAWEJAQFNAgUCZWUFAmVhCQEBTQIFAmVmBQJlYgkBAmNjAgkAtwICBQJkRAUCZWYJALcCAgUCZEIFAmVlBQJlagkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQCZEUJAQJjYwIFAmREBQJkQgQCZWsJALwCAwkBAVgBCQC4AgIFAmRFBQJlZwUBYwUCZEUEAmVqCQEBSQIFAmNqBQFhAwMDBQJkVgkBAiE9AgUCZEUFAWQHCQC/AgIFAmVrBQJlagcJAAIBCQCsAgIJAKwCAgkArAICAg9QcmljZSBzbGlwcGFnZSAJAKYDAQUCZWsCAyA+IAkApgMBBQJlagQCZWwJAQFJAgUCZWMFAWEEAmVtCQC9AgQFAmVlCQECY2YDBQJkRAUCZEIFB0NFSUxJTkcFAWMFB0NFSUxJTkcEAmVuCQC9AgQFAmVmBQFjCQECY2YDBQJkRAUCZEIFBUZMT09SBQdDRUlMSU5HBAJlbwMJAL8CAgUCZW0FAmVmCQCUCgIFAmVuBQJlZgkAlAoCBQJlZQUCZW0EAmVwCAUCZW8CXzEEAmVxCAUCZW8CXzIEAmNuCQECY0wBCQDMCAIJALcCAgUCZEIFAmVwCQDMCAIJALcCAgUCZEQFAmVxBQNuaWwEAmVpAwkAvwICBQJjbgUCY28GCQACAQIcRDEgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiBEMAMJAAACBQJlaQUCZWkEAmNECQC8AgMFAmVsCQC4AgIFAmNuBQJjbwUCY28JAJcKBQkBAVADBQJjRAUBYQUFRkxPT1IJAQFQAwUCZXAFAmVhBQdDRUlMSU5HCQEBUAMFAmVxBQJlYgUHQ0VJTElORwUCZEUFAmVqCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAJlcggFAmVoAl8xBAJlcwgFAmVoAl8yBAJldAgFAmVoAl8zBAJkRgkBAU0CCAUCZWgCXzQFAWEEAmV1CQEBTQIIBQJlaAJfNQUBYQMJAGcCAAAFAmVyCQACAQIHTFAgPD0gMAQCZXYDCQEBIQEFAmRUAAAFAmVyBAJldwkAZQIFAmRPBQJlcwQCZXgJAGUCBQJkUQUCZXQEAmV5AwMFAmRVCQAAAgUCZFgFAmRZBwkAlAoCBQJkVwAAAwMFAmRVCQAAAgUCZFgFAmRaBwkAlAoCAAAFAmRXCQCUCgIFAmVzBQJldAQCZXoIBQJleQJfMQQCZUEIBQJleQJfMgQCZUIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhYwAFAmRGCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYWQCBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQJkRgkAzAgCCQELU3RyaW5nRW50cnkCCQECYWcCBQJkcwUCZHAJAQJiTAoFAmV6BQJlQQUCZXYFAmRGBQJjagUCZXUFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFAmV3BQJleAUDbmlsCQCfCg0FAmVyBQJldgUCZEYFAmRBBQJkQwUCZWMFAmR0BQJkeQUCZUIFAmV3BQJleAUCZFAFAmRSCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJlQwMCY00CZGECZUQEAmVFBQFnBAJlRgkAkQMCBQJjTQMJAAACBQJkYQAAAAEAAAQCZUcJAKcDAQUBbQQCYVIJALkCAgkApwMBBQJiagUCZUcEAmFWBQJlRgQCY1AJALkCAgUCYVIFAmVFBAJlSAkAugICCQC5AgIJALkCAgkAugICCQC5AgIFAmVEBQJlRAkAuQICBQJlRgUCZUUFAmVEBQJlRwkAuQICBQJjUAUCZUUEAmVJCQC4AgIJALcCAgUCYVYJALoCAgkAuQICBQJlRAUCZUcFAmNQBQJlRAoBAmNZAgJjWgJlSgQCZUsFAmNaBAJlTAgFAmVLAl8xBAJkbggFAmVLAl8yAwkBAiE9AgUCZG4FBHVuaXQFAmNaBAJlTQkAugICCQC3AgIJALkCAgUCZUwFAmVMBQJlSAkAtwICCQC5AgIFAWcFAmVMBQJlSQQCZU4JAQFZAQkAuAICBQJlTQkBBXZhbHVlAQUCZUwDCQDAAgIFAWYFAmVOCQCUCgIFAmVNBQJlSgkAlAoCBQJlTQUEdW5pdAQCZGUJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJCQDMCAIACgkAzAgCAAsJAMwIAgAMCQDMCAIADQkAzAgCAA4FA25pbAQCZU8KAAJkZwUCZGUKAAJkaAkAkAMBBQJkZwoAAmRpCQCUCgIFAmVEBQR1bml0CgECZGoCAmRrAmRsAwkAZwIFAmRsBQJkaAUCZGsJAQJjWQIFAmRrCQCRAwIFAmRnBQJkbAoBAmRtAgJkawJkbAMJAGcCBQJkbAUCZGgFAmRrCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQJkbQIJAQJkagIJAQJkagIJAQJkagIJAQJkagIJAQJkagIJAQJkagIJAQJkagIJAQJkagIJAQJkagIJAQJkagIJAQJkagIJAQJkagIJAQJkagIJAQJkagIJAQJkagIFAmRpAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8EAmVMCAUCZU8CXzEEAmRuCAUCZU8CXzIDCQECIT0CBQJkbgUEdW5pdAUCZUwJAAIBCQCsAgICGVkgY2FsY3VsYXRpb24gZXJyb3IsIFkgPSAJAKYDAQUCZUwBAmVQAwJlUQJlUgJlUwQCZVQJALwCAwkBAmNMAQkAzAgCCQEBTAIFAmVRCQC2AgEFAmJECQDMCAIJAQFMAgUCZVIJALYCAQUCYkUFA25pbAUBYwUCZVMDCQAAAgUCZVMFAWUFAWUFAmVUAQJlVQMCZVYCZVcCZVgEAmVZCQC4AgIJALYCAQkBAmNhAQkBAmJ0AQUCYkIFAmVWBAJlWgkAuAICCQC2AgEJAQJjYQEJAQJidAEFAmJDBQJlVwQCZmEJALgCAgkAtgIBCAkBBXZhbHVlAQkA7AcBBQJiQQhxdWFudGl0eQUCZVgEAmZiCQECZVADBQJlWQUCZVoFAmZhBQJmYgECZmMDAmZkAmZlAmVYBAJlWQkAZAIJAQJjYQEJAQJidAEFAmJCBQJmZAQCZVoJAGQCCQECY2EBCQECYnQBBQJiQwUCZmUEAmZhCQBkAggJAQV2YWx1ZQEJAOwHAQUCYkEIcXVhbnRpdHkFAmVYBAJlVAkBAmVQAwkAtgIBBQJlWQkAtgIBBQJlWgkAtgIBBQJmYQQCZmYJAMwIAgkBDEludGVnZXJFbnRyeQIFAmF0BQZoZWlnaHQJAMwIAgkBC1N0cmluZ0VudHJ5AgUCYXMJAKYDAQUCZVQFA25pbAkAlAoCBQJmZgUCZVQBAmZnAgJmaAJlVAMJAMACAgUCZVQFAmZoBgkBAmJhAQIidXBkYXRlZCBETHAgbG93ZXIgdGhhbiBjdXJyZW50IERMcAECZmkBAmZqBAJlWQkBAmNhAQkBAmJ0AQUCYkIEAmVaCQECY2EBCQECYnQBBQJiQwQCZmsIBQJmagZhbW91bnQEAmZsCQBuBAgFAmZqBmFtb3VudAgFAmZqBXByaWNlBQFhBQVGTE9PUgQCZm0DCQAAAggFAmZqCW9yZGVyVHlwZQUDQnV5CQCUCgIFAmZrCQEBLQEFAmZsCQCUCgIJAQEtAQUCZmsFAmZsBAJmZAgFAmZtAl8xBAJmZQgFAmZtAl8yAwMDCQECYmsABgkAAAIFAmJ6BQFzBgkAAAIFAmJ6BQF0CQACAQINQWRtaW4gYmxvY2tlZAMDCQECIT0CCAgFAmZqCWFzc2V0UGFpcgthbW91bnRBc3NldAUCYkIGCQECIT0CCAgFAmZqCWFzc2V0UGFpcgpwcmljZUFzc2V0BQJiQwkAAgECCVdyIGFzc2V0cwQCZm4JAKcDAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQJhcwIBMAQCZm8JAQJmYwMFAmZkBQJmZQAABAJmcAgFAmZvAl8xBAJmcQgFAmZvAl8yBAJmcgkAwAICBQJmcQUCZm4EAmZzCQC5CQIJAMwIAgIEZExwPQkAzAgCCQCmAwEFAmZuCQDMCAICCCBkTHBOZXc9CQDMCAIJAKYDAQUCZnEJAMwIAgIUIGFtb3VudEFzc2V0QmFsYW5jZT0JAMwIAgkApAMBBQJlWQkAzAgCAhMgcHJpY2VBc3NldEJhbGFuY2U9CQDMCAIJAKQDAQUCZVoJAMwIAgIZIGFtb3VudEFzc2V0QmFsYW5jZURlbHRhPQkAzAgCCQCkAwEFAmZkCQDMCAICGCBwcmljZUFzc2V0QmFsYW5jZURlbHRhPQkAzAgCCQCkAwEFAmZlCQDMCAICCCBoZWlnaHQ9CQDMCAIJAKQDAQUGaGVpZ2h0BQNuaWwCAAkAlAoCBQJmcgUCZnMBAmZ0AQJkYQMJAQIhPQIJAJADAQgFAmRhCHBheW1lbnRzAAEJAAIBAgoxIHBtbnQgZXhwBAJmdQkBBXZhbHVlAQkAkQMCCAUCZGEIcGF5bWVudHMAAAQCZHEJAQV2YWx1ZQEIBQJmdQdhc3NldElkBAJkVwgFAmZ1BmFtb3VudAQCZWgJAQJkbwQJANgEAQgFAmRhDXRyYW5zYWN0aW9uSWQJANgEAQUCZHEFAmRXCAUCZGEGY2FsbGVyBAJkSwgFAmVoAl8xBAJkTAgFAmVoAl8yBAJkeQkBDXBhcnNlSW50VmFsdWUBCAUCZWgCXzkEAmRNCAUCZWgDXzEwBAJmdgMJAQEhAQkBAmJpAQgFAmRhBmNhbGxlcgMJAQJiawAGCQAAAgUCYnoFAXQHAwUCZnYJAAIBCQCsAgICD0FkbWluIGJsb2NrZWQ6IAkApAMBBQJkeQkAlwoFBQJkSwUCZEwFAmRXBQJkcQUCZE0BAmZ3CgJmeAJhaQJmeQJmegJjagJkVAJkVQJkVgJkVwJkWAQCZWgJAQJkTg0FAmFpBQJjaggJAQV2YWx1ZQEFAmZ5BmFtb3VudAgJAQV2YWx1ZQEFAmZ5B2Fzc2V0SWQICQEFdmFsdWUBBQJmegZhbW91bnQICQEFdmFsdWUBBQJmegdhc3NldElkBQJmeAkAAAIFAmFpAgAFAmRUBQJkVQUCZFYFAmRXBQJkWAQCZHkJAQ1wYXJzZUludFZhbHVlAQgFAmVoAl84BAJmQQMJAQEhAQkBAmJpAQkBEUBleHRyTmF0aXZlKDEwNjIpAQUCZngDAwkBAmJrAAYJAAACBQJiegUBdAYJAAACBQJiegUBcgcDBQJmQQkAAgEJAKwCAgIIQmxvY2tlZDoJAKQDAQUCZHkFAmVoAQJmQgUCZkMCZHECZHMCYWkCZkQEAmR1CQDYBAEJAQV2YWx1ZQEFAmJCBAJkdgkA2AQBCQEFdmFsdWUBBQJiQwQCZHQFAmJBBAJlYQUCYkQEAmViBQJiRQQCZmEJALYCAQgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBBQJkdAIQaW52YWxpZCBscCBhc3NldAhxdWFudGl0eQQCZkUDCQC/AgIFAmZhBQFlBgkAAgECImluaXRpYWwgZGVwb3NpdCByZXF1aXJlcyBhbGwgY29pbnMDCQAAAgUCZkUFAmZFBAJkQQkBAmNhAQUCZHUEAmRDCQECY2EBBQJkdgQCZkYDCQAAAgUCYWkCAAkAlAoCBQJkQQUCZEMDCQAAAgUCZHEFAmR1AwkAZgIFAmZDBQJkQQkAAgECFmludmFsaWQgcGF5bWVudCBhbW91bnQJAJQKAgkAZQIFAmRBBQJmQwUCZEMDCQAAAgUCZHEFAmR2AwkAZgIFAmZDBQJkQwkAAgECFmludmFsaWQgcGF5bWVudCBhbW91bnQJAJQKAgUCZEEJAGUCBQJkQwUCZkMJAAIBAhB3cm9uZyBwbXRBc3NldElkBAJmRwgFAmZGAl8xBAJmSAgFAmZGAl8yBAJmSQMJAAACBQJkcQUCZHUJAJQKAgUCZkMAAAMJAAACBQJkcQUCZHYJAJQKAgAABQJmQwkAAgECD2ludmFsaWQgcGF5bWVudAQCZkoIBQJmSQJfMQQCZksIBQJmSQJfMgQCZkwDBQJmRAkAlQoDCAkBAmNJAgUCZkoFAmJkAl8xCAkBAmNJAgUCZksFAmJkAl8xCAkBAmNJAgUCZkMFAmJkAl8yCQCVCgMFAmZKBQJmSwAABAJmTQgFAmZMAl8xBAJmTggFAmZMAl8yBAJjSwgFAmZMAl8zBAJmTwkAZAIFAmZHBQJmTQQCZlAJAGQCBQJmSAUCZk4EAmNvCQECY0wBCQDMCAIJAQFJAgUCZkcFAmJECQDMCAIJAQFJAgUCZkgFAmJFBQNuaWwEAmNuCQECY0wBCQDMCAIJAQFJAgUCZk8FAmJECQDMCAIJAQFJAgUCZlAFAmJFBQNuaWwEAmVpAwkAvwICBQJjbgUCY28GCQEFdGhyb3cAAwkAAAIFAmVpBQJlaQQCZlEJAL0CBAUCZmEJALgCAgUCY24FAmNvBQJjbwUFRkxPT1IEAmRGCQEBTQIJAQJjYwIJAQFJAgUCZlAFAmViCQEBSQIFAmZPBQJlYQUBYQQCZUIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhYwAFAmRGCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYWQCBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQJkRgkAzAgCCQELU3RyaW5nRW50cnkCCQECYWcCBQJkcwUCYWkJAQJiTAoFAmZKBQJmSwkAoAMBBQJmUQUCZEYAAAAABQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wAAAAAAUDbmlsBAJmUgkAawMFAmZIBQFhBQJmRwQCZlMJAGsDBQJmQwUBYQkAZAIFAmZSBQFhBAJmVAkAZQIFAmZDBQJmUwQCZlUJALwCAwUCZmEJALYCAQUCZlQJALYCAQUCZkgEAmZWCQCgAwEJALwCAwkAuAICBQJmUQUCZlUFAWIFAmZVCQCWCgQJAKADAQUCZlEFAmVCBQJjSwUCZlYJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAmZXBgJmWAJmWQJmWgJmeAJnYQJnYgQCZHQJANgEAQkBBXZhbHVlAQUCYkEEAmR1CQDYBAEJAQV2YWx1ZQEFAmJCBAJkdgkA2AQBCQEFdmFsdWUBBQJiQwQCZ2MFAmJEBAJnZAUCYkUEAmdlBQJiegQCZHMDCQAAAgUCZngFAmJLBQJnYQUCZngEAmZ1CQEFdmFsdWUBCQCRAwIFAmZaAAAEAmRxCQEFdmFsdWUBCAUCZnUHYXNzZXRJZAQCZFcIBQJmdQZhbW91bnQEAmZiCQECZVUDBQFlBQFlBQFlAwkAAAIFAmZiBQJmYgQCZHAJANgEAQUCZ2IDCQECIT0CBQJkdAkA2AQBBQJkcQkAAgECCFdyb25nIExQBAJkQQkBAmNhAQUCZHUEAmRDCQECY2EBBQJkdgQCZ2YKAAJiZQkA/AcEBQR0aGlzAhNnZXRPbmVUa25WMlJFQURPTkxZCQDMCAIFAmZYCQDMCAIFAmRXBQNuaWwFA25pbAMJAAECBQJiZQIKKEludCwgSW50KQUCYmUJAAIBCQCsAgIJAAMBBQJiZQIfIGNvdWxkbid0IGJlIGNhc3QgdG8gKEludCwgSW50KQMJAAACBQJnZgUCZ2YEAmNLCAUCZ2YCXzIEAmdnCAUCZ2YCXzEEAmdoAwMJAGYCBQJmWQAACQBmAgUCZlkFAmdnBwkBAmJhAQkAuQkCCQDMCAICH2Ftb3VudCB0byByZWNlaXZlIGlzIGxlc3MgdGhhbiAJAMwIAgkApAMBBQJmWQUDbmlsAgAFAmdnBAJnaQMJAAACBQJmWAUCZHUJAJYKBAUCZ2gAAAkAZQIJAGUCBQJkQQUCZ2gFAmNLBQJkQwMJAAACBQJmWAUCZHYJAJYKBAAABQJnaAUCZEEJAGUCCQBlAgUCZEMFAmdoBQJjSwkAAgECFGludmFsaWQgb3V0IGFzc2V0IGlkBAJnaggFAmdpAl8xBAJnawgFAmdpAl8yBAJmTwgFAmdpAl8zBAJmUAgFAmdpAl80BAJnbAkBAmNjAgkBAUkCBQJmUAUCZ2QJAQFJAgUCZk8FAmdjBAJnbQkBAU0CBQJnbAUBYQQCZ24DCQAAAgUCZlgCBVdBVkVTBQR1bml0CQDZBAEFAmZYBAJnbwMJAGYCBQJjSwAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmJtBQJjSwUCZ24FA25pbAUDbmlsBAJkTQkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmRzBQJnaAUCZ24JAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFqAgkApQgBBQJkcwUCZHAJAQJiVwYFAmdqBQJnawUCZFcFAmdtBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYWMABQJnbQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFkAgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUCZ20FA25pbAUCZ28DCQAAAgUCZE0FAmRNBAJncAkA/AcEBQJhVQIEYnVybgkAzAgCBQJkVwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJkcQUCZFcFA25pbAMJAAACBQJncAUCZ3AEAmdxBAJncgMJAAACBQR0aGlzBQJibQAABQJjSwQCZ3MDCQAAAgkBAmJyAQUCZlgFAmJCBgcDBQJncwkAlAoCCQEBLQEJAGQCBQJnZwUCZ3IAAAkAlAoCAAAJAQEtAQkAZAIFAmdnBQJncgQCZmQIBQJncQJfMQQCZmUIBQJncQJfMgQCZ3QJAQJmYwMFAmZkBQJmZQAABAJndQgFAmd0Al8xBAJlVAgFAmd0Al8yBAJndgkBAmZnAgUCZmIFAmVUAwkAAAIFAmd2BQJndgkAlAoCCQDOCAIFAmRNBQJndQUCZ2gJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAmd3AAQCZ3gJAQJhUwAEAmFRCQCdCAIFAmd4CQECYWEAAwkAAQIFAmFRAgZTdHJpbmcEAmFWBQJhUQkA2QQBBQJhVgMJAAECBQJhUQIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAAJneQkAAgECEVBlcm1pc3Npb24gZGVuaWVkAQJnegECZGEEAmFRCQECZ3cAAwkAAQIFAmFRAgpCeXRlVmVjdG9yBAJnQQUCYVEJAAACCAUCZGEPY2FsbGVyUHVibGljS2V5BQJnQQMJAAECBQJhUQIEVW5pdAkAAAIIBQJkYQZjYWxsZXIFBHRoaXMJAAIBAgtNYXRjaCBlcnJvcgECZ0IBAmRhBAJhUQkBAmd3AAMJAAECBQJhUQIKQnl0ZVZlY3RvcgQCZ0EFAmFRAwkAAAIIBQJkYQ9jYWxsZXJQdWJsaWNLZXkFAmdBBgUCZ3kDCQABAgUCYVECBFVuaXQDCQAAAggFAmRhBmNhbGxlcgUEdGhpcwYFAmd5CQACAQILTWF0Y2ggZXJyb3IBAmdDAwJnRAJlRAJnRQQCYnYJAQJibgAEAmR1CQCRAwIFAmJ2BQF4BAJkdgkAkQMCBQJidgUBeQQCZUUFAWcEAmVHCQCnAwEFAW0EAmFSCQC5AgIJAKcDAQUCYmoFAmVHBAJjTQMJAAACBQJnRAcJAMwIAgkAtwICCQC2AgEJAQJjYQEFAmR1BQJnRQkAzAgCCQC2AgEJAQJjYQEFAmR2BQNuaWwJAMwIAgkAtwICCQC2AgEJAQJjYQEFAmR2BQJnRQkAzAgCCQC2AgEJAQJjYQEFAmR1BQNuaWwEAmVGCQCRAwIFAmNNAAAEAmFWBQJlRgQCY1AJALkCAgUCYVIFAmVFBAJlSAkAugICCQC5AgIJALkCAgkAugICCQC5AgIFAmVEBQJlRAkAuQICBQJlRgUCZUUFAmVEBQJlRwkAuQICBQJjUAUCZUUEAmVJCQC4AgIJALcCAgUCYVYJALoCAgkAuQICBQJlRAUCZUcFAmNQBQJlRAoBAmNZAgJjWgJlSgQCZ0YFAmNaBAJlTAgFAmdGAl8xBAJkbggFAmdGAl8yAwkBAiE9AgUCZG4FBHVuaXQFAmNaBAJlTQkAugICCQC3AgIJALkCAgUCZUwFAmVMBQJlSAkAtwICCQC5AgIFAWcFAmVMBQJlSQQCZU4JAQFZAQkAuAICBQJlTQkBBXZhbHVlAQUCZUwDCQDAAgIFAWYFAmVOCQCUCgIFAmVNBQJlSgkAlAoCBQJlTQUEdW5pdAQCZGUJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJCQDMCAIACgkAzAgCAAsJAMwIAgAMCQDMCAIADQkAzAgCAA4FA25pbAQCZ0cKAAJkZwUCZGUKAAJkaAkAkAMBBQJkZwoAAmRpCQCUCgIFAmVEBQR1bml0CgECZGoCAmRrAmRsAwkAZwIFAmRsBQJkaAUCZGsJAQJjWQIFAmRrCQCRAwIFAmRnBQJkbAoBAmRtAgJkawJkbAMJAGcCBQJkbAUCZGgFAmRrCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQJkbQIJAQJkagIJAQJkagIJAQJkagIJAQJkagIJAQJkagIJAQJkagIJAQJkagIJAQJkagIJAQJkagIJAQJkagIJAQJkagIJAQJkagIJAQJkagIJAQJkagIJAQJkagIFAmRpAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8EAmVMCAUCZ0cCXzEEAmRuCAUCZ0cCXzIDCQECIT0CBQJkbgUEdW5pdAUCZUwJAAIBCQCsAgICGVkgY2FsY3VsYXRpb24gZXJyb3IsIFkgPSAJAKYDAQUCZUwBAmdIAAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQJhVQkBAmFIAQkApQgBBQR0aGlzBxsCZGEBIWNhbGN1bGF0ZUFtb3VudE91dEZvclN3YXBSRUFET05MWQMCZ0kCZ0QCZ0oEAmdLAwkAAAIFAmdEBwQCZ0wJAQJhVwIFBHRoaXMJAQJhbAAEAmdFCQC3AgIJALYCAQkBAmNhAQkBAmFXAgUEdGhpcwkBAmFrAAkAtgIBBQJnSQkAlAoCBQJnTAUCZ0UEAmdMCQECYVcCBQR0aGlzCQECYWsABAJnRQkAtwICCQC2AgEJAQJjYQEJAQJhVwIFBHRoaXMJAQJhbAAJALYCAQUCZ0kJAJQKAgUCZ0wFAmdFBAJnTAgFAmdLAl8xBAJnRQgFAmdLAl8yBAJidgkBAmJuAAQCZHUJAJEDAgUCYnYFAXgEAmR2CQCRAwIFAmJ2BQF5BAJjTQkAzAgCCQC2AgEJAQJjYQEFAmR1CQDMCAIJALYCAQkBAmNhAQUCZHYFA25pbAQCZUQJAQJjTAEFAmNNBAJlTAkBAmdDAwUCZ0QFAmVECQC2AgEFAmdJBAJnTQkAuAICCQC4AgIJALYCAQkBAmNhAQUCZ0wFAmVMCQC2AgEAAQQCZ04JAJYDAQkAzAgCAAAJAMwIAgkAoAMBBQJnTQUDbmlsBAJnTwMJAAACBQJnRAcJAMwIAgkAtwICCQC3AgIJALYCAQkBAmNhAQUCZHUJALYCAQUCZ0kJALYCAQUCZ0oJAMwIAgkAuAICCQC2AgEJAQJjYQEFAmR2BQJnTQUDbmlsCQDMCAIJALgCAgkAtgIBCQECY2EBBQJkdQUCZ00JAMwIAgkAtwICCQC3AgIJALYCAQkBAmNhAQUCZHYJALYCAQUCZ0kJALYCAQUCZ0oFA25pbAQCZ1AJAQJjTAEFAmdPBAJlaQMJAMACAgUCZ1AFAmVEBgkAAgEJALkJAgkAzAgCAhRuZXcgRCBpcyBmZXdlciBlcnJvcgkAzAgCCQCmAwEFAmVECQDMCAIJAKYDAQUCZ1AFA25pbAICX18DCQAAAgUCZWkFAmVpCQCUCgIFA25pbAUCZ04JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZGEBJmNhbGN1bGF0ZUFtb3VudE91dEZvclN3YXBBbmRTZW5kVG9rZW5zBQJnSQJnRAJnUQJnUgJnSgQCZ1MKAAJiZQkA/AcEBQJhVQIXZ2V0U3dhcENvbnRyYWN0UkVBRE9OTFkFA25pbAUDbmlsAwkAAQIFAmJlAgZTdHJpbmcFAmJlCQACAQkArAICCQADAQUCYmUCGyBjb3VsZG4ndCBiZSBjYXN0IHRvIFN0cmluZwQCZ1QKAAJiZQkA/AcEBQJhVQIaaXNQb29sU3dhcERpc2FibGVkUkVBRE9OTFkJAMwIAgkApQgBBQR0aGlzBQNuaWwFA25pbAMJAAECBQJiZQIHQm9vbGVhbgUCYmUJAAIBCQCsAgIJAAMBBQJiZQIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgQCZ1UDCQEBIQEJAQJiaQEIBQJkYQZjYWxsZXIDAwkBAmJrAAYJAAACBQJiegUBdAYFAmdUBwQCZ1YJAMwIAgMDCQEBIQEFAmdVBgkBAmd6AQUCZGEGCQECYmEBAiJzd2FwIG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IGFkbWluCQDMCAIDCQBnAggJAQV2YWx1ZQEJAJEDAggFAmRhCHBheW1lbnRzAAAGYW1vdW50BQJnSQYJAQJiYQECDFdyb25nIGFtb3VudAkAzAgCAwkAAAIIBQJkYQZjYWxsZXIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAmdTBgkBAmJhAQIRUGVybWlzc2lvbiBkZW5pZWQFA25pbAMJAAACBQJnVgUCZ1YEAmZ1CQEFdmFsdWUBCQCRAwIIBQJkYQhwYXltZW50cwAABAJnVwkBAmJ0AQgFAmZ1B2Fzc2V0SWQEAmdYAwkAAAIFAmdEBwQCZ0wJAQJhVwIFBHRoaXMJAQJhbAAEAmdFCQBlAgkBAmNhAQUCZ1cICQEFdmFsdWUBCQCRAwIIBQJkYQhwYXltZW50cwAABmFtb3VudAkAlAoCBQJnTAUCZ0UEAmdMCQECYVcCBQR0aGlzCQECYWsABAJnRQkAZQIJAQJjYQEFAmdXCAkBBXZhbHVlAQkAkQMCCAUCZGEIcGF5bWVudHMAAAZhbW91bnQJAJQKAgUCZ0wFAmdFBAJnTAgFAmdYAl8xBAJnRQgFAmdYAl8yBAJidgkBAmJuAAQCZHUJAJEDAgUCYnYFAXgEAmR2CQCRAwIFAmJ2BQF5BAJjTQMJAAACBQJnRAcJAMwIAgkAuAICCQC2AgEJAQJjYQEFAmR1CQC2AgEICQEFdmFsdWUBCQCRAwIIBQJkYQhwYXltZW50cwAABmFtb3VudAkAzAgCCQC2AgEJAQJjYQEFAmR2BQNuaWwJAMwIAgkAtgIBCQECY2EBBQJkdQkAzAgCCQC4AgIJALYCAQkBAmNhAQUCZHYJALYCAQgJAQV2YWx1ZQEJAJEDAggFAmRhCHBheW1lbnRzAAAGYW1vdW50BQNuaWwEAmVECQECY0wBBQJjTQQCZUwJAQJnQwMFAmdEBQJlRAkAtgIBAAAEAmdNCQC4AgIJALgCAgkAtgIBCQECY2EBBQJnTAUCZUwJALYCAQABBAJnTgkAlgMBCQDMCAIAAAkAzAgCCQCgAwEFAmdNBQNuaWwEAmdZAwkAZwIFAmdOBQJnUQYJAAIBAixFeGNoYW5nZSByZXN1bHQgaXMgZmV3ZXIgY29pbnMgdGhhbiBleHBlY3RlZAMJAAACBQJnWQUCZ1kEAmdPAwkAAAIFAmdEBwkAzAgCCQC3AgIJALYCAQkBAmNhAQUCZHUJALYCAQUCZ0oJAMwIAgkAuAICCQC2AgEJAQJjYQEFAmR2BQJnTQUDbmlsCQDMCAIJALgCAgkAtgIBCQECY2EBBQJkdQUCZ00JAMwIAgkAtwICCQC2AgEJAQJjYQEFAmR2CQC2AgEFAmdKBQNuaWwEAmdQCQECY0wBBQJnTwQCZWkDCQDAAgIFAmdQBQJlRAYJAAIBAhRuZXcgRCBpcyBmZXdlciBlcnJvcgMJAAACBQJlaQUCZWkEAmZkAwUCZ0QJAQEtAQUCZ04FAmdKBAJmZQMFAmdEBQJnSgkBAS0BBQJnTgQCZ3UICQECZmMDBQJmZAUCZmUAAAJfMQMJAAACBQJndQUCZ3UJAJQKAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQJnUgUCZ04JAQJicgEFAmdMBQNuaWwFAmdOCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRhAQtjb25zdHJ1Y3RvcgEBWgQCZUgJAQJnQgEFAmRhAwkAAAIFAmVIBQJlSAkAzAgCCQELU3RyaW5nRW50cnkCCQEBWgAFAVoFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkYQEDcHV0AgJnWgJoYQQCaGIJAQJiRgAEAmhjCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJoYgUBRAIKV3Igc3QgYWRkcgQCaGQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmhiBQFGAgpXciBzbCBhZGRyAwkAZgIAAAUCZ1oJAAIBAg5Xcm9uZyBzbGlwcGFnZQMJAQIhPQIJAJADAQgFAmRhCHBheW1lbnRzAAIJAAIBAgwyIHBtbnRzIGV4cGQEAmhlCQC2AgEICQEFdmFsdWUBCQCRAwIIBQJkYQhwYXltZW50cwAABmFtb3VudAQCaGYJALYCAQgJAQV2YWx1ZQEJAJEDAggFAmRhCHBheW1lbnRzAAEGYW1vdW50BAJlWQkAuAICCQC2AgEJAQJjYQEJAQJidAEFAmJCBQJoZQMJAAACBQJlWQUCZVkEAmVaCQC4AgIJALYCAQkBAmNhAQkBAmJ0AQUCYkMFAmhmAwkAAAIFAmVaBQJlWgQCZmEJALYCAQgJAQV2YWx1ZQEJAOwHAQUCYkEIcXVhbnRpdHkDCQAAAgUCZmEFAmZhBAJmYgkBAmVVAwUCaGUFAmhmCQC2AgEAAAMJAAACBQJmYgUCZmIEAmhnCQECZncKCQClCAEIBQJkYQZjYWxsZXIJANgEAQgFAmRhDXRyYW5zYWN0aW9uSWQJAQ9BdHRhY2hlZFBheW1lbnQCCAkBBXZhbHVlAQkAkQMCCAUCZGEIcGF5bWVudHMAAAdhc3NldElkCAkBBXZhbHVlAQkAkQMCCAUCZGEIcGF5bWVudHMAAAZhbW91bnQJAJEDAggFAmRhCHBheW1lbnRzAAEFAmdaBgcGAAACAAQCZXYIBQJoZwJfMgQCaGgIBQJoZwJfNwQCZE0IBQJoZwJfOQQCZXcIBQJoZwNfMTAEAmV4CAUCaGcDXzExBAJkdQgFAmhnA18xMgQCZHYIBQJoZwNfMTMEAmVoCQD8BwQFAmFVAgRlbWl0CQDMCAIFAmV2BQNuaWwFA25pbAMJAAACBQJlaAUCZWgEAmhpBAJhUQUCZWgDCQABAgUCYVECB0FkZHJlc3MEAmhqBQJhUQkA/AcEBQJoagIEZW1pdAkAzAgCBQJldgUDbmlsBQNuaWwFBHVuaXQDCQAAAgUCaGkFAmhpBAJoawMJAGYCBQJldwAACQD8BwQFAmhkAgNwdXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCZHUFAmV3BQNuaWwFA25pbAMJAAACBQJoawUCaGsEAmhsAwkAZgIFAmV4AAAJAPwHBAUCaGQCA3B1dAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJkdgUCZXgFA25pbAUDbmlsAwkAAAIFAmhsBQJobAQCaG0DBQJoYQQCaG4JAPwHBAUCaGMCBXN0YWtlBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmhoBQJldgUDbmlsAwkAAAIFAmhuBQJobgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQJkYQZjYWxsZXIFAmV2BQJoaAUDbmlsBAJobwkBAmZjAwAAAAAAAAQCZ3UIBQJobwJfMQQCZVQIBQJobwJfMgQCaHADCQDAAgIFAmVUBQJmYgYJAQJiYQEJALkJAgkAzAgCAiJ1cGRhdGVkIERMcCBsb3dlciB0aGFuIGN1cnJlbnQgRExwCQDMCAIJAKYDAQUCZVkJAMwIAgkApgMBBQJlWgkAzAgCCQCmAwEFAmZhCQDMCAIJAKYDAQUCZmIJAMwIAgkApgMBBQJlVAkAzAgCCQCkAwEFAmV3CQDMCAIJAKQDAQUCZXgFA25pbAIBIAMJAAACBQJocAUCaHAEAmhxCAkBBXZhbHVlAQkA7AcBBQJiQQhxdWFudGl0eQMJAAACBQJocQUCaHEJAM4IAgkAzggCBQJkTQUCaG0FAmd1CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRhAQtwdXRPbmVUa25WMgICZlkCaGEEAmhyCgACYmUJAPwHBAUCYVUCKGlzUG9vbE9uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkUkVBRE9OTFkJAMwIAgkApQgBBQR0aGlzBQNuaWwFA25pbAMJAAECBQJiZQIHQm9vbGVhbgUCYmUJAAIBCQCsAgIJAAMBBQJiZQIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgQCZkEDCQEBIQEJAQJiaQEIBQJkYQZjYWxsZXIDAwMJAQJiawAGCQAAAgUCYnoFAXIGCQAAAgUCYnoFAXQGBQJocgcEAmdWCQDMCAIDAwkBASEBBQJmQQYJAQJnegEFAmRhBgkBAmJhAQIhcHV0IG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IGFkbWluCQDMCAIDCQAAAgkAkAMBCAUCZGEIcGF5bWVudHMAAQYJAQJiYQECHmV4YWN0bHkgMSBwYXltZW50IGFyZSBleHBlY3RlZAUDbmlsAwkAAAIFAmdWBQJnVgQCZHUJANgEAQkBBXZhbHVlAQUCYkIEAmR2CQDYBAEJAQV2YWx1ZQEFAmJDBAJkdAUCYkEEAmdjBQJiRAQCZ2QFAmJFBAJkcwMJAAACCAUCZGEGY2FsbGVyBQR0aGlzCAUCZGEMb3JpZ2luQ2FsbGVyCAUCZGEGY2FsbGVyBAJmdQkBBXZhbHVlAQkAkQMCCAUCZGEIcGF5bWVudHMAAAQCZHEJANgEAQkBBXZhbHVlAQgFAmZ1B2Fzc2V0SWQEAmRXCAUCZnUGYW1vdW50BAJmYgMJAAACCAUCZnUHYXNzZXRJZAUCYkIJAQJlVQMJALYCAQUCZFcJALYCAQAACQC2AgEAAAkBAmVVAwkAtgIBAAAJALYCAQUCZFcJALYCAQAAAwkAAAIFAmZiBQJmYgQCaHMJAQJmQgUFAmRXBQJkcQkApQgBBQJkcwkA2AQBCAUCZGENdHJhbnNhY3Rpb25JZAYDCQAAAgUCaHMFAmhzBAJjSwgFAmhzAl8zBAJkTQgFAmhzAl8yBAJodAgFAmhzAl8xBAJldgMDCQBmAgUCZlkAAAkAZgIFAmZZBQJodAcJAQJiYQEJALkJAgkAzAgCAh9hbW91bnQgdG8gcmVjZWl2ZSBpcyBsZXNzIHRoYW4gCQDMCAIJAKQDAQUCZlkFA25pbAIABQJodAQCaGcJAPwHBAUCYVUCBGVtaXQJAMwIAgUCZXYFA25pbAUDbmlsAwkAAAIFAmhnBQJoZwQCaGkEAmFRBQJoZwMJAAECBQJhUQIHQWRkcmVzcwQCaGoFAmFRCQD8BwQFAmhqAgRlbWl0CQDMCAIFAmV2BQNuaWwFA25pbAUEdW5pdAMJAAACBQJoaQUCaGkEAmhtAwUCaGEEAmhuCQD8BwQFAmJIAghzdGFrZUZvcgkAzAgCCQClCAEIBQJkYQZjYWxsZXIFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCZHQFAmV2BQNuaWwDCQAAAgUCaG4FAmhuBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAmRhBmNhbGxlcgUCZXYFAmR0BQNuaWwEAmdvAwkAZgIFAmNLAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUCYm0FAmNLCQDZBAEFAmRxBQNuaWwFA25pbAQCaHUDCQAAAgUEdGhpcwUCYm0JAJQKAgAAAAAEAmh2AwkAAAIIBQJmdQdhc3NldElkBQJiQgYHAwUCaHYJAJQKAgkBAS0BBQJjSwAACQCUCgIAAAkBAS0BBQJjSwQCZmQIBQJodQJfMQQCZmUIBQJodQJfMgQCaHcJAQJmYwMFAmZkBQJmZQAABAJndQgFAmh3Al8xBAJlVAgFAmh3Al8yBAJndgkBAmZnAgUCZmIFAmVUAwkAAAIFAmd2BQJndgkAlAoCCQDOCAIJAM4IAgkAzggCBQJkTQUCaG0FAmdvBQJndQUCZXYJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZGEBCnB1dEZvckZyZWUBAmh4AwkAZgIAAAUCaHgJAAIBAgpXcm9uZyBzbHBnAwkBAiE9AgkAkAMBCAUCZGEIcGF5bWVudHMAAgkAAgECDDIgcG1udHMgZXhwZAQCaHkJAQJmdwoJAKUIAQgFAmRhBmNhbGxlcgkA2AQBCAUCZGENdHJhbnNhY3Rpb25JZAkBD0F0dGFjaGVkUGF5bWVudAIICQEFdmFsdWUBCQCRAwIIBQJkYQhwYXltZW50cwAAB2Fzc2V0SWQICQEFdmFsdWUBCQCRAwIIBQJkYQhwYXltZW50cwAABmFtb3VudAkAkQMCCAUCZGEIcGF5bWVudHMAAQUCaHgHBwYAAAIABAJkTQgFAmh5Al85BAJoZQkAtgIBCAkBBXZhbHVlAQkAkQMCCAUCZGEIcGF5bWVudHMAAAZhbW91bnQEAmhmCQC2AgEICQEFdmFsdWUBCQCRAwIIBQJkYQhwYXltZW50cwABBmFtb3VudAQCZmIJAQJlVQMFAmhlBQJoZgkAtgIBAAADCQAAAgUCZmIFAmZiBAJoegkBAmZjAwAAAAAAAAQCZ3UIBQJoegJfMQQCZVQIBQJoegJfMgQCZ3YJAQJmZwIFAmZiBQJlVAMJAAACBQJndgUCZ3YJAM4IAgUCZE0FAmd1CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRhAQNnZXQABAJmYgkBAmVVAwkAtgIBAAAJALYCAQAACQC2AgEAAAMJAAACBQJmYgUCZmIEAmVoCQECZnQBBQJkYQQCaEEIBQJlaAJfMQQCZEwIBQJlaAJfMgQCZFcIBQJlaAJfMwQCZHEIBQJlaAJfNAQCZE0IBQJlaAJfNQQCZUkJAPwHBAUCYVUCBGJ1cm4JAMwIAgUCZFcFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCZHEFAmRXBQNuaWwDCQAAAgUCZUkFAmVJBAJoQgkBAmZjAwkBAS0BBQJoQQkBAS0BBQJkTAAABAJndQgFAmhCAl8xBAJlVAgFAmhCAl8yBAJndgkBAmZnAgUCZmIFAmVUAwkAAAIFAmd2BQJndgkAzggCBQJkTQUCZ3UJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZGEBC2dldE9uZVRrblYyAgJmWAJmWQQCaHIKAAJiZQkA/AcEBQJhVQIoaXNQb29sT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWRSRUFET05MWQkAzAgCCQClCAEFBHRoaXMFA25pbAUDbmlsAwkAAQIFAmJlAgdCb29sZWFuBQJiZQkAAgEJAKwCAgkAAwEFAmJlAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuBAJmdgMJAQEhAQkBAmJpAQgFAmRhBmNhbGxlcgMDCQECYmsABgkAAAIFAmJ6BQF0BgUCaHIHBAJnVgkAzAgCAwMJAQEhAQUCZnYGCQECZ3oBBQJkYQYJAQJiYQECIWdldCBvcGVyYXRpb24gaXMgYmxvY2tlZCBieSBhZG1pbgkAzAgCAwkAAAIJAJADAQgFAmRhCHBheW1lbnRzAAEGCQECYmEBAh5leGFjdGx5IDEgcGF5bWVudCBhcmUgZXhwZWN0ZWQFA25pbAMJAAACBQJnVgUCZ1YEAmhDCQECZlcGBQJmWAUCZlkIBQJkYQhwYXltZW50cwgFAmRhBmNhbGxlcggFAmRhDG9yaWdpbkNhbGxlcggFAmRhDXRyYW5zYWN0aW9uSWQEAmRNCAUCaEMCXzEEAmdoCAUCaEMCXzIJAJQKAgUCZE0FAmdoCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRhAQpyZWZyZXNoRExwAAQCaEQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUCYXQAAAQCaEUDCQBnAgkAZQIFBmhlaWdodAUCaEQFAmF3BQR1bml0CQECYmEBCQC5CQIJAMwIAgkApAMBBQJhdwkAzAgCAi8gYmxvY2tzIGhhdmUgbm90IHBhc3NlZCBzaW5jZSB0aGUgcHJldmlvdXMgY2FsbAUDbmlsAgADCQAAAgUCaEUFAmhFBAJmbgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCoAwEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUCYXMCATAJAQJiYwECC2ludmFsaWQgZExwBAJoRgkBAmZjAwAAAAAAAAQCaEcIBQJoRgJfMQQCZVQIBQJoRgJfMgQCZmYDCQECIT0CBQJmbgUCZVQFAmhHCQECYmEBAhJub3RoaW5nIHRvIHJlZnJlc2gJAJQKAgUCZmYJAKYDAQUCZVQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZGEBE2dldE9uZVRrblYyUkVBRE9OTFkCAmZYAmhIBAJkdQkA2AQBCQEFdmFsdWUBBQJiQgQCZHYJANgEAQkBBXZhbHVlAQUCYkMEAmR0CQDYBAEJAQV2YWx1ZQEFAmJBBAJjTQkAzAgCCQC2AgEJAQJjYQEFAmR1CQDMCAIJALYCAQkBAmNhAQUCZHYFA25pbAQCZVMJALYCAQgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBCQDZBAEFAmR0AhBpbnZhbGlkIGxwIGFzc2V0CHF1YW50aXR5BAJjbwkBAmNMAQUCY00EAmNuCQC4AgIFAmNvCQC8AgMJALYCAQUCaEgFAmNvBQJlUwQCaEkDCQAAAgUCZlgFAmR1AAADCQAAAgUCZlgFAmR2AAEJAAIBAhRpbnZhbGlkIG91dCBhc3NldCBpZAQCaEoJAQJlQwMFAmNNBQJoSQUCY24EAmdNCQC4AgIJAJEDAgUCY00FAmhJBQJoSgQCZ04JAJYDAQkAzAgCAAAJAMwIAgkAoAMBCQC4AgIFAmdNBQFmBQNuaWwEAmhLCQECY0kCBQJnTgUCYmYEAmdnCAUCaEsCXzEEAmNLCAUCaEsCXzIJAJQKAgUDbmlsCQCUCgIFAmdnBQJjSwJkYQEcZ2V0T25lVGtuVjJXaXRoQm9udXNSRUFET05MWQICZlgCaEgEAmR1CQDYBAEJAQV2YWx1ZQEFAmJCBAJkdgkA2AQBCQEFdmFsdWUBBQJiQwQCZHQJANgEAQkBBXZhbHVlAQUCYkEEAmRBCQECY2EBBQJkdQQCZEMJAQJjYQEFAmR2BAJoTAoAAmJlCQD8BwQFBHRoaXMCE2dldE9uZVRrblYyUkVBRE9OTFkJAMwIAgUCZlgJAMwIAgUCaEgFA25pbAUDbmlsAwkAAQIFAmJlAgooSW50LCBJbnQpBQJiZQkAAgEJAKwCAgkAAwEFAmJlAh8gY291bGRuJ3QgYmUgY2FzdCB0byAoSW50LCBJbnQpBAJnZwgFAmhMAl8xBAJjSwgFAmhMAl8yBAJlaAkBAmRvBAIABQJkdAUCaEgFBHRoaXMEAmRLCAUCZWgCXzEEAmRMCAUCZWgCXzIEAmhNCQBkAgUCZEsFAmRMBAJmVgMJAAACBQJoTQAAAwkAAAIFAmdnAAAAAAkAAgECF2JvbnVzIGNhbGN1bGF0aW9uIGVycm9yCQBrAwkAZQIFAmdnBQJoTQUBYQUCaE0JAJQKAgUDbmlsCQCVCgMFAmdnBQJjSwUCZlYCZGEBCWdldE5vTGVzcwICaE4CaE8EAmVoCQECZnQBBQJkYQQCZEsIBQJlaAJfMQQCZEwIBQJlaAJfMgQCZFcIBQJlaAJfMwQCZHEIBQJlaAJfNAQCZE0IBQJlaAJfNQMJAGYCBQJoTgUCZEsJAAIBCQCsAgIJAKwCAgkArAICAglGYWlsZWQ6ICAJAKQDAQUCZEsCAyA8IAkApAMBBQJoTgMJAGYCBQJoTwUCZEwJAAIBCQCsAgIJAKwCAgkArAICAghGYWlsZWQ6IAkApAMBBQJkTAIDIDwgCQCkAwEFAmhPBAJmYgkBAmVVAwkAtgIBAAAJALYCAQAACQC2AgEAAAMJAAACBQJmYgUCZmIEAmhQCQD8BwQFAmFVAgRidXJuCQDMCAIFAmRXBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmRxBQJkVwUDbmlsAwkAAAIFAmhQBQJoUAQCaFEJAQJmYwMJAQEtAQUCZEsJAQEtAQUCZEwAAAQCZ3UIBQJoUQJfMQQCZVQIBQJoUQJfMgQCZ3YJAQJmZwIFAmZiBQJlVAMJAAACBQJndgUCZ3YJAM4IAgUCZE0FAmd1CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRhAQ11bnN0YWtlQW5kR2V0AQJjSgQCaFIDCQECIT0CCQCQAwEIBQJkYQhwYXltZW50cwAACQACAQINTm8gcG1udHMgZXhwZAYDCQAAAgUCaFIFAmhSBAJoUwkBAmJGAAQCaGgFAmJBBAJoVAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCaFMFAUQCCldyIHN0IGFkZHIEAmZiCQECZVUDCQC2AgEAAAkAtgIBAAAJALYCAQAAAwkAAAIFAmZiBQJmYgQCaFUJAPwHBAUCaFQCB3Vuc3Rha2UJAMwIAgkA2AQBBQJoaAkAzAgCBQJjSgUDbmlsBQNuaWwDCQAAAgUCaFUFAmhVBAJlaAkBAmRvBAkA2AQBCAUCZGENdHJhbnNhY3Rpb25JZAkA2AQBBQJoaAUCY0oIBQJkYQZjYWxsZXIEAmRLCAUCZWgCXzEEAmRMCAUCZWgCXzIEAmR5CQENcGFyc2VJbnRWYWx1ZQEIBQJlaAJfOQQCZE0IBQJlaANfMTAEAmZ2AwkBASEBCQECYmkBCAUCZGEGY2FsbGVyAwkBAmJrAAYJAAACBQJiegUBdAcEAmhWAwUCZnYJAAIBCQCsAgICCUJsb2NrZWQ6IAkApAMBBQJkeQYDCQAAAgUCaFYFAmhWBAJoVwkA/AcEBQJhVQIEYnVybgkAzAgCBQJjSgUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJoaAUCY0oFA25pbAMJAAACBQJoVwUCaFcEAmhYCQECZmMDCQEBLQEFAmRLCQEBLQEFAmRMAAAEAmd1CAUCaFgCXzEEAmVUCAUCaFgCXzIEAmd2CQECZmcCBQJmYgUCZVQDCQAAAgUCZ3YFAmd2CQDOCAIFAmRNBQJndQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkYQETdW5zdGFrZUFuZEdldE5vTGVzcwMCaFkCaFoCaE8EAmZ2AwkBASEBCQECYmkBCAUCZGEGY2FsbGVyAwkBAmJrAAYJAAACBQJiegUBdAcEAmdWCQDMCAIDCQEBIQEFAmZ2BgkAAgECIWdldCBvcGVyYXRpb24gaXMgYmxvY2tlZCBieSBhZG1pbgkAzAgCAwkAAAIJAJADAQgFAmRhCHBheW1lbnRzAAAGCQACAQIYbm8gcGF5bWVudHMgYXJlIGV4cGVjdGVkBQNuaWwDCQAAAgUCZ1YFAmdWBAJmYgkBAmVVAwkAtgIBAAAJALYCAQAACQC2AgEAAAMJAAACBQJmYgUCZmIEAmhVCQD8BwQFAmJIAgd1bnN0YWtlCQDMCAIJANgEAQUCYkEJAMwIAgUCaFkFA25pbAUDbmlsAwkAAAIFAmhVBQJoVQQCaWEJAQJkbwQJANgEAQgFAmRhDXRyYW5zYWN0aW9uSWQJANgEAQUCYkEFAmhZCAUCZGEGY2FsbGVyBAJkSwgFAmlhAl8xBAJkTAgFAmlhAl8yBAJkTQgFAmlhA18xMAQCaWIJAMwIAgMJAGcCBQJkSwUCaFoGCQACAQkAuQkCCQDMCAICLGFtb3VudCBhc3NldCBhbW91bnQgdG8gcmVjZWl2ZSBpcyBsZXNzIHRoYW4gCQDMCAIJAKQDAQUCaFoFA25pbAIACQDMCAIDCQBnAgUCZEwFAmhPBgkAAgEJALkJAgkAzAgCAitwcmljZSBhc3NldCBhbW91bnQgdG8gcmVjZWl2ZSBpcyBsZXNzIHRoYW4gCQDMCAIJAKQDAQUCaE8FA25pbAIABQNuaWwDCQAAAgUCaWIFAmliBAJoUAkA/AcEBQJhVQIEYnVybgkAzAgCBQJoWQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJiQQUCaFkFA25pbAMJAAACBQJoUAUCaFAEAmljCQECZmMDCQEBLQEFAmRLCQEBLQEFAmRMAAAEAmd1CAUCaWMCXzEEAmVUCAUCaWMCXzIEAmd2CQECZmcCBQJmYgUCZVQDCQAAAgUCZ3YFAmd2CQDOCAIFAmRNBQJndQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkYQEVdW5zdGFrZUFuZEdldE9uZVRrblYyAwJoWQJmWAJmWQQCaHIKAAJiZQkA/AcEBQJhVQIoaXNQb29sT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWRSRUFET05MWQkAzAgCCQClCAEFBHRoaXMFA25pbAUDbmlsAwkAAQIFAmJlAgdCb29sZWFuBQJiZQkAAgEJAKwCAgkAAwEFAmJlAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuBAJmdgMJAQEhAQkBAmJpAQgFAmRhBmNhbGxlcgMDCQECYmsABgkAAAIFAmJ6BQF0BgUCaHIHBAJnVgkAzAgCAwMJAQEhAQUCZnYGCQECZ3oBBQJkYQYJAQJiYQECIWdldCBvcGVyYXRpb24gaXMgYmxvY2tlZCBieSBhZG1pbgkAzAgCAwkAAAIJAJADAQgFAmRhCHBheW1lbnRzAAAGCQECYmEBAhhubyBwYXltZW50cyBhcmUgZXhwZWN0ZWQFA25pbAMJAAACBQJnVgUCZ1YEAmhTCQECYkYABAJoaAUCYkEEAmhUCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJoUwUBRAIKV3Igc3QgYWRkcgQCZHMIBQJkYQZjYWxsZXIEAmlkBQR0aGlzBAJoVQkA/AcEBQJoVAIPdW5zdGFrZUlOVEVSTkFMCQDMCAIFAmhoCQDMCAIFAmhZCQDMCAIIBQJkcwVieXRlcwkAzAgCCAUCaWQFYnl0ZXMFA25pbAUDbmlsAwkAAAIFAmhVBQJoVQQCaWUJAQJmVwYFAmZYBQJmWQkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCaGgFAmhZBQNuaWwIBQJkYQZjYWxsZXIIBQJkYQxvcmlnaW5DYWxsZXIIBQJkYQ10cmFuc2FjdGlvbklkBAJkTQgFAmllAl8xBAJnaAgFAmllAl8yCQCUCgIFAmRNBQJnaAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkYQEccHV0T25lVGtuVjJXaXRoQm9udXNSRUFET05MWQICaWYCaWcEAmloCQECZkIFBQJpZgUCaWcCAAIABgQCZlEIBQJpaAJfMQQCZE0IBQJpaAJfMgQCY0sIBQJpaAJfMwQCZlYIBQJpaAJfNAkAlAoCBQNuaWwJAJUKAwUCZlEFAmNLBQJmVgJkYQEhcHV0T25lVGtuVjJXaXRob3V0VGFrZUZlZVJFQURPTkxZAgJpZgJpZwQCaWkJAQJmQgUFAmlmBQJpZwIAAgAHBAJmUQgFAmlpAl8xBAJkTQgFAmlpAl8yBAJjSwgFAmlpAl8zBAJmVggFAmlpAl80CQCUCgIFA25pbAkAlQoDBQJmUQUCY0sFAmZWAmRhAQhhY3RpdmF0ZQICaWoCaWsDCQECIT0CCQClCAEIBQJkYQZjYWxsZXIJAKUIAQUCYVUJAAIBAgZkZW5pZWQJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCCQECYWsABQJpagkAzAgCCQELU3RyaW5nRW50cnkCCQECYWwABQJpawkAzAgCCQELU3RyaW5nRW50cnkCCQECYW0ACQCkAwEFAWwJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFuAQUGaGVpZ2h0CQCkAwEFAWwFA25pbAIHc3VjY2VzcwJkYQEcZ2V0UG9vbENvbmZpZ1dyYXBwZXJSRUFET05MWQAJAJQKAgUDbmlsCQECYm4AAmRhARxnZXRBY2NCYWxhbmNlV3JhcHBlclJFQURPTkxZAQJjYgkAlAoCBQNuaWwJAQJjYQEFAmNiAmRhARljYWxjUHJpY2VzV3JhcHBlclJFQURPTkxZAwJjdQJjdgJjegQCaWwJAQJjeQMFAmN1BQJjdgUCY3oJAJQKAgUDbmlsCQDMCAIJAKYDAQkAkQMCBQJpbAAACQDMCAIJAKYDAQkAkQMCBQJpbAABCQDMCAIJAKYDAQkAkQMCBQJpbAACBQNuaWwCZGEBFmZyb21YMThXcmFwcGVyUkVBRE9OTFkCAU4CaW0JAJQKAgUDbmlsCQEBTQIJAKcDAQUBTgUCaW0CZGEBFHRvWDE4V3JhcHBlclJFQURPTkxZAgFKAUsJAJQKAgUDbmlsCQCmAwEJAQFJAgUBSgUBSwJkYQEeY2FsY1ByaWNlQmlnSW50V3JhcHBlclJFQURPTkxZAgJjZAJjZQkAlAoCBQNuaWwJAKYDAQkBAmNjAgkApwMBBQJjZAkApwMBBQJjZQJkYQEjZXN0aW1hdGVQdXRPcGVyYXRpb25XcmFwcGVyUkVBRE9OTFkJAmRwAmNqAmRPAmRQAmRRAmRSAmluAmRTAmRUCQCUCgIFA25pbAkBAmRODQUCZHAFAmNqBQJkTwUCZFAFAmRRBQJkUgUCaW4FAmRTBQJkVAYHAAACAAJkYQEjZXN0aW1hdGVHZXRPcGVyYXRpb25XcmFwcGVyUkVBRE9OTFkEAmRwAmlvAmRyAmluBAJlaAkBAmRvBAUCZHAFAmlvBQJkcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUCaW4JAJQKAgUDbmlsCQCcCgoIBQJlaAJfMQgFAmVoAl8yCAUCZWgCXzMIBQJlaAJfNAgFAmVoAl81CAUCZWgCXzYIBQJlaAJfNwkApgMBCAUCZWgCXzgIBQJlaAJfOQgFAmVoA18xMAJkYQEJY2hhbmdlQW1wAAQCaXAJAPwHBAUCYVUCGmdldENoYW5nZUFtcENvbmZpZ1JFQURPTkxZCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwEAmlxBAJhUQUCaXADCQABAgUCYVECCUxpc3RbQW55XQQCaXIFAmFRCQCVCgMKAAJiZQkAkQMCBQJpcgAAAwkAAQIFAmJlAgNJbnQFAmJlCQACAQkArAICCQADAQUCYmUCGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAoAAmJlCQCRAwIFAmlyAAEDCQABAgUCYmUCA0ludAUCYmUJAAIBCQCsAgIJAAMBBQJiZQIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50CgACYmUJAJEDAgUCaXIAAgMJAAECBQJiZQIDSW50BQJiZQkAAgEJAKwCAgkAAwEFAmJlAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQJAQJiYQECEmludmFsaWQgZW50cnkgdHlwZQQCaXMIBQJpcQJfMQQCaXQIBQJpcQJfMgQCaXUIBQJpcQJfMwQCaXYJAQ1wYXJzZUludFZhbHVlAQkBEUBleHRyTmF0aXZlKDEwNTgpAQkBAmFtAAQCaXcJAGQCBQJpdgUCaXQEAml4AwkAZgIAAAUCaXQDCQBmAgUCaXUFAml3BQJpdQUCaXcDCQBmAgUCaXcFAml1BQJpdQUCaXcEAml5CQELdmFsdWVPckVsc2UCCQCfCAEJAQJhcAAAAAQCaXoJAGQCBQJpeQUCaXMEAmdWCQDMCAIDCQBmAgUGaGVpZ2h0BQJpegYJAQJiYQECF3RyeSBhZ2FpbiBpbiBmZXcgYmxvY2tzCQDMCAIDCQECIT0CBQJpdgUCaXgGCQECYmEBAhZhbHJlYWR5IHJlYWNoZWQgdGFyZ2V0BQNuaWwDCQAAAgUCZ1YFAmdWCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYXAABQZoZWlnaHQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFtAAkApAMBBQJpeAkAzAgCCQELU3RyaW5nRW50cnkCCQECYW4BBQZoZWlnaHQJAKQDAQUCaXgFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECaUEBAmlCAAQCaUMEAmFRCQECZ3cAAwkAAQIFAmFRAgpCeXRlVmVjdG9yBAJnQQUCYVEFAmdBAwkAAQIFAmFRAgRVbml0CAUCaUEPc2VuZGVyUHVibGljS2V5CQACAQILTWF0Y2ggZXJyb3IEAmFRBQJpQQMJAAECBQJhUQIFT3JkZXIEAmZqBQJhUQQCaUQJAQJibAAEAmlFAwkBAmdIAAkAlAoCBgIACQECZmkBBQJmagQCYUsIBQJpRQJfMQQCYUwIBQJpRQJfMgQCYU0JAPQDAwgFAmZqCWJvZHlCeXRlcwkAkQMCCAUCZmoGcHJvb2ZzAAAIBQJmag9zZW5kZXJQdWJsaWNLZXkEAmFOCQD0AwMIBQJmaglib2R5Qnl0ZXMJAJEDAggFAmZqBnByb29mcwABBQJpRAMDAwUCYUsFAmFNBwUCYU4HBgkBAmFKBAUCYUsFAmFMBQJhTQUCYU4DCQABAgUCYVECFFNldFNjcmlwdFRyYW5zYWN0aW9uBAJhVgUCYVEDCQD0AwMIBQJpQQlib2R5Qnl0ZXMJAJEDAggFAmlBBnByb29mcwAABQJpQwYEAmlGCQD2AwEJAQV2YWx1ZQEIBQJhVgZzY3JpcHQEAmlHCQDbBAEJAQV2YWx1ZQEJAJ0IAgUCYVUJAQJhRgAEAmlICQDxBwEFBHRoaXMDCQAAAgUCaUcFAmlGCQECIT0CBQJpSAUCaUYHCQD0AwMIBQJpQQlib2R5Qnl0ZXMJAJEDAggFAmlBBnByb29mcwAABQJpQ1Wa7u0=", "height": 3867170, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GbFKUHqC2DBkqkNc498gymbcY2m7ZsviHzq4UinCTU8U Next: none Diff:
OldNewDifferences
470470 let priceDcm = cfgPriceAssetDecimals
471471 let sts = toString(cfgPoolStatus)
472472 let lpEm = valueOrErrorMessage(assetInfo(lpId), "Wr lp as").quantity
473- let amBalance = if (isEval)
474- then getAccBalance(amIdStr)
475- else if (if (isOneAsset)
476- then (pmtId == amIdStr)
477- else false)
478- then (getAccBalance(amIdStr) - pmtAmt)
479- else if (isOneAsset)
473+ let checkAssets = [if (if ((inAmId == parseAssetId(amIdStr)))
474+ then (inPrId == parseAssetId(prIdStr))
475+ else false)
476+ then true
477+ else throwErr("Invalid amt or price asset passed.")]
478+ if ((checkAssets == checkAssets))
479+ then {
480+ let amBalance = if (isEval)
480481 then getAccBalance(amIdStr)
481- else (getAccBalance(amIdStr) - inAmAmt)
482- let prBalance = if (isEval)
483- then getAccBalance(prIdStr)
484- else if (if (isOneAsset)
485- then (pmtId == prIdStr)
486- else false)
487- then (getAccBalance(prIdStr) - pmtAmt)
488- else if (isOneAsset)
482+ else if (if (isOneAsset)
483+ then (pmtId == amIdStr)
484+ else false)
485+ then (getAccBalance(amIdStr) - pmtAmt)
486+ else if (isOneAsset)
487+ then getAccBalance(amIdStr)
488+ else (getAccBalance(amIdStr) - inAmAmt)
489+ let prBalance = if (isEval)
489490 then getAccBalance(prIdStr)
490- else (getAccBalance(prIdStr) - inPrAmt)
491- let inAmAssetAmtX18 = t1(inAmAmt, amtDcm)
492- let inPrAssetAmtX18 = t1(inPrAmt, priceDcm)
493- let userPriceX18 = cpbi(inPrAssetAmtX18, inAmAssetAmtX18)
494- let amBalanceX18 = t1(amBalance, amtDcm)
495- let prBalanceX18 = t1(prBalance, priceDcm)
496- let D0 = getD([amBalanceX18, prBalanceX18])
497- let r = if ((lpEm == 0))
498- then {
499- let D1 = getD([(amBalanceX18 + inAmAssetAmtX18), (prBalanceX18 + inPrAssetAmtX18)])
500- let checkD = if ((D1 > D0))
501- then true
502- else throw("D1 should be greater than D0")
503- if ((checkD == checkD))
491+ else if (if (isOneAsset)
492+ then (pmtId == prIdStr)
493+ else false)
494+ then (getAccBalance(prIdStr) - pmtAmt)
495+ else if (isOneAsset)
496+ then getAccBalance(prIdStr)
497+ else (getAccBalance(prIdStr) - inPrAmt)
498+ let inAmAssetAmtX18 = t1(inAmAmt, amtDcm)
499+ let inPrAssetAmtX18 = t1(inPrAmt, priceDcm)
500+ let userPriceX18 = cpbi(inPrAssetAmtX18, inAmAssetAmtX18)
501+ let amBalanceX18 = t1(amBalance, amtDcm)
502+ let prBalanceX18 = t1(prBalance, priceDcm)
503+ let D0 = getD([amBalanceX18, prBalanceX18])
504+ let r = if ((lpEm == 0))
504505 then {
505- let curPriceX18 = zeroBigInt
506- let slippageX18 = zeroBigInt
507- let lpAmtX18 = D1
508- $Tuple5(f1(lpAmtX18, scale8), f1(inAmAssetAmtX18, amtDcm), f1(inPrAssetAmtX18, priceDcm), cpbi((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
509- }
510- else throw("Strict value is not equal to itself.")
511- }
512- else {
513- let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
514- let slippageRealX18 = fraction(abs((curPriceX18 - userPriceX18)), scale18, curPriceX18)
515- let slippageX18 = t1(slippage, scale8)
516- if (if (if (validateSlippage)
517- then (curPriceX18 != zeroBigInt)
518- else false)
519- then (slippageRealX18 > slippageX18)
520- else false)
521- then throw(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
522- else {
523- let lpEmissionX18 = t1(lpEm, scale8)
524- let prViaAmX18 = fraction(inAmAssetAmtX18, cpbir(prBalanceX18, amBalanceX18, CEILING), scale18, CEILING)
525- let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, cpbir(prBalanceX18, amBalanceX18, FLOOR), CEILING)
526- let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
527- then $Tuple2(amViaPrX18, inPrAssetAmtX18)
528- else $Tuple2(inAmAssetAmtX18, prViaAmX18)
529- let expAmtAssetAmtX18 = expectedAmts._1
530- let expPriceAssetAmtX18 = expectedAmts._2
531- let D1 = getD([(amBalanceX18 + expAmtAssetAmtX18), (prBalanceX18 + expPriceAssetAmtX18)])
506+ let D1 = getD([(amBalanceX18 + inAmAssetAmtX18), (prBalanceX18 + inPrAssetAmtX18)])
532507 let checkD = if ((D1 > D0))
533508 then true
534509 else throw("D1 should be greater than D0")
535510 if ((checkD == checkD))
536511 then {
537- let lpAmtX18 = fraction(lpEmissionX18, (D1 - D0), D0)
538- $Tuple5(fromX18Round(lpAmtX18, scale8, FLOOR), fromX18Round(expAmtAssetAmtX18, amtDcm, CEILING), fromX18Round(expPriceAssetAmtX18, priceDcm, CEILING), curPriceX18, slippageX18)
512+ let curPriceX18 = zeroBigInt
513+ let slippageX18 = zeroBigInt
514+ let lpAmtX18 = D1
515+ $Tuple5(f1(lpAmtX18, scale8), f1(inAmAssetAmtX18, amtDcm), f1(inPrAssetAmtX18, priceDcm), cpbi((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
539516 }
540517 else throw("Strict value is not equal to itself.")
541518 }
519+ else {
520+ let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
521+ let slippageRealX18 = fraction(abs((curPriceX18 - userPriceX18)), scale18, curPriceX18)
522+ let slippageX18 = t1(slippage, scale8)
523+ if (if (if (validateSlippage)
524+ then (curPriceX18 != zeroBigInt)
525+ else false)
526+ then (slippageRealX18 > slippageX18)
527+ else false)
528+ then throw(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
529+ else {
530+ let lpEmissionX18 = t1(lpEm, scale8)
531+ let prViaAmX18 = fraction(inAmAssetAmtX18, cpbir(prBalanceX18, amBalanceX18, CEILING), scale18, CEILING)
532+ let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, cpbir(prBalanceX18, amBalanceX18, FLOOR), CEILING)
533+ let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
534+ then $Tuple2(amViaPrX18, inPrAssetAmtX18)
535+ else $Tuple2(inAmAssetAmtX18, prViaAmX18)
536+ let expAmtAssetAmtX18 = expectedAmts._1
537+ let expPriceAssetAmtX18 = expectedAmts._2
538+ let D1 = getD([(amBalanceX18 + expAmtAssetAmtX18), (prBalanceX18 + expPriceAssetAmtX18)])
539+ let checkD = if ((D1 > D0))
540+ then true
541+ else throw("D1 should be greater than D0")
542+ if ((checkD == checkD))
543+ then {
544+ let lpAmtX18 = fraction(lpEmissionX18, (D1 - D0), D0)
545+ $Tuple5(fromX18Round(lpAmtX18, scale8, FLOOR), fromX18Round(expAmtAssetAmtX18, amtDcm, CEILING), fromX18Round(expPriceAssetAmtX18, priceDcm, CEILING), curPriceX18, slippageX18)
546+ }
547+ else throw("Strict value is not equal to itself.")
548+ }
549+ }
550+ let calcLpAmt = r._1
551+ let calcAmAssetPmt = r._2
552+ let calcPrAssetPmt = r._3
553+ let curPrice = f1(r._4, scale8)
554+ let slippageCalc = f1(r._5, scale8)
555+ if ((0 >= calcLpAmt))
556+ then throw("LP <= 0")
557+ else {
558+ let emitLpAmt = if (!(emitLp))
559+ then 0
560+ else calcLpAmt
561+ let amDiff = (inAmAmt - calcAmAssetPmt)
562+ let prDiff = (inPrAmt - calcPrAssetPmt)
563+ let $t02149821843 = if (if (isOneAsset)
564+ then (pmtId == amIdStr)
565+ else false)
566+ then $Tuple2(pmtAmt, 0)
567+ else if (if (isOneAsset)
568+ then (pmtId == prIdStr)
569+ else false)
570+ then $Tuple2(0, pmtAmt)
571+ else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
572+ let writeAmAmt = $t02149821843._1
573+ let writePrAmt = $t02149821843._2
574+ let commonState = [IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice), StringEntry(pau(userAddress, txId58), dataPutActionInfo(writeAmAmt, writePrAmt, emitLpAmt, curPrice, slippage, slippageCalc, height, lastBlock.timestamp, amDiff, prDiff))]
575+ $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
576+ }
542577 }
543- let calcLpAmt = r._1
544- let calcAmAssetPmt = r._2
545- let calcPrAssetPmt = r._3
546- let curPrice = f1(r._4, scale8)
547- let slippageCalc = f1(r._5, scale8)
548- if ((0 >= calcLpAmt))
549- then throw("LP <= 0")
550- else {
551- let emitLpAmt = if (!(emitLp))
552- then 0
553- else calcLpAmt
554- let amDiff = (inAmAmt - calcAmAssetPmt)
555- let prDiff = (inPrAmt - calcPrAssetPmt)
556- let $t02133721682 = if (if (isOneAsset)
557- then (pmtId == amIdStr)
558- else false)
559- then $Tuple2(pmtAmt, 0)
560- else if (if (isOneAsset)
561- then (pmtId == prIdStr)
562- else false)
563- then $Tuple2(0, pmtAmt)
564- else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
565- let writeAmAmt = $t02133721682._1
566- let writePrAmt = $t02133721682._2
567- let commonState = [IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice), StringEntry(pau(userAddress, txId58), dataPutActionInfo(writeAmAmt, writePrAmt, emitLpAmt, curPrice, slippage, slippageCalc, height, lastBlock.timestamp, amDiff, prDiff))]
568- $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
569- }
578+ else throw("Strict value is not equal to itself.")
570579 }
571580
572581
582591 let c = (((((D * D) / (x * n)) * D) * aPrecision) / (ann * n))
583592 let b = ((s + ((D * aPrecision) / ann)) - D)
584593 func calc (acc,cur) = {
585- let $t02287722897 = acc
586- let y = $t02287722897._1
587- let found = $t02287722897._2
594+ let $t02303823058 = acc
595+ let y = $t02303823058._1
596+ let found = $t02303823058._2
588597 if ((found != unit))
589598 then acc
590599 else {
597606 }
598607
599608 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
600- let $t02320423251 = {
609+ let $t02336523412 = {
601610 let $l = arr
602611 let $s = size($l)
603612 let $acc0 = $Tuple2(D, unit)
611620
612621 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
613622 }
614- let y = $t02320423251._1
615- let found = $t02320423251._2
623+ let y = $t02336523412._1
624+ let found = $t02336523412._2
616625 if ((found != unit))
617626 then y
618627 else throw(("Y calculation error, Y = " + toString(y)))
656665 let priceAssetBalance = getAccBalance(assetIdToString(cfgPriceAssetId))
657666 let amountAssetAmount = order.amount
658667 let priceAssetAmount = fraction(order.amount, order.price, scale8, FLOOR)
659- let $t02544925661 = if ((order.orderType == Buy))
668+ let $t02561025822 = if ((order.orderType == Buy))
660669 then $Tuple2(amountAssetAmount, -(priceAssetAmount))
661670 else $Tuple2(-(amountAssetAmount), priceAssetAmount)
662- let amountAssetBalanceDelta = $t02544925661._1
663- let priceAssetBalanceDelta = $t02544925661._2
671+ let amountAssetBalanceDelta = $t02561025822._1
672+ let priceAssetBalanceDelta = $t02561025822._2
664673 if (if (if (igs())
665674 then true
666675 else (cfgPoolStatus == PoolMatcherDis))
673682 then throw("Wr assets")
674683 else {
675684 let dLp = parseBigIntValue(valueOrElse(getString(this, keyDLp), "0"))
676- let $t02600326103 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
677- let unusedActions = $t02600326103._1
678- let dLpNew = $t02600326103._2
685+ let $t02616426264 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
686+ let unusedActions = $t02616426264._1
687+ let dLpNew = $t02616426264._2
679688 let isOrderValid = (dLpNew >= dLp)
680689 let info = makeString(["dLp=", toString(dLp), " dLpNew=", toString(dLpNew), " amountAssetBalance=", toString(amountAssetBalance), " priceAssetBalance=", toString(priceAssetBalance), " amountAssetBalanceDelta=", toString(amountAssetBalanceDelta), " priceAssetBalanceDelta=", toString(priceAssetBalanceDelta), " height=", toString(height)], "")
681690 $Tuple2(isOrderValid, info)
735744 then {
736745 let amBalance = getAccBalance(amId)
737746 let prBalance = getAccBalance(prId)
738- let $t02896229424 = if ((txId == ""))
747+ let $t02912329585 = if ((txId == ""))
739748 then $Tuple2(amBalance, prBalance)
740749 else if ((pmtAssetId == amId))
741750 then if ((pmtAmtRaw > amBalance))
746755 then throw("invalid payment amount")
747756 else $Tuple2(amBalance, (prBalance - pmtAmtRaw))
748757 else throw("wrong pmtAssetId")
749- let amBalanceOld = $t02896229424._1
750- let prBalanceOld = $t02896229424._2
751- let $t02943029606 = if ((pmtAssetId == amId))
758+ let amBalanceOld = $t02912329585._1
759+ let prBalanceOld = $t02912329585._2
760+ let $t02959129767 = if ((pmtAssetId == amId))
752761 then $Tuple2(pmtAmtRaw, 0)
753762 else if ((pmtAssetId == prId))
754763 then $Tuple2(0, pmtAmtRaw)
755764 else throw("invalid payment")
756- let amAmountRaw = $t02943029606._1
757- let prAmountRaw = $t02943029606._2
758- let $t02961029864 = if (withTakeFee)
765+ let amAmountRaw = $t02959129767._1
766+ let prAmountRaw = $t02959129767._2
767+ let $t02977130025 = if (withTakeFee)
759768 then $Tuple3(takeFee(amAmountRaw, inFee)._1, takeFee(prAmountRaw, inFee)._1, takeFee(pmtAmtRaw, inFee)._2)
760769 else $Tuple3(amAmountRaw, prAmountRaw, 0)
761- let amAmount = $t02961029864._1
762- let prAmount = $t02961029864._2
763- let feeAmount = $t02961029864._3
770+ let amAmount = $t02977130025._1
771+ let prAmount = $t02977130025._2
772+ let feeAmount = $t02977130025._3
764773 let amBalanceNew = (amBalanceOld + amAmount)
765774 let prBalanceNew = (prBalanceOld + prAmount)
766775 let D0 = getD([t1(amBalanceOld, cfgAmountAssetDecimals), t1(prBalanceOld, cfgPriceAssetDecimals)])
808817 else {
809818 let amBalance = getAccBalance(amId)
810819 let prBalance = getAccBalance(prId)
811- let $t03197632087 = {
820+ let $t03213732248 = {
812821 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)
813822 if ($isInstanceOf(@, "(Int, Int)"))
814823 then @
815824 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
816825 }
817- if (($t03197632087 == $t03197632087))
826+ if (($t03213732248 == $t03213732248))
818827 then {
819- let feeAmount = $t03197632087._2
820- let totalGet = $t03197632087._1
828+ let feeAmount = $t03213732248._2
829+ let totalGet = $t03213732248._1
821830 let totalAmount = if (if ((minOutAmount > 0))
822831 then (minOutAmount > totalGet)
823832 else false)
824833 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
825834 else totalGet
826- let $t03227732584 = if ((outAssetId == amId))
835+ let $t03243832745 = if ((outAssetId == amId))
827836 then $Tuple4(totalAmount, 0, ((amBalance - totalAmount) - feeAmount), prBalance)
828837 else if ((outAssetId == prId))
829838 then $Tuple4(0, totalAmount, amBalance, ((prBalance - totalAmount) - feeAmount))
830839 else throw("invalid out asset id")
831- let outAm = $t03227732584._1
832- let outPr = $t03227732584._2
833- let amBalanceNew = $t03227732584._3
834- let prBalanceNew = $t03227732584._4
840+ let outAm = $t03243832745._1
841+ let outPr = $t03243832745._2
842+ let amBalanceNew = $t03243832745._3
843+ let prBalanceNew = $t03243832745._4
835844 let curPrX18 = cpbi(t1(prBalanceNew, prDecimals), t1(amBalanceNew, amDecimals))
836845 let curPr = f1(curPrX18, scale8)
837846 let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
846855 let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
847856 if ((burn == burn))
848857 then {
849- let $t03336933719 = {
858+ let $t03353033880 = {
850859 let feeAmountForCalc = if ((this == feeCollectorAddress))
851860 then 0
852861 else feeAmount
857866 then $Tuple2(-((totalGet + feeAmountForCalc)), 0)
858867 else $Tuple2(0, -((totalGet + feeAmountForCalc)))
859868 }
860- let amountAssetBalanceDelta = $t03336933719._1
861- let priceAssetBalanceDelta = $t03336933719._2
862- let $t03372233830 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
863- let refreshDLpActions = $t03372233830._1
864- let updatedDLp = $t03372233830._2
869+ let amountAssetBalanceDelta = $t03353033880._1
870+ let priceAssetBalanceDelta = $t03353033880._2
871+ let $t03388333991 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
872+ let refreshDLpActions = $t03388333991._1
873+ let updatedDLp = $t03388333991._2
865874 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
866875 if ((isUpdatedDLpValid == isUpdatedDLpValid))
867876 then $Tuple2((state ++ refreshDLpActions), totalAmount)
933942 let c = (((((D * D) / (x * n)) * D) * aPrecision) / (ann * n))
934943 let b = ((s + ((D * aPrecision) / ann)) - D)
935944 func calc (acc,cur) = {
936- let $t03531735337 = acc
937- let y = $t03531735337._1
938- let found = $t03531735337._2
945+ let $t03547835498 = acc
946+ let y = $t03547835498._1
947+ let found = $t03547835498._2
939948 if ((found != unit))
940949 then acc
941950 else {
948957 }
949958
950959 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
951- let $t03566835715 = {
960+ let $t03582935876 = {
952961 let $l = arr
953962 let $s = size($l)
954963 let $acc0 = $Tuple2(D, unit)
962971
963972 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
964973 }
965- let y = $t03566835715._1
966- let found = $t03566835715._2
974+ let y = $t03582935876._1
975+ let found = $t03582935876._2
967976 if ((found != unit))
968977 then y
969978 else throw(("Y calculation error, Y = " + toString(y)))
975984
976985 @Callable(i)
977986 func calculateAmountOutForSwapREADONLY (cleanAmountIn,isReverse,feePoolAmount) = {
978- let $t03606736491 = if ((isReverse == false))
987+ let $t03622836652 = if ((isReverse == false))
979988 then {
980989 let assetOut = strf(this, pa())
981990 let poolAmountInBalance = (toBigInt(getAccBalance(strf(this, aa()))) + toBigInt(cleanAmountIn))
986995 let poolAmountInBalance = (toBigInt(getAccBalance(strf(this, pa()))) + toBigInt(cleanAmountIn))
987996 $Tuple2(assetOut, poolAmountInBalance)
988997 }
989- let assetOut = $t03606736491._1
990- let poolAmountInBalance = $t03606736491._2
998+ let assetOut = $t03622836652._1
999+ let poolAmountInBalance = $t03622836652._2
9911000 let poolConfig = gpc()
9921001 let amId = poolConfig[idxAmAsId]
9931002 let prId = poolConfig[idxPrAsId]
10441053 then {
10451054 let pmt = value(i.payments[0])
10461055 let assetIn = assetIdToString(pmt.assetId)
1047- let $t03826338657 = if ((isReverse == false))
1056+ let $t03842438818 = if ((isReverse == false))
10481057 then {
10491058 let assetOut = strf(this, pa())
10501059 let poolAmountInBalance = (getAccBalance(assetIn) - value(i.payments[0]).amount)
10551064 let poolAmountInBalance = (getAccBalance(assetIn) - value(i.payments[0]).amount)
10561065 $Tuple2(assetOut, poolAmountInBalance)
10571066 }
1058- let assetOut = $t03826338657._1
1059- let poolAmountInBalance = $t03826338657._2
1067+ let assetOut = $t03842438818._1
1068+ let poolAmountInBalance = $t03842438818._2
10601069 let poolConfig = gpc()
10611070 let amId = poolConfig[idxAmAsId]
10621071 let prId = poolConfig[idxPrAsId]
11721181 else throw("Strict value is not equal to itself.")
11731182 }
11741183 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
1175- let $t04311243254 = refreshDLpInternal(0, 0, 0)
1176- let refreshDLpActions = $t04311243254._1
1177- let updatedDLp = $t04311243254._2
1184+ let $t04327343415 = refreshDLpInternal(0, 0, 0)
1185+ let refreshDLpActions = $t04327343415._1
1186+ let updatedDLp = $t04327343415._2
11781187 let check = if ((updatedDLp >= currentDLp))
11791188 then true
11801189 else throwErr(makeString(["updated DLp lower than current DLp", toString(amountAssetBalance), toString(priceAssetBalance), toString(lpAssetEmission), toString(currentDLp), toString(updatedDLp), toString(amDiff), toString(prDiff)], " "))
12491258 else calcCurrentDLp(toBigInt(0), toBigInt(pmtAmt), toBigInt(0))
12501259 if ((currentDLp == currentDLp))
12511260 then {
1252- let $t04493245090 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId), true)
1253- if (($t04493245090 == $t04493245090))
1261+ let $t04509345251 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId), true)
1262+ if (($t04509345251 == $t04509345251))
12541263 then {
1255- let feeAmount = $t04493245090._3
1256- let state = $t04493245090._2
1257- let estimLP = $t04493245090._1
1264+ let feeAmount = $t04509345251._3
1265+ let state = $t04509345251._2
1266+ let estimLP = $t04509345251._1
12581267 let emitLpAmt = if (if ((minOutAmount > 0))
12591268 then (minOutAmount > estimLP)
12601269 else false)
12821291 let sendFeeToMatcher = if ((feeAmount > 0))
12831292 then [ScriptTransfer(feeCollectorAddress, feeAmount, fromBase58String(pmtAssetId))]
12841293 else nil
1285- let $t04597546324 = if ((this == feeCollectorAddress))
1294+ let $t04613646485 = if ((this == feeCollectorAddress))
12861295 then $Tuple2(0, 0)
12871296 else {
12881297 let paymentInAmountAsset = if ((pmt.assetId == cfgAmountAssetId))
12921301 then $Tuple2(-(feeAmount), 0)
12931302 else $Tuple2(0, -(feeAmount))
12941303 }
1295- let amountAssetBalanceDelta = $t04597546324._1
1296- let priceAssetBalanceDelta = $t04597546324._2
1297- let $t04632746435 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1298- let refreshDLpActions = $t04632746435._1
1299- let updatedDLp = $t04632746435._2
1304+ let amountAssetBalanceDelta = $t04613646485._1
1305+ let priceAssetBalanceDelta = $t04613646485._2
1306+ let $t04648846596 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1307+ let refreshDLpActions = $t04648846596._1
1308+ let updatedDLp = $t04648846596._2
13001309 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
13011310 if ((isUpdatedDLpValid == isUpdatedDLpValid))
13021311 then $Tuple2((((state ++ lpTrnsfr) ++ sendFeeToMatcher) ++ refreshDLpActions), emitLpAmt)
13281337 let currentDLp = calcCurrentDLp(amAssetPmt, prAssetPmt, toBigInt(0))
13291338 if ((currentDLp == currentDLp))
13301339 then {
1331- let $t04746547530 = refreshDLpInternal(0, 0, 0)
1332- let refreshDLpActions = $t04746547530._1
1333- let updatedDLp = $t04746547530._2
1340+ let $t04762647691 = refreshDLpInternal(0, 0, 0)
1341+ let refreshDLpActions = $t04762647691._1
1342+ let updatedDLp = $t04762647691._2
13341343 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
13351344 if ((isUpdatedDLpValid == isUpdatedDLpValid))
13361345 then (state ++ refreshDLpActions)
13551364 let b = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
13561365 if ((b == b))
13571366 then {
1358- let $t04870348785 = refreshDLpInternal(-(outAmtAmt), -(outPrAmt), 0)
1359- let refreshDLpActions = $t04870348785._1
1360- let updatedDLp = $t04870348785._2
1367+ let $t04886448946 = refreshDLpInternal(-(outAmtAmt), -(outPrAmt), 0)
1368+ let refreshDLpActions = $t04886448946._1
1369+ let updatedDLp = $t04886448946._2
13611370 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
13621371 if ((isUpdatedDLpValid == isUpdatedDLpValid))
13631372 then (state ++ refreshDLpActions)
13941403 else throwErr("exactly 1 payment are expected")]
13951404 if ((checks == checks))
13961405 then {
1397- let $t04944049595 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1398- let state = $t04944049595._1
1399- let totalAmount = $t04944049595._2
1406+ let $t04960149756 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1407+ let state = $t04960149756._1
1408+ let totalAmount = $t04960149756._2
14001409 $Tuple2(state, totalAmount)
14011410 }
14021411 else throw("Strict value is not equal to itself.")
14131422 if ((checkLastRefreshedBlockHeight == checkLastRefreshedBlockHeight))
14141423 then {
14151424 let dLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyDLp), "0")), fmtErr("invalid dLp"))
1416- let $t05011950183 = refreshDLpInternal(0, 0, 0)
1417- let dLpUpdateActions = $t05011950183._1
1418- let updatedDLp = $t05011950183._2
1425+ let $t05028050344 = refreshDLpInternal(0, 0, 0)
1426+ let dLpUpdateActions = $t05028050344._1
1427+ let updatedDLp = $t05028050344._2
14191428 let actions = if ((dLp != updatedDLp))
14201429 then dLpUpdateActions
14211430 else throwErr("nothing to refresh")
14431452 let newY = getYD(xp, index, D1)
14441453 let dy = (xp[index] - newY)
14451454 let totalGetRaw = max([0, toInt((dy - big1))])
1446- let $t05119351248 = takeFee(totalGetRaw, outFee)
1447- let totalGet = $t05119351248._1
1448- let feeAmount = $t05119351248._2
1455+ let $t05135451409 = takeFee(totalGetRaw, outFee)
1456+ let totalGet = $t05135451409._1
1457+ let feeAmount = $t05135451409._2
14491458 $Tuple2(nil, $Tuple2(totalGet, feeAmount))
14501459 }
14511460
14581467 let lpId = toBase58String(value(cfgLpAssetId))
14591468 let amBalance = getAccBalance(amId)
14601469 let prBalance = getAccBalance(prId)
1461- let $t05162351738 = {
1470+ let $t05178451899 = {
14621471 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)
14631472 if ($isInstanceOf(@, "(Int, Int)"))
14641473 then @
14651474 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
14661475 }
1467- let totalGet = $t05162351738._1
1468- let feeAmount = $t05162351738._2
1476+ let totalGet = $t05178451899._1
1477+ let feeAmount = $t05178451899._2
14691478 let r = ego("", lpId, lpAssetAmount, this)
14701479 let outAmAmt = r._1
14711480 let outPrAmt = r._2
14991508 let burnLPAssetOnFactory = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
15001509 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
15011510 then {
1502- let $t05290452985 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1503- let refreshDLpActions = $t05290452985._1
1504- let updatedDLp = $t05290452985._2
1511+ let $t05306553146 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1512+ let refreshDLpActions = $t05306553146._1
1513+ let updatedDLp = $t05306553146._2
15051514 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
15061515 if ((isUpdatedDLpValid == isUpdatedDLpValid))
15071516 then (state ++ refreshDLpActions)
15491558 let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
15501559 if ((burnA == burnA))
15511560 then {
1552- let $t05409554176 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1553- let refreshDLpActions = $t05409554176._1
1554- let updatedDLp = $t05409554176._2
1561+ let $t05425654337 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1562+ let refreshDLpActions = $t05425654337._1
1563+ let updatedDLp = $t05425654337._2
15551564 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
15561565 if ((isUpdatedDLpValid == isUpdatedDLpValid))
15571566 then (state ++ refreshDLpActions)
16041613 let burnLPAssetOnFactory = invoke(fca, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
16051614 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
16061615 then {
1607- let $t05546455545 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1608- let refreshDLpActions = $t05546455545._1
1609- let updatedDLp = $t05546455545._2
1616+ let $t05562555706 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1617+ let refreshDLpActions = $t05562555706._1
1618+ let updatedDLp = $t05562555706._2
16101619 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
16111620 if ((isUpdatedDLpValid == isUpdatedDLpValid))
16121621 then (state ++ refreshDLpActions)
16571666 let unstakeInv = invoke(staking, "unstakeINTERNAL", [lpAssetId, unstakeAmount, userAddress.bytes, lpAssetRecipientAddress.bytes], nil)
16581667 if ((unstakeInv == unstakeInv))
16591668 then {
1660- let $t05660456792 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1661- let state = $t05660456792._1
1662- let totalAmount = $t05660456792._2
1669+ let $t05676556953 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1670+ let state = $t05676556953._1
1671+ let totalAmount = $t05676556953._2
16631672 $Tuple2(state, totalAmount)
16641673 }
16651674 else throw("Strict value is not equal to itself.")
16711680
16721681 @Callable(i)
16731682 func putOneTknV2WithBonusREADONLY (paymentAmountRaw,paymentAssetId) = {
1674- let $t05692057023 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1675- let lpAmount = $t05692057023._1
1676- let state = $t05692057023._2
1677- let feeAmount = $t05692057023._3
1678- let bonus = $t05692057023._4
1683+ let $t05708157184 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1684+ let lpAmount = $t05708157184._1
1685+ let state = $t05708157184._2
1686+ let feeAmount = $t05708157184._3
1687+ let bonus = $t05708157184._4
16791688 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
16801689 }
16811690
16831692
16841693 @Callable(i)
16851694 func putOneTknV2WithoutTakeFeeREADONLY (paymentAmountRaw,paymentAssetId) = {
1686- let $t05717157275 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1687- let lpAmount = $t05717157275._1
1688- let state = $t05717157275._2
1689- let feeAmount = $t05717157275._3
1690- let bonus = $t05717157275._4
1695+ let $t05733257436 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1696+ let lpAmount = $t05733257436._1
1697+ let state = $t05733257436._2
1698+ let feeAmount = $t05733257436._3
1699+ let bonus = $t05733257436._4
16911700 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
16921701 }
16931702
17491758 @Callable(i)
17501759 func changeAmp () = {
17511760 let cfg = invoke(fca, "getChangeAmpConfigREADONLY", [toString(this)], nil)
1752- let $t05975559954 = match cfg {
1761+ let $t05991660115 = match cfg {
17531762 case list: List[Any] =>
17541763 $Tuple3({
17551764 let @ = list[0]
17701779 case _ =>
17711780 throwErr("invalid entry type")
17721781 }
1773- let delay = $t05975559954._1
1774- let delta = $t05975559954._2
1775- let target = $t05975559954._3
1782+ let delay = $t05991660115._1
1783+ let delta = $t05991660115._2
1784+ let target = $t05991660115._3
17761785 let curAmp = parseIntValue(getStringValue(amp()))
17771786 let newAmpRaw = (curAmp + delta)
17781787 let newAmp = if ((0 > delta))
18081817 match tx {
18091818 case order: Order =>
18101819 let matcherPub = mp()
1811- let $t06088761004 = if (skipOrderValidation())
1820+ let $t06104861165 = if (skipOrderValidation())
18121821 then $Tuple2(true, "")
18131822 else validateMatcherOrderAllowed(order)
1814- let orderValid = $t06088761004._1
1815- let orderValidInfo = $t06088761004._2
1823+ let orderValid = $t06104861165._1
1824+ let orderValidInfo = $t06104861165._2
18161825 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
18171826 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
18181827 if (if (if (orderValid)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let scale8 = 100000000
55
66 let scale8BigInt = toBigInt(100000000)
77
88 let scale18 = toBigInt(1000000000000000000)
99
1010 let zeroBigInt = toBigInt(0)
1111
1212 let big0 = toBigInt(0)
1313
1414 let big1 = toBigInt(1)
1515
1616 let big2 = toBigInt(2)
1717
1818 let big3 = toBigInt(3)
1919
2020 let big4 = toBigInt(4)
2121
2222 let slippage4D = toBigInt((scale8 - ((scale8 * 1) / scale8)))
2323
2424 let wavesString = "WAVES"
2525
2626 let ampInitial = 50
2727
2828 let Amult = "100"
2929
3030 let Dconv = "1"
3131
3232 let SEP = "__"
3333
3434 let EMPTY = ""
3535
3636 let PoolActive = 1
3737
3838 let PoolPutDis = 2
3939
4040 let PoolMatcherDis = 3
4141
4242 let PoolShutdown = 4
4343
4444 let idxPoolAddress = 1
4545
4646 let idxPoolSt = 2
4747
4848 let idxLPAsId = 3
4949
5050 let idxAmAsId = 4
5151
5252 let idxPrAsId = 5
5353
5454 let idxAmtAsDcm = 6
5555
5656 let idxPriceAsDcm = 7
5757
5858 let idxIAmtAsId = 8
5959
6060 let idxIPriceAsId = 9
6161
6262 let idxFactStakCntr = 1
6363
6464 let idxFactoryRestCntr = 6
6565
6666 let idxFactSlippCntr = 7
6767
6868 let idxFactGwxRewCntr = 10
6969
7070 let feeDefault = fraction(10, scale8, 10000)
7171
7272 func t1 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
7373
7474
7575 func t1BigInt (origVal,origScaleMult) = fraction(origVal, scale18, origScaleMult)
7676
7777
7878 func f1 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
7979
8080
8181 func fromX18Round (val,resultScaleMult,round) = toInt(fraction(val, toBigInt(resultScaleMult), scale18, round))
8282
8383
8484 func t2 (origVal,origScaleMult) = fraction(origVal, scale18, toBigInt(origScaleMult))
8585
8686
8787 func f2 (val,resultScaleMult) = fraction(val, toBigInt(resultScaleMult), scale18)
8888
8989
9090 func ts (amt,resScale,curScale) = fraction(amt, resScale, curScale)
9191
9292
9393 func abs (val) = if ((zeroBigInt > val))
9494 then -(val)
9595 else val
9696
9797
9898 func absBigInt (val) = if ((zeroBigInt > val))
9999 then -(val)
100100 else val
101101
102102
103103 func fc () = "%s__factoryContract"
104104
105105
106106 func keyManagerPublicKey () = "%s__managerPublicKey"
107107
108108
109109 func keyManagerVaultAddress () = "%s__managerVaultAddress"
110110
111111
112112 func pl () = "%s%s__price__last"
113113
114114
115115 func ph (h,t) = makeString(["%s%s%d%d__price__history", toString(h), toString(t)], SEP)
116116
117117
118118 func pau (ua,txId) = ((("%s%s%s__P__" + ua) + "__") + txId)
119119
120120
121121 func gau (ua,txId) = ((("%s%s%s__G__" + ua) + "__") + txId)
122122
123123
124124 func aa () = "%s__amountAsset"
125125
126126
127127 func pa () = "%s__priceAsset"
128128
129129
130130 func amp () = "%s__amp"
131131
132132
133133 func keyAmpHistory (heightBlocks) = ("%s%d__amp__" + toString(heightBlocks))
134134
135135
136136 func keyChangeAmpLastCall () = "%s__changeAmpLastCall"
137137
138138
139139 let keyFee = "%s__fee"
140140
141141 let fee = valueOrElse(getInteger(this, keyFee), feeDefault)
142142
143143 let keyDLp = makeString(["%s", "dLp"], SEP)
144144
145145 let keyDLpRefreshedHeight = makeString(["%s", "dLpRefreshedHeight"], SEP)
146146
147147 let keyDLpRefreshDelay = makeString(["%s", "refreshDLpDelay"], SEP)
148148
149149 let dLpRefreshDelayDefault = 30
150150
151151 let dLpRefreshDelay = valueOrElse(getInteger(this, keyDLpRefreshDelay), dLpRefreshDelayDefault)
152152
153153 func fcfg () = "%s__factoryConfig"
154154
155155
156156 func mtpk () = "%s%s__matcher__publicKey"
157157
158158
159159 func pc (iAmtAs,iPrAs) = (((("%d%d%s__" + iAmtAs) + "__") + iPrAs) + "__config")
160160
161161
162162 func mba (bAStr) = ("%s%s%s__mappings__baseAsset2internalId__" + bAStr)
163163
164164
165165 func aps () = "%s__shutdown"
166166
167167
168168 func keyAllowedLpStableScriptHash () = "%s__allowedLpStableScriptHash"
169169
170170
171171 func keyFeeCollectorAddress () = "%s__feeCollectorAddress"
172172
173173
174174 func keySkipOrderValidation (poolAddress) = ("%s%s__skipOrderValidation__" + poolAddress)
175175
176176
177177 func throwOrderError (orderValid,orderValidInfo,senderValid,matcherValid) = throw((((((((("order validation failed: orderValid=" + toString(orderValid)) + " (") + orderValidInfo) + ")") + " senderValid=") + toString(senderValid)) + " matcherValid=") + toString(matcherValid)))
178178
179179
180180 func addressFromStringOrThis (addressString) = match addressFromString(addressString) {
181181 case a: Address =>
182182 a
183183 case _ =>
184184 this
185185 }
186186
187187
188188 func getManagerVaultAddressOrThis () = {
189189 let factoryAddress = match getString(fc()) {
190190 case fca: String =>
191191 addressFromStringOrThis(fca)
192192 case _ =>
193193 this
194194 }
195195 match getString(factoryAddress, keyManagerVaultAddress()) {
196196 case s: String =>
197197 addressFromStringOrThis(s)
198198 case _ =>
199199 this
200200 }
201201 }
202202
203203
204204 func strf (addr,key) = valueOrErrorMessage(getString(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
205205
206206
207207 func intf (addr,key) = valueOrErrorMessage(getInteger(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
208208
209209
210210 func throwErr (msg) = throw(makeString(["lp_stable.ride:", msg], " "))
211211
212212
213213 func fmtErr (msg) = makeString(["lp_stable.ride:", msg], " ")
214214
215215
216216 let fca = addressFromStringValue(strf(this, fc()))
217217
218218 let inFee = {
219219 let @ = invoke(fca, "getInFeeREADONLY", [toString(this)], nil)
220220 if ($isInstanceOf(@, "Int"))
221221 then @
222222 else throw(($getType(@) + " couldn't be cast to Int"))
223223 }
224224
225225 let outFee = {
226226 let @ = invoke(fca, "getOutFeeREADONLY", [toString(this)], nil)
227227 if ($isInstanceOf(@, "Int"))
228228 then @
229229 else throw(($getType(@) + " couldn't be cast to Int"))
230230 }
231231
232232 func keyAddressWhitelisted (address) = makeString(["%s%s", "whitelisted", toString(address)], SEP)
233233
234234
235235 func isAddressWhitelisted (address) = valueOrElse(getBoolean(fca, keyAddressWhitelisted(address)), false)
236236
237237
238238 let A = strf(this, amp())
239239
240240 func igs () = valueOrElse(getBoolean(fca, aps()), false)
241241
242242
243243 func mp () = fromBase58String(strf(fca, mtpk()))
244244
245245
246246 let feeCollectorAddress = addressFromStringValue(strf(fca, keyFeeCollectorAddress()))
247247
248248 func gpc () = {
249249 let amtAs = strf(this, aa())
250250 let priceAs = strf(this, pa())
251251 let iPriceAs = intf(fca, mba(priceAs))
252252 let iAmtAs = intf(fca, mba(amtAs))
253253 split(strf(fca, pc(toString(iAmtAs), toString(iPriceAs))), SEP)
254254 }
255255
256256
257257 func parseAssetId (input) = if ((input == wavesString))
258258 then unit
259259 else fromBase58String(input)
260260
261261
262262 func assetIdToString (input) = if ((input == unit))
263263 then wavesString
264264 else toBase58String(value(input))
265265
266266
267267 func parsePoolConfig (poolConfig) = $Tuple7(addressFromStringValue(poolConfig[idxPoolAddress]), parseIntValue(poolConfig[idxPoolSt]), fromBase58String(poolConfig[idxLPAsId]), parseAssetId(poolConfig[idxAmAsId]), parseAssetId(poolConfig[idxPrAsId]), parseIntValue(poolConfig[idxAmtAsDcm]), parseIntValue(poolConfig[idxPriceAsDcm]))
268268
269269
270270 let poolConfigParsed = parsePoolConfig(gpc())
271271
272272 let $t088369022 = poolConfigParsed
273273
274274 let cfgPoolAddress = $t088369022._1
275275
276276 let cfgPoolStatus = $t088369022._2
277277
278278 let cfgLpAssetId = $t088369022._3
279279
280280 let cfgAmountAssetId = $t088369022._4
281281
282282 let cfgPriceAssetId = $t088369022._5
283283
284284 let cfgAmountAssetDecimals = $t088369022._6
285285
286286 let cfgPriceAssetDecimals = $t088369022._7
287287
288288 func gfc () = split(strf(fca, fcfg()), SEP)
289289
290290
291291 let factoryConfig = gfc()
292292
293293 let stakingContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactStakCntr]), "Invalid staking contract address")
294294
295295 let slipageContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactSlippCntr]), "Invalid slipage contract address")
296296
297297 let gwxContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactGwxRewCntr]), "Invalid gwx contract address")
298298
299299 let restContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactoryRestCntr]), "Invalid gwx contract address")
300300
301301 func dataPutActionInfo (inAmtAssetAmt,inPriceAssetAmt,outLpAmt,price,slipByUser,slippageReal,txHeight,txTimestamp,slipageAmAmt,slipagePrAmt) = makeString(["%d%d%d%d%d%d%d%d%d%d", toString(inAmtAssetAmt), toString(inPriceAssetAmt), toString(outLpAmt), toString(price), toString(slipByUser), toString(slippageReal), toString(txHeight), toString(txTimestamp), toString(slipageAmAmt), toString(slipagePrAmt)], SEP)
302302
303303
304304 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)
305305
306306
307307 func getAccBalance (assetId) = if ((assetId == "WAVES"))
308308 then wavesBalance(this).available
309309 else assetBalance(this, fromBase58String(assetId))
310310
311311
312312 func cpbi (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
313313
314314
315315 func cpbir (prAmtX18,amAmtX18,round) = fraction(prAmtX18, scale18, amAmtX18, round)
316316
317317
318318 func vad (A1,A2,slippage) = {
319319 let diff = fraction((A1 - A2), scale8BigInt, A2)
320320 let pass = ((slippage - abs(diff)) > zeroBigInt)
321321 if (!(pass))
322322 then throw(("Big slpg: " + toString(diff)))
323323 else $Tuple2(pass, min([A1, A2]))
324324 }
325325
326326
327327 func vd (D1,D0,slpg) = {
328328 let diff = fraction(D0, scale8BigInt, D1)
329329 let fail = (slpg > diff)
330330 if (if (fail)
331331 then true
332332 else (D0 > D1))
333333 then throw(((((((toString(D0) + " ") + toString(D1)) + " ") + toString(diff)) + " ") + toString(slpg)))
334334 else fail
335335 }
336336
337337
338338 func pcp (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
339339 let amtAsAmtX18 = t1(amAmt, amAssetDcm)
340340 let prAsAmtX18 = t1(prAmt, prAssetDcm)
341341 cpbi(prAsAmtX18, amtAsAmtX18)
342342 }
343343
344344
345345 func calcPrices (amAmt,prAmt,lpAmt) = {
346346 let amtAsDcm = cfgAmountAssetDecimals
347347 let prAsDcm = cfgPriceAssetDecimals
348348 let priceX18 = pcp(amtAsDcm, prAsDcm, amAmt, prAmt)
349349 let amAmtX18 = t1(amAmt, amtAsDcm)
350350 let prAmtX18 = t1(prAmt, prAsDcm)
351351 let lpAmtX18 = t1(lpAmt, scale8)
352352 let lpPrInAmAsX18 = cpbi(amAmtX18, lpAmtX18)
353353 let lpPrInPrAsX18 = cpbi(prAmtX18, lpAmtX18)
354354 [priceX18, lpPrInAmAsX18, lpPrInPrAsX18]
355355 }
356356
357357
358358 func calculatePrices (amAmt,prAmt,lpAmt) = {
359359 let p = calcPrices(amAmt, prAmt, lpAmt)
360360 [f1(p[0], scale8), f1(p[1], scale8), f1(p[2], scale8)]
361361 }
362362
363363
364364 func takeFee (amount,fee) = {
365365 let feeAmount = if ((fee == 0))
366366 then 0
367367 else fraction(amount, fee, scale8)
368368 $Tuple2((amount - feeAmount), feeAmount)
369369 }
370370
371371
372372 func getD (xp) = {
373373 let xp0 = xp[0]
374374 let xp1 = xp[1]
375375 let s = (xp0 + xp1)
376376 if ((s == big0))
377377 then big0
378378 else {
379379 let a = parseIntValue(A)
380380 let ann = (a * 2)
381381 let p = fraction(xp0, xp1, big1)
382382 let xp0_xp1_n_n = fraction(p, big4, big1)
383383 let ann_s = fraction(toBigInt(ann), s, big1)
384384 let ann_1 = toBigInt((ann - 1))
385385 func calcDNext (d) = {
386386 let dd = fraction(d, d, big1)
387387 let ddd = fraction(dd, d, big1)
388388 let dp = fraction(ddd, big1, xp0_xp1_n_n)
389389 fraction((ann_s + fraction(dp, big2, big1)), d, (fraction(ann_1, d, big1) + fraction(big3, dp, big1)))
390390 }
391391
392392 func calc (acc,i) = if (acc._2)
393393 then acc
394394 else {
395395 let d = acc._1
396396 let dNext = calcDNext(d)
397397 let dDiffRaw = (dNext - value(d))
398398 let dDiff = if ((big0 > dDiffRaw))
399399 then -(dDiffRaw)
400400 else dDiffRaw
401401 if ((big1 >= dDiff))
402402 then $Tuple2(dNext, true)
403403 else $Tuple2(dNext, false)
404404 }
405405
406406 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
407407 let $t01352713575 = {
408408 let $l = arr
409409 let $s = size($l)
410410 let $acc0 = $Tuple2(s, false)
411411 func $f0_1 ($a,$i) = if (($i >= $s))
412412 then $a
413413 else calc($a, $l[$i])
414414
415415 func $f0_2 ($a,$i) = if (($i >= $s))
416416 then $a
417417 else throw("List size exceeds 17")
418418
419419 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17)
420420 }
421421 let d = $t01352713575._1
422422 let found = $t01352713575._2
423423 if (found)
424424 then d
425425 else throw(("D calculation error, D = " + toString(d)))
426426 }
427427 }
428428
429429
430430 func ego (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
431431 let lpId = cfgLpAssetId
432432 let amId = toBase58String(value(cfgAmountAssetId))
433433 let prId = toBase58String(value(cfgPriceAssetId))
434434 let amDcm = cfgAmountAssetDecimals
435435 let prDcm = cfgPriceAssetDecimals
436436 let sts = toString(cfgPoolStatus)
437437 let lpEmiss = valueOrErrorMessage(assetInfo(lpId), "Wrong LP id").quantity
438438 if ((toBase58String(lpId) != pmtAssetId))
439439 then throw("Wrong pmt asset")
440440 else {
441441 let amBalance = getAccBalance(amId)
442442 let amBalanceX18 = t1(amBalance, amDcm)
443443 let prBalance = getAccBalance(prId)
444444 let prBalanceX18 = t1(prBalance, prDcm)
445445 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
446446 let curPrice = f1(curPriceX18, scale8)
447447 let pmtLpAmtX18 = t1(pmtLpAmt, scale8)
448448 let lpEmissX18 = t1(lpEmiss, scale8)
449449 let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissX18)
450450 let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissX18)
451451 let outAmAmt = fromX18Round(outAmAmtX18, amDcm, FLOOR)
452452 let outPrAmt = fromX18Round(outPrAmtX18, prDcm, FLOOR)
453453 let state = if ((txId58 == ""))
454454 then nil
455455 else [ScriptTransfer(userAddress, outAmAmt, if ((amId == "WAVES"))
456456 then unit
457457 else fromBase58String(amId)), ScriptTransfer(userAddress, outPrAmt, if ((prId == "WAVES"))
458458 then unit
459459 else fromBase58String(prId)), StringEntry(gau(toString(userAddress), txId58), dataGetActionInfo(outAmAmt, outPrAmt, pmtLpAmt, curPrice, height, lastBlock.timestamp)), IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice)]
460460 $Tuple10(outAmAmt, outPrAmt, amId, prId, amBalance, prBalance, lpEmiss, curPriceX18, sts, state)
461461 }
462462 }
463463
464464
465465 func epo (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,userAddress,isEval,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
466466 let lpId = cfgLpAssetId
467467 let amIdStr = toBase58String(value(cfgAmountAssetId))
468468 let prIdStr = toBase58String(value(cfgPriceAssetId))
469469 let amtDcm = cfgAmountAssetDecimals
470470 let priceDcm = cfgPriceAssetDecimals
471471 let sts = toString(cfgPoolStatus)
472472 let lpEm = valueOrErrorMessage(assetInfo(lpId), "Wr lp as").quantity
473- let amBalance = if (isEval)
474- then getAccBalance(amIdStr)
475- else if (if (isOneAsset)
476- then (pmtId == amIdStr)
477- else false)
478- then (getAccBalance(amIdStr) - pmtAmt)
479- else if (isOneAsset)
473+ let checkAssets = [if (if ((inAmId == parseAssetId(amIdStr)))
474+ then (inPrId == parseAssetId(prIdStr))
475+ else false)
476+ then true
477+ else throwErr("Invalid amt or price asset passed.")]
478+ if ((checkAssets == checkAssets))
479+ then {
480+ let amBalance = if (isEval)
480481 then getAccBalance(amIdStr)
481- else (getAccBalance(amIdStr) - inAmAmt)
482- let prBalance = if (isEval)
483- then getAccBalance(prIdStr)
484- else if (if (isOneAsset)
485- then (pmtId == prIdStr)
486- else false)
487- then (getAccBalance(prIdStr) - pmtAmt)
488- else if (isOneAsset)
482+ else if (if (isOneAsset)
483+ then (pmtId == amIdStr)
484+ else false)
485+ then (getAccBalance(amIdStr) - pmtAmt)
486+ else if (isOneAsset)
487+ then getAccBalance(amIdStr)
488+ else (getAccBalance(amIdStr) - inAmAmt)
489+ let prBalance = if (isEval)
489490 then getAccBalance(prIdStr)
490- else (getAccBalance(prIdStr) - inPrAmt)
491- let inAmAssetAmtX18 = t1(inAmAmt, amtDcm)
492- let inPrAssetAmtX18 = t1(inPrAmt, priceDcm)
493- let userPriceX18 = cpbi(inPrAssetAmtX18, inAmAssetAmtX18)
494- let amBalanceX18 = t1(amBalance, amtDcm)
495- let prBalanceX18 = t1(prBalance, priceDcm)
496- let D0 = getD([amBalanceX18, prBalanceX18])
497- let r = if ((lpEm == 0))
498- then {
499- let D1 = getD([(amBalanceX18 + inAmAssetAmtX18), (prBalanceX18 + inPrAssetAmtX18)])
500- let checkD = if ((D1 > D0))
501- then true
502- else throw("D1 should be greater than D0")
503- if ((checkD == checkD))
491+ else if (if (isOneAsset)
492+ then (pmtId == prIdStr)
493+ else false)
494+ then (getAccBalance(prIdStr) - pmtAmt)
495+ else if (isOneAsset)
496+ then getAccBalance(prIdStr)
497+ else (getAccBalance(prIdStr) - inPrAmt)
498+ let inAmAssetAmtX18 = t1(inAmAmt, amtDcm)
499+ let inPrAssetAmtX18 = t1(inPrAmt, priceDcm)
500+ let userPriceX18 = cpbi(inPrAssetAmtX18, inAmAssetAmtX18)
501+ let amBalanceX18 = t1(amBalance, amtDcm)
502+ let prBalanceX18 = t1(prBalance, priceDcm)
503+ let D0 = getD([amBalanceX18, prBalanceX18])
504+ let r = if ((lpEm == 0))
504505 then {
505- let curPriceX18 = zeroBigInt
506- let slippageX18 = zeroBigInt
507- let lpAmtX18 = D1
508- $Tuple5(f1(lpAmtX18, scale8), f1(inAmAssetAmtX18, amtDcm), f1(inPrAssetAmtX18, priceDcm), cpbi((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
509- }
510- else throw("Strict value is not equal to itself.")
511- }
512- else {
513- let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
514- let slippageRealX18 = fraction(abs((curPriceX18 - userPriceX18)), scale18, curPriceX18)
515- let slippageX18 = t1(slippage, scale8)
516- if (if (if (validateSlippage)
517- then (curPriceX18 != zeroBigInt)
518- else false)
519- then (slippageRealX18 > slippageX18)
520- else false)
521- then throw(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
522- else {
523- let lpEmissionX18 = t1(lpEm, scale8)
524- let prViaAmX18 = fraction(inAmAssetAmtX18, cpbir(prBalanceX18, amBalanceX18, CEILING), scale18, CEILING)
525- let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, cpbir(prBalanceX18, amBalanceX18, FLOOR), CEILING)
526- let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
527- then $Tuple2(amViaPrX18, inPrAssetAmtX18)
528- else $Tuple2(inAmAssetAmtX18, prViaAmX18)
529- let expAmtAssetAmtX18 = expectedAmts._1
530- let expPriceAssetAmtX18 = expectedAmts._2
531- let D1 = getD([(amBalanceX18 + expAmtAssetAmtX18), (prBalanceX18 + expPriceAssetAmtX18)])
506+ let D1 = getD([(amBalanceX18 + inAmAssetAmtX18), (prBalanceX18 + inPrAssetAmtX18)])
532507 let checkD = if ((D1 > D0))
533508 then true
534509 else throw("D1 should be greater than D0")
535510 if ((checkD == checkD))
536511 then {
537- let lpAmtX18 = fraction(lpEmissionX18, (D1 - D0), D0)
538- $Tuple5(fromX18Round(lpAmtX18, scale8, FLOOR), fromX18Round(expAmtAssetAmtX18, amtDcm, CEILING), fromX18Round(expPriceAssetAmtX18, priceDcm, CEILING), curPriceX18, slippageX18)
512+ let curPriceX18 = zeroBigInt
513+ let slippageX18 = zeroBigInt
514+ let lpAmtX18 = D1
515+ $Tuple5(f1(lpAmtX18, scale8), f1(inAmAssetAmtX18, amtDcm), f1(inPrAssetAmtX18, priceDcm), cpbi((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
539516 }
540517 else throw("Strict value is not equal to itself.")
541518 }
519+ else {
520+ let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
521+ let slippageRealX18 = fraction(abs((curPriceX18 - userPriceX18)), scale18, curPriceX18)
522+ let slippageX18 = t1(slippage, scale8)
523+ if (if (if (validateSlippage)
524+ then (curPriceX18 != zeroBigInt)
525+ else false)
526+ then (slippageRealX18 > slippageX18)
527+ else false)
528+ then throw(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
529+ else {
530+ let lpEmissionX18 = t1(lpEm, scale8)
531+ let prViaAmX18 = fraction(inAmAssetAmtX18, cpbir(prBalanceX18, amBalanceX18, CEILING), scale18, CEILING)
532+ let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, cpbir(prBalanceX18, amBalanceX18, FLOOR), CEILING)
533+ let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
534+ then $Tuple2(amViaPrX18, inPrAssetAmtX18)
535+ else $Tuple2(inAmAssetAmtX18, prViaAmX18)
536+ let expAmtAssetAmtX18 = expectedAmts._1
537+ let expPriceAssetAmtX18 = expectedAmts._2
538+ let D1 = getD([(amBalanceX18 + expAmtAssetAmtX18), (prBalanceX18 + expPriceAssetAmtX18)])
539+ let checkD = if ((D1 > D0))
540+ then true
541+ else throw("D1 should be greater than D0")
542+ if ((checkD == checkD))
543+ then {
544+ let lpAmtX18 = fraction(lpEmissionX18, (D1 - D0), D0)
545+ $Tuple5(fromX18Round(lpAmtX18, scale8, FLOOR), fromX18Round(expAmtAssetAmtX18, amtDcm, CEILING), fromX18Round(expPriceAssetAmtX18, priceDcm, CEILING), curPriceX18, slippageX18)
546+ }
547+ else throw("Strict value is not equal to itself.")
548+ }
549+ }
550+ let calcLpAmt = r._1
551+ let calcAmAssetPmt = r._2
552+ let calcPrAssetPmt = r._3
553+ let curPrice = f1(r._4, scale8)
554+ let slippageCalc = f1(r._5, scale8)
555+ if ((0 >= calcLpAmt))
556+ then throw("LP <= 0")
557+ else {
558+ let emitLpAmt = if (!(emitLp))
559+ then 0
560+ else calcLpAmt
561+ let amDiff = (inAmAmt - calcAmAssetPmt)
562+ let prDiff = (inPrAmt - calcPrAssetPmt)
563+ let $t02149821843 = if (if (isOneAsset)
564+ then (pmtId == amIdStr)
565+ else false)
566+ then $Tuple2(pmtAmt, 0)
567+ else if (if (isOneAsset)
568+ then (pmtId == prIdStr)
569+ else false)
570+ then $Tuple2(0, pmtAmt)
571+ else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
572+ let writeAmAmt = $t02149821843._1
573+ let writePrAmt = $t02149821843._2
574+ let commonState = [IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice), StringEntry(pau(userAddress, txId58), dataPutActionInfo(writeAmAmt, writePrAmt, emitLpAmt, curPrice, slippage, slippageCalc, height, lastBlock.timestamp, amDiff, prDiff))]
575+ $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
576+ }
542577 }
543- let calcLpAmt = r._1
544- let calcAmAssetPmt = r._2
545- let calcPrAssetPmt = r._3
546- let curPrice = f1(r._4, scale8)
547- let slippageCalc = f1(r._5, scale8)
548- if ((0 >= calcLpAmt))
549- then throw("LP <= 0")
550- else {
551- let emitLpAmt = if (!(emitLp))
552- then 0
553- else calcLpAmt
554- let amDiff = (inAmAmt - calcAmAssetPmt)
555- let prDiff = (inPrAmt - calcPrAssetPmt)
556- let $t02133721682 = if (if (isOneAsset)
557- then (pmtId == amIdStr)
558- else false)
559- then $Tuple2(pmtAmt, 0)
560- else if (if (isOneAsset)
561- then (pmtId == prIdStr)
562- else false)
563- then $Tuple2(0, pmtAmt)
564- else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
565- let writeAmAmt = $t02133721682._1
566- let writePrAmt = $t02133721682._2
567- let commonState = [IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice), StringEntry(pau(userAddress, txId58), dataPutActionInfo(writeAmAmt, writePrAmt, emitLpAmt, curPrice, slippage, slippageCalc, height, lastBlock.timestamp, amDiff, prDiff))]
568- $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
569- }
578+ else throw("Strict value is not equal to itself.")
570579 }
571580
572581
573582 func getYD (xp,i,D) = {
574583 let n = big2
575584 let x = xp[if ((i == 0))
576585 then 1
577586 else 0]
578587 let aPrecision = parseBigIntValue(Amult)
579588 let a = (parseBigIntValue(A) * aPrecision)
580589 let s = x
581590 let ann = (a * n)
582591 let c = (((((D * D) / (x * n)) * D) * aPrecision) / (ann * n))
583592 let b = ((s + ((D * aPrecision) / ann)) - D)
584593 func calc (acc,cur) = {
585- let $t02287722897 = acc
586- let y = $t02287722897._1
587- let found = $t02287722897._2
594+ let $t02303823058 = acc
595+ let y = $t02303823058._1
596+ let found = $t02303823058._2
588597 if ((found != unit))
589598 then acc
590599 else {
591600 let yNext = (((y * y) + c) / ((big2 * y) + b))
592601 let yDiff = absBigInt((yNext - value(y)))
593602 if ((big1 >= yDiff))
594603 then $Tuple2(yNext, cur)
595604 else $Tuple2(yNext, unit)
596605 }
597606 }
598607
599608 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
600- let $t02320423251 = {
609+ let $t02336523412 = {
601610 let $l = arr
602611 let $s = size($l)
603612 let $acc0 = $Tuple2(D, unit)
604613 func $f0_1 ($a,$i) = if (($i >= $s))
605614 then $a
606615 else calc($a, $l[$i])
607616
608617 func $f0_2 ($a,$i) = if (($i >= $s))
609618 then $a
610619 else throw("List size exceeds 15")
611620
612621 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
613622 }
614- let y = $t02320423251._1
615- let found = $t02320423251._2
623+ let y = $t02336523412._1
624+ let found = $t02336523412._2
616625 if ((found != unit))
617626 then y
618627 else throw(("Y calculation error, Y = " + toString(y)))
619628 }
620629
621630
622631 func calcDLp (amountBalance,priceBalance,lpEmission) = {
623632 let updatedDLp = fraction(getD([t1BigInt(amountBalance, toBigInt(cfgAmountAssetDecimals)), t1BigInt(priceBalance, toBigInt(cfgPriceAssetDecimals))]), scale18, lpEmission)
624633 if ((lpEmission == big0))
625634 then big0
626635 else updatedDLp
627636 }
628637
629638
630639 func calcCurrentDLp (amountAssetDelta,priceAssetDelta,lpAssetEmissionDelta) = {
631640 let amountAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgAmountAssetId))) - amountAssetDelta)
632641 let priceAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgPriceAssetId))) - priceAssetDelta)
633642 let lpAssetEmission = (toBigInt(value(assetInfo(cfgLpAssetId)).quantity) - lpAssetEmissionDelta)
634643 let currentDLp = calcDLp(amountAssetBalance, priceAssetBalance, lpAssetEmission)
635644 currentDLp
636645 }
637646
638647
639648 func refreshDLpInternal (amountAssetBalanceDelta,priceAssetBalanceDelta,lpAssetEmissionDelta) = {
640649 let amountAssetBalance = (getAccBalance(assetIdToString(cfgAmountAssetId)) + amountAssetBalanceDelta)
641650 let priceAssetBalance = (getAccBalance(assetIdToString(cfgPriceAssetId)) + priceAssetBalanceDelta)
642651 let lpAssetEmission = (value(assetInfo(cfgLpAssetId)).quantity + lpAssetEmissionDelta)
643652 let updatedDLp = calcDLp(toBigInt(amountAssetBalance), toBigInt(priceAssetBalance), toBigInt(lpAssetEmission))
644653 let actions = [IntegerEntry(keyDLpRefreshedHeight, height), StringEntry(keyDLp, toString(updatedDLp))]
645654 $Tuple2(actions, updatedDLp)
646655 }
647656
648657
649658 func validateUpdatedDLp (oldDLp,updatedDLp) = if ((updatedDLp >= oldDLp))
650659 then true
651660 else throwErr("updated DLp lower than current DLp")
652661
653662
654663 func validateMatcherOrderAllowed (order) = {
655664 let amountAssetBalance = getAccBalance(assetIdToString(cfgAmountAssetId))
656665 let priceAssetBalance = getAccBalance(assetIdToString(cfgPriceAssetId))
657666 let amountAssetAmount = order.amount
658667 let priceAssetAmount = fraction(order.amount, order.price, scale8, FLOOR)
659- let $t02544925661 = if ((order.orderType == Buy))
668+ let $t02561025822 = if ((order.orderType == Buy))
660669 then $Tuple2(amountAssetAmount, -(priceAssetAmount))
661670 else $Tuple2(-(amountAssetAmount), priceAssetAmount)
662- let amountAssetBalanceDelta = $t02544925661._1
663- let priceAssetBalanceDelta = $t02544925661._2
671+ let amountAssetBalanceDelta = $t02561025822._1
672+ let priceAssetBalanceDelta = $t02561025822._2
664673 if (if (if (igs())
665674 then true
666675 else (cfgPoolStatus == PoolMatcherDis))
667676 then true
668677 else (cfgPoolStatus == PoolShutdown))
669678 then throw("Admin blocked")
670679 else if (if ((order.assetPair.amountAsset != cfgAmountAssetId))
671680 then true
672681 else (order.assetPair.priceAsset != cfgPriceAssetId))
673682 then throw("Wr assets")
674683 else {
675684 let dLp = parseBigIntValue(valueOrElse(getString(this, keyDLp), "0"))
676- let $t02600326103 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
677- let unusedActions = $t02600326103._1
678- let dLpNew = $t02600326103._2
685+ let $t02616426264 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
686+ let unusedActions = $t02616426264._1
687+ let dLpNew = $t02616426264._2
679688 let isOrderValid = (dLpNew >= dLp)
680689 let info = makeString(["dLp=", toString(dLp), " dLpNew=", toString(dLpNew), " amountAssetBalance=", toString(amountAssetBalance), " priceAssetBalance=", toString(priceAssetBalance), " amountAssetBalanceDelta=", toString(amountAssetBalanceDelta), " priceAssetBalanceDelta=", toString(priceAssetBalanceDelta), " height=", toString(height)], "")
681690 $Tuple2(isOrderValid, info)
682691 }
683692 }
684693
685694
686695 func cg (i) = if ((size(i.payments) != 1))
687696 then throw("1 pmnt exp")
688697 else {
689698 let pmt = value(i.payments[0])
690699 let pmtAssetId = value(pmt.assetId)
691700 let pmtAmt = pmt.amount
692701 let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
693702 let outAmAmt = r._1
694703 let outPrAmt = r._2
695704 let sts = parseIntValue(r._9)
696705 let state = r._10
697706 let isGetDisabled = if (!(isAddressWhitelisted(i.caller)))
698707 then if (igs())
699708 then true
700709 else (cfgPoolStatus == PoolShutdown)
701710 else false
702711 if (isGetDisabled)
703712 then throw(("Admin blocked: " + toString(sts)))
704713 else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state)
705714 }
706715
707716
708717 func cp (caller,txId,amAsPmt,prAsPmt,slippage,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
709718 let r = epo(txId, slippage, value(amAsPmt).amount, value(amAsPmt).assetId, value(prAsPmt).amount, value(prAsPmt).assetId, caller, (txId == ""), emitLp, isOneAsset, validateSlippage, pmtAmt, pmtId)
710719 let sts = parseIntValue(r._8)
711720 let isPutDisabled = if (!(isAddressWhitelisted(addressFromStringValue(caller))))
712721 then if (if (igs())
713722 then true
714723 else (cfgPoolStatus == PoolShutdown))
715724 then true
716725 else (cfgPoolStatus == PoolPutDis)
717726 else false
718727 if (isPutDisabled)
719728 then throw(("Blocked:" + toString(sts)))
720729 else r
721730 }
722731
723732
724733 func calcPutOneTkn (pmtAmtRaw,pmtAssetId,userAddress,txId,withTakeFee) = {
725734 let amId = toBase58String(value(cfgAmountAssetId))
726735 let prId = toBase58String(value(cfgPriceAssetId))
727736 let lpId = cfgLpAssetId
728737 let amtDcm = cfgAmountAssetDecimals
729738 let priceDcm = cfgPriceAssetDecimals
730739 let lpAssetEmission = toBigInt(valueOrErrorMessage(assetInfo(lpId), "invalid lp asset").quantity)
731740 let chechEmission = if ((lpAssetEmission > big0))
732741 then true
733742 else throw("initial deposit requires all coins")
734743 if ((chechEmission == chechEmission))
735744 then {
736745 let amBalance = getAccBalance(amId)
737746 let prBalance = getAccBalance(prId)
738- let $t02896229424 = if ((txId == ""))
747+ let $t02912329585 = if ((txId == ""))
739748 then $Tuple2(amBalance, prBalance)
740749 else if ((pmtAssetId == amId))
741750 then if ((pmtAmtRaw > amBalance))
742751 then throw("invalid payment amount")
743752 else $Tuple2((amBalance - pmtAmtRaw), prBalance)
744753 else if ((pmtAssetId == prId))
745754 then if ((pmtAmtRaw > prBalance))
746755 then throw("invalid payment amount")
747756 else $Tuple2(amBalance, (prBalance - pmtAmtRaw))
748757 else throw("wrong pmtAssetId")
749- let amBalanceOld = $t02896229424._1
750- let prBalanceOld = $t02896229424._2
751- let $t02943029606 = if ((pmtAssetId == amId))
758+ let amBalanceOld = $t02912329585._1
759+ let prBalanceOld = $t02912329585._2
760+ let $t02959129767 = if ((pmtAssetId == amId))
752761 then $Tuple2(pmtAmtRaw, 0)
753762 else if ((pmtAssetId == prId))
754763 then $Tuple2(0, pmtAmtRaw)
755764 else throw("invalid payment")
756- let amAmountRaw = $t02943029606._1
757- let prAmountRaw = $t02943029606._2
758- let $t02961029864 = if (withTakeFee)
765+ let amAmountRaw = $t02959129767._1
766+ let prAmountRaw = $t02959129767._2
767+ let $t02977130025 = if (withTakeFee)
759768 then $Tuple3(takeFee(amAmountRaw, inFee)._1, takeFee(prAmountRaw, inFee)._1, takeFee(pmtAmtRaw, inFee)._2)
760769 else $Tuple3(amAmountRaw, prAmountRaw, 0)
761- let amAmount = $t02961029864._1
762- let prAmount = $t02961029864._2
763- let feeAmount = $t02961029864._3
770+ let amAmount = $t02977130025._1
771+ let prAmount = $t02977130025._2
772+ let feeAmount = $t02977130025._3
764773 let amBalanceNew = (amBalanceOld + amAmount)
765774 let prBalanceNew = (prBalanceOld + prAmount)
766775 let D0 = getD([t1(amBalanceOld, cfgAmountAssetDecimals), t1(prBalanceOld, cfgPriceAssetDecimals)])
767776 let D1 = getD([t1(amBalanceNew, cfgAmountAssetDecimals), t1(prBalanceNew, cfgPriceAssetDecimals)])
768777 let checkD = if ((D1 > D0))
769778 then true
770779 else throw()
771780 if ((checkD == checkD))
772781 then {
773782 let lpAmount = fraction(lpAssetEmission, (D1 - D0), D0, FLOOR)
774783 let curPrice = f1(cpbi(t1(prBalanceNew, priceDcm), t1(amBalanceNew, amtDcm)), scale8)
775784 let commonState = [IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice), StringEntry(pau(userAddress, txId), dataPutActionInfo(amAmountRaw, prAmountRaw, toInt(lpAmount), curPrice, 0, 0, height, lastBlock.timestamp, 0, 0))]
776785 let poolProportion = fraction(prBalanceOld, scale8, amBalanceOld)
777786 let amountAssetPart = fraction(pmtAmtRaw, scale8, (poolProportion + scale8))
778787 let priceAssetPart = (pmtAmtRaw - amountAssetPart)
779788 let lpAmtBoth = fraction(lpAssetEmission, toBigInt(priceAssetPart), toBigInt(prBalanceOld))
780789 let bonus = toInt(fraction((lpAmount - lpAmtBoth), scale8BigInt, lpAmtBoth))
781790 $Tuple4(toInt(lpAmount), commonState, feeAmount, bonus)
782791 }
783792 else throw("Strict value is not equal to itself.")
784793 }
785794 else throw("Strict value is not equal to itself.")
786795 }
787796
788797
789798 func getOneTknV2Internal (outAssetId,minOutAmount,payments,caller,originCaller,transactionId) = {
790799 let lpId = toBase58String(value(cfgLpAssetId))
791800 let amId = toBase58String(value(cfgAmountAssetId))
792801 let prId = toBase58String(value(cfgPriceAssetId))
793802 let amDecimals = cfgAmountAssetDecimals
794803 let prDecimals = cfgPriceAssetDecimals
795804 let poolStatus = cfgPoolStatus
796805 let userAddress = if ((caller == restContract))
797806 then originCaller
798807 else caller
799808 let pmt = value(payments[0])
800809 let pmtAssetId = value(pmt.assetId)
801810 let pmtAmt = pmt.amount
802811 let currentDLp = calcCurrentDLp(big0, big0, big0)
803812 if ((currentDLp == currentDLp))
804813 then {
805814 let txId58 = toBase58String(transactionId)
806815 if ((lpId != toBase58String(pmtAssetId)))
807816 then throw("Wrong LP")
808817 else {
809818 let amBalance = getAccBalance(amId)
810819 let prBalance = getAccBalance(prId)
811- let $t03197632087 = {
820+ let $t03213732248 = {
812821 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)
813822 if ($isInstanceOf(@, "(Int, Int)"))
814823 then @
815824 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
816825 }
817- if (($t03197632087 == $t03197632087))
826+ if (($t03213732248 == $t03213732248))
818827 then {
819- let feeAmount = $t03197632087._2
820- let totalGet = $t03197632087._1
828+ let feeAmount = $t03213732248._2
829+ let totalGet = $t03213732248._1
821830 let totalAmount = if (if ((minOutAmount > 0))
822831 then (minOutAmount > totalGet)
823832 else false)
824833 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
825834 else totalGet
826- let $t03227732584 = if ((outAssetId == amId))
835+ let $t03243832745 = if ((outAssetId == amId))
827836 then $Tuple4(totalAmount, 0, ((amBalance - totalAmount) - feeAmount), prBalance)
828837 else if ((outAssetId == prId))
829838 then $Tuple4(0, totalAmount, amBalance, ((prBalance - totalAmount) - feeAmount))
830839 else throw("invalid out asset id")
831- let outAm = $t03227732584._1
832- let outPr = $t03227732584._2
833- let amBalanceNew = $t03227732584._3
834- let prBalanceNew = $t03227732584._4
840+ let outAm = $t03243832745._1
841+ let outPr = $t03243832745._2
842+ let amBalanceNew = $t03243832745._3
843+ let prBalanceNew = $t03243832745._4
835844 let curPrX18 = cpbi(t1(prBalanceNew, prDecimals), t1(amBalanceNew, amDecimals))
836845 let curPr = f1(curPrX18, scale8)
837846 let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
838847 then unit
839848 else fromBase58String(outAssetId)
840849 let sendFeeToMatcher = if ((feeAmount > 0))
841850 then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetIdOrWaves)]
842851 else nil
843852 let state = ([ScriptTransfer(userAddress, totalAmount, outAssetIdOrWaves), StringEntry(gau(toString(userAddress), txId58), dataGetActionInfo(outAm, outPr, pmtAmt, curPr, height, lastBlock.timestamp)), IntegerEntry(pl(), curPr), IntegerEntry(ph(height, lastBlock.timestamp), curPr)] ++ sendFeeToMatcher)
844853 if ((state == state))
845854 then {
846855 let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
847856 if ((burn == burn))
848857 then {
849- let $t03336933719 = {
858+ let $t03353033880 = {
850859 let feeAmountForCalc = if ((this == feeCollectorAddress))
851860 then 0
852861 else feeAmount
853862 let outInAmountAsset = if ((parseAssetId(outAssetId) == cfgAmountAssetId))
854863 then true
855864 else false
856865 if (outInAmountAsset)
857866 then $Tuple2(-((totalGet + feeAmountForCalc)), 0)
858867 else $Tuple2(0, -((totalGet + feeAmountForCalc)))
859868 }
860- let amountAssetBalanceDelta = $t03336933719._1
861- let priceAssetBalanceDelta = $t03336933719._2
862- let $t03372233830 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
863- let refreshDLpActions = $t03372233830._1
864- let updatedDLp = $t03372233830._2
869+ let amountAssetBalanceDelta = $t03353033880._1
870+ let priceAssetBalanceDelta = $t03353033880._2
871+ let $t03388333991 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
872+ let refreshDLpActions = $t03388333991._1
873+ let updatedDLp = $t03388333991._2
865874 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
866875 if ((isUpdatedDLpValid == isUpdatedDLpValid))
867876 then $Tuple2((state ++ refreshDLpActions), totalAmount)
868877 else throw("Strict value is not equal to itself.")
869878 }
870879 else throw("Strict value is not equal to itself.")
871880 }
872881 else throw("Strict value is not equal to itself.")
873882 }
874883 else throw("Strict value is not equal to itself.")
875884 }
876885 }
877886 else throw("Strict value is not equal to itself.")
878887 }
879888
880889
881890 func managerPublicKeyOrUnit () = {
882891 let managerVaultAddress = getManagerVaultAddressOrThis()
883892 match getString(managerVaultAddress, keyManagerPublicKey()) {
884893 case s: String =>
885894 fromBase58String(s)
886895 case _: Unit =>
887896 unit
888897 case _ =>
889898 throw("Match error")
890899 }
891900 }
892901
893902
894903 let pd = throw("Permission denied")
895904
896905 func isManager (i) = match managerPublicKeyOrUnit() {
897906 case pk: ByteVector =>
898907 (i.callerPublicKey == pk)
899908 case _: Unit =>
900909 (i.caller == this)
901910 case _ =>
902911 throw("Match error")
903912 }
904913
905914
906915 func mustManager (i) = match managerPublicKeyOrUnit() {
907916 case pk: ByteVector =>
908917 if ((i.callerPublicKey == pk))
909918 then true
910919 else pd
911920 case _: Unit =>
912921 if ((i.caller == this))
913922 then true
914923 else pd
915924 case _ =>
916925 throw("Match error")
917926 }
918927
919928
920929 func getY (isReverse,D,poolAmountInBalance) = {
921930 let poolConfig = gpc()
922931 let amId = poolConfig[idxAmAsId]
923932 let prId = poolConfig[idxPrAsId]
924933 let n = big2
925934 let aPrecision = parseBigIntValue(Amult)
926935 let a = (parseBigIntValue(A) * aPrecision)
927936 let xp = if ((isReverse == false))
928937 then [(toBigInt(getAccBalance(amId)) + poolAmountInBalance), toBigInt(getAccBalance(prId))]
929938 else [(toBigInt(getAccBalance(prId)) + poolAmountInBalance), toBigInt(getAccBalance(amId))]
930939 let x = xp[0]
931940 let s = x
932941 let ann = (a * n)
933942 let c = (((((D * D) / (x * n)) * D) * aPrecision) / (ann * n))
934943 let b = ((s + ((D * aPrecision) / ann)) - D)
935944 func calc (acc,cur) = {
936- let $t03531735337 = acc
937- let y = $t03531735337._1
938- let found = $t03531735337._2
945+ let $t03547835498 = acc
946+ let y = $t03547835498._1
947+ let found = $t03547835498._2
939948 if ((found != unit))
940949 then acc
941950 else {
942951 let yNext = (((y * y) + c) / ((big2 * y) + b))
943952 let yDiff = absBigInt((yNext - value(y)))
944953 if ((big1 >= yDiff))
945954 then $Tuple2(yNext, cur)
946955 else $Tuple2(yNext, unit)
947956 }
948957 }
949958
950959 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
951- let $t03566835715 = {
960+ let $t03582935876 = {
952961 let $l = arr
953962 let $s = size($l)
954963 let $acc0 = $Tuple2(D, unit)
955964 func $f0_1 ($a,$i) = if (($i >= $s))
956965 then $a
957966 else calc($a, $l[$i])
958967
959968 func $f0_2 ($a,$i) = if (($i >= $s))
960969 then $a
961970 else throw("List size exceeds 15")
962971
963972 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
964973 }
965- let y = $t03566835715._1
966- let found = $t03566835715._2
974+ let y = $t03582935876._1
975+ let found = $t03582935876._2
967976 if ((found != unit))
968977 then y
969978 else throw(("Y calculation error, Y = " + toString(y)))
970979 }
971980
972981
973982 func skipOrderValidation () = valueOrElse(getBoolean(fca, keySkipOrderValidation(toString(this))), false)
974983
975984
976985 @Callable(i)
977986 func calculateAmountOutForSwapREADONLY (cleanAmountIn,isReverse,feePoolAmount) = {
978- let $t03606736491 = if ((isReverse == false))
987+ let $t03622836652 = if ((isReverse == false))
979988 then {
980989 let assetOut = strf(this, pa())
981990 let poolAmountInBalance = (toBigInt(getAccBalance(strf(this, aa()))) + toBigInt(cleanAmountIn))
982991 $Tuple2(assetOut, poolAmountInBalance)
983992 }
984993 else {
985994 let assetOut = strf(this, aa())
986995 let poolAmountInBalance = (toBigInt(getAccBalance(strf(this, pa()))) + toBigInt(cleanAmountIn))
987996 $Tuple2(assetOut, poolAmountInBalance)
988997 }
989- let assetOut = $t03606736491._1
990- let poolAmountInBalance = $t03606736491._2
998+ let assetOut = $t03622836652._1
999+ let poolAmountInBalance = $t03622836652._2
9911000 let poolConfig = gpc()
9921001 let amId = poolConfig[idxAmAsId]
9931002 let prId = poolConfig[idxPrAsId]
9941003 let xp = [toBigInt(getAccBalance(amId)), toBigInt(getAccBalance(prId))]
9951004 let D = getD(xp)
9961005 let y = getY(isReverse, D, toBigInt(cleanAmountIn))
9971006 let dy = ((toBigInt(getAccBalance(assetOut)) - y) - toBigInt(1))
9981007 let totalGetRaw = max([0, toInt(dy)])
9991008 let newXp = if ((isReverse == false))
10001009 then [((toBigInt(getAccBalance(amId)) + toBigInt(cleanAmountIn)) + toBigInt(feePoolAmount)), (toBigInt(getAccBalance(prId)) - dy)]
10011010 else [(toBigInt(getAccBalance(amId)) - dy), ((toBigInt(getAccBalance(prId)) + toBigInt(cleanAmountIn)) + toBigInt(feePoolAmount))]
10021011 let newD = getD(newXp)
10031012 let checkD = if ((newD >= D))
10041013 then true
10051014 else throw(makeString(["new D is fewer error", toString(D), toString(newD)], "__"))
10061015 if ((checkD == checkD))
10071016 then $Tuple2(nil, totalGetRaw)
10081017 else throw("Strict value is not equal to itself.")
10091018 }
10101019
10111020
10121021
10131022 @Callable(i)
10141023 func calculateAmountOutForSwapAndSendTokens (cleanAmountIn,isReverse,amountOutMin,addressTo,feePoolAmount) = {
10151024 let swapContact = {
10161025 let @ = invoke(fca, "getSwapContractREADONLY", nil, nil)
10171026 if ($isInstanceOf(@, "String"))
10181027 then @
10191028 else throw(($getType(@) + " couldn't be cast to String"))
10201029 }
10211030 let isPoolSwapDisabled = {
10221031 let @ = invoke(fca, "isPoolSwapDisabledREADONLY", [toString(this)], nil)
10231032 if ($isInstanceOf(@, "Boolean"))
10241033 then @
10251034 else throw(($getType(@) + " couldn't be cast to Boolean"))
10261035 }
10271036 let isSwapDisabled = if (!(isAddressWhitelisted(i.caller)))
10281037 then if (if (igs())
10291038 then true
10301039 else (cfgPoolStatus == PoolShutdown))
10311040 then true
10321041 else isPoolSwapDisabled
10331042 else false
10341043 let checks = [if (if (!(isSwapDisabled))
10351044 then true
10361045 else isManager(i))
10371046 then true
10381047 else throwErr("swap operation is blocked by admin"), if ((value(i.payments[0]).amount >= cleanAmountIn))
10391048 then true
10401049 else throwErr("Wrong amount"), if ((i.caller == addressFromStringValue(swapContact)))
10411050 then true
10421051 else throwErr("Permission denied")]
10431052 if ((checks == checks))
10441053 then {
10451054 let pmt = value(i.payments[0])
10461055 let assetIn = assetIdToString(pmt.assetId)
1047- let $t03826338657 = if ((isReverse == false))
1056+ let $t03842438818 = if ((isReverse == false))
10481057 then {
10491058 let assetOut = strf(this, pa())
10501059 let poolAmountInBalance = (getAccBalance(assetIn) - value(i.payments[0]).amount)
10511060 $Tuple2(assetOut, poolAmountInBalance)
10521061 }
10531062 else {
10541063 let assetOut = strf(this, aa())
10551064 let poolAmountInBalance = (getAccBalance(assetIn) - value(i.payments[0]).amount)
10561065 $Tuple2(assetOut, poolAmountInBalance)
10571066 }
1058- let assetOut = $t03826338657._1
1059- let poolAmountInBalance = $t03826338657._2
1067+ let assetOut = $t03842438818._1
1068+ let poolAmountInBalance = $t03842438818._2
10601069 let poolConfig = gpc()
10611070 let amId = poolConfig[idxAmAsId]
10621071 let prId = poolConfig[idxPrAsId]
10631072 let xp = if ((isReverse == false))
10641073 then [(toBigInt(getAccBalance(amId)) - toBigInt(value(i.payments[0]).amount)), toBigInt(getAccBalance(prId))]
10651074 else [toBigInt(getAccBalance(amId)), (toBigInt(getAccBalance(prId)) - toBigInt(value(i.payments[0]).amount))]
10661075 let D = getD(xp)
10671076 let y = getY(isReverse, D, toBigInt(0))
10681077 let dy = ((toBigInt(getAccBalance(assetOut)) - y) - toBigInt(1))
10691078 let totalGetRaw = max([0, toInt(dy)])
10701079 let checkMin = if ((totalGetRaw >= amountOutMin))
10711080 then true
10721081 else throw("Exchange result is fewer coins than expected")
10731082 if ((checkMin == checkMin))
10741083 then {
10751084 let newXp = if ((isReverse == false))
10761085 then [(toBigInt(getAccBalance(amId)) + toBigInt(feePoolAmount)), (toBigInt(getAccBalance(prId)) - dy)]
10771086 else [(toBigInt(getAccBalance(amId)) - dy), (toBigInt(getAccBalance(prId)) + toBigInt(feePoolAmount))]
10781087 let newD = getD(newXp)
10791088 let checkD = if ((newD >= D))
10801089 then true
10811090 else throw("new D is fewer error")
10821091 if ((checkD == checkD))
10831092 then {
10841093 let amountAssetBalanceDelta = if (isReverse)
10851094 then -(totalGetRaw)
10861095 else feePoolAmount
10871096 let priceAssetBalanceDelta = if (isReverse)
10881097 then feePoolAmount
10891098 else -(totalGetRaw)
10901099 let refreshDLpActions = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)._1
10911100 if ((refreshDLpActions == refreshDLpActions))
10921101 then $Tuple2([ScriptTransfer(addressFromStringValue(addressTo), totalGetRaw, parseAssetId(assetOut))], totalGetRaw)
10931102 else throw("Strict value is not equal to itself.")
10941103 }
10951104 else throw("Strict value is not equal to itself.")
10961105 }
10971106 else throw("Strict value is not equal to itself.")
10981107 }
10991108 else throw("Strict value is not equal to itself.")
11001109 }
11011110
11021111
11031112
11041113 @Callable(i)
11051114 func constructor (fc) = {
11061115 let c = mustManager(i)
11071116 if ((c == c))
11081117 then [StringEntry(fc(), fc)]
11091118 else throw("Strict value is not equal to itself.")
11101119 }
11111120
11121121
11131122
11141123 @Callable(i)
11151124 func put (slip,autoStake) = {
11161125 let factCfg = gfc()
11171126 let stakingCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactStakCntr]), "Wr st addr")
11181127 let slipCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactSlippCntr]), "Wr sl addr")
11191128 if ((0 > slip))
11201129 then throw("Wrong slippage")
11211130 else if ((size(i.payments) != 2))
11221131 then throw("2 pmnts expd")
11231132 else {
11241133 let amAssetPmt = toBigInt(value(i.payments[0]).amount)
11251134 let prAssetPmt = toBigInt(value(i.payments[1]).amount)
11261135 let amountAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgAmountAssetId))) - amAssetPmt)
11271136 if ((amountAssetBalance == amountAssetBalance))
11281137 then {
11291138 let priceAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgPriceAssetId))) - prAssetPmt)
11301139 if ((priceAssetBalance == priceAssetBalance))
11311140 then {
11321141 let lpAssetEmission = toBigInt(value(assetInfo(cfgLpAssetId)).quantity)
11331142 if ((lpAssetEmission == lpAssetEmission))
11341143 then {
11351144 let currentDLp = calcCurrentDLp(amAssetPmt, prAssetPmt, toBigInt(0))
11361145 if ((currentDLp == currentDLp))
11371146 then {
11381147 let e = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], slip, true, false, true, 0, "")
11391148 let emitLpAmt = e._2
11401149 let lpAssetId = e._7
11411150 let state = e._9
11421151 let amDiff = e._10
11431152 let prDiff = e._11
11441153 let amId = e._12
11451154 let prId = e._13
11461155 let r = invoke(fca, "emit", [emitLpAmt], nil)
11471156 if ((r == r))
11481157 then {
11491158 let el = match r {
11501159 case legacy: Address =>
11511160 invoke(legacy, "emit", [emitLpAmt], nil)
11521161 case _ =>
11531162 unit
11541163 }
11551164 if ((el == el))
11561165 then {
11571166 let sa = if ((amDiff > 0))
11581167 then invoke(slipCntr, "put", nil, [AttachedPayment(amId, amDiff)])
11591168 else nil
11601169 if ((sa == sa))
11611170 then {
11621171 let sp = if ((prDiff > 0))
11631172 then invoke(slipCntr, "put", nil, [AttachedPayment(prId, prDiff)])
11641173 else nil
11651174 if ((sp == sp))
11661175 then {
11671176 let lpTrnsfr = if (autoStake)
11681177 then {
11691178 let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
11701179 if ((ss == ss))
11711180 then nil
11721181 else throw("Strict value is not equal to itself.")
11731182 }
11741183 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
1175- let $t04311243254 = refreshDLpInternal(0, 0, 0)
1176- let refreshDLpActions = $t04311243254._1
1177- let updatedDLp = $t04311243254._2
1184+ let $t04327343415 = refreshDLpInternal(0, 0, 0)
1185+ let refreshDLpActions = $t04327343415._1
1186+ let updatedDLp = $t04327343415._2
11781187 let check = if ((updatedDLp >= currentDLp))
11791188 then true
11801189 else throwErr(makeString(["updated DLp lower than current DLp", toString(amountAssetBalance), toString(priceAssetBalance), toString(lpAssetEmission), toString(currentDLp), toString(updatedDLp), toString(amDiff), toString(prDiff)], " "))
11811190 if ((check == check))
11821191 then {
11831192 let lpAssetEmissionAfter = value(assetInfo(cfgLpAssetId)).quantity
11841193 if ((lpAssetEmissionAfter == lpAssetEmissionAfter))
11851194 then ((state ++ lpTrnsfr) ++ refreshDLpActions)
11861195 else throw("Strict value is not equal to itself.")
11871196 }
11881197 else throw("Strict value is not equal to itself.")
11891198 }
11901199 else throw("Strict value is not equal to itself.")
11911200 }
11921201 else throw("Strict value is not equal to itself.")
11931202 }
11941203 else throw("Strict value is not equal to itself.")
11951204 }
11961205 else throw("Strict value is not equal to itself.")
11971206 }
11981207 else throw("Strict value is not equal to itself.")
11991208 }
12001209 else throw("Strict value is not equal to itself.")
12011210 }
12021211 else throw("Strict value is not equal to itself.")
12031212 }
12041213 else throw("Strict value is not equal to itself.")
12051214 }
12061215 }
12071216
12081217
12091218
12101219 @Callable(i)
12111220 func putOneTknV2 (minOutAmount,autoStake) = {
12121221 let isPoolOneTokenOperationsDisabled = {
12131222 let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
12141223 if ($isInstanceOf(@, "Boolean"))
12151224 then @
12161225 else throw(($getType(@) + " couldn't be cast to Boolean"))
12171226 }
12181227 let isPutDisabled = if (!(isAddressWhitelisted(i.caller)))
12191228 then if (if (if (igs())
12201229 then true
12211230 else (cfgPoolStatus == PoolPutDis))
12221231 then true
12231232 else (cfgPoolStatus == PoolShutdown))
12241233 then true
12251234 else isPoolOneTokenOperationsDisabled
12261235 else false
12271236 let checks = [if (if (!(isPutDisabled))
12281237 then true
12291238 else isManager(i))
12301239 then true
12311240 else throwErr("put operation is blocked by admin"), if ((size(i.payments) == 1))
12321241 then true
12331242 else throwErr("exactly 1 payment are expected")]
12341243 if ((checks == checks))
12351244 then {
12361245 let amId = toBase58String(value(cfgAmountAssetId))
12371246 let prId = toBase58String(value(cfgPriceAssetId))
12381247 let lpId = cfgLpAssetId
12391248 let amDecimals = cfgAmountAssetDecimals
12401249 let prDecimals = cfgPriceAssetDecimals
12411250 let userAddress = if ((i.caller == this))
12421251 then i.originCaller
12431252 else i.caller
12441253 let pmt = value(i.payments[0])
12451254 let pmtAssetId = toBase58String(value(pmt.assetId))
12461255 let pmtAmt = pmt.amount
12471256 let currentDLp = if ((pmt.assetId == cfgAmountAssetId))
12481257 then calcCurrentDLp(toBigInt(pmtAmt), toBigInt(0), toBigInt(0))
12491258 else calcCurrentDLp(toBigInt(0), toBigInt(pmtAmt), toBigInt(0))
12501259 if ((currentDLp == currentDLp))
12511260 then {
1252- let $t04493245090 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId), true)
1253- if (($t04493245090 == $t04493245090))
1261+ let $t04509345251 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId), true)
1262+ if (($t04509345251 == $t04509345251))
12541263 then {
1255- let feeAmount = $t04493245090._3
1256- let state = $t04493245090._2
1257- let estimLP = $t04493245090._1
1264+ let feeAmount = $t04509345251._3
1265+ let state = $t04509345251._2
1266+ let estimLP = $t04509345251._1
12581267 let emitLpAmt = if (if ((minOutAmount > 0))
12591268 then (minOutAmount > estimLP)
12601269 else false)
12611270 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
12621271 else estimLP
12631272 let e = invoke(fca, "emit", [emitLpAmt], nil)
12641273 if ((e == e))
12651274 then {
12661275 let el = match e {
12671276 case legacy: Address =>
12681277 invoke(legacy, "emit", [emitLpAmt], nil)
12691278 case _ =>
12701279 unit
12711280 }
12721281 if ((el == el))
12731282 then {
12741283 let lpTrnsfr = if (autoStake)
12751284 then {
12761285 let ss = invoke(stakingContract, "stakeFor", [toString(i.caller)], [AttachedPayment(lpId, emitLpAmt)])
12771286 if ((ss == ss))
12781287 then nil
12791288 else throw("Strict value is not equal to itself.")
12801289 }
12811290 else [ScriptTransfer(i.caller, emitLpAmt, lpId)]
12821291 let sendFeeToMatcher = if ((feeAmount > 0))
12831292 then [ScriptTransfer(feeCollectorAddress, feeAmount, fromBase58String(pmtAssetId))]
12841293 else nil
1285- let $t04597546324 = if ((this == feeCollectorAddress))
1294+ let $t04613646485 = if ((this == feeCollectorAddress))
12861295 then $Tuple2(0, 0)
12871296 else {
12881297 let paymentInAmountAsset = if ((pmt.assetId == cfgAmountAssetId))
12891298 then true
12901299 else false
12911300 if (paymentInAmountAsset)
12921301 then $Tuple2(-(feeAmount), 0)
12931302 else $Tuple2(0, -(feeAmount))
12941303 }
1295- let amountAssetBalanceDelta = $t04597546324._1
1296- let priceAssetBalanceDelta = $t04597546324._2
1297- let $t04632746435 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1298- let refreshDLpActions = $t04632746435._1
1299- let updatedDLp = $t04632746435._2
1304+ let amountAssetBalanceDelta = $t04613646485._1
1305+ let priceAssetBalanceDelta = $t04613646485._2
1306+ let $t04648846596 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1307+ let refreshDLpActions = $t04648846596._1
1308+ let updatedDLp = $t04648846596._2
13001309 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
13011310 if ((isUpdatedDLpValid == isUpdatedDLpValid))
13021311 then $Tuple2((((state ++ lpTrnsfr) ++ sendFeeToMatcher) ++ refreshDLpActions), emitLpAmt)
13031312 else throw("Strict value is not equal to itself.")
13041313 }
13051314 else throw("Strict value is not equal to itself.")
13061315 }
13071316 else throw("Strict value is not equal to itself.")
13081317 }
13091318 else throw("Strict value is not equal to itself.")
13101319 }
13111320 else throw("Strict value is not equal to itself.")
13121321 }
13131322 else throw("Strict value is not equal to itself.")
13141323 }
13151324
13161325
13171326
13181327 @Callable(i)
13191328 func putForFree (maxSlpg) = if ((0 > maxSlpg))
13201329 then throw("Wrong slpg")
13211330 else if ((size(i.payments) != 2))
13221331 then throw("2 pmnts expd")
13231332 else {
13241333 let estPut = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], maxSlpg, false, false, true, 0, "")
13251334 let state = estPut._9
13261335 let amAssetPmt = toBigInt(value(i.payments[0]).amount)
13271336 let prAssetPmt = toBigInt(value(i.payments[1]).amount)
13281337 let currentDLp = calcCurrentDLp(amAssetPmt, prAssetPmt, toBigInt(0))
13291338 if ((currentDLp == currentDLp))
13301339 then {
1331- let $t04746547530 = refreshDLpInternal(0, 0, 0)
1332- let refreshDLpActions = $t04746547530._1
1333- let updatedDLp = $t04746547530._2
1340+ let $t04762647691 = refreshDLpInternal(0, 0, 0)
1341+ let refreshDLpActions = $t04762647691._1
1342+ let updatedDLp = $t04762647691._2
13341343 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
13351344 if ((isUpdatedDLpValid == isUpdatedDLpValid))
13361345 then (state ++ refreshDLpActions)
13371346 else throw("Strict value is not equal to itself.")
13381347 }
13391348 else throw("Strict value is not equal to itself.")
13401349 }
13411350
13421351
13431352
13441353 @Callable(i)
13451354 func get () = {
13461355 let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(0))
13471356 if ((currentDLp == currentDLp))
13481357 then {
13491358 let r = cg(i)
13501359 let outAmtAmt = r._1
13511360 let outPrAmt = r._2
13521361 let pmtAmt = r._3
13531362 let pmtAssetId = r._4
13541363 let state = r._5
13551364 let b = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
13561365 if ((b == b))
13571366 then {
1358- let $t04870348785 = refreshDLpInternal(-(outAmtAmt), -(outPrAmt), 0)
1359- let refreshDLpActions = $t04870348785._1
1360- let updatedDLp = $t04870348785._2
1367+ let $t04886448946 = refreshDLpInternal(-(outAmtAmt), -(outPrAmt), 0)
1368+ let refreshDLpActions = $t04886448946._1
1369+ let updatedDLp = $t04886448946._2
13611370 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
13621371 if ((isUpdatedDLpValid == isUpdatedDLpValid))
13631372 then (state ++ refreshDLpActions)
13641373 else throw("Strict value is not equal to itself.")
13651374 }
13661375 else throw("Strict value is not equal to itself.")
13671376 }
13681377 else throw("Strict value is not equal to itself.")
13691378 }
13701379
13711380
13721381
13731382 @Callable(i)
13741383 func getOneTknV2 (outAssetId,minOutAmount) = {
13751384 let isPoolOneTokenOperationsDisabled = {
13761385 let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
13771386 if ($isInstanceOf(@, "Boolean"))
13781387 then @
13791388 else throw(($getType(@) + " couldn't be cast to Boolean"))
13801389 }
13811390 let isGetDisabled = if (!(isAddressWhitelisted(i.caller)))
13821391 then if (if (igs())
13831392 then true
13841393 else (cfgPoolStatus == PoolShutdown))
13851394 then true
13861395 else isPoolOneTokenOperationsDisabled
13871396 else false
13881397 let checks = [if (if (!(isGetDisabled))
13891398 then true
13901399 else isManager(i))
13911400 then true
13921401 else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 1))
13931402 then true
13941403 else throwErr("exactly 1 payment are expected")]
13951404 if ((checks == checks))
13961405 then {
1397- let $t04944049595 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1398- let state = $t04944049595._1
1399- let totalAmount = $t04944049595._2
1406+ let $t04960149756 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1407+ let state = $t04960149756._1
1408+ let totalAmount = $t04960149756._2
14001409 $Tuple2(state, totalAmount)
14011410 }
14021411 else throw("Strict value is not equal to itself.")
14031412 }
14041413
14051414
14061415
14071416 @Callable(i)
14081417 func refreshDLp () = {
14091418 let lastRefreshedBlockHeight = valueOrElse(getInteger(keyDLpRefreshedHeight), 0)
14101419 let checkLastRefreshedBlockHeight = if (((height - lastRefreshedBlockHeight) >= dLpRefreshDelay))
14111420 then unit
14121421 else throwErr(makeString([toString(dLpRefreshDelay), " blocks have not passed since the previous call"], ""))
14131422 if ((checkLastRefreshedBlockHeight == checkLastRefreshedBlockHeight))
14141423 then {
14151424 let dLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyDLp), "0")), fmtErr("invalid dLp"))
1416- let $t05011950183 = refreshDLpInternal(0, 0, 0)
1417- let dLpUpdateActions = $t05011950183._1
1418- let updatedDLp = $t05011950183._2
1425+ let $t05028050344 = refreshDLpInternal(0, 0, 0)
1426+ let dLpUpdateActions = $t05028050344._1
1427+ let updatedDLp = $t05028050344._2
14191428 let actions = if ((dLp != updatedDLp))
14201429 then dLpUpdateActions
14211430 else throwErr("nothing to refresh")
14221431 $Tuple2(actions, toString(updatedDLp))
14231432 }
14241433 else throw("Strict value is not equal to itself.")
14251434 }
14261435
14271436
14281437
14291438 @Callable(i)
14301439 func getOneTknV2READONLY (outAssetId,lpAssetAmount) = {
14311440 let amId = toBase58String(value(cfgAmountAssetId))
14321441 let prId = toBase58String(value(cfgPriceAssetId))
14331442 let lpId = toBase58String(value(cfgLpAssetId))
14341443 let xp = [toBigInt(getAccBalance(amId)), toBigInt(getAccBalance(prId))]
14351444 let lpEmission = toBigInt(valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "invalid lp asset").quantity)
14361445 let D0 = getD(xp)
14371446 let D1 = (D0 - fraction(toBigInt(lpAssetAmount), D0, lpEmission))
14381447 let index = if ((outAssetId == amId))
14391448 then 0
14401449 else if ((outAssetId == prId))
14411450 then 1
14421451 else throw("invalid out asset id")
14431452 let newY = getYD(xp, index, D1)
14441453 let dy = (xp[index] - newY)
14451454 let totalGetRaw = max([0, toInt((dy - big1))])
1446- let $t05119351248 = takeFee(totalGetRaw, outFee)
1447- let totalGet = $t05119351248._1
1448- let feeAmount = $t05119351248._2
1455+ let $t05135451409 = takeFee(totalGetRaw, outFee)
1456+ let totalGet = $t05135451409._1
1457+ let feeAmount = $t05135451409._2
14491458 $Tuple2(nil, $Tuple2(totalGet, feeAmount))
14501459 }
14511460
14521461
14531462
14541463 @Callable(i)
14551464 func getOneTknV2WithBonusREADONLY (outAssetId,lpAssetAmount) = {
14561465 let amId = toBase58String(value(cfgAmountAssetId))
14571466 let prId = toBase58String(value(cfgPriceAssetId))
14581467 let lpId = toBase58String(value(cfgLpAssetId))
14591468 let amBalance = getAccBalance(amId)
14601469 let prBalance = getAccBalance(prId)
1461- let $t05162351738 = {
1470+ let $t05178451899 = {
14621471 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)
14631472 if ($isInstanceOf(@, "(Int, Int)"))
14641473 then @
14651474 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
14661475 }
1467- let totalGet = $t05162351738._1
1468- let feeAmount = $t05162351738._2
1476+ let totalGet = $t05178451899._1
1477+ let feeAmount = $t05178451899._2
14691478 let r = ego("", lpId, lpAssetAmount, this)
14701479 let outAmAmt = r._1
14711480 let outPrAmt = r._2
14721481 let sumOfGetAssets = (outAmAmt + outPrAmt)
14731482 let bonus = if ((sumOfGetAssets == 0))
14741483 then if ((totalGet == 0))
14751484 then 0
14761485 else throw("bonus calculation error")
14771486 else fraction((totalGet - sumOfGetAssets), scale8, sumOfGetAssets)
14781487 $Tuple2(nil, $Tuple3(totalGet, feeAmount, bonus))
14791488 }
14801489
14811490
14821491
14831492 @Callable(i)
14841493 func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = {
14851494 let r = cg(i)
14861495 let outAmAmt = r._1
14871496 let outPrAmt = r._2
14881497 let pmtAmt = r._3
14891498 let pmtAssetId = r._4
14901499 let state = r._5
14911500 if ((noLessThenAmtAsset > outAmAmt))
14921501 then throw(((("Failed: " + toString(outAmAmt)) + " < ") + toString(noLessThenAmtAsset)))
14931502 else if ((noLessThenPriceAsset > outPrAmt))
14941503 then throw(((("Failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset)))
14951504 else {
14961505 let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(0))
14971506 if ((currentDLp == currentDLp))
14981507 then {
14991508 let burnLPAssetOnFactory = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
15001509 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
15011510 then {
1502- let $t05290452985 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1503- let refreshDLpActions = $t05290452985._1
1504- let updatedDLp = $t05290452985._2
1511+ let $t05306553146 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1512+ let refreshDLpActions = $t05306553146._1
1513+ let updatedDLp = $t05306553146._2
15051514 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
15061515 if ((isUpdatedDLpValid == isUpdatedDLpValid))
15071516 then (state ++ refreshDLpActions)
15081517 else throw("Strict value is not equal to itself.")
15091518 }
15101519 else throw("Strict value is not equal to itself.")
15111520 }
15121521 else throw("Strict value is not equal to itself.")
15131522 }
15141523 }
15151524
15161525
15171526
15181527 @Callable(i)
15191528 func unstakeAndGet (amount) = {
15201529 let checkPayments = if ((size(i.payments) != 0))
15211530 then throw("No pmnts expd")
15221531 else true
15231532 if ((checkPayments == checkPayments))
15241533 then {
15251534 let factoryCfg = gfc()
15261535 let lpAssetId = cfgLpAssetId
15271536 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
15281537 let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(0))
15291538 if ((currentDLp == currentDLp))
15301539 then {
15311540 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), amount], nil)
15321541 if ((unstakeInv == unstakeInv))
15331542 then {
15341543 let r = ego(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
15351544 let outAmAmt = r._1
15361545 let outPrAmt = r._2
15371546 let sts = parseIntValue(r._9)
15381547 let state = r._10
15391548 let isGetDisabled = if (!(isAddressWhitelisted(i.caller)))
15401549 then if (igs())
15411550 then true
15421551 else (cfgPoolStatus == PoolShutdown)
15431552 else false
15441553 let v = if (isGetDisabled)
15451554 then throw(("Blocked: " + toString(sts)))
15461555 else true
15471556 if ((v == v))
15481557 then {
15491558 let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
15501559 if ((burnA == burnA))
15511560 then {
1552- let $t05409554176 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1553- let refreshDLpActions = $t05409554176._1
1554- let updatedDLp = $t05409554176._2
1561+ let $t05425654337 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1562+ let refreshDLpActions = $t05425654337._1
1563+ let updatedDLp = $t05425654337._2
15551564 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
15561565 if ((isUpdatedDLpValid == isUpdatedDLpValid))
15571566 then (state ++ refreshDLpActions)
15581567 else throw("Strict value is not equal to itself.")
15591568 }
15601569 else throw("Strict value is not equal to itself.")
15611570 }
15621571 else throw("Strict value is not equal to itself.")
15631572 }
15641573 else throw("Strict value is not equal to itself.")
15651574 }
15661575 else throw("Strict value is not equal to itself.")
15671576 }
15681577 else throw("Strict value is not equal to itself.")
15691578 }
15701579
15711580
15721581
15731582 @Callable(i)
15741583 func unstakeAndGetNoLess (unstakeAmount,noLessThenAmountAsset,noLessThenPriceAsset) = {
15751584 let isGetDisabled = if (!(isAddressWhitelisted(i.caller)))
15761585 then if (igs())
15771586 then true
15781587 else (cfgPoolStatus == PoolShutdown)
15791588 else false
15801589 let checks = [if (!(isGetDisabled))
15811590 then true
15821591 else throw("get operation is blocked by admin"), if ((size(i.payments) == 0))
15831592 then true
15841593 else throw("no payments are expected")]
15851594 if ((checks == checks))
15861595 then {
15871596 let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(0))
15881597 if ((currentDLp == currentDLp))
15891598 then {
15901599 let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(cfgLpAssetId), unstakeAmount], nil)
15911600 if ((unstakeInv == unstakeInv))
15921601 then {
15931602 let res = ego(toBase58String(i.transactionId), toBase58String(cfgLpAssetId), unstakeAmount, i.caller)
15941603 let outAmAmt = res._1
15951604 let outPrAmt = res._2
15961605 let state = res._10
15971606 let checkAmounts = [if ((outAmAmt >= noLessThenAmountAsset))
15981607 then true
15991608 else throw(makeString(["amount asset amount to receive is less than ", toString(noLessThenAmountAsset)], "")), if ((outPrAmt >= noLessThenPriceAsset))
16001609 then true
16011610 else throw(makeString(["price asset amount to receive is less than ", toString(noLessThenPriceAsset)], ""))]
16021611 if ((checkAmounts == checkAmounts))
16031612 then {
16041613 let burnLPAssetOnFactory = invoke(fca, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
16051614 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
16061615 then {
1607- let $t05546455545 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1608- let refreshDLpActions = $t05546455545._1
1609- let updatedDLp = $t05546455545._2
1616+ let $t05562555706 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1617+ let refreshDLpActions = $t05562555706._1
1618+ let updatedDLp = $t05562555706._2
16101619 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
16111620 if ((isUpdatedDLpValid == isUpdatedDLpValid))
16121621 then (state ++ refreshDLpActions)
16131622 else throw("Strict value is not equal to itself.")
16141623 }
16151624 else throw("Strict value is not equal to itself.")
16161625 }
16171626 else throw("Strict value is not equal to itself.")
16181627 }
16191628 else throw("Strict value is not equal to itself.")
16201629 }
16211630 else throw("Strict value is not equal to itself.")
16221631 }
16231632 else throw("Strict value is not equal to itself.")
16241633 }
16251634
16261635
16271636
16281637 @Callable(i)
16291638 func unstakeAndGetOneTknV2 (unstakeAmount,outAssetId,minOutAmount) = {
16301639 let isPoolOneTokenOperationsDisabled = {
16311640 let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
16321641 if ($isInstanceOf(@, "Boolean"))
16331642 then @
16341643 else throw(($getType(@) + " couldn't be cast to Boolean"))
16351644 }
16361645 let isGetDisabled = if (!(isAddressWhitelisted(i.caller)))
16371646 then if (if (igs())
16381647 then true
16391648 else (cfgPoolStatus == PoolShutdown))
16401649 then true
16411650 else isPoolOneTokenOperationsDisabled
16421651 else false
16431652 let checks = [if (if (!(isGetDisabled))
16441653 then true
16451654 else isManager(i))
16461655 then true
16471656 else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 0))
16481657 then true
16491658 else throwErr("no payments are expected")]
16501659 if ((checks == checks))
16511660 then {
16521661 let factoryCfg = gfc()
16531662 let lpAssetId = cfgLpAssetId
16541663 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
16551664 let userAddress = i.caller
16561665 let lpAssetRecipientAddress = this
16571666 let unstakeInv = invoke(staking, "unstakeINTERNAL", [lpAssetId, unstakeAmount, userAddress.bytes, lpAssetRecipientAddress.bytes], nil)
16581667 if ((unstakeInv == unstakeInv))
16591668 then {
1660- let $t05660456792 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1661- let state = $t05660456792._1
1662- let totalAmount = $t05660456792._2
1669+ let $t05676556953 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1670+ let state = $t05676556953._1
1671+ let totalAmount = $t05676556953._2
16631672 $Tuple2(state, totalAmount)
16641673 }
16651674 else throw("Strict value is not equal to itself.")
16661675 }
16671676 else throw("Strict value is not equal to itself.")
16681677 }
16691678
16701679
16711680
16721681 @Callable(i)
16731682 func putOneTknV2WithBonusREADONLY (paymentAmountRaw,paymentAssetId) = {
1674- let $t05692057023 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1675- let lpAmount = $t05692057023._1
1676- let state = $t05692057023._2
1677- let feeAmount = $t05692057023._3
1678- let bonus = $t05692057023._4
1683+ let $t05708157184 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1684+ let lpAmount = $t05708157184._1
1685+ let state = $t05708157184._2
1686+ let feeAmount = $t05708157184._3
1687+ let bonus = $t05708157184._4
16791688 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
16801689 }
16811690
16821691
16831692
16841693 @Callable(i)
16851694 func putOneTknV2WithoutTakeFeeREADONLY (paymentAmountRaw,paymentAssetId) = {
1686- let $t05717157275 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1687- let lpAmount = $t05717157275._1
1688- let state = $t05717157275._2
1689- let feeAmount = $t05717157275._3
1690- let bonus = $t05717157275._4
1695+ let $t05733257436 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1696+ let lpAmount = $t05733257436._1
1697+ let state = $t05733257436._2
1698+ let feeAmount = $t05733257436._3
1699+ let bonus = $t05733257436._4
16911700 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
16921701 }
16931702
16941703
16951704
16961705 @Callable(i)
16971706 func activate (amtAsStr,prAsStr) = if ((toString(i.caller) != toString(fca)))
16981707 then throw("denied")
16991708 else $Tuple2([StringEntry(aa(), amtAsStr), StringEntry(pa(), prAsStr), StringEntry(amp(), toString(ampInitial)), StringEntry(keyAmpHistory(height), toString(ampInitial))], "success")
17001709
17011710
17021711
17031712 @Callable(i)
17041713 func getPoolConfigWrapperREADONLY () = $Tuple2(nil, gpc())
17051714
17061715
17071716
17081717 @Callable(i)
17091718 func getAccBalanceWrapperREADONLY (assetId) = $Tuple2(nil, getAccBalance(assetId))
17101719
17111720
17121721
17131722 @Callable(i)
17141723 func calcPricesWrapperREADONLY (amAmt,prAmt,lpAmt) = {
17151724 let pr = calcPrices(amAmt, prAmt, lpAmt)
17161725 $Tuple2(nil, [toString(pr[0]), toString(pr[1]), toString(pr[2])])
17171726 }
17181727
17191728
17201729
17211730 @Callable(i)
17221731 func fromX18WrapperREADONLY (val,resScaleMult) = $Tuple2(nil, f1(parseBigIntValue(val), resScaleMult))
17231732
17241733
17251734
17261735 @Callable(i)
17271736 func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(t1(origVal, origScaleMult)))
17281737
17291738
17301739
17311740 @Callable(i)
17321741 func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(cpbi(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
17331742
17341743
17351744
17361745 @Callable(i)
17371746 func estimatePutOperationWrapperREADONLY (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,usrAddr,isEval,emitLp) = $Tuple2(nil, epo(txId58, slippage, inAmAmt, inAmId, inPrAmt, inPrId, usrAddr, isEval, emitLp, true, false, 0, ""))
17381747
17391748
17401749
17411750 @Callable(i)
17421751 func estimateGetOperationWrapperREADONLY (txId58,pmtAsId,pmtLpAmt,usrAddr) = {
17431752 let r = ego(txId58, pmtAsId, pmtLpAmt, addressFromStringValue(usrAddr))
17441753 $Tuple2(nil, $Tuple10(r._1, r._2, r._3, r._4, r._5, r._6, r._7, toString(r._8), r._9, r._10))
17451754 }
17461755
17471756
17481757
17491758 @Callable(i)
17501759 func changeAmp () = {
17511760 let cfg = invoke(fca, "getChangeAmpConfigREADONLY", [toString(this)], nil)
1752- let $t05975559954 = match cfg {
1761+ let $t05991660115 = match cfg {
17531762 case list: List[Any] =>
17541763 $Tuple3({
17551764 let @ = list[0]
17561765 if ($isInstanceOf(@, "Int"))
17571766 then @
17581767 else throw(($getType(@) + " couldn't be cast to Int"))
17591768 }, {
17601769 let @ = list[1]
17611770 if ($isInstanceOf(@, "Int"))
17621771 then @
17631772 else throw(($getType(@) + " couldn't be cast to Int"))
17641773 }, {
17651774 let @ = list[2]
17661775 if ($isInstanceOf(@, "Int"))
17671776 then @
17681777 else throw(($getType(@) + " couldn't be cast to Int"))
17691778 })
17701779 case _ =>
17711780 throwErr("invalid entry type")
17721781 }
1773- let delay = $t05975559954._1
1774- let delta = $t05975559954._2
1775- let target = $t05975559954._3
1782+ let delay = $t05991660115._1
1783+ let delta = $t05991660115._2
1784+ let target = $t05991660115._3
17761785 let curAmp = parseIntValue(getStringValue(amp()))
17771786 let newAmpRaw = (curAmp + delta)
17781787 let newAmp = if ((0 > delta))
17791788 then if ((target > newAmpRaw))
17801789 then target
17811790 else newAmpRaw
17821791 else if ((newAmpRaw > target))
17831792 then target
17841793 else newAmpRaw
17851794 let lastCall = valueOrElse(getInteger(keyChangeAmpLastCall()), 0)
17861795 let wait = (lastCall + delay)
17871796 let checks = [if ((height > wait))
17881797 then true
17891798 else throwErr("try again in few blocks"), if ((curAmp != newAmp))
17901799 then true
17911800 else throwErr("already reached target")]
17921801 if ((checks == checks))
17931802 then [IntegerEntry(keyChangeAmpLastCall(), height), StringEntry(amp(), toString(newAmp)), StringEntry(keyAmpHistory(height), toString(newAmp))]
17941803 else throw("Strict value is not equal to itself.")
17951804 }
17961805
17971806
17981807 @Verifier(tx)
17991808 func verify () = {
18001809 let targetPublicKey = match managerPublicKeyOrUnit() {
18011810 case pk: ByteVector =>
18021811 pk
18031812 case _: Unit =>
18041813 tx.senderPublicKey
18051814 case _ =>
18061815 throw("Match error")
18071816 }
18081817 match tx {
18091818 case order: Order =>
18101819 let matcherPub = mp()
1811- let $t06088761004 = if (skipOrderValidation())
1820+ let $t06104861165 = if (skipOrderValidation())
18121821 then $Tuple2(true, "")
18131822 else validateMatcherOrderAllowed(order)
1814- let orderValid = $t06088761004._1
1815- let orderValidInfo = $t06088761004._2
1823+ let orderValid = $t06104861165._1
1824+ let orderValidInfo = $t06104861165._2
18161825 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
18171826 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
18181827 if (if (if (orderValid)
18191828 then senderValid
18201829 else false)
18211830 then matcherValid
18221831 else false)
18231832 then true
18241833 else throwOrderError(orderValid, orderValidInfo, senderValid, matcherValid)
18251834 case s: SetScriptTransaction =>
18261835 if (sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey))
18271836 then true
18281837 else {
18291838 let newHash = blake2b256(value(s.script))
18301839 let allowedHash = fromBase64String(value(getString(fca, keyAllowedLpStableScriptHash())))
18311840 let currentHash = scriptHash(this)
18321841 if ((allowedHash == newHash))
18331842 then (currentHash != newHash)
18341843 else false
18351844 }
18361845 case _ =>
18371846 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
18381847 }
18391848 }
18401849

github/deemru/w8io/786bc32 
242.80 ms