tx · EEUA7MRyYeN4rfsuJ1TUjAmwrk8zBS4f9xsPRh8PnNQU

3MzKSdTH2jFbypLsoNfrH7QgkzSbx3EYwCA:  -0.03500000 Waves

2023.01.20 13:54 [2413198] smart account 3MzKSdTH2jFbypLsoNfrH7QgkzSbx3EYwCA > SELF 0.00000000 Waves

{ "type": 13, "id": "EEUA7MRyYeN4rfsuJ1TUjAmwrk8zBS4f9xsPRh8PnNQU", "fee": 3500000, "feeAssetId": null, "timestamp": 1674212048686, "version": 2, "chainId": 84, "sender": "3MzKSdTH2jFbypLsoNfrH7QgkzSbx3EYwCA", "senderPublicKey": "35yd3qw1gxKDxKwGAykHN9fANbXNWwseaUwbWDj24o3x", "proofs": [ "4DxE1rt7zjpWHS1KP6PziabBHTVGhC1cFpn2aWX1mXUn79EYEveJq2UPDbMZrEDoKf2oWekR44QyXNc8rt54Fm46" ], "script": "base64:BgLDJwgCEgMKAQgSAwoBCBIAEgQKAgEEEgQKAgEEEgMKAQESABIECgIIARIAEgQKAggBEgQKAggBEgQKAgEBEgMKAQESBQoDAQEBEgUKAwEIARIECgIBCBIECgIBCBIECgIICBIECgIICBIECgIIARIAEgMKAQgSBQoDAQEBEgQKAggBEgQKAgEBEgQKAggIEgsKCQgBAQIBAggEBBIGCgQICAEIIgZzY2FsZTgiDHNjYWxlOEJpZ0ludCIHc2NhbGUxOCIKemVyb0JpZ0ludCIEYmlnMCIEYmlnMSIEYmlnMiIEYmlnMyIEYmlnNCILd2F2ZXNTdHJpbmciBUFtdWx0IgNTRVAiClBvb2xQdXREaXMiDlBvb2xNYXRjaGVyRGlzIgxQb29sU2h1dGRvd24iDmlkeFBvb2xBZGRyZXNzIglpZHhQb29sU3QiCWlkeExQQXNJZCIJaWR4QW1Bc0lkIglpZHhQckFzSWQiC2lkeEFtdEFzRGNtIg1pZHhQcmljZUFzRGNtIgtpZHhJQW10QXNJZCINaWR4SVByaWNlQXNJZCIPaWR4RmFjdFN0YWtDbnRyIhJpZHhGYWN0b3J5UmVzdENudHIiEGlkeEZhY3RTbGlwcENudHIiCmZlZURlZmF1bHQiAnQxIgdvcmlnVmFsIg1vcmlnU2NhbGVNdWx0Igh0MUJpZ0ludCICZjEiA3ZhbCIPcmVzdWx0U2NhbGVNdWx0Igxmcm9tWDE4Um91bmQiBXJvdW5kIgNhYnMiCWFic0JpZ0ludCICZmMiA21wayIEcG1wayICcGwiAnBoIgFoIgF0IgNwYXUiAnVhIgR0eElkIgNnYXUiAmFhIgJwYSIDYW1wIgNhZGEiBmtleUZlZSIDZmVlIgZrZXlETHAiFWtleURMcFJlZnJlc2hlZEhlaWdodCISa2V5RExwUmVmcmVzaERlbGF5IhZkTHBSZWZyZXNoRGVsYXlEZWZhdWx0Ig9kTHBSZWZyZXNoRGVsYXkiBGZjZmciBG10cGsiAnBjIgZpQW10QXMiBWlQckFzIgNtYmEiBWJBU3RyIgNhcHMiHGtleUFsbG93ZWRMcFN0YWJsZVNjcmlwdEhhc2giFmtleUZlZUNvbGxlY3RvckFkZHJlc3MiD3Rocm93T3JkZXJFcnJvciIKb3JkZXJWYWxpZCIOb3JkZXJWYWxpZEluZm8iC3NlbmRlclZhbGlkIgxtYXRjaGVyVmFsaWQiBHN0cmYiBGFkZHIiA2tleSIEaW50ZiIIdGhyb3dFcnIiA21zZyIGZm10RXJyIgNmY2EiBWluRmVlIgFAIgZvdXRGZWUiAUEiA2lncyICbXAiE2ZlZUNvbGxlY3RvckFkZHJlc3MiA2dwYyIFYW10QXMiB3ByaWNlQXMiCGlQcmljZUFzIgxwYXJzZUFzc2V0SWQiBWlucHV0Ig9hc3NldElkVG9TdHJpbmciD3BhcnNlUG9vbENvbmZpZyIKcG9vbENvbmZpZyIQcG9vbENvbmZpZ1BhcnNlZCILJHQwNzk2NDgxOTMiDWNmZ1Bvb2xTdGF0dXMiDGNmZ0xwQXNzZXRJZCIQY2ZnQW1vdW50QXNzZXRJZCIPY2ZnUHJpY2VBc3NldElkIhZjZmdBbW91bnRBc3NldERlY2ltYWxzIhVjZmdQcmljZUFzc2V0RGVjaW1hbHMiEmNmZ0luQW1vdW50QXNzZWRJZCIRY2ZnSW5QcmljZUFzc2V0SWQiA2dmYyINZmFjdG9yeUNvbmZpZyIPc3Rha2luZ0NvbnRyYWN0IgxyZXN0Q29udHJhY3QiEWRhdGFQdXRBY3Rpb25JbmZvIg1pbkFtdEFzc2V0QW10Ig9pblByaWNlQXNzZXRBbXQiCG91dExwQW10IgVwcmljZSIKc2xpcEJ5VXNlciIMc2xpcHBhZ2VSZWFsIgh0eEhlaWdodCILdHhUaW1lc3RhbXAiDHNsaXBhZ2VBbUFtdCIMc2xpcGFnZVByQW10IhFkYXRhR2V0QWN0aW9uSW5mbyIOb3V0QW10QXNzZXRBbXQiEG91dFByaWNlQXNzZXRBbXQiB2luTHBBbXQiDWdldEFjY0JhbGFuY2UiB2Fzc2V0SWQiBGNwYmkiCHByQW10WDE4IghhbUFtdFgxOCIFY3BiaXIiA3BjcCIKYW1Bc3NldERjbSIKcHJBc3NldERjbSIFYW1BbXQiBXByQW10IgthbXRBc0FtdFgxOCIKcHJBc0FtdFgxOCIKY2FsY1ByaWNlcyIFbHBBbXQiCGFtdEFzRGNtIgdwckFzRGNtIghwcmljZVgxOCIIbHBBbXRYMTgiDWxwUHJJbkFtQXNYMTgiDWxwUHJJblByQXNYMTgiB3Rha2VGZWUiBmFtb3VudCIJZmVlQW1vdW50IgRnZXREIgJ4cCIDeHAwIgN4cDEiAXMiAWEiA2FubiIBcCILeHAwX3hwMV9uX24iBWFubl9zIgVhbm5fMSIJY2FsY0ROZXh0IgFkIgJkZCIDZGRkIgJkcCIEY2FsYyIDYWNjIgFpIgVkTmV4dCIIZERpZmZSYXciBWREaWZmIgNhcnIiDSR0MDEyNjkwMTI3MzgiAiRsIgIkcyIFJGFjYzAiBSRmMF8xIgIkYSICJGkiBSRmMF8yIgVmb3VuZCIDZWdvIgZ0eElkNTgiCnBtdEFzc2V0SWQiCHBtdExwQW10Igt1c2VyQWRkcmVzcyIEbHBJZCIEYW1JZCIEcHJJZCIFYW1EY20iBXByRGNtIgNzdHMiB2xwRW1pc3MiCWFtQmFsYW5jZSIMYW1CYWxhbmNlWDE4IglwckJhbGFuY2UiDHByQmFsYW5jZVgxOCILY3VyUHJpY2VYMTgiCGN1clByaWNlIgtwbXRMcEFtdFgxOCIKbHBFbWlzc1gxOCILb3V0QW1BbXRYMTgiC291dFByQW10WDE4IghvdXRBbUFtdCIIb3V0UHJBbXQiBXN0YXRlIgNlcG8iCHNsaXBwYWdlIgdpbkFtQW10IgZpbkFtSWQiB2luUHJBbXQiBmluUHJJZCIGaXNFdmFsIgZlbWl0THAiCmlzT25lQXNzZXQiEHZhbGlkYXRlU2xpcHBhZ2UiBnBtdEFtdCIFcG10SWQiB2FtSWRTdHIiB3BySWRTdHIiCWluQW1JZFN0ciIJaW5QcklkU3RyIgZhbXREY20iCHByaWNlRGNtIgRscEVtIg9pbkFtQXNzZXRBbXRYMTgiD2luUHJBc3NldEFtdFgxOCIMdXNlclByaWNlWDE4IgJEMCIBciICRDEiBmNoZWNrRCILc2xpcHBhZ2VYMTgiD3NsaXBwYWdlUmVhbFgxOCINbHBFbWlzc2lvblgxOCIKcHJWaWFBbVgxOCIKYW1WaWFQclgxOCIMZXhwZWN0ZWRBbXRzIhFleHBBbXRBc3NldEFtdFgxOCITZXhwUHJpY2VBc3NldEFtdFgxOCIJY2FsY0xwQW10Ig5jYWxjQW1Bc3NldFBtdCIOY2FsY1ByQXNzZXRQbXQiDHNsaXBwYWdlQ2FsYyIJZW1pdExwQW10IgZhbURpZmYiBnByRGlmZiINJHQwMjA1ODEyMDkyNiIKd3JpdGVBbUFtdCIKd3JpdGVQckFtdCILY29tbW9uU3RhdGUiBWdldFlEIgFEIgFuIgF4IgphUHJlY2lzaW9uIgFjIgFiIgNjdXIiDSR0MDIyMTIxMjIxNDEiAXkiBXlOZXh0IgV5RGlmZiINJHQwMjI0NDgyMjQ5NSIHY2FsY0RMcCINYW1vdW50QmFsYW5jZSIMcHJpY2VCYWxhbmNlIgpscEVtaXNzaW9uIgp1cGRhdGVkRExwIg5jYWxjQ3VycmVudERMcCIQYW1vdW50QXNzZXREZWx0YSIPcHJpY2VBc3NldERlbHRhIhRscEFzc2V0RW1pc3Npb25EZWx0YSISYW1vdW50QXNzZXRCYWxhbmNlIhFwcmljZUFzc2V0QmFsYW5jZSIPbHBBc3NldEVtaXNzaW9uIgpjdXJyZW50RExwIhJyZWZyZXNoRExwSW50ZXJuYWwiF2Ftb3VudEFzc2V0QmFsYW5jZURlbHRhIhZwcmljZUFzc2V0QmFsYW5jZURlbHRhIgdhY3Rpb25zIhJ2YWxpZGF0ZVVwZGF0ZWRETHAiBm9sZERMcCIbdmFsaWRhdGVNYXRjaGVyT3JkZXJBbGxvd2VkIgVvcmRlciIRYW1vdW50QXNzZXRBbW91bnQiEHByaWNlQXNzZXRBbW91bnQiDSR0MDI0NTM5MjQ3NTEiA2RMcCINJHQwMjUwODEyNTE4MSINdW51c2VkQWN0aW9ucyIGZExwTmV3Igxpc09yZGVyVmFsaWQiBGluZm8iAmNnIgNwbXQiAmNwIgZjYWxsZXIiB2FtQXNQbXQiB3ByQXNQbXQiDWNhbGNQdXRPbmVUa24iCXBtdEFtdFJhdyILd2l0aFRha2VGZWUiDWNoZWNoRW1pc3Npb24iDSR0MDI3NTMzMjc5OTUiDGFtQmFsYW5jZU9sZCIMcHJCYWxhbmNlT2xkIg0kdDAyODAwMTI4MTc3IgthbUFtb3VudFJhdyILcHJBbW91bnRSYXciDSR0MDI4MTgxMjg0MzUiCGFtQW1vdW50IghwckFtb3VudCIMYW1CYWxhbmNlTmV3IgxwckJhbGFuY2VOZXciCGxwQW1vdW50Ig5wb29sUHJvcG9ydGlvbiIPYW1vdW50QXNzZXRQYXJ0Ig5wcmljZUFzc2V0UGFydCIJbHBBbXRCb3RoIgVib251cyITZ2V0T25lVGtuVjJJbnRlcm5hbCIKb3V0QXNzZXRJZCIMbWluT3V0QW1vdW50IghwYXltZW50cyIMb3JpZ2luQ2FsbGVyIg10cmFuc2FjdGlvbklkIgphbURlY2ltYWxzIgpwckRlY2ltYWxzIgpwb29sU3RhdHVzIg0kdDAzMDU0NzMwNjU4Igh0b3RhbEdldCILdG90YWxBbW91bnQiDSR0MDMwODQ4MzExNTUiBW91dEFtIgVvdXRQciIIY3VyUHJYMTgiBWN1clByIhFvdXRBc3NldElkT3JXYXZlcyIQc2VuZEZlZVRvTWF0Y2hlciIEYnVybiINJHQwMzE5NDAzMjI5MCIQZmVlQW1vdW50Rm9yQ2FsYyIQb3V0SW5BbW91bnRBc3NldCINJHQwMzIyOTMzMjQwMSIRcmVmcmVzaERMcEFjdGlvbnMiEWlzVXBkYXRlZERMcFZhbGlkIgFtIgckbWF0Y2gwIgJwbSICcGQiCWlzTWFuYWdlciICcGsiAm1tIhdwZW5kaW5nTWFuYWdlclB1YmxpY0tleSICY20iA2hwbSIDY3BtIgRzbGlwIglhdXRvU3Rha2UiB2ZhY3RDZmciC3N0YWtpbmdDbnRyIghzbGlwQ250ciIKYW1Bc3NldFBtdCIKcHJBc3NldFBtdCIBZSIJbHBBc3NldElkIgJlbCIGbGVnYWN5IgJzYSICc3AiCGxwVHJuc2ZyIgJzcyINJHQwMzY1NTAzNjY5MiIFY2hlY2siFGxwQXNzZXRFbWlzc2lvbkFmdGVyIiBpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZCINaXNQdXREaXNhYmxlZCIGY2hlY2tzIg0kdDAzODMzMzM4NDkxIgdlc3RpbUxQIg0kdDAzOTMwNjM5NjU1IhRwYXltZW50SW5BbW91bnRBc3NldCINJHQwMzk2NTgzOTc2NiIHbWF4U2xwZyIGZXN0UHV0Ig0kdDA0MDc5NjQwODYxIglvdXRBbXRBbXQiDSR0MDQyMDM0NDIxMTYiDWlzR2V0RGlzYWJsZWQiDSR0MDQyNzM0NDI4ODkiGGxhc3RSZWZyZXNoZWRCbG9ja0hlaWdodCIdY2hlY2tMYXN0UmVmcmVzaGVkQmxvY2tIZWlnaHQiDSR0MDQzNDEzNDM0NzciEGRMcFVwZGF0ZUFjdGlvbnMiDWxwQXNzZXRBbW91bnQiBWluZGV4IgRuZXdZIgJkeSILdG90YWxHZXRSYXciDSR0MDQ0NDA3NDQ0NjIiDSR0MDQ0ODM3NDQ5NTIiDnN1bU9mR2V0QXNzZXRzIhJub0xlc3NUaGVuQW10QXNzZXQiFG5vTGVzc1RoZW5QcmljZUFzc2V0IhRidXJuTFBBc3NldE9uRmFjdG9yeSINJHQwNDYxMTg0NjE5OSINY2hlY2tQYXltZW50cyIKZmFjdG9yeUNmZyIHc3Rha2luZyIKdW5zdGFrZUludiIBdiIFYnVybkEiDSR0MDQ3MjI2NDczMDciDXVuc3Rha2VBbW91bnQiFW5vTGVzc1RoZW5BbW91bnRBc3NldCIDcmVzIgxjaGVja0Ftb3VudHMiDSR0MDQ4NTU4NDg2MzkiDSR0MDQ5NTM0NDk3MjIiEHBheW1lbnRBbW91bnRSYXciDnBheW1lbnRBc3NldElkIg0kdDA0OTg1MDQ5OTUzIg0kdDA1MDEwMTUwMjA1IghhbXRBc1N0ciIHcHJBc1N0ciIBayICcHIiDHJlc1NjYWxlTXVsdCIHdXNyQWRkciIHcG10QXNJZCICdHgiBnZlcmlmeSIPdGFyZ2V0UHVibGljS2V5IgptYXRjaGVyUHViIg0kdDA1Mjk5NzUzMDY2IgduZXdIYXNoIgthbGxvd2VkSGFzaCILY3VycmVudEhhc2hzAAFhAIDC1y8AAWIJALYCAQCAwtcvAAFjCQC2AgEAgICQu7rWrfANAAFkCQC2AgEAAAABZQkAtgIBAAAAAWYJALYCAQABAAFnCQC2AgEAAgABaAkAtgIBAAMAAWkJALYCAQAEAAFqAgVXQVZFUwABawIDMTAwAAFsAgJfXwABbQACAAFuAAMAAW8ABAABcAABAAFxAAIAAXIAAwABcwAEAAF0AAUAAXUABgABdgAHAAF3AAgAAXgACQABeQABAAF6AAYAAUEABwABQgkAawMACgUBYQCQTgEBQwIBRAFFCQC8AgMJALYCAQUBRAUBYwkAtgIBBQFFAQFGAgFEAUUJALwCAwUBRAUBYwUBRQEBRwIBSAFJCQCgAwEJALwCAwUBSAkAtgIBBQFJBQFjAQFKAwFIAUkBSwkAoAMBCQC9AgQFAUgJALYCAQUBSQUBYwUBSwEBTAEBSAMJAL8CAgUBZAUBSAkAvgIBBQFIBQFIAQFNAQFIAwkAvwICBQFkBQFICQC+AgEFAUgFAUgBAU4AAhMlc19fZmFjdG9yeUNvbnRyYWN0AQFPAAIUJXNfX21hbmFnZXJQdWJsaWNLZXkBAVAAAhslc19fcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkBAVEAAhElcyVzX19wcmljZV9fbGFzdAEBUgIBUwFUCQC5CQIJAMwIAgIYJXMlcyVkJWRfX3ByaWNlX19oaXN0b3J5CQDMCAIJAKQDAQUBUwkAzAgCCQCkAwEFAVQFA25pbAUBbAEBVQIBVgFXCQCsAgIJAKwCAgkArAICAgslcyVzJXNfX1BfXwUBVgICX18FAVcBAVgCAVYBVwkArAICCQCsAgIJAKwCAgILJXMlcyVzX19HX18FAVYCAl9fBQFXAQFZAAIPJXNfX2Ftb3VudEFzc2V0AQFaAAIOJXNfX3ByaWNlQXNzZXQBAmFhAAIHJXNfX2FtcAECYWIAAg0lc19fYWRkb25BZGRyAAJhYwIHJXNfX2ZlZQACYWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUCYWMFAUIAAmFlCQC5CQIJAMwIAgICJXMJAMwIAgIDZExwBQNuaWwFAWwAAmFmCQC5CQIJAMwIAgICJXMJAMwIAgISZExwUmVmcmVzaGVkSGVpZ2h0BQNuaWwFAWwAAmFnCQC5CQIJAMwIAgICJXMJAMwIAgIPcmVmcmVzaERMcERlbGF5BQNuaWwFAWwAAmFoAAEAAmFpCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFAmFnBQJhaAECYWoAAhElc19fZmFjdG9yeUNvbmZpZwECYWsAAhglcyVzX19tYXRjaGVyX19wdWJsaWNLZXkBAmFsAgJhbQJhbgkArAICCQCsAgIJAKwCAgkArAICAgglZCVkJXNfXwUCYW0CAl9fBQJhbgIIX19jb25maWcBAmFvAQJhcAkArAICAiglcyVzJXNfX21hcHBpbmdzX19iYXNlQXNzZXQyaW50ZXJuYWxJZF9fBQJhcAECYXEAAgwlc19fc2h1dGRvd24BAmFyAAIdJXNfX2FsbG93ZWRMcFN0YWJsZVNjcmlwdEhhc2gBAmFzAAIXJXNfX2ZlZUNvbGxlY3RvckFkZHJlc3MBAmF0BAJhdQJhdgJhdwJheAkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAiRvcmRlciB2YWxpZGF0aW9uIGZhaWxlZDogb3JkZXJWYWxpZD0JAKUDAQUCYXUCAiAoBQJhdgIBKQINIHNlbmRlclZhbGlkPQkApQMBBQJhdwIOIG1hdGNoZXJWYWxpZD0JAKUDAQUCYXgBAmF5AgJhegJhQQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFAmF6BQJhQQkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQJhegkAzAgCAgEuCQDMCAIFAmFBCQDMCAICDCBub3QgZGVmaW5lZAUDbmlsAgABAmFCAgJhegJhQQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFAmF6BQJhQQkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQJhegkAzAgCAgEuCQDMCAIFAmFBCQDMCAICDCBub3QgZGVmaW5lZAUDbmlsAgABAmFDAQJhRAkAAgEJALkJAgkAzAgCAg9scF9zdGFibGUucmlkZToJAMwIAgUCYUQFA25pbAIBIAECYUUBAmFECQC5CQIJAMwIAgIPbHBfc3RhYmxlLnJpZGU6CQDMCAIFAmFEBQNuaWwCASAAAmFGCQERQGV4dHJOYXRpdmUoMTA2MikBCQECYXkCBQR0aGlzCQEBTgAAAmFHCgACYUgJAPwHBAUCYUYCEGdldEluRmVlUkVBRE9OTFkJAMwIAgkApQgBBQR0aGlzBQNuaWwFA25pbAMJAAECBQJhSAIDSW50BQJhSAkAAgEJAKwCAgkAAwEFAmFIAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQAAmFJCgACYUgJAPwHBAUCYUYCEWdldE91dEZlZVJFQURPTkxZCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQABAgUCYUgCA0ludAUCYUgJAAIBCQCsAgIJAAMBBQJhSAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AAJhSgkBAmF5AgUEdGhpcwkBAmFhAAECYUsACQELdmFsdWVPckVsc2UCCQCbCAIFAmFGCQECYXEABwECYUwACQDZBAEJAQJheQIFAmFGCQECYWsAAAJhTQkBEUBleHRyTmF0aXZlKDEwNjIpAQkBAmF5AgUCYUYJAQJhcwABAmFOAAQCYU8JAQJheQIFBHRoaXMJAQFZAAQCYVAJAQJheQIFBHRoaXMJAQFaAAQCYVEJAQJhQgIFAmFGCQECYW8BBQJhUAQCYW0JAQJhQgIFAmFGCQECYW8BBQJhTwkAtQkCCQECYXkCBQJhRgkBAmFsAgkApAMBBQJhbQkApAMBBQJhUQUBbAECYVIBAmFTAwkAAAIFAmFTBQFqBQR1bml0CQDZBAEFAmFTAQJhVAECYVMDCQAAAgUCYVMFBHVuaXQFAWoJANgEAQkBBXZhbHVlAQUCYVMBAmFVAQJhVgkAmwoJCQERQGV4dHJOYXRpdmUoMTA2MikBCQCRAwIFAmFWBQFwCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYVYFAXEJANkEAQkAkQMCBQJhVgUBcgkBAmFSAQkAkQMCBQJhVgUBcwkBAmFSAQkAkQMCBQJhVgUBdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmFWBQF1CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYVYFAXYJANkEAQkAkQMCBQJhVgUBdwkA2QQBCQCRAwIFAmFWBQF4AAJhVwkBAmFVAQkBAmFOAAACYVgFAmFXAAJhWQgFAmFYAl8yAAJhWggFAmFYAl8zAAJiYQgFAmFYAl80AAJiYggFAmFYAl81AAJiYwgFAmFYAl82AAJiZAgFAmFYAl83AAJiZQgFAmFYAl84AAJiZggFAmFYAl85AQJiZwAJALUJAgkBAmF5AgUCYUYJAQJhagAFAWwAAmJoCQECYmcAAAJiaQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCYmgFAXkCIEludmFsaWQgc3Rha2luZyBjb250cmFjdCBhZGRyZXNzAAJiagkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCYmgFAXoCHEludmFsaWQgZ3d4IGNvbnRyYWN0IGFkZHJlc3MBAmJrCgJibAJibQJibgJibwJicAJicQJicgJicwJidAJidQkAuQkCCQDMCAICFCVkJWQlZCVkJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQUCYmwJAMwIAgkApAMBBQJibQkAzAgCCQCkAwEFAmJuCQDMCAIJAKQDAQUCYm8JAMwIAgkApAMBBQJicAkAzAgCCQCkAwEFAmJxCQDMCAIJAKQDAQUCYnIJAMwIAgkApAMBBQJicwkAzAgCCQCkAwEFAmJ0CQDMCAIJAKQDAQUCYnUFA25pbAUBbAECYnYGAmJ3AmJ4AmJ5AmJvAmJyAmJzCQC5CQIJAMwIAgIMJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQUCYncJAMwIAgkApAMBBQJieAkAzAgCCQCkAwEFAmJ5CQDMCAIJAKQDAQUCYm8JAMwIAgkApAMBBQJicgkAzAgCCQCkAwEFAmJzBQNuaWwFAWwBAmJ6AQJiQQMJAAACBQJiQQIFV0FWRVMICQDvBwEFBHRoaXMJYXZhaWxhYmxlCQDwBwIFBHRoaXMJANkEAQUCYkEBAmJCAgJiQwJiRAkAvAIDBQJiQwUBYwUCYkQBAmJFAwJiQwJiRAFLCQC9AgQFAmJDBQFjBQJiRAUBSwECYkYEAmJHAmJIAmJJAmJKBAJiSwkBAUMCBQJiSQUCYkcEAmJMCQEBQwIFAmJKBQJiSAkBAmJCAgUCYkwFAmJLAQJiTQMCYkkCYkoCYk4EAmJPBQJiYwQCYlAFAmJkBAJiUQkBAmJGBAUCYk8FAmJQBQJiSQUCYkoEAmJECQEBQwIFAmJJBQJiTwQCYkMJAQFDAgUCYkoFAmJQBAJiUgkBAUMCBQJiTgUBYQQCYlMJAQJiQgIFAmJEBQJiUgQCYlQJAQJiQgIFAmJDBQJiUgkAzAgCBQJiUQkAzAgCBQJiUwkAzAgCBQJiVAUDbmlsAQJiVQICYlYCYWQEAmJXAwkAAAIFAmFkAAAAAAkAawMFAmJWBQJhZAUBYQkAlAoCCQBlAgUCYlYFAmJXBQJiVwECYlgBAmJZBAJiWgkAkQMCBQJiWQAABAJjYQkAkQMCBQJiWQABBAJjYgkAtwICBQJiWgUCY2EDCQAAAgUCY2IFAWUFAWUEAmNjCQENcGFyc2VJbnRWYWx1ZQEFAmFKBAJjZAkAaAIFAmNjAAIEAmNlCQC8AgMFAmJaBQJjYQUBZgQCY2YJALwCAwUCY2UFAWkFAWYEAmNnCQC8AgMJALYCAQUCY2QFAmNiBQFmBAJjaAkAtgIBCQBlAgUCY2QAAQoBAmNpAQJjagQCY2sJALwCAwUCY2oFAmNqBQFmBAJjbAkAvAIDBQJjawUCY2oFAWYEAmNtCQC8AgMFAmNsBQFmBQJjZgkAvAIDCQC3AgIFAmNnCQC8AgMFAmNtBQFnBQFmBQJjagkAtwICCQC8AgMFAmNoBQJjagUBZgkAvAIDBQFoBQJjbQUBZgoBAmNuAgJjbwJjcAMIBQJjbwJfMgUCY28EAmNqCAUCY28CXzEEAmNxCQECY2kBBQJjagQCY3IJALgCAgUCY3EJAQV2YWx1ZQEFAmNqBAJjcwMJAL8CAgUBZQUCY3IJAL4CAQUCY3IFAmNyAwkAwAICBQFmBQJjcwkAlAoCBQJjcQYJAJQKAgUCY3EHBAJjdAkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQkAzAgCAAYJAMwIAgAHCQDMCAIACAkAzAgCAAkJAMwIAgAKCQDMCAIACwkAzAgCAAwJAMwIAgANCQDMCAIADgUDbmlsBAJjdQoAAmN2BQJjdAoAAmN3CQCQAwEFAmN2CgACY3gJAJQKAgUCY2IHCgECY3kCAmN6AmNBAwkAZwIFAmNBBQJjdwUCY3oJAQJjbgIFAmN6CQCRAwIFAmN2BQJjQQoBAmNCAgJjegJjQQMJAGcCBQJjQQUCY3cFAmN6CQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQJjQgIJAQJjeQIJAQJjeQIJAQJjeQIJAQJjeQIJAQJjeQIJAQJjeQIJAQJjeQIJAQJjeQIJAQJjeQIJAQJjeQIJAQJjeQIJAQJjeQIJAQJjeQIJAQJjeQIJAQJjeQIFAmN4AAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8EAmNqCAUCY3UCXzEEAmNDCAUCY3UCXzIDBQJjQwUCY2oJAAIBCQCsAgICGUQgY2FsY3VsYXRpb24gZXJyb3IsIEQgPSAJAKYDAQUCY2oBAmNEBAJjRQJjRgJjRwJjSAQCY0kFAmFaBAJjSgkA2AQBCQEFdmFsdWUBBQJiYQQCY0sJANgEAQkBBXZhbHVlAQUCYmIEAmNMBQJiYwQCY00FAmJkBAJjTgkApAMBBQJhWQQCY08ICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUCY0kCC1dyb25nIExQIGlkCHF1YW50aXR5AwkBAiE9AgkA2AQBBQJjSQUCY0YJAAIBAg9Xcm9uZyBwbXQgYXNzZXQEAmNQCQECYnoBBQJjSgQCY1EJAQFDAgUCY1AFAmNMBAJjUgkBAmJ6AQUCY0sEAmNTCQEBQwIFAmNSBQJjTQQCY1QJAQJiQgIFAmNTBQJjUQQCY1UJAQFHAgUCY1QFAWEEAmNWCQEBQwIFAmNHBQFhBAJjVwkBAUMCBQJjTwUBYQQCY1gJALwCAwUCY1EFAmNWBQJjVwQCY1kJALwCAwUCY1MFAmNWBQJjVwQCY1oJAQFKAwUCY1gFAmNMBQVGTE9PUgQCZGEJAQFKAwUCY1kFAmNNBQVGTE9PUgQCZGIDCQAAAgUCY0UCAAUDbmlsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmNIBQJjWgMJAAACBQJjSgIFV0FWRVMFBHVuaXQJANkEAQUCY0oJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUCY0gFAmRhAwkAAAIFAmNLAgVXQVZFUwUEdW5pdAkA2QQBBQJjSwkAzAgCCQELU3RyaW5nRW50cnkCCQEBWAIJAKUIAQUCY0gFAmNFCQECYnYGBQJjWgUCZGEFAmNHBQJjVQUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVEABQJjVQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVICBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQJjVQUDbmlsCQCcCgoFAmNaBQJkYQUCY0oFAmNLBQJjUAUCY1IFAmNPBQJjVAUCY04FAmRiAQJkYw0CY0UCZGQCZGUCZGYCZGcCZGgCY0gCZGkCZGoCZGsCZGwCZG0CZG4EAmNJBQJhWgQCZG8JANgEAQkBBXZhbHVlAQUCYmEEAmRwCQDYBAEJAQV2YWx1ZQEFAmJiBAJkcQUCYmUEAmRyBQJiZgQCZHMFAmJjBAJkdAUCYmQEAmNOCQCkAwEFAmFZBAJkdQgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBBQJjSQIIV3IgbHAgYXMIcXVhbnRpdHkEAmNQAwUCZGkJAQJiegEFAmRvAwMFAmRrCQAAAgUCZG4FAmRvBwkAZQIJAQJiegEFAmRvBQJkbQMFAmRrCQECYnoBBQJkbwkAZQIJAQJiegEFAmRvBQJkZQQCY1IDBQJkaQkBAmJ6AQUCZHADAwUCZGsJAAACBQJkbgUCZHAHCQBlAgkBAmJ6AQUCZHAFAmRtAwUCZGsJAQJiegEFAmRwCQBlAgkBAmJ6AQUCZHAFAmRnBAJkdgkBAUMCBQJkZQUCZHMEAmR3CQEBQwIFAmRnBQJkdAQCZHgJAQJiQgIFAmR3BQJkdgQCY1EJAQFDAgUCY1AFAmRzBAJjUwkBAUMCBQJjUgUCZHQEAmR5CQECYlgBCQDMCAIFAmNRCQDMCAIFAmNTBQNuaWwEAmR6AwkAAAIFAmR1AAAEAmRBCQECYlgBCQDMCAIJALcCAgUCY1EFAmR2CQDMCAIJALcCAgUCY1MFAmR3BQNuaWwEAmRCAwkAvwICBQJkQQUCZHkGCQACAQIcRDEgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiBEMAMJAAACBQJkQgUCZEIEAmNUBQFkBAJkQwUBZAQCYlIJAHYGCQC5AgIFAmR2BQJkdwAACQC2AgEABQABAAAFBERPV04JAJcKBQkBAUcCBQJiUgUBYQkBAUcCBQJkdgUCZHMJAQFHAgUCZHcFAmR0CQECYkICCQC3AgIFAmNTBQJkdwkAtwICBQJjUQUCZHYFAmRDCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAJjVAkBAmJCAgUCY1MFAmNRBAJkRAkAvAIDCQEBTAEJALgCAgUCY1QFAmR4BQFjBQJjVAQCZEMJAQFDAgUCZGQFAWEDAwMFAmRsCQECIT0CBQJjVAUBZAcJAL8CAgUCZEQFAmRDBwkAAgEJAKwCAgkArAICCQCsAgICD1ByaWNlIHNsaXBwYWdlIAkApgMBBQJkRAIDID4gCQCmAwEFAmRDBAJkRQkBAUMCBQJkdQUBYQQCZEYJAL0CBAUCZHYJAQJiRQMFAmNTBQJjUQUHQ0VJTElORwUBYwUHQ0VJTElORwQCZEcJAL0CBAUCZHcFAWMJAQJiRQMFAmNTBQJjUQUFRkxPT1IFB0NFSUxJTkcEAmRIAwkAvwICBQJkRgUCZHcJAJQKAgUCZEcFAmR3CQCUCgIFAmR2BQJkRgQCZEkIBQJkSAJfMQQCZEoIBQJkSAJfMgQCYlIJAL0CBAUCZEUFAmRKBQJjUwUFRkxPT1IJAJcKBQkBAUoDBQJiUgUBYQUFRkxPT1IJAQFKAwUCZEkFAmRzBQdDRUlMSU5HCQEBSgMFAmRKBQJkdAUHQ0VJTElORwUCY1QFAmRDBAJkSwgFAmR6Al8xBAJkTAgFAmR6Al8yBAJkTQgFAmR6Al8zBAJjVQkBAUcCCAUCZHoCXzQFAWEEAmROCQEBRwIIBQJkegJfNQUBYQMJAGcCAAAFAmRLCQACAQIHTFAgPD0gMAQCZE8DCQEBIQEFAmRqAAAFAmRLBAJkUAkAZQIFAmRlBQJkTAQCZFEJAGUCBQJkZwUCZE0EAmRSAwMFAmRrCQAAAgUCZG4FAmRvBwkAlAoCBQJkbQAAAwMFAmRrCQAAAgUCZG4FAmRwBwkAlAoCAAAFAmRtCQCUCgIFAmRMBQJkTQQCZFMIBQJkUgJfMQQCZFQIBQJkUgJfMgQCZFUJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFRAAUCY1UJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFSAgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUCY1UJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVUCBQJjSAUCY0UJAQJiawoFAmRTBQJkVAUCZE8FAmNVBQJkZAUCZE4FBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFAmRQBQJkUQUDbmlsCQCfCg0FAmRLBQJkTwUCY1UFAmNQBQJjUgUCZHUFAmNJBQJjTgUCZFUFAmRQBQJkUQUCZGYFAmRoAQJkVgMCYlkCY3ACZFcEAmRYBQFnBAJkWQkAkQMCBQJiWQMJAAACBQJjcAAAAAEAAAQCZFoJAKcDAQUBawQCY2MJALkCAgkApwMBBQJhSgUCZFoEAmNiBQJkWQQCY2QJALkCAgUCY2MFAmRYBAJlYQkAugICCQC5AgIJALkCAgkAugICCQC5AgIFAmRXBQJkVwkAuQICBQJkWQUCZFgFAmRXBQJkWgkAuQICBQJjZAUCZFgEAmViCQC4AgIJALcCAgUCY2IJALoCAgkAuQICBQJkVwUCZFoFAmNkBQJkVwoBAmNuAgJjbwJlYwQCZWQFAmNvBAJlZQgFAmVkAl8xBAJjQwgFAmVkAl8yAwkBAiE9AgUCY0MFBHVuaXQFAmNvBAJlZgkAugICCQC3AgIJALkCAgUCZWUFAmVlBQJlYQkAtwICCQC5AgIFAWcFAmVlBQJlYgQCZWcJAQFNAQkAuAICBQJlZgkBBXZhbHVlAQUCZWUDCQDAAgIFAWYFAmVnCQCUCgIFAmVmBQJlYwkAlAoCBQJlZgUEdW5pdAQCY3QJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJCQDMCAIACgkAzAgCAAsJAMwIAgAMCQDMCAIADQkAzAgCAA4FA25pbAQCZWgKAAJjdgUCY3QKAAJjdwkAkAMBBQJjdgoAAmN4CQCUCgIFAmRXBQR1bml0CgECY3kCAmN6AmNBAwkAZwIFAmNBBQJjdwUCY3oJAQJjbgIFAmN6CQCRAwIFAmN2BQJjQQoBAmNCAgJjegJjQQMJAGcCBQJjQQUCY3cFAmN6CQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQJjQgIJAQJjeQIJAQJjeQIJAQJjeQIJAQJjeQIJAQJjeQIJAQJjeQIJAQJjeQIJAQJjeQIJAQJjeQIJAQJjeQIJAQJjeQIJAQJjeQIJAQJjeQIJAQJjeQIJAQJjeQIFAmN4AAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8EAmVlCAUCZWgCXzEEAmNDCAUCZWgCXzIDCQECIT0CBQJjQwUEdW5pdAUCZWUJAAIBCQCsAgICGVkgY2FsY3VsYXRpb24gZXJyb3IsIFkgPSAJAKYDAQUCZWUBAmVpAwJlagJlawJlbAQCZW0JALwCAwkBAmJYAQkAzAgCCQEBRgIFAmVqCQC2AgEFAmJjCQDMCAIJAQFGAgUCZWsJALYCAQUCYmQFA25pbAUBYwUCZWwDCQAAAgUCZWwFAWUFAWUFAmVtAQJlbgMCZW8CZXACZXEEAmVyCQC4AgIJALYCAQkBAmJ6AQkBAmFUAQUCYmEFAmVvBAJlcwkAuAICCQC2AgEJAQJiegEJAQJhVAEFAmJiBQJlcAQCZXQJALgCAgkAtgIBCAkBBXZhbHVlAQkA7AcBBQJhWghxdWFudGl0eQUCZXEEAmV1CQECZWkDBQJlcgUCZXMFAmV0BQJldQECZXYDAmV3AmV4AmVxBAJlcgkAZAIJAQJiegEJAQJhVAEFAmJhBQJldwQCZXMJAGQCCQECYnoBCQECYVQBBQJiYgUCZXgEAmV0CQBkAggJAQV2YWx1ZQEJAOwHAQUCYVoIcXVhbnRpdHkFAmVxBAJlbQkBAmVpAwkAtgIBBQJlcgkAtgIBBQJlcwkAtgIBBQJldAQCZXkJAMwIAgkBDEludGVnZXJFbnRyeQIFAmFmBQZoZWlnaHQJAMwIAgkBC1N0cmluZ0VudHJ5AgUCYWUJAKYDAQUCZW0FA25pbAkAlAoCBQJleQUCZW0BAmV6AgJlQQJlbQMJAMACAgUCZW0FAmVBBgkBAmFDAQIidXBkYXRlZCBETHAgbG93ZXIgdGhhbiBjdXJyZW50IERMcAECZUIBAmVDBAJlRAgFAmVDBmFtb3VudAQCZUUJAG4ECAUCZUMGYW1vdW50CAUCZUMFcHJpY2UFAWEFBUZMT09SBAJlRgMJAAACCAUCZUMJb3JkZXJUeXBlBQNCdXkJAJQKAgUCZUQJAQEtAQUCZUUJAJQKAgkBAS0BBQJlRAUCZUUEAmV3CAUCZUYCXzEEAmV4CAUCZUYCXzIDAwMJAQJhSwAGCQAAAgUCYVkFAW4GCQAAAgUCYVkFAW8JAAIBAg1BZG1pbiBibG9ja2VkAwMJAQIhPQIICAUCZUMJYXNzZXRQYWlyC2Ftb3VudEFzc2V0BQJiYQYJAQIhPQIICAUCZUMJYXNzZXRQYWlyCnByaWNlQXNzZXQFAmJiCQACAQIJV3IgYXNzZXRzBAJlRwkApwMBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzBQJhZQQCZUgJAQJldgMFAmV3BQJleAAABAJlSQgFAmVIAl8xBAJlSggFAmVIAl8yBAJlSwkAwAICBQJlSgUCZUcEAmVMCQC5CQIJAMwIAgkApgMBBQJlRwkAzAgCCQCmAwEFAmVKBQNuaWwCASAJAJQKAgUCZUsFAmVMAQJlTQECY3ADCQECIT0CCQCQAwEIBQJjcAhwYXltZW50cwABCQACAQIKMSBwbW50IGV4cAQCZU4JAQV2YWx1ZQEJAJEDAggFAmNwCHBheW1lbnRzAAAEAmNGCQEFdmFsdWUBCAUCZU4HYXNzZXRJZAQCZG0IBQJlTgZhbW91bnQEAmR6CQECY0QECQDYBAEIBQJjcA10cmFuc2FjdGlvbklkCQDYBAEFAmNGBQJkbQgFAmNwBmNhbGxlcgQCY1oIBQJkegJfMQQCZGEIBQJkegJfMgQCY04JAQ1wYXJzZUludFZhbHVlAQgFAmR6Al85BAJkYggFAmR6A18xMAMDCQECYUsABgkAAAIFAmNOBQFvCQACAQkArAICAg9BZG1pbiBibG9ja2VkOiAJAKQDAQUCY04JAJcKBQUCY1oFAmRhBQJkbQUCY0YFAmRiAQJlTwoCZVABVwJlUQJlUgJkZAJkagJkawJkbAJkbQJkbgQCZHoJAQJkYw0FAVcFAmRkCAkBBXZhbHVlAQUCZVEGYW1vdW50CAkBBXZhbHVlAQUCZVEHYXNzZXRJZAgJAQV2YWx1ZQEFAmVSBmFtb3VudAgJAQV2YWx1ZQEFAmVSB2Fzc2V0SWQFAmVQCQAAAgUBVwIABQJkagUCZGsFAmRsBQJkbQUCZG4EAmNOCQENcGFyc2VJbnRWYWx1ZQEIBQJkegJfOAMDAwkBAmFLAAYJAAACBQJjTgUBbQYJAAACBQJjTgUBbwkAAgEJAKwCAgIIQmxvY2tlZDoJAKQDAQUCY04FAmR6AQJlUwUCZVQCY0YCY0gBVwJlVQQCY0oJANgEAQkBBXZhbHVlAQUCYmEEAmNLCQDYBAEJAQV2YWx1ZQEFAmJiBAJjSQUCYVoEAmRzBQJiYwQCZHQFAmJkBAJldAkAtgIBCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFAmNJAhBpbnZhbGlkIGxwIGFzc2V0CHF1YW50aXR5BAJlVgMJAL8CAgUCZXQFAWUGCQACAQIiaW5pdGlhbCBkZXBvc2l0IHJlcXVpcmVzIGFsbCBjb2lucwMJAAACBQJlVgUCZVYEAmNQCQECYnoBBQJjSgQCY1IJAQJiegEFAmNLBAJlVwMJAAACBQFXAgAJAJQKAgUCY1AFAmNSAwkAAAIFAmNGBQJjSgMJAGYCBQJlVAUCY1AJAAIBAhZpbnZhbGlkIHBheW1lbnQgYW1vdW50CQCUCgIJAGUCBQJjUAUCZVQFAmNSAwkAAAIFAmNGBQJjSwMJAGYCBQJlVAUCY1IJAAIBAhZpbnZhbGlkIHBheW1lbnQgYW1vdW50CQCUCgIFAmNQCQBlAgUCY1IFAmVUCQACAQIQd3JvbmcgcG10QXNzZXRJZAQCZVgIBQJlVwJfMQQCZVkIBQJlVwJfMgQCZVoDCQAAAgUCY0YFAmNKCQCUCgIFAmVUAAADCQAAAgUCY0YFAmNLCQCUCgIAAAUCZVQJAAIBAg9pbnZhbGlkIHBheW1lbnQEAmZhCAUCZVoCXzEEAmZiCAUCZVoCXzIEAmZjAwUCZVUJAJUKAwgJAQJiVQIFAmZhBQJhRwJfMQgJAQJiVQIFAmZiBQJhRwJfMQgJAQJiVQIFAmVUBQJhRwJfMgkAlQoDBQJmYQUCZmIAAAQCZmQIBQJmYwJfMQQCZmUIBQJmYwJfMgQCYlcIBQJmYwJfMwQCZmYJAGQCBQJlWAUCZmQEAmZnCQBkAgUCZVkFAmZlBAJkeQkBAmJYAQkAzAgCCQEBQwIFAmVYBQJiYwkAzAgCCQEBQwIFAmVZBQJiZAUDbmlsBAJkQQkBAmJYAQkAzAgCCQEBQwIFAmZmBQJiYwkAzAgCCQEBQwIFAmZnBQJiZAUDbmlsBAJkQgMJAL8CAgUCZEEFAmR5BgkBBXRocm93AAMJAAACBQJkQgUCZEIEAmZoCQC9AgQFAmV0CQC4AgIFAmRBBQJkeQUCZHkFBUZMT09SBAJjVQkBAUcCCQECYkICCQEBQwIFAmZnBQJkdAkBAUMCBQJmZgUCZHMFAWEEAmRVCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBUQAFAmNVCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBUgIFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFAmNVCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFVAgUCY0gFAVcJAQJiawoFAmZhBQJmYgkAoAMBBQJmaAUCY1UAAAAABQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wAAAAAAUDbmlsBAJmaQkAawMFAmVZBQFhBQJlWAQCZmoJAGsDBQJlVAUBYQkAZAIFAmZpBQFhBAJmawkAZQIFAmVUBQJmagQCZmwJALwCAwUCZXQJALYCAQUCZmsJALYCAQUCZVkEAmZtCQCgAwEJALwCAwkAuAICBQJmaAUCZmwFAWIFAmZsCQCWCgQJAKADAQUCZmgFAmRVBQJiVwUCZm0JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAmZuBgJmbwJmcAJmcQJlUAJmcgJmcwQCY0kJANgEAQkBBXZhbHVlAQUCYVoEAmNKCQDYBAEJAQV2YWx1ZQEFAmJhBAJjSwkA2AQBCQEFdmFsdWUBBQJiYgQCZnQFAmJjBAJmdQUCYmQEAmZ2BQJhWQQCY0gDCQAAAgUCZVAFAmJqBQJmcgUCZVAEAmVOCQEFdmFsdWUBCQCRAwIFAmZxAAAEAmNGCQEFdmFsdWUBCAUCZU4HYXNzZXRJZAQCZG0IBQJlTgZhbW91bnQEAmV1CQECZW4DBQFlBQFlBQFlAwkAAAIFAmV1BQJldQQCY0UJANgEAQUCZnMDCQECIT0CBQJjSQkA2AQBBQJjRgkAAgECCFdyb25nIExQBAJjUAkBAmJ6AQUCY0oEAmNSCQECYnoBBQJjSwQCZncKAAJhSAkA/AcEBQR0aGlzAhNnZXRPbmVUa25WMlJFQURPTkxZCQDMCAIFAmZvCQDMCAIFAmRtBQNuaWwFA25pbAMJAAECBQJhSAIKKEludCwgSW50KQUCYUgJAAIBCQCsAgIJAAMBBQJhSAIfIGNvdWxkbid0IGJlIGNhc3QgdG8gKEludCwgSW50KQMJAAACBQJmdwUCZncEAmJXCAUCZncCXzIEAmZ4CAUCZncCXzEEAmZ5AwMJAGYCBQJmcAAACQBmAgUCZnAFAmZ4BwkBAmFDAQkAuQkCCQDMCAICH2Ftb3VudCB0byByZWNlaXZlIGlzIGxlc3MgdGhhbiAJAMwIAgkApAMBBQJmcAUDbmlsAgAFAmZ4BAJmegMJAAACBQJmbwUCY0oJAJYKBAUCZnkAAAkAZQIJAGUCBQJjUAUCZnkFAmJXBQJjUgMJAAACBQJmbwUCY0sJAJYKBAAABQJmeQUCY1AJAGUCCQBlAgUCY1IFAmZ5BQJiVwkAAgECFGludmFsaWQgb3V0IGFzc2V0IGlkBAJmQQgFAmZ6Al8xBAJmQggFAmZ6Al8yBAJmZggFAmZ6Al8zBAJmZwgFAmZ6Al80BAJmQwkBAmJCAgkBAUMCBQJmZwUCZnUJAQFDAgUCZmYFAmZ0BAJmRAkBAUcCBQJmQwUBYQQCZkUDCQAAAgUCZm8CBVdBVkVTBQR1bml0CQDZBAEFAmZvBAJmRgMJAGYCBQJiVwAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmFNBQJiVwUCZkUFA25pbAUDbmlsBAJkYgkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmNIBQJmeQUCZkUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVgCCQClCAEFAmNIBQJjRQkBAmJ2BgUCZkEFAmZCBQJkbQUCZkQFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFRAAUCZkQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFSAgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUCZkQFA25pbAUCZkYDCQAAAgUCZGIFAmRiBAJmRwkA/AcEBQJhRgIEYnVybgkAzAgCBQJkbQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJjRgUCZG0FA25pbAMJAAACBQJmRwUCZkcEAmZIBAJmSQMJAAACBQR0aGlzBQJhTQAABQJiVwQCZkoDCQAAAgkBAmFSAQUCZm8FAmJhBgcDBQJmSgkAlAoCCQEBLQEJAGQCBQJmeAUCZkkAAAkAlAoCAAAJAQEtAQkAZAIFAmZ4BQJmSQQCZXcIBQJmSAJfMQQCZXgIBQJmSAJfMgQCZksJAQJldgMFAmV3BQJleAAABAJmTAgFAmZLAl8xBAJlbQgFAmZLAl8yBAJmTQkBAmV6AgUCZXUFAmVtAwkAAAIFAmZNBQJmTQkAlAoCCQDOCAIFAmRiBQJmTAUCZnkJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAmZOAAQCZk8JAKIIAQkBAU8AAwkAAQIFAmZPAgZTdHJpbmcEAmNiBQJmTwkA2QQBBQJjYgMJAAECBQJmTwIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAQJmUAAEAmZPCQCiCAEJAQFQAAMJAAECBQJmTwIGU3RyaW5nBAJjYgUCZk8JANkEAQUCY2IDCQABAgUCZk8CBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgACZlEJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAECZlIBAmNwBAJmTwkBAmZOAAMJAAECBQJmTwIKQnl0ZVZlY3RvcgQCZlMFAmZPCQAAAggFAmNwD2NhbGxlclB1YmxpY0tleQUCZlMDCQABAgUCZk8CBFVuaXQJAAACCAUCY3AGY2FsbGVyBQR0aGlzCQACAQILTWF0Y2ggZXJyb3IBAmZUAQJjcAQCZk8JAQJmTgADCQABAgUCZk8CCkJ5dGVWZWN0b3IEAmZTBQJmTwMJAAACCAUCY3APY2FsbGVyUHVibGljS2V5BQJmUwYFAmZRAwkAAQIFAmZPAgRVbml0AwkAAAIIBQJjcAZjYWxsZXIFBHRoaXMGBQJmUQkAAgECC01hdGNoIGVycm9yHAJjcAELY29uc3RydWN0b3IBAU4EAmVhCQECZlQBBQJjcAMJAAACBQJlYQUCZWEJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAU4ABQFOBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CY3ABCnNldE1hbmFnZXIBAmZVBAJlYQkBAmZUAQUCY3ADCQAAAgUCZWEFAmVhBAJmVgkA2QQBBQJmVQMJAAACBQJmVgUCZlYJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVAABQJmVQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmNwAQ5jb25maXJtTWFuYWdlcgAEAmNlCQECZlAABAJmVwMJAQlpc0RlZmluZWQBBQJjZQYJAAIBAhJObyBwZW5kaW5nIG1hbmFnZXIDCQAAAgUCZlcFAmZXBAJmWAMJAAACCAUCY3APY2FsbGVyUHVibGljS2V5CQEFdmFsdWUBBQJjZQYJAAIBAhtZb3UgYXJlIG5vdCBwZW5kaW5nIG1hbmFnZXIDCQAAAgUCZlgFAmZYCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFPAAkA2AQBCQEFdmFsdWUBBQJjZQkAzAgCCQELRGVsZXRlRW50cnkBCQEBUAAFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJjcAEDcHV0AgJmWQJmWgQCZ2EJAQJiZwAEAmdiCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJnYQUBeQIKV3Igc3QgYWRkcgQCZ2MJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmdhBQFBAgpXciBzbCBhZGRyAwkAZgIAAAUCZlkJAAIBAg5Xcm9uZyBzbGlwcGFnZQMJAQIhPQIJAJADAQgFAmNwCHBheW1lbnRzAAIJAAIBAgwyIHBtbnRzIGV4cGQEAmdkCQC2AgEICQEFdmFsdWUBCQCRAwIIBQJjcAhwYXltZW50cwAABmFtb3VudAQCZ2UJALYCAQgJAQV2YWx1ZQEJAJEDAggFAmNwCHBheW1lbnRzAAEGYW1vdW50BAJlcgkAuAICCQC2AgEJAQJiegEJAQJhVAEFAmJhBQJnZAMJAAACBQJlcgUCZXIEAmVzCQC4AgIJALYCAQkBAmJ6AQkBAmFUAQUCYmIFAmdlAwkAAAIFAmVzBQJlcwQCZXQJALYCAQgJAQV2YWx1ZQEJAOwHAQUCYVoIcXVhbnRpdHkDCQAAAgUCZXQFAmV0BAJldQkBAmVuAwUCZ2QFAmdlCQC2AgEAAAMJAAACBQJldQUCZXUEAmdmCQECZU8KCQClCAEIBQJjcAZjYWxsZXIJANgEAQgFAmNwDXRyYW5zYWN0aW9uSWQJAQ9BdHRhY2hlZFBheW1lbnQCCAkBBXZhbHVlAQkAkQMCCAUCY3AIcGF5bWVudHMAAAdhc3NldElkCAkBBXZhbHVlAQkAkQMCCAUCY3AIcGF5bWVudHMAAAZhbW91bnQJAJEDAggFAmNwCHBheW1lbnRzAAEFAmZZBgcGAAACAAQCZE8IBQJnZgJfMgQCZ2cIBQJnZgJfNwQCZGIIBQJnZgJfOQQCZFAIBQJnZgNfMTAEAmRRCAUCZ2YDXzExBAJjSggFAmdmA18xMgQCY0sIBQJnZgNfMTMEAmR6CQD8BwQFAmFGAgRlbWl0CQDMCAIFAmRPBQNuaWwFA25pbAMJAAACBQJkegUCZHoEAmdoBAJmTwUCZHoDCQABAgUCZk8CB0FkZHJlc3MEAmdpBQJmTwkA/AcEBQJnaQIEZW1pdAkAzAgCBQJkTwUDbmlsBQNuaWwFBHVuaXQDCQAAAgUCZ2gFAmdoBAJnagMJAGYCBQJkUAAACQD8BwQFAmdjAgNwdXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCY0oFAmRQBQNuaWwFA25pbAMJAAACBQJnagUCZ2oEAmdrAwkAZgIFAmRRAAAJAPwHBAUCZ2MCA3B1dAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJjSwUCZFEFA25pbAUDbmlsAwkAAAIFAmdrBQJnawQCZ2wDBQJmWgQCZ20JAPwHBAUCZ2ICBXN0YWtlBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmdnBQJkTwUDbmlsAwkAAAIFAmdtBQJnbQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQJjcAZjYWxsZXIFAmRPBQJnZwUDbmlsBAJnbgkBAmV2AwAAAAAAAAQCZkwIBQJnbgJfMQQCZW0IBQJnbgJfMgQCZ28DCQDAAgIFAmVtBQJldQYJAQJhQwEJALkJAgkAzAgCAiJ1cGRhdGVkIERMcCBsb3dlciB0aGFuIGN1cnJlbnQgRExwCQDMCAIJAKYDAQUCZXIJAMwIAgkApgMBBQJlcwkAzAgCCQCmAwEFAmV0CQDMCAIJAKYDAQUCZXUJAMwIAgkApgMBBQJlbQkAzAgCCQCkAwEFAmRQCQDMCAIJAKQDAQUCZFEFA25pbAIBIAMJAAACBQJnbwUCZ28EAmdwCAkBBXZhbHVlAQkA7AcBBQJhWghxdWFudGl0eQMJAAACBQJncAUCZ3AJAM4IAgkAzggCBQJkYgUCZ2wFAmZMCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmNwAQtwdXRPbmVUa25WMgICZnACZloEAmdxCgACYUgJAPwHBAUCYUYCKGlzUG9vbE9uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkUkVBRE9OTFkJAMwIAgkApQgBBQR0aGlzBQNuaWwFA25pbAMJAAECBQJhSAIHQm9vbGVhbgUCYUgJAAIBCQCsAgIJAAMBBQJhSAIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgQCZ3IDAwMJAQJhSwAGCQAAAgUCYVkFAW0GCQAAAgUCYVkFAW8GBQJncQQCZ3MJAMwIAgMDCQEBIQEFAmdyBgkBAmZSAQUCY3AGCQECYUMBAiFwdXQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgYWRtaW4JAMwIAgMJAAACCQCQAwEIBQJjcAhwYXltZW50cwABBgkBAmFDAQIeZXhhY3RseSAxIHBheW1lbnQgYXJlIGV4cGVjdGVkBQNuaWwDCQAAAgUCZ3MFAmdzBAJjSgkA2AQBCQEFdmFsdWUBBQJiYQQCY0sJANgEAQkBBXZhbHVlAQUCYmIEAmNJBQJhWgQCZnQFAmJjBAJmdQUCYmQEAmNIAwkAAAIIBQJjcAZjYWxsZXIFBHRoaXMIBQJjcAxvcmlnaW5DYWxsZXIIBQJjcAZjYWxsZXIEAmVOCQEFdmFsdWUBCQCRAwIIBQJjcAhwYXltZW50cwAABAJjRgkA2AQBCQEFdmFsdWUBCAUCZU4HYXNzZXRJZAQCZG0IBQJlTgZhbW91bnQEAmV1AwkAAAIIBQJlTgdhc3NldElkBQJiYQkBAmVuAwkAtgIBBQJkbQkAtgIBAAAJALYCAQAACQECZW4DCQC2AgEAAAkAtgIBBQJkbQkAtgIBAAADCQAAAgUCZXUFAmV1BAJndAkBAmVTBQUCZG0FAmNGCQClCAEFAmNICQDYBAEIBQJjcA10cmFuc2FjdGlvbklkBgMJAAACBQJndAUCZ3QEAmJXCAUCZ3QCXzMEAmRiCAUCZ3QCXzIEAmd1CAUCZ3QCXzEEAmRPAwMJAGYCBQJmcAAACQBmAgUCZnAFAmd1BwkBAmFDAQkAuQkCCQDMCAICH2Ftb3VudCB0byByZWNlaXZlIGlzIGxlc3MgdGhhbiAJAMwIAgkApAMBBQJmcAUDbmlsAgAFAmd1BAJnZgkA/AcEBQJhRgIEZW1pdAkAzAgCBQJkTwUDbmlsBQNuaWwDCQAAAgUCZ2YFAmdmBAJnaAQCZk8FAmdmAwkAAQIFAmZPAgdBZGRyZXNzBAJnaQUCZk8JAPwHBAUCZ2kCBGVtaXQJAMwIAgUCZE8FA25pbAUDbmlsBQR1bml0AwkAAAIFAmdoBQJnaAQCZ2wDBQJmWgQCZ20JAPwHBAUCYmkCBXN0YWtlBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmNJBQJkTwUDbmlsAwkAAAIFAmdtBQJnbQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQJjcAZjYWxsZXIFAmRPBQJjSQUDbmlsBAJmRgMJAGYCBQJiVwAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmFNBQJiVwkA2QQBBQJjRgUDbmlsBQNuaWwEAmd2AwkAAAIFBHRoaXMFAmFNCQCUCgIAAAAABAJndwMJAAACCAUCZU4HYXNzZXRJZAUCYmEGBwMFAmd3CQCUCgIJAQEtAQUCYlcAAAkAlAoCAAAJAQEtAQUCYlcEAmV3CAUCZ3YCXzEEAmV4CAUCZ3YCXzIEAmd4CQECZXYDBQJldwUCZXgAAAQCZkwIBQJneAJfMQQCZW0IBQJneAJfMgQCZk0JAQJlegIFAmV1BQJlbQMJAAACBQJmTQUCZk0JAJQKAgkAzggCCQDOCAIJAM4IAgUCZGIFAmdsBQJmRgUCZkwFAmRPCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmNwAQpwdXRGb3JGcmVlAQJneQMJAGYCAAAFAmd5CQACAQIKV3Jvbmcgc2xwZwMJAQIhPQIJAJADAQgFAmNwCHBheW1lbnRzAAIJAAIBAgwyIHBtbnRzIGV4cGQEAmd6CQECZU8KCQClCAEIBQJjcAZjYWxsZXIJANgEAQgFAmNwDXRyYW5zYWN0aW9uSWQJAQ9BdHRhY2hlZFBheW1lbnQCCAkBBXZhbHVlAQkAkQMCCAUCY3AIcGF5bWVudHMAAAdhc3NldElkCAkBBXZhbHVlAQkAkQMCCAUCY3AIcGF5bWVudHMAAAZhbW91bnQJAJEDAggFAmNwCHBheW1lbnRzAAEFAmd5BwcGAAACAAQCZGIIBQJnegJfOQQCZ2QJALYCAQgJAQV2YWx1ZQEJAJEDAggFAmNwCHBheW1lbnRzAAAGYW1vdW50BAJnZQkAtgIBCAkBBXZhbHVlAQkAkQMCCAUCY3AIcGF5bWVudHMAAQZhbW91bnQEAmV1CQECZW4DBQJnZAUCZ2UJALYCAQAAAwkAAAIFAmV1BQJldQQCZ0EJAQJldgMAAAAAAAAEAmZMCAUCZ0ECXzEEAmVtCAUCZ0ECXzIEAmZNCQECZXoCBQJldQUCZW0DCQAAAgUCZk0FAmZNCQDOCAIFAmRiBQJmTAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJjcAEDZ2V0AAQCZXUJAQJlbgMJALYCAQAACQC2AgEAAAkAtgIBAAADCQAAAgUCZXUFAmV1BAJkegkBAmVNAQUCY3AEAmdCCAUCZHoCXzEEAmRhCAUCZHoCXzIEAmRtCAUCZHoCXzMEAmNGCAUCZHoCXzQEAmRiCAUCZHoCXzUEAmViCQD8BwQFAmFGAgRidXJuCQDMCAIFAmRtBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmNGBQJkbQUDbmlsAwkAAAIFAmViBQJlYgQCZ0MJAQJldgMJAQEtAQUCZ0IJAQEtAQUCZGEAAAQCZkwIBQJnQwJfMQQCZW0IBQJnQwJfMgQCZk0JAQJlegIFAmV1BQJlbQMJAAACBQJmTQUCZk0JAM4IAgUCZGIFAmZMCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmNwAQtnZXRPbmVUa25WMgICZm8CZnAEAmdxCgACYUgJAPwHBAUCYUYCKGlzUG9vbE9uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkUkVBRE9OTFkJAMwIAgkApQgBBQR0aGlzBQNuaWwFA25pbAMJAAECBQJhSAIHQm9vbGVhbgUCYUgJAAIBCQCsAgIJAAMBBQJhSAIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgQCZ0QDAwkBAmFLAAYJAAACBQJhWQUBbwYFAmdxBAJncwkAzAgCAwMJAQEhAQUCZ0QGCQECZlIBBQJjcAYJAQJhQwECIWdldCBvcGVyYXRpb24gaXMgYmxvY2tlZCBieSBhZG1pbgkAzAgCAwkAAAIJAJADAQgFAmNwCHBheW1lbnRzAAEGCQECYUMBAh5leGFjdGx5IDEgcGF5bWVudCBhcmUgZXhwZWN0ZWQFA25pbAMJAAACBQJncwUCZ3MEAmdFCQECZm4GBQJmbwUCZnAIBQJjcAhwYXltZW50cwgFAmNwBmNhbGxlcggFAmNwDG9yaWdpbkNhbGxlcggFAmNwDXRyYW5zYWN0aW9uSWQEAmRiCAUCZ0UCXzEEAmZ5CAUCZ0UCXzIJAJQKAgUCZGIFAmZ5CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmNwAQpyZWZyZXNoRExwAAQCZ0YJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUCYWYAAAQCZ0cDCQBnAgkAZQIFBmhlaWdodAUCZ0YFAmFpBQR1bml0CQECYUMBCQC5CQIJAMwIAgkApAMBBQJhaQkAzAgCAi8gYmxvY2tzIGhhdmUgbm90IHBhc3NlZCBzaW5jZSB0aGUgcHJldmlvdXMgY2FsbAUDbmlsAgADCQAAAgUCZ0cFAmdHBAJlRwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCoAwEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUCYWUCATAJAQJhRQECC2ludmFsaWQgZExwBAJnSAkBAmV2AwAAAAAAAAQCZ0kIBQJnSAJfMQQCZW0IBQJnSAJfMgQCZXkDCQECIT0CBQJlRwUCZW0FAmdJCQECYUMBAhJub3RoaW5nIHRvIHJlZnJlc2gJAJQKAgUCZXkJAKYDAQUCZW0JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CY3ABE2dldE9uZVRrblYyUkVBRE9OTFkCAmZvAmdKBAJjSgkA2AQBCQEFdmFsdWUBBQJiYQQCY0sJANgEAQkBBXZhbHVlAQUCYmIEAmNJCQDYBAEJAQV2YWx1ZQEFAmFaBAJiWQkAzAgCCQC2AgEJAQJiegEFAmNKCQDMCAIJALYCAQkBAmJ6AQUCY0sFA25pbAQCZWwJALYCAQgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBCQDZBAEFAmNJAhBpbnZhbGlkIGxwIGFzc2V0CHF1YW50aXR5BAJkeQkBAmJYAQUCYlkEAmRBCQC4AgIFAmR5CQC8AgMJALYCAQUCZ0oFAmR5BQJlbAQCZ0sDCQAAAgUCZm8FAmNKAAADCQAAAgUCZm8FAmNLAAEJAAIBAhRpbnZhbGlkIG91dCBhc3NldCBpZAQCZ0wJAQJkVgMFAmJZBQJnSwUCZEEEAmdNCQC4AgIJAJEDAgUCYlkFAmdLBQJnTAQCZ04JAJYDAQkAzAgCAAAJAMwIAgkAoAMBCQC4AgIFAmdNBQFmBQNuaWwEAmdPCQECYlUCBQJnTgUCYUkEAmZ4CAUCZ08CXzEEAmJXCAUCZ08CXzIJAJQKAgUDbmlsCQCUCgIFAmZ4BQJiVwJjcAEcZ2V0T25lVGtuVjJXaXRoQm9udXNSRUFET05MWQICZm8CZ0oEAmNKCQDYBAEJAQV2YWx1ZQEFAmJhBAJjSwkA2AQBCQEFdmFsdWUBBQJiYgQCY0kJANgEAQkBBXZhbHVlAQUCYVoEAmNQCQECYnoBBQJjSgQCY1IJAQJiegEFAmNLBAJnUAoAAmFICQD8BwQFBHRoaXMCE2dldE9uZVRrblYyUkVBRE9OTFkJAMwIAgUCZm8JAMwIAgUCZ0oFA25pbAUDbmlsAwkAAQIFAmFIAgooSW50LCBJbnQpBQJhSAkAAgEJAKwCAgkAAwEFAmFIAh8gY291bGRuJ3QgYmUgY2FzdCB0byAoSW50LCBJbnQpBAJmeAgFAmdQAl8xBAJiVwgFAmdQAl8yBAJkegkBAmNEBAIABQJjSQUCZ0oFBHRoaXMEAmNaCAUCZHoCXzEEAmRhCAUCZHoCXzIEAmdRCQBkAgUCY1oFAmRhBAJmbQMJAAACBQJnUQAAAwkAAAIFAmZ4AAAAAAkAAgECF2JvbnVzIGNhbGN1bGF0aW9uIGVycm9yCQBrAwkAZQIFAmZ4BQJnUQUBYQUCZ1EJAJQKAgUDbmlsCQCVCgMFAmZ4BQJiVwUCZm0CY3ABCWdldE5vTGVzcwICZ1ICZ1MEAmR6CQECZU0BBQJjcAQCY1oIBQJkegJfMQQCZGEIBQJkegJfMgQCZG0IBQJkegJfMwQCY0YIBQJkegJfNAQCZGIIBQJkegJfNQMJAGYCBQJnUgUCY1oJAAIBCQCsAgIJAKwCAgkArAICAglGYWlsZWQ6ICAJAKQDAQUCY1oCAyA8IAkApAMBBQJnUgMJAGYCBQJnUwUCZGEJAAIBCQCsAgIJAKwCAgkArAICAghGYWlsZWQ6IAkApAMBBQJkYQIDIDwgCQCkAwEFAmdTBAJldQkBAmVuAwkAtgIBAAAJALYCAQAACQC2AgEAAAMJAAACBQJldQUCZXUEAmdUCQD8BwQFAmFGAgRidXJuCQDMCAIFAmRtBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmNGBQJkbQUDbmlsAwkAAAIFAmdUBQJnVAQCZ1UJAQJldgMJAQEtAQUCY1oJAQEtAQUCZGEAAAQCZkwIBQJnVQJfMQQCZW0IBQJnVQJfMgQCZk0JAQJlegIFAmV1BQJlbQMJAAACBQJmTQUCZk0JAM4IAgUCZGIFAmZMCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmNwAQ11bnN0YWtlQW5kR2V0AQJiVgQCZ1YDCQECIT0CCQCQAwEIBQJjcAhwYXltZW50cwAACQACAQINTm8gcG1udHMgZXhwZAYDCQAAAgUCZ1YFAmdWBAJnVwkBAmJnAAQCZ2cFAmFaBAJnWAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCZ1cFAXkCCldyIHN0IGFkZHIEAmV1CQECZW4DCQC2AgEAAAkAtgIBAAAJALYCAQAAAwkAAAIFAmV1BQJldQQCZ1kJAPwHBAUCZ1gCB3Vuc3Rha2UJAMwIAgkA2AQBBQJnZwkAzAgCBQJiVgUDbmlsBQNuaWwDCQAAAgUCZ1kFAmdZBAJkegkBAmNEBAkA2AQBCAUCY3ANdHJhbnNhY3Rpb25JZAkA2AQBBQJnZwUCYlYIBQJjcAZjYWxsZXIEAmNaCAUCZHoCXzEEAmRhCAUCZHoCXzIEAmNOCQENcGFyc2VJbnRWYWx1ZQEIBQJkegJfOQQCZGIIBQJkegNfMTAEAmdaAwMJAQJhSwAGCQAAAgUCY04FAW8JAAIBCQCsAgICCUJsb2NrZWQ6IAkApAMBBQJjTgYDCQAAAgUCZ1oFAmdaBAJoYQkA/AcEBQJhRgIEYnVybgkAzAgCBQJiVgUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJnZwUCYlYFA25pbAMJAAACBQJoYQUCaGEEAmhiCQECZXYDCQEBLQEFAmNaCQEBLQEFAmRhAAAEAmZMCAUCaGICXzEEAmVtCAUCaGICXzIEAmZNCQECZXoCBQJldQUCZW0DCQAAAgUCZk0FAmZNCQDOCAIFAmRiBQJmTAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJjcAETdW5zdGFrZUFuZEdldE5vTGVzcwMCaGMCaGQCZ1MEAmdEAwkBAmFLAAYJAAACBQJhWQUBbwQCZ3MJAMwIAgMJAQEhAQUCZ0QGCQACAQIhZ2V0IG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IGFkbWluCQDMCAIDCQAAAgkAkAMBCAUCY3AIcGF5bWVudHMAAAYJAAIBAhhubyBwYXltZW50cyBhcmUgZXhwZWN0ZWQFA25pbAMJAAACBQJncwUCZ3MEAmV1CQECZW4DCQC2AgEAAAkAtgIBAAAJALYCAQAAAwkAAAIFAmV1BQJldQQCZ1kJAPwHBAUCYmkCB3Vuc3Rha2UJAMwIAgkA2AQBBQJhWgkAzAgCBQJoYwUDbmlsBQNuaWwDCQAAAgUCZ1kFAmdZBAJoZQkBAmNEBAkA2AQBCAUCY3ANdHJhbnNhY3Rpb25JZAkA2AQBBQJhWgUCaGMIBQJjcAZjYWxsZXIEAmNaCAUCaGUCXzEEAmRhCAUCaGUCXzIEAmRiCAUCaGUDXzEwBAJoZgkAzAgCAwkAZwIFAmNaBQJoZAYJAAIBCQC5CQIJAMwIAgIsYW1vdW50IGFzc2V0IGFtb3VudCB0byByZWNlaXZlIGlzIGxlc3MgdGhhbiAJAMwIAgkApAMBBQJoZAUDbmlsAgAJAMwIAgMJAGcCBQJkYQUCZ1MGCQACAQkAuQkCCQDMCAICK3ByaWNlIGFzc2V0IGFtb3VudCB0byByZWNlaXZlIGlzIGxlc3MgdGhhbiAJAMwIAgkApAMBBQJnUwUDbmlsAgAFA25pbAMJAAACBQJoZgUCaGYEAmdUCQD8BwQFAmFGAgRidXJuCQDMCAIFAmhjBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmFaBQJoYwUDbmlsAwkAAAIFAmdUBQJnVAQCaGcJAQJldgMJAQEtAQUCY1oJAQEtAQUCZGEAAAQCZkwIBQJoZwJfMQQCZW0IBQJoZwJfMgQCZk0JAQJlegIFAmV1BQJlbQMJAAACBQJmTQUCZk0JAM4IAgUCZGIFAmZMCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmNwARV1bnN0YWtlQW5kR2V0T25lVGtuVjIDAmhjAmZvAmZwBAJncQoAAmFICQD8BwQFAmFGAihpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZFJFQURPTkxZCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQABAgUCYUgCB0Jvb2xlYW4FAmFICQACAQkArAICCQADAQUCYUgCHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4EAmdEAwMJAQJhSwAGCQAAAgUCYVkFAW8GBQJncQQCZ3MJAMwIAgMDCQEBIQEFAmdEBgkBAmZSAQUCY3AGCQECYUMBAiFnZXQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgYWRtaW4JAMwIAgMJAAACCQCQAwEIBQJjcAhwYXltZW50cwAABgkBAmFDAQIYbm8gcGF5bWVudHMgYXJlIGV4cGVjdGVkBQNuaWwDCQAAAgUCZ3MFAmdzBAJnVwkBAmJnAAQCZ2cFAmFaBAJnWAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCZ1cFAXkCCldyIHN0IGFkZHIEAmdZCQD8BwQFAmdYAgd1bnN0YWtlCQDMCAIJANgEAQUCZ2cJAMwIAgUCaGMFA25pbAUDbmlsAwkAAAIFAmdZBQJnWQQCaGgJAQJmbgYFAmZvBQJmcAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCZ2cFAmhjBQNuaWwIBQJjcAZjYWxsZXIIBQJjcAxvcmlnaW5DYWxsZXIIBQJjcA10cmFuc2FjdGlvbklkBAJkYggFAmhoAl8xBAJmeQgFAmhoAl8yCQCUCgIFAmRiBQJmeQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJjcAEccHV0T25lVGtuVjJXaXRoQm9udXNSRUFET05MWQICaGkCaGoEAmhrCQECZVMFBQJoaQUCaGoCAAIABgQCZmgIBQJoawJfMQQCZGIIBQJoawJfMgQCYlcIBQJoawJfMwQCZm0IBQJoawJfNAkAlAoCBQNuaWwJAJUKAwUCZmgFAmJXBQJmbQJjcAEhcHV0T25lVGtuVjJXaXRob3V0VGFrZUZlZVJFQURPTkxZAgJoaQJoagQCaGwJAQJlUwUFAmhpBQJoagIAAgAHBAJmaAgFAmhsAl8xBAJkYggFAmhsAl8yBAJiVwgFAmhsAl8zBAJmbQgFAmhsAl80CQCUCgIFA25pbAkAlQoDBQJmaAUCYlcFAmZtAmNwAQhhY3RpdmF0ZQICaG0CaG4DCQECIT0CCQClCAEIBQJjcAZjYWxsZXIJAKUIAQUCYUYJAAIBAgZkZW5pZWQJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCCQEBWQAFAmhtCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFaAAUCaG4FA25pbAIHc3VjY2VzcwJjcAEEc2V0UwICaG8CZ1oDCQECIT0CCQClCAEIBQJjcAZjYWxsZXIJAQJheQIFBHRoaXMJAQJhYgAFAmZRCQDMCAIJAQtTdHJpbmdFbnRyeQIFAmhvBQJnWgUDbmlsAmNwAQRzZXRJAgJobwJnWgMJAQIhPQIJAKUIAQgFAmNwBmNhbGxlcgkBAmF5AgUEdGhpcwkBAmFiAAUCZlEJAMwIAgkBDEludGVnZXJFbnRyeQIFAmhvBQJnWgUDbmlsAmNwARxnZXRQb29sQ29uZmlnV3JhcHBlclJFQURPTkxZAAkAlAoCBQNuaWwJAQJhTgACY3ABHGdldEFjY0JhbGFuY2VXcmFwcGVyUkVBRE9OTFkBAmJBCQCUCgIFA25pbAkBAmJ6AQUCYkECY3ABGWNhbGNQcmljZXNXcmFwcGVyUkVBRE9OTFkDAmJJAmJKAmJOBAJocAkBAmJNAwUCYkkFAmJKBQJiTgkAlAoCBQNuaWwJAMwIAgkApgMBCQCRAwIFAmhwAAAJAMwIAgkApgMBCQCRAwIFAmhwAAEJAMwIAgkApgMBCQCRAwIFAmhwAAIFA25pbAJjcAEWZnJvbVgxOFdyYXBwZXJSRUFET05MWQIBSAJocQkAlAoCBQNuaWwJAQFHAgkApwMBBQFIBQJocQJjcAEUdG9YMThXcmFwcGVyUkVBRE9OTFkCAUQBRQkAlAoCBQNuaWwJAKYDAQkBAUMCBQFEBQFFAmNwAR5jYWxjUHJpY2VCaWdJbnRXcmFwcGVyUkVBRE9OTFkCAmJDAmJECQCUCgIFA25pbAkApgMBCQECYkICCQCnAwEFAmJDCQCnAwEFAmJEAmNwASNlc3RpbWF0ZVB1dE9wZXJhdGlvbldyYXBwZXJSRUFET05MWQkCY0UCZGQCZGUCZGYCZGcCZGgCaHICZGkCZGoJAJQKAgUDbmlsCQECZGMNBQJjRQUCZGQFAmRlBQJkZgUCZGcFAmRoBQJocgUCZGkFAmRqBgcAAAIAAmNwASNlc3RpbWF0ZUdldE9wZXJhdGlvbldyYXBwZXJSRUFET05MWQQCY0UCaHMCY0cCaHIEAmR6CQECY0QEBQJjRQUCaHMFAmNHCQERQGV4dHJOYXRpdmUoMTA2MikBBQJocgkAlAoCBQNuaWwJAJwKCggFAmR6Al8xCAUCZHoCXzIIBQJkegJfMwgFAmR6Al80CAUCZHoCXzUIBQJkegJfNggFAmR6Al83CQCmAwEIBQJkegJfOAgFAmR6Al85CAUCZHoDXzEwAQJodAECaHUABAJodgQCZk8JAQJmTgADCQABAgUCZk8CCkJ5dGVWZWN0b3IEAmZTBQJmTwUCZlMDCQABAgUCZk8CBFVuaXQIBQJodA9zZW5kZXJQdWJsaWNLZXkJAAIBAgtNYXRjaCBlcnJvcgQCZk8FAmh0AwkAAQIFAmZPAgVPcmRlcgQCZUMFAmZPBAJodwkBAmFMAAQCaHgJAQJlQgEFAmVDBAJhdQgFAmh4Al8xBAJhdggFAmh4Al8yBAJhdwkA9AMDCAUCZUMJYm9keUJ5dGVzCQCRAwIIBQJlQwZwcm9vZnMAAAgFAmVDD3NlbmRlclB1YmxpY0tleQQCYXgJAPQDAwgFAmVDCWJvZHlCeXRlcwkAkQMCCAUCZUMGcHJvb2ZzAAEFAmh3AwMDBQJhdQUCYXcHBQJheAcGCQECYXQEBQJhdQUCYXYFAmF3BQJheAMJAAECBQJmTwIUU2V0U2NyaXB0VHJhbnNhY3Rpb24EAmNiBQJmTwMJAPQDAwgFAmh0CWJvZHlCeXRlcwkAkQMCCAUCaHQGcHJvb2ZzAAAFAmh2BgQCaHkJAPYDAQkBBXZhbHVlAQgFAmNiBnNjcmlwdAQCaHoJANsEAQkBBXZhbHVlAQkAnQgCBQJhRgkBAmFyAAQCaEEJAPEHAQUEdGhpcwMJAAACBQJoegUCaHkJAQIhPQIFAmhBBQJoeQcJAPQDAwgFAmh0CWJvZHlCeXRlcwkAkQMCCAUCaHQGcHJvb2ZzAAAFAmh2r6QTVg==", "height": 2413198, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 5ademvuCHnovJS5yE2WHZZR5V7Rtd6w17c6aRPSXsdTU Next: 71xkSAXJ22iimyFGHFKUNYC9w1bgyd7tEqfSwaxCKLME Diff:
OldNewDifferences
1919
2020 let big4 = toBigInt(4)
2121
22-let slippage4D = toBigInt((scale8 - ((scale8 * 1) / scale8)))
23-
2422 let wavesString = "WAVES"
2523
2624 let Amult = "100"
2725
28-let Dconv = "1"
29-
3026 let SEP = "__"
31-
32-let EMPTY = ""
33-
34-let PoolActive = 1
3527
3628 let PoolPutDis = 2
3729
6355
6456 let idxFactSlippCntr = 7
6557
66-let idxFactGwxRewCntr = 10
67-
6858 let feeDefault = fraction(10, scale8, 10000)
6959
7060 func t1 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
7767
7868
7969 func fromX18Round (val,resultScaleMult,round) = toInt(fraction(val, toBigInt(resultScaleMult), scale18, round))
80-
81-
82-func t2 (origVal,origScaleMult) = fraction(origVal, scale18, toBigInt(origScaleMult))
83-
84-
85-func f2 (val,resultScaleMult) = fraction(val, toBigInt(resultScaleMult), scale18)
86-
87-
88-func ts (amt,resScale,curScale) = fraction(amt, resScale, curScale)
8970
9071
9172 func abs (val) = if ((zeroBigInt > val))
166147 func keyFeeCollectorAddress () = "%s__feeCollectorAddress"
167148
168149
169-func toe (orV,sendrV,matchV) = throw(((((("Failed: ordValid=" + toString(orV)) + " sndrValid=") + toString(sendrV)) + " mtchrValid=") + toString(matchV)))
150+func throwOrderError (orderValid,orderValidInfo,senderValid,matcherValid) = throw((((((((("order validation failed: orderValid=" + toString(orderValid)) + " (") + orderValidInfo) + ")") + " senderValid=") + toString(senderValid)) + " matcherValid=") + toString(matcherValid)))
170151
171152
172153 func strf (addr,key) = valueOrErrorMessage(getString(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
231212
232213 let poolConfigParsed = parsePoolConfig(gpc())
233214
234-let $t078478076 = poolConfigParsed
215+let $t079648193 = poolConfigParsed
235216
236-let cfgPoolAddress = $t078478076._1
217+let cfgPoolStatus = $t079648193._2
237218
238-let cfgPoolStatus = $t078478076._2
219+let cfgLpAssetId = $t079648193._3
239220
240-let cfgLpAssetId = $t078478076._3
221+let cfgAmountAssetId = $t079648193._4
241222
242-let cfgAmountAssetId = $t078478076._4
223+let cfgPriceAssetId = $t079648193._5
243224
244-let cfgPriceAssetId = $t078478076._5
225+let cfgAmountAssetDecimals = $t079648193._6
245226
246-let cfgAmountAssetDecimals = $t078478076._6
227+let cfgPriceAssetDecimals = $t079648193._7
247228
248-let cfgPriceAssetDecimals = $t078478076._7
229+let cfgInAmountAssedId = $t079648193._8
249230
250-let cfgInAmountAssedId = $t078478076._8
251-
252-let cfgInPriceAssetId = $t078478076._9
231+let cfgInPriceAssetId = $t079648193._9
253232
254233 func gfc () = split(strf(fca, fcfg()), SEP)
255234
257236 let factoryConfig = gfc()
258237
259238 let stakingContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactStakCntr]), "Invalid staking contract address")
260-
261-let slipageContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactSlippCntr]), "Invalid slipage contract address")
262-
263-let gwxContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactGwxRewCntr]), "Invalid gwx contract address")
264239
265240 let restContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactoryRestCntr]), "Invalid gwx contract address")
266241
281256 func cpbir (prAmtX18,amAmtX18,round) = fraction(prAmtX18, scale18, amAmtX18, round)
282257
283258
284-func vad (A1,A2,slippage) = {
285- let diff = fraction((A1 - A2), scale8BigInt, A2)
286- let pass = ((slippage - abs(diff)) > zeroBigInt)
287- if (!(pass))
288- then throw(("Big slpg: " + toString(diff)))
289- else $Tuple2(pass, min([A1, A2]))
290- }
291-
292-
293-func vd (D1,D0,slpg) = {
294- let diff = fraction(D0, scale8BigInt, D1)
295- let fail = (slpg > diff)
296- if (if (fail)
297- then true
298- else (D0 > D1))
299- then throw(((((((toString(D0) + " ") + toString(D1)) + " ") + toString(diff)) + " ") + toString(slpg)))
300- else fail
301- }
302-
303-
304259 func pcp (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
305260 let amtAsAmtX18 = t1(amAmt, amAssetDcm)
306261 let prAsAmtX18 = t1(prAmt, prAssetDcm)
318273 let lpPrInAmAsX18 = cpbi(amAmtX18, lpAmtX18)
319274 let lpPrInPrAsX18 = cpbi(prAmtX18, lpAmtX18)
320275 [priceX18, lpPrInAmAsX18, lpPrInPrAsX18]
321- }
322-
323-
324-func calculatePrices (amAmt,prAmt,lpAmt) = {
325- let p = calcPrices(amAmt, prAmt, lpAmt)
326-[f1(p[0], scale8), f1(p[1], scale8), f1(p[2], scale8)]
327276 }
328277
329278
370319 }
371320
372321 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
373- let $t01257312621 = {
322+ let $t01269012738 = {
374323 let $l = arr
375324 let $s = size($l)
376325 let $acc0 = $Tuple2(s, false)
384333
385334 $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)
386335 }
387- let d = $t01257312621._1
388- let found = $t01257312621._2
336+ let d = $t01269012738._1
337+ let found = $t01269012738._2
389338 if (found)
390339 then d
391340 else throw(("D calculation error, D = " + toString(d)))
472421 then {
473422 let curPriceX18 = zeroBigInt
474423 let slippageX18 = zeroBigInt
475- let lpAmtX18 = D1
424+ let lpAmtX18 = pow((inAmAssetAmtX18 * inPrAssetAmtX18), 0, toBigInt(5), 1, 0, DOWN)
476425 $Tuple5(f1(lpAmtX18, scale8), f1(inAmAssetAmtX18, amtDcm), f1(inPrAssetAmtX18, priceDcm), cpbi((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
477426 }
478427 else throw("Strict value is not equal to itself.")
496445 else $Tuple2(inAmAssetAmtX18, prViaAmX18)
497446 let expAmtAssetAmtX18 = expectedAmts._1
498447 let expPriceAssetAmtX18 = expectedAmts._2
499- let D1 = getD([(amBalanceX18 + expAmtAssetAmtX18), (prBalanceX18 + expPriceAssetAmtX18)])
500- let checkD = if ((D1 > D0))
501- then true
502- else throw("D1 should be greater than D0")
503- if ((checkD == checkD))
504- then {
505- let lpAmtX18 = fraction(lpEmissionX18, (D1 - D0), D0)
506- $Tuple5(fromX18Round(lpAmtX18, scale8, FLOOR), fromX18Round(expAmtAssetAmtX18, amtDcm, CEILING), fromX18Round(expPriceAssetAmtX18, priceDcm, CEILING), curPriceX18, slippageX18)
507- }
508- else throw("Strict value is not equal to itself.")
448+ let lpAmtX18 = fraction(lpEmissionX18, expPriceAssetAmtX18, prBalanceX18, FLOOR)
449+ $Tuple5(fromX18Round(lpAmtX18, scale8, FLOOR), fromX18Round(expAmtAssetAmtX18, amtDcm, CEILING), fromX18Round(expPriceAssetAmtX18, priceDcm, CEILING), curPriceX18, slippageX18)
509450 }
510451 }
511452 let calcLpAmt = r._1
521462 else calcLpAmt
522463 let amDiff = (inAmAmt - calcAmAssetPmt)
523464 let prDiff = (inPrAmt - calcPrAssetPmt)
524- let $t02046020805 = if (if (isOneAsset)
465+ let $t02058120926 = if (if (isOneAsset)
525466 then (pmtId == amIdStr)
526467 else false)
527468 then $Tuple2(pmtAmt, 0)
530471 else false)
531472 then $Tuple2(0, pmtAmt)
532473 else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
533- let writeAmAmt = $t02046020805._1
534- let writePrAmt = $t02046020805._2
474+ let writeAmAmt = $t02058120926._1
475+ let writePrAmt = $t02058120926._2
535476 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))]
536477 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
537478 }
550491 let c = (((((D * D) / (x * n)) * D) * aPrecision) / (ann * n))
551492 let b = ((s + ((D * aPrecision) / ann)) - D)
552493 func calc (acc,cur) = {
553- let $t02200022020 = acc
554- let y = $t02200022020._1
555- let found = $t02200022020._2
494+ let $t02212122141 = acc
495+ let y = $t02212122141._1
496+ let found = $t02212122141._2
556497 if ((found != unit))
557498 then acc
558499 else {
565506 }
566507
567508 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
568- let $t02232722374 = {
509+ let $t02244822495 = {
569510 let $l = arr
570511 let $s = size($l)
571512 let $acc0 = $Tuple2(D, unit)
579520
580521 $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)
581522 }
582- let y = $t02232722374._1
583- let found = $t02232722374._2
523+ let y = $t02244822495._1
524+ let found = $t02244822495._2
584525 if ((found != unit))
585526 then y
586527 else throw(("Y calculation error, Y = " + toString(y)))
622563 func validateMatcherOrderAllowed (order) = {
623564 let amountAssetAmount = order.amount
624565 let priceAssetAmount = fraction(order.amount, order.price, scale8, FLOOR)
625- let $t02441824630 = if ((order.orderType == Buy))
566+ let $t02453924751 = if ((order.orderType == Buy))
626567 then $Tuple2(amountAssetAmount, -(priceAssetAmount))
627568 else $Tuple2(-(amountAssetAmount), priceAssetAmount)
628- let amountAssetBalanceDelta = $t02441824630._1
629- let priceAssetBalanceDelta = $t02441824630._2
569+ let amountAssetBalanceDelta = $t02453924751._1
570+ let priceAssetBalanceDelta = $t02453924751._2
630571 if (if (if (igs())
631572 then true
632573 else (cfgPoolStatus == PoolMatcherDis))
639580 then throw("Wr assets")
640581 else {
641582 let dLp = parseBigIntValue(getStringValue(this, keyDLp))
642- let $t02496025060 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
643- let unusedActions = $t02496025060._1
644- let dLpNew = $t02496025060._2
583+ let $t02508125181 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
584+ let unusedActions = $t02508125181._1
585+ let dLpNew = $t02508125181._2
645586 let isOrderValid = (dLpNew >= dLp)
646- isOrderValid
587+ let info = makeString([toString(dLp), toString(dLpNew)], " ")
588+ $Tuple2(isOrderValid, info)
647589 }
648590 }
649591
694636 then {
695637 let amBalance = getAccBalance(amId)
696638 let prBalance = getAccBalance(prId)
697- let $t02732627788 = if ((txId == ""))
639+ let $t02753327995 = if ((txId == ""))
698640 then $Tuple2(amBalance, prBalance)
699641 else if ((pmtAssetId == amId))
700642 then if ((pmtAmtRaw > amBalance))
705647 then throw("invalid payment amount")
706648 else $Tuple2(amBalance, (prBalance - pmtAmtRaw))
707649 else throw("wrong pmtAssetId")
708- let amBalanceOld = $t02732627788._1
709- let prBalanceOld = $t02732627788._2
710- let $t02779427970 = if ((pmtAssetId == amId))
650+ let amBalanceOld = $t02753327995._1
651+ let prBalanceOld = $t02753327995._2
652+ let $t02800128177 = if ((pmtAssetId == amId))
711653 then $Tuple2(pmtAmtRaw, 0)
712654 else if ((pmtAssetId == prId))
713655 then $Tuple2(0, pmtAmtRaw)
714656 else throw("invalid payment")
715- let amAmountRaw = $t02779427970._1
716- let prAmountRaw = $t02779427970._2
717- let $t02797428228 = if (withTakeFee)
657+ let amAmountRaw = $t02800128177._1
658+ let prAmountRaw = $t02800128177._2
659+ let $t02818128435 = if (withTakeFee)
718660 then $Tuple3(takeFee(amAmountRaw, inFee)._1, takeFee(prAmountRaw, inFee)._1, takeFee(pmtAmtRaw, inFee)._2)
719661 else $Tuple3(amAmountRaw, prAmountRaw, 0)
720- let amAmount = $t02797428228._1
721- let prAmount = $t02797428228._2
722- let feeAmount = $t02797428228._3
662+ let amAmount = $t02818128435._1
663+ let prAmount = $t02818128435._2
664+ let feeAmount = $t02818128435._3
723665 let amBalanceNew = (amBalanceOld + amAmount)
724666 let prBalanceNew = (prBalanceOld + prAmount)
725667 let D0 = getD([t1(amBalanceOld, cfgAmountAssetDecimals), t1(prBalanceOld, cfgPriceAssetDecimals)])
767709 else {
768710 let amBalance = getAccBalance(amId)
769711 let prBalance = getAccBalance(prId)
770- let $t03034030451 = {
712+ let $t03054730658 = {
771713 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)
772714 if ($isInstanceOf(@, "(Int, Int)"))
773715 then @
774716 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
775717 }
776- if (($t03034030451 == $t03034030451))
718+ if (($t03054730658 == $t03054730658))
777719 then {
778- let feeAmount = $t03034030451._2
779- let totalGet = $t03034030451._1
720+ let feeAmount = $t03054730658._2
721+ let totalGet = $t03054730658._1
780722 let totalAmount = if (if ((minOutAmount > 0))
781723 then (minOutAmount > totalGet)
782724 else false)
783725 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
784726 else totalGet
785- let $t03064130948 = if ((outAssetId == amId))
727+ let $t03084831155 = if ((outAssetId == amId))
786728 then $Tuple4(totalAmount, 0, ((amBalance - totalAmount) - feeAmount), prBalance)
787729 else if ((outAssetId == prId))
788730 then $Tuple4(0, totalAmount, amBalance, ((prBalance - totalAmount) - feeAmount))
789731 else throw("invalid out asset id")
790- let outAm = $t03064130948._1
791- let outPr = $t03064130948._2
792- let amBalanceNew = $t03064130948._3
793- let prBalanceNew = $t03064130948._4
732+ let outAm = $t03084831155._1
733+ let outPr = $t03084831155._2
734+ let amBalanceNew = $t03084831155._3
735+ let prBalanceNew = $t03084831155._4
794736 let curPrX18 = cpbi(t1(prBalanceNew, prDecimals), t1(amBalanceNew, amDecimals))
795737 let curPr = f1(curPrX18, scale8)
796738 let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
805747 let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
806748 if ((burn == burn))
807749 then {
808- let $t03173332083 = {
750+ let $t03194032290 = {
809751 let feeAmountForCalc = if ((this == feeCollectorAddress))
810752 then 0
811753 else feeAmount
816758 then $Tuple2(-((totalGet + feeAmountForCalc)), 0)
817759 else $Tuple2(0, -((totalGet + feeAmountForCalc)))
818760 }
819- let amountAssetBalanceDelta = $t03173332083._1
820- let priceAssetBalanceDelta = $t03173332083._2
821- let $t03208632194 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
822- let refreshDLpActions = $t03208632194._1
823- let updatedDLp = $t03208632194._2
761+ let amountAssetBalanceDelta = $t03194032290._1
762+ let priceAssetBalanceDelta = $t03194032290._2
763+ let $t03229332401 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
764+ let refreshDLpActions = $t03229332401._1
765+ let updatedDLp = $t03229332401._2
824766 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
825767 if ((isUpdatedDLpValid == isUpdatedDLpValid))
826768 then $Tuple2((state ++ refreshDLpActions), totalAmount)
989931 else throw("Strict value is not equal to itself.")
990932 }
991933 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
992- let $t03634336485 = refreshDLpInternal(0, 0, 0)
993- let refreshDLpActions = $t03634336485._1
994- let updatedDLp = $t03634336485._2
934+ let $t03655036692 = refreshDLpInternal(0, 0, 0)
935+ let refreshDLpActions = $t03655036692._1
936+ let updatedDLp = $t03655036692._2
995937 let check = if ((updatedDLp >= currentDLp))
996938 then true
997939 else throwErr(makeString(["updated DLp lower than current DLp", toString(amountAssetBalance), toString(priceAssetBalance), toString(lpAssetEmission), toString(currentDLp), toString(updatedDLp), toString(amDiff), toString(prDiff)], " "))
10641006 else calcCurrentDLp(toBigInt(0), toBigInt(pmtAmt), toBigInt(0))
10651007 if ((currentDLp == currentDLp))
10661008 then {
1067- let $t03812638284 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId), true)
1068- if (($t03812638284 == $t03812638284))
1009+ let $t03833338491 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId), true)
1010+ if (($t03833338491 == $t03833338491))
10691011 then {
1070- let feeAmount = $t03812638284._3
1071- let state = $t03812638284._2
1072- let estimLP = $t03812638284._1
1012+ let feeAmount = $t03833338491._3
1013+ let state = $t03833338491._2
1014+ let estimLP = $t03833338491._1
10731015 let emitLpAmt = if (if ((minOutAmount > 0))
10741016 then (minOutAmount > estimLP)
10751017 else false)
10971039 let sendFeeToMatcher = if ((feeAmount > 0))
10981040 then [ScriptTransfer(feeCollectorAddress, feeAmount, fromBase58String(pmtAssetId))]
10991041 else nil
1100- let $t03909939448 = if ((this == feeCollectorAddress))
1042+ let $t03930639655 = if ((this == feeCollectorAddress))
11011043 then $Tuple2(0, 0)
11021044 else {
11031045 let paymentInAmountAsset = if ((pmt.assetId == cfgAmountAssetId))
11071049 then $Tuple2(-(feeAmount), 0)
11081050 else $Tuple2(0, -(feeAmount))
11091051 }
1110- let amountAssetBalanceDelta = $t03909939448._1
1111- let priceAssetBalanceDelta = $t03909939448._2
1112- let $t03945139559 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1113- let refreshDLpActions = $t03945139559._1
1114- let updatedDLp = $t03945139559._2
1052+ let amountAssetBalanceDelta = $t03930639655._1
1053+ let priceAssetBalanceDelta = $t03930639655._2
1054+ let $t03965839766 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1055+ let refreshDLpActions = $t03965839766._1
1056+ let updatedDLp = $t03965839766._2
11151057 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
11161058 if ((isUpdatedDLpValid == isUpdatedDLpValid))
11171059 then $Tuple2((((state ++ lpTrnsfr) ++ sendFeeToMatcher) ++ refreshDLpActions), emitLpAmt)
11431085 let currentDLp = calcCurrentDLp(amAssetPmt, prAssetPmt, toBigInt(0))
11441086 if ((currentDLp == currentDLp))
11451087 then {
1146- let $t04058940654 = refreshDLpInternal(0, 0, 0)
1147- let refreshDLpActions = $t04058940654._1
1148- let updatedDLp = $t04058940654._2
1088+ let $t04079640861 = refreshDLpInternal(0, 0, 0)
1089+ let refreshDLpActions = $t04079640861._1
1090+ let updatedDLp = $t04079640861._2
11491091 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
11501092 if ((isUpdatedDLpValid == isUpdatedDLpValid))
11511093 then (state ++ refreshDLpActions)
11701112 let b = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
11711113 if ((b == b))
11721114 then {
1173- let $t04182741909 = refreshDLpInternal(-(outAmtAmt), -(outPrAmt), 0)
1174- let refreshDLpActions = $t04182741909._1
1175- let updatedDLp = $t04182741909._2
1115+ let $t04203442116 = refreshDLpInternal(-(outAmtAmt), -(outPrAmt), 0)
1116+ let refreshDLpActions = $t04203442116._1
1117+ let updatedDLp = $t04203442116._2
11761118 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
11771119 if ((isUpdatedDLpValid == isUpdatedDLpValid))
11781120 then (state ++ refreshDLpActions)
12071149 else throwErr("exactly 1 payment are expected")]
12081150 if ((checks == checks))
12091151 then {
1210- let $t04252742682 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1211- let state = $t04252742682._1
1212- let totalAmount = $t04252742682._2
1152+ let $t04273442889 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1153+ let state = $t04273442889._1
1154+ let totalAmount = $t04273442889._2
12131155 $Tuple2(state, totalAmount)
12141156 }
12151157 else throw("Strict value is not equal to itself.")
12261168 if ((checkLastRefreshedBlockHeight == checkLastRefreshedBlockHeight))
12271169 then {
12281170 let dLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyDLp), "0")), fmtErr("invalid dLp"))
1229- let $t04320643270 = refreshDLpInternal(0, 0, 0)
1230- let dLpUpdateActions = $t04320643270._1
1231- let updatedDLp = $t04320643270._2
1171+ let $t04341343477 = refreshDLpInternal(0, 0, 0)
1172+ let dLpUpdateActions = $t04341343477._1
1173+ let updatedDLp = $t04341343477._2
12321174 let actions = if ((dLp != updatedDLp))
12331175 then dLpUpdateActions
12341176 else throwErr("nothing to refresh")
12561198 let newY = getYD(xp, index, D1)
12571199 let dy = (xp[index] - newY)
12581200 let totalGetRaw = max([0, toInt((dy - big1))])
1259- let $t04420044255 = takeFee(totalGetRaw, outFee)
1260- let totalGet = $t04420044255._1
1261- let feeAmount = $t04420044255._2
1201+ let $t04440744462 = takeFee(totalGetRaw, outFee)
1202+ let totalGet = $t04440744462._1
1203+ let feeAmount = $t04440744462._2
12621204 $Tuple2(nil, $Tuple2(totalGet, feeAmount))
12631205 }
12641206
12711213 let lpId = toBase58String(value(cfgLpAssetId))
12721214 let amBalance = getAccBalance(amId)
12731215 let prBalance = getAccBalance(prId)
1274- let $t04463044745 = {
1216+ let $t04483744952 = {
12751217 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)
12761218 if ($isInstanceOf(@, "(Int, Int)"))
12771219 then @
12781220 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
12791221 }
1280- let totalGet = $t04463044745._1
1281- let feeAmount = $t04463044745._2
1222+ let totalGet = $t04483744952._1
1223+ let feeAmount = $t04483744952._2
12821224 let r = ego("", lpId, lpAssetAmount, this)
12831225 let outAmAmt = r._1
12841226 let outPrAmt = r._2
13121254 let burnLPAssetOnFactory = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
13131255 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
13141256 then {
1315- let $t04591145992 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1316- let refreshDLpActions = $t04591145992._1
1317- let updatedDLp = $t04591145992._2
1257+ let $t04611846199 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1258+ let refreshDLpActions = $t04611846199._1
1259+ let updatedDLp = $t04611846199._2
13181260 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
13191261 if ((isUpdatedDLpValid == isUpdatedDLpValid))
13201262 then (state ++ refreshDLpActions)
13591301 let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
13601302 if ((burnA == burnA))
13611303 then {
1362- let $t04701947100 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1363- let refreshDLpActions = $t04701947100._1
1364- let updatedDLp = $t04701947100._2
1304+ let $t04722647307 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1305+ let refreshDLpActions = $t04722647307._1
1306+ let updatedDLp = $t04722647307._2
13651307 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
13661308 if ((isUpdatedDLpValid == isUpdatedDLpValid))
13671309 then (state ++ refreshDLpActions)
14121354 let burnLPAssetOnFactory = invoke(fca, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
14131355 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
14141356 then {
1415- let $t04835148432 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1416- let refreshDLpActions = $t04835148432._1
1417- let updatedDLp = $t04835148432._2
1357+ let $t04855848639 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1358+ let refreshDLpActions = $t04855848639._1
1359+ let updatedDLp = $t04855848639._2
14181360 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
14191361 if ((isUpdatedDLpValid == isUpdatedDLpValid))
14201362 then (state ++ refreshDLpActions)
14611403 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), unstakeAmount], nil)
14621404 if ((unstakeInv == unstakeInv))
14631405 then {
1464- let $t04932749515 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1465- let state = $t04932749515._1
1466- let totalAmount = $t04932749515._2
1406+ let $t04953449722 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1407+ let state = $t04953449722._1
1408+ let totalAmount = $t04953449722._2
14671409 $Tuple2(state, totalAmount)
14681410 }
14691411 else throw("Strict value is not equal to itself.")
14751417
14761418 @Callable(i)
14771419 func putOneTknV2WithBonusREADONLY (paymentAmountRaw,paymentAssetId) = {
1478- let $t04964349746 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1479- let lpAmount = $t04964349746._1
1480- let state = $t04964349746._2
1481- let feeAmount = $t04964349746._3
1482- let bonus = $t04964349746._4
1420+ let $t04985049953 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1421+ let lpAmount = $t04985049953._1
1422+ let state = $t04985049953._2
1423+ let feeAmount = $t04985049953._3
1424+ let bonus = $t04985049953._4
14831425 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
14841426 }
14851427
14871429
14881430 @Callable(i)
14891431 func putOneTknV2WithoutTakeFeeREADONLY (paymentAmountRaw,paymentAssetId) = {
1490- let $t04989449998 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1491- let lpAmount = $t04989449998._1
1492- let state = $t04989449998._2
1493- let feeAmount = $t04989449998._3
1494- let bonus = $t04989449998._4
1432+ let $t05010150205 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1433+ let lpAmount = $t05010150205._1
1434+ let state = $t05010150205._2
1435+ let feeAmount = $t05010150205._3
1436+ let bonus = $t05010150205._4
14951437 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
14961438 }
14971439
15761518 match tx {
15771519 case order: Order =>
15781520 let matcherPub = mp()
1579- let orderValid = validateMatcherOrderAllowed(order)
1521+ let $t05299753066 = validateMatcherOrderAllowed(order)
1522+ let orderValid = $t05299753066._1
1523+ let orderValidInfo = $t05299753066._2
15801524 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
15811525 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
15821526 if (if (if (orderValid)
15851529 then matcherValid
15861530 else false)
15871531 then true
1588- else toe(orderValid, senderValid, matcherValid)
1532+ else throwOrderError(orderValid, orderValidInfo, senderValid, matcherValid)
15891533 case s: SetScriptTransaction =>
15901534 if (sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey))
15911535 then true
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
22-let slippage4D = toBigInt((scale8 - ((scale8 * 1) / scale8)))
23-
2422 let wavesString = "WAVES"
2523
2624 let Amult = "100"
2725
28-let Dconv = "1"
29-
3026 let SEP = "__"
31-
32-let EMPTY = ""
33-
34-let PoolActive = 1
3527
3628 let PoolPutDis = 2
3729
3830 let PoolMatcherDis = 3
3931
4032 let PoolShutdown = 4
4133
4234 let idxPoolAddress = 1
4335
4436 let idxPoolSt = 2
4537
4638 let idxLPAsId = 3
4739
4840 let idxAmAsId = 4
4941
5042 let idxPrAsId = 5
5143
5244 let idxAmtAsDcm = 6
5345
5446 let idxPriceAsDcm = 7
5547
5648 let idxIAmtAsId = 8
5749
5850 let idxIPriceAsId = 9
5951
6052 let idxFactStakCntr = 1
6153
6254 let idxFactoryRestCntr = 6
6355
6456 let idxFactSlippCntr = 7
6557
66-let idxFactGwxRewCntr = 10
67-
6858 let feeDefault = fraction(10, scale8, 10000)
6959
7060 func t1 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
7161
7262
7363 func t1BigInt (origVal,origScaleMult) = fraction(origVal, scale18, origScaleMult)
7464
7565
7666 func f1 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
7767
7868
7969 func fromX18Round (val,resultScaleMult,round) = toInt(fraction(val, toBigInt(resultScaleMult), scale18, round))
80-
81-
82-func t2 (origVal,origScaleMult) = fraction(origVal, scale18, toBigInt(origScaleMult))
83-
84-
85-func f2 (val,resultScaleMult) = fraction(val, toBigInt(resultScaleMult), scale18)
86-
87-
88-func ts (amt,resScale,curScale) = fraction(amt, resScale, curScale)
8970
9071
9172 func abs (val) = if ((zeroBigInt > val))
9273 then -(val)
9374 else val
9475
9576
9677 func absBigInt (val) = if ((zeroBigInt > val))
9778 then -(val)
9879 else val
9980
10081
10182 func fc () = "%s__factoryContract"
10283
10384
10485 func mpk () = "%s__managerPublicKey"
10586
10687
10788 func pmpk () = "%s__pendingManagerPublicKey"
10889
10990
11091 func pl () = "%s%s__price__last"
11192
11293
11394 func ph (h,t) = makeString(["%s%s%d%d__price__history", toString(h), toString(t)], SEP)
11495
11596
11697 func pau (ua,txId) = ((("%s%s%s__P__" + ua) + "__") + txId)
11798
11899
119100 func gau (ua,txId) = ((("%s%s%s__G__" + ua) + "__") + txId)
120101
121102
122103 func aa () = "%s__amountAsset"
123104
124105
125106 func pa () = "%s__priceAsset"
126107
127108
128109 func amp () = "%s__amp"
129110
130111
131112 func ada () = "%s__addonAddr"
132113
133114
134115 let keyFee = "%s__fee"
135116
136117 let fee = valueOrElse(getInteger(this, keyFee), feeDefault)
137118
138119 let keyDLp = makeString(["%s", "dLp"], SEP)
139120
140121 let keyDLpRefreshedHeight = makeString(["%s", "dLpRefreshedHeight"], SEP)
141122
142123 let keyDLpRefreshDelay = makeString(["%s", "refreshDLpDelay"], SEP)
143124
144125 let dLpRefreshDelayDefault = 1
145126
146127 let dLpRefreshDelay = valueOrElse(getInteger(this, keyDLpRefreshDelay), dLpRefreshDelayDefault)
147128
148129 func fcfg () = "%s__factoryConfig"
149130
150131
151132 func mtpk () = "%s%s__matcher__publicKey"
152133
153134
154135 func pc (iAmtAs,iPrAs) = (((("%d%d%s__" + iAmtAs) + "__") + iPrAs) + "__config")
155136
156137
157138 func mba (bAStr) = ("%s%s%s__mappings__baseAsset2internalId__" + bAStr)
158139
159140
160141 func aps () = "%s__shutdown"
161142
162143
163144 func keyAllowedLpStableScriptHash () = "%s__allowedLpStableScriptHash"
164145
165146
166147 func keyFeeCollectorAddress () = "%s__feeCollectorAddress"
167148
168149
169-func toe (orV,sendrV,matchV) = throw(((((("Failed: ordValid=" + toString(orV)) + " sndrValid=") + toString(sendrV)) + " mtchrValid=") + toString(matchV)))
150+func throwOrderError (orderValid,orderValidInfo,senderValid,matcherValid) = throw((((((((("order validation failed: orderValid=" + toString(orderValid)) + " (") + orderValidInfo) + ")") + " senderValid=") + toString(senderValid)) + " matcherValid=") + toString(matcherValid)))
170151
171152
172153 func strf (addr,key) = valueOrErrorMessage(getString(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
173154
174155
175156 func intf (addr,key) = valueOrErrorMessage(getInteger(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
176157
177158
178159 func throwErr (msg) = throw(makeString(["lp_stable.ride:", msg], " "))
179160
180161
181162 func fmtErr (msg) = makeString(["lp_stable.ride:", msg], " ")
182163
183164
184165 let fca = addressFromStringValue(strf(this, fc()))
185166
186167 let inFee = {
187168 let @ = invoke(fca, "getInFeeREADONLY", [toString(this)], nil)
188169 if ($isInstanceOf(@, "Int"))
189170 then @
190171 else throw(($getType(@) + " couldn't be cast to Int"))
191172 }
192173
193174 let outFee = {
194175 let @ = invoke(fca, "getOutFeeREADONLY", [toString(this)], nil)
195176 if ($isInstanceOf(@, "Int"))
196177 then @
197178 else throw(($getType(@) + " couldn't be cast to Int"))
198179 }
199180
200181 let A = strf(this, amp())
201182
202183 func igs () = valueOrElse(getBoolean(fca, aps()), false)
203184
204185
205186 func mp () = fromBase58String(strf(fca, mtpk()))
206187
207188
208189 let feeCollectorAddress = addressFromStringValue(strf(fca, keyFeeCollectorAddress()))
209190
210191 func gpc () = {
211192 let amtAs = strf(this, aa())
212193 let priceAs = strf(this, pa())
213194 let iPriceAs = intf(fca, mba(priceAs))
214195 let iAmtAs = intf(fca, mba(amtAs))
215196 split(strf(fca, pc(toString(iAmtAs), toString(iPriceAs))), SEP)
216197 }
217198
218199
219200 func parseAssetId (input) = if ((input == wavesString))
220201 then unit
221202 else fromBase58String(input)
222203
223204
224205 func assetIdToString (input) = if ((input == unit))
225206 then wavesString
226207 else toBase58String(value(input))
227208
228209
229210 func parsePoolConfig (poolConfig) = $Tuple9(addressFromStringValue(poolConfig[idxPoolAddress]), parseIntValue(poolConfig[idxPoolSt]), fromBase58String(poolConfig[idxLPAsId]), parseAssetId(poolConfig[idxAmAsId]), parseAssetId(poolConfig[idxPrAsId]), parseIntValue(poolConfig[idxAmtAsDcm]), parseIntValue(poolConfig[idxPriceAsDcm]), fromBase58String(poolConfig[idxIAmtAsId]), fromBase58String(poolConfig[idxIPriceAsId]))
230211
231212
232213 let poolConfigParsed = parsePoolConfig(gpc())
233214
234-let $t078478076 = poolConfigParsed
215+let $t079648193 = poolConfigParsed
235216
236-let cfgPoolAddress = $t078478076._1
217+let cfgPoolStatus = $t079648193._2
237218
238-let cfgPoolStatus = $t078478076._2
219+let cfgLpAssetId = $t079648193._3
239220
240-let cfgLpAssetId = $t078478076._3
221+let cfgAmountAssetId = $t079648193._4
241222
242-let cfgAmountAssetId = $t078478076._4
223+let cfgPriceAssetId = $t079648193._5
243224
244-let cfgPriceAssetId = $t078478076._5
225+let cfgAmountAssetDecimals = $t079648193._6
245226
246-let cfgAmountAssetDecimals = $t078478076._6
227+let cfgPriceAssetDecimals = $t079648193._7
247228
248-let cfgPriceAssetDecimals = $t078478076._7
229+let cfgInAmountAssedId = $t079648193._8
249230
250-let cfgInAmountAssedId = $t078478076._8
251-
252-let cfgInPriceAssetId = $t078478076._9
231+let cfgInPriceAssetId = $t079648193._9
253232
254233 func gfc () = split(strf(fca, fcfg()), SEP)
255234
256235
257236 let factoryConfig = gfc()
258237
259238 let stakingContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactStakCntr]), "Invalid staking contract address")
260-
261-let slipageContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactSlippCntr]), "Invalid slipage contract address")
262-
263-let gwxContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactGwxRewCntr]), "Invalid gwx contract address")
264239
265240 let restContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactoryRestCntr]), "Invalid gwx contract address")
266241
267242 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)
268243
269244
270245 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)
271246
272247
273248 func getAccBalance (assetId) = if ((assetId == "WAVES"))
274249 then wavesBalance(this).available
275250 else assetBalance(this, fromBase58String(assetId))
276251
277252
278253 func cpbi (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
279254
280255
281256 func cpbir (prAmtX18,amAmtX18,round) = fraction(prAmtX18, scale18, amAmtX18, round)
282257
283258
284-func vad (A1,A2,slippage) = {
285- let diff = fraction((A1 - A2), scale8BigInt, A2)
286- let pass = ((slippage - abs(diff)) > zeroBigInt)
287- if (!(pass))
288- then throw(("Big slpg: " + toString(diff)))
289- else $Tuple2(pass, min([A1, A2]))
290- }
291-
292-
293-func vd (D1,D0,slpg) = {
294- let diff = fraction(D0, scale8BigInt, D1)
295- let fail = (slpg > diff)
296- if (if (fail)
297- then true
298- else (D0 > D1))
299- then throw(((((((toString(D0) + " ") + toString(D1)) + " ") + toString(diff)) + " ") + toString(slpg)))
300- else fail
301- }
302-
303-
304259 func pcp (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
305260 let amtAsAmtX18 = t1(amAmt, amAssetDcm)
306261 let prAsAmtX18 = t1(prAmt, prAssetDcm)
307262 cpbi(prAsAmtX18, amtAsAmtX18)
308263 }
309264
310265
311266 func calcPrices (amAmt,prAmt,lpAmt) = {
312267 let amtAsDcm = cfgAmountAssetDecimals
313268 let prAsDcm = cfgPriceAssetDecimals
314269 let priceX18 = pcp(amtAsDcm, prAsDcm, amAmt, prAmt)
315270 let amAmtX18 = t1(amAmt, amtAsDcm)
316271 let prAmtX18 = t1(prAmt, prAsDcm)
317272 let lpAmtX18 = t1(lpAmt, scale8)
318273 let lpPrInAmAsX18 = cpbi(amAmtX18, lpAmtX18)
319274 let lpPrInPrAsX18 = cpbi(prAmtX18, lpAmtX18)
320275 [priceX18, lpPrInAmAsX18, lpPrInPrAsX18]
321- }
322-
323-
324-func calculatePrices (amAmt,prAmt,lpAmt) = {
325- let p = calcPrices(amAmt, prAmt, lpAmt)
326-[f1(p[0], scale8), f1(p[1], scale8), f1(p[2], scale8)]
327276 }
328277
329278
330279 func takeFee (amount,fee) = {
331280 let feeAmount = if ((fee == 0))
332281 then 0
333282 else fraction(amount, fee, scale8)
334283 $Tuple2((amount - feeAmount), feeAmount)
335284 }
336285
337286
338287 func getD (xp) = {
339288 let xp0 = xp[0]
340289 let xp1 = xp[1]
341290 let s = (xp0 + xp1)
342291 if ((s == big0))
343292 then big0
344293 else {
345294 let a = parseIntValue(A)
346295 let ann = (a * 2)
347296 let p = fraction(xp0, xp1, big1)
348297 let xp0_xp1_n_n = fraction(p, big4, big1)
349298 let ann_s = fraction(toBigInt(ann), s, big1)
350299 let ann_1 = toBigInt((ann - 1))
351300 func calcDNext (d) = {
352301 let dd = fraction(d, d, big1)
353302 let ddd = fraction(dd, d, big1)
354303 let dp = fraction(ddd, big1, xp0_xp1_n_n)
355304 fraction((ann_s + fraction(dp, big2, big1)), d, (fraction(ann_1, d, big1) + fraction(big3, dp, big1)))
356305 }
357306
358307 func calc (acc,i) = if (acc._2)
359308 then acc
360309 else {
361310 let d = acc._1
362311 let dNext = calcDNext(d)
363312 let dDiffRaw = (dNext - value(d))
364313 let dDiff = if ((big0 > dDiffRaw))
365314 then -(dDiffRaw)
366315 else dDiffRaw
367316 if ((big1 >= dDiff))
368317 then $Tuple2(dNext, true)
369318 else $Tuple2(dNext, false)
370319 }
371320
372321 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
373- let $t01257312621 = {
322+ let $t01269012738 = {
374323 let $l = arr
375324 let $s = size($l)
376325 let $acc0 = $Tuple2(s, false)
377326 func $f0_1 ($a,$i) = if (($i >= $s))
378327 then $a
379328 else calc($a, $l[$i])
380329
381330 func $f0_2 ($a,$i) = if (($i >= $s))
382331 then $a
383332 else throw("List size exceeds 15")
384333
385334 $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)
386335 }
387- let d = $t01257312621._1
388- let found = $t01257312621._2
336+ let d = $t01269012738._1
337+ let found = $t01269012738._2
389338 if (found)
390339 then d
391340 else throw(("D calculation error, D = " + toString(d)))
392341 }
393342 }
394343
395344
396345 func ego (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
397346 let lpId = cfgLpAssetId
398347 let amId = toBase58String(value(cfgAmountAssetId))
399348 let prId = toBase58String(value(cfgPriceAssetId))
400349 let amDcm = cfgAmountAssetDecimals
401350 let prDcm = cfgPriceAssetDecimals
402351 let sts = toString(cfgPoolStatus)
403352 let lpEmiss = valueOrErrorMessage(assetInfo(lpId), "Wrong LP id").quantity
404353 if ((toBase58String(lpId) != pmtAssetId))
405354 then throw("Wrong pmt asset")
406355 else {
407356 let amBalance = getAccBalance(amId)
408357 let amBalanceX18 = t1(amBalance, amDcm)
409358 let prBalance = getAccBalance(prId)
410359 let prBalanceX18 = t1(prBalance, prDcm)
411360 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
412361 let curPrice = f1(curPriceX18, scale8)
413362 let pmtLpAmtX18 = t1(pmtLpAmt, scale8)
414363 let lpEmissX18 = t1(lpEmiss, scale8)
415364 let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissX18)
416365 let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissX18)
417366 let outAmAmt = fromX18Round(outAmAmtX18, amDcm, FLOOR)
418367 let outPrAmt = fromX18Round(outPrAmtX18, prDcm, FLOOR)
419368 let state = if ((txId58 == ""))
420369 then nil
421370 else [ScriptTransfer(userAddress, outAmAmt, if ((amId == "WAVES"))
422371 then unit
423372 else fromBase58String(amId)), ScriptTransfer(userAddress, outPrAmt, if ((prId == "WAVES"))
424373 then unit
425374 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)]
426375 $Tuple10(outAmAmt, outPrAmt, amId, prId, amBalance, prBalance, lpEmiss, curPriceX18, sts, state)
427376 }
428377 }
429378
430379
431380 func epo (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,userAddress,isEval,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
432381 let lpId = cfgLpAssetId
433382 let amIdStr = toBase58String(value(cfgAmountAssetId))
434383 let prIdStr = toBase58String(value(cfgPriceAssetId))
435384 let inAmIdStr = cfgInAmountAssedId
436385 let inPrIdStr = cfgInPriceAssetId
437386 let amtDcm = cfgAmountAssetDecimals
438387 let priceDcm = cfgPriceAssetDecimals
439388 let sts = toString(cfgPoolStatus)
440389 let lpEm = valueOrErrorMessage(assetInfo(lpId), "Wr lp as").quantity
441390 let amBalance = if (isEval)
442391 then getAccBalance(amIdStr)
443392 else if (if (isOneAsset)
444393 then (pmtId == amIdStr)
445394 else false)
446395 then (getAccBalance(amIdStr) - pmtAmt)
447396 else if (isOneAsset)
448397 then getAccBalance(amIdStr)
449398 else (getAccBalance(amIdStr) - inAmAmt)
450399 let prBalance = if (isEval)
451400 then getAccBalance(prIdStr)
452401 else if (if (isOneAsset)
453402 then (pmtId == prIdStr)
454403 else false)
455404 then (getAccBalance(prIdStr) - pmtAmt)
456405 else if (isOneAsset)
457406 then getAccBalance(prIdStr)
458407 else (getAccBalance(prIdStr) - inPrAmt)
459408 let inAmAssetAmtX18 = t1(inAmAmt, amtDcm)
460409 let inPrAssetAmtX18 = t1(inPrAmt, priceDcm)
461410 let userPriceX18 = cpbi(inPrAssetAmtX18, inAmAssetAmtX18)
462411 let amBalanceX18 = t1(amBalance, amtDcm)
463412 let prBalanceX18 = t1(prBalance, priceDcm)
464413 let D0 = getD([amBalanceX18, prBalanceX18])
465414 let r = if ((lpEm == 0))
466415 then {
467416 let D1 = getD([(amBalanceX18 + inAmAssetAmtX18), (prBalanceX18 + inPrAssetAmtX18)])
468417 let checkD = if ((D1 > D0))
469418 then true
470419 else throw("D1 should be greater than D0")
471420 if ((checkD == checkD))
472421 then {
473422 let curPriceX18 = zeroBigInt
474423 let slippageX18 = zeroBigInt
475- let lpAmtX18 = D1
424+ let lpAmtX18 = pow((inAmAssetAmtX18 * inPrAssetAmtX18), 0, toBigInt(5), 1, 0, DOWN)
476425 $Tuple5(f1(lpAmtX18, scale8), f1(inAmAssetAmtX18, amtDcm), f1(inPrAssetAmtX18, priceDcm), cpbi((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
477426 }
478427 else throw("Strict value is not equal to itself.")
479428 }
480429 else {
481430 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
482431 let slippageRealX18 = fraction(abs((curPriceX18 - userPriceX18)), scale18, curPriceX18)
483432 let slippageX18 = t1(slippage, scale8)
484433 if (if (if (validateSlippage)
485434 then (curPriceX18 != zeroBigInt)
486435 else false)
487436 then (slippageRealX18 > slippageX18)
488437 else false)
489438 then throw(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
490439 else {
491440 let lpEmissionX18 = t1(lpEm, scale8)
492441 let prViaAmX18 = fraction(inAmAssetAmtX18, cpbir(prBalanceX18, amBalanceX18, CEILING), scale18, CEILING)
493442 let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, cpbir(prBalanceX18, amBalanceX18, FLOOR), CEILING)
494443 let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
495444 then $Tuple2(amViaPrX18, inPrAssetAmtX18)
496445 else $Tuple2(inAmAssetAmtX18, prViaAmX18)
497446 let expAmtAssetAmtX18 = expectedAmts._1
498447 let expPriceAssetAmtX18 = expectedAmts._2
499- let D1 = getD([(amBalanceX18 + expAmtAssetAmtX18), (prBalanceX18 + expPriceAssetAmtX18)])
500- let checkD = if ((D1 > D0))
501- then true
502- else throw("D1 should be greater than D0")
503- if ((checkD == checkD))
504- then {
505- let lpAmtX18 = fraction(lpEmissionX18, (D1 - D0), D0)
506- $Tuple5(fromX18Round(lpAmtX18, scale8, FLOOR), fromX18Round(expAmtAssetAmtX18, amtDcm, CEILING), fromX18Round(expPriceAssetAmtX18, priceDcm, CEILING), curPriceX18, slippageX18)
507- }
508- else throw("Strict value is not equal to itself.")
448+ let lpAmtX18 = fraction(lpEmissionX18, expPriceAssetAmtX18, prBalanceX18, FLOOR)
449+ $Tuple5(fromX18Round(lpAmtX18, scale8, FLOOR), fromX18Round(expAmtAssetAmtX18, amtDcm, CEILING), fromX18Round(expPriceAssetAmtX18, priceDcm, CEILING), curPriceX18, slippageX18)
509450 }
510451 }
511452 let calcLpAmt = r._1
512453 let calcAmAssetPmt = r._2
513454 let calcPrAssetPmt = r._3
514455 let curPrice = f1(r._4, scale8)
515456 let slippageCalc = f1(r._5, scale8)
516457 if ((0 >= calcLpAmt))
517458 then throw("LP <= 0")
518459 else {
519460 let emitLpAmt = if (!(emitLp))
520461 then 0
521462 else calcLpAmt
522463 let amDiff = (inAmAmt - calcAmAssetPmt)
523464 let prDiff = (inPrAmt - calcPrAssetPmt)
524- let $t02046020805 = if (if (isOneAsset)
465+ let $t02058120926 = if (if (isOneAsset)
525466 then (pmtId == amIdStr)
526467 else false)
527468 then $Tuple2(pmtAmt, 0)
528469 else if (if (isOneAsset)
529470 then (pmtId == prIdStr)
530471 else false)
531472 then $Tuple2(0, pmtAmt)
532473 else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
533- let writeAmAmt = $t02046020805._1
534- let writePrAmt = $t02046020805._2
474+ let writeAmAmt = $t02058120926._1
475+ let writePrAmt = $t02058120926._2
535476 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))]
536477 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
537478 }
538479 }
539480
540481
541482 func getYD (xp,i,D) = {
542483 let n = big2
543484 let x = xp[if ((i == 0))
544485 then 1
545486 else 0]
546487 let aPrecision = parseBigIntValue(Amult)
547488 let a = (parseBigIntValue(A) * aPrecision)
548489 let s = x
549490 let ann = (a * n)
550491 let c = (((((D * D) / (x * n)) * D) * aPrecision) / (ann * n))
551492 let b = ((s + ((D * aPrecision) / ann)) - D)
552493 func calc (acc,cur) = {
553- let $t02200022020 = acc
554- let y = $t02200022020._1
555- let found = $t02200022020._2
494+ let $t02212122141 = acc
495+ let y = $t02212122141._1
496+ let found = $t02212122141._2
556497 if ((found != unit))
557498 then acc
558499 else {
559500 let yNext = (((y * y) + c) / ((big2 * y) + b))
560501 let yDiff = absBigInt((yNext - value(y)))
561502 if ((big1 >= yDiff))
562503 then $Tuple2(yNext, cur)
563504 else $Tuple2(yNext, unit)
564505 }
565506 }
566507
567508 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
568- let $t02232722374 = {
509+ let $t02244822495 = {
569510 let $l = arr
570511 let $s = size($l)
571512 let $acc0 = $Tuple2(D, unit)
572513 func $f0_1 ($a,$i) = if (($i >= $s))
573514 then $a
574515 else calc($a, $l[$i])
575516
576517 func $f0_2 ($a,$i) = if (($i >= $s))
577518 then $a
578519 else throw("List size exceeds 15")
579520
580521 $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)
581522 }
582- let y = $t02232722374._1
583- let found = $t02232722374._2
523+ let y = $t02244822495._1
524+ let found = $t02244822495._2
584525 if ((found != unit))
585526 then y
586527 else throw(("Y calculation error, Y = " + toString(y)))
587528 }
588529
589530
590531 func calcDLp (amountBalance,priceBalance,lpEmission) = {
591532 let updatedDLp = fraction(getD([t1BigInt(amountBalance, toBigInt(cfgAmountAssetDecimals)), t1BigInt(priceBalance, toBigInt(cfgPriceAssetDecimals))]), scale18, lpEmission)
592533 if ((lpEmission == big0))
593534 then big0
594535 else updatedDLp
595536 }
596537
597538
598539 func calcCurrentDLp (amountAssetDelta,priceAssetDelta,lpAssetEmissionDelta) = {
599540 let amountAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgAmountAssetId))) - amountAssetDelta)
600541 let priceAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgPriceAssetId))) - priceAssetDelta)
601542 let lpAssetEmission = (toBigInt(value(assetInfo(cfgLpAssetId)).quantity) - lpAssetEmissionDelta)
602543 let currentDLp = calcDLp(amountAssetBalance, priceAssetBalance, lpAssetEmission)
603544 currentDLp
604545 }
605546
606547
607548 func refreshDLpInternal (amountAssetBalanceDelta,priceAssetBalanceDelta,lpAssetEmissionDelta) = {
608549 let amountAssetBalance = (getAccBalance(assetIdToString(cfgAmountAssetId)) + amountAssetBalanceDelta)
609550 let priceAssetBalance = (getAccBalance(assetIdToString(cfgPriceAssetId)) + priceAssetBalanceDelta)
610551 let lpAssetEmission = (value(assetInfo(cfgLpAssetId)).quantity + lpAssetEmissionDelta)
611552 let updatedDLp = calcDLp(toBigInt(amountAssetBalance), toBigInt(priceAssetBalance), toBigInt(lpAssetEmission))
612553 let actions = [IntegerEntry(keyDLpRefreshedHeight, height), StringEntry(keyDLp, toString(updatedDLp))]
613554 $Tuple2(actions, updatedDLp)
614555 }
615556
616557
617558 func validateUpdatedDLp (oldDLp,updatedDLp) = if ((updatedDLp >= oldDLp))
618559 then true
619560 else throwErr("updated DLp lower than current DLp")
620561
621562
622563 func validateMatcherOrderAllowed (order) = {
623564 let amountAssetAmount = order.amount
624565 let priceAssetAmount = fraction(order.amount, order.price, scale8, FLOOR)
625- let $t02441824630 = if ((order.orderType == Buy))
566+ let $t02453924751 = if ((order.orderType == Buy))
626567 then $Tuple2(amountAssetAmount, -(priceAssetAmount))
627568 else $Tuple2(-(amountAssetAmount), priceAssetAmount)
628- let amountAssetBalanceDelta = $t02441824630._1
629- let priceAssetBalanceDelta = $t02441824630._2
569+ let amountAssetBalanceDelta = $t02453924751._1
570+ let priceAssetBalanceDelta = $t02453924751._2
630571 if (if (if (igs())
631572 then true
632573 else (cfgPoolStatus == PoolMatcherDis))
633574 then true
634575 else (cfgPoolStatus == PoolShutdown))
635576 then throw("Admin blocked")
636577 else if (if ((order.assetPair.amountAsset != cfgAmountAssetId))
637578 then true
638579 else (order.assetPair.priceAsset != cfgPriceAssetId))
639580 then throw("Wr assets")
640581 else {
641582 let dLp = parseBigIntValue(getStringValue(this, keyDLp))
642- let $t02496025060 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
643- let unusedActions = $t02496025060._1
644- let dLpNew = $t02496025060._2
583+ let $t02508125181 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
584+ let unusedActions = $t02508125181._1
585+ let dLpNew = $t02508125181._2
645586 let isOrderValid = (dLpNew >= dLp)
646- isOrderValid
587+ let info = makeString([toString(dLp), toString(dLpNew)], " ")
588+ $Tuple2(isOrderValid, info)
647589 }
648590 }
649591
650592
651593 func cg (i) = if ((size(i.payments) != 1))
652594 then throw("1 pmnt exp")
653595 else {
654596 let pmt = value(i.payments[0])
655597 let pmtAssetId = value(pmt.assetId)
656598 let pmtAmt = pmt.amount
657599 let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
658600 let outAmAmt = r._1
659601 let outPrAmt = r._2
660602 let sts = parseIntValue(r._9)
661603 let state = r._10
662604 if (if (igs())
663605 then true
664606 else (sts == PoolShutdown))
665607 then throw(("Admin blocked: " + toString(sts)))
666608 else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state)
667609 }
668610
669611
670612 func cp (caller,txId,amAsPmt,prAsPmt,slippage,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
671613 let r = epo(txId, slippage, value(amAsPmt).amount, value(amAsPmt).assetId, value(prAsPmt).amount, value(prAsPmt).assetId, caller, (txId == ""), emitLp, isOneAsset, validateSlippage, pmtAmt, pmtId)
672614 let sts = parseIntValue(r._8)
673615 if (if (if (igs())
674616 then true
675617 else (sts == PoolPutDis))
676618 then true
677619 else (sts == PoolShutdown))
678620 then throw(("Blocked:" + toString(sts)))
679621 else r
680622 }
681623
682624
683625 func calcPutOneTkn (pmtAmtRaw,pmtAssetId,userAddress,txId,withTakeFee) = {
684626 let amId = toBase58String(value(cfgAmountAssetId))
685627 let prId = toBase58String(value(cfgPriceAssetId))
686628 let lpId = cfgLpAssetId
687629 let amtDcm = cfgAmountAssetDecimals
688630 let priceDcm = cfgPriceAssetDecimals
689631 let lpAssetEmission = toBigInt(valueOrErrorMessage(assetInfo(lpId), "invalid lp asset").quantity)
690632 let chechEmission = if ((lpAssetEmission > big0))
691633 then true
692634 else throw("initial deposit requires all coins")
693635 if ((chechEmission == chechEmission))
694636 then {
695637 let amBalance = getAccBalance(amId)
696638 let prBalance = getAccBalance(prId)
697- let $t02732627788 = if ((txId == ""))
639+ let $t02753327995 = if ((txId == ""))
698640 then $Tuple2(amBalance, prBalance)
699641 else if ((pmtAssetId == amId))
700642 then if ((pmtAmtRaw > amBalance))
701643 then throw("invalid payment amount")
702644 else $Tuple2((amBalance - pmtAmtRaw), prBalance)
703645 else if ((pmtAssetId == prId))
704646 then if ((pmtAmtRaw > prBalance))
705647 then throw("invalid payment amount")
706648 else $Tuple2(amBalance, (prBalance - pmtAmtRaw))
707649 else throw("wrong pmtAssetId")
708- let amBalanceOld = $t02732627788._1
709- let prBalanceOld = $t02732627788._2
710- let $t02779427970 = if ((pmtAssetId == amId))
650+ let amBalanceOld = $t02753327995._1
651+ let prBalanceOld = $t02753327995._2
652+ let $t02800128177 = if ((pmtAssetId == amId))
711653 then $Tuple2(pmtAmtRaw, 0)
712654 else if ((pmtAssetId == prId))
713655 then $Tuple2(0, pmtAmtRaw)
714656 else throw("invalid payment")
715- let amAmountRaw = $t02779427970._1
716- let prAmountRaw = $t02779427970._2
717- let $t02797428228 = if (withTakeFee)
657+ let amAmountRaw = $t02800128177._1
658+ let prAmountRaw = $t02800128177._2
659+ let $t02818128435 = if (withTakeFee)
718660 then $Tuple3(takeFee(amAmountRaw, inFee)._1, takeFee(prAmountRaw, inFee)._1, takeFee(pmtAmtRaw, inFee)._2)
719661 else $Tuple3(amAmountRaw, prAmountRaw, 0)
720- let amAmount = $t02797428228._1
721- let prAmount = $t02797428228._2
722- let feeAmount = $t02797428228._3
662+ let amAmount = $t02818128435._1
663+ let prAmount = $t02818128435._2
664+ let feeAmount = $t02818128435._3
723665 let amBalanceNew = (amBalanceOld + amAmount)
724666 let prBalanceNew = (prBalanceOld + prAmount)
725667 let D0 = getD([t1(amBalanceOld, cfgAmountAssetDecimals), t1(prBalanceOld, cfgPriceAssetDecimals)])
726668 let D1 = getD([t1(amBalanceNew, cfgAmountAssetDecimals), t1(prBalanceNew, cfgPriceAssetDecimals)])
727669 let checkD = if ((D1 > D0))
728670 then true
729671 else throw()
730672 if ((checkD == checkD))
731673 then {
732674 let lpAmount = fraction(lpAssetEmission, (D1 - D0), D0, FLOOR)
733675 let curPrice = f1(cpbi(t1(prBalanceNew, priceDcm), t1(amBalanceNew, amtDcm)), scale8)
734676 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))]
735677 let poolProportion = fraction(prBalanceOld, scale8, amBalanceOld)
736678 let amountAssetPart = fraction(pmtAmtRaw, scale8, (poolProportion + scale8))
737679 let priceAssetPart = (pmtAmtRaw - amountAssetPart)
738680 let lpAmtBoth = fraction(lpAssetEmission, toBigInt(priceAssetPart), toBigInt(prBalanceOld))
739681 let bonus = toInt(fraction((lpAmount - lpAmtBoth), scale8BigInt, lpAmtBoth))
740682 $Tuple4(toInt(lpAmount), commonState, feeAmount, bonus)
741683 }
742684 else throw("Strict value is not equal to itself.")
743685 }
744686 else throw("Strict value is not equal to itself.")
745687 }
746688
747689
748690 func getOneTknV2Internal (outAssetId,minOutAmount,payments,caller,originCaller,transactionId) = {
749691 let lpId = toBase58String(value(cfgLpAssetId))
750692 let amId = toBase58String(value(cfgAmountAssetId))
751693 let prId = toBase58String(value(cfgPriceAssetId))
752694 let amDecimals = cfgAmountAssetDecimals
753695 let prDecimals = cfgPriceAssetDecimals
754696 let poolStatus = cfgPoolStatus
755697 let userAddress = if ((caller == restContract))
756698 then originCaller
757699 else caller
758700 let pmt = value(payments[0])
759701 let pmtAssetId = value(pmt.assetId)
760702 let pmtAmt = pmt.amount
761703 let currentDLp = calcCurrentDLp(big0, big0, big0)
762704 if ((currentDLp == currentDLp))
763705 then {
764706 let txId58 = toBase58String(transactionId)
765707 if ((lpId != toBase58String(pmtAssetId)))
766708 then throw("Wrong LP")
767709 else {
768710 let amBalance = getAccBalance(amId)
769711 let prBalance = getAccBalance(prId)
770- let $t03034030451 = {
712+ let $t03054730658 = {
771713 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)
772714 if ($isInstanceOf(@, "(Int, Int)"))
773715 then @
774716 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
775717 }
776- if (($t03034030451 == $t03034030451))
718+ if (($t03054730658 == $t03054730658))
777719 then {
778- let feeAmount = $t03034030451._2
779- let totalGet = $t03034030451._1
720+ let feeAmount = $t03054730658._2
721+ let totalGet = $t03054730658._1
780722 let totalAmount = if (if ((minOutAmount > 0))
781723 then (minOutAmount > totalGet)
782724 else false)
783725 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
784726 else totalGet
785- let $t03064130948 = if ((outAssetId == amId))
727+ let $t03084831155 = if ((outAssetId == amId))
786728 then $Tuple4(totalAmount, 0, ((amBalance - totalAmount) - feeAmount), prBalance)
787729 else if ((outAssetId == prId))
788730 then $Tuple4(0, totalAmount, amBalance, ((prBalance - totalAmount) - feeAmount))
789731 else throw("invalid out asset id")
790- let outAm = $t03064130948._1
791- let outPr = $t03064130948._2
792- let amBalanceNew = $t03064130948._3
793- let prBalanceNew = $t03064130948._4
732+ let outAm = $t03084831155._1
733+ let outPr = $t03084831155._2
734+ let amBalanceNew = $t03084831155._3
735+ let prBalanceNew = $t03084831155._4
794736 let curPrX18 = cpbi(t1(prBalanceNew, prDecimals), t1(amBalanceNew, amDecimals))
795737 let curPr = f1(curPrX18, scale8)
796738 let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
797739 then unit
798740 else fromBase58String(outAssetId)
799741 let sendFeeToMatcher = if ((feeAmount > 0))
800742 then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetIdOrWaves)]
801743 else nil
802744 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)
803745 if ((state == state))
804746 then {
805747 let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
806748 if ((burn == burn))
807749 then {
808- let $t03173332083 = {
750+ let $t03194032290 = {
809751 let feeAmountForCalc = if ((this == feeCollectorAddress))
810752 then 0
811753 else feeAmount
812754 let outInAmountAsset = if ((parseAssetId(outAssetId) == cfgAmountAssetId))
813755 then true
814756 else false
815757 if (outInAmountAsset)
816758 then $Tuple2(-((totalGet + feeAmountForCalc)), 0)
817759 else $Tuple2(0, -((totalGet + feeAmountForCalc)))
818760 }
819- let amountAssetBalanceDelta = $t03173332083._1
820- let priceAssetBalanceDelta = $t03173332083._2
821- let $t03208632194 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
822- let refreshDLpActions = $t03208632194._1
823- let updatedDLp = $t03208632194._2
761+ let amountAssetBalanceDelta = $t03194032290._1
762+ let priceAssetBalanceDelta = $t03194032290._2
763+ let $t03229332401 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
764+ let refreshDLpActions = $t03229332401._1
765+ let updatedDLp = $t03229332401._2
824766 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
825767 if ((isUpdatedDLpValid == isUpdatedDLpValid))
826768 then $Tuple2((state ++ refreshDLpActions), totalAmount)
827769 else throw("Strict value is not equal to itself.")
828770 }
829771 else throw("Strict value is not equal to itself.")
830772 }
831773 else throw("Strict value is not equal to itself.")
832774 }
833775 else throw("Strict value is not equal to itself.")
834776 }
835777 }
836778 else throw("Strict value is not equal to itself.")
837779 }
838780
839781
840782 func m () = match getString(mpk()) {
841783 case s: String =>
842784 fromBase58String(s)
843785 case _: Unit =>
844786 unit
845787 case _ =>
846788 throw("Match error")
847789 }
848790
849791
850792 func pm () = match getString(pmpk()) {
851793 case s: String =>
852794 fromBase58String(s)
853795 case _: Unit =>
854796 unit
855797 case _ =>
856798 throw("Match error")
857799 }
858800
859801
860802 let pd = throw("Permission denied")
861803
862804 func isManager (i) = match m() {
863805 case pk: ByteVector =>
864806 (i.callerPublicKey == pk)
865807 case _: Unit =>
866808 (i.caller == this)
867809 case _ =>
868810 throw("Match error")
869811 }
870812
871813
872814 func mm (i) = match m() {
873815 case pk: ByteVector =>
874816 if ((i.callerPublicKey == pk))
875817 then true
876818 else pd
877819 case _: Unit =>
878820 if ((i.caller == this))
879821 then true
880822 else pd
881823 case _ =>
882824 throw("Match error")
883825 }
884826
885827
886828 @Callable(i)
887829 func constructor (fc) = {
888830 let c = mm(i)
889831 if ((c == c))
890832 then [StringEntry(fc(), fc)]
891833 else throw("Strict value is not equal to itself.")
892834 }
893835
894836
895837
896838 @Callable(i)
897839 func setManager (pendingManagerPublicKey) = {
898840 let c = mm(i)
899841 if ((c == c))
900842 then {
901843 let cm = fromBase58String(pendingManagerPublicKey)
902844 if ((cm == cm))
903845 then [StringEntry(pmpk(), pendingManagerPublicKey)]
904846 else throw("Strict value is not equal to itself.")
905847 }
906848 else throw("Strict value is not equal to itself.")
907849 }
908850
909851
910852
911853 @Callable(i)
912854 func confirmManager () = {
913855 let p = pm()
914856 let hpm = if (isDefined(p))
915857 then true
916858 else throw("No pending manager")
917859 if ((hpm == hpm))
918860 then {
919861 let cpm = if ((i.callerPublicKey == value(p)))
920862 then true
921863 else throw("You are not pending manager")
922864 if ((cpm == cpm))
923865 then [StringEntry(mpk(), toBase58String(value(p))), DeleteEntry(pmpk())]
924866 else throw("Strict value is not equal to itself.")
925867 }
926868 else throw("Strict value is not equal to itself.")
927869 }
928870
929871
930872
931873 @Callable(i)
932874 func put (slip,autoStake) = {
933875 let factCfg = gfc()
934876 let stakingCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactStakCntr]), "Wr st addr")
935877 let slipCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactSlippCntr]), "Wr sl addr")
936878 if ((0 > slip))
937879 then throw("Wrong slippage")
938880 else if ((size(i.payments) != 2))
939881 then throw("2 pmnts expd")
940882 else {
941883 let amAssetPmt = toBigInt(value(i.payments[0]).amount)
942884 let prAssetPmt = toBigInt(value(i.payments[1]).amount)
943885 let amountAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgAmountAssetId))) - amAssetPmt)
944886 if ((amountAssetBalance == amountAssetBalance))
945887 then {
946888 let priceAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgPriceAssetId))) - prAssetPmt)
947889 if ((priceAssetBalance == priceAssetBalance))
948890 then {
949891 let lpAssetEmission = toBigInt(value(assetInfo(cfgLpAssetId)).quantity)
950892 if ((lpAssetEmission == lpAssetEmission))
951893 then {
952894 let currentDLp = calcCurrentDLp(amAssetPmt, prAssetPmt, toBigInt(0))
953895 if ((currentDLp == currentDLp))
954896 then {
955897 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, "")
956898 let emitLpAmt = e._2
957899 let lpAssetId = e._7
958900 let state = e._9
959901 let amDiff = e._10
960902 let prDiff = e._11
961903 let amId = e._12
962904 let prId = e._13
963905 let r = invoke(fca, "emit", [emitLpAmt], nil)
964906 if ((r == r))
965907 then {
966908 let el = match r {
967909 case legacy: Address =>
968910 invoke(legacy, "emit", [emitLpAmt], nil)
969911 case _ =>
970912 unit
971913 }
972914 if ((el == el))
973915 then {
974916 let sa = if ((amDiff > 0))
975917 then invoke(slipCntr, "put", nil, [AttachedPayment(amId, amDiff)])
976918 else nil
977919 if ((sa == sa))
978920 then {
979921 let sp = if ((prDiff > 0))
980922 then invoke(slipCntr, "put", nil, [AttachedPayment(prId, prDiff)])
981923 else nil
982924 if ((sp == sp))
983925 then {
984926 let lpTrnsfr = if (autoStake)
985927 then {
986928 let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
987929 if ((ss == ss))
988930 then nil
989931 else throw("Strict value is not equal to itself.")
990932 }
991933 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
992- let $t03634336485 = refreshDLpInternal(0, 0, 0)
993- let refreshDLpActions = $t03634336485._1
994- let updatedDLp = $t03634336485._2
934+ let $t03655036692 = refreshDLpInternal(0, 0, 0)
935+ let refreshDLpActions = $t03655036692._1
936+ let updatedDLp = $t03655036692._2
995937 let check = if ((updatedDLp >= currentDLp))
996938 then true
997939 else throwErr(makeString(["updated DLp lower than current DLp", toString(amountAssetBalance), toString(priceAssetBalance), toString(lpAssetEmission), toString(currentDLp), toString(updatedDLp), toString(amDiff), toString(prDiff)], " "))
998940 if ((check == check))
999941 then {
1000942 let lpAssetEmissionAfter = value(assetInfo(cfgLpAssetId)).quantity
1001943 if ((lpAssetEmissionAfter == lpAssetEmissionAfter))
1002944 then ((state ++ lpTrnsfr) ++ refreshDLpActions)
1003945 else throw("Strict value is not equal to itself.")
1004946 }
1005947 else throw("Strict value is not equal to itself.")
1006948 }
1007949 else throw("Strict value is not equal to itself.")
1008950 }
1009951 else throw("Strict value is not equal to itself.")
1010952 }
1011953 else throw("Strict value is not equal to itself.")
1012954 }
1013955 else throw("Strict value is not equal to itself.")
1014956 }
1015957 else throw("Strict value is not equal to itself.")
1016958 }
1017959 else throw("Strict value is not equal to itself.")
1018960 }
1019961 else throw("Strict value is not equal to itself.")
1020962 }
1021963 else throw("Strict value is not equal to itself.")
1022964 }
1023965 }
1024966
1025967
1026968
1027969 @Callable(i)
1028970 func putOneTknV2 (minOutAmount,autoStake) = {
1029971 let isPoolOneTokenOperationsDisabled = {
1030972 let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
1031973 if ($isInstanceOf(@, "Boolean"))
1032974 then @
1033975 else throw(($getType(@) + " couldn't be cast to Boolean"))
1034976 }
1035977 let isPutDisabled = if (if (if (igs())
1036978 then true
1037979 else (cfgPoolStatus == PoolPutDis))
1038980 then true
1039981 else (cfgPoolStatus == PoolShutdown))
1040982 then true
1041983 else isPoolOneTokenOperationsDisabled
1042984 let checks = [if (if (!(isPutDisabled))
1043985 then true
1044986 else isManager(i))
1045987 then true
1046988 else throwErr("put operation is blocked by admin"), if ((size(i.payments) == 1))
1047989 then true
1048990 else throwErr("exactly 1 payment are expected")]
1049991 if ((checks == checks))
1050992 then {
1051993 let amId = toBase58String(value(cfgAmountAssetId))
1052994 let prId = toBase58String(value(cfgPriceAssetId))
1053995 let lpId = cfgLpAssetId
1054996 let amDecimals = cfgAmountAssetDecimals
1055997 let prDecimals = cfgPriceAssetDecimals
1056998 let userAddress = if ((i.caller == this))
1057999 then i.originCaller
10581000 else i.caller
10591001 let pmt = value(i.payments[0])
10601002 let pmtAssetId = toBase58String(value(pmt.assetId))
10611003 let pmtAmt = pmt.amount
10621004 let currentDLp = if ((pmt.assetId == cfgAmountAssetId))
10631005 then calcCurrentDLp(toBigInt(pmtAmt), toBigInt(0), toBigInt(0))
10641006 else calcCurrentDLp(toBigInt(0), toBigInt(pmtAmt), toBigInt(0))
10651007 if ((currentDLp == currentDLp))
10661008 then {
1067- let $t03812638284 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId), true)
1068- if (($t03812638284 == $t03812638284))
1009+ let $t03833338491 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId), true)
1010+ if (($t03833338491 == $t03833338491))
10691011 then {
1070- let feeAmount = $t03812638284._3
1071- let state = $t03812638284._2
1072- let estimLP = $t03812638284._1
1012+ let feeAmount = $t03833338491._3
1013+ let state = $t03833338491._2
1014+ let estimLP = $t03833338491._1
10731015 let emitLpAmt = if (if ((minOutAmount > 0))
10741016 then (minOutAmount > estimLP)
10751017 else false)
10761018 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
10771019 else estimLP
10781020 let e = invoke(fca, "emit", [emitLpAmt], nil)
10791021 if ((e == e))
10801022 then {
10811023 let el = match e {
10821024 case legacy: Address =>
10831025 invoke(legacy, "emit", [emitLpAmt], nil)
10841026 case _ =>
10851027 unit
10861028 }
10871029 if ((el == el))
10881030 then {
10891031 let lpTrnsfr = if (autoStake)
10901032 then {
10911033 let ss = invoke(stakingContract, "stake", nil, [AttachedPayment(lpId, emitLpAmt)])
10921034 if ((ss == ss))
10931035 then nil
10941036 else throw("Strict value is not equal to itself.")
10951037 }
10961038 else [ScriptTransfer(i.caller, emitLpAmt, lpId)]
10971039 let sendFeeToMatcher = if ((feeAmount > 0))
10981040 then [ScriptTransfer(feeCollectorAddress, feeAmount, fromBase58String(pmtAssetId))]
10991041 else nil
1100- let $t03909939448 = if ((this == feeCollectorAddress))
1042+ let $t03930639655 = if ((this == feeCollectorAddress))
11011043 then $Tuple2(0, 0)
11021044 else {
11031045 let paymentInAmountAsset = if ((pmt.assetId == cfgAmountAssetId))
11041046 then true
11051047 else false
11061048 if (paymentInAmountAsset)
11071049 then $Tuple2(-(feeAmount), 0)
11081050 else $Tuple2(0, -(feeAmount))
11091051 }
1110- let amountAssetBalanceDelta = $t03909939448._1
1111- let priceAssetBalanceDelta = $t03909939448._2
1112- let $t03945139559 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1113- let refreshDLpActions = $t03945139559._1
1114- let updatedDLp = $t03945139559._2
1052+ let amountAssetBalanceDelta = $t03930639655._1
1053+ let priceAssetBalanceDelta = $t03930639655._2
1054+ let $t03965839766 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1055+ let refreshDLpActions = $t03965839766._1
1056+ let updatedDLp = $t03965839766._2
11151057 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
11161058 if ((isUpdatedDLpValid == isUpdatedDLpValid))
11171059 then $Tuple2((((state ++ lpTrnsfr) ++ sendFeeToMatcher) ++ refreshDLpActions), emitLpAmt)
11181060 else throw("Strict value is not equal to itself.")
11191061 }
11201062 else throw("Strict value is not equal to itself.")
11211063 }
11221064 else throw("Strict value is not equal to itself.")
11231065 }
11241066 else throw("Strict value is not equal to itself.")
11251067 }
11261068 else throw("Strict value is not equal to itself.")
11271069 }
11281070 else throw("Strict value is not equal to itself.")
11291071 }
11301072
11311073
11321074
11331075 @Callable(i)
11341076 func putForFree (maxSlpg) = if ((0 > maxSlpg))
11351077 then throw("Wrong slpg")
11361078 else if ((size(i.payments) != 2))
11371079 then throw("2 pmnts expd")
11381080 else {
11391081 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, "")
11401082 let state = estPut._9
11411083 let amAssetPmt = toBigInt(value(i.payments[0]).amount)
11421084 let prAssetPmt = toBigInt(value(i.payments[1]).amount)
11431085 let currentDLp = calcCurrentDLp(amAssetPmt, prAssetPmt, toBigInt(0))
11441086 if ((currentDLp == currentDLp))
11451087 then {
1146- let $t04058940654 = refreshDLpInternal(0, 0, 0)
1147- let refreshDLpActions = $t04058940654._1
1148- let updatedDLp = $t04058940654._2
1088+ let $t04079640861 = refreshDLpInternal(0, 0, 0)
1089+ let refreshDLpActions = $t04079640861._1
1090+ let updatedDLp = $t04079640861._2
11491091 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
11501092 if ((isUpdatedDLpValid == isUpdatedDLpValid))
11511093 then (state ++ refreshDLpActions)
11521094 else throw("Strict value is not equal to itself.")
11531095 }
11541096 else throw("Strict value is not equal to itself.")
11551097 }
11561098
11571099
11581100
11591101 @Callable(i)
11601102 func get () = {
11611103 let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(0))
11621104 if ((currentDLp == currentDLp))
11631105 then {
11641106 let r = cg(i)
11651107 let outAmtAmt = r._1
11661108 let outPrAmt = r._2
11671109 let pmtAmt = r._3
11681110 let pmtAssetId = r._4
11691111 let state = r._5
11701112 let b = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
11711113 if ((b == b))
11721114 then {
1173- let $t04182741909 = refreshDLpInternal(-(outAmtAmt), -(outPrAmt), 0)
1174- let refreshDLpActions = $t04182741909._1
1175- let updatedDLp = $t04182741909._2
1115+ let $t04203442116 = refreshDLpInternal(-(outAmtAmt), -(outPrAmt), 0)
1116+ let refreshDLpActions = $t04203442116._1
1117+ let updatedDLp = $t04203442116._2
11761118 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
11771119 if ((isUpdatedDLpValid == isUpdatedDLpValid))
11781120 then (state ++ refreshDLpActions)
11791121 else throw("Strict value is not equal to itself.")
11801122 }
11811123 else throw("Strict value is not equal to itself.")
11821124 }
11831125 else throw("Strict value is not equal to itself.")
11841126 }
11851127
11861128
11871129
11881130 @Callable(i)
11891131 func getOneTknV2 (outAssetId,minOutAmount) = {
11901132 let isPoolOneTokenOperationsDisabled = {
11911133 let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
11921134 if ($isInstanceOf(@, "Boolean"))
11931135 then @
11941136 else throw(($getType(@) + " couldn't be cast to Boolean"))
11951137 }
11961138 let isGetDisabled = if (if (igs())
11971139 then true
11981140 else (cfgPoolStatus == PoolShutdown))
11991141 then true
12001142 else isPoolOneTokenOperationsDisabled
12011143 let checks = [if (if (!(isGetDisabled))
12021144 then true
12031145 else isManager(i))
12041146 then true
12051147 else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 1))
12061148 then true
12071149 else throwErr("exactly 1 payment are expected")]
12081150 if ((checks == checks))
12091151 then {
1210- let $t04252742682 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1211- let state = $t04252742682._1
1212- let totalAmount = $t04252742682._2
1152+ let $t04273442889 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1153+ let state = $t04273442889._1
1154+ let totalAmount = $t04273442889._2
12131155 $Tuple2(state, totalAmount)
12141156 }
12151157 else throw("Strict value is not equal to itself.")
12161158 }
12171159
12181160
12191161
12201162 @Callable(i)
12211163 func refreshDLp () = {
12221164 let lastRefreshedBlockHeight = valueOrElse(getInteger(keyDLpRefreshedHeight), 0)
12231165 let checkLastRefreshedBlockHeight = if (((height - lastRefreshedBlockHeight) >= dLpRefreshDelay))
12241166 then unit
12251167 else throwErr(makeString([toString(dLpRefreshDelay), " blocks have not passed since the previous call"], ""))
12261168 if ((checkLastRefreshedBlockHeight == checkLastRefreshedBlockHeight))
12271169 then {
12281170 let dLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyDLp), "0")), fmtErr("invalid dLp"))
1229- let $t04320643270 = refreshDLpInternal(0, 0, 0)
1230- let dLpUpdateActions = $t04320643270._1
1231- let updatedDLp = $t04320643270._2
1171+ let $t04341343477 = refreshDLpInternal(0, 0, 0)
1172+ let dLpUpdateActions = $t04341343477._1
1173+ let updatedDLp = $t04341343477._2
12321174 let actions = if ((dLp != updatedDLp))
12331175 then dLpUpdateActions
12341176 else throwErr("nothing to refresh")
12351177 $Tuple2(actions, toString(updatedDLp))
12361178 }
12371179 else throw("Strict value is not equal to itself.")
12381180 }
12391181
12401182
12411183
12421184 @Callable(i)
12431185 func getOneTknV2READONLY (outAssetId,lpAssetAmount) = {
12441186 let amId = toBase58String(value(cfgAmountAssetId))
12451187 let prId = toBase58String(value(cfgPriceAssetId))
12461188 let lpId = toBase58String(value(cfgLpAssetId))
12471189 let xp = [toBigInt(getAccBalance(amId)), toBigInt(getAccBalance(prId))]
12481190 let lpEmission = toBigInt(valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "invalid lp asset").quantity)
12491191 let D0 = getD(xp)
12501192 let D1 = (D0 - fraction(toBigInt(lpAssetAmount), D0, lpEmission))
12511193 let index = if ((outAssetId == amId))
12521194 then 0
12531195 else if ((outAssetId == prId))
12541196 then 1
12551197 else throw("invalid out asset id")
12561198 let newY = getYD(xp, index, D1)
12571199 let dy = (xp[index] - newY)
12581200 let totalGetRaw = max([0, toInt((dy - big1))])
1259- let $t04420044255 = takeFee(totalGetRaw, outFee)
1260- let totalGet = $t04420044255._1
1261- let feeAmount = $t04420044255._2
1201+ let $t04440744462 = takeFee(totalGetRaw, outFee)
1202+ let totalGet = $t04440744462._1
1203+ let feeAmount = $t04440744462._2
12621204 $Tuple2(nil, $Tuple2(totalGet, feeAmount))
12631205 }
12641206
12651207
12661208
12671209 @Callable(i)
12681210 func getOneTknV2WithBonusREADONLY (outAssetId,lpAssetAmount) = {
12691211 let amId = toBase58String(value(cfgAmountAssetId))
12701212 let prId = toBase58String(value(cfgPriceAssetId))
12711213 let lpId = toBase58String(value(cfgLpAssetId))
12721214 let amBalance = getAccBalance(amId)
12731215 let prBalance = getAccBalance(prId)
1274- let $t04463044745 = {
1216+ let $t04483744952 = {
12751217 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)
12761218 if ($isInstanceOf(@, "(Int, Int)"))
12771219 then @
12781220 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
12791221 }
1280- let totalGet = $t04463044745._1
1281- let feeAmount = $t04463044745._2
1222+ let totalGet = $t04483744952._1
1223+ let feeAmount = $t04483744952._2
12821224 let r = ego("", lpId, lpAssetAmount, this)
12831225 let outAmAmt = r._1
12841226 let outPrAmt = r._2
12851227 let sumOfGetAssets = (outAmAmt + outPrAmt)
12861228 let bonus = if ((sumOfGetAssets == 0))
12871229 then if ((totalGet == 0))
12881230 then 0
12891231 else throw("bonus calculation error")
12901232 else fraction((totalGet - sumOfGetAssets), scale8, sumOfGetAssets)
12911233 $Tuple2(nil, $Tuple3(totalGet, feeAmount, bonus))
12921234 }
12931235
12941236
12951237
12961238 @Callable(i)
12971239 func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = {
12981240 let r = cg(i)
12991241 let outAmAmt = r._1
13001242 let outPrAmt = r._2
13011243 let pmtAmt = r._3
13021244 let pmtAssetId = r._4
13031245 let state = r._5
13041246 if ((noLessThenAmtAsset > outAmAmt))
13051247 then throw(((("Failed: " + toString(outAmAmt)) + " < ") + toString(noLessThenAmtAsset)))
13061248 else if ((noLessThenPriceAsset > outPrAmt))
13071249 then throw(((("Failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset)))
13081250 else {
13091251 let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(0))
13101252 if ((currentDLp == currentDLp))
13111253 then {
13121254 let burnLPAssetOnFactory = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
13131255 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
13141256 then {
1315- let $t04591145992 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1316- let refreshDLpActions = $t04591145992._1
1317- let updatedDLp = $t04591145992._2
1257+ let $t04611846199 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1258+ let refreshDLpActions = $t04611846199._1
1259+ let updatedDLp = $t04611846199._2
13181260 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
13191261 if ((isUpdatedDLpValid == isUpdatedDLpValid))
13201262 then (state ++ refreshDLpActions)
13211263 else throw("Strict value is not equal to itself.")
13221264 }
13231265 else throw("Strict value is not equal to itself.")
13241266 }
13251267 else throw("Strict value is not equal to itself.")
13261268 }
13271269 }
13281270
13291271
13301272
13311273 @Callable(i)
13321274 func unstakeAndGet (amount) = {
13331275 let checkPayments = if ((size(i.payments) != 0))
13341276 then throw("No pmnts expd")
13351277 else true
13361278 if ((checkPayments == checkPayments))
13371279 then {
13381280 let factoryCfg = gfc()
13391281 let lpAssetId = cfgLpAssetId
13401282 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
13411283 let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(0))
13421284 if ((currentDLp == currentDLp))
13431285 then {
13441286 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), amount], nil)
13451287 if ((unstakeInv == unstakeInv))
13461288 then {
13471289 let r = ego(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
13481290 let outAmAmt = r._1
13491291 let outPrAmt = r._2
13501292 let sts = parseIntValue(r._9)
13511293 let state = r._10
13521294 let v = if (if (igs())
13531295 then true
13541296 else (sts == PoolShutdown))
13551297 then throw(("Blocked: " + toString(sts)))
13561298 else true
13571299 if ((v == v))
13581300 then {
13591301 let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
13601302 if ((burnA == burnA))
13611303 then {
1362- let $t04701947100 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1363- let refreshDLpActions = $t04701947100._1
1364- let updatedDLp = $t04701947100._2
1304+ let $t04722647307 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1305+ let refreshDLpActions = $t04722647307._1
1306+ let updatedDLp = $t04722647307._2
13651307 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
13661308 if ((isUpdatedDLpValid == isUpdatedDLpValid))
13671309 then (state ++ refreshDLpActions)
13681310 else throw("Strict value is not equal to itself.")
13691311 }
13701312 else throw("Strict value is not equal to itself.")
13711313 }
13721314 else throw("Strict value is not equal to itself.")
13731315 }
13741316 else throw("Strict value is not equal to itself.")
13751317 }
13761318 else throw("Strict value is not equal to itself.")
13771319 }
13781320 else throw("Strict value is not equal to itself.")
13791321 }
13801322
13811323
13821324
13831325 @Callable(i)
13841326 func unstakeAndGetNoLess (unstakeAmount,noLessThenAmountAsset,noLessThenPriceAsset) = {
13851327 let isGetDisabled = if (igs())
13861328 then true
13871329 else (cfgPoolStatus == PoolShutdown)
13881330 let checks = [if (!(isGetDisabled))
13891331 then true
13901332 else throw("get operation is blocked by admin"), if ((size(i.payments) == 0))
13911333 then true
13921334 else throw("no payments are expected")]
13931335 if ((checks == checks))
13941336 then {
13951337 let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(0))
13961338 if ((currentDLp == currentDLp))
13971339 then {
13981340 let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(cfgLpAssetId), unstakeAmount], nil)
13991341 if ((unstakeInv == unstakeInv))
14001342 then {
14011343 let res = ego(toBase58String(i.transactionId), toBase58String(cfgLpAssetId), unstakeAmount, i.caller)
14021344 let outAmAmt = res._1
14031345 let outPrAmt = res._2
14041346 let state = res._10
14051347 let checkAmounts = [if ((outAmAmt >= noLessThenAmountAsset))
14061348 then true
14071349 else throw(makeString(["amount asset amount to receive is less than ", toString(noLessThenAmountAsset)], "")), if ((outPrAmt >= noLessThenPriceAsset))
14081350 then true
14091351 else throw(makeString(["price asset amount to receive is less than ", toString(noLessThenPriceAsset)], ""))]
14101352 if ((checkAmounts == checkAmounts))
14111353 then {
14121354 let burnLPAssetOnFactory = invoke(fca, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
14131355 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
14141356 then {
1415- let $t04835148432 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1416- let refreshDLpActions = $t04835148432._1
1417- let updatedDLp = $t04835148432._2
1357+ let $t04855848639 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1358+ let refreshDLpActions = $t04855848639._1
1359+ let updatedDLp = $t04855848639._2
14181360 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
14191361 if ((isUpdatedDLpValid == isUpdatedDLpValid))
14201362 then (state ++ refreshDLpActions)
14211363 else throw("Strict value is not equal to itself.")
14221364 }
14231365 else throw("Strict value is not equal to itself.")
14241366 }
14251367 else throw("Strict value is not equal to itself.")
14261368 }
14271369 else throw("Strict value is not equal to itself.")
14281370 }
14291371 else throw("Strict value is not equal to itself.")
14301372 }
14311373 else throw("Strict value is not equal to itself.")
14321374 }
14331375
14341376
14351377
14361378 @Callable(i)
14371379 func unstakeAndGetOneTknV2 (unstakeAmount,outAssetId,minOutAmount) = {
14381380 let isPoolOneTokenOperationsDisabled = {
14391381 let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
14401382 if ($isInstanceOf(@, "Boolean"))
14411383 then @
14421384 else throw(($getType(@) + " couldn't be cast to Boolean"))
14431385 }
14441386 let isGetDisabled = if (if (igs())
14451387 then true
14461388 else (cfgPoolStatus == PoolShutdown))
14471389 then true
14481390 else isPoolOneTokenOperationsDisabled
14491391 let checks = [if (if (!(isGetDisabled))
14501392 then true
14511393 else isManager(i))
14521394 then true
14531395 else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 0))
14541396 then true
14551397 else throwErr("no payments are expected")]
14561398 if ((checks == checks))
14571399 then {
14581400 let factoryCfg = gfc()
14591401 let lpAssetId = cfgLpAssetId
14601402 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
14611403 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), unstakeAmount], nil)
14621404 if ((unstakeInv == unstakeInv))
14631405 then {
1464- let $t04932749515 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1465- let state = $t04932749515._1
1466- let totalAmount = $t04932749515._2
1406+ let $t04953449722 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1407+ let state = $t04953449722._1
1408+ let totalAmount = $t04953449722._2
14671409 $Tuple2(state, totalAmount)
14681410 }
14691411 else throw("Strict value is not equal to itself.")
14701412 }
14711413 else throw("Strict value is not equal to itself.")
14721414 }
14731415
14741416
14751417
14761418 @Callable(i)
14771419 func putOneTknV2WithBonusREADONLY (paymentAmountRaw,paymentAssetId) = {
1478- let $t04964349746 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1479- let lpAmount = $t04964349746._1
1480- let state = $t04964349746._2
1481- let feeAmount = $t04964349746._3
1482- let bonus = $t04964349746._4
1420+ let $t04985049953 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1421+ let lpAmount = $t04985049953._1
1422+ let state = $t04985049953._2
1423+ let feeAmount = $t04985049953._3
1424+ let bonus = $t04985049953._4
14831425 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
14841426 }
14851427
14861428
14871429
14881430 @Callable(i)
14891431 func putOneTknV2WithoutTakeFeeREADONLY (paymentAmountRaw,paymentAssetId) = {
1490- let $t04989449998 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1491- let lpAmount = $t04989449998._1
1492- let state = $t04989449998._2
1493- let feeAmount = $t04989449998._3
1494- let bonus = $t04989449998._4
1432+ let $t05010150205 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1433+ let lpAmount = $t05010150205._1
1434+ let state = $t05010150205._2
1435+ let feeAmount = $t05010150205._3
1436+ let bonus = $t05010150205._4
14951437 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
14961438 }
14971439
14981440
14991441
15001442 @Callable(i)
15011443 func activate (amtAsStr,prAsStr) = if ((toString(i.caller) != toString(fca)))
15021444 then throw("denied")
15031445 else $Tuple2([StringEntry(aa(), amtAsStr), StringEntry(pa(), prAsStr)], "success")
15041446
15051447
15061448
15071449 @Callable(i)
15081450 func setS (k,v) = if ((toString(i.caller) != strf(this, ada())))
15091451 then pd
15101452 else [StringEntry(k, v)]
15111453
15121454
15131455
15141456 @Callable(i)
15151457 func setI (k,v) = if ((toString(i.caller) != strf(this, ada())))
15161458 then pd
15171459 else [IntegerEntry(k, v)]
15181460
15191461
15201462
15211463 @Callable(i)
15221464 func getPoolConfigWrapperREADONLY () = $Tuple2(nil, gpc())
15231465
15241466
15251467
15261468 @Callable(i)
15271469 func getAccBalanceWrapperREADONLY (assetId) = $Tuple2(nil, getAccBalance(assetId))
15281470
15291471
15301472
15311473 @Callable(i)
15321474 func calcPricesWrapperREADONLY (amAmt,prAmt,lpAmt) = {
15331475 let pr = calcPrices(amAmt, prAmt, lpAmt)
15341476 $Tuple2(nil, [toString(pr[0]), toString(pr[1]), toString(pr[2])])
15351477 }
15361478
15371479
15381480
15391481 @Callable(i)
15401482 func fromX18WrapperREADONLY (val,resScaleMult) = $Tuple2(nil, f1(parseBigIntValue(val), resScaleMult))
15411483
15421484
15431485
15441486 @Callable(i)
15451487 func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(t1(origVal, origScaleMult)))
15461488
15471489
15481490
15491491 @Callable(i)
15501492 func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(cpbi(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
15511493
15521494
15531495
15541496 @Callable(i)
15551497 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, ""))
15561498
15571499
15581500
15591501 @Callable(i)
15601502 func estimateGetOperationWrapperREADONLY (txId58,pmtAsId,pmtLpAmt,usrAddr) = {
15611503 let r = ego(txId58, pmtAsId, pmtLpAmt, addressFromStringValue(usrAddr))
15621504 $Tuple2(nil, $Tuple10(r._1, r._2, r._3, r._4, r._5, r._6, r._7, toString(r._8), r._9, r._10))
15631505 }
15641506
15651507
15661508 @Verifier(tx)
15671509 func verify () = {
15681510 let targetPublicKey = match m() {
15691511 case pk: ByteVector =>
15701512 pk
15711513 case _: Unit =>
15721514 tx.senderPublicKey
15731515 case _ =>
15741516 throw("Match error")
15751517 }
15761518 match tx {
15771519 case order: Order =>
15781520 let matcherPub = mp()
1579- let orderValid = validateMatcherOrderAllowed(order)
1521+ let $t05299753066 = validateMatcherOrderAllowed(order)
1522+ let orderValid = $t05299753066._1
1523+ let orderValidInfo = $t05299753066._2
15801524 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
15811525 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
15821526 if (if (if (orderValid)
15831527 then senderValid
15841528 else false)
15851529 then matcherValid
15861530 else false)
15871531 then true
1588- else toe(orderValid, senderValid, matcherValid)
1532+ else throwOrderError(orderValid, orderValidInfo, senderValid, matcherValid)
15891533 case s: SetScriptTransaction =>
15901534 if (sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey))
15911535 then true
15921536 else {
15931537 let newHash = blake2b256(value(s.script))
15941538 let allowedHash = fromBase64String(value(getString(fca, keyAllowedLpStableScriptHash())))
15951539 let currentHash = scriptHash(this)
15961540 if ((allowedHash == newHash))
15971541 then (currentHash != newHash)
15981542 else false
15991543 }
16001544 case _ =>
16011545 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
16021546 }
16031547 }
16041548

github/deemru/w8io/3ef1775 
311.77 ms