tx · 8rK5KoYi8F3fGjzvSu5FwGmBFHYG6WoL3ToAbYnfgLoC

3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT:  -0.03200000 Waves

2022.11.30 09:50 [2339518] smart account 3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT > SELF 0.00000000 Waves

{ "type": 13, "id": "8rK5KoYi8F3fGjzvSu5FwGmBFHYG6WoL3ToAbYnfgLoC", "fee": 3200000, "feeAssetId": null, "timestamp": 1669790954109, "version": 1, "sender": "3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT", "senderPublicKey": "D1BL65meykxFZTCuq7jq9HSGLLnWvQamQPUNrguW5w39", "proofs": [ "2ALjoD2nsznRbaRu6iStYjk4d7kx7TPWDA4VhSWu8WDrpVGdti47MHFqGgokv9MxGRHnMR3gy8b1FfzkfwyvWNy5" ], "script": "base64:BgL2JAgCEgMKAQgSAwoBCBIAEgQKAgEEEgQKAgEEEgMKAQESABIECgIIARIAEgQKAggBEgQKAggBEgQKAgEBEgMKAQESBQoDAQEBEgUKAwEIARIECgIBCBIECgIBCBIECgIICBIECgIICBIECgIIARIAEgMKAQgSBQoDAQEBEgQKAggBEgQKAgEBEgQKAggIEgsKCQgBAQIBAggEBBIGCgQICAEIEgAiBnNjYWxlOCIMc2NhbGU4QmlnSW50IgdzY2FsZTE4Igp6ZXJvQmlnSW50IgRiaWcwIgRiaWcxIgRiaWcyIgpzbGlwcGFnZTREIgt3YXZlc1N0cmluZyIFQW11bHQiBURjb252IgNTRVAiBUVNUFRZIgpQb29sQWN0aXZlIgpQb29sUHV0RGlzIg5Qb29sTWF0Y2hlckRpcyIMUG9vbFNodXRkb3duIg5pZHhQb29sQWRkcmVzcyIJaWR4UG9vbFN0IglpZHhMUEFzSWQiCWlkeEFtQXNJZCIJaWR4UHJBc0lkIgtpZHhBbXRBc0RjbSINaWR4UHJpY2VBc0RjbSILaWR4SUFtdEFzSWQiDWlkeElQcmljZUFzSWQiD2lkeEZhY3RTdGFrQ250ciISaWR4RmFjdG9yeVJlc3RDbnRyIhBpZHhGYWN0U2xpcHBDbnRyIhFpZHhGYWN0R3d4UmV3Q250ciIKZmVlRGVmYXVsdCICdDEiB29yaWdWYWwiDW9yaWdTY2FsZU11bHQiAmYxIgN2YWwiD3Jlc3VsdFNjYWxlTXVsdCICdHMiA2FtdCIIcmVzU2NhbGUiCGN1clNjYWxlIgNhYnMiCWFic0JpZ0ludCICZmMiA21wayIEcG1wayICcGwiAnBoIgFoIgF0IgNwYXUiAnVhIgR0eElkIgNnYXUiAmFhIgJwYSIDYW1wIgNhZGEiBmtleUZlZSIDZmVlIgZrZXlETHAiFWtleURMcFJlZnJlc2hlZEhlaWdodCISa2V5RExwUmVmcmVzaERlbGF5IhZkTHBSZWZyZXNoRGVsYXlEZWZhdWx0Ig9kTHBSZWZyZXNoRGVsYXkiBGZjZmciBG10cGsiAnBjIgZpQW10QXMiBWlQckFzIgNtYmEiBWJBU3RyIgNhcHMiHGtleUFsbG93ZWRMcFN0YWJsZVNjcmlwdEhhc2giFmtleUZlZUNvbGxlY3RvckFkZHJlc3MiA3RvZSIDb3JWIgZzZW5kclYiBm1hdGNoViIDc3RyIgckbWF0Y2gwIgZ2YWxTdHIiBHN0cmYiBGFkZHIiA2tleSIEaW50ZiIIdGhyb3dFcnIiA21zZyIGZm10RXJyIgNmY2EiAUEiA2lncyICbXAiE2ZlZUNvbGxlY3RvckFkZHJlc3MiA2dwYyIFYW10QXMiB3ByaWNlQXMiCGlQcmljZUFzIgxwYXJzZUFzc2V0SWQiBWlucHV0Ig9hc3NldElkVG9TdHJpbmciD3BhcnNlUG9vbENvbmZpZyIKcG9vbENvbmZpZyIQcG9vbENvbmZpZ1BhcnNlZCILJHQwNzIwODczOTQiDmNmZ1Bvb2xBZGRyZXNzIg1jZmdQb29sU3RhdHVzIgxjZmdMcEFzc2V0SWQiEGNmZ0Ftb3VudEFzc2V0SWQiD2NmZ1ByaWNlQXNzZXRJZCIWY2ZnQW1vdW50QXNzZXREZWNpbWFscyIVY2ZnUHJpY2VBc3NldERlY2ltYWxzIgNnZmMiDWZhY3RvcnlDb25maWciD3N0YWtpbmdDb250cmFjdCIPc2xpcGFnZUNvbnRyYWN0Igtnd3hDb250cmFjdCIMcmVzdENvbnRyYWN0IhFkYXRhUHV0QWN0aW9uSW5mbyINaW5BbXRBc3NldEFtdCIPaW5QcmljZUFzc2V0QW10IghvdXRMcEFtdCIFcHJpY2UiCnNsaXBCeVVzZXIiDHNsaXBwYWdlUmVhbCIIdHhIZWlnaHQiC3R4VGltZXN0YW1wIgxzbGlwYWdlQW1BbXQiDHNsaXBhZ2VQckFtdCIRZGF0YUdldEFjdGlvbkluZm8iDm91dEFtdEFzc2V0QW10IhBvdXRQcmljZUFzc2V0QW10IgdpbkxwQW10Ig1nZXRBY2NCYWxhbmNlIgdhc3NldElkIgRjcGJpIghwckFtdFgxOCIIYW1BbXRYMTgiA3ZhZCICQTEiAkEyIghzbGlwcGFnZSIEZGlmZiIEcGFzcyICdmQiAkQxIgJEMCIEc2xwZyIEZmFpbCIDcGNwIgphbUFzc2V0RGNtIgpwckFzc2V0RGNtIgVhbUFtdCIFcHJBbXQiC2FtdEFzQW10WDE4IgpwckFzQW10WDE4IgpjYWxjUHJpY2VzIgVscEFtdCIDY2ZnIghhbXRBc0RjbSIHcHJBc0RjbSIIcHJpY2VYMTgiCGxwQW10WDE4Ig1scFBySW5BbUFzWDE4Ig1scFBySW5QckFzWDE4Ig9jYWxjdWxhdGVQcmljZXMiAXAiB3Rha2VGZWUiBmFtb3VudCIJZmVlQW1vdW50IgNlZ28iBnR4SWQ1OCIKcG10QXNzZXRJZCIIcG10THBBbXQiC3VzZXJBZGRyZXNzIgRscElkIgRhbUlkIgRwcklkIgVhbURjbSIFcHJEY20iA3N0cyIHbHBFbWlzcyIJYW1CYWxhbmNlIgxhbUJhbGFuY2VYMTgiCXByQmFsYW5jZSIMcHJCYWxhbmNlWDE4IgtjdXJQcmljZVgxOCIIY3VyUHJpY2UiC3BtdExwQW10WDE4IgpscEVtaXNzWDE4IgtvdXRBbUFtdFgxOCILb3V0UHJBbXRYMTgiCG91dEFtQW10IghvdXRQckFtdCIFc3RhdGUiA2VwbyIHaW5BbUFtdCIGaW5BbUlkIgdpblByQW10IgZpblBySWQiBmlzRXZhbCIGZW1pdExwIgppc09uZUFzc2V0IhB2YWxpZGF0ZVNsaXBwYWdlIgZwbXRBbXQiBXBtdElkIgdhbUlkU3RyIgdwcklkU3RyIglpbkFtSWRTdHIiCWluUHJJZFN0ciIGYW10RGNtIghwcmljZURjbSIEbHBFbSIPaW5BbUFzc2V0QW10WDE4Ig9pblByQXNzZXRBbXRYMTgiDHVzZXJQcmljZVgxOCIBciILc2xpcHBhZ2VYMTgiD3NsaXBwYWdlUmVhbFgxOCINbHBFbWlzc2lvblgxOCIKcHJWaWFBbVgxOCIKYW1WaWFQclgxOCIMZXhwZWN0ZWRBbXRzIhFleHBBbXRBc3NldEFtdFgxOCITZXhwUHJpY2VBc3NldEFtdFgxOCIJY2FsY0xwQW10Ig5jYWxjQW1Bc3NldFBtdCIOY2FsY1ByQXNzZXRQbXQiDHNsaXBwYWdlQ2FsYyIJZW1pdExwQW10IgZhbURpZmYiBnByRGlmZiINJHQwMTc4MjUxODE3MCIKd3JpdGVBbUFtdCIKd3JpdGVQckFtdCILY29tbW9uU3RhdGUiB2NhbGNETHAiDWFtb3VudEJhbGFuY2UiDHByaWNlQmFsYW5jZSIKbHBFbWlzc2lvbiIKdXBkYXRlZERMcCIScmVmcmVzaERMcEludGVybmFsIhdhbW91bnRBc3NldEJhbGFuY2VEZWx0YSIWcHJpY2VBc3NldEJhbGFuY2VEZWx0YSIUbHBBc3NldEVtaXNzaW9uRGVsdGEiEmFtb3VudEFzc2V0QmFsYW5jZSIRcHJpY2VBc3NldEJhbGFuY2UiD2xwQXNzZXRFbWlzc2lvbiIHYWN0aW9ucyIDbW9hIgVvcmRlciIRYW1vdW50QXNzZXRBbW91bnQiEHByaWNlQXNzZXRBbW91bnQiDSR0MDIwMTE5MjAzMzEiA2RMcCINJHQwMjA3NTgyMDg1OCINdW51c2VkQWN0aW9ucyIGZExwTmV3Igxpc09yZGVyVmFsaWQiAmNnIgFpIgNwbXQiAmNwIgZjYWxsZXIiB2FtQXNQbXQiB3ByQXNQbXQiBGdldEQiAnhwIgFuIgN4cDAiA3hwMSIKYVByZWNpc2lvbiIBYSIBcyIDYW5uIgt4cDBfeHAxX25fbiIQYW5uX3NfYVByZWNpc2lvbiIOYW5uX2FQcmVjaXNpb24iAm4xIgRjYWxjIgNhY2MiA2N1ciINJHQwMjMwMTEyMzAzMSIBZCIFZm91bmQiAmRwIgVkTmV4dCIFZERpZmYiA2FyciINJHQwMjM0NTIyMzQ5OSICJGwiAiRzIgUkYWNjMCIFJGYwXzEiAiRhIgIkaSIFJGYwXzIiBWdldFlEIgFEIgF4IgFjIgFiIg0kdDAyMzk5OTI0MDE5IgF5IgV5TmV4dCIFeURpZmYiDSR0MDI0MzI2MjQzNzMiDWNhbGNQdXRPbmVUa24iCXBtdEFtdFJhdyILd2l0aFRha2VGZWUiDWNoZWNoRW1pc3Npb24iDSR0MDI1MTU2MjU2MTgiDGFtQmFsYW5jZU9sZCIMcHJCYWxhbmNlT2xkIg0kdDAyNTYyNDI1ODAwIgthbUFtb3VudFJhdyILcHJBbW91bnRSYXciDSR0MDI1ODA0MjYwNDMiCGFtQW1vdW50IghwckFtb3VudCIMYW1CYWxhbmNlTmV3IgxwckJhbGFuY2VOZXciBmNoZWNrRCIIbHBBbW91bnQiDnBvb2xQcm9wb3J0aW9uIg9hbW91bnRBc3NldFBhcnQiDnByaWNlQXNzZXRQYXJ0IglscEFtdEJvdGgiBWJvbnVzIhNnZXRPbmVUa25WMkludGVybmFsIgpvdXRBc3NldElkIgxtaW5PdXRBbW91bnQiCHBheW1lbnRzIgxvcmlnaW5DYWxsZXIiDXRyYW5zYWN0aW9uSWQiCmFtRGVjaW1hbHMiCnByRGVjaW1hbHMiCnBvb2xTdGF0dXMiDSR0MDI4MDQ1MjgxNTYiAUAiCHRvdGFsR2V0Igt0b3RhbEFtb3VudCINJHQwMjgzNDYyODY1MyIFb3V0QW0iBW91dFByIghjdXJQclgxOCIFY3VyUHIiEW91dEFzc2V0SWRPcldhdmVzIhBzZW5kRmVlVG9NYXRjaGVyIgRidXJuIgFtIgJwbSICcGQiCWlzTWFuYWdlciICcGsiAm1tIhdwZW5kaW5nTWFuYWdlclB1YmxpY0tleSICY20iA2hwbSIDY3BtIgRzbGlwIglhdXRvU3Rha2UiB2ZhY3RDZmciC3N0YWtpbmdDbnRyIghzbGlwQ250ciIBZSIJbHBBc3NldElkIgJlbCIGbGVnYWN5IgJzYSICc3AiCGxwVHJuc2ZyIgJzcyIgaXNQb29sT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWQiDWlzUHV0RGlzYWJsZWQiBmNoZWNrcyINJHQwMzQwMTUzNDE3MyIHZXN0aW1MUCIHbWF4U2xwZyIGZXN0UHV0IglvdXRBbXRBbXQiDWlzR2V0RGlzYWJsZWQiDSR0MDM2Nzk1MzY5NTAiGGxhc3RSZWZyZXNoZWRCbG9ja0hlaWdodCIdY2hlY2tMYXN0UmVmcmVzaGVkQmxvY2tIZWlnaHQiDSR0MDM3MzQ4Mzc0MDMiCnVwZGF0ZWRLTHAiDWxwQXNzZXRBbW91bnQiBWluZGV4IgRuZXdZIgJkeSILdG90YWxHZXRSYXciDSR0MDM4MjA1MzgyNTQiDSR0MDM4NTk5Mzg3MTQiDnN1bU9mR2V0QXNzZXRzIhJub0xlc3NUaGVuQW10QXNzZXQiFG5vTGVzc1RoZW5QcmljZUFzc2V0IhRidXJuTFBBc3NldE9uRmFjdG9yeSINY2hlY2tQYXltZW50cyIKZmFjdG9yeUNmZyIHc3Rha2luZyIKdW5zdGFrZUludiIBdiIFYnVybkEiDXVuc3Rha2VBbW91bnQiFW5vTGVzc1RoZW5BbW91bnRBc3NldCIDcmVzIgxjaGVja0Ftb3VudHMiDSR0MDQyNTUyNDI3NDAiEHBheW1lbnRBbW91bnRSYXciDnBheW1lbnRBc3NldElkIg0kdDA0Mjk5OTQzMTAyIg0kdDA0MzM4MTQzNDg1IghhbXRBc1N0ciIHcHJBc1N0ciIBayICcHIiDHJlc1NjYWxlTXVsdCIHdXNyQWRkciIHcG10QXNJZCICdHgiBnZlcmlmeSIPdGFyZ2V0UHVibGljS2V5IgptYXRjaGVyUHViIgpvcmRlclZhbGlkIgtzZW5kZXJWYWxpZCIMbWF0Y2hlclZhbGlkIgduZXdIYXNoIgthbGxvd2VkSGFzaCILY3VycmVudEhhc2h1AAFhAIDC1y8AAWIJALYCAQCAwtcvAAFjCQC2AgEAgICQu7rWrfANAAFkCQC2AgEAAAABZQkAtgIBAAAAAWYJALYCAQABAAFnCQC2AgEAAgABaAkAtgIBCQBlAgUBYQkAaQIJAGgCBQFhAAEFAWEAAWkCBVdBVkVTAAFqAgMxMDAAAWsCATEAAWwCAl9fAAFtAgAAAW4AAQABbwACAAFwAAMAAXEABAABcgABAAFzAAIAAXQAAwABdQAEAAF2AAUAAXcABgABeAAHAAF5AAgAAXoACQABQQABAAFCAAYAAUMABwABRAAKAAFFCQBrAwAKBQFhAJBOAQFGAgFHAUgJALwCAwkAtgIBBQFHBQFjCQC2AgEFAUgBAUkCAUoBSwkAoAMBCQC8AgMFAUoJALYCAQUBSwUBYwEBTAMBTQFOAU8JAGsDBQFNBQFOBQFPAQFQAQFKAwkAvwICBQFkBQFKCQC+AgEFAUoFAUoBAVEBAUoDCQC/AgIFAWQFAUoJAL4CAQUBSgUBSgEBUgACEyVzX19mYWN0b3J5Q29udHJhY3QBAVMAAhQlc19fbWFuYWdlclB1YmxpY0tleQEBVAACGyVzX19wZW5kaW5nTWFuYWdlclB1YmxpY0tleQEBVQACESVzJXNfX3ByaWNlX19sYXN0AQFWAgFXAVgJALkJAgkAzAgCAhglcyVzJWQlZF9fcHJpY2VfX2hpc3RvcnkJAMwIAgkApAMBBQFXCQDMCAIJAKQDAQUBWAUDbmlsBQFsAQFZAgFaAmFhCQCsAgIJAKwCAgkArAICAgslcyVzJXNfX1BfXwUBWgICX18FAmFhAQJhYgIBWgJhYQkArAICCQCsAgIJAKwCAgILJXMlcyVzX19HX18FAVoCAl9fBQJhYQECYWMAAg8lc19fYW1vdW50QXNzZXQBAmFkAAIOJXNfX3ByaWNlQXNzZXQBAmFlAAIHJXNfX2FtcAECYWYAAg0lc19fYWRkb25BZGRyAAJhZwIHJXNfX2ZlZQACYWgJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUCYWcFAUUAAmFpCQC5CQIJAMwIAgICJXMJAMwIAgIDZExwBQNuaWwFAWwAAmFqCQC5CQIJAMwIAgICJXMJAMwIAgISZExwUmVmcmVzaGVkSGVpZ2h0BQNuaWwFAWwAAmFrCQC5CQIJAMwIAgICJXMJAMwIAgIPcmVmcmVzaERMcERlbGF5BQNuaWwFAWwAAmFsAB4AAmFtCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFAmFrBQJhbAECYW4AAhElc19fZmFjdG9yeUNvbmZpZwECYW8AAhglcyVzX19tYXRjaGVyX19wdWJsaWNLZXkBAmFwAgJhcQJhcgkArAICCQCsAgIJAKwCAgkArAICAgglZCVkJXNfXwUCYXECAl9fBQJhcgIIX19jb25maWcBAmFzAQJhdAkArAICAiglcyVzJXNfX21hcHBpbmdzX19iYXNlQXNzZXQyaW50ZXJuYWxJZF9fBQJhdAECYXUAAgwlc19fc2h1dGRvd24BAmF2AAIdJXNfX2FsbG93ZWRMcFN0YWJsZVNjcmlwdEhhc2gBAmF3AAIXJXNfX2ZlZUNvbGxlY3RvckFkZHJlc3MBAmF4AwJheQJhegJhQQkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhFGYWlsZWQ6IG9yZFZhbGlkPQkApQMBBQJheQILIHNuZHJWYWxpZD0JAKUDAQUCYXoCDCBtdGNoclZhbGlkPQkApQMBBQJhQQECYUIBAUoEAmFDBQFKAwkAAQIFAmFDAgZTdHJpbmcEAmFEBQJhQwUCYUQJAAIBAhNmYWlsIGNhc3QgdG8gU3RyaW5nAQJhRQICYUYCYUcJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQJhRgUCYUcJALkJAgkAzAgCAgptYW5kYXRvcnkgCQDMCAIJAKUIAQUCYUYJAMwIAgIBLgkAzAgCBQJhRwkAzAgCAgwgbm90IGRlZmluZWQFA25pbAIAAQJhSAICYUYCYUcJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQJhRgUCYUcJALkJAgkAzAgCAgptYW5kYXRvcnkgCQDMCAIJAKUIAQUCYUYJAMwIAgIBLgkAzAgCBQJhRwkAzAgCAgwgbm90IGRlZmluZWQFA25pbAIAAQJhSQECYUoJAAIBCQC5CQIJAMwIAgIPbHBfc3RhYmxlLnJpZGU6CQDMCAIFAmFKBQNuaWwCASABAmFLAQJhSgkAuQkCCQDMCAICD2xwX3N0YWJsZS5yaWRlOgkAzAgCBQJhSgUDbmlsAgEgAAJhTAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBAmFFAgUEdGhpcwkBAVIAAAJhTQkBAmFFAgUEdGhpcwkBAmFlAAECYU4ACQELdmFsdWVPckVsc2UCCQCbCAIFAmFMCQECYXUABwECYU8ACQDZBAEJAQJhRQIFAmFMCQECYW8AAAJhUAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBAmFFAgUCYUwJAQJhdwABAmFRAAQCYVIJAQJhRQIFBHRoaXMJAQJhYwAEAmFTCQECYUUCBQR0aGlzCQECYWQABAJhVAkBAmFIAgUCYUwJAQJhcwEFAmFTBAJhcQkBAmFIAgUCYUwJAQJhcwEFAmFSCQC1CQIJAQJhRQIFAmFMCQECYXACCQCkAwEFAmFxCQCkAwEFAmFUBQFsAQJhVQECYVYDCQAAAgUCYVYFAWkFBHVuaXQJANkEAQUCYVYBAmFXAQJhVgMJAAACBQJhVgUEdW5pdAUBaQkA2AQBCQEFdmFsdWUBBQJhVgECYVgBAmFZCQCZCgcJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUCYVkFAXIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJhWQUBcwkA2QQBCQCRAwIFAmFZBQF0CQECYVUBCQCRAwIFAmFZBQF1CQECYVUBCQCRAwIFAmFZBQF2CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYVkFAXcJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJhWQUBeAACYVoJAQJhWAEJAQJhUQAAAmJhBQJhWgACYmIIBQJiYQJfMQACYmMIBQJiYQJfMgACYmQIBQJiYQJfMwACYmUIBQJiYQJfNAACYmYIBQJiYQJfNQACYmcIBQJiYQJfNgACYmgIBQJiYQJfNwECYmkACQC1CQIJAQJhRQIFAmFMCQECYW4ABQFsAAJiagkBAmJpAAACYmsJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmJqBQFBAiBJbnZhbGlkIHN0YWtpbmcgY29udHJhY3QgYWRkcmVzcwACYmwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmJqBQFDAiBJbnZhbGlkIHNsaXBhZ2UgY29udHJhY3QgYWRkcmVzcwACYm0JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmJqBQFEAhxJbnZhbGlkIGd3eCBjb250cmFjdCBhZGRyZXNzAAJibgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCYmoFAUICHEludmFsaWQgZ3d4IGNvbnRyYWN0IGFkZHJlc3MBAmJvCgJicAJicQJicgJicwJidAJidQJidgJidwJieAJieQkAuQkCCQDMCAICFCVkJWQlZCVkJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQUCYnAJAMwIAgkApAMBBQJicQkAzAgCCQCkAwEFAmJyCQDMCAIJAKQDAQUCYnMJAMwIAgkApAMBBQJidAkAzAgCCQCkAwEFAmJ1CQDMCAIJAKQDAQUCYnYJAMwIAgkApAMBBQJidwkAzAgCCQCkAwEFAmJ4CQDMCAIJAKQDAQUCYnkFA25pbAUBbAECYnoGAmJBAmJCAmJDAmJzAmJ2AmJ3CQC5CQIJAMwIAgIMJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQUCYkEJAMwIAgkApAMBBQJiQgkAzAgCCQCkAwEFAmJDCQDMCAIJAKQDAQUCYnMJAMwIAgkApAMBBQJidgkAzAgCCQCkAwEFAmJ3BQNuaWwFAWwBAmJEAQJiRQMJAAACBQJiRQIFV0FWRVMICQDvBwEFBHRoaXMJYXZhaWxhYmxlCQDwBwIFBHRoaXMJANkEAQUCYkUBAmJGAgJiRwJiSAkAvAIDBQJiRwUBYwUCYkgBAmJJAwJiSgJiSwJiTAQCYk0JALwCAwkAuAICBQJiSgUCYksFAWIFAmJLBAJiTgkAvwICCQC4AgIFAmJMCQEBUAEFAmJNBQFkAwkBASEBBQJiTgkAAgEJAKwCAgIKQmlnIHNscGc6IAkApgMBBQJiTQkAlAoCBQJiTgkAmQMBCQDMCAIFAmJKCQDMCAIFAmJLBQNuaWwBAmJPAwJiUAJiUQJiUgQCYk0JALwCAwUCYlEFAWIFAmJQBAJiUwkAvwICBQJiUgUCYk0DAwUCYlMGCQC/AgIFAmJRBQJiUAkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKYDAQUCYlECASAJAKYDAQUCYlACASAJAKYDAQUCYk0CASAJAKYDAQUCYlIFAmJTAQJiVAQCYlUCYlYCYlcCYlgEAmJZCQEBRgIFAmJXBQJiVQQCYloJAQFGAgUCYlgFAmJWCQECYkYCBQJiWgUCYlkBAmNhAwJiVwJiWAJjYgQCY2MJAQJhUQAEAmNkCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCY2MFAXcEAmNlCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCY2MFAXgEAmNmCQECYlQEBQJjZAUCY2UFAmJXBQJiWAQCYkgJAQFGAgUCYlcFAmNkBAJiRwkBAUYCBQJiWAUCY2UEAmNnCQEBRgIFAmNiBQFhBAJjaAkBAmJGAgUCYkgFAmNnBAJjaQkBAmJGAgUCYkcFAmNnCQDMCAIFAmNmCQDMCAIFAmNoCQDMCAIFAmNpBQNuaWwBAmNqAwJiVwJiWAJjYgQCY2sJAQJjYQMFAmJXBQJiWAUCY2IJAMwIAgkBAUkCCQCRAwIFAmNrAAAFAWEJAMwIAgkBAUkCCQCRAwIFAmNrAAEFAWEJAMwIAgkBAUkCCQCRAwIFAmNrAAIFAWEFA25pbAECY2wBAmNtBAJjbgkAawMFAmNtBQJhaAUBYQkAlAoCCQBlAgUCY20FAmNuBQJjbgECY28EAmNwAmNxAmNyAmNzBAJjYwkBAmFRAAQCY3QJAJEDAgUCY2MFAXQEAmN1CQCRAwIFAmNjBQF1BAJjdgkAkQMCBQJjYwUBdgQCY3cJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJjYwUBdwQCY3gJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJjYwUBeAQCY3kJAJEDAgUCY2MFAXMEAmN6CAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEJANkEAQUCY3QCC1dyb25nIExQIGlkCHF1YW50aXR5AwkBAiE9AgUCY3QFAmNxCQACAQIPV3JvbmcgcG10IGFzc2V0BAJjQQkBAmJEAQUCY3UEAmNCCQEBRgIFAmNBBQJjdwQCY0MJAQJiRAEFAmN2BAJjRAkBAUYCBQJjQwUCY3gEAmNFCQECYkYCBQJjRAUCY0IEAmNGCQEBSQIFAmNFBQFhBAJjRwkBAUYCBQJjcgUBYQQCY0gJAQFGAgUCY3oFAWEEAmNJCQC8AgMFAmNCBQJjRwUCY0gEAmNKCQC8AgMFAmNEBQJjRwUCY0gEAmNLCQEBSQIFAmNJBQJjdwQCY0wJAQFJAgUCY0oFAmN4BAJjTQMJAAACBQJjcAIABQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUCY3MFAmNLAwkAAAIFAmN1AgVXQVZFUwUEdW5pdAkA2QQBBQJjdQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJjcwUCY0wDCQAAAgUCY3YCBVdBVkVTBQR1bml0CQDZBAEFAmN2CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYgIJAKUIAQUCY3MFAmNwCQECYnoGBQJjSwUCY0wFAmNyBQJjRgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVUABQJjRgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVYCBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQJjRgUDbmlsCQCcCgoFAmNLBQJjTAUCY3UFAmN2BQJjQQUCY0MFAmN6BQJjRQUCY3kFAmNNAQJjTg0CY3ACYkwCY08CY1ACY1ECY1ICY3MCY1MCY1QCY1UCY1YCY1cCY1gEAmNjCQECYVEABAJjdAkA2QQBCQCRAwIFAmNjBQF0BAJjWQkAkQMCBQJjYwUBdQQCY1oJAJEDAgUCY2MFAXYEAmRhCQCRAwIFAmNjBQF5BAJkYgkAkQMCBQJjYwUBegQCZGMJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJjYwUBdwQCZGQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJjYwUBeAQCY3kJAJEDAgUCY2MFAXMEAmRlCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFAmN0AghXciBscCBhcwhxdWFudGl0eQQCY0EDBQJjUwkBAmJEAQUCY1kDAwUCY1UJAAACBQJjWAUCY1kHCQBlAgkBAmJEAQUCY1kFAmNXAwUCY1UJAQJiRAEFAmNZCQBlAgkBAmJEAQUCY1kFAmNPBAJjQwMFAmNTCQECYkQBBQJjWgMDBQJjVQkAAAIFAmNYBQJjWgcJAGUCCQECYkQBBQJjWgUCY1cDBQJjVQkBAmJEAQUCY1oJAGUCCQECYkQBBQJjWgUCY1EEAmRmCQEBRgIFAmNPBQJkYwQCZGcJAQFGAgUCY1EFAmRkBAJkaAkBAmJGAgUCZGcFAmRmBAJjQgkBAUYCBQJjQQUCZGMEAmNECQEBRgIFAmNDBQJkZAQCZGkDCQAAAgUCZGUAAAQCY0UFAWQEAmRqBQFkBAJjZwkAdgYJALkCAgUCZGYFAmRnAAAJALYCAQAFAAEAAAUERE9XTgkAlwoFCQEBSQIFAmNnBQFhCQEBSQIFAmRmBQJkYwkBAUkCBQJkZwUCZGQJAQJiRgIJALcCAgUCY0QFAmRnCQC3AgIFAmNCBQJkZgUCZGoEAmNFCQECYkYCBQJjRAUCY0IEAmRrCQC8AgMJAQFQAQkAuAICBQJjRQUCZGgFAWMFAmNFBAJkagkBAUYCBQJiTAUBYQMDAwUCY1YJAQIhPQIFAmNFBQFkBwkAvwICBQJkawUCZGoHCQACAQkArAICCQCsAgIJAKwCAgIPUHJpY2Ugc2xpcHBhZ2UgCQCmAwEFAmRrAgMgPiAJAKYDAQUCZGoEAmRsCQEBRgIFAmRlBQFhBAJkbQkAvAIDBQJkZgUCY0UFAWMEAmRuCQC8AgMFAmRnBQFjBQJjRQQCZG8DCQC/AgIFAmRtBQJkZwkAlAoCBQJkbgUCZGcJAJQKAgUCZGYFAmRtBAJkcAgFAmRvAl8xBAJkcQgFAmRvAl8yBAJjZwkAvAIDBQJkbAUCZHEFAmNECQCXCgUJAQFJAgUCY2cFAWEJAQFJAgUCZHAFAmRjCQEBSQIFAmRxBQJkZAUCY0UFAmRqBAJkcggFAmRpAl8xBAJkcwgFAmRpAl8yBAJkdAgFAmRpAl8zBAJjRgkBAUkCCAUCZGkCXzQFAWEEAmR1CQEBSQIIBQJkaQJfNQUBYQMJAGcCAAAFAmRyCQACAQIHTFAgPD0gMAQCZHYDCQEBIQEFAmNUAAAFAmRyBAJkdwkAZQIFAmNPBQJkcwQCZHgJAGUCBQJjUQUCZHQEAmR5AwMFAmNVCQAAAgUCY1gFAmNZBwkAlAoCBQJjVwAAAwMFAmNVCQAAAgUCY1gFAmNaBwkAlAoCAAAFAmNXCQCUCgIFAmRzBQJkdAQCZHoIBQJkeQJfMQQCZEEIBQJkeQJfMgQCZEIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFVAAUCY0YJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFWAgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUCY0YJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVkCBQJjcwUCY3AJAQJibwoFAmR6BQJkQQUCZHYFAmNGBQJiTAUCZHUFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFAmR3BQJkeAUDbmlsCQCfCg0FAmRyBQJkdgUCY0YFAmNBBQJjQwUCZGUFAmN0BQJjeQUCZEIFAmR3BQJkeAUCY1AFAmNSAQJkQwMCZEQCZEUCZEYEAmRHCQC8AgMJALkCAgUCZEQFAmRFBQFjBQJkRgUCZEcBAmRIAwJkSQJkSgJkSwQCZEwJAGQCCQECYkQBCQECYVcBBQJiZQUCZEkEAmRNCQBkAgkBAmJEAQkBAmFXAQUCYmYFAmRKBAJkTgkAZAIICQEFdmFsdWUBCQDsBwEFAmJkCHF1YW50aXR5BQJkSwQCZEcJAQJkQwMJALYCAQUCZEwJALYCAQUCZE0JALYCAQUCZE4EAmRPCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJhagUGaGVpZ2h0CQDMCAIJAQtTdHJpbmdFbnRyeQIFAmFpCQCmAwEFAmRHBQNuaWwJAJQKAgUCZE8FAmRHAQJkUAECZFEEAmRSCAUCZFEGYW1vdW50BAJkUwkAawMIBQJkUQZhbW91bnQIBQJkUQVwcmljZQUBYQQCZFQDCQAAAggFAmRRCW9yZGVyVHlwZQUDQnV5CQCUCgIFAmRSCQEBLQEFAmRTCQCUCgIJAQEtAQUCZFIFAmRTBAJkSQgFAmRUAl8xBAJkSggFAmRUAl8yAwMDCQECYU4ABgkAAAIFAmJjBQFwBgkAAAIFAmJjBQFxCQACAQINQWRtaW4gYmxvY2tlZAMDCQECIT0CCAgFAmRRCWFzc2V0UGFpcgthbW91bnRBc3NldAUCYmUGCQECIT0CCAgFAmRRCWFzc2V0UGFpcgpwcmljZUFzc2V0BQJiZgkAAgECCVdyIGFzc2V0cwQCZFUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAqAMBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUCYWkJAQJhSwECD2RMcCBpcyByZXF1aXJlZAkBAmFLAQILaW52YWxpZCBkTHAEAmRWCQECZEgDBQJkSQUCZEoAAAQCZFcIBQJkVgJfMQQCZFgIBQJkVgJfMgQCZFkJAL8CAgUCZFgFAmRVBQJkWQECZFoBAmVhAwkBAiE9AgkAkAMBCAUCZWEIcGF5bWVudHMAAQkAAgECCjEgcG1udCBleHAEAmViCQEFdmFsdWUBCQCRAwIIBQJlYQhwYXltZW50cwAABAJjcQkBBXZhbHVlAQgFAmViB2Fzc2V0SWQEAmNXCAUCZWIGYW1vdW50BAJkaQkBAmNvBAkA2AQBCAUCZWENdHJhbnNhY3Rpb25JZAkA2AQBBQJjcQUCY1cIBQJlYQZjYWxsZXIEAmNLCAUCZGkCXzEEAmNMCAUCZGkCXzIEAmN5CQENcGFyc2VJbnRWYWx1ZQEIBQJkaQJfOQQCY00IBQJkaQNfMTADAwkBAmFOAAYJAAACBQJjeQUBcQkAAgEJAKwCAgIPQWRtaW4gYmxvY2tlZDogCQCkAwEFAmN5CQCXCgUFAmNLBQJjTAUCY1cFAmNxBQJjTQECZWMKAmVkAmFhAmVlAmVmAmJMAmNUAmNVAmNWAmNXAmNYBAJkaQkBAmNODQUCYWEFAmJMCAkBBXZhbHVlAQUCZWUGYW1vdW50CAkBBXZhbHVlAQUCZWUHYXNzZXRJZAgJAQV2YWx1ZQEFAmVmBmFtb3VudAgJAQV2YWx1ZQEFAmVmB2Fzc2V0SWQFAmVkCQAAAgUCYWECAAUCY1QFAmNVBQJjVgUCY1cFAmNYBAJjeQkBDXBhcnNlSW50VmFsdWUBCAUCZGkCXzgDAwMJAQJhTgAGCQAAAgUCY3kFAW8GCQAAAgUCY3kFAXEJAAIBCQCsAgICCEJsb2NrZWQ6CQCkAwEFAmN5BQJkaQECZWcBAmVoBAJlaQUBZwQCZWoJAJEDAgUCZWgAAAQCZWsJAJEDAgUCZWgAAQQCZWwJAKcDAQUBagQCZW0JALkCAgkApwMBBQJhTQUCZWwEAmVuCQC3AgIFAmVqBQJlawMJAAACBQJlbgUBZQUBZQQCZW8JALkCAgUCZW0FAmVpBAJlcAkAuQICCQC5AgIJALkCAgUCZWoFAmVrBQJlaQUCZWkEAmVxCQC6AgIJALkCAgUCZW8FAmVuBQJlbAQCZXIJALgCAgUCZW8FAmVsBAJlcwkAtwICBQJlaQUBZgoBAmV0AgJldQJldgQCZXcFAmV1BAJleAgFAmV3Al8xBAJleQgFAmV3Al8yAwkBAiE9AgUCZXkFBHVuaXQFAmV1BAJlegkAugICCQC5AgIJALkCAgUCZXgFAmV4BQJleAUCZXAEAmVBCQC6AgIJALkCAgkAtwICBQJlcQkAuQICBQJlegUCZWkFAmV4CQC3AgIJALoCAgkAuQICBQJlcgUCZXgFAmVsCQC5AgIFAmVzBQJlegQCZUIJAQFRAQkAuAICBQJlQQkBBXZhbHVlAQUCZXgDCQDAAgIFAWYFAmVCCQCUCgIFAmVBBQJldgkAlAoCBQJlQQUEdW5pdAQCZUMJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJCQDMCAIACgkAzAgCAAsJAMwIAgAMCQDMCAIADQkAzAgCAA4FA25pbAQCZUQKAAJlRQUCZUMKAAJlRgkAkAMBBQJlRQoAAmVHCQCUCgIFAmVuBQR1bml0CgECZUgCAmVJAmVKAwkAZwIFAmVKBQJlRgUCZUkJAQJldAIFAmVJCQCRAwIFAmVFBQJlSgoBAmVLAgJlSQJlSgMJAGcCBQJlSgUCZUYFAmVJCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQJlSwIJAQJlSAIJAQJlSAIJAQJlSAIJAQJlSAIJAQJlSAIJAQJlSAIJAQJlSAIJAQJlSAIJAQJlSAIJAQJlSAIJAQJlSAIJAQJlSAIJAQJlSAIJAQJlSAIJAQJlSAIFAmVHAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8EAmV4CAUCZUQCXzEEAmV5CAUCZUQCXzIDCQECIT0CBQJleQUEdW5pdAUCZXgJAAIBCQCsAgICGUQgY2FsY3VsYXRpb24gZXJyb3IsIEQgPSAJAKYDAQUCZXgBAmVMAwJlaAJlYQJlTQQCZWkFAWcEAmVOCQCRAwIFAmVoAwkAAAIFAmVhAAAAAQAABAJlbAkApwMBBQFqBAJlbQkAuQICCQCnAwEFAmFNBQJlbAQCZW4FAmVOBAJlbwkAuQICBQJlbQUCZWkEAmVPCQC6AgIJALkCAgkAuQICCQC6AgIJALkCAgUCZU0FAmVNCQC5AgIFAmVOBQJlaQUCZU0FAmVsCQC5AgIFAmVvBQJlaQQCZVAJALgCAgkAtwICBQJlbgkAugICCQC5AgIFAmVNBQJlbAUCZW8FAmVNCgECZXQCAmV1AmV2BAJlUQUCZXUEAmVSCAUCZVECXzEEAmV5CAUCZVECXzIDCQECIT0CBQJleQUEdW5pdAUCZXUEAmVTCQC6AgIJALcCAgkAuQICBQJlUgUCZVIFAmVPCQC3AgIJALkCAgUBZwUCZVIFAmVQBAJlVAkBAVEBCQC4AgIFAmVTCQEFdmFsdWUBBQJlUgMJAMACAgUBZgUCZVQJAJQKAgUCZVMFAmV2CQCUCgIFAmVTBQR1bml0BAJlQwkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQkAzAgCAAYJAMwIAgAHCQDMCAIACAkAzAgCAAkJAMwIAgAKCQDMCAIACwkAzAgCAAwJAMwIAgANCQDMCAIADgUDbmlsBAJlVQoAAmVFBQJlQwoAAmVGCQCQAwEFAmVFCgACZUcJAJQKAgUCZU0FBHVuaXQKAQJlSAICZUkCZUoDCQBnAgUCZUoFAmVGBQJlSQkBAmV0AgUCZUkJAJEDAgUCZUUFAmVKCgECZUsCAmVJAmVKAwkAZwIFAmVKBQJlRgUCZUkJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBAmVLAgkBAmVIAgkBAmVIAgkBAmVIAgkBAmVIAgkBAmVIAgkBAmVIAgkBAmVIAgkBAmVIAgkBAmVIAgkBAmVIAgkBAmVIAgkBAmVIAgkBAmVIAgkBAmVIAgkBAmVIAgUCZUcAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwQCZVIIBQJlVQJfMQQCZXkIBQJlVQJfMgMJAQIhPQIFAmV5BQR1bml0BQJlUgkAAgEJAKwCAgIZWSBjYWxjdWxhdGlvbiBlcnJvciwgWSA9IAkApgMBBQJlUgECZVYFAmVXAmNxAmNzAmFhAmVYBAJhWQkBAmFRAAQCY3UJAJEDAgUCYVkFAXUEAmN2CQCRAwIFAmFZBQF2BAJjdAkAkQMCBQJhWQUBdAQCZGMJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJhWQUBdwQCZGQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJhWQUBeAQCZE4JALYCAQgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBCQDZBAEFAmN0AhBpbnZhbGlkIGxwIGFzc2V0CHF1YW50aXR5BAJlWQMJAL8CAgUCZE4FAWUGCQACAQIiaW5pdGlhbCBkZXBvc2l0IHJlcXVpcmVzIGFsbCBjb2lucwMJAAACBQJlWQUCZVkEAmNBCQECYkQBBQJjdQQCY0MJAQJiRAEFAmN2BAJlWgMJAAACBQJhYQIACQCUCgIFAmNBBQJjQwMJAAACBQJjcQUCY3UDCQBmAgUCZVcFAmNBCQACAQIWaW52YWxpZCBwYXltZW50IGFtb3VudAkAlAoCCQBlAgUCY0EFAmVXBQJjQwMJAAACBQJjcQUCY3YDCQBmAgUCZVcFAmNDCQACAQIWaW52YWxpZCBwYXltZW50IGFtb3VudAkAlAoCBQJjQQkAZQIFAmNDBQJlVwkAAgECEHdyb25nIHBtdEFzc2V0SWQEAmZhCAUCZVoCXzEEAmZiCAUCZVoCXzIEAmZjAwkAAAIFAmNxBQJjdQkAlAoCBQJlVwAAAwkAAAIFAmNxBQJjdgkAlAoCAAAFAmVXCQACAQIPaW52YWxpZCBwYXltZW50BAJmZAgFAmZjAl8xBAJmZQgFAmZjAl8yBAJmZgMFAmVYCQCVCgMICQECY2wBBQJmZAJfMQgJAQJjbAEFAmZlAl8xCAkBAmNsAQUCZVcCXzIJAJUKAwUCZmQFAmZlAAAEAmZnCAUCZmYCXzEEAmZoCAUCZmYCXzIEAmNuCAUCZmYCXzMEAmZpCQBkAgUCZmEFAmZnBAJmagkAZAIFAmZiBQJmaAQCYlEJAQJlZwEJAMwIAgkAtgIBBQJmYQkAzAgCCQC2AgEFAmZiBQNuaWwEAmJQCQECZWcBCQDMCAIJALYCAQUCZmkJAMwIAgkAtgIBBQJmagUDbmlsBAJmawMJAL8CAgUCYlAFAmJRBgkBBXRocm93AAMJAAACBQJmawUCZmsEAmZsCQC8AgMFAmROCQC4AgIFAmJQBQJiUQUCYlEEAmNGCQEBSQIJAQJiRgIJAQFGAgUCZmoFAmRkCQEBRgIFAmZpBQJkYwUBYQQCZEIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFVAAUCY0YJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFWAgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUCY0YJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVkCBQJjcwUCYWEJAQJibwoFAmZkBQJmZQkAoAMBBQJmbAUCY0YAAAAABQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wAAAAAAUDbmlsBAJmbQkAawMFAmZiBQFhBQJmYQQCZm4JAGsDBQJlVwUBYQkAZAIFAmZtBQFhBAJmbwkAZQIFAmVXBQJmbgQCZnAJALwCAwUCZE4JALYCAQUCZm8JALYCAQUCZmIEAmZxCQCgAwEJALwCAwkAuAICBQJmbAUCZnAFAWIFAmZwCQCWCgQJAKADAQUCZmwFAmRCBQJjbgUCZnEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAmZyBgJmcwJmdAJmdQJlZAJmdgJmdwQCYVkJAQJhUQAEAmN0CQCRAwIFAmFZBQF0BAJjdQkAkQMCBQJhWQUBdQQCY3YJAJEDAgUCYVkFAXYEAmZ4CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYVkFAXcEAmZ5CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYVkFAXgEAmZ6CQCRAwIFAmFZBQFzBAJjcwMJAAACBQJlZAUCYm4FAmZ2BQJlZAQCZWIJAQV2YWx1ZQEJAJEDAgUCZnUAAAQCY3EJAQV2YWx1ZQEIBQJlYgdhc3NldElkBAJjVwgFAmViBmFtb3VudAQCY3AJANgEAQUCZncDCQECIT0CBQJjdAkA2AQBBQJjcQkAAgECCFdyb25nIExQBAJjQQkBAmJEAQUCY3UEAmNDCQECYkQBBQJjdgQCZkEKAAJmQgkA/AcEBQR0aGlzAhNnZXRPbmVUa25WMlJFQURPTkxZCQDMCAIFAmZzCQDMCAIFAmNXBQNuaWwFA25pbAMJAAECBQJmQgIKKEludCwgSW50KQUCZkIJAAIBCQCsAgIJAAMBBQJmQgIfIGNvdWxkbid0IGJlIGNhc3QgdG8gKEludCwgSW50KQMJAAACBQJmQQUCZkEEAmNuCAUCZkECXzIEAmZDCAUCZkECXzEEAmZEAwMJAGYCBQJmdAAACQBmAgUCZnQFAmZDBwkBAmFJAQkAuQkCCQDMCAICH2Ftb3VudCB0byByZWNlaXZlIGlzIGxlc3MgdGhhbiAJAMwIAgkApAMBBQJmdAUDbmlsAgAFAmZDBAJmRQMJAAACBQJmcwUCY3UJAJYKBAUCZkQAAAkAZQIJAGUCBQJjQQUCZkQFAmNuBQJjQwMJAAACBQJmcwUCY3YJAJYKBAAABQJmRAUCY0EJAGUCCQBlAgUCY0MFAmZEBQJjbgkAAgECFGludmFsaWQgb3V0IGFzc2V0IGlkBAJmRggFAmZFAl8xBAJmRwgFAmZFAl8yBAJmaQgFAmZFAl8zBAJmaggFAmZFAl80BAJmSAkBAmJGAgkBAUYCBQJmagUCZnkJAQFGAgUCZmkFAmZ4BAJmSQkBAUkCBQJmSAUBYQQCZkoDCQAAAgUCZnMCBVdBVkVTBQR1bml0CQDZBAEFAmZzBAJmSwMJAGYCBQJjbgAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmFQBQJjbgUCZkoFA25pbAUDbmlsBAJjTQkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmNzBQJmRAUCZkoJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFiAgkApQgBBQJjcwUCY3AJAQJiegYFAmZGBQJmRwUCY1cFAmZJBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBVQAFAmZJCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBVgIFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFAmZJBQNuaWwFAmZLAwkAAAIFAmNNBQJjTQQCZkwJAPwHBAUCYUwCBGJ1cm4JAMwIAgUCY1cFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCY3EFAmNXBQNuaWwDCQAAAgUCZkwFAmZMCQCUCgIFAmNNBQJmRAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECZk0ABAJhQwkAoggBCQEBUwADCQABAgUCYUMCBlN0cmluZwQCZW4FAmFDCQDZBAEFAmVuAwkAAQIFAmFDAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IBAmZOAAQCYUMJAKIIAQkBAVQAAwkAAQIFAmFDAgZTdHJpbmcEAmVuBQJhQwkA2QQBBQJlbgMJAAECBQJhQwIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAAJmTwkAAgECEVBlcm1pc3Npb24gZGVuaWVkAQJmUAECZWEEAmFDCQECZk0AAwkAAQIFAmFDAgpCeXRlVmVjdG9yBAJmUQUCYUMJAAACCAUCZWEPY2FsbGVyUHVibGljS2V5BQJmUQMJAAECBQJhQwIEVW5pdAkAAAIIBQJlYQZjYWxsZXIFBHRoaXMJAAIBAgtNYXRjaCBlcnJvcgECZlIBAmVhBAJhQwkBAmZNAAMJAAECBQJhQwIKQnl0ZVZlY3RvcgQCZlEFAmFDAwkAAAIIBQJlYQ9jYWxsZXJQdWJsaWNLZXkFAmZRBgUCZk8DCQABAgUCYUMCBFVuaXQDCQAAAggFAmVhBmNhbGxlcgUEdGhpcwYFAmZPCQACAQILTWF0Y2ggZXJyb3IdAmVhAQtjb25zdHJ1Y3RvcgEBUgQCZU8JAQJmUgEFAmVhAwkAAAIFAmVPBQJlTwkAzAgCCQELU3RyaW5nRW50cnkCCQEBUgAFAVIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJlYQEKc2V0TWFuYWdlcgECZlMEAmVPCQECZlIBBQJlYQMJAAACBQJlTwUCZU8EAmZUCQDZBAEFAmZTAwkAAAIFAmZUBQJmVAkAzAgCCQELU3RyaW5nRW50cnkCCQEBVAAFAmZTBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZWEBDmNvbmZpcm1NYW5hZ2VyAAQCY2sJAQJmTgAEAmZVAwkBCWlzRGVmaW5lZAEFAmNrBgkAAgECEk5vIHBlbmRpbmcgbWFuYWdlcgMJAAACBQJmVQUCZlUEAmZWAwkAAAIIBQJlYQ9jYWxsZXJQdWJsaWNLZXkJAQV2YWx1ZQEFAmNrBgkAAgECG1lvdSBhcmUgbm90IHBlbmRpbmcgbWFuYWdlcgMJAAACBQJmVgUCZlYJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVMACQDYBAEJAQV2YWx1ZQEFAmNrCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFUAAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmVhAQNwdXQCAmZXAmZYBAJmWQkBAmJpAAQCZloJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmZZBQFBAgpXciBzdCBhZGRyBAJnYQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCZlkFAUMCCldyIHNsIGFkZHIDCQBmAgAABQJmVwkAAgECDldyb25nIHNsaXBwYWdlAwkBAiE9AgkAkAMBCAUCZWEIcGF5bWVudHMAAgkAAgECDDIgcG1udHMgZXhwZAQCZ2IJAQJlYwoJAKUIAQgFAmVhBmNhbGxlcgkA2AQBCAUCZWENdHJhbnNhY3Rpb25JZAkBD0F0dGFjaGVkUGF5bWVudAIICQEFdmFsdWUBCQCRAwIIBQJlYQhwYXltZW50cwAAB2Fzc2V0SWQICQEFdmFsdWUBCQCRAwIIBQJlYQhwYXltZW50cwAABmFtb3VudAkAkQMCCAUCZWEIcGF5bWVudHMAAQUCZlcGBwYAAAIABAJkdggFAmdiAl8yBAJnYwgFAmdiAl83BAJjTQgFAmdiAl85BAJkdwgFAmdiA18xMAQCZHgIBQJnYgNfMTEEAmN1CAUCZ2IDXzEyBAJjdggFAmdiA18xMwQCZGkJAPwHBAUCYUwCBGVtaXQJAMwIAgUCZHYFA25pbAUDbmlsAwkAAAIFAmRpBQJkaQQCZ2QEAmFDBQJkaQMJAAECBQJhQwIHQWRkcmVzcwQCZ2UFAmFDCQD8BwQFAmdlAgRlbWl0CQDMCAIFAmR2BQNuaWwFA25pbAUEdW5pdAMJAAACBQJnZAUCZ2QEAmdmAwkAZgIFAmR3AAAJAPwHBAUCZ2ECA3B1dAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJjdQUCZHcFA25pbAUDbmlsAwkAAAIFAmdmBQJnZgQCZ2cDCQBmAgUCZHgAAAkA/AcEBQJnYQIDcHV0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmN2BQJkeAUDbmlsBQNuaWwDCQAAAgUCZ2cFAmdnBAJnaAMFAmZYBAJnaQkA/AcEBQJmWgIFc3Rha2UFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCZ2MFAmR2BQNuaWwDCQAAAgUCZ2kFAmdpBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAmVhBmNhbGxlcgUCZHYFAmdjBQNuaWwJAM4IAgUCY00FAmdoCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmVhAQtwdXRPbmVUa25WMgICZnQCZlgEAmdqCgACZkIJAPwHBAUCYUwCKGlzUG9vbE9uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkUkVBRE9OTFkJAMwIAgkApQgBBQR0aGlzBQNuaWwFA25pbAMJAAECBQJmQgIHQm9vbGVhbgUCZkIJAAIBCQCsAgIJAAMBBQJmQgIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgQCZ2sDAwMJAQJhTgAGCQAAAgUCYmMFAW8GCQAAAgUCYmMFAXEGBQJnagQCZ2wJAMwIAgMDCQEBIQEFAmdrBgkBAmZQAQUCZWEGCQECYUkBAiFwdXQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgYWRtaW4JAMwIAgMJAAACCQCQAwEIBQJlYQhwYXltZW50cwABBgkBAmFJAQIeZXhhY3RseSAxIHBheW1lbnQgYXJlIGV4cGVjdGVkBQNuaWwDCQAAAgUCZ2wFAmdsBAJhWQkBAmFRAAQCY3UJAJEDAgUCYVkFAXUEAmN2CQCRAwIFAmFZBQF2BAJjdAkA2QQBCQCRAwIFAmFZBQF0BAJmeAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmFZBQF3BAJmeQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmFZBQF4BAJjcwMJAAACCAUCZWEGY2FsbGVyBQR0aGlzCAUCZWEMb3JpZ2luQ2FsbGVyCAUCZWEGY2FsbGVyBAJlYgkBBXZhbHVlAQkAkQMCCAUCZWEIcGF5bWVudHMAAAQCY3EJANgEAQkBBXZhbHVlAQgFAmViB2Fzc2V0SWQEAmNXCAUCZWIGYW1vdW50BAJnbQkBAmVWBQUCY1cFAmNxCQClCAEFAmNzCQDYBAEIBQJlYQ10cmFuc2FjdGlvbklkBgMJAAACBQJnbQUCZ20EAmNuCAUCZ20CXzMEAmNNCAUCZ20CXzIEAmduCAUCZ20CXzEEAmR2AwMJAGYCBQJmdAAACQBmAgUCZnQFAmduBwkBAmFJAQkAuQkCCQDMCAICH2Ftb3VudCB0byByZWNlaXZlIGlzIGxlc3MgdGhhbiAJAMwIAgkApAMBBQJmdAUDbmlsAgAFAmduBAJnYgkA/AcEBQJhTAIEZW1pdAkAzAgCBQJkdgUDbmlsBQNuaWwDCQAAAgUCZ2IFAmdiBAJnZAQCYUMFAmdiAwkAAQIFAmFDAgdBZGRyZXNzBAJnZQUCYUMJAPwHBAUCZ2UCBGVtaXQJAMwIAgUCZHYFA25pbAUDbmlsBQR1bml0AwkAAAIFAmdkBQJnZAQCZ2gDBQJmWAQCZ2kJAPwHBAUCYmsCBXN0YWtlBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmN0BQJkdgUDbmlsAwkAAAIFAmdpBQJnaQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQJlYQZjYWxsZXIFAmR2BQJjdAUDbmlsBAJmSwMJAGYCBQJjbgAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmFQBQJjbgkA2QQBBQJjcQUDbmlsBQNuaWwJAJQKAgkAzggCCQDOCAIFAmNNBQJnaAUCZksFAmR2CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmVhAQpwdXRGb3JGcmVlAQJnbwMJAGYCAAAFAmdvCQACAQIKV3Jvbmcgc2xwZwMJAQIhPQIJAJADAQgFAmVhCHBheW1lbnRzAAIJAAIBAgwyIHBtbnRzIGV4cGQEAmdwCQECZWMKCQClCAEIBQJlYQZjYWxsZXIJANgEAQgFAmVhDXRyYW5zYWN0aW9uSWQJAQ9BdHRhY2hlZFBheW1lbnQCCAkBBXZhbHVlAQkAkQMCCAUCZWEIcGF5bWVudHMAAAdhc3NldElkCAkBBXZhbHVlAQkAkQMCCAUCZWEIcGF5bWVudHMAAAZhbW91bnQJAJEDAggFAmVhCHBheW1lbnRzAAEFAmdvBwcGAAACAAgFAmdwAl85AmVhAQNnZXQABAJkaQkBAmRaAQUCZWEEAmdxCAUCZGkCXzEEAmNMCAUCZGkCXzIEAmNXCAUCZGkCXzMEAmNxCAUCZGkCXzQEAmNNCAUCZGkCXzUEAmVQCQD8BwQFAmFMAgRidXJuCQDMCAIFAmNXBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmNxBQJjVwUDbmlsAwkAAAIFAmVQBQJlUAUCY00JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZWEBC2dldE9uZVRrblYyAgJmcwJmdAQCZ2oKAAJmQgkA/AcEBQJhTAIoaXNQb29sT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWRSRUFET05MWQkAzAgCCQClCAEFBHRoaXMFA25pbAUDbmlsAwkAAQIFAmZCAgdCb29sZWFuBQJmQgkAAgEJAKwCAgkAAwEFAmZCAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuBAJncgMDCQECYU4ABgkAAAIFAmJjBQFxBgUCZ2oEAmdsCQDMCAIDAwkBASEBBQJncgYJAQJmUAEFAmVhBgkBAmFJAQIhZ2V0IG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IGFkbWluCQDMCAIDCQAAAgkAkAMBCAUCZWEIcGF5bWVudHMAAQYJAQJhSQECHmV4YWN0bHkgMSBwYXltZW50IGFyZSBleHBlY3RlZAUDbmlsAwkAAAIFAmdsBQJnbAQCZ3MJAQJmcgYFAmZzBQJmdAgFAmVhCHBheW1lbnRzCAUCZWEGY2FsbGVyCAUCZWEMb3JpZ2luQ2FsbGVyCAUCZWENdHJhbnNhY3Rpb25JZAQCY00IBQJncwJfMQQCZkQIBQJncwJfMgkAlAoCBQJjTQUCZkQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZWEBCnJlZnJlc2hETHAABAJndAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQJhagAABAJndQMJAGcCCQBlAgUGaGVpZ2h0BQJndAUCYW0FBHVuaXQJAQJhSQEJALkJAgkAzAgCCQCkAwEFAmFtCQDMCAICLyBibG9ja3MgaGF2ZSBub3QgcGFzc2VkIHNpbmNlIHRoZSBwcmV2aW91cyBjYWxsBQNuaWwCAAMJAAACBQJndQUCZ3UEAmd2CQECZEgDAAAAAAAABAJkTwgFAmd2Al8xBAJndwgFAmd2Al8yCQCUCgIFAmRPCQCmAwEFAmd3CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmVhARNnZXRPbmVUa25WMlJFQURPTkxZAgJmcwJneAQCYVkJAQJhUQAEAmN1CQCRAwIFAmFZBQF1BAJjdgkAkQMCBQJhWQUBdgQCY3QJAJEDAgUCYVkFAXQEAmVoCQDMCAIJALYCAQkBAmJEAQUCY3UJAMwIAgkAtgIBCQECYkQBBQJjdgUDbmlsBAJkRgkAtgIBCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEJANkEAQUCY3QCEGludmFsaWQgbHAgYXNzZXQIcXVhbnRpdHkEAmJRCQECZWcBBQJlaAQCYlAJALgCAgUCYlEJALwCAwkAtgIBBQJneAUCYlEFAmRGBAJneQMJAAACBQJmcwUCY3UAAAMJAAACBQJmcwUCY3YAAQkAAgECFGludmFsaWQgb3V0IGFzc2V0IGlkBAJnegkBAmVMAwUCZWgFAmd5BQJiUAQCZ0EJALgCAgkAkQMCBQJlaAUCZ3kFAmd6BAJnQgkAlgMBCQDMCAIAAAkAzAgCCQCgAwEJALgCAgUCZ0EFAWYFA25pbAQCZ0MJAQJjbAEFAmdCBAJmQwgFAmdDAl8xBAJjbggFAmdDAl8yCQCUCgIFA25pbAkAlAoCBQJmQwUCY24CZWEBHGdldE9uZVRrblYyV2l0aEJvbnVzUkVBRE9OTFkCAmZzAmd4BAJhWQkBAmFRAAQCY3UJAJEDAgUCYVkFAXUEAmN2CQCRAwIFAmFZBQF2BAJjdAkAkQMCBQJhWQUBdAQCY0EJAQJiRAEFAmN1BAJjQwkBAmJEAQUCY3YEAmdECgACZkIJAPwHBAUEdGhpcwITZ2V0T25lVGtuVjJSRUFET05MWQkAzAgCBQJmcwkAzAgCBQJneAUDbmlsBQNuaWwDCQABAgUCZkICCihJbnQsIEludCkFAmZCCQACAQkArAICCQADAQUCZkICHyBjb3VsZG4ndCBiZSBjYXN0IHRvIChJbnQsIEludCkEAmZDCAUCZ0QCXzEEAmNuCAUCZ0QCXzIEAmRpCQECY28EAgAFAmN0BQJneAUEdGhpcwQCY0sIBQJkaQJfMQQCY0wIBQJkaQJfMgQCZ0UJAGQCBQJjSwUCY0wEAmZxAwkAAAIFAmdFAAADCQAAAgUCZkMAAAAACQACAQIXYm9udXMgY2FsY3VsYXRpb24gZXJyb3IJAGsDCQBlAgUCZkMFAmdFBQFhBQJnRQkAlAoCBQNuaWwJAJUKAwUCZkMFAmNuBQJmcQJlYQEJZ2V0Tm9MZXNzAgJnRgJnRwQCZGkJAQJkWgEFAmVhBAJjSwgFAmRpAl8xBAJjTAgFAmRpAl8yBAJjVwgFAmRpAl8zBAJjcQgFAmRpAl80BAJjTQgFAmRpAl81AwkAZgIFAmdGBQJjSwkAAgEJAKwCAgkArAICCQCsAgICCUZhaWxlZDogIAkApAMBBQJjSwIDIDwgCQCkAwEFAmdGAwkAZgIFAmdHBQJjTAkAAgEJAKwCAgkArAICCQCsAgICCEZhaWxlZDogCQCkAwEFAmNMAgMgPCAJAKQDAQUCZ0cEAmdICQD8BwQFAmFMAgRidXJuCQDMCAIFAmNXBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmNxBQJjVwUDbmlsAwkAAAIFAmdIBQJnSAUCY00JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZWEBDXVuc3Rha2VBbmRHZXQBAmNtBAJnSQMJAQIhPQIJAJADAQgFAmVhCHBheW1lbnRzAAAJAAIBAg1ObyBwbW50cyBleHBkBgMJAAACBQJnSQUCZ0kEAmNjCQECYVEABAJnSgkBAmJpAAQCZ2MJANkEAQkAkQMCBQJjYwUBdAQCZ0sJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmdKBQFBAgpXciBzdCBhZGRyBAJnTAkA/AcEBQJnSwIHdW5zdGFrZQkAzAgCCQDYBAEFAmdjCQDMCAIFAmNtBQNuaWwFA25pbAMJAAACBQJnTAUCZ0wEAmRpCQECY28ECQDYBAEIBQJlYQ10cmFuc2FjdGlvbklkCQDYBAEFAmdjBQJjbQgFAmVhBmNhbGxlcgQCY3kJAQ1wYXJzZUludFZhbHVlAQgFAmRpAl85BAJjTQgFAmRpA18xMAQCZ00DAwkBAmFOAAYJAAACBQJjeQUBcQkAAgEJAKwCAgIJQmxvY2tlZDogCQCkAwEFAmN5BgMJAAACBQJnTQUCZ00EAmdOCQD8BwQFAmFMAgRidXJuCQDMCAIFAmNtBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmdjBQJjbQUDbmlsAwkAAAIFAmdOBQJnTgUCY00JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZWEBE3Vuc3Rha2VBbmRHZXROb0xlc3MDAmdPAmdQAmdHBAJncgMJAQJhTgAGCQAAAgUCYmMFAXEEAmdsCQDMCAIDCQEBIQEFAmdyBgkAAgECIWdldCBvcGVyYXRpb24gaXMgYmxvY2tlZCBieSBhZG1pbgkAzAgCAwkAAAIJAJADAQgFAmVhCHBheW1lbnRzAAAGCQACAQIYbm8gcGF5bWVudHMgYXJlIGV4cGVjdGVkBQNuaWwDCQAAAgUCZ2wFAmdsBAJnTAkA/AcEBQJiawIHdW5zdGFrZQkAzAgCCQDYBAEFAmJkCQDMCAIFAmdPBQNuaWwFA25pbAMJAAACBQJnTAUCZ0wEAmdRCQECY28ECQDYBAEIBQJlYQ10cmFuc2FjdGlvbklkCQDYBAEFAmJkBQJnTwgFAmVhBmNhbGxlcgQCY0sIBQJnUQJfMQQCY0wIBQJnUQJfMgQCY00IBQJnUQNfMTAEAmdSCQDMCAIDCQBnAgUCY0sFAmdQBgkAAgEJALkJAgkAzAgCAixhbW91bnQgYXNzZXQgYW1vdW50IHRvIHJlY2VpdmUgaXMgbGVzcyB0aGFuIAkAzAgCCQCkAwEFAmdQBQNuaWwCAAkAzAgCAwkAZwIFAmNMBQJnRwYJAAIBCQC5CQIJAMwIAgIrcHJpY2UgYXNzZXQgYW1vdW50IHRvIHJlY2VpdmUgaXMgbGVzcyB0aGFuIAkAzAgCCQCkAwEFAmdHBQNuaWwCAAUDbmlsAwkAAAIFAmdSBQJnUgQCZ0gJAPwHBAUCYUwCBGJ1cm4JAMwIAgUCZ08FA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCYmQFAmdPBQNuaWwDCQAAAgUCZ0gFAmdIBQJjTQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJlYQEVdW5zdGFrZUFuZEdldE9uZVRrblYyAwJnTwJmcwJmdAQCZ2oKAAJmQgkA/AcEBQJhTAIoaXNQb29sT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWRSRUFET05MWQkAzAgCCQClCAEFBHRoaXMFA25pbAUDbmlsAwkAAQIFAmZCAgdCb29sZWFuBQJmQgkAAgEJAKwCAgkAAwEFAmZCAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuBAJncgMDCQECYU4ABgkAAAIFAmJjBQFxBgUCZ2oEAmdsCQDMCAIDAwkBASEBBQJncgYJAQJmUAEFAmVhBgkBAmFJAQIhZ2V0IG9wZXJhdGlvbiBpcyBibG9ja2VkIGJ5IGFkbWluCQDMCAIDCQAAAgkAkAMBCAUCZWEIcGF5bWVudHMAAAYJAQJhSQECGG5vIHBheW1lbnRzIGFyZSBleHBlY3RlZAUDbmlsAwkAAAIFAmdsBQJnbAQCY2MJAQJhUQAEAmdKCQECYmkABAJnYwkA2QQBCQCRAwIFAmNjBQF0BAJnSwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCZ0oFAUECCldyIHN0IGFkZHIEAmdMCQD8BwQFAmdLAgd1bnN0YWtlCQDMCAIJANgEAQUCZ2MJAMwIAgUCZ08FA25pbAUDbmlsAwkAAAIFAmdMBQJnTAQCZ1MJAQJmcgYFAmZzBQJmdAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCZ2MFAmdPBQNuaWwIBQJlYQZjYWxsZXIIBQJlYQxvcmlnaW5DYWxsZXIIBQJlYQ10cmFuc2FjdGlvbklkBAJjTQgFAmdTAl8xBAJmRAgFAmdTAl8yCQCUCgIFAmNNBQJmRAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJlYQEccHV0T25lVGtuVjJXaXRoQm9udXNSRUFET05MWQICZ1QCZ1UEAmFZCQECYVEABAJjdQkAkQMCBQJhWQUBdQQCY3YJAJEDAgUCYVkFAXYEAmN0CQCRAwIFAmFZBQF0BAJnVgkBAmVWBQUCZ1QFAmdVAgACAAYEAmZsCAUCZ1YCXzEEAmNNCAUCZ1YCXzIEAmNuCAUCZ1YCXzMEAmZxCAUCZ1YCXzQJAJQKAgUDbmlsCQCVCgMFAmZsBQJjbgUCZnECZWEBIXB1dE9uZVRrblYyV2l0aG91dFRha2VGZWVSRUFET05MWQICZ1QCZ1UEAmFZCQECYVEABAJjdQkAkQMCBQJhWQUBdQQCY3YJAJEDAgUCYVkFAXYEAmN0CQCRAwIFAmFZBQF0BAJnVwkBAmVWBQUCZ1QFAmdVAgACAAcEAmZsCAUCZ1cCXzEEAmNNCAUCZ1cCXzIEAmNuCAUCZ1cCXzMEAmZxCAUCZ1cCXzQJAJQKAgUDbmlsCQCVCgMFAmZsBQJjbgUCZnECZWEBCGFjdGl2YXRlAgJnWAJnWQMJAQIhPQIJAKUIAQgFAmVhBmNhbGxlcgkApQgBBQJhTAkAAgECBmRlbmllZAkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYwAFAmdYCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhZAAFAmdZBQNuaWwCB3N1Y2Nlc3MCZWEBBHNldFMCAmdaAmdNAwkBAiE9AgkApQgBCAUCZWEGY2FsbGVyCQECYUUCBQR0aGlzCQECYWYABQJmTwkAzAgCCQELU3RyaW5nRW50cnkCBQJnWgUCZ00FA25pbAJlYQEEc2V0SQICZ1oCZ00DCQECIT0CCQClCAEIBQJlYQZjYWxsZXIJAQJhRQIFBHRoaXMJAQJhZgAFAmZPCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJnWgUCZ00FA25pbAJlYQEcZ2V0UG9vbENvbmZpZ1dyYXBwZXJSRUFET05MWQAJAJQKAgUDbmlsCQECYVEAAmVhARxnZXRBY2NCYWxhbmNlV3JhcHBlclJFQURPTkxZAQJiRQkAlAoCBQNuaWwJAQJiRAEFAmJFAmVhARljYWxjUHJpY2VzV3JhcHBlclJFQURPTkxZAwJiVwJiWAJjYgQCaGEJAQJjYQMFAmJXBQJiWAUCY2IJAJQKAgUDbmlsCQDMCAIJAKYDAQkAkQMCBQJoYQAACQDMCAIJAKYDAQkAkQMCBQJoYQABCQDMCAIJAKYDAQkAkQMCBQJoYQACBQNuaWwCZWEBFmZyb21YMThXcmFwcGVyUkVBRE9OTFkCAUoCaGIJAJQKAgUDbmlsCQEBSQIJAKcDAQUBSgUCaGICZWEBFHRvWDE4V3JhcHBlclJFQURPTkxZAgFHAUgJAJQKAgUDbmlsCQCmAwEJAQFGAgUBRwUBSAJlYQEeY2FsY1ByaWNlQmlnSW50V3JhcHBlclJFQURPTkxZAgJiRwJiSAkAlAoCBQNuaWwJAKYDAQkBAmJGAgkApwMBBQJiRwkApwMBBQJiSAJlYQEjZXN0aW1hdGVQdXRPcGVyYXRpb25XcmFwcGVyUkVBRE9OTFkJAmNwAmJMAmNPAmNQAmNRAmNSAmhjAmNTAmNUCQCUCgIFA25pbAkBAmNODQUCY3AFAmJMBQJjTwUCY1AFAmNRBQJjUgUCaGMFAmNTBQJjVAYHAAACAAJlYQEjZXN0aW1hdGVHZXRPcGVyYXRpb25XcmFwcGVyUkVBRE9OTFkEAmNwAmhkAmNyAmhjBAJkaQkBAmNvBAUCY3AFAmhkBQJjcgkBEUBleHRyTmF0aXZlKDEwNjIpAQUCaGMJAJQKAgUDbmlsCQCcCgoIBQJkaQJfMQgFAmRpAl8yCAUCZGkCXzMIBQJkaQJfNAgFAmRpAl81CAUCZGkCXzYIBQJkaQJfNwkApgMBCAUCZGkCXzgIBQJkaQJfOQgFAmRpA18xMAJlYQEOZ2V0RmVlUkVBRE9OTFkACQCUCgIFA25pbAUCYWgBAmhlAQJoZgAEAmhnBAJhQwkBAmZNAAMJAAECBQJhQwIKQnl0ZVZlY3RvcgQCZlEFAmFDBQJmUQMJAAECBQJhQwIEVW5pdAgFAmhlD3NlbmRlclB1YmxpY0tleQkAAgECC01hdGNoIGVycm9yBAJhQwUCaGUDCQABAgUCYUMCBU9yZGVyBAJkUQUCYUMEAmhoCQECYU8ABAJoaQkBAmRQAQUCZFEEAmhqCQD0AwMIBQJkUQlib2R5Qnl0ZXMJAJEDAggFAmRRBnByb29mcwAACAUCZFEPc2VuZGVyUHVibGljS2V5BAJoawkA9AMDCAUCZFEJYm9keUJ5dGVzCQCRAwIIBQJkUQZwcm9vZnMAAQUCaGgDAwMFAmhpBQJoagcFAmhrBwYJAQJheAMFAmhpBQJoagUCaGsDCQABAgUCYUMCFFNldFNjcmlwdFRyYW5zYWN0aW9uBAJlbgUCYUMEAmhsCQD2AwEJAQV2YWx1ZQEIBQJlbgZzY3JpcHQEAmhtCQDbBAEJAQV2YWx1ZQEJAJ0IAgUCYUwJAQJhdgAEAmhuCQDxBwEFBHRoaXMDAwkAAAIFAmhtBQJobAkBAiE9AgUCaG4FAmhsBwYJAPQDAwgFAmhlCWJvZHlCeXRlcwkAkQMCCAUCaGUGcHJvb2ZzAAAFAmhnCQD0AwMIBQJoZQlib2R5Qnl0ZXMJAJEDAggFAmhlBnByb29mcwAABQJoZ3z0Vlo=", "chainId": 84, "height": 2339518, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GE24pgEr6yjW1wACdqv9tTWNNUStTC1HyubAKEgNJsuD Next: Fz3garjVGrjr9DDgv3AVf6FpmjwR5vfs1ctvEm2uz481 Diff:
OldNewDifferences
452452
453453
454454 func moa (order) = {
455- let cfg = gpc()
456- let amtAsId = cfg[idxAmAsId]
457- let prAsId = cfg[idxPrAsId]
458- let sts = parseIntValue(cfg[idxPoolSt])
459- let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
460- let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
461- let accAmtAsBalance = getAccBalance(amtAsId)
462- let accPrAsBalance = getAccBalance(prAsId)
463- let curPriceX18 = if ((order.orderType == Buy))
464- then pcp(amtAsDcm, prAsDcm, (accAmtAsBalance + order.amount), accPrAsBalance)
465- else pcp(amtAsDcm, prAsDcm, (accAmtAsBalance - order.amount), accPrAsBalance)
466- let curPrice = f1(curPriceX18, scale8)
455+ let amountAssetAmount = order.amount
456+ let priceAssetAmount = fraction(order.amount, order.price, scale8)
457+ let $t02011920331 = if ((order.orderType == Buy))
458+ then $Tuple2(amountAssetAmount, -(priceAssetAmount))
459+ else $Tuple2(-(amountAssetAmount), priceAssetAmount)
460+ let amountAssetBalanceDelta = $t02011920331._1
461+ let priceAssetBalanceDelta = $t02011920331._2
467462 if (if (if (igs())
468463 then true
469- else (sts == PoolMatcherDis))
464+ else (cfgPoolStatus == PoolMatcherDis))
470465 then true
471- else (sts == PoolShutdown))
466+ else (cfgPoolStatus == PoolShutdown))
472467 then throw("Admin blocked")
473- else {
474- let orAmtAsset = order.assetPair.amountAsset
475- let orAmtAsStr = if ((orAmtAsset == unit))
476- then "WAVES"
477- else toBase58String(value(orAmtAsset))
478- let orPrAsset = order.assetPair.priceAsset
479- let orPrAsStr = if ((orPrAsset == unit))
480- then "WAVES"
481- else toBase58String(value(orPrAsset))
482- if (if ((orAmtAsStr != amtAsId))
483- then true
484- else (orPrAsStr != prAsId))
485- then throw("Wr assets")
486- else {
487- let orderPrice = order.price
488- let priceDcm = fraction(scale8, prAsDcm, amtAsDcm)
489- let castOrderPrice = ts(orderPrice, scale8, priceDcm)
490- let isOrderPriceValid = if ((order.orderType == Buy))
491- then (curPrice >= castOrderPrice)
492- else (castOrderPrice >= curPrice)
493- true
494- }
495- }
468+ else if (if ((order.assetPair.amountAsset != cfgAmountAssetId))
469+ then true
470+ else (order.assetPair.priceAsset != cfgPriceAssetId))
471+ then throw("Wr assets")
472+ else {
473+ let dLp = valueOrErrorMessage(parseBigInt(valueOrErrorMessage(getString(this, keyDLp), fmtErr("dLp is required"))), fmtErr("invalid dLp"))
474+ let $t02075820858 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
475+ let unusedActions = $t02075820858._1
476+ let dLpNew = $t02075820858._2
477+ let isOrderValid = (dLpNew > dLp)
478+ isOrderValid
479+ }
496480 }
497481
498482
544528 let ann_aPrecision = (ann - aPrecision)
545529 let n1 = (n + big1)
546530 func calc (acc,cur) = {
547- let $t02363623656 = acc
548- let d = $t02363623656._1
549- let found = $t02363623656._2
531+ let $t02301123031 = acc
532+ let d = $t02301123031._1
533+ let found = $t02301123031._2
550534 if ((found != unit))
551535 then acc
552536 else {
560544 }
561545
562546 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
563- let $t02407724124 = {
547+ let $t02345223499 = {
564548 let $l = arr
565549 let $s = size($l)
566550 let $acc0 = $Tuple2(s, unit)
574558
575559 $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)
576560 }
577- let d = $t02407724124._1
578- let found = $t02407724124._2
561+ let d = $t02345223499._1
562+ let found = $t02345223499._2
579563 if ((found != unit))
580564 then d
581565 else throw(("D calculation error, D = " + toString(d)))
595579 let c = (((((D * D) / (x * n)) * D) * aPrecision) / (ann * n))
596580 let b = ((s + ((D * aPrecision) / ann)) - D)
597581 func calc (acc,cur) = {
598- let $t02462424644 = acc
599- let y = $t02462424644._1
600- let found = $t02462424644._2
582+ let $t02399924019 = acc
583+ let y = $t02399924019._1
584+ let found = $t02399924019._2
601585 if ((found != unit))
602586 then acc
603587 else {
610594 }
611595
612596 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
613- let $t02495124998 = {
597+ let $t02432624373 = {
614598 let $l = arr
615599 let $s = size($l)
616600 let $acc0 = $Tuple2(D, unit)
624608
625609 $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)
626610 }
627- let y = $t02495124998._1
628- let found = $t02495124998._2
611+ let y = $t02432624373._1
612+ let found = $t02432624373._2
629613 if ((found != unit))
630614 then y
631615 else throw(("Y calculation error, Y = " + toString(y)))
647631 then {
648632 let amBalance = getAccBalance(amId)
649633 let prBalance = getAccBalance(prId)
650- let $t02578126243 = if ((txId == ""))
634+ let $t02515625618 = if ((txId == ""))
651635 then $Tuple2(amBalance, prBalance)
652636 else if ((pmtAssetId == amId))
653637 then if ((pmtAmtRaw > amBalance))
658642 then throw("invalid payment amount")
659643 else $Tuple2(amBalance, (prBalance - pmtAmtRaw))
660644 else throw("wrong pmtAssetId")
661- let amBalanceOld = $t02578126243._1
662- let prBalanceOld = $t02578126243._2
663- let $t02624926425 = if ((pmtAssetId == amId))
645+ let amBalanceOld = $t02515625618._1
646+ let prBalanceOld = $t02515625618._2
647+ let $t02562425800 = if ((pmtAssetId == amId))
664648 then $Tuple2(pmtAmtRaw, 0)
665649 else if ((pmtAssetId == prId))
666650 then $Tuple2(0, pmtAmtRaw)
667651 else throw("invalid payment")
668- let amAmountRaw = $t02624926425._1
669- let prAmountRaw = $t02624926425._2
670- let $t02642926668 = if (withTakeFee)
652+ let amAmountRaw = $t02562425800._1
653+ let prAmountRaw = $t02562425800._2
654+ let $t02580426043 = if (withTakeFee)
671655 then $Tuple3(takeFee(amAmountRaw)._1, takeFee(prAmountRaw)._1, takeFee(pmtAmtRaw)._2)
672656 else $Tuple3(amAmountRaw, prAmountRaw, 0)
673- let amAmount = $t02642926668._1
674- let prAmount = $t02642926668._2
675- let feeAmount = $t02642926668._3
657+ let amAmount = $t02580426043._1
658+ let prAmount = $t02580426043._2
659+ let feeAmount = $t02580426043._3
676660 let amBalanceNew = (amBalanceOld + amAmount)
677661 let prBalanceNew = (prBalanceOld + prAmount)
678662 let D0 = getD([toBigInt(amBalanceOld), toBigInt(prBalanceOld)])
718702 else {
719703 let amBalance = getAccBalance(amId)
720704 let prBalance = getAccBalance(prId)
721- let $t02867028781 = {
705+ let $t02804528156 = {
722706 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)
723707 if ($isInstanceOf(@, "(Int, Int)"))
724708 then @
725709 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
726710 }
727- if (($t02867028781 == $t02867028781))
711+ if (($t02804528156 == $t02804528156))
728712 then {
729- let feeAmount = $t02867028781._2
730- let totalGet = $t02867028781._1
713+ let feeAmount = $t02804528156._2
714+ let totalGet = $t02804528156._1
731715 let totalAmount = if (if ((minOutAmount > 0))
732716 then (minOutAmount > totalGet)
733717 else false)
734718 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
735719 else totalGet
736- let $t02897129278 = if ((outAssetId == amId))
720+ let $t02834628653 = if ((outAssetId == amId))
737721 then $Tuple4(totalAmount, 0, ((amBalance - totalAmount) - feeAmount), prBalance)
738722 else if ((outAssetId == prId))
739723 then $Tuple4(0, totalAmount, amBalance, ((prBalance - totalAmount) - feeAmount))
740724 else throw("invalid out asset id")
741- let outAm = $t02897129278._1
742- let outPr = $t02897129278._2
743- let amBalanceNew = $t02897129278._3
744- let prBalanceNew = $t02897129278._4
725+ let outAm = $t02834628653._1
726+ let outPr = $t02834628653._2
727+ let amBalanceNew = $t02834628653._3
728+ let prBalanceNew = $t02834628653._4
745729 let curPrX18 = cpbi(t1(prBalanceNew, prDecimals), t1(amBalanceNew, amDecimals))
746730 let curPr = f1(curPrX18, scale8)
747731 let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
953937 let pmt = value(i.payments[0])
954938 let pmtAssetId = toBase58String(value(pmt.assetId))
955939 let pmtAmt = pmt.amount
956- let $t03464034798 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId), true)
957- if (($t03464034798 == $t03464034798))
940+ let $t03401534173 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId), true)
941+ if (($t03401534173 == $t03401534173))
958942 then {
959- let feeAmount = $t03464034798._3
960- let state = $t03464034798._2
961- let estimLP = $t03464034798._1
943+ let feeAmount = $t03401534173._3
944+ let state = $t03401534173._2
945+ let estimLP = $t03401534173._1
962946 let emitLpAmt = if (if ((minOutAmount > 0))
963947 then (minOutAmount > estimLP)
964948 else false)
10491033 else throwErr("exactly 1 payment are expected")]
10501034 if ((checks == checks))
10511035 then {
1052- let $t03742037575 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1053- let state = $t03742037575._1
1054- let totalAmount = $t03742037575._2
1036+ let $t03679536950 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1037+ let state = $t03679536950._1
1038+ let totalAmount = $t03679536950._2
10551039 $Tuple2(state, totalAmount)
10561040 }
10571041 else throw("Strict value is not equal to itself.")
10601044
10611045
10621046 @Callable(i)
1063-func refreshDlp () = nil
1047+func refreshDLp () = {
1048+ let lastRefreshedBlockHeight = valueOrElse(getInteger(keyDLpRefreshedHeight), 0)
1049+ let checkLastRefreshedBlockHeight = if (((height - lastRefreshedBlockHeight) >= dLpRefreshDelay))
1050+ then unit
1051+ else throwErr(makeString([toString(dLpRefreshDelay), " blocks have not passed since the previous call"], ""))
1052+ if ((checkLastRefreshedBlockHeight == checkLastRefreshedBlockHeight))
1053+ then {
1054+ let $t03734837403 = refreshDLpInternal(0, 0, 0)
1055+ let actions = $t03734837403._1
1056+ let updatedKLp = $t03734837403._2
1057+ $Tuple2(actions, toString(updatedKLp))
1058+ }
1059+ else throw("Strict value is not equal to itself.")
1060+ }
10641061
10651062
10661063
10821079 let newY = getYD(xp, index, D1)
10831080 let dy = (xp[index] - newY)
10841081 let totalGetRaw = max([0, toInt((dy - big1))])
1085- let $t03841638465 = takeFee(totalGetRaw)
1086- let totalGet = $t03841638465._1
1087- let feeAmount = $t03841638465._2
1082+ let $t03820538254 = takeFee(totalGetRaw)
1083+ let totalGet = $t03820538254._1
1084+ let feeAmount = $t03820538254._2
10881085 $Tuple2(nil, $Tuple2(totalGet, feeAmount))
10891086 }
10901087
10981095 let lpId = poolConfig[idxLPAsId]
10991096 let amBalance = getAccBalance(amId)
11001097 let prBalance = getAccBalance(prId)
1101- let $t03881038925 = {
1098+ let $t03859938714 = {
11021099 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)
11031100 if ($isInstanceOf(@, "(Int, Int)"))
11041101 then @
11051102 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
11061103 }
1107- let totalGet = $t03881038925._1
1108- let feeAmount = $t03881038925._2
1104+ let totalGet = $t03859938714._1
1105+ let feeAmount = $t03859938714._2
11091106 let r = ego("", lpId, lpAssetAmount, this)
11101107 let outAmAmt = r._1
11111108 let outPrAmt = r._2
12491246 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), unstakeAmount], nil)
12501247 if ((unstakeInv == unstakeInv))
12511248 then {
1252- let $t04276342951 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1253- let state = $t04276342951._1
1254- let totalAmount = $t04276342951._2
1249+ let $t04255242740 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1250+ let state = $t04255242740._1
1251+ let totalAmount = $t04255242740._2
12551252 $Tuple2(state, totalAmount)
12561253 }
12571254 else throw("Strict value is not equal to itself.")
12671264 let amId = poolConfig[idxAmAsId]
12681265 let prId = poolConfig[idxPrAsId]
12691266 let lpId = poolConfig[idxLPAsId]
1270- let $t04321043313 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1271- let lpAmount = $t04321043313._1
1272- let state = $t04321043313._2
1273- let feeAmount = $t04321043313._3
1274- let bonus = $t04321043313._4
1267+ let $t04299943102 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1268+ let lpAmount = $t04299943102._1
1269+ let state = $t04299943102._2
1270+ let feeAmount = $t04299943102._3
1271+ let bonus = $t04299943102._4
12751272 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
12761273 }
12771274
12831280 let amId = poolConfig[idxAmAsId]
12841281 let prId = poolConfig[idxPrAsId]
12851282 let lpId = poolConfig[idxLPAsId]
1286- let $t04359243696 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1287- let lpAmount = $t04359243696._1
1288- let state = $t04359243696._2
1289- let feeAmount = $t04359243696._3
1290- let bonus = $t04359243696._4
1283+ let $t04338143485 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1284+ let lpAmount = $t04338143485._1
1285+ let state = $t04338143485._2
1286+ let feeAmount = $t04338143485._3
1287+ let bonus = $t04338143485._4
12911288 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
12921289 }
12931290
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let scale8 = 100000000
55
66 let scale8BigInt = toBigInt(100000000)
77
88 let scale18 = toBigInt(1000000000000000000)
99
1010 let zeroBigInt = toBigInt(0)
1111
1212 let big0 = toBigInt(0)
1313
1414 let big1 = toBigInt(1)
1515
1616 let big2 = toBigInt(2)
1717
1818 let slippage4D = toBigInt((scale8 - ((scale8 * 1) / scale8)))
1919
2020 let wavesString = "WAVES"
2121
2222 let Amult = "100"
2323
2424 let Dconv = "1"
2525
2626 let SEP = "__"
2727
2828 let EMPTY = ""
2929
3030 let PoolActive = 1
3131
3232 let PoolPutDis = 2
3333
3434 let PoolMatcherDis = 3
3535
3636 let PoolShutdown = 4
3737
3838 let idxPoolAddress = 1
3939
4040 let idxPoolSt = 2
4141
4242 let idxLPAsId = 3
4343
4444 let idxAmAsId = 4
4545
4646 let idxPrAsId = 5
4747
4848 let idxAmtAsDcm = 6
4949
5050 let idxPriceAsDcm = 7
5151
5252 let idxIAmtAsId = 8
5353
5454 let idxIPriceAsId = 9
5555
5656 let idxFactStakCntr = 1
5757
5858 let idxFactoryRestCntr = 6
5959
6060 let idxFactSlippCntr = 7
6161
6262 let idxFactGwxRewCntr = 10
6363
6464 let feeDefault = fraction(10, scale8, 10000)
6565
6666 func t1 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
6767
6868
6969 func f1 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
7070
7171
7272 func ts (amt,resScale,curScale) = fraction(amt, resScale, curScale)
7373
7474
7575 func abs (val) = if ((zeroBigInt > val))
7676 then -(val)
7777 else val
7878
7979
8080 func absBigInt (val) = if ((zeroBigInt > val))
8181 then -(val)
8282 else val
8383
8484
8585 func fc () = "%s__factoryContract"
8686
8787
8888 func mpk () = "%s__managerPublicKey"
8989
9090
9191 func pmpk () = "%s__pendingManagerPublicKey"
9292
9393
9494 func pl () = "%s%s__price__last"
9595
9696
9797 func ph (h,t) = makeString(["%s%s%d%d__price__history", toString(h), toString(t)], SEP)
9898
9999
100100 func pau (ua,txId) = ((("%s%s%s__P__" + ua) + "__") + txId)
101101
102102
103103 func gau (ua,txId) = ((("%s%s%s__G__" + ua) + "__") + txId)
104104
105105
106106 func aa () = "%s__amountAsset"
107107
108108
109109 func pa () = "%s__priceAsset"
110110
111111
112112 func amp () = "%s__amp"
113113
114114
115115 func ada () = "%s__addonAddr"
116116
117117
118118 let keyFee = "%s__fee"
119119
120120 let fee = valueOrElse(getInteger(this, keyFee), feeDefault)
121121
122122 let keyDLp = makeString(["%s", "dLp"], SEP)
123123
124124 let keyDLpRefreshedHeight = makeString(["%s", "dLpRefreshedHeight"], SEP)
125125
126126 let keyDLpRefreshDelay = makeString(["%s", "refreshDLpDelay"], SEP)
127127
128128 let dLpRefreshDelayDefault = 30
129129
130130 let dLpRefreshDelay = valueOrElse(getInteger(this, keyDLpRefreshDelay), dLpRefreshDelayDefault)
131131
132132 func fcfg () = "%s__factoryConfig"
133133
134134
135135 func mtpk () = "%s%s__matcher__publicKey"
136136
137137
138138 func pc (iAmtAs,iPrAs) = (((("%d%d%s__" + iAmtAs) + "__") + iPrAs) + "__config")
139139
140140
141141 func mba (bAStr) = ("%s%s%s__mappings__baseAsset2internalId__" + bAStr)
142142
143143
144144 func aps () = "%s__shutdown"
145145
146146
147147 func keyAllowedLpStableScriptHash () = "%s__allowedLpStableScriptHash"
148148
149149
150150 func keyFeeCollectorAddress () = "%s__feeCollectorAddress"
151151
152152
153153 func toe (orV,sendrV,matchV) = throw(((((("Failed: ordValid=" + toString(orV)) + " sndrValid=") + toString(sendrV)) + " mtchrValid=") + toString(matchV)))
154154
155155
156156 func str (val) = match val {
157157 case valStr: String =>
158158 valStr
159159 case _ =>
160160 throw("fail cast to String")
161161 }
162162
163163
164164 func strf (addr,key) = valueOrErrorMessage(getString(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
165165
166166
167167 func intf (addr,key) = valueOrErrorMessage(getInteger(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
168168
169169
170170 func throwErr (msg) = throw(makeString(["lp_stable.ride:", msg], " "))
171171
172172
173173 func fmtErr (msg) = makeString(["lp_stable.ride:", msg], " ")
174174
175175
176176 let fca = addressFromStringValue(strf(this, fc()))
177177
178178 let A = strf(this, amp())
179179
180180 func igs () = valueOrElse(getBoolean(fca, aps()), false)
181181
182182
183183 func mp () = fromBase58String(strf(fca, mtpk()))
184184
185185
186186 let feeCollectorAddress = addressFromStringValue(strf(fca, keyFeeCollectorAddress()))
187187
188188 func gpc () = {
189189 let amtAs = strf(this, aa())
190190 let priceAs = strf(this, pa())
191191 let iPriceAs = intf(fca, mba(priceAs))
192192 let iAmtAs = intf(fca, mba(amtAs))
193193 split(strf(fca, pc(toString(iAmtAs), toString(iPriceAs))), SEP)
194194 }
195195
196196
197197 func parseAssetId (input) = if ((input == wavesString))
198198 then unit
199199 else fromBase58String(input)
200200
201201
202202 func assetIdToString (input) = if ((input == unit))
203203 then wavesString
204204 else toBase58String(value(input))
205205
206206
207207 func parsePoolConfig (poolConfig) = $Tuple7(addressFromStringValue(poolConfig[idxPoolAddress]), parseIntValue(poolConfig[idxPoolSt]), fromBase58String(poolConfig[idxLPAsId]), parseAssetId(poolConfig[idxAmAsId]), parseAssetId(poolConfig[idxPrAsId]), parseIntValue(poolConfig[idxAmtAsDcm]), parseIntValue(poolConfig[idxPriceAsDcm]))
208208
209209
210210 let poolConfigParsed = parsePoolConfig(gpc())
211211
212212 let $t072087394 = poolConfigParsed
213213
214214 let cfgPoolAddress = $t072087394._1
215215
216216 let cfgPoolStatus = $t072087394._2
217217
218218 let cfgLpAssetId = $t072087394._3
219219
220220 let cfgAmountAssetId = $t072087394._4
221221
222222 let cfgPriceAssetId = $t072087394._5
223223
224224 let cfgAmountAssetDecimals = $t072087394._6
225225
226226 let cfgPriceAssetDecimals = $t072087394._7
227227
228228 func gfc () = split(strf(fca, fcfg()), SEP)
229229
230230
231231 let factoryConfig = gfc()
232232
233233 let stakingContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactStakCntr]), "Invalid staking contract address")
234234
235235 let slipageContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactSlippCntr]), "Invalid slipage contract address")
236236
237237 let gwxContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactGwxRewCntr]), "Invalid gwx contract address")
238238
239239 let restContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactoryRestCntr]), "Invalid gwx contract address")
240240
241241 func dataPutActionInfo (inAmtAssetAmt,inPriceAssetAmt,outLpAmt,price,slipByUser,slippageReal,txHeight,txTimestamp,slipageAmAmt,slipagePrAmt) = makeString(["%d%d%d%d%d%d%d%d%d%d", toString(inAmtAssetAmt), toString(inPriceAssetAmt), toString(outLpAmt), toString(price), toString(slipByUser), toString(slippageReal), toString(txHeight), toString(txTimestamp), toString(slipageAmAmt), toString(slipagePrAmt)], SEP)
242242
243243
244244 func dataGetActionInfo (outAmtAssetAmt,outPriceAssetAmt,inLpAmt,price,txHeight,txTimestamp) = makeString(["%d%d%d%d%d%d", toString(outAmtAssetAmt), toString(outPriceAssetAmt), toString(inLpAmt), toString(price), toString(txHeight), toString(txTimestamp)], SEP)
245245
246246
247247 func getAccBalance (assetId) = if ((assetId == "WAVES"))
248248 then wavesBalance(this).available
249249 else assetBalance(this, fromBase58String(assetId))
250250
251251
252252 func cpbi (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
253253
254254
255255 func vad (A1,A2,slippage) = {
256256 let diff = fraction((A1 - A2), scale8BigInt, A2)
257257 let pass = ((slippage - abs(diff)) > zeroBigInt)
258258 if (!(pass))
259259 then throw(("Big slpg: " + toString(diff)))
260260 else $Tuple2(pass, min([A1, A2]))
261261 }
262262
263263
264264 func vd (D1,D0,slpg) = {
265265 let diff = fraction(D0, scale8BigInt, D1)
266266 let fail = (slpg > diff)
267267 if (if (fail)
268268 then true
269269 else (D0 > D1))
270270 then throw(((((((toString(D0) + " ") + toString(D1)) + " ") + toString(diff)) + " ") + toString(slpg)))
271271 else fail
272272 }
273273
274274
275275 func pcp (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
276276 let amtAsAmtX18 = t1(amAmt, amAssetDcm)
277277 let prAsAmtX18 = t1(prAmt, prAssetDcm)
278278 cpbi(prAsAmtX18, amtAsAmtX18)
279279 }
280280
281281
282282 func calcPrices (amAmt,prAmt,lpAmt) = {
283283 let cfg = gpc()
284284 let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
285285 let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
286286 let priceX18 = pcp(amtAsDcm, prAsDcm, amAmt, prAmt)
287287 let amAmtX18 = t1(amAmt, amtAsDcm)
288288 let prAmtX18 = t1(prAmt, prAsDcm)
289289 let lpAmtX18 = t1(lpAmt, scale8)
290290 let lpPrInAmAsX18 = cpbi(amAmtX18, lpAmtX18)
291291 let lpPrInPrAsX18 = cpbi(prAmtX18, lpAmtX18)
292292 [priceX18, lpPrInAmAsX18, lpPrInPrAsX18]
293293 }
294294
295295
296296 func calculatePrices (amAmt,prAmt,lpAmt) = {
297297 let p = calcPrices(amAmt, prAmt, lpAmt)
298298 [f1(p[0], scale8), f1(p[1], scale8), f1(p[2], scale8)]
299299 }
300300
301301
302302 func takeFee (amount) = {
303303 let feeAmount = fraction(amount, fee, scale8)
304304 $Tuple2((amount - feeAmount), feeAmount)
305305 }
306306
307307
308308 func ego (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
309309 let cfg = gpc()
310310 let lpId = cfg[idxLPAsId]
311311 let amId = cfg[idxAmAsId]
312312 let prId = cfg[idxPrAsId]
313313 let amDcm = parseIntValue(cfg[idxAmtAsDcm])
314314 let prDcm = parseIntValue(cfg[idxPriceAsDcm])
315315 let sts = cfg[idxPoolSt]
316316 let lpEmiss = valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "Wrong LP id").quantity
317317 if ((lpId != pmtAssetId))
318318 then throw("Wrong pmt asset")
319319 else {
320320 let amBalance = getAccBalance(amId)
321321 let amBalanceX18 = t1(amBalance, amDcm)
322322 let prBalance = getAccBalance(prId)
323323 let prBalanceX18 = t1(prBalance, prDcm)
324324 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
325325 let curPrice = f1(curPriceX18, scale8)
326326 let pmtLpAmtX18 = t1(pmtLpAmt, scale8)
327327 let lpEmissX18 = t1(lpEmiss, scale8)
328328 let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissX18)
329329 let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissX18)
330330 let outAmAmt = f1(outAmAmtX18, amDcm)
331331 let outPrAmt = f1(outPrAmtX18, prDcm)
332332 let state = if ((txId58 == ""))
333333 then nil
334334 else [ScriptTransfer(userAddress, outAmAmt, if ((amId == "WAVES"))
335335 then unit
336336 else fromBase58String(amId)), ScriptTransfer(userAddress, outPrAmt, if ((prId == "WAVES"))
337337 then unit
338338 else fromBase58String(prId)), StringEntry(gau(toString(userAddress), txId58), dataGetActionInfo(outAmAmt, outPrAmt, pmtLpAmt, curPrice, height, lastBlock.timestamp)), IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice)]
339339 $Tuple10(outAmAmt, outPrAmt, amId, prId, amBalance, prBalance, lpEmiss, curPriceX18, sts, state)
340340 }
341341 }
342342
343343
344344 func epo (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,userAddress,isEval,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
345345 let cfg = gpc()
346346 let lpId = fromBase58String(cfg[idxLPAsId])
347347 let amIdStr = cfg[idxAmAsId]
348348 let prIdStr = cfg[idxPrAsId]
349349 let inAmIdStr = cfg[idxIAmtAsId]
350350 let inPrIdStr = cfg[idxIPriceAsId]
351351 let amtDcm = parseIntValue(cfg[idxAmtAsDcm])
352352 let priceDcm = parseIntValue(cfg[idxPriceAsDcm])
353353 let sts = cfg[idxPoolSt]
354354 let lpEm = valueOrErrorMessage(assetInfo(lpId), "Wr lp as").quantity
355355 let amBalance = if (isEval)
356356 then getAccBalance(amIdStr)
357357 else if (if (isOneAsset)
358358 then (pmtId == amIdStr)
359359 else false)
360360 then (getAccBalance(amIdStr) - pmtAmt)
361361 else if (isOneAsset)
362362 then getAccBalance(amIdStr)
363363 else (getAccBalance(amIdStr) - inAmAmt)
364364 let prBalance = if (isEval)
365365 then getAccBalance(prIdStr)
366366 else if (if (isOneAsset)
367367 then (pmtId == prIdStr)
368368 else false)
369369 then (getAccBalance(prIdStr) - pmtAmt)
370370 else if (isOneAsset)
371371 then getAccBalance(prIdStr)
372372 else (getAccBalance(prIdStr) - inPrAmt)
373373 let inAmAssetAmtX18 = t1(inAmAmt, amtDcm)
374374 let inPrAssetAmtX18 = t1(inPrAmt, priceDcm)
375375 let userPriceX18 = cpbi(inPrAssetAmtX18, inAmAssetAmtX18)
376376 let amBalanceX18 = t1(amBalance, amtDcm)
377377 let prBalanceX18 = t1(prBalance, priceDcm)
378378 let r = if ((lpEm == 0))
379379 then {
380380 let curPriceX18 = zeroBigInt
381381 let slippageX18 = zeroBigInt
382382 let lpAmtX18 = pow((inAmAssetAmtX18 * inPrAssetAmtX18), 0, toBigInt(5), 1, 0, DOWN)
383383 $Tuple5(f1(lpAmtX18, scale8), f1(inAmAssetAmtX18, amtDcm), f1(inPrAssetAmtX18, priceDcm), cpbi((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
384384 }
385385 else {
386386 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
387387 let slippageRealX18 = fraction(abs((curPriceX18 - userPriceX18)), scale18, curPriceX18)
388388 let slippageX18 = t1(slippage, scale8)
389389 if (if (if (validateSlippage)
390390 then (curPriceX18 != zeroBigInt)
391391 else false)
392392 then (slippageRealX18 > slippageX18)
393393 else false)
394394 then throw(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
395395 else {
396396 let lpEmissionX18 = t1(lpEm, scale8)
397397 let prViaAmX18 = fraction(inAmAssetAmtX18, curPriceX18, scale18)
398398 let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, curPriceX18)
399399 let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
400400 then $Tuple2(amViaPrX18, inPrAssetAmtX18)
401401 else $Tuple2(inAmAssetAmtX18, prViaAmX18)
402402 let expAmtAssetAmtX18 = expectedAmts._1
403403 let expPriceAssetAmtX18 = expectedAmts._2
404404 let lpAmtX18 = fraction(lpEmissionX18, expPriceAssetAmtX18, prBalanceX18)
405405 $Tuple5(f1(lpAmtX18, scale8), f1(expAmtAssetAmtX18, amtDcm), f1(expPriceAssetAmtX18, priceDcm), curPriceX18, slippageX18)
406406 }
407407 }
408408 let calcLpAmt = r._1
409409 let calcAmAssetPmt = r._2
410410 let calcPrAssetPmt = r._3
411411 let curPrice = f1(r._4, scale8)
412412 let slippageCalc = f1(r._5, scale8)
413413 if ((0 >= calcLpAmt))
414414 then throw("LP <= 0")
415415 else {
416416 let emitLpAmt = if (!(emitLp))
417417 then 0
418418 else calcLpAmt
419419 let amDiff = (inAmAmt - calcAmAssetPmt)
420420 let prDiff = (inPrAmt - calcPrAssetPmt)
421421 let $t01782518170 = if (if (isOneAsset)
422422 then (pmtId == amIdStr)
423423 else false)
424424 then $Tuple2(pmtAmt, 0)
425425 else if (if (isOneAsset)
426426 then (pmtId == prIdStr)
427427 else false)
428428 then $Tuple2(0, pmtAmt)
429429 else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
430430 let writeAmAmt = $t01782518170._1
431431 let writePrAmt = $t01782518170._2
432432 let commonState = [IntegerEntry(pl(), curPrice), IntegerEntry(ph(height, lastBlock.timestamp), curPrice), StringEntry(pau(userAddress, txId58), dataPutActionInfo(writeAmAmt, writePrAmt, emitLpAmt, curPrice, slippage, slippageCalc, height, lastBlock.timestamp, amDiff, prDiff))]
433433 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
434434 }
435435 }
436436
437437
438438 func calcDLp (amountBalance,priceBalance,lpEmission) = {
439439 let updatedDLp = fraction((amountBalance * priceBalance), scale18, lpEmission)
440440 updatedDLp
441441 }
442442
443443
444444 func refreshDLpInternal (amountAssetBalanceDelta,priceAssetBalanceDelta,lpAssetEmissionDelta) = {
445445 let amountAssetBalance = (getAccBalance(assetIdToString(cfgAmountAssetId)) + amountAssetBalanceDelta)
446446 let priceAssetBalance = (getAccBalance(assetIdToString(cfgPriceAssetId)) + priceAssetBalanceDelta)
447447 let lpAssetEmission = (value(assetInfo(cfgLpAssetId)).quantity + lpAssetEmissionDelta)
448448 let updatedDLp = calcDLp(toBigInt(amountAssetBalance), toBigInt(priceAssetBalance), toBigInt(lpAssetEmission))
449449 let actions = [IntegerEntry(keyDLpRefreshedHeight, height), StringEntry(keyDLp, toString(updatedDLp))]
450450 $Tuple2(actions, updatedDLp)
451451 }
452452
453453
454454 func moa (order) = {
455- let cfg = gpc()
456- let amtAsId = cfg[idxAmAsId]
457- let prAsId = cfg[idxPrAsId]
458- let sts = parseIntValue(cfg[idxPoolSt])
459- let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
460- let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
461- let accAmtAsBalance = getAccBalance(amtAsId)
462- let accPrAsBalance = getAccBalance(prAsId)
463- let curPriceX18 = if ((order.orderType == Buy))
464- then pcp(amtAsDcm, prAsDcm, (accAmtAsBalance + order.amount), accPrAsBalance)
465- else pcp(amtAsDcm, prAsDcm, (accAmtAsBalance - order.amount), accPrAsBalance)
466- let curPrice = f1(curPriceX18, scale8)
455+ let amountAssetAmount = order.amount
456+ let priceAssetAmount = fraction(order.amount, order.price, scale8)
457+ let $t02011920331 = if ((order.orderType == Buy))
458+ then $Tuple2(amountAssetAmount, -(priceAssetAmount))
459+ else $Tuple2(-(amountAssetAmount), priceAssetAmount)
460+ let amountAssetBalanceDelta = $t02011920331._1
461+ let priceAssetBalanceDelta = $t02011920331._2
467462 if (if (if (igs())
468463 then true
469- else (sts == PoolMatcherDis))
464+ else (cfgPoolStatus == PoolMatcherDis))
470465 then true
471- else (sts == PoolShutdown))
466+ else (cfgPoolStatus == PoolShutdown))
472467 then throw("Admin blocked")
473- else {
474- let orAmtAsset = order.assetPair.amountAsset
475- let orAmtAsStr = if ((orAmtAsset == unit))
476- then "WAVES"
477- else toBase58String(value(orAmtAsset))
478- let orPrAsset = order.assetPair.priceAsset
479- let orPrAsStr = if ((orPrAsset == unit))
480- then "WAVES"
481- else toBase58String(value(orPrAsset))
482- if (if ((orAmtAsStr != amtAsId))
483- then true
484- else (orPrAsStr != prAsId))
485- then throw("Wr assets")
486- else {
487- let orderPrice = order.price
488- let priceDcm = fraction(scale8, prAsDcm, amtAsDcm)
489- let castOrderPrice = ts(orderPrice, scale8, priceDcm)
490- let isOrderPriceValid = if ((order.orderType == Buy))
491- then (curPrice >= castOrderPrice)
492- else (castOrderPrice >= curPrice)
493- true
494- }
495- }
468+ else if (if ((order.assetPair.amountAsset != cfgAmountAssetId))
469+ then true
470+ else (order.assetPair.priceAsset != cfgPriceAssetId))
471+ then throw("Wr assets")
472+ else {
473+ let dLp = valueOrErrorMessage(parseBigInt(valueOrErrorMessage(getString(this, keyDLp), fmtErr("dLp is required"))), fmtErr("invalid dLp"))
474+ let $t02075820858 = refreshDLpInternal(amountAssetBalanceDelta, priceAssetBalanceDelta, 0)
475+ let unusedActions = $t02075820858._1
476+ let dLpNew = $t02075820858._2
477+ let isOrderValid = (dLpNew > dLp)
478+ isOrderValid
479+ }
496480 }
497481
498482
499483 func cg (i) = if ((size(i.payments) != 1))
500484 then throw("1 pmnt exp")
501485 else {
502486 let pmt = value(i.payments[0])
503487 let pmtAssetId = value(pmt.assetId)
504488 let pmtAmt = pmt.amount
505489 let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
506490 let outAmAmt = r._1
507491 let outPrAmt = r._2
508492 let sts = parseIntValue(r._9)
509493 let state = r._10
510494 if (if (igs())
511495 then true
512496 else (sts == PoolShutdown))
513497 then throw(("Admin blocked: " + toString(sts)))
514498 else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state)
515499 }
516500
517501
518502 func cp (caller,txId,amAsPmt,prAsPmt,slippage,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
519503 let r = epo(txId, slippage, value(amAsPmt).amount, value(amAsPmt).assetId, value(prAsPmt).amount, value(prAsPmt).assetId, caller, (txId == ""), emitLp, isOneAsset, validateSlippage, pmtAmt, pmtId)
520504 let sts = parseIntValue(r._8)
521505 if (if (if (igs())
522506 then true
523507 else (sts == PoolPutDis))
524508 then true
525509 else (sts == PoolShutdown))
526510 then throw(("Blocked:" + toString(sts)))
527511 else r
528512 }
529513
530514
531515 func getD (xp) = {
532516 let n = big2
533517 let xp0 = xp[0]
534518 let xp1 = xp[1]
535519 let aPrecision = parseBigIntValue(Amult)
536520 let a = (parseBigIntValue(A) * aPrecision)
537521 let s = (xp0 + xp1)
538522 if ((s == big0))
539523 then big0
540524 else {
541525 let ann = (a * n)
542526 let xp0_xp1_n_n = (((xp0 * xp1) * n) * n)
543527 let ann_s_aPrecision = ((ann * s) / aPrecision)
544528 let ann_aPrecision = (ann - aPrecision)
545529 let n1 = (n + big1)
546530 func calc (acc,cur) = {
547- let $t02363623656 = acc
548- let d = $t02363623656._1
549- let found = $t02363623656._2
531+ let $t02301123031 = acc
532+ let d = $t02301123031._1
533+ let found = $t02301123031._2
550534 if ((found != unit))
551535 then acc
552536 else {
553537 let dp = (((d * d) * d) / xp0_xp1_n_n)
554538 let dNext = (((ann_s_aPrecision + (dp * n)) * d) / (((ann_aPrecision * d) / aPrecision) + (n1 * dp)))
555539 let dDiff = absBigInt((dNext - value(d)))
556540 if ((big1 >= dDiff))
557541 then $Tuple2(dNext, cur)
558542 else $Tuple2(dNext, unit)
559543 }
560544 }
561545
562546 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
563- let $t02407724124 = {
547+ let $t02345223499 = {
564548 let $l = arr
565549 let $s = size($l)
566550 let $acc0 = $Tuple2(s, unit)
567551 func $f0_1 ($a,$i) = if (($i >= $s))
568552 then $a
569553 else calc($a, $l[$i])
570554
571555 func $f0_2 ($a,$i) = if (($i >= $s))
572556 then $a
573557 else throw("List size exceeds 15")
574558
575559 $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)
576560 }
577- let d = $t02407724124._1
578- let found = $t02407724124._2
561+ let d = $t02345223499._1
562+ let found = $t02345223499._2
579563 if ((found != unit))
580564 then d
581565 else throw(("D calculation error, D = " + toString(d)))
582566 }
583567 }
584568
585569
586570 func getYD (xp,i,D) = {
587571 let n = big2
588572 let x = xp[if ((i == 0))
589573 then 1
590574 else 0]
591575 let aPrecision = parseBigIntValue(Amult)
592576 let a = (parseBigIntValue(A) * aPrecision)
593577 let s = x
594578 let ann = (a * n)
595579 let c = (((((D * D) / (x * n)) * D) * aPrecision) / (ann * n))
596580 let b = ((s + ((D * aPrecision) / ann)) - D)
597581 func calc (acc,cur) = {
598- let $t02462424644 = acc
599- let y = $t02462424644._1
600- let found = $t02462424644._2
582+ let $t02399924019 = acc
583+ let y = $t02399924019._1
584+ let found = $t02399924019._2
601585 if ((found != unit))
602586 then acc
603587 else {
604588 let yNext = (((y * y) + c) / ((big2 * y) + b))
605589 let yDiff = absBigInt((yNext - value(y)))
606590 if ((big1 >= yDiff))
607591 then $Tuple2(yNext, cur)
608592 else $Tuple2(yNext, unit)
609593 }
610594 }
611595
612596 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
613- let $t02495124998 = {
597+ let $t02432624373 = {
614598 let $l = arr
615599 let $s = size($l)
616600 let $acc0 = $Tuple2(D, unit)
617601 func $f0_1 ($a,$i) = if (($i >= $s))
618602 then $a
619603 else calc($a, $l[$i])
620604
621605 func $f0_2 ($a,$i) = if (($i >= $s))
622606 then $a
623607 else throw("List size exceeds 15")
624608
625609 $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)
626610 }
627- let y = $t02495124998._1
628- let found = $t02495124998._2
611+ let y = $t02432624373._1
612+ let found = $t02432624373._2
629613 if ((found != unit))
630614 then y
631615 else throw(("Y calculation error, Y = " + toString(y)))
632616 }
633617
634618
635619 func calcPutOneTkn (pmtAmtRaw,pmtAssetId,userAddress,txId,withTakeFee) = {
636620 let poolConfig = gpc()
637621 let amId = poolConfig[idxAmAsId]
638622 let prId = poolConfig[idxPrAsId]
639623 let lpId = poolConfig[idxLPAsId]
640624 let amtDcm = parseIntValue(poolConfig[idxAmtAsDcm])
641625 let priceDcm = parseIntValue(poolConfig[idxPriceAsDcm])
642626 let lpAssetEmission = toBigInt(valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "invalid lp asset").quantity)
643627 let chechEmission = if ((lpAssetEmission > big0))
644628 then true
645629 else throw("initial deposit requires all coins")
646630 if ((chechEmission == chechEmission))
647631 then {
648632 let amBalance = getAccBalance(amId)
649633 let prBalance = getAccBalance(prId)
650- let $t02578126243 = if ((txId == ""))
634+ let $t02515625618 = if ((txId == ""))
651635 then $Tuple2(amBalance, prBalance)
652636 else if ((pmtAssetId == amId))
653637 then if ((pmtAmtRaw > amBalance))
654638 then throw("invalid payment amount")
655639 else $Tuple2((amBalance - pmtAmtRaw), prBalance)
656640 else if ((pmtAssetId == prId))
657641 then if ((pmtAmtRaw > prBalance))
658642 then throw("invalid payment amount")
659643 else $Tuple2(amBalance, (prBalance - pmtAmtRaw))
660644 else throw("wrong pmtAssetId")
661- let amBalanceOld = $t02578126243._1
662- let prBalanceOld = $t02578126243._2
663- let $t02624926425 = if ((pmtAssetId == amId))
645+ let amBalanceOld = $t02515625618._1
646+ let prBalanceOld = $t02515625618._2
647+ let $t02562425800 = if ((pmtAssetId == amId))
664648 then $Tuple2(pmtAmtRaw, 0)
665649 else if ((pmtAssetId == prId))
666650 then $Tuple2(0, pmtAmtRaw)
667651 else throw("invalid payment")
668- let amAmountRaw = $t02624926425._1
669- let prAmountRaw = $t02624926425._2
670- let $t02642926668 = if (withTakeFee)
652+ let amAmountRaw = $t02562425800._1
653+ let prAmountRaw = $t02562425800._2
654+ let $t02580426043 = if (withTakeFee)
671655 then $Tuple3(takeFee(amAmountRaw)._1, takeFee(prAmountRaw)._1, takeFee(pmtAmtRaw)._2)
672656 else $Tuple3(amAmountRaw, prAmountRaw, 0)
673- let amAmount = $t02642926668._1
674- let prAmount = $t02642926668._2
675- let feeAmount = $t02642926668._3
657+ let amAmount = $t02580426043._1
658+ let prAmount = $t02580426043._2
659+ let feeAmount = $t02580426043._3
676660 let amBalanceNew = (amBalanceOld + amAmount)
677661 let prBalanceNew = (prBalanceOld + prAmount)
678662 let D0 = getD([toBigInt(amBalanceOld), toBigInt(prBalanceOld)])
679663 let D1 = getD([toBigInt(amBalanceNew), toBigInt(prBalanceNew)])
680664 let checkD = if ((D1 > D0))
681665 then true
682666 else throw()
683667 if ((checkD == checkD))
684668 then {
685669 let lpAmount = fraction(lpAssetEmission, (D1 - D0), D0)
686670 let curPrice = f1(cpbi(t1(prBalanceNew, priceDcm), t1(amBalanceNew, amtDcm)), scale8)
687671 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))]
688672 let poolProportion = fraction(prBalanceOld, scale8, amBalanceOld)
689673 let amountAssetPart = fraction(pmtAmtRaw, scale8, (poolProportion + scale8))
690674 let priceAssetPart = (pmtAmtRaw - amountAssetPart)
691675 let lpAmtBoth = fraction(lpAssetEmission, toBigInt(priceAssetPart), toBigInt(prBalanceOld))
692676 let bonus = toInt(fraction((lpAmount - lpAmtBoth), scale8BigInt, lpAmtBoth))
693677 $Tuple4(toInt(lpAmount), commonState, feeAmount, bonus)
694678 }
695679 else throw("Strict value is not equal to itself.")
696680 }
697681 else throw("Strict value is not equal to itself.")
698682 }
699683
700684
701685 func getOneTknV2Internal (outAssetId,minOutAmount,payments,caller,originCaller,transactionId) = {
702686 let poolConfig = gpc()
703687 let lpId = poolConfig[idxLPAsId]
704688 let amId = poolConfig[idxAmAsId]
705689 let prId = poolConfig[idxPrAsId]
706690 let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
707691 let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
708692 let poolStatus = poolConfig[idxPoolSt]
709693 let userAddress = if ((caller == restContract))
710694 then originCaller
711695 else caller
712696 let pmt = value(payments[0])
713697 let pmtAssetId = value(pmt.assetId)
714698 let pmtAmt = pmt.amount
715699 let txId58 = toBase58String(transactionId)
716700 if ((lpId != toBase58String(pmtAssetId)))
717701 then throw("Wrong LP")
718702 else {
719703 let amBalance = getAccBalance(amId)
720704 let prBalance = getAccBalance(prId)
721- let $t02867028781 = {
705+ let $t02804528156 = {
722706 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)
723707 if ($isInstanceOf(@, "(Int, Int)"))
724708 then @
725709 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
726710 }
727- if (($t02867028781 == $t02867028781))
711+ if (($t02804528156 == $t02804528156))
728712 then {
729- let feeAmount = $t02867028781._2
730- let totalGet = $t02867028781._1
713+ let feeAmount = $t02804528156._2
714+ let totalGet = $t02804528156._1
731715 let totalAmount = if (if ((minOutAmount > 0))
732716 then (minOutAmount > totalGet)
733717 else false)
734718 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
735719 else totalGet
736- let $t02897129278 = if ((outAssetId == amId))
720+ let $t02834628653 = if ((outAssetId == amId))
737721 then $Tuple4(totalAmount, 0, ((amBalance - totalAmount) - feeAmount), prBalance)
738722 else if ((outAssetId == prId))
739723 then $Tuple4(0, totalAmount, amBalance, ((prBalance - totalAmount) - feeAmount))
740724 else throw("invalid out asset id")
741- let outAm = $t02897129278._1
742- let outPr = $t02897129278._2
743- let amBalanceNew = $t02897129278._3
744- let prBalanceNew = $t02897129278._4
725+ let outAm = $t02834628653._1
726+ let outPr = $t02834628653._2
727+ let amBalanceNew = $t02834628653._3
728+ let prBalanceNew = $t02834628653._4
745729 let curPrX18 = cpbi(t1(prBalanceNew, prDecimals), t1(amBalanceNew, amDecimals))
746730 let curPr = f1(curPrX18, scale8)
747731 let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
748732 then unit
749733 else fromBase58String(outAssetId)
750734 let sendFeeToMatcher = if ((feeAmount > 0))
751735 then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetIdOrWaves)]
752736 else nil
753737 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)
754738 if ((state == state))
755739 then {
756740 let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
757741 if ((burn == burn))
758742 then $Tuple2(state, totalAmount)
759743 else throw("Strict value is not equal to itself.")
760744 }
761745 else throw("Strict value is not equal to itself.")
762746 }
763747 else throw("Strict value is not equal to itself.")
764748 }
765749 }
766750
767751
768752 func m () = match getString(mpk()) {
769753 case s: String =>
770754 fromBase58String(s)
771755 case _: Unit =>
772756 unit
773757 case _ =>
774758 throw("Match error")
775759 }
776760
777761
778762 func pm () = match getString(pmpk()) {
779763 case s: String =>
780764 fromBase58String(s)
781765 case _: Unit =>
782766 unit
783767 case _ =>
784768 throw("Match error")
785769 }
786770
787771
788772 let pd = throw("Permission denied")
789773
790774 func isManager (i) = match m() {
791775 case pk: ByteVector =>
792776 (i.callerPublicKey == pk)
793777 case _: Unit =>
794778 (i.caller == this)
795779 case _ =>
796780 throw("Match error")
797781 }
798782
799783
800784 func mm (i) = match m() {
801785 case pk: ByteVector =>
802786 if ((i.callerPublicKey == pk))
803787 then true
804788 else pd
805789 case _: Unit =>
806790 if ((i.caller == this))
807791 then true
808792 else pd
809793 case _ =>
810794 throw("Match error")
811795 }
812796
813797
814798 @Callable(i)
815799 func constructor (fc) = {
816800 let c = mm(i)
817801 if ((c == c))
818802 then [StringEntry(fc(), fc)]
819803 else throw("Strict value is not equal to itself.")
820804 }
821805
822806
823807
824808 @Callable(i)
825809 func setManager (pendingManagerPublicKey) = {
826810 let c = mm(i)
827811 if ((c == c))
828812 then {
829813 let cm = fromBase58String(pendingManagerPublicKey)
830814 if ((cm == cm))
831815 then [StringEntry(pmpk(), pendingManagerPublicKey)]
832816 else throw("Strict value is not equal to itself.")
833817 }
834818 else throw("Strict value is not equal to itself.")
835819 }
836820
837821
838822
839823 @Callable(i)
840824 func confirmManager () = {
841825 let p = pm()
842826 let hpm = if (isDefined(p))
843827 then true
844828 else throw("No pending manager")
845829 if ((hpm == hpm))
846830 then {
847831 let cpm = if ((i.callerPublicKey == value(p)))
848832 then true
849833 else throw("You are not pending manager")
850834 if ((cpm == cpm))
851835 then [StringEntry(mpk(), toBase58String(value(p))), DeleteEntry(pmpk())]
852836 else throw("Strict value is not equal to itself.")
853837 }
854838 else throw("Strict value is not equal to itself.")
855839 }
856840
857841
858842
859843 @Callable(i)
860844 func put (slip,autoStake) = {
861845 let factCfg = gfc()
862846 let stakingCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactStakCntr]), "Wr st addr")
863847 let slipCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactSlippCntr]), "Wr sl addr")
864848 if ((0 > slip))
865849 then throw("Wrong slippage")
866850 else if ((size(i.payments) != 2))
867851 then throw("2 pmnts expd")
868852 else {
869853 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, "")
870854 let emitLpAmt = e._2
871855 let lpAssetId = e._7
872856 let state = e._9
873857 let amDiff = e._10
874858 let prDiff = e._11
875859 let amId = e._12
876860 let prId = e._13
877861 let r = invoke(fca, "emit", [emitLpAmt], nil)
878862 if ((r == r))
879863 then {
880864 let el = match r {
881865 case legacy: Address =>
882866 invoke(legacy, "emit", [emitLpAmt], nil)
883867 case _ =>
884868 unit
885869 }
886870 if ((el == el))
887871 then {
888872 let sa = if ((amDiff > 0))
889873 then invoke(slipCntr, "put", nil, [AttachedPayment(amId, amDiff)])
890874 else nil
891875 if ((sa == sa))
892876 then {
893877 let sp = if ((prDiff > 0))
894878 then invoke(slipCntr, "put", nil, [AttachedPayment(prId, prDiff)])
895879 else nil
896880 if ((sp == sp))
897881 then {
898882 let lpTrnsfr = if (autoStake)
899883 then {
900884 let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
901885 if ((ss == ss))
902886 then nil
903887 else throw("Strict value is not equal to itself.")
904888 }
905889 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
906890 (state ++ lpTrnsfr)
907891 }
908892 else throw("Strict value is not equal to itself.")
909893 }
910894 else throw("Strict value is not equal to itself.")
911895 }
912896 else throw("Strict value is not equal to itself.")
913897 }
914898 else throw("Strict value is not equal to itself.")
915899 }
916900 }
917901
918902
919903
920904 @Callable(i)
921905 func putOneTknV2 (minOutAmount,autoStake) = {
922906 let isPoolOneTokenOperationsDisabled = {
923907 let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
924908 if ($isInstanceOf(@, "Boolean"))
925909 then @
926910 else throw(($getType(@) + " couldn't be cast to Boolean"))
927911 }
928912 let isPutDisabled = if (if (if (igs())
929913 then true
930914 else (cfgPoolStatus == PoolPutDis))
931915 then true
932916 else (cfgPoolStatus == PoolShutdown))
933917 then true
934918 else isPoolOneTokenOperationsDisabled
935919 let checks = [if (if (!(isPutDisabled))
936920 then true
937921 else isManager(i))
938922 then true
939923 else throwErr("put operation is blocked by admin"), if ((size(i.payments) == 1))
940924 then true
941925 else throwErr("exactly 1 payment are expected")]
942926 if ((checks == checks))
943927 then {
944928 let poolConfig = gpc()
945929 let amId = poolConfig[idxAmAsId]
946930 let prId = poolConfig[idxPrAsId]
947931 let lpId = fromBase58String(poolConfig[idxLPAsId])
948932 let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
949933 let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
950934 let userAddress = if ((i.caller == this))
951935 then i.originCaller
952936 else i.caller
953937 let pmt = value(i.payments[0])
954938 let pmtAssetId = toBase58String(value(pmt.assetId))
955939 let pmtAmt = pmt.amount
956- let $t03464034798 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId), true)
957- if (($t03464034798 == $t03464034798))
940+ let $t03401534173 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId), true)
941+ if (($t03401534173 == $t03401534173))
958942 then {
959- let feeAmount = $t03464034798._3
960- let state = $t03464034798._2
961- let estimLP = $t03464034798._1
943+ let feeAmount = $t03401534173._3
944+ let state = $t03401534173._2
945+ let estimLP = $t03401534173._1
962946 let emitLpAmt = if (if ((minOutAmount > 0))
963947 then (minOutAmount > estimLP)
964948 else false)
965949 then throwErr(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
966950 else estimLP
967951 let e = invoke(fca, "emit", [emitLpAmt], nil)
968952 if ((e == e))
969953 then {
970954 let el = match e {
971955 case legacy: Address =>
972956 invoke(legacy, "emit", [emitLpAmt], nil)
973957 case _ =>
974958 unit
975959 }
976960 if ((el == el))
977961 then {
978962 let lpTrnsfr = if (autoStake)
979963 then {
980964 let ss = invoke(stakingContract, "stake", nil, [AttachedPayment(lpId, emitLpAmt)])
981965 if ((ss == ss))
982966 then nil
983967 else throw("Strict value is not equal to itself.")
984968 }
985969 else [ScriptTransfer(i.caller, emitLpAmt, lpId)]
986970 let sendFeeToMatcher = if ((feeAmount > 0))
987971 then [ScriptTransfer(feeCollectorAddress, feeAmount, fromBase58String(pmtAssetId))]
988972 else nil
989973 $Tuple2(((state ++ lpTrnsfr) ++ sendFeeToMatcher), emitLpAmt)
990974 }
991975 else throw("Strict value is not equal to itself.")
992976 }
993977 else throw("Strict value is not equal to itself.")
994978 }
995979 else throw("Strict value is not equal to itself.")
996980 }
997981 else throw("Strict value is not equal to itself.")
998982 }
999983
1000984
1001985
1002986 @Callable(i)
1003987 func putForFree (maxSlpg) = if ((0 > maxSlpg))
1004988 then throw("Wrong slpg")
1005989 else if ((size(i.payments) != 2))
1006990 then throw("2 pmnts expd")
1007991 else {
1008992 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, "")
1009993 estPut._9
1010994 }
1011995
1012996
1013997
1014998 @Callable(i)
1015999 func get () = {
10161000 let r = cg(i)
10171001 let outAmtAmt = r._1
10181002 let outPrAmt = r._2
10191003 let pmtAmt = r._3
10201004 let pmtAssetId = r._4
10211005 let state = r._5
10221006 let b = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
10231007 if ((b == b))
10241008 then state
10251009 else throw("Strict value is not equal to itself.")
10261010 }
10271011
10281012
10291013
10301014 @Callable(i)
10311015 func getOneTknV2 (outAssetId,minOutAmount) = {
10321016 let isPoolOneTokenOperationsDisabled = {
10331017 let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
10341018 if ($isInstanceOf(@, "Boolean"))
10351019 then @
10361020 else throw(($getType(@) + " couldn't be cast to Boolean"))
10371021 }
10381022 let isGetDisabled = if (if (igs())
10391023 then true
10401024 else (cfgPoolStatus == PoolShutdown))
10411025 then true
10421026 else isPoolOneTokenOperationsDisabled
10431027 let checks = [if (if (!(isGetDisabled))
10441028 then true
10451029 else isManager(i))
10461030 then true
10471031 else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 1))
10481032 then true
10491033 else throwErr("exactly 1 payment are expected")]
10501034 if ((checks == checks))
10511035 then {
1052- let $t03742037575 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1053- let state = $t03742037575._1
1054- let totalAmount = $t03742037575._2
1036+ let $t03679536950 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
1037+ let state = $t03679536950._1
1038+ let totalAmount = $t03679536950._2
10551039 $Tuple2(state, totalAmount)
10561040 }
10571041 else throw("Strict value is not equal to itself.")
10581042 }
10591043
10601044
10611045
10621046 @Callable(i)
1063-func refreshDlp () = nil
1047+func refreshDLp () = {
1048+ let lastRefreshedBlockHeight = valueOrElse(getInteger(keyDLpRefreshedHeight), 0)
1049+ let checkLastRefreshedBlockHeight = if (((height - lastRefreshedBlockHeight) >= dLpRefreshDelay))
1050+ then unit
1051+ else throwErr(makeString([toString(dLpRefreshDelay), " blocks have not passed since the previous call"], ""))
1052+ if ((checkLastRefreshedBlockHeight == checkLastRefreshedBlockHeight))
1053+ then {
1054+ let $t03734837403 = refreshDLpInternal(0, 0, 0)
1055+ let actions = $t03734837403._1
1056+ let updatedKLp = $t03734837403._2
1057+ $Tuple2(actions, toString(updatedKLp))
1058+ }
1059+ else throw("Strict value is not equal to itself.")
1060+ }
10641061
10651062
10661063
10671064 @Callable(i)
10681065 func getOneTknV2READONLY (outAssetId,lpAssetAmount) = {
10691066 let poolConfig = gpc()
10701067 let amId = poolConfig[idxAmAsId]
10711068 let prId = poolConfig[idxPrAsId]
10721069 let lpId = poolConfig[idxLPAsId]
10731070 let xp = [toBigInt(getAccBalance(amId)), toBigInt(getAccBalance(prId))]
10741071 let lpEmission = toBigInt(valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "invalid lp asset").quantity)
10751072 let D0 = getD(xp)
10761073 let D1 = (D0 - fraction(toBigInt(lpAssetAmount), D0, lpEmission))
10771074 let index = if ((outAssetId == amId))
10781075 then 0
10791076 else if ((outAssetId == prId))
10801077 then 1
10811078 else throw("invalid out asset id")
10821079 let newY = getYD(xp, index, D1)
10831080 let dy = (xp[index] - newY)
10841081 let totalGetRaw = max([0, toInt((dy - big1))])
1085- let $t03841638465 = takeFee(totalGetRaw)
1086- let totalGet = $t03841638465._1
1087- let feeAmount = $t03841638465._2
1082+ let $t03820538254 = takeFee(totalGetRaw)
1083+ let totalGet = $t03820538254._1
1084+ let feeAmount = $t03820538254._2
10881085 $Tuple2(nil, $Tuple2(totalGet, feeAmount))
10891086 }
10901087
10911088
10921089
10931090 @Callable(i)
10941091 func getOneTknV2WithBonusREADONLY (outAssetId,lpAssetAmount) = {
10951092 let poolConfig = gpc()
10961093 let amId = poolConfig[idxAmAsId]
10971094 let prId = poolConfig[idxPrAsId]
10981095 let lpId = poolConfig[idxLPAsId]
10991096 let amBalance = getAccBalance(amId)
11001097 let prBalance = getAccBalance(prId)
1101- let $t03881038925 = {
1098+ let $t03859938714 = {
11021099 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)
11031100 if ($isInstanceOf(@, "(Int, Int)"))
11041101 then @
11051102 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
11061103 }
1107- let totalGet = $t03881038925._1
1108- let feeAmount = $t03881038925._2
1104+ let totalGet = $t03859938714._1
1105+ let feeAmount = $t03859938714._2
11091106 let r = ego("", lpId, lpAssetAmount, this)
11101107 let outAmAmt = r._1
11111108 let outPrAmt = r._2
11121109 let sumOfGetAssets = (outAmAmt + outPrAmt)
11131110 let bonus = if ((sumOfGetAssets == 0))
11141111 then if ((totalGet == 0))
11151112 then 0
11161113 else throw("bonus calculation error")
11171114 else fraction((totalGet - sumOfGetAssets), scale8, sumOfGetAssets)
11181115 $Tuple2(nil, $Tuple3(totalGet, feeAmount, bonus))
11191116 }
11201117
11211118
11221119
11231120 @Callable(i)
11241121 func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = {
11251122 let r = cg(i)
11261123 let outAmAmt = r._1
11271124 let outPrAmt = r._2
11281125 let pmtAmt = r._3
11291126 let pmtAssetId = r._4
11301127 let state = r._5
11311128 if ((noLessThenAmtAsset > outAmAmt))
11321129 then throw(((("Failed: " + toString(outAmAmt)) + " < ") + toString(noLessThenAmtAsset)))
11331130 else if ((noLessThenPriceAsset > outPrAmt))
11341131 then throw(((("Failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset)))
11351132 else {
11361133 let burnLPAssetOnFactory = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
11371134 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
11381135 then state
11391136 else throw("Strict value is not equal to itself.")
11401137 }
11411138 }
11421139
11431140
11441141
11451142 @Callable(i)
11461143 func unstakeAndGet (amount) = {
11471144 let checkPayments = if ((size(i.payments) != 0))
11481145 then throw("No pmnts expd")
11491146 else true
11501147 if ((checkPayments == checkPayments))
11511148 then {
11521149 let cfg = gpc()
11531150 let factoryCfg = gfc()
11541151 let lpAssetId = fromBase58String(cfg[idxLPAsId])
11551152 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
11561153 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), amount], nil)
11571154 if ((unstakeInv == unstakeInv))
11581155 then {
11591156 let r = ego(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
11601157 let sts = parseIntValue(r._9)
11611158 let state = r._10
11621159 let v = if (if (igs())
11631160 then true
11641161 else (sts == PoolShutdown))
11651162 then throw(("Blocked: " + toString(sts)))
11661163 else true
11671164 if ((v == v))
11681165 then {
11691166 let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
11701167 if ((burnA == burnA))
11711168 then state
11721169 else throw("Strict value is not equal to itself.")
11731170 }
11741171 else throw("Strict value is not equal to itself.")
11751172 }
11761173 else throw("Strict value is not equal to itself.")
11771174 }
11781175 else throw("Strict value is not equal to itself.")
11791176 }
11801177
11811178
11821179
11831180 @Callable(i)
11841181 func unstakeAndGetNoLess (unstakeAmount,noLessThenAmountAsset,noLessThenPriceAsset) = {
11851182 let isGetDisabled = if (igs())
11861183 then true
11871184 else (cfgPoolStatus == PoolShutdown)
11881185 let checks = [if (!(isGetDisabled))
11891186 then true
11901187 else throw("get operation is blocked by admin"), if ((size(i.payments) == 0))
11911188 then true
11921189 else throw("no payments are expected")]
11931190 if ((checks == checks))
11941191 then {
11951192 let unstakeInv = invoke(stakingContract, "unstake", [toBase58String(cfgLpAssetId), unstakeAmount], nil)
11961193 if ((unstakeInv == unstakeInv))
11971194 then {
11981195 let res = ego(toBase58String(i.transactionId), toBase58String(cfgLpAssetId), unstakeAmount, i.caller)
11991196 let outAmAmt = res._1
12001197 let outPrAmt = res._2
12011198 let state = res._10
12021199 let checkAmounts = [if ((outAmAmt >= noLessThenAmountAsset))
12031200 then true
12041201 else throw(makeString(["amount asset amount to receive is less than ", toString(noLessThenAmountAsset)], "")), if ((outPrAmt >= noLessThenPriceAsset))
12051202 then true
12061203 else throw(makeString(["price asset amount to receive is less than ", toString(noLessThenPriceAsset)], ""))]
12071204 if ((checkAmounts == checkAmounts))
12081205 then {
12091206 let burnLPAssetOnFactory = invoke(fca, "burn", [unstakeAmount], [AttachedPayment(cfgLpAssetId, unstakeAmount)])
12101207 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
12111208 then state
12121209 else throw("Strict value is not equal to itself.")
12131210 }
12141211 else throw("Strict value is not equal to itself.")
12151212 }
12161213 else throw("Strict value is not equal to itself.")
12171214 }
12181215 else throw("Strict value is not equal to itself.")
12191216 }
12201217
12211218
12221219
12231220 @Callable(i)
12241221 func unstakeAndGetOneTknV2 (unstakeAmount,outAssetId,minOutAmount) = {
12251222 let isPoolOneTokenOperationsDisabled = {
12261223 let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
12271224 if ($isInstanceOf(@, "Boolean"))
12281225 then @
12291226 else throw(($getType(@) + " couldn't be cast to Boolean"))
12301227 }
12311228 let isGetDisabled = if (if (igs())
12321229 then true
12331230 else (cfgPoolStatus == PoolShutdown))
12341231 then true
12351232 else isPoolOneTokenOperationsDisabled
12361233 let checks = [if (if (!(isGetDisabled))
12371234 then true
12381235 else isManager(i))
12391236 then true
12401237 else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 0))
12411238 then true
12421239 else throwErr("no payments are expected")]
12431240 if ((checks == checks))
12441241 then {
12451242 let cfg = gpc()
12461243 let factoryCfg = gfc()
12471244 let lpAssetId = fromBase58String(cfg[idxLPAsId])
12481245 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
12491246 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), unstakeAmount], nil)
12501247 if ((unstakeInv == unstakeInv))
12511248 then {
1252- let $t04276342951 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1253- let state = $t04276342951._1
1254- let totalAmount = $t04276342951._2
1249+ let $t04255242740 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1250+ let state = $t04255242740._1
1251+ let totalAmount = $t04255242740._2
12551252 $Tuple2(state, totalAmount)
12561253 }
12571254 else throw("Strict value is not equal to itself.")
12581255 }
12591256 else throw("Strict value is not equal to itself.")
12601257 }
12611258
12621259
12631260
12641261 @Callable(i)
12651262 func putOneTknV2WithBonusREADONLY (paymentAmountRaw,paymentAssetId) = {
12661263 let poolConfig = gpc()
12671264 let amId = poolConfig[idxAmAsId]
12681265 let prId = poolConfig[idxPrAsId]
12691266 let lpId = poolConfig[idxLPAsId]
1270- let $t04321043313 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1271- let lpAmount = $t04321043313._1
1272- let state = $t04321043313._2
1273- let feeAmount = $t04321043313._3
1274- let bonus = $t04321043313._4
1267+ let $t04299943102 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", true)
1268+ let lpAmount = $t04299943102._1
1269+ let state = $t04299943102._2
1270+ let feeAmount = $t04299943102._3
1271+ let bonus = $t04299943102._4
12751272 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
12761273 }
12771274
12781275
12791276
12801277 @Callable(i)
12811278 func putOneTknV2WithoutTakeFeeREADONLY (paymentAmountRaw,paymentAssetId) = {
12821279 let poolConfig = gpc()
12831280 let amId = poolConfig[idxAmAsId]
12841281 let prId = poolConfig[idxPrAsId]
12851282 let lpId = poolConfig[idxLPAsId]
1286- let $t04359243696 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1287- let lpAmount = $t04359243696._1
1288- let state = $t04359243696._2
1289- let feeAmount = $t04359243696._3
1290- let bonus = $t04359243696._4
1283+ let $t04338143485 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "", false)
1284+ let lpAmount = $t04338143485._1
1285+ let state = $t04338143485._2
1286+ let feeAmount = $t04338143485._3
1287+ let bonus = $t04338143485._4
12911288 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
12921289 }
12931290
12941291
12951292
12961293 @Callable(i)
12971294 func activate (amtAsStr,prAsStr) = if ((toString(i.caller) != toString(fca)))
12981295 then throw("denied")
12991296 else $Tuple2([StringEntry(aa(), amtAsStr), StringEntry(pa(), prAsStr)], "success")
13001297
13011298
13021299
13031300 @Callable(i)
13041301 func setS (k,v) = if ((toString(i.caller) != strf(this, ada())))
13051302 then pd
13061303 else [StringEntry(k, v)]
13071304
13081305
13091306
13101307 @Callable(i)
13111308 func setI (k,v) = if ((toString(i.caller) != strf(this, ada())))
13121309 then pd
13131310 else [IntegerEntry(k, v)]
13141311
13151312
13161313
13171314 @Callable(i)
13181315 func getPoolConfigWrapperREADONLY () = $Tuple2(nil, gpc())
13191316
13201317
13211318
13221319 @Callable(i)
13231320 func getAccBalanceWrapperREADONLY (assetId) = $Tuple2(nil, getAccBalance(assetId))
13241321
13251322
13261323
13271324 @Callable(i)
13281325 func calcPricesWrapperREADONLY (amAmt,prAmt,lpAmt) = {
13291326 let pr = calcPrices(amAmt, prAmt, lpAmt)
13301327 $Tuple2(nil, [toString(pr[0]), toString(pr[1]), toString(pr[2])])
13311328 }
13321329
13331330
13341331
13351332 @Callable(i)
13361333 func fromX18WrapperREADONLY (val,resScaleMult) = $Tuple2(nil, f1(parseBigIntValue(val), resScaleMult))
13371334
13381335
13391336
13401337 @Callable(i)
13411338 func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(t1(origVal, origScaleMult)))
13421339
13431340
13441341
13451342 @Callable(i)
13461343 func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(cpbi(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
13471344
13481345
13491346
13501347 @Callable(i)
13511348 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, ""))
13521349
13531350
13541351
13551352 @Callable(i)
13561353 func estimateGetOperationWrapperREADONLY (txId58,pmtAsId,pmtLpAmt,usrAddr) = {
13571354 let r = ego(txId58, pmtAsId, pmtLpAmt, addressFromStringValue(usrAddr))
13581355 $Tuple2(nil, $Tuple10(r._1, r._2, r._3, r._4, r._5, r._6, r._7, toString(r._8), r._9, r._10))
13591356 }
13601357
13611358
13621359
13631360 @Callable(i)
13641361 func getFeeREADONLY () = $Tuple2(nil, fee)
13651362
13661363
13671364 @Verifier(tx)
13681365 func verify () = {
13691366 let targetPublicKey = match m() {
13701367 case pk: ByteVector =>
13711368 pk
13721369 case _: Unit =>
13731370 tx.senderPublicKey
13741371 case _ =>
13751372 throw("Match error")
13761373 }
13771374 match tx {
13781375 case order: Order =>
13791376 let matcherPub = mp()
13801377 let orderValid = moa(order)
13811378 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
13821379 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
13831380 if (if (if (orderValid)
13841381 then senderValid
13851382 else false)
13861383 then matcherValid
13871384 else false)
13881385 then true
13891386 else toe(orderValid, senderValid, matcherValid)
13901387 case s: SetScriptTransaction =>
13911388 let newHash = blake2b256(value(s.script))
13921389 let allowedHash = fromBase64String(value(getString(fca, keyAllowedLpStableScriptHash())))
13931390 let currentHash = scriptHash(this)
13941391 if (if ((allowedHash == newHash))
13951392 then (currentHash != newHash)
13961393 else false)
13971394 then true
13981395 else sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
13991396 case _ =>
14001397 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
14011398 }
14021399 }
14031400

github/deemru/w8io/873ac7e 
159.61 ms