tx · GgdA4nbzgWhvPVVmSunf1jiurz9kbnwxhcS5h9RDcg3r

3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT:  -0.02600000 Waves

2022.08.15 13:51 [2185486] smart account 3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT > SELF 0.00000000 Waves

{ "type": 13, "id": "GgdA4nbzgWhvPVVmSunf1jiurz9kbnwxhcS5h9RDcg3r", "fee": 2600000, "feeAssetId": null, "timestamp": 1660560751672, "version": 1, "sender": "3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT", "senderPublicKey": "D1BL65meykxFZTCuq7jq9HSGLLnWvQamQPUNrguW5w39", "proofs": [ "4xo9BiGKVxFL7q2EgDVBhh3xfm3EbCYQD22cGaocamjJKq4NUcZZzxpg24rhH1bkJN8bGMYb1tScxno3i1AYRyV1" ], "script": "base64:BgKQIAgCEgMKAQgSAwoBCBIAEgQKAgEEEgcKBQEBAQEEEgMKAQESABIHCgUBAQEIARIECgIBARIDCgEBEgQKAggIEgQKAggIEgQKAggBEgASAwoBCBIFCgMBAQESBAoCCAESBAoCAQESBAoCCAgSCwoJCAEBAgECCAQEEgYKBAgIAQgiBnNjYWxlOCIMc2NhbGU4QmlnSW50IgdzY2FsZTE4Igh0aG91c2FuZCIKemVyb0JpZ0ludCIJb25lQmlnSW50IgpzbGlwcGFnZTREIgVBbXVsdCIFRGNvbnYiA1NFUCIFRU1QVFkiClBvb2xBY3RpdmUiClBvb2xQdXREaXMiDlBvb2xNYXRjaGVyRGlzIgxQb29sU2h1dGRvd24iDmlkeFBvb2xBZGRyZXNzIglpZHhQb29sU3QiCWlkeExQQXNJZCIJaWR4QW1Bc0lkIglpZHhQckFzSWQiC2lkeEFtdEFzRGNtIg1pZHhQcmljZUFzRGNtIgtpZHhJQW10QXNJZCINaWR4SVByaWNlQXNJZCIPaWR4RmFjdFN0YWtDbnRyIhBpZHhGYWN0U2xpcHBDbnRyIhFpZHhGYWN0R3d4UmV3Q250ciISZmVlUGVybWlsbGVEZWZhdWx0IgV0b1gxOCIHb3JpZ1ZhbCINb3JpZ1NjYWxlTXVsdCIHZnJvbVgxOCIDdmFsIg9yZXN1bHRTY2FsZU11bHQiAnRzIgNhbXQiCHJlc1NjYWxlIghjdXJTY2FsZSIDYWJzIhFrZXlGYWN0b3J5Q29udGFjdCITa2V5TWFuYWdlclB1YmxpY0tleSIaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkiDGtleVByaWNlTGFzdCIPa2V5UHJpY2VIaXN0b3J5IgFoIgF0IhJrZXlQdXRBY3Rpb25CeVVzZXIiAnVhIgR0eElkIhJrZXlHZXRBY3Rpb25CeVVzZXIiDmtleUFtb3VudEFzc2V0Ig1rZXlQcmljZUFzc2V0Ig9rZXlBbXBsaWZpY2F0b3IiD2tleUFkZG9uQWRkcmVzcyIOa2V5RmVlUGVybWlsbGUiC2ZlZVBlcm1pbGxlIgRmY2ZnIgRtdHBrIgJwYyIGaUFtdEFzIgVpUHJBcyIDbWJhIgViQVN0ciIDYXBzIgh0aHJvd0VyciIDbXNnIg90aHJvd09yZGVyRXJyb3IiA29yViIGc2VuZHJWIgZtYXRjaFYiA3N0ciIHJG1hdGNoMCIGdmFsU3RyIg9nZXRTdHJpbmdPckZhaWwiBGFkZHIiA2tleSIMZ2V0SW50T3JGYWlsIg9mYWN0b3J5Q29udHJhY3QiDGFtcGxpZmljYXRvciIQaXNHbG9iYWxTaHV0ZG93biITZ2V0TWF0Y2hlclB1Yk9yRmFpbCIObWF0Y2hlckFkZHJlc3MiDWdldFBvb2xDb25maWciBWFtdEFzIgdwcmljZUFzIghpUHJpY2VBcyIQZ2V0RmFjdG9yeUNvbmZpZyIRZGF0YVB1dEFjdGlvbkluZm8iDWluQW10QXNzZXRBbXQiD2luUHJpY2VBc3NldEFtdCIIb3V0THBBbXQiBXByaWNlIgpzbGlwQnlVc2VyIgxzbGlwcGFnZVJlYWwiCHR4SGVpZ2h0Igt0eFRpbWVzdGFtcCIMc2xpcGFnZUFtQW10IgxzbGlwYWdlUHJBbXQiEWRhdGFHZXRBY3Rpb25JbmZvIg5vdXRBbXRBc3NldEFtdCIQb3V0UHJpY2VBc3NldEFtdCIHaW5McEFtdCINZ2V0QWNjQmFsYW5jZSIHYXNzZXRJZCIPY2FsY1ByaWNlQmlnSW50IghwckFtdFgxOCIIYW1BbXRYMTgiD3ZhbGlkYXRlQWJzRGlmZiIKZXN0aW1hdGVMUCIFb3V0THAiCHNsaXBwYWdlIgRkaWZmIgRwYXNzIgl2YWxpZGF0ZUQiAkQxIgJEMCIEZmFpbCIQcHJpdmF0ZUNhbGNQcmljZSIKYW1Bc3NldERjbSIKcHJBc3NldERjbSIFYW1BbXQiBXByQW10IgthbXRBc0FtdFgxOCIKcHJBc0FtdFgxOCIKY2FsY1ByaWNlcyIFbHBBbXQiA2NmZyIIYW10QXNEY20iB3ByQXNEY20iCHByaWNlWDE4IghscEFtdFgxOCINbHBQckluQW1Bc1gxOCINbHBQckluUHJBc1gxOCIPY2FsY3VsYXRlUHJpY2VzIgFwIhRlc3RpbWF0ZUdldE9wZXJhdGlvbiIGdHhJZDU4Ig5wYXltZW50QXNzZXRJZCIPcGF5bWVudExwQW1vdW50Igt1c2VyQWRkcmVzcyIJbHBBc3NldElkIghhbW91bnRJZCIHcHJpY2VJZCIOYW1vdW50RGVjaW1hbHMiDXByaWNlRGVjaW1hbHMiA3N0cyIKbHBFbWlzc2lvbiIPdmFsaWRhdGlvbkJsb2NrIghkZWNpbWFscyINYW1vdW50QmFsYW5jZSIQYW1vdW50QmFsYW5jZVgxOCIMcHJpY2VCYWxhbmNlIg9wcmljZUJhbGFuY2VYMTgiD2N1cnJlbnRQcmljZVgxOCIIY3VyUHJpY2UiEnBheW1lbnRMcEFtb3VudFgxOCINbHBFbWlzc2lvblgxOCISb3V0QW1vdW50QW1vdW50WDE4IhFvdXRQcmljZUFtb3VudFgxOCIPb3V0QW1vdW50QW1vdW50Ig5vdXRQcmljZUFtb3VudCIFc3RhdGUiFGVzdGltYXRlUHV0T3BlcmF0aW9uIhFzbGlwcGFnZVRvbGVyYW5jZSITaW5BbW91bnRBc3NldEFtb3VudCIPaW5BbW91bnRBc3NldElkIhJpblByaWNlQXNzZXRBbW91bnQiDmluUHJpY2VBc3NldElkIgppc0V2YWx1YXRlIgZlbWl0THAiCmlzT25lQXNzZXQiDXBheW1lbnRBbW91bnQiCXBheW1lbnRJZCILYW1vdW50SWRTdHIiCnByaWNlSWRTdHIiDWluQW1vdW50SWRTdHIiDGluUHJpY2VJZFN0ciIWaW5BbW91bnRBc3NldEFtb3VudFgxOCIVaW5QcmljZUFzc2V0QW1vdW50WDE4Igx1c2VyUHJpY2VYMTgiAXIiC3NsaXBwYWdlWDE4IgtscEFtb3VudFgxOCIPc2xpcHBhZ2VSZWFsWDE4IhB2YWxpZGF0ZVNsaXBwYWdlIgpwclZpYUFtWDE4IgphbVZpYVByWDE4Ig9leHBlY3RlZEFtb3VudHMiHGV4cGVjdGVkQW1vdW50QXNzZXRBbW91bnRYMTgiG2V4cGVjdGVkUHJpY2VBc3NldEFtb3VudFgxOCIRY2FsY3VsYXRlTHBBbW91bnQiG2NhbGN1bGF0ZUFtb3VudEFzc2V0UGF5bWVudCIaY2FsY3VsYXRlUHJpY2VBc3NldFBheW1lbnQiDGN1cnJlbnRQcmljZSIRc2xpcHBhZ2VDYWxjdWxhdGUiEWNoZWNrQ2FsY0xwQW1vdW50IgxlbWl0THBBbW91bnQiCmFtb3VudERpZmYiCXByaWNlRGlmZiINJHQwMTYyMjExNjQ4MCIKd3JpdGVBbUFtdCIKd3JpdGVQckFtdCILY29tbW9uU3RhdGUiG3ZhbGlkYXRlTWF0Y2hlck9yZGVyQWxsb3dlZCIFb3JkZXIiB2FtdEFzSWQiBnByQXNJZCIPYWNjQW10QXNCYWxhbmNlIg5hY2NQckFzQmFsYW5jZSIKb3JBbXRBc3NldCIKb3JBbXRBc1N0ciIJb3JQckFzc2V0IglvclByQXNTdHIiCm9yZGVyUHJpY2UiDmNhc3RPcmRlclByaWNlIhFpc09yZGVyUHJpY2VWYWxpZCIJY29tbW9uR2V0IgFpIg1jaGVja1BheW1lbnRzIgdwYXltZW50Igljb21tb25QdXQiBmNhbGxlciISYW1vdW50QXNzZXRQYXltZW50IhFwcmljZUFzc2V0UGF5bWVudCIHdGFrZUZlZSIGYW1vdW50IgNmZWUiFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQiAXMiHXBlbmRpbmdNYW5hZ2VyUHVibGljS2V5T3JVbml0IgJwZCILbXVzdE1hbmFnZXIiAnBrIgtjaGVja0NhbGxlciIXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkiFWNoZWNrTWFuYWdlclB1YmxpY0tleSICcG0iBWhhc1BNIgdjaGVja1BNIglhdXRvU3Rha2UiB2ZhY3RDZmciD3N0YWtpbmdDb250cmFjdCIQc2xpcHBhZ2VDb250cmFjdCINc2xpcHBhZ2VDaGVjayINcGF5bWVudHNDaGVjayILZXN0aW1hdGVQdXQiAmVsIgZsZWdhY3kiAnNhIgJzcCIJbHBUcmFzZmVyIgJzcyIPYW1vdW50QXNzZXRQYXJ0Ig5wcmljZUFzc2V0UGFydCIRZ3d4UmV3YXJkQ29udHJhY3QiB3Bvb2xDZmciBWFkZG9uIhBwYXltZW50QW1vdW50UmF3Ig0kdDAyNTY0OTI1NzA4IglmZWVBbW91bnQiDSR0MDI1OTcyMjY0MjciEGFtb3VudEJhbGFuY2VOb3ciD3ByaWNlQmFsYW5jZU5vdyIMdmlydFN3YXBJbkFtIg12aXJ0U3dhcE91dFByIgx2aXJ0U3dhcEluUHIiDXZpcnRTd2FwT3V0QW0iBkQwdnNEMSIJbHBDYWxjUmVzIgFlIhBzZW5kRmVlVG9NYXRjaGVyIgttYXhzbGlwcGFnZSIJb3V0QW10QW10IgFiIgpleGNoUmVzdWx0Igdub3RVc2VkIglvdXRBbW91bnQiCm91dEFzc2V0SWQiCmVzdGltQW1BbXQiCmVzdGltUHJBbXQiDSR0MDMxNTY2MzIwMzQiCHRvdGFsR2V0IghmaW5hbFJlcyINJHQwMzI3MDMzMjgxMSIFb3V0QW0iBW91dFByIg50b3RhbEFtb3VudFJhdyINJHQwMzI4NTEzMjkwNiILdG90YWxBbW91bnQiEW91dEFzc2V0SWRPcldhdmVzIghjdXJQclgxOCIFY3VyUHIiBGJ1cm4iEm5vTGVzc1RoZW5BbXRBc3NldCIUbm9MZXNzVGhlblByaWNlQXNzZXQiFGNoZWNrT3V0QW1vdW50QW1vdW50IhNjaGVja091dFByaWNlQW1vdW50IhRidXJuTFBBc3NldE9uRmFjdG9yeSIKZmFjdG9yeUNmZyIHc3Rha2luZyIKdW5zdGFrZUludiIBdiIFYnVybkEiCGFtdEFzU3RyIgdwckFzU3RyIgFrIgJwciIMcmVzU2NhbGVNdWx0IgZpbkFtSWQiBmluUHJJZCIHdXNyQWRkciILcGF5bWVudEFzSWQiAnR4IgZ2ZXJpZnkiB210Y2hQdWIiBXNuZHJWIgVtdGNoViIPdGFyZ2V0UHVibGljS2V5IgckbWF0Y2gxUQABYQCAwtcvAAFiCQC2AgEAgMLXLwABYwkAtgIBAICAkLu61q3wDQABZADoBwABZQkAtgIBAAAAAWYJALYCAQABAAFnCQC2AgEJAGUCBQFhCQBpAgkAaAIFAWEAAQUBYQABaAIDMTAwAAFpAgExAAFqAgJfXwABawIAAAFsAAEAAW0AAgABbgADAAFvAAQAAXAAAQABcQACAAFyAAMAAXMABAABdAAFAAF1AAYAAXYABwABdwAIAAF4AAkAAXkAAQABegAHAAFBAAoAAUIAAAEBQwIBRAFFCQC8AgMJALYCAQUBRAUBYwkAtgIBBQFFAQFGAgFHAUgJAKADAQkAvAIDBQFHCQC2AgEFAUgFAWMBAUkDAUoBSwFMCQBrAwUBSgUBSwUBTAEBTQEBRwMJAL8CAgUBZQUBRwkAvgIBBQFHBQFHAQFOAAITJXNfX2ZhY3RvcnlDb250cmFjdAEBTwACFCVzX19tYW5hZ2VyUHVibGljS2V5AQFQAAIbJXNfX3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5AQFRAAIRJXMlc19fcHJpY2VfX2xhc3QBAVICAVMBVAkAuQkCCQDMCAICGCVzJXMlZCVkX19wcmljZV9faGlzdG9yeQkAzAgCCQCkAwEFAVMJAMwIAgkApAMBBQFUBQNuaWwFAWoBAVUCAVYBVwkArAICCQCsAgIJAKwCAgILJXMlcyVzX19QX18FAVYCAl9fBQFXAQFYAgFWAVcJAKwCAgkArAICCQCsAgICCyVzJXMlc19fR19fBQFWAgJfXwUBVwEBWQACDyVzX19hbW91bnRBc3NldAEBWgACDiVzX19wcmljZUFzc2V0AQJhYQACByVzX19hbXABAmFiAAINJXNfX2FkZG9uQWRkcgACYWMCDyVzX19mZWVQZXJtaWxsZQACYWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUCYWMFAUIBAmFlAAIRJXNfX2ZhY3RvcnlDb25maWcBAmFmAAIYJXMlc19fbWF0Y2hlcl9fcHVibGljS2V5AQJhZwICYWgCYWkJAKwCAgkArAICCQCsAgIJAKwCAgIIJWQlZCVzX18FAmFoAgJfXwUCYWkCCF9fY29uZmlnAQJhagECYWsJAKwCAgIoJXMlcyVzX19tYXBwaW5nc19fYmFzZUFzc2V0MmludGVybmFsSWRfXwUCYWsBAmFsAAIMJXNfX3NodXRkb3duAQJhbQECYW4JAAIBCQC5CQIJAMwIAgIPbHBfc3RhYmxlLnJpZGU6CQDMCAIFAmFuBQNuaWwCASABAmFvAwJhcAJhcQJhcgkBAmFtAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICEUZhaWxlZDogb3JkVmFsaWQ9CQClAwEFAmFwAgsgc25kclZhbGlkPQkApQMBBQJhcQIMIG10Y2hyVmFsaWQ9CQClAwEFAmFyAQJhcwEBRwQCYXQFAUcDCQABAgUCYXQCBlN0cmluZwQCYXUFAmF0BQJhdQkBAmFtAQITZmFpbCBjYXN0IHRvIFN0cmluZwECYXYCAmF3AmF4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUCYXcFAmF4CQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFAmF3CQDMCAICAS4JAMwIAgUCYXgJAMwIAgIMIG5vdCBkZWZpbmVkBQNuaWwCAAECYXkCAmF3AmF4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUCYXcFAmF4CQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFAmF3CQDMCAICAS4JAMwIAgUCYXgJAMwIAgIMIG5vdCBkZWZpbmVkBQNuaWwCAAACYXoJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQJhdgIFBHRoaXMJAQFOAAACYUEJAQJhdgIFBHRoaXMJAQJhYQABAmFCAAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQJhegkBAmFsAAcBAmFDAAkA2QQBCQECYXYCBQJhegkBAmFmAAACYUQJAKcIAQkBAmFDAAECYUUABAJhRgkBAmF2AgUEdGhpcwkBAVkABAJhRwkBAmF2AgUEdGhpcwkBAVoABAJhSAkBAmF5AgUCYXoJAQJhagEFAmFHBAJhaAkBAmF5AgUCYXoJAQJhagEFAmFGCQC1CQIJAQJhdgIFAmF6CQECYWcCCQCkAwEFAmFoCQCkAwEFAmFIBQFqAQJhSQAJALUJAgkBAmF2AgUCYXoJAQJhZQAFAWoBAmFKCgJhSwJhTAJhTQJhTgJhTwJhUAJhUQJhUgJhUwJhVAkAuQkCCQDMCAICFCVkJWQlZCVkJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQUCYUsJAMwIAgkApAMBBQJhTAkAzAgCCQCkAwEFAmFNCQDMCAIJAKQDAQUCYU4JAMwIAgkApAMBBQJhTwkAzAgCCQCkAwEFAmFQCQDMCAIJAKQDAQUCYVEJAMwIAgkApAMBBQJhUgkAzAgCCQCkAwEFAmFTCQDMCAIJAKQDAQUCYVQFA25pbAUBagECYVUGAmFWAmFXAmFYAmFOAmFRAmFSCQC5CQIJAMwIAgIMJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQUCYVYJAMwIAgkApAMBBQJhVwkAzAgCCQCkAwEFAmFYCQDMCAIJAKQDAQUCYU4JAMwIAgkApAMBBQJhUQkAzAgCCQCkAwEFAmFSBQNuaWwFAWoBAmFZAQJhWgMJAAACBQJhWgIFV0FWRVMICQDvBwEFBHRoaXMJYXZhaWxhYmxlCQDwBwIFBHRoaXMJANkEAQUCYVoBAmJhAgJiYgJiYwkAvAIDBQJiYgUBYwUCYmMBAmJkAwJiZQJiZgJiZwQCYmgJALwCAwkAuAICBQJiZQUCYmYFAWIFAmJmBAJiaQkAvwICCQC4AgIFAmJnCQEBTQEFAmJoBQFlAwkBASEBBQJiaQkBAmFtAQkArAICAg5CaWcgc2xpcHBhZ2U6IAkApgMBBQJiaAkAlAoCBQJiaQkAmQMBCQDMCAIFAmJlCQDMCAIFAmJmBQNuaWwBAmJqAwJiawJibAJiZwQCYmgJALwCAwUCYmwFAWIFAmJrBAJibQkAvwICBQJiZwUCYmgDAwUCYm0GCQC/AgIFAmJsBQJiawkBAmFtAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApgMBBQJibAIBIAkApgMBBQJiawIBIAkApgMBBQJiaAIBIAkApgMBBQJiZwUCYm0BAmJuBAJibwJicAJicQJicgQCYnMJAQFDAgUCYnEFAmJvBAJidAkBAUMCBQJicgUCYnAJAQJiYQIFAmJ0BQJicwECYnUDAmJxAmJyAmJ2BAJidwkBAmFFAAQCYngJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJidwUBdQQCYnkJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJidwUBdgQCYnoJAQJibgQFAmJ4BQJieQUCYnEFAmJyBAJiYwkBAUMCBQJicQUCYngEAmJiCQEBQwIFAmJyBQJieQQCYkEJAQFDAgUCYnYFAWEEAmJCCQECYmECBQJiYwUCYkEEAmJDCQECYmECBQJiYgUCYkEJAMwIAgUCYnoJAMwIAgUCYkIJAMwIAgUCYkMFA25pbAECYkQDAmJxAmJyAmJ2BAJiRQkBAmJ1AwUCYnEFAmJyBQJidgkAzAgCCQEBRgIJAJEDAgUCYkUAAAUBYQkAzAgCCQEBRgIJAJEDAgUCYkUAAQUBYQkAzAgCCQEBRgIJAJEDAgUCYkUAAgUBYQUDbmlsAQJiRgQCYkcCYkgCYkkCYkoEAmJ3CQECYUUABAJiSwkAkQMCBQJidwUBcgQCYkwJAJEDAgUCYncFAXMEAmJNCQCRAwIFAmJ3BQF0BAJiTgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJ3BQF1BAJiTwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJ3BQF2BAJiUAkAkQMCBQJidwUBcQQCYlEICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQJiSwILV3JvbmcgTFAgaWQIcXVhbnRpdHkEAmJSAwkAAAIFAmJLBQJiSAYJAQJhbQECE1dyb25nIHBheW1lbnQgYXNzZXQDCQAAAgUCYlIFAmJSBAJiUwMJAGcCBQJiTgUCYk8FAmJOBQJiTwMJAAACBQJiUwUCYlMEAmJUCQECYVkBBQJiTAQCYlUJAQFDAgUCYlQFAmJTBAJiVgkBAmFZAQUCYk0EAmJXCQEBQwIFAmJWBQJiUwQCYlgJAQJiYQIFAmJXBQJiVQQCYlkJAQFGAgUCYlgFAWEEAmJaCQEBQwIFAmJJBQFhBAJjYQkBAUMCBQJiUQUBYQQCY2IJALwCAwUCYlUFAmJaBQJjYQQCY2MJALwCAwUCYlcFAmJaBQJjYQQCY2QJAQFGAgUCY2IFAmJTBAJjZQkBAUYCBQJjYwUCYlMEAmNmAwkAAAIFAmJHAgAFA25pbAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJiSgUCY2QDCQAAAgUCYkwCBVdBVkVTBQR1bml0CQDZBAEFAmJMCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmJKBQJjZQMJAAACBQJiTQIFV0FWRVMFBHVuaXQJANkEAQUCYk0JAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVgCCQClCAEFAmJKBQJiRwkBAmFVBgUCY2QFAmNlBQJiSQUCYlkFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFRAAUCYlkJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFSAgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUCYlkFA25pbAkAnAoKBQJjZAUCY2UFAmJMBQJiTQUCYlQFAmJWBQJiUQUCYlgFAmJQBQJjZgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECY2cMAmJHAmNoAmNpAmNqAmNrAmNsAmJKAmNtAmNuAmNvAmNwAmNxBAJidwkBAmFFAAQCYksJANkEAQkAkQMCBQJidwUBcgQCY3IJAJEDAgUCYncFAXMEAmNzCQCRAwIFAmJ3BQF0BAJjdAkAkQMCBQJidwUBdwQCY3UJAJEDAgUCYncFAXgEAmJOCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYncFAXUEAmJPCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYncFAXYEAmJQCQCRAwIFAmJ3BQFxBAJiUQgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBBQJiSwIOV3JvbmcgbHAgYXNzZXQIcXVhbnRpdHkEAmJUAwUCY20JAQJhWQEFAmNyAwMFAmNvCQAAAgUCY3EFAmNyBwkAZQIJAQJhWQEFAmNyBQJjcAMFAmNvCQECYVkBBQJjcgkAZQIJAQJhWQEFAmNyBQJjaQQCYlYDBQJjbQkBAmFZAQUCY3MDAwUCY28JAAACBQJjcQUCY3MHCQBlAgkBAmFZAQUCY3MFAmNwAwUCY28JAQJhWQEFAmNzCQBlAgkBAmFZAQUCY3MFAmNrBAJiUwMJAGcCBQJiTgUCYk8FAmJOBQJiTwMJAAACBQJiUwUCYlMEAmN2CQEBQwIFAmNpBQJiUwQCY3cJAQFDAgUCY2sFAmJTBAJjeAkBAmJhAgUCY3cFAmN2BAJiVQkBAUMCBQJiVAUCYlMEAmJXCQEBQwIFAmJWBQJiUwQCY3kDCQAAAgUCYlEAAAQCYlgFAWUEAmN6BQFlBAJjQQkAdgYJALkCAgUCY3YFAmN3AAAJALYCAQAFAAEAAAUERE9XTgkAlwoFCQEBRgIFAmNBBQFhCQEBRgIFAmN2BQJiUwkBAUYCBQJjdwUCYlMJAQJiYQIJALcCAgUCYlcFAmN3CQC3AgIFAmJVBQJjdgUCY3oEAmJYCQECYmECBQJiVwUCYlUEAmNCCQC8AgMJAQFNAQkAuAICBQJiWAUCY3gFAWMFAmJYBAJjegkBAUMCBQJjaAUBYQQCY0MDCQAAAgMJAQIhPQIFAmJYBQFlCQC/AgIFAmNCBQJjegcGBgkBAmFtAQkArAICCQCsAgIJAKwCAgIPUHJpY2Ugc2xpcHBhZ2UgCQCmAwEFAmNCAgMgPiAJAKYDAQUCY3oDCQAAAgUCY0MFAmNDBAJjYQkBAUMCBQJiUQUBYQQCY0QJALwCAwUCY3YFAmJYBQFjBAJjRQkAvAIDBQJjdwUBYwUCYlgEAmNGAwkAvwICBQJjRAUCY3cJAJQKAgUCY0UFAmN2CQCUCgIFAmN2BQJjRAQCY0cIBQJjRgJfMQQCY0gIBQJjRgJfMgQCY0EJALwCAwUCY2EFAmNIBQJiVwkAlwoFCQEBRgIFAmNBBQFhCQEBRgIFAmNHBQJiUwkBAUYCBQJjSAUCYlMFAmJYBQJjegkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQCY0kIBQJjeQJfMQQCY0oIBQJjeQJfMgQCY0sIBQJjeQJfMwQCY0wJAQFGAggFAmN5Al80BQFhBAJjTQkBAUYCCAUCY3kCXzUFAWEEAmNOAwkAZgIFAmNJAAAGCQECYW0BAgdMUCA8PSAwAwkAAAIFAmNOBQJjTgQCY08DCQEBIQEFAmNuAAAFAmNJBAJjUAkAZQIFAmNpBQJjSgQCY1EJAGUCBQJjawUCY0sEAmNSAwMFAmNvCQAAAgUCY3EFAmNyBwkAlAoCBQJjcAAAAwMFAmNvCQAAAgUCY3EFAmNzBwkAlAoCAAAFAmNwCQCUCgIFAmNKBQJjSwQCY1MIBQJjUgJfMQQCY1QIBQJjUgJfMgQCY1UJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFRAAUCY0wJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFSAgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUCY0wJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVUCBQJiSgUCYkcJAQJhSgoFAmNTBQJjVAUCY08FAmNMBQJjaAUCY00FBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFAmNQBQJjUQUDbmlsCQCfCg0FAmNJBQJjTwUCY0wFAmJUBQJiVgUCYlEFAmJLBQJiUAUCY1UFAmNQBQJjUQUCY2oFAmNsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJjVgECY1cEAmJ3CQECYUUABAJjWAkAkQMCBQJidwUBcwQCY1kJAJEDAgUCYncFAXQEAmJQCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYncFAXEEAmJ4CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYncFAXUEAmJ5CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYncFAXYEAmNaCQECYVkBBQJjWAQCZGEJAQJhWQEFAmNZBAJiWAMJAAACCAUCY1cJb3JkZXJUeXBlBQNCdXkJAQJibgQFAmJ4BQJieQkAZAIFAmNaCAUCY1cGYW1vdW50BQJkYQkBAmJuBAUCYngFAmJ5CQBlAgUCY1oIBQJjVwZhbW91bnQFAmRhBAJiWQkBAUYCBQJiWAUBYQMDAwkBAmFCAAYJAAACBQJiUAUBbgYJAAACBQJiUAUBbwkBAmFtAQINQWRtaW4gYmxvY2tlZAQCZGIICAUCY1cJYXNzZXRQYWlyC2Ftb3VudEFzc2V0BAJkYwMJAAACBQJkYgUEdW5pdAIFV0FWRVMJANgEAQkBBXZhbHVlAQUCZGIEAmRkCAgFAmNXCWFzc2V0UGFpcgpwcmljZUFzc2V0BAJkZQMJAAACBQJkZAUEdW5pdAIFV0FWRVMJANgEAQkBBXZhbHVlAQUCZGQDAwkBAiE9AgUCZGMFAmNYBgkBAiE9AgUCZGUFAmNZCQECYW0BAglXciBhc3NldHMEAmRmCAUCY1cFcHJpY2UEAmJPCQBrAwUBYQUCYnkFAmJ4BAJkZwkBAUkDBQJkZgUBYQUCYk8EAmRoAwkAAAIIBQJjVwlvcmRlclR5cGUFA0J1eQkAZwIFAmJZBQJkZwkAZwIFAmRnBQJiWQYBAmRpAQJkagQCZGsDCQAAAgkAkAMBCAUCZGoIcGF5bWVudHMAAQYJAQJhbQECEjEgcGF5bWVudCBleHBlY3RlZAMJAAACBQJkawUCZGsEAmRsCQEFdmFsdWUBCQCRAwIIBQJkaghwYXltZW50cwAABAJiSAkBBXZhbHVlAQgFAmRsB2Fzc2V0SWQEAmNwCAUCZGwGYW1vdW50BAJjeQkBAmJGBAkA2AQBCAUCZGoNdHJhbnNhY3Rpb25JZAkA2AQBBQJiSAUCY3AIBQJkagZjYWxsZXIEAmNkCAUCY3kCXzEEAmNlCAUCY3kCXzIEAmJQCQENcGFyc2VJbnRWYWx1ZQEIBQJjeQJfOQQCY2YIBQJjeQNfMTADAwkBAmFCAAYJAAACBQJiUAUBbwkBAmFtAQkArAICAg9BZG1pbiBibG9ja2VkOiAJAKQDAQUCYlAJAJcKBQUCY2QFAmNlBQJjcAUCYkgFAmNmCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJkbQkCZG4BVwJkbwJkcAJiZwJjbgJjbwJjcAJjcQQCY3kJAQJjZwwFAVcFAmJnCAkBBXZhbHVlAQUCZG8GYW1vdW50CAkBBXZhbHVlAQUCZG8HYXNzZXRJZAgJAQV2YWx1ZQEFAmRwBmFtb3VudAgJAQV2YWx1ZQEFAmRwB2Fzc2V0SWQFAmRuBwUCY24FAmNvBQJjcAUCY3EEAmJQCQENcGFyc2VJbnRWYWx1ZQEIBQJjeQJfOAMDAwkBAmFCAAYJAAACBQJiUAUBbQYJAAACBQJiUAUBbwkBAmFtAQkArAICAghCbG9ja2VkOgkApAMBBQJiUAUCY3kBAmRxAQJkcgQCZHMJAGsDBQJkcgUCYWQFAWQJAJQKAgkAZQIFAmRyBQJkcwUCZHMBAmR0AAQCYXQJAKIIAQkBAU8AAwkAAQIFAmF0AgZTdHJpbmcEAmR1BQJhdAkA2QQBBQJkdQMJAAECBQJhdAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAQJkdgAEAmF0CQCiCAEJAQFQAAMJAAECBQJhdAIGU3RyaW5nBAJkdQUCYXQJANkEAQUCZHUDCQABAgUCYXQCBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgACZHcJAQJhbQECEVBlcm1pc3Npb24gZGVuaWVkAQJkeAECZGoEAmF0CQECZHQAAwkAAQIFAmF0AgpCeXRlVmVjdG9yBAJkeQUCYXQDCQAAAggFAmRqD2NhbGxlclB1YmxpY0tleQUCZHkGBQJkdwMJAAECBQJhdAIEVW5pdAMJAAACCAUCZGoGY2FsbGVyBQR0aGlzBgUCZHcJAAIBAgtNYXRjaCBlcnJvchUCZGoBC2NvbnN0cnVjdG9yAQJhegQCZHoJAQJkeAEFAmRqAwkAAAIFAmR6BQJkegkAzAgCCQELU3RyaW5nRW50cnkCCQEBTgAFAmF6BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZGoBCnNldE1hbmFnZXIBAmRBBAJkegkBAmR4AQUCZGoDCQAAAgUCZHoFAmR6BAJkQgkA2QQBBQJkQQMJAAACBQJkQgUCZEIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVAABQJkQQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRqAQ5jb25maXJtTWFuYWdlcgAEAmRDCQECZHYABAJkRAMJAQlpc0RlZmluZWQBBQJkQwYJAQJhbQECEk5vIHBlbmRpbmcgbWFuYWdlcgMJAAACBQJkRAUCZEQEAmRFAwkAAAIIBQJkag9jYWxsZXJQdWJsaWNLZXkJAQV2YWx1ZQEFAmRDBgkBAmFtAQIbWW91IGFyZSBub3QgcGVuZGluZyBtYW5hZ2VyAwkAAAIFAmRFBQJkRQkAzAgCCQELU3RyaW5nRW50cnkCCQEBTwAJANgEAQkBBXZhbHVlAQUCZEMJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAVAABQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZGoBA3B1dAICYmcCZEYEAmRHCQECYUkABAJkSAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCZEcFAXkCFldyb25nIHN0YWtpbmcgY29udHJhY3QEAmRJCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJkRwUBegIXV3JvZ24gc2xpcHBhZ2UgY29udHJhY3QEAmRKAwkAZwIFAmJnAAAGCQECYW0BAg53cm9uZyBzbGlwcGFnZQMJAAACBQJkSgUCZEoEAmRLAwkAAAIJAJADAQgFAmRqCHBheW1lbnRzAAIGCQECYW0BAhMyIHBheW1lbnRzIGV4cGVjdGVkAwkAAAIFAmRLBQJkSwQCZEwJAQJkbQkJAKUIAQgFAmRqBmNhbGxlcgkA2AQBCAUCZGoNdHJhbnNhY3Rpb25JZAkBD0F0dGFjaGVkUGF5bWVudAIICQEFdmFsdWUBCQCRAwIIBQJkaghwYXltZW50cwAAB2Fzc2V0SWQICQEFdmFsdWUBCQCRAwIIBQJkaghwYXltZW50cwAABmFtb3VudAkAkQMCCAUCZGoIcGF5bWVudHMAAQUCYmcGBwAAAgAEAmNPCAUCZEwCXzIEAmJLCAUCZEwCXzcEAmNmCAUCZEwCXzkEAmNQCAUCZEwDXzEwBAJjUQgFAmRMA18xMQQCYkwIBQJkTANfMTIEAmJNCAUCZEwDXzEzBAJjeQkA/AcEBQJhegIEZW1pdAkAzAgCBQJjTwUDbmlsBQNuaWwDCQAAAgUCY3kFAmN5BAJkTQQCYXQFAmN5AwkAAQIFAmF0AgdBZGRyZXNzBAJkTgUCYXQJAPwHBAUCZE4CBGVtaXQJAMwIAgUCY08FA25pbAUDbmlsBQR1bml0AwkAAAIFAmRNBQJkTQQCZE8DCQBmAgUCY1AAAAkA/AcEBQJkSQIDcHV0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmJMBQJjUAUDbmlsBQNuaWwDCQAAAgUCZE8FAmRPBAJkUAMJAGYCBQJjUQAACQD8BwQFAmRJAgNwdXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCYk0FAmNRBQNuaWwFA25pbAMJAAACBQJkUAUCZFAEAmRRAwUCZEYEAmRSCQD8BwQFAmRIAgVzdGFrZQUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJiSwUCY08FA25pbAMJAAACBQJkUgUCZFIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUCZGoGY2FsbGVyBQJjTwUCYksFA25pbAkAzggCBQJjZgUCZFEJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZGoBCXB1dE9uZVRrbgUCZFMCZFQCYmYCYmcCZEYEAmJ3CQECYUkABAJkSAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCYncFAXkCFldyb25nIHN0YWtpbmcgY29udHJhY3QEAmRJCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJidwUBegIXV3Jvbmcgc2xpcHBhZ2UgY29udHJhY3QEAmRVCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQJidwUBQQIZV3JvbmcgZ3d4IHJld2FyZCBjb250cmFjdAQCZFYJAQJhRQAEAmJMCQCRAwIFAmRWBQFzBAJiTQkAkQMCBQJkVgUBdAQCYk4JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJkVgUBdQQCYk8JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJkVgUBdgQCZFcJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBAmFiAAIABAJiSgMJAAACBQJkVwkApQgBCAUCZGoGY2FsbGVyCAUCZGoMb3JpZ2luQ2FsbGVyCAUCZGoGY2FsbGVyAwMDAwkAZwIAAAUCYmcGCQBnAgAABQJkUwYJAGcCAAAFAmRUBgkAZwIAAAUCYmYJAQJhbQECDFdyb25nIHBhcmFtcwMJAQIhPQIJAJADAQgFAmRqCHBheW1lbnRzAAEJAQJhbQECEjEgcGF5bWVudCBleHBlY3RlZAQCZGwJAQV2YWx1ZQEJAJEDAggFAmRqCHBheW1lbnRzAAAEAmJICQDYBAEJAQV2YWx1ZQEIBQJkbAdhc3NldElkBAJkWAgFAmRsBmFtb3VudAQCZFkJAQJkcQEFAmRYBAJjcAgFAmRZAl8xBAJkWggFAmRZAl8yAwMDCQBmAgUCZFMFAmNwBgkAZgIFAmRUBQJjcAYJAGYCAICt4gQFAmNwCQECYW0BAhR3cm9uZyBwYXltZW50IGFtb3VudAQCYlQJAQJhWQEFAmJMBAJiVgkBAmFZAQUCYk0EAmVhAwkAAAIFAmJIBQJiTAkAmAoGCQBlAgUCYlQFAmNwBQJiVgkAZQIFAmNwBQJkUwUCZFQAAAAAAwkAAAIFAmJIBQJiTQkAmAoGBQJiVAkAZQIFAmJWBQJjcAAAAAAJAGUCBQJjcAUCZFQFAmRTCQECYW0BAhR3cm9uZyBwYXltZW50QXNzZXRJZAQCZWIIBQJlYQJfMQQCZWMIBQJlYQJfMgQCZWQIBQJlYQJfMwQCZWUIBQJlYQJfNAQCZWYIBQJlYQJfNQQCZWcIBQJlYQJfNgQCYmwJAPwHBAUCZFUCBWNhbGNECQDMCAIJAKQDAQUCZWIJAMwIAgkApAMBBQJlYwkAzAgCBQJhQQkAzAgCBQFoCQDMCAIFAWkFA25pbAUDbmlsBAJiawkA/AcEBQJkVQIFY2FsY0QJAMwIAgkApgMBCQC2AgEJAGUCCQBkAgUCZWIFAmVkBQJlZwkAzAgCCQCmAwEJALYCAQkAZQIJAGQCBQJlYwUCZWYFAmVlCQDMCAIFAmFBCQDMCAIFAWgJAMwIAgUBaQUDbmlsBQNuaWwEAmVoCQECYmoDCQCnAwEJAQJhcwEFAmJrCQCnAwEJAQJhcwEFAmJsBQFnAwkAAAIFAmVoBQJlaAQCZEwJAQJkbQkJAKUIAQgFAmRqBmNhbGxlcgkA2AQBCAUCZGoNdHJhbnNhY3Rpb25JZAkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQUCYkwFAmRTCQEPQXR0YWNoZWRQYXltZW50AgkA2QQBBQJiTQUCZFQFAmJnBgYFAmNwBQJiSAQCYmUIBQJkTAJfMgQCYksIBQJkTAJfNwQCY2YIBQJkTAJfOQQCY1AIBQJkTANfMTAEAmNRCAUCZEwDXzExBAJlaQkBAmJkAwkAtgIBBQJiZQkAtgIBBQJiZgkAtgIBBQJiZwQCY08JAKADAQgFAmVpAl8yBAJlagkA/AcEBQJhegIEZW1pdAkAzAgCBQJjTwUDbmlsBQNuaWwDCQAAAgUCZWoFAmVqBAJkTQQCYXQFAmVqAwkAAQIFAmF0AgdBZGRyZXNzBAJkTgUCYXQJAPwHBAUCZE4CBGVtaXQJAMwIAgUCY08FA25pbAUDbmlsBQR1bml0AwkAAAIFAmRNBQJkTQQCZE8DCQBmAgUCY1AAAAkA/AcEBQJkSQIDcHV0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQUCYkwFAmNQBQNuaWwFA25pbAMJAAACBQJkTwUCZE8EAmRQAwkAZgIFAmNRAAAJAPwHBAUCZEkCA3B1dAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQDZBAEFAmJNBQJjUQUDbmlsBQNuaWwDCQAAAgUCZFAFAmRQBAJkUQMFAmRGBAJkUgkA/AcEBQJkSAIFc3Rha2UFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCYksFAmNPBQNuaWwDCQAAAgUCZFIFAmRSBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAmRqBmNhbGxlcgUCY08FAmJLBQNuaWwEAmVrAwkAZgIFAmRaAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUCYUQFAmRaCQDZBAEFAmJIBQNuaWwFA25pbAkAzggCCQDOCAIFAmNmBQJkUQUCZWsJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZGoBCnB1dEZvckZyZWUBAmVsAwkAZgIAAAUCZWwJAQJhbQECDndyb25nIHNsaXBwYWdlAwkBAiE9AgkAkAMBCAUCZGoIcGF5bWVudHMAAgkBAmFtAQITMiBwYXltZW50cyBleHBlY3RlZAQCZEwJAQJkbQkJAKUIAQgFAmRqBmNhbGxlcgkA2AQBCAUCZGoNdHJhbnNhY3Rpb25JZAkBD0F0dGFjaGVkUGF5bWVudAIICQEFdmFsdWUBCQCRAwIIBQJkaghwYXltZW50cwAAB2Fzc2V0SWQICQEFdmFsdWUBCQCRAwIIBQJkaghwYXltZW50cwAABmFtb3VudAkAkQMCCAUCZGoIcGF5bWVudHMAAQUCZWwHBwAAAgAIBQJkTAJfOQJkagEDZ2V0AAQCY3kJAQJkaQEFAmRqBAJlbQgFAmN5Al8xBAJjZQgFAmN5Al8yBAJjcAgFAmN5Al8zBAJiSAgFAmN5Al80BAJjZggFAmN5Al81BAJlbgkA/AcEBQJhegIEYnVybgkAzAgCBQJjcAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJiSAUCY3AFA25pbAMJAAACBQJlbgUCZW4FAmNmCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRqAQlnZXRPbmVUa24FAmVvAmVwAmVxAmVyAmJnAwkBAiE9AgkAkAMBCAUCZGoIcGF5bWVudHMAAQkBAmFtAQISMSBwYXltZW50IGV4cGVjdGVkBAJidwkBAmFFAAQCYksJAJEDAgUCYncFAXIEAmJMCQCRAwIFAmJ3BQFzBAJiTQkAkQMCBQJidwUBdAQCYk4JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJidwUBdQQCYk8JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJidwUBdgQCYlAJAJEDAgUCYncFAXEEAmRHCQECYUkABAJkVQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCZEcFAUECH1dyb25nIGd3eFJld2FyZENvbnRyYWN0IGFkZHJlc3MEAmRsCQEFdmFsdWUBCQCRAwIIBQJkaghwYXltZW50cwAABAJkVwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQECYWIAAgAEAmJKAwkAAAIFAmRXCQClCAEIBQJkagZjYWxsZXIIBQJkagxvcmlnaW5DYWxsZXIIBQJkagZjYWxsZXIEAmJHCQDYBAEIBQJkag10cmFuc2FjdGlvbklkBAJiSAkBBXZhbHVlAQgFAmRsB2Fzc2V0SWQEAmNwCAUCZGwGYW1vdW50AwkAZgIAgJTr3AMFAmNwCQECYW0BAhFNaW4gcGF5bWVudCAxMCBMUAMDAwkAZgIAAAUCYmcGCQBmAgAABQJlbwYJAGYCAAAFAmVxCQECYW0BAgxXcm9uZyBwYXJhbXMDCQECIT0CBQJiSwkA2AQBBQJiSAkBAmFtAQIIV3JvbmcgTFAEAmN5CQECYkYECQDYBAEIBQJkag10cmFuc2FjdGlvbklkCQDYBAEFAmJIBQJjcAgFAmRqBmNhbGxlcgQCZXMIBQJjeQJfMQQCZXQIBQJjeQJfMgQCYlQJAQJhWQEFAmJMBAJiVgkBAmFZAQUCYk0EAmV1AwkAAAIFAmVyBQJiTAkAmQoHCQBlAgUCYlQFAmVzCQBlAgUCYlYFAmV0BQJlbwUCZXQAAAAACQBkAgUCZXMFAmVvAwkAAAIFAmVyBQJiTQkAmQoHCQBlAgUCYlQFAmVzCQBlAgUCYlYFAmV0AAAAAAUCZW8FAmVzCQBkAgUCZXQFAmVvCQECYW0BAhB3cm9uZyBvdXRBc3NldElkBAJlYggFAmV1Al8xBAJlYwgFAmV1Al8yBAJlZAgFAmV1Al8zBAJlZQgFAmV1Al80BAJlZggFAmV1Al81BAJlZwgFAmV1Al82BAJldggFAmV1Al83AwMJAGYCAAAFAmVkBgkAZgIAAAUCZWYJAQJhbQECCldyb25nIGNhbGMEAmJsCQD8BwQFAmRVAgVjYWxjRAkAzAgCCQCkAwEFAmViCQDMCAIJAKQDAQUCZWMJAMwIAgUCYUEJAMwIAgUBaAkAzAgCBQFpBQNuaWwFA25pbAQCYmsJAPwHBAUCZFUCBWNhbGNECQDMCAIJAKQDAQkAZAIJAGUCBQJlYgUCZWQFAmVnCQDMCAIJAKQDAQkAZQIJAGQCBQJlYwUCZWUFAmVmCQDMCAIFAmFBCQDMCAIFAWgJAMwIAgUBaQUDbmlsBQNuaWwEAmVoCQECYmoDCQCnAwEJAQJhcwEFAmJrCQCnAwEJAQJhcwEFAmJsBQFnAwkAAAIFAmVoBQJlaAQCZXcJAQJiZAMJALYCAQUCZXYJALYCAQUCZXEJALYCAQUCYmcDCQAAAgUCZXcFAmV3BAJleAMJAAACBQJlcgUCYkwJAJQKAgkAoAMBCAUCZXcCXzIAAAkAlAoCAAAJAKADAQgFAmV3Al8yBAJleQgFAmV4Al8xBAJleggFAmV4Al8yBAJlQQkAZAIFAmV5BQJlegQCZUIJAQJkcQEFAmVBBAJlQwgFAmVCAl8xBAJkWggFAmVCAl8yBAJlRAMJAAACBQJlcgIFV0FWRVMFBHVuaXQJANkEAQUCZXIEAmVrAwkAZgIFAmRaAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUCYUQFAmRaBQJlRAUDbmlsBQNuaWwEAmJTAwkAZwIFAmJOBQJiTwUCYk4FAmJPAwkAAAIFAmJTBQJiUwQCZUUJAQJiYQIJAQFDAgUCYlYFAmJTCQEBQwIFAmJUBQJiUwQCZUYJAQFGAgUCZUUFAWEEAmNmCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmJKBQJlQwUCZUQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVgCCQClCAEFAmJKBQJiRwkBAmFVBgUCZXkFAmV6BQJjcAUCZUYFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFRAAUCZUYJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFSAgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUCZUYFA25pbAMJAAACBQJjZgUCY2YEAmVHCQD8BwQFAmF6AgRidXJuCQDMCAIFAmNwBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmJIBQJjcAUDbmlsAwkAAAIFAmVHBQJlRwkAzggCBQJjZgUCZWsJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZGoBCWdldE5vTGVzcwICZUgCZUkEAmN5CQECZGkBBQJkagQCY2QIBQJjeQJfMQQCY2UIBQJjeQJfMgQCY3AIBQJjeQJfMwQCYkgIBQJjeQJfNAQCY2YIBQJjeQJfNQQCZUoDCQBnAgUCY2QFAmVIBgkBAmFtAQkArAICCQCsAgIJAKwCAgIJRmFpbGVkOiAgCQCkAwEFAmNkAgMgPCAJAKQDAQUCZUgDCQAAAgUCZUoFAmVKBAJlSwMJAGcCBQJjZQUCZUkGCQECYW0BCQCsAgIJAKwCAgkArAICAghGYWlsZWQ6IAkApAMBBQJjZQIDIDwgCQCkAwEFAmVJAwkAAAIFAmVLBQJlSwQCZUwJAPwHBAUCYXoCBGJ1cm4JAMwIAgUCY3AFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCYkgFAmNwBQNuaWwDCQAAAgUCZUwFAmVMBQJjZgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkagENdW5zdGFrZUFuZEdldAECZHIEAmRrAwkBAiE9AgkAkAMBCAUCZGoIcGF5bWVudHMAAAkBAmFtAQIUbm8gcGF5bWVudHMgZXhwZWN0ZWQGAwkAAAIFAmRrBQJkawQCYncJAQJhRQAEAmVNCQECYUkABAJiSwkA2QQBCQCRAwIFAmJ3BQFyBAJlTgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCZU0FAXkCBXdyb25nBAJlTwkA/AcEBQJlTgIHdW5zdGFrZQkAzAgCCQDYBAEFAmJLCQDMCAIFAmRyBQNuaWwFA25pbAMJAAACBQJlTwUCZU8EAmN5CQECYkYECQDYBAEIBQJkag10cmFuc2FjdGlvbklkCQDYBAEFAmJLBQJkcggFAmRqBmNhbGxlcgQCYlAJAQ1wYXJzZUludFZhbHVlAQgFAmN5Al85BAJjZggFAmN5A18xMAQCZVADAwkBAmFCAAYJAAACBQJiUAUBbwkBAmFtAQkArAICAglCbG9ja2VkOiAJAKQDAQUCYlAGAwkAAAIFAmVQBQJlUAQCZVEJAPwHBAUCYXoCBGJ1cm4JAMwIAgUCZHIFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCYksFAmRyBQNuaWwDCQAAAgUCZVEFAmVRBQJjZgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkagEIYWN0aXZhdGUCAmVSAmVTAwkBAiE9AgkApQgBCAUCZGoGY2FsbGVyCQClCAEFAmF6CQECYW0BAgZkZW5pZWQJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCCQEBWQAFAmVSCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFaAAUCZVMFA25pbAIHc3VjY2VzcwJkagEEc2V0UwICZVQCZVADCQECIT0CCQClCAEIBQJkagZjYWxsZXIJAQJhdgIFBHRoaXMJAQJhYgAFAmR3CQDMCAIJAQtTdHJpbmdFbnRyeQIFAmVUBQJlUAUDbmlsAmRqAQRzZXRJAgJlVAJlUAMJAQIhPQIJAKUIAQgFAmRqBmNhbGxlcgkBAmF2AgUEdGhpcwkBAmFiAAUCZHcJAMwIAgkBDEludGVnZXJFbnRyeQIFAmVUBQJlUAUDbmlsAmRqARxnZXRQb29sQ29uZmlnV3JhcHBlclJFQURPTkxZAAkAlAoCBQNuaWwJAQJhRQACZGoBHGdldEFjY0JhbGFuY2VXcmFwcGVyUkVBRE9OTFkBAmFaCQCUCgIFA25pbAkBAmFZAQUCYVoCZGoBGWNhbGNQcmljZXNXcmFwcGVyUkVBRE9OTFkDAmJxAmJyAmJ2BAJlVQkBAmJ1AwUCYnEFAmJyBQJidgkAlAoCBQNuaWwJAMwIAgkApgMBCQCRAwIFAmVVAAAJAMwIAgkApgMBCQCRAwIFAmVVAAEJAMwIAgkApgMBCQCRAwIFAmVVAAIFA25pbAJkagEWZnJvbVgxOFdyYXBwZXJSRUFET05MWQIBRwJlVgkAlAoCBQNuaWwJAQFGAgkApwMBBQFHBQJlVgJkagEUdG9YMThXcmFwcGVyUkVBRE9OTFkCAUQBRQkAlAoCBQNuaWwJAKYDAQkBAUMCBQFEBQFFAmRqAR5jYWxjUHJpY2VCaWdJbnRXcmFwcGVyUkVBRE9OTFkCAmJiAmJjCQCUCgIFA25pbAkApgMBCQECYmECCQCnAwEFAmJiCQCnAwEFAmJjAmRqASNlc3RpbWF0ZVB1dE9wZXJhdGlvbldyYXBwZXJSRUFET05MWQkCYkcCYmcCY2kCZVcCY2sCZVgCZVkCY20CY24JAJQKAgUDbmlsCQECY2cMBQJiRwUCYmcFAmNpBQJlVwUCY2sFAmVYBQJlWQUCY20FAmNuBwAAAgACZGoBI2VzdGltYXRlR2V0T3BlcmF0aW9uV3JhcHBlclJFQURPTkxZBAJiRwJlWgJiSQJlWQQCY3kJAQJiRgQFAmJHBQJlWgUCYkkJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAmVZCQCUCgIFA25pbAkAnAoKCAUCY3kCXzEIBQJjeQJfMggFAmN5Al8zCAUCY3kCXzQIBQJjeQJfNQgFAmN5Al82CAUCY3kCXzcJAKYDAQgFAmN5Al84CAUCY3kCXzkIBQJjeQNfMTABAmZhAQJmYgAEAmF0BQJmYQMJAAECBQJhdAIFT3JkZXIEAmNXBQJhdAQCZmMJAQJhQwAEAmFwCQECY1YBBQJjVwQCZmQJAPQDAwgFAmNXCWJvZHlCeXRlcwkAkQMCCAUCY1cGcHJvb2ZzAAAIBQJjVw9zZW5kZXJQdWJsaWNLZXkEAmZlCQD0AwMIBQJjVwlib2R5Qnl0ZXMJAJEDAggFAmNXBnByb29mcwABBQJmYwMDAwUCYXAFAmZkBwUCZmUHBgkBAmFvAwUCYXAFAmZkBQJmZQQCZmYEAmZnCQECZHQAAwkAAQIFAmZnAgpCeXRlVmVjdG9yBAJkeQUCZmcFAmR5AwkAAQIFAmZnAgRVbml0CAUCZmEPc2VuZGVyUHVibGljS2V5CQACAQILTWF0Y2ggZXJyb3IJAPQDAwgFAmZhCWJvZHlCeXRlcwkAkQMCCAUCZmEGcHJvb2ZzAAAFAmZmHaQeuA==", "chainId": 84, "height": 2185486, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8W3cKt3YsQttckkW9fcT1FfTgFJVYQGK3RrJE6gB7Sk4 Next: GJzhzkuGMUW9p3i8tYJg9ZWHDr45jnPYRLfobBZvR8uu Diff:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let scale8 = 100000000
66 let scale8BigInt = toBigInt(100000000)
77
88 let scale18 = toBigInt(1000000000000000000)
9+
10+let thousand = 1000
911
1012 let zeroBigInt = toBigInt(0)
1113
5355
5456 let idxFactGwxRewCntr = 10
5557
56-let delay = "%s__delay"
58+let feePermilleDefault = 0
5759
58-func t1 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
60+func toX18 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
5961
6062
61-func f1 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
63+func fromX18 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
6264
6365
6466 func ts (amt,resScale,curScale) = fraction(amt, resScale, curScale)
6971 else val
7072
7173
72-func fc () = "%s__factoryContract"
74+func keyFactoryContact () = "%s__factoryContract"
7375
7476
75-func mpk () = "%s__managerPublicKey"
77+func keyManagerPublicKey () = "%s__managerPublicKey"
7678
7779
78-func pmpk () = "%s__pendingManagerPublicKey"
80+func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
7981
8082
81-func pl () = "%s%s__price__last"
83+func keyPriceLast () = "%s%s__price__last"
8284
8385
84-func ph (h,t) = makeString(["%s%s%d%d__price__history", toString(h), toString(t)], SEP)
86+func keyPriceHistory (h,t) = makeString(["%s%s%d%d__price__history", toString(h), toString(t)], SEP)
8587
8688
87-func pau (ua,txId) = ((("%s%s%s__P__" + ua) + "__") + txId)
89+func keyPutActionByUser (ua,txId) = ((("%s%s%s__P__" + ua) + "__") + txId)
8890
8991
90-func gau (ua,txId) = ((("%s%s%s__G__" + ua) + "__") + txId)
92+func keyGetActionByUser (ua,txId) = ((("%s%s%s__G__" + ua) + "__") + txId)
9193
9294
93-func aa () = "%s__amountAsset"
95+func keyAmountAsset () = "%s__amountAsset"
9496
9597
96-func pa () = "%s__priceAsset"
98+func keyPriceAsset () = "%s__priceAsset"
9799
98100
99-func amp () = "%s__amp"
101+func keyAmplificator () = "%s__amp"
100102
101103
102-func ada () = "%s__addonAddr"
104+func keyAddonAddress () = "%s__addonAddr"
103105
104106
105-func lgotc (caller) = makeString(["%s%s__lastGetOneTknCall", caller], SEP)
107+let keyFeePermille = "%s__feePermille"
106108
107-
108-func lsotc (caller) = makeString(["%s%s__lastPutOneTknCall", caller], SEP)
109-
109+let feePermille = valueOrElse(getInteger(this, keyFeePermille), feePermilleDefault)
110110
111111 func fcfg () = "%s__factoryConfig"
112112
123123 func aps () = "%s__shutdown"
124124
125125
126-func toe (orV,sendrV,matchV) = throw(((((("Failed: ordValid=" + toString(orV)) + " sndrValid=") + toString(sendrV)) + " mtchrValid=") + toString(matchV)))
126+func throwErr (msg) = throw(makeString(["lp_stable.ride:", msg], " "))
127+
128+
129+func throwOrderError (orV,sendrV,matchV) = throwErr(((((("Failed: ordValid=" + toString(orV)) + " sndrValid=") + toString(sendrV)) + " mtchrValid=") + toString(matchV)))
127130
128131
129132 func str (val) = match val {
130133 case valStr: String =>
131134 valStr
132135 case _ =>
133- throw("fail cast to String")
136+ throwErr("fail cast to String")
134137 }
135138
136139
137-func strf (addr,key) = valueOrErrorMessage(getString(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
140+func getStringOrFail (addr,key) = valueOrErrorMessage(getString(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
138141
139142
140-func intf (addr,key) = valueOrErrorMessage(getInteger(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
143+func getIntOrFail (addr,key) = valueOrErrorMessage(getInteger(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
141144
142145
143-let fca = addressFromStringValue(strf(this, fc()))
146+let factoryContract = addressFromStringValue(getStringOrFail(this, keyFactoryContact()))
144147
145-let A = strf(this, amp())
148+let amplificator = getStringOrFail(this, keyAmplificator())
146149
147-func igs () = valueOrElse(getBoolean(fca, aps()), false)
150+func isGlobalShutdown () = valueOrElse(getBoolean(factoryContract, aps()), false)
148151
149152
150-func mp () = fromBase58String(strf(fca, mtpk()))
153+func getMatcherPubOrFail () = fromBase58String(getStringOrFail(factoryContract, mtpk()))
151154
152155
153-func gpc () = {
154- let amtAs = strf(this, aa())
155- let priceAs = strf(this, pa())
156- let iPriceAs = intf(fca, mba(priceAs))
157- let iAmtAs = intf(fca, mba(amtAs))
158- split(strf(fca, pc(toString(iAmtAs), toString(iPriceAs))), SEP)
156+let matcherAddress = addressFromPublicKey(getMatcherPubOrFail())
157+
158+func getPoolConfig () = {
159+ let amtAs = getStringOrFail(this, keyAmountAsset())
160+ let priceAs = getStringOrFail(this, keyPriceAsset())
161+ let iPriceAs = getIntOrFail(factoryContract, mba(priceAs))
162+ let iAmtAs = getIntOrFail(factoryContract, mba(amtAs))
163+ split(getStringOrFail(factoryContract, pc(toString(iAmtAs), toString(iPriceAs))), SEP)
159164 }
160165
161166
162-func gfc () = split(strf(fca, fcfg()), SEP)
167+func getFactoryConfig () = split(getStringOrFail(factoryContract, fcfg()), SEP)
163168
164169
165170 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)
173178 else assetBalance(this, fromBase58String(assetId))
174179
175180
176-func cpbi (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
181+func calcPriceBigInt (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
177182
178183
179-func vad (A1,A2,slippage) = {
180- let diff = fraction((A1 - A2), scale8BigInt, A2)
184+func validateAbsDiff (estimateLP,outLp,slippage) = {
185+ let diff = fraction((estimateLP - outLp), scale8BigInt, outLp)
181186 let pass = ((slippage - abs(diff)) > zeroBigInt)
182187 if (!(pass))
183- then throw(("Big slpg: " + toString(diff)))
184- else $Tuple2(pass, min([A1, A2]))
188+ then throwErr(("Big slippage: " + toString(diff)))
189+ else $Tuple2(pass, min([estimateLP, outLp]))
185190 }
186191
187192
188-func vd (D1,D0,slpg) = {
193+func validateD (D1,D0,slippage) = {
189194 let diff = fraction(D0, scale8BigInt, D1)
190- let fail = (slpg > diff)
195+ let fail = (slippage > diff)
191196 if (if (fail)
192197 then true
193198 else (D0 > D1))
194- then throw(((((((toString(D0) + " ") + toString(D1)) + " ") + toString(diff)) + " ") + toString(slpg)))
199+ then throwErr(((((((toString(D0) + " ") + toString(D1)) + " ") + toString(diff)) + " ") + toString(slippage)))
195200 else fail
196201 }
197202
198203
199-func pcp (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
200- let amtAsAmtX18 = t1(amAmt, amAssetDcm)
201- let prAsAmtX18 = t1(prAmt, prAssetDcm)
202- cpbi(prAsAmtX18, amtAsAmtX18)
204+func privateCalcPrice (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
205+ let amtAsAmtX18 = toX18(amAmt, amAssetDcm)
206+ let prAsAmtX18 = toX18(prAmt, prAssetDcm)
207+ calcPriceBigInt(prAsAmtX18, amtAsAmtX18)
203208 }
204209
205210
206211 func calcPrices (amAmt,prAmt,lpAmt) = {
207- let cfg = gpc()
212+ let cfg = getPoolConfig()
208213 let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
209214 let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
210- let priceX18 = pcp(amtAsDcm, prAsDcm, amAmt, prAmt)
211- let amAmtX18 = t1(amAmt, amtAsDcm)
212- let prAmtX18 = t1(prAmt, prAsDcm)
213- let lpAmtX18 = t1(lpAmt, scale8)
214- let lpPrInAmAsX18 = cpbi(amAmtX18, lpAmtX18)
215- let lpPrInPrAsX18 = cpbi(prAmtX18, lpAmtX18)
215+ let priceX18 = privateCalcPrice(amtAsDcm, prAsDcm, amAmt, prAmt)
216+ let amAmtX18 = toX18(amAmt, amtAsDcm)
217+ let prAmtX18 = toX18(prAmt, prAsDcm)
218+ let lpAmtX18 = toX18(lpAmt, scale8)
219+ let lpPrInAmAsX18 = calcPriceBigInt(amAmtX18, lpAmtX18)
220+ let lpPrInPrAsX18 = calcPriceBigInt(prAmtX18, lpAmtX18)
216221 [priceX18, lpPrInAmAsX18, lpPrInPrAsX18]
217222 }
218223
219224
220225 func calculatePrices (amAmt,prAmt,lpAmt) = {
221226 let p = calcPrices(amAmt, prAmt, lpAmt)
222-[f1(p[0], scale8), f1(p[1], scale8), f1(p[2], scale8)]
227+[fromX18(p[0], scale8), fromX18(p[1], scale8), fromX18(p[2], scale8)]
223228 }
224229
225230
226-func ego (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
227- let cfg = gpc()
228- let lpId = cfg[idxLPAsId]
229- let amId = cfg[idxAmAsId]
230- let prId = cfg[idxPrAsId]
231- let amDcm = parseIntValue(cfg[idxAmtAsDcm])
232- let prDcm = parseIntValue(cfg[idxPriceAsDcm])
231+func estimateGetOperation (txId58,paymentAssetId,paymentLpAmount,userAddress) = {
232+ let cfg = getPoolConfig()
233+ let lpAssetId = cfg[idxLPAsId]
234+ let amountId = cfg[idxAmAsId]
235+ let priceId = cfg[idxPrAsId]
236+ let amountDecimals = parseIntValue(cfg[idxAmtAsDcm])
237+ let priceDecimals = parseIntValue(cfg[idxPriceAsDcm])
233238 let sts = cfg[idxPoolSt]
234- let lpEmiss = valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "Wrong LP id").quantity
235- if ((lpId != pmtAssetId))
236- then throw("Wrong pmt asset")
237- else {
238- let amBalance = getAccBalance(amId)
239- let amBalanceX18 = t1(amBalance, amDcm)
240- let prBalance = getAccBalance(prId)
241- let prBalanceX18 = t1(prBalance, prDcm)
242- let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
243- let curPrice = f1(curPriceX18, scale8)
244- let pmtLpAmtX18 = t1(pmtLpAmt, scale8)
245- let lpEmissX18 = t1(lpEmiss, scale8)
246- let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissX18)
247- let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissX18)
248- let outAmAmt = f1(outAmAmtX18, amDcm)
249- let outPrAmt = f1(outPrAmtX18, prDcm)
250- let state = if ((txId58 == ""))
251- then nil
252- else [ScriptTransfer(userAddress, outAmAmt, if ((amId == "WAVES"))
253- then unit
254- else fromBase58String(amId)), ScriptTransfer(userAddress, outPrAmt, if ((prId == "WAVES"))
255- then unit
256- 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)]
257- $Tuple10(outAmAmt, outPrAmt, amId, prId, amBalance, prBalance, lpEmiss, curPriceX18, sts, state)
239+ let lpEmission = valueOrErrorMessage(assetInfo(fromBase58String(lpAssetId)), "Wrong LP id").quantity
240+ let validationBlock = if ((lpAssetId == paymentAssetId))
241+ then true
242+ else throwErr("Wrong payment asset")
243+ if ((validationBlock == validationBlock))
244+ then {
245+ let decimals = if ((amountDecimals >= priceDecimals))
246+ then amountDecimals
247+ else priceDecimals
248+ if ((decimals == decimals))
249+ then {
250+ let amountBalance = getAccBalance(amountId)
251+ let amountBalanceX18 = toX18(amountBalance, decimals)
252+ let priceBalance = getAccBalance(priceId)
253+ let priceBalanceX18 = toX18(priceBalance, decimals)
254+ let currentPriceX18 = calcPriceBigInt(priceBalanceX18, amountBalanceX18)
255+ let curPrice = fromX18(currentPriceX18, scale8)
256+ let paymentLpAmountX18 = toX18(paymentLpAmount, scale8)
257+ let lpEmissionX18 = toX18(lpEmission, scale8)
258+ let outAmountAmountX18 = fraction(amountBalanceX18, paymentLpAmountX18, lpEmissionX18)
259+ let outPriceAmountX18 = fraction(priceBalanceX18, paymentLpAmountX18, lpEmissionX18)
260+ let outAmountAmount = fromX18(outAmountAmountX18, decimals)
261+ let outPriceAmount = fromX18(outPriceAmountX18, decimals)
262+ let state = if ((txId58 == ""))
263+ then nil
264+ else [ScriptTransfer(userAddress, outAmountAmount, if ((amountId == "WAVES"))
265+ then unit
266+ else fromBase58String(amountId)), ScriptTransfer(userAddress, outPriceAmount, if ((priceId == "WAVES"))
267+ then unit
268+ else fromBase58String(priceId)), StringEntry(keyGetActionByUser(toString(userAddress), txId58), dataGetActionInfo(outAmountAmount, outPriceAmount, paymentLpAmount, curPrice, height, lastBlock.timestamp)), IntegerEntry(keyPriceLast(), curPrice), IntegerEntry(keyPriceHistory(height, lastBlock.timestamp), curPrice)]
269+ $Tuple10(outAmountAmount, outPriceAmount, amountId, priceId, amountBalance, priceBalance, lpEmission, currentPriceX18, sts, state)
270+ }
271+ else throw("Strict value is not equal to itself.")
258272 }
273+ else throw("Strict value is not equal to itself.")
259274 }
260275
261276
262-func epo (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,userAddress,isEval,emitLp,isOneAsset,pmtAmt,pmtId) = {
263- let cfg = gpc()
264- let lpId = fromBase58String(cfg[idxLPAsId])
265- let amIdStr = cfg[idxAmAsId]
266- let prIdStr = cfg[idxPrAsId]
267- let inAmIdStr = cfg[idxIAmtAsId]
268- let inPrIdStr = cfg[idxIPriceAsId]
269- let amtDcm = parseIntValue(cfg[idxAmtAsDcm])
270- let priceDcm = parseIntValue(cfg[idxPriceAsDcm])
277+func estimatePutOperation (txId58,slippageTolerance,inAmountAssetAmount,inAmountAssetId,inPriceAssetAmount,inPriceAssetId,userAddress,isEvaluate,emitLp,isOneAsset,paymentAmount,paymentId) = {
278+ let cfg = getPoolConfig()
279+ let lpAssetId = fromBase58String(cfg[idxLPAsId])
280+ let amountIdStr = cfg[idxAmAsId]
281+ let priceIdStr = cfg[idxPrAsId]
282+ let inAmountIdStr = cfg[idxIAmtAsId]
283+ let inPriceIdStr = cfg[idxIPriceAsId]
284+ let amountDecimals = parseIntValue(cfg[idxAmtAsDcm])
285+ let priceDecimals = parseIntValue(cfg[idxPriceAsDcm])
271286 let sts = cfg[idxPoolSt]
272- let lpEm = valueOrErrorMessage(assetInfo(lpId), "Wr lp as").quantity
273- let amBalance = if (isEval)
274- then getAccBalance(amIdStr)
287+ let lpEmission = valueOrErrorMessage(assetInfo(lpAssetId), "Wrong lp asset").quantity
288+ let amountBalance = if (isEvaluate)
289+ then getAccBalance(amountIdStr)
275290 else if (if (isOneAsset)
276- then (pmtId == amIdStr)
291+ then (paymentId == amountIdStr)
277292 else false)
278- then (getAccBalance(amIdStr) - pmtAmt)
293+ then (getAccBalance(amountIdStr) - paymentAmount)
279294 else if (isOneAsset)
280- then getAccBalance(amIdStr)
281- else (getAccBalance(amIdStr) - inAmAmt)
282- let prBalance = if (isEval)
283- then getAccBalance(prIdStr)
295+ then getAccBalance(amountIdStr)
296+ else (getAccBalance(amountIdStr) - inAmountAssetAmount)
297+ let priceBalance = if (isEvaluate)
298+ then getAccBalance(priceIdStr)
284299 else if (if (isOneAsset)
285- then (pmtId == prIdStr)
300+ then (paymentId == priceIdStr)
286301 else false)
287- then (getAccBalance(prIdStr) - pmtAmt)
302+ then (getAccBalance(priceIdStr) - paymentAmount)
288303 else if (isOneAsset)
289- then getAccBalance(prIdStr)
290- else (getAccBalance(prIdStr) - inPrAmt)
291- let inAmAssetAmtX18 = t1(inAmAmt, amtDcm)
292- let inPrAssetAmtX18 = t1(inPrAmt, priceDcm)
293- let userPriceX18 = cpbi(inPrAssetAmtX18, inAmAssetAmtX18)
294- let amBalanceX18 = t1(amBalance, amtDcm)
295- let prBalanceX18 = t1(prBalance, priceDcm)
296- let r = if ((lpEm == 0))
304+ then getAccBalance(priceIdStr)
305+ else (getAccBalance(priceIdStr) - inPriceAssetAmount)
306+ let decimals = if ((amountDecimals >= priceDecimals))
307+ then amountDecimals
308+ else priceDecimals
309+ if ((decimals == decimals))
297310 then {
298- let curPriceX18 = zeroBigInt
299- let slippageX18 = zeroBigInt
300- let lpAmtX18 = pow((inAmAssetAmtX18 * inPrAssetAmtX18), 0, toBigInt(5), 1, 0, DOWN)
301- $Tuple5(f1(lpAmtX18, scale8), f1(inAmAssetAmtX18, amtDcm), f1(inPrAssetAmtX18, priceDcm), cpbi((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
311+ let inAmountAssetAmountX18 = toX18(inAmountAssetAmount, decimals)
312+ let inPriceAssetAmountX18 = toX18(inPriceAssetAmount, decimals)
313+ let userPriceX18 = calcPriceBigInt(inPriceAssetAmountX18, inAmountAssetAmountX18)
314+ let amountBalanceX18 = toX18(amountBalance, decimals)
315+ let priceBalanceX18 = toX18(priceBalance, decimals)
316+ let r = if ((lpEmission == 0))
317+ then {
318+ let currentPriceX18 = zeroBigInt
319+ let slippageX18 = zeroBigInt
320+ let lpAmountX18 = pow((inAmountAssetAmountX18 * inPriceAssetAmountX18), 0, toBigInt(5), 1, 0, DOWN)
321+ $Tuple5(fromX18(lpAmountX18, scale8), fromX18(inAmountAssetAmountX18, decimals), fromX18(inPriceAssetAmountX18, decimals), calcPriceBigInt((priceBalanceX18 + inPriceAssetAmountX18), (amountBalanceX18 + inAmountAssetAmountX18)), slippageX18)
322+ }
323+ else {
324+ let currentPriceX18 = calcPriceBigInt(priceBalanceX18, amountBalanceX18)
325+ let slippageRealX18 = fraction(abs((currentPriceX18 - userPriceX18)), scale18, currentPriceX18)
326+ let slippageX18 = toX18(slippageTolerance, scale8)
327+ let validateSlippage = if (((if ((currentPriceX18 != zeroBigInt))
328+ then (slippageRealX18 > slippageX18)
329+ else false) == true))
330+ then true
331+ else throwErr(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
332+ if ((validateSlippage == validateSlippage))
333+ then {
334+ let lpEmissionX18 = toX18(lpEmission, scale8)
335+ let prViaAmX18 = fraction(inAmountAssetAmountX18, currentPriceX18, scale18)
336+ let amViaPrX18 = fraction(inPriceAssetAmountX18, scale18, currentPriceX18)
337+ let expectedAmounts = if ((prViaAmX18 > inPriceAssetAmountX18))
338+ then $Tuple2(amViaPrX18, inAmountAssetAmountX18)
339+ else $Tuple2(inAmountAssetAmountX18, prViaAmX18)
340+ let expectedAmountAssetAmountX18 = expectedAmounts._1
341+ let expectedPriceAssetAmountX18 = expectedAmounts._2
342+ let lpAmountX18 = fraction(lpEmissionX18, expectedPriceAssetAmountX18, priceBalanceX18)
343+ $Tuple5(fromX18(lpAmountX18, scale8), fromX18(expectedAmountAssetAmountX18, decimals), fromX18(expectedPriceAssetAmountX18, decimals), currentPriceX18, slippageX18)
344+ }
345+ else throw("Strict value is not equal to itself.")
346+ }
347+ let calculateLpAmount = r._1
348+ let calculateAmountAssetPayment = r._2
349+ let calculatePriceAssetPayment = r._3
350+ let currentPrice = fromX18(r._4, scale8)
351+ let slippageCalculate = fromX18(r._5, scale8)
352+ let checkCalcLpAmount = if ((calculateLpAmount > 0))
353+ then true
354+ else throwErr("LP <= 0")
355+ if ((checkCalcLpAmount == checkCalcLpAmount))
356+ then {
357+ let emitLpAmount = if (!(emitLp))
358+ then 0
359+ else calculateLpAmount
360+ let amountDiff = (inAmountAssetAmount - calculateAmountAssetPayment)
361+ let priceDiff = (inPriceAssetAmount - calculatePriceAssetPayment)
362+ let $t01622116480 = if (if (isOneAsset)
363+ then (paymentId == amountIdStr)
364+ else false)
365+ then $Tuple2(paymentAmount, 0)
366+ else if (if (isOneAsset)
367+ then (paymentId == priceIdStr)
368+ else false)
369+ then $Tuple2(0, paymentAmount)
370+ else $Tuple2(calculateAmountAssetPayment, calculatePriceAssetPayment)
371+ let writeAmAmt = $t01622116480._1
372+ let writePrAmt = $t01622116480._2
373+ let commonState = [IntegerEntry(keyPriceLast(), currentPrice), IntegerEntry(keyPriceHistory(height, lastBlock.timestamp), currentPrice), StringEntry(keyPutActionByUser(userAddress, txId58), dataPutActionInfo(writeAmAmt, writePrAmt, emitLpAmount, currentPrice, slippageTolerance, slippageCalculate, height, lastBlock.timestamp, amountDiff, priceDiff))]
374+ $Tuple13(calculateLpAmount, emitLpAmount, currentPrice, amountBalance, priceBalance, lpEmission, lpAssetId, sts, commonState, amountDiff, priceDiff, inAmountAssetId, inPriceAssetId)
375+ }
376+ else throw("Strict value is not equal to itself.")
302377 }
303- else {
304- let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
305- let slippageRealX18 = fraction(abs((curPriceX18 - userPriceX18)), scale18, curPriceX18)
306- let slippageX18 = t1(slippage, scale8)
307- if (if ((curPriceX18 != zeroBigInt))
308- then (slippageRealX18 > slippageX18)
309- else false)
310- then throw(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
311- else {
312- let lpEmissionX18 = t1(lpEm, scale8)
313- let prViaAmX18 = fraction(inAmAssetAmtX18, curPriceX18, scale18)
314- let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, curPriceX18)
315- let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
316- then $Tuple2(amViaPrX18, inPrAssetAmtX18)
317- else $Tuple2(inAmAssetAmtX18, prViaAmX18)
318- let expAmtAssetAmtX18 = expectedAmts._1
319- let expPriceAssetAmtX18 = expectedAmts._2
320- let lpAmtX18 = fraction(lpEmissionX18, expPriceAssetAmtX18, prBalanceX18)
321- $Tuple5(f1(lpAmtX18, scale8), f1(expAmtAssetAmtX18, amtDcm), f1(expPriceAssetAmtX18, priceDcm), curPriceX18, slippageX18)
322- }
323- }
324- let calcLpAmt = r._1
325- let calcAmAssetPmt = r._2
326- let calcPrAssetPmt = r._3
327- let curPrice = f1(r._4, scale8)
328- let slippageCalc = f1(r._5, scale8)
329- if ((0 >= calcLpAmt))
330- then throw("LP <= 0")
331- else {
332- let emitLpAmt = if (!(emitLp))
333- then 0
334- else calcLpAmt
335- let amDiff = (inAmAmt - calcAmAssetPmt)
336- let prDiff = (inPrAmt - calcPrAssetPmt)
337- let $t01553115876 = if (if (isOneAsset)
338- then (pmtId == amIdStr)
339- else false)
340- then $Tuple2(pmtAmt, 0)
341- else if (if (isOneAsset)
342- then (pmtId == prIdStr)
343- else false)
344- then $Tuple2(0, pmtAmt)
345- else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
346- let writeAmAmt = $t01553115876._1
347- let writePrAmt = $t01553115876._2
348- 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))]
349- $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
350- }
378+ else throw("Strict value is not equal to itself.")
351379 }
352380
353381
354-func moa (order) = {
355- let cfg = gpc()
382+func validateMatcherOrderAllowed (order) = {
383+ let cfg = getPoolConfig()
356384 let amtAsId = cfg[idxAmAsId]
357385 let prAsId = cfg[idxPrAsId]
358386 let sts = parseIntValue(cfg[idxPoolSt])
360388 let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
361389 let accAmtAsBalance = getAccBalance(amtAsId)
362390 let accPrAsBalance = getAccBalance(prAsId)
363- let curPriceX18 = if ((order.orderType == Buy))
364- then pcp(amtAsDcm, prAsDcm, (accAmtAsBalance + order.amount), accPrAsBalance)
365- else pcp(amtAsDcm, prAsDcm, (accAmtAsBalance - order.amount), accPrAsBalance)
366- let curPrice = f1(curPriceX18, scale8)
367- if (if (if (igs())
391+ let currentPriceX18 = if ((order.orderType == Buy))
392+ then privateCalcPrice(amtAsDcm, prAsDcm, (accAmtAsBalance + order.amount), accPrAsBalance)
393+ else privateCalcPrice(amtAsDcm, prAsDcm, (accAmtAsBalance - order.amount), accPrAsBalance)
394+ let curPrice = fromX18(currentPriceX18, scale8)
395+ if (if (if (isGlobalShutdown())
368396 then true
369397 else (sts == PoolMatcherDis))
370398 then true
371399 else (sts == PoolShutdown))
372- then throw("Admin blocked")
400+ then throwErr("Admin blocked")
373401 else {
374402 let orAmtAsset = order.assetPair.amountAsset
375403 let orAmtAsStr = if ((orAmtAsset == unit))
382410 if (if ((orAmtAsStr != amtAsId))
383411 then true
384412 else (orPrAsStr != prAsId))
385- then throw("Wr assets")
413+ then throwErr("Wr assets")
386414 else {
387415 let orderPrice = order.price
388- let priceDcm = fraction(scale8, prAsDcm, amtAsDcm)
389- let castOrderPrice = ts(orderPrice, scale8, priceDcm)
416+ let priceDecimals = fraction(scale8, prAsDcm, amtAsDcm)
417+ let castOrderPrice = ts(orderPrice, scale8, priceDecimals)
390418 let isOrderPriceValid = if ((order.orderType == Buy))
391419 then (curPrice >= castOrderPrice)
392420 else (castOrderPrice >= curPrice)
396424 }
397425
398426
399-func cg (i) = if ((size(i.payments) != 1))
400- then throw("1 pmnt exp")
401- else {
402- let pmt = value(i.payments[0])
403- let pmtAssetId = value(pmt.assetId)
404- let pmtAmt = pmt.amount
405- let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
406- let outAmAmt = r._1
407- let outPrAmt = r._2
408- let sts = parseIntValue(r._9)
409- let state = r._10
410- if (if (igs())
411- then true
412- else (sts == PoolShutdown))
413- then throw(("Admin blocked: " + toString(sts)))
414- else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state)
415- }
427+func commonGet (i) = {
428+ let checkPayments = if ((size(i.payments) == 1))
429+ then true
430+ else throwErr("1 payment expected")
431+ if ((checkPayments == checkPayments))
432+ then {
433+ let payment = value(i.payments[0])
434+ let paymentAssetId = value(payment.assetId)
435+ let paymentAmount = payment.amount
436+ let r = estimateGetOperation(toBase58String(i.transactionId), toBase58String(paymentAssetId), paymentAmount, i.caller)
437+ let outAmountAmount = r._1
438+ let outPriceAmount = r._2
439+ let sts = parseIntValue(r._9)
440+ let state = r._10
441+ if (if (isGlobalShutdown())
442+ then true
443+ else (sts == PoolShutdown))
444+ then throwErr(("Admin blocked: " + toString(sts)))
445+ else $Tuple5(outAmountAmount, outPriceAmount, paymentAmount, paymentAssetId, state)
446+ }
447+ else throw("Strict value is not equal to itself.")
448+ }
416449
417450
418-func cp (caller,txId,amAsPmt,prAsPmt,slippage,emitLp,isOneAsset,pmtAmt,pmtId) = {
419- let r = epo(txId, slippage, value(amAsPmt).amount, value(amAsPmt).assetId, value(prAsPmt).amount, value(prAsPmt).assetId, caller, false, emitLp, isOneAsset, pmtAmt, pmtId)
451+func commonPut (caller,txId,amountAssetPayment,priceAssetPayment,slippage,emitLp,isOneAsset,paymentAmount,paymentId) = {
452+ let r = estimatePutOperation(txId, slippage, value(amountAssetPayment).amount, value(amountAssetPayment).assetId, value(priceAssetPayment).amount, value(priceAssetPayment).assetId, caller, false, emitLp, isOneAsset, paymentAmount, paymentId)
420453 let sts = parseIntValue(r._8)
421- if (if (if (igs())
454+ if (if (if (isGlobalShutdown())
422455 then true
423456 else (sts == PoolPutDis))
424457 then true
425458 else (sts == PoolShutdown))
426- then throw(("Blocked:" + toString(sts)))
459+ then throwErr(("Blocked:" + toString(sts)))
427460 else r
428461 }
429462
430463
431-func m () = match getString(mpk()) {
464+func takeFee (amount) = {
465+ let fee = fraction(amount, feePermille, thousand)
466+ $Tuple2((amount - fee), fee)
467+ }
468+
469+
470+func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
432471 case s: String =>
433472 fromBase58String(s)
434473 case _: Unit =>
438477 }
439478
440479
441-func pm () = match getString(pmpk()) {
480+func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
442481 case s: String =>
443482 fromBase58String(s)
444483 case _: Unit =>
448487 }
449488
450489
451-let pd = throw("Permission denied")
490+let pd = throwErr("Permission denied")
452491
453-func mm (i) = match m() {
492+func mustManager (i) = match managerPublicKeyOrUnit() {
454493 case pk: ByteVector =>
455494 if ((i.callerPublicKey == pk))
456495 then true
465504
466505
467506 @Callable(i)
468-func constructor (fc) = {
469- let c = mm(i)
470- if ((c == c))
471- then [StringEntry(fc(), fc)]
507+func constructor (factoryContract) = {
508+ let checkCaller = mustManager(i)
509+ if ((checkCaller == checkCaller))
510+ then [StringEntry(keyFactoryContact(), factoryContract)]
472511 else throw("Strict value is not equal to itself.")
473512 }
474513
476515
477516 @Callable(i)
478517 func setManager (pendingManagerPublicKey) = {
479- let c = mm(i)
480- if ((c == c))
518+ let checkCaller = mustManager(i)
519+ if ((checkCaller == checkCaller))
481520 then {
482- let cm = fromBase58String(pendingManagerPublicKey)
483- if ((cm == cm))
484- then [StringEntry(pmpk(), pendingManagerPublicKey)]
521+ let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
522+ if ((checkManagerPublicKey == checkManagerPublicKey))
523+ then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
485524 else throw("Strict value is not equal to itself.")
486525 }
487526 else throw("Strict value is not equal to itself.")
491530
492531 @Callable(i)
493532 func confirmManager () = {
494- let p = pm()
495- let hpm = if (isDefined(p))
533+ let pm = pendingManagerPublicKeyOrUnit()
534+ let hasPM = if (isDefined(pm))
496535 then true
497- else throw("No pending manager")
498- if ((hpm == hpm))
536+ else throwErr("No pending manager")
537+ if ((hasPM == hasPM))
499538 then {
500- let cpm = if ((i.callerPublicKey == value(p)))
539+ let checkPM = if ((i.callerPublicKey == value(pm)))
501540 then true
502- else throw("You are not pending manager")
503- if ((cpm == cpm))
504- then [StringEntry(mpk(), toBase58String(value(p))), DeleteEntry(pmpk())]
541+ else throwErr("You are not pending manager")
542+ if ((checkPM == checkPM))
543+ then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
505544 else throw("Strict value is not equal to itself.")
506545 }
507546 else throw("Strict value is not equal to itself.")
510549
511550
512551 @Callable(i)
513-func put (slip,autoStake) = {
514- let factCfg = gfc()
515- let stakingCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactStakCntr]), "Wr st addr")
516- let slipCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactSlippCntr]), "Wr sl addr")
517- if ((0 > slip))
518- then throw("Wrong slippage")
519- else if ((size(i.payments) != 2))
520- then throw("2 pmnts expd")
552+func put (slippage,autoStake) = {
553+ let factCfg = getFactoryConfig()
554+ let stakingContract = valueOrErrorMessage(addressFromString(factCfg[idxFactStakCntr]), "Wrong staking contract")
555+ let slippageContract = valueOrErrorMessage(addressFromString(factCfg[idxFactSlippCntr]), "Wrogn slippage contract")
556+ let slippageCheck = if ((slippage >= 0))
557+ then true
558+ else throwErr("wrong slippage")
559+ if ((slippageCheck == slippageCheck))
560+ then {
561+ let paymentsCheck = if ((size(i.payments) == 2))
562+ then true
563+ else throwErr("2 payments expected")
564+ if ((paymentsCheck == paymentsCheck))
565+ then {
566+ let estimatePut = commonPut(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], slippage, true, false, 0, "")
567+ let emitLpAmount = estimatePut._2
568+ let lpAssetId = estimatePut._7
569+ let state = estimatePut._9
570+ let amountDiff = estimatePut._10
571+ let priceDiff = estimatePut._11
572+ let amountId = estimatePut._12
573+ let priceId = estimatePut._13
574+ let r = invoke(factoryContract, "emit", [emitLpAmount], nil)
575+ if ((r == r))
576+ then {
577+ let el = match r {
578+ case legacy: Address =>
579+ invoke(legacy, "emit", [emitLpAmount], nil)
580+ case _ =>
581+ unit
582+ }
583+ if ((el == el))
584+ then {
585+ let sa = if ((amountDiff > 0))
586+ then invoke(slippageContract, "put", nil, [AttachedPayment(amountId, amountDiff)])
587+ else nil
588+ if ((sa == sa))
589+ then {
590+ let sp = if ((priceDiff > 0))
591+ then invoke(slippageContract, "put", nil, [AttachedPayment(priceId, priceDiff)])
592+ else nil
593+ if ((sp == sp))
594+ then {
595+ let lpTrasfer = if (autoStake)
596+ then {
597+ let ss = invoke(stakingContract, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmount)])
598+ if ((ss == ss))
599+ then nil
600+ else throw("Strict value is not equal to itself.")
601+ }
602+ else [ScriptTransfer(i.caller, emitLpAmount, lpAssetId)]
603+ (state ++ lpTrasfer)
604+ }
605+ else throw("Strict value is not equal to itself.")
606+ }
607+ else throw("Strict value is not equal to itself.")
608+ }
609+ else throw("Strict value is not equal to itself.")
610+ }
611+ else throw("Strict value is not equal to itself.")
612+ }
613+ else throw("Strict value is not equal to itself.")
614+ }
615+ else throw("Strict value is not equal to itself.")
616+ }
617+
618+
619+
620+@Callable(i)
621+func putOneTkn (amountAssetPart,priceAssetPart,outLp,slippage,autoStake) = {
622+ let cfg = getFactoryConfig()
623+ let stakingContract = valueOrErrorMessage(addressFromString(cfg[idxFactStakCntr]), "Wrong staking contract")
624+ let slippageContract = valueOrErrorMessage(addressFromString(cfg[idxFactSlippCntr]), "Wrong slippage contract")
625+ let gwxRewardContract = valueOrErrorMessage(addressFromString(cfg[idxFactGwxRewCntr]), "Wrong gwx reward contract")
626+ let poolCfg = getPoolConfig()
627+ let amountId = poolCfg[idxAmAsId]
628+ let priceId = poolCfg[idxPrAsId]
629+ let amountDecimals = parseIntValue(poolCfg[idxAmtAsDcm])
630+ let priceDecimals = parseIntValue(poolCfg[idxPriceAsDcm])
631+ let addon = valueOrElse(getString(this, keyAddonAddress()), "")
632+ let userAddress = if ((addon == toString(i.caller)))
633+ then i.originCaller
634+ else i.caller
635+ if (if (if (if ((0 >= slippage))
636+ then true
637+ else (0 >= amountAssetPart))
638+ then true
639+ else (0 >= priceAssetPart))
640+ then true
641+ else (0 >= outLp))
642+ then throwErr("Wrong params")
643+ else if ((size(i.payments) != 1))
644+ then throwErr("1 payment expected")
521645 else {
522- 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, 0, "")
523- let emitLpAmt = e._2
524- let lpAssetId = e._7
525- let state = e._9
526- let amDiff = e._10
527- let prDiff = e._11
528- let amId = e._12
529- let prId = e._13
530- let r = invoke(fca, "emit", [emitLpAmt], nil)
531- if ((r == r))
532- then {
533- let el = match r {
534- case legacy: Address =>
535- invoke(legacy, "emit", [emitLpAmt], nil)
536- case _ =>
537- unit
538- }
539- if ((el == el))
646+ let payment = value(i.payments[0])
647+ let paymentAssetId = toBase58String(value(payment.assetId))
648+ let paymentAmountRaw = payment.amount
649+ let $t02564925708 = takeFee(paymentAmountRaw)
650+ let paymentAmount = $t02564925708._1
651+ let feeAmount = $t02564925708._2
652+ if (if (if ((amountAssetPart > paymentAmount))
653+ then true
654+ else (priceAssetPart > paymentAmount))
655+ then true
656+ else (10000000 > paymentAmount))
657+ then throwErr("wrong payment amount")
658+ else {
659+ let amountBalance = getAccBalance(amountId)
660+ let priceBalance = getAccBalance(priceId)
661+ let $t02597226427 = if ((paymentAssetId == amountId))
662+ then $Tuple6((amountBalance - paymentAmount), priceBalance, (paymentAmount - amountAssetPart), priceAssetPart, 0, 0)
663+ else if ((paymentAssetId == priceId))
664+ then $Tuple6(amountBalance, (priceBalance - paymentAmount), 0, 0, (paymentAmount - priceAssetPart), amountAssetPart)
665+ else throwErr("wrong paymentAssetId")
666+ let amountBalanceNow = $t02597226427._1
667+ let priceBalanceNow = $t02597226427._2
668+ let virtSwapInAm = $t02597226427._3
669+ let virtSwapOutPr = $t02597226427._4
670+ let virtSwapInPr = $t02597226427._5
671+ let virtSwapOutAm = $t02597226427._6
672+ let D0 = invoke(gwxRewardContract, "calcD", [toString(amountBalanceNow), toString(priceBalanceNow), amplificator, Amult, Dconv], nil)
673+ let D1 = invoke(gwxRewardContract, "calcD", [toString(toBigInt(((amountBalanceNow + virtSwapInAm) - virtSwapOutAm))), toString(toBigInt(((priceBalanceNow + virtSwapInPr) - virtSwapOutPr))), amplificator, Amult, Dconv], nil)
674+ let D0vsD1 = validateD(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
675+ if ((D0vsD1 == D0vsD1))
540676 then {
541- let sa = if ((amDiff > 0))
542- then invoke(slipCntr, "put", nil, [AttachedPayment(amId, amDiff)])
543- else nil
544- if ((sa == sa))
677+ let estimatePut = commonPut(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(fromBase58String(amountId), amountAssetPart), AttachedPayment(fromBase58String(priceId), priceAssetPart), slippage, true, true, paymentAmount, paymentAssetId)
678+ let estimateLP = estimatePut._2
679+ let lpAssetId = estimatePut._7
680+ let state = estimatePut._9
681+ let amountDiff = estimatePut._10
682+ let priceDiff = estimatePut._11
683+ let lpCalcRes = validateAbsDiff(toBigInt(estimateLP), toBigInt(outLp), toBigInt(slippage))
684+ let emitLpAmount = toInt(lpCalcRes._2)
685+ let e = invoke(factoryContract, "emit", [emitLpAmount], nil)
686+ if ((e == e))
545687 then {
546- let sp = if ((prDiff > 0))
547- then invoke(slipCntr, "put", nil, [AttachedPayment(prId, prDiff)])
548- else nil
549- if ((sp == sp))
688+ let el = match e {
689+ case legacy: Address =>
690+ invoke(legacy, "emit", [emitLpAmount], nil)
691+ case _ =>
692+ unit
693+ }
694+ if ((el == el))
550695 then {
551- let lpTrnsfr = if (autoStake)
696+ let sa = if ((amountDiff > 0))
697+ then invoke(slippageContract, "put", nil, [AttachedPayment(fromBase58String(amountId), amountDiff)])
698+ else nil
699+ if ((sa == sa))
552700 then {
553- let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
554- if ((ss == ss))
555- then nil
701+ let sp = if ((priceDiff > 0))
702+ then invoke(slippageContract, "put", nil, [AttachedPayment(fromBase58String(priceId), priceDiff)])
703+ else nil
704+ if ((sp == sp))
705+ then {
706+ let lpTrasfer = if (autoStake)
707+ then {
708+ let ss = invoke(stakingContract, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmount)])
709+ if ((ss == ss))
710+ then nil
711+ else throw("Strict value is not equal to itself.")
712+ }
713+ else [ScriptTransfer(i.caller, emitLpAmount, lpAssetId)]
714+ let sendFeeToMatcher = if ((feeAmount > 0))
715+ then [ScriptTransfer(matcherAddress, feeAmount, fromBase58String(paymentAssetId))]
716+ else nil
717+ ((state ++ lpTrasfer) ++ sendFeeToMatcher)
718+ }
556719 else throw("Strict value is not equal to itself.")
557720 }
558- else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
559- (state ++ lpTrnsfr)
721+ else throw("Strict value is not equal to itself.")
560722 }
561723 else throw("Strict value is not equal to itself.")
562724 }
564726 }
565727 else throw("Strict value is not equal to itself.")
566728 }
567- else throw("Strict value is not equal to itself.")
568729 }
569730 }
570731
571732
572733
573734 @Callable(i)
574-func putOneTkn (amAssetPart,prAssetPart,outLp,slippage,autoStake) = {
575- let cfg = gfc()
576- let stakingCntr = valueOrErrorMessage(addressFromString(cfg[idxFactStakCntr]), "Wr st addr")
577- let slipCntr = valueOrErrorMessage(addressFromString(cfg[idxFactSlippCntr]), "Wr sl addr")
578- let gwxCntr = valueOrErrorMessage(addressFromString(cfg[idxFactGwxRewCntr]), "Wr gwx addr")
579- let poolCfg = gpc()
580- let amId = poolCfg[idxAmAsId]
581- let prId = poolCfg[idxPrAsId]
582- let amDcm = parseIntValue(poolCfg[idxAmtAsDcm])
583- let prDcm = parseIntValue(poolCfg[idxPriceAsDcm])
584- let addon = valueOrElse(getString(this, ada()), "")
585- let userAddress = if ((addon == toString(i.caller)))
586- then i.originCaller
587- else i.caller
588- let addonContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(ada()), "no addons")), "addon address in not valid")
589- let check = reentrantInvoke(addonContract, "ensureCanPutOneTkn", [toString(userAddress)], nil)
590- if ((check == check))
591- then if (if (if (if ((0 >= slippage))
592- then true
593- else (0 >= amAssetPart))
594- then true
595- else (0 >= prAssetPart))
596- then true
597- else (0 >= outLp))
598- then throw("Wrong params")
599- else if ((size(i.payments) != 1))
600- then throw("1 pmnt expd")
601- else {
602- let pmt = value(i.payments[0])
603- let pmtAssetId = toBase58String(value(pmt.assetId))
604- let pmtAmt = pmt.amount
605- if (if (if ((amAssetPart > pmtAmt))
606- then true
607- else (prAssetPart > pmtAmt))
608- then true
609- else (10000000 > pmtAmt))
610- then throw("Wrong pmt amt")
611- else {
612- let amBalance = getAccBalance(amId)
613- let prBalance = getAccBalance(prId)
614- let $t02483225212 = if ((pmtAssetId == amId))
615- then $Tuple6((amBalance - pmtAmt), prBalance, (pmtAmt - amAssetPart), prAssetPart, 0, 0)
616- else if ((pmtAssetId == prId))
617- then $Tuple6(amBalance, (prBalance - pmtAmt), 0, 0, (pmtAmt - prAssetPart), amAssetPart)
618- else throw("wrong pmtAssetId")
619- let amBalanceNow = $t02483225212._1
620- let prBalanceNow = $t02483225212._2
621- let virtSwapInAm = $t02483225212._3
622- let virtSwapOutPr = $t02483225212._4
623- let virtSwapInPr = $t02483225212._5
624- let virtSwapOutAm = $t02483225212._6
625- let D0 = invoke(gwxCntr, "calcD", [toString(amBalanceNow), toString(prBalanceNow), A, Amult, Dconv], nil)
626- let D1 = invoke(gwxCntr, "calcD", [toString(toBigInt(((amBalanceNow + virtSwapInAm) - virtSwapOutAm))), toString(toBigInt(((prBalanceNow + virtSwapInPr) - virtSwapOutPr))), A, Amult, Dconv], nil)
627- let D0vsD1 = vd(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
628- if ((D0vsD1 == D0vsD1))
629- then {
630- let estPut = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(fromBase58String(amId), amAssetPart), AttachedPayment(fromBase58String(prId), prAssetPart), slippage, true, true, pmtAmt, pmtAssetId)
631- let estimLP = estPut._2
632- let lpAssetId = estPut._7
633- let state = estPut._9
634- let amDiff = estPut._10
635- let prDiff = estPut._11
636- let lpCalcRes = vad(toBigInt(estimLP), toBigInt(outLp), toBigInt(slippage))
637- let emitLpAmt = toInt(lpCalcRes._2)
638- let e = invoke(fca, "emit", [emitLpAmt], nil)
639- if ((e == e))
640- then {
641- let el = match e {
642- case legacy: Address =>
643- invoke(legacy, "emit", [emitLpAmt], nil)
644- case _ =>
645- unit
646- }
647- if ((el == el))
648- then {
649- let sa = if ((amDiff > 0))
650- then invoke(slipCntr, "put", nil, [AttachedPayment(fromBase58String(amId), amDiff)])
651- else nil
652- if ((sa == sa))
653- then {
654- let sp = if ((prDiff > 0))
655- then invoke(slipCntr, "put", nil, [AttachedPayment(fromBase58String(prId), prDiff)])
656- else nil
657- if ((sp == sp))
658- then {
659- let lpTrnsfr = if (autoStake)
660- then {
661- let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
662- if ((ss == ss))
663- then nil
664- else throw("Strict value is not equal to itself.")
665- }
666- else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
667- (state ++ lpTrnsfr)
668- }
669- else throw("Strict value is not equal to itself.")
670- }
671- else throw("Strict value is not equal to itself.")
672- }
673- else throw("Strict value is not equal to itself.")
674- }
675- else throw("Strict value is not equal to itself.")
676- }
677- else throw("Strict value is not equal to itself.")
678- }
679- }
680- else throw("Strict value is not equal to itself.")
681- }
682-
683-
684-
685-@Callable(i)
686-func putForFree (maxSlpg) = if ((0 > maxSlpg))
687- then throw("Wrong slpg")
735+func putForFree (maxslippage) = if ((0 > maxslippage))
736+ then throwErr("wrong slippage")
688737 else if ((size(i.payments) != 2))
689- then throw("2 pmnts expd")
738+ then throwErr("2 payments expected")
690739 else {
691- 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, 0, "")
692- estPut._9
740+ let estimatePut = commonPut(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], maxslippage, false, false, 0, "")
741+ estimatePut._9
693742 }
694743
695744
696745
697746 @Callable(i)
698747 func get () = {
699- let r = cg(i)
748+ let r = commonGet(i)
700749 let outAmtAmt = r._1
701- let outPrAmt = r._2
702- let pmtAmt = r._3
703- let pmtAssetId = r._4
750+ let outPriceAmount = r._2
751+ let paymentAmount = r._3
752+ let paymentAssetId = r._4
704753 let state = r._5
705- let b = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
754+ let b = invoke(factoryContract, "burn", [paymentAmount], [AttachedPayment(paymentAssetId, paymentAmount)])
706755 if ((b == b))
707756 then state
708757 else throw("Strict value is not equal to itself.")
712761
713762 @Callable(i)
714763 func getOneTkn (exchResult,notUsed,outAmount,outAssetId,slippage) = if ((size(i.payments) != 1))
715- then throw("1 pmnt expd")
764+ then throwErr("1 payment expected")
716765 else {
717- let cfg = gpc()
718- let lpId = cfg[idxLPAsId]
719- let amId = cfg[idxAmAsId]
720- let prId = cfg[idxPrAsId]
721- let amDcm = parseIntValue(cfg[idxAmtAsDcm])
722- let prDcm = parseIntValue(cfg[idxPriceAsDcm])
766+ let cfg = getPoolConfig()
767+ let lpAssetId = cfg[idxLPAsId]
768+ let amountId = cfg[idxAmAsId]
769+ let priceId = cfg[idxPrAsId]
770+ let amountDecimals = parseIntValue(cfg[idxAmtAsDcm])
771+ let priceDecimals = parseIntValue(cfg[idxPriceAsDcm])
723772 let sts = cfg[idxPoolSt]
724- let factCfg = gfc()
725- let gwxCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactGwxRewCntr]), "Wr sl addr")
726- let pmt = value(i.payments[0])
727- let addon = valueOrElse(getString(this, ada()), "")
773+ let factCfg = getFactoryConfig()
774+ let gwxRewardContract = valueOrErrorMessage(addressFromString(factCfg[idxFactGwxRewCntr]), "Wrong gwxRewardContract address")
775+ let payment = value(i.payments[0])
776+ let addon = valueOrElse(getString(this, keyAddonAddress()), "")
728777 let userAddress = if ((addon == toString(i.caller)))
729778 then i.originCaller
730779 else i.caller
731780 let txId58 = toBase58String(i.transactionId)
732- let pmtAssetId = value(pmt.assetId)
733- let pmtAmt = pmt.amount
734- let addonContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(ada()), "no addons")), "addon address in not valid")
735- let check = reentrantInvoke(addonContract, "ensureCanGetOneTkn", [toString(userAddress)], nil)
736- if ((check == check))
737- then if ((1000000000 > pmtAmt))
738- then throw("Min pmt 10 LP")
739- else if (if (if ((0 > slippage))
740- then true
741- else (0 > exchResult))
742- then true
743- else (0 > outAmount))
744- then throw("Wrong params")
745- else if ((lpId != toBase58String(pmtAssetId)))
746- then throw("Wrong LP")
747- else {
748- let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
749- let estimAmAmt = r._1
750- let estimPrAmt = r._2
751- let amBalance = getAccBalance(amId)
752- let prBalance = getAccBalance(prId)
753- let $t03024330700 = if ((outAssetId == amId))
754- then $Tuple7((amBalance - estimAmAmt), (prBalance - estimPrAmt), exchResult, estimPrAmt, 0, 0, (estimAmAmt + exchResult))
755- else if ((outAssetId == prId))
756- then $Tuple7((amBalance - estimAmAmt), (prBalance - estimPrAmt), 0, 0, exchResult, estimAmAmt, (estimPrAmt + exchResult))
757- else throw("wrong outAssetId")
758- let amBalanceNow = $t03024330700._1
759- let prBalanceNow = $t03024330700._2
760- let virtSwapInAm = $t03024330700._3
761- let virtSwapOutPr = $t03024330700._4
762- let virtSwapInPr = $t03024330700._5
763- let virtSwapOutAm = $t03024330700._6
764- let totalGet = $t03024330700._7
765- if (if ((0 > virtSwapInAm))
766- then true
767- else (0 > virtSwapInPr))
768- then throw("Wrong calc")
769- else {
770- let D0 = invoke(gwxCntr, "calcD", [toString(amBalanceNow), toString(prBalanceNow), A, Amult, Dconv], nil)
771- let D1 = invoke(gwxCntr, "calcD", [toString(((amBalanceNow - virtSwapInAm) + virtSwapOutAm)), toString(((prBalanceNow + virtSwapOutPr) - virtSwapInPr)), A, Amult, Dconv], nil)
772- let D0vsD1 = vd(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
773- if ((D0vsD1 == D0vsD1))
774- then {
775- let finalRes = vad(toBigInt(totalGet), toBigInt(outAmount), toBigInt(slippage))
776- if ((finalRes == finalRes))
777- then {
778- let $t03140531509 = if ((outAssetId == amId))
779- then $Tuple2(toInt(finalRes._2), 0)
780- else $Tuple2(0, toInt(finalRes._2))
781- let outAm = $t03140531509._1
782- let outPr = $t03140531509._2
783- let curPrX18 = cpbi(t1(prBalance, prDcm), t1(amBalance, amDcm))
784- let curPr = f1(curPrX18, scale8)
785- let state = [ScriptTransfer(userAddress, (outAm + outPr), if ((outAssetId == "WAVES"))
786- then unit
787- else fromBase58String(outAssetId)), StringEntry(gau(toString(userAddress), txId58), dataGetActionInfo(outAm, outPr, pmtAmt, curPr, height, lastBlock.timestamp)), IntegerEntry(pl(), curPr), IntegerEntry(ph(height, lastBlock.timestamp), curPr)]
788- if ((state == state))
789- then {
790- let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
791- if ((burn == burn))
792- then state
793- else throw("Strict value is not equal to itself.")
794- }
795- else throw("Strict value is not equal to itself.")
796- }
797- else throw("Strict value is not equal to itself.")
798- }
799- else throw("Strict value is not equal to itself.")
800- }
801- }
802- else throw("Strict value is not equal to itself.")
781+ let paymentAssetId = value(payment.assetId)
782+ let paymentAmount = payment.amount
783+ if ((1000000000 > paymentAmount))
784+ then throwErr("Min payment 10 LP")
785+ else if (if (if ((0 > slippage))
786+ then true
787+ else (0 > exchResult))
788+ then true
789+ else (0 > outAmount))
790+ then throwErr("Wrong params")
791+ else if ((lpAssetId != toBase58String(paymentAssetId)))
792+ then throwErr("Wrong LP")
793+ else {
794+ let r = estimateGetOperation(toBase58String(i.transactionId), toBase58String(paymentAssetId), paymentAmount, i.caller)
795+ let estimAmAmt = r._1
796+ let estimPrAmt = r._2
797+ let amountBalance = getAccBalance(amountId)
798+ let priceBalance = getAccBalance(priceId)
799+ let $t03156632034 = if ((outAssetId == amountId))
800+ then $Tuple7((amountBalance - estimAmAmt), (priceBalance - estimPrAmt), exchResult, estimPrAmt, 0, 0, (estimAmAmt + exchResult))
801+ else if ((outAssetId == priceId))
802+ then $Tuple7((amountBalance - estimAmAmt), (priceBalance - estimPrAmt), 0, 0, exchResult, estimAmAmt, (estimPrAmt + exchResult))
803+ else throwErr("wrong outAssetId")
804+ let amountBalanceNow = $t03156632034._1
805+ let priceBalanceNow = $t03156632034._2
806+ let virtSwapInAm = $t03156632034._3
807+ let virtSwapOutPr = $t03156632034._4
808+ let virtSwapInPr = $t03156632034._5
809+ let virtSwapOutAm = $t03156632034._6
810+ let totalGet = $t03156632034._7
811+ if (if ((0 > virtSwapInAm))
812+ then true
813+ else (0 > virtSwapInPr))
814+ then throwErr("Wrong calc")
815+ else {
816+ let D0 = invoke(gwxRewardContract, "calcD", [toString(amountBalanceNow), toString(priceBalanceNow), amplificator, Amult, Dconv], nil)
817+ let D1 = invoke(gwxRewardContract, "calcD", [toString(((amountBalanceNow - virtSwapInAm) + virtSwapOutAm)), toString(((priceBalanceNow + virtSwapOutPr) - virtSwapInPr)), amplificator, Amult, Dconv], nil)
818+ let D0vsD1 = validateD(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
819+ if ((D0vsD1 == D0vsD1))
820+ then {
821+ let finalRes = validateAbsDiff(toBigInt(totalGet), toBigInt(outAmount), toBigInt(slippage))
822+ if ((finalRes == finalRes))
823+ then {
824+ let $t03270332811 = if ((outAssetId == amountId))
825+ then $Tuple2(toInt(finalRes._2), 0)
826+ else $Tuple2(0, toInt(finalRes._2))
827+ let outAm = $t03270332811._1
828+ let outPr = $t03270332811._2
829+ let totalAmountRaw = (outAm + outPr)
830+ let $t03285132906 = takeFee(totalAmountRaw)
831+ let totalAmount = $t03285132906._1
832+ let feeAmount = $t03285132906._2
833+ let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
834+ then unit
835+ else fromBase58String(outAssetId)
836+ let sendFeeToMatcher = if ((feeAmount > 0))
837+ then [ScriptTransfer(matcherAddress, feeAmount, outAssetIdOrWaves)]
838+ else nil
839+ let decimals = if ((amountDecimals >= priceDecimals))
840+ then amountDecimals
841+ else priceDecimals
842+ if ((decimals == decimals))
843+ then {
844+ let curPrX18 = calcPriceBigInt(toX18(priceBalance, decimals), toX18(amountBalance, decimals))
845+ let curPr = fromX18(curPrX18, scale8)
846+ let state = [ScriptTransfer(userAddress, totalAmount, outAssetIdOrWaves), StringEntry(keyGetActionByUser(toString(userAddress), txId58), dataGetActionInfo(outAm, outPr, paymentAmount, curPr, height, lastBlock.timestamp)), IntegerEntry(keyPriceLast(), curPr), IntegerEntry(keyPriceHistory(height, lastBlock.timestamp), curPr)]
847+ if ((state == state))
848+ then {
849+ let burn = invoke(factoryContract, "burn", [paymentAmount], [AttachedPayment(paymentAssetId, paymentAmount)])
850+ if ((burn == burn))
851+ then (state ++ sendFeeToMatcher)
852+ else throw("Strict value is not equal to itself.")
853+ }
854+ else throw("Strict value is not equal to itself.")
855+ }
856+ else throw("Strict value is not equal to itself.")
857+ }
858+ else throw("Strict value is not equal to itself.")
859+ }
860+ else throw("Strict value is not equal to itself.")
861+ }
862+ }
803863 }
804864
805865
806866
807867 @Callable(i)
808868 func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = {
809- let r = cg(i)
810- let outAmAmt = r._1
811- let outPrAmt = r._2
812- let pmtAmt = r._3
813- let pmtAssetId = r._4
869+ let r = commonGet(i)
870+ let outAmountAmount = r._1
871+ let outPriceAmount = r._2
872+ let paymentAmount = r._3
873+ let paymentAssetId = r._4
814874 let state = r._5
815- if ((noLessThenAmtAsset > outAmAmt))
816- then throw(((("Failed: " + toString(outAmAmt)) + " < ") + toString(noLessThenAmtAsset)))
817- else if ((noLessThenPriceAsset > outPrAmt))
818- then throw(((("Failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset)))
819- else {
820- let burnLPAssetOnFactory = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
821- if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
822- then state
823- else throw("Strict value is not equal to itself.")
824- }
875+ let checkOutAmountAmount = if ((outAmountAmount >= noLessThenAmtAsset))
876+ then true
877+ else throwErr(((("Failed: " + toString(outAmountAmount)) + " < ") + toString(noLessThenAmtAsset)))
878+ if ((checkOutAmountAmount == checkOutAmountAmount))
879+ then {
880+ let checkOutPriceAmount = if ((outPriceAmount >= noLessThenPriceAsset))
881+ then true
882+ else throwErr(((("Failed: " + toString(outPriceAmount)) + " < ") + toString(noLessThenPriceAsset)))
883+ if ((checkOutPriceAmount == checkOutPriceAmount))
884+ then {
885+ let burnLPAssetOnFactory = invoke(factoryContract, "burn", [paymentAmount], [AttachedPayment(paymentAssetId, paymentAmount)])
886+ if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
887+ then state
888+ else throw("Strict value is not equal to itself.")
889+ }
890+ else throw("Strict value is not equal to itself.")
891+ }
892+ else throw("Strict value is not equal to itself.")
825893 }
826894
827895
829897 @Callable(i)
830898 func unstakeAndGet (amount) = {
831899 let checkPayments = if ((size(i.payments) != 0))
832- then throw("No pmnts expd")
900+ then throwErr("no payments expected")
833901 else true
834902 if ((checkPayments == checkPayments))
835903 then {
836- let cfg = gpc()
837- let factoryCfg = gfc()
904+ let cfg = getPoolConfig()
905+ let factoryCfg = getFactoryConfig()
838906 let lpAssetId = fromBase58String(cfg[idxLPAsId])
839- let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
907+ let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "wrong")
840908 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), amount], nil)
841909 if ((unstakeInv == unstakeInv))
842910 then {
843- let r = ego(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
911+ let r = estimateGetOperation(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
844912 let sts = parseIntValue(r._9)
845913 let state = r._10
846- let v = if (if (igs())
914+ let v = if (if (isGlobalShutdown())
847915 then true
848916 else (sts == PoolShutdown))
849- then throw(("Blocked: " + toString(sts)))
917+ then throwErr(("Blocked: " + toString(sts)))
850918 else true
851919 if ((v == v))
852920 then {
853- let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
921+ let burnA = invoke(factoryContract, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
854922 if ((burnA == burnA))
855923 then state
856924 else throw("Strict value is not equal to itself.")
865933
866934
867935 @Callable(i)
868-func activate (amtAsStr,prAsStr) = if ((toString(i.caller) != toString(fca)))
869- then throw("denied")
870- else $Tuple2([StringEntry(aa(), amtAsStr), StringEntry(pa(), prAsStr)], "success")
936+func activate (amtAsStr,prAsStr) = if ((toString(i.caller) != toString(factoryContract)))
937+ then throwErr("denied")
938+ else $Tuple2([StringEntry(keyAmountAsset(), amtAsStr), StringEntry(keyPriceAsset(), prAsStr)], "success")
871939
872940
873941
874942 @Callable(i)
875-func setS (k,v) = if ((toString(i.caller) != strf(this, ada())))
943+func setS (k,v) = if ((toString(i.caller) != getStringOrFail(this, keyAddonAddress())))
876944 then pd
877945 else [StringEntry(k, v)]
878946
879947
880948
881949 @Callable(i)
882-func setI (k,v) = if ((toString(i.caller) != strf(this, ada())))
950+func setI (k,v) = if ((toString(i.caller) != getStringOrFail(this, keyAddonAddress())))
883951 then pd
884952 else [IntegerEntry(k, v)]
885953
886954
887955
888956 @Callable(i)
889-func getPoolConfigWrapperREADONLY () = $Tuple2(nil, gpc())
957+func getPoolConfigWrapperREADONLY () = $Tuple2(nil, getPoolConfig())
890958
891959
892960
904972
905973
906974 @Callable(i)
907-func fromX18WrapperREADONLY (val,resScaleMult) = $Tuple2(nil, f1(parseBigIntValue(val), resScaleMult))
975+func fromX18WrapperREADONLY (val,resScaleMult) = $Tuple2(nil, fromX18(parseBigIntValue(val), resScaleMult))
908976
909977
910978
911979 @Callable(i)
912-func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(t1(origVal, origScaleMult)))
980+func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(toX18(origVal, origScaleMult)))
913981
914982
915983
916984 @Callable(i)
917-func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(cpbi(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
985+func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(calcPriceBigInt(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
918986
919987
920988
921989 @Callable(i)
922-func estimatePutOperationWrapperREADONLY (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,usrAddr,isEval,emitLp) = $Tuple2(nil, epo(txId58, slippage, inAmAmt, inAmId, inPrAmt, inPrId, usrAddr, isEval, emitLp, false, 0, ""))
990+func estimatePutOperationWrapperREADONLY (txId58,slippage,inAmountAssetAmount,inAmId,inPriceAssetAmount,inPrId,usrAddr,isEvaluate,emitLp) = $Tuple2(nil, estimatePutOperation(txId58, slippage, inAmountAssetAmount, inAmId, inPriceAssetAmount, inPrId, usrAddr, isEvaluate, emitLp, false, 0, ""))
923991
924992
925993
926994 @Callable(i)
927-func estimateGetOperationWrapperREADONLY (txId58,pmtAsId,pmtLpAmt,usrAddr) = {
928- let r = ego(txId58, pmtAsId, pmtLpAmt, addressFromStringValue(usrAddr))
995+func estimateGetOperationWrapperREADONLY (txId58,paymentAsId,paymentLpAmount,usrAddr) = {
996+ let r = estimateGetOperation(txId58, paymentAsId, paymentLpAmount, addressFromStringValue(usrAddr))
929997 $Tuple2(nil, $Tuple10(r._1, r._2, r._3, r._4, r._5, r._6, r._7, toString(r._8), r._9, r._10))
930998 }
931999
9331001 @Verifier(tx)
9341002 func verify () = match tx {
9351003 case order: Order =>
936- let mtchPub = mp()
937- let orV = moa(order)
1004+ let mtchPub = getMatcherPubOrFail()
1005+ let orV = validateMatcherOrderAllowed(order)
9381006 let sndrV = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
9391007 let mtchV = sigVerify(order.bodyBytes, order.proofs[1], mtchPub)
9401008 if (if (if (orV)
9431011 then mtchV
9441012 else false)
9451013 then true
946- else toe(orV, sndrV, mtchV)
1014+ else throwOrderError(orV, sndrV, mtchV)
9471015 case _ =>
948- let targetPublicKey = match m() {
1016+ let targetPublicKey = match managerPublicKeyOrUnit() {
9491017 case pk: ByteVector =>
9501018 pk
9511019 case _: Unit =>
Full:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# 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)
9+
10+let thousand = 1000
911
1012 let zeroBigInt = toBigInt(0)
1113
1214 let oneBigInt = toBigInt(1)
1315
1416 let slippage4D = toBigInt((scale8 - ((scale8 * 1) / scale8)))
1517
1618 let Amult = "100"
1719
1820 let Dconv = "1"
1921
2022 let SEP = "__"
2123
2224 let EMPTY = ""
2325
2426 let PoolActive = 1
2527
2628 let PoolPutDis = 2
2729
2830 let PoolMatcherDis = 3
2931
3032 let PoolShutdown = 4
3133
3234 let idxPoolAddress = 1
3335
3436 let idxPoolSt = 2
3537
3638 let idxLPAsId = 3
3739
3840 let idxAmAsId = 4
3941
4042 let idxPrAsId = 5
4143
4244 let idxAmtAsDcm = 6
4345
4446 let idxPriceAsDcm = 7
4547
4648 let idxIAmtAsId = 8
4749
4850 let idxIPriceAsId = 9
4951
5052 let idxFactStakCntr = 1
5153
5254 let idxFactSlippCntr = 7
5355
5456 let idxFactGwxRewCntr = 10
5557
56-let delay = "%s__delay"
58+let feePermilleDefault = 0
5759
58-func t1 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
60+func toX18 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
5961
6062
61-func f1 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
63+func fromX18 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
6264
6365
6466 func ts (amt,resScale,curScale) = fraction(amt, resScale, curScale)
6567
6668
6769 func abs (val) = if ((zeroBigInt > val))
6870 then -(val)
6971 else val
7072
7173
72-func fc () = "%s__factoryContract"
74+func keyFactoryContact () = "%s__factoryContract"
7375
7476
75-func mpk () = "%s__managerPublicKey"
77+func keyManagerPublicKey () = "%s__managerPublicKey"
7678
7779
78-func pmpk () = "%s__pendingManagerPublicKey"
80+func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
7981
8082
81-func pl () = "%s%s__price__last"
83+func keyPriceLast () = "%s%s__price__last"
8284
8385
84-func ph (h,t) = makeString(["%s%s%d%d__price__history", toString(h), toString(t)], SEP)
86+func keyPriceHistory (h,t) = makeString(["%s%s%d%d__price__history", toString(h), toString(t)], SEP)
8587
8688
87-func pau (ua,txId) = ((("%s%s%s__P__" + ua) + "__") + txId)
89+func keyPutActionByUser (ua,txId) = ((("%s%s%s__P__" + ua) + "__") + txId)
8890
8991
90-func gau (ua,txId) = ((("%s%s%s__G__" + ua) + "__") + txId)
92+func keyGetActionByUser (ua,txId) = ((("%s%s%s__G__" + ua) + "__") + txId)
9193
9294
93-func aa () = "%s__amountAsset"
95+func keyAmountAsset () = "%s__amountAsset"
9496
9597
96-func pa () = "%s__priceAsset"
98+func keyPriceAsset () = "%s__priceAsset"
9799
98100
99-func amp () = "%s__amp"
101+func keyAmplificator () = "%s__amp"
100102
101103
102-func ada () = "%s__addonAddr"
104+func keyAddonAddress () = "%s__addonAddr"
103105
104106
105-func lgotc (caller) = makeString(["%s%s__lastGetOneTknCall", caller], SEP)
107+let keyFeePermille = "%s__feePermille"
106108
107-
108-func lsotc (caller) = makeString(["%s%s__lastPutOneTknCall", caller], SEP)
109-
109+let feePermille = valueOrElse(getInteger(this, keyFeePermille), feePermilleDefault)
110110
111111 func fcfg () = "%s__factoryConfig"
112112
113113
114114 func mtpk () = "%s%s__matcher__publicKey"
115115
116116
117117 func pc (iAmtAs,iPrAs) = (((("%d%d%s__" + iAmtAs) + "__") + iPrAs) + "__config")
118118
119119
120120 func mba (bAStr) = ("%s%s%s__mappings__baseAsset2internalId__" + bAStr)
121121
122122
123123 func aps () = "%s__shutdown"
124124
125125
126-func toe (orV,sendrV,matchV) = throw(((((("Failed: ordValid=" + toString(orV)) + " sndrValid=") + toString(sendrV)) + " mtchrValid=") + toString(matchV)))
126+func throwErr (msg) = throw(makeString(["lp_stable.ride:", msg], " "))
127+
128+
129+func throwOrderError (orV,sendrV,matchV) = throwErr(((((("Failed: ordValid=" + toString(orV)) + " sndrValid=") + toString(sendrV)) + " mtchrValid=") + toString(matchV)))
127130
128131
129132 func str (val) = match val {
130133 case valStr: String =>
131134 valStr
132135 case _ =>
133- throw("fail cast to String")
136+ throwErr("fail cast to String")
134137 }
135138
136139
137-func strf (addr,key) = valueOrErrorMessage(getString(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
140+func getStringOrFail (addr,key) = valueOrErrorMessage(getString(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
138141
139142
140-func intf (addr,key) = valueOrErrorMessage(getInteger(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
143+func getIntOrFail (addr,key) = valueOrErrorMessage(getInteger(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
141144
142145
143-let fca = addressFromStringValue(strf(this, fc()))
146+let factoryContract = addressFromStringValue(getStringOrFail(this, keyFactoryContact()))
144147
145-let A = strf(this, amp())
148+let amplificator = getStringOrFail(this, keyAmplificator())
146149
147-func igs () = valueOrElse(getBoolean(fca, aps()), false)
150+func isGlobalShutdown () = valueOrElse(getBoolean(factoryContract, aps()), false)
148151
149152
150-func mp () = fromBase58String(strf(fca, mtpk()))
153+func getMatcherPubOrFail () = fromBase58String(getStringOrFail(factoryContract, mtpk()))
151154
152155
153-func gpc () = {
154- let amtAs = strf(this, aa())
155- let priceAs = strf(this, pa())
156- let iPriceAs = intf(fca, mba(priceAs))
157- let iAmtAs = intf(fca, mba(amtAs))
158- split(strf(fca, pc(toString(iAmtAs), toString(iPriceAs))), SEP)
156+let matcherAddress = addressFromPublicKey(getMatcherPubOrFail())
157+
158+func getPoolConfig () = {
159+ let amtAs = getStringOrFail(this, keyAmountAsset())
160+ let priceAs = getStringOrFail(this, keyPriceAsset())
161+ let iPriceAs = getIntOrFail(factoryContract, mba(priceAs))
162+ let iAmtAs = getIntOrFail(factoryContract, mba(amtAs))
163+ split(getStringOrFail(factoryContract, pc(toString(iAmtAs), toString(iPriceAs))), SEP)
159164 }
160165
161166
162-func gfc () = split(strf(fca, fcfg()), SEP)
167+func getFactoryConfig () = split(getStringOrFail(factoryContract, fcfg()), SEP)
163168
164169
165170 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)
166171
167172
168173 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)
169174
170175
171176 func getAccBalance (assetId) = if ((assetId == "WAVES"))
172177 then wavesBalance(this).available
173178 else assetBalance(this, fromBase58String(assetId))
174179
175180
176-func cpbi (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
181+func calcPriceBigInt (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
177182
178183
179-func vad (A1,A2,slippage) = {
180- let diff = fraction((A1 - A2), scale8BigInt, A2)
184+func validateAbsDiff (estimateLP,outLp,slippage) = {
185+ let diff = fraction((estimateLP - outLp), scale8BigInt, outLp)
181186 let pass = ((slippage - abs(diff)) > zeroBigInt)
182187 if (!(pass))
183- then throw(("Big slpg: " + toString(diff)))
184- else $Tuple2(pass, min([A1, A2]))
188+ then throwErr(("Big slippage: " + toString(diff)))
189+ else $Tuple2(pass, min([estimateLP, outLp]))
185190 }
186191
187192
188-func vd (D1,D0,slpg) = {
193+func validateD (D1,D0,slippage) = {
189194 let diff = fraction(D0, scale8BigInt, D1)
190- let fail = (slpg > diff)
195+ let fail = (slippage > diff)
191196 if (if (fail)
192197 then true
193198 else (D0 > D1))
194- then throw(((((((toString(D0) + " ") + toString(D1)) + " ") + toString(diff)) + " ") + toString(slpg)))
199+ then throwErr(((((((toString(D0) + " ") + toString(D1)) + " ") + toString(diff)) + " ") + toString(slippage)))
195200 else fail
196201 }
197202
198203
199-func pcp (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
200- let amtAsAmtX18 = t1(amAmt, amAssetDcm)
201- let prAsAmtX18 = t1(prAmt, prAssetDcm)
202- cpbi(prAsAmtX18, amtAsAmtX18)
204+func privateCalcPrice (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
205+ let amtAsAmtX18 = toX18(amAmt, amAssetDcm)
206+ let prAsAmtX18 = toX18(prAmt, prAssetDcm)
207+ calcPriceBigInt(prAsAmtX18, amtAsAmtX18)
203208 }
204209
205210
206211 func calcPrices (amAmt,prAmt,lpAmt) = {
207- let cfg = gpc()
212+ let cfg = getPoolConfig()
208213 let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
209214 let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
210- let priceX18 = pcp(amtAsDcm, prAsDcm, amAmt, prAmt)
211- let amAmtX18 = t1(amAmt, amtAsDcm)
212- let prAmtX18 = t1(prAmt, prAsDcm)
213- let lpAmtX18 = t1(lpAmt, scale8)
214- let lpPrInAmAsX18 = cpbi(amAmtX18, lpAmtX18)
215- let lpPrInPrAsX18 = cpbi(prAmtX18, lpAmtX18)
215+ let priceX18 = privateCalcPrice(amtAsDcm, prAsDcm, amAmt, prAmt)
216+ let amAmtX18 = toX18(amAmt, amtAsDcm)
217+ let prAmtX18 = toX18(prAmt, prAsDcm)
218+ let lpAmtX18 = toX18(lpAmt, scale8)
219+ let lpPrInAmAsX18 = calcPriceBigInt(amAmtX18, lpAmtX18)
220+ let lpPrInPrAsX18 = calcPriceBigInt(prAmtX18, lpAmtX18)
216221 [priceX18, lpPrInAmAsX18, lpPrInPrAsX18]
217222 }
218223
219224
220225 func calculatePrices (amAmt,prAmt,lpAmt) = {
221226 let p = calcPrices(amAmt, prAmt, lpAmt)
222-[f1(p[0], scale8), f1(p[1], scale8), f1(p[2], scale8)]
227+[fromX18(p[0], scale8), fromX18(p[1], scale8), fromX18(p[2], scale8)]
223228 }
224229
225230
226-func ego (txId58,pmtAssetId,pmtLpAmt,userAddress) = {
227- let cfg = gpc()
228- let lpId = cfg[idxLPAsId]
229- let amId = cfg[idxAmAsId]
230- let prId = cfg[idxPrAsId]
231- let amDcm = parseIntValue(cfg[idxAmtAsDcm])
232- let prDcm = parseIntValue(cfg[idxPriceAsDcm])
231+func estimateGetOperation (txId58,paymentAssetId,paymentLpAmount,userAddress) = {
232+ let cfg = getPoolConfig()
233+ let lpAssetId = cfg[idxLPAsId]
234+ let amountId = cfg[idxAmAsId]
235+ let priceId = cfg[idxPrAsId]
236+ let amountDecimals = parseIntValue(cfg[idxAmtAsDcm])
237+ let priceDecimals = parseIntValue(cfg[idxPriceAsDcm])
233238 let sts = cfg[idxPoolSt]
234- let lpEmiss = valueOrErrorMessage(assetInfo(fromBase58String(lpId)), "Wrong LP id").quantity
235- if ((lpId != pmtAssetId))
236- then throw("Wrong pmt asset")
237- else {
238- let amBalance = getAccBalance(amId)
239- let amBalanceX18 = t1(amBalance, amDcm)
240- let prBalance = getAccBalance(prId)
241- let prBalanceX18 = t1(prBalance, prDcm)
242- let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
243- let curPrice = f1(curPriceX18, scale8)
244- let pmtLpAmtX18 = t1(pmtLpAmt, scale8)
245- let lpEmissX18 = t1(lpEmiss, scale8)
246- let outAmAmtX18 = fraction(amBalanceX18, pmtLpAmtX18, lpEmissX18)
247- let outPrAmtX18 = fraction(prBalanceX18, pmtLpAmtX18, lpEmissX18)
248- let outAmAmt = f1(outAmAmtX18, amDcm)
249- let outPrAmt = f1(outPrAmtX18, prDcm)
250- let state = if ((txId58 == ""))
251- then nil
252- else [ScriptTransfer(userAddress, outAmAmt, if ((amId == "WAVES"))
253- then unit
254- else fromBase58String(amId)), ScriptTransfer(userAddress, outPrAmt, if ((prId == "WAVES"))
255- then unit
256- 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)]
257- $Tuple10(outAmAmt, outPrAmt, amId, prId, amBalance, prBalance, lpEmiss, curPriceX18, sts, state)
239+ let lpEmission = valueOrErrorMessage(assetInfo(fromBase58String(lpAssetId)), "Wrong LP id").quantity
240+ let validationBlock = if ((lpAssetId == paymentAssetId))
241+ then true
242+ else throwErr("Wrong payment asset")
243+ if ((validationBlock == validationBlock))
244+ then {
245+ let decimals = if ((amountDecimals >= priceDecimals))
246+ then amountDecimals
247+ else priceDecimals
248+ if ((decimals == decimals))
249+ then {
250+ let amountBalance = getAccBalance(amountId)
251+ let amountBalanceX18 = toX18(amountBalance, decimals)
252+ let priceBalance = getAccBalance(priceId)
253+ let priceBalanceX18 = toX18(priceBalance, decimals)
254+ let currentPriceX18 = calcPriceBigInt(priceBalanceX18, amountBalanceX18)
255+ let curPrice = fromX18(currentPriceX18, scale8)
256+ let paymentLpAmountX18 = toX18(paymentLpAmount, scale8)
257+ let lpEmissionX18 = toX18(lpEmission, scale8)
258+ let outAmountAmountX18 = fraction(amountBalanceX18, paymentLpAmountX18, lpEmissionX18)
259+ let outPriceAmountX18 = fraction(priceBalanceX18, paymentLpAmountX18, lpEmissionX18)
260+ let outAmountAmount = fromX18(outAmountAmountX18, decimals)
261+ let outPriceAmount = fromX18(outPriceAmountX18, decimals)
262+ let state = if ((txId58 == ""))
263+ then nil
264+ else [ScriptTransfer(userAddress, outAmountAmount, if ((amountId == "WAVES"))
265+ then unit
266+ else fromBase58String(amountId)), ScriptTransfer(userAddress, outPriceAmount, if ((priceId == "WAVES"))
267+ then unit
268+ else fromBase58String(priceId)), StringEntry(keyGetActionByUser(toString(userAddress), txId58), dataGetActionInfo(outAmountAmount, outPriceAmount, paymentLpAmount, curPrice, height, lastBlock.timestamp)), IntegerEntry(keyPriceLast(), curPrice), IntegerEntry(keyPriceHistory(height, lastBlock.timestamp), curPrice)]
269+ $Tuple10(outAmountAmount, outPriceAmount, amountId, priceId, amountBalance, priceBalance, lpEmission, currentPriceX18, sts, state)
270+ }
271+ else throw("Strict value is not equal to itself.")
258272 }
273+ else throw("Strict value is not equal to itself.")
259274 }
260275
261276
262-func epo (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,userAddress,isEval,emitLp,isOneAsset,pmtAmt,pmtId) = {
263- let cfg = gpc()
264- let lpId = fromBase58String(cfg[idxLPAsId])
265- let amIdStr = cfg[idxAmAsId]
266- let prIdStr = cfg[idxPrAsId]
267- let inAmIdStr = cfg[idxIAmtAsId]
268- let inPrIdStr = cfg[idxIPriceAsId]
269- let amtDcm = parseIntValue(cfg[idxAmtAsDcm])
270- let priceDcm = parseIntValue(cfg[idxPriceAsDcm])
277+func estimatePutOperation (txId58,slippageTolerance,inAmountAssetAmount,inAmountAssetId,inPriceAssetAmount,inPriceAssetId,userAddress,isEvaluate,emitLp,isOneAsset,paymentAmount,paymentId) = {
278+ let cfg = getPoolConfig()
279+ let lpAssetId = fromBase58String(cfg[idxLPAsId])
280+ let amountIdStr = cfg[idxAmAsId]
281+ let priceIdStr = cfg[idxPrAsId]
282+ let inAmountIdStr = cfg[idxIAmtAsId]
283+ let inPriceIdStr = cfg[idxIPriceAsId]
284+ let amountDecimals = parseIntValue(cfg[idxAmtAsDcm])
285+ let priceDecimals = parseIntValue(cfg[idxPriceAsDcm])
271286 let sts = cfg[idxPoolSt]
272- let lpEm = valueOrErrorMessage(assetInfo(lpId), "Wr lp as").quantity
273- let amBalance = if (isEval)
274- then getAccBalance(amIdStr)
287+ let lpEmission = valueOrErrorMessage(assetInfo(lpAssetId), "Wrong lp asset").quantity
288+ let amountBalance = if (isEvaluate)
289+ then getAccBalance(amountIdStr)
275290 else if (if (isOneAsset)
276- then (pmtId == amIdStr)
291+ then (paymentId == amountIdStr)
277292 else false)
278- then (getAccBalance(amIdStr) - pmtAmt)
293+ then (getAccBalance(amountIdStr) - paymentAmount)
279294 else if (isOneAsset)
280- then getAccBalance(amIdStr)
281- else (getAccBalance(amIdStr) - inAmAmt)
282- let prBalance = if (isEval)
283- then getAccBalance(prIdStr)
295+ then getAccBalance(amountIdStr)
296+ else (getAccBalance(amountIdStr) - inAmountAssetAmount)
297+ let priceBalance = if (isEvaluate)
298+ then getAccBalance(priceIdStr)
284299 else if (if (isOneAsset)
285- then (pmtId == prIdStr)
300+ then (paymentId == priceIdStr)
286301 else false)
287- then (getAccBalance(prIdStr) - pmtAmt)
302+ then (getAccBalance(priceIdStr) - paymentAmount)
288303 else if (isOneAsset)
289- then getAccBalance(prIdStr)
290- else (getAccBalance(prIdStr) - inPrAmt)
291- let inAmAssetAmtX18 = t1(inAmAmt, amtDcm)
292- let inPrAssetAmtX18 = t1(inPrAmt, priceDcm)
293- let userPriceX18 = cpbi(inPrAssetAmtX18, inAmAssetAmtX18)
294- let amBalanceX18 = t1(amBalance, amtDcm)
295- let prBalanceX18 = t1(prBalance, priceDcm)
296- let r = if ((lpEm == 0))
304+ then getAccBalance(priceIdStr)
305+ else (getAccBalance(priceIdStr) - inPriceAssetAmount)
306+ let decimals = if ((amountDecimals >= priceDecimals))
307+ then amountDecimals
308+ else priceDecimals
309+ if ((decimals == decimals))
297310 then {
298- let curPriceX18 = zeroBigInt
299- let slippageX18 = zeroBigInt
300- let lpAmtX18 = pow((inAmAssetAmtX18 * inPrAssetAmtX18), 0, toBigInt(5), 1, 0, DOWN)
301- $Tuple5(f1(lpAmtX18, scale8), f1(inAmAssetAmtX18, amtDcm), f1(inPrAssetAmtX18, priceDcm), cpbi((prBalanceX18 + inPrAssetAmtX18), (amBalanceX18 + inAmAssetAmtX18)), slippageX18)
311+ let inAmountAssetAmountX18 = toX18(inAmountAssetAmount, decimals)
312+ let inPriceAssetAmountX18 = toX18(inPriceAssetAmount, decimals)
313+ let userPriceX18 = calcPriceBigInt(inPriceAssetAmountX18, inAmountAssetAmountX18)
314+ let amountBalanceX18 = toX18(amountBalance, decimals)
315+ let priceBalanceX18 = toX18(priceBalance, decimals)
316+ let r = if ((lpEmission == 0))
317+ then {
318+ let currentPriceX18 = zeroBigInt
319+ let slippageX18 = zeroBigInt
320+ let lpAmountX18 = pow((inAmountAssetAmountX18 * inPriceAssetAmountX18), 0, toBigInt(5), 1, 0, DOWN)
321+ $Tuple5(fromX18(lpAmountX18, scale8), fromX18(inAmountAssetAmountX18, decimals), fromX18(inPriceAssetAmountX18, decimals), calcPriceBigInt((priceBalanceX18 + inPriceAssetAmountX18), (amountBalanceX18 + inAmountAssetAmountX18)), slippageX18)
322+ }
323+ else {
324+ let currentPriceX18 = calcPriceBigInt(priceBalanceX18, amountBalanceX18)
325+ let slippageRealX18 = fraction(abs((currentPriceX18 - userPriceX18)), scale18, currentPriceX18)
326+ let slippageX18 = toX18(slippageTolerance, scale8)
327+ let validateSlippage = if (((if ((currentPriceX18 != zeroBigInt))
328+ then (slippageRealX18 > slippageX18)
329+ else false) == true))
330+ then true
331+ else throwErr(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
332+ if ((validateSlippage == validateSlippage))
333+ then {
334+ let lpEmissionX18 = toX18(lpEmission, scale8)
335+ let prViaAmX18 = fraction(inAmountAssetAmountX18, currentPriceX18, scale18)
336+ let amViaPrX18 = fraction(inPriceAssetAmountX18, scale18, currentPriceX18)
337+ let expectedAmounts = if ((prViaAmX18 > inPriceAssetAmountX18))
338+ then $Tuple2(amViaPrX18, inAmountAssetAmountX18)
339+ else $Tuple2(inAmountAssetAmountX18, prViaAmX18)
340+ let expectedAmountAssetAmountX18 = expectedAmounts._1
341+ let expectedPriceAssetAmountX18 = expectedAmounts._2
342+ let lpAmountX18 = fraction(lpEmissionX18, expectedPriceAssetAmountX18, priceBalanceX18)
343+ $Tuple5(fromX18(lpAmountX18, scale8), fromX18(expectedAmountAssetAmountX18, decimals), fromX18(expectedPriceAssetAmountX18, decimals), currentPriceX18, slippageX18)
344+ }
345+ else throw("Strict value is not equal to itself.")
346+ }
347+ let calculateLpAmount = r._1
348+ let calculateAmountAssetPayment = r._2
349+ let calculatePriceAssetPayment = r._3
350+ let currentPrice = fromX18(r._4, scale8)
351+ let slippageCalculate = fromX18(r._5, scale8)
352+ let checkCalcLpAmount = if ((calculateLpAmount > 0))
353+ then true
354+ else throwErr("LP <= 0")
355+ if ((checkCalcLpAmount == checkCalcLpAmount))
356+ then {
357+ let emitLpAmount = if (!(emitLp))
358+ then 0
359+ else calculateLpAmount
360+ let amountDiff = (inAmountAssetAmount - calculateAmountAssetPayment)
361+ let priceDiff = (inPriceAssetAmount - calculatePriceAssetPayment)
362+ let $t01622116480 = if (if (isOneAsset)
363+ then (paymentId == amountIdStr)
364+ else false)
365+ then $Tuple2(paymentAmount, 0)
366+ else if (if (isOneAsset)
367+ then (paymentId == priceIdStr)
368+ else false)
369+ then $Tuple2(0, paymentAmount)
370+ else $Tuple2(calculateAmountAssetPayment, calculatePriceAssetPayment)
371+ let writeAmAmt = $t01622116480._1
372+ let writePrAmt = $t01622116480._2
373+ let commonState = [IntegerEntry(keyPriceLast(), currentPrice), IntegerEntry(keyPriceHistory(height, lastBlock.timestamp), currentPrice), StringEntry(keyPutActionByUser(userAddress, txId58), dataPutActionInfo(writeAmAmt, writePrAmt, emitLpAmount, currentPrice, slippageTolerance, slippageCalculate, height, lastBlock.timestamp, amountDiff, priceDiff))]
374+ $Tuple13(calculateLpAmount, emitLpAmount, currentPrice, amountBalance, priceBalance, lpEmission, lpAssetId, sts, commonState, amountDiff, priceDiff, inAmountAssetId, inPriceAssetId)
375+ }
376+ else throw("Strict value is not equal to itself.")
302377 }
303- else {
304- let curPriceX18 = cpbi(prBalanceX18, amBalanceX18)
305- let slippageRealX18 = fraction(abs((curPriceX18 - userPriceX18)), scale18, curPriceX18)
306- let slippageX18 = t1(slippage, scale8)
307- if (if ((curPriceX18 != zeroBigInt))
308- then (slippageRealX18 > slippageX18)
309- else false)
310- then throw(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
311- else {
312- let lpEmissionX18 = t1(lpEm, scale8)
313- let prViaAmX18 = fraction(inAmAssetAmtX18, curPriceX18, scale18)
314- let amViaPrX18 = fraction(inPrAssetAmtX18, scale18, curPriceX18)
315- let expectedAmts = if ((prViaAmX18 > inPrAssetAmtX18))
316- then $Tuple2(amViaPrX18, inPrAssetAmtX18)
317- else $Tuple2(inAmAssetAmtX18, prViaAmX18)
318- let expAmtAssetAmtX18 = expectedAmts._1
319- let expPriceAssetAmtX18 = expectedAmts._2
320- let lpAmtX18 = fraction(lpEmissionX18, expPriceAssetAmtX18, prBalanceX18)
321- $Tuple5(f1(lpAmtX18, scale8), f1(expAmtAssetAmtX18, amtDcm), f1(expPriceAssetAmtX18, priceDcm), curPriceX18, slippageX18)
322- }
323- }
324- let calcLpAmt = r._1
325- let calcAmAssetPmt = r._2
326- let calcPrAssetPmt = r._3
327- let curPrice = f1(r._4, scale8)
328- let slippageCalc = f1(r._5, scale8)
329- if ((0 >= calcLpAmt))
330- then throw("LP <= 0")
331- else {
332- let emitLpAmt = if (!(emitLp))
333- then 0
334- else calcLpAmt
335- let amDiff = (inAmAmt - calcAmAssetPmt)
336- let prDiff = (inPrAmt - calcPrAssetPmt)
337- let $t01553115876 = if (if (isOneAsset)
338- then (pmtId == amIdStr)
339- else false)
340- then $Tuple2(pmtAmt, 0)
341- else if (if (isOneAsset)
342- then (pmtId == prIdStr)
343- else false)
344- then $Tuple2(0, pmtAmt)
345- else $Tuple2(calcAmAssetPmt, calcPrAssetPmt)
346- let writeAmAmt = $t01553115876._1
347- let writePrAmt = $t01553115876._2
348- 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))]
349- $Tuple13(calcLpAmt, emitLpAmt, curPrice, amBalance, prBalance, lpEm, lpId, sts, commonState, amDiff, prDiff, inAmId, inPrId)
350- }
378+ else throw("Strict value is not equal to itself.")
351379 }
352380
353381
354-func moa (order) = {
355- let cfg = gpc()
382+func validateMatcherOrderAllowed (order) = {
383+ let cfg = getPoolConfig()
356384 let amtAsId = cfg[idxAmAsId]
357385 let prAsId = cfg[idxPrAsId]
358386 let sts = parseIntValue(cfg[idxPoolSt])
359387 let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
360388 let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
361389 let accAmtAsBalance = getAccBalance(amtAsId)
362390 let accPrAsBalance = getAccBalance(prAsId)
363- let curPriceX18 = if ((order.orderType == Buy))
364- then pcp(amtAsDcm, prAsDcm, (accAmtAsBalance + order.amount), accPrAsBalance)
365- else pcp(amtAsDcm, prAsDcm, (accAmtAsBalance - order.amount), accPrAsBalance)
366- let curPrice = f1(curPriceX18, scale8)
367- if (if (if (igs())
391+ let currentPriceX18 = if ((order.orderType == Buy))
392+ then privateCalcPrice(amtAsDcm, prAsDcm, (accAmtAsBalance + order.amount), accPrAsBalance)
393+ else privateCalcPrice(amtAsDcm, prAsDcm, (accAmtAsBalance - order.amount), accPrAsBalance)
394+ let curPrice = fromX18(currentPriceX18, scale8)
395+ if (if (if (isGlobalShutdown())
368396 then true
369397 else (sts == PoolMatcherDis))
370398 then true
371399 else (sts == PoolShutdown))
372- then throw("Admin blocked")
400+ then throwErr("Admin blocked")
373401 else {
374402 let orAmtAsset = order.assetPair.amountAsset
375403 let orAmtAsStr = if ((orAmtAsset == unit))
376404 then "WAVES"
377405 else toBase58String(value(orAmtAsset))
378406 let orPrAsset = order.assetPair.priceAsset
379407 let orPrAsStr = if ((orPrAsset == unit))
380408 then "WAVES"
381409 else toBase58String(value(orPrAsset))
382410 if (if ((orAmtAsStr != amtAsId))
383411 then true
384412 else (orPrAsStr != prAsId))
385- then throw("Wr assets")
413+ then throwErr("Wr assets")
386414 else {
387415 let orderPrice = order.price
388- let priceDcm = fraction(scale8, prAsDcm, amtAsDcm)
389- let castOrderPrice = ts(orderPrice, scale8, priceDcm)
416+ let priceDecimals = fraction(scale8, prAsDcm, amtAsDcm)
417+ let castOrderPrice = ts(orderPrice, scale8, priceDecimals)
390418 let isOrderPriceValid = if ((order.orderType == Buy))
391419 then (curPrice >= castOrderPrice)
392420 else (castOrderPrice >= curPrice)
393421 true
394422 }
395423 }
396424 }
397425
398426
399-func cg (i) = if ((size(i.payments) != 1))
400- then throw("1 pmnt exp")
401- else {
402- let pmt = value(i.payments[0])
403- let pmtAssetId = value(pmt.assetId)
404- let pmtAmt = pmt.amount
405- let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
406- let outAmAmt = r._1
407- let outPrAmt = r._2
408- let sts = parseIntValue(r._9)
409- let state = r._10
410- if (if (igs())
411- then true
412- else (sts == PoolShutdown))
413- then throw(("Admin blocked: " + toString(sts)))
414- else $Tuple5(outAmAmt, outPrAmt, pmtAmt, pmtAssetId, state)
415- }
427+func commonGet (i) = {
428+ let checkPayments = if ((size(i.payments) == 1))
429+ then true
430+ else throwErr("1 payment expected")
431+ if ((checkPayments == checkPayments))
432+ then {
433+ let payment = value(i.payments[0])
434+ let paymentAssetId = value(payment.assetId)
435+ let paymentAmount = payment.amount
436+ let r = estimateGetOperation(toBase58String(i.transactionId), toBase58String(paymentAssetId), paymentAmount, i.caller)
437+ let outAmountAmount = r._1
438+ let outPriceAmount = r._2
439+ let sts = parseIntValue(r._9)
440+ let state = r._10
441+ if (if (isGlobalShutdown())
442+ then true
443+ else (sts == PoolShutdown))
444+ then throwErr(("Admin blocked: " + toString(sts)))
445+ else $Tuple5(outAmountAmount, outPriceAmount, paymentAmount, paymentAssetId, state)
446+ }
447+ else throw("Strict value is not equal to itself.")
448+ }
416449
417450
418-func cp (caller,txId,amAsPmt,prAsPmt,slippage,emitLp,isOneAsset,pmtAmt,pmtId) = {
419- let r = epo(txId, slippage, value(amAsPmt).amount, value(amAsPmt).assetId, value(prAsPmt).amount, value(prAsPmt).assetId, caller, false, emitLp, isOneAsset, pmtAmt, pmtId)
451+func commonPut (caller,txId,amountAssetPayment,priceAssetPayment,slippage,emitLp,isOneAsset,paymentAmount,paymentId) = {
452+ let r = estimatePutOperation(txId, slippage, value(amountAssetPayment).amount, value(amountAssetPayment).assetId, value(priceAssetPayment).amount, value(priceAssetPayment).assetId, caller, false, emitLp, isOneAsset, paymentAmount, paymentId)
420453 let sts = parseIntValue(r._8)
421- if (if (if (igs())
454+ if (if (if (isGlobalShutdown())
422455 then true
423456 else (sts == PoolPutDis))
424457 then true
425458 else (sts == PoolShutdown))
426- then throw(("Blocked:" + toString(sts)))
459+ then throwErr(("Blocked:" + toString(sts)))
427460 else r
428461 }
429462
430463
431-func m () = match getString(mpk()) {
464+func takeFee (amount) = {
465+ let fee = fraction(amount, feePermille, thousand)
466+ $Tuple2((amount - fee), fee)
467+ }
468+
469+
470+func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
432471 case s: String =>
433472 fromBase58String(s)
434473 case _: Unit =>
435474 unit
436475 case _ =>
437476 throw("Match error")
438477 }
439478
440479
441-func pm () = match getString(pmpk()) {
480+func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
442481 case s: String =>
443482 fromBase58String(s)
444483 case _: Unit =>
445484 unit
446485 case _ =>
447486 throw("Match error")
448487 }
449488
450489
451-let pd = throw("Permission denied")
490+let pd = throwErr("Permission denied")
452491
453-func mm (i) = match m() {
492+func mustManager (i) = match managerPublicKeyOrUnit() {
454493 case pk: ByteVector =>
455494 if ((i.callerPublicKey == pk))
456495 then true
457496 else pd
458497 case _: Unit =>
459498 if ((i.caller == this))
460499 then true
461500 else pd
462501 case _ =>
463502 throw("Match error")
464503 }
465504
466505
467506 @Callable(i)
468-func constructor (fc) = {
469- let c = mm(i)
470- if ((c == c))
471- then [StringEntry(fc(), fc)]
507+func constructor (factoryContract) = {
508+ let checkCaller = mustManager(i)
509+ if ((checkCaller == checkCaller))
510+ then [StringEntry(keyFactoryContact(), factoryContract)]
472511 else throw("Strict value is not equal to itself.")
473512 }
474513
475514
476515
477516 @Callable(i)
478517 func setManager (pendingManagerPublicKey) = {
479- let c = mm(i)
480- if ((c == c))
518+ let checkCaller = mustManager(i)
519+ if ((checkCaller == checkCaller))
481520 then {
482- let cm = fromBase58String(pendingManagerPublicKey)
483- if ((cm == cm))
484- then [StringEntry(pmpk(), pendingManagerPublicKey)]
521+ let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
522+ if ((checkManagerPublicKey == checkManagerPublicKey))
523+ then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
485524 else throw("Strict value is not equal to itself.")
486525 }
487526 else throw("Strict value is not equal to itself.")
488527 }
489528
490529
491530
492531 @Callable(i)
493532 func confirmManager () = {
494- let p = pm()
495- let hpm = if (isDefined(p))
533+ let pm = pendingManagerPublicKeyOrUnit()
534+ let hasPM = if (isDefined(pm))
496535 then true
497- else throw("No pending manager")
498- if ((hpm == hpm))
536+ else throwErr("No pending manager")
537+ if ((hasPM == hasPM))
499538 then {
500- let cpm = if ((i.callerPublicKey == value(p)))
539+ let checkPM = if ((i.callerPublicKey == value(pm)))
501540 then true
502- else throw("You are not pending manager")
503- if ((cpm == cpm))
504- then [StringEntry(mpk(), toBase58String(value(p))), DeleteEntry(pmpk())]
541+ else throwErr("You are not pending manager")
542+ if ((checkPM == checkPM))
543+ then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
505544 else throw("Strict value is not equal to itself.")
506545 }
507546 else throw("Strict value is not equal to itself.")
508547 }
509548
510549
511550
512551 @Callable(i)
513-func put (slip,autoStake) = {
514- let factCfg = gfc()
515- let stakingCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactStakCntr]), "Wr st addr")
516- let slipCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactSlippCntr]), "Wr sl addr")
517- if ((0 > slip))
518- then throw("Wrong slippage")
519- else if ((size(i.payments) != 2))
520- then throw("2 pmnts expd")
552+func put (slippage,autoStake) = {
553+ let factCfg = getFactoryConfig()
554+ let stakingContract = valueOrErrorMessage(addressFromString(factCfg[idxFactStakCntr]), "Wrong staking contract")
555+ let slippageContract = valueOrErrorMessage(addressFromString(factCfg[idxFactSlippCntr]), "Wrogn slippage contract")
556+ let slippageCheck = if ((slippage >= 0))
557+ then true
558+ else throwErr("wrong slippage")
559+ if ((slippageCheck == slippageCheck))
560+ then {
561+ let paymentsCheck = if ((size(i.payments) == 2))
562+ then true
563+ else throwErr("2 payments expected")
564+ if ((paymentsCheck == paymentsCheck))
565+ then {
566+ let estimatePut = commonPut(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], slippage, true, false, 0, "")
567+ let emitLpAmount = estimatePut._2
568+ let lpAssetId = estimatePut._7
569+ let state = estimatePut._9
570+ let amountDiff = estimatePut._10
571+ let priceDiff = estimatePut._11
572+ let amountId = estimatePut._12
573+ let priceId = estimatePut._13
574+ let r = invoke(factoryContract, "emit", [emitLpAmount], nil)
575+ if ((r == r))
576+ then {
577+ let el = match r {
578+ case legacy: Address =>
579+ invoke(legacy, "emit", [emitLpAmount], nil)
580+ case _ =>
581+ unit
582+ }
583+ if ((el == el))
584+ then {
585+ let sa = if ((amountDiff > 0))
586+ then invoke(slippageContract, "put", nil, [AttachedPayment(amountId, amountDiff)])
587+ else nil
588+ if ((sa == sa))
589+ then {
590+ let sp = if ((priceDiff > 0))
591+ then invoke(slippageContract, "put", nil, [AttachedPayment(priceId, priceDiff)])
592+ else nil
593+ if ((sp == sp))
594+ then {
595+ let lpTrasfer = if (autoStake)
596+ then {
597+ let ss = invoke(stakingContract, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmount)])
598+ if ((ss == ss))
599+ then nil
600+ else throw("Strict value is not equal to itself.")
601+ }
602+ else [ScriptTransfer(i.caller, emitLpAmount, lpAssetId)]
603+ (state ++ lpTrasfer)
604+ }
605+ else throw("Strict value is not equal to itself.")
606+ }
607+ else throw("Strict value is not equal to itself.")
608+ }
609+ else throw("Strict value is not equal to itself.")
610+ }
611+ else throw("Strict value is not equal to itself.")
612+ }
613+ else throw("Strict value is not equal to itself.")
614+ }
615+ else throw("Strict value is not equal to itself.")
616+ }
617+
618+
619+
620+@Callable(i)
621+func putOneTkn (amountAssetPart,priceAssetPart,outLp,slippage,autoStake) = {
622+ let cfg = getFactoryConfig()
623+ let stakingContract = valueOrErrorMessage(addressFromString(cfg[idxFactStakCntr]), "Wrong staking contract")
624+ let slippageContract = valueOrErrorMessage(addressFromString(cfg[idxFactSlippCntr]), "Wrong slippage contract")
625+ let gwxRewardContract = valueOrErrorMessage(addressFromString(cfg[idxFactGwxRewCntr]), "Wrong gwx reward contract")
626+ let poolCfg = getPoolConfig()
627+ let amountId = poolCfg[idxAmAsId]
628+ let priceId = poolCfg[idxPrAsId]
629+ let amountDecimals = parseIntValue(poolCfg[idxAmtAsDcm])
630+ let priceDecimals = parseIntValue(poolCfg[idxPriceAsDcm])
631+ let addon = valueOrElse(getString(this, keyAddonAddress()), "")
632+ let userAddress = if ((addon == toString(i.caller)))
633+ then i.originCaller
634+ else i.caller
635+ if (if (if (if ((0 >= slippage))
636+ then true
637+ else (0 >= amountAssetPart))
638+ then true
639+ else (0 >= priceAssetPart))
640+ then true
641+ else (0 >= outLp))
642+ then throwErr("Wrong params")
643+ else if ((size(i.payments) != 1))
644+ then throwErr("1 payment expected")
521645 else {
522- 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, 0, "")
523- let emitLpAmt = e._2
524- let lpAssetId = e._7
525- let state = e._9
526- let amDiff = e._10
527- let prDiff = e._11
528- let amId = e._12
529- let prId = e._13
530- let r = invoke(fca, "emit", [emitLpAmt], nil)
531- if ((r == r))
532- then {
533- let el = match r {
534- case legacy: Address =>
535- invoke(legacy, "emit", [emitLpAmt], nil)
536- case _ =>
537- unit
538- }
539- if ((el == el))
646+ let payment = value(i.payments[0])
647+ let paymentAssetId = toBase58String(value(payment.assetId))
648+ let paymentAmountRaw = payment.amount
649+ let $t02564925708 = takeFee(paymentAmountRaw)
650+ let paymentAmount = $t02564925708._1
651+ let feeAmount = $t02564925708._2
652+ if (if (if ((amountAssetPart > paymentAmount))
653+ then true
654+ else (priceAssetPart > paymentAmount))
655+ then true
656+ else (10000000 > paymentAmount))
657+ then throwErr("wrong payment amount")
658+ else {
659+ let amountBalance = getAccBalance(amountId)
660+ let priceBalance = getAccBalance(priceId)
661+ let $t02597226427 = if ((paymentAssetId == amountId))
662+ then $Tuple6((amountBalance - paymentAmount), priceBalance, (paymentAmount - amountAssetPart), priceAssetPart, 0, 0)
663+ else if ((paymentAssetId == priceId))
664+ then $Tuple6(amountBalance, (priceBalance - paymentAmount), 0, 0, (paymentAmount - priceAssetPart), amountAssetPart)
665+ else throwErr("wrong paymentAssetId")
666+ let amountBalanceNow = $t02597226427._1
667+ let priceBalanceNow = $t02597226427._2
668+ let virtSwapInAm = $t02597226427._3
669+ let virtSwapOutPr = $t02597226427._4
670+ let virtSwapInPr = $t02597226427._5
671+ let virtSwapOutAm = $t02597226427._6
672+ let D0 = invoke(gwxRewardContract, "calcD", [toString(amountBalanceNow), toString(priceBalanceNow), amplificator, Amult, Dconv], nil)
673+ let D1 = invoke(gwxRewardContract, "calcD", [toString(toBigInt(((amountBalanceNow + virtSwapInAm) - virtSwapOutAm))), toString(toBigInt(((priceBalanceNow + virtSwapInPr) - virtSwapOutPr))), amplificator, Amult, Dconv], nil)
674+ let D0vsD1 = validateD(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
675+ if ((D0vsD1 == D0vsD1))
540676 then {
541- let sa = if ((amDiff > 0))
542- then invoke(slipCntr, "put", nil, [AttachedPayment(amId, amDiff)])
543- else nil
544- if ((sa == sa))
677+ let estimatePut = commonPut(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(fromBase58String(amountId), amountAssetPart), AttachedPayment(fromBase58String(priceId), priceAssetPart), slippage, true, true, paymentAmount, paymentAssetId)
678+ let estimateLP = estimatePut._2
679+ let lpAssetId = estimatePut._7
680+ let state = estimatePut._9
681+ let amountDiff = estimatePut._10
682+ let priceDiff = estimatePut._11
683+ let lpCalcRes = validateAbsDiff(toBigInt(estimateLP), toBigInt(outLp), toBigInt(slippage))
684+ let emitLpAmount = toInt(lpCalcRes._2)
685+ let e = invoke(factoryContract, "emit", [emitLpAmount], nil)
686+ if ((e == e))
545687 then {
546- let sp = if ((prDiff > 0))
547- then invoke(slipCntr, "put", nil, [AttachedPayment(prId, prDiff)])
548- else nil
549- if ((sp == sp))
688+ let el = match e {
689+ case legacy: Address =>
690+ invoke(legacy, "emit", [emitLpAmount], nil)
691+ case _ =>
692+ unit
693+ }
694+ if ((el == el))
550695 then {
551- let lpTrnsfr = if (autoStake)
696+ let sa = if ((amountDiff > 0))
697+ then invoke(slippageContract, "put", nil, [AttachedPayment(fromBase58String(amountId), amountDiff)])
698+ else nil
699+ if ((sa == sa))
552700 then {
553- let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
554- if ((ss == ss))
555- then nil
701+ let sp = if ((priceDiff > 0))
702+ then invoke(slippageContract, "put", nil, [AttachedPayment(fromBase58String(priceId), priceDiff)])
703+ else nil
704+ if ((sp == sp))
705+ then {
706+ let lpTrasfer = if (autoStake)
707+ then {
708+ let ss = invoke(stakingContract, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmount)])
709+ if ((ss == ss))
710+ then nil
711+ else throw("Strict value is not equal to itself.")
712+ }
713+ else [ScriptTransfer(i.caller, emitLpAmount, lpAssetId)]
714+ let sendFeeToMatcher = if ((feeAmount > 0))
715+ then [ScriptTransfer(matcherAddress, feeAmount, fromBase58String(paymentAssetId))]
716+ else nil
717+ ((state ++ lpTrasfer) ++ sendFeeToMatcher)
718+ }
556719 else throw("Strict value is not equal to itself.")
557720 }
558- else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
559- (state ++ lpTrnsfr)
721+ else throw("Strict value is not equal to itself.")
560722 }
561723 else throw("Strict value is not equal to itself.")
562724 }
563725 else throw("Strict value is not equal to itself.")
564726 }
565727 else throw("Strict value is not equal to itself.")
566728 }
567- else throw("Strict value is not equal to itself.")
568729 }
569730 }
570731
571732
572733
573734 @Callable(i)
574-func putOneTkn (amAssetPart,prAssetPart,outLp,slippage,autoStake) = {
575- let cfg = gfc()
576- let stakingCntr = valueOrErrorMessage(addressFromString(cfg[idxFactStakCntr]), "Wr st addr")
577- let slipCntr = valueOrErrorMessage(addressFromString(cfg[idxFactSlippCntr]), "Wr sl addr")
578- let gwxCntr = valueOrErrorMessage(addressFromString(cfg[idxFactGwxRewCntr]), "Wr gwx addr")
579- let poolCfg = gpc()
580- let amId = poolCfg[idxAmAsId]
581- let prId = poolCfg[idxPrAsId]
582- let amDcm = parseIntValue(poolCfg[idxAmtAsDcm])
583- let prDcm = parseIntValue(poolCfg[idxPriceAsDcm])
584- let addon = valueOrElse(getString(this, ada()), "")
585- let userAddress = if ((addon == toString(i.caller)))
586- then i.originCaller
587- else i.caller
588- let addonContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(ada()), "no addons")), "addon address in not valid")
589- let check = reentrantInvoke(addonContract, "ensureCanPutOneTkn", [toString(userAddress)], nil)
590- if ((check == check))
591- then if (if (if (if ((0 >= slippage))
592- then true
593- else (0 >= amAssetPart))
594- then true
595- else (0 >= prAssetPart))
596- then true
597- else (0 >= outLp))
598- then throw("Wrong params")
599- else if ((size(i.payments) != 1))
600- then throw("1 pmnt expd")
601- else {
602- let pmt = value(i.payments[0])
603- let pmtAssetId = toBase58String(value(pmt.assetId))
604- let pmtAmt = pmt.amount
605- if (if (if ((amAssetPart > pmtAmt))
606- then true
607- else (prAssetPart > pmtAmt))
608- then true
609- else (10000000 > pmtAmt))
610- then throw("Wrong pmt amt")
611- else {
612- let amBalance = getAccBalance(amId)
613- let prBalance = getAccBalance(prId)
614- let $t02483225212 = if ((pmtAssetId == amId))
615- then $Tuple6((amBalance - pmtAmt), prBalance, (pmtAmt - amAssetPart), prAssetPart, 0, 0)
616- else if ((pmtAssetId == prId))
617- then $Tuple6(amBalance, (prBalance - pmtAmt), 0, 0, (pmtAmt - prAssetPart), amAssetPart)
618- else throw("wrong pmtAssetId")
619- let amBalanceNow = $t02483225212._1
620- let prBalanceNow = $t02483225212._2
621- let virtSwapInAm = $t02483225212._3
622- let virtSwapOutPr = $t02483225212._4
623- let virtSwapInPr = $t02483225212._5
624- let virtSwapOutAm = $t02483225212._6
625- let D0 = invoke(gwxCntr, "calcD", [toString(amBalanceNow), toString(prBalanceNow), A, Amult, Dconv], nil)
626- let D1 = invoke(gwxCntr, "calcD", [toString(toBigInt(((amBalanceNow + virtSwapInAm) - virtSwapOutAm))), toString(toBigInt(((prBalanceNow + virtSwapInPr) - virtSwapOutPr))), A, Amult, Dconv], nil)
627- let D0vsD1 = vd(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
628- if ((D0vsD1 == D0vsD1))
629- then {
630- let estPut = cp(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(fromBase58String(amId), amAssetPart), AttachedPayment(fromBase58String(prId), prAssetPart), slippage, true, true, pmtAmt, pmtAssetId)
631- let estimLP = estPut._2
632- let lpAssetId = estPut._7
633- let state = estPut._9
634- let amDiff = estPut._10
635- let prDiff = estPut._11
636- let lpCalcRes = vad(toBigInt(estimLP), toBigInt(outLp), toBigInt(slippage))
637- let emitLpAmt = toInt(lpCalcRes._2)
638- let e = invoke(fca, "emit", [emitLpAmt], nil)
639- if ((e == e))
640- then {
641- let el = match e {
642- case legacy: Address =>
643- invoke(legacy, "emit", [emitLpAmt], nil)
644- case _ =>
645- unit
646- }
647- if ((el == el))
648- then {
649- let sa = if ((amDiff > 0))
650- then invoke(slipCntr, "put", nil, [AttachedPayment(fromBase58String(amId), amDiff)])
651- else nil
652- if ((sa == sa))
653- then {
654- let sp = if ((prDiff > 0))
655- then invoke(slipCntr, "put", nil, [AttachedPayment(fromBase58String(prId), prDiff)])
656- else nil
657- if ((sp == sp))
658- then {
659- let lpTrnsfr = if (autoStake)
660- then {
661- let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
662- if ((ss == ss))
663- then nil
664- else throw("Strict value is not equal to itself.")
665- }
666- else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
667- (state ++ lpTrnsfr)
668- }
669- else throw("Strict value is not equal to itself.")
670- }
671- else throw("Strict value is not equal to itself.")
672- }
673- else throw("Strict value is not equal to itself.")
674- }
675- else throw("Strict value is not equal to itself.")
676- }
677- else throw("Strict value is not equal to itself.")
678- }
679- }
680- else throw("Strict value is not equal to itself.")
681- }
682-
683-
684-
685-@Callable(i)
686-func putForFree (maxSlpg) = if ((0 > maxSlpg))
687- then throw("Wrong slpg")
735+func putForFree (maxslippage) = if ((0 > maxslippage))
736+ then throwErr("wrong slippage")
688737 else if ((size(i.payments) != 2))
689- then throw("2 pmnts expd")
738+ then throwErr("2 payments expected")
690739 else {
691- 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, 0, "")
692- estPut._9
740+ let estimatePut = commonPut(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(value(i.payments[0]).assetId, value(i.payments[0]).amount), i.payments[1], maxslippage, false, false, 0, "")
741+ estimatePut._9
693742 }
694743
695744
696745
697746 @Callable(i)
698747 func get () = {
699- let r = cg(i)
748+ let r = commonGet(i)
700749 let outAmtAmt = r._1
701- let outPrAmt = r._2
702- let pmtAmt = r._3
703- let pmtAssetId = r._4
750+ let outPriceAmount = r._2
751+ let paymentAmount = r._3
752+ let paymentAssetId = r._4
704753 let state = r._5
705- let b = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
754+ let b = invoke(factoryContract, "burn", [paymentAmount], [AttachedPayment(paymentAssetId, paymentAmount)])
706755 if ((b == b))
707756 then state
708757 else throw("Strict value is not equal to itself.")
709758 }
710759
711760
712761
713762 @Callable(i)
714763 func getOneTkn (exchResult,notUsed,outAmount,outAssetId,slippage) = if ((size(i.payments) != 1))
715- then throw("1 pmnt expd")
764+ then throwErr("1 payment expected")
716765 else {
717- let cfg = gpc()
718- let lpId = cfg[idxLPAsId]
719- let amId = cfg[idxAmAsId]
720- let prId = cfg[idxPrAsId]
721- let amDcm = parseIntValue(cfg[idxAmtAsDcm])
722- let prDcm = parseIntValue(cfg[idxPriceAsDcm])
766+ let cfg = getPoolConfig()
767+ let lpAssetId = cfg[idxLPAsId]
768+ let amountId = cfg[idxAmAsId]
769+ let priceId = cfg[idxPrAsId]
770+ let amountDecimals = parseIntValue(cfg[idxAmtAsDcm])
771+ let priceDecimals = parseIntValue(cfg[idxPriceAsDcm])
723772 let sts = cfg[idxPoolSt]
724- let factCfg = gfc()
725- let gwxCntr = valueOrErrorMessage(addressFromString(factCfg[idxFactGwxRewCntr]), "Wr sl addr")
726- let pmt = value(i.payments[0])
727- let addon = valueOrElse(getString(this, ada()), "")
773+ let factCfg = getFactoryConfig()
774+ let gwxRewardContract = valueOrErrorMessage(addressFromString(factCfg[idxFactGwxRewCntr]), "Wrong gwxRewardContract address")
775+ let payment = value(i.payments[0])
776+ let addon = valueOrElse(getString(this, keyAddonAddress()), "")
728777 let userAddress = if ((addon == toString(i.caller)))
729778 then i.originCaller
730779 else i.caller
731780 let txId58 = toBase58String(i.transactionId)
732- let pmtAssetId = value(pmt.assetId)
733- let pmtAmt = pmt.amount
734- let addonContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(ada()), "no addons")), "addon address in not valid")
735- let check = reentrantInvoke(addonContract, "ensureCanGetOneTkn", [toString(userAddress)], nil)
736- if ((check == check))
737- then if ((1000000000 > pmtAmt))
738- then throw("Min pmt 10 LP")
739- else if (if (if ((0 > slippage))
740- then true
741- else (0 > exchResult))
742- then true
743- else (0 > outAmount))
744- then throw("Wrong params")
745- else if ((lpId != toBase58String(pmtAssetId)))
746- then throw("Wrong LP")
747- else {
748- let r = ego(toBase58String(i.transactionId), toBase58String(pmtAssetId), pmtAmt, i.caller)
749- let estimAmAmt = r._1
750- let estimPrAmt = r._2
751- let amBalance = getAccBalance(amId)
752- let prBalance = getAccBalance(prId)
753- let $t03024330700 = if ((outAssetId == amId))
754- then $Tuple7((amBalance - estimAmAmt), (prBalance - estimPrAmt), exchResult, estimPrAmt, 0, 0, (estimAmAmt + exchResult))
755- else if ((outAssetId == prId))
756- then $Tuple7((amBalance - estimAmAmt), (prBalance - estimPrAmt), 0, 0, exchResult, estimAmAmt, (estimPrAmt + exchResult))
757- else throw("wrong outAssetId")
758- let amBalanceNow = $t03024330700._1
759- let prBalanceNow = $t03024330700._2
760- let virtSwapInAm = $t03024330700._3
761- let virtSwapOutPr = $t03024330700._4
762- let virtSwapInPr = $t03024330700._5
763- let virtSwapOutAm = $t03024330700._6
764- let totalGet = $t03024330700._7
765- if (if ((0 > virtSwapInAm))
766- then true
767- else (0 > virtSwapInPr))
768- then throw("Wrong calc")
769- else {
770- let D0 = invoke(gwxCntr, "calcD", [toString(amBalanceNow), toString(prBalanceNow), A, Amult, Dconv], nil)
771- let D1 = invoke(gwxCntr, "calcD", [toString(((amBalanceNow - virtSwapInAm) + virtSwapOutAm)), toString(((prBalanceNow + virtSwapOutPr) - virtSwapInPr)), A, Amult, Dconv], nil)
772- let D0vsD1 = vd(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
773- if ((D0vsD1 == D0vsD1))
774- then {
775- let finalRes = vad(toBigInt(totalGet), toBigInt(outAmount), toBigInt(slippage))
776- if ((finalRes == finalRes))
777- then {
778- let $t03140531509 = if ((outAssetId == amId))
779- then $Tuple2(toInt(finalRes._2), 0)
780- else $Tuple2(0, toInt(finalRes._2))
781- let outAm = $t03140531509._1
782- let outPr = $t03140531509._2
783- let curPrX18 = cpbi(t1(prBalance, prDcm), t1(amBalance, amDcm))
784- let curPr = f1(curPrX18, scale8)
785- let state = [ScriptTransfer(userAddress, (outAm + outPr), if ((outAssetId == "WAVES"))
786- then unit
787- else fromBase58String(outAssetId)), StringEntry(gau(toString(userAddress), txId58), dataGetActionInfo(outAm, outPr, pmtAmt, curPr, height, lastBlock.timestamp)), IntegerEntry(pl(), curPr), IntegerEntry(ph(height, lastBlock.timestamp), curPr)]
788- if ((state == state))
789- then {
790- let burn = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
791- if ((burn == burn))
792- then state
793- else throw("Strict value is not equal to itself.")
794- }
795- else throw("Strict value is not equal to itself.")
796- }
797- else throw("Strict value is not equal to itself.")
798- }
799- else throw("Strict value is not equal to itself.")
800- }
801- }
802- else throw("Strict value is not equal to itself.")
781+ let paymentAssetId = value(payment.assetId)
782+ let paymentAmount = payment.amount
783+ if ((1000000000 > paymentAmount))
784+ then throwErr("Min payment 10 LP")
785+ else if (if (if ((0 > slippage))
786+ then true
787+ else (0 > exchResult))
788+ then true
789+ else (0 > outAmount))
790+ then throwErr("Wrong params")
791+ else if ((lpAssetId != toBase58String(paymentAssetId)))
792+ then throwErr("Wrong LP")
793+ else {
794+ let r = estimateGetOperation(toBase58String(i.transactionId), toBase58String(paymentAssetId), paymentAmount, i.caller)
795+ let estimAmAmt = r._1
796+ let estimPrAmt = r._2
797+ let amountBalance = getAccBalance(amountId)
798+ let priceBalance = getAccBalance(priceId)
799+ let $t03156632034 = if ((outAssetId == amountId))
800+ then $Tuple7((amountBalance - estimAmAmt), (priceBalance - estimPrAmt), exchResult, estimPrAmt, 0, 0, (estimAmAmt + exchResult))
801+ else if ((outAssetId == priceId))
802+ then $Tuple7((amountBalance - estimAmAmt), (priceBalance - estimPrAmt), 0, 0, exchResult, estimAmAmt, (estimPrAmt + exchResult))
803+ else throwErr("wrong outAssetId")
804+ let amountBalanceNow = $t03156632034._1
805+ let priceBalanceNow = $t03156632034._2
806+ let virtSwapInAm = $t03156632034._3
807+ let virtSwapOutPr = $t03156632034._4
808+ let virtSwapInPr = $t03156632034._5
809+ let virtSwapOutAm = $t03156632034._6
810+ let totalGet = $t03156632034._7
811+ if (if ((0 > virtSwapInAm))
812+ then true
813+ else (0 > virtSwapInPr))
814+ then throwErr("Wrong calc")
815+ else {
816+ let D0 = invoke(gwxRewardContract, "calcD", [toString(amountBalanceNow), toString(priceBalanceNow), amplificator, Amult, Dconv], nil)
817+ let D1 = invoke(gwxRewardContract, "calcD", [toString(((amountBalanceNow - virtSwapInAm) + virtSwapOutAm)), toString(((priceBalanceNow + virtSwapOutPr) - virtSwapInPr)), amplificator, Amult, Dconv], nil)
818+ let D0vsD1 = validateD(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
819+ if ((D0vsD1 == D0vsD1))
820+ then {
821+ let finalRes = validateAbsDiff(toBigInt(totalGet), toBigInt(outAmount), toBigInt(slippage))
822+ if ((finalRes == finalRes))
823+ then {
824+ let $t03270332811 = if ((outAssetId == amountId))
825+ then $Tuple2(toInt(finalRes._2), 0)
826+ else $Tuple2(0, toInt(finalRes._2))
827+ let outAm = $t03270332811._1
828+ let outPr = $t03270332811._2
829+ let totalAmountRaw = (outAm + outPr)
830+ let $t03285132906 = takeFee(totalAmountRaw)
831+ let totalAmount = $t03285132906._1
832+ let feeAmount = $t03285132906._2
833+ let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
834+ then unit
835+ else fromBase58String(outAssetId)
836+ let sendFeeToMatcher = if ((feeAmount > 0))
837+ then [ScriptTransfer(matcherAddress, feeAmount, outAssetIdOrWaves)]
838+ else nil
839+ let decimals = if ((amountDecimals >= priceDecimals))
840+ then amountDecimals
841+ else priceDecimals
842+ if ((decimals == decimals))
843+ then {
844+ let curPrX18 = calcPriceBigInt(toX18(priceBalance, decimals), toX18(amountBalance, decimals))
845+ let curPr = fromX18(curPrX18, scale8)
846+ let state = [ScriptTransfer(userAddress, totalAmount, outAssetIdOrWaves), StringEntry(keyGetActionByUser(toString(userAddress), txId58), dataGetActionInfo(outAm, outPr, paymentAmount, curPr, height, lastBlock.timestamp)), IntegerEntry(keyPriceLast(), curPr), IntegerEntry(keyPriceHistory(height, lastBlock.timestamp), curPr)]
847+ if ((state == state))
848+ then {
849+ let burn = invoke(factoryContract, "burn", [paymentAmount], [AttachedPayment(paymentAssetId, paymentAmount)])
850+ if ((burn == burn))
851+ then (state ++ sendFeeToMatcher)
852+ else throw("Strict value is not equal to itself.")
853+ }
854+ else throw("Strict value is not equal to itself.")
855+ }
856+ else throw("Strict value is not equal to itself.")
857+ }
858+ else throw("Strict value is not equal to itself.")
859+ }
860+ else throw("Strict value is not equal to itself.")
861+ }
862+ }
803863 }
804864
805865
806866
807867 @Callable(i)
808868 func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = {
809- let r = cg(i)
810- let outAmAmt = r._1
811- let outPrAmt = r._2
812- let pmtAmt = r._3
813- let pmtAssetId = r._4
869+ let r = commonGet(i)
870+ let outAmountAmount = r._1
871+ let outPriceAmount = r._2
872+ let paymentAmount = r._3
873+ let paymentAssetId = r._4
814874 let state = r._5
815- if ((noLessThenAmtAsset > outAmAmt))
816- then throw(((("Failed: " + toString(outAmAmt)) + " < ") + toString(noLessThenAmtAsset)))
817- else if ((noLessThenPriceAsset > outPrAmt))
818- then throw(((("Failed: " + toString(outPrAmt)) + " < ") + toString(noLessThenPriceAsset)))
819- else {
820- let burnLPAssetOnFactory = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
821- if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
822- then state
823- else throw("Strict value is not equal to itself.")
824- }
875+ let checkOutAmountAmount = if ((outAmountAmount >= noLessThenAmtAsset))
876+ then true
877+ else throwErr(((("Failed: " + toString(outAmountAmount)) + " < ") + toString(noLessThenAmtAsset)))
878+ if ((checkOutAmountAmount == checkOutAmountAmount))
879+ then {
880+ let checkOutPriceAmount = if ((outPriceAmount >= noLessThenPriceAsset))
881+ then true
882+ else throwErr(((("Failed: " + toString(outPriceAmount)) + " < ") + toString(noLessThenPriceAsset)))
883+ if ((checkOutPriceAmount == checkOutPriceAmount))
884+ then {
885+ let burnLPAssetOnFactory = invoke(factoryContract, "burn", [paymentAmount], [AttachedPayment(paymentAssetId, paymentAmount)])
886+ if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
887+ then state
888+ else throw("Strict value is not equal to itself.")
889+ }
890+ else throw("Strict value is not equal to itself.")
891+ }
892+ else throw("Strict value is not equal to itself.")
825893 }
826894
827895
828896
829897 @Callable(i)
830898 func unstakeAndGet (amount) = {
831899 let checkPayments = if ((size(i.payments) != 0))
832- then throw("No pmnts expd")
900+ then throwErr("no payments expected")
833901 else true
834902 if ((checkPayments == checkPayments))
835903 then {
836- let cfg = gpc()
837- let factoryCfg = gfc()
904+ let cfg = getPoolConfig()
905+ let factoryCfg = getFactoryConfig()
838906 let lpAssetId = fromBase58String(cfg[idxLPAsId])
839- let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
907+ let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "wrong")
840908 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), amount], nil)
841909 if ((unstakeInv == unstakeInv))
842910 then {
843- let r = ego(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
911+ let r = estimateGetOperation(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
844912 let sts = parseIntValue(r._9)
845913 let state = r._10
846- let v = if (if (igs())
914+ let v = if (if (isGlobalShutdown())
847915 then true
848916 else (sts == PoolShutdown))
849- then throw(("Blocked: " + toString(sts)))
917+ then throwErr(("Blocked: " + toString(sts)))
850918 else true
851919 if ((v == v))
852920 then {
853- let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
921+ let burnA = invoke(factoryContract, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
854922 if ((burnA == burnA))
855923 then state
856924 else throw("Strict value is not equal to itself.")
857925 }
858926 else throw("Strict value is not equal to itself.")
859927 }
860928 else throw("Strict value is not equal to itself.")
861929 }
862930 else throw("Strict value is not equal to itself.")
863931 }
864932
865933
866934
867935 @Callable(i)
868-func activate (amtAsStr,prAsStr) = if ((toString(i.caller) != toString(fca)))
869- then throw("denied")
870- else $Tuple2([StringEntry(aa(), amtAsStr), StringEntry(pa(), prAsStr)], "success")
936+func activate (amtAsStr,prAsStr) = if ((toString(i.caller) != toString(factoryContract)))
937+ then throwErr("denied")
938+ else $Tuple2([StringEntry(keyAmountAsset(), amtAsStr), StringEntry(keyPriceAsset(), prAsStr)], "success")
871939
872940
873941
874942 @Callable(i)
875-func setS (k,v) = if ((toString(i.caller) != strf(this, ada())))
943+func setS (k,v) = if ((toString(i.caller) != getStringOrFail(this, keyAddonAddress())))
876944 then pd
877945 else [StringEntry(k, v)]
878946
879947
880948
881949 @Callable(i)
882-func setI (k,v) = if ((toString(i.caller) != strf(this, ada())))
950+func setI (k,v) = if ((toString(i.caller) != getStringOrFail(this, keyAddonAddress())))
883951 then pd
884952 else [IntegerEntry(k, v)]
885953
886954
887955
888956 @Callable(i)
889-func getPoolConfigWrapperREADONLY () = $Tuple2(nil, gpc())
957+func getPoolConfigWrapperREADONLY () = $Tuple2(nil, getPoolConfig())
890958
891959
892960
893961 @Callable(i)
894962 func getAccBalanceWrapperREADONLY (assetId) = $Tuple2(nil, getAccBalance(assetId))
895963
896964
897965
898966 @Callable(i)
899967 func calcPricesWrapperREADONLY (amAmt,prAmt,lpAmt) = {
900968 let pr = calcPrices(amAmt, prAmt, lpAmt)
901969 $Tuple2(nil, [toString(pr[0]), toString(pr[1]), toString(pr[2])])
902970 }
903971
904972
905973
906974 @Callable(i)
907-func fromX18WrapperREADONLY (val,resScaleMult) = $Tuple2(nil, f1(parseBigIntValue(val), resScaleMult))
975+func fromX18WrapperREADONLY (val,resScaleMult) = $Tuple2(nil, fromX18(parseBigIntValue(val), resScaleMult))
908976
909977
910978
911979 @Callable(i)
912-func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(t1(origVal, origScaleMult)))
980+func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(toX18(origVal, origScaleMult)))
913981
914982
915983
916984 @Callable(i)
917-func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(cpbi(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
985+func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(calcPriceBigInt(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
918986
919987
920988
921989 @Callable(i)
922-func estimatePutOperationWrapperREADONLY (txId58,slippage,inAmAmt,inAmId,inPrAmt,inPrId,usrAddr,isEval,emitLp) = $Tuple2(nil, epo(txId58, slippage, inAmAmt, inAmId, inPrAmt, inPrId, usrAddr, isEval, emitLp, false, 0, ""))
990+func estimatePutOperationWrapperREADONLY (txId58,slippage,inAmountAssetAmount,inAmId,inPriceAssetAmount,inPrId,usrAddr,isEvaluate,emitLp) = $Tuple2(nil, estimatePutOperation(txId58, slippage, inAmountAssetAmount, inAmId, inPriceAssetAmount, inPrId, usrAddr, isEvaluate, emitLp, false, 0, ""))
923991
924992
925993
926994 @Callable(i)
927-func estimateGetOperationWrapperREADONLY (txId58,pmtAsId,pmtLpAmt,usrAddr) = {
928- let r = ego(txId58, pmtAsId, pmtLpAmt, addressFromStringValue(usrAddr))
995+func estimateGetOperationWrapperREADONLY (txId58,paymentAsId,paymentLpAmount,usrAddr) = {
996+ let r = estimateGetOperation(txId58, paymentAsId, paymentLpAmount, addressFromStringValue(usrAddr))
929997 $Tuple2(nil, $Tuple10(r._1, r._2, r._3, r._4, r._5, r._6, r._7, toString(r._8), r._9, r._10))
930998 }
931999
9321000
9331001 @Verifier(tx)
9341002 func verify () = match tx {
9351003 case order: Order =>
936- let mtchPub = mp()
937- let orV = moa(order)
1004+ let mtchPub = getMatcherPubOrFail()
1005+ let orV = validateMatcherOrderAllowed(order)
9381006 let sndrV = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
9391007 let mtchV = sigVerify(order.bodyBytes, order.proofs[1], mtchPub)
9401008 if (if (if (orV)
9411009 then sndrV
9421010 else false)
9431011 then mtchV
9441012 else false)
9451013 then true
946- else toe(orV, sndrV, mtchV)
1014+ else throwOrderError(orV, sndrV, mtchV)
9471015 case _ =>
948- let targetPublicKey = match m() {
1016+ let targetPublicKey = match managerPublicKeyOrUnit() {
9491017 case pk: ByteVector =>
9501018 pk
9511019 case _: Unit =>
9521020 tx.senderPublicKey
9531021 case _ =>
9541022 throw("Match error")
9551023 }
9561024 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
9571025 }
9581026

github/deemru/w8io/c3f4982 
182.43 ms