tx · 7QJzozovA5LhSfuC3h7VxXAbKKFcSaMR8qzAonBsHMFy

3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT:  -0.03000000 Waves

2022.10.26 12:56 [2289237] smart account 3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT > SELF 0.00000000 Waves

{ "type": 13, "id": "7QJzozovA5LhSfuC3h7VxXAbKKFcSaMR8qzAonBsHMFy", "fee": 3000000, "feeAssetId": null, "timestamp": 1666778223792, "version": 1, "sender": "3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT", "senderPublicKey": "D1BL65meykxFZTCuq7jq9HSGLLnWvQamQPUNrguW5w39", "proofs": [ "4ikXuU69i1n9nm5i2PYaQnvRS6bPeNShmZxgsDwGUqvASqQXgy8KmHMefUorwnRv61KXMraGoyoj8t2EcqrMh5yj" ], "script": "base64:BgK0IQgCEgMKAQgSAwoBCBIAEgQKAgEEEgQKAgEEEgMKAQESABIECgIIARIECgIIARIECgIIARIECgIBARIDCgEBEgUKAwEIARIECgIBCBIECgIICBIECgIICBIECgIIARIAEgMKAQgSBQoDAQEBEgQKAggBEgQKAgEBEgQKAggIEgsKCQgBAQIBAggEBBIGCgQICAEIEgAiBnNjYWxlOCIMc2NhbGU4QmlnSW50IgdzY2FsZTE4Igp6ZXJvQmlnSW50IgRiaWcwIgRiaWcxIgRiaWcyIgpzbGlwcGFnZTREIgt3YXZlc1N0cmluZyIFQW11bHQiBURjb252IgNTRVAiBUVNUFRZIgpQb29sQWN0aXZlIgpQb29sUHV0RGlzIg5Qb29sTWF0Y2hlckRpcyIMUG9vbFNodXRkb3duIg5pZHhQb29sQWRkcmVzcyIJaWR4UG9vbFN0IglpZHhMUEFzSWQiCWlkeEFtQXNJZCIJaWR4UHJBc0lkIgtpZHhBbXRBc0RjbSINaWR4UHJpY2VBc0RjbSILaWR4SUFtdEFzSWQiDWlkeElQcmljZUFzSWQiD2lkeEZhY3RTdGFrQ250ciISaWR4RmFjdG9yeVJlc3RDbnRyIhBpZHhGYWN0U2xpcHBDbnRyIhFpZHhGYWN0R3d4UmV3Q250ciIKZmVlRGVmYXVsdCICdDEiB29yaWdWYWwiDW9yaWdTY2FsZU11bHQiAmYxIgN2YWwiD3Jlc3VsdFNjYWxlTXVsdCICdHMiA2FtdCIIcmVzU2NhbGUiCGN1clNjYWxlIgNhYnMiCWFic0JpZ0ludCICZmMiA21wayIEcG1wayICcGwiAnBoIgFoIgF0IgNwYXUiAnVhIgR0eElkIgNnYXUiAmFhIgJwYSIDYW1wIgNhZGEiBmtleUZlZSIDZmVlIgRmY2ZnIgRtdHBrIgJwYyIGaUFtdEFzIgVpUHJBcyIDbWJhIgViQVN0ciIDYXBzIhxrZXlBbGxvd2VkTHBTdGFibGVTY3JpcHRIYXNoIhZrZXlGZWVDb2xsZWN0b3JBZGRyZXNzIgN0b2UiA29yViIGc2VuZHJWIgZtYXRjaFYiA3N0ciIHJG1hdGNoMCIGdmFsU3RyIgRzdHJmIgRhZGRyIgNrZXkiBGludGYiCHRocm93RXJyIgNtc2ciA2ZjYSIBQSIDaWdzIgJtcCITZmVlQ29sbGVjdG9yQWRkcmVzcyIDZ3BjIgVhbXRBcyIHcHJpY2VBcyIIaVByaWNlQXMiDHBhcnNlQXNzZXRJZCIFaW5wdXQiD2Fzc2V0SWRUb1N0cmluZyIPcGFyc2VQb29sQ29uZmlnIgpwb29sQ29uZmlnIhBwb29sQ29uZmlnUGFyc2VkIgskdDA2ODI5NzAxNSIOY2ZnUG9vbEFkZHJlc3MiDWNmZ1Bvb2xTdGF0dXMiDGNmZ0xwQXNzZXRJZCIQY2ZnQW1vdW50QXNzZXRJZCIPY2ZnUHJpY2VBc3NldElkIhZjZmdBbW91bnRBc3NldERlY2ltYWxzIhVjZmdQcmljZUFzc2V0RGVjaW1hbHMiA2dmYyINZmFjdG9yeUNvbmZpZyIPc3Rha2luZ0NvbnRyYWN0Ig9zbGlwYWdlQ29udHJhY3QiC2d3eENvbnRyYWN0IgxyZXN0Q29udHJhY3QiEWRhdGFQdXRBY3Rpb25JbmZvIg1pbkFtdEFzc2V0QW10Ig9pblByaWNlQXNzZXRBbXQiCG91dExwQW10IgVwcmljZSIKc2xpcEJ5VXNlciIMc2xpcHBhZ2VSZWFsIgh0eEhlaWdodCILdHhUaW1lc3RhbXAiDHNsaXBhZ2VBbUFtdCIMc2xpcGFnZVByQW10IhFkYXRhR2V0QWN0aW9uSW5mbyIOb3V0QW10QXNzZXRBbXQiEG91dFByaWNlQXNzZXRBbXQiB2luTHBBbXQiDWdldEFjY0JhbGFuY2UiB2Fzc2V0SWQiBGNwYmkiCHByQW10WDE4IghhbUFtdFgxOCIDdmFkIgJBMSICQTIiCHNsaXBwYWdlIgRkaWZmIgRwYXNzIgJ2ZCICRDEiAkQwIgRzbHBnIgRmYWlsIgNwY3AiCmFtQXNzZXREY20iCnByQXNzZXREY20iBWFtQW10IgVwckFtdCILYW10QXNBbXRYMTgiCnByQXNBbXRYMTgiCmNhbGNQcmljZXMiBWxwQW10IgNjZmciCGFtdEFzRGNtIgdwckFzRGNtIghwcmljZVgxOCIIbHBBbXRYMTgiDWxwUHJJbkFtQXNYMTgiDWxwUHJJblByQXNYMTgiD2NhbGN1bGF0ZVByaWNlcyIBcCIHdGFrZUZlZSIGYW1vdW50IglmZWVBbW91bnQiA2VnbyIGdHhJZDU4IgpwbXRBc3NldElkIghwbXRMcEFtdCILdXNlckFkZHJlc3MiBGxwSWQiBGFtSWQiBHBySWQiBWFtRGNtIgVwckRjbSIDc3RzIgdscEVtaXNzIglhbUJhbGFuY2UiDGFtQmFsYW5jZVgxOCIJcHJCYWxhbmNlIgxwckJhbGFuY2VYMTgiC2N1clByaWNlWDE4IghjdXJQcmljZSILcG10THBBbXRYMTgiCmxwRW1pc3NYMTgiC291dEFtQW10WDE4IgtvdXRQckFtdFgxOCIIb3V0QW1BbXQiCG91dFByQW10IgVzdGF0ZSIDZXBvIgdpbkFtQW10IgZpbkFtSWQiB2luUHJBbXQiBmluUHJJZCIGaXNFdmFsIgZlbWl0THAiCmlzT25lQXNzZXQiEHZhbGlkYXRlU2xpcHBhZ2UiBnBtdEFtdCIFcG10SWQiB2FtSWRTdHIiB3BySWRTdHIiCWluQW1JZFN0ciIJaW5QcklkU3RyIgZhbXREY20iCHByaWNlRGNtIgRscEVtIg9pbkFtQXNzZXRBbXRYMTgiD2luUHJBc3NldEFtdFgxOCIMdXNlclByaWNlWDE4IgFyIgtzbGlwcGFnZVgxOCIPc2xpcHBhZ2VSZWFsWDE4Ig1scEVtaXNzaW9uWDE4IgpwclZpYUFtWDE4IgphbVZpYVByWDE4IgxleHBlY3RlZEFtdHMiEWV4cEFtdEFzc2V0QW10WDE4IhNleHBQcmljZUFzc2V0QW10WDE4IgljYWxjTHBBbXQiDmNhbGNBbUFzc2V0UG10Ig5jYWxjUHJBc3NldFBtdCIMc2xpcHBhZ2VDYWxjIgllbWl0THBBbXQiBmFtRGlmZiIGcHJEaWZmIg0kdDAxNzQ0NjE3NzkxIgp3cml0ZUFtQW10Igp3cml0ZVByQW10Igtjb21tb25TdGF0ZSIDbW9hIgVvcmRlciIHYW10QXNJZCIGcHJBc0lkIg9hY2NBbXRBc0JhbGFuY2UiDmFjY1ByQXNCYWxhbmNlIgpvckFtdEFzc2V0IgpvckFtdEFzU3RyIglvclByQXNzZXQiCW9yUHJBc1N0ciIKb3JkZXJQcmljZSIOY2FzdE9yZGVyUHJpY2UiEWlzT3JkZXJQcmljZVZhbGlkIgJjZyIBaSIDcG10IgJjcCIGY2FsbGVyIgdhbUFzUG10IgdwckFzUG10IgRnZXREIgJ4cCIBbiIDeHAwIgN4cDEiCmFQcmVjaXNpb24iAWEiAXMiA2FubiILeHAwX3hwMV9uX24iEGFubl9zX2FQcmVjaXNpb24iDmFubl9hUHJlY2lzaW9uIgJuMSIEY2FsYyIDYWNjIgNjdXIiDSR0MDIyMzQzMjIzNjMiAWQiBWZvdW5kIgJkcCIFZE5leHQiBWREaWZmIgNhcnIiDSR0MDIyNzg0MjI4MzEiAiRsIgIkcyIFJGFjYzAiBSRmMF8xIgIkYSICJGkiBSRmMF8yIgVnZXRZRCIBRCIBeCIBYyIBYiINJHQwMjMzMzEyMzM1MSIBeSIFeU5leHQiBXlEaWZmIg0kdDAyMzY1ODIzNzA1Ig1jYWxjUHV0T25lVGtuIglwbXRBbXRSYXciD2xwQXNzZXRFbWlzc2lvbiINY2hlY2hFbWlzc2lvbiINJHQwMjQ0NjQyNDkyNiIMYW1CYWxhbmNlT2xkIgxwckJhbGFuY2VPbGQiDSR0MDI0OTMyMjUxMDgiC2FtQW1vdW50UmF3IgtwckFtb3VudFJhdyIIYW1BbW91bnQiCHByQW1vdW50IgxhbUJhbGFuY2VOZXciDHByQmFsYW5jZU5ldyIGY2hlY2tEIghscEFtb3VudCIOcG9vbFByb3BvcnRpb24iD2Ftb3VudEFzc2V0UGFydCIOcHJpY2VBc3NldFBhcnQiCWxwQW10Qm90aCIFYm9udXMiE2dldE9uZVRrblYySW50ZXJuYWwiCm91dEFzc2V0SWQiDG1pbk91dEFtb3VudCIIcGF5bWVudHMiDG9yaWdpbkNhbGxlciINdHJhbnNhY3Rpb25JZCIKYW1EZWNpbWFscyIKcHJEZWNpbWFscyIKcG9vbFN0YXR1cyINJHQwMjcyMzYyNzM0NCIBQCIIdG90YWxHZXQiC3RvdGFsQW1vdW50Ig0kdDAyNzUzMTI3ODM4IgVvdXRBbSIFb3V0UHIiCGN1clByWDE4IgVjdXJQciIRb3V0QXNzZXRJZE9yV2F2ZXMiEHNlbmRGZWVUb01hdGNoZXIiBGJ1cm4iAW0iAnBtIgJwZCICbW0iAnBrIhdwZW5kaW5nTWFuYWdlclB1YmxpY0tleSICY20iA2hwbSIDY3BtIgRzbGlwIglhdXRvU3Rha2UiB2ZhY3RDZmciC3N0YWtpbmdDbnRyIghzbGlwQ250ciIBZSIJbHBBc3NldElkIgJlbCIGbGVnYWN5IgJzYSICc3AiCGxwVHJuc2ZyIgJzcyIgaXNQb29sT25lVG9rZW5PcGVyYXRpb25zRGlzYWJsZWQiDWlzUHV0RGlzYWJsZWQiBmNoZWNrcyINJHQwMzMwMjQzMzE0OSIHZXN0aW1MUCIHbWF4U2xwZyIGZXN0UHV0IglvdXRBbXRBbXQiDWlzR2V0RGlzYWJsZWQiDSR0MDM1NzM1MzU4OTAiDWxwQXNzZXRBbW91bnQiCmxwRW1pc3Npb24iBWluZGV4IgRuZXdZIgJkeSILdG90YWxHZXRSYXciDSR0MDM2NjgwMzY3MjkiDSR0MDM3MDc0MzcxODkiDnN1bU9mR2V0QXNzZXRzIhJub0xlc3NUaGVuQW10QXNzZXQiFG5vTGVzc1RoZW5QcmljZUFzc2V0IhRidXJuTFBBc3NldE9uRmFjdG9yeSINY2hlY2tQYXltZW50cyIKZmFjdG9yeUNmZyIHc3Rha2luZyIKdW5zdGFrZUludiIBdiIFYnVybkEiDXVuc3Rha2VBbW91bnQiDSR0MDM5OTIxNDAxMDkiEHBheW1lbnRBbW91bnRSYXciDnBheW1lbnRBc3NldElkIg0kdDA0MDM2ODQwNDY1IghhbXRBc1N0ciIHcHJBc1N0ciIBayICcHIiDHJlc1NjYWxlTXVsdCIHdXNyQWRkciIHcG10QXNJZCICdHgiBnZlcmlmeSIPdGFyZ2V0UHVibGljS2V5IgptYXRjaGVyUHViIgpvcmRlclZhbGlkIgtzZW5kZXJWYWxpZCIMbWF0Y2hlclZhbGlkIgduZXdIYXNoIgthbGxvd2VkSGFzaCILY3VycmVudEhhc2hsAAFhAIDC1y8AAWIJALYCAQCAwtcvAAFjCQC2AgEAgICQu7rWrfANAAFkCQC2AgEAAAABZQkAtgIBAAAAAWYJALYCAQABAAFnCQC2AgEAAgABaAkAtgIBCQBlAgUBYQkAaQIJAGgCBQFhAAEFAWEAAWkCBVdBVkVTAAFqAgMxMDAAAWsCATEAAWwCAl9fAAFtAgAAAW4AAQABbwACAAFwAAMAAXEABAABcgABAAFzAAIAAXQAAwABdQAEAAF2AAUAAXcABgABeAAHAAF5AAgAAXoACQABQQABAAFCAAYAAUMABwABRAAKAAFFCQBrAwAFBQFhAJBOAQFGAgFHAUgJALwCAwkAtgIBBQFHBQFjCQC2AgEFAUgBAUkCAUoBSwkAoAMBCQC8AgMFAUoJALYCAQUBSwUBYwEBTAMBTQFOAU8JAGsDBQFNBQFOBQFPAQFQAQFKAwkAvwICBQFkBQFKCQC+AgEFAUoFAUoBAVEBAUoDCQC/AgIFAWQFAUoJAL4CAQUBSgUBSgEBUgACEyVzX19mYWN0b3J5Q29udHJhY3QBAVMAAhQlc19fbWFuYWdlclB1YmxpY0tleQEBVAACGyVzX19wZW5kaW5nTWFuYWdlclB1YmxpY0tleQEBVQACESVzJXNfX3ByaWNlX19sYXN0AQFWAgFXAVgJALkJAgkAzAgCAhglcyVzJWQlZF9fcHJpY2VfX2hpc3RvcnkJAMwIAgkApAMBBQFXCQDMCAIJAKQDAQUBWAUDbmlsBQFsAQFZAgFaAmFhCQCsAgIJAKwCAgkArAICAgslcyVzJXNfX1BfXwUBWgICX18FAmFhAQJhYgIBWgJhYQkArAICCQCsAgIJAKwCAgILJXMlcyVzX19HX18FAVoCAl9fBQJhYQECYWMAAg8lc19fYW1vdW50QXNzZXQBAmFkAAIOJXNfX3ByaWNlQXNzZXQBAmFlAAIHJXNfX2FtcAECYWYAAg0lc19fYWRkb25BZGRyAAJhZwIHJXNfX2ZlZQACYWgJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUCYWcFAUUBAmFpAAIRJXNfX2ZhY3RvcnlDb25maWcBAmFqAAIYJXMlc19fbWF0Y2hlcl9fcHVibGljS2V5AQJhawICYWwCYW0JAKwCAgkArAICCQCsAgIJAKwCAgIIJWQlZCVzX18FAmFsAgJfXwUCYW0CCF9fY29uZmlnAQJhbgECYW8JAKwCAgIoJXMlcyVzX19tYXBwaW5nc19fYmFzZUFzc2V0MmludGVybmFsSWRfXwUCYW8BAmFwAAIMJXNfX3NodXRkb3duAQJhcQACHSVzX19hbGxvd2VkTHBTdGFibGVTY3JpcHRIYXNoAQJhcgACFyVzX19mZWVDb2xsZWN0b3JBZGRyZXNzAQJhcwMCYXQCYXUCYXYJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIRRmFpbGVkOiBvcmRWYWxpZD0JAKUDAQUCYXQCCyBzbmRyVmFsaWQ9CQClAwEFAmF1AgwgbXRjaHJWYWxpZD0JAKUDAQUCYXYBAmF3AQFKBAJheAUBSgMJAAECBQJheAIGU3RyaW5nBAJheQUCYXgFAmF5CQACAQITZmFpbCBjYXN0IHRvIFN0cmluZwECYXoCAmFBAmFCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUCYUEFAmFCCQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFAmFBCQDMCAICAS4JAMwIAgUCYUIJAMwIAgIMIG5vdCBkZWZpbmVkBQNuaWwCAAECYUMCAmFBAmFCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUCYUEFAmFCCQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFAmFBCQDMCAICAS4JAMwIAgUCYUIJAMwIAgIMIG5vdCBkZWZpbmVkBQNuaWwCAAECYUQBAmFFCQACAQkAuQkCCQDMCAICD2xwX3N0YWJsZS5yaWRlOgkAzAgCBQJhRQUDbmlsAgEgAAJhRgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBAmF6AgUEdGhpcwkBAVIAAAJhRwkBAmF6AgUEdGhpcwkBAmFlAAECYUgACQELdmFsdWVPckVsc2UCCQCbCAIFAmFGCQECYXAABwECYUkACQDZBAEJAQJhegIFAmFGCQECYWoAAAJhSgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBAmF6AgUCYUYJAQJhcgABAmFLAAQCYUwJAQJhegIFBHRoaXMJAQJhYwAEAmFNCQECYXoCBQR0aGlzCQECYWQABAJhTgkBAmFDAgUCYUYJAQJhbgEFAmFNBAJhbAkBAmFDAgUCYUYJAQJhbgEFAmFMCQC1CQIJAQJhegIFAmFGCQECYWsCCQCkAwEFAmFsCQCkAwEFAmFOBQFsAQJhTwECYVADCQAAAgUCYVAFAWkFBHVuaXQJANkEAQUCYVABAmFRAQJhUAMJAAACBQJhUAUEdW5pdAUBaQkA2AQBCQEFdmFsdWUBBQJhUAECYVIBAmFTCQCZCgcJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAJEDAgUCYVMFAXIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJhUwUBcwkA2QQBCQCRAwIFAmFTBQF0CQECYU8BCQCRAwIFAmFTBQF1CQECYU8BCQCRAwIFAmFTBQF2CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYVMFAXcJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJhUwUBeAACYVQJAQJhUgEJAQJhSwAAAmFVBQJhVAACYVYIBQJhVQJfMQACYVcIBQJhVQJfMgACYVgIBQJhVQJfMwACYVkIBQJhVQJfNAACYVoIBQJhVQJfNQACYmEIBQJhVQJfNgACYmIIBQJhVQJfNwECYmMACQC1CQIJAQJhegIFAmFGCQECYWkABQFsAAJiZAkBAmJjAAACYmUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmJkBQFBAiBJbnZhbGlkIHN0YWtpbmcgY29udHJhY3QgYWRkcmVzcwACYmYJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmJkBQFDAiBJbnZhbGlkIHNsaXBhZ2UgY29udHJhY3QgYWRkcmVzcwACYmcJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmJkBQFEAhxJbnZhbGlkIGd3eCBjb250cmFjdCBhZGRyZXNzAAJiaAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCYmQFAUICHEludmFsaWQgZ3d4IGNvbnRyYWN0IGFkZHJlc3MBAmJpCgJiagJiawJibAJibQJibgJibwJicAJicQJicgJicwkAuQkCCQDMCAICFCVkJWQlZCVkJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQUCYmoJAMwIAgkApAMBBQJiawkAzAgCCQCkAwEFAmJsCQDMCAIJAKQDAQUCYm0JAMwIAgkApAMBBQJibgkAzAgCCQCkAwEFAmJvCQDMCAIJAKQDAQUCYnAJAMwIAgkApAMBBQJicQkAzAgCCQCkAwEFAmJyCQDMCAIJAKQDAQUCYnMFA25pbAUBbAECYnQGAmJ1AmJ2AmJ3AmJtAmJwAmJxCQC5CQIJAMwIAgIMJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQUCYnUJAMwIAgkApAMBBQJidgkAzAgCCQCkAwEFAmJ3CQDMCAIJAKQDAQUCYm0JAMwIAgkApAMBBQJicAkAzAgCCQCkAwEFAmJxBQNuaWwFAWwBAmJ4AQJieQMJAAACBQJieQIFV0FWRVMICQDvBwEFBHRoaXMJYXZhaWxhYmxlCQDwBwIFBHRoaXMJANkEAQUCYnkBAmJ6AgJiQQJiQgkAvAIDBQJiQQUBYwUCYkIBAmJDAwJiRAJiRQJiRgQCYkcJALwCAwkAuAICBQJiRAUCYkUFAWIFAmJFBAJiSAkAvwICCQC4AgIFAmJGCQEBUAEFAmJHBQFkAwkBASEBBQJiSAkAAgEJAKwCAgIKQmlnIHNscGc6IAkApgMBBQJiRwkAlAoCBQJiSAkAmQMBCQDMCAIFAmJECQDMCAIFAmJFBQNuaWwBAmJJAwJiSgJiSwJiTAQCYkcJALwCAwUCYksFAWIFAmJKBAJiTQkAvwICBQJiTAUCYkcDAwUCYk0GCQC/AgIFAmJLBQJiSgkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKYDAQUCYksCASAJAKYDAQUCYkoCASAJAKYDAQUCYkcCASAJAKYDAQUCYkwFAmJNAQJiTgQCYk8CYlACYlECYlIEAmJTCQEBRgIFAmJRBQJiTwQCYlQJAQFGAgUCYlIFAmJQCQECYnoCBQJiVAUCYlMBAmJVAwJiUQJiUgJiVgQCYlcJAQJhSwAEAmJYCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYlcFAXcEAmJZCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYlcFAXgEAmJaCQECYk4EBQJiWAUCYlkFAmJRBQJiUgQCYkIJAQFGAgUCYlEFAmJYBAJiQQkBAUYCBQJiUgUCYlkEAmNhCQEBRgIFAmJWBQFhBAJjYgkBAmJ6AgUCYkIFAmNhBAJjYwkBAmJ6AgUCYkEFAmNhCQDMCAIFAmJaCQDMCAIFAmNiCQDMCAIFAmNjBQNuaWwBAmNkAwJiUQJiUgJiVgQCY2UJAQJiVQMFAmJRBQJiUgUCYlYJAMwIAgkBAUkCCQCRAwIFAmNlAAAFAWEJAMwIAgkBAUkCCQCRAwIFAmNlAAEFAWEJAMwIAgkBAUkCCQCRAwIFAmNlAAIFAWEFA25pbAECY2YBAmNnBAJjaAkAawMFAmNnBQJhaAUBYQkAlAoCCQBlAgUCY2cFAmNoBQJjaAECY2kEAmNqAmNrAmNsAmNtBAJiVwkBAmFLAAQCY24JAJEDAgUCYlcFAXQEAmNvCQCRAwIFAmJXBQF1BAJjcAkAkQMCBQJiVwUBdgQCY3EJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJiVwUBdwQCY3IJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJiVwUBeAQCY3MJAJEDAgUCYlcFAXMEAmN0CAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEJANkEAQUCY24CC1dyb25nIExQIGlkCHF1YW50aXR5AwkBAiE9AgUCY24FAmNrCQACAQIPV3JvbmcgcG10IGFzc2V0BAJjdQkBAmJ4AQUCY28EAmN2CQEBRgIFAmN1BQJjcQQCY3cJAQJieAEFAmNwBAJjeAkBAUYCBQJjdwUCY3IEAmN5CQECYnoCBQJjeAUCY3YEAmN6CQEBSQIFAmN5BQFhBAJjQQkBAUYCBQJjbAUBYQQCY0IJAQFGAgUCY3QFAWEEAmNDCQC8AgMFAmN2BQJjQQUCY0IEAmNECQC8AgMFAmN4BQJjQQUCY0IEAmNFCQEBSQIFAmNDBQJjcQQCY0YJAQFJAgUCY0QFAmNyBAJjRwMJAAACBQJjagIABQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUCY20FAmNFAwkAAAIFAmNvAgVXQVZFUwUEdW5pdAkA2QQBBQJjbwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJjbQUCY0YDCQAAAgUCY3ACBVdBVkVTBQR1bml0CQDZBAEFAmNwCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYgIJAKUIAQUCY20FAmNqCQECYnQGBQJjRQUCY0YFAmNsBQJjegUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVUABQJjegkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVYCBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQJjegUDbmlsCQCcCgoFAmNFBQJjRgUCY28FAmNwBQJjdQUCY3cFAmN0BQJjeQUCY3MFAmNHAQJjSA0CY2oCYkYCY0kCY0oCY0sCY0wCY20CY00CY04CY08CY1ACY1ECY1IEAmJXCQECYUsABAJjbgkA2QQBCQCRAwIFAmJXBQF0BAJjUwkAkQMCBQJiVwUBdQQCY1QJAJEDAgUCYlcFAXYEAmNVCQCRAwIFAmJXBQF5BAJjVgkAkQMCBQJiVwUBegQCY1cJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJiVwUBdwQCY1gJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJiVwUBeAQCY3MJAJEDAgUCYlcFAXMEAmNZCAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEFAmNuAghXciBscCBhcwhxdWFudGl0eQQCY3UDBQJjTQkBAmJ4AQUCY1MDAwUCY08JAAACBQJjUgUCY1MHCQBlAgkBAmJ4AQUCY1MFAmNRAwUCY08JAQJieAEFAmNTCQBlAgkBAmJ4AQUCY1MFAmNJBAJjdwMFAmNNCQECYngBBQJjVAMDBQJjTwkAAAIFAmNSBQJjVAcJAGUCCQECYngBBQJjVAUCY1EDBQJjTwkBAmJ4AQUCY1QJAGUCCQECYngBBQJjVAUCY0sEAmNaCQEBRgIFAmNJBQJjVwQCZGEJAQFGAgUCY0sFAmNYBAJkYgkBAmJ6AgUCZGEFAmNaBAJjdgkBAUYCBQJjdQUCY1cEAmN4CQEBRgIFAmN3BQJjWAQCZGMDCQAAAgUCY1kAAAQCY3kFAWQEAmRkBQFkBAJjYQkAdgYJALkCAgUCY1oFAmRhAAAJALYCAQAFAAEAAAUERE9XTgkAlwoFCQEBSQIFAmNhBQFhCQEBSQIFAmNaBQJjVwkBAUkCBQJkYQUCY1gJAQJiegIJALcCAgUCY3gFAmRhCQC3AgIFAmN2BQJjWgUCZGQEAmN5CQECYnoCBQJjeAUCY3YEAmRlCQC8AgMJAQFQAQkAuAICBQJjeQUCZGIFAWMFAmN5BAJkZAkBAUYCBQJiRgUBYQMDAwUCY1AJAQIhPQIFAmN5BQFkBwkAvwICBQJkZQUCZGQHCQACAQkArAICCQCsAgIJAKwCAgIPUHJpY2Ugc2xpcHBhZ2UgCQCmAwEFAmRlAgMgPiAJAKYDAQUCZGQEAmRmCQEBRgIFAmNZBQFhBAJkZwkAvAIDBQJjWgUCY3kFAWMEAmRoCQC8AgMFAmRhBQFjBQJjeQQCZGkDCQC/AgIFAmRnBQJkYQkAlAoCBQJkaAUCZGEJAJQKAgUCY1oFAmRnBAJkaggFAmRpAl8xBAJkawgFAmRpAl8yBAJjYQkAvAIDBQJkZgUCZGsFAmN4CQCXCgUJAQFJAgUCY2EFAWEJAQFJAgUCZGoFAmNXCQEBSQIFAmRrBQJjWAUCY3kFAmRkBAJkbAgFAmRjAl8xBAJkbQgFAmRjAl8yBAJkbggFAmRjAl8zBAJjegkBAUkCCAUCZGMCXzQFAWEEAmRvCQEBSQIIBQJkYwJfNQUBYQMJAGcCAAAFAmRsCQACAQIHTFAgPD0gMAQCZHADCQEBIQEFAmNOAAAFAmRsBAJkcQkAZQIFAmNJBQJkbQQCZHIJAGUCBQJjSwUCZG4EAmRzAwMFAmNPCQAAAgUCY1IFAmNTBwkAlAoCBQJjUQAAAwMFAmNPCQAAAgUCY1IFAmNUBwkAlAoCAAAFAmNRCQCUCgIFAmRtBQJkbgQCZHQIBQJkcwJfMQQCZHUIBQJkcwJfMgQCZHYJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFVAAUCY3oJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFWAgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUCY3oJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVkCBQJjbQUCY2oJAQJiaQoFAmR0BQJkdQUCZHAFAmN6BQJiRgUCZG8FBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFAmRxBQJkcgUDbmlsCQCfCg0FAmRsBQJkcAUCY3oFAmN1BQJjdwUCY1kFAmNuBQJjcwUCZHYFAmRxBQJkcgUCY0oFAmNMAQJkdwECZHgEAmJXCQECYUsABAJkeQkAkQMCBQJiVwUBdQQCZHoJAJEDAgUCYlcFAXYEAmNzCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYlcFAXMEAmJYCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYlcFAXcEAmJZCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYlcFAXgEAmRBCQECYngBBQJkeQQCZEIJAQJieAEFAmR6BAJjeQMJAAACCAUCZHgJb3JkZXJUeXBlBQNCdXkJAQJiTgQFAmJYBQJiWQkAZAIFAmRBCAUCZHgGYW1vdW50BQJkQgkBAmJOBAUCYlgFAmJZCQBlAgUCZEEIBQJkeAZhbW91bnQFAmRCBAJjegkBAUkCBQJjeQUBYQMDAwkBAmFIAAYJAAACBQJjcwUBcAYJAAACBQJjcwUBcQkAAgECDUFkbWluIGJsb2NrZWQEAmRDCAgFAmR4CWFzc2V0UGFpcgthbW91bnRBc3NldAQCZEQDCQAAAgUCZEMFBHVuaXQCBVdBVkVTCQDYBAEJAQV2YWx1ZQEFAmRDBAJkRQgIBQJkeAlhc3NldFBhaXIKcHJpY2VBc3NldAQCZEYDCQAAAgUCZEUFBHVuaXQCBVdBVkVTCQDYBAEJAQV2YWx1ZQEFAmRFAwMJAQIhPQIFAmREBQJkeQYJAQIhPQIFAmRGBQJkegkAAgECCVdyIGFzc2V0cwQCZEcIBQJkeAVwcmljZQQCY1gJAGsDBQFhBQJiWQUCYlgEAmRICQEBTAMFAmRHBQFhBQJjWAQCZEkDCQAAAggFAmR4CW9yZGVyVHlwZQUDQnV5CQBnAgUCY3oFAmRICQBnAgUCZEgFAmN6BgECZEoBAmRLAwkBAiE9AgkAkAMBCAUCZEsIcGF5bWVudHMAAQkAAgECCjEgcG1udCBleHAEAmRMCQEFdmFsdWUBCQCRAwIIBQJkSwhwYXltZW50cwAABAJjawkBBXZhbHVlAQgFAmRMB2Fzc2V0SWQEAmNRCAUCZEwGYW1vdW50BAJkYwkBAmNpBAkA2AQBCAUCZEsNdHJhbnNhY3Rpb25JZAkA2AQBBQJjawUCY1EIBQJkSwZjYWxsZXIEAmNFCAUCZGMCXzEEAmNGCAUCZGMCXzIEAmNzCQENcGFyc2VJbnRWYWx1ZQEIBQJkYwJfOQQCY0cIBQJkYwNfMTADAwkBAmFIAAYJAAACBQJjcwUBcQkAAgEJAKwCAgIPQWRtaW4gYmxvY2tlZDogCQCkAwEFAmNzCQCXCgUFAmNFBQJjRgUCY1EFAmNrBQJjRwECZE0KAmROAmFhAmRPAmRQAmJGAmNOAmNPAmNQAmNRAmNSBAJkYwkBAmNIDQUCYWEFAmJGCAkBBXZhbHVlAQUCZE8GYW1vdW50CAkBBXZhbHVlAQUCZE8HYXNzZXRJZAgJAQV2YWx1ZQEFAmRQBmFtb3VudAgJAQV2YWx1ZQEFAmRQB2Fzc2V0SWQFAmROCQAAAgUCYWECAAUCY04FAmNPBQJjUAUCY1EFAmNSBAJjcwkBDXBhcnNlSW50VmFsdWUBCAUCZGMCXzgDAwMJAQJhSAAGCQAAAgUCY3MFAW8GCQAAAgUCY3MFAXEJAAIBCQCsAgICCEJsb2NrZWQ6CQCkAwEFAmNzBQJkYwECZFEBAmRSBAJkUwUBZwQCZFQJAJEDAgUCZFIAAAQCZFUJAJEDAgUCZFIAAQQCZFYJAKcDAQUBagQCZFcJALkCAgkApwMBBQJhRwUCZFYEAmRYCQC3AgIFAmRUBQJkVQMJAAACBQJkWAUBZQUBZQQCZFkJALkCAgUCZFcFAmRTBAJkWgkAuQICCQC5AgIJALkCAgUCZFQFAmRVBQJkUwUCZFMEAmVhCQC6AgIJALkCAgUCZFkFAmRYBQJkVgQCZWIJALgCAgUCZFkFAmRWBAJlYwkAtwICBQJkUwUBZgoBAmVkAgJlZQJlZgQCZWcFAmVlBAJlaAgFAmVnAl8xBAJlaQgFAmVnAl8yAwkBAiE9AgUCZWkFBHVuaXQFAmVlBAJlagkAugICCQC5AgIJALkCAgUCZWgFAmVoBQJlaAUCZFoEAmVrCQC6AgIJALkCAgkAtwICBQJlYQkAuQICBQJlagUCZFMFAmVoCQC3AgIJALoCAgkAuQICBQJlYgUCZWgFAmRWCQC5AgIFAmVjBQJlagQCZWwJAQFRAQkAuAICBQJlawkBBXZhbHVlAQUCZWgDCQDAAgIFAWYFAmVsCQCUCgIFAmVrBQJlZgkAlAoCBQJlawUEdW5pdAQCZW0JAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJCQDMCAIACgkAzAgCAAsJAMwIAgAMCQDMCAIADQkAzAgCAA4FA25pbAQCZW4KAAJlbwUCZW0KAAJlcAkAkAMBBQJlbwoAAmVxCQCUCgIFAmRYBQR1bml0CgECZXICAmVzAmV0AwkAZwIFAmV0BQJlcAUCZXMJAQJlZAIFAmVzCQCRAwIFAmVvBQJldAoBAmV1AgJlcwJldAMJAGcCBQJldAUCZXAFAmVzCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQJldQIJAQJlcgIJAQJlcgIJAQJlcgIJAQJlcgIJAQJlcgIJAQJlcgIJAQJlcgIJAQJlcgIJAQJlcgIJAQJlcgIJAQJlcgIJAQJlcgIJAQJlcgIJAQJlcgIJAQJlcgIFAmVxAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8EAmVoCAUCZW4CXzEEAmVpCAUCZW4CXzIDCQECIT0CBQJlaQUEdW5pdAUCZWgJAAIBCQCsAgICGUQgY2FsY3VsYXRpb24gZXJyb3IsIEQgPSAJAKYDAQUCZWgBAmV2AwJkUgJkSwJldwQCZFMFAWcEAmV4CQCRAwIFAmRSAwkAAAIFAmRLAAAAAQAABAJkVgkApwMBBQFqBAJkVwkAuQICCQCnAwEFAmFHBQJkVgQCZFgFAmV4BAJkWQkAuQICBQJkVwUCZFMEAmV5CQC6AgIJALkCAgkAuQICCQC6AgIJALkCAgUCZXcFAmV3CQC5AgIFAmV4BQJkUwUCZXcFAmRWCQC5AgIFAmRZBQJkUwQCZXoJALgCAgkAtwICBQJkWAkAugICCQC5AgIFAmV3BQJkVgUCZFkFAmV3CgECZWQCAmVlAmVmBAJlQQUCZWUEAmVCCAUCZUECXzEEAmVpCAUCZUECXzIDCQECIT0CBQJlaQUEdW5pdAUCZWUEAmVDCQC6AgIJALcCAgkAuQICBQJlQgUCZUIFAmV5CQC3AgIJALkCAgUBZwUCZUIFAmV6BAJlRAkBAVEBCQC4AgIFAmVDCQEFdmFsdWUBBQJlQgMJAMACAgUBZgUCZUQJAJQKAgUCZUMFAmVmCQCUCgIFAmVDBQR1bml0BAJlbQkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQkAzAgCAAYJAMwIAgAHCQDMCAIACAkAzAgCAAkJAMwIAgAKCQDMCAIACwkAzAgCAAwJAMwIAgANCQDMCAIADgUDbmlsBAJlRQoAAmVvBQJlbQoAAmVwCQCQAwEFAmVvCgACZXEJAJQKAgUCZXcFBHVuaXQKAQJlcgICZXMCZXQDCQBnAgUCZXQFAmVwBQJlcwkBAmVkAgUCZXMJAJEDAgUCZW8FAmV0CgECZXUCAmVzAmV0AwkAZwIFAmV0BQJlcAUCZXMJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBAmV1AgkBAmVyAgkBAmVyAgkBAmVyAgkBAmVyAgkBAmVyAgkBAmVyAgkBAmVyAgkBAmVyAgkBAmVyAgkBAmVyAgkBAmVyAgkBAmVyAgkBAmVyAgkBAmVyAgkBAmVyAgUCZXEAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwQCZUIIBQJlRQJfMQQCZWkIBQJlRQJfMgMJAQIhPQIFAmVpBQR1bml0BQJlQgkAAgEJAKwCAgIZWSBjYWxjdWxhdGlvbiBlcnJvciwgWSA9IAkApgMBBQJlQgECZUYEAmVHAmNrAmNtAmFhBAJhUwkBAmFLAAQCY28JAJEDAgUCYVMFAXUEAmNwCQCRAwIFAmFTBQF2BAJjbgkAkQMCBQJhUwUBdAQCY1cJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJhUwUBdwQCY1gJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJhUwUBeAQCZUgJALYCAQgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBCQDZBAEFAmNuAhBpbnZhbGlkIGxwIGFzc2V0CHF1YW50aXR5BAJlSQMJAL8CAgUCZUgFAWUGCQACAQIiaW5pdGlhbCBkZXBvc2l0IHJlcXVpcmVzIGFsbCBjb2lucwMJAAACBQJlSQUCZUkEAmN1CQECYngBBQJjbwQCY3cJAQJieAEFAmNwBAJlSgMJAAACBQJhYQIACQCUCgIFAmN1BQJjdwMJAAACBQJjawUCY28DCQBmAgUCZUcFAmN1CQACAQIWaW52YWxpZCBwYXltZW50IGFtb3VudAkAlAoCCQBlAgUCY3UFAmVHBQJjdwMJAAACBQJjawUCY3ADCQBmAgUCZUcFAmN3CQACAQIWaW52YWxpZCBwYXltZW50IGFtb3VudAkAlAoCBQJjdQkAZQIFAmN3BQJlRwkAAgECEHdyb25nIHBtdEFzc2V0SWQEAmVLCAUCZUoCXzEEAmVMCAUCZUoCXzIEAmVNAwkAAAIFAmNrBQJjbwkAlAoCBQJlRwAAAwkAAAIFAmNrBQJjcAkAlAoCAAAFAmVHCQACAQIPaW52YWxpZCBwYXltZW50BAJlTggFAmVNAl8xBAJlTwgFAmVNAl8yBAJlUAgJAQJjZgEFAmVOAl8xBAJlUQgJAQJjZgEFAmVPAl8xBAJjaAgJAQJjZgEFAmVHAl8yBAJlUgkAZAIFAmVLBQJlUAQCZVMJAGQCBQJlTAUCZVEEAmJLCQECZFEBCQDMCAIJALYCAQUCZUsJAMwIAgkAtgIBBQJlTAUDbmlsBAJiSgkBAmRRAQkAzAgCCQC2AgEFAmVSCQDMCAIJALYCAQUCZVMFA25pbAQCZVQDCQC/AgIFAmJKBQJiSwYJAQV0aHJvdwADCQAAAgUCZVQFAmVUBAJlVQkAvAIDBQJlSAkAuAICBQJiSgUCYksFAmJLBAJjegkBAUkCCQECYnoCCQEBRgIFAmVTBQJjWAkBAUYCBQJlUgUCY1cFAWEEAmR2CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBVQAFAmN6CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBVgIFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFAmN6CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFZAgUCY20FAmFhCQECYmkKBQJlTgUCZU8JAKADAQUCZVUFAmN6AAAAAAUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAAAAAAFA25pbAQCZVYJAGsDBQJlTAUBYQUCZUsEAmVXCQBrAwUCZUcFAWEJAGQCBQJlVgUBYQQCZVgJAGUCBQJlRwUCZVcEAmVZCQC8AgMFAmVICQC2AgEFAmVYCQC2AgEFAmVMBAJlWgkAoAMBCQC8AgMJALgCAgUCZVUFAmVZBQFiBQJlWQkAlgoECQCgAwEFAmVVBQJkdgUCY2gFAmVaCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJmYQYCZmICZmMCZmQCZE4CZmUCZmYEAmFTCQECYUsABAJjbgkAkQMCBQJhUwUBdAQCY28JAJEDAgUCYVMFAXUEAmNwCQCRAwIFAmFTBQF2BAJmZwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmFTBQF3BAJmaAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmFTBQF4BAJmaQkAkQMCBQJhUwUBcwQCY20DCQAAAgUCZE4FAmJoBQJmZQUCZE4EAmRMCQEFdmFsdWUBCQCRAwIFAmZkAAAEAmNrCQEFdmFsdWUBCAUCZEwHYXNzZXRJZAQCY1EIBQJkTAZhbW91bnQEAmNqCQDYBAEFAmZmAwkBAiE9AgUCY24JANgEAQUCY2sJAAIBAghXcm9uZyBMUAQCY3UJAQJieAEFAmNvBAJjdwkBAmJ4AQUCY3AEAmZqCgACZmsJAPwHBAUEdGhpcwITZ2V0T25lVGtuVjJSRUFET05MWQkAzAgCBQJmYgkAzAgCBQJjUQUDbmlsBQNuaWwDCQABAgUCZmsCCihJbnQsIEludCkFAmZrCQACAQkArAICCQADAQUCZmsCHyBjb3VsZG4ndCBiZSBjYXN0IHRvIChJbnQsIEludCkEAmZsCAUCZmoCXzEEAmNoCAUCZmoCXzIEAmZtAwMJAGYCBQJmYwAACQBmAgUCZmMFAmZsBwkAAgEJALkJAgkAzAgCAh9hbW91bnQgdG8gcmVjZWl2ZSBpcyBsZXNzIHRoYW4gCQDMCAIJAKQDAQUCZmMFA25pbAIABQJmbAQCZm4DCQAAAgUCZmIFAmNvCQCWCgQFAmZtAAAJAGUCCQBlAgUCY3UFAmZtBQJjaAUCY3cDCQAAAgUCZmIFAmNwCQCWCgQAAAUCZm0FAmN1CQBlAgkAZQIFAmN3BQJmbQUCY2gJAAIBAhRpbnZhbGlkIG91dCBhc3NldCBpZAQCZm8IBQJmbgJfMQQCZnAIBQJmbgJfMgQCZVIIBQJmbgJfMwQCZVMIBQJmbgJfNAQCZnEJAQJiegIJAQFGAgUCZVMFAmZoCQEBRgIFAmVSBQJmZwQCZnIJAQFJAgUCZnEFAWEEAmZzAwkAAAIFAmZiAgVXQVZFUwUEdW5pdAkA2QQBBQJmYgQCZnQDCQBmAgUCY2gAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJhSgUCY2gFAmZzBQNuaWwFA25pbAQCY0cJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJjbQUCZm0FAmZzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYgIJAKUIAQUCY20FAmNqCQECYnQGBQJmbwUCZnAFAmNRBQJmcgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVUABQJmcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVYCBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQJmcgUDbmlsBQJmdAMJAAACBQJjRwUCY0cEAmZ1CQD8BwQFAmFGAgRidXJuCQDMCAIFAmNRBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmNrBQJjUQUDbmlsAwkAAAIFAmZ1BQJmdQkAlAoCBQJjRwUCZm0JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAmZ2AAQCYXgJAKIIAQkBAVMAAwkAAQIFAmF4AgZTdHJpbmcEAmRYBQJheAkA2QQBBQJkWAMJAAECBQJheAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAQJmdwAEAmF4CQCiCAEJAQFUAAMJAAECBQJheAIGU3RyaW5nBAJkWAUCYXgJANkEAQUCZFgDCQABAgUCYXgCBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgACZngJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAECZnkBAmRLBAJheAkBAmZ2AAMJAAECBQJheAIKQnl0ZVZlY3RvcgQCZnoFAmF4AwkAAAIIBQJkSw9jYWxsZXJQdWJsaWNLZXkFAmZ6BgUCZngDCQABAgUCYXgCBFVuaXQDCQAAAggFAmRLBmNhbGxlcgUEdGhpcwYFAmZ4CQACAQILTWF0Y2ggZXJyb3IaAmRLAQtjb25zdHJ1Y3RvcgEBUgQCZXkJAQJmeQEFAmRLAwkAAAIFAmV5BQJleQkAzAgCCQELU3RyaW5nRW50cnkCCQEBUgAFAVIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkSwEKc2V0TWFuYWdlcgECZkEEAmV5CQECZnkBBQJkSwMJAAACBQJleQUCZXkEAmZCCQDZBAEFAmZBAwkAAAIFAmZCBQJmQgkAzAgCCQELU3RyaW5nRW50cnkCCQEBVAAFAmZBBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZEsBDmNvbmZpcm1NYW5hZ2VyAAQCY2UJAQJmdwAEAmZDAwkBCWlzRGVmaW5lZAEFAmNlBgkAAgECEk5vIHBlbmRpbmcgbWFuYWdlcgMJAAACBQJmQwUCZkMEAmZEAwkAAAIIBQJkSw9jYWxsZXJQdWJsaWNLZXkJAQV2YWx1ZQEFAmNlBgkAAgECG1lvdSBhcmUgbm90IHBlbmRpbmcgbWFuYWdlcgMJAAACBQJmRAUCZkQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVMACQDYBAEJAQV2YWx1ZQEFAmNlCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFUAAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRLAQNwdXQCAmZFAmZGBAJmRwkBAmJjAAQCZkgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmZHBQFBAgpXciBzdCBhZGRyBAJmSQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCZkcFAUMCCldyIHNsIGFkZHIDCQBmAgAABQJmRQkAAgECDldyb25nIHNsaXBwYWdlAwkBAiE9AgkAkAMBCAUCZEsIcGF5bWVudHMAAgkAAgECDDIgcG1udHMgZXhwZAQCZkoJAQJkTQoJAKUIAQgFAmRLBmNhbGxlcgkA2AQBCAUCZEsNdHJhbnNhY3Rpb25JZAkBD0F0dGFjaGVkUGF5bWVudAIICQEFdmFsdWUBCQCRAwIIBQJkSwhwYXltZW50cwAAB2Fzc2V0SWQICQEFdmFsdWUBCQCRAwIIBQJkSwhwYXltZW50cwAABmFtb3VudAkAkQMCCAUCZEsIcGF5bWVudHMAAQUCZkUGBwYAAAIABAJkcAgFAmZKAl8yBAJmSwgFAmZKAl83BAJjRwgFAmZKAl85BAJkcQgFAmZKA18xMAQCZHIIBQJmSgNfMTEEAmNvCAUCZkoDXzEyBAJjcAgFAmZKA18xMwQCZGMJAPwHBAUCYUYCBGVtaXQJAMwIAgUCZHAFA25pbAUDbmlsAwkAAAIFAmRjBQJkYwQCZkwEAmF4BQJkYwMJAAECBQJheAIHQWRkcmVzcwQCZk0FAmF4CQD8BwQFAmZNAgRlbWl0CQDMCAIFAmRwBQNuaWwFA25pbAUEdW5pdAMJAAACBQJmTAUCZkwEAmZOAwkAZgIFAmRxAAAJAPwHBAUCZkkCA3B1dAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJjbwUCZHEFA25pbAUDbmlsAwkAAAIFAmZOBQJmTgQCZk8DCQBmAgUCZHIAAAkA/AcEBQJmSQIDcHV0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmNwBQJkcgUDbmlsBQNuaWwDCQAAAgUCZk8FAmZPBAJmUAMFAmZGBAJmUQkA/AcEBQJmSAIFc3Rha2UFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCZksFAmRwBQNuaWwDCQAAAgUCZlEFAmZRBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAmRLBmNhbGxlcgUCZHAFAmZLBQNuaWwJAM4IAgUCY0cFAmZQCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRLAQtwdXRPbmVUa25WMgICZmMCZkYEAmZSCgACZmsJAPwHBAUCYUYCKGlzUG9vbE9uZVRva2VuT3BlcmF0aW9uc0Rpc2FibGVkUkVBRE9OTFkJAMwIAgkApQgBBQR0aGlzBQNuaWwFA25pbAMJAAECBQJmawIHQm9vbGVhbgUCZmsJAAIBCQCsAgIJAAMBBQJmawIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgQCZlMDAwMJAQJhSAAGCQAAAgUCYVcFAW8GCQAAAgUCYVcFAXEGBQJmUgQCZlQJAMwIAgMJAQEhAQUCZlMGCQECYUQBAiFwdXQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgYWRtaW4JAMwIAgMJAAACCQCQAwEIBQJkSwhwYXltZW50cwABBgkBAmFEAQIeZXhhY3RseSAxIHBheW1lbnQgYXJlIGV4cGVjdGVkBQNuaWwDCQAAAgUCZlQFAmZUBAJhUwkBAmFLAAQCY28JAJEDAgUCYVMFAXUEAmNwCQCRAwIFAmFTBQF2BAJjbgkA2QQBCQCRAwIFAmFTBQF0BAJmZwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmFTBQF3BAJmaAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmFTBQF4BAJjbQMJAAACCAUCZEsGY2FsbGVyBQR0aGlzCAUCZEsMb3JpZ2luQ2FsbGVyCAUCZEsGY2FsbGVyBAJkTAkBBXZhbHVlAQkAkQMCCAUCZEsIcGF5bWVudHMAAAQCY2sJANgEAQkBBXZhbHVlAQgFAmRMB2Fzc2V0SWQEAmNRCAUCZEwGYW1vdW50BAJmVQkBAmVGBAUCY1EFAmNrCQClCAEFAmNtCQDYBAEIBQJkSw10cmFuc2FjdGlvbklkBAJmVggFAmZVAl8xBAJjRwgFAmZVAl8yBAJjaAgFAmZVAl8zBAJkcAMDCQBmAgUCZmMAAAkAZgIFAmZjBQJmVgcJAAIBCQC5CQIJAMwIAgIfYW1vdW50IHRvIHJlY2VpdmUgaXMgbGVzcyB0aGFuIAkAzAgCCQCkAwEFAmZjBQNuaWwCAAUCZlYEAmZKCQD8BwQFAmFGAgRlbWl0CQDMCAIFAmRwBQNuaWwFA25pbAMJAAACBQJmSgUCZkoEAmZMBAJheAUCZkoDCQABAgUCYXgCB0FkZHJlc3MEAmZNBQJheAkA/AcEBQJmTQIEZW1pdAkAzAgCBQJkcAUDbmlsBQNuaWwFBHVuaXQDCQAAAgUCZkwFAmZMBAJmUAMFAmZGBAJmUQkA/AcEBQJiZQIFc3Rha2UFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCY24FAmRwBQNuaWwDCQAAAgUCZlEFAmZRBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAmRLBmNhbGxlcgUCZHAFAmNuBQNuaWwEAmZ0AwkAZgIFAmNoAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUCYUoFAmNoCQDZBAEFAmNrBQNuaWwFA25pbAkAlAoCCQDOCAIJAM4IAgUCY0cFAmZQBQJmdAUCZHAJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZEsBCnB1dEZvckZyZWUBAmZXAwkAZgIAAAUCZlcJAAIBAgpXcm9uZyBzbHBnAwkBAiE9AgkAkAMBCAUCZEsIcGF5bWVudHMAAgkAAgECDDIgcG1udHMgZXhwZAQCZlgJAQJkTQoJAKUIAQgFAmRLBmNhbGxlcgkA2AQBCAUCZEsNdHJhbnNhY3Rpb25JZAkBD0F0dGFjaGVkUGF5bWVudAIICQEFdmFsdWUBCQCRAwIIBQJkSwhwYXltZW50cwAAB2Fzc2V0SWQICQEFdmFsdWUBCQCRAwIIBQJkSwhwYXltZW50cwAABmFtb3VudAkAkQMCCAUCZEsIcGF5bWVudHMAAQUCZlcHBwYAAAIACAUCZlgCXzkCZEsBA2dldAAEAmRjCQECZEoBBQJkSwQCZlkIBQJkYwJfMQQCY0YIBQJkYwJfMgQCY1EIBQJkYwJfMwQCY2sIBQJkYwJfNAQCY0cIBQJkYwJfNQQCZXoJAPwHBAUCYUYCBGJ1cm4JAMwIAgUCY1EFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCY2sFAmNRBQNuaWwDCQAAAgUCZXoFAmV6BQJjRwkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkSwELZ2V0T25lVGtuVjICAmZiAmZjBAJmUgoAAmZrCQD8BwQFAmFGAihpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZFJFQURPTkxZCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQABAgUCZmsCB0Jvb2xlYW4FAmZrCQACAQkArAICCQADAQUCZmsCHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4EAmZaAwMJAQJhSAAGCQAAAgUCYVcFAXEGBQJmUgQCZlQJAMwIAgMJAQEhAQUCZloGCQECYUQBAiFnZXQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgYWRtaW4JAMwIAgMJAAACCQCQAwEIBQJkSwhwYXltZW50cwABBgkBAmFEAQIeZXhhY3RseSAxIHBheW1lbnQgYXJlIGV4cGVjdGVkBQNuaWwDCQAAAgUCZlQFAmZUBAJnYQkBAmZhBgUCZmIFAmZjCAUCZEsIcGF5bWVudHMIBQJkSwZjYWxsZXIIBQJkSwxvcmlnaW5DYWxsZXIIBQJkSw10cmFuc2FjdGlvbklkBAJjRwgFAmdhAl8xBAJmbQgFAmdhAl8yCQCUCgIFAmNHBQJmbQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkSwETZ2V0T25lVGtuVjJSRUFET05MWQICZmICZ2IEAmFTCQECYUsABAJjbwkAkQMCBQJhUwUBdQQCY3AJAJEDAgUCYVMFAXYEAmNuCQCRAwIFAmFTBQF0BAJkUgkAzAgCCQC2AgEJAQJieAEFAmNvCQDMCAIJALYCAQkBAmJ4AQUCY3AFA25pbAQCZ2MJALYCAQgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBCQDZBAEFAmNuAhBpbnZhbGlkIGxwIGFzc2V0CHF1YW50aXR5BAJiSwkBAmRRAQUCZFIEAmJKCQC4AgIFAmJLCQC8AgMJALYCAQUCZ2IFAmJLBQJnYwQCZ2QDCQAAAgUCZmIFAmNvAAADCQAAAgUCZmIFAmNwAAEJAAIBAhRpbnZhbGlkIG91dCBhc3NldCBpZAQCZ2UJAQJldgMFAmRSBQJnZAUCYkoEAmdmCQC4AgIJAJEDAgUCZFIFAmdkBQJnZQQCZ2cJAJYDAQkAzAgCAAAJAMwIAgkAoAMBCQC4AgIFAmdmBQFmBQNuaWwEAmdoCQECY2YBBQJnZwQCZmwIBQJnaAJfMQQCY2gIBQJnaAJfMgkAlAoCBQNuaWwJAJQKAgUCZmwFAmNoAmRLARxnZXRPbmVUa25WMldpdGhCb251c1JFQURPTkxZAgJmYgJnYgQCYVMJAQJhSwAEAmNvCQCRAwIFAmFTBQF1BAJjcAkAkQMCBQJhUwUBdgQCY24JAJEDAgUCYVMFAXQEAmN1CQECYngBBQJjbwQCY3cJAQJieAEFAmNwBAJnaQoAAmZrCQD8BwQFBHRoaXMCE2dldE9uZVRrblYyUkVBRE9OTFkJAMwIAgUCZmIJAMwIAgUCZ2IFA25pbAUDbmlsAwkAAQIFAmZrAgooSW50LCBJbnQpBQJmawkAAgEJAKwCAgkAAwEFAmZrAh8gY291bGRuJ3QgYmUgY2FzdCB0byAoSW50LCBJbnQpBAJmbAgFAmdpAl8xBAJjaAgFAmdpAl8yBAJkYwkBAmNpBAIABQJjbgUCZ2IFBHRoaXMEAmNFCAUCZGMCXzEEAmNGCAUCZGMCXzIEAmdqCQBkAgUCY0UFAmNGBAJlWgMJAAACBQJnagAAAwkAAAIFAmZsAAAAAAkAAgECF2JvbnVzIGNhbGN1bGF0aW9uIGVycm9yCQBrAwkAZQIFAmZsBQJnagUBYQUCZ2oJAJQKAgUDbmlsCQCVCgMFAmZsBQJjaAUCZVoCZEsBCWdldE5vTGVzcwICZ2sCZ2wEAmRjCQECZEoBBQJkSwQCY0UIBQJkYwJfMQQCY0YIBQJkYwJfMgQCY1EIBQJkYwJfMwQCY2sIBQJkYwJfNAQCY0cIBQJkYwJfNQMJAGYCBQJnawUCY0UJAAIBCQCsAgIJAKwCAgkArAICAglGYWlsZWQ6ICAJAKQDAQUCY0UCAyA8IAkApAMBBQJnawMJAGYCBQJnbAUCY0YJAAIBCQCsAgIJAKwCAgkArAICAghGYWlsZWQ6IAkApAMBBQJjRgIDIDwgCQCkAwEFAmdsBAJnbQkA/AcEBQJhRgIEYnVybgkAzAgCBQJjUQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJjawUCY1EFA25pbAMJAAACBQJnbQUCZ20FAmNHCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRLAQ11bnN0YWtlQW5kR2V0AQJjZwQCZ24DCQECIT0CCQCQAwEIBQJkSwhwYXltZW50cwAACQACAQINTm8gcG1udHMgZXhwZAYDCQAAAgUCZ24FAmduBAJiVwkBAmFLAAQCZ28JAQJiYwAEAmZLCQDZBAEJAJEDAgUCYlcFAXQEAmdwCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJnbwUBQQIKV3Igc3QgYWRkcgQCZ3EJAPwHBAUCZ3ACB3Vuc3Rha2UJAMwIAgkA2AQBBQJmSwkAzAgCBQJjZwUDbmlsBQNuaWwDCQAAAgUCZ3EFAmdxBAJkYwkBAmNpBAkA2AQBCAUCZEsNdHJhbnNhY3Rpb25JZAkA2AQBBQJmSwUCY2cIBQJkSwZjYWxsZXIEAmNzCQENcGFyc2VJbnRWYWx1ZQEIBQJkYwJfOQQCY0cIBQJkYwNfMTAEAmdyAwMJAQJhSAAGCQAAAgUCY3MFAXEJAAIBCQCsAgICCUJsb2NrZWQ6IAkApAMBBQJjcwYDCQAAAgUCZ3IFAmdyBAJncwkA/AcEBQJhRgIEYnVybgkAzAgCBQJjZwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJmSwUCY2cFA25pbAMJAAACBQJncwUCZ3MFAmNHCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRLARV1bnN0YWtlQW5kR2V0T25lVGtuVjIDAmd0AmZiAmZjBAJmUgoAAmZrCQD8BwQFAmFGAihpc1Bvb2xPbmVUb2tlbk9wZXJhdGlvbnNEaXNhYmxlZFJFQURPTkxZCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQNuaWwDCQABAgUCZmsCB0Jvb2xlYW4FAmZrCQACAQkArAICCQADAQUCZmsCHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4EAmZaAwMJAQJhSAAGCQAAAgUCYVcFAXEGBQJmUgQCZlQJAMwIAgMJAQEhAQUCZloGCQECYUQBAiFnZXQgb3BlcmF0aW9uIGlzIGJsb2NrZWQgYnkgYWRtaW4JAMwIAgMJAAACCQCQAwEIBQJkSwhwYXltZW50cwAABgkBAmFEAQIYbm8gcGF5bWVudHMgYXJlIGV4cGVjdGVkBQNuaWwDCQAAAgUCZlQFAmZUBAJiVwkBAmFLAAQCZ28JAQJiYwAEAmZLCQDZBAEJAJEDAgUCYlcFAXQEAmdwCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJnbwUBQQIKV3Igc3QgYWRkcgQCZ3EJAPwHBAUCZ3ACB3Vuc3Rha2UJAMwIAgkA2AQBBQJmSwkAzAgCBQJndAUDbmlsBQNuaWwDCQAAAgUCZ3EFAmdxBAJndQkBAmZhBgUCZmIFAmZjCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJmSwUCZ3QFA25pbAgFAmRLBmNhbGxlcggFAmRLDG9yaWdpbkNhbGxlcggFAmRLDXRyYW5zYWN0aW9uSWQEAmNHCAUCZ3UCXzEEAmZtCAUCZ3UCXzIJAJQKAgUCY0cFAmZtCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRLARxwdXRPbmVUa25WMldpdGhCb251c1JFQURPTkxZAgJndgJndwQCYVMJAQJhSwAEAmNvCQCRAwIFAmFTBQF1BAJjcAkAkQMCBQJhUwUBdgQCY24JAJEDAgUCYVMFAXQEAmd4CQECZUYEBQJndgUCZ3cCAAIABAJlVQgFAmd4Al8xBAJjRwgFAmd4Al8yBAJjaAgFAmd4Al8zBAJlWggFAmd4Al80CQCUCgIFA25pbAkAlQoDBQJlVQUCY2gFAmVaAmRLAQhhY3RpdmF0ZQICZ3kCZ3oDCQECIT0CCQClCAEIBQJkSwZjYWxsZXIJAKUIAQUCYUYJAAIBAgZkZW5pZWQJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCCQECYWMABQJneQkAzAgCCQELU3RyaW5nRW50cnkCCQECYWQABQJnegUDbmlsAgdzdWNjZXNzAmRLAQRzZXRTAgJnQQJncgMJAQIhPQIJAKUIAQgFAmRLBmNhbGxlcgkBAmF6AgUEdGhpcwkBAmFmAAUCZngJAMwIAgkBC1N0cmluZ0VudHJ5AgUCZ0EFAmdyBQNuaWwCZEsBBHNldEkCAmdBAmdyAwkBAiE9AgkApQgBCAUCZEsGY2FsbGVyCQECYXoCBQR0aGlzCQECYWYABQJmeAkAzAgCCQEMSW50ZWdlckVudHJ5AgUCZ0EFAmdyBQNuaWwCZEsBHGdldFBvb2xDb25maWdXcmFwcGVyUkVBRE9OTFkACQCUCgIFA25pbAkBAmFLAAJkSwEcZ2V0QWNjQmFsYW5jZVdyYXBwZXJSRUFET05MWQECYnkJAJQKAgUDbmlsCQECYngBBQJieQJkSwEZY2FsY1ByaWNlc1dyYXBwZXJSRUFET05MWQMCYlECYlICYlYEAmdCCQECYlUDBQJiUQUCYlIFAmJWCQCUCgIFA25pbAkAzAgCCQCmAwEJAJEDAgUCZ0IAAAkAzAgCCQCmAwEJAJEDAgUCZ0IAAQkAzAgCCQCmAwEJAJEDAgUCZ0IAAgUDbmlsAmRLARZmcm9tWDE4V3JhcHBlclJFQURPTkxZAgFKAmdDCQCUCgIFA25pbAkBAUkCCQCnAwEFAUoFAmdDAmRLARR0b1gxOFdyYXBwZXJSRUFET05MWQIBRwFICQCUCgIFA25pbAkApgMBCQEBRgIFAUcFAUgCZEsBHmNhbGNQcmljZUJpZ0ludFdyYXBwZXJSRUFET05MWQICYkECYkIJAJQKAgUDbmlsCQCmAwEJAQJiegIJAKcDAQUCYkEJAKcDAQUCYkICZEsBI2VzdGltYXRlUHV0T3BlcmF0aW9uV3JhcHBlclJFQURPTkxZCQJjagJiRgJjSQJjSgJjSwJjTAJnRAJjTQJjTgkAlAoCBQNuaWwJAQJjSA0FAmNqBQJiRgUCY0kFAmNKBQJjSwUCY0wFAmdEBQJjTQUCY04GBwAAAgACZEsBI2VzdGltYXRlR2V0T3BlcmF0aW9uV3JhcHBlclJFQURPTkxZBAJjagJnRQJjbAJnRAQCZGMJAQJjaQQFAmNqBQJnRQUCY2wJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAmdECQCUCgIFA25pbAkAnAoKCAUCZGMCXzEIBQJkYwJfMggFAmRjAl8zCAUCZGMCXzQIBQJkYwJfNQgFAmRjAl82CAUCZGMCXzcJAKYDAQgFAmRjAl84CAUCZGMCXzkIBQJkYwNfMTACZEsBDmdldEZlZVJFQURPTkxZAAkAlAoCBQNuaWwFAmFoAQJnRgECZ0cABAJnSAQCYXgJAQJmdgADCQABAgUCYXgCCkJ5dGVWZWN0b3IEAmZ6BQJheAUCZnoDCQABAgUCYXgCBFVuaXQIBQJnRg9zZW5kZXJQdWJsaWNLZXkJAAIBAgtNYXRjaCBlcnJvcgQCYXgFAmdGAwkAAQIFAmF4AgVPcmRlcgQCZHgFAmF4BAJnSQkBAmFJAAQCZ0oJAQJkdwEFAmR4BAJnSwkA9AMDCAUCZHgJYm9keUJ5dGVzCQCRAwIIBQJkeAZwcm9vZnMAAAgFAmR4D3NlbmRlclB1YmxpY0tleQQCZ0wJAPQDAwgFAmR4CWJvZHlCeXRlcwkAkQMCCAUCZHgGcHJvb2ZzAAEFAmdJAwMDBQJnSgUCZ0sHBQJnTAcGCQECYXMDBQJnSgUCZ0sFAmdMAwkAAQIFAmF4AhRTZXRTY3JpcHRUcmFuc2FjdGlvbgQCZFgFAmF4BAJnTQkA9gMBCQEFdmFsdWUBCAUCZFgGc2NyaXB0BAJnTgkA2wQBCQEFdmFsdWUBCQCdCAIFAmFGCQECYXEABAJnTwkA8QcBBQR0aGlzAwMJAAACBQJnTgUCZ00JAQIhPQIFAmdPBQJnTQcGCQD0AwMIBQJnRglib2R5Qnl0ZXMJAJEDAggFAmdGBnByb29mcwAABQJnSAkA9AMDCAUCZ0YJYm9keUJ5dGVzCQCRAwIIBQJnRgZwcm9vZnMAAAUCZ0hR6B3l", "chainId": 84, "height": 2289237, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: FgM3ezdhstFi285JGvisMw8fcvqvuyRF1ZASEHKsryiv Next: FUGdRnQdaJyTq9WQVsazAiTpM76LmufrCphiaoZupgon Diff:
OldNewDifferences
1616 let big2 = toBigInt(2)
1717
1818 let slippage4D = toBigInt((scale8 - ((scale8 * 1) / scale8)))
19+
20+let wavesString = "WAVES"
1921
2022 let Amult = "100"
2123
155157 func intf (addr,key) = valueOrErrorMessage(getInteger(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
156158
157159
160+func throwErr (msg) = throw(makeString(["lp_stable.ride:", msg], " "))
161+
162+
158163 let fca = addressFromStringValue(strf(this, fc()))
159164
160165 let A = strf(this, amp())
175180 split(strf(fca, pc(toString(iAmtAs), toString(iPriceAs))), SEP)
176181 }
177182
183+
184+func parseAssetId (input) = if ((input == wavesString))
185+ then unit
186+ else fromBase58String(input)
187+
188+
189+func assetIdToString (input) = if ((input == unit))
190+ then wavesString
191+ else toBase58String(value(input))
192+
193+
194+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]))
195+
196+
197+let poolConfigParsed = parsePoolConfig(gpc())
198+
199+let $t068297015 = poolConfigParsed
200+
201+let cfgPoolAddress = $t068297015._1
202+
203+let cfgPoolStatus = $t068297015._2
204+
205+let cfgLpAssetId = $t068297015._3
206+
207+let cfgAmountAssetId = $t068297015._4
208+
209+let cfgPriceAssetId = $t068297015._5
210+
211+let cfgAmountAssetDecimals = $t068297015._6
212+
213+let cfgPriceAssetDecimals = $t068297015._7
178214
179215 func gfc () = split(strf(fca, fcfg()), SEP)
180216
369405 else calcLpAmt
370406 let amDiff = (inAmAmt - calcAmAssetPmt)
371407 let prDiff = (inPrAmt - calcPrAssetPmt)
372- let $t01650916854 = if (if (isOneAsset)
408+ let $t01744617791 = if (if (isOneAsset)
373409 then (pmtId == amIdStr)
374410 else false)
375411 then $Tuple2(pmtAmt, 0)
378414 else false)
379415 then $Tuple2(0, pmtAmt)
380416 else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
381- let writeAmAmt = $t01650916854._1
382- let writePrAmt = $t01650916854._2
417+ let writeAmAmt = $t01744617791._1
418+ let writePrAmt = $t01744617791._2
383419 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))]
384420 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
385421 }
479515 let ann_aPrecision = (ann - aPrecision)
480516 let n1 = (n + big1)
481517 func calc (acc,cur) = {
482- let $t02140621426 = acc
483- let d = $t02140621426._1
484- let found = $t02140621426._2
518+ let $t02234322363 = acc
519+ let d = $t02234322363._1
520+ let found = $t02234322363._2
485521 if ((found != unit))
486522 then acc
487523 else {
495531 }
496532
497533 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
498- let $t02184721894 = {
534+ let $t02278422831 = {
499535 let $l = arr
500536 let $s = size($l)
501537 let $acc0 = $Tuple2(s, unit)
509545
510546 $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)
511547 }
512- let d = $t02184721894._1
513- let found = $t02184721894._2
548+ let d = $t02278422831._1
549+ let found = $t02278422831._2
514550 if ((found != unit))
515551 then d
516552 else throw(("D calculation error, D = " + toString(d)))
530566 let c = (((((D * D) / (x * n)) * D) * aPrecision) / (ann * n))
531567 let b = ((s + ((D * aPrecision) / ann)) - D)
532568 func calc (acc,cur) = {
533- let $t02239422414 = acc
534- let y = $t02239422414._1
535- let found = $t02239422414._2
569+ let $t02333123351 = acc
570+ let y = $t02333123351._1
571+ let found = $t02333123351._2
536572 if ((found != unit))
537573 then acc
538574 else {
545581 }
546582
547583 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
548- let $t02272122768 = {
584+ let $t02365823705 = {
549585 let $l = arr
550586 let $s = size($l)
551587 let $acc0 = $Tuple2(D, unit)
559595
560596 $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)
561597 }
562- let y = $t02272122768._1
563- let found = $t02272122768._2
598+ let y = $t02365823705._1
599+ let found = $t02365823705._2
564600 if ((found != unit))
565601 then y
566602 else throw(("Y calculation error, Y = " + toString(y)))
582618 then {
583619 let amBalance = getAccBalance(amId)
584620 let prBalance = getAccBalance(prId)
585- let $t02352723989 = if ((txId == ""))
621+ let $t02446424926 = if ((txId == ""))
586622 then $Tuple2(amBalance, prBalance)
587623 else if ((pmtAssetId == amId))
588624 then if ((pmtAmtRaw > amBalance))
593629 then throw("invalid payment amount")
594630 else $Tuple2(amBalance, (prBalance - pmtAmtRaw))
595631 else throw("wrong pmtAssetId")
596- let amBalanceOld = $t02352723989._1
597- let prBalanceOld = $t02352723989._2
598- let $t02399524171 = if ((pmtAssetId == amId))
632+ let amBalanceOld = $t02446424926._1
633+ let prBalanceOld = $t02446424926._2
634+ let $t02493225108 = if ((pmtAssetId == amId))
599635 then $Tuple2(pmtAmtRaw, 0)
600636 else if ((pmtAssetId == prId))
601637 then $Tuple2(0, pmtAmtRaw)
602638 else throw("invalid payment")
603- let amAmountRaw = $t02399524171._1
604- let prAmountRaw = $t02399524171._2
639+ let amAmountRaw = $t02493225108._1
640+ let prAmountRaw = $t02493225108._2
605641 let amAmount = takeFee(amAmountRaw)._1
606642 let prAmount = takeFee(prAmountRaw)._1
607643 let feeAmount = takeFee(pmtAmtRaw)._2
630666 }
631667
632668
633-func getOneTknV2Internal (outAssetId,minOutAmount,payments,caller,originCaller,transactionId) = if ((size(payments) != 1))
634- then throw("1 pmnt expd")
635- else {
636- let poolConfig = gpc()
637- let lpId = poolConfig[idxLPAsId]
638- let amId = poolConfig[idxAmAsId]
639- let prId = poolConfig[idxPrAsId]
640- let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
641- let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
642- let poolStatus = poolConfig[idxPoolSt]
643- let userAddress = if ((caller == restContract))
644- then originCaller
645- else caller
646- let pmt = value(payments[0])
647- let pmtAssetId = value(pmt.assetId)
648- let pmtAmt = pmt.amount
649- let txId58 = toBase58String(transactionId)
650- if ((lpId != toBase58String(pmtAssetId)))
651- then throw("Wrong LP")
652- else {
653- let amBalance = getAccBalance(amId)
654- let prBalance = getAccBalance(prId)
655- let $t02635826466 = {
656- let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)
657- if ($isInstanceOf(@, "(Int, Int)"))
658- then @
659- else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
669+func getOneTknV2Internal (outAssetId,minOutAmount,payments,caller,originCaller,transactionId) = {
670+ let poolConfig = gpc()
671+ let lpId = poolConfig[idxLPAsId]
672+ let amId = poolConfig[idxAmAsId]
673+ let prId = poolConfig[idxPrAsId]
674+ let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
675+ let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
676+ let poolStatus = poolConfig[idxPoolSt]
677+ let userAddress = if ((caller == restContract))
678+ then originCaller
679+ else caller
680+ let pmt = value(payments[0])
681+ let pmtAssetId = value(pmt.assetId)
682+ let pmtAmt = pmt.amount
683+ let txId58 = toBase58String(transactionId)
684+ if ((lpId != toBase58String(pmtAssetId)))
685+ then throw("Wrong LP")
686+ else {
687+ let amBalance = getAccBalance(amId)
688+ let prBalance = getAccBalance(prId)
689+ let $t02723627344 = {
690+ let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)
691+ if ($isInstanceOf(@, "(Int, Int)"))
692+ then @
693+ else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
694+ }
695+ let totalGet = $t02723627344._1
696+ let feeAmount = $t02723627344._2
697+ let totalAmount = if (if ((minOutAmount > 0))
698+ then (minOutAmount > totalGet)
699+ else false)
700+ then throw(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
701+ else totalGet
702+ let $t02753127838 = if ((outAssetId == amId))
703+ then $Tuple4(totalAmount, 0, ((amBalance - totalAmount) - feeAmount), prBalance)
704+ else if ((outAssetId == prId))
705+ then $Tuple4(0, totalAmount, amBalance, ((prBalance - totalAmount) - feeAmount))
706+ else throw("invalid out asset id")
707+ let outAm = $t02753127838._1
708+ let outPr = $t02753127838._2
709+ let amBalanceNew = $t02753127838._3
710+ let prBalanceNew = $t02753127838._4
711+ let curPrX18 = cpbi(t1(prBalanceNew, prDecimals), t1(amBalanceNew, amDecimals))
712+ let curPr = f1(curPrX18, scale8)
713+ let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
714+ then unit
715+ else fromBase58String(outAssetId)
716+ let sendFeeToMatcher = if ((feeAmount > 0))
717+ then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetIdOrWaves)]
718+ else nil
719+ 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)
720+ if ((state == state))
721+ then {
722+ let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
723+ if ((burn == burn))
724+ then $Tuple2(state, totalAmount)
725+ else throw("Strict value is not equal to itself.")
660726 }
661- let totalGet = $t02635826466._1
662- let feeAmount = $t02635826466._2
663- let totalAmount = if (if ((minOutAmount > 0))
664- then (minOutAmount > totalGet)
665- else false)
666- then throw(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
667- else totalGet
668- let $t02665326960 = if ((outAssetId == amId))
669- then $Tuple4(totalAmount, 0, ((amBalance - totalAmount) - feeAmount), prBalance)
670- else if ((outAssetId == prId))
671- then $Tuple4(0, totalAmount, amBalance, ((prBalance - totalAmount) - feeAmount))
672- else throw("invalid out asset id")
673- let outAm = $t02665326960._1
674- let outPr = $t02665326960._2
675- let amBalanceNew = $t02665326960._3
676- let prBalanceNew = $t02665326960._4
677- let curPrX18 = cpbi(t1(prBalanceNew, prDecimals), t1(amBalanceNew, amDecimals))
678- let curPr = f1(curPrX18, scale8)
679- let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
680- then unit
681- else fromBase58String(outAssetId)
682- let sendFeeToMatcher = if ((feeAmount > 0))
683- then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetIdOrWaves)]
684- else nil
685- 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)
686- if ((state == state))
687- then {
688- let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
689- if ((burn == burn))
690- then $Tuple2(state, totalAmount)
691- else throw("Strict value is not equal to itself.")
692- }
693- else throw("Strict value is not equal to itself.")
694- }
695- }
727+ else throw("Strict value is not equal to itself.")
728+ }
729+ }
696730
697731
698732 func m () = match getString(mpk()) {
838872
839873
840874 @Callable(i)
841-func putOneTknV2 (minOutAmount,autoStake) = if ((size(i.payments) != 1))
842- then throw("1 pmnt expd")
843- else {
844- let poolConfig = gpc()
845- let amId = poolConfig[idxAmAsId]
846- let prId = poolConfig[idxPrAsId]
847- let lpId = fromBase58String(poolConfig[idxLPAsId])
848- let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
849- let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
850- let userAddress = if ((i.caller == this))
851- then i.originCaller
852- else i.caller
853- let pmt = value(i.payments[0])
854- let pmtAssetId = toBase58String(value(pmt.assetId))
855- let pmtAmt = pmt.amount
856- let $t03177431899 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId))
857- let estimLP = $t03177431899._1
858- let state = $t03177431899._2
859- let feeAmount = $t03177431899._3
860- let emitLpAmt = if (if ((minOutAmount > 0))
861- then (minOutAmount > estimLP)
862- else false)
863- then throw(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
864- else estimLP
865- let e = invoke(fca, "emit", [emitLpAmt], nil)
866- if ((e == e))
867- then {
868- let el = match e {
869- case legacy: Address =>
870- invoke(legacy, "emit", [emitLpAmt], nil)
871- case _ =>
872- unit
873- }
874- if ((el == el))
875- then {
876- let lpTrnsfr = if (autoStake)
877- then {
878- let ss = invoke(stakingContract, "stake", nil, [AttachedPayment(lpId, emitLpAmt)])
879- if ((ss == ss))
880- then nil
881- else throw("Strict value is not equal to itself.")
882- }
883- else [ScriptTransfer(i.caller, emitLpAmt, lpId)]
884- let sendFeeToMatcher = if ((feeAmount > 0))
885- then [ScriptTransfer(feeCollectorAddress, feeAmount, fromBase58String(pmtAssetId))]
886- else nil
887- $Tuple2(((state ++ lpTrnsfr) ++ sendFeeToMatcher), emitLpAmt)
888- }
889- else throw("Strict value is not equal to itself.")
890- }
891- else throw("Strict value is not equal to itself.")
875+func putOneTknV2 (minOutAmount,autoStake) = {
876+ let isPoolOneTokenOperationsDisabled = {
877+ let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
878+ if ($isInstanceOf(@, "Boolean"))
879+ then @
880+ else throw(($getType(@) + " couldn't be cast to Boolean"))
892881 }
882+ let isPutDisabled = if (if (if (igs())
883+ then true
884+ else (cfgPoolStatus == PoolPutDis))
885+ then true
886+ else (cfgPoolStatus == PoolShutdown))
887+ then true
888+ else isPoolOneTokenOperationsDisabled
889+ let checks = [if (!(isPutDisabled))
890+ then true
891+ else throwErr("put operation is blocked by admin"), if ((size(i.payments) == 1))
892+ then true
893+ else throwErr("exactly 1 payment are expected")]
894+ if ((checks == checks))
895+ then {
896+ let poolConfig = gpc()
897+ let amId = poolConfig[idxAmAsId]
898+ let prId = poolConfig[idxPrAsId]
899+ let lpId = fromBase58String(poolConfig[idxLPAsId])
900+ let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
901+ let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
902+ let userAddress = if ((i.caller == this))
903+ then i.originCaller
904+ else i.caller
905+ let pmt = value(i.payments[0])
906+ let pmtAssetId = toBase58String(value(pmt.assetId))
907+ let pmtAmt = pmt.amount
908+ let $t03302433149 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId))
909+ let estimLP = $t03302433149._1
910+ let state = $t03302433149._2
911+ let feeAmount = $t03302433149._3
912+ let emitLpAmt = if (if ((minOutAmount > 0))
913+ then (minOutAmount > estimLP)
914+ else false)
915+ then throw(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
916+ else estimLP
917+ let e = invoke(fca, "emit", [emitLpAmt], nil)
918+ if ((e == e))
919+ then {
920+ let el = match e {
921+ case legacy: Address =>
922+ invoke(legacy, "emit", [emitLpAmt], nil)
923+ case _ =>
924+ unit
925+ }
926+ if ((el == el))
927+ then {
928+ let lpTrnsfr = if (autoStake)
929+ then {
930+ let ss = invoke(stakingContract, "stake", nil, [AttachedPayment(lpId, emitLpAmt)])
931+ if ((ss == ss))
932+ then nil
933+ else throw("Strict value is not equal to itself.")
934+ }
935+ else [ScriptTransfer(i.caller, emitLpAmt, lpId)]
936+ let sendFeeToMatcher = if ((feeAmount > 0))
937+ then [ScriptTransfer(feeCollectorAddress, feeAmount, fromBase58String(pmtAssetId))]
938+ else nil
939+ $Tuple2(((state ++ lpTrnsfr) ++ sendFeeToMatcher), emitLpAmt)
940+ }
941+ else throw("Strict value is not equal to itself.")
942+ }
943+ else throw("Strict value is not equal to itself.")
944+ }
945+ else throw("Strict value is not equal to itself.")
946+ }
893947
894948
895949
923977
924978 @Callable(i)
925979 func getOneTknV2 (outAssetId,minOutAmount) = {
926- let $t03408234237 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
927- let state = $t03408234237._1
928- let totalAmount = $t03408234237._2
929- $Tuple2(state, totalAmount)
980+ let isPoolOneTokenOperationsDisabled = {
981+ let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
982+ if ($isInstanceOf(@, "Boolean"))
983+ then @
984+ else throw(($getType(@) + " couldn't be cast to Boolean"))
985+ }
986+ let isGetDisabled = if (if (igs())
987+ then true
988+ else (cfgPoolStatus == PoolShutdown))
989+ then true
990+ else isPoolOneTokenOperationsDisabled
991+ let checks = [if (!(isGetDisabled))
992+ then true
993+ else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 1))
994+ then true
995+ else throwErr("exactly 1 payment are expected")]
996+ if ((checks == checks))
997+ then {
998+ let $t03573535890 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
999+ let state = $t03573535890._1
1000+ let totalAmount = $t03573535890._2
1001+ $Tuple2(state, totalAmount)
1002+ }
1003+ else throw("Strict value is not equal to itself.")
9301004 }
9311005
9321006
9491023 let newY = getYD(xp, index, D1)
9501024 let dy = (xp[index] - newY)
9511025 let totalGetRaw = max([0, toInt((dy - big1))])
952- let $t03502735076 = takeFee(totalGetRaw)
953- let totalGet = $t03502735076._1
954- let feeAmount = $t03502735076._2
1026+ let $t03668036729 = takeFee(totalGetRaw)
1027+ let totalGet = $t03668036729._1
1028+ let feeAmount = $t03668036729._2
9551029 $Tuple2(nil, $Tuple2(totalGet, feeAmount))
9561030 }
9571031
9651039 let lpId = poolConfig[idxLPAsId]
9661040 let amBalance = getAccBalance(amId)
9671041 let prBalance = getAccBalance(prId)
968- let $t03542135536 = {
1042+ let $t03707437189 = {
9691043 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)
9701044 if ($isInstanceOf(@, "(Int, Int)"))
9711045 then @
9721046 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
9731047 }
974- let totalGet = $t03542135536._1
975- let feeAmount = $t03542135536._2
1048+ let totalGet = $t03707437189._1
1049+ let feeAmount = $t03707437189._2
9761050 let r = ego("", lpId, lpAssetAmount, this)
9771051 let outAmAmt = r._1
9781052 let outPrAmt = r._2
10491123
10501124 @Callable(i)
10511125 func unstakeAndGetOneTknV2 (unstakeAmount,outAssetId,minOutAmount) = {
1052- let checkPayments = if ((size(i.payments) != 0))
1053- then throw("No pmnts expd")
1054- else true
1055- if ((checkPayments == checkPayments))
1126+ let isPoolOneTokenOperationsDisabled = {
1127+ let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
1128+ if ($isInstanceOf(@, "Boolean"))
1129+ then @
1130+ else throw(($getType(@) + " couldn't be cast to Boolean"))
1131+ }
1132+ let isGetDisabled = if (if (igs())
1133+ then true
1134+ else (cfgPoolStatus == PoolShutdown))
1135+ then true
1136+ else isPoolOneTokenOperationsDisabled
1137+ let checks = [if (!(isGetDisabled))
1138+ then true
1139+ else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 0))
1140+ then true
1141+ else throwErr("no payments are expected")]
1142+ if ((checks == checks))
10561143 then {
10571144 let cfg = gpc()
10581145 let factoryCfg = gfc()
10611148 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), unstakeAmount], nil)
10621149 if ((unstakeInv == unstakeInv))
10631150 then {
1064- let $t03796338151 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1065- let state = $t03796338151._1
1066- let totalAmount = $t03796338151._2
1151+ let $t03992140109 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1152+ let state = $t03992140109._1
1153+ let totalAmount = $t03992140109._2
10671154 $Tuple2(state, totalAmount)
10681155 }
10691156 else throw("Strict value is not equal to itself.")
10791166 let amId = poolConfig[idxAmAsId]
10801167 let prId = poolConfig[idxPrAsId]
10811168 let lpId = poolConfig[idxLPAsId]
1082- let $t03841038507 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "")
1083- let lpAmount = $t03841038507._1
1084- let state = $t03841038507._2
1085- let feeAmount = $t03841038507._3
1086- let bonus = $t03841038507._4
1169+ let $t04036840465 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "")
1170+ let lpAmount = $t04036840465._1
1171+ let state = $t04036840465._2
1172+ let feeAmount = $t04036840465._3
1173+ let bonus = $t04036840465._4
10871174 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
10881175 }
10891176
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)))
19+
20+let wavesString = "WAVES"
1921
2022 let Amult = "100"
2123
2224 let Dconv = "1"
2325
2426 let SEP = "__"
2527
2628 let EMPTY = ""
2729
2830 let PoolActive = 1
2931
3032 let PoolPutDis = 2
3133
3234 let PoolMatcherDis = 3
3335
3436 let PoolShutdown = 4
3537
3638 let idxPoolAddress = 1
3739
3840 let idxPoolSt = 2
3941
4042 let idxLPAsId = 3
4143
4244 let idxAmAsId = 4
4345
4446 let idxPrAsId = 5
4547
4648 let idxAmtAsDcm = 6
4749
4850 let idxPriceAsDcm = 7
4951
5052 let idxIAmtAsId = 8
5153
5254 let idxIPriceAsId = 9
5355
5456 let idxFactStakCntr = 1
5557
5658 let idxFactoryRestCntr = 6
5759
5860 let idxFactSlippCntr = 7
5961
6062 let idxFactGwxRewCntr = 10
6163
6264 let feeDefault = fraction(5, scale8, 10000)
6365
6466 func t1 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
6567
6668
6769 func f1 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
6870
6971
7072 func ts (amt,resScale,curScale) = fraction(amt, resScale, curScale)
7173
7274
7375 func abs (val) = if ((zeroBigInt > val))
7476 then -(val)
7577 else val
7678
7779
7880 func absBigInt (val) = if ((zeroBigInt > val))
7981 then -(val)
8082 else val
8183
8284
8385 func fc () = "%s__factoryContract"
8486
8587
8688 func mpk () = "%s__managerPublicKey"
8789
8890
8991 func pmpk () = "%s__pendingManagerPublicKey"
9092
9193
9294 func pl () = "%s%s__price__last"
9395
9496
9597 func ph (h,t) = makeString(["%s%s%d%d__price__history", toString(h), toString(t)], SEP)
9698
9799
98100 func pau (ua,txId) = ((("%s%s%s__P__" + ua) + "__") + txId)
99101
100102
101103 func gau (ua,txId) = ((("%s%s%s__G__" + ua) + "__") + txId)
102104
103105
104106 func aa () = "%s__amountAsset"
105107
106108
107109 func pa () = "%s__priceAsset"
108110
109111
110112 func amp () = "%s__amp"
111113
112114
113115 func ada () = "%s__addonAddr"
114116
115117
116118 let keyFee = "%s__fee"
117119
118120 let fee = valueOrElse(getInteger(this, keyFee), feeDefault)
119121
120122 func fcfg () = "%s__factoryConfig"
121123
122124
123125 func mtpk () = "%s%s__matcher__publicKey"
124126
125127
126128 func pc (iAmtAs,iPrAs) = (((("%d%d%s__" + iAmtAs) + "__") + iPrAs) + "__config")
127129
128130
129131 func mba (bAStr) = ("%s%s%s__mappings__baseAsset2internalId__" + bAStr)
130132
131133
132134 func aps () = "%s__shutdown"
133135
134136
135137 func keyAllowedLpStableScriptHash () = "%s__allowedLpStableScriptHash"
136138
137139
138140 func keyFeeCollectorAddress () = "%s__feeCollectorAddress"
139141
140142
141143 func toe (orV,sendrV,matchV) = throw(((((("Failed: ordValid=" + toString(orV)) + " sndrValid=") + toString(sendrV)) + " mtchrValid=") + toString(matchV)))
142144
143145
144146 func str (val) = match val {
145147 case valStr: String =>
146148 valStr
147149 case _ =>
148150 throw("fail cast to String")
149151 }
150152
151153
152154 func strf (addr,key) = valueOrErrorMessage(getString(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
153155
154156
155157 func intf (addr,key) = valueOrErrorMessage(getInteger(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
156158
157159
160+func throwErr (msg) = throw(makeString(["lp_stable.ride:", msg], " "))
161+
162+
158163 let fca = addressFromStringValue(strf(this, fc()))
159164
160165 let A = strf(this, amp())
161166
162167 func igs () = valueOrElse(getBoolean(fca, aps()), false)
163168
164169
165170 func mp () = fromBase58String(strf(fca, mtpk()))
166171
167172
168173 let feeCollectorAddress = addressFromStringValue(strf(fca, keyFeeCollectorAddress()))
169174
170175 func gpc () = {
171176 let amtAs = strf(this, aa())
172177 let priceAs = strf(this, pa())
173178 let iPriceAs = intf(fca, mba(priceAs))
174179 let iAmtAs = intf(fca, mba(amtAs))
175180 split(strf(fca, pc(toString(iAmtAs), toString(iPriceAs))), SEP)
176181 }
177182
183+
184+func parseAssetId (input) = if ((input == wavesString))
185+ then unit
186+ else fromBase58String(input)
187+
188+
189+func assetIdToString (input) = if ((input == unit))
190+ then wavesString
191+ else toBase58String(value(input))
192+
193+
194+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]))
195+
196+
197+let poolConfigParsed = parsePoolConfig(gpc())
198+
199+let $t068297015 = poolConfigParsed
200+
201+let cfgPoolAddress = $t068297015._1
202+
203+let cfgPoolStatus = $t068297015._2
204+
205+let cfgLpAssetId = $t068297015._3
206+
207+let cfgAmountAssetId = $t068297015._4
208+
209+let cfgPriceAssetId = $t068297015._5
210+
211+let cfgAmountAssetDecimals = $t068297015._6
212+
213+let cfgPriceAssetDecimals = $t068297015._7
178214
179215 func gfc () = split(strf(fca, fcfg()), SEP)
180216
181217
182218 let factoryConfig = gfc()
183219
184220 let stakingContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactStakCntr]), "Invalid staking contract address")
185221
186222 let slipageContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactSlippCntr]), "Invalid slipage contract address")
187223
188224 let gwxContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactGwxRewCntr]), "Invalid gwx contract address")
189225
190226 let restContract = valueOrErrorMessage(addressFromString(factoryConfig[idxFactoryRestCntr]), "Invalid gwx contract address")
191227
192228 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)
193229
194230
195231 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)
196232
197233
198234 func getAccBalance (assetId) = if ((assetId == "WAVES"))
199235 then wavesBalance(this).available
200236 else assetBalance(this, fromBase58String(assetId))
201237
202238
203239 func cpbi (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
204240
205241
206242 func vad (A1,A2,slippage) = {
207243 let diff = fraction((A1 - A2), scale8BigInt, A2)
208244 let pass = ((slippage - abs(diff)) > zeroBigInt)
209245 if (!(pass))
210246 then throw(("Big slpg: " + toString(diff)))
211247 else $Tuple2(pass, min([A1, A2]))
212248 }
213249
214250
215251 func vd (D1,D0,slpg) = {
216252 let diff = fraction(D0, scale8BigInt, D1)
217253 let fail = (slpg > diff)
218254 if (if (fail)
219255 then true
220256 else (D0 > D1))
221257 then throw(((((((toString(D0) + " ") + toString(D1)) + " ") + toString(diff)) + " ") + toString(slpg)))
222258 else fail
223259 }
224260
225261
226262 func pcp (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
227263 let amtAsAmtX18 = t1(amAmt, amAssetDcm)
228264 let prAsAmtX18 = t1(prAmt, prAssetDcm)
229265 cpbi(prAsAmtX18, amtAsAmtX18)
230266 }
231267
232268
233269 func calcPrices (amAmt,prAmt,lpAmt) = {
234270 let cfg = gpc()
235271 let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
236272 let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
237273 let priceX18 = pcp(amtAsDcm, prAsDcm, amAmt, prAmt)
238274 let amAmtX18 = t1(amAmt, amtAsDcm)
239275 let prAmtX18 = t1(prAmt, prAsDcm)
240276 let lpAmtX18 = t1(lpAmt, scale8)
241277 let lpPrInAmAsX18 = cpbi(amAmtX18, lpAmtX18)
242278 let lpPrInPrAsX18 = cpbi(prAmtX18, lpAmtX18)
243279 [priceX18, lpPrInAmAsX18, lpPrInPrAsX18]
244280 }
245281
246282
247283 func calculatePrices (amAmt,prAmt,lpAmt) = {
248284 let p = calcPrices(amAmt, prAmt, lpAmt)
249285 [f1(p[0], scale8), f1(p[1], scale8), f1(p[2], scale8)]
250286 }
251287
252288
253289 func takeFee (amount) = {
254290 let feeAmount = fraction(amount, fee, scale8)
255291 $Tuple2((amount - feeAmount), feeAmount)
256292 }
257293
258294
259295 func ego (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
260296 let cfg = gpc()
261297 let lpId = cfg[idxLPAsId]
262298 let amId = cfg[idxAmAsId]
263299 let prId = cfg[idxPrAsId]
264300 let amDcm = parseIntValue(cfg[idxAmtAsDcm])
265301 let prDcm = parseIntValue(cfg[idxPriceAsDcm])
266302 let sts = cfg[idxPoolSt]
267303 let lpEmiss = valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "Wrong LP id").quantity
268304 if ((lpId != pmtAssetId))
269305 then throw("Wrong pmt asset")
270306 else {
271307 let amBalance = getAccBalance(amId)
272308 let amBalanceX18 = t1(amBalance, amDcm)
273309 let prBalance = getAccBalance(prId)
274310 let prBalanceX18 = t1(prBalance, prDcm)
275311 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
276312 let curPrice = f1(curPriceX18, scale8)
277313 let pmtLpAmtX18 = t1(pmtLpAmt, scale8)
278314 let lpEmissX18 = t1(lpEmiss, scale8)
279315 let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissX18)
280316 let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissX18)
281317 let outAmAmt = f1(outAmAmtX18, amDcm)
282318 let outPrAmt = f1(outPrAmtX18, prDcm)
283319 let state = if ((txId58 == ""))
284320 then nil
285321 else [ScriptTransfer(userAddress, outAmAmt, if ((amId == "WAVES"))
286322 then unit
287323 else fromBase58String(amId)), ScriptTransfer(userAddress, outPrAmt, if ((prId == "WAVES"))
288324 then unit
289325 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)]
290326 $Tuple10(outAmAmt, outPrAmt, amId, prId, amBalance, prBalance, lpEmiss, curPriceX18, sts, state)
291327 }
292328 }
293329
294330
295331 func epo (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,userAddress,isEval,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
296332 let cfg = gpc()
297333 let lpId = fromBase58String(cfg[idxLPAsId])
298334 let amIdStr = cfg[idxAmAsId]
299335 let prIdStr = cfg[idxPrAsId]
300336 let inAmIdStr = cfg[idxIAmtAsId]
301337 let inPrIdStr = cfg[idxIPriceAsId]
302338 let amtDcm = parseIntValue(cfg[idxAmtAsDcm])
303339 let priceDcm = parseIntValue(cfg[idxPriceAsDcm])
304340 let sts = cfg[idxPoolSt]
305341 let lpEm = valueOrErrorMessage(assetInfo(lpId), "Wr lp as").quantity
306342 let amBalance = if (isEval)
307343 then getAccBalance(amIdStr)
308344 else if (if (isOneAsset)
309345 then (pmtId == amIdStr)
310346 else false)
311347 then (getAccBalance(amIdStr) - pmtAmt)
312348 else if (isOneAsset)
313349 then getAccBalance(amIdStr)
314350 else (getAccBalance(amIdStr) - inAmAmt)
315351 let prBalance = if (isEval)
316352 then getAccBalance(prIdStr)
317353 else if (if (isOneAsset)
318354 then (pmtId == prIdStr)
319355 else false)
320356 then (getAccBalance(prIdStr) - pmtAmt)
321357 else if (isOneAsset)
322358 then getAccBalance(prIdStr)
323359 else (getAccBalance(prIdStr) - inPrAmt)
324360 let inAmAssetAmtX18 = t1(inAmAmt, amtDcm)
325361 let inPrAssetAmtX18 = t1(inPrAmt, priceDcm)
326362 let userPriceX18 = cpbi(inPrAssetAmtX18, inAmAssetAmtX18)
327363 let amBalanceX18 = t1(amBalance, amtDcm)
328364 let prBalanceX18 = t1(prBalance, priceDcm)
329365 let r = if ((lpEm == 0))
330366 then {
331367 let curPriceX18 = zeroBigInt
332368 let slippageX18 = zeroBigInt
333369 let lpAmtX18 = pow((inAmAssetAmtX18 * inPrAssetAmtX18), 0, toBigInt(5), 1, 0, DOWN)
334370 $Tuple5(f1(lpAmtX18, scale8), f1(inAmAssetAmtX18, amtDcm), f1(inPrAssetAmtX18, priceDcm), cpbi((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
335371 }
336372 else {
337373 let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
338374 let slippageRealX18 = fraction(abs((curPriceX18 - userPriceX18)), scale18, curPriceX18)
339375 let slippageX18 = t1(slippage, scale8)
340376 if (if (if (validateSlippage)
341377 then (curPriceX18 != zeroBigInt)
342378 else false)
343379 then (slippageRealX18 > slippageX18)
344380 else false)
345381 then throw(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
346382 else {
347383 let lpEmissionX18 = t1(lpEm, scale8)
348384 let prViaAmX18 = fraction(inAmAssetAmtX18, curPriceX18, scale18)
349385 let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, curPriceX18)
350386 let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
351387 then $Tuple2(amViaPrX18, inPrAssetAmtX18)
352388 else $Tuple2(inAmAssetAmtX18, prViaAmX18)
353389 let expAmtAssetAmtX18 = expectedAmts._1
354390 let expPriceAssetAmtX18 = expectedAmts._2
355391 let lpAmtX18 = fraction(lpEmissionX18, expPriceAssetAmtX18, prBalanceX18)
356392 $Tuple5(f1(lpAmtX18, scale8), f1(expAmtAssetAmtX18, amtDcm), f1(expPriceAssetAmtX18, priceDcm), curPriceX18, slippageX18)
357393 }
358394 }
359395 let calcLpAmt = r._1
360396 let calcAmAssetPmt = r._2
361397 let calcPrAssetPmt = r._3
362398 let curPrice = f1(r._4, scale8)
363399 let slippageCalc = f1(r._5, scale8)
364400 if ((0 >= calcLpAmt))
365401 then throw("LP <= 0")
366402 else {
367403 let emitLpAmt = if (!(emitLp))
368404 then 0
369405 else calcLpAmt
370406 let amDiff = (inAmAmt - calcAmAssetPmt)
371407 let prDiff = (inPrAmt - calcPrAssetPmt)
372- let $t01650916854 = if (if (isOneAsset)
408+ let $t01744617791 = if (if (isOneAsset)
373409 then (pmtId == amIdStr)
374410 else false)
375411 then $Tuple2(pmtAmt, 0)
376412 else if (if (isOneAsset)
377413 then (pmtId == prIdStr)
378414 else false)
379415 then $Tuple2(0, pmtAmt)
380416 else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
381- let writeAmAmt = $t01650916854._1
382- let writePrAmt = $t01650916854._2
417+ let writeAmAmt = $t01744617791._1
418+ let writePrAmt = $t01744617791._2
383419 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))]
384420 $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
385421 }
386422 }
387423
388424
389425 func moa (order) = {
390426 let cfg = gpc()
391427 let amtAsId = cfg[idxAmAsId]
392428 let prAsId = cfg[idxPrAsId]
393429 let sts = parseIntValue(cfg[idxPoolSt])
394430 let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
395431 let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
396432 let accAmtAsBalance = getAccBalance(amtAsId)
397433 let accPrAsBalance = getAccBalance(prAsId)
398434 let curPriceX18 = if ((order.orderType == Buy))
399435 then pcp(amtAsDcm, prAsDcm, (accAmtAsBalance + order.amount), accPrAsBalance)
400436 else pcp(amtAsDcm, prAsDcm, (accAmtAsBalance - order.amount), accPrAsBalance)
401437 let curPrice = f1(curPriceX18, scale8)
402438 if (if (if (igs())
403439 then true
404440 else (sts == PoolMatcherDis))
405441 then true
406442 else (sts == PoolShutdown))
407443 then throw("Admin blocked")
408444 else {
409445 let orAmtAsset = order.assetPair.amountAsset
410446 let orAmtAsStr = if ((orAmtAsset == unit))
411447 then "WAVES"
412448 else toBase58String(value(orAmtAsset))
413449 let orPrAsset = order.assetPair.priceAsset
414450 let orPrAsStr = if ((orPrAsset == unit))
415451 then "WAVES"
416452 else toBase58String(value(orPrAsset))
417453 if (if ((orAmtAsStr != amtAsId))
418454 then true
419455 else (orPrAsStr != prAsId))
420456 then throw("Wr assets")
421457 else {
422458 let orderPrice = order.price
423459 let priceDcm = fraction(scale8, prAsDcm, amtAsDcm)
424460 let castOrderPrice = ts(orderPrice, scale8, priceDcm)
425461 let isOrderPriceValid = if ((order.orderType == Buy))
426462 then (curPrice >= castOrderPrice)
427463 else (castOrderPrice >= curPrice)
428464 true
429465 }
430466 }
431467 }
432468
433469
434470 func cg (i) = if ((size(i.payments) != 1))
435471 then throw("1 pmnt exp")
436472 else {
437473 let pmt = value(i.payments[0])
438474 let pmtAssetId = value(pmt.assetId)
439475 let pmtAmt = pmt.amount
440476 let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
441477 let outAmAmt = r._1
442478 let outPrAmt = r._2
443479 let sts = parseIntValue(r._9)
444480 let state = r._10
445481 if (if (igs())
446482 then true
447483 else (sts == PoolShutdown))
448484 then throw(("Admin blocked: " + toString(sts)))
449485 else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state)
450486 }
451487
452488
453489 func cp (caller,txId,amAsPmt,prAsPmt,slippage,emitLp,isOneAsset,validateSlippage,pmtAmt,pmtId) = {
454490 let r = epo(txId, slippage, value(amAsPmt).amount, value(amAsPmt).assetId, value(prAsPmt).amount, value(prAsPmt).assetId, caller, (txId == ""), emitLp, isOneAsset, validateSlippage, pmtAmt, pmtId)
455491 let sts = parseIntValue(r._8)
456492 if (if (if (igs())
457493 then true
458494 else (sts == PoolPutDis))
459495 then true
460496 else (sts == PoolShutdown))
461497 then throw(("Blocked:" + toString(sts)))
462498 else r
463499 }
464500
465501
466502 func getD (xp) = {
467503 let n = big2
468504 let xp0 = xp[0]
469505 let xp1 = xp[1]
470506 let aPrecision = parseBigIntValue(Amult)
471507 let a = (parseBigIntValue(A) * aPrecision)
472508 let s = (xp0 + xp1)
473509 if ((s == big0))
474510 then big0
475511 else {
476512 let ann = (a * n)
477513 let xp0_xp1_n_n = (((xp0 * xp1) * n) * n)
478514 let ann_s_aPrecision = ((ann * s) / aPrecision)
479515 let ann_aPrecision = (ann - aPrecision)
480516 let n1 = (n + big1)
481517 func calc (acc,cur) = {
482- let $t02140621426 = acc
483- let d = $t02140621426._1
484- let found = $t02140621426._2
518+ let $t02234322363 = acc
519+ let d = $t02234322363._1
520+ let found = $t02234322363._2
485521 if ((found != unit))
486522 then acc
487523 else {
488524 let dp = (((d * d) * d) / xp0_xp1_n_n)
489525 let dNext = (((ann_s_aPrecision + (dp * n)) * d) / (((ann_aPrecision * d) / aPrecision) + (n1 * dp)))
490526 let dDiff = absBigInt((dNext - value(d)))
491527 if ((big1 >= dDiff))
492528 then $Tuple2(dNext, cur)
493529 else $Tuple2(dNext, unit)
494530 }
495531 }
496532
497533 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
498- let $t02184721894 = {
534+ let $t02278422831 = {
499535 let $l = arr
500536 let $s = size($l)
501537 let $acc0 = $Tuple2(s, unit)
502538 func $f0_1 ($a,$i) = if (($i >= $s))
503539 then $a
504540 else calc($a, $l[$i])
505541
506542 func $f0_2 ($a,$i) = if (($i >= $s))
507543 then $a
508544 else throw("List size exceeds 15")
509545
510546 $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)
511547 }
512- let d = $t02184721894._1
513- let found = $t02184721894._2
548+ let d = $t02278422831._1
549+ let found = $t02278422831._2
514550 if ((found != unit))
515551 then d
516552 else throw(("D calculation error, D = " + toString(d)))
517553 }
518554 }
519555
520556
521557 func getYD (xp,i,D) = {
522558 let n = big2
523559 let x = xp[if ((i == 0))
524560 then 1
525561 else 0]
526562 let aPrecision = parseBigIntValue(Amult)
527563 let a = (parseBigIntValue(A) * aPrecision)
528564 let s = x
529565 let ann = (a * n)
530566 let c = (((((D * D) / (x * n)) * D) * aPrecision) / (ann * n))
531567 let b = ((s + ((D * aPrecision) / ann)) - D)
532568 func calc (acc,cur) = {
533- let $t02239422414 = acc
534- let y = $t02239422414._1
535- let found = $t02239422414._2
569+ let $t02333123351 = acc
570+ let y = $t02333123351._1
571+ let found = $t02333123351._2
536572 if ((found != unit))
537573 then acc
538574 else {
539575 let yNext = (((y * y) + c) / ((big2 * y) + b))
540576 let yDiff = absBigInt((yNext - value(y)))
541577 if ((big1 >= yDiff))
542578 then $Tuple2(yNext, cur)
543579 else $Tuple2(yNext, unit)
544580 }
545581 }
546582
547583 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
548- let $t02272122768 = {
584+ let $t02365823705 = {
549585 let $l = arr
550586 let $s = size($l)
551587 let $acc0 = $Tuple2(D, unit)
552588 func $f0_1 ($a,$i) = if (($i >= $s))
553589 then $a
554590 else calc($a, $l[$i])
555591
556592 func $f0_2 ($a,$i) = if (($i >= $s))
557593 then $a
558594 else throw("List size exceeds 15")
559595
560596 $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)
561597 }
562- let y = $t02272122768._1
563- let found = $t02272122768._2
598+ let y = $t02365823705._1
599+ let found = $t02365823705._2
564600 if ((found != unit))
565601 then y
566602 else throw(("Y calculation error, Y = " + toString(y)))
567603 }
568604
569605
570606 func calcPutOneTkn (pmtAmtRaw,pmtAssetId,userAddress,txId) = {
571607 let poolConfig = gpc()
572608 let amId = poolConfig[idxAmAsId]
573609 let prId = poolConfig[idxPrAsId]
574610 let lpId = poolConfig[idxLPAsId]
575611 let amtDcm = parseIntValue(poolConfig[idxAmtAsDcm])
576612 let priceDcm = parseIntValue(poolConfig[idxPriceAsDcm])
577613 let lpAssetEmission = toBigInt(valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "invalid lp asset").quantity)
578614 let chechEmission = if ((lpAssetEmission > big0))
579615 then true
580616 else throw("initial deposit requires all coins")
581617 if ((chechEmission == chechEmission))
582618 then {
583619 let amBalance = getAccBalance(amId)
584620 let prBalance = getAccBalance(prId)
585- let $t02352723989 = if ((txId == ""))
621+ let $t02446424926 = if ((txId == ""))
586622 then $Tuple2(amBalance, prBalance)
587623 else if ((pmtAssetId == amId))
588624 then if ((pmtAmtRaw > amBalance))
589625 then throw("invalid payment amount")
590626 else $Tuple2((amBalance - pmtAmtRaw), prBalance)
591627 else if ((pmtAssetId == prId))
592628 then if ((pmtAmtRaw > prBalance))
593629 then throw("invalid payment amount")
594630 else $Tuple2(amBalance, (prBalance - pmtAmtRaw))
595631 else throw("wrong pmtAssetId")
596- let amBalanceOld = $t02352723989._1
597- let prBalanceOld = $t02352723989._2
598- let $t02399524171 = if ((pmtAssetId == amId))
632+ let amBalanceOld = $t02446424926._1
633+ let prBalanceOld = $t02446424926._2
634+ let $t02493225108 = if ((pmtAssetId == amId))
599635 then $Tuple2(pmtAmtRaw, 0)
600636 else if ((pmtAssetId == prId))
601637 then $Tuple2(0, pmtAmtRaw)
602638 else throw("invalid payment")
603- let amAmountRaw = $t02399524171._1
604- let prAmountRaw = $t02399524171._2
639+ let amAmountRaw = $t02493225108._1
640+ let prAmountRaw = $t02493225108._2
605641 let amAmount = takeFee(amAmountRaw)._1
606642 let prAmount = takeFee(prAmountRaw)._1
607643 let feeAmount = takeFee(pmtAmtRaw)._2
608644 let amBalanceNew = (amBalanceOld + amAmount)
609645 let prBalanceNew = (prBalanceOld + prAmount)
610646 let D0 = getD([toBigInt(amBalanceOld), toBigInt(prBalanceOld)])
611647 let D1 = getD([toBigInt(amBalanceNew), toBigInt(prBalanceNew)])
612648 let checkD = if ((D1 > D0))
613649 then true
614650 else throw()
615651 if ((checkD == checkD))
616652 then {
617653 let lpAmount = fraction(lpAssetEmission, (D1 - D0), D0)
618654 let curPrice = f1(cpbi(t1(prBalanceNew, priceDcm), t1(amBalanceNew, amtDcm)), scale8)
619655 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))]
620656 let poolProportion = fraction(prBalanceOld, scale8, amBalanceOld)
621657 let amountAssetPart = fraction(pmtAmtRaw, scale8, (poolProportion + scale8))
622658 let priceAssetPart = (pmtAmtRaw - amountAssetPart)
623659 let lpAmtBoth = fraction(lpAssetEmission, toBigInt(priceAssetPart), toBigInt(prBalanceOld))
624660 let bonus = toInt(fraction((lpAmount - lpAmtBoth), scale8BigInt, lpAmtBoth))
625661 $Tuple4(toInt(lpAmount), commonState, feeAmount, bonus)
626662 }
627663 else throw("Strict value is not equal to itself.")
628664 }
629665 else throw("Strict value is not equal to itself.")
630666 }
631667
632668
633-func getOneTknV2Internal (outAssetId,minOutAmount,payments,caller,originCaller,transactionId) = if ((size(payments) != 1))
634- then throw("1 pmnt expd")
635- else {
636- let poolConfig = gpc()
637- let lpId = poolConfig[idxLPAsId]
638- let amId = poolConfig[idxAmAsId]
639- let prId = poolConfig[idxPrAsId]
640- let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
641- let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
642- let poolStatus = poolConfig[idxPoolSt]
643- let userAddress = if ((caller == restContract))
644- then originCaller
645- else caller
646- let pmt = value(payments[0])
647- let pmtAssetId = value(pmt.assetId)
648- let pmtAmt = pmt.amount
649- let txId58 = toBase58String(transactionId)
650- if ((lpId != toBase58String(pmtAssetId)))
651- then throw("Wrong LP")
652- else {
653- let amBalance = getAccBalance(amId)
654- let prBalance = getAccBalance(prId)
655- let $t02635826466 = {
656- let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)
657- if ($isInstanceOf(@, "(Int, Int)"))
658- then @
659- else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
669+func getOneTknV2Internal (outAssetId,minOutAmount,payments,caller,originCaller,transactionId) = {
670+ let poolConfig = gpc()
671+ let lpId = poolConfig[idxLPAsId]
672+ let amId = poolConfig[idxAmAsId]
673+ let prId = poolConfig[idxPrAsId]
674+ let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
675+ let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
676+ let poolStatus = poolConfig[idxPoolSt]
677+ let userAddress = if ((caller == restContract))
678+ then originCaller
679+ else caller
680+ let pmt = value(payments[0])
681+ let pmtAssetId = value(pmt.assetId)
682+ let pmtAmt = pmt.amount
683+ let txId58 = toBase58String(transactionId)
684+ if ((lpId != toBase58String(pmtAssetId)))
685+ then throw("Wrong LP")
686+ else {
687+ let amBalance = getAccBalance(amId)
688+ let prBalance = getAccBalance(prId)
689+ let $t02723627344 = {
690+ let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, pmtAmt], nil)
691+ if ($isInstanceOf(@, "(Int, Int)"))
692+ then @
693+ else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
694+ }
695+ let totalGet = $t02723627344._1
696+ let feeAmount = $t02723627344._2
697+ let totalAmount = if (if ((minOutAmount > 0))
698+ then (minOutAmount > totalGet)
699+ else false)
700+ then throw(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
701+ else totalGet
702+ let $t02753127838 = if ((outAssetId == amId))
703+ then $Tuple4(totalAmount, 0, ((amBalance - totalAmount) - feeAmount), prBalance)
704+ else if ((outAssetId == prId))
705+ then $Tuple4(0, totalAmount, amBalance, ((prBalance - totalAmount) - feeAmount))
706+ else throw("invalid out asset id")
707+ let outAm = $t02753127838._1
708+ let outPr = $t02753127838._2
709+ let amBalanceNew = $t02753127838._3
710+ let prBalanceNew = $t02753127838._4
711+ let curPrX18 = cpbi(t1(prBalanceNew, prDecimals), t1(amBalanceNew, amDecimals))
712+ let curPr = f1(curPrX18, scale8)
713+ let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
714+ then unit
715+ else fromBase58String(outAssetId)
716+ let sendFeeToMatcher = if ((feeAmount > 0))
717+ then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetIdOrWaves)]
718+ else nil
719+ 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)
720+ if ((state == state))
721+ then {
722+ let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
723+ if ((burn == burn))
724+ then $Tuple2(state, totalAmount)
725+ else throw("Strict value is not equal to itself.")
660726 }
661- let totalGet = $t02635826466._1
662- let feeAmount = $t02635826466._2
663- let totalAmount = if (if ((minOutAmount > 0))
664- then (minOutAmount > totalGet)
665- else false)
666- then throw(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
667- else totalGet
668- let $t02665326960 = if ((outAssetId == amId))
669- then $Tuple4(totalAmount, 0, ((amBalance - totalAmount) - feeAmount), prBalance)
670- else if ((outAssetId == prId))
671- then $Tuple4(0, totalAmount, amBalance, ((prBalance - totalAmount) - feeAmount))
672- else throw("invalid out asset id")
673- let outAm = $t02665326960._1
674- let outPr = $t02665326960._2
675- let amBalanceNew = $t02665326960._3
676- let prBalanceNew = $t02665326960._4
677- let curPrX18 = cpbi(t1(prBalanceNew, prDecimals), t1(amBalanceNew, amDecimals))
678- let curPr = f1(curPrX18, scale8)
679- let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
680- then unit
681- else fromBase58String(outAssetId)
682- let sendFeeToMatcher = if ((feeAmount > 0))
683- then [ScriptTransfer(feeCollectorAddress, feeAmount, outAssetIdOrWaves)]
684- else nil
685- 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)
686- if ((state == state))
687- then {
688- let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
689- if ((burn == burn))
690- then $Tuple2(state, totalAmount)
691- else throw("Strict value is not equal to itself.")
692- }
693- else throw("Strict value is not equal to itself.")
694- }
695- }
727+ else throw("Strict value is not equal to itself.")
728+ }
729+ }
696730
697731
698732 func m () = match getString(mpk()) {
699733 case s: String =>
700734 fromBase58String(s)
701735 case _: Unit =>
702736 unit
703737 case _ =>
704738 throw("Match error")
705739 }
706740
707741
708742 func pm () = match getString(pmpk()) {
709743 case s: String =>
710744 fromBase58String(s)
711745 case _: Unit =>
712746 unit
713747 case _ =>
714748 throw("Match error")
715749 }
716750
717751
718752 let pd = throw("Permission denied")
719753
720754 func mm (i) = match m() {
721755 case pk: ByteVector =>
722756 if ((i.callerPublicKey == pk))
723757 then true
724758 else pd
725759 case _: Unit =>
726760 if ((i.caller == this))
727761 then true
728762 else pd
729763 case _ =>
730764 throw("Match error")
731765 }
732766
733767
734768 @Callable(i)
735769 func constructor (fc) = {
736770 let c = mm(i)
737771 if ((c == c))
738772 then [StringEntry(fc(), fc)]
739773 else throw("Strict value is not equal to itself.")
740774 }
741775
742776
743777
744778 @Callable(i)
745779 func setManager (pendingManagerPublicKey) = {
746780 let c = mm(i)
747781 if ((c == c))
748782 then {
749783 let cm = fromBase58String(pendingManagerPublicKey)
750784 if ((cm == cm))
751785 then [StringEntry(pmpk(), pendingManagerPublicKey)]
752786 else throw("Strict value is not equal to itself.")
753787 }
754788 else throw("Strict value is not equal to itself.")
755789 }
756790
757791
758792
759793 @Callable(i)
760794 func confirmManager () = {
761795 let p = pm()
762796 let hpm = if (isDefined(p))
763797 then true
764798 else throw("No pending manager")
765799 if ((hpm == hpm))
766800 then {
767801 let cpm = if ((i.callerPublicKey == value(p)))
768802 then true
769803 else throw("You are not pending manager")
770804 if ((cpm == cpm))
771805 then [StringEntry(mpk(), toBase58String(value(p))), DeleteEntry(pmpk())]
772806 else throw("Strict value is not equal to itself.")
773807 }
774808 else throw("Strict value is not equal to itself.")
775809 }
776810
777811
778812
779813 @Callable(i)
780814 func put (slip,autoStake) = {
781815 let factCfg = gfc()
782816 let stakingCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactStakCntr]), "Wr st addr")
783817 let slipCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactSlippCntr]), "Wr sl addr")
784818 if ((0 > slip))
785819 then throw("Wrong slippage")
786820 else if ((size(i.payments) != 2))
787821 then throw("2 pmnts expd")
788822 else {
789823 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, "")
790824 let emitLpAmt = e._2
791825 let lpAssetId = e._7
792826 let state = e._9
793827 let amDiff = e._10
794828 let prDiff = e._11
795829 let amId = e._12
796830 let prId = e._13
797831 let r = invoke(fca, "emit", [emitLpAmt], nil)
798832 if ((r == r))
799833 then {
800834 let el = match r {
801835 case legacy: Address =>
802836 invoke(legacy, "emit", [emitLpAmt], nil)
803837 case _ =>
804838 unit
805839 }
806840 if ((el == el))
807841 then {
808842 let sa = if ((amDiff > 0))
809843 then invoke(slipCntr, "put", nil, [AttachedPayment(amId, amDiff)])
810844 else nil
811845 if ((sa == sa))
812846 then {
813847 let sp = if ((prDiff > 0))
814848 then invoke(slipCntr, "put", nil, [AttachedPayment(prId, prDiff)])
815849 else nil
816850 if ((sp == sp))
817851 then {
818852 let lpTrnsfr = if (autoStake)
819853 then {
820854 let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
821855 if ((ss == ss))
822856 then nil
823857 else throw("Strict value is not equal to itself.")
824858 }
825859 else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
826860 (state ++ lpTrnsfr)
827861 }
828862 else throw("Strict value is not equal to itself.")
829863 }
830864 else throw("Strict value is not equal to itself.")
831865 }
832866 else throw("Strict value is not equal to itself.")
833867 }
834868 else throw("Strict value is not equal to itself.")
835869 }
836870 }
837871
838872
839873
840874 @Callable(i)
841-func putOneTknV2 (minOutAmount,autoStake) = if ((size(i.payments) != 1))
842- then throw("1 pmnt expd")
843- else {
844- let poolConfig = gpc()
845- let amId = poolConfig[idxAmAsId]
846- let prId = poolConfig[idxPrAsId]
847- let lpId = fromBase58String(poolConfig[idxLPAsId])
848- let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
849- let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
850- let userAddress = if ((i.caller == this))
851- then i.originCaller
852- else i.caller
853- let pmt = value(i.payments[0])
854- let pmtAssetId = toBase58String(value(pmt.assetId))
855- let pmtAmt = pmt.amount
856- let $t03177431899 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId))
857- let estimLP = $t03177431899._1
858- let state = $t03177431899._2
859- let feeAmount = $t03177431899._3
860- let emitLpAmt = if (if ((minOutAmount > 0))
861- then (minOutAmount > estimLP)
862- else false)
863- then throw(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
864- else estimLP
865- let e = invoke(fca, "emit", [emitLpAmt], nil)
866- if ((e == e))
867- then {
868- let el = match e {
869- case legacy: Address =>
870- invoke(legacy, "emit", [emitLpAmt], nil)
871- case _ =>
872- unit
873- }
874- if ((el == el))
875- then {
876- let lpTrnsfr = if (autoStake)
877- then {
878- let ss = invoke(stakingContract, "stake", nil, [AttachedPayment(lpId, emitLpAmt)])
879- if ((ss == ss))
880- then nil
881- else throw("Strict value is not equal to itself.")
882- }
883- else [ScriptTransfer(i.caller, emitLpAmt, lpId)]
884- let sendFeeToMatcher = if ((feeAmount > 0))
885- then [ScriptTransfer(feeCollectorAddress, feeAmount, fromBase58String(pmtAssetId))]
886- else nil
887- $Tuple2(((state ++ lpTrnsfr) ++ sendFeeToMatcher), emitLpAmt)
888- }
889- else throw("Strict value is not equal to itself.")
890- }
891- else throw("Strict value is not equal to itself.")
875+func putOneTknV2 (minOutAmount,autoStake) = {
876+ let isPoolOneTokenOperationsDisabled = {
877+ let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
878+ if ($isInstanceOf(@, "Boolean"))
879+ then @
880+ else throw(($getType(@) + " couldn't be cast to Boolean"))
892881 }
882+ let isPutDisabled = if (if (if (igs())
883+ then true
884+ else (cfgPoolStatus == PoolPutDis))
885+ then true
886+ else (cfgPoolStatus == PoolShutdown))
887+ then true
888+ else isPoolOneTokenOperationsDisabled
889+ let checks = [if (!(isPutDisabled))
890+ then true
891+ else throwErr("put operation is blocked by admin"), if ((size(i.payments) == 1))
892+ then true
893+ else throwErr("exactly 1 payment are expected")]
894+ if ((checks == checks))
895+ then {
896+ let poolConfig = gpc()
897+ let amId = poolConfig[idxAmAsId]
898+ let prId = poolConfig[idxPrAsId]
899+ let lpId = fromBase58String(poolConfig[idxLPAsId])
900+ let amDecimals = parseIntValue(poolConfig[idxAmtAsDcm])
901+ let prDecimals = parseIntValue(poolConfig[idxPriceAsDcm])
902+ let userAddress = if ((i.caller == this))
903+ then i.originCaller
904+ else i.caller
905+ let pmt = value(i.payments[0])
906+ let pmtAssetId = toBase58String(value(pmt.assetId))
907+ let pmtAmt = pmt.amount
908+ let $t03302433149 = calcPutOneTkn(pmtAmt, pmtAssetId, toString(userAddress), toBase58String(i.transactionId))
909+ let estimLP = $t03302433149._1
910+ let state = $t03302433149._2
911+ let feeAmount = $t03302433149._3
912+ let emitLpAmt = if (if ((minOutAmount > 0))
913+ then (minOutAmount > estimLP)
914+ else false)
915+ then throw(makeString(["amount to receive is less than ", toString(minOutAmount)], ""))
916+ else estimLP
917+ let e = invoke(fca, "emit", [emitLpAmt], nil)
918+ if ((e == e))
919+ then {
920+ let el = match e {
921+ case legacy: Address =>
922+ invoke(legacy, "emit", [emitLpAmt], nil)
923+ case _ =>
924+ unit
925+ }
926+ if ((el == el))
927+ then {
928+ let lpTrnsfr = if (autoStake)
929+ then {
930+ let ss = invoke(stakingContract, "stake", nil, [AttachedPayment(lpId, emitLpAmt)])
931+ if ((ss == ss))
932+ then nil
933+ else throw("Strict value is not equal to itself.")
934+ }
935+ else [ScriptTransfer(i.caller, emitLpAmt, lpId)]
936+ let sendFeeToMatcher = if ((feeAmount > 0))
937+ then [ScriptTransfer(feeCollectorAddress, feeAmount, fromBase58String(pmtAssetId))]
938+ else nil
939+ $Tuple2(((state ++ lpTrnsfr) ++ sendFeeToMatcher), emitLpAmt)
940+ }
941+ else throw("Strict value is not equal to itself.")
942+ }
943+ else throw("Strict value is not equal to itself.")
944+ }
945+ else throw("Strict value is not equal to itself.")
946+ }
893947
894948
895949
896950 @Callable(i)
897951 func putForFree (maxSlpg) = if ((0 > maxSlpg))
898952 then throw("Wrong slpg")
899953 else if ((size(i.payments) != 2))
900954 then throw("2 pmnts expd")
901955 else {
902956 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, "")
903957 estPut._9
904958 }
905959
906960
907961
908962 @Callable(i)
909963 func get () = {
910964 let r = cg(i)
911965 let outAmtAmt = r._1
912966 let outPrAmt = r._2
913967 let pmtAmt = r._3
914968 let pmtAssetId = r._4
915969 let state = r._5
916970 let b = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
917971 if ((b == b))
918972 then state
919973 else throw("Strict value is not equal to itself.")
920974 }
921975
922976
923977
924978 @Callable(i)
925979 func getOneTknV2 (outAssetId,minOutAmount) = {
926- let $t03408234237 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
927- let state = $t03408234237._1
928- let totalAmount = $t03408234237._2
929- $Tuple2(state, totalAmount)
980+ let isPoolOneTokenOperationsDisabled = {
981+ let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
982+ if ($isInstanceOf(@, "Boolean"))
983+ then @
984+ else throw(($getType(@) + " couldn't be cast to Boolean"))
985+ }
986+ let isGetDisabled = if (if (igs())
987+ then true
988+ else (cfgPoolStatus == PoolShutdown))
989+ then true
990+ else isPoolOneTokenOperationsDisabled
991+ let checks = [if (!(isGetDisabled))
992+ then true
993+ else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 1))
994+ then true
995+ else throwErr("exactly 1 payment are expected")]
996+ if ((checks == checks))
997+ then {
998+ let $t03573535890 = getOneTknV2Internal(outAssetId, minOutAmount, i.payments, i.caller, i.originCaller, i.transactionId)
999+ let state = $t03573535890._1
1000+ let totalAmount = $t03573535890._2
1001+ $Tuple2(state, totalAmount)
1002+ }
1003+ else throw("Strict value is not equal to itself.")
9301004 }
9311005
9321006
9331007
9341008 @Callable(i)
9351009 func getOneTknV2READONLY (outAssetId,lpAssetAmount) = {
9361010 let poolConfig = gpc()
9371011 let amId = poolConfig[idxAmAsId]
9381012 let prId = poolConfig[idxPrAsId]
9391013 let lpId = poolConfig[idxLPAsId]
9401014 let xp = [toBigInt(getAccBalance(amId)), toBigInt(getAccBalance(prId))]
9411015 let lpEmission = toBigInt(valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "invalid lp asset").quantity)
9421016 let D0 = getD(xp)
9431017 let D1 = (D0 - fraction(toBigInt(lpAssetAmount), D0, lpEmission))
9441018 let index = if ((outAssetId == amId))
9451019 then 0
9461020 else if ((outAssetId == prId))
9471021 then 1
9481022 else throw("invalid out asset id")
9491023 let newY = getYD(xp, index, D1)
9501024 let dy = (xp[index] - newY)
9511025 let totalGetRaw = max([0, toInt((dy - big1))])
952- let $t03502735076 = takeFee(totalGetRaw)
953- let totalGet = $t03502735076._1
954- let feeAmount = $t03502735076._2
1026+ let $t03668036729 = takeFee(totalGetRaw)
1027+ let totalGet = $t03668036729._1
1028+ let feeAmount = $t03668036729._2
9551029 $Tuple2(nil, $Tuple2(totalGet, feeAmount))
9561030 }
9571031
9581032
9591033
9601034 @Callable(i)
9611035 func getOneTknV2WithBonusREADONLY (outAssetId,lpAssetAmount) = {
9621036 let poolConfig = gpc()
9631037 let amId = poolConfig[idxAmAsId]
9641038 let prId = poolConfig[idxPrAsId]
9651039 let lpId = poolConfig[idxLPAsId]
9661040 let amBalance = getAccBalance(amId)
9671041 let prBalance = getAccBalance(prId)
968- let $t03542135536 = {
1042+ let $t03707437189 = {
9691043 let @ = invoke(this, "getOneTknV2READONLY", [outAssetId, lpAssetAmount], nil)
9701044 if ($isInstanceOf(@, "(Int, Int)"))
9711045 then @
9721046 else throw(($getType(@) + " couldn't be cast to (Int, Int)"))
9731047 }
974- let totalGet = $t03542135536._1
975- let feeAmount = $t03542135536._2
1048+ let totalGet = $t03707437189._1
1049+ let feeAmount = $t03707437189._2
9761050 let r = ego("", lpId, lpAssetAmount, this)
9771051 let outAmAmt = r._1
9781052 let outPrAmt = r._2
9791053 let sumOfGetAssets = (outAmAmt + outPrAmt)
9801054 let bonus = if ((sumOfGetAssets == 0))
9811055 then if ((totalGet == 0))
9821056 then 0
9831057 else throw("bonus calculation error")
9841058 else fraction((totalGet - sumOfGetAssets), scale8, sumOfGetAssets)
9851059 $Tuple2(nil, $Tuple3(totalGet, feeAmount, bonus))
9861060 }
9871061
9881062
9891063
9901064 @Callable(i)
9911065 func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = {
9921066 let r = cg(i)
9931067 let outAmAmt = r._1
9941068 let outPrAmt = r._2
9951069 let pmtAmt = r._3
9961070 let pmtAssetId = r._4
9971071 let state = r._5
9981072 if ((noLessThenAmtAsset > outAmAmt))
9991073 then throw(((("Failed: " + toString(outAmAmt)) + " < ") + toString(noLessThenAmtAsset)))
10001074 else if ((noLessThenPriceAsset > outPrAmt))
10011075 then throw(((("Failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset)))
10021076 else {
10031077 let burnLPAssetOnFactory = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
10041078 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
10051079 then state
10061080 else throw("Strict value is not equal to itself.")
10071081 }
10081082 }
10091083
10101084
10111085
10121086 @Callable(i)
10131087 func unstakeAndGet (amount) = {
10141088 let checkPayments = if ((size(i.payments) != 0))
10151089 then throw("No pmnts expd")
10161090 else true
10171091 if ((checkPayments == checkPayments))
10181092 then {
10191093 let cfg = gpc()
10201094 let factoryCfg = gfc()
10211095 let lpAssetId = fromBase58String(cfg[idxLPAsId])
10221096 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
10231097 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), amount], nil)
10241098 if ((unstakeInv == unstakeInv))
10251099 then {
10261100 let r = ego(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
10271101 let sts = parseIntValue(r._9)
10281102 let state = r._10
10291103 let v = if (if (igs())
10301104 then true
10311105 else (sts == PoolShutdown))
10321106 then throw(("Blocked: " + toString(sts)))
10331107 else true
10341108 if ((v == v))
10351109 then {
10361110 let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
10371111 if ((burnA == burnA))
10381112 then state
10391113 else throw("Strict value is not equal to itself.")
10401114 }
10411115 else throw("Strict value is not equal to itself.")
10421116 }
10431117 else throw("Strict value is not equal to itself.")
10441118 }
10451119 else throw("Strict value is not equal to itself.")
10461120 }
10471121
10481122
10491123
10501124 @Callable(i)
10511125 func unstakeAndGetOneTknV2 (unstakeAmount,outAssetId,minOutAmount) = {
1052- let checkPayments = if ((size(i.payments) != 0))
1053- then throw("No pmnts expd")
1054- else true
1055- if ((checkPayments == checkPayments))
1126+ let isPoolOneTokenOperationsDisabled = {
1127+ let @ = invoke(fca, "isPoolOneTokenOperationsDisabledREADONLY", [toString(this)], nil)
1128+ if ($isInstanceOf(@, "Boolean"))
1129+ then @
1130+ else throw(($getType(@) + " couldn't be cast to Boolean"))
1131+ }
1132+ let isGetDisabled = if (if (igs())
1133+ then true
1134+ else (cfgPoolStatus == PoolShutdown))
1135+ then true
1136+ else isPoolOneTokenOperationsDisabled
1137+ let checks = [if (!(isGetDisabled))
1138+ then true
1139+ else throwErr("get operation is blocked by admin"), if ((size(i.payments) == 0))
1140+ then true
1141+ else throwErr("no payments are expected")]
1142+ if ((checks == checks))
10561143 then {
10571144 let cfg = gpc()
10581145 let factoryCfg = gfc()
10591146 let lpAssetId = fromBase58String(cfg[idxLPAsId])
10601147 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
10611148 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), unstakeAmount], nil)
10621149 if ((unstakeInv == unstakeInv))
10631150 then {
1064- let $t03796338151 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1065- let state = $t03796338151._1
1066- let totalAmount = $t03796338151._2
1151+ let $t03992140109 = getOneTknV2Internal(outAssetId, minOutAmount, [AttachedPayment(lpAssetId, unstakeAmount)], i.caller, i.originCaller, i.transactionId)
1152+ let state = $t03992140109._1
1153+ let totalAmount = $t03992140109._2
10671154 $Tuple2(state, totalAmount)
10681155 }
10691156 else throw("Strict value is not equal to itself.")
10701157 }
10711158 else throw("Strict value is not equal to itself.")
10721159 }
10731160
10741161
10751162
10761163 @Callable(i)
10771164 func putOneTknV2WithBonusREADONLY (paymentAmountRaw,paymentAssetId) = {
10781165 let poolConfig = gpc()
10791166 let amId = poolConfig[idxAmAsId]
10801167 let prId = poolConfig[idxPrAsId]
10811168 let lpId = poolConfig[idxLPAsId]
1082- let $t03841038507 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "")
1083- let lpAmount = $t03841038507._1
1084- let state = $t03841038507._2
1085- let feeAmount = $t03841038507._3
1086- let bonus = $t03841038507._4
1169+ let $t04036840465 = calcPutOneTkn(paymentAmountRaw, paymentAssetId, "", "")
1170+ let lpAmount = $t04036840465._1
1171+ let state = $t04036840465._2
1172+ let feeAmount = $t04036840465._3
1173+ let bonus = $t04036840465._4
10871174 $Tuple2(nil, $Tuple3(lpAmount, feeAmount, bonus))
10881175 }
10891176
10901177
10911178
10921179 @Callable(i)
10931180 func activate (amtAsStr,prAsStr) = if ((toString(i.caller) != toString(fca)))
10941181 then throw("denied")
10951182 else $Tuple2([StringEntry(aa(), amtAsStr), StringEntry(pa(), prAsStr)], "success")
10961183
10971184
10981185
10991186 @Callable(i)
11001187 func setS (k,v) = if ((toString(i.caller) != strf(this, ada())))
11011188 then pd
11021189 else [StringEntry(k, v)]
11031190
11041191
11051192
11061193 @Callable(i)
11071194 func setI (k,v) = if ((toString(i.caller) != strf(this, ada())))
11081195 then pd
11091196 else [IntegerEntry(k, v)]
11101197
11111198
11121199
11131200 @Callable(i)
11141201 func getPoolConfigWrapperREADONLY () = $Tuple2(nil, gpc())
11151202
11161203
11171204
11181205 @Callable(i)
11191206 func getAccBalanceWrapperREADONLY (assetId) = $Tuple2(nil, getAccBalance(assetId))
11201207
11211208
11221209
11231210 @Callable(i)
11241211 func calcPricesWrapperREADONLY (amAmt,prAmt,lpAmt) = {
11251212 let pr = calcPrices(amAmt, prAmt, lpAmt)
11261213 $Tuple2(nil, [toString(pr[0]), toString(pr[1]), toString(pr[2])])
11271214 }
11281215
11291216
11301217
11311218 @Callable(i)
11321219 func fromX18WrapperREADONLY (val,resScaleMult) = $Tuple2(nil, f1(parseBigIntValue(val), resScaleMult))
11331220
11341221
11351222
11361223 @Callable(i)
11371224 func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(t1(origVal, origScaleMult)))
11381225
11391226
11401227
11411228 @Callable(i)
11421229 func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(cpbi(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
11431230
11441231
11451232
11461233 @Callable(i)
11471234 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, ""))
11481235
11491236
11501237
11511238 @Callable(i)
11521239 func estimateGetOperationWrapperREADONLY (txId58,pmtAsId,pmtLpAmt,usrAddr) = {
11531240 let r = ego(txId58, pmtAsId, pmtLpAmt, addressFromStringValue(usrAddr))
11541241 $Tuple2(nil, $Tuple10(r._1, r._2, r._3, r._4, r._5, r._6, r._7, toString(r._8), r._9, r._10))
11551242 }
11561243
11571244
11581245
11591246 @Callable(i)
11601247 func getFeeREADONLY () = $Tuple2(nil, fee)
11611248
11621249
11631250 @Verifier(tx)
11641251 func verify () = {
11651252 let targetPublicKey = match m() {
11661253 case pk: ByteVector =>
11671254 pk
11681255 case _: Unit =>
11691256 tx.senderPublicKey
11701257 case _ =>
11711258 throw("Match error")
11721259 }
11731260 match tx {
11741261 case order: Order =>
11751262 let matcherPub = mp()
11761263 let orderValid = moa(order)
11771264 let senderValid = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
11781265 let matcherValid = sigVerify(order.bodyBytes, order.proofs[1], matcherPub)
11791266 if (if (if (orderValid)
11801267 then senderValid
11811268 else false)
11821269 then matcherValid
11831270 else false)
11841271 then true
11851272 else toe(orderValid, senderValid, matcherValid)
11861273 case s: SetScriptTransaction =>
11871274 let newHash = blake2b256(value(s.script))
11881275 let allowedHash = fromBase64String(value(getString(fca, keyAllowedLpStableScriptHash())))
11891276 let currentHash = scriptHash(this)
11901277 if (if ((allowedHash == newHash))
11911278 then (currentHash != newHash)
11921279 else false)
11931280 then true
11941281 else sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
11951282 case _ =>
11961283 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
11971284 }
11981285 }
11991286

github/deemru/w8io/873ac7e 
134.88 ms