tx · 2298qTJyRiuEaCgi2LcZH5g4TgvX65H1H3eP2cjm4QeM

3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT:  -0.03600000 Waves

2022.12.07 15:43 [2349940] smart account 3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT > SELF 0.00000000 Waves

{ "type": 13, "id": "2298qTJyRiuEaCgi2LcZH5g4TgvX65H1H3eP2cjm4QeM", "fee": 3600000, "feeAssetId": null, "timestamp": 1670417022409, "version": 1, "sender": "3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT", "senderPublicKey": "D1BL65meykxFZTCuq7jq9HSGLLnWvQamQPUNrguW5w39", "proofs": [ "XSniYRM8TSPWvXr5CzMfCN4rzcVbWhKgp8FVoczQEzyVifsXa7HKi7H3VJXJk1t7PhRbXkhapq4rUWuRSUyDLbe" ], "script": "base64:BgLUKAgCEgMKAQgSAwoBCBIAEgQKAgEEEgQKAgEEEgMKAQESABIECgIIARIAEgQKAggBEgQKAggBEgQKAgEBEgMKAQESBQoDAQEBEgUKAwEIARIECgIBCBIECgIBCBIECgIICBIECgIICBIECgIIARIAEgMKAQgSBQoDAQEBEgQKAggBEgQKAgEBEgQKAggIEgsKCQgBAQIBAggEBBIGCgQICAEIEgAiBnNjYWxlOCIMc2NhbGU4QmlnSW50IgdzY2FsZTE4Igp6ZXJvQmlnSW50IgRiaWcwIgRiaWcxIgRiaWcyIgRiaWczIgRiaWc0IgpzbGlwcGFnZTREIgt3YXZlc1N0cmluZyIFQW11bHQiBURjb252IgNTRVAiBUVNUFRZIgpQb29sQWN0aXZlIgpQb29sUHV0RGlzIg5Qb29sTWF0Y2hlckRpcyIMUG9vbFNodXRkb3duIg5pZHhQb29sQWRkcmVzcyIJaWR4UG9vbFN0IglpZHhMUEFzSWQiCWlkeEFtQXNJZCIJaWR4UHJBc0lkIgtpZHhBbXRBc0RjbSINaWR4UHJpY2VBc0RjbSILaWR4SUFtdEFzSWQiDWlkeElQcmljZUFzSWQiD2lkeEZhY3RTdGFrQ250ciISaWR4RmFjdG9yeVJlc3RDbnRyIhBpZHhGYWN0U2xpcHBDbnRyIhFpZHhGYWN0R3d4UmV3Q250ciIKZmVlRGVmYXVsdCICdDEiB29yaWdWYWwiDW9yaWdTY2FsZU11bHQiAmYxIgN2YWwiD3Jlc3VsdFNjYWxlTXVsdCICdHMiA2FtdCIIcmVzU2NhbGUiCGN1clNjYWxlIgNhYnMiCWFic0JpZ0ludCICZmMiA21wayIEcG1wayICcGwiAnBoIgFoIgF0IgNwYXUiAnVhIgR0eElkIgNnYXUiAmFhIgJwYSIDYW1wIgNhZGEiBmtleUZlZSIDZmVlIgZrZXlETHAiFWtleURMcFJlZnJlc2hlZEhlaWdodCISa2V5RExwUmVmcmVzaERlbGF5IhZkTHBSZWZyZXNoRGVsYXlEZWZhdWx0Ig9kTHBSZWZyZXNoRGVsYXkiBGZjZmciBG10cGsiAnBjIgZpQW10QXMiBWlQckFzIgNtYmEiBWJBU3RyIgNhcHMiHGtleUFsbG93ZWRMcFN0YWJsZVNjcmlwdEhhc2giFmtleUZlZUNvbGxlY3RvckFkZHJlc3MiA3RvZSIDb3JWIgZzZW5kclYiBm1hdGNoViIDc3RyIgckbWF0Y2gwIgZ2YWxTdHIiBHN0cmYiBGFkZHIiA2tleSIEaW50ZiIIdGhyb3dFcnIiA21zZyIGZm10RXJyIgNmY2EiAUEiA2lncyICbXAiE2ZlZUNvbGxlY3RvckFkZHJlc3MiA2dwYyIFYW10QXMiB3ByaWNlQXMiCGlQcmljZUFzIgxwYXJzZUFzc2V0SWQiBWlucHV0Ig9hc3NldElkVG9TdHJpbmciD3BhcnNlUG9vbENvbmZpZyIKcG9vbENvbmZpZyIQcG9vbENvbmZpZ1BhcnNlZCILJHQwNzI1NTc0NDEiDmNmZ1Bvb2xBZGRyZXNzIg1jZmdQb29sU3RhdHVzIgxjZmdMcEFzc2V0SWQiEGNmZ0Ftb3VudEFzc2V0SWQiD2NmZ1ByaWNlQXNzZXRJZCIWY2ZnQW1vdW50QXNzZXREZWNpbWFscyIVY2ZnUHJpY2VBc3NldERlY2ltYWxzIgNnZmMiDWZhY3RvcnlDb25maWciD3N0YWtpbmdDb250cmFjdCIPc2xpcGFnZUNvbnRyYWN0Igtnd3hDb250cmFjdCIMcmVzdENvbnRyYWN0IhFkYXRhUHV0QWN0aW9uSW5mbyINaW5BbXRBc3NldEFtdCIPaW5QcmljZUFzc2V0QW10IghvdXRMcEFtdCIFcHJpY2UiCnNsaXBCeVVzZXIiDHNsaXBwYWdlUmVhbCIIdHhIZWlnaHQiC3R4VGltZXN0YW1wIgxzbGlwYWdlQW1BbXQiDHNsaXBhZ2VQckFtdCIRZGF0YUdldEFjdGlvbkluZm8iDm91dEFtdEFzc2V0QW10IhBvdXRQcmljZUFzc2V0QW10IgdpbkxwQW10Ig1nZXRBY2NCYWxhbmNlIgdhc3NldElkIgRjcGJpIghwckFtdFgxOCIIYW1BbXRYMTgiA3ZhZCICQTEiAkEyIghzbGlwcGFnZSIEZGlmZiIEcGFzcyICdmQiAkQxIgJEMCIEc2xwZyIEZmFpbCIDcGNwIgphbUFzc2V0RGNtIgpwckFzc2V0RGNtIgVhbUFtdCIFcHJBbXQiC2FtdEFzQW10WDE4IgpwckFzQW10WDE4IgpjYWxjUHJpY2VzIgVscEFtdCIDY2ZnIghhbXRBc0RjbSIHcHJBc0RjbSIIcHJpY2VYMTgiCGxwQW10WDE4Ig1scFBySW5BbUFzWDE4Ig1scFBySW5QckFzWDE4Ig9jYWxjdWxhdGVQcmljZXMiAXAiB3Rha2VGZWUiBmFtb3VudCIJZmVlQW1vdW50IgNlZ28iBnR4SWQ1OCIKcG10QXNzZXRJZCIIcG10THBBbXQiC3VzZXJBZGRyZXNzIgRscElkIgRhbUlkIgRwcklkIgVhbURjbSIFcHJEY20iA3N0cyIHbHBFbWlzcyIJYW1CYWxhbmNlIgxhbUJhbGFuY2VYMTgiCXByQmFsYW5jZSIMcHJCYWxhbmNlWDE4IgtjdXJQcmljZVgxOCIIY3VyUHJpY2UiC3BtdExwQW10WDE4IgpscEVtaXNzWDE4IgtvdXRBbUFtdFgxOCILb3V0UHJBbXRYMTgiCG91dEFtQW10IghvdXRQckFtdCIFc3RhdGUiA2VwbyIHaW5BbUFtdCIGaW5BbUlkIgdpblByQW10IgZpblBySWQiBmlzRXZhbCIGZW1pdExwIgppc09uZUFzc2V0IhB2YWxpZGF0ZVNsaXBwYWdlIgZwbXRBbXQiBXBtdElkIgdhbUlkU3RyIgdwcklkU3RyIglpbkFtSWRTdHIiCWluUHJJZFN0ciIGYW10RGNtIghwcmljZURjbSIEbHBFbSIPaW5BbUFzc2V0QW10WDE4Ig9pblByQXNzZXRBbXRYMTgiDHVzZXJQcmljZVgxOCIBciILc2xpcHBhZ2VYMTgiD3NsaXBwYWdlUmVhbFgxOCINbHBFbWlzc2lvblgxOCIKcHJWaWFBbVgxOCIKYW1WaWFQclgxOCIMZXhwZWN0ZWRBbXRzIhFleHBBbXRBc3NldEFtdFgxOCITZXhwUHJpY2VBc3NldEFtdFgxOCIJY2FsY0xwQW10Ig5jYWxjQW1Bc3NldFBtdCIOY2FsY1ByQXNzZXRQbXQiDHNsaXBwYWdlQ2FsYyIJZW1pdExwQW10IgZhbURpZmYiBnByRGlmZiINJHQwMTc4NzIxODIxNyIKd3JpdGVBbUFtdCIKd3JpdGVQckFtdCILY29tbW9uU3RhdGUiBGdldEQiAnhwIgN4cDAiA3hwMSIBcyIBYSIDYW5uIgt4cDBfeHAxX25fbiIFYW5uX3MiBWFubl8xIgljYWxjRE5leHQiAWQiAmRkIgNkZGQiAmRwIgRjYWxjIgNhY2MiAWkiBWROZXh0IghkRGlmZlJhdyIFZERpZmYiA2FyciINJHQwMjAxMjgyMDE3NiICJGwiAiRzIgUkYWNjMCIFJGYwXzEiAiRhIgIkaSIFJGYwXzIiBWZvdW5kIgdnZXRET2xkIgFuIgphUHJlY2lzaW9uIhBhbm5fc19hUHJlY2lzaW9uIg5hbm5fYVByZWNpc2lvbiICbjEiA2N1ciINJHQwMjA4MDUyMDgyNSINJHQwMjEyNDYyMTI5MyIFZ2V0WUQiAUQiAXgiAWMiAWIiDSR0MDIxNzkzMjE4MTMiAXkiBXlOZXh0IgV5RGlmZiINJHQwMjIxMjAyMjE2NyIHY2FsY0RMcCINYW1vdW50QmFsYW5jZSIMcHJpY2VCYWxhbmNlIgpscEVtaXNzaW9uIgVzY2FsZSIKdXBkYXRlZERMcCIOY2FsY0N1cnJlbnRETHAiEGFtb3VudEFzc2V0RGVsdGEiD3ByaWNlQXNzZXREZWx0YSIUbHBBc3NldEVtaXNzaW9uRGVsdGEiEmFtb3VudEFzc2V0QmFsYW5jZSIRcHJpY2VBc3NldEJhbGFuY2UiD2xwQXNzZXRFbWlzc2lvbiIKY3VycmVudERMcCIScmVmcmVzaERMcEludGVybmFsIhdhbW91bnRBc3NldEJhbGFuY2VEZWx0YSIWcHJpY2VBc3NldEJhbGFuY2VEZWx0YSIHYWN0aW9ucyISdmFsaWRhdGVVcGRhdGVkRExwIgZvbGRETHAiG3ZhbGlkYXRlTWF0Y2hlck9yZGVyQWxsb3dlZCIFb3JkZXIiEWFtb3VudEFzc2V0QW1vdW50IhBwcmljZUFzc2V0QW1vdW50Ig0kdDAyNDE0NzI0MzU5IgNkTHAiDSR0MDI0Njg5MjQ3ODkiDXVudXNlZEFjdGlvbnMiBmRMcE5ldyIMaXNPcmRlclZhbGlkIgJjZyIDcG10IgJjcCIGY2FsbGVyIgdhbUFzUG10IgdwckFzUG10Ig1jYWxjUHV0T25lVGtuIglwbXRBbXRSYXciC3dpdGhUYWtlRmVlIg1jaGVjaEVtaXNzaW9uIg0kdDAyNzEwNjI3NTY4IgxhbUJhbGFuY2VPbGQiDHByQmFsYW5jZU9sZCINJHQwMjc1NzQyNzc1MCILYW1BbW91bnRSYXciC3ByQW1vdW50UmF3Ig0kdDAyNzc1NDI3OTkzIghhbUFtb3VudCIIcHJBbW91bnQiDGFtQmFsYW5jZU5ldyIMcHJCYWxhbmNlTmV3IgZjaGVja0QiCGxwQW1vdW50Ig5wb29sUHJvcG9ydGlvbiIPYW1vdW50QXNzZXRQYXJ0Ig5wcmljZUFzc2V0UGFydCIJbHBBbXRCb3RoIgVib251cyITZ2V0T25lVGtuVjJJbnRlcm5hbCIKb3V0QXNzZXRJZCIMbWluT3V0QW1vdW50IghwYXltZW50cyIMb3JpZ2luQ2FsbGVyIg10cmFuc2FjdGlvbklkIgphbURlY2ltYWxzIgpwckRlY2ltYWxzIgpwb29sU3RhdHVzIg0kdDAzMDA1MTMwMTYyIgFAIgh0b3RhbEdldCILdG90YWxBbW91bnQiDSR0MDMwMzUyMzA2NTkiBW91dEFtIgVvdXRQciIIY3VyUHJYMTgiBWN1clByIhFvdXRBc3NldElkT3JXYXZlcyIQc2VuZEZlZVRvTWF0Y2hlciIEYnVybiINJHQwMzE0NDQzMTc5NCIQZmVlQW1vdW50Rm9yQ2FsYyIQb3V0SW5BbW91bnRBc3NldCINJHQwMzE3OTczMTkwNSIRcmVmcmVzaERMcEFjdGlvbnMiEWlzVXBkYXRlZERMcFZhbGlkIgFtIgJwbSICcGQiCWlzTWFuYWdlciICcGsiAm1tIhdwZW5kaW5nTWFuYWdlclB1YmxpY0tleSICY20iA2hwbSIDY3BtIgRzbGlwIglhdXRvU3Rha2UiB2ZhY3RDZmciC3N0YWtpbmdDbnRyIghzbGlwQ250ciIKYW1Bc3NldFBtdCIKcHJBc3NldFBtdCIBZSIJbHBBc3NldElkIgJlbCIGbGVnYWN5IgJzYSICc3AiCGxwVHJuc2ZyIgJzcyINJHQwMzU3NjEzNTgyNiIgaXNQb29sT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWQiDWlzUHV0RGlzYWJsZWQiBmNoZWNrcyINJHQwMzY5NjMzNzEyMSIHZXN0aW1MUCINJHQwMzc5MzYzODI4NSIUcGF5bWVudEluQW1vdW50QXNzZXQiDSR0MDM4Mjg4MzgzOTYiB21heFNscGciBmVzdFB1dCINJHQwMzkzNTUzOTQyMCIJb3V0QW10QW10Ig0kdDA0MDIwOTQwMjkxIg1pc0dldERpc2FibGVkIg0kdDA0MDkwOTQxMDY0IhhsYXN0UmVmcmVzaGVkQmxvY2tIZWlnaHQiHWNoZWNrTGFzdFJlZnJlc2hlZEJsb2NrSGVpZ2h0Ig0kdDA0MTU4ODQxNjUyIhBkTHBVcGRhdGVBY3Rpb25zIg1scEFzc2V0QW1vdW50IgVpbmRleCIEbmV3WSICZHkiC3RvdGFsR2V0UmF3Ig0kdDA0MjU1MjQyNjAxIg0kdDA0Mjk0NjQzMDYxIg5zdW1PZkdldEFzc2V0cyISbm9MZXNzVGhlbkFtdEFzc2V0IhRub0xlc3NUaGVuUHJpY2VBc3NldCIUYnVybkxQQXNzZXRPbkZhY3RvcnkiDSR0MDQ0MjI5NDQzMTAiDWNoZWNrUGF5bWVudHMiCmZhY3RvcnlDZmciB3N0YWtpbmciCnVuc3Rha2VJbnYiAXYiBWJ1cm5BIg0kdDA0NTM3MzQ1NDU0Ig11bnN0YWtlQW1vdW50IhVub0xlc3NUaGVuQW1vdW50QXNzZXQiA3JlcyIMY2hlY2tBbW91bnRzIg0kdDA0NjcwMjQ2NzgzIg0kdDA0NzcxNzQ3OTA1IhBwYXltZW50QW1vdW50UmF3Ig5wYXltZW50QXNzZXRJZCINJHQwNDgxNjQ0ODI2NyINJHQwNDg1NDY0ODY1MCIIYW10QXNTdHIiB3ByQXNTdHIiAWsiAnByIgxyZXNTY2FsZU11bHQiB3VzckFkZHIiB3BtdEFzSWQiAnR4IgZ2ZXJpZnkiD3RhcmdldFB1YmxpY0tleSIKbWF0Y2hlclB1YiIKb3JkZXJWYWxpZCILc2VuZGVyVmFsaWQiDG1hdGNoZXJWYWxpZCIHbmV3SGFzaCILYWxsb3dlZEhhc2giC2N1cnJlbnRIYXNoegABYQCAwtcvAAFiCQC2AgEAgMLXLwABYwkAtgIBAICAkLu61q3wDQABZAkAtgIBAAAAAWUJALYCAQAAAAFmCQC2AgEAAQABZwkAtgIBAAIAAWgJALYCAQADAAFpCQC2AgEABAABagkAtgIBCQBlAgUBYQkAaQIJAGgCBQFhAAEFAWEAAWsCBVdBVkVTAAFsAgMxMDAAAW0CATEAAW4CAl9fAAFvAgAAAXAAAQABcQACAAFyAAMAAXMABAABdAABAAF1AAIAAXYAAwABdwAEAAF4AAUAAXkABgABegAHAAFBAAgAAUIACQABQwABAAFEAAYAAUUABwABRgAKAAFHCQBrAwAKBQFhAJBOAQFIAgFJAUoJALwCAwkAtgIBBQFJBQFjCQC2AgEFAUoBAUsCAUwBTQkAoAMBCQC8AgMFAUwJALYCAQUBTQUBYwEBTgMBTwFQAVEJAGsDBQFPBQFQBQFRAQFSAQFMAwkAvwICBQFkBQFMCQC+AgEFAUwFAUwBAVMBAUwDCQC/AgIFAWQFAUwJAL4CAQUBTAUBTAEBVAACEyVzX19mYWN0b3J5Q29udHJhY3QBAVUAAhQlc19fbWFuYWdlclB1YmxpY0tleQEBVgACGyVzX19wZW5kaW5nTWFuYWdlclB1YmxpY0tleQEBVwACESVzJXNfX3ByaWNlX19sYXN0AQFYAgFZAVoJALkJAgkAzAgCAhglcyVzJWQlZF9fcHJpY2VfX2hpc3RvcnkJAMwIAgkApAMBBQFZCQDMCAIJAKQDAQUBWgUDbmlsBQFuAQJhYQICYWICYWMJAKwCAgkArAICCQCsAgICCyVzJXMlc19fUF9fBQJhYgICX18FAmFjAQJhZAICYWICYWMJAKwCAgkArAICCQCsAgICCyVzJXMlc19fR19fBQJhYgICX18FAmFjAQJhZQACDyVzX19hbW91bnRBc3NldAECYWYAAg4lc19fcHJpY2VBc3NldAECYWcAAgclc19fYW1wAQJhaAACDSVzX19hZGRvbkFkZHIAAmFpAgclc19fZmVlAAJhagkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQJhaQUBRwACYWsJALkJAgkAzAgCAgIlcwkAzAgCAgNkTHAFA25pbAUBbgACYWwJALkJAgkAzAgCAgIlcwkAzAgCAhJkTHBSZWZyZXNoZWRIZWlnaHQFA25pbAUBbgACYW0JALkJAgkAzAgCAgIlcwkAzAgCAg9yZWZyZXNoRExwRGVsYXkFA25pbAUBbgACYW4AAQACYW8JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUCYW0FAmFuAQJhcAACESVzX19mYWN0b3J5Q29uZmlnAQJhcQACGCVzJXNfX21hdGNoZXJfX3B1YmxpY0tleQECYXICAmFzAmF0CQCsAgIJAKwCAgkArAICCQCsAgICCCVkJWQlc19fBQJhcwICX18FAmF0AghfX2NvbmZpZwECYXUBAmF2CQCsAgICKCVzJXMlc19fbWFwcGluZ3NfX2Jhc2VBc3NldDJpbnRlcm5hbElkX18FAmF2AQJhdwACDCVzX19zaHV0ZG93bgECYXgAAh0lc19fYWxsb3dlZExwU3RhYmxlU2NyaXB0SGFzaAECYXkAAhclc19fZmVlQ29sbGVjdG9yQWRkcmVzcwECYXoDAmFBAmFCAmFDCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICEUZhaWxlZDogb3JkVmFsaWQ9CQClAwEFAmFBAgsgc25kclZhbGlkPQkApQMBBQJhQgIMIG10Y2hyVmFsaWQ9CQClAwEFAmFDAQJhRAEBTAQCYUUFAUwDCQABAgUCYUUCBlN0cmluZwQCYUYFAmFFBQJhRgkAAgECE2ZhaWwgY2FzdCB0byBTdHJpbmcBAmFHAgJhSAJhSQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFAmFIBQJhSQkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQJhSAkAzAgCAgEuCQDMCAIFAmFJCQDMCAICDCBub3QgZGVmaW5lZAUDbmlsAgABAmFKAgJhSAJhSQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFAmFIBQJhSQkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQJhSAkAzAgCAgEuCQDMCAIFAmFJCQDMCAICDCBub3QgZGVmaW5lZAUDbmlsAgABAmFLAQJhTAkAAgEJALkJAgkAzAgCAg9scF9zdGFibGUucmlkZToJAMwIAgUCYUwFA25pbAIBIAECYU0BAmFMCQC5CQIJAMwIAgIPbHBfc3RhYmxlLnJpZGU6CQDMCAIFAmFMBQNuaWwCASAAAmFOCQERQGV4dHJOYXRpdmUoMTA2MikBCQECYUcCBQR0aGlzCQEBVAAAAmFPCQECYUcCBQR0aGlzCQECYWcAAQJhUAAJAQt2YWx1ZU9yRWxzZQIJAJsIAgUCYU4JAQJhdwAHAQJhUQAJANkEAQkBAmFHAgUCYU4JAQJhcQAAAmFSCQERQGV4dHJOYXRpdmUoMTA2MikBCQECYUcCBQJhTgkBAmF5AAECYVMABAJhVAkBAmFHAgUEdGhpcwkBAmFlAAQCYVUJAQJhRwIFBHRoaXMJAQJhZgAEAmFWCQECYUoCBQJhTgkBAmF1AQUCYVUEAmFzCQECYUoCBQJhTgkBAmF1AQUCYVQJALUJAgkBAmFHAgUCYU4JAQJhcgIJAKQDAQUCYXMJAKQDAQUCYVYFAW4BAmFXAQJhWAMJAAACBQJhWAUBawUEdW5pdAkA2QQBBQJhWAECYVkBAmFYAwkAAAIFAmFYBQR1bml0BQFrCQDYBAEJAQV2YWx1ZQEFAmFYAQJhWgECYmEJAJkKBwkBEUBleHRyTmF0aXZlKDEwNjIpAQkAkQMCBQJiYQUBdAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJhBQF1CQDZBAEJAJEDAgUCYmEFAXYJAQJhVwEJAJEDAgUCYmEFAXcJAQJhVwEJAJEDAgUCYmEFAXgJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJiYQUBeQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJhBQF6AAJiYgkBAmFaAQkBAmFTAAACYmMFAmJiAAJiZAgFAmJjAl8xAAJiZQgFAmJjAl8yAAJiZggFAmJjAl8zAAJiZwgFAmJjAl80AAJiaAgFAmJjAl81AAJiaQgFAmJjAl82AAJiaggFAmJjAl83AQJiawAJALUJAgkBAmFHAgUCYU4JAQJhcAAFAW4AAmJsCQECYmsAAAJibQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCYmwFAUMCIEludmFsaWQgc3Rha2luZyBjb250cmFjdCBhZGRyZXNzAAJibgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCYmwFAUUCIEludmFsaWQgc2xpcGFnZSBjb250cmFjdCBhZGRyZXNzAAJibwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCYmwFAUYCHEludmFsaWQgZ3d4IGNvbnRyYWN0IGFkZHJlc3MAAmJwCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJibAUBRAIcSW52YWxpZCBnd3ggY29udHJhY3QgYWRkcmVzcwECYnEKAmJyAmJzAmJ0AmJ1AmJ2AmJ3AmJ4AmJ5AmJ6AmJBCQC5CQIJAMwIAgIUJWQlZCVkJWQlZCVkJWQlZCVkJWQJAMwIAgkApAMBBQJicgkAzAgCCQCkAwEFAmJzCQDMCAIJAKQDAQUCYnQJAMwIAgkApAMBBQJidQkAzAgCCQCkAwEFAmJ2CQDMCAIJAKQDAQUCYncJAMwIAgkApAMBBQJieAkAzAgCCQCkAwEFAmJ5CQDMCAIJAKQDAQUCYnoJAMwIAgkApAMBBQJiQQUDbmlsBQFuAQJiQgYCYkMCYkQCYkUCYnUCYngCYnkJALkJAgkAzAgCAgwlZCVkJWQlZCVkJWQJAMwIAgkApAMBBQJiQwkAzAgCCQCkAwEFAmJECQDMCAIJAKQDAQUCYkUJAMwIAgkApAMBBQJidQkAzAgCCQCkAwEFAmJ4CQDMCAIJAKQDAQUCYnkFA25pbAUBbgECYkYBAmJHAwkAAAIFAmJHAgVXQVZFUwgJAO8HAQUEdGhpcwlhdmFpbGFibGUJAPAHAgUEdGhpcwkA2QQBBQJiRwECYkgCAmJJAmJKCQC8AgMFAmJJBQFjBQJiSgECYksDAmJMAmJNAmJOBAJiTwkAvAIDCQC4AgIFAmJMBQJiTQUBYgUCYk0EAmJQCQC/AgIJALgCAgUCYk4JAQFSAQUCYk8FAWQDCQEBIQEFAmJQCQACAQkArAICAgpCaWcgc2xwZzogCQCmAwEFAmJPCQCUCgIFAmJQCQCZAwEJAMwIAgUCYkwJAMwIAgUCYk0FA25pbAECYlEDAmJSAmJTAmJUBAJiTwkAvAIDBQJiUwUBYgUCYlIEAmJVCQC/AgIFAmJUBQJiTwMDBQJiVQYJAL8CAgUCYlMFAmJSCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApgMBBQJiUwIBIAkApgMBBQJiUgIBIAkApgMBBQJiTwIBIAkApgMBBQJiVAUCYlUBAmJWBAJiVwJiWAJiWQJiWgQCY2EJAQFIAgUCYlkFAmJXBAJjYgkBAUgCBQJiWgUCYlgJAQJiSAIFAmNiBQJjYQECY2MDAmJZAmJaAmNkBAJjZQkBAmFTAAQCY2YJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJjZQUBeQQCY2cJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJjZQUBegQCY2gJAQJiVgQFAmNmBQJjZwUCYlkFAmJaBAJiSgkBAUgCBQJiWQUCY2YEAmJJCQEBSAIFAmJaBQJjZwQCY2kJAQFIAgUCY2QFAWEEAmNqCQECYkgCBQJiSgUCY2kEAmNrCQECYkgCBQJiSQUCY2kJAMwIAgUCY2gJAMwIAgUCY2oJAMwIAgUCY2sFA25pbAECY2wDAmJZAmJaAmNkBAJjbQkBAmNjAwUCYlkFAmJaBQJjZAkAzAgCCQEBSwIJAJEDAgUCY20AAAUBYQkAzAgCCQEBSwIJAJEDAgUCY20AAQUBYQkAzAgCCQEBSwIJAJEDAgUCY20AAgUBYQUDbmlsAQJjbgECY28EAmNwCQBrAwUCY28FAmFqBQFhCQCUCgIJAGUCBQJjbwUCY3AFAmNwAQJjcQQCY3ICY3MCY3QCY3UEAmNlCQECYVMABAJjdgkAkQMCBQJjZQUBdgQCY3cJAJEDAgUCY2UFAXcEAmN4CQCRAwIFAmNlBQF4BAJjeQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmNlBQF5BAJjegkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmNlBQF6BAJjQQkAkQMCBQJjZQUBdQQCY0IICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQJjdgILV3JvbmcgTFAgaWQIcXVhbnRpdHkDCQECIT0CBQJjdgUCY3MJAAIBAg9Xcm9uZyBwbXQgYXNzZXQEAmNDCQECYkYBBQJjdwQCY0QJAQFIAgUCY0MFAmN5BAJjRQkBAmJGAQUCY3gEAmNGCQEBSAIFAmNFBQJjegQCY0cJAQJiSAIFAmNGBQJjRAQCY0gJAQFLAgUCY0cFAWEEAmNJCQEBSAIFAmN0BQFhBAJjSgkBAUgCBQJjQgUBYQQCY0sJALwCAwUCY0QFAmNJBQJjSgQCY0wJALwCAwUCY0YFAmNJBQJjSgQCY00JAQFLAgUCY0sFAmN5BAJjTgkBAUsCBQJjTAUCY3oEAmNPAwkAAAIFAmNyAgAFA25pbAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJjdQUCY00DCQAAAgUCY3cCBVdBVkVTBQR1bml0CQDZBAEFAmN3CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmN1BQJjTgMJAAACBQJjeAIFV0FWRVMFBHVuaXQJANkEAQUCY3gJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFkAgkApQgBBQJjdQUCY3IJAQJiQgYFAmNNBQJjTgUCY3QFAmNIBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBVwAFAmNICQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBWAIFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFAmNIBQNuaWwJAJwKCgUCY00FAmNOBQJjdwUCY3gFAmNDBQJjRQUCY0IFAmNHBQJjQQUCY08BAmNQDQJjcgJiTgJjUQJjUgJjUwJjVAJjdQJjVQJjVgJjVwJjWAJjWQJjWgQCY2UJAQJhUwAEAmN2CQDZBAEJAJEDAgUCY2UFAXYEAmRhCQCRAwIFAmNlBQF3BAJkYgkAkQMCBQJjZQUBeAQCZGMJAJEDAgUCY2UFAUEEAmRkCQCRAwIFAmNlBQFCBAJkZQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmNlBQF5BAJkZgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmNlBQF6BAJjQQkAkQMCBQJjZQUBdQQCZGcICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUCY3YCCFdyIGxwIGFzCHF1YW50aXR5BAJjQwMFAmNVCQECYkYBBQJkYQMDBQJjVwkAAAIFAmNaBQJkYQcJAGUCCQECYkYBBQJkYQUCY1kDBQJjVwkBAmJGAQUCZGEJAGUCCQECYkYBBQJkYQUCY1EEAmNFAwUCY1UJAQJiRgEFAmRiAwMFAmNXCQAAAgUCY1oFAmRiBwkAZQIJAQJiRgEFAmRiBQJjWQMFAmNXCQECYkYBBQJkYgkAZQIJAQJiRgEFAmRiBQJjUwQCZGgJAQFIAgUCY1EFAmRlBAJkaQkBAUgCBQJjUwUCZGYEAmRqCQECYkgCBQJkaQUCZGgEAmNECQEBSAIFAmNDBQJkZQQCY0YJAQFIAgUCY0UFAmRmBAJkawMJAAACBQJkZwAABAJjRwUBZAQCZGwFAWQEAmNpCQB2BgkAuQICBQJkaAUCZGkAAAkAtgIBAAUAAQAABQRET1dOCQCXCgUJAQFLAgUCY2kFAWEJAQFLAgUCZGgFAmRlCQEBSwIFAmRpBQJkZgkBAmJIAgkAtwICBQJjRgUCZGkJALcCAgUCY0QFAmRoBQJkbAQCY0cJAQJiSAIFAmNGBQJjRAQCZG0JALwCAwkBAVIBCQC4AgIFAmNHBQJkagUBYwUCY0cEAmRsCQEBSAIFAmJOBQFhAwMDBQJjWAkBAiE9AgUCY0cFAWQHCQC/AgIFAmRtBQJkbAcJAAIBCQCsAgIJAKwCAgkArAICAg9QcmljZSBzbGlwcGFnZSAJAKYDAQUCZG0CAyA+IAkApgMBBQJkbAQCZG4JAQFIAgUCZGcFAWEEAmRvCQC8AgMFAmRoBQJjRwUBYwQCZHAJALwCAwUCZGkFAWMFAmNHBAJkcQMJAL8CAgUCZG8FAmRpCQCUCgIFAmRwBQJkaQkAlAoCBQJkaAUCZG8EAmRyCAUCZHECXzEEAmRzCAUCZHECXzIEAmNpCQC8AgMFAmRuBQJkcwUCY0YJAJcKBQkBAUsCBQJjaQUBYQkBAUsCBQJkcgUCZGUJAQFLAgUCZHMFAmRmBQJjRwUCZGwEAmR0CAUCZGsCXzEEAmR1CAUCZGsCXzIEAmR2CAUCZGsCXzMEAmNICQEBSwIIBQJkawJfNAUBYQQCZHcJAQFLAggFAmRrAl81BQFhAwkAZwIAAAUCZHQJAAIBAgdMUCA8PSAwBAJkeAMJAQEhAQUCY1YAAAUCZHQEAmR5CQBlAgUCY1EFAmR1BAJkegkAZQIFAmNTBQJkdgQCZEEDAwUCY1cJAAACBQJjWgUCZGEHCQCUCgIFAmNZAAADAwUCY1cJAAACBQJjWgUCZGIHCQCUCgIAAAUCY1kJAJQKAgUCZHUFAmR2BAJkQggFAmRBAl8xBAJkQwgFAmRBAl8yBAJkRAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVcABQJjSAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVgCBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQJjSAkAzAgCCQELU3RyaW5nRW50cnkCCQECYWECBQJjdQUCY3IJAQJicQoFAmRCBQJkQwUCZHgFAmNIBQJiTgUCZHcFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFAmR5BQJkegUDbmlsCQCfCg0FAmR0BQJkeAUCY0gFAmNDBQJjRQUCZGcFAmN2BQJjQQUCZEQFAmR5BQJkegUCY1IFAmNUAQJkRQECZEYEAmRHCQCRAwIFAmRGAAAEAmRICQCRAwIFAmRGAAEEAmRJCQC3AgIFAmRHBQJkSAMJAAACBQJkSQUBZQUBZQQCZEoJAQ1wYXJzZUludFZhbHVlAQUCYU8EAmRLCQBoAgUCZEoAAgQCY20JALwCAwUCZEcFAmRIBQFmBAJkTAkAvAIDBQJjbQUBaQUBZgQCZE0JALwCAwkAtgIBBQJkSwUCZEkFAWYEAmROCQC2AgEJAGUCBQJkSwABCgECZE8BAmRQBAJkUQkAvAIDBQJkUAUCZFAFAWYEAmRSCQC8AgMFAmRRBQJkUAUBZgQCZFMJALwCAwUCZFIFAWYFAmRMCQC8AgMJALcCAgUCZE0JALwCAwUCZFMFAWcFAWYFAmRQCQC3AgIJALwCAwUCZE4FAmRQBQFmCQC8AgMFAWgFAmRTBQFmCgECZFQCAmRVAmRWAwgFAmRVAl8yBQJkVQQCZFAIBQJkVQJfMQQCZFcJAQJkTwEFAmRQBAJkWAkAoAMBCQC4AgIFAmRXCQEFdmFsdWUBBQJkUAQCZFkDCQBmAgAABQJkWAkBAS0BBQJkWAUCZFgDCQBnAgABBQJkWQkAlAoCBQJkVwYJAJQKAgUCZFcHBAJkWgkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQkAzAgCAAYJAMwIAgAHCQDMCAIACAkAzAgCAAkJAMwIAgAKCQDMCAIACwkAzAgCAAwJAMwIAgANCQDMCAIADgUDbmlsBAJlYQoAAmViBQJkWgoAAmVjCQCQAwEFAmViCgACZWQJAJQKAgUCZEkHCgECZWUCAmVmAmVnAwkAZwIFAmVnBQJlYwUCZWYJAQJkVAIFAmVmCQCRAwIFAmViBQJlZwoBAmVoAgJlZgJlZwMJAGcCBQJlZwUCZWMFAmVmCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQJlaAIJAQJlZQIJAQJlZQIJAQJlZQIJAQJlZQIJAQJlZQIJAQJlZQIJAQJlZQIJAQJlZQIJAQJlZQIJAQJlZQIJAQJlZQIJAQJlZQIJAQJlZQIJAQJlZQIJAQJlZQIFAmVkAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8EAmRQCAUCZWECXzEEAmVpCAUCZWECXzIDBQJlaQUCZFAJAAIBCQCsAgICGUQgY2FsY3VsYXRpb24gZXJyb3IsIEQgPSAJAKYDAQUCZFABAmVqAQJkRgQCZWsFAWcEAmRHCQCRAwIFAmRGAAAEAmRICQCRAwIFAmRGAAEEAmVsCQCnAwEFAWwEAmRKCQC5AgIJAKcDAQUCYU8FAmVsBAJkSQkAtwICBQJkRwUCZEgDCQAAAgUCZEkFAWUFAWUEAmRLCQC5AgIFAmRKBQJlawQCZEwJALkCAgkAuQICCQC5AgIFAmRHBQJkSAUCZWsFAmVrBAJlbQkAugICCQC5AgIFAmRLBQJkSQUCZWwEAmVuCQC4AgIFAmRLBQJlbAQCZW8JALcCAgUCZWsFAWYKAQJkVAICZFUCZXAEAmVxBQJkVQQCZFAIBQJlcQJfMQQCZWkIBQJlcQJfMgMJAQIhPQIFAmVpBQR1bml0BQJkVQQCZFMJALoCAgkAuQICCQC5AgIFAmRQBQJkUAUCZFAFAmRMBAJkVwkAugICCQC5AgIJALcCAgUCZW0JALkCAgUCZFMFAmVrBQJkUAkAtwICCQC6AgIJALkCAgUCZW4FAmRQBQJlbAkAuQICBQJlbwUCZFMEAmRZCQEBUwEJALgCAgUCZFcJAQV2YWx1ZQEFAmRQAwkAwAICBQFmBQJkWQkAlAoCBQJkVwUCZXAJAJQKAgUCZFcFBHVuaXQEAmRaCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgkAzAgCAAcJAMwIAgAICQDMCAIACQkAzAgCAAoJAMwIAgALCQDMCAIADAkAzAgCAA0JAMwIAgAOBQNuaWwEAmVyCgACZWIFAmRaCgACZWMJAJADAQUCZWIKAAJlZAkAlAoCBQJkSQUEdW5pdAoBAmVlAgJlZgJlZwMJAGcCBQJlZwUCZWMFAmVmCQECZFQCBQJlZgkAkQMCBQJlYgUCZWcKAQJlaAICZWYCZWcDCQBnAgUCZWcFAmVjBQJlZgkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE1CQECZWgCCQECZWUCCQECZWUCCQECZWUCCQECZWUCCQECZWUCCQECZWUCCQECZWUCCQECZWUCCQECZWUCCQECZWUCCQECZWUCCQECZWUCCQECZWUCCQECZWUCCQECZWUCBQJlZAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPBAJkUAgFAmVyAl8xBAJlaQgFAmVyAl8yAwkBAiE9AgUCZWkFBHVuaXQFAmRQCQACAQkArAICAhlEIGNhbGN1bGF0aW9uIGVycm9yLCBEID0gCQCmAwEFAmRQAQJlcwMCZEYCZFYCZXQEAmVrBQFnBAJldQkAkQMCBQJkRgMJAAACBQJkVgAAAAEAAAQCZWwJAKcDAQUBbAQCZEoJALkCAgkApwMBBQJhTwUCZWwEAmRJBQJldQQCZEsJALkCAgUCZEoFAmVrBAJldgkAugICCQC5AgIJALkCAgkAugICCQC5AgIFAmV0BQJldAkAuQICBQJldQUCZWsFAmV0BQJlbAkAuQICBQJkSwUCZWsEAmV3CQC4AgIJALcCAgUCZEkJALoCAgkAuQICBQJldAUCZWwFAmRLBQJldAoBAmRUAgJkVQJlcAQCZXgFAmRVBAJleQgFAmV4Al8xBAJlaQgFAmV4Al8yAwkBAiE9AgUCZWkFBHVuaXQFAmRVBAJlegkAugICCQC3AgIJALkCAgUCZXkFAmV5BQJldgkAtwICCQC5AgIFAWcFAmV5BQJldwQCZUEJAQFTAQkAuAICBQJlegkBBXZhbHVlAQUCZXkDCQDAAgIFAWYFAmVBCQCUCgIFAmV6BQJlcAkAlAoCBQJlegUEdW5pdAQCZFoJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJCQDMCAIACgkAzAgCAAsJAMwIAgAMCQDMCAIADQkAzAgCAA4FA25pbAQCZUIKAAJlYgUCZFoKAAJlYwkAkAMBBQJlYgoAAmVkCQCUCgIFAmV0BQR1bml0CgECZWUCAmVmAmVnAwkAZwIFAmVnBQJlYwUCZWYJAQJkVAIFAmVmCQCRAwIFAmViBQJlZwoBAmVoAgJlZgJlZwMJAGcCBQJlZwUCZWMFAmVmCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQJlaAIJAQJlZQIJAQJlZQIJAQJlZQIJAQJlZQIJAQJlZQIJAQJlZQIJAQJlZQIJAQJlZQIJAQJlZQIJAQJlZQIJAQJlZQIJAQJlZQIJAQJlZQIJAQJlZQIJAQJlZQIFAmVkAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8EAmV5CAUCZUICXzEEAmVpCAUCZUICXzIDCQECIT0CBQJlaQUEdW5pdAUCZXkJAAIBCQCsAgICGVkgY2FsY3VsYXRpb24gZXJyb3IsIFkgPSAJAKYDAQUCZXkBAmVDAwJlRAJlRQJlRgQCZUcJALYCAQCAoJSljR0EAmVICQC8AgMJAQJkRQEJAMwIAgUCZUQJAMwIAgUCZUUFA25pbAUCZUcFAmVGAwkAAAIFAmVGBQFlBQFlBQJlSAECZUkDAmVKAmVLAmVMBAJlTQkAuAICCQC2AgEJAQJiRgEJAQJhWQEFAmJnBQJlSgQCZU4JALgCAgkAtgIBCQECYkYBCQECYVkBBQJiaAUCZUsEAmVPCQC4AgIJALYCAQgJAQV2YWx1ZQEJAOwHAQUCYmYIcXVhbnRpdHkFAmVMBAJlUAkBAmVDAwUCZU0FAmVOBQJlTwUCZVABAmVRAwJlUgJlUwJlTAQCZU0JAGQCCQECYkYBCQECYVkBBQJiZwUCZVIEAmVOCQBkAgkBAmJGAQkBAmFZAQUCYmgFAmVTBAJlTwkAZAIICQEFdmFsdWUBCQDsBwEFAmJmCHF1YW50aXR5BQJlTAQCZUgJAQJlQwMJALYCAQUCZU0JALYCAQUCZU4JALYCAQUCZU8EAmVUCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJhbAUGaGVpZ2h0CQDMCAIJAQtTdHJpbmdFbnRyeQIFAmFrCQCmAwEFAmVIBQNuaWwJAJQKAgUCZVQFAmVIAQJlVQICZVYCZUgDCQDAAgIFAmVIBQJlVgYJAQJhSwECInVwZGF0ZWQgRExwIGxvd2VyIHRoYW4gY3VycmVudCBETHABAmVXAQJlWAQCZVkIBQJlWAZhbW91bnQEAmVaCQBuBAgFAmVYBmFtb3VudAgFAmVYBXByaWNlBQFhBQVGTE9PUgQCZmEDCQAAAggFAmVYCW9yZGVyVHlwZQUDQnV5CQCUCgIFAmVZCQEBLQEFAmVaCQCUCgIJAQEtAQUCZVkFAmVaBAJlUggFAmZhAl8xBAJlUwgFAmZhAl8yAwMDCQECYVAABgkAAAIFAmJlBQFyBgkAAAIFAmJlBQFzCQACAQINQWRtaW4gYmxvY2tlZAMDCQECIT0CCAgFAmVYCWFzc2V0UGFpcgthbW91bnRBc3NldAUCYmcGCQECIT0CCAgFAmVYCWFzc2V0UGFpcgpwcmljZUFzc2V0BQJiaAkAAgECCVdyIGFzc2V0cwQCZmIJAKcDAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUCYWsEAmZjCQECZVEDBQJlUgUCZVMAAAQCZmQIBQJmYwJfMQQCZmUIBQJmYwJfMgQCZmYJAMACAgUCZmUFAmZiBQJmZgECZmcBAmRWAwkBAiE9AgkAkAMBCAUCZFYIcGF5bWVudHMAAQkAAgECCjEgcG1udCBleHAEAmZoCQEFdmFsdWUBCQCRAwIIBQJkVghwYXltZW50cwAABAJjcwkBBXZhbHVlAQgFAmZoB2Fzc2V0SWQEAmNZCAUCZmgGYW1vdW50BAJkawkBAmNxBAkA2AQBCAUCZFYNdHJhbnNhY3Rpb25JZAkA2AQBBQJjcwUCY1kIBQJkVgZjYWxsZXIEAmNNCAUCZGsCXzEEAmNOCAUCZGsCXzIEAmNBCQENcGFyc2VJbnRWYWx1ZQEIBQJkawJfOQQCY08IBQJkawNfMTADAwkBAmFQAAYJAAACBQJjQQUBcwkAAgEJAKwCAgIPQWRtaW4gYmxvY2tlZDogCQCkAwEFAmNBCQCXCgUFAmNNBQJjTgUCY1kFAmNzBQJjTwECZmkKAmZqAmFjAmZrAmZsAmJOAmNWAmNXAmNYAmNZAmNaBAJkawkBAmNQDQUCYWMFAmJOCAkBBXZhbHVlAQUCZmsGYW1vdW50CAkBBXZhbHVlAQUCZmsHYXNzZXRJZAgJAQV2YWx1ZQEFAmZsBmFtb3VudAgJAQV2YWx1ZQEFAmZsB2Fzc2V0SWQFAmZqCQAAAgUCYWMCAAUCY1YFAmNXBQJjWAUCY1kFAmNaBAJjQQkBDXBhcnNlSW50VmFsdWUBCAUCZGsCXzgDAwMJAQJhUAAGCQAAAgUCY0EFAXEGCQAAAgUCY0EFAXMJAAIBCQCsAgICCEJsb2NrZWQ6CQCkAwEFAmNBBQJkawECZm0FAmZuAmNzAmN1AmFjAmZvBAJiYQkBAmFTAAQCY3cJAJEDAgUCYmEFAXcEAmN4CQCRAwIFAmJhBQF4BAJjdgkAkQMCBQJiYQUBdgQCZGUJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJiYQUBeQQCZGYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJiYQUBegQCZU8JALYCAQgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBCQDZBAEFAmN2AhBpbnZhbGlkIGxwIGFzc2V0CHF1YW50aXR5BAJmcAMJAL8CAgUCZU8FAWUGCQACAQIiaW5pdGlhbCBkZXBvc2l0IHJlcXVpcmVzIGFsbCBjb2lucwMJAAACBQJmcAUCZnAEAmNDCQECYkYBBQJjdwQCY0UJAQJiRgEFAmN4BAJmcQMJAAACBQJhYwIACQCUCgIFAmNDBQJjRQMJAAACBQJjcwUCY3cDCQBmAgUCZm4FAmNDCQACAQIWaW52YWxpZCBwYXltZW50IGFtb3VudAkAlAoCCQBlAgUCY0MFAmZuBQJjRQMJAAACBQJjcwUCY3gDCQBmAgUCZm4FAmNFCQACAQIWaW52YWxpZCBwYXltZW50IGFtb3VudAkAlAoCBQJjQwkAZQIFAmNFBQJmbgkAAgECEHdyb25nIHBtdEFzc2V0SWQEAmZyCAUCZnECXzEEAmZzCAUCZnECXzIEAmZ0AwkAAAIFAmNzBQJjdwkAlAoCBQJmbgAAAwkAAAIFAmNzBQJjeAkAlAoCAAAFAmZuCQACAQIPaW52YWxpZCBwYXltZW50BAJmdQgFAmZ0Al8xBAJmdggFAmZ0Al8yBAJmdwMFAmZvCQCVCgMICQECY24BBQJmdQJfMQgJAQJjbgEFAmZ2Al8xCAkBAmNuAQUCZm4CXzIJAJUKAwUCZnUFAmZ2AAAEAmZ4CAUCZncCXzEEAmZ5CAUCZncCXzIEAmNwCAUCZncCXzMEAmZ6CQBkAgUCZnIFAmZ4BAJmQQkAZAIFAmZzBQJmeQQCYlMJAQJkRQEJAMwIAgkAtgIBBQJmcgkAzAgCCQC2AgEFAmZzBQNuaWwEAmJSCQECZEUBCQDMCAIJALYCAQUCZnoJAMwIAgkAtgIBBQJmQQUDbmlsBAJmQgMJAL8CAgUCYlIFAmJTBgkBBXRocm93AAMJAAACBQJmQgUCZkIEAmZDCQC8AgMFAmVPCQC4AgIFAmJSBQJiUwUCYlMEAmNICQEBSwIJAQJiSAIJAQFIAgUCZkEFAmRmCQEBSAIFAmZ6BQJkZQUBYQQCZEQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFXAAUCY0gJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFYAgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUCY0gJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFhAgUCY3UFAmFjCQECYnEKBQJmdQUCZnYJAKADAQUCZkMFAmNIAAAAAAUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAAAAAAFA25pbAQCZkQJAGsDBQJmcwUBYQUCZnIEAmZFCQBrAwUCZm4FAWEJAGQCBQJmRAUBYQQCZkYJAGUCBQJmbgUCZkUEAmZHCQC8AgMFAmVPCQC2AgEFAmZGCQC2AgEFAmZzBAJmSAkAoAMBCQC8AgMJALgCAgUCZkMFAmZHBQFiBQJmRwkAlgoECQCgAwEFAmZDBQJkRAUCY3AFAmZICQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJmSQYCZkoCZksCZkwCZmoCZk0CZk4EAmJhCQECYVMABAJjdgkAkQMCBQJiYQUBdgQCY3cJAJEDAgUCYmEFAXcEAmN4CQCRAwIFAmJhBQF4BAJmTwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJhBQF5BAJmUAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJhBQF6BAJmUQkAkQMCBQJiYQUBdQQCY3UDCQAAAgUCZmoFAmJwBQJmTQUCZmoEAmZoCQEFdmFsdWUBCQCRAwIFAmZMAAAEAmNzCQEFdmFsdWUBCAUCZmgHYXNzZXRJZAQCY1kIBQJmaAZhbW91bnQEAmVQCQECZUkDBQFlBQFlBQFlAwkAAAIFAmVQBQJlUAQCY3IJANgEAQUCZk4DCQECIT0CBQJjdgkA2AQBBQJjcwkAAgECCFdyb25nIExQBAJjQwkBAmJGAQUCY3cEAmNFCQECYkYBBQJjeAQCZlIKAAJmUwkA/AcEBQR0aGlzAhNnZXRPbmVUa25WMlJFQURPTkxZCQDMCAIFAmZKCQDMCAIFAmNZBQNuaWwFA25pbAMJAAECBQJmUwIKKEludCwgSW50KQUCZlMJAAIBCQCsAgIJAAMBBQJmUwIfIGNvdWxkbid0IGJlIGNhc3QgdG8gKEludCwgSW50KQMJAAACBQJmUgUCZlIEAmNwCAUCZlICXzIEAmZUCAUCZlICXzEEAmZVAwMJAGYCBQJmSwAACQBmAgUCZksFAmZUBwkBAmFLAQkAuQkCCQDMCAICH2Ftb3VudCB0byByZWNlaXZlIGlzIGxlc3MgdGhhbiAJAMwIAgkApAMBBQJmSwUDbmlsAgAFAmZUBAJmVgMJAAACBQJmSgUCY3cJAJYKBAUCZlUAAAkAZQIJAGUCBQJjQwUCZlUFAmNwBQJjRQMJAAACBQJmSgUCY3gJAJYKBAAABQJmVQUCY0MJAGUCCQBlAgUCY0UFAmZVBQJjcAkAAgECFGludmFsaWQgb3V0IGFzc2V0IGlkBAJmVwgFAmZWAl8xBAJmWAgFAmZWAl8yBAJmeggFAmZWAl8zBAJmQQgFAmZWAl80BAJmWQkBAmJIAgkBAUgCBQJmQQUCZlAJAQFIAgUCZnoFAmZPBAJmWgkBAUsCBQJmWQUBYQQCZ2EDCQAAAgUCZkoCBVdBVkVTBQR1bml0CQDZBAEFAmZKBAJnYgMJAGYCBQJjcAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmFSBQJjcAUCZ2EFA25pbAUDbmlsBAJjTwkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmN1BQJmVQUCZ2EJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFkAgkApQgBBQJjdQUCY3IJAQJiQgYFAmZXBQJmWAUCY1kFAmZaBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBVwAFAmZaCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBWAIFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFAmZaBQNuaWwFAmdiAwkAAAIFAmNPBQJjTwQCZ2MJAPwHBAUCYU4CBGJ1cm4JAMwIAgUCY1kFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCY3MFAmNZBQNuaWwDCQAAAgUCZ2MFAmdjBAJnZAQCZ2UDCQAAAgUEdGhpcwUCYVIAAAUCY3AEAmdmAwkAAAIJAQJhVwEFAmZKBQJiZwYHAwUCZ2YJAJQKAgkBAS0BCQBkAgUCZlQFAmdlAAAJAJQKAgAACQEBLQEJAGQCBQJmVAUCZ2UEAmVSCAUCZ2QCXzEEAmVTCAUCZ2QCXzIEAmdnCQECZVEDBQJlUgUCZVMAAAQCZ2gIBQJnZwJfMQQCZUgIBQJnZwJfMgQCZ2kJAQJlVQIFAmVQBQJlSAMJAAACBQJnaQUCZ2kJAJQKAgkAzggCBQJjTwUCZ2gFAmZVCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJnagAEAmFFCQCiCAEJAQFVAAMJAAECBQJhRQIGU3RyaW5nBAJkSQUCYUUJANkEAQUCZEkDCQABAgUCYUUCBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgECZ2sABAJhRQkAoggBCQEBVgADCQABAgUCYUUCBlN0cmluZwQCZEkFAmFFCQDZBAEFAmRJAwkAAQIFAmFFAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IAAmdsCQACAQIRUGVybWlzc2lvbiBkZW5pZWQBAmdtAQJkVgQCYUUJAQJnagADCQABAgUCYUUCCkJ5dGVWZWN0b3IEAmduBQJhRQkAAAIIBQJkVg9jYWxsZXJQdWJsaWNLZXkFAmduAwkAAQIFAmFFAgRVbml0CQAAAggFAmRWBmNhbGxlcgUEdGhpcwkAAgECC01hdGNoIGVycm9yAQJnbwECZFYEAmFFCQECZ2oAAwkAAQIFAmFFAgpCeXRlVmVjdG9yBAJnbgUCYUUDCQAAAggFAmRWD2NhbGxlclB1YmxpY0tleQUCZ24GBQJnbAMJAAECBQJhRQIEVW5pdAMJAAACCAUCZFYGY2FsbGVyBQR0aGlzBgUCZ2wJAAIBAgtNYXRjaCBlcnJvch0CZFYBC2NvbnN0cnVjdG9yAQFUBAJldgkBAmdvAQUCZFYDCQAAAgUCZXYFAmV2CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFUAAUBVAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRWAQpzZXRNYW5hZ2VyAQJncAQCZXYJAQJnbwEFAmRWAwkAAAIFAmV2BQJldgQCZ3EJANkEAQUCZ3ADCQAAAgUCZ3EFAmdxCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFWAAUCZ3AFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkVgEOY29uZmlybU1hbmFnZXIABAJjbQkBAmdrAAQCZ3IDCQEJaXNEZWZpbmVkAQUCY20GCQACAQISTm8gcGVuZGluZyBtYW5hZ2VyAwkAAAIFAmdyBQJncgQCZ3MDCQAAAggFAmRWD2NhbGxlclB1YmxpY0tleQkBBXZhbHVlAQUCY20GCQACAQIbWW91IGFyZSBub3QgcGVuZGluZyBtYW5hZ2VyAwkAAAIFAmdzBQJncwkAzAgCCQELU3RyaW5nRW50cnkCCQEBVQAJANgEAQkBBXZhbHVlAQUCY20JAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAVYABQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZFYBA3B1dAICZ3QCZ3UEAmd2CQECYmsABAJndwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCZ3YFAUMCCldyIHN0IGFkZHIEAmd4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJndgUBRQIKV3Igc2wgYWRkcgMJAGYCAAAFAmd0CQACAQIOV3Jvbmcgc2xpcHBhZ2UDCQECIT0CCQCQAwEIBQJkVghwYXltZW50cwACCQACAQIMMiBwbW50cyBleHBkBAJneQkAtgIBCAkBBXZhbHVlAQkAkQMCCAUCZFYIcGF5bWVudHMAAAZhbW91bnQEAmd6CQC2AgEICQEFdmFsdWUBCQCRAwIIBQJkVghwYXltZW50cwABBmFtb3VudAQCZVAJAQJlSQMFAmd5BQJnegkAtgIBAAADCQAAAgUCZVAFAmVQBAJnQQkBAmZpCgkApQgBCAUCZFYGY2FsbGVyCQDYBAEIBQJkVg10cmFuc2FjdGlvbklkCQEPQXR0YWNoZWRQYXltZW50AggJAQV2YWx1ZQEJAJEDAggFAmRWCHBheW1lbnRzAAAHYXNzZXRJZAgJAQV2YWx1ZQEJAJEDAggFAmRWCHBheW1lbnRzAAAGYW1vdW50CQCRAwIIBQJkVghwYXltZW50cwABBQJndAYHBgAAAgAEAmR4CAUCZ0ECXzIEAmdCCAUCZ0ECXzcEAmNPCAUCZ0ECXzkEAmR5CAUCZ0EDXzEwBAJkeggFAmdBA18xMQQCY3cIBQJnQQNfMTIEAmN4CAUCZ0EDXzEzBAJkawkA/AcEBQJhTgIEZW1pdAkAzAgCBQJkeAUDbmlsBQNuaWwDCQAAAgUCZGsFAmRrBAJnQwQCYUUFAmRrAwkAAQIFAmFFAgdBZGRyZXNzBAJnRAUCYUUJAPwHBAUCZ0QCBGVtaXQJAMwIAgUCZHgFA25pbAUDbmlsBQR1bml0AwkAAAIFAmdDBQJnQwQCZ0UDCQBmAgUCZHkAAAkA/AcEBQJneAIDcHV0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmN3BQJkeQUDbmlsBQNuaWwDCQAAAgUCZ0UFAmdFBAJnRgMJAGYCBQJkegAACQD8BwQFAmd4AgNwdXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCY3gFAmR6BQNuaWwFA25pbAMJAAACBQJnRgUCZ0YEAmdHAwUCZ3UEAmdICQD8BwQFAmd3AgVzdGFrZQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJnQgUCZHgFA25pbAMJAAACBQJnSAUCZ0gFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUCZFYGY2FsbGVyBQJkeAUCZ0IFA25pbAQCZ0kJAQJlUQMAAAAAAAAEAmdoCAUCZ0kCXzEEAmVICAUCZ0kCXzIEAmdpCQECZVUCBQJlUAUCZUgDCQAAAgUCZ2kFAmdpCQDOCAIJAM4IAgUCY08FAmdHBQJnaAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkVgELcHV0T25lVGtuVjICAmZLAmd1BAJnSgoAAmZTCQD8BwQFAmFOAihpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZFJFQURPTkxZCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQABAgUCZlMCB0Jvb2xlYW4FAmZTCQACAQkArAICCQADAQUCZlMCHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4EAmdLAwMDCQECYVAABgkAAAIFAmJlBQFxBgkAAAIFAmJlBQFzBgUCZ0oEAmdMCQDMCAIDAwkBASEBBQJnSwYJAQJnbQEFAmRWBgkBAmFLAQIhcHV0IG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IGFkbWluCQDMCAIDCQAAAgkAkAMBCAUCZFYIcGF5bWVudHMAAQYJAQJhSwECHmV4YWN0bHkgMSBwYXltZW50IGFyZSBleHBlY3RlZAUDbmlsAwkAAAIFAmdMBQJnTAQCYmEJAQJhUwAEAmN3CQCRAwIFAmJhBQF3BAJjeAkAkQMCBQJiYQUBeAQCY3YJANkEAQkAkQMCBQJiYQUBdgQCZk8JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJiYQUBeQQCZlAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJiYQUBegQCY3UDCQAAAggFAmRWBmNhbGxlcgUEdGhpcwgFAmRWDG9yaWdpbkNhbGxlcggFAmRWBmNhbGxlcgQCZmgJAQV2YWx1ZQEJAJEDAggFAmRWCHBheW1lbnRzAAAEAmNzCQDYBAEJAQV2YWx1ZQEIBQJmaAdhc3NldElkBAJjWQgFAmZoBmFtb3VudAQCZ00JAQJmbQUFAmNZBQJjcwkApQgBBQJjdQkA2AQBCAUCZFYNdHJhbnNhY3Rpb25JZAYDCQAAAgUCZ00FAmdNBAJjcAgFAmdNAl8zBAJjTwgFAmdNAl8yBAJnTggFAmdNAl8xBAJkeAMDCQBmAgUCZksAAAkAZgIFAmZLBQJnTgcJAQJhSwEJALkJAgkAzAgCAh9hbW91bnQgdG8gcmVjZWl2ZSBpcyBsZXNzIHRoYW4gCQDMCAIJAKQDAQUCZksFA25pbAIABQJnTgQCZ0EJAPwHBAUCYU4CBGVtaXQJAMwIAgUCZHgFA25pbAUDbmlsAwkAAAIFAmdBBQJnQQQCZ0MEAmFFBQJnQQMJAAECBQJhRQIHQWRkcmVzcwQCZ0QFAmFFCQD8BwQFAmdEAgRlbWl0CQDMCAIFAmR4BQNuaWwFA25pbAUEdW5pdAMJAAACBQJnQwUCZ0MEAmdHAwUCZ3UEAmdICQD8BwQFAmJtAgVzdGFrZQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJjdgUCZHgFA25pbAMJAAACBQJnSAUCZ0gFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUCZFYGY2FsbGVyBQJkeAUCY3YFA25pbAQCZ2IDCQBmAgUCY3AAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJhUgUCY3AJANkEAQUCY3MFA25pbAUDbmlsBAJnTwMJAAACBQR0aGlzBQJhUgkAlAoCAAAAAAQCZ1ADCQAAAggFAmZoB2Fzc2V0SWQFAmJnBgcDBQJnUAkAlAoCCQEBLQEFAmNwAAAJAJQKAgAACQEBLQEFAmNwBAJlUggFAmdPAl8xBAJlUwgFAmdPAl8yBAJnUQkBAmVRAwUCZVIFAmVTAAAEAmdoCAUCZ1ECXzEEAmVICAUCZ1ECXzIJAJQKAgkAzggCCQDOCAIJAM4IAgUCY08FAmdHBQJnYgUCZ2gFAmR4CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRWAQpwdXRGb3JGcmVlAQJnUgMJAGYCAAAFAmdSCQACAQIKV3Jvbmcgc2xwZwMJAQIhPQIJAJADAQgFAmRWCHBheW1lbnRzAAIJAAIBAgwyIHBtbnRzIGV4cGQEAmdTCQECZmkKCQClCAEIBQJkVgZjYWxsZXIJANgEAQgFAmRWDXRyYW5zYWN0aW9uSWQJAQ9BdHRhY2hlZFBheW1lbnQCCAkBBXZhbHVlAQkAkQMCCAUCZFYIcGF5bWVudHMAAAdhc3NldElkCAkBBXZhbHVlAQkAkQMCCAUCZFYIcGF5bWVudHMAAAZhbW91bnQJAJEDAggFAmRWCHBheW1lbnRzAAEFAmdSBwcGAAACAAQCY08IBQJnUwJfOQQCZ3kJALYCAQgJAQV2YWx1ZQEJAJEDAggFAmRWCHBheW1lbnRzAAAGYW1vdW50BAJnegkAtgIBCAkBBXZhbHVlAQkAkQMCCAUCZFYIcGF5bWVudHMAAQZhbW91bnQEAmVQCQECZUkDBQJneQUCZ3oJALYCAQAAAwkAAAIFAmVQBQJlUAQCZ1QJAQJlUQMAAAAAAAAEAmdoCAUCZ1QCXzEEAmVICAUCZ1QCXzIEAmdpCQECZVUCBQJlUAUCZUgDCQAAAgUCZ2kFAmdpCQDOCAIFAmNPBQJnaAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkVgEDZ2V0AAQCZGsJAQJmZwEFAmRWBAJnVQgFAmRrAl8xBAJjTggFAmRrAl8yBAJjWQgFAmRrAl8zBAJjcwgFAmRrAl80BAJjTwgFAmRrAl81BAJldwkA/AcEBQJhTgIEYnVybgkAzAgCBQJjWQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJjcwUCY1kFA25pbAMJAAACBQJldwUCZXcEAmVQCQECZUkDCQC2AgEAAAkAtgIBAAAJALYCAQUCY1kEAmdWCQECZVEDCQEBLQEFAmdVCQEBLQEFAmNOAAAEAmdoCAUCZ1YCXzEEAmVICAUCZ1YCXzIEAmdpCQECZVUCBQJlUAUCZUgDCQAAAgUCZ2kFAmdpCQDOCAIFAmNPBQJnaAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkVgELZ2V0T25lVGtuVjICAmZKAmZLBAJnSgoAAmZTCQD8BwQFAmFOAihpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZFJFQURPTkxZCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQABAgUCZlMCB0Jvb2xlYW4FAmZTCQACAQkArAICCQADAQUCZlMCHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4EAmdXAwMJAQJhUAAGCQAAAgUCYmUFAXMGBQJnSgQCZ0wJAMwIAgMDCQEBIQEFAmdXBgkBAmdtAQUCZFYGCQECYUsBAiFnZXQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgYWRtaW4JAMwIAgMJAAACCQCQAwEIBQJkVghwYXltZW50cwABBgkBAmFLAQIeZXhhY3RseSAxIHBheW1lbnQgYXJlIGV4cGVjdGVkBQNuaWwDCQAAAgUCZ0wFAmdMBAJnWAkBAmZJBgUCZkoFAmZLCAUCZFYIcGF5bWVudHMIBQJkVgZjYWxsZXIIBQJkVgxvcmlnaW5DYWxsZXIIBQJkVg10cmFuc2FjdGlvbklkBAJjTwgFAmdYAl8xBAJmVQgFAmdYAl8yCQCUCgIFAmNPBQJmVQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkVgEKcmVmcmVzaERMcAAEAmdZCQELdmFsdWVPckVsc2UCCQCfCAEFAmFsAAAEAmdaAwkAZwIJAGUCBQZoZWlnaHQFAmdZBQJhbwUEdW5pdAkBAmFLAQkAuQkCCQDMCAIJAKQDAQUCYW8JAMwIAgIvIGJsb2NrcyBoYXZlIG5vdCBwYXNzZWQgc2luY2UgdGhlIHByZXZpb3VzIGNhbGwFA25pbAIAAwkAAAIFAmdaBQJnWgQCZmIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAqAMBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFAmFrAgEwCQECYU0BAgtpbnZhbGlkIGRMcAQCaGEJAQJlUQMAAAAAAAAEAmhiCAUCaGECXzEEAmVICAUCaGECXzIEAmVUAwkBAiE9AgUCZmIFAmVIBQJoYgkBAmFLAQISbm90aGluZyB0byByZWZyZXNoCQCUCgIFAmVUCQCmAwEFAmVICQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRWARNnZXRPbmVUa25WMlJFQURPTkxZAgJmSgJoYwQCYmEJAQJhUwAEAmN3CQCRAwIFAmJhBQF3BAJjeAkAkQMCBQJiYQUBeAQCY3YJAJEDAgUCYmEFAXYEAmRGCQDMCAIJALYCAQkBAmJGAQUCY3cJAMwIAgkAtgIBCQECYkYBBQJjeAUDbmlsBAJlRgkAtgIBCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEJANkEAQUCY3YCEGludmFsaWQgbHAgYXNzZXQIcXVhbnRpdHkEAmJTCQECZEUBBQJkRgQCYlIJALgCAgUCYlMJALwCAwkAtgIBBQJoYwUCYlMFAmVGBAJoZAMJAAACBQJmSgUCY3cAAAMJAAACBQJmSgUCY3gAAQkAAgECFGludmFsaWQgb3V0IGFzc2V0IGlkBAJoZQkBAmVzAwUCZEYFAmhkBQJiUgQCaGYJALgCAgkAkQMCBQJkRgUCaGQFAmhlBAJoZwkAlgMBCQDMCAIAAAkAzAgCCQCgAwEJALgCAgUCaGYFAWYFA25pbAQCaGgJAQJjbgEFAmhnBAJmVAgFAmhoAl8xBAJjcAgFAmhoAl8yCQCUCgIFA25pbAkAlAoCBQJmVAUCY3ACZFYBHGdldE9uZVRrblYyV2l0aEJvbnVzUkVBRE9OTFkCAmZKAmhjBAJiYQkBAmFTAAQCY3cJAJEDAgUCYmEFAXcEAmN4CQCRAwIFAmJhBQF4BAJjdgkAkQMCBQJiYQUBdgQCY0MJAQJiRgEFAmN3BAJjRQkBAmJGAQUCY3gEAmhpCgACZlMJAPwHBAUEdGhpcwITZ2V0T25lVGtuVjJSRUFET05MWQkAzAgCBQJmSgkAzAgCBQJoYwUDbmlsBQNuaWwDCQABAgUCZlMCCihJbnQsIEludCkFAmZTCQACAQkArAICCQADAQUCZlMCHyBjb3VsZG4ndCBiZSBjYXN0IHRvIChJbnQsIEludCkEAmZUCAUCaGkCXzEEAmNwCAUCaGkCXzIEAmRrCQECY3EEAgAFAmN2BQJoYwUEdGhpcwQCY00IBQJkawJfMQQCY04IBQJkawJfMgQCaGoJAGQCBQJjTQUCY04EAmZIAwkAAAIFAmhqAAADCQAAAgUCZlQAAAAACQACAQIXYm9udXMgY2FsY3VsYXRpb24gZXJyb3IJAGsDCQBlAgUCZlQFAmhqBQFhBQJoagkAlAoCBQNuaWwJAJUKAwUCZlQFAmNwBQJmSAJkVgEJZ2V0Tm9MZXNzAgJoawJobAQCZGsJAQJmZwEFAmRWBAJjTQgFAmRrAl8xBAJjTggFAmRrAl8yBAJjWQgFAmRrAl8zBAJjcwgFAmRrAl80BAJjTwgFAmRrAl81AwkAZgIFAmhrBQJjTQkAAgEJAKwCAgkArAICCQCsAgICCUZhaWxlZDogIAkApAMBBQJjTQIDIDwgCQCkAwEFAmhrAwkAZgIFAmhsBQJjTgkAAgEJAKwCAgkArAICCQCsAgICCEZhaWxlZDogCQCkAwEFAmNOAgMgPCAJAKQDAQUCaGwEAmVQCQECZUkDCQC2AgEAAAkAtgIBAAAJALYCAQUCY1kEAmhtCQD8BwQFAmFOAgRidXJuCQDMCAIFAmNZBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmNzBQJjWQUDbmlsAwkAAAIFAmhtBQJobQQCaG4JAQJlUQMJAQEtAQUCY00JAQEtAQUCY04AAAQCZ2gIBQJobgJfMQQCZUgIBQJobgJfMgQCZ2kJAQJlVQIFAmVQBQJlSAMJAAACBQJnaQUCZ2kJAM4IAgUCY08FAmdoCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRWAQ11bnN0YWtlQW5kR2V0AQJjbwQCaG8DCQECIT0CCQCQAwEIBQJkVghwYXltZW50cwAACQACAQINTm8gcG1udHMgZXhwZAYDCQAAAgUCaG8FAmhvBAJjZQkBAmFTAAQCaHAJAQJiawAEAmdCCQDZBAEJAJEDAgUCY2UFAXYEAmhxCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJocAUBQwIKV3Igc3QgYWRkcgQCZVAJAQJlSQMJALYCAQAACQC2AgEAAAkAtgIBAAAEAmhyCQD8BwQFAmhxAgd1bnN0YWtlCQDMCAIJANgEAQUCZ0IJAMwIAgUCY28FA25pbAUDbmlsAwkAAAIFAmhyBQJocgQCZGsJAQJjcQQJANgEAQgFAmRWDXRyYW5zYWN0aW9uSWQJANgEAQUCZ0IFAmNvCAUCZFYGY2FsbGVyBAJjTQgFAmRrAl8xBAJjTggFAmRrAl8yBAJjQQkBDXBhcnNlSW50VmFsdWUBCAUCZGsCXzkEAmNPCAUCZGsDXzEwBAJocwMDCQECYVAABgkAAAIFAmNBBQFzCQACAQkArAICAglCbG9ja2VkOiAJAKQDAQUCY0EGAwkAAAIFAmhzBQJocwQCaHQJAPwHBAUCYU4CBGJ1cm4JAMwIAgUCY28FA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCZ0IFAmNvBQNuaWwDCQAAAgUCaHQFAmh0BAJodQkBAmVRAwkBAS0BBQJjTQkBAS0BBQJjTgAABAJnaAgFAmh1Al8xBAJlSAgFAmh1Al8yBAJnaQkBAmVVAgUCZVAFAmVIAwkAAAIFAmdpBQJnaQkAzggCBQJjTwUCZ2gJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZFYBE3Vuc3Rha2VBbmRHZXROb0xlc3MDAmh2Amh3AmhsBAJnVwMJAQJhUAAGCQAAAgUCYmUFAXMEAmdMCQDMCAIDCQEBIQEFAmdXBgkAAgECIWdldCBvcGVyYXRpb24gaXMgYmxvY2tlZCBieSBhZG1pbgkAzAgCAwkAAAIJAJADAQgFAmRWCHBheW1lbnRzAAAGCQACAQIYbm8gcGF5bWVudHMgYXJlIGV4cGVjdGVkBQNuaWwDCQAAAgUCZ0wFAmdMBAJlUAkBAmVJAwkAtgIBAAAJALYCAQAACQC2AgEAAAQCaHIJAPwHBAUCYm0CB3Vuc3Rha2UJAMwIAgkA2AQBBQJiZgkAzAgCBQJodgUDbmlsBQNuaWwDCQAAAgUCaHIFAmhyBAJoeAkBAmNxBAkA2AQBCAUCZFYNdHJhbnNhY3Rpb25JZAkA2AQBBQJiZgUCaHYIBQJkVgZjYWxsZXIEAmNNCAUCaHgCXzEEAmNOCAUCaHgCXzIEAmNPCAUCaHgDXzEwBAJoeQkAzAgCAwkAZwIFAmNNBQJodwYJAAIBCQC5CQIJAMwIAgIsYW1vdW50IGFzc2V0IGFtb3VudCB0byByZWNlaXZlIGlzIGxlc3MgdGhhbiAJAMwIAgkApAMBBQJodwUDbmlsAgAJAMwIAgMJAGcCBQJjTgUCaGwGCQACAQkAuQkCCQDMCAICK3ByaWNlIGFzc2V0IGFtb3VudCB0byByZWNlaXZlIGlzIGxlc3MgdGhhbiAJAMwIAgkApAMBBQJobAUDbmlsAgAFA25pbAMJAAACBQJoeQUCaHkEAmhtCQD8BwQFAmFOAgRidXJuCQDMCAIFAmh2BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmJmBQJodgUDbmlsAwkAAAIFAmhtBQJobQQCaHoJAQJlUQMJAQEtAQUCY00JAQEtAQUCY04AAAQCZ2gIBQJoegJfMQQCZUgIBQJoegJfMgQCZ2kJAQJlVQIFAmVQBQJlSAMJAAACBQJnaQUCZ2kJAM4IAgUCY08FAmdoCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRWARV1bnN0YWtlQW5kR2V0T25lVGtuVjIDAmh2AmZKAmZLBAJnSgoAAmZTCQD8BwQFAmFOAihpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZFJFQURPTkxZCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQABAgUCZlMCB0Jvb2xlYW4FAmZTCQACAQkArAICCQADAQUCZlMCHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4EAmdXAwMJAQJhUAAGCQAAAgUCYmUFAXMGBQJnSgQCZ0wJAMwIAgMDCQEBIQEFAmdXBgkBAmdtAQUCZFYGCQECYUsBAiFnZXQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgYWRtaW4JAMwIAgMJAAACCQCQAwEIBQJkVghwYXltZW50cwAABgkBAmFLAQIYbm8gcGF5bWVudHMgYXJlIGV4cGVjdGVkBQNuaWwDCQAAAgUCZ0wFAmdMBAJjZQkBAmFTAAQCaHAJAQJiawAEAmdCCQDZBAEJAJEDAgUCY2UFAXYEAmhxCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJocAUBQwIKV3Igc3QgYWRkcgQCaHIJAPwHBAUCaHECB3Vuc3Rha2UJAMwIAgkA2AQBBQJnQgkAzAgCBQJodgUDbmlsBQNuaWwDCQAAAgUCaHIFAmhyBAJoQQkBAmZJBgUCZkoFAmZLCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJnQgUCaHYFA25pbAgFAmRWBmNhbGxlcggFAmRWDG9yaWdpbkNhbGxlcggFAmRWDXRyYW5zYWN0aW9uSWQEAmNPCAUCaEECXzEEAmZVCAUCaEECXzIJAJQKAgUCY08FAmZVCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRWARxwdXRPbmVUa25WMldpdGhCb251c1JFQURPTkxZAgJoQgJoQwQCYmEJAQJhUwAEAmN3CQCRAwIFAmJhBQF3BAJjeAkAkQMCBQJiYQUBeAQCY3YJAJEDAgUCYmEFAXYEAmhECQECZm0FBQJoQgUCaEMCAAIABgQCZkMIBQJoRAJfMQQCY08IBQJoRAJfMgQCY3AIBQJoRAJfMwQCZkgIBQJoRAJfNAkAlAoCBQNuaWwJAJUKAwUCZkMFAmNwBQJmSAJkVgEhcHV0T25lVGtuVjJXaXRob3V0VGFrZUZlZVJFQURPTkxZAgJoQgJoQwQCYmEJAQJhUwAEAmN3CQCRAwIFAmJhBQF3BAJjeAkAkQMCBQJiYQUBeAQCY3YJAJEDAgUCYmEFAXYEAmhFCQECZm0FBQJoQgUCaEMCAAIABwQCZkMIBQJoRQJfMQQCY08IBQJoRQJfMgQCY3AIBQJoRQJfMwQCZkgIBQJoRQJfNAkAlAoCBQNuaWwJAJUKAwUCZkMFAmNwBQJmSAJkVgEIYWN0aXZhdGUCAmhGAmhHAwkBAiE9AgkApQgBCAUCZFYGY2FsbGVyCQClCAEFAmFOCQACAQIGZGVuaWVkCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFlAAUCaEYJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFmAAUCaEcFA25pbAIHc3VjY2VzcwJkVgEEc2V0UwICaEgCaHMDCQECIT0CCQClCAEIBQJkVgZjYWxsZXIJAQJhRwIFBHRoaXMJAQJhaAAFAmdsCQDMCAIJAQtTdHJpbmdFbnRyeQIFAmhIBQJocwUDbmlsAmRWAQRzZXRJAgJoSAJocwMJAQIhPQIJAKUIAQgFAmRWBmNhbGxlcgkBAmFHAgUEdGhpcwkBAmFoAAUCZ2wJAMwIAgkBDEludGVnZXJFbnRyeQIFAmhIBQJocwUDbmlsAmRWARxnZXRQb29sQ29uZmlnV3JhcHBlclJFQURPTkxZAAkAlAoCBQNuaWwJAQJhUwACZFYBHGdldEFjY0JhbGFuY2VXcmFwcGVyUkVBRE9OTFkBAmJHCQCUCgIFA25pbAkBAmJGAQUCYkcCZFYBGWNhbGNQcmljZXNXcmFwcGVyUkVBRE9OTFkDAmJZAmJaAmNkBAJoSQkBAmNjAwUCYlkFAmJaBQJjZAkAlAoCBQNuaWwJAMwIAgkApgMBCQCRAwIFAmhJAAAJAMwIAgkApgMBCQCRAwIFAmhJAAEJAMwIAgkApgMBCQCRAwIFAmhJAAIFA25pbAJkVgEWZnJvbVgxOFdyYXBwZXJSRUFET05MWQIBTAJoSgkAlAoCBQNuaWwJAQFLAgkApwMBBQFMBQJoSgJkVgEUdG9YMThXcmFwcGVyUkVBRE9OTFkCAUkBSgkAlAoCBQNuaWwJAKYDAQkBAUgCBQFJBQFKAmRWAR5jYWxjUHJpY2VCaWdJbnRXcmFwcGVyUkVBRE9OTFkCAmJJAmJKCQCUCgIFA25pbAkApgMBCQECYkgCCQCnAwEFAmJJCQCnAwEFAmJKAmRWASNlc3RpbWF0ZVB1dE9wZXJhdGlvbldyYXBwZXJSRUFET05MWQkCY3ICYk4CY1ECY1ICY1MCY1QCaEsCY1UCY1YJAJQKAgUDbmlsCQECY1ANBQJjcgUCYk4FAmNRBQJjUgUCY1MFAmNUBQJoSwUCY1UFAmNWBgcAAAIAAmRWASNlc3RpbWF0ZUdldE9wZXJhdGlvbldyYXBwZXJSRUFET05MWQQCY3ICaEwCY3QCaEsEAmRrCQECY3EEBQJjcgUCaEwFAmN0CQERQGV4dHJOYXRpdmUoMTA2MikBBQJoSwkAlAoCBQNuaWwJAJwKCggFAmRrAl8xCAUCZGsCXzIIBQJkawJfMwgFAmRrAl80CAUCZGsCXzUIBQJkawJfNggFAmRrAl83CQCmAwEIBQJkawJfOAgFAmRrAl85CAUCZGsDXzEwAmRWAQ5nZXRGZWVSRUFET05MWQAJAJQKAgUDbmlsBQJhagECaE0BAmhOAAQCaE8EAmFFCQECZ2oAAwkAAQIFAmFFAgpCeXRlVmVjdG9yBAJnbgUCYUUFAmduAwkAAQIFAmFFAgRVbml0CAUCaE0Pc2VuZGVyUHVibGljS2V5CQACAQILTWF0Y2ggZXJyb3IEAmFFBQJoTQMJAAECBQJhRQIFT3JkZXIEAmVYBQJhRQQCaFAJAQJhUQAEAmhRCQECZVcBBQJlWAQCaFIJAPQDAwgFAmVYCWJvZHlCeXRlcwkAkQMCCAUCZVgGcHJvb2ZzAAAIBQJlWA9zZW5kZXJQdWJsaWNLZXkEAmhTCQD0AwMIBQJlWAlib2R5Qnl0ZXMJAJEDAggFAmVYBnByb29mcwABBQJoUAMDAwUCaFEFAmhSBwUCaFMHBgkBAmF6AwUCaFEFAmhSBQJoUwMJAAECBQJhRQIUU2V0U2NyaXB0VHJhbnNhY3Rpb24EAmRJBQJhRQQCaFQJAPYDAQkBBXZhbHVlAQgFAmRJBnNjcmlwdAQCaFUJANsEAQkBBXZhbHVlAQkAnQgCBQJhTgkBAmF4AAQCaFYJAPEHAQUEdGhpcwMDCQAAAgUCaFUFAmhUCQECIT0CBQJoVgUCaFQHBgkA9AMDCAUCaE0JYm9keUJ5dGVzCQCRAwIIBQJoTQZwcm9vZnMAAAUCaE8JAPQDAwgFAmhNCWJvZHlCeXRlcwkAkQMCCAUCaE0GcHJvb2ZzAAAFAmhPS+HNdQ==", "chainId": 84, "height": 2349940, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3fxAE1V8ZcKjxvj8KcJ98NozrcCVL72USbdwGzKNm1L2 Next: HR6oXbCioJHvV5jnWikPf4H7osH5K7zGfDgEAqrnk2VL Diff:
OldNewDifferences
602602
603603
604604 func calcDLp (amountBalance,priceBalance,lpEmission) = {
605- let updatedDLp = fraction(getD([amountBalance, priceBalance]), scale18, lpEmission)
605+ let scale = toBigInt(1000000000000)
606+ let updatedDLp = fraction(getD([amountBalance, priceBalance]), scale, lpEmission)
606607 if ((lpEmission == big0))
607608 then big0
608609 else updatedDLp
636637 func validateMatcherOrderAllowed (order) = {
637638 let amountAssetAmount = order.amount
638639 let priceAssetAmount = fraction(order.amount, order.price, scale8, FLOOR)
639- let $t02410624318 = if ((order.orderType == Buy))
640+ let $t02414724359 = if ((order.orderType == Buy))
640641 then $Tuple2(amountAssetAmount, -(priceAssetAmount))
641642 else $Tuple2(-(amountAssetAmount), priceAssetAmount)
642- let amountAssetBalanceDelta = $t02410624318._1
643- let priceAssetBalanceDelta = $t02410624318._2
643+ let amountAssetBalanceDelta = $t02414724359._1
644+ let priceAssetBalanceDelta = $t02414724359._2
644645 if (if (if (igs())
645646 then true
646647 else (cfgPoolStatus == PoolMatcherDis))
653654 then throw("Wr assets")
654655 else {
655656 let dLp = parseBigIntValue(getStringValue(this, keyDLp))
656- let $t02464824748 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
657- let unusedActions = $t02464824748._1
658- let dLpNew = $t02464824748._2
657+ let $t02468924789 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
658+ let unusedActions = $t02468924789._1
659+ let dLpNew = $t02468924789._2
659660 let isOrderValid = (dLpNew >= dLp)
660661 isOrderValid
661662 }
709710 then {
710711 let amBalance = getAccBalance(amId)
711712 let prBalance = getAccBalance(prId)
712- let $t02706527527 = if ((txId == ""))
713+ let $t02710627568 = if ((txId == ""))
713714 then $Tuple2(amBalance, prBalance)
714715 else if ((pmtAssetId == amId))
715716 then if ((pmtAmtRaw > amBalance))
720721 then throw("invalid payment amount")
721722 else $Tuple2(amBalance, (prBalance - pmtAmtRaw))
722723 else throw("wrong pmtAssetId")
723- let amBalanceOld = $t02706527527._1
724- let prBalanceOld = $t02706527527._2
725- let $t02753327709 = if ((pmtAssetId == amId))
724+ let amBalanceOld = $t02710627568._1
725+ let prBalanceOld = $t02710627568._2
726+ let $t02757427750 = if ((pmtAssetId == amId))
726727 then $Tuple2(pmtAmtRaw, 0)
727728 else if ((pmtAssetId == prId))
728729 then $Tuple2(0, pmtAmtRaw)
729730 else throw("invalid payment")
730- let amAmountRaw = $t02753327709._1
731- let prAmountRaw = $t02753327709._2
732- let $t02771327952 = if (withTakeFee)
731+ let amAmountRaw = $t02757427750._1
732+ let prAmountRaw = $t02757427750._2
733+ let $t02775427993 = if (withTakeFee)
733734 then $Tuple3(takeFee(amAmountRaw)._1, takeFee(prAmountRaw)._1, takeFee(pmtAmtRaw)._2)
734735 else $Tuple3(amAmountRaw, prAmountRaw, 0)
735- let amAmount = $t02771327952._1
736- let prAmount = $t02771327952._2
737- let feeAmount = $t02771327952._3
736+ let amAmount = $t02775427993._1
737+ let prAmount = $t02775427993._2
738+ let feeAmount = $t02775427993._3
738739 let amBalanceNew = (amBalanceOld + amAmount)
739740 let prBalanceNew = (prBalanceOld + prAmount)
740741 let D0 = getD([toBigInt(amBalanceOld), toBigInt(prBalanceOld)])
783784 else {
784785 let amBalance = getAccBalance(amId)
785786 let prBalance = getAccBalance(prId)
786- let $t03001030121 = {
787+ let $t03005130162 = {
787788 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)
788789 if ($isInstanceOf(@, "(Int, Int)"))
789790 then @
790791 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
791792 }
792- if (($t03001030121 == $t03001030121))
793+ if (($t03005130162 == $t03005130162))
793794 then {
794- let feeAmount = $t03001030121._2
795- let totalGet = $t03001030121._1
795+ let feeAmount = $t03005130162._2
796+ let totalGet = $t03005130162._1
796797 let totalAmount = if (if ((minOutAmount > 0))
797798 then (minOutAmount > totalGet)
798799 else false)
799800 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
800801 else totalGet
801- let $t03031130618 = if ((outAssetId == amId))
802+ let $t03035230659 = if ((outAssetId == amId))
802803 then $Tuple4(totalAmount, 0, ((amBalance - totalAmount) - feeAmount), prBalance)
803804 else if ((outAssetId == prId))
804805 then $Tuple4(0, totalAmount, amBalance, ((prBalance - totalAmount) - feeAmount))
805806 else throw("invalid out asset id")
806- let outAm = $t03031130618._1
807- let outPr = $t03031130618._2
808- let amBalanceNew = $t03031130618._3
809- let prBalanceNew = $t03031130618._4
807+ let outAm = $t03035230659._1
808+ let outPr = $t03035230659._2
809+ let amBalanceNew = $t03035230659._3
810+ let prBalanceNew = $t03035230659._4
810811 let curPrX18 = cpbi(t1(prBalanceNew, prDecimals), t1(amBalanceNew, amDecimals))
811812 let curPr = f1(curPrX18, scale8)
812813 let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
821822 let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
822823 if ((burn == burn))
823824 then {
824- let $t03140331753 = {
825+ let $t03144431794 = {
825826 let feeAmountForCalc = if ((this == feeCollectorAddress))
826827 then 0
827828 else feeAmount
832833 then $Tuple2(-((totalGet + feeAmountForCalc)), 0)
833834 else $Tuple2(0, -((totalGet + feeAmountForCalc)))
834835 }
835- let amountAssetBalanceDelta = $t03140331753._1
836- let priceAssetBalanceDelta = $t03140331753._2
837- let $t03175631864 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
838- let refreshDLpActions = $t03175631864._1
839- let updatedDLp = $t03175631864._2
836+ let amountAssetBalanceDelta = $t03144431794._1
837+ let priceAssetBalanceDelta = $t03144431794._2
838+ let $t03179731905 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
839+ let refreshDLpActions = $t03179731905._1
840+ let updatedDLp = $t03179731905._2
840841 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
841842 if ((isUpdatedDLpValid == isUpdatedDLpValid))
842843 then $Tuple2((state ++ refreshDLpActions), totalAmount)
996997 else throw("Strict value is not equal to itself.")
997998 }
998999 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
999- let $t03572035785 = refreshDLpInternal(0, 0, 0)
1000- let refreshDLpActions = $t03572035785._1
1001- let updatedDLp = $t03572035785._2
1000+ let $t03576135826 = refreshDLpInternal(0, 0, 0)
1001+ let refreshDLpActions = $t03576135826._1
1002+ let updatedDLp = $t03576135826._2
10021003 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
10031004 if ((isUpdatedDLpValid == isUpdatedDLpValid))
10041005 then ((state ++ lpTrnsfr) ++ refreshDLpActions)
10541055 let pmt = value(i.payments[0])
10551056 let pmtAssetId = toBase58String(value(pmt.assetId))
10561057 let pmtAmt = pmt.amount
1057- let $t03692237080 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId), true)
1058- if (($t03692237080 == $t03692237080))
1058+ let $t03696337121 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId), true)
1059+ if (($t03696337121 == $t03696337121))
10591060 then {
1060- let feeAmount = $t03692237080._3
1061- let state = $t03692237080._2
1062- let estimLP = $t03692237080._1
1061+ let feeAmount = $t03696337121._3
1062+ let state = $t03696337121._2
1063+ let estimLP = $t03696337121._1
10631064 let emitLpAmt = if (if ((minOutAmount > 0))
10641065 then (minOutAmount > estimLP)
10651066 else false)
10871088 let sendFeeToMatcher = if ((feeAmount > 0))
10881089 then [ScriptTransfer(feeCollectorAddress, feeAmount, fromBase58String(pmtAssetId))]
10891090 else nil
1090- let $t03789538244 = if ((this == feeCollectorAddress))
1091+ let $t03793638285 = if ((this == feeCollectorAddress))
10911092 then $Tuple2(0, 0)
10921093 else {
10931094 let paymentInAmountAsset = if ((pmt.assetId == cfgAmountAssetId))
10971098 then $Tuple2(-(feeAmount), 0)
10981099 else $Tuple2(0, -(feeAmount))
10991100 }
1100- let amountAssetBalanceDelta = $t03789538244._1
1101- let priceAssetBalanceDelta = $t03789538244._2
1102- let $t03824738355 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1103- let refreshDLpActions = $t03824738355._1
1104- let updatedDLp = $t03824738355._2
1101+ let amountAssetBalanceDelta = $t03793638285._1
1102+ let priceAssetBalanceDelta = $t03793638285._2
1103+ let $t03828838396 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1104+ let refreshDLpActions = $t03828838396._1
1105+ let updatedDLp = $t03828838396._2
11051106 $Tuple2((((state ++ lpTrnsfr) ++ sendFeeToMatcher) ++ refreshDLpActions), emitLpAmt)
11061107 }
11071108 else throw("Strict value is not equal to itself.")
11281129 let currentDLp = calcCurrentDLp(amAssetPmt, prAssetPmt, toBigInt(0))
11291130 if ((currentDLp == currentDLp))
11301131 then {
1131- let $t03931439379 = refreshDLpInternal(0, 0, 0)
1132- let refreshDLpActions = $t03931439379._1
1133- let updatedDLp = $t03931439379._2
1132+ let $t03935539420 = refreshDLpInternal(0, 0, 0)
1133+ let refreshDLpActions = $t03935539420._1
1134+ let updatedDLp = $t03935539420._2
11341135 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
11351136 if ((isUpdatedDLpValid == isUpdatedDLpValid))
11361137 then (state ++ refreshDLpActions)
11531154 if ((b == b))
11541155 then {
11551156 let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(pmtAmt))
1156- let $t04016840250 = refreshDLpInternal(-(outAmtAmt), -(outPrAmt), 0)
1157- let refreshDLpActions = $t04016840250._1
1158- let updatedDLp = $t04016840250._2
1157+ let $t04020940291 = refreshDLpInternal(-(outAmtAmt), -(outPrAmt), 0)
1158+ let refreshDLpActions = $t04020940291._1
1159+ let updatedDLp = $t04020940291._2
11591160 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
11601161 if ((isUpdatedDLpValid == isUpdatedDLpValid))
11611162 then (state ++ refreshDLpActions)
11881189 else throwErr("exactly 1 payment are expected")]
11891190 if ((checks == checks))
11901191 then {
1191- let $t04086841023 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1192- let state = $t04086841023._1
1193- let totalAmount = $t04086841023._2
1192+ let $t04090941064 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1193+ let state = $t04090941064._1
1194+ let totalAmount = $t04090941064._2
11941195 $Tuple2(state, totalAmount)
11951196 }
11961197 else throw("Strict value is not equal to itself.")
12071208 if ((checkLastRefreshedBlockHeight == checkLastRefreshedBlockHeight))
12081209 then {
12091210 let dLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyDLp), "0")), fmtErr("invalid dLp"))
1210- let $t04154741611 = refreshDLpInternal(0, 0, 0)
1211- let dLpUpdateActions = $t04154741611._1
1212- let updatedDLp = $t04154741611._2
1211+ let $t04158841652 = refreshDLpInternal(0, 0, 0)
1212+ let dLpUpdateActions = $t04158841652._1
1213+ let updatedDLp = $t04158841652._2
12131214 let actions = if ((dLp != updatedDLp))
12141215 then dLpUpdateActions
12151216 else throwErr("nothing to refresh")
12381239 let newY = getYD(xp, index, D1)
12391240 let dy = (xp[index] - newY)
12401241 let totalGetRaw = max([0, toInt((dy - big1))])
1241- let $t04251142560 = takeFee(totalGetRaw)
1242- let totalGet = $t04251142560._1
1243- let feeAmount = $t04251142560._2
1242+ let $t04255242601 = takeFee(totalGetRaw)
1243+ let totalGet = $t04255242601._1
1244+ let feeAmount = $t04255242601._2
12441245 $Tuple2(nil, $Tuple2(totalGet, feeAmount))
12451246 }
12461247
12541255 let lpId = poolConfig[idxLPAsId]
12551256 let amBalance = getAccBalance(amId)
12561257 let prBalance = getAccBalance(prId)
1257- let $t04290543020 = {
1258+ let $t04294643061 = {
12581259 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)
12591260 if ($isInstanceOf(@, "(Int, Int)"))
12601261 then @
12611262 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
12621263 }
1263- let totalGet = $t04290543020._1
1264- let feeAmount = $t04290543020._2
1264+ let totalGet = $t04294643061._1
1265+ let feeAmount = $t04294643061._2
12651266 let r = ego("", lpId, lpAssetAmount, this)
12661267 let outAmAmt = r._1
12671268 let outPrAmt = r._2
12931294 let burnLPAssetOnFactory = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
12941295 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
12951296 then {
1296- let $t04418844269 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1297- let refreshDLpActions = $t04418844269._1
1298- let updatedDLp = $t04418844269._2
1297+ let $t04422944310 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1298+ let refreshDLpActions = $t04422944310._1
1299+ let updatedDLp = $t04422944310._2
12991300 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
13001301 if ((isUpdatedDLpValid == isUpdatedDLpValid))
13011302 then (state ++ refreshDLpActions)
13371338 let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
13381339 if ((burnA == burnA))
13391340 then {
1340- let $t04533245413 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1341- let refreshDLpActions = $t04533245413._1
1342- let updatedDLp = $t04533245413._2
1341+ let $t04537345454 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1342+ let refreshDLpActions = $t04537345454._1
1343+ let updatedDLp = $t04537345454._2
13431344 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
13441345 if ((isUpdatedDLpValid == isUpdatedDLpValid))
13451346 then (state ++ refreshDLpActions)
13861387 let burnLPAssetOnFactory = invoke(fca, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
13871388 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
13881389 then {
1389- let $t04666146742 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1390- let refreshDLpActions = $t04666146742._1
1391- let updatedDLp = $t04666146742._2
1390+ let $t04670246783 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1391+ let refreshDLpActions = $t04670246783._1
1392+ let updatedDLp = $t04670246783._2
13921393 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
13931394 if ((isUpdatedDLpValid == isUpdatedDLpValid))
13941395 then (state ++ refreshDLpActions)
14341435 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), unstakeAmount], nil)
14351436 if ((unstakeInv == unstakeInv))
14361437 then {
1437- let $t04767647864 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1438- let state = $t04767647864._1
1439- let totalAmount = $t04767647864._2
1438+ let $t04771747905 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1439+ let state = $t04771747905._1
1440+ let totalAmount = $t04771747905._2
14401441 $Tuple2(state, totalAmount)
14411442 }
14421443 else throw("Strict value is not equal to itself.")
14521453 let amId = poolConfig[idxAmAsId]
14531454 let prId = poolConfig[idxPrAsId]
14541455 let lpId = poolConfig[idxLPAsId]
1455- let $t04812348226 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1456- let lpAmount = $t04812348226._1
1457- let state = $t04812348226._2
1458- let feeAmount = $t04812348226._3
1459- let bonus = $t04812348226._4
1456+ let $t04816448267 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1457+ let lpAmount = $t04816448267._1
1458+ let state = $t04816448267._2
1459+ let feeAmount = $t04816448267._3
1460+ let bonus = $t04816448267._4
14601461 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
14611462 }
14621463
14681469 let amId = poolConfig[idxAmAsId]
14691470 let prId = poolConfig[idxPrAsId]
14701471 let lpId = poolConfig[idxLPAsId]
1471- let $t04850548609 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1472- let lpAmount = $t04850548609._1
1473- let state = $t04850548609._2
1474- let feeAmount = $t04850548609._3
1475- let bonus = $t04850548609._4
1472+ let $t04854648650 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1473+ let lpAmount = $t04854648650._1
1474+ let state = $t04854648650._2
1475+ let feeAmount = $t04854648650._3
1476+ let bonus = $t04854648650._4
14761477 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
14771478 }
14781479
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let scale8 = 100000000
55
66 let scale8BigInt = toBigInt(100000000)
77
88 let scale18 = toBigInt(1000000000000000000)
99
1010 let zeroBigInt = toBigInt(0)
1111
1212 let big0 = toBigInt(0)
1313
1414 let big1 = toBigInt(1)
1515
1616 let big2 = toBigInt(2)
1717
1818 let big3 = toBigInt(3)
1919
2020 let big4 = toBigInt(4)
2121
2222 let slippage4D = toBigInt((scale8 - ((scale8 * 1) / scale8)))
2323
2424 let wavesString = "WAVES"
2525
2626 let Amult = "100"
2727
2828 let Dconv = "1"
2929
3030 let SEP = "__"
3131
3232 let EMPTY = ""
3333
3434 let PoolActive = 1
3535
3636 let PoolPutDis = 2
3737
3838 let PoolMatcherDis = 3
3939
4040 let PoolShutdown = 4
4141
4242 let idxPoolAddress = 1
4343
4444 let idxPoolSt = 2
4545
4646 let idxLPAsId = 3
4747
4848 let idxAmAsId = 4
4949
5050 let idxPrAsId = 5
5151
5252 let idxAmtAsDcm = 6
5353
5454 let idxPriceAsDcm = 7
5555
5656 let idxIAmtAsId = 8
5757
5858 let idxIPriceAsId = 9
5959
6060 let idxFactStakCntr = 1
6161
6262 let idxFactoryRestCntr = 6
6363
6464 let idxFactSlippCntr = 7
6565
6666 let idxFactGwxRewCntr = 10
6767
6868 let feeDefault = fraction(10, scale8, 10000)
6969
7070 func t1 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
7171
7272
7373 func f1 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
7474
7575
7676 func ts (amt,resScale,curScale) = fraction(amt, resScale, curScale)
7777
7878
7979 func abs (val) = if ((zeroBigInt > val))
8080 then -(val)
8181 else val
8282
8383
8484 func absBigInt (val) = if ((zeroBigInt > val))
8585 then -(val)
8686 else val
8787
8888
8989 func fc () = "%s__factoryContract"
9090
9191
9292 func mpk () = "%s__managerPublicKey"
9393
9494
9595 func pmpk () = "%s__pendingManagerPublicKey"
9696
9797
9898 func pl () = "%s%s__price__last"
9999
100100
101101 func ph (h,t) = makeString(["%s%s%d%d__price__history", toString(h), toString(t)], SEP)
102102
103103
104104 func pau (ua,txId) = ((("%s%s%s__P__" + ua) + "__") + txId)
105105
106106
107107 func gau (ua,txId) = ((("%s%s%s__G__" + ua) + "__") + txId)
108108
109109
110110 func aa () = "%s__amountAsset"
111111
112112
113113 func pa () = "%s__priceAsset"
114114
115115
116116 func amp () = "%s__amp"
117117
118118
119119 func ada () = "%s__addonAddr"
120120
121121
122122 let keyFee = "%s__fee"
123123
124124 let fee = valueOrElse(getInteger(this, keyFee), feeDefault)
125125
126126 let keyDLp = makeString(["%s", "dLp"], SEP)
127127
128128 let keyDLpRefreshedHeight = makeString(["%s", "dLpRefreshedHeight"], SEP)
129129
130130 let keyDLpRefreshDelay = makeString(["%s", "refreshDLpDelay"], SEP)
131131
132132 let dLpRefreshDelayDefault = 1
133133
134134 let dLpRefreshDelay = valueOrElse(getInteger(this, keyDLpRefreshDelay), dLpRefreshDelayDefault)
135135
136136 func fcfg () = "%s__factoryConfig"
137137
138138
139139 func mtpk () = "%s%s__matcher__publicKey"
140140
141141
142142 func pc (iAmtAs,iPrAs) = (((("%d%d%s__" + iAmtAs) + "__") + iPrAs) + "__config")
143143
144144
145145 func mba (bAStr) = ("%s%s%s__mappings__baseAsset2internalId__" + bAStr)
146146
147147
148148 func aps () = "%s__shutdown"
149149
150150
151151 func keyAllowedLpStableScriptHash () = "%s__allowedLpStableScriptHash"
152152
153153
154154 func keyFeeCollectorAddress () = "%s__feeCollectorAddress"
155155
156156
157157 func toe (orV,sendrV,matchV) = throw(((((("Failed: ordValid=" + toString(orV)) + " sndrValid=") + toString(sendrV)) + " mtchrValid=") + toString(matchV)))
158158
159159
160160 func str (val) = match val {
161161 case valStr: String =>
162162 valStr
163163 case _ =>
164164 throw("fail cast to String")
165165 }
166166
167167
168168 func strf (addr,key) = valueOrErrorMessage(getString(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
169169
170170
171171 func intf (addr,key) = valueOrErrorMessage(getInteger(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
172172
173173
174174 func throwErr (msg) = throw(makeString(["lp_stable.ride:", msg], " "))
175175
176176
177177 func fmtErr (msg) = makeString(["lp_stable.ride:", msg], " ")
178178
179179
180180 let fca = addressFromStringValue(strf(this, fc()))
181181
182182 let A = strf(this, amp())
183183
184184 func igs () = valueOrElse(getBoolean(fca, aps()), false)
185185
186186
187187 func mp () = fromBase58String(strf(fca, mtpk()))
188188
189189
190190 let feeCollectorAddress = addressFromStringValue(strf(fca, keyFeeCollectorAddress()))
191191
192192 func gpc () = {
193193 let amtAs = strf(this, aa())
194194 let priceAs = strf(this, pa())
195195 let iPriceAs = intf(fca, mba(priceAs))
196196 let iAmtAs = intf(fca, mba(amtAs))
197197 split(strf(fca, pc(toString(iAmtAs), toString(iPriceAs))), SEP)
198198 }
199199
200200
201201 func parseAssetId (input) = if ((input == wavesString))
202202 then unit
203203 else fromBase58String(input)
204204
205205
206206 func assetIdToString (input) = if ((input == unit))
207207 then wavesString
208208 else toBase58String(value(input))
209209
210210
211211 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]))
212212
213213
214214 let poolConfigParsed = parsePoolConfig(gpc())
215215
216216 let $t072557441 = poolConfigParsed
217217
218218 let cfgPoolAddress = $t072557441._1
219219
220220 let cfgPoolStatus = $t072557441._2
221221
222222 let cfgLpAssetId = $t072557441._3
223223
224224 let cfgAmountAssetId = $t072557441._4
225225
226226 let cfgPriceAssetId = $t072557441._5
227227
228228 let cfgAmountAssetDecimals = $t072557441._6
229229
230230 let cfgPriceAssetDecimals = $t072557441._7
231231
232232 func gfc () = split(strf(fca, fcfg()), SEP)
233233
234234
235235 let factoryConfig = gfc()
236236
237237 let stakingContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactStakCntr]), "Invalid staking contract address")
238238
239239 let slipageContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactSlippCntr]), "Invalid slipage contract address")
240240
241241 let gwxContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactGwxRewCntr]), "Invalid gwx contract address")
242242
243243 let restContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactoryRestCntr]), "Invalid gwx contract address")
244244
245245 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)
246246
247247
248248 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)
249249
250250
251251 func getAccBalance (assetId) = if ((assetId == "WAVES"))
252252 then wavesBalance(this).available
253253 else assetBalance(this, fromBase58String(assetId))
254254
255255
256256 func cpbi (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
257257
258258
259259 func vad (A1,A2,slippage) = {
260260 let diff = fraction((A1 - A2), scale8BigInt, A2)
261261 let pass = ((slippage - abs(diff)) > zeroBigInt)
262262 if (!(pass))
263263 then throw(("Big slpg: " + toString(diff)))
264264 else $Tuple2(pass, min([A1, A2]))
265265 }
266266
267267
268268 func vd (D1,D0,slpg) = {
269269 let diff = fraction(D0, scale8BigInt, D1)
270270 let fail = (slpg > diff)
271271 if (if (fail)
272272 then true
273273 else (D0 > D1))
274274 then throw(((((((toString(D0) + " ") + toString(D1)) + " ") + toString(diff)) + " ") + toString(slpg)))
275275 else fail
276276 }
277277
278278
279279 func pcp (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
280280 let amtAsAmtX18 = t1(amAmt, amAssetDcm)
281281 let prAsAmtX18 = t1(prAmt, prAssetDcm)
282282 cpbi(prAsAmtX18, amtAsAmtX18)
283283 }
284284
285285
286286 func calcPrices (amAmt,prAmt,lpAmt) = {
287287 let cfg = gpc()
288288 let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
289289 let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
290290 let priceX18 = pcp(amtAsDcm, prAsDcm, amAmt, prAmt)
291291 let amAmtX18 = t1(amAmt, amtAsDcm)
292292 let prAmtX18 = t1(prAmt, prAsDcm)
293293 let lpAmtX18 = t1(lpAmt, scale8)
294294 let lpPrInAmAsX18 = cpbi(amAmtX18, lpAmtX18)
295295 let lpPrInPrAsX18 = cpbi(prAmtX18, lpAmtX18)
296296 [priceX18, lpPrInAmAsX18, lpPrInPrAsX18]
297297 }
298298
299299
300300 func calculatePrices (amAmt,prAmt,lpAmt) = {
301301 let p = calcPrices(amAmt, prAmt, lpAmt)
302302 [f1(p[0], scale8), f1(p[1], scale8), f1(p[2], scale8)]
303303 }
304304
305305
306306 func takeFee (amount) = {
307307 let feeAmount = fraction(amount, fee, scale8)
308308 $Tuple2((amount - feeAmount), feeAmount)
309309 }
310310
311311
312312 func ego (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
313313 let cfg = gpc()
314314 let lpId = cfg[idxLPAsId]
315315 let amId = cfg[idxAmAsId]
316316 let prId = cfg[idxPrAsId]
317317 let amDcm = parseIntValue(cfg[idxAmtAsDcm])
318318 let prDcm = parseIntValue(cfg[idxPriceAsDcm])
319319 let sts = cfg[idxPoolSt]
320320 let lpEmiss = valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "Wrong LP id").quantity
321321 if ((lpId != pmtAssetId))
322322 then throw("Wrong pmt asset")
323323 else {
324324 let amBalance = getAccBalance(amId)
325325 let amBalanceX18 = t1(amBalance, amDcm)
326326 let prBalance = getAccBalance(prId)
327327 let prBalanceX18 = t1(prBalance, prDcm)
328328 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
329329 let curPrice = f1(curPriceX18, scale8)
330330 let pmtLpAmtX18 = t1(pmtLpAmt, scale8)
331331 let lpEmissX18 = t1(lpEmiss, scale8)
332332 let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissX18)
333333 let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissX18)
334334 let outAmAmt = f1(outAmAmtX18, amDcm)
335335 let outPrAmt = f1(outPrAmtX18, prDcm)
336336 let state = if ((txId58 == ""))
337337 then nil
338338 else [ScriptTransfer(userAddress, outAmAmt, if ((amId == "WAVES"))
339339 then unit
340340 else fromBase58String(amId)), ScriptTransfer(userAddress, outPrAmt, if ((prId == "WAVES"))
341341 then unit
342342 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)]
343343 $Tuple10(outAmAmt, outPrAmt, amId, prId, amBalance, prBalance, lpEmiss, curPriceX18, sts, state)
344344 }
345345 }
346346
347347
348348 func epo (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,userAddress,isEval,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
349349 let cfg = gpc()
350350 let lpId = fromBase58String(cfg[idxLPAsId])
351351 let amIdStr = cfg[idxAmAsId]
352352 let prIdStr = cfg[idxPrAsId]
353353 let inAmIdStr = cfg[idxIAmtAsId]
354354 let inPrIdStr = cfg[idxIPriceAsId]
355355 let amtDcm = parseIntValue(cfg[idxAmtAsDcm])
356356 let priceDcm = parseIntValue(cfg[idxPriceAsDcm])
357357 let sts = cfg[idxPoolSt]
358358 let lpEm = valueOrErrorMessage(assetInfo(lpId), "Wr lp as").quantity
359359 let amBalance = if (isEval)
360360 then getAccBalance(amIdStr)
361361 else if (if (isOneAsset)
362362 then (pmtId == amIdStr)
363363 else false)
364364 then (getAccBalance(amIdStr) - pmtAmt)
365365 else if (isOneAsset)
366366 then getAccBalance(amIdStr)
367367 else (getAccBalance(amIdStr) - inAmAmt)
368368 let prBalance = if (isEval)
369369 then getAccBalance(prIdStr)
370370 else if (if (isOneAsset)
371371 then (pmtId == prIdStr)
372372 else false)
373373 then (getAccBalance(prIdStr) - pmtAmt)
374374 else if (isOneAsset)
375375 then getAccBalance(prIdStr)
376376 else (getAccBalance(prIdStr) - inPrAmt)
377377 let inAmAssetAmtX18 = t1(inAmAmt, amtDcm)
378378 let inPrAssetAmtX18 = t1(inPrAmt, priceDcm)
379379 let userPriceX18 = cpbi(inPrAssetAmtX18, inAmAssetAmtX18)
380380 let amBalanceX18 = t1(amBalance, amtDcm)
381381 let prBalanceX18 = t1(prBalance, priceDcm)
382382 let r = if ((lpEm == 0))
383383 then {
384384 let curPriceX18 = zeroBigInt
385385 let slippageX18 = zeroBigInt
386386 let lpAmtX18 = pow((inAmAssetAmtX18 * inPrAssetAmtX18), 0, toBigInt(5), 1, 0, DOWN)
387387 $Tuple5(f1(lpAmtX18, scale8), f1(inAmAssetAmtX18, amtDcm), f1(inPrAssetAmtX18, priceDcm), cpbi((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
388388 }
389389 else {
390390 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
391391 let slippageRealX18 = fraction(abs((curPriceX18 - userPriceX18)), scale18, curPriceX18)
392392 let slippageX18 = t1(slippage, scale8)
393393 if (if (if (validateSlippage)
394394 then (curPriceX18 != zeroBigInt)
395395 else false)
396396 then (slippageRealX18 > slippageX18)
397397 else false)
398398 then throw(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
399399 else {
400400 let lpEmissionX18 = t1(lpEm, scale8)
401401 let prViaAmX18 = fraction(inAmAssetAmtX18, curPriceX18, scale18)
402402 let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, curPriceX18)
403403 let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
404404 then $Tuple2(amViaPrX18, inPrAssetAmtX18)
405405 else $Tuple2(inAmAssetAmtX18, prViaAmX18)
406406 let expAmtAssetAmtX18 = expectedAmts._1
407407 let expPriceAssetAmtX18 = expectedAmts._2
408408 let lpAmtX18 = fraction(lpEmissionX18, expPriceAssetAmtX18, prBalanceX18)
409409 $Tuple5(f1(lpAmtX18, scale8), f1(expAmtAssetAmtX18, amtDcm), f1(expPriceAssetAmtX18, priceDcm), curPriceX18, slippageX18)
410410 }
411411 }
412412 let calcLpAmt = r._1
413413 let calcAmAssetPmt = r._2
414414 let calcPrAssetPmt = r._3
415415 let curPrice = f1(r._4, scale8)
416416 let slippageCalc = f1(r._5, scale8)
417417 if ((0 >= calcLpAmt))
418418 then throw("LP <= 0")
419419 else {
420420 let emitLpAmt = if (!(emitLp))
421421 then 0
422422 else calcLpAmt
423423 let amDiff = (inAmAmt - calcAmAssetPmt)
424424 let prDiff = (inPrAmt - calcPrAssetPmt)
425425 let $t01787218217 = if (if (isOneAsset)
426426 then (pmtId == amIdStr)
427427 else false)
428428 then $Tuple2(pmtAmt, 0)
429429 else if (if (isOneAsset)
430430 then (pmtId == prIdStr)
431431 else false)
432432 then $Tuple2(0, pmtAmt)
433433 else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
434434 let writeAmAmt = $t01787218217._1
435435 let writePrAmt = $t01787218217._2
436436 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))]
437437 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
438438 }
439439 }
440440
441441
442442 func getD (xp) = {
443443 let xp0 = xp[0]
444444 let xp1 = xp[1]
445445 let s = (xp0 + xp1)
446446 if ((s == big0))
447447 then big0
448448 else {
449449 let a = parseIntValue(A)
450450 let ann = (a * 2)
451451 let p = fraction(xp0, xp1, big1)
452452 let xp0_xp1_n_n = fraction(p, big4, big1)
453453 let ann_s = fraction(toBigInt(ann), s, big1)
454454 let ann_1 = toBigInt((ann - 1))
455455 func calcDNext (d) = {
456456 let dd = fraction(d, d, big1)
457457 let ddd = fraction(dd, d, big1)
458458 let dp = fraction(ddd, big1, xp0_xp1_n_n)
459459 fraction((ann_s + fraction(dp, big2, big1)), d, (fraction(ann_1, d, big1) + fraction(big3, dp, big1)))
460460 }
461461
462462 func calc (acc,i) = if (acc._2)
463463 then acc
464464 else {
465465 let d = acc._1
466466 let dNext = calcDNext(d)
467467 let dDiffRaw = toInt((dNext - value(d)))
468468 let dDiff = if ((0 > dDiffRaw))
469469 then -(dDiffRaw)
470470 else dDiffRaw
471471 if ((1 >= dDiff))
472472 then $Tuple2(dNext, true)
473473 else $Tuple2(dNext, false)
474474 }
475475
476476 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
477477 let $t02012820176 = {
478478 let $l = arr
479479 let $s = size($l)
480480 let $acc0 = $Tuple2(s, false)
481481 func $f0_1 ($a,$i) = if (($i >= $s))
482482 then $a
483483 else calc($a, $l[$i])
484484
485485 func $f0_2 ($a,$i) = if (($i >= $s))
486486 then $a
487487 else throw("List size exceeds 15")
488488
489489 $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)
490490 }
491491 let d = $t02012820176._1
492492 let found = $t02012820176._2
493493 if (found)
494494 then d
495495 else throw(("D calculation error, D = " + toString(d)))
496496 }
497497 }
498498
499499
500500 func getDOld (xp) = {
501501 let n = big2
502502 let xp0 = xp[0]
503503 let xp1 = xp[1]
504504 let aPrecision = parseBigIntValue(Amult)
505505 let a = (parseBigIntValue(A) * aPrecision)
506506 let s = (xp0 + xp1)
507507 if ((s == big0))
508508 then big0
509509 else {
510510 let ann = (a * n)
511511 let xp0_xp1_n_n = (((xp0 * xp1) * n) * n)
512512 let ann_s_aPrecision = ((ann * s) / aPrecision)
513513 let ann_aPrecision = (ann - aPrecision)
514514 let n1 = (n + big1)
515515 func calc (acc,cur) = {
516516 let $t02080520825 = acc
517517 let d = $t02080520825._1
518518 let found = $t02080520825._2
519519 if ((found != unit))
520520 then acc
521521 else {
522522 let dp = (((d * d) * d) / xp0_xp1_n_n)
523523 let dNext = (((ann_s_aPrecision + (dp * n)) * d) / (((ann_aPrecision * d) / aPrecision) + (n1 * dp)))
524524 let dDiff = absBigInt((dNext - value(d)))
525525 if ((big1 >= dDiff))
526526 then $Tuple2(dNext, cur)
527527 else $Tuple2(dNext, unit)
528528 }
529529 }
530530
531531 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
532532 let $t02124621293 = {
533533 let $l = arr
534534 let $s = size($l)
535535 let $acc0 = $Tuple2(s, unit)
536536 func $f0_1 ($a,$i) = if (($i >= $s))
537537 then $a
538538 else calc($a, $l[$i])
539539
540540 func $f0_2 ($a,$i) = if (($i >= $s))
541541 then $a
542542 else throw("List size exceeds 15")
543543
544544 $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)
545545 }
546546 let d = $t02124621293._1
547547 let found = $t02124621293._2
548548 if ((found != unit))
549549 then d
550550 else throw(("D calculation error, D = " + toString(d)))
551551 }
552552 }
553553
554554
555555 func getYD (xp,i,D) = {
556556 let n = big2
557557 let x = xp[if ((i == 0))
558558 then 1
559559 else 0]
560560 let aPrecision = parseBigIntValue(Amult)
561561 let a = (parseBigIntValue(A) * aPrecision)
562562 let s = x
563563 let ann = (a * n)
564564 let c = (((((D * D) / (x * n)) * D) * aPrecision) / (ann * n))
565565 let b = ((s + ((D * aPrecision) / ann)) - D)
566566 func calc (acc,cur) = {
567567 let $t02179321813 = acc
568568 let y = $t02179321813._1
569569 let found = $t02179321813._2
570570 if ((found != unit))
571571 then acc
572572 else {
573573 let yNext = (((y * y) + c) / ((big2 * y) + b))
574574 let yDiff = absBigInt((yNext - value(y)))
575575 if ((big1 >= yDiff))
576576 then $Tuple2(yNext, cur)
577577 else $Tuple2(yNext, unit)
578578 }
579579 }
580580
581581 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
582582 let $t02212022167 = {
583583 let $l = arr
584584 let $s = size($l)
585585 let $acc0 = $Tuple2(D, unit)
586586 func $f0_1 ($a,$i) = if (($i >= $s))
587587 then $a
588588 else calc($a, $l[$i])
589589
590590 func $f0_2 ($a,$i) = if (($i >= $s))
591591 then $a
592592 else throw("List size exceeds 15")
593593
594594 $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)
595595 }
596596 let y = $t02212022167._1
597597 let found = $t02212022167._2
598598 if ((found != unit))
599599 then y
600600 else throw(("Y calculation error, Y = " + toString(y)))
601601 }
602602
603603
604604 func calcDLp (amountBalance,priceBalance,lpEmission) = {
605- let updatedDLp = fraction(getD([amountBalance, priceBalance]), scale18, lpEmission)
605+ let scale = toBigInt(1000000000000)
606+ let updatedDLp = fraction(getD([amountBalance, priceBalance]), scale, lpEmission)
606607 if ((lpEmission == big0))
607608 then big0
608609 else updatedDLp
609610 }
610611
611612
612613 func calcCurrentDLp (amountAssetDelta,priceAssetDelta,lpAssetEmissionDelta) = {
613614 let amountAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgAmountAssetId))) - amountAssetDelta)
614615 let priceAssetBalance = (toBigInt(getAccBalance(assetIdToString(cfgPriceAssetId))) - priceAssetDelta)
615616 let lpAssetEmission = (toBigInt(value(assetInfo(cfgLpAssetId)).quantity) - lpAssetEmissionDelta)
616617 let currentDLp = calcDLp(amountAssetBalance, priceAssetBalance, lpAssetEmission)
617618 currentDLp
618619 }
619620
620621
621622 func refreshDLpInternal (amountAssetBalanceDelta,priceAssetBalanceDelta,lpAssetEmissionDelta) = {
622623 let amountAssetBalance = (getAccBalance(assetIdToString(cfgAmountAssetId)) + amountAssetBalanceDelta)
623624 let priceAssetBalance = (getAccBalance(assetIdToString(cfgPriceAssetId)) + priceAssetBalanceDelta)
624625 let lpAssetEmission = (value(assetInfo(cfgLpAssetId)).quantity + lpAssetEmissionDelta)
625626 let updatedDLp = calcDLp(toBigInt(amountAssetBalance), toBigInt(priceAssetBalance), toBigInt(lpAssetEmission))
626627 let actions = [IntegerEntry(keyDLpRefreshedHeight, height), StringEntry(keyDLp, toString(updatedDLp))]
627628 $Tuple2(actions, updatedDLp)
628629 }
629630
630631
631632 func validateUpdatedDLp (oldDLp,updatedDLp) = if ((updatedDLp >= oldDLp))
632633 then true
633634 else throwErr("updated DLp lower than current DLp")
634635
635636
636637 func validateMatcherOrderAllowed (order) = {
637638 let amountAssetAmount = order.amount
638639 let priceAssetAmount = fraction(order.amount, order.price, scale8, FLOOR)
639- let $t02410624318 = if ((order.orderType == Buy))
640+ let $t02414724359 = if ((order.orderType == Buy))
640641 then $Tuple2(amountAssetAmount, -(priceAssetAmount))
641642 else $Tuple2(-(amountAssetAmount), priceAssetAmount)
642- let amountAssetBalanceDelta = $t02410624318._1
643- let priceAssetBalanceDelta = $t02410624318._2
643+ let amountAssetBalanceDelta = $t02414724359._1
644+ let priceAssetBalanceDelta = $t02414724359._2
644645 if (if (if (igs())
645646 then true
646647 else (cfgPoolStatus == PoolMatcherDis))
647648 then true
648649 else (cfgPoolStatus == PoolShutdown))
649650 then throw("Admin blocked")
650651 else if (if ((order.assetPair.amountAsset != cfgAmountAssetId))
651652 then true
652653 else (order.assetPair.priceAsset != cfgPriceAssetId))
653654 then throw("Wr assets")
654655 else {
655656 let dLp = parseBigIntValue(getStringValue(this, keyDLp))
656- let $t02464824748 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
657- let unusedActions = $t02464824748._1
658- let dLpNew = $t02464824748._2
657+ let $t02468924789 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
658+ let unusedActions = $t02468924789._1
659+ let dLpNew = $t02468924789._2
659660 let isOrderValid = (dLpNew >= dLp)
660661 isOrderValid
661662 }
662663 }
663664
664665
665666 func cg (i) = if ((size(i.payments) != 1))
666667 then throw("1 pmnt exp")
667668 else {
668669 let pmt = value(i.payments[0])
669670 let pmtAssetId = value(pmt.assetId)
670671 let pmtAmt = pmt.amount
671672 let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
672673 let outAmAmt = r._1
673674 let outPrAmt = r._2
674675 let sts = parseIntValue(r._9)
675676 let state = r._10
676677 if (if (igs())
677678 then true
678679 else (sts == PoolShutdown))
679680 then throw(("Admin blocked: " + toString(sts)))
680681 else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state)
681682 }
682683
683684
684685 func cp (caller,txId,amAsPmt,prAsPmt,slippage,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
685686 let r = epo(txId, slippage, value(amAsPmt).amount, value(amAsPmt).assetId, value(prAsPmt).amount, value(prAsPmt).assetId, caller, (txId == ""), emitLp, isOneAsset, validateSlippage, pmtAmt, pmtId)
686687 let sts = parseIntValue(r._8)
687688 if (if (if (igs())
688689 then true
689690 else (sts == PoolPutDis))
690691 then true
691692 else (sts == PoolShutdown))
692693 then throw(("Blocked:" + toString(sts)))
693694 else r
694695 }
695696
696697
697698 func calcPutOneTkn (pmtAmtRaw,pmtAssetId,userAddress,txId,withTakeFee) = {
698699 let poolConfig = gpc()
699700 let amId = poolConfig[idxAmAsId]
700701 let prId = poolConfig[idxPrAsId]
701702 let lpId = poolConfig[idxLPAsId]
702703 let amtDcm = parseIntValue(poolConfig[idxAmtAsDcm])
703704 let priceDcm = parseIntValue(poolConfig[idxPriceAsDcm])
704705 let lpAssetEmission = toBigInt(valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "invalid lp asset").quantity)
705706 let chechEmission = if ((lpAssetEmission > big0))
706707 then true
707708 else throw("initial deposit requires all coins")
708709 if ((chechEmission == chechEmission))
709710 then {
710711 let amBalance = getAccBalance(amId)
711712 let prBalance = getAccBalance(prId)
712- let $t02706527527 = if ((txId == ""))
713+ let $t02710627568 = if ((txId == ""))
713714 then $Tuple2(amBalance, prBalance)
714715 else if ((pmtAssetId == amId))
715716 then if ((pmtAmtRaw > amBalance))
716717 then throw("invalid payment amount")
717718 else $Tuple2((amBalance - pmtAmtRaw), prBalance)
718719 else if ((pmtAssetId == prId))
719720 then if ((pmtAmtRaw > prBalance))
720721 then throw("invalid payment amount")
721722 else $Tuple2(amBalance, (prBalance - pmtAmtRaw))
722723 else throw("wrong pmtAssetId")
723- let amBalanceOld = $t02706527527._1
724- let prBalanceOld = $t02706527527._2
725- let $t02753327709 = if ((pmtAssetId == amId))
724+ let amBalanceOld = $t02710627568._1
725+ let prBalanceOld = $t02710627568._2
726+ let $t02757427750 = if ((pmtAssetId == amId))
726727 then $Tuple2(pmtAmtRaw, 0)
727728 else if ((pmtAssetId == prId))
728729 then $Tuple2(0, pmtAmtRaw)
729730 else throw("invalid payment")
730- let amAmountRaw = $t02753327709._1
731- let prAmountRaw = $t02753327709._2
732- let $t02771327952 = if (withTakeFee)
731+ let amAmountRaw = $t02757427750._1
732+ let prAmountRaw = $t02757427750._2
733+ let $t02775427993 = if (withTakeFee)
733734 then $Tuple3(takeFee(amAmountRaw)._1, takeFee(prAmountRaw)._1, takeFee(pmtAmtRaw)._2)
734735 else $Tuple3(amAmountRaw, prAmountRaw, 0)
735- let amAmount = $t02771327952._1
736- let prAmount = $t02771327952._2
737- let feeAmount = $t02771327952._3
736+ let amAmount = $t02775427993._1
737+ let prAmount = $t02775427993._2
738+ let feeAmount = $t02775427993._3
738739 let amBalanceNew = (amBalanceOld + amAmount)
739740 let prBalanceNew = (prBalanceOld + prAmount)
740741 let D0 = getD([toBigInt(amBalanceOld), toBigInt(prBalanceOld)])
741742 let D1 = getD([toBigInt(amBalanceNew), toBigInt(prBalanceNew)])
742743 let checkD = if ((D1 > D0))
743744 then true
744745 else throw()
745746 if ((checkD == checkD))
746747 then {
747748 let lpAmount = fraction(lpAssetEmission, (D1 - D0), D0)
748749 let curPrice = f1(cpbi(t1(prBalanceNew, priceDcm), t1(amBalanceNew, amtDcm)), scale8)
749750 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))]
750751 let poolProportion = fraction(prBalanceOld, scale8, amBalanceOld)
751752 let amountAssetPart = fraction(pmtAmtRaw, scale8, (poolProportion + scale8))
752753 let priceAssetPart = (pmtAmtRaw - amountAssetPart)
753754 let lpAmtBoth = fraction(lpAssetEmission, toBigInt(priceAssetPart), toBigInt(prBalanceOld))
754755 let bonus = toInt(fraction((lpAmount - lpAmtBoth), scale8BigInt, lpAmtBoth))
755756 $Tuple4(toInt(lpAmount), commonState, feeAmount, bonus)
756757 }
757758 else throw("Strict value is not equal to itself.")
758759 }
759760 else throw("Strict value is not equal to itself.")
760761 }
761762
762763
763764 func getOneTknV2Internal (outAssetId,minOutAmount,payments,caller,originCaller,transactionId) = {
764765 let poolConfig = gpc()
765766 let lpId = poolConfig[idxLPAsId]
766767 let amId = poolConfig[idxAmAsId]
767768 let prId = poolConfig[idxPrAsId]
768769 let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
769770 let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
770771 let poolStatus = poolConfig[idxPoolSt]
771772 let userAddress = if ((caller == restContract))
772773 then originCaller
773774 else caller
774775 let pmt = value(payments[0])
775776 let pmtAssetId = value(pmt.assetId)
776777 let pmtAmt = pmt.amount
777778 let currentDLp = calcCurrentDLp(big0, big0, big0)
778779 if ((currentDLp == currentDLp))
779780 then {
780781 let txId58 = toBase58String(transactionId)
781782 if ((lpId != toBase58String(pmtAssetId)))
782783 then throw("Wrong LP")
783784 else {
784785 let amBalance = getAccBalance(amId)
785786 let prBalance = getAccBalance(prId)
786- let $t03001030121 = {
787+ let $t03005130162 = {
787788 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)
788789 if ($isInstanceOf(@, "(Int, Int)"))
789790 then @
790791 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
791792 }
792- if (($t03001030121 == $t03001030121))
793+ if (($t03005130162 == $t03005130162))
793794 then {
794- let feeAmount = $t03001030121._2
795- let totalGet = $t03001030121._1
795+ let feeAmount = $t03005130162._2
796+ let totalGet = $t03005130162._1
796797 let totalAmount = if (if ((minOutAmount > 0))
797798 then (minOutAmount > totalGet)
798799 else false)
799800 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
800801 else totalGet
801- let $t03031130618 = if ((outAssetId == amId))
802+ let $t03035230659 = if ((outAssetId == amId))
802803 then $Tuple4(totalAmount, 0, ((amBalance - totalAmount) - feeAmount), prBalance)
803804 else if ((outAssetId == prId))
804805 then $Tuple4(0, totalAmount, amBalance, ((prBalance - totalAmount) - feeAmount))
805806 else throw("invalid out asset id")
806- let outAm = $t03031130618._1
807- let outPr = $t03031130618._2
808- let amBalanceNew = $t03031130618._3
809- let prBalanceNew = $t03031130618._4
807+ let outAm = $t03035230659._1
808+ let outPr = $t03035230659._2
809+ let amBalanceNew = $t03035230659._3
810+ let prBalanceNew = $t03035230659._4
810811 let curPrX18 = cpbi(t1(prBalanceNew, prDecimals), t1(amBalanceNew, amDecimals))
811812 let curPr = f1(curPrX18, scale8)
812813 let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
813814 then unit
814815 else fromBase58String(outAssetId)
815816 let sendFeeToMatcher = if ((feeAmount > 0))
816817 then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetIdOrWaves)]
817818 else nil
818819 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)
819820 if ((state == state))
820821 then {
821822 let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
822823 if ((burn == burn))
823824 then {
824- let $t03140331753 = {
825+ let $t03144431794 = {
825826 let feeAmountForCalc = if ((this == feeCollectorAddress))
826827 then 0
827828 else feeAmount
828829 let outInAmountAsset = if ((parseAssetId(outAssetId) == cfgAmountAssetId))
829830 then true
830831 else false
831832 if (outInAmountAsset)
832833 then $Tuple2(-((totalGet + feeAmountForCalc)), 0)
833834 else $Tuple2(0, -((totalGet + feeAmountForCalc)))
834835 }
835- let amountAssetBalanceDelta = $t03140331753._1
836- let priceAssetBalanceDelta = $t03140331753._2
837- let $t03175631864 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
838- let refreshDLpActions = $t03175631864._1
839- let updatedDLp = $t03175631864._2
836+ let amountAssetBalanceDelta = $t03144431794._1
837+ let priceAssetBalanceDelta = $t03144431794._2
838+ let $t03179731905 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
839+ let refreshDLpActions = $t03179731905._1
840+ let updatedDLp = $t03179731905._2
840841 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
841842 if ((isUpdatedDLpValid == isUpdatedDLpValid))
842843 then $Tuple2((state ++ refreshDLpActions), totalAmount)
843844 else throw("Strict value is not equal to itself.")
844845 }
845846 else throw("Strict value is not equal to itself.")
846847 }
847848 else throw("Strict value is not equal to itself.")
848849 }
849850 else throw("Strict value is not equal to itself.")
850851 }
851852 }
852853 else throw("Strict value is not equal to itself.")
853854 }
854855
855856
856857 func m () = match getString(mpk()) {
857858 case s: String =>
858859 fromBase58String(s)
859860 case _: Unit =>
860861 unit
861862 case _ =>
862863 throw("Match error")
863864 }
864865
865866
866867 func pm () = match getString(pmpk()) {
867868 case s: String =>
868869 fromBase58String(s)
869870 case _: Unit =>
870871 unit
871872 case _ =>
872873 throw("Match error")
873874 }
874875
875876
876877 let pd = throw("Permission denied")
877878
878879 func isManager (i) = match m() {
879880 case pk: ByteVector =>
880881 (i.callerPublicKey == pk)
881882 case _: Unit =>
882883 (i.caller == this)
883884 case _ =>
884885 throw("Match error")
885886 }
886887
887888
888889 func mm (i) = match m() {
889890 case pk: ByteVector =>
890891 if ((i.callerPublicKey == pk))
891892 then true
892893 else pd
893894 case _: Unit =>
894895 if ((i.caller == this))
895896 then true
896897 else pd
897898 case _ =>
898899 throw("Match error")
899900 }
900901
901902
902903 @Callable(i)
903904 func constructor (fc) = {
904905 let c = mm(i)
905906 if ((c == c))
906907 then [StringEntry(fc(), fc)]
907908 else throw("Strict value is not equal to itself.")
908909 }
909910
910911
911912
912913 @Callable(i)
913914 func setManager (pendingManagerPublicKey) = {
914915 let c = mm(i)
915916 if ((c == c))
916917 then {
917918 let cm = fromBase58String(pendingManagerPublicKey)
918919 if ((cm == cm))
919920 then [StringEntry(pmpk(), pendingManagerPublicKey)]
920921 else throw("Strict value is not equal to itself.")
921922 }
922923 else throw("Strict value is not equal to itself.")
923924 }
924925
925926
926927
927928 @Callable(i)
928929 func confirmManager () = {
929930 let p = pm()
930931 let hpm = if (isDefined(p))
931932 then true
932933 else throw("No pending manager")
933934 if ((hpm == hpm))
934935 then {
935936 let cpm = if ((i.callerPublicKey == value(p)))
936937 then true
937938 else throw("You are not pending manager")
938939 if ((cpm == cpm))
939940 then [StringEntry(mpk(), toBase58String(value(p))), DeleteEntry(pmpk())]
940941 else throw("Strict value is not equal to itself.")
941942 }
942943 else throw("Strict value is not equal to itself.")
943944 }
944945
945946
946947
947948 @Callable(i)
948949 func put (slip,autoStake) = {
949950 let factCfg = gfc()
950951 let stakingCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactStakCntr]), "Wr st addr")
951952 let slipCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactSlippCntr]), "Wr sl addr")
952953 if ((0 > slip))
953954 then throw("Wrong slippage")
954955 else if ((size(i.payments) != 2))
955956 then throw("2 pmnts expd")
956957 else {
957958 let amAssetPmt = toBigInt(value(i.payments[0]).amount)
958959 let prAssetPmt = toBigInt(value(i.payments[1]).amount)
959960 let currentDLp = calcCurrentDLp(amAssetPmt, prAssetPmt, toBigInt(0))
960961 if ((currentDLp == currentDLp))
961962 then {
962963 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, "")
963964 let emitLpAmt = e._2
964965 let lpAssetId = e._7
965966 let state = e._9
966967 let amDiff = e._10
967968 let prDiff = e._11
968969 let amId = e._12
969970 let prId = e._13
970971 let r = invoke(fca, "emit", [emitLpAmt], nil)
971972 if ((r == r))
972973 then {
973974 let el = match r {
974975 case legacy: Address =>
975976 invoke(legacy, "emit", [emitLpAmt], nil)
976977 case _ =>
977978 unit
978979 }
979980 if ((el == el))
980981 then {
981982 let sa = if ((amDiff > 0))
982983 then invoke(slipCntr, "put", nil, [AttachedPayment(amId, amDiff)])
983984 else nil
984985 if ((sa == sa))
985986 then {
986987 let sp = if ((prDiff > 0))
987988 then invoke(slipCntr, "put", nil, [AttachedPayment(prId, prDiff)])
988989 else nil
989990 if ((sp == sp))
990991 then {
991992 let lpTrnsfr = if (autoStake)
992993 then {
993994 let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
994995 if ((ss == ss))
995996 then nil
996997 else throw("Strict value is not equal to itself.")
997998 }
998999 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
999- let $t03572035785 = refreshDLpInternal(0, 0, 0)
1000- let refreshDLpActions = $t03572035785._1
1001- let updatedDLp = $t03572035785._2
1000+ let $t03576135826 = refreshDLpInternal(0, 0, 0)
1001+ let refreshDLpActions = $t03576135826._1
1002+ let updatedDLp = $t03576135826._2
10021003 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
10031004 if ((isUpdatedDLpValid == isUpdatedDLpValid))
10041005 then ((state ++ lpTrnsfr) ++ refreshDLpActions)
10051006 else throw("Strict value is not equal to itself.")
10061007 }
10071008 else throw("Strict value is not equal to itself.")
10081009 }
10091010 else throw("Strict value is not equal to itself.")
10101011 }
10111012 else throw("Strict value is not equal to itself.")
10121013 }
10131014 else throw("Strict value is not equal to itself.")
10141015 }
10151016 else throw("Strict value is not equal to itself.")
10161017 }
10171018 }
10181019
10191020
10201021
10211022 @Callable(i)
10221023 func putOneTknV2 (minOutAmount,autoStake) = {
10231024 let isPoolOneTokenOperationsDisabled = {
10241025 let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
10251026 if ($isInstanceOf(@, "Boolean"))
10261027 then @
10271028 else throw(($getType(@) + " couldn't be cast to Boolean"))
10281029 }
10291030 let isPutDisabled = if (if (if (igs())
10301031 then true
10311032 else (cfgPoolStatus == PoolPutDis))
10321033 then true
10331034 else (cfgPoolStatus == PoolShutdown))
10341035 then true
10351036 else isPoolOneTokenOperationsDisabled
10361037 let checks = [if (if (!(isPutDisabled))
10371038 then true
10381039 else isManager(i))
10391040 then true
10401041 else throwErr("put operation is blocked by admin"), if ((size(i.payments) == 1))
10411042 then true
10421043 else throwErr("exactly 1 payment are expected")]
10431044 if ((checks == checks))
10441045 then {
10451046 let poolConfig = gpc()
10461047 let amId = poolConfig[idxAmAsId]
10471048 let prId = poolConfig[idxPrAsId]
10481049 let lpId = fromBase58String(poolConfig[idxLPAsId])
10491050 let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
10501051 let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
10511052 let userAddress = if ((i.caller == this))
10521053 then i.originCaller
10531054 else i.caller
10541055 let pmt = value(i.payments[0])
10551056 let pmtAssetId = toBase58String(value(pmt.assetId))
10561057 let pmtAmt = pmt.amount
1057- let $t03692237080 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId), true)
1058- if (($t03692237080 == $t03692237080))
1058+ let $t03696337121 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId), true)
1059+ if (($t03696337121 == $t03696337121))
10591060 then {
1060- let feeAmount = $t03692237080._3
1061- let state = $t03692237080._2
1062- let estimLP = $t03692237080._1
1061+ let feeAmount = $t03696337121._3
1062+ let state = $t03696337121._2
1063+ let estimLP = $t03696337121._1
10631064 let emitLpAmt = if (if ((minOutAmount > 0))
10641065 then (minOutAmount > estimLP)
10651066 else false)
10661067 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
10671068 else estimLP
10681069 let e = invoke(fca, "emit", [emitLpAmt], nil)
10691070 if ((e == e))
10701071 then {
10711072 let el = match e {
10721073 case legacy: Address =>
10731074 invoke(legacy, "emit", [emitLpAmt], nil)
10741075 case _ =>
10751076 unit
10761077 }
10771078 if ((el == el))
10781079 then {
10791080 let lpTrnsfr = if (autoStake)
10801081 then {
10811082 let ss = invoke(stakingContract, "stake", nil, [AttachedPayment(lpId, emitLpAmt)])
10821083 if ((ss == ss))
10831084 then nil
10841085 else throw("Strict value is not equal to itself.")
10851086 }
10861087 else [ScriptTransfer(i.caller, emitLpAmt, lpId)]
10871088 let sendFeeToMatcher = if ((feeAmount > 0))
10881089 then [ScriptTransfer(feeCollectorAddress, feeAmount, fromBase58String(pmtAssetId))]
10891090 else nil
1090- let $t03789538244 = if ((this == feeCollectorAddress))
1091+ let $t03793638285 = if ((this == feeCollectorAddress))
10911092 then $Tuple2(0, 0)
10921093 else {
10931094 let paymentInAmountAsset = if ((pmt.assetId == cfgAmountAssetId))
10941095 then true
10951096 else false
10961097 if (paymentInAmountAsset)
10971098 then $Tuple2(-(feeAmount), 0)
10981099 else $Tuple2(0, -(feeAmount))
10991100 }
1100- let amountAssetBalanceDelta = $t03789538244._1
1101- let priceAssetBalanceDelta = $t03789538244._2
1102- let $t03824738355 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1103- let refreshDLpActions = $t03824738355._1
1104- let updatedDLp = $t03824738355._2
1101+ let amountAssetBalanceDelta = $t03793638285._1
1102+ let priceAssetBalanceDelta = $t03793638285._2
1103+ let $t03828838396 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
1104+ let refreshDLpActions = $t03828838396._1
1105+ let updatedDLp = $t03828838396._2
11051106 $Tuple2((((state ++ lpTrnsfr) ++ sendFeeToMatcher) ++ refreshDLpActions), emitLpAmt)
11061107 }
11071108 else throw("Strict value is not equal to itself.")
11081109 }
11091110 else throw("Strict value is not equal to itself.")
11101111 }
11111112 else throw("Strict value is not equal to itself.")
11121113 }
11131114 else throw("Strict value is not equal to itself.")
11141115 }
11151116
11161117
11171118
11181119 @Callable(i)
11191120 func putForFree (maxSlpg) = if ((0 > maxSlpg))
11201121 then throw("Wrong slpg")
11211122 else if ((size(i.payments) != 2))
11221123 then throw("2 pmnts expd")
11231124 else {
11241125 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, "")
11251126 let state = estPut._9
11261127 let amAssetPmt = toBigInt(value(i.payments[0]).amount)
11271128 let prAssetPmt = toBigInt(value(i.payments[1]).amount)
11281129 let currentDLp = calcCurrentDLp(amAssetPmt, prAssetPmt, toBigInt(0))
11291130 if ((currentDLp == currentDLp))
11301131 then {
1131- let $t03931439379 = refreshDLpInternal(0, 0, 0)
1132- let refreshDLpActions = $t03931439379._1
1133- let updatedDLp = $t03931439379._2
1132+ let $t03935539420 = refreshDLpInternal(0, 0, 0)
1133+ let refreshDLpActions = $t03935539420._1
1134+ let updatedDLp = $t03935539420._2
11341135 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
11351136 if ((isUpdatedDLpValid == isUpdatedDLpValid))
11361137 then (state ++ refreshDLpActions)
11371138 else throw("Strict value is not equal to itself.")
11381139 }
11391140 else throw("Strict value is not equal to itself.")
11401141 }
11411142
11421143
11431144
11441145 @Callable(i)
11451146 func get () = {
11461147 let r = cg(i)
11471148 let outAmtAmt = r._1
11481149 let outPrAmt = r._2
11491150 let pmtAmt = r._3
11501151 let pmtAssetId = r._4
11511152 let state = r._5
11521153 let b = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
11531154 if ((b == b))
11541155 then {
11551156 let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(pmtAmt))
1156- let $t04016840250 = refreshDLpInternal(-(outAmtAmt), -(outPrAmt), 0)
1157- let refreshDLpActions = $t04016840250._1
1158- let updatedDLp = $t04016840250._2
1157+ let $t04020940291 = refreshDLpInternal(-(outAmtAmt), -(outPrAmt), 0)
1158+ let refreshDLpActions = $t04020940291._1
1159+ let updatedDLp = $t04020940291._2
11591160 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
11601161 if ((isUpdatedDLpValid == isUpdatedDLpValid))
11611162 then (state ++ refreshDLpActions)
11621163 else throw("Strict value is not equal to itself.")
11631164 }
11641165 else throw("Strict value is not equal to itself.")
11651166 }
11661167
11671168
11681169
11691170 @Callable(i)
11701171 func getOneTknV2 (outAssetId,minOutAmount) = {
11711172 let isPoolOneTokenOperationsDisabled = {
11721173 let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
11731174 if ($isInstanceOf(@, "Boolean"))
11741175 then @
11751176 else throw(($getType(@) + " couldn't be cast to Boolean"))
11761177 }
11771178 let isGetDisabled = if (if (igs())
11781179 then true
11791180 else (cfgPoolStatus == PoolShutdown))
11801181 then true
11811182 else isPoolOneTokenOperationsDisabled
11821183 let checks = [if (if (!(isGetDisabled))
11831184 then true
11841185 else isManager(i))
11851186 then true
11861187 else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 1))
11871188 then true
11881189 else throwErr("exactly 1 payment are expected")]
11891190 if ((checks == checks))
11901191 then {
1191- let $t04086841023 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1192- let state = $t04086841023._1
1193- let totalAmount = $t04086841023._2
1192+ let $t04090941064 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1193+ let state = $t04090941064._1
1194+ let totalAmount = $t04090941064._2
11941195 $Tuple2(state, totalAmount)
11951196 }
11961197 else throw("Strict value is not equal to itself.")
11971198 }
11981199
11991200
12001201
12011202 @Callable(i)
12021203 func refreshDLp () = {
12031204 let lastRefreshedBlockHeight = valueOrElse(getInteger(keyDLpRefreshedHeight), 0)
12041205 let checkLastRefreshedBlockHeight = if (((height - lastRefreshedBlockHeight) >= dLpRefreshDelay))
12051206 then unit
12061207 else throwErr(makeString([toString(dLpRefreshDelay), " blocks have not passed since the previous call"], ""))
12071208 if ((checkLastRefreshedBlockHeight == checkLastRefreshedBlockHeight))
12081209 then {
12091210 let dLp = valueOrErrorMessage(parseBigInt(valueOrElse(getString(this, keyDLp), "0")), fmtErr("invalid dLp"))
1210- let $t04154741611 = refreshDLpInternal(0, 0, 0)
1211- let dLpUpdateActions = $t04154741611._1
1212- let updatedDLp = $t04154741611._2
1211+ let $t04158841652 = refreshDLpInternal(0, 0, 0)
1212+ let dLpUpdateActions = $t04158841652._1
1213+ let updatedDLp = $t04158841652._2
12131214 let actions = if ((dLp != updatedDLp))
12141215 then dLpUpdateActions
12151216 else throwErr("nothing to refresh")
12161217 $Tuple2(actions, toString(updatedDLp))
12171218 }
12181219 else throw("Strict value is not equal to itself.")
12191220 }
12201221
12211222
12221223
12231224 @Callable(i)
12241225 func getOneTknV2READONLY (outAssetId,lpAssetAmount) = {
12251226 let poolConfig = gpc()
12261227 let amId = poolConfig[idxAmAsId]
12271228 let prId = poolConfig[idxPrAsId]
12281229 let lpId = poolConfig[idxLPAsId]
12291230 let xp = [toBigInt(getAccBalance(amId)), toBigInt(getAccBalance(prId))]
12301231 let lpEmission = toBigInt(valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "invalid lp asset").quantity)
12311232 let D0 = getD(xp)
12321233 let D1 = (D0 - fraction(toBigInt(lpAssetAmount), D0, lpEmission))
12331234 let index = if ((outAssetId == amId))
12341235 then 0
12351236 else if ((outAssetId == prId))
12361237 then 1
12371238 else throw("invalid out asset id")
12381239 let newY = getYD(xp, index, D1)
12391240 let dy = (xp[index] - newY)
12401241 let totalGetRaw = max([0, toInt((dy - big1))])
1241- let $t04251142560 = takeFee(totalGetRaw)
1242- let totalGet = $t04251142560._1
1243- let feeAmount = $t04251142560._2
1242+ let $t04255242601 = takeFee(totalGetRaw)
1243+ let totalGet = $t04255242601._1
1244+ let feeAmount = $t04255242601._2
12441245 $Tuple2(nil, $Tuple2(totalGet, feeAmount))
12451246 }
12461247
12471248
12481249
12491250 @Callable(i)
12501251 func getOneTknV2WithBonusREADONLY (outAssetId,lpAssetAmount) = {
12511252 let poolConfig = gpc()
12521253 let amId = poolConfig[idxAmAsId]
12531254 let prId = poolConfig[idxPrAsId]
12541255 let lpId = poolConfig[idxLPAsId]
12551256 let amBalance = getAccBalance(amId)
12561257 let prBalance = getAccBalance(prId)
1257- let $t04290543020 = {
1258+ let $t04294643061 = {
12581259 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)
12591260 if ($isInstanceOf(@, "(Int, Int)"))
12601261 then @
12611262 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
12621263 }
1263- let totalGet = $t04290543020._1
1264- let feeAmount = $t04290543020._2
1264+ let totalGet = $t04294643061._1
1265+ let feeAmount = $t04294643061._2
12651266 let r = ego("", lpId, lpAssetAmount, this)
12661267 let outAmAmt = r._1
12671268 let outPrAmt = r._2
12681269 let sumOfGetAssets = (outAmAmt + outPrAmt)
12691270 let bonus = if ((sumOfGetAssets == 0))
12701271 then if ((totalGet == 0))
12711272 then 0
12721273 else throw("bonus calculation error")
12731274 else fraction((totalGet - sumOfGetAssets), scale8, sumOfGetAssets)
12741275 $Tuple2(nil, $Tuple3(totalGet, feeAmount, bonus))
12751276 }
12761277
12771278
12781279
12791280 @Callable(i)
12801281 func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = {
12811282 let r = cg(i)
12821283 let outAmAmt = r._1
12831284 let outPrAmt = r._2
12841285 let pmtAmt = r._3
12851286 let pmtAssetId = r._4
12861287 let state = r._5
12871288 if ((noLessThenAmtAsset > outAmAmt))
12881289 then throw(((("Failed: " + toString(outAmAmt)) + " < ") + toString(noLessThenAmtAsset)))
12891290 else if ((noLessThenPriceAsset > outPrAmt))
12901291 then throw(((("Failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset)))
12911292 else {
12921293 let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(pmtAmt))
12931294 let burnLPAssetOnFactory = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
12941295 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
12951296 then {
1296- let $t04418844269 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1297- let refreshDLpActions = $t04418844269._1
1298- let updatedDLp = $t04418844269._2
1297+ let $t04422944310 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1298+ let refreshDLpActions = $t04422944310._1
1299+ let updatedDLp = $t04422944310._2
12991300 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
13001301 if ((isUpdatedDLpValid == isUpdatedDLpValid))
13011302 then (state ++ refreshDLpActions)
13021303 else throw("Strict value is not equal to itself.")
13031304 }
13041305 else throw("Strict value is not equal to itself.")
13051306 }
13061307 }
13071308
13081309
13091310
13101311 @Callable(i)
13111312 func unstakeAndGet (amount) = {
13121313 let checkPayments = if ((size(i.payments) != 0))
13131314 then throw("No pmnts expd")
13141315 else true
13151316 if ((checkPayments == checkPayments))
13161317 then {
13171318 let cfg = gpc()
13181319 let factoryCfg = gfc()
13191320 let lpAssetId = fromBase58String(cfg[idxLPAsId])
13201321 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
13211322 let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(0))
13221323 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), amount], nil)
13231324 if ((unstakeInv == unstakeInv))
13241325 then {
13251326 let r = ego(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
13261327 let outAmAmt = r._1
13271328 let outPrAmt = r._2
13281329 let sts = parseIntValue(r._9)
13291330 let state = r._10
13301331 let v = if (if (igs())
13311332 then true
13321333 else (sts == PoolShutdown))
13331334 then throw(("Blocked: " + toString(sts)))
13341335 else true
13351336 if ((v == v))
13361337 then {
13371338 let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
13381339 if ((burnA == burnA))
13391340 then {
1340- let $t04533245413 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1341- let refreshDLpActions = $t04533245413._1
1342- let updatedDLp = $t04533245413._2
1341+ let $t04537345454 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1342+ let refreshDLpActions = $t04537345454._1
1343+ let updatedDLp = $t04537345454._2
13431344 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
13441345 if ((isUpdatedDLpValid == isUpdatedDLpValid))
13451346 then (state ++ refreshDLpActions)
13461347 else throw("Strict value is not equal to itself.")
13471348 }
13481349 else throw("Strict value is not equal to itself.")
13491350 }
13501351 else throw("Strict value is not equal to itself.")
13511352 }
13521353 else throw("Strict value is not equal to itself.")
13531354 }
13541355 else throw("Strict value is not equal to itself.")
13551356 }
13561357
13571358
13581359
13591360 @Callable(i)
13601361 func unstakeAndGetNoLess (unstakeAmount,noLessThenAmountAsset,noLessThenPriceAsset) = {
13611362 let isGetDisabled = if (igs())
13621363 then true
13631364 else (cfgPoolStatus == PoolShutdown)
13641365 let checks = [if (!(isGetDisabled))
13651366 then true
13661367 else throw("get operation is blocked by admin"), if ((size(i.payments) == 0))
13671368 then true
13681369 else throw("no payments are expected")]
13691370 if ((checks == checks))
13701371 then {
13711372 let currentDLp = calcCurrentDLp(toBigInt(0), toBigInt(0), toBigInt(0))
13721373 let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(cfgLpAssetId), unstakeAmount], nil)
13731374 if ((unstakeInv == unstakeInv))
13741375 then {
13751376 let res = ego(toBase58String(i.transactionId), toBase58String(cfgLpAssetId), unstakeAmount, i.caller)
13761377 let outAmAmt = res._1
13771378 let outPrAmt = res._2
13781379 let state = res._10
13791380 let checkAmounts = [if ((outAmAmt >= noLessThenAmountAsset))
13801381 then true
13811382 else throw(makeString(["amount asset amount to receive is less than ", toString(noLessThenAmountAsset)], "")), if ((outPrAmt >= noLessThenPriceAsset))
13821383 then true
13831384 else throw(makeString(["price asset amount to receive is less than ", toString(noLessThenPriceAsset)], ""))]
13841385 if ((checkAmounts == checkAmounts))
13851386 then {
13861387 let burnLPAssetOnFactory = invoke(fca, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
13871388 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
13881389 then {
1389- let $t04666146742 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1390- let refreshDLpActions = $t04666146742._1
1391- let updatedDLp = $t04666146742._2
1390+ let $t04670246783 = refreshDLpInternal(-(outAmAmt), -(outPrAmt), 0)
1391+ let refreshDLpActions = $t04670246783._1
1392+ let updatedDLp = $t04670246783._2
13921393 let isUpdatedDLpValid = validateUpdatedDLp(currentDLp, updatedDLp)
13931394 if ((isUpdatedDLpValid == isUpdatedDLpValid))
13941395 then (state ++ refreshDLpActions)
13951396 else throw("Strict value is not equal to itself.")
13961397 }
13971398 else throw("Strict value is not equal to itself.")
13981399 }
13991400 else throw("Strict value is not equal to itself.")
14001401 }
14011402 else throw("Strict value is not equal to itself.")
14021403 }
14031404 else throw("Strict value is not equal to itself.")
14041405 }
14051406
14061407
14071408
14081409 @Callable(i)
14091410 func unstakeAndGetOneTknV2 (unstakeAmount,outAssetId,minOutAmount) = {
14101411 let isPoolOneTokenOperationsDisabled = {
14111412 let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
14121413 if ($isInstanceOf(@, "Boolean"))
14131414 then @
14141415 else throw(($getType(@) + " couldn't be cast to Boolean"))
14151416 }
14161417 let isGetDisabled = if (if (igs())
14171418 then true
14181419 else (cfgPoolStatus == PoolShutdown))
14191420 then true
14201421 else isPoolOneTokenOperationsDisabled
14211422 let checks = [if (if (!(isGetDisabled))
14221423 then true
14231424 else isManager(i))
14241425 then true
14251426 else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 0))
14261427 then true
14271428 else throwErr("no payments are expected")]
14281429 if ((checks == checks))
14291430 then {
14301431 let cfg = gpc()
14311432 let factoryCfg = gfc()
14321433 let lpAssetId = fromBase58String(cfg[idxLPAsId])
14331434 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
14341435 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), unstakeAmount], nil)
14351436 if ((unstakeInv == unstakeInv))
14361437 then {
1437- let $t04767647864 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1438- let state = $t04767647864._1
1439- let totalAmount = $t04767647864._2
1438+ let $t04771747905 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1439+ let state = $t04771747905._1
1440+ let totalAmount = $t04771747905._2
14401441 $Tuple2(state, totalAmount)
14411442 }
14421443 else throw("Strict value is not equal to itself.")
14431444 }
14441445 else throw("Strict value is not equal to itself.")
14451446 }
14461447
14471448
14481449
14491450 @Callable(i)
14501451 func putOneTknV2WithBonusREADONLY (paymentAmountRaw,paymentAssetId) = {
14511452 let poolConfig = gpc()
14521453 let amId = poolConfig[idxAmAsId]
14531454 let prId = poolConfig[idxPrAsId]
14541455 let lpId = poolConfig[idxLPAsId]
1455- let $t04812348226 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1456- let lpAmount = $t04812348226._1
1457- let state = $t04812348226._2
1458- let feeAmount = $t04812348226._3
1459- let bonus = $t04812348226._4
1456+ let $t04816448267 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1457+ let lpAmount = $t04816448267._1
1458+ let state = $t04816448267._2
1459+ let feeAmount = $t04816448267._3
1460+ let bonus = $t04816448267._4
14601461 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
14611462 }
14621463
14631464
14641465
14651466 @Callable(i)
14661467 func putOneTknV2WithoutTakeFeeREADONLY (paymentAmountRaw,paymentAssetId) = {
14671468 let poolConfig = gpc()
14681469 let amId = poolConfig[idxAmAsId]
14691470 let prId = poolConfig[idxPrAsId]
14701471 let lpId = poolConfig[idxLPAsId]
1471- let $t04850548609 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1472- let lpAmount = $t04850548609._1
1473- let state = $t04850548609._2
1474- let feeAmount = $t04850548609._3
1475- let bonus = $t04850548609._4
1472+ let $t04854648650 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1473+ let lpAmount = $t04854648650._1
1474+ let state = $t04854648650._2
1475+ let feeAmount = $t04854648650._3
1476+ let bonus = $t04854648650._4
14761477 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
14771478 }
14781479
14791480
14801481
14811482 @Callable(i)
14821483 func activate (amtAsStr,prAsStr) = if ((toString(i.caller) != toString(fca)))
14831484 then throw("denied")
14841485 else $Tuple2([StringEntry(aa(), amtAsStr), StringEntry(pa(), prAsStr)], "success")
14851486
14861487
14871488
14881489 @Callable(i)
14891490 func setS (k,v) = if ((toString(i.caller) != strf(this, ada())))
14901491 then pd
14911492 else [StringEntry(k, v)]
14921493
14931494
14941495
14951496 @Callable(i)
14961497 func setI (k,v) = if ((toString(i.caller) != strf(this, ada())))
14971498 then pd
14981499 else [IntegerEntry(k, v)]
14991500
15001501
15011502
15021503 @Callable(i)
15031504 func getPoolConfigWrapperREADONLY () = $Tuple2(nil, gpc())
15041505
15051506
15061507
15071508 @Callable(i)
15081509 func getAccBalanceWrapperREADONLY (assetId) = $Tuple2(nil, getAccBalance(assetId))
15091510
15101511
15111512
15121513 @Callable(i)
15131514 func calcPricesWrapperREADONLY (amAmt,prAmt,lpAmt) = {
15141515 let pr = calcPrices(amAmt, prAmt, lpAmt)
15151516 $Tuple2(nil, [toString(pr[0]), toString(pr[1]), toString(pr[2])])
15161517 }
15171518
15181519
15191520
15201521 @Callable(i)
15211522 func fromX18WrapperREADONLY (val,resScaleMult) = $Tuple2(nil, f1(parseBigIntValue(val), resScaleMult))
15221523
15231524
15241525
15251526 @Callable(i)
15261527 func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(t1(origVal, origScaleMult)))
15271528
15281529
15291530
15301531 @Callable(i)
15311532 func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(cpbi(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
15321533
15331534
15341535
15351536 @Callable(i)
15361537 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, ""))
15371538
15381539
15391540
15401541 @Callable(i)
15411542 func estimateGetOperationWrapperREADONLY (txId58,pmtAsId,pmtLpAmt,usrAddr) = {
15421543 let r = ego(txId58, pmtAsId, pmtLpAmt, addressFromStringValue(usrAddr))
15431544 $Tuple2(nil, $Tuple10(r._1, r._2, r._3, r._4, r._5, r._6, r._7, toString(r._8), r._9, r._10))
15441545 }
15451546
15461547
15471548
15481549 @Callable(i)
15491550 func getFeeREADONLY () = $Tuple2(nil, fee)
15501551
15511552
15521553 @Verifier(tx)
15531554 func verify () = {
15541555 let targetPublicKey = match m() {
15551556 case pk: ByteVector =>
15561557 pk
15571558 case _: Unit =>
15581559 tx.senderPublicKey
15591560 case _ =>
15601561 throw("Match error")
15611562 }
15621563 match tx {
15631564 case order: Order =>
15641565 let matcherPub = mp()
15651566 let orderValid = validateMatcherOrderAllowed(order)
15661567 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
15671568 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
15681569 if (if (if (orderValid)
15691570 then senderValid
15701571 else false)
15711572 then matcherValid
15721573 else false)
15731574 then true
15741575 else toe(orderValid, senderValid, matcherValid)
15751576 case s: SetScriptTransaction =>
15761577 let newHash = blake2b256(value(s.script))
15771578 let allowedHash = fromBase64String(value(getString(fca, keyAllowedLpStableScriptHash())))
15781579 let currentHash = scriptHash(this)
15791580 if (if ((allowedHash == newHash))
15801581 then (currentHash != newHash)
15811582 else false)
15821583 then true
15831584 else sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
15841585 case _ =>
15851586 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
15861587 }
15871588 }
15881589

github/deemru/w8io/169f3d6 
196.99 ms