tx · 8MQryXfK2FdewNGx4Hznoda3F54nzg9ADvjeNBvvF7BZ

3MzKSdTH2jFbypLsoNfrH7QgkzSbx3EYwCA:  -0.03400000 Waves

2022.12.06 14:13 [2348408] smart account 3MzKSdTH2jFbypLsoNfrH7QgkzSbx3EYwCA > SELF 0.00000000 Waves

{ "type": 13, "id": "8MQryXfK2FdewNGx4Hznoda3F54nzg9ADvjeNBvvF7BZ", "fee": 3400000, "feeAssetId": null, "timestamp": 1670324915681, "version": 1, "sender": "3MzKSdTH2jFbypLsoNfrH7QgkzSbx3EYwCA", "senderPublicKey": "35yd3qw1gxKDxKwGAykHN9fANbXNWwseaUwbWDj24o3x", "proofs": [ "3jJFtu3J2GvcFsgZLsAFKGqH8yM5TDBLH7ikgudt7cryNyuFgBWAf5szEpWGxY3q9PU4vm1JusqVz4C4YcosyLVW" ], "script": "base64:BgKSJwgCEgMKAQgSAwoBCBIAEgQKAgEEEgQKAgEEEgMKAQESABIECgIIARIAEgQKAggBEgQKAggBEgQKAgEBEgMKAQESBQoDAQEBEgUKAwEIARIECgIBCBIECgIBCBIECgIICBIECgIICBIECgIIARIAEgMKAQgSBQoDAQEBEgQKAggBEgQKAgEBEgQKAggIEgsKCQgBAQIBAggEBBIGCgQICAEIEgAiBnNjYWxlOCIMc2NhbGU4QmlnSW50IgdzY2FsZTE4Igp6ZXJvQmlnSW50IgRiaWcwIgRiaWcxIgRiaWcyIgpzbGlwcGFnZTREIgt3YXZlc1N0cmluZyIFQW11bHQiBURjb252IgNTRVAiBUVNUFRZIgpQb29sQWN0aXZlIgpQb29sUHV0RGlzIg5Qb29sTWF0Y2hlckRpcyIMUG9vbFNodXRkb3duIg5pZHhQb29sQWRkcmVzcyIJaWR4UG9vbFN0IglpZHhMUEFzSWQiCWlkeEFtQXNJZCIJaWR4UHJBc0lkIgtpZHhBbXRBc0RjbSINaWR4UHJpY2VBc0RjbSILaWR4SUFtdEFzSWQiDWlkeElQcmljZUFzSWQiD2lkeEZhY3RTdGFrQ250ciISaWR4RmFjdG9yeVJlc3RDbnRyIhBpZHhGYWN0U2xpcHBDbnRyIhFpZHhGYWN0R3d4UmV3Q250ciIKZmVlRGVmYXVsdCICdDEiB29yaWdWYWwiDW9yaWdTY2FsZU11bHQiAmYxIgN2YWwiD3Jlc3VsdFNjYWxlTXVsdCICdHMiA2FtdCIIcmVzU2NhbGUiCGN1clNjYWxlIgNhYnMiCWFic0JpZ0ludCICZmMiA21wayIEcG1wayICcGwiAnBoIgFoIgF0IgNwYXUiAnVhIgR0eElkIgNnYXUiAmFhIgJwYSIDYW1wIgNhZGEiBmtleUZlZSIDZmVlIgZrZXlETHAiFWtleURMcFJlZnJlc2hlZEhlaWdodCISa2V5RExwUmVmcmVzaERlbGF5IhZkTHBSZWZyZXNoRGVsYXlEZWZhdWx0Ig9kTHBSZWZyZXNoRGVsYXkiBGZjZmciBG10cGsiAnBjIgZpQW10QXMiBWlQckFzIgNtYmEiBWJBU3RyIgNhcHMiHGtleUFsbG93ZWRMcFN0YWJsZVNjcmlwdEhhc2giFmtleUZlZUNvbGxlY3RvckFkZHJlc3MiA3RvZSIDb3JWIgZzZW5kclYiBm1hdGNoViIDc3RyIgckbWF0Y2gwIgZ2YWxTdHIiBHN0cmYiBGFkZHIiA2tleSIEaW50ZiIIdGhyb3dFcnIiA21zZyIGZm10RXJyIgNmY2EiAUEiA2lncyICbXAiE2ZlZUNvbGxlY3RvckFkZHJlc3MiA2dwYyIFYW10QXMiB3ByaWNlQXMiCGlQcmljZUFzIgxwYXJzZUFzc2V0SWQiBWlucHV0Ig9hc3NldElkVG9TdHJpbmciD3BhcnNlUG9vbENvbmZpZyIKcG9vbENvbmZpZyIQcG9vbENvbmZpZ1BhcnNlZCILJHQwNzIwODczOTQiDmNmZ1Bvb2xBZGRyZXNzIg1jZmdQb29sU3RhdHVzIgxjZmdMcEFzc2V0SWQiEGNmZ0Ftb3VudEFzc2V0SWQiD2NmZ1ByaWNlQXNzZXRJZCIWY2ZnQW1vdW50QXNzZXREZWNpbWFscyIVY2ZnUHJpY2VBc3NldERlY2ltYWxzIgNnZmMiDWZhY3RvcnlDb25maWciD3N0YWtpbmdDb250cmFjdCIPc2xpcGFnZUNvbnRyYWN0Igtnd3hDb250cmFjdCIMcmVzdENvbnRyYWN0IhFkYXRhUHV0QWN0aW9uSW5mbyINaW5BbXRBc3NldEFtdCIPaW5QcmljZUFzc2V0QW10IghvdXRMcEFtdCIFcHJpY2UiCnNsaXBCeVVzZXIiDHNsaXBwYWdlUmVhbCIIdHhIZWlnaHQiC3R4VGltZXN0YW1wIgxzbGlwYWdlQW1BbXQiDHNsaXBhZ2VQckFtdCIRZGF0YUdldEFjdGlvbkluZm8iDm91dEFtdEFzc2V0QW10IhBvdXRQcmljZUFzc2V0QW10IgdpbkxwQW10Ig1nZXRBY2NCYWxhbmNlIgdhc3NldElkIgRjcGJpIghwckFtdFgxOCIIYW1BbXRYMTgiA3ZhZCICQTEiAkEyIghzbGlwcGFnZSIEZGlmZiIEcGFzcyICdmQiAkQxIgJEMCIEc2xwZyIEZmFpbCIDcGNwIgphbUFzc2V0RGNtIgpwckFzc2V0RGNtIgVhbUFtdCIFcHJBbXQiC2FtdEFzQW10WDE4IgpwckFzQW10WDE4IgpjYWxjUHJpY2VzIgVscEFtdCIDY2ZnIghhbXRBc0RjbSIHcHJBc0RjbSIIcHJpY2VYMTgiCGxwQW10WDE4Ig1scFBySW5BbUFzWDE4Ig1scFBySW5QckFzWDE4Ig9jYWxjdWxhdGVQcmljZXMiAXAiB3Rha2VGZWUiBmFtb3VudCIJZmVlQW1vdW50IgNlZ28iBnR4SWQ1OCIKcG10QXNzZXRJZCIIcG10THBBbXQiC3VzZXJBZGRyZXNzIgRscElkIgRhbUlkIgRwcklkIgVhbURjbSIFcHJEY20iA3N0cyIHbHBFbWlzcyIJYW1CYWxhbmNlIgxhbUJhbGFuY2VYMTgiCXByQmFsYW5jZSIMcHJCYWxhbmNlWDE4IgtjdXJQcmljZVgxOCIIY3VyUHJpY2UiC3BtdExwQW10WDE4IgpscEVtaXNzWDE4IgtvdXRBbUFtdFgxOCILb3V0UHJBbXRYMTgiCG91dEFtQW10IghvdXRQckFtdCIFc3RhdGUiA2VwbyIHaW5BbUFtdCIGaW5BbUlkIgdpblByQW10IgZpblBySWQiBmlzRXZhbCIGZW1pdExwIgppc09uZUFzc2V0IhB2YWxpZGF0ZVNsaXBwYWdlIgZwbXRBbXQiBXBtdElkIgdhbUlkU3RyIgdwcklkU3RyIglpbkFtSWRTdHIiCWluUHJJZFN0ciIGYW10RGNtIghwcmljZURjbSIEbHBFbSIPaW5BbUFzc2V0QW10WDE4Ig9pblByQXNzZXRBbXRYMTgiDHVzZXJQcmljZVgxOCIBciILc2xpcHBhZ2VYMTgiD3NsaXBwYWdlUmVhbFgxOCINbHBFbWlzc2lvblgxOCIKcHJWaWFBbVgxOCIKYW1WaWFQclgxOCIMZXhwZWN0ZWRBbXRzIhFleHBBbXRBc3NldEFtdFgxOCITZXhwUHJpY2VBc3NldEFtdFgxOCIJY2FsY0xwQW10Ig5jYWxjQW1Bc3NldFBtdCIOY2FsY1ByQXNzZXRQbXQiDHNsaXBwYWdlQ2FsYyIJZW1pdExwQW10IgZhbURpZmYiBnByRGlmZiINJHQwMTc4MjUxODE3MCIKd3JpdGVBbUFtdCIKd3JpdGVQckFtdCILY29tbW9uU3RhdGUiB2NhbGNETHAiDWFtb3VudEJhbGFuY2UiDHByaWNlQmFsYW5jZSIKbHBFbWlzc2lvbiIKdXBkYXRlZERMcCIScmVmcmVzaERMcEludGVybmFsIhdhbW91bnRBc3NldEJhbGFuY2VEZWx0YSIWcHJpY2VBc3NldEJhbGFuY2VEZWx0YSIUbHBBc3NldEVtaXNzaW9uRGVsdGEiEmFtb3VudEFzc2V0QmFsYW5jZSIRcHJpY2VBc3NldEJhbGFuY2UiD2xwQXNzZXRFbWlzc2lvbiIHYWN0aW9ucyISdmFsaWRhdGVVcGRhdGVkRExwIgpjdXJyZW50RExwIgNtb2EiBW9yZGVyIhFhbW91bnRBc3NldEFtb3VudCIQcHJpY2VBc3NldEFtb3VudCINJHQwMjA1ODUyMDc5NyIDZExwIg0kdDAyMTIyNDIxMzI0Ig11bnVzZWRBY3Rpb25zIgZkTHBOZXciDGlzT3JkZXJWYWxpZCICY2ciAWkiA3BtdCICY3AiBmNhbGxlciIHYW1Bc1BtdCIHcHJBc1BtdCIEZ2V0RCICeHAiAW4iA3hwMCIDeHAxIgphUHJlY2lzaW9uIgFhIgFzIgNhbm4iC3hwMF94cDFfbl9uIhBhbm5fc19hUHJlY2lzaW9uIg5hbm5fYVByZWNpc2lvbiICbjEiBGNhbGMiA2FjYyIDY3VyIg0kdDAyMzQ3NzIzNDk3IgFkIgVmb3VuZCICZHAiBWROZXh0IgVkRGlmZiIDYXJyIg0kdDAyMzkxODIzOTY1IgIkbCICJHMiBSRhY2MwIgUkZjBfMSICJGEiAiRpIgUkZjBfMiIFZ2V0WUQiAUQiAXgiAWMiAWIiDSR0MDI0NDY1MjQ0ODUiAXkiBXlOZXh0IgV5RGlmZiINJHQwMjQ3OTIyNDgzOSINY2FsY1B1dE9uZVRrbiIJcG10QW10UmF3Igt3aXRoVGFrZUZlZSINY2hlY2hFbWlzc2lvbiINJHQwMjU2MjIyNjA4NCIMYW1CYWxhbmNlT2xkIgxwckJhbGFuY2VPbGQiDSR0MDI2MDkwMjYyNjYiC2FtQW1vdW50UmF3IgtwckFtb3VudFJhdyINJHQwMjYyNzAyNjUwOSIIYW1BbW91bnQiCHByQW1vdW50IgxhbUJhbGFuY2VOZXciDHByQmFsYW5jZU5ldyIGY2hlY2tEIghscEFtb3VudCIOcG9vbFByb3BvcnRpb24iD2Ftb3VudEFzc2V0UGFydCIOcHJpY2VBc3NldFBhcnQiCWxwQW10Qm90aCIFYm9udXMiE2dldE9uZVRrblYySW50ZXJuYWwiCm91dEFzc2V0SWQiDG1pbk91dEFtb3VudCIIcGF5bWVudHMiDG9yaWdpbkNhbGxlciINdHJhbnNhY3Rpb25JZCIKYW1EZWNpbWFscyIKcHJEZWNpbWFscyIKcG9vbFN0YXR1cyINJHQwMjg1MTEyODYyMiIBQCIIdG90YWxHZXQiC3RvdGFsQW1vdW50Ig0kdDAyODgxMjI5MTE5IgVvdXRBbSIFb3V0UHIiCGN1clByWDE4IgVjdXJQciIRb3V0QXNzZXRJZE9yV2F2ZXMiEHNlbmRGZWVUb01hdGNoZXIiBGJ1cm4iDSR0MDI5OTA0MzAyNTQiEGZlZUFtb3VudEZvckNhbGMiEG91dEluQW1vdW50QXNzZXQiDSR0MDMwMjU3MzAzNjUiEXJlZnJlc2hETHBBY3Rpb25zIhFpc1VwZGF0ZWRETHBWYWxpZCIBbSICcG0iAnBkIglpc01hbmFnZXIiAnBrIgJtbSIXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkiAmNtIgNocG0iA2NwbSIEc2xpcCIJYXV0b1N0YWtlIgdmYWN0Q2ZnIgtzdGFraW5nQ250ciIIc2xpcENudHIiAWUiCWxwQXNzZXRJZCICZWwiBmxlZ2FjeSICc2EiAnNwIghscFRybnNmciICc3MiDSR0MDM0MDA4MzQwNzMiIGlzUG9vbE9uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkIg1pc1B1dERpc2FibGVkIgZjaGVja3MiDSR0MDM1MTk4MzUzNTYiB2VzdGltTFAiDSR0MDM2MTcxMzY1MjAiFHBheW1lbnRJbkFtb3VudEFzc2V0Ig0kdDAzNjUyMzM2NjMxIgdtYXhTbHBnIgZlc3RQdXQiDSR0MDM3Mzg5Mzc0NTQiCW91dEFtdEFtdCINJHQwMzgxNDkzODIzMSINaXNHZXREaXNhYmxlZCINJHQwMzg4MzczODk5MiIYbGFzdFJlZnJlc2hlZEJsb2NrSGVpZ2h0Ih1jaGVja0xhc3RSZWZyZXNoZWRCbG9ja0hlaWdodCINJHQwMzk1MTYzOTU4MCIQZExwVXBkYXRlQWN0aW9ucyINbHBBc3NldEFtb3VudCIFaW5kZXgiBG5ld1kiAmR5Igt0b3RhbEdldFJhdyINJHQwNDA0ODA0MDUyOSINJHQwNDA4NzQ0MDk4OSIOc3VtT2ZHZXRBc3NldHMiEm5vTGVzc1RoZW5BbXRBc3NldCIUbm9MZXNzVGhlblByaWNlQXNzZXQiFGJ1cm5MUEFzc2V0T25GYWN0b3J5Ig0kdDA0MjA3NTQyMTU2Ig1jaGVja1BheW1lbnRzIgpmYWN0b3J5Q2ZnIgdzdGFraW5nIgp1bnN0YWtlSW52IgF2IgVidXJuQSINJHQwNDMxMzA0MzIxMSINdW5zdGFrZUFtb3VudCIVbm9MZXNzVGhlbkFtb3VudEFzc2V0IgNyZXMiDGNoZWNrQW1vdW50cyINJHQwNDQzNzA0NDQ1MSINJHQwNDUzNzM0NTU2MSIQcGF5bWVudEFtb3VudFJhdyIOcGF5bWVudEFzc2V0SWQiDSR0MDQ1ODIwNDU5MjMiDSR0MDQ2MjAyNDYzMDYiCGFtdEFzU3RyIgdwckFzU3RyIgFrIgJwciIMcmVzU2NhbGVNdWx0Igd1c3JBZGRyIgdwbXRBc0lkIgJ0eCIGdmVyaWZ5Ig90YXJnZXRQdWJsaWNLZXkiCm1hdGNoZXJQdWIiCm9yZGVyVmFsaWQiC3NlbmRlclZhbGlkIgxtYXRjaGVyVmFsaWQiB25ld0hhc2giC2FsbG93ZWRIYXNoIgtjdXJyZW50SGFzaHYAAWEAgMLXLwABYgkAtgIBAIDC1y8AAWMJALYCAQCAgJC7utat8A0AAWQJALYCAQAAAAFlCQC2AgEAAAABZgkAtgIBAAEAAWcJALYCAQACAAFoCQC2AgEJAGUCBQFhCQBpAgkAaAIFAWEAAQUBYQABaQIFV0FWRVMAAWoCAzEwMAABawIBMQABbAICX18AAW0CAAABbgABAAFvAAIAAXAAAwABcQAEAAFyAAEAAXMAAgABdAADAAF1AAQAAXYABQABdwAGAAF4AAcAAXkACAABegAJAAFBAAEAAUIABgABQwAHAAFEAAoAAUUJAGsDAAoFAWEAkE4BAUYCAUcBSAkAvAIDCQC2AgEFAUcFAWMJALYCAQUBSAEBSQIBSgFLCQCgAwEJALwCAwUBSgkAtgIBBQFLBQFjAQFMAwFNAU4BTwkAawMFAU0FAU4FAU8BAVABAUoDCQC/AgIFAWQFAUoJAL4CAQUBSgUBSgEBUQEBSgMJAL8CAgUBZAUBSgkAvgIBBQFKBQFKAQFSAAITJXNfX2ZhY3RvcnlDb250cmFjdAEBUwACFCVzX19tYW5hZ2VyUHVibGljS2V5AQFUAAIbJXNfX3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5AQFVAAIRJXMlc19fcHJpY2VfX2xhc3QBAVYCAVcBWAkAuQkCCQDMCAICGCVzJXMlZCVkX19wcmljZV9faGlzdG9yeQkAzAgCCQCkAwEFAVcJAMwIAgkApAMBBQFYBQNuaWwFAWwBAVkCAVoCYWEJAKwCAgkArAICCQCsAgICCyVzJXMlc19fUF9fBQFaAgJfXwUCYWEBAmFiAgFaAmFhCQCsAgIJAKwCAgkArAICAgslcyVzJXNfX0dfXwUBWgICX18FAmFhAQJhYwACDyVzX19hbW91bnRBc3NldAECYWQAAg4lc19fcHJpY2VBc3NldAECYWUAAgclc19fYW1wAQJhZgACDSVzX19hZGRvbkFkZHIAAmFnAgclc19fZmVlAAJhaAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQJhZwUBRQACYWkJALkJAgkAzAgCAgIlcwkAzAgCAgNkTHAFA25pbAUBbAACYWoJALkJAgkAzAgCAgIlcwkAzAgCAhJkTHBSZWZyZXNoZWRIZWlnaHQFA25pbAUBbAACYWsJALkJAgkAzAgCAgIlcwkAzAgCAg9yZWZyZXNoRExwRGVsYXkFA25pbAUBbAACYWwAHgACYW0JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUCYWsFAmFsAQJhbgACESVzX19mYWN0b3J5Q29uZmlnAQJhbwACGCVzJXNfX21hdGNoZXJfX3B1YmxpY0tleQECYXACAmFxAmFyCQCsAgIJAKwCAgkArAICCQCsAgICCCVkJWQlc19fBQJhcQICX18FAmFyAghfX2NvbmZpZwECYXMBAmF0CQCsAgICKCVzJXMlc19fbWFwcGluZ3NfX2Jhc2VBc3NldDJpbnRlcm5hbElkX18FAmF0AQJhdQACDCVzX19zaHV0ZG93bgECYXYAAh0lc19fYWxsb3dlZExwU3RhYmxlU2NyaXB0SGFzaAECYXcAAhclc19fZmVlQ29sbGVjdG9yQWRkcmVzcwECYXgDAmF5AmF6AmFBCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICEUZhaWxlZDogb3JkVmFsaWQ9CQClAwEFAmF5Agsgc25kclZhbGlkPQkApQMBBQJhegIMIG10Y2hyVmFsaWQ9CQClAwEFAmFBAQJhQgEBSgQCYUMFAUoDCQABAgUCYUMCBlN0cmluZwQCYUQFAmFDBQJhRAkAAgECE2ZhaWwgY2FzdCB0byBTdHJpbmcBAmFFAgJhRgJhRwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFAmFGBQJhRwkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQJhRgkAzAgCAgEuCQDMCAIFAmFHCQDMCAICDCBub3QgZGVmaW5lZAUDbmlsAgABAmFIAgJhRgJhRwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFAmFGBQJhRwkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQJhRgkAzAgCAgEuCQDMCAIFAmFHCQDMCAICDCBub3QgZGVmaW5lZAUDbmlsAgABAmFJAQJhSgkAAgEJALkJAgkAzAgCAg9scF9zdGFibGUucmlkZToJAMwIAgUCYUoFA25pbAIBIAECYUsBAmFKCQC5CQIJAMwIAgIPbHBfc3RhYmxlLnJpZGU6CQDMCAIFAmFKBQNuaWwCASAAAmFMCQERQGV4dHJOYXRpdmUoMTA2MikBCQECYUUCBQR0aGlzCQEBUgAAAmFNCQECYUUCBQR0aGlzCQECYWUAAQJhTgAJAQt2YWx1ZU9yRWxzZQIJAJsIAgUCYUwJAQJhdQAHAQJhTwAJANkEAQkBAmFFAgUCYUwJAQJhbwAAAmFQCQERQGV4dHJOYXRpdmUoMTA2MikBCQECYUUCBQJhTAkBAmF3AAECYVEABAJhUgkBAmFFAgUEdGhpcwkBAmFjAAQCYVMJAQJhRQIFBHRoaXMJAQJhZAAEAmFUCQECYUgCBQJhTAkBAmFzAQUCYVMEAmFxCQECYUgCBQJhTAkBAmFzAQUCYVIJALUJAgkBAmFFAgUCYUwJAQJhcAIJAKQDAQUCYXEJAKQDAQUCYVQFAWwBAmFVAQJhVgMJAAACBQJhVgUBaQUEdW5pdAkA2QQBBQJhVgECYVcBAmFWAwkAAAIFAmFWBQR1bml0BQFpCQDYBAEJAQV2YWx1ZQEFAmFWAQJhWAECYVkJAJkKBwkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQJhWQUBcgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmFZBQFzCQDZBAEJAJEDAgUCYVkFAXQJAQJhVQEJAJEDAgUCYVkFAXUJAQJhVQEJAJEDAgUCYVkFAXYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJhWQUBdwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmFZBQF4AAJhWgkBAmFYAQkBAmFRAAACYmEFAmFaAAJiYggFAmJhAl8xAAJiYwgFAmJhAl8yAAJiZAgFAmJhAl8zAAJiZQgFAmJhAl80AAJiZggFAmJhAl81AAJiZwgFAmJhAl82AAJiaAgFAmJhAl83AQJiaQAJALUJAgkBAmFFAgUCYUwJAQJhbgAFAWwAAmJqCQECYmkAAAJiawkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCYmoFAUECIEludmFsaWQgc3Rha2luZyBjb250cmFjdCBhZGRyZXNzAAJibAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCYmoFAUMCIEludmFsaWQgc2xpcGFnZSBjb250cmFjdCBhZGRyZXNzAAJibQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCYmoFAUQCHEludmFsaWQgZ3d4IGNvbnRyYWN0IGFkZHJlc3MAAmJuCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJiagUBQgIcSW52YWxpZCBnd3ggY29udHJhY3QgYWRkcmVzcwECYm8KAmJwAmJxAmJyAmJzAmJ0AmJ1AmJ2AmJ3AmJ4AmJ5CQC5CQIJAMwIAgIUJWQlZCVkJWQlZCVkJWQlZCVkJWQJAMwIAgkApAMBBQJicAkAzAgCCQCkAwEFAmJxCQDMCAIJAKQDAQUCYnIJAMwIAgkApAMBBQJicwkAzAgCCQCkAwEFAmJ0CQDMCAIJAKQDAQUCYnUJAMwIAgkApAMBBQJidgkAzAgCCQCkAwEFAmJ3CQDMCAIJAKQDAQUCYngJAMwIAgkApAMBBQJieQUDbmlsBQFsAQJiegYCYkECYkICYkMCYnMCYnYCYncJALkJAgkAzAgCAgwlZCVkJWQlZCVkJWQJAMwIAgkApAMBBQJiQQkAzAgCCQCkAwEFAmJCCQDMCAIJAKQDAQUCYkMJAMwIAgkApAMBBQJicwkAzAgCCQCkAwEFAmJ2CQDMCAIJAKQDAQUCYncFA25pbAUBbAECYkQBAmJFAwkAAAIFAmJFAgVXQVZFUwgJAO8HAQUEdGhpcwlhdmFpbGFibGUJAPAHAgUEdGhpcwkA2QQBBQJiRQECYkYCAmJHAmJICQC8AgMFAmJHBQFjBQJiSAECYkkDAmJKAmJLAmJMBAJiTQkAvAIDCQC4AgIFAmJKBQJiSwUBYgUCYksEAmJOCQC/AgIJALgCAgUCYkwJAQFQAQUCYk0FAWQDCQEBIQEFAmJOCQACAQkArAICAgpCaWcgc2xwZzogCQCmAwEFAmJNCQCUCgIFAmJOCQCZAwEJAMwIAgUCYkoJAMwIAgUCYksFA25pbAECYk8DAmJQAmJRAmJSBAJiTQkAvAIDBQJiUQUBYgUCYlAEAmJTCQC/AgIFAmJSBQJiTQMDBQJiUwYJAL8CAgUCYlEFAmJQCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApgMBBQJiUQIBIAkApgMBBQJiUAIBIAkApgMBBQJiTQIBIAkApgMBBQJiUgUCYlMBAmJUBAJiVQJiVgJiVwJiWAQCYlkJAQFGAgUCYlcFAmJVBAJiWgkBAUYCBQJiWAUCYlYJAQJiRgIFAmJaBQJiWQECY2EDAmJXAmJYAmNiBAJjYwkBAmFRAAQCY2QJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJjYwUBdwQCY2UJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJjYwUBeAQCY2YJAQJiVAQFAmNkBQJjZQUCYlcFAmJYBAJiSAkBAUYCBQJiVwUCY2QEAmJHCQEBRgIFAmJYBQJjZQQCY2cJAQFGAgUCY2IFAWEEAmNoCQECYkYCBQJiSAUCY2cEAmNpCQECYkYCBQJiRwUCY2cJAMwIAgUCY2YJAMwIAgUCY2gJAMwIAgUCY2kFA25pbAECY2oDAmJXAmJYAmNiBAJjawkBAmNhAwUCYlcFAmJYBQJjYgkAzAgCCQEBSQIJAJEDAgUCY2sAAAUBYQkAzAgCCQEBSQIJAJEDAgUCY2sAAQUBYQkAzAgCCQEBSQIJAJEDAgUCY2sAAgUBYQUDbmlsAQJjbAECY20EAmNuCQBrAwUCY20FAmFoBQFhCQCUCgIJAGUCBQJjbQUCY24FAmNuAQJjbwQCY3ACY3ECY3ICY3MEAmNjCQECYVEABAJjdAkAkQMCBQJjYwUBdAQCY3UJAJEDAgUCY2MFAXUEAmN2CQCRAwIFAmNjBQF2BAJjdwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmNjBQF3BAJjeAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmNjBQF4BAJjeQkAkQMCBQJjYwUBcwQCY3oICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQJjdAILV3JvbmcgTFAgaWQIcXVhbnRpdHkDCQECIT0CBQJjdAUCY3EJAAIBAg9Xcm9uZyBwbXQgYXNzZXQEAmNBCQECYkQBBQJjdQQCY0IJAQFGAgUCY0EFAmN3BAJjQwkBAmJEAQUCY3YEAmNECQEBRgIFAmNDBQJjeAQCY0UJAQJiRgIFAmNEBQJjQgQCY0YJAQFJAgUCY0UFAWEEAmNHCQEBRgIFAmNyBQFhBAJjSAkBAUYCBQJjegUBYQQCY0kJALwCAwUCY0IFAmNHBQJjSAQCY0oJALwCAwUCY0QFAmNHBQJjSAQCY0sJAQFJAgUCY0kFAmN3BAJjTAkBAUkCBQJjSgUCY3gEAmNNAwkAAAIFAmNwAgAFA25pbAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJjcwUCY0sDCQAAAgUCY3UCBVdBVkVTBQR1bml0CQDZBAEFAmN1CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmNzBQJjTAMJAAACBQJjdgIFV0FWRVMFBHVuaXQJANkEAQUCY3YJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFiAgkApQgBBQJjcwUCY3AJAQJiegYFAmNLBQJjTAUCY3IFAmNGBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBVQAFAmNGCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBVgIFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFAmNGBQNuaWwJAJwKCgUCY0sFAmNMBQJjdQUCY3YFAmNBBQJjQwUCY3oFAmNFBQJjeQUCY00BAmNODQJjcAJiTAJjTwJjUAJjUQJjUgJjcwJjUwJjVAJjVQJjVgJjVwJjWAQCY2MJAQJhUQAEAmN0CQDZBAEJAJEDAgUCY2MFAXQEAmNZCQCRAwIFAmNjBQF1BAJjWgkAkQMCBQJjYwUBdgQCZGEJAJEDAgUCY2MFAXkEAmRiCQCRAwIFAmNjBQF6BAJkYwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmNjBQF3BAJkZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmNjBQF4BAJjeQkAkQMCBQJjYwUBcwQCZGUICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUCY3QCCFdyIGxwIGFzCHF1YW50aXR5BAJjQQMFAmNTCQECYkQBBQJjWQMDBQJjVQkAAAIFAmNYBQJjWQcJAGUCCQECYkQBBQJjWQUCY1cDBQJjVQkBAmJEAQUCY1kJAGUCCQECYkQBBQJjWQUCY08EAmNDAwUCY1MJAQJiRAEFAmNaAwMFAmNVCQAAAgUCY1gFAmNaBwkAZQIJAQJiRAEFAmNaBQJjVwMFAmNVCQECYkQBBQJjWgkAZQIJAQJiRAEFAmNaBQJjUQQCZGYJAQFGAgUCY08FAmRjBAJkZwkBAUYCBQJjUQUCZGQEAmRoCQECYkYCBQJkZwUCZGYEAmNCCQEBRgIFAmNBBQJkYwQCY0QJAQFGAgUCY0MFAmRkBAJkaQMJAAACBQJkZQAABAJjRQUBZAQCZGoFAWQEAmNnCQB2BgkAuQICBQJkZgUCZGcAAAkAtgIBAAUAAQAABQRET1dOCQCXCgUJAQFJAgUCY2cFAWEJAQFJAgUCZGYFAmRjCQEBSQIFAmRnBQJkZAkBAmJGAgkAtwICBQJjRAUCZGcJALcCAgUCY0IFAmRmBQJkagQCY0UJAQJiRgIFAmNEBQJjQgQCZGsJALwCAwkBAVABCQC4AgIFAmNFBQJkaAUBYwUCY0UEAmRqCQEBRgIFAmJMBQFhAwMDBQJjVgkBAiE9AgUCY0UFAWQHCQC/AgIFAmRrBQJkagcJAAIBCQCsAgIJAKwCAgkArAICAg9QcmljZSBzbGlwcGFnZSAJAKYDAQUCZGsCAyA+IAkApgMBBQJkagQCZGwJAQFGAgUCZGUFAWEEAmRtCQC8AgMFAmRmBQJjRQUBYwQCZG4JALwCAwUCZGcFAWMFAmNFBAJkbwMJAL8CAgUCZG0FAmRnCQCUCgIFAmRuBQJkZwkAlAoCBQJkZgUCZG0EAmRwCAUCZG8CXzEEAmRxCAUCZG8CXzIEAmNnCQC8AgMFAmRsBQJkcQUCY0QJAJcKBQkBAUkCBQJjZwUBYQkBAUkCBQJkcAUCZGMJAQFJAgUCZHEFAmRkBQJjRQUCZGoEAmRyCAUCZGkCXzEEAmRzCAUCZGkCXzIEAmR0CAUCZGkCXzMEAmNGCQEBSQIIBQJkaQJfNAUBYQQCZHUJAQFJAggFAmRpAl81BQFhAwkAZwIAAAUCZHIJAAIBAgdMUCA8PSAwBAJkdgMJAQEhAQUCY1QAAAUCZHIEAmR3CQBlAgUCY08FAmRzBAJkeAkAZQIFAmNRBQJkdAQCZHkDAwUCY1UJAAACBQJjWAUCY1kHCQCUCgIFAmNXAAADAwUCY1UJAAACBQJjWAUCY1oHCQCUCgIAAAUCY1cJAJQKAgUCZHMFAmR0BAJkeggFAmR5Al8xBAJkQQgFAmR5Al8yBAJkQgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVUABQJjRgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVYCBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQJjRgkAzAgCCQELU3RyaW5nRW50cnkCCQEBWQIFAmNzBQJjcAkBAmJvCgUCZHoFAmRBBQJkdgUCY0YFAmJMBQJkdQUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUCZHcFAmR4BQNuaWwJAJ8KDQUCZHIFAmR2BQJjRgUCY0EFAmNDBQJkZQUCY3QFAmN5BQJkQgUCZHcFAmR4BQJjUAUCY1IBAmRDAwJkRAJkRQJkRgQCZEcJALwCAwkAuQICBQJkRAUCZEUFAWMFAmRGBQJkRwECZEgDAmRJAmRKAmRLBAJkTAkAZAIJAQJiRAEJAQJhVwEFAmJlBQJkSQQCZE0JAGQCCQECYkQBCQECYVcBBQJiZgUCZEoEAmROCQBkAggJAQV2YWx1ZQEJAOwHAQUCYmQIcXVhbnRpdHkFAmRLBAJkRwkBAmRDAwkAtgIBBQJkTAkAtgIBBQJkTQkAtgIBBQJkTgQCZE8JAMwIAgkBDEludGVnZXJFbnRyeQIFAmFqBQZoZWlnaHQJAMwIAgkBC1N0cmluZ0VudHJ5AgUCYWkJAKYDAQUCZEcFA25pbAkAlAoCBQJkTwUCZEcBAmRQAQJkRwQCZEwJAQJiRAEJAQJhVwEFAmJlBAJkTQkBAmJEAQkBAmFXAQUCYmYEAmROCAkBBXZhbHVlAQkA7AcBBQJiZAhxdWFudGl0eQQCZFEJAQJkQwMJALYCAQUCZEwJALYCAQUCZE0JALYCAQUCZE4DCQDAAgIFAmRHBQJkUQYJAQJhSQECInVwZGF0ZWQgRExwIGxvd2VyIHRoYW4gY3VycmVudCBETHABAmRSAQJkUwQCZFQIBQJkUwZhbW91bnQEAmRVCQBrAwgFAmRTBmFtb3VudAgFAmRTBXByaWNlBQFhBAJkVgMJAAACCAUCZFMJb3JkZXJUeXBlBQNCdXkJAJQKAgUCZFQJAQEtAQUCZFUJAJQKAgkBAS0BBQJkVAUCZFUEAmRJCAUCZFYCXzEEAmRKCAUCZFYCXzIDAwMJAQJhTgAGCQAAAgUCYmMFAXAGCQAAAgUCYmMFAXEJAAIBAg1BZG1pbiBibG9ja2VkAwMJAQIhPQIICAUCZFMJYXNzZXRQYWlyC2Ftb3VudEFzc2V0BQJiZQYJAQIhPQIICAUCZFMJYXNzZXRQYWlyCnByaWNlQXNzZXQFAmJmCQACAQIJV3IgYXNzZXRzBAJkVwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCoAwEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQJhaQkBAmFLAQIPZExwIGlzIHJlcXVpcmVkCQECYUsBAgtpbnZhbGlkIGRMcAQCZFgJAQJkSAMFAmRJBQJkSgAABAJkWQgFAmRYAl8xBAJkWggFAmRYAl8yBAJlYQkAvwICBQJkWgUCZFcFAmVhAQJlYgECZWMDCQECIT0CCQCQAwEIBQJlYwhwYXltZW50cwABCQACAQIKMSBwbW50IGV4cAQCZWQJAQV2YWx1ZQEJAJEDAggFAmVjCHBheW1lbnRzAAAEAmNxCQEFdmFsdWUBCAUCZWQHYXNzZXRJZAQCY1cIBQJlZAZhbW91bnQEAmRpCQECY28ECQDYBAEIBQJlYw10cmFuc2FjdGlvbklkCQDYBAEFAmNxBQJjVwgFAmVjBmNhbGxlcgQCY0sIBQJkaQJfMQQCY0wIBQJkaQJfMgQCY3kJAQ1wYXJzZUludFZhbHVlAQgFAmRpAl85BAJjTQgFAmRpA18xMAMDCQECYU4ABgkAAAIFAmN5BQFxCQACAQkArAICAg9BZG1pbiBibG9ja2VkOiAJAKQDAQUCY3kJAJcKBQUCY0sFAmNMBQJjVwUCY3EFAmNNAQJlZQoCZWYCYWECZWcCZWgCYkwCY1QCY1UCY1YCY1cCY1gEAmRpCQECY04NBQJhYQUCYkwICQEFdmFsdWUBBQJlZwZhbW91bnQICQEFdmFsdWUBBQJlZwdhc3NldElkCAkBBXZhbHVlAQUCZWgGYW1vdW50CAkBBXZhbHVlAQUCZWgHYXNzZXRJZAUCZWYJAAACBQJhYQIABQJjVAUCY1UFAmNWBQJjVwUCY1gEAmN5CQENcGFyc2VJbnRWYWx1ZQEIBQJkaQJfOAMDAwkBAmFOAAYJAAACBQJjeQUBbwYJAAACBQJjeQUBcQkAAgEJAKwCAgIIQmxvY2tlZDoJAKQDAQUCY3kFAmRpAQJlaQECZWoEAmVrBQFnBAJlbAkAkQMCBQJlagAABAJlbQkAkQMCBQJlagABBAJlbgkApwMBBQFqBAJlbwkAuQICCQCnAwEFAmFNBQJlbgQCZXAJALcCAgUCZWwFAmVtAwkAAAIFAmVwBQFlBQFlBAJlcQkAuQICBQJlbwUCZWsEAmVyCQC5AgIJALkCAgkAuQICBQJlbAUCZW0FAmVrBQJlawQCZXMJALoCAgkAuQICBQJlcQUCZXAFAmVuBAJldAkAuAICBQJlcQUCZW4EAmV1CQC3AgIFAmVrBQFmCgECZXYCAmV3AmV4BAJleQUCZXcEAmV6CAUCZXkCXzEEAmVBCAUCZXkCXzIDCQECIT0CBQJlQQUEdW5pdAUCZXcEAmVCCQC6AgIJALkCAgkAuQICBQJlegUCZXoFAmV6BQJlcgQCZUMJALoCAgkAuQICCQC3AgIFAmVzCQC5AgIFAmVCBQJlawUCZXoJALcCAgkAugICCQC5AgIFAmV0BQJlegUCZW4JALkCAgUCZXUFAmVCBAJlRAkBAVEBCQC4AgIFAmVDCQEFdmFsdWUBBQJlegMJAMACAgUBZgUCZUQJAJQKAgUCZUMFAmV4CQCUCgIFAmVDBQR1bml0BAJlRQkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQkAzAgCAAYJAMwIAgAHCQDMCAIACAkAzAgCAAkJAMwIAgAKCQDMCAIACwkAzAgCAAwJAMwIAgANCQDMCAIADgUDbmlsBAJlRgoAAmVHBQJlRQoAAmVICQCQAwEFAmVHCgACZUkJAJQKAgUCZXAFBHVuaXQKAQJlSgICZUsCZUwDCQBnAgUCZUwFAmVIBQJlSwkBAmV2AgUCZUsJAJEDAgUCZUcFAmVMCgECZU0CAmVLAmVMAwkAZwIFAmVMBQJlSAUCZUsJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBAmVNAgkBAmVKAgkBAmVKAgkBAmVKAgkBAmVKAgkBAmVKAgkBAmVKAgkBAmVKAgkBAmVKAgkBAmVKAgkBAmVKAgkBAmVKAgkBAmVKAgkBAmVKAgkBAmVKAgkBAmVKAgUCZUkAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwQCZXoIBQJlRgJfMQQCZUEIBQJlRgJfMgMJAQIhPQIFAmVBBQR1bml0BQJlegkAAgEJAKwCAgIZRCBjYWxjdWxhdGlvbiBlcnJvciwgRCA9IAkApgMBBQJlegECZU4DAmVqAmVjAmVPBAJlawUBZwQCZVAJAJEDAgUCZWoDCQAAAgUCZWMAAAABAAAEAmVuCQCnAwEFAWoEAmVvCQC5AgIJAKcDAQUCYU0FAmVuBAJlcAUCZVAEAmVxCQC5AgIFAmVvBQJlawQCZVEJALoCAgkAuQICCQC5AgIJALoCAgkAuQICBQJlTwUCZU8JALkCAgUCZVAFAmVrBQJlTwUCZW4JALkCAgUCZXEFAmVrBAJlUgkAuAICCQC3AgIFAmVwCQC6AgIJALkCAgUCZU8FAmVuBQJlcQUCZU8KAQJldgICZXcCZXgEAmVTBQJldwQCZVQIBQJlUwJfMQQCZUEIBQJlUwJfMgMJAQIhPQIFAmVBBQR1bml0BQJldwQCZVUJALoCAgkAtwICCQC5AgIFAmVUBQJlVAUCZVEJALcCAgkAuQICBQFnBQJlVAUCZVIEAmVWCQEBUQEJALgCAgUCZVUJAQV2YWx1ZQEFAmVUAwkAwAICBQFmBQJlVgkAlAoCBQJlVQUCZXgJAJQKAgUCZVUFBHVuaXQEAmVFCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgkAzAgCAAcJAMwIAgAICQDMCAIACQkAzAgCAAoJAMwIAgALCQDMCAIADAkAzAgCAA0JAMwIAgAOBQNuaWwEAmVXCgACZUcFAmVFCgACZUgJAJADAQUCZUcKAAJlSQkAlAoCBQJlTwUEdW5pdAoBAmVKAgJlSwJlTAMJAGcCBQJlTAUCZUgFAmVLCQECZXYCBQJlSwkAkQMCBQJlRwUCZUwKAQJlTQICZUsCZUwDCQBnAgUCZUwFAmVIBQJlSwkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE1CQECZU0CCQECZUoCCQECZUoCCQECZUoCCQECZUoCCQECZUoCCQECZUoCCQECZUoCCQECZUoCCQECZUoCCQECZUoCCQECZUoCCQECZUoCCQECZUoCCQECZUoCCQECZUoCBQJlSQAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPBAJlVAgFAmVXAl8xBAJlQQgFAmVXAl8yAwkBAiE9AgUCZUEFBHVuaXQFAmVUCQACAQkArAICAhlZIGNhbGN1bGF0aW9uIGVycm9yLCBZID0gCQCmAwEFAmVUAQJlWAUCZVkCY3ECY3MCYWECZVoEAmFZCQECYVEABAJjdQkAkQMCBQJhWQUBdQQCY3YJAJEDAgUCYVkFAXYEAmN0CQCRAwIFAmFZBQF0BAJkYwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmFZBQF3BAJkZAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmFZBQF4BAJkTgkAtgIBCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEJANkEAQUCY3QCEGludmFsaWQgbHAgYXNzZXQIcXVhbnRpdHkEAmZhAwkAvwICBQJkTgUBZQYJAAIBAiJpbml0aWFsIGRlcG9zaXQgcmVxdWlyZXMgYWxsIGNvaW5zAwkAAAIFAmZhBQJmYQQCY0EJAQJiRAEFAmN1BAJjQwkBAmJEAQUCY3YEAmZiAwkAAAIFAmFhAgAJAJQKAgUCY0EFAmNDAwkAAAIFAmNxBQJjdQMJAGYCBQJlWQUCY0EJAAIBAhZpbnZhbGlkIHBheW1lbnQgYW1vdW50CQCUCgIJAGUCBQJjQQUCZVkFAmNDAwkAAAIFAmNxBQJjdgMJAGYCBQJlWQUCY0MJAAIBAhZpbnZhbGlkIHBheW1lbnQgYW1vdW50CQCUCgIFAmNBCQBlAgUCY0MFAmVZCQACAQIQd3JvbmcgcG10QXNzZXRJZAQCZmMIBQJmYgJfMQQCZmQIBQJmYgJfMgQCZmUDCQAAAgUCY3EFAmN1CQCUCgIFAmVZAAADCQAAAgUCY3EFAmN2CQCUCgIAAAUCZVkJAAIBAg9pbnZhbGlkIHBheW1lbnQEAmZmCAUCZmUCXzEEAmZnCAUCZmUCXzIEAmZoAwUCZVoJAJUKAwgJAQJjbAEFAmZmAl8xCAkBAmNsAQUCZmcCXzEICQECY2wBBQJlWQJfMgkAlQoDBQJmZgUCZmcAAAQCZmkIBQJmaAJfMQQCZmoIBQJmaAJfMgQCY24IBQJmaAJfMwQCZmsJAGQCBQJmYwUCZmkEAmZsCQBkAgUCZmQFAmZqBAJiUQkBAmVpAQkAzAgCCQC2AgEFAmZjCQDMCAIJALYCAQUCZmQFA25pbAQCYlAJAQJlaQEJAMwIAgkAtgIBBQJmawkAzAgCCQC2AgEFAmZsBQNuaWwEAmZtAwkAvwICBQJiUAUCYlEGCQEFdGhyb3cAAwkAAAIFAmZtBQJmbQQCZm4JALwCAwUCZE4JALgCAgUCYlAFAmJRBQJiUQQCY0YJAQFJAgkBAmJGAgkBAUYCBQJmbAUCZGQJAQFGAgUCZmsFAmRjBQFhBAJkQgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVUABQJjRgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVYCBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQJjRgkAzAgCCQELU3RyaW5nRW50cnkCCQEBWQIFAmNzBQJhYQkBAmJvCgUCZmYFAmZnCQCgAwEFAmZuBQJjRgAAAAAFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAAAAAABQNuaWwEAmZvCQBrAwUCZmQFAWEFAmZjBAJmcAkAawMFAmVZBQFhCQBkAgUCZm8FAWEEAmZxCQBlAgUCZVkFAmZwBAJmcgkAvAIDBQJkTgkAtgIBBQJmcQkAtgIBBQJmZAQCZnMJAKADAQkAvAIDCQC4AgIFAmZuBQJmcgUBYgUCZnIJAJYKBAkAoAMBBQJmbgUCZEIFAmNuBQJmcwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECZnQGAmZ1AmZ2AmZ3AmVmAmZ4AmZ5BAJhWQkBAmFRAAQCY3QJAJEDAgUCYVkFAXQEAmN1CQCRAwIFAmFZBQF1BAJjdgkAkQMCBQJhWQUBdgQCZnoJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJhWQUBdwQCZkEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJhWQUBeAQCZkIJAJEDAgUCYVkFAXMEAmNzAwkAAAIFAmVmBQJibgUCZngFAmVmBAJlZAkBBXZhbHVlAQkAkQMCBQJmdwAABAJjcQkBBXZhbHVlAQgFAmVkB2Fzc2V0SWQEAmNXCAUCZWQGYW1vdW50BAJjcAkA2AQBBQJmeQMJAQIhPQIFAmN0CQDYBAEFAmNxCQACAQIIV3JvbmcgTFAEAmNBCQECYkQBBQJjdQQCY0MJAQJiRAEFAmN2BAJmQwoAAmZECQD8BwQFBHRoaXMCE2dldE9uZVRrblYyUkVBRE9OTFkJAMwIAgUCZnUJAMwIAgUCY1cFA25pbAUDbmlsAwkAAQIFAmZEAgooSW50LCBJbnQpBQJmRAkAAgEJAKwCAgkAAwEFAmZEAh8gY291bGRuJ3QgYmUgY2FzdCB0byAoSW50LCBJbnQpAwkAAAIFAmZDBQJmQwQCY24IBQJmQwJfMgQCZkUIBQJmQwJfMQQCZkYDAwkAZgIFAmZ2AAAJAGYCBQJmdgUCZkUHCQECYUkBCQC5CQIJAMwIAgIfYW1vdW50IHRvIHJlY2VpdmUgaXMgbGVzcyB0aGFuIAkAzAgCCQCkAwEFAmZ2BQNuaWwCAAUCZkUEAmZHAwkAAAIFAmZ1BQJjdQkAlgoEBQJmRgAACQBlAgkAZQIFAmNBBQJmRgUCY24FAmNDAwkAAAIFAmZ1BQJjdgkAlgoEAAAFAmZGBQJjQQkAZQIJAGUCBQJjQwUCZkYFAmNuCQACAQIUaW52YWxpZCBvdXQgYXNzZXQgaWQEAmZICAUCZkcCXzEEAmZJCAUCZkcCXzIEAmZrCAUCZkcCXzMEAmZsCAUCZkcCXzQEAmZKCQECYkYCCQEBRgIFAmZsBQJmQQkBAUYCBQJmawUCZnoEAmZLCQEBSQIFAmZKBQFhBAJmTAMJAAACBQJmdQIFV0FWRVMFBHVuaXQJANkEAQUCZnUEAmZNAwkAZgIFAmNuAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUCYVAFAmNuBQJmTAUDbmlsBQNuaWwEAmNNCQDOCAIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUCY3MFAmZGBQJmTAkAzAgCCQELU3RyaW5nRW50cnkCCQECYWICCQClCAEFAmNzBQJjcAkBAmJ6BgUCZkgFAmZJBQJjVwUCZksFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFVAAUCZksJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFWAgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUCZksFA25pbAUCZk0DCQAAAgUCY00FAmNNBAJmTgkA/AcEBQJhTAIEYnVybgkAzAgCBQJjVwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJjcQUCY1cFA25pbAMJAAACBQJmTgUCZk4EAmZPBAJmUAMJAAACBQR0aGlzBQJhUAAABQJjbgQCZlEDCQAAAgkBAmFVAQUCZnUFAmJlBgcDBQJmUQkAlAoCCQEBLQEJAGQCBQJmRQUCZlAAAAkAlAoCAAAJAQEtAQkAZAIFAmZFBQJmUAQCZEkIBQJmTwJfMQQCZEoIBQJmTwJfMgQCZlIJAQJkSAMFAmRJBQJkSgAABAJmUwgFAmZSAl8xBAJkRwgFAmZSAl8yBAJmVAkBAmRQAQUCZEcDCQAAAgUCZlQFAmZUCQCUCgIJAM4IAgUCY00FAmZTBQJmRgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECZlUABAJhQwkAoggBCQEBUwADCQABAgUCYUMCBlN0cmluZwQCZXAFAmFDCQDZBAEFAmVwAwkAAQIFAmFDAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IBAmZWAAQCYUMJAKIIAQkBAVQAAwkAAQIFAmFDAgZTdHJpbmcEAmVwBQJhQwkA2QQBBQJlcAMJAAECBQJhQwIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAAJmVwkAAgECEVBlcm1pc3Npb24gZGVuaWVkAQJmWAECZWMEAmFDCQECZlUAAwkAAQIFAmFDAgpCeXRlVmVjdG9yBAJmWQUCYUMJAAACCAUCZWMPY2FsbGVyUHVibGljS2V5BQJmWQMJAAECBQJhQwIEVW5pdAkAAAIIBQJlYwZjYWxsZXIFBHRoaXMJAAIBAgtNYXRjaCBlcnJvcgECZloBAmVjBAJhQwkBAmZVAAMJAAECBQJhQwIKQnl0ZVZlY3RvcgQCZlkFAmFDAwkAAAIIBQJlYw9jYWxsZXJQdWJsaWNLZXkFAmZZBgUCZlcDCQABAgUCYUMCBFVuaXQDCQAAAggFAmVjBmNhbGxlcgUEdGhpcwYFAmZXCQACAQILTWF0Y2ggZXJyb3IdAmVjAQtjb25zdHJ1Y3RvcgEBUgQCZVEJAQJmWgEFAmVjAwkAAAIFAmVRBQJlUQkAzAgCCQELU3RyaW5nRW50cnkCCQEBUgAFAVIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJlYwEKc2V0TWFuYWdlcgECZ2EEAmVRCQECZloBBQJlYwMJAAACBQJlUQUCZVEEAmdiCQDZBAEFAmdhAwkAAAIFAmdiBQJnYgkAzAgCCQELU3RyaW5nRW50cnkCCQEBVAAFAmdhBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZWMBDmNvbmZpcm1NYW5hZ2VyAAQCY2sJAQJmVgAEAmdjAwkBCWlzRGVmaW5lZAEFAmNrBgkAAgECEk5vIHBlbmRpbmcgbWFuYWdlcgMJAAACBQJnYwUCZ2MEAmdkAwkAAAIIBQJlYw9jYWxsZXJQdWJsaWNLZXkJAQV2YWx1ZQEFAmNrBgkAAgECG1lvdSBhcmUgbm90IHBlbmRpbmcgbWFuYWdlcgMJAAACBQJnZAUCZ2QJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVMACQDYBAEJAQV2YWx1ZQEFAmNrCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFUAAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmVjAQNwdXQCAmdlAmdmBAJnZwkBAmJpAAQCZ2gJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmdnBQFBAgpXciBzdCBhZGRyBAJnaQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCZ2cFAUMCCldyIHNsIGFkZHIDCQBmAgAABQJnZQkAAgECDldyb25nIHNsaXBwYWdlAwkBAiE9AgkAkAMBCAUCZWMIcGF5bWVudHMAAgkAAgECDDIgcG1udHMgZXhwZAQCZ2oJAQJlZQoJAKUIAQgFAmVjBmNhbGxlcgkA2AQBCAUCZWMNdHJhbnNhY3Rpb25JZAkBD0F0dGFjaGVkUGF5bWVudAIICQEFdmFsdWUBCQCRAwIIBQJlYwhwYXltZW50cwAAB2Fzc2V0SWQICQEFdmFsdWUBCQCRAwIIBQJlYwhwYXltZW50cwAABmFtb3VudAkAkQMCCAUCZWMIcGF5bWVudHMAAQUCZ2UGBwYAAAIABAJkdggFAmdqAl8yBAJnawgFAmdqAl83BAJjTQgFAmdqAl85BAJkdwgFAmdqA18xMAQCZHgIBQJnagNfMTEEAmN1CAUCZ2oDXzEyBAJjdggFAmdqA18xMwQCZGkJAPwHBAUCYUwCBGVtaXQJAMwIAgUCZHYFA25pbAUDbmlsAwkAAAIFAmRpBQJkaQQCZ2wEAmFDBQJkaQMJAAECBQJhQwIHQWRkcmVzcwQCZ20FAmFDCQD8BwQFAmdtAgRlbWl0CQDMCAIFAmR2BQNuaWwFA25pbAUEdW5pdAMJAAACBQJnbAUCZ2wEAmduAwkAZgIFAmR3AAAJAPwHBAUCZ2kCA3B1dAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJjdQUCZHcFA25pbAUDbmlsAwkAAAIFAmduBQJnbgQCZ28DCQBmAgUCZHgAAAkA/AcEBQJnaQIDcHV0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmN2BQJkeAUDbmlsBQNuaWwDCQAAAgUCZ28FAmdvBAJncAMFAmdmBAJncQkA/AcEBQJnaAIFc3Rha2UFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCZ2sFAmR2BQNuaWwDCQAAAgUCZ3EFAmdxBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAmVjBmNhbGxlcgUCZHYFAmdrBQNuaWwEAmdyCQECZEgDAAAAAAAABAJmUwgFAmdyAl8xBAJkRwgFAmdyAl8yBAJmVAkBAmRQAQUCZEcDCQAAAgUCZlQFAmZUCQDOCAIJAM4IAgUCY00FAmdwBQJmUwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJlYwELcHV0T25lVGtuVjICAmZ2AmdmBAJncwoAAmZECQD8BwQFAmFMAihpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZFJFQURPTkxZCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQABAgUCZkQCB0Jvb2xlYW4FAmZECQACAQkArAICCQADAQUCZkQCHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4EAmd0AwMDCQECYU4ABgkAAAIFAmJjBQFvBgkAAAIFAmJjBQFxBgUCZ3MEAmd1CQDMCAIDAwkBASEBBQJndAYJAQJmWAEFAmVjBgkBAmFJAQIhcHV0IG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IGFkbWluCQDMCAIDCQAAAgkAkAMBCAUCZWMIcGF5bWVudHMAAQYJAQJhSQECHmV4YWN0bHkgMSBwYXltZW50IGFyZSBleHBlY3RlZAUDbmlsAwkAAAIFAmd1BQJndQQCYVkJAQJhUQAEAmN1CQCRAwIFAmFZBQF1BAJjdgkAkQMCBQJhWQUBdgQCY3QJANkEAQkAkQMCBQJhWQUBdAQCZnoJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJhWQUBdwQCZkEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJhWQUBeAQCY3MDCQAAAggFAmVjBmNhbGxlcgUEdGhpcwgFAmVjDG9yaWdpbkNhbGxlcggFAmVjBmNhbGxlcgQCZWQJAQV2YWx1ZQEJAJEDAggFAmVjCHBheW1lbnRzAAAEAmNxCQDYBAEJAQV2YWx1ZQEIBQJlZAdhc3NldElkBAJjVwgFAmVkBmFtb3VudAQCZ3YJAQJlWAUFAmNXBQJjcQkApQgBBQJjcwkA2AQBCAUCZWMNdHJhbnNhY3Rpb25JZAYDCQAAAgUCZ3YFAmd2BAJjbggFAmd2Al8zBAJjTQgFAmd2Al8yBAJndwgFAmd2Al8xBAJkdgMDCQBmAgUCZnYAAAkAZgIFAmZ2BQJndwcJAQJhSQEJALkJAgkAzAgCAh9hbW91bnQgdG8gcmVjZWl2ZSBpcyBsZXNzIHRoYW4gCQDMCAIJAKQDAQUCZnYFA25pbAIABQJndwQCZ2oJAPwHBAUCYUwCBGVtaXQJAMwIAgUCZHYFA25pbAUDbmlsAwkAAAIFAmdqBQJnagQCZ2wEAmFDBQJnagMJAAECBQJhQwIHQWRkcmVzcwQCZ20FAmFDCQD8BwQFAmdtAgRlbWl0CQDMCAIFAmR2BQNuaWwFA25pbAUEdW5pdAMJAAACBQJnbAUCZ2wEAmdwAwUCZ2YEAmdxCQD8BwQFAmJrAgVzdGFrZQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJjdAUCZHYFA25pbAMJAAACBQJncQUCZ3EFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUCZWMGY2FsbGVyBQJkdgUCY3QFA25pbAQCZk0DCQBmAgUCY24AAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJhUAUCY24JANkEAQUCY3EFA25pbAUDbmlsBAJneAMJAAACBQR0aGlzBQJhUAkAlAoCAAAAAAQCZ3kDCQAAAggFAmVkB2Fzc2V0SWQFAmJlBgcDBQJneQkAlAoCCQEBLQEFAmNuAAAJAJQKAgAACQEBLQEFAmNuBAJkSQgFAmd4Al8xBAJkSggFAmd4Al8yBAJnegkBAmRIAwUCZEkFAmRKAAAEAmZTCAUCZ3oCXzEEAmRHCAUCZ3oCXzIJAJQKAgkAzggCCQDOCAIJAM4IAgUCY00FAmdwBQJmTQUCZlMFAmR2CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmVjAQpwdXRGb3JGcmVlAQJnQQMJAGYCAAAFAmdBCQACAQIKV3Jvbmcgc2xwZwMJAQIhPQIJAJADAQgFAmVjCHBheW1lbnRzAAIJAAIBAgwyIHBtbnRzIGV4cGQEAmdCCQECZWUKCQClCAEIBQJlYwZjYWxsZXIJANgEAQgFAmVjDXRyYW5zYWN0aW9uSWQJAQ9BdHRhY2hlZFBheW1lbnQCCAkBBXZhbHVlAQkAkQMCCAUCZWMIcGF5bWVudHMAAAdhc3NldElkCAkBBXZhbHVlAQkAkQMCCAUCZWMIcGF5bWVudHMAAAZhbW91bnQJAJEDAggFAmVjCHBheW1lbnRzAAEFAmdBBwcGAAACAAQCY00IBQJnQgJfOQQCZ0MJAQJkSAMAAAAAAAAEAmZTCAUCZ0MCXzEEAmRHCAUCZ0MCXzIEAmZUCQECZFABBQJkRwMJAAACBQJmVAUCZlQJAM4IAgUCY00FAmZTCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmVjAQNnZXQABAJkaQkBAmViAQUCZWMEAmdECAUCZGkCXzEEAmNMCAUCZGkCXzIEAmNXCAUCZGkCXzMEAmNxCAUCZGkCXzQEAmNNCAUCZGkCXzUEAmVSCQD8BwQFAmFMAgRidXJuCQDMCAIFAmNXBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmNxBQJjVwUDbmlsAwkAAAIFAmVSBQJlUgQCZ0UJAQJkSAMJAQEtAQUCZ0QJAQEtAQUCY0wAAAQCZlMIBQJnRQJfMQQCZEcIBQJnRQJfMgQCZlQJAQJkUAEFAmRHAwkAAAIFAmZUBQJmVAkAzggCBQJjTQUCZlMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZWMBC2dldE9uZVRrblYyAgJmdQJmdgQCZ3MKAAJmRAkA/AcEBQJhTAIoaXNQb29sT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWRSRUFET05MWQkAzAgCCQClCAEFBHRoaXMFA25pbAUDbmlsAwkAAQIFAmZEAgdCb29sZWFuBQJmRAkAAgEJAKwCAgkAAwEFAmZEAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuBAJnRgMDCQECYU4ABgkAAAIFAmJjBQFxBgUCZ3MEAmd1CQDMCAIDAwkBASEBBQJnRgYJAQJmWAEFAmVjBgkBAmFJAQIhZ2V0IG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IGFkbWluCQDMCAIDCQAAAgkAkAMBCAUCZWMIcGF5bWVudHMAAQYJAQJhSQECHmV4YWN0bHkgMSBwYXltZW50IGFyZSBleHBlY3RlZAUDbmlsAwkAAAIFAmd1BQJndQQCZ0cJAQJmdAYFAmZ1BQJmdggFAmVjCHBheW1lbnRzCAUCZWMGY2FsbGVyCAUCZWMMb3JpZ2luQ2FsbGVyCAUCZWMNdHJhbnNhY3Rpb25JZAQCY00IBQJnRwJfMQQCZkYIBQJnRwJfMgkAlAoCBQJjTQUCZkYJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZWMBCnJlZnJlc2hETHAABAJnSAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQJhagAABAJnSQMJAGcCCQBlAgUGaGVpZ2h0BQJnSAUCYW0FBHVuaXQJAQJhSQEJALkJAgkAzAgCCQCkAwEFAmFtCQDMCAICLyBibG9ja3MgaGF2ZSBub3QgcGFzc2VkIHNpbmNlIHRoZSBwcmV2aW91cyBjYWxsBQNuaWwCAAMJAAACBQJnSQUCZ0kEAmRXCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKgDAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQJhaQIBMAkBAmFLAQILaW52YWxpZCBkTHAEAmdKCQECZEgDAAAAAAAABAJnSwgFAmdKAl8xBAJkRwgFAmdKAl8yBAJkTwMJAQIhPQIFAmRXBQJkRwUCZ0sJAQJhSQECEm5vdGhpbmcgdG8gcmVmcmVzaAkAlAoCBQJkTwkApgMBBQJkRwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJlYwETZ2V0T25lVGtuVjJSRUFET05MWQICZnUCZ0wEAmFZCQECYVEABAJjdQkAkQMCBQJhWQUBdQQCY3YJAJEDAgUCYVkFAXYEAmN0CQCRAwIFAmFZBQF0BAJlagkAzAgCCQC2AgEJAQJiRAEFAmN1CQDMCAIJALYCAQkBAmJEAQUCY3YFA25pbAQCZEYJALYCAQgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBCQDZBAEFAmN0AhBpbnZhbGlkIGxwIGFzc2V0CHF1YW50aXR5BAJiUQkBAmVpAQUCZWoEAmJQCQC4AgIFAmJRCQC8AgMJALYCAQUCZ0wFAmJRBQJkRgQCZ00DCQAAAgUCZnUFAmN1AAADCQAAAgUCZnUFAmN2AAEJAAIBAhRpbnZhbGlkIG91dCBhc3NldCBpZAQCZ04JAQJlTgMFAmVqBQJnTQUCYlAEAmdPCQC4AgIJAJEDAgUCZWoFAmdNBQJnTgQCZ1AJAJYDAQkAzAgCAAAJAMwIAgkAoAMBCQC4AgIFAmdPBQFmBQNuaWwEAmdRCQECY2wBBQJnUAQCZkUIBQJnUQJfMQQCY24IBQJnUQJfMgkAlAoCBQNuaWwJAJQKAgUCZkUFAmNuAmVjARxnZXRPbmVUa25WMldpdGhCb251c1JFQURPTkxZAgJmdQJnTAQCYVkJAQJhUQAEAmN1CQCRAwIFAmFZBQF1BAJjdgkAkQMCBQJhWQUBdgQCY3QJAJEDAgUCYVkFAXQEAmNBCQECYkQBBQJjdQQCY0MJAQJiRAEFAmN2BAJnUgoAAmZECQD8BwQFBHRoaXMCE2dldE9uZVRrblYyUkVBRE9OTFkJAMwIAgUCZnUJAMwIAgUCZ0wFA25pbAUDbmlsAwkAAQIFAmZEAgooSW50LCBJbnQpBQJmRAkAAgEJAKwCAgkAAwEFAmZEAh8gY291bGRuJ3QgYmUgY2FzdCB0byAoSW50LCBJbnQpBAJmRQgFAmdSAl8xBAJjbggFAmdSAl8yBAJkaQkBAmNvBAIABQJjdAUCZ0wFBHRoaXMEAmNLCAUCZGkCXzEEAmNMCAUCZGkCXzIEAmdTCQBkAgUCY0sFAmNMBAJmcwMJAAACBQJnUwAAAwkAAAIFAmZFAAAAAAkAAgECF2JvbnVzIGNhbGN1bGF0aW9uIGVycm9yCQBrAwkAZQIFAmZFBQJnUwUBYQUCZ1MJAJQKAgUDbmlsCQCVCgMFAmZFBQJjbgUCZnMCZWMBCWdldE5vTGVzcwICZ1QCZ1UEAmRpCQECZWIBBQJlYwQCY0sIBQJkaQJfMQQCY0wIBQJkaQJfMgQCY1cIBQJkaQJfMwQCY3EIBQJkaQJfNAQCY00IBQJkaQJfNQMJAGYCBQJnVAUCY0sJAAIBCQCsAgIJAKwCAgkArAICAglGYWlsZWQ6ICAJAKQDAQUCY0sCAyA8IAkApAMBBQJnVAMJAGYCBQJnVQUCY0wJAAIBCQCsAgIJAKwCAgkArAICAghGYWlsZWQ6IAkApAMBBQJjTAIDIDwgCQCkAwEFAmdVBAJnVgkA/AcEBQJhTAIEYnVybgkAzAgCBQJjVwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJjcQUCY1cFA25pbAMJAAACBQJnVgUCZ1YEAmdXCQECZEgDCQEBLQEFAmNLCQEBLQEFAmNMAAAEAmZTCAUCZ1cCXzEEAmRHCAUCZ1cCXzIEAmZUCQECZFABBQJkRwMJAAACBQJmVAUCZlQJAM4IAgUCY00FAmZTCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmVjAQ11bnN0YWtlQW5kR2V0AQJjbQQCZ1gDCQECIT0CCQCQAwEIBQJlYwhwYXltZW50cwAACQACAQINTm8gcG1udHMgZXhwZAYDCQAAAgUCZ1gFAmdYBAJjYwkBAmFRAAQCZ1kJAQJiaQAEAmdrCQDZBAEJAJEDAgUCY2MFAXQEAmdaCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJnWQUBQQIKV3Igc3QgYWRkcgQCaGEJAPwHBAUCZ1oCB3Vuc3Rha2UJAMwIAgkA2AQBBQJnawkAzAgCBQJjbQUDbmlsBQNuaWwDCQAAAgUCaGEFAmhhBAJkaQkBAmNvBAkA2AQBCAUCZWMNdHJhbnNhY3Rpb25JZAkA2AQBBQJnawUCY20IBQJlYwZjYWxsZXIEAmNLCAUCZGkCXzEEAmNMCAUCZGkCXzIEAmN5CQENcGFyc2VJbnRWYWx1ZQEIBQJkaQJfOQQCY00IBQJkaQNfMTAEAmhiAwMJAQJhTgAGCQAAAgUCY3kFAXEJAAIBCQCsAgICCUJsb2NrZWQ6IAkApAMBBQJjeQYDCQAAAgUCaGIFAmhiBAJoYwkA/AcEBQJhTAIEYnVybgkAzAgCBQJjbQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJnawUCY20FA25pbAMJAAACBQJoYwUCaGMEAmhkCQECZEgDCQEBLQEFAmNLCQEBLQEFAmNMAAAEAmZTCAUCaGQCXzEEAmRHCAUCaGQCXzIEAmZUCQECZFABBQJkRwMJAAACBQJmVAUCZlQJAM4IAgUCY00FAmZTCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmVjARN1bnN0YWtlQW5kR2V0Tm9MZXNzAwJoZQJoZgJnVQQCZ0YDCQECYU4ABgkAAAIFAmJjBQFxBAJndQkAzAgCAwkBASEBBQJnRgYJAAIBAiFnZXQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgYWRtaW4JAMwIAgMJAAACCQCQAwEIBQJlYwhwYXltZW50cwAABgkAAgECGG5vIHBheW1lbnRzIGFyZSBleHBlY3RlZAUDbmlsAwkAAAIFAmd1BQJndQQCaGEJAPwHBAUCYmsCB3Vuc3Rha2UJAMwIAgkA2AQBBQJiZAkAzAgCBQJoZQUDbmlsBQNuaWwDCQAAAgUCaGEFAmhhBAJoZwkBAmNvBAkA2AQBCAUCZWMNdHJhbnNhY3Rpb25JZAkA2AQBBQJiZAUCaGUIBQJlYwZjYWxsZXIEAmNLCAUCaGcCXzEEAmNMCAUCaGcCXzIEAmNNCAUCaGcDXzEwBAJoaAkAzAgCAwkAZwIFAmNLBQJoZgYJAAIBCQC5CQIJAMwIAgIsYW1vdW50IGFzc2V0IGFtb3VudCB0byByZWNlaXZlIGlzIGxlc3MgdGhhbiAJAMwIAgkApAMBBQJoZgUDbmlsAgAJAMwIAgMJAGcCBQJjTAUCZ1UGCQACAQkAuQkCCQDMCAICK3ByaWNlIGFzc2V0IGFtb3VudCB0byByZWNlaXZlIGlzIGxlc3MgdGhhbiAJAMwIAgkApAMBBQJnVQUDbmlsAgAFA25pbAMJAAACBQJoaAUCaGgEAmdWCQD8BwQFAmFMAgRidXJuCQDMCAIFAmhlBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmJkBQJoZQUDbmlsAwkAAAIFAmdWBQJnVgQCaGkJAQJkSAMJAQEtAQUCY0sJAQEtAQUCY0wAAAQCZlMIBQJoaQJfMQQCZEcIBQJoaQJfMgQCZlQJAQJkUAEFAmRHAwkAAAIFAmZUBQJmVAkAzggCBQJjTQUCZlMJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZWMBFXVuc3Rha2VBbmRHZXRPbmVUa25WMgMCaGUCZnUCZnYEAmdzCgACZkQJAPwHBAUCYUwCKGlzUG9vbE9uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkUkVBRE9OTFkJAMwIAgkApQgBBQR0aGlzBQNuaWwFA25pbAMJAAECBQJmRAIHQm9vbGVhbgUCZkQJAAIBCQCsAgIJAAMBBQJmRAIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgQCZ0YDAwkBAmFOAAYJAAACBQJiYwUBcQYFAmdzBAJndQkAzAgCAwMJAQEhAQUCZ0YGCQECZlgBBQJlYwYJAQJhSQECIWdldCBvcGVyYXRpb24gaXMgYmxvY2tlZCBieSBhZG1pbgkAzAgCAwkAAAIJAJADAQgFAmVjCHBheW1lbnRzAAAGCQECYUkBAhhubyBwYXltZW50cyBhcmUgZXhwZWN0ZWQFA25pbAMJAAACBQJndQUCZ3UEAmNjCQECYVEABAJnWQkBAmJpAAQCZ2sJANkEAQkAkQMCBQJjYwUBdAQCZ1oJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmdZBQFBAgpXciBzdCBhZGRyBAJoYQkA/AcEBQJnWgIHdW5zdGFrZQkAzAgCCQDYBAEFAmdrCQDMCAIFAmhlBQNuaWwFA25pbAMJAAACBQJoYQUCaGEEAmhqCQECZnQGBQJmdQUCZnYJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmdrBQJoZQUDbmlsCAUCZWMGY2FsbGVyCAUCZWMMb3JpZ2luQ2FsbGVyCAUCZWMNdHJhbnNhY3Rpb25JZAQCY00IBQJoagJfMQQCZkYIBQJoagJfMgkAlAoCBQJjTQUCZkYJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZWMBHHB1dE9uZVRrblYyV2l0aEJvbnVzUkVBRE9OTFkCAmhrAmhsBAJhWQkBAmFRAAQCY3UJAJEDAgUCYVkFAXUEAmN2CQCRAwIFAmFZBQF2BAJjdAkAkQMCBQJhWQUBdAQCaG0JAQJlWAUFAmhrBQJobAIAAgAGBAJmbggFAmhtAl8xBAJjTQgFAmhtAl8yBAJjbggFAmhtAl8zBAJmcwgFAmhtAl80CQCUCgIFA25pbAkAlQoDBQJmbgUCY24FAmZzAmVjASFwdXRPbmVUa25WMldpdGhvdXRUYWtlRmVlUkVBRE9OTFkCAmhrAmhsBAJhWQkBAmFRAAQCY3UJAJEDAgUCYVkFAXUEAmN2CQCRAwIFAmFZBQF2BAJjdAkAkQMCBQJhWQUBdAQCaG4JAQJlWAUFAmhrBQJobAIAAgAHBAJmbggFAmhuAl8xBAJjTQgFAmhuAl8yBAJjbggFAmhuAl8zBAJmcwgFAmhuAl80CQCUCgIFA25pbAkAlQoDBQJmbgUCY24FAmZzAmVjAQhhY3RpdmF0ZQICaG8CaHADCQECIT0CCQClCAEIBQJlYwZjYWxsZXIJAKUIAQUCYUwJAAIBAgZkZW5pZWQJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCCQECYWMABQJobwkAzAgCCQELU3RyaW5nRW50cnkCCQECYWQABQJocAUDbmlsAgdzdWNjZXNzAmVjAQRzZXRTAgJocQJoYgMJAQIhPQIJAKUIAQgFAmVjBmNhbGxlcgkBAmFFAgUEdGhpcwkBAmFmAAUCZlcJAMwIAgkBC1N0cmluZ0VudHJ5AgUCaHEFAmhiBQNuaWwCZWMBBHNldEkCAmhxAmhiAwkBAiE9AgkApQgBCAUCZWMGY2FsbGVyCQECYUUCBQR0aGlzCQECYWYABQJmVwkAzAgCCQEMSW50ZWdlckVudHJ5AgUCaHEFAmhiBQNuaWwCZWMBHGdldFBvb2xDb25maWdXcmFwcGVyUkVBRE9OTFkACQCUCgIFA25pbAkBAmFRAAJlYwEcZ2V0QWNjQmFsYW5jZVdyYXBwZXJSRUFET05MWQECYkUJAJQKAgUDbmlsCQECYkQBBQJiRQJlYwEZY2FsY1ByaWNlc1dyYXBwZXJSRUFET05MWQMCYlcCYlgCY2IEAmhyCQECY2EDBQJiVwUCYlgFAmNiCQCUCgIFA25pbAkAzAgCCQCmAwEJAJEDAgUCaHIAAAkAzAgCCQCmAwEJAJEDAgUCaHIAAQkAzAgCCQCmAwEJAJEDAgUCaHIAAgUDbmlsAmVjARZmcm9tWDE4V3JhcHBlclJFQURPTkxZAgFKAmhzCQCUCgIFA25pbAkBAUkCCQCnAwEFAUoFAmhzAmVjARR0b1gxOFdyYXBwZXJSRUFET05MWQIBRwFICQCUCgIFA25pbAkApgMBCQEBRgIFAUcFAUgCZWMBHmNhbGNQcmljZUJpZ0ludFdyYXBwZXJSRUFET05MWQICYkcCYkgJAJQKAgUDbmlsCQCmAwEJAQJiRgIJAKcDAQUCYkcJAKcDAQUCYkgCZWMBI2VzdGltYXRlUHV0T3BlcmF0aW9uV3JhcHBlclJFQURPTkxZCQJjcAJiTAJjTwJjUAJjUQJjUgJodAJjUwJjVAkAlAoCBQNuaWwJAQJjTg0FAmNwBQJiTAUCY08FAmNQBQJjUQUCY1IFAmh0BQJjUwUCY1QGBwAAAgACZWMBI2VzdGltYXRlR2V0T3BlcmF0aW9uV3JhcHBlclJFQURPTkxZBAJjcAJodQJjcgJodAQCZGkJAQJjbwQFAmNwBQJodQUCY3IJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAmh0CQCUCgIFA25pbAkAnAoKCAUCZGkCXzEIBQJkaQJfMggFAmRpAl8zCAUCZGkCXzQIBQJkaQJfNQgFAmRpAl82CAUCZGkCXzcJAKYDAQgFAmRpAl84CAUCZGkCXzkIBQJkaQNfMTACZWMBDmdldEZlZVJFQURPTkxZAAkAlAoCBQNuaWwFAmFoAQJodgECaHcABAJoeAQCYUMJAQJmVQADCQABAgUCYUMCCkJ5dGVWZWN0b3IEAmZZBQJhQwUCZlkDCQABAgUCYUMCBFVuaXQIBQJodg9zZW5kZXJQdWJsaWNLZXkJAAIBAgtNYXRjaCBlcnJvcgQCYUMFAmh2AwkAAQIFAmFDAgVPcmRlcgQCZFMFAmFDBAJoeQkBAmFPAAQCaHoJAQJkUgEFAmRTBAJoQQkA9AMDCAUCZFMJYm9keUJ5dGVzCQCRAwIIBQJkUwZwcm9vZnMAAAgFAmRTD3NlbmRlclB1YmxpY0tleQQCaEIJAPQDAwgFAmRTCWJvZHlCeXRlcwkAkQMCCAUCZFMGcHJvb2ZzAAEFAmh5AwMDBQJoegUCaEEHBQJoQgcGCQECYXgDBQJoegUCaEEFAmhCAwkAAQIFAmFDAhRTZXRTY3JpcHRUcmFuc2FjdGlvbgQCZXAFAmFDBAJoQwkA9gMBCQEFdmFsdWUBCAUCZXAGc2NyaXB0BAJoRAkA2wQBCQEFdmFsdWUBCQCdCAIFAmFMCQECYXYABAJoRQkA8QcBBQR0aGlzAwMJAAACBQJoRAUCaEMJAQIhPQIFAmhFBQJoQwcGCQD0AwMIBQJodglib2R5Qnl0ZXMJAJEDAggFAmh2BnByb29mcwAABQJoeAkA9AMDCAUCaHYJYm9keUJ5dGVzCQCRAwIIBQJodgZwcm9vZnMAAAUCaHiWn63f", "chainId": 84, "height": 2348408, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GWz7wRT9Yq8as1cWJoAUkEbHdBAZ9v9bmdu2akf5WBZi Next: GeeLpr2MVCgfxu71jKgqYUCk7CLhEygxGkDFUWwkTQkt Diff:
OldNewDifferences
451451 }
452452
453453
454+func validateUpdatedDLp (updatedDLp) = {
455+ let amountAssetBalance = getAccBalance(assetIdToString(cfgAmountAssetId))
456+ let priceAssetBalance = getAccBalance(assetIdToString(cfgPriceAssetId))
457+ let lpAssetEmission = value(assetInfo(cfgLpAssetId)).quantity
458+ let currentDLp = calcDLp(toBigInt(amountAssetBalance), toBigInt(priceAssetBalance), toBigInt(lpAssetEmission))
459+ if ((updatedDLp >= currentDLp))
460+ then true
461+ else throwErr("updated DLp lower than current DLp")
462+ }
463+
464+
454465 func moa (order) = {
455466 let amountAssetAmount = order.amount
456467 let priceAssetAmount = fraction(order.amount, order.price, scale8)
457- let $t02011920331 = if ((order.orderType == Buy))
468+ let $t02058520797 = if ((order.orderType == Buy))
458469 then $Tuple2(amountAssetAmount, -(priceAssetAmount))
459470 else $Tuple2(-(amountAssetAmount), priceAssetAmount)
460- let amountAssetBalanceDelta = $t02011920331._1
461- let priceAssetBalanceDelta = $t02011920331._2
471+ let amountAssetBalanceDelta = $t02058520797._1
472+ let priceAssetBalanceDelta = $t02058520797._2
462473 if (if (if (igs())
463474 then true
464475 else (cfgPoolStatus == PoolMatcherDis))
471482 then throw("Wr assets")
472483 else {
473484 let dLp = valueOrErrorMessage(parseBigInt(valueOrErrorMessage(getString(this, keyDLp), fmtErr("dLp is required"))), fmtErr("invalid dLp"))
474- let $t02075820858 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
475- let unusedActions = $t02075820858._1
476- let dLpNew = $t02075820858._2
485+ let $t02122421324 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
486+ let unusedActions = $t02122421324._1
487+ let dLpNew = $t02122421324._2
477488 let isOrderValid = (dLpNew > dLp)
478489 isOrderValid
479490 }
528539 let ann_aPrecision = (ann - aPrecision)
529540 let n1 = (n + big1)
530541 func calc (acc,cur) = {
531- let $t02301123031 = acc
532- let d = $t02301123031._1
533- let found = $t02301123031._2
542+ let $t02347723497 = acc
543+ let d = $t02347723497._1
544+ let found = $t02347723497._2
534545 if ((found != unit))
535546 then acc
536547 else {
544555 }
545556
546557 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
547- let $t02345223499 = {
558+ let $t02391823965 = {
548559 let $l = arr
549560 let $s = size($l)
550561 let $acc0 = $Tuple2(s, unit)
558569
559570 $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)
560571 }
561- let d = $t02345223499._1
562- let found = $t02345223499._2
572+ let d = $t02391823965._1
573+ let found = $t02391823965._2
563574 if ((found != unit))
564575 then d
565576 else throw(("D calculation error, D = " + toString(d)))
579590 let c = (((((D * D) / (x * n)) * D) * aPrecision) / (ann * n))
580591 let b = ((s + ((D * aPrecision) / ann)) - D)
581592 func calc (acc,cur) = {
582- let $t02399924019 = acc
583- let y = $t02399924019._1
584- let found = $t02399924019._2
593+ let $t02446524485 = acc
594+ let y = $t02446524485._1
595+ let found = $t02446524485._2
585596 if ((found != unit))
586597 then acc
587598 else {
594605 }
595606
596607 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
597- let $t02432624373 = {
608+ let $t02479224839 = {
598609 let $l = arr
599610 let $s = size($l)
600611 let $acc0 = $Tuple2(D, unit)
608619
609620 $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)
610621 }
611- let y = $t02432624373._1
612- let found = $t02432624373._2
622+ let y = $t02479224839._1
623+ let found = $t02479224839._2
613624 if ((found != unit))
614625 then y
615626 else throw(("Y calculation error, Y = " + toString(y)))
631642 then {
632643 let amBalance = getAccBalance(amId)
633644 let prBalance = getAccBalance(prId)
634- let $t02515625618 = if ((txId == ""))
645+ let $t02562226084 = if ((txId == ""))
635646 then $Tuple2(amBalance, prBalance)
636647 else if ((pmtAssetId == amId))
637648 then if ((pmtAmtRaw > amBalance))
642653 then throw("invalid payment amount")
643654 else $Tuple2(amBalance, (prBalance - pmtAmtRaw))
644655 else throw("wrong pmtAssetId")
645- let amBalanceOld = $t02515625618._1
646- let prBalanceOld = $t02515625618._2
647- let $t02562425800 = if ((pmtAssetId == amId))
656+ let amBalanceOld = $t02562226084._1
657+ let prBalanceOld = $t02562226084._2
658+ let $t02609026266 = if ((pmtAssetId == amId))
648659 then $Tuple2(pmtAmtRaw, 0)
649660 else if ((pmtAssetId == prId))
650661 then $Tuple2(0, pmtAmtRaw)
651662 else throw("invalid payment")
652- let amAmountRaw = $t02562425800._1
653- let prAmountRaw = $t02562425800._2
654- let $t02580426043 = if (withTakeFee)
663+ let amAmountRaw = $t02609026266._1
664+ let prAmountRaw = $t02609026266._2
665+ let $t02627026509 = if (withTakeFee)
655666 then $Tuple3(takeFee(amAmountRaw)._1, takeFee(prAmountRaw)._1, takeFee(pmtAmtRaw)._2)
656667 else $Tuple3(amAmountRaw, prAmountRaw, 0)
657- let amAmount = $t02580426043._1
658- let prAmount = $t02580426043._2
659- let feeAmount = $t02580426043._3
668+ let amAmount = $t02627026509._1
669+ let prAmount = $t02627026509._2
670+ let feeAmount = $t02627026509._3
660671 let amBalanceNew = (amBalanceOld + amAmount)
661672 let prBalanceNew = (prBalanceOld + prAmount)
662673 let D0 = getD([toBigInt(amBalanceOld), toBigInt(prBalanceOld)])
702713 else {
703714 let amBalance = getAccBalance(amId)
704715 let prBalance = getAccBalance(prId)
705- let $t02804528156 = {
716+ let $t02851128622 = {
706717 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)
707718 if ($isInstanceOf(@, "(Int, Int)"))
708719 then @
709720 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
710721 }
711- if (($t02804528156 == $t02804528156))
722+ if (($t02851128622 == $t02851128622))
712723 then {
713- let feeAmount = $t02804528156._2
714- let totalGet = $t02804528156._1
724+ let feeAmount = $t02851128622._2
725+ let totalGet = $t02851128622._1
715726 let totalAmount = if (if ((minOutAmount > 0))
716727 then (minOutAmount > totalGet)
717728 else false)
718729 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
719730 else totalGet
720- let $t02834628653 = if ((outAssetId == amId))
731+ let $t02881229119 = if ((outAssetId == amId))
721732 then $Tuple4(totalAmount, 0, ((amBalance - totalAmount) - feeAmount), prBalance)
722733 else if ((outAssetId == prId))
723734 then $Tuple4(0, totalAmount, amBalance, ((prBalance - totalAmount) - feeAmount))
724735 else throw("invalid out asset id")
725- let outAm = $t02834628653._1
726- let outPr = $t02834628653._2
727- let amBalanceNew = $t02834628653._3
728- let prBalanceNew = $t02834628653._4
736+ let outAm = $t02881229119._1
737+ let outPr = $t02881229119._2
738+ let amBalanceNew = $t02881229119._3
739+ let prBalanceNew = $t02881229119._4
729740 let curPrX18 = cpbi(t1(prBalanceNew, prDecimals), t1(amBalanceNew, amDecimals))
730741 let curPr = f1(curPrX18, scale8)
731742 let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
740751 let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
741752 if ((burn == burn))
742753 then {
743- let $t02943829788 = {
754+ let $t02990430254 = {
744755 let feeAmountForCalc = if ((this == feeCollectorAddress))
745756 then 0
746757 else feeAmount
751762 then $Tuple2(-((totalGet + feeAmountForCalc)), 0)
752763 else $Tuple2(0, -((totalGet + feeAmountForCalc)))
753764 }
754- let amountAssetBalanceDelta = $t02943829788._1
755- let priceAssetBalanceDelta = $t02943829788._2
756- let $t02979129899 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
757- let refreshDLpActions = $t02979129899._1
758- let updatedDLp = $t02979129899._2
759- $Tuple2((state ++ refreshDLpActions), totalAmount)
765+ let amountAssetBalanceDelta = $t02990430254._1
766+ let priceAssetBalanceDelta = $t02990430254._2
767+ let $t03025730365 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
768+ let refreshDLpActions = $t03025730365._1
769+ let updatedDLp = $t03025730365._2
770+ let isUpdatedDLpValid = validateUpdatedDLp(updatedDLp)
771+ if ((isUpdatedDLpValid == isUpdatedDLpValid))
772+ then $Tuple2((state ++ refreshDLpActions), totalAmount)
773+ else throw("Strict value is not equal to itself.")
760774 }
761775 else throw("Strict value is not equal to itself.")
762776 }
905919 else throw("Strict value is not equal to itself.")
906920 }
907921 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
908- let $t03348133546 = refreshDLpInternal(0, 0, 0)
909- let refreshDLpActions = $t03348133546._1
910- let updatedDLp = $t03348133546._2
911- ((state ++ lpTrnsfr) ++ refreshDLpActions)
922+ let $t03400834073 = refreshDLpInternal(0, 0, 0)
923+ let refreshDLpActions = $t03400834073._1
924+ let updatedDLp = $t03400834073._2
925+ let isUpdatedDLpValid = validateUpdatedDLp(updatedDLp)
926+ if ((isUpdatedDLpValid == isUpdatedDLpValid))
927+ then ((state ++ lpTrnsfr) ++ refreshDLpActions)
928+ else throw("Strict value is not equal to itself.")
912929 }
913930 else throw("Strict value is not equal to itself.")
914931 }
958975 let pmt = value(i.payments[0])
959976 let pmtAssetId = toBase58String(value(pmt.assetId))
960977 let pmtAmt = pmt.amount
961- let $t03460834766 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId), true)
962- if (($t03460834766 == $t03460834766))
978+ let $t03519835356 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId), true)
979+ if (($t03519835356 == $t03519835356))
963980 then {
964- let feeAmount = $t03460834766._3
965- let state = $t03460834766._2
966- let estimLP = $t03460834766._1
981+ let feeAmount = $t03519835356._3
982+ let state = $t03519835356._2
983+ let estimLP = $t03519835356._1
967984 let emitLpAmt = if (if ((minOutAmount > 0))
968985 then (minOutAmount > estimLP)
969986 else false)
9911008 let sendFeeToMatcher = if ((feeAmount > 0))
9921009 then [ScriptTransfer(feeCollectorAddress, feeAmount, fromBase58String(pmtAssetId))]
9931010 else nil
994- let $t03558135930 = if ((this == feeCollectorAddress))
1011+ let $t03617136520 = if ((this == feeCollectorAddress))
9951012 then $Tuple2(0, 0)
9961013 else {
9971014 let paymentInAmountAsset = if ((pmt.assetId == cfgAmountAssetId))
10011018 then $Tuple2(-(feeAmount), 0)
10021019 else $Tuple2(0, -(feeAmount))
10031020 }
1004- let amountAssetBalanceDelta = $t03558135930._1
1005- let priceAssetBalanceDelta = $t03558135930._2
1006- let $t03593336041 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1007- let refreshDLpActions = $t03593336041._1
1008- let updatedDLp = $t03593336041._2
1021+ let amountAssetBalanceDelta = $t03617136520._1
1022+ let priceAssetBalanceDelta = $t03617136520._2
1023+ let $t03652336631 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1024+ let refreshDLpActions = $t03652336631._1
1025+ let updatedDLp = $t03652336631._2
10091026 $Tuple2((((state ++ lpTrnsfr) ++ sendFeeToMatcher) ++ refreshDLpActions), emitLpAmt)
10101027 }
10111028 else throw("Strict value is not equal to itself.")
10271044 else {
10281045 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, "")
10291046 let state = estPut._9
1030- let $t03679736862 = refreshDLpInternal(0, 0, 0)
1031- let refreshDLpActions = $t03679736862._1
1032- let updatedDLp = $t03679736862._2
1033- (state ++ refreshDLpActions)
1047+ let $t03738937454 = refreshDLpInternal(0, 0, 0)
1048+ let refreshDLpActions = $t03738937454._1
1049+ let updatedDLp = $t03738937454._2
1050+ let isUpdatedDLpValid = validateUpdatedDLp(updatedDLp)
1051+ if ((isUpdatedDLpValid == isUpdatedDLpValid))
1052+ then (state ++ refreshDLpActions)
1053+ else throw("Strict value is not equal to itself.")
10341054 }
10351055
10361056
10461066 let b = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
10471067 if ((b == b))
10481068 then {
1049- let $t03749437576 = refreshDLpInternal(-(outAmtAmt), -(outPrAmt), 0)
1050- let refreshDLpActions = $t03749437576._1
1051- let updatedDLp = $t03749437576._2
1052- (state ++ refreshDLpActions)
1069+ let $t03814938231 = refreshDLpInternal(-(outAmtAmt), -(outPrAmt), 0)
1070+ let refreshDLpActions = $t03814938231._1
1071+ let updatedDLp = $t03814938231._2
1072+ let isUpdatedDLpValid = validateUpdatedDLp(updatedDLp)
1073+ if ((isUpdatedDLpValid == isUpdatedDLpValid))
1074+ then (state ++ refreshDLpActions)
1075+ else throw("Strict value is not equal to itself.")
10531076 }
10541077 else throw("Strict value is not equal to itself.")
10551078 }
10781101 else throwErr("exactly 1 payment are expected")]
10791102 if ((checks == checks))
10801103 then {
1081- let $t03812138276 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1082- let state = $t03812138276._1
1083- let totalAmount = $t03812138276._2
1104+ let $t03883738992 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1105+ let state = $t03883738992._1
1106+ let totalAmount = $t03883738992._2
10841107 $Tuple2(state, totalAmount)
10851108 }
10861109 else throw("Strict value is not equal to itself.")
10971120 if ((checkLastRefreshedBlockHeight == checkLastRefreshedBlockHeight))
10981121 then {
10991122 let dLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyDLp), "0")), fmtErr("invalid dLp"))
1100- let $t03880038864 = refreshDLpInternal(0, 0, 0)
1101- let dLpUpdateActions = $t03880038864._1
1102- let updatedDLp = $t03880038864._2
1123+ let $t03951639580 = refreshDLpInternal(0, 0, 0)
1124+ let dLpUpdateActions = $t03951639580._1
1125+ let updatedDLp = $t03951639580._2
11031126 let actions = if ((dLp != updatedDLp))
11041127 then dLpUpdateActions
11051128 else throwErr("nothing to refresh")
11281151 let newY = getYD(xp, index, D1)
11291152 let dy = (xp[index] - newY)
11301153 let totalGetRaw = max([0, toInt((dy - big1))])
1131- let $t03976439813 = takeFee(totalGetRaw)
1132- let totalGet = $t03976439813._1
1133- let feeAmount = $t03976439813._2
1154+ let $t04048040529 = takeFee(totalGetRaw)
1155+ let totalGet = $t04048040529._1
1156+ let feeAmount = $t04048040529._2
11341157 $Tuple2(nil, $Tuple2(totalGet, feeAmount))
11351158 }
11361159
11441167 let lpId = poolConfig[idxLPAsId]
11451168 let amBalance = getAccBalance(amId)
11461169 let prBalance = getAccBalance(prId)
1147- let $t04015840273 = {
1170+ let $t04087440989 = {
11481171 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)
11491172 if ($isInstanceOf(@, "(Int, Int)"))
11501173 then @
11511174 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
11521175 }
1153- let totalGet = $t04015840273._1
1154- let feeAmount = $t04015840273._2
1176+ let totalGet = $t04087440989._1
1177+ let feeAmount = $t04087440989._2
11551178 let r = ego("", lpId, lpAssetAmount, this)
11561179 let outAmAmt = r._1
11571180 let outPrAmt = r._2
11821205 let burnLPAssetOnFactory = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
11831206 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
11841207 then {
1185- let $t04135941440 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1186- let refreshDLpActions = $t04135941440._1
1187- let updatedDLp = $t04135941440._2
1188- (state ++ refreshDLpActions)
1208+ let $t04207542156 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1209+ let refreshDLpActions = $t04207542156._1
1210+ let updatedDLp = $t04207542156._2
1211+ let isUpdatedDLpValid = validateUpdatedDLp(updatedDLp)
1212+ if ((isUpdatedDLpValid == isUpdatedDLpValid))
1213+ then (state ++ refreshDLpActions)
1214+ else throw("Strict value is not equal to itself.")
11891215 }
11901216 else throw("Strict value is not equal to itself.")
11911217 }
12221248 let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
12231249 if ((burnA == burnA))
12241250 then {
1225- let $t04235342434 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1226- let refreshDLpActions = $t04235342434._1
1227- let updatedDLp = $t04235342434._2
1228- (state ++ refreshDLpActions)
1251+ let $t04313043211 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1252+ let refreshDLpActions = $t04313043211._1
1253+ let updatedDLp = $t04313043211._2
1254+ let isUpdatedDLpValid = validateUpdatedDLp(updatedDLp)
1255+ if ((isUpdatedDLpValid == isUpdatedDLpValid))
1256+ then (state ++ refreshDLpActions)
1257+ else throw("Strict value is not equal to itself.")
12291258 }
12301259 else throw("Strict value is not equal to itself.")
12311260 }
12671296 let burnLPAssetOnFactory = invoke(fca, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
12681297 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
12691298 then {
1270- let $t04353243613 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1271- let refreshDLpActions = $t04353243613._1
1272- let updatedDLp = $t04353243613._2
1273- (state ++ refreshDLpActions)
1299+ let $t04437044451 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1300+ let refreshDLpActions = $t04437044451._1
1301+ let updatedDLp = $t04437044451._2
1302+ let isUpdatedDLpValid = validateUpdatedDLp(updatedDLp)
1303+ if ((isUpdatedDLpValid == isUpdatedDLpValid))
1304+ then (state ++ refreshDLpActions)
1305+ else throw("Strict value is not equal to itself.")
12741306 }
12751307 else throw("Strict value is not equal to itself.")
12761308 }
13121344 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), unstakeAmount], nil)
13131345 if ((unstakeInv == unstakeInv))
13141346 then {
1315- let $t04447444662 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1316- let state = $t04447444662._1
1317- let totalAmount = $t04447444662._2
1347+ let $t04537345561 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1348+ let state = $t04537345561._1
1349+ let totalAmount = $t04537345561._2
13181350 $Tuple2(state, totalAmount)
13191351 }
13201352 else throw("Strict value is not equal to itself.")
13301362 let amId = poolConfig[idxAmAsId]
13311363 let prId = poolConfig[idxPrAsId]
13321364 let lpId = poolConfig[idxLPAsId]
1333- let $t04492145024 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1334- let lpAmount = $t04492145024._1
1335- let state = $t04492145024._2
1336- let feeAmount = $t04492145024._3
1337- let bonus = $t04492145024._4
1365+ let $t04582045923 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1366+ let lpAmount = $t04582045923._1
1367+ let state = $t04582045923._2
1368+ let feeAmount = $t04582045923._3
1369+ let bonus = $t04582045923._4
13381370 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
13391371 }
13401372
13461378 let amId = poolConfig[idxAmAsId]
13471379 let prId = poolConfig[idxPrAsId]
13481380 let lpId = poolConfig[idxLPAsId]
1349- let $t04530345407 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1350- let lpAmount = $t04530345407._1
1351- let state = $t04530345407._2
1352- let feeAmount = $t04530345407._3
1353- let bonus = $t04530345407._4
1381+ let $t04620246306 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1382+ let lpAmount = $t04620246306._1
1383+ let state = $t04620246306._2
1384+ let feeAmount = $t04620246306._3
1385+ let bonus = $t04620246306._4
13541386 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
13551387 }
13561388
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 slippage4D = toBigInt((scale8 - ((scale8 * 1) / scale8)))
1919
2020 let wavesString = "WAVES"
2121
2222 let Amult = "100"
2323
2424 let Dconv = "1"
2525
2626 let SEP = "__"
2727
2828 let EMPTY = ""
2929
3030 let PoolActive = 1
3131
3232 let PoolPutDis = 2
3333
3434 let PoolMatcherDis = 3
3535
3636 let PoolShutdown = 4
3737
3838 let idxPoolAddress = 1
3939
4040 let idxPoolSt = 2
4141
4242 let idxLPAsId = 3
4343
4444 let idxAmAsId = 4
4545
4646 let idxPrAsId = 5
4747
4848 let idxAmtAsDcm = 6
4949
5050 let idxPriceAsDcm = 7
5151
5252 let idxIAmtAsId = 8
5353
5454 let idxIPriceAsId = 9
5555
5656 let idxFactStakCntr = 1
5757
5858 let idxFactoryRestCntr = 6
5959
6060 let idxFactSlippCntr = 7
6161
6262 let idxFactGwxRewCntr = 10
6363
6464 let feeDefault = fraction(10, scale8, 10000)
6565
6666 func t1 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
6767
6868
6969 func f1 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
7070
7171
7272 func ts (amt,resScale,curScale) = fraction(amt, resScale, curScale)
7373
7474
7575 func abs (val) = if ((zeroBigInt > val))
7676 then -(val)
7777 else val
7878
7979
8080 func absBigInt (val) = if ((zeroBigInt > val))
8181 then -(val)
8282 else val
8383
8484
8585 func fc () = "%s__factoryContract"
8686
8787
8888 func mpk () = "%s__managerPublicKey"
8989
9090
9191 func pmpk () = "%s__pendingManagerPublicKey"
9292
9393
9494 func pl () = "%s%s__price__last"
9595
9696
9797 func ph (h,t) = makeString(["%s%s%d%d__price__history", toString(h), toString(t)], SEP)
9898
9999
100100 func pau (ua,txId) = ((("%s%s%s__P__" + ua) + "__") + txId)
101101
102102
103103 func gau (ua,txId) = ((("%s%s%s__G__" + ua) + "__") + txId)
104104
105105
106106 func aa () = "%s__amountAsset"
107107
108108
109109 func pa () = "%s__priceAsset"
110110
111111
112112 func amp () = "%s__amp"
113113
114114
115115 func ada () = "%s__addonAddr"
116116
117117
118118 let keyFee = "%s__fee"
119119
120120 let fee = valueOrElse(getInteger(this, keyFee), feeDefault)
121121
122122 let keyDLp = makeString(["%s", "dLp"], SEP)
123123
124124 let keyDLpRefreshedHeight = makeString(["%s", "dLpRefreshedHeight"], SEP)
125125
126126 let keyDLpRefreshDelay = makeString(["%s", "refreshDLpDelay"], SEP)
127127
128128 let dLpRefreshDelayDefault = 30
129129
130130 let dLpRefreshDelay = valueOrElse(getInteger(this, keyDLpRefreshDelay), dLpRefreshDelayDefault)
131131
132132 func fcfg () = "%s__factoryConfig"
133133
134134
135135 func mtpk () = "%s%s__matcher__publicKey"
136136
137137
138138 func pc (iAmtAs,iPrAs) = (((("%d%d%s__" + iAmtAs) + "__") + iPrAs) + "__config")
139139
140140
141141 func mba (bAStr) = ("%s%s%s__mappings__baseAsset2internalId__" + bAStr)
142142
143143
144144 func aps () = "%s__shutdown"
145145
146146
147147 func keyAllowedLpStableScriptHash () = "%s__allowedLpStableScriptHash"
148148
149149
150150 func keyFeeCollectorAddress () = "%s__feeCollectorAddress"
151151
152152
153153 func toe (orV,sendrV,matchV) = throw(((((("Failed: ordValid=" + toString(orV)) + " sndrValid=") + toString(sendrV)) + " mtchrValid=") + toString(matchV)))
154154
155155
156156 func str (val) = match val {
157157 case valStr: String =>
158158 valStr
159159 case _ =>
160160 throw("fail cast to String")
161161 }
162162
163163
164164 func strf (addr,key) = valueOrErrorMessage(getString(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
165165
166166
167167 func intf (addr,key) = valueOrErrorMessage(getInteger(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
168168
169169
170170 func throwErr (msg) = throw(makeString(["lp_stable.ride:", msg], " "))
171171
172172
173173 func fmtErr (msg) = makeString(["lp_stable.ride:", msg], " ")
174174
175175
176176 let fca = addressFromStringValue(strf(this, fc()))
177177
178178 let A = strf(this, amp())
179179
180180 func igs () = valueOrElse(getBoolean(fca, aps()), false)
181181
182182
183183 func mp () = fromBase58String(strf(fca, mtpk()))
184184
185185
186186 let feeCollectorAddress = addressFromStringValue(strf(fca, keyFeeCollectorAddress()))
187187
188188 func gpc () = {
189189 let amtAs = strf(this, aa())
190190 let priceAs = strf(this, pa())
191191 let iPriceAs = intf(fca, mba(priceAs))
192192 let iAmtAs = intf(fca, mba(amtAs))
193193 split(strf(fca, pc(toString(iAmtAs), toString(iPriceAs))), SEP)
194194 }
195195
196196
197197 func parseAssetId (input) = if ((input == wavesString))
198198 then unit
199199 else fromBase58String(input)
200200
201201
202202 func assetIdToString (input) = if ((input == unit))
203203 then wavesString
204204 else toBase58String(value(input))
205205
206206
207207 func parsePoolConfig (poolConfig) = $Tuple7(addressFromStringValue(poolConfig[idxPoolAddress]), parseIntValue(poolConfig[idxPoolSt]), fromBase58String(poolConfig[idxLPAsId]), parseAssetId(poolConfig[idxAmAsId]), parseAssetId(poolConfig[idxPrAsId]), parseIntValue(poolConfig[idxAmtAsDcm]), parseIntValue(poolConfig[idxPriceAsDcm]))
208208
209209
210210 let poolConfigParsed = parsePoolConfig(gpc())
211211
212212 let $t072087394 = poolConfigParsed
213213
214214 let cfgPoolAddress = $t072087394._1
215215
216216 let cfgPoolStatus = $t072087394._2
217217
218218 let cfgLpAssetId = $t072087394._3
219219
220220 let cfgAmountAssetId = $t072087394._4
221221
222222 let cfgPriceAssetId = $t072087394._5
223223
224224 let cfgAmountAssetDecimals = $t072087394._6
225225
226226 let cfgPriceAssetDecimals = $t072087394._7
227227
228228 func gfc () = split(strf(fca, fcfg()), SEP)
229229
230230
231231 let factoryConfig = gfc()
232232
233233 let stakingContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactStakCntr]), "Invalid staking contract address")
234234
235235 let slipageContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactSlippCntr]), "Invalid slipage contract address")
236236
237237 let gwxContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactGwxRewCntr]), "Invalid gwx contract address")
238238
239239 let restContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactoryRestCntr]), "Invalid gwx contract address")
240240
241241 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)
242242
243243
244244 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)
245245
246246
247247 func getAccBalance (assetId) = if ((assetId == "WAVES"))
248248 then wavesBalance(this).available
249249 else assetBalance(this, fromBase58String(assetId))
250250
251251
252252 func cpbi (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
253253
254254
255255 func vad (A1,A2,slippage) = {
256256 let diff = fraction((A1 - A2), scale8BigInt, A2)
257257 let pass = ((slippage - abs(diff)) > zeroBigInt)
258258 if (!(pass))
259259 then throw(("Big slpg: " + toString(diff)))
260260 else $Tuple2(pass, min([A1, A2]))
261261 }
262262
263263
264264 func vd (D1,D0,slpg) = {
265265 let diff = fraction(D0, scale8BigInt, D1)
266266 let fail = (slpg > diff)
267267 if (if (fail)
268268 then true
269269 else (D0 > D1))
270270 then throw(((((((toString(D0) + " ") + toString(D1)) + " ") + toString(diff)) + " ") + toString(slpg)))
271271 else fail
272272 }
273273
274274
275275 func pcp (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
276276 let amtAsAmtX18 = t1(amAmt, amAssetDcm)
277277 let prAsAmtX18 = t1(prAmt, prAssetDcm)
278278 cpbi(prAsAmtX18, amtAsAmtX18)
279279 }
280280
281281
282282 func calcPrices (amAmt,prAmt,lpAmt) = {
283283 let cfg = gpc()
284284 let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
285285 let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
286286 let priceX18 = pcp(amtAsDcm, prAsDcm, amAmt, prAmt)
287287 let amAmtX18 = t1(amAmt, amtAsDcm)
288288 let prAmtX18 = t1(prAmt, prAsDcm)
289289 let lpAmtX18 = t1(lpAmt, scale8)
290290 let lpPrInAmAsX18 = cpbi(amAmtX18, lpAmtX18)
291291 let lpPrInPrAsX18 = cpbi(prAmtX18, lpAmtX18)
292292 [priceX18, lpPrInAmAsX18, lpPrInPrAsX18]
293293 }
294294
295295
296296 func calculatePrices (amAmt,prAmt,lpAmt) = {
297297 let p = calcPrices(amAmt, prAmt, lpAmt)
298298 [f1(p[0], scale8), f1(p[1], scale8), f1(p[2], scale8)]
299299 }
300300
301301
302302 func takeFee (amount) = {
303303 let feeAmount = fraction(amount, fee, scale8)
304304 $Tuple2((amount - feeAmount), feeAmount)
305305 }
306306
307307
308308 func ego (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
309309 let cfg = gpc()
310310 let lpId = cfg[idxLPAsId]
311311 let amId = cfg[idxAmAsId]
312312 let prId = cfg[idxPrAsId]
313313 let amDcm = parseIntValue(cfg[idxAmtAsDcm])
314314 let prDcm = parseIntValue(cfg[idxPriceAsDcm])
315315 let sts = cfg[idxPoolSt]
316316 let lpEmiss = valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "Wrong LP id").quantity
317317 if ((lpId != pmtAssetId))
318318 then throw("Wrong pmt asset")
319319 else {
320320 let amBalance = getAccBalance(amId)
321321 let amBalanceX18 = t1(amBalance, amDcm)
322322 let prBalance = getAccBalance(prId)
323323 let prBalanceX18 = t1(prBalance, prDcm)
324324 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
325325 let curPrice = f1(curPriceX18, scale8)
326326 let pmtLpAmtX18 = t1(pmtLpAmt, scale8)
327327 let lpEmissX18 = t1(lpEmiss, scale8)
328328 let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissX18)
329329 let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissX18)
330330 let outAmAmt = f1(outAmAmtX18, amDcm)
331331 let outPrAmt = f1(outPrAmtX18, prDcm)
332332 let state = if ((txId58 == ""))
333333 then nil
334334 else [ScriptTransfer(userAddress, outAmAmt, if ((amId == "WAVES"))
335335 then unit
336336 else fromBase58String(amId)), ScriptTransfer(userAddress, outPrAmt, if ((prId == "WAVES"))
337337 then unit
338338 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)]
339339 $Tuple10(outAmAmt, outPrAmt, amId, prId, amBalance, prBalance, lpEmiss, curPriceX18, sts, state)
340340 }
341341 }
342342
343343
344344 func epo (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,userAddress,isEval,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
345345 let cfg = gpc()
346346 let lpId = fromBase58String(cfg[idxLPAsId])
347347 let amIdStr = cfg[idxAmAsId]
348348 let prIdStr = cfg[idxPrAsId]
349349 let inAmIdStr = cfg[idxIAmtAsId]
350350 let inPrIdStr = cfg[idxIPriceAsId]
351351 let amtDcm = parseIntValue(cfg[idxAmtAsDcm])
352352 let priceDcm = parseIntValue(cfg[idxPriceAsDcm])
353353 let sts = cfg[idxPoolSt]
354354 let lpEm = valueOrErrorMessage(assetInfo(lpId), "Wr lp as").quantity
355355 let amBalance = if (isEval)
356356 then getAccBalance(amIdStr)
357357 else if (if (isOneAsset)
358358 then (pmtId == amIdStr)
359359 else false)
360360 then (getAccBalance(amIdStr) - pmtAmt)
361361 else if (isOneAsset)
362362 then getAccBalance(amIdStr)
363363 else (getAccBalance(amIdStr) - inAmAmt)
364364 let prBalance = if (isEval)
365365 then getAccBalance(prIdStr)
366366 else if (if (isOneAsset)
367367 then (pmtId == prIdStr)
368368 else false)
369369 then (getAccBalance(prIdStr) - pmtAmt)
370370 else if (isOneAsset)
371371 then getAccBalance(prIdStr)
372372 else (getAccBalance(prIdStr) - inPrAmt)
373373 let inAmAssetAmtX18 = t1(inAmAmt, amtDcm)
374374 let inPrAssetAmtX18 = t1(inPrAmt, priceDcm)
375375 let userPriceX18 = cpbi(inPrAssetAmtX18, inAmAssetAmtX18)
376376 let amBalanceX18 = t1(amBalance, amtDcm)
377377 let prBalanceX18 = t1(prBalance, priceDcm)
378378 let r = if ((lpEm == 0))
379379 then {
380380 let curPriceX18 = zeroBigInt
381381 let slippageX18 = zeroBigInt
382382 let lpAmtX18 = pow((inAmAssetAmtX18 * inPrAssetAmtX18), 0, toBigInt(5), 1, 0, DOWN)
383383 $Tuple5(f1(lpAmtX18, scale8), f1(inAmAssetAmtX18, amtDcm), f1(inPrAssetAmtX18, priceDcm), cpbi((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
384384 }
385385 else {
386386 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
387387 let slippageRealX18 = fraction(abs((curPriceX18 - userPriceX18)), scale18, curPriceX18)
388388 let slippageX18 = t1(slippage, scale8)
389389 if (if (if (validateSlippage)
390390 then (curPriceX18 != zeroBigInt)
391391 else false)
392392 then (slippageRealX18 > slippageX18)
393393 else false)
394394 then throw(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
395395 else {
396396 let lpEmissionX18 = t1(lpEm, scale8)
397397 let prViaAmX18 = fraction(inAmAssetAmtX18, curPriceX18, scale18)
398398 let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, curPriceX18)
399399 let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
400400 then $Tuple2(amViaPrX18, inPrAssetAmtX18)
401401 else $Tuple2(inAmAssetAmtX18, prViaAmX18)
402402 let expAmtAssetAmtX18 = expectedAmts._1
403403 let expPriceAssetAmtX18 = expectedAmts._2
404404 let lpAmtX18 = fraction(lpEmissionX18, expPriceAssetAmtX18, prBalanceX18)
405405 $Tuple5(f1(lpAmtX18, scale8), f1(expAmtAssetAmtX18, amtDcm), f1(expPriceAssetAmtX18, priceDcm), curPriceX18, slippageX18)
406406 }
407407 }
408408 let calcLpAmt = r._1
409409 let calcAmAssetPmt = r._2
410410 let calcPrAssetPmt = r._3
411411 let curPrice = f1(r._4, scale8)
412412 let slippageCalc = f1(r._5, scale8)
413413 if ((0 >= calcLpAmt))
414414 then throw("LP <= 0")
415415 else {
416416 let emitLpAmt = if (!(emitLp))
417417 then 0
418418 else calcLpAmt
419419 let amDiff = (inAmAmt - calcAmAssetPmt)
420420 let prDiff = (inPrAmt - calcPrAssetPmt)
421421 let $t01782518170 = if (if (isOneAsset)
422422 then (pmtId == amIdStr)
423423 else false)
424424 then $Tuple2(pmtAmt, 0)
425425 else if (if (isOneAsset)
426426 then (pmtId == prIdStr)
427427 else false)
428428 then $Tuple2(0, pmtAmt)
429429 else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
430430 let writeAmAmt = $t01782518170._1
431431 let writePrAmt = $t01782518170._2
432432 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))]
433433 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
434434 }
435435 }
436436
437437
438438 func calcDLp (amountBalance,priceBalance,lpEmission) = {
439439 let updatedDLp = fraction((amountBalance * priceBalance), scale18, lpEmission)
440440 updatedDLp
441441 }
442442
443443
444444 func refreshDLpInternal (amountAssetBalanceDelta,priceAssetBalanceDelta,lpAssetEmissionDelta) = {
445445 let amountAssetBalance = (getAccBalance(assetIdToString(cfgAmountAssetId)) + amountAssetBalanceDelta)
446446 let priceAssetBalance = (getAccBalance(assetIdToString(cfgPriceAssetId)) + priceAssetBalanceDelta)
447447 let lpAssetEmission = (value(assetInfo(cfgLpAssetId)).quantity + lpAssetEmissionDelta)
448448 let updatedDLp = calcDLp(toBigInt(amountAssetBalance), toBigInt(priceAssetBalance), toBigInt(lpAssetEmission))
449449 let actions = [IntegerEntry(keyDLpRefreshedHeight, height), StringEntry(keyDLp, toString(updatedDLp))]
450450 $Tuple2(actions, updatedDLp)
451451 }
452452
453453
454+func validateUpdatedDLp (updatedDLp) = {
455+ let amountAssetBalance = getAccBalance(assetIdToString(cfgAmountAssetId))
456+ let priceAssetBalance = getAccBalance(assetIdToString(cfgPriceAssetId))
457+ let lpAssetEmission = value(assetInfo(cfgLpAssetId)).quantity
458+ let currentDLp = calcDLp(toBigInt(amountAssetBalance), toBigInt(priceAssetBalance), toBigInt(lpAssetEmission))
459+ if ((updatedDLp >= currentDLp))
460+ then true
461+ else throwErr("updated DLp lower than current DLp")
462+ }
463+
464+
454465 func moa (order) = {
455466 let amountAssetAmount = order.amount
456467 let priceAssetAmount = fraction(order.amount, order.price, scale8)
457- let $t02011920331 = if ((order.orderType == Buy))
468+ let $t02058520797 = if ((order.orderType == Buy))
458469 then $Tuple2(amountAssetAmount, -(priceAssetAmount))
459470 else $Tuple2(-(amountAssetAmount), priceAssetAmount)
460- let amountAssetBalanceDelta = $t02011920331._1
461- let priceAssetBalanceDelta = $t02011920331._2
471+ let amountAssetBalanceDelta = $t02058520797._1
472+ let priceAssetBalanceDelta = $t02058520797._2
462473 if (if (if (igs())
463474 then true
464475 else (cfgPoolStatus == PoolMatcherDis))
465476 then true
466477 else (cfgPoolStatus == PoolShutdown))
467478 then throw("Admin blocked")
468479 else if (if ((order.assetPair.amountAsset != cfgAmountAssetId))
469480 then true
470481 else (order.assetPair.priceAsset != cfgPriceAssetId))
471482 then throw("Wr assets")
472483 else {
473484 let dLp = valueOrErrorMessage(parseBigInt(valueOrErrorMessage(getString(this, keyDLp), fmtErr("dLp is required"))), fmtErr("invalid dLp"))
474- let $t02075820858 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
475- let unusedActions = $t02075820858._1
476- let dLpNew = $t02075820858._2
485+ let $t02122421324 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
486+ let unusedActions = $t02122421324._1
487+ let dLpNew = $t02122421324._2
477488 let isOrderValid = (dLpNew > dLp)
478489 isOrderValid
479490 }
480491 }
481492
482493
483494 func cg (i) = if ((size(i.payments) != 1))
484495 then throw("1 pmnt exp")
485496 else {
486497 let pmt = value(i.payments[0])
487498 let pmtAssetId = value(pmt.assetId)
488499 let pmtAmt = pmt.amount
489500 let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
490501 let outAmAmt = r._1
491502 let outPrAmt = r._2
492503 let sts = parseIntValue(r._9)
493504 let state = r._10
494505 if (if (igs())
495506 then true
496507 else (sts == PoolShutdown))
497508 then throw(("Admin blocked: " + toString(sts)))
498509 else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state)
499510 }
500511
501512
502513 func cp (caller,txId,amAsPmt,prAsPmt,slippage,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
503514 let r = epo(txId, slippage, value(amAsPmt).amount, value(amAsPmt).assetId, value(prAsPmt).amount, value(prAsPmt).assetId, caller, (txId == ""), emitLp, isOneAsset, validateSlippage, pmtAmt, pmtId)
504515 let sts = parseIntValue(r._8)
505516 if (if (if (igs())
506517 then true
507518 else (sts == PoolPutDis))
508519 then true
509520 else (sts == PoolShutdown))
510521 then throw(("Blocked:" + toString(sts)))
511522 else r
512523 }
513524
514525
515526 func getD (xp) = {
516527 let n = big2
517528 let xp0 = xp[0]
518529 let xp1 = xp[1]
519530 let aPrecision = parseBigIntValue(Amult)
520531 let a = (parseBigIntValue(A) * aPrecision)
521532 let s = (xp0 + xp1)
522533 if ((s == big0))
523534 then big0
524535 else {
525536 let ann = (a * n)
526537 let xp0_xp1_n_n = (((xp0 * xp1) * n) * n)
527538 let ann_s_aPrecision = ((ann * s) / aPrecision)
528539 let ann_aPrecision = (ann - aPrecision)
529540 let n1 = (n + big1)
530541 func calc (acc,cur) = {
531- let $t02301123031 = acc
532- let d = $t02301123031._1
533- let found = $t02301123031._2
542+ let $t02347723497 = acc
543+ let d = $t02347723497._1
544+ let found = $t02347723497._2
534545 if ((found != unit))
535546 then acc
536547 else {
537548 let dp = (((d * d) * d) / xp0_xp1_n_n)
538549 let dNext = (((ann_s_aPrecision + (dp * n)) * d) / (((ann_aPrecision * d) / aPrecision) + (n1 * dp)))
539550 let dDiff = absBigInt((dNext - value(d)))
540551 if ((big1 >= dDiff))
541552 then $Tuple2(dNext, cur)
542553 else $Tuple2(dNext, unit)
543554 }
544555 }
545556
546557 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
547- let $t02345223499 = {
558+ let $t02391823965 = {
548559 let $l = arr
549560 let $s = size($l)
550561 let $acc0 = $Tuple2(s, unit)
551562 func $f0_1 ($a,$i) = if (($i >= $s))
552563 then $a
553564 else calc($a, $l[$i])
554565
555566 func $f0_2 ($a,$i) = if (($i >= $s))
556567 then $a
557568 else throw("List size exceeds 15")
558569
559570 $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)
560571 }
561- let d = $t02345223499._1
562- let found = $t02345223499._2
572+ let d = $t02391823965._1
573+ let found = $t02391823965._2
563574 if ((found != unit))
564575 then d
565576 else throw(("D calculation error, D = " + toString(d)))
566577 }
567578 }
568579
569580
570581 func getYD (xp,i,D) = {
571582 let n = big2
572583 let x = xp[if ((i == 0))
573584 then 1
574585 else 0]
575586 let aPrecision = parseBigIntValue(Amult)
576587 let a = (parseBigIntValue(A) * aPrecision)
577588 let s = x
578589 let ann = (a * n)
579590 let c = (((((D * D) / (x * n)) * D) * aPrecision) / (ann * n))
580591 let b = ((s + ((D * aPrecision) / ann)) - D)
581592 func calc (acc,cur) = {
582- let $t02399924019 = acc
583- let y = $t02399924019._1
584- let found = $t02399924019._2
593+ let $t02446524485 = acc
594+ let y = $t02446524485._1
595+ let found = $t02446524485._2
585596 if ((found != unit))
586597 then acc
587598 else {
588599 let yNext = (((y * y) + c) / ((big2 * y) + b))
589600 let yDiff = absBigInt((yNext - value(y)))
590601 if ((big1 >= yDiff))
591602 then $Tuple2(yNext, cur)
592603 else $Tuple2(yNext, unit)
593604 }
594605 }
595606
596607 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
597- let $t02432624373 = {
608+ let $t02479224839 = {
598609 let $l = arr
599610 let $s = size($l)
600611 let $acc0 = $Tuple2(D, unit)
601612 func $f0_1 ($a,$i) = if (($i >= $s))
602613 then $a
603614 else calc($a, $l[$i])
604615
605616 func $f0_2 ($a,$i) = if (($i >= $s))
606617 then $a
607618 else throw("List size exceeds 15")
608619
609620 $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)
610621 }
611- let y = $t02432624373._1
612- let found = $t02432624373._2
622+ let y = $t02479224839._1
623+ let found = $t02479224839._2
613624 if ((found != unit))
614625 then y
615626 else throw(("Y calculation error, Y = " + toString(y)))
616627 }
617628
618629
619630 func calcPutOneTkn (pmtAmtRaw,pmtAssetId,userAddress,txId,withTakeFee) = {
620631 let poolConfig = gpc()
621632 let amId = poolConfig[idxAmAsId]
622633 let prId = poolConfig[idxPrAsId]
623634 let lpId = poolConfig[idxLPAsId]
624635 let amtDcm = parseIntValue(poolConfig[idxAmtAsDcm])
625636 let priceDcm = parseIntValue(poolConfig[idxPriceAsDcm])
626637 let lpAssetEmission = toBigInt(valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "invalid lp asset").quantity)
627638 let chechEmission = if ((lpAssetEmission > big0))
628639 then true
629640 else throw("initial deposit requires all coins")
630641 if ((chechEmission == chechEmission))
631642 then {
632643 let amBalance = getAccBalance(amId)
633644 let prBalance = getAccBalance(prId)
634- let $t02515625618 = if ((txId == ""))
645+ let $t02562226084 = if ((txId == ""))
635646 then $Tuple2(amBalance, prBalance)
636647 else if ((pmtAssetId == amId))
637648 then if ((pmtAmtRaw > amBalance))
638649 then throw("invalid payment amount")
639650 else $Tuple2((amBalance - pmtAmtRaw), prBalance)
640651 else if ((pmtAssetId == prId))
641652 then if ((pmtAmtRaw > prBalance))
642653 then throw("invalid payment amount")
643654 else $Tuple2(amBalance, (prBalance - pmtAmtRaw))
644655 else throw("wrong pmtAssetId")
645- let amBalanceOld = $t02515625618._1
646- let prBalanceOld = $t02515625618._2
647- let $t02562425800 = if ((pmtAssetId == amId))
656+ let amBalanceOld = $t02562226084._1
657+ let prBalanceOld = $t02562226084._2
658+ let $t02609026266 = if ((pmtAssetId == amId))
648659 then $Tuple2(pmtAmtRaw, 0)
649660 else if ((pmtAssetId == prId))
650661 then $Tuple2(0, pmtAmtRaw)
651662 else throw("invalid payment")
652- let amAmountRaw = $t02562425800._1
653- let prAmountRaw = $t02562425800._2
654- let $t02580426043 = if (withTakeFee)
663+ let amAmountRaw = $t02609026266._1
664+ let prAmountRaw = $t02609026266._2
665+ let $t02627026509 = if (withTakeFee)
655666 then $Tuple3(takeFee(amAmountRaw)._1, takeFee(prAmountRaw)._1, takeFee(pmtAmtRaw)._2)
656667 else $Tuple3(amAmountRaw, prAmountRaw, 0)
657- let amAmount = $t02580426043._1
658- let prAmount = $t02580426043._2
659- let feeAmount = $t02580426043._3
668+ let amAmount = $t02627026509._1
669+ let prAmount = $t02627026509._2
670+ let feeAmount = $t02627026509._3
660671 let amBalanceNew = (amBalanceOld + amAmount)
661672 let prBalanceNew = (prBalanceOld + prAmount)
662673 let D0 = getD([toBigInt(amBalanceOld), toBigInt(prBalanceOld)])
663674 let D1 = getD([toBigInt(amBalanceNew), toBigInt(prBalanceNew)])
664675 let checkD = if ((D1 > D0))
665676 then true
666677 else throw()
667678 if ((checkD == checkD))
668679 then {
669680 let lpAmount = fraction(lpAssetEmission, (D1 - D0), D0)
670681 let curPrice = f1(cpbi(t1(prBalanceNew, priceDcm), t1(amBalanceNew, amtDcm)), scale8)
671682 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))]
672683 let poolProportion = fraction(prBalanceOld, scale8, amBalanceOld)
673684 let amountAssetPart = fraction(pmtAmtRaw, scale8, (poolProportion + scale8))
674685 let priceAssetPart = (pmtAmtRaw - amountAssetPart)
675686 let lpAmtBoth = fraction(lpAssetEmission, toBigInt(priceAssetPart), toBigInt(prBalanceOld))
676687 let bonus = toInt(fraction((lpAmount - lpAmtBoth), scale8BigInt, lpAmtBoth))
677688 $Tuple4(toInt(lpAmount), commonState, feeAmount, bonus)
678689 }
679690 else throw("Strict value is not equal to itself.")
680691 }
681692 else throw("Strict value is not equal to itself.")
682693 }
683694
684695
685696 func getOneTknV2Internal (outAssetId,minOutAmount,payments,caller,originCaller,transactionId) = {
686697 let poolConfig = gpc()
687698 let lpId = poolConfig[idxLPAsId]
688699 let amId = poolConfig[idxAmAsId]
689700 let prId = poolConfig[idxPrAsId]
690701 let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
691702 let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
692703 let poolStatus = poolConfig[idxPoolSt]
693704 let userAddress = if ((caller == restContract))
694705 then originCaller
695706 else caller
696707 let pmt = value(payments[0])
697708 let pmtAssetId = value(pmt.assetId)
698709 let pmtAmt = pmt.amount
699710 let txId58 = toBase58String(transactionId)
700711 if ((lpId != toBase58String(pmtAssetId)))
701712 then throw("Wrong LP")
702713 else {
703714 let amBalance = getAccBalance(amId)
704715 let prBalance = getAccBalance(prId)
705- let $t02804528156 = {
716+ let $t02851128622 = {
706717 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)
707718 if ($isInstanceOf(@, "(Int, Int)"))
708719 then @
709720 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
710721 }
711- if (($t02804528156 == $t02804528156))
722+ if (($t02851128622 == $t02851128622))
712723 then {
713- let feeAmount = $t02804528156._2
714- let totalGet = $t02804528156._1
724+ let feeAmount = $t02851128622._2
725+ let totalGet = $t02851128622._1
715726 let totalAmount = if (if ((minOutAmount > 0))
716727 then (minOutAmount > totalGet)
717728 else false)
718729 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
719730 else totalGet
720- let $t02834628653 = if ((outAssetId == amId))
731+ let $t02881229119 = if ((outAssetId == amId))
721732 then $Tuple4(totalAmount, 0, ((amBalance - totalAmount) - feeAmount), prBalance)
722733 else if ((outAssetId == prId))
723734 then $Tuple4(0, totalAmount, amBalance, ((prBalance - totalAmount) - feeAmount))
724735 else throw("invalid out asset id")
725- let outAm = $t02834628653._1
726- let outPr = $t02834628653._2
727- let amBalanceNew = $t02834628653._3
728- let prBalanceNew = $t02834628653._4
736+ let outAm = $t02881229119._1
737+ let outPr = $t02881229119._2
738+ let amBalanceNew = $t02881229119._3
739+ let prBalanceNew = $t02881229119._4
729740 let curPrX18 = cpbi(t1(prBalanceNew, prDecimals), t1(amBalanceNew, amDecimals))
730741 let curPr = f1(curPrX18, scale8)
731742 let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
732743 then unit
733744 else fromBase58String(outAssetId)
734745 let sendFeeToMatcher = if ((feeAmount > 0))
735746 then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetIdOrWaves)]
736747 else nil
737748 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)
738749 if ((state == state))
739750 then {
740751 let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
741752 if ((burn == burn))
742753 then {
743- let $t02943829788 = {
754+ let $t02990430254 = {
744755 let feeAmountForCalc = if ((this == feeCollectorAddress))
745756 then 0
746757 else feeAmount
747758 let outInAmountAsset = if ((parseAssetId(outAssetId) == cfgAmountAssetId))
748759 then true
749760 else false
750761 if (outInAmountAsset)
751762 then $Tuple2(-((totalGet + feeAmountForCalc)), 0)
752763 else $Tuple2(0, -((totalGet + feeAmountForCalc)))
753764 }
754- let amountAssetBalanceDelta = $t02943829788._1
755- let priceAssetBalanceDelta = $t02943829788._2
756- let $t02979129899 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
757- let refreshDLpActions = $t02979129899._1
758- let updatedDLp = $t02979129899._2
759- $Tuple2((state ++ refreshDLpActions), totalAmount)
765+ let amountAssetBalanceDelta = $t02990430254._1
766+ let priceAssetBalanceDelta = $t02990430254._2
767+ let $t03025730365 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
768+ let refreshDLpActions = $t03025730365._1
769+ let updatedDLp = $t03025730365._2
770+ let isUpdatedDLpValid = validateUpdatedDLp(updatedDLp)
771+ if ((isUpdatedDLpValid == isUpdatedDLpValid))
772+ then $Tuple2((state ++ refreshDLpActions), totalAmount)
773+ else throw("Strict value is not equal to itself.")
760774 }
761775 else throw("Strict value is not equal to itself.")
762776 }
763777 else throw("Strict value is not equal to itself.")
764778 }
765779 else throw("Strict value is not equal to itself.")
766780 }
767781 }
768782
769783
770784 func m () = match getString(mpk()) {
771785 case s: String =>
772786 fromBase58String(s)
773787 case _: Unit =>
774788 unit
775789 case _ =>
776790 throw("Match error")
777791 }
778792
779793
780794 func pm () = match getString(pmpk()) {
781795 case s: String =>
782796 fromBase58String(s)
783797 case _: Unit =>
784798 unit
785799 case _ =>
786800 throw("Match error")
787801 }
788802
789803
790804 let pd = throw("Permission denied")
791805
792806 func isManager (i) = match m() {
793807 case pk: ByteVector =>
794808 (i.callerPublicKey == pk)
795809 case _: Unit =>
796810 (i.caller == this)
797811 case _ =>
798812 throw("Match error")
799813 }
800814
801815
802816 func mm (i) = match m() {
803817 case pk: ByteVector =>
804818 if ((i.callerPublicKey == pk))
805819 then true
806820 else pd
807821 case _: Unit =>
808822 if ((i.caller == this))
809823 then true
810824 else pd
811825 case _ =>
812826 throw("Match error")
813827 }
814828
815829
816830 @Callable(i)
817831 func constructor (fc) = {
818832 let c = mm(i)
819833 if ((c == c))
820834 then [StringEntry(fc(), fc)]
821835 else throw("Strict value is not equal to itself.")
822836 }
823837
824838
825839
826840 @Callable(i)
827841 func setManager (pendingManagerPublicKey) = {
828842 let c = mm(i)
829843 if ((c == c))
830844 then {
831845 let cm = fromBase58String(pendingManagerPublicKey)
832846 if ((cm == cm))
833847 then [StringEntry(pmpk(), pendingManagerPublicKey)]
834848 else throw("Strict value is not equal to itself.")
835849 }
836850 else throw("Strict value is not equal to itself.")
837851 }
838852
839853
840854
841855 @Callable(i)
842856 func confirmManager () = {
843857 let p = pm()
844858 let hpm = if (isDefined(p))
845859 then true
846860 else throw("No pending manager")
847861 if ((hpm == hpm))
848862 then {
849863 let cpm = if ((i.callerPublicKey == value(p)))
850864 then true
851865 else throw("You are not pending manager")
852866 if ((cpm == cpm))
853867 then [StringEntry(mpk(), toBase58String(value(p))), DeleteEntry(pmpk())]
854868 else throw("Strict value is not equal to itself.")
855869 }
856870 else throw("Strict value is not equal to itself.")
857871 }
858872
859873
860874
861875 @Callable(i)
862876 func put (slip,autoStake) = {
863877 let factCfg = gfc()
864878 let stakingCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactStakCntr]), "Wr st addr")
865879 let slipCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactSlippCntr]), "Wr sl addr")
866880 if ((0 > slip))
867881 then throw("Wrong slippage")
868882 else if ((size(i.payments) != 2))
869883 then throw("2 pmnts expd")
870884 else {
871885 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, "")
872886 let emitLpAmt = e._2
873887 let lpAssetId = e._7
874888 let state = e._9
875889 let amDiff = e._10
876890 let prDiff = e._11
877891 let amId = e._12
878892 let prId = e._13
879893 let r = invoke(fca, "emit", [emitLpAmt], nil)
880894 if ((r == r))
881895 then {
882896 let el = match r {
883897 case legacy: Address =>
884898 invoke(legacy, "emit", [emitLpAmt], nil)
885899 case _ =>
886900 unit
887901 }
888902 if ((el == el))
889903 then {
890904 let sa = if ((amDiff > 0))
891905 then invoke(slipCntr, "put", nil, [AttachedPayment(amId, amDiff)])
892906 else nil
893907 if ((sa == sa))
894908 then {
895909 let sp = if ((prDiff > 0))
896910 then invoke(slipCntr, "put", nil, [AttachedPayment(prId, prDiff)])
897911 else nil
898912 if ((sp == sp))
899913 then {
900914 let lpTrnsfr = if (autoStake)
901915 then {
902916 let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
903917 if ((ss == ss))
904918 then nil
905919 else throw("Strict value is not equal to itself.")
906920 }
907921 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
908- let $t03348133546 = refreshDLpInternal(0, 0, 0)
909- let refreshDLpActions = $t03348133546._1
910- let updatedDLp = $t03348133546._2
911- ((state ++ lpTrnsfr) ++ refreshDLpActions)
922+ let $t03400834073 = refreshDLpInternal(0, 0, 0)
923+ let refreshDLpActions = $t03400834073._1
924+ let updatedDLp = $t03400834073._2
925+ let isUpdatedDLpValid = validateUpdatedDLp(updatedDLp)
926+ if ((isUpdatedDLpValid == isUpdatedDLpValid))
927+ then ((state ++ lpTrnsfr) ++ refreshDLpActions)
928+ else throw("Strict value is not equal to itself.")
912929 }
913930 else throw("Strict value is not equal to itself.")
914931 }
915932 else throw("Strict value is not equal to itself.")
916933 }
917934 else throw("Strict value is not equal to itself.")
918935 }
919936 else throw("Strict value is not equal to itself.")
920937 }
921938 }
922939
923940
924941
925942 @Callable(i)
926943 func putOneTknV2 (minOutAmount,autoStake) = {
927944 let isPoolOneTokenOperationsDisabled = {
928945 let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
929946 if ($isInstanceOf(@, "Boolean"))
930947 then @
931948 else throw(($getType(@) + " couldn't be cast to Boolean"))
932949 }
933950 let isPutDisabled = if (if (if (igs())
934951 then true
935952 else (cfgPoolStatus == PoolPutDis))
936953 then true
937954 else (cfgPoolStatus == PoolShutdown))
938955 then true
939956 else isPoolOneTokenOperationsDisabled
940957 let checks = [if (if (!(isPutDisabled))
941958 then true
942959 else isManager(i))
943960 then true
944961 else throwErr("put operation is blocked by admin"), if ((size(i.payments) == 1))
945962 then true
946963 else throwErr("exactly 1 payment are expected")]
947964 if ((checks == checks))
948965 then {
949966 let poolConfig = gpc()
950967 let amId = poolConfig[idxAmAsId]
951968 let prId = poolConfig[idxPrAsId]
952969 let lpId = fromBase58String(poolConfig[idxLPAsId])
953970 let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
954971 let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
955972 let userAddress = if ((i.caller == this))
956973 then i.originCaller
957974 else i.caller
958975 let pmt = value(i.payments[0])
959976 let pmtAssetId = toBase58String(value(pmt.assetId))
960977 let pmtAmt = pmt.amount
961- let $t03460834766 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId), true)
962- if (($t03460834766 == $t03460834766))
978+ let $t03519835356 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId), true)
979+ if (($t03519835356 == $t03519835356))
963980 then {
964- let feeAmount = $t03460834766._3
965- let state = $t03460834766._2
966- let estimLP = $t03460834766._1
981+ let feeAmount = $t03519835356._3
982+ let state = $t03519835356._2
983+ let estimLP = $t03519835356._1
967984 let emitLpAmt = if (if ((minOutAmount > 0))
968985 then (minOutAmount > estimLP)
969986 else false)
970987 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
971988 else estimLP
972989 let e = invoke(fca, "emit", [emitLpAmt], nil)
973990 if ((e == e))
974991 then {
975992 let el = match e {
976993 case legacy: Address =>
977994 invoke(legacy, "emit", [emitLpAmt], nil)
978995 case _ =>
979996 unit
980997 }
981998 if ((el == el))
982999 then {
9831000 let lpTrnsfr = if (autoStake)
9841001 then {
9851002 let ss = invoke(stakingContract, "stake", nil, [AttachedPayment(lpId, emitLpAmt)])
9861003 if ((ss == ss))
9871004 then nil
9881005 else throw("Strict value is not equal to itself.")
9891006 }
9901007 else [ScriptTransfer(i.caller, emitLpAmt, lpId)]
9911008 let sendFeeToMatcher = if ((feeAmount > 0))
9921009 then [ScriptTransfer(feeCollectorAddress, feeAmount, fromBase58String(pmtAssetId))]
9931010 else nil
994- let $t03558135930 = if ((this == feeCollectorAddress))
1011+ let $t03617136520 = if ((this == feeCollectorAddress))
9951012 then $Tuple2(0, 0)
9961013 else {
9971014 let paymentInAmountAsset = if ((pmt.assetId == cfgAmountAssetId))
9981015 then true
9991016 else false
10001017 if (paymentInAmountAsset)
10011018 then $Tuple2(-(feeAmount), 0)
10021019 else $Tuple2(0, -(feeAmount))
10031020 }
1004- let amountAssetBalanceDelta = $t03558135930._1
1005- let priceAssetBalanceDelta = $t03558135930._2
1006- let $t03593336041 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1007- let refreshDLpActions = $t03593336041._1
1008- let updatedDLp = $t03593336041._2
1021+ let amountAssetBalanceDelta = $t03617136520._1
1022+ let priceAssetBalanceDelta = $t03617136520._2
1023+ let $t03652336631 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1024+ let refreshDLpActions = $t03652336631._1
1025+ let updatedDLp = $t03652336631._2
10091026 $Tuple2((((state ++ lpTrnsfr) ++ sendFeeToMatcher) ++ refreshDLpActions), emitLpAmt)
10101027 }
10111028 else throw("Strict value is not equal to itself.")
10121029 }
10131030 else throw("Strict value is not equal to itself.")
10141031 }
10151032 else throw("Strict value is not equal to itself.")
10161033 }
10171034 else throw("Strict value is not equal to itself.")
10181035 }
10191036
10201037
10211038
10221039 @Callable(i)
10231040 func putForFree (maxSlpg) = if ((0 > maxSlpg))
10241041 then throw("Wrong slpg")
10251042 else if ((size(i.payments) != 2))
10261043 then throw("2 pmnts expd")
10271044 else {
10281045 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, "")
10291046 let state = estPut._9
1030- let $t03679736862 = refreshDLpInternal(0, 0, 0)
1031- let refreshDLpActions = $t03679736862._1
1032- let updatedDLp = $t03679736862._2
1033- (state ++ refreshDLpActions)
1047+ let $t03738937454 = refreshDLpInternal(0, 0, 0)
1048+ let refreshDLpActions = $t03738937454._1
1049+ let updatedDLp = $t03738937454._2
1050+ let isUpdatedDLpValid = validateUpdatedDLp(updatedDLp)
1051+ if ((isUpdatedDLpValid == isUpdatedDLpValid))
1052+ then (state ++ refreshDLpActions)
1053+ else throw("Strict value is not equal to itself.")
10341054 }
10351055
10361056
10371057
10381058 @Callable(i)
10391059 func get () = {
10401060 let r = cg(i)
10411061 let outAmtAmt = r._1
10421062 let outPrAmt = r._2
10431063 let pmtAmt = r._3
10441064 let pmtAssetId = r._4
10451065 let state = r._5
10461066 let b = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
10471067 if ((b == b))
10481068 then {
1049- let $t03749437576 = refreshDLpInternal(-(outAmtAmt), -(outPrAmt), 0)
1050- let refreshDLpActions = $t03749437576._1
1051- let updatedDLp = $t03749437576._2
1052- (state ++ refreshDLpActions)
1069+ let $t03814938231 = refreshDLpInternal(-(outAmtAmt), -(outPrAmt), 0)
1070+ let refreshDLpActions = $t03814938231._1
1071+ let updatedDLp = $t03814938231._2
1072+ let isUpdatedDLpValid = validateUpdatedDLp(updatedDLp)
1073+ if ((isUpdatedDLpValid == isUpdatedDLpValid))
1074+ then (state ++ refreshDLpActions)
1075+ else throw("Strict value is not equal to itself.")
10531076 }
10541077 else throw("Strict value is not equal to itself.")
10551078 }
10561079
10571080
10581081
10591082 @Callable(i)
10601083 func getOneTknV2 (outAssetId,minOutAmount) = {
10611084 let isPoolOneTokenOperationsDisabled = {
10621085 let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
10631086 if ($isInstanceOf(@, "Boolean"))
10641087 then @
10651088 else throw(($getType(@) + " couldn't be cast to Boolean"))
10661089 }
10671090 let isGetDisabled = if (if (igs())
10681091 then true
10691092 else (cfgPoolStatus == PoolShutdown))
10701093 then true
10711094 else isPoolOneTokenOperationsDisabled
10721095 let checks = [if (if (!(isGetDisabled))
10731096 then true
10741097 else isManager(i))
10751098 then true
10761099 else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 1))
10771100 then true
10781101 else throwErr("exactly 1 payment are expected")]
10791102 if ((checks == checks))
10801103 then {
1081- let $t03812138276 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1082- let state = $t03812138276._1
1083- let totalAmount = $t03812138276._2
1104+ let $t03883738992 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1105+ let state = $t03883738992._1
1106+ let totalAmount = $t03883738992._2
10841107 $Tuple2(state, totalAmount)
10851108 }
10861109 else throw("Strict value is not equal to itself.")
10871110 }
10881111
10891112
10901113
10911114 @Callable(i)
10921115 func refreshDLp () = {
10931116 let lastRefreshedBlockHeight = valueOrElse(getInteger(keyDLpRefreshedHeight), 0)
10941117 let checkLastRefreshedBlockHeight = if (((height - lastRefreshedBlockHeight) >= dLpRefreshDelay))
10951118 then unit
10961119 else throwErr(makeString([toString(dLpRefreshDelay), " blocks have not passed since the previous call"], ""))
10971120 if ((checkLastRefreshedBlockHeight == checkLastRefreshedBlockHeight))
10981121 then {
10991122 let dLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyDLp), "0")), fmtErr("invalid dLp"))
1100- let $t03880038864 = refreshDLpInternal(0, 0, 0)
1101- let dLpUpdateActions = $t03880038864._1
1102- let updatedDLp = $t03880038864._2
1123+ let $t03951639580 = refreshDLpInternal(0, 0, 0)
1124+ let dLpUpdateActions = $t03951639580._1
1125+ let updatedDLp = $t03951639580._2
11031126 let actions = if ((dLp != updatedDLp))
11041127 then dLpUpdateActions
11051128 else throwErr("nothing to refresh")
11061129 $Tuple2(actions, toString(updatedDLp))
11071130 }
11081131 else throw("Strict value is not equal to itself.")
11091132 }
11101133
11111134
11121135
11131136 @Callable(i)
11141137 func getOneTknV2READONLY (outAssetId,lpAssetAmount) = {
11151138 let poolConfig = gpc()
11161139 let amId = poolConfig[idxAmAsId]
11171140 let prId = poolConfig[idxPrAsId]
11181141 let lpId = poolConfig[idxLPAsId]
11191142 let xp = [toBigInt(getAccBalance(amId)), toBigInt(getAccBalance(prId))]
11201143 let lpEmission = toBigInt(valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "invalid lp asset").quantity)
11211144 let D0 = getD(xp)
11221145 let D1 = (D0 - fraction(toBigInt(lpAssetAmount), D0, lpEmission))
11231146 let index = if ((outAssetId == amId))
11241147 then 0
11251148 else if ((outAssetId == prId))
11261149 then 1
11271150 else throw("invalid out asset id")
11281151 let newY = getYD(xp, index, D1)
11291152 let dy = (xp[index] - newY)
11301153 let totalGetRaw = max([0, toInt((dy - big1))])
1131- let $t03976439813 = takeFee(totalGetRaw)
1132- let totalGet = $t03976439813._1
1133- let feeAmount = $t03976439813._2
1154+ let $t04048040529 = takeFee(totalGetRaw)
1155+ let totalGet = $t04048040529._1
1156+ let feeAmount = $t04048040529._2
11341157 $Tuple2(nil, $Tuple2(totalGet, feeAmount))
11351158 }
11361159
11371160
11381161
11391162 @Callable(i)
11401163 func getOneTknV2WithBonusREADONLY (outAssetId,lpAssetAmount) = {
11411164 let poolConfig = gpc()
11421165 let amId = poolConfig[idxAmAsId]
11431166 let prId = poolConfig[idxPrAsId]
11441167 let lpId = poolConfig[idxLPAsId]
11451168 let amBalance = getAccBalance(amId)
11461169 let prBalance = getAccBalance(prId)
1147- let $t04015840273 = {
1170+ let $t04087440989 = {
11481171 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)
11491172 if ($isInstanceOf(@, "(Int, Int)"))
11501173 then @
11511174 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
11521175 }
1153- let totalGet = $t04015840273._1
1154- let feeAmount = $t04015840273._2
1176+ let totalGet = $t04087440989._1
1177+ let feeAmount = $t04087440989._2
11551178 let r = ego("", lpId, lpAssetAmount, this)
11561179 let outAmAmt = r._1
11571180 let outPrAmt = r._2
11581181 let sumOfGetAssets = (outAmAmt + outPrAmt)
11591182 let bonus = if ((sumOfGetAssets == 0))
11601183 then if ((totalGet == 0))
11611184 then 0
11621185 else throw("bonus calculation error")
11631186 else fraction((totalGet - sumOfGetAssets), scale8, sumOfGetAssets)
11641187 $Tuple2(nil, $Tuple3(totalGet, feeAmount, bonus))
11651188 }
11661189
11671190
11681191
11691192 @Callable(i)
11701193 func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = {
11711194 let r = cg(i)
11721195 let outAmAmt = r._1
11731196 let outPrAmt = r._2
11741197 let pmtAmt = r._3
11751198 let pmtAssetId = r._4
11761199 let state = r._5
11771200 if ((noLessThenAmtAsset > outAmAmt))
11781201 then throw(((("Failed: " + toString(outAmAmt)) + " < ") + toString(noLessThenAmtAsset)))
11791202 else if ((noLessThenPriceAsset > outPrAmt))
11801203 then throw(((("Failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset)))
11811204 else {
11821205 let burnLPAssetOnFactory = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
11831206 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
11841207 then {
1185- let $t04135941440 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1186- let refreshDLpActions = $t04135941440._1
1187- let updatedDLp = $t04135941440._2
1188- (state ++ refreshDLpActions)
1208+ let $t04207542156 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1209+ let refreshDLpActions = $t04207542156._1
1210+ let updatedDLp = $t04207542156._2
1211+ let isUpdatedDLpValid = validateUpdatedDLp(updatedDLp)
1212+ if ((isUpdatedDLpValid == isUpdatedDLpValid))
1213+ then (state ++ refreshDLpActions)
1214+ else throw("Strict value is not equal to itself.")
11891215 }
11901216 else throw("Strict value is not equal to itself.")
11911217 }
11921218 }
11931219
11941220
11951221
11961222 @Callable(i)
11971223 func unstakeAndGet (amount) = {
11981224 let checkPayments = if ((size(i.payments) != 0))
11991225 then throw("No pmnts expd")
12001226 else true
12011227 if ((checkPayments == checkPayments))
12021228 then {
12031229 let cfg = gpc()
12041230 let factoryCfg = gfc()
12051231 let lpAssetId = fromBase58String(cfg[idxLPAsId])
12061232 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
12071233 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), amount], nil)
12081234 if ((unstakeInv == unstakeInv))
12091235 then {
12101236 let r = ego(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
12111237 let outAmAmt = r._1
12121238 let outPrAmt = r._2
12131239 let sts = parseIntValue(r._9)
12141240 let state = r._10
12151241 let v = if (if (igs())
12161242 then true
12171243 else (sts == PoolShutdown))
12181244 then throw(("Blocked: " + toString(sts)))
12191245 else true
12201246 if ((v == v))
12211247 then {
12221248 let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
12231249 if ((burnA == burnA))
12241250 then {
1225- let $t04235342434 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1226- let refreshDLpActions = $t04235342434._1
1227- let updatedDLp = $t04235342434._2
1228- (state ++ refreshDLpActions)
1251+ let $t04313043211 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1252+ let refreshDLpActions = $t04313043211._1
1253+ let updatedDLp = $t04313043211._2
1254+ let isUpdatedDLpValid = validateUpdatedDLp(updatedDLp)
1255+ if ((isUpdatedDLpValid == isUpdatedDLpValid))
1256+ then (state ++ refreshDLpActions)
1257+ else throw("Strict value is not equal to itself.")
12291258 }
12301259 else throw("Strict value is not equal to itself.")
12311260 }
12321261 else throw("Strict value is not equal to itself.")
12331262 }
12341263 else throw("Strict value is not equal to itself.")
12351264 }
12361265 else throw("Strict value is not equal to itself.")
12371266 }
12381267
12391268
12401269
12411270 @Callable(i)
12421271 func unstakeAndGetNoLess (unstakeAmount,noLessThenAmountAsset,noLessThenPriceAsset) = {
12431272 let isGetDisabled = if (igs())
12441273 then true
12451274 else (cfgPoolStatus == PoolShutdown)
12461275 let checks = [if (!(isGetDisabled))
12471276 then true
12481277 else throw("get operation is blocked by admin"), if ((size(i.payments) == 0))
12491278 then true
12501279 else throw("no payments are expected")]
12511280 if ((checks == checks))
12521281 then {
12531282 let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(cfgLpAssetId), unstakeAmount], nil)
12541283 if ((unstakeInv == unstakeInv))
12551284 then {
12561285 let res = ego(toBase58String(i.transactionId), toBase58String(cfgLpAssetId), unstakeAmount, i.caller)
12571286 let outAmAmt = res._1
12581287 let outPrAmt = res._2
12591288 let state = res._10
12601289 let checkAmounts = [if ((outAmAmt >= noLessThenAmountAsset))
12611290 then true
12621291 else throw(makeString(["amount asset amount to receive is less than ", toString(noLessThenAmountAsset)], "")), if ((outPrAmt >= noLessThenPriceAsset))
12631292 then true
12641293 else throw(makeString(["price asset amount to receive is less than ", toString(noLessThenPriceAsset)], ""))]
12651294 if ((checkAmounts == checkAmounts))
12661295 then {
12671296 let burnLPAssetOnFactory = invoke(fca, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
12681297 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
12691298 then {
1270- let $t04353243613 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1271- let refreshDLpActions = $t04353243613._1
1272- let updatedDLp = $t04353243613._2
1273- (state ++ refreshDLpActions)
1299+ let $t04437044451 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1300+ let refreshDLpActions = $t04437044451._1
1301+ let updatedDLp = $t04437044451._2
1302+ let isUpdatedDLpValid = validateUpdatedDLp(updatedDLp)
1303+ if ((isUpdatedDLpValid == isUpdatedDLpValid))
1304+ then (state ++ refreshDLpActions)
1305+ else throw("Strict value is not equal to itself.")
12741306 }
12751307 else throw("Strict value is not equal to itself.")
12761308 }
12771309 else throw("Strict value is not equal to itself.")
12781310 }
12791311 else throw("Strict value is not equal to itself.")
12801312 }
12811313 else throw("Strict value is not equal to itself.")
12821314 }
12831315
12841316
12851317
12861318 @Callable(i)
12871319 func unstakeAndGetOneTknV2 (unstakeAmount,outAssetId,minOutAmount) = {
12881320 let isPoolOneTokenOperationsDisabled = {
12891321 let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
12901322 if ($isInstanceOf(@, "Boolean"))
12911323 then @
12921324 else throw(($getType(@) + " couldn't be cast to Boolean"))
12931325 }
12941326 let isGetDisabled = if (if (igs())
12951327 then true
12961328 else (cfgPoolStatus == PoolShutdown))
12971329 then true
12981330 else isPoolOneTokenOperationsDisabled
12991331 let checks = [if (if (!(isGetDisabled))
13001332 then true
13011333 else isManager(i))
13021334 then true
13031335 else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 0))
13041336 then true
13051337 else throwErr("no payments are expected")]
13061338 if ((checks == checks))
13071339 then {
13081340 let cfg = gpc()
13091341 let factoryCfg = gfc()
13101342 let lpAssetId = fromBase58String(cfg[idxLPAsId])
13111343 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
13121344 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), unstakeAmount], nil)
13131345 if ((unstakeInv == unstakeInv))
13141346 then {
1315- let $t04447444662 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1316- let state = $t04447444662._1
1317- let totalAmount = $t04447444662._2
1347+ let $t04537345561 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1348+ let state = $t04537345561._1
1349+ let totalAmount = $t04537345561._2
13181350 $Tuple2(state, totalAmount)
13191351 }
13201352 else throw("Strict value is not equal to itself.")
13211353 }
13221354 else throw("Strict value is not equal to itself.")
13231355 }
13241356
13251357
13261358
13271359 @Callable(i)
13281360 func putOneTknV2WithBonusREADONLY (paymentAmountRaw,paymentAssetId) = {
13291361 let poolConfig = gpc()
13301362 let amId = poolConfig[idxAmAsId]
13311363 let prId = poolConfig[idxPrAsId]
13321364 let lpId = poolConfig[idxLPAsId]
1333- let $t04492145024 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1334- let lpAmount = $t04492145024._1
1335- let state = $t04492145024._2
1336- let feeAmount = $t04492145024._3
1337- let bonus = $t04492145024._4
1365+ let $t04582045923 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1366+ let lpAmount = $t04582045923._1
1367+ let state = $t04582045923._2
1368+ let feeAmount = $t04582045923._3
1369+ let bonus = $t04582045923._4
13381370 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
13391371 }
13401372
13411373
13421374
13431375 @Callable(i)
13441376 func putOneTknV2WithoutTakeFeeREADONLY (paymentAmountRaw,paymentAssetId) = {
13451377 let poolConfig = gpc()
13461378 let amId = poolConfig[idxAmAsId]
13471379 let prId = poolConfig[idxPrAsId]
13481380 let lpId = poolConfig[idxLPAsId]
1349- let $t04530345407 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1350- let lpAmount = $t04530345407._1
1351- let state = $t04530345407._2
1352- let feeAmount = $t04530345407._3
1353- let bonus = $t04530345407._4
1381+ let $t04620246306 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1382+ let lpAmount = $t04620246306._1
1383+ let state = $t04620246306._2
1384+ let feeAmount = $t04620246306._3
1385+ let bonus = $t04620246306._4
13541386 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
13551387 }
13561388
13571389
13581390
13591391 @Callable(i)
13601392 func activate (amtAsStr,prAsStr) = if ((toString(i.caller) != toString(fca)))
13611393 then throw("denied")
13621394 else $Tuple2([StringEntry(aa(), amtAsStr), StringEntry(pa(), prAsStr)], "success")
13631395
13641396
13651397
13661398 @Callable(i)
13671399 func setS (k,v) = if ((toString(i.caller) != strf(this, ada())))
13681400 then pd
13691401 else [StringEntry(k, v)]
13701402
13711403
13721404
13731405 @Callable(i)
13741406 func setI (k,v) = if ((toString(i.caller) != strf(this, ada())))
13751407 then pd
13761408 else [IntegerEntry(k, v)]
13771409
13781410
13791411
13801412 @Callable(i)
13811413 func getPoolConfigWrapperREADONLY () = $Tuple2(nil, gpc())
13821414
13831415
13841416
13851417 @Callable(i)
13861418 func getAccBalanceWrapperREADONLY (assetId) = $Tuple2(nil, getAccBalance(assetId))
13871419
13881420
13891421
13901422 @Callable(i)
13911423 func calcPricesWrapperREADONLY (amAmt,prAmt,lpAmt) = {
13921424 let pr = calcPrices(amAmt, prAmt, lpAmt)
13931425 $Tuple2(nil, [toString(pr[0]), toString(pr[1]), toString(pr[2])])
13941426 }
13951427
13961428
13971429
13981430 @Callable(i)
13991431 func fromX18WrapperREADONLY (val,resScaleMult) = $Tuple2(nil, f1(parseBigIntValue(val), resScaleMult))
14001432
14011433
14021434
14031435 @Callable(i)
14041436 func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(t1(origVal, origScaleMult)))
14051437
14061438
14071439
14081440 @Callable(i)
14091441 func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(cpbi(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
14101442
14111443
14121444
14131445 @Callable(i)
14141446 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, ""))
14151447
14161448
14171449
14181450 @Callable(i)
14191451 func estimateGetOperationWrapperREADONLY (txId58,pmtAsId,pmtLpAmt,usrAddr) = {
14201452 let r = ego(txId58, pmtAsId, pmtLpAmt, addressFromStringValue(usrAddr))
14211453 $Tuple2(nil, $Tuple10(r._1, r._2, r._3, r._4, r._5, r._6, r._7, toString(r._8), r._9, r._10))
14221454 }
14231455
14241456
14251457
14261458 @Callable(i)
14271459 func getFeeREADONLY () = $Tuple2(nil, fee)
14281460
14291461
14301462 @Verifier(tx)
14311463 func verify () = {
14321464 let targetPublicKey = match m() {
14331465 case pk: ByteVector =>
14341466 pk
14351467 case _: Unit =>
14361468 tx.senderPublicKey
14371469 case _ =>
14381470 throw("Match error")
14391471 }
14401472 match tx {
14411473 case order: Order =>
14421474 let matcherPub = mp()
14431475 let orderValid = moa(order)
14441476 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
14451477 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
14461478 if (if (if (orderValid)
14471479 then senderValid
14481480 else false)
14491481 then matcherValid
14501482 else false)
14511483 then true
14521484 else toe(orderValid, senderValid, matcherValid)
14531485 case s: SetScriptTransaction =>
14541486 let newHash = blake2b256(value(s.script))
14551487 let allowedHash = fromBase64String(value(getString(fca, keyAllowedLpStableScriptHash())))
14561488 let currentHash = scriptHash(this)
14571489 if (if ((allowedHash == newHash))
14581490 then (currentHash != newHash)
14591491 else false)
14601492 then true
14611493 else sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
14621494 case _ =>
14631495 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
14641496 }
14651497 }
14661498

github/deemru/w8io/169f3d6 
211.00 ms