tx · 8MAfPt5EzZNjJoHATMesYcYR7KUk5g8dmXWiBnwWqx5Y

3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT:  -0.02600000 Waves

2022.08.15 16:43 [2185659] smart account 3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT > SELF 0.00000000 Waves

{ "type": 13, "id": "8MAfPt5EzZNjJoHATMesYcYR7KUk5g8dmXWiBnwWqx5Y", "fee": 2600000, "feeAssetId": null, "timestamp": 1660571044385, "version": 1, "sender": "3NAefciWv6f9fWvEXdGgpHfanJFG8HqfjuT", "senderPublicKey": "D1BL65meykxFZTCuq7jq9HSGLLnWvQamQPUNrguW5w39", "proofs": [ "Z16KKSyqPoauauNEB2jZ4RRZXBTUpDzmPoLL2GyXk9Q7Bq6FvUs4GykaeZhVEsRw5aMq6RsKuSvj22Tmrctpzdo" ], "script": "base64:BgL+HwgCEgMKAQgSAwoBCBIAEgQKAgEEEgcKBQEBAQEEEgMKAQESABIHCgUBAQEIARIECgIBARIDCgEBEgQKAggIEgQKAggIEgQKAggBEgASAwoBCBIFCgMBAQESBAoCCAESBAoCAQESBAoCCAgSCwoJCAEBAgECCAQEEgYKBAgIAQgiBnNjYWxlOCIMc2NhbGU4QmlnSW50IgdzY2FsZTE4Igh0aG91c2FuZCIKemVyb0JpZ0ludCIJb25lQmlnSW50IgpzbGlwcGFnZTREIgVBbXVsdCIFRGNvbnYiA1NFUCIFRU1QVFkiClBvb2xBY3RpdmUiClBvb2xQdXREaXMiDlBvb2xNYXRjaGVyRGlzIgxQb29sU2h1dGRvd24iDmlkeFBvb2xBZGRyZXNzIglpZHhQb29sU3QiCWlkeExQQXNJZCIJaWR4QW1Bc0lkIglpZHhQckFzSWQiC2lkeEFtdEFzRGNtIg1pZHhQcmljZUFzRGNtIgtpZHhJQW10QXNJZCINaWR4SVByaWNlQXNJZCIPaWR4RmFjdFN0YWtDbnRyIhBpZHhGYWN0U2xpcHBDbnRyIhFpZHhGYWN0R3d4UmV3Q250ciISZmVlUGVybWlsbGVEZWZhdWx0IgV0b1gxOCIHb3JpZ1ZhbCINb3JpZ1NjYWxlTXVsdCIHZnJvbVgxOCIDdmFsIg9yZXN1bHRTY2FsZU11bHQiAnRzIgNhbXQiCHJlc1NjYWxlIghjdXJTY2FsZSIDYWJzIhFrZXlGYWN0b3J5Q29udGFjdCITa2V5TWFuYWdlclB1YmxpY0tleSIaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkiDGtleVByaWNlTGFzdCIPa2V5UHJpY2VIaXN0b3J5IgFoIgF0IhJrZXlQdXRBY3Rpb25CeVVzZXIiAnVhIgR0eElkIhJrZXlHZXRBY3Rpb25CeVVzZXIiDmtleUFtb3VudEFzc2V0Ig1rZXlQcmljZUFzc2V0Ig9rZXlBbXBsaWZpY2F0b3IiD2tleUFkZG9uQWRkcmVzcyIOa2V5RmVlUGVybWlsbGUiC2ZlZVBlcm1pbGxlIgRmY2ZnIgRtdHBrIgJwYyIGaUFtdEFzIgVpUHJBcyIDbWJhIgViQVN0ciIDYXBzIgh0aHJvd0VyciIDbXNnIg90aHJvd09yZGVyRXJyb3IiA29yViIGc2VuZHJWIgZtYXRjaFYiA3N0ciIHJG1hdGNoMCIGdmFsU3RyIg9nZXRTdHJpbmdPckZhaWwiBGFkZHIiA2tleSIMZ2V0SW50T3JGYWlsIg9mYWN0b3J5Q29udHJhY3QiDGFtcGxpZmljYXRvciIQaXNHbG9iYWxTaHV0ZG93biITZ2V0TWF0Y2hlclB1Yk9yRmFpbCIObWF0Y2hlckFkZHJlc3MiDWdldFBvb2xDb25maWciBWFtdEFzIgdwcmljZUFzIghpUHJpY2VBcyIQZ2V0RmFjdG9yeUNvbmZpZyIRZGF0YVB1dEFjdGlvbkluZm8iDWluQW10QXNzZXRBbXQiD2luUHJpY2VBc3NldEFtdCIIb3V0THBBbXQiBXByaWNlIgpzbGlwQnlVc2VyIgxzbGlwcGFnZVJlYWwiCHR4SGVpZ2h0Igt0eFRpbWVzdGFtcCIMc2xpcGFnZUFtQW10IgxzbGlwYWdlUHJBbXQiEWRhdGFHZXRBY3Rpb25JbmZvIg5vdXRBbXRBc3NldEFtdCIQb3V0UHJpY2VBc3NldEFtdCIHaW5McEFtdCINZ2V0QWNjQmFsYW5jZSIHYXNzZXRJZCIPY2FsY1ByaWNlQmlnSW50IghwckFtdFgxOCIIYW1BbXRYMTgiD3ZhbGlkYXRlQWJzRGlmZiIKZXN0aW1hdGVMUCIFb3V0THAiCHNsaXBwYWdlIgRkaWZmIgRwYXNzIgl2YWxpZGF0ZUQiAkQxIgJEMCIEZmFpbCIQcHJpdmF0ZUNhbGNQcmljZSIKYW1Bc3NldERjbSIKcHJBc3NldERjbSIFYW1BbXQiBXByQW10IgthbXRBc0FtdFgxOCIKcHJBc0FtdFgxOCIKY2FsY1ByaWNlcyIFbHBBbXQiA2NmZyIIYW10QXNEY20iB3ByQXNEY20iCHByaWNlWDE4IghscEFtdFgxOCINbHBQckluQW1Bc1gxOCINbHBQckluUHJBc1gxOCIPY2FsY3VsYXRlUHJpY2VzIgFwIhRlc3RpbWF0ZUdldE9wZXJhdGlvbiIGdHhJZDU4Ig5wYXltZW50QXNzZXRJZCIPcGF5bWVudExwQW1vdW50Igt1c2VyQWRkcmVzcyIJbHBBc3NldElkIghhbW91bnRJZCIHcHJpY2VJZCIOYW1vdW50RGVjaW1hbHMiDXByaWNlRGVjaW1hbHMiA3N0cyIKbHBFbWlzc2lvbiIPdmFsaWRhdGlvbkJsb2NrIghkZWNpbWFscyINYW1vdW50QmFsYW5jZSIQYW1vdW50QmFsYW5jZVgxOCIMcHJpY2VCYWxhbmNlIg9wcmljZUJhbGFuY2VYMTgiD2N1cnJlbnRQcmljZVgxOCIIY3VyUHJpY2UiEnBheW1lbnRMcEFtb3VudFgxOCINbHBFbWlzc2lvblgxOCISb3V0QW1vdW50QW1vdW50WDE4IhFvdXRQcmljZUFtb3VudFgxOCIPb3V0QW1vdW50QW1vdW50Ig5vdXRQcmljZUFtb3VudCIFc3RhdGUiFGVzdGltYXRlUHV0T3BlcmF0aW9uIhFzbGlwcGFnZVRvbGVyYW5jZSITaW5BbW91bnRBc3NldEFtb3VudCIPaW5BbW91bnRBc3NldElkIhJpblByaWNlQXNzZXRBbW91bnQiDmluUHJpY2VBc3NldElkIgppc0V2YWx1YXRlIgZlbWl0THAiCmlzT25lQXNzZXQiDXBheW1lbnRBbW91bnQiCXBheW1lbnRJZCILYW1vdW50SWRTdHIiCnByaWNlSWRTdHIiDWluQW1vdW50SWRTdHIiDGluUHJpY2VJZFN0ciIWaW5BbW91bnRBc3NldEFtb3VudFgxOCIVaW5QcmljZUFzc2V0QW1vdW50WDE4Igx1c2VyUHJpY2VYMTgiAXIiC3NsaXBwYWdlWDE4IgtscEFtb3VudFgxOCIPc2xpcHBhZ2VSZWFsWDE4IgpwclZpYUFtWDE4IgphbVZpYVByWDE4Ig9leHBlY3RlZEFtb3VudHMiHGV4cGVjdGVkQW1vdW50QXNzZXRBbW91bnRYMTgiG2V4cGVjdGVkUHJpY2VBc3NldEFtb3VudFgxOCIRY2FsY3VsYXRlTHBBbW91bnQiG2NhbGN1bGF0ZUFtb3VudEFzc2V0UGF5bWVudCIaY2FsY3VsYXRlUHJpY2VBc3NldFBheW1lbnQiDGN1cnJlbnRQcmljZSIRc2xpcHBhZ2VDYWxjdWxhdGUiEWNoZWNrQ2FsY0xwQW1vdW50IgxlbWl0THBBbW91bnQiCmFtb3VudERpZmYiCXByaWNlRGlmZiINJHQwMTYxODkxNjQ0OCIKd3JpdGVBbUFtdCIKd3JpdGVQckFtdCILY29tbW9uU3RhdGUiG3ZhbGlkYXRlTWF0Y2hlck9yZGVyQWxsb3dlZCIFb3JkZXIiB2FtdEFzSWQiBnByQXNJZCIPYWNjQW10QXNCYWxhbmNlIg5hY2NQckFzQmFsYW5jZSIKb3JBbXRBc3NldCIKb3JBbXRBc1N0ciIJb3JQckFzc2V0IglvclByQXNTdHIiCm9yZGVyUHJpY2UiDmNhc3RPcmRlclByaWNlIhFpc09yZGVyUHJpY2VWYWxpZCIJY29tbW9uR2V0IgFpIg1jaGVja1BheW1lbnRzIgdwYXltZW50Igljb21tb25QdXQiBmNhbGxlciISYW1vdW50QXNzZXRQYXltZW50IhFwcmljZUFzc2V0UGF5bWVudCIHdGFrZUZlZSIGYW1vdW50IgNmZWUiFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQiAXMiHXBlbmRpbmdNYW5hZ2VyUHVibGljS2V5T3JVbml0IgJwZCILbXVzdE1hbmFnZXIiAnBrIgtjaGVja0NhbGxlciIXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkiFWNoZWNrTWFuYWdlclB1YmxpY0tleSICcG0iBWhhc1BNIgdjaGVja1BNIglhdXRvU3Rha2UiB2ZhY3RDZmciD3N0YWtpbmdDb250cmFjdCIQc2xpcHBhZ2VDb250cmFjdCINc2xpcHBhZ2VDaGVjayINcGF5bWVudHNDaGVjayILZXN0aW1hdGVQdXQiAmVsIgZsZWdhY3kiAnNhIgJzcCIJbHBUcmFzZmVyIgJzcyIPYW1vdW50QXNzZXRQYXJ0Ig5wcmljZUFzc2V0UGFydCIRZ3d4UmV3YXJkQ29udHJhY3QiB3Bvb2xDZmciBWFkZG9uIhBwYXltZW50QW1vdW50UmF3Ig0kdDAyNTYxNzI1Njc2IglmZWVBbW91bnQiDSR0MDI1OTQwMjYzOTUiEGFtb3VudEJhbGFuY2VOb3ciD3ByaWNlQmFsYW5jZU5vdyIMdmlydFN3YXBJbkFtIg12aXJ0U3dhcE91dFByIgx2aXJ0U3dhcEluUHIiDXZpcnRTd2FwT3V0QW0iBkQwdnNEMSIJbHBDYWxjUmVzIgFlIhBzZW5kRmVlVG9NYXRjaGVyIgttYXhzbGlwcGFnZSIJb3V0QW10QW10IgFiIgpleGNoUmVzdWx0Igdub3RVc2VkIglvdXRBbW91bnQiCm91dEFzc2V0SWQiCmVzdGltQW1BbXQiCmVzdGltUHJBbXQiDSR0MDMxNTM0MzIwMDIiCHRvdGFsR2V0IghmaW5hbFJlcyINJHQwMzI2NzEzMjc3OSIFb3V0QW0iBW91dFByIg50b3RhbEFtb3VudFJhdyINJHQwMzI4MTkzMjg3NCILdG90YWxBbW91bnQiEW91dEFzc2V0SWRPcldhdmVzIghjdXJQclgxOCIFY3VyUHIiBGJ1cm4iEm5vTGVzc1RoZW5BbXRBc3NldCIUbm9MZXNzVGhlblByaWNlQXNzZXQiFGNoZWNrT3V0QW1vdW50QW1vdW50IhNjaGVja091dFByaWNlQW1vdW50IhRidXJuTFBBc3NldE9uRmFjdG9yeSIKZmFjdG9yeUNmZyIHc3Rha2luZyIKdW5zdGFrZUludiIBdiIFYnVybkEiCGFtdEFzU3RyIgdwckFzU3RyIgFrIgJwciIMcmVzU2NhbGVNdWx0IgZpbkFtSWQiBmluUHJJZCIHdXNyQWRkciILcGF5bWVudEFzSWQiAnR4IgZ2ZXJpZnkiB210Y2hQdWIiBXNuZHJWIgVtdGNoViIPdGFyZ2V0UHVibGljS2V5IgckbWF0Y2gxUQABYQCAwtcvAAFiCQC2AgEAgMLXLwABYwkAtgIBAICAkLu61q3wDQABZADoBwABZQkAtgIBAAAAAWYJALYCAQABAAFnCQC2AgEJAGUCBQFhCQBpAgkAaAIFAWEAAQUBYQABaAIDMTAwAAFpAgExAAFqAgJfXwABawIAAAFsAAEAAW0AAgABbgADAAFvAAQAAXAAAQABcQACAAFyAAMAAXMABAABdAAFAAF1AAYAAXYABwABdwAIAAF4AAkAAXkAAQABegAHAAFBAAoAAUIAAAEBQwIBRAFFCQC8AgMJALYCAQUBRAUBYwkAtgIBBQFFAQFGAgFHAUgJAKADAQkAvAIDBQFHCQC2AgEFAUgFAWMBAUkDAUoBSwFMCQBrAwUBSgUBSwUBTAEBTQEBRwMJAL8CAgUBZQUBRwkAvgIBBQFHBQFHAQFOAAITJXNfX2ZhY3RvcnlDb250cmFjdAEBTwACFCVzX19tYW5hZ2VyUHVibGljS2V5AQFQAAIbJXNfX3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5AQFRAAIRJXMlc19fcHJpY2VfX2xhc3QBAVICAVMBVAkAuQkCCQDMCAICGCVzJXMlZCVkX19wcmljZV9faGlzdG9yeQkAzAgCCQCkAwEFAVMJAMwIAgkApAMBBQFUBQNuaWwFAWoBAVUCAVYBVwkArAICCQCsAgIJAKwCAgILJXMlcyVzX19QX18FAVYCAl9fBQFXAQFYAgFWAVcJAKwCAgkArAICCQCsAgICCyVzJXMlc19fR19fBQFWAgJfXwUBVwEBWQACDyVzX19hbW91bnRBc3NldAEBWgACDiVzX19wcmljZUFzc2V0AQJhYQACByVzX19hbXABAmFiAAINJXNfX2FkZG9uQWRkcgACYWMCDyVzX19mZWVQZXJtaWxsZQACYWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUCYWMFAUIBAmFlAAIRJXNfX2ZhY3RvcnlDb25maWcBAmFmAAIYJXMlc19fbWF0Y2hlcl9fcHVibGljS2V5AQJhZwICYWgCYWkJAKwCAgkArAICCQCsAgIJAKwCAgIIJWQlZCVzX18FAmFoAgJfXwUCYWkCCF9fY29uZmlnAQJhagECYWsJAKwCAgIoJXMlcyVzX19tYXBwaW5nc19fYmFzZUFzc2V0MmludGVybmFsSWRfXwUCYWsBAmFsAAIMJXNfX3NodXRkb3duAQJhbQECYW4JAAIBCQC5CQIJAMwIAgIPbHBfc3RhYmxlLnJpZGU6CQDMCAIFAmFuBQNuaWwCASABAmFvAwJhcAJhcQJhcgkBAmFtAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICEUZhaWxlZDogb3JkVmFsaWQ9CQClAwEFAmFwAgsgc25kclZhbGlkPQkApQMBBQJhcQIMIG10Y2hyVmFsaWQ9CQClAwEFAmFyAQJhcwEBRwQCYXQFAUcDCQABAgUCYXQCBlN0cmluZwQCYXUFAmF0BQJhdQkBAmFtAQITZmFpbCBjYXN0IHRvIFN0cmluZwECYXYCAmF3AmF4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUCYXcFAmF4CQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFAmF3CQDMCAICAS4JAMwIAgUCYXgJAMwIAgIMIG5vdCBkZWZpbmVkBQNuaWwCAAECYXkCAmF3AmF4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUCYXcFAmF4CQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFAmF3CQDMCAICAS4JAMwIAgUCYXgJAMwIAgIMIG5vdCBkZWZpbmVkBQNuaWwCAAACYXoJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQJhdgIFBHRoaXMJAQFOAAACYUEJAQJhdgIFBHRoaXMJAQJhYQABAmFCAAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQJhegkBAmFsAAcBAmFDAAkA2QQBCQECYXYCBQJhegkBAmFmAAACYUQJAKcIAQkBAmFDAAECYUUABAJhRgkBAmF2AgUEdGhpcwkBAVkABAJhRwkBAmF2AgUEdGhpcwkBAVoABAJhSAkBAmF5AgUCYXoJAQJhagEFAmFHBAJhaAkBAmF5AgUCYXoJAQJhagEFAmFGCQC1CQIJAQJhdgIFAmF6CQECYWcCCQCkAwEFAmFoCQCkAwEFAmFIBQFqAQJhSQAJALUJAgkBAmF2AgUCYXoJAQJhZQAFAWoBAmFKCgJhSwJhTAJhTQJhTgJhTwJhUAJhUQJhUgJhUwJhVAkAuQkCCQDMCAICFCVkJWQlZCVkJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQUCYUsJAMwIAgkApAMBBQJhTAkAzAgCCQCkAwEFAmFNCQDMCAIJAKQDAQUCYU4JAMwIAgkApAMBBQJhTwkAzAgCCQCkAwEFAmFQCQDMCAIJAKQDAQUCYVEJAMwIAgkApAMBBQJhUgkAzAgCCQCkAwEFAmFTCQDMCAIJAKQDAQUCYVQFA25pbAUBagECYVUGAmFWAmFXAmFYAmFOAmFRAmFSCQC5CQIJAMwIAgIMJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQUCYVYJAMwIAgkApAMBBQJhVwkAzAgCCQCkAwEFAmFYCQDMCAIJAKQDAQUCYU4JAMwIAgkApAMBBQJhUQkAzAgCCQCkAwEFAmFSBQNuaWwFAWoBAmFZAQJhWgMJAAACBQJhWgIFV0FWRVMICQDvBwEFBHRoaXMJYXZhaWxhYmxlCQDwBwIFBHRoaXMJANkEAQUCYVoBAmJhAgJiYgJiYwkAvAIDBQJiYgUBYwUCYmMBAmJkAwJiZQJiZgJiZwQCYmgJALwCAwkAuAICBQJiZQUCYmYFAWIFAmJmBAJiaQkAvwICCQC4AgIFAmJnCQEBTQEFAmJoBQFlAwkBASEBBQJiaQkBAmFtAQkArAICAg5CaWcgc2xpcHBhZ2U6IAkApgMBBQJiaAkAlAoCBQJiaQkAmQMBCQDMCAIFAmJlCQDMCAIFAmJmBQNuaWwBAmJqAwJiawJibAJiZwQCYmgJALwCAwUCYmwFAWIFAmJrBAJibQkAvwICBQJiZwUCYmgDAwUCYm0GCQC/AgIFAmJsBQJiawkBAmFtAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApgMBBQJibAIBIAkApgMBBQJiawIBIAkApgMBBQJiaAIBIAkApgMBBQJiZwUCYm0BAmJuBAJibwJicAJicQJicgQCYnMJAQFDAgUCYnEFAmJvBAJidAkBAUMCBQJicgUCYnAJAQJiYQIFAmJ0BQJicwECYnUDAmJxAmJyAmJ2BAJidwkBAmFFAAQCYngJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJidwUBdQQCYnkJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJidwUBdgQCYnoJAQJibgQFAmJ4BQJieQUCYnEFAmJyBAJiYwkBAUMCBQJicQUCYngEAmJiCQEBQwIFAmJyBQJieQQCYkEJAQFDAgUCYnYFAWEEAmJCCQECYmECBQJiYwUCYkEEAmJDCQECYmECBQJiYgUCYkEJAMwIAgUCYnoJAMwIAgUCYkIJAMwIAgUCYkMFA25pbAECYkQDAmJxAmJyAmJ2BAJiRQkBAmJ1AwUCYnEFAmJyBQJidgkAzAgCCQEBRgIJAJEDAgUCYkUAAAUBYQkAzAgCCQEBRgIJAJEDAgUCYkUAAQUBYQkAzAgCCQEBRgIJAJEDAgUCYkUAAgUBYQUDbmlsAQJiRgQCYkcCYkgCYkkCYkoEAmJ3CQECYUUABAJiSwkAkQMCBQJidwUBcgQCYkwJAJEDAgUCYncFAXMEAmJNCQCRAwIFAmJ3BQF0BAJiTgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJ3BQF1BAJiTwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJ3BQF2BAJiUAkAkQMCBQJidwUBcQQCYlEICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQJiSwILV3JvbmcgTFAgaWQIcXVhbnRpdHkEAmJSAwkAAAIFAmJLBQJiSAYJAQJhbQECE1dyb25nIHBheW1lbnQgYXNzZXQDCQAAAgUCYlIFAmJSBAJiUwMJAGcCBQJiTgUCYk8FAmJOBQJiTwMJAAACBQJiUwUCYlMEAmJUCQECYVkBBQJiTAQCYlUJAQFDAgUCYlQFAmJTBAJiVgkBAmFZAQUCYk0EAmJXCQEBQwIFAmJWBQJiUwQCYlgJAQJiYQIFAmJXBQJiVQQCYlkJAQFGAgUCYlgFAWEEAmJaCQEBQwIFAmJJBQFhBAJjYQkBAUMCBQJiUQUBYQQCY2IJALwCAwUCYlUFAmJaBQJjYQQCY2MJALwCAwUCYlcFAmJaBQJjYQQCY2QJAQFGAgUCY2IFAmJTBAJjZQkBAUYCBQJjYwUCYlMEAmNmAwkAAAIFAmJHAgAFA25pbAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJiSgUCY2QDCQAAAgUCYkwCBVdBVkVTBQR1bml0CQDZBAEFAmJMCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmJKBQJjZQMJAAACBQJiTQIFV0FWRVMFBHVuaXQJANkEAQUCYk0JAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVgCCQClCAEFAmJKBQJiRwkBAmFVBgUCY2QFAmNlBQJiSQUCYlkFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFRAAUCYlkJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFSAgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUCYlkFA25pbAkAnAoKBQJjZAUCY2UFAmJMBQJiTQUCYlQFAmJWBQJiUQUCYlgFAmJQBQJjZgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECY2cMAmJHAmNoAmNpAmNqAmNrAmNsAmJKAmNtAmNuAmNvAmNwAmNxBAJidwkBAmFFAAQCYksJANkEAQkAkQMCBQJidwUBcgQCY3IJAJEDAgUCYncFAXMEAmNzCQCRAwIFAmJ3BQF0BAJjdAkAkQMCBQJidwUBdwQCY3UJAJEDAgUCYncFAXgEAmJOCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYncFAXUEAmJPCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYncFAXYEAmJQCQCRAwIFAmJ3BQFxBAJiUQgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBBQJiSwIOV3JvbmcgbHAgYXNzZXQIcXVhbnRpdHkEAmJUAwUCY20JAQJhWQEFAmNyAwMFAmNvCQAAAgUCY3EFAmNyBwkAZQIJAQJhWQEFAmNyBQJjcAMFAmNvCQECYVkBBQJjcgkAZQIJAQJhWQEFAmNyBQJjaQQCYlYDBQJjbQkBAmFZAQUCY3MDAwUCY28JAAACBQJjcQUCY3MHCQBlAgkBAmFZAQUCY3MFAmNwAwUCY28JAQJhWQEFAmNzCQBlAgkBAmFZAQUCY3MFAmNrBAJiUwMJAGcCBQJiTgUCYk8FAmJOBQJiTwMJAAACBQJiUwUCYlMEAmN2CQEBQwIFAmNpBQJiUwQCY3cJAQFDAgUCY2sFAmJTBAJjeAkBAmJhAgUCY3cFAmN2BAJiVQkBAUMCBQJiVAUCYlMEAmJXCQEBQwIFAmJWBQJiUwQCY3kDCQAAAgUCYlEAAAQCYlgFAWUEAmN6BQFlBAJjQQkAdgYJALkCAgUCY3YFAmN3AAAJALYCAQAFAAEAAAUERE9XTgkAlwoFCQEBRgIFAmNBBQFhCQEBRgIFAmN2BQJiUwkBAUYCBQJjdwUCYlMJAQJiYQIJALcCAgUCYlcFAmN3CQC3AgIFAmJVBQJjdgUCY3oEAmJYCQECYmECBQJiVwUCYlUEAmNCCQC8AgMJAQFNAQkAuAICBQJiWAUCY3gFAWMFAmJYBAJjegkBAUMCBQJjaAUBYQMDCQECIT0CBQJiWAUBZQkAvwICBQJjQgUCY3oHCQECYW0BCQCsAgIJAKwCAgkArAICAg9QcmljZSBzbGlwcGFnZSAJAKYDAQUCY0ICAyA+IAkApgMBBQJjegQCY2EJAQFDAgUCYlEFAWEEAmNDCQC8AgMFAmN2BQJiWAUBYwQCY0QJALwCAwUCY3cFAWMFAmJYBAJjRQMJAL8CAgUCY0MFAmN3CQCUCgIFAmNEBQJjdgkAlAoCBQJjdgUCY0MEAmNGCAUCY0UCXzEEAmNHCAUCY0UCXzIEAmNBCQC8AgMFAmNhBQJjRwUCYlcJAJcKBQkBAUYCBQJjQQUBYQkBAUYCBQJjRgUCYlMJAQFGAgUCY0cFAmJTBQJiWAUCY3oEAmNICAUCY3kCXzEEAmNJCAUCY3kCXzIEAmNKCAUCY3kCXzMEAmNLCQEBRgIIBQJjeQJfNAUBYQQCY0wJAQFGAggFAmN5Al81BQFhBAJjTQMJAGYCBQJjSAAABgkBAmFtAQIHTFAgPD0gMAMJAAACBQJjTQUCY00EAmNOAwkBASEBBQJjbgAABQJjSAQCY08JAGUCBQJjaQUCY0kEAmNQCQBlAgUCY2sFAmNKBAJjUQMDBQJjbwkAAAIFAmNxBQJjcgcJAJQKAgUCY3AAAAMDBQJjbwkAAAIFAmNxBQJjcwcJAJQKAgAABQJjcAkAlAoCBQJjSQUCY0oEAmNSCAUCY1ECXzEEAmNTCAUCY1ECXzIEAmNUCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBUQAFAmNLCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBUgIFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFAmNLCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFVAgUCYkoFAmJHCQECYUoKBQJjUgUCY1MFAmNOBQJjSwUCY2gFAmNMBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQJjTwUCY1AFA25pbAkAnwoNBQJjSAUCY04FAmNLBQJiVAUCYlYFAmJRBQJiSwUCYlAFAmNUBQJjTwUCY1AFAmNqBQJjbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECY1UBAmNWBAJidwkBAmFFAAQCY1cJAJEDAgUCYncFAXMEAmNYCQCRAwIFAmJ3BQF0BAJiUAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJ3BQFxBAJieAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJ3BQF1BAJieQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJ3BQF2BAJjWQkBAmFZAQUCY1cEAmNaCQECYVkBBQJjWAQCYlgDCQAAAggFAmNWCW9yZGVyVHlwZQUDQnV5CQECYm4EBQJieAUCYnkJAGQCBQJjWQgFAmNWBmFtb3VudAUCY1oJAQJibgQFAmJ4BQJieQkAZQIFAmNZCAUCY1YGYW1vdW50BQJjWgQCYlkJAQFGAgUCYlgFAWEDAwMJAQJhQgAGCQAAAgUCYlAFAW4GCQAAAgUCYlAFAW8JAQJhbQECDUFkbWluIGJsb2NrZWQEAmRhCAgFAmNWCWFzc2V0UGFpcgthbW91bnRBc3NldAQCZGIDCQAAAgUCZGEFBHVuaXQCBVdBVkVTCQDYBAEJAQV2YWx1ZQEFAmRhBAJkYwgIBQJjVglhc3NldFBhaXIKcHJpY2VBc3NldAQCZGQDCQAAAgUCZGMFBHVuaXQCBVdBVkVTCQDYBAEJAQV2YWx1ZQEFAmRjAwMJAQIhPQIFAmRiBQJjVwYJAQIhPQIFAmRkBQJjWAkBAmFtAQIJV3IgYXNzZXRzBAJkZQgFAmNWBXByaWNlBAJiTwkAawMFAWEFAmJ5BQJieAQCZGYJAQFJAwUCZGUFAWEFAmJPBAJkZwMJAAACCAUCY1YJb3JkZXJUeXBlBQNCdXkJAGcCBQJiWQUCZGYJAGcCBQJkZgUCYlkGAQJkaAECZGkEAmRqAwkAAAIJAJADAQgFAmRpCHBheW1lbnRzAAEGCQECYW0BAhIxIHBheW1lbnQgZXhwZWN0ZWQDCQAAAgUCZGoFAmRqBAJkawkBBXZhbHVlAQkAkQMCCAUCZGkIcGF5bWVudHMAAAQCYkgJAQV2YWx1ZQEIBQJkawdhc3NldElkBAJjcAgFAmRrBmFtb3VudAQCY3kJAQJiRgQJANgEAQgFAmRpDXRyYW5zYWN0aW9uSWQJANgEAQUCYkgFAmNwCAUCZGkGY2FsbGVyBAJjZAgFAmN5Al8xBAJjZQgFAmN5Al8yBAJiUAkBDXBhcnNlSW50VmFsdWUBCAUCY3kCXzkEAmNmCAUCY3kDXzEwAwMJAQJhQgAGCQAAAgUCYlAFAW8JAQJhbQEJAKwCAgIPQWRtaW4gYmxvY2tlZDogCQCkAwEFAmJQCQCXCgUFAmNkBQJjZQUCY3AFAmJIBQJjZgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECZGwJAmRtAVcCZG4CZG8CYmcCY24CY28CY3ACY3EEAmN5CQECY2cMBQFXBQJiZwgJAQV2YWx1ZQEFAmRuBmFtb3VudAgJAQV2YWx1ZQEFAmRuB2Fzc2V0SWQICQEFdmFsdWUBBQJkbwZhbW91bnQICQEFdmFsdWUBBQJkbwdhc3NldElkBQJkbQcFAmNuBQJjbwUCY3AFAmNxBAJiUAkBDXBhcnNlSW50VmFsdWUBCAUCY3kCXzgDAwMJAQJhQgAGCQAAAgUCYlAFAW0GCQAAAgUCYlAFAW8JAQJhbQEJAKwCAgIIQmxvY2tlZDoJAKQDAQUCYlAFAmN5AQJkcAECZHEEAmRyCQBrAwUCZHEFAmFkBQFkCQCUCgIJAGUCBQJkcQUCZHIFAmRyAQJkcwAEAmF0CQCiCAEJAQFPAAMJAAECBQJhdAIGU3RyaW5nBAJkdAUCYXQJANkEAQUCZHQDCQABAgUCYXQCBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgECZHUABAJhdAkAoggBCQEBUAADCQABAgUCYXQCBlN0cmluZwQCZHQFAmF0CQDZBAEFAmR0AwkAAQIFAmF0AgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IAAmR2CQECYW0BAhFQZXJtaXNzaW9uIGRlbmllZAECZHcBAmRpBAJhdAkBAmRzAAMJAAECBQJhdAIKQnl0ZVZlY3RvcgQCZHgFAmF0AwkAAAIIBQJkaQ9jYWxsZXJQdWJsaWNLZXkFAmR4BgUCZHYDCQABAgUCYXQCBFVuaXQDCQAAAggFAmRpBmNhbGxlcgUEdGhpcwYFAmR2CQACAQILTWF0Y2ggZXJyb3IVAmRpAQtjb25zdHJ1Y3RvcgECYXoEAmR5CQECZHcBBQJkaQMJAAACBQJkeQUCZHkJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAU4ABQJhegUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRpAQpzZXRNYW5hZ2VyAQJkegQCZHkJAQJkdwEFAmRpAwkAAAIFAmR5BQJkeQQCZEEJANkEAQUCZHoDCQAAAgUCZEEFAmRBCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFQAAUCZHoFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkaQEOY29uZmlybU1hbmFnZXIABAJkQgkBAmR1AAQCZEMDCQEJaXNEZWZpbmVkAQUCZEIGCQECYW0BAhJObyBwZW5kaW5nIG1hbmFnZXIDCQAAAgUCZEMFAmRDBAJkRAMJAAACCAUCZGkPY2FsbGVyUHVibGljS2V5CQEFdmFsdWUBBQJkQgYJAQJhbQECG1lvdSBhcmUgbm90IHBlbmRpbmcgbWFuYWdlcgMJAAACBQJkRAUCZEQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAU8ACQDYBAEJAQV2YWx1ZQEFAmRCCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFQAAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRpAQNwdXQCAmJnAmRFBAJkRgkBAmFJAAQCZEcJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmRGBQF5AhZXcm9uZyBzdGFraW5nIGNvbnRyYWN0BAJkSAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCZEYFAXoCF1dyb2duIHNsaXBwYWdlIGNvbnRyYWN0BAJkSQMJAGcCBQJiZwAABgkBAmFtAQIOd3Jvbmcgc2xpcHBhZ2UDCQAAAgUCZEkFAmRJBAJkSgMJAAACCQCQAwEIBQJkaQhwYXltZW50cwACBgkBAmFtAQITMiBwYXltZW50cyBleHBlY3RlZAMJAAACBQJkSgUCZEoEAmRLCQECZGwJCQClCAEIBQJkaQZjYWxsZXIJANgEAQgFAmRpDXRyYW5zYWN0aW9uSWQJAQ9BdHRhY2hlZFBheW1lbnQCCAkBBXZhbHVlAQkAkQMCCAUCZGkIcGF5bWVudHMAAAdhc3NldElkCAkBBXZhbHVlAQkAkQMCCAUCZGkIcGF5bWVudHMAAAZhbW91bnQJAJEDAggFAmRpCHBheW1lbnRzAAEFAmJnBgcAAAIABAJjTggFAmRLAl8yBAJiSwgFAmRLAl83BAJjZggFAmRLAl85BAJjTwgFAmRLA18xMAQCY1AIBQJkSwNfMTEEAmJMCAUCZEsDXzEyBAJiTQgFAmRLA18xMwQCY3kJAPwHBAUCYXoCBGVtaXQJAMwIAgUCY04FA25pbAUDbmlsAwkAAAIFAmN5BQJjeQQCZEwEAmF0BQJjeQMJAAECBQJhdAIHQWRkcmVzcwQCZE0FAmF0CQD8BwQFAmRNAgRlbWl0CQDMCAIFAmNOBQNuaWwFA25pbAUEdW5pdAMJAAACBQJkTAUCZEwEAmROAwkAZgIFAmNPAAAJAPwHBAUCZEgCA3B1dAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJiTAUCY08FA25pbAUDbmlsAwkAAAIFAmROBQJkTgQCZE8DCQBmAgUCY1AAAAkA/AcEBQJkSAIDcHV0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmJNBQJjUAUDbmlsBQNuaWwDCQAAAgUCZE8FAmRPBAJkUAMFAmRFBAJkUQkA/AcEBQJkRwIFc3Rha2UFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCYksFAmNOBQNuaWwDCQAAAgUCZFEFAmRRBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAmRpBmNhbGxlcgUCY04FAmJLBQNuaWwJAM4IAgUCY2YFAmRQCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRpAQlwdXRPbmVUa24FAmRSAmRTAmJmAmJnAmRFBAJidwkBAmFJAAQCZEcJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmJ3BQF5AhZXcm9uZyBzdGFraW5nIGNvbnRyYWN0BAJkSAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCYncFAXoCF1dyb25nIHNsaXBwYWdlIGNvbnRyYWN0BAJkVAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCYncFAUECGVdyb25nIGd3eCByZXdhcmQgY29udHJhY3QEAmRVCQECYUUABAJiTAkAkQMCBQJkVQUBcwQCYk0JAJEDAgUCZFUFAXQEAmJOCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZFUFAXUEAmJPCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZFUFAXYEAmRWCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQJhYgACAAQCYkoDCQAAAgUCZFYJAKUIAQgFAmRpBmNhbGxlcggFAmRpDG9yaWdpbkNhbGxlcggFAmRpBmNhbGxlcgMDAwMJAGcCAAAFAmJnBgkAZwIAAAUCZFIGCQBnAgAABQJkUwYJAGcCAAAFAmJmCQECYW0BAgxXcm9uZyBwYXJhbXMDCQECIT0CCQCQAwEIBQJkaQhwYXltZW50cwABCQECYW0BAhIxIHBheW1lbnQgZXhwZWN0ZWQEAmRrCQEFdmFsdWUBCQCRAwIIBQJkaQhwYXltZW50cwAABAJiSAkA2AQBCQEFdmFsdWUBCAUCZGsHYXNzZXRJZAQCZFcIBQJkawZhbW91bnQEAmRYCQECZHABBQJkVwQCY3AIBQJkWAJfMQQCZFkIBQJkWAJfMgMDAwkAZgIFAmRSBQJjcAYJAGYCBQJkUwUCY3AGCQBmAgCAreIEBQJjcAkBAmFtAQIUd3JvbmcgcGF5bWVudCBhbW91bnQEAmJUCQECYVkBBQJiTAQCYlYJAQJhWQEFAmJNBAJkWgMJAAACBQJiSAUCYkwJAJgKBgkAZQIFAmJUBQJjcAUCYlYJAGUCBQJjcAUCZFIFAmRTAAAAAAMJAAACBQJiSAUCYk0JAJgKBgUCYlQJAGUCBQJiVgUCY3AAAAAACQBlAgUCY3AFAmRTBQJkUgkBAmFtAQIUd3JvbmcgcGF5bWVudEFzc2V0SWQEAmVhCAUCZFoCXzEEAmViCAUCZFoCXzIEAmVjCAUCZFoCXzMEAmVkCAUCZFoCXzQEAmVlCAUCZFoCXzUEAmVmCAUCZFoCXzYEAmJsCQD8BwQFAmRUAgVjYWxjRAkAzAgCCQCkAwEFAmVhCQDMCAIJAKQDAQUCZWIJAMwIAgUCYUEJAMwIAgUBaAkAzAgCBQFpBQNuaWwFA25pbAQCYmsJAPwHBAUCZFQCBWNhbGNECQDMCAIJAKYDAQkAtgIBCQBlAgkAZAIFAmVhBQJlYwUCZWYJAMwIAgkApgMBCQC2AgEJAGUCCQBkAgUCZWIFAmVlBQJlZAkAzAgCBQJhQQkAzAgCBQFoCQDMCAIFAWkFA25pbAUDbmlsBAJlZwkBAmJqAwkApwMBCQECYXMBBQJiawkApwMBCQECYXMBBQJibAUBZwMJAAACBQJlZwUCZWcEAmRLCQECZGwJCQClCAEIBQJkaQZjYWxsZXIJANgEAQgFAmRpDXRyYW5zYWN0aW9uSWQJAQ9BdHRhY2hlZFBheW1lbnQCCQDZBAEFAmJMBQJkUgkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQUCYk0FAmRTBQJiZwYGBQJjcAUCYkgEAmJlCAUCZEsCXzIEAmJLCAUCZEsCXzcEAmNmCAUCZEsCXzkEAmNPCAUCZEsDXzEwBAJjUAgFAmRLA18xMQQCZWgJAQJiZAMJALYCAQUCYmUJALYCAQUCYmYJALYCAQUCYmcEAmNOCQCgAwEIBQJlaAJfMgQCZWkJAPwHBAUCYXoCBGVtaXQJAMwIAgUCY04FA25pbAUDbmlsAwkAAAIFAmVpBQJlaQQCZEwEAmF0BQJlaQMJAAECBQJhdAIHQWRkcmVzcwQCZE0FAmF0CQD8BwQFAmRNAgRlbWl0CQDMCAIFAmNOBQNuaWwFA25pbAUEdW5pdAMJAAACBQJkTAUCZEwEAmROAwkAZgIFAmNPAAAJAPwHBAUCZEgCA3B1dAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQDZBAEFAmJMBQJjTwUDbmlsBQNuaWwDCQAAAgUCZE4FAmROBAJkTwMJAGYCBQJjUAAACQD8BwQFAmRIAgNwdXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkA2QQBBQJiTQUCY1AFA25pbAUDbmlsAwkAAAIFAmRPBQJkTwQCZFADBQJkRQQCZFEJAPwHBAUCZEcCBXN0YWtlBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmJLBQJjTgUDbmlsAwkAAAIFAmRRBQJkUQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQJkaQZjYWxsZXIFAmNOBQJiSwUDbmlsBAJlagMJAGYCBQJkWQAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmFEBQJkWQkA2QQBBQJiSAUDbmlsBQNuaWwJAM4IAgkAzggCBQJjZgUCZFAFAmVqCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRpAQpwdXRGb3JGcmVlAQJlawMJAGYCAAAFAmVrCQECYW0BAg53cm9uZyBzbGlwcGFnZQMJAQIhPQIJAJADAQgFAmRpCHBheW1lbnRzAAIJAQJhbQECEzIgcGF5bWVudHMgZXhwZWN0ZWQEAmRLCQECZGwJCQClCAEIBQJkaQZjYWxsZXIJANgEAQgFAmRpDXRyYW5zYWN0aW9uSWQJAQ9BdHRhY2hlZFBheW1lbnQCCAkBBXZhbHVlAQkAkQMCCAUCZGkIcGF5bWVudHMAAAdhc3NldElkCAkBBXZhbHVlAQkAkQMCCAUCZGkIcGF5bWVudHMAAAZhbW91bnQJAJEDAggFAmRpCHBheW1lbnRzAAEFAmVrBwcAAAIACAUCZEsCXzkCZGkBA2dldAAEAmN5CQECZGgBBQJkaQQCZWwIBQJjeQJfMQQCY2UIBQJjeQJfMgQCY3AIBQJjeQJfMwQCYkgIBQJjeQJfNAQCY2YIBQJjeQJfNQQCZW0JAPwHBAUCYXoCBGJ1cm4JAMwIAgUCY3AFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCYkgFAmNwBQNuaWwDCQAAAgUCZW0FAmVtBQJjZgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkaQEJZ2V0T25lVGtuBQJlbgJlbwJlcAJlcQJiZwMJAQIhPQIJAJADAQgFAmRpCHBheW1lbnRzAAEJAQJhbQECEjEgcGF5bWVudCBleHBlY3RlZAQCYncJAQJhRQAEAmJLCQCRAwIFAmJ3BQFyBAJiTAkAkQMCBQJidwUBcwQCYk0JAJEDAgUCYncFAXQEAmJOCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYncFAXUEAmJPCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYncFAXYEAmJQCQCRAwIFAmJ3BQFxBAJkRgkBAmFJAAQCZFQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmRGBQFBAh9Xcm9uZyBnd3hSZXdhcmRDb250cmFjdCBhZGRyZXNzBAJkawkBBXZhbHVlAQkAkQMCCAUCZGkIcGF5bWVudHMAAAQCZFYJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBAmFiAAIABAJiSgMJAAACBQJkVgkApQgBCAUCZGkGY2FsbGVyCAUCZGkMb3JpZ2luQ2FsbGVyCAUCZGkGY2FsbGVyBAJiRwkA2AQBCAUCZGkNdHJhbnNhY3Rpb25JZAQCYkgJAQV2YWx1ZQEIBQJkawdhc3NldElkBAJjcAgFAmRrBmFtb3VudAMJAGYCAICU69wDBQJjcAkBAmFtAQIRTWluIHBheW1lbnQgMTAgTFADAwMJAGYCAAAFAmJnBgkAZgIAAAUCZW4GCQBmAgAABQJlcAkBAmFtAQIMV3JvbmcgcGFyYW1zAwkBAiE9AgUCYksJANgEAQUCYkgJAQJhbQECCFdyb25nIExQBAJjeQkBAmJGBAkA2AQBCAUCZGkNdHJhbnNhY3Rpb25JZAkA2AQBBQJiSAUCY3AIBQJkaQZjYWxsZXIEAmVyCAUCY3kCXzEEAmVzCAUCY3kCXzIEAmJUCQECYVkBBQJiTAQCYlYJAQJhWQEFAmJNBAJldAMJAAACBQJlcQUCYkwJAJkKBwkAZQIFAmJUBQJlcgkAZQIFAmJWBQJlcwUCZW4FAmVzAAAAAAkAZAIFAmVyBQJlbgMJAAACBQJlcQUCYk0JAJkKBwkAZQIFAmJUBQJlcgkAZQIFAmJWBQJlcwAAAAAFAmVuBQJlcgkAZAIFAmVzBQJlbgkBAmFtAQIQd3Jvbmcgb3V0QXNzZXRJZAQCZWEIBQJldAJfMQQCZWIIBQJldAJfMgQCZWMIBQJldAJfMwQCZWQIBQJldAJfNAQCZWUIBQJldAJfNQQCZWYIBQJldAJfNgQCZXUIBQJldAJfNwMDCQBmAgAABQJlYwYJAGYCAAAFAmVlCQECYW0BAgpXcm9uZyBjYWxjBAJibAkA/AcEBQJkVAIFY2FsY0QJAMwIAgkApAMBBQJlYQkAzAgCCQCkAwEFAmViCQDMCAIFAmFBCQDMCAIFAWgJAMwIAgUBaQUDbmlsBQNuaWwEAmJrCQD8BwQFAmRUAgVjYWxjRAkAzAgCCQCkAwEJAGQCCQBlAgUCZWEFAmVjBQJlZgkAzAgCCQCkAwEJAGUCCQBkAgUCZWIFAmVkBQJlZQkAzAgCBQJhQQkAzAgCBQFoCQDMCAIFAWkFA25pbAUDbmlsBAJlZwkBAmJqAwkApwMBCQECYXMBBQJiawkApwMBCQECYXMBBQJibAUBZwMJAAACBQJlZwUCZWcEAmV2CQECYmQDCQC2AgEFAmV1CQC2AgEFAmVwCQC2AgEFAmJnAwkAAAIFAmV2BQJldgQCZXcDCQAAAgUCZXEFAmJMCQCUCgIJAKADAQgFAmV2Al8yAAAJAJQKAgAACQCgAwEIBQJldgJfMgQCZXgIBQJldwJfMQQCZXkIBQJldwJfMgQCZXoJAGQCBQJleAUCZXkEAmVBCQECZHABBQJlegQCZUIIBQJlQQJfMQQCZFkIBQJlQQJfMgQCZUMDCQAAAgUCZXECBVdBVkVTBQR1bml0CQDZBAEFAmVxBAJlagMJAGYCBQJkWQAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmFEBQJkWQUCZUMFA25pbAUDbmlsBAJiUwMJAGcCBQJiTgUCYk8FAmJOBQJiTwMJAAACBQJiUwUCYlMEAmVECQECYmECCQEBQwIFAmJWBQJiUwkBAUMCBQJiVAUCYlMEAmVFCQEBRgIFAmVEBQFhBAJjZgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJiSgUCZUIFAmVDCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFYAgkApQgBBQJiSgUCYkcJAQJhVQYFAmV4BQJleQUCY3AFAmVFBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBUQAFAmVFCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBUgIFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFAmVFBQNuaWwDCQAAAgUCY2YFAmNmBAJlRgkA/AcEBQJhegIEYnVybgkAzAgCBQJjcAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJiSAUCY3AFA25pbAMJAAACBQJlRgUCZUYJAM4IAgUCY2YFAmVqCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRpAQlnZXROb0xlc3MCAmVHAmVIBAJjeQkBAmRoAQUCZGkEAmNkCAUCY3kCXzEEAmNlCAUCY3kCXzIEAmNwCAUCY3kCXzMEAmJICAUCY3kCXzQEAmNmCAUCY3kCXzUEAmVJAwkAZwIFAmNkBQJlRwYJAQJhbQEJAKwCAgkArAICCQCsAgICCUZhaWxlZDogIAkApAMBBQJjZAIDIDwgCQCkAwEFAmVHAwkAAAIFAmVJBQJlSQQCZUoDCQBnAgUCY2UFAmVIBgkBAmFtAQkArAICCQCsAgIJAKwCAgIIRmFpbGVkOiAJAKQDAQUCY2UCAyA8IAkApAMBBQJlSAMJAAACBQJlSgUCZUoEAmVLCQD8BwQFAmF6AgRidXJuCQDMCAIFAmNwBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmJIBQJjcAUDbmlsAwkAAAIFAmVLBQJlSwUCY2YJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZGkBDXVuc3Rha2VBbmRHZXQBAmRxBAJkagMJAQIhPQIJAJADAQgFAmRpCHBheW1lbnRzAAAJAQJhbQECFG5vIHBheW1lbnRzIGV4cGVjdGVkBgMJAAACBQJkagUCZGoEAmJ3CQECYUUABAJlTAkBAmFJAAQCYksJANkEAQkAkQMCBQJidwUBcgQCZU0JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmVMBQF5AgV3cm9uZwQCZU4JAPwHBAUCZU0CB3Vuc3Rha2UJAMwIAgkA2AQBBQJiSwkAzAgCBQJkcQUDbmlsBQNuaWwDCQAAAgUCZU4FAmVOBAJjeQkBAmJGBAkA2AQBCAUCZGkNdHJhbnNhY3Rpb25JZAkA2AQBBQJiSwUCZHEIBQJkaQZjYWxsZXIEAmJQCQENcGFyc2VJbnRWYWx1ZQEIBQJjeQJfOQQCY2YIBQJjeQNfMTAEAmVPAwMJAQJhQgAGCQAAAgUCYlAFAW8JAQJhbQEJAKwCAgIJQmxvY2tlZDogCQCkAwEFAmJQBgMJAAACBQJlTwUCZU8EAmVQCQD8BwQFAmF6AgRidXJuCQDMCAIFAmRxBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmJLBQJkcQUDbmlsAwkAAAIFAmVQBQJlUAUCY2YJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZGkBCGFjdGl2YXRlAgJlUQJlUgMJAQIhPQIJAKUIAQgFAmRpBmNhbGxlcgkApQgBBQJhegkBAmFtAQIGZGVuaWVkCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVkABQJlUQkAzAgCCQELU3RyaW5nRW50cnkCCQEBWgAFAmVSBQNuaWwCB3N1Y2Nlc3MCZGkBBHNldFMCAmVTAmVPAwkBAiE9AgkApQgBCAUCZGkGY2FsbGVyCQECYXYCBQR0aGlzCQECYWIABQJkdgkAzAgCCQELU3RyaW5nRW50cnkCBQJlUwUCZU8FA25pbAJkaQEEc2V0SQICZVMCZU8DCQECIT0CCQClCAEIBQJkaQZjYWxsZXIJAQJhdgIFBHRoaXMJAQJhYgAFAmR2CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJlUwUCZU8FA25pbAJkaQEcZ2V0UG9vbENvbmZpZ1dyYXBwZXJSRUFET05MWQAJAJQKAgUDbmlsCQECYUUAAmRpARxnZXRBY2NCYWxhbmNlV3JhcHBlclJFQURPTkxZAQJhWgkAlAoCBQNuaWwJAQJhWQEFAmFaAmRpARljYWxjUHJpY2VzV3JhcHBlclJFQURPTkxZAwJicQJicgJidgQCZVQJAQJidQMFAmJxBQJicgUCYnYJAJQKAgUDbmlsCQDMCAIJAKYDAQkAkQMCBQJlVAAACQDMCAIJAKYDAQkAkQMCBQJlVAABCQDMCAIJAKYDAQkAkQMCBQJlVAACBQNuaWwCZGkBFmZyb21YMThXcmFwcGVyUkVBRE9OTFkCAUcCZVUJAJQKAgUDbmlsCQEBRgIJAKcDAQUBRwUCZVUCZGkBFHRvWDE4V3JhcHBlclJFQURPTkxZAgFEAUUJAJQKAgUDbmlsCQCmAwEJAQFDAgUBRAUBRQJkaQEeY2FsY1ByaWNlQmlnSW50V3JhcHBlclJFQURPTkxZAgJiYgJiYwkAlAoCBQNuaWwJAKYDAQkBAmJhAgkApwMBBQJiYgkApwMBBQJiYwJkaQEjZXN0aW1hdGVQdXRPcGVyYXRpb25XcmFwcGVyUkVBRE9OTFkJAmJHAmJnAmNpAmVWAmNrAmVXAmVYAmNtAmNuCQCUCgIFA25pbAkBAmNnDAUCYkcFAmJnBQJjaQUCZVYFAmNrBQJlVwUCZVgFAmNtBQJjbgcAAAIAAmRpASNlc3RpbWF0ZUdldE9wZXJhdGlvbldyYXBwZXJSRUFET05MWQQCYkcCZVkCYkkCZVgEAmN5CQECYkYEBQJiRwUCZVkFAmJJCQERQGV4dHJOYXRpdmUoMTA2MikBBQJlWAkAlAoCBQNuaWwJAJwKCggFAmN5Al8xCAUCY3kCXzIIBQJjeQJfMwgFAmN5Al80CAUCY3kCXzUIBQJjeQJfNggFAmN5Al83CQCmAwEIBQJjeQJfOAgFAmN5Al85CAUCY3kDXzEwAQJlWgECZmEABAJhdAUCZVoDCQABAgUCYXQCBU9yZGVyBAJjVgUCYXQEAmZiCQECYUMABAJhcAkBAmNVAQUCY1YEAmZjCQD0AwMIBQJjVglib2R5Qnl0ZXMJAJEDAggFAmNWBnByb29mcwAACAUCY1YPc2VuZGVyUHVibGljS2V5BAJmZAkA9AMDCAUCY1YJYm9keUJ5dGVzCQCRAwIIBQJjVgZwcm9vZnMAAQUCZmIDAwMFAmFwBQJmYwcFAmZkBwYJAQJhbwMFAmFwBQJmYwUCZmQEAmZlBAJmZgkBAmRzAAMJAAECBQJmZgIKQnl0ZVZlY3RvcgQCZHgFAmZmBQJkeAMJAAECBQJmZgIEVW5pdAgFAmVaD3NlbmRlclB1YmxpY0tleQkAAgECC01hdGNoIGVycm9yCQD0AwMIBQJlWglib2R5Qnl0ZXMJAJEDAggFAmVaBnByb29mcwAABQJmZd18zmc=", "chainId": 84, "height": 2185659, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GnLbgHxUtdYbZ6fXnrR9fJy7CwyFkiGw9eNpp7oS75Dv Next: E9UKfZ1BvAZ9E5bFRbs1oEn96SR5GHKWxjpEGyN7LfYL 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+ if (if ((currentPriceX18 != zeroBigInt))
328+ then (slippageRealX18 > slippageX18)
329+ else false)
330+ then throwErr(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
331+ else {
332+ let lpEmissionX18 = toX18(lpEmission, scale8)
333+ let prViaAmX18 = fraction(inAmountAssetAmountX18, currentPriceX18, scale18)
334+ let amViaPrX18 = fraction(inPriceAssetAmountX18, scale18, currentPriceX18)
335+ let expectedAmounts = if ((prViaAmX18 > inPriceAssetAmountX18))
336+ then $Tuple2(amViaPrX18, inAmountAssetAmountX18)
337+ else $Tuple2(inAmountAssetAmountX18, prViaAmX18)
338+ let expectedAmountAssetAmountX18 = expectedAmounts._1
339+ let expectedPriceAssetAmountX18 = expectedAmounts._2
340+ let lpAmountX18 = fraction(lpEmissionX18, expectedPriceAssetAmountX18, priceBalanceX18)
341+ $Tuple5(fromX18(lpAmountX18, scale8), fromX18(expectedAmountAssetAmountX18, decimals), fromX18(expectedPriceAssetAmountX18, decimals), currentPriceX18, slippageX18)
342+ }
343+ }
344+ let calculateLpAmount = r._1
345+ let calculateAmountAssetPayment = r._2
346+ let calculatePriceAssetPayment = r._3
347+ let currentPrice = fromX18(r._4, scale8)
348+ let slippageCalculate = fromX18(r._5, scale8)
349+ let checkCalcLpAmount = if ((calculateLpAmount > 0))
350+ then true
351+ else throwErr("LP <= 0")
352+ if ((checkCalcLpAmount == checkCalcLpAmount))
353+ then {
354+ let emitLpAmount = if (!(emitLp))
355+ then 0
356+ else calculateLpAmount
357+ let amountDiff = (inAmountAssetAmount - calculateAmountAssetPayment)
358+ let priceDiff = (inPriceAssetAmount - calculatePriceAssetPayment)
359+ let $t01618916448 = if (if (isOneAsset)
360+ then (paymentId == amountIdStr)
361+ else false)
362+ then $Tuple2(paymentAmount, 0)
363+ else if (if (isOneAsset)
364+ then (paymentId == priceIdStr)
365+ else false)
366+ then $Tuple2(0, paymentAmount)
367+ else $Tuple2(calculateAmountAssetPayment, calculatePriceAssetPayment)
368+ let writeAmAmt = $t01618916448._1
369+ let writePrAmt = $t01618916448._2
370+ 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))]
371+ $Tuple13(calculateLpAmount, emitLpAmount, currentPrice, amountBalance, priceBalance, lpEmission, lpAssetId, sts, commonState, amountDiff, priceDiff, inAmountAssetId, inPriceAssetId)
372+ }
373+ else throw("Strict value is not equal to itself.")
302374 }
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- }
375+ else throw("Strict value is not equal to itself.")
351376 }
352377
353378
354-func moa (order) = {
355- let cfg = gpc()
379+func validateMatcherOrderAllowed (order) = {
380+ let cfg = getPoolConfig()
356381 let amtAsId = cfg[idxAmAsId]
357382 let prAsId = cfg[idxPrAsId]
358383 let sts = parseIntValue(cfg[idxPoolSt])
360385 let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
361386 let accAmtAsBalance = getAccBalance(amtAsId)
362387 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())
388+ let currentPriceX18 = if ((order.orderType == Buy))
389+ then privateCalcPrice(amtAsDcm, prAsDcm, (accAmtAsBalance + order.amount), accPrAsBalance)
390+ else privateCalcPrice(amtAsDcm, prAsDcm, (accAmtAsBalance - order.amount), accPrAsBalance)
391+ let curPrice = fromX18(currentPriceX18, scale8)
392+ if (if (if (isGlobalShutdown())
368393 then true
369394 else (sts == PoolMatcherDis))
370395 then true
371396 else (sts == PoolShutdown))
372- then throw("Admin blocked")
397+ then throwErr("Admin blocked")
373398 else {
374399 let orAmtAsset = order.assetPair.amountAsset
375400 let orAmtAsStr = if ((orAmtAsset == unit))
382407 if (if ((orAmtAsStr != amtAsId))
383408 then true
384409 else (orPrAsStr != prAsId))
385- then throw("Wr assets")
410+ then throwErr("Wr assets")
386411 else {
387412 let orderPrice = order.price
388- let priceDcm = fraction(scale8, prAsDcm, amtAsDcm)
389- let castOrderPrice = ts(orderPrice, scale8, priceDcm)
413+ let priceDecimals = fraction(scale8, prAsDcm, amtAsDcm)
414+ let castOrderPrice = ts(orderPrice, scale8, priceDecimals)
390415 let isOrderPriceValid = if ((order.orderType == Buy))
391416 then (curPrice >= castOrderPrice)
392417 else (castOrderPrice >= curPrice)
396421 }
397422
398423
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- }
424+func commonGet (i) = {
425+ let checkPayments = if ((size(i.payments) == 1))
426+ then true
427+ else throwErr("1 payment expected")
428+ if ((checkPayments == checkPayments))
429+ then {
430+ let payment = value(i.payments[0])
431+ let paymentAssetId = value(payment.assetId)
432+ let paymentAmount = payment.amount
433+ let r = estimateGetOperation(toBase58String(i.transactionId), toBase58String(paymentAssetId), paymentAmount, i.caller)
434+ let outAmountAmount = r._1
435+ let outPriceAmount = r._2
436+ let sts = parseIntValue(r._9)
437+ let state = r._10
438+ if (if (isGlobalShutdown())
439+ then true
440+ else (sts == PoolShutdown))
441+ then throwErr(("Admin blocked: " + toString(sts)))
442+ else $Tuple5(outAmountAmount, outPriceAmount, paymentAmount, paymentAssetId, state)
443+ }
444+ else throw("Strict value is not equal to itself.")
445+ }
416446
417447
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)
448+func commonPut (caller,txId,amountAssetPayment,priceAssetPayment,slippage,emitLp,isOneAsset,paymentAmount,paymentId) = {
449+ let r = estimatePutOperation(txId, slippage, value(amountAssetPayment).amount, value(amountAssetPayment).assetId, value(priceAssetPayment).amount, value(priceAssetPayment).assetId, caller, false, emitLp, isOneAsset, paymentAmount, paymentId)
420450 let sts = parseIntValue(r._8)
421- if (if (if (igs())
451+ if (if (if (isGlobalShutdown())
422452 then true
423453 else (sts == PoolPutDis))
424454 then true
425455 else (sts == PoolShutdown))
426- then throw(("Blocked:" + toString(sts)))
456+ then throwErr(("Blocked:" + toString(sts)))
427457 else r
428458 }
429459
430460
431-func m () = match getString(mpk()) {
461+func takeFee (amount) = {
462+ let fee = fraction(amount, feePermille, thousand)
463+ $Tuple2((amount - fee), fee)
464+ }
465+
466+
467+func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
432468 case s: String =>
433469 fromBase58String(s)
434470 case _: Unit =>
438474 }
439475
440476
441-func pm () = match getString(pmpk()) {
477+func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
442478 case s: String =>
443479 fromBase58String(s)
444480 case _: Unit =>
448484 }
449485
450486
451-let pd = throw("Permission denied")
487+let pd = throwErr("Permission denied")
452488
453-func mm (i) = match m() {
489+func mustManager (i) = match managerPublicKeyOrUnit() {
454490 case pk: ByteVector =>
455491 if ((i.callerPublicKey == pk))
456492 then true
465501
466502
467503 @Callable(i)
468-func constructor (fc) = {
469- let c = mm(i)
470- if ((c == c))
471- then [StringEntry(fc(), fc)]
504+func constructor (factoryContract) = {
505+ let checkCaller = mustManager(i)
506+ if ((checkCaller == checkCaller))
507+ then [StringEntry(keyFactoryContact(), factoryContract)]
472508 else throw("Strict value is not equal to itself.")
473509 }
474510
476512
477513 @Callable(i)
478514 func setManager (pendingManagerPublicKey) = {
479- let c = mm(i)
480- if ((c == c))
515+ let checkCaller = mustManager(i)
516+ if ((checkCaller == checkCaller))
481517 then {
482- let cm = fromBase58String(pendingManagerPublicKey)
483- if ((cm == cm))
484- then [StringEntry(pmpk(), pendingManagerPublicKey)]
518+ let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
519+ if ((checkManagerPublicKey == checkManagerPublicKey))
520+ then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
485521 else throw("Strict value is not equal to itself.")
486522 }
487523 else throw("Strict value is not equal to itself.")
491527
492528 @Callable(i)
493529 func confirmManager () = {
494- let p = pm()
495- let hpm = if (isDefined(p))
530+ let pm = pendingManagerPublicKeyOrUnit()
531+ let hasPM = if (isDefined(pm))
496532 then true
497- else throw("No pending manager")
498- if ((hpm == hpm))
533+ else throwErr("No pending manager")
534+ if ((hasPM == hasPM))
499535 then {
500- let cpm = if ((i.callerPublicKey == value(p)))
536+ let checkPM = if ((i.callerPublicKey == value(pm)))
501537 then true
502- else throw("You are not pending manager")
503- if ((cpm == cpm))
504- then [StringEntry(mpk(), toBase58String(value(p))), DeleteEntry(pmpk())]
538+ else throwErr("You are not pending manager")
539+ if ((checkPM == checkPM))
540+ then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
505541 else throw("Strict value is not equal to itself.")
506542 }
507543 else throw("Strict value is not equal to itself.")
510546
511547
512548 @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")
549+func put (slippage,autoStake) = {
550+ let factCfg = getFactoryConfig()
551+ let stakingContract = valueOrErrorMessage(addressFromString(factCfg[idxFactStakCntr]), "Wrong staking contract")
552+ let slippageContract = valueOrErrorMessage(addressFromString(factCfg[idxFactSlippCntr]), "Wrogn slippage contract")
553+ let slippageCheck = if ((slippage >= 0))
554+ then true
555+ else throwErr("wrong slippage")
556+ if ((slippageCheck == slippageCheck))
557+ then {
558+ let paymentsCheck = if ((size(i.payments) == 2))
559+ then true
560+ else throwErr("2 payments expected")
561+ if ((paymentsCheck == paymentsCheck))
562+ then {
563+ 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, "")
564+ let emitLpAmount = estimatePut._2
565+ let lpAssetId = estimatePut._7
566+ let state = estimatePut._9
567+ let amountDiff = estimatePut._10
568+ let priceDiff = estimatePut._11
569+ let amountId = estimatePut._12
570+ let priceId = estimatePut._13
571+ let r = invoke(factoryContract, "emit", [emitLpAmount], nil)
572+ if ((r == r))
573+ then {
574+ let el = match r {
575+ case legacy: Address =>
576+ invoke(legacy, "emit", [emitLpAmount], nil)
577+ case _ =>
578+ unit
579+ }
580+ if ((el == el))
581+ then {
582+ let sa = if ((amountDiff > 0))
583+ then invoke(slippageContract, "put", nil, [AttachedPayment(amountId, amountDiff)])
584+ else nil
585+ if ((sa == sa))
586+ then {
587+ let sp = if ((priceDiff > 0))
588+ then invoke(slippageContract, "put", nil, [AttachedPayment(priceId, priceDiff)])
589+ else nil
590+ if ((sp == sp))
591+ then {
592+ let lpTrasfer = if (autoStake)
593+ then {
594+ let ss = invoke(stakingContract, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmount)])
595+ if ((ss == ss))
596+ then nil
597+ else throw("Strict value is not equal to itself.")
598+ }
599+ else [ScriptTransfer(i.caller, emitLpAmount, lpAssetId)]
600+ (state ++ lpTrasfer)
601+ }
602+ else throw("Strict value is not equal to itself.")
603+ }
604+ else throw("Strict value is not equal to itself.")
605+ }
606+ else throw("Strict value is not equal to itself.")
607+ }
608+ else throw("Strict value is not equal to itself.")
609+ }
610+ else throw("Strict value is not equal to itself.")
611+ }
612+ else throw("Strict value is not equal to itself.")
613+ }
614+
615+
616+
617+@Callable(i)
618+func putOneTkn (amountAssetPart,priceAssetPart,outLp,slippage,autoStake) = {
619+ let cfg = getFactoryConfig()
620+ let stakingContract = valueOrErrorMessage(addressFromString(cfg[idxFactStakCntr]), "Wrong staking contract")
621+ let slippageContract = valueOrErrorMessage(addressFromString(cfg[idxFactSlippCntr]), "Wrong slippage contract")
622+ let gwxRewardContract = valueOrErrorMessage(addressFromString(cfg[idxFactGwxRewCntr]), "Wrong gwx reward contract")
623+ let poolCfg = getPoolConfig()
624+ let amountId = poolCfg[idxAmAsId]
625+ let priceId = poolCfg[idxPrAsId]
626+ let amountDecimals = parseIntValue(poolCfg[idxAmtAsDcm])
627+ let priceDecimals = parseIntValue(poolCfg[idxPriceAsDcm])
628+ let addon = valueOrElse(getString(this, keyAddonAddress()), "")
629+ let userAddress = if ((addon == toString(i.caller)))
630+ then i.originCaller
631+ else i.caller
632+ if (if (if (if ((0 >= slippage))
633+ then true
634+ else (0 >= amountAssetPart))
635+ then true
636+ else (0 >= priceAssetPart))
637+ then true
638+ else (0 >= outLp))
639+ then throwErr("Wrong params")
640+ else if ((size(i.payments) != 1))
641+ then throwErr("1 payment expected")
521642 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))
643+ let payment = value(i.payments[0])
644+ let paymentAssetId = toBase58String(value(payment.assetId))
645+ let paymentAmountRaw = payment.amount
646+ let $t02561725676 = takeFee(paymentAmountRaw)
647+ let paymentAmount = $t02561725676._1
648+ let feeAmount = $t02561725676._2
649+ if (if (if ((amountAssetPart > paymentAmount))
650+ then true
651+ else (priceAssetPart > paymentAmount))
652+ then true
653+ else (10000000 > paymentAmount))
654+ then throwErr("wrong payment amount")
655+ else {
656+ let amountBalance = getAccBalance(amountId)
657+ let priceBalance = getAccBalance(priceId)
658+ let $t02594026395 = if ((paymentAssetId == amountId))
659+ then $Tuple6((amountBalance - paymentAmount), priceBalance, (paymentAmount - amountAssetPart), priceAssetPart, 0, 0)
660+ else if ((paymentAssetId == priceId))
661+ then $Tuple6(amountBalance, (priceBalance - paymentAmount), 0, 0, (paymentAmount - priceAssetPart), amountAssetPart)
662+ else throwErr("wrong paymentAssetId")
663+ let amountBalanceNow = $t02594026395._1
664+ let priceBalanceNow = $t02594026395._2
665+ let virtSwapInAm = $t02594026395._3
666+ let virtSwapOutPr = $t02594026395._4
667+ let virtSwapInPr = $t02594026395._5
668+ let virtSwapOutAm = $t02594026395._6
669+ let D0 = invoke(gwxRewardContract, "calcD", [toString(amountBalanceNow), toString(priceBalanceNow), amplificator, Amult, Dconv], nil)
670+ let D1 = invoke(gwxRewardContract, "calcD", [toString(toBigInt(((amountBalanceNow + virtSwapInAm) - virtSwapOutAm))), toString(toBigInt(((priceBalanceNow + virtSwapInPr) - virtSwapOutPr))), amplificator, Amult, Dconv], nil)
671+ let D0vsD1 = validateD(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
672+ if ((D0vsD1 == D0vsD1))
540673 then {
541- let sa = if ((amDiff > 0))
542- then invoke(slipCntr, "put", nil, [AttachedPayment(amId, amDiff)])
543- else nil
544- if ((sa == sa))
674+ let estimatePut = commonPut(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(fromBase58String(amountId), amountAssetPart), AttachedPayment(fromBase58String(priceId), priceAssetPart), slippage, true, true, paymentAmount, paymentAssetId)
675+ let estimateLP = estimatePut._2
676+ let lpAssetId = estimatePut._7
677+ let state = estimatePut._9
678+ let amountDiff = estimatePut._10
679+ let priceDiff = estimatePut._11
680+ let lpCalcRes = validateAbsDiff(toBigInt(estimateLP), toBigInt(outLp), toBigInt(slippage))
681+ let emitLpAmount = toInt(lpCalcRes._2)
682+ let e = invoke(factoryContract, "emit", [emitLpAmount], nil)
683+ if ((e == e))
545684 then {
546- let sp = if ((prDiff > 0))
547- then invoke(slipCntr, "put", nil, [AttachedPayment(prId, prDiff)])
548- else nil
549- if ((sp == sp))
685+ let el = match e {
686+ case legacy: Address =>
687+ invoke(legacy, "emit", [emitLpAmount], nil)
688+ case _ =>
689+ unit
690+ }
691+ if ((el == el))
550692 then {
551- let lpTrnsfr = if (autoStake)
693+ let sa = if ((amountDiff > 0))
694+ then invoke(slippageContract, "put", nil, [AttachedPayment(fromBase58String(amountId), amountDiff)])
695+ else nil
696+ if ((sa == sa))
552697 then {
553- let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
554- if ((ss == ss))
555- then nil
698+ let sp = if ((priceDiff > 0))
699+ then invoke(slippageContract, "put", nil, [AttachedPayment(fromBase58String(priceId), priceDiff)])
700+ else nil
701+ if ((sp == sp))
702+ then {
703+ let lpTrasfer = if (autoStake)
704+ then {
705+ let ss = invoke(stakingContract, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmount)])
706+ if ((ss == ss))
707+ then nil
708+ else throw("Strict value is not equal to itself.")
709+ }
710+ else [ScriptTransfer(i.caller, emitLpAmount, lpAssetId)]
711+ let sendFeeToMatcher = if ((feeAmount > 0))
712+ then [ScriptTransfer(matcherAddress, feeAmount, fromBase58String(paymentAssetId))]
713+ else nil
714+ ((state ++ lpTrasfer) ++ sendFeeToMatcher)
715+ }
556716 else throw("Strict value is not equal to itself.")
557717 }
558- else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
559- (state ++ lpTrnsfr)
718+ else throw("Strict value is not equal to itself.")
560719 }
561720 else throw("Strict value is not equal to itself.")
562721 }
564723 }
565724 else throw("Strict value is not equal to itself.")
566725 }
567- else throw("Strict value is not equal to itself.")
568726 }
569727 }
570728
571729
572730
573731 @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")
732+func putForFree (maxslippage) = if ((0 > maxslippage))
733+ then throwErr("wrong slippage")
688734 else if ((size(i.payments) != 2))
689- then throw("2 pmnts expd")
735+ then throwErr("2 payments expected")
690736 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
737+ 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, "")
738+ estimatePut._9
693739 }
694740
695741
696742
697743 @Callable(i)
698744 func get () = {
699- let r = cg(i)
745+ let r = commonGet(i)
700746 let outAmtAmt = r._1
701- let outPrAmt = r._2
702- let pmtAmt = r._3
703- let pmtAssetId = r._4
747+ let outPriceAmount = r._2
748+ let paymentAmount = r._3
749+ let paymentAssetId = r._4
704750 let state = r._5
705- let b = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
751+ let b = invoke(factoryContract, "burn", [paymentAmount], [AttachedPayment(paymentAssetId, paymentAmount)])
706752 if ((b == b))
707753 then state
708754 else throw("Strict value is not equal to itself.")
712758
713759 @Callable(i)
714760 func getOneTkn (exchResult,notUsed,outAmount,outAssetId,slippage) = if ((size(i.payments) != 1))
715- then throw("1 pmnt expd")
761+ then throwErr("1 payment expected")
716762 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])
763+ let cfg = getPoolConfig()
764+ let lpAssetId = cfg[idxLPAsId]
765+ let amountId = cfg[idxAmAsId]
766+ let priceId = cfg[idxPrAsId]
767+ let amountDecimals = parseIntValue(cfg[idxAmtAsDcm])
768+ let priceDecimals = parseIntValue(cfg[idxPriceAsDcm])
723769 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()), "")
770+ let factCfg = getFactoryConfig()
771+ let gwxRewardContract = valueOrErrorMessage(addressFromString(factCfg[idxFactGwxRewCntr]), "Wrong gwxRewardContract address")
772+ let payment = value(i.payments[0])
773+ let addon = valueOrElse(getString(this, keyAddonAddress()), "")
728774 let userAddress = if ((addon == toString(i.caller)))
729775 then i.originCaller
730776 else i.caller
731777 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.")
778+ let paymentAssetId = value(payment.assetId)
779+ let paymentAmount = payment.amount
780+ if ((1000000000 > paymentAmount))
781+ then throwErr("Min payment 10 LP")
782+ else if (if (if ((0 > slippage))
783+ then true
784+ else (0 > exchResult))
785+ then true
786+ else (0 > outAmount))
787+ then throwErr("Wrong params")
788+ else if ((lpAssetId != toBase58String(paymentAssetId)))
789+ then throwErr("Wrong LP")
790+ else {
791+ let r = estimateGetOperation(toBase58String(i.transactionId), toBase58String(paymentAssetId), paymentAmount, i.caller)
792+ let estimAmAmt = r._1
793+ let estimPrAmt = r._2
794+ let amountBalance = getAccBalance(amountId)
795+ let priceBalance = getAccBalance(priceId)
796+ let $t03153432002 = if ((outAssetId == amountId))
797+ then $Tuple7((amountBalance - estimAmAmt), (priceBalance - estimPrAmt), exchResult, estimPrAmt, 0, 0, (estimAmAmt + exchResult))
798+ else if ((outAssetId == priceId))
799+ then $Tuple7((amountBalance - estimAmAmt), (priceBalance - estimPrAmt), 0, 0, exchResult, estimAmAmt, (estimPrAmt + exchResult))
800+ else throwErr("wrong outAssetId")
801+ let amountBalanceNow = $t03153432002._1
802+ let priceBalanceNow = $t03153432002._2
803+ let virtSwapInAm = $t03153432002._3
804+ let virtSwapOutPr = $t03153432002._4
805+ let virtSwapInPr = $t03153432002._5
806+ let virtSwapOutAm = $t03153432002._6
807+ let totalGet = $t03153432002._7
808+ if (if ((0 > virtSwapInAm))
809+ then true
810+ else (0 > virtSwapInPr))
811+ then throwErr("Wrong calc")
812+ else {
813+ let D0 = invoke(gwxRewardContract, "calcD", [toString(amountBalanceNow), toString(priceBalanceNow), amplificator, Amult, Dconv], nil)
814+ let D1 = invoke(gwxRewardContract, "calcD", [toString(((amountBalanceNow - virtSwapInAm) + virtSwapOutAm)), toString(((priceBalanceNow + virtSwapOutPr) - virtSwapInPr)), amplificator, Amult, Dconv], nil)
815+ let D0vsD1 = validateD(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
816+ if ((D0vsD1 == D0vsD1))
817+ then {
818+ let finalRes = validateAbsDiff(toBigInt(totalGet), toBigInt(outAmount), toBigInt(slippage))
819+ if ((finalRes == finalRes))
820+ then {
821+ let $t03267132779 = if ((outAssetId == amountId))
822+ then $Tuple2(toInt(finalRes._2), 0)
823+ else $Tuple2(0, toInt(finalRes._2))
824+ let outAm = $t03267132779._1
825+ let outPr = $t03267132779._2
826+ let totalAmountRaw = (outAm + outPr)
827+ let $t03281932874 = takeFee(totalAmountRaw)
828+ let totalAmount = $t03281932874._1
829+ let feeAmount = $t03281932874._2
830+ let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
831+ then unit
832+ else fromBase58String(outAssetId)
833+ let sendFeeToMatcher = if ((feeAmount > 0))
834+ then [ScriptTransfer(matcherAddress, feeAmount, outAssetIdOrWaves)]
835+ else nil
836+ let decimals = if ((amountDecimals >= priceDecimals))
837+ then amountDecimals
838+ else priceDecimals
839+ if ((decimals == decimals))
840+ then {
841+ let curPrX18 = calcPriceBigInt(toX18(priceBalance, decimals), toX18(amountBalance, decimals))
842+ let curPr = fromX18(curPrX18, scale8)
843+ 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)]
844+ if ((state == state))
845+ then {
846+ let burn = invoke(factoryContract, "burn", [paymentAmount], [AttachedPayment(paymentAssetId, paymentAmount)])
847+ if ((burn == burn))
848+ then (state ++ sendFeeToMatcher)
849+ else throw("Strict value is not equal to itself.")
850+ }
851+ else throw("Strict value is not equal to itself.")
852+ }
853+ else throw("Strict value is not equal to itself.")
854+ }
855+ else throw("Strict value is not equal to itself.")
856+ }
857+ else throw("Strict value is not equal to itself.")
858+ }
859+ }
803860 }
804861
805862
806863
807864 @Callable(i)
808865 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
866+ let r = commonGet(i)
867+ let outAmountAmount = r._1
868+ let outPriceAmount = r._2
869+ let paymentAmount = r._3
870+ let paymentAssetId = r._4
814871 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- }
872+ let checkOutAmountAmount = if ((outAmountAmount >= noLessThenAmtAsset))
873+ then true
874+ else throwErr(((("Failed: " + toString(outAmountAmount)) + " < ") + toString(noLessThenAmtAsset)))
875+ if ((checkOutAmountAmount == checkOutAmountAmount))
876+ then {
877+ let checkOutPriceAmount = if ((outPriceAmount >= noLessThenPriceAsset))
878+ then true
879+ else throwErr(((("Failed: " + toString(outPriceAmount)) + " < ") + toString(noLessThenPriceAsset)))
880+ if ((checkOutPriceAmount == checkOutPriceAmount))
881+ then {
882+ let burnLPAssetOnFactory = invoke(factoryContract, "burn", [paymentAmount], [AttachedPayment(paymentAssetId, paymentAmount)])
883+ if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
884+ then state
885+ else throw("Strict value is not equal to itself.")
886+ }
887+ else throw("Strict value is not equal to itself.")
888+ }
889+ else throw("Strict value is not equal to itself.")
825890 }
826891
827892
829894 @Callable(i)
830895 func unstakeAndGet (amount) = {
831896 let checkPayments = if ((size(i.payments) != 0))
832- then throw("No pmnts expd")
897+ then throwErr("no payments expected")
833898 else true
834899 if ((checkPayments == checkPayments))
835900 then {
836- let cfg = gpc()
837- let factoryCfg = gfc()
901+ let cfg = getPoolConfig()
902+ let factoryCfg = getFactoryConfig()
838903 let lpAssetId = fromBase58String(cfg[idxLPAsId])
839- let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
904+ let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "wrong")
840905 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), amount], nil)
841906 if ((unstakeInv == unstakeInv))
842907 then {
843- let r = ego(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
908+ let r = estimateGetOperation(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
844909 let sts = parseIntValue(r._9)
845910 let state = r._10
846- let v = if (if (igs())
911+ let v = if (if (isGlobalShutdown())
847912 then true
848913 else (sts == PoolShutdown))
849- then throw(("Blocked: " + toString(sts)))
914+ then throwErr(("Blocked: " + toString(sts)))
850915 else true
851916 if ((v == v))
852917 then {
853- let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
918+ let burnA = invoke(factoryContract, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
854919 if ((burnA == burnA))
855920 then state
856921 else throw("Strict value is not equal to itself.")
865930
866931
867932 @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")
933+func activate (amtAsStr,prAsStr) = if ((toString(i.caller) != toString(factoryContract)))
934+ then throwErr("denied")
935+ else $Tuple2([StringEntry(keyAmountAsset(), amtAsStr), StringEntry(keyPriceAsset(), prAsStr)], "success")
871936
872937
873938
874939 @Callable(i)
875-func setS (k,v) = if ((toString(i.caller) != strf(this, ada())))
940+func setS (k,v) = if ((toString(i.caller) != getStringOrFail(this, keyAddonAddress())))
876941 then pd
877942 else [StringEntry(k, v)]
878943
879944
880945
881946 @Callable(i)
882-func setI (k,v) = if ((toString(i.caller) != strf(this, ada())))
947+func setI (k,v) = if ((toString(i.caller) != getStringOrFail(this, keyAddonAddress())))
883948 then pd
884949 else [IntegerEntry(k, v)]
885950
886951
887952
888953 @Callable(i)
889-func getPoolConfigWrapperREADONLY () = $Tuple2(nil, gpc())
954+func getPoolConfigWrapperREADONLY () = $Tuple2(nil, getPoolConfig())
890955
891956
892957
904969
905970
906971 @Callable(i)
907-func fromX18WrapperREADONLY (val,resScaleMult) = $Tuple2(nil, f1(parseBigIntValue(val), resScaleMult))
972+func fromX18WrapperREADONLY (val,resScaleMult) = $Tuple2(nil, fromX18(parseBigIntValue(val), resScaleMult))
908973
909974
910975
911976 @Callable(i)
912-func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(t1(origVal, origScaleMult)))
977+func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(toX18(origVal, origScaleMult)))
913978
914979
915980
916981 @Callable(i)
917-func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(cpbi(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
982+func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(calcPriceBigInt(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
918983
919984
920985
921986 @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, ""))
987+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, ""))
923988
924989
925990
926991 @Callable(i)
927-func estimateGetOperationWrapperREADONLY (txId58,pmtAsId,pmtLpAmt,usrAddr) = {
928- let r = ego(txId58, pmtAsId, pmtLpAmt, addressFromStringValue(usrAddr))
992+func estimateGetOperationWrapperREADONLY (txId58,paymentAsId,paymentLpAmount,usrAddr) = {
993+ let r = estimateGetOperation(txId58, paymentAsId, paymentLpAmount, addressFromStringValue(usrAddr))
929994 $Tuple2(nil, $Tuple10(r._1, r._2, r._3, r._4, r._5, r._6, r._7, toString(r._8), r._9, r._10))
930995 }
931996
933998 @Verifier(tx)
934999 func verify () = match tx {
9351000 case order: Order =>
936- let mtchPub = mp()
937- let orV = moa(order)
1001+ let mtchPub = getMatcherPubOrFail()
1002+ let orV = validateMatcherOrderAllowed(order)
9381003 let sndrV = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
9391004 let mtchV = sigVerify(order.bodyBytes, order.proofs[1], mtchPub)
9401005 if (if (if (orV)
9431008 then mtchV
9441009 else false)
9451010 then true
946- else toe(orV, sndrV, mtchV)
1011+ else throwOrderError(orV, sndrV, mtchV)
9471012 case _ =>
948- let targetPublicKey = match m() {
1013+ let targetPublicKey = match managerPublicKeyOrUnit() {
9491014 case pk: ByteVector =>
9501015 pk
9511016 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+ if (if ((currentPriceX18 != zeroBigInt))
328+ then (slippageRealX18 > slippageX18)
329+ else false)
330+ then throwErr(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
331+ else {
332+ let lpEmissionX18 = toX18(lpEmission, scale8)
333+ let prViaAmX18 = fraction(inAmountAssetAmountX18, currentPriceX18, scale18)
334+ let amViaPrX18 = fraction(inPriceAssetAmountX18, scale18, currentPriceX18)
335+ let expectedAmounts = if ((prViaAmX18 > inPriceAssetAmountX18))
336+ then $Tuple2(amViaPrX18, inAmountAssetAmountX18)
337+ else $Tuple2(inAmountAssetAmountX18, prViaAmX18)
338+ let expectedAmountAssetAmountX18 = expectedAmounts._1
339+ let expectedPriceAssetAmountX18 = expectedAmounts._2
340+ let lpAmountX18 = fraction(lpEmissionX18, expectedPriceAssetAmountX18, priceBalanceX18)
341+ $Tuple5(fromX18(lpAmountX18, scale8), fromX18(expectedAmountAssetAmountX18, decimals), fromX18(expectedPriceAssetAmountX18, decimals), currentPriceX18, slippageX18)
342+ }
343+ }
344+ let calculateLpAmount = r._1
345+ let calculateAmountAssetPayment = r._2
346+ let calculatePriceAssetPayment = r._3
347+ let currentPrice = fromX18(r._4, scale8)
348+ let slippageCalculate = fromX18(r._5, scale8)
349+ let checkCalcLpAmount = if ((calculateLpAmount > 0))
350+ then true
351+ else throwErr("LP <= 0")
352+ if ((checkCalcLpAmount == checkCalcLpAmount))
353+ then {
354+ let emitLpAmount = if (!(emitLp))
355+ then 0
356+ else calculateLpAmount
357+ let amountDiff = (inAmountAssetAmount - calculateAmountAssetPayment)
358+ let priceDiff = (inPriceAssetAmount - calculatePriceAssetPayment)
359+ let $t01618916448 = if (if (isOneAsset)
360+ then (paymentId == amountIdStr)
361+ else false)
362+ then $Tuple2(paymentAmount, 0)
363+ else if (if (isOneAsset)
364+ then (paymentId == priceIdStr)
365+ else false)
366+ then $Tuple2(0, paymentAmount)
367+ else $Tuple2(calculateAmountAssetPayment, calculatePriceAssetPayment)
368+ let writeAmAmt = $t01618916448._1
369+ let writePrAmt = $t01618916448._2
370+ 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))]
371+ $Tuple13(calculateLpAmount, emitLpAmount, currentPrice, amountBalance, priceBalance, lpEmission, lpAssetId, sts, commonState, amountDiff, priceDiff, inAmountAssetId, inPriceAssetId)
372+ }
373+ else throw("Strict value is not equal to itself.")
302374 }
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- }
375+ else throw("Strict value is not equal to itself.")
351376 }
352377
353378
354-func moa (order) = {
355- let cfg = gpc()
379+func validateMatcherOrderAllowed (order) = {
380+ let cfg = getPoolConfig()
356381 let amtAsId = cfg[idxAmAsId]
357382 let prAsId = cfg[idxPrAsId]
358383 let sts = parseIntValue(cfg[idxPoolSt])
359384 let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
360385 let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
361386 let accAmtAsBalance = getAccBalance(amtAsId)
362387 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())
388+ let currentPriceX18 = if ((order.orderType == Buy))
389+ then privateCalcPrice(amtAsDcm, prAsDcm, (accAmtAsBalance + order.amount), accPrAsBalance)
390+ else privateCalcPrice(amtAsDcm, prAsDcm, (accAmtAsBalance - order.amount), accPrAsBalance)
391+ let curPrice = fromX18(currentPriceX18, scale8)
392+ if (if (if (isGlobalShutdown())
368393 then true
369394 else (sts == PoolMatcherDis))
370395 then true
371396 else (sts == PoolShutdown))
372- then throw("Admin blocked")
397+ then throwErr("Admin blocked")
373398 else {
374399 let orAmtAsset = order.assetPair.amountAsset
375400 let orAmtAsStr = if ((orAmtAsset == unit))
376401 then "WAVES"
377402 else toBase58String(value(orAmtAsset))
378403 let orPrAsset = order.assetPair.priceAsset
379404 let orPrAsStr = if ((orPrAsset == unit))
380405 then "WAVES"
381406 else toBase58String(value(orPrAsset))
382407 if (if ((orAmtAsStr != amtAsId))
383408 then true
384409 else (orPrAsStr != prAsId))
385- then throw("Wr assets")
410+ then throwErr("Wr assets")
386411 else {
387412 let orderPrice = order.price
388- let priceDcm = fraction(scale8, prAsDcm, amtAsDcm)
389- let castOrderPrice = ts(orderPrice, scale8, priceDcm)
413+ let priceDecimals = fraction(scale8, prAsDcm, amtAsDcm)
414+ let castOrderPrice = ts(orderPrice, scale8, priceDecimals)
390415 let isOrderPriceValid = if ((order.orderType == Buy))
391416 then (curPrice >= castOrderPrice)
392417 else (castOrderPrice >= curPrice)
393418 true
394419 }
395420 }
396421 }
397422
398423
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- }
424+func commonGet (i) = {
425+ let checkPayments = if ((size(i.payments) == 1))
426+ then true
427+ else throwErr("1 payment expected")
428+ if ((checkPayments == checkPayments))
429+ then {
430+ let payment = value(i.payments[0])
431+ let paymentAssetId = value(payment.assetId)
432+ let paymentAmount = payment.amount
433+ let r = estimateGetOperation(toBase58String(i.transactionId), toBase58String(paymentAssetId), paymentAmount, i.caller)
434+ let outAmountAmount = r._1
435+ let outPriceAmount = r._2
436+ let sts = parseIntValue(r._9)
437+ let state = r._10
438+ if (if (isGlobalShutdown())
439+ then true
440+ else (sts == PoolShutdown))
441+ then throwErr(("Admin blocked: " + toString(sts)))
442+ else $Tuple5(outAmountAmount, outPriceAmount, paymentAmount, paymentAssetId, state)
443+ }
444+ else throw("Strict value is not equal to itself.")
445+ }
416446
417447
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)
448+func commonPut (caller,txId,amountAssetPayment,priceAssetPayment,slippage,emitLp,isOneAsset,paymentAmount,paymentId) = {
449+ let r = estimatePutOperation(txId, slippage, value(amountAssetPayment).amount, value(amountAssetPayment).assetId, value(priceAssetPayment).amount, value(priceAssetPayment).assetId, caller, false, emitLp, isOneAsset, paymentAmount, paymentId)
420450 let sts = parseIntValue(r._8)
421- if (if (if (igs())
451+ if (if (if (isGlobalShutdown())
422452 then true
423453 else (sts == PoolPutDis))
424454 then true
425455 else (sts == PoolShutdown))
426- then throw(("Blocked:" + toString(sts)))
456+ then throwErr(("Blocked:" + toString(sts)))
427457 else r
428458 }
429459
430460
431-func m () = match getString(mpk()) {
461+func takeFee (amount) = {
462+ let fee = fraction(amount, feePermille, thousand)
463+ $Tuple2((amount - fee), fee)
464+ }
465+
466+
467+func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
432468 case s: String =>
433469 fromBase58String(s)
434470 case _: Unit =>
435471 unit
436472 case _ =>
437473 throw("Match error")
438474 }
439475
440476
441-func pm () = match getString(pmpk()) {
477+func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
442478 case s: String =>
443479 fromBase58String(s)
444480 case _: Unit =>
445481 unit
446482 case _ =>
447483 throw("Match error")
448484 }
449485
450486
451-let pd = throw("Permission denied")
487+let pd = throwErr("Permission denied")
452488
453-func mm (i) = match m() {
489+func mustManager (i) = match managerPublicKeyOrUnit() {
454490 case pk: ByteVector =>
455491 if ((i.callerPublicKey == pk))
456492 then true
457493 else pd
458494 case _: Unit =>
459495 if ((i.caller == this))
460496 then true
461497 else pd
462498 case _ =>
463499 throw("Match error")
464500 }
465501
466502
467503 @Callable(i)
468-func constructor (fc) = {
469- let c = mm(i)
470- if ((c == c))
471- then [StringEntry(fc(), fc)]
504+func constructor (factoryContract) = {
505+ let checkCaller = mustManager(i)
506+ if ((checkCaller == checkCaller))
507+ then [StringEntry(keyFactoryContact(), factoryContract)]
472508 else throw("Strict value is not equal to itself.")
473509 }
474510
475511
476512
477513 @Callable(i)
478514 func setManager (pendingManagerPublicKey) = {
479- let c = mm(i)
480- if ((c == c))
515+ let checkCaller = mustManager(i)
516+ if ((checkCaller == checkCaller))
481517 then {
482- let cm = fromBase58String(pendingManagerPublicKey)
483- if ((cm == cm))
484- then [StringEntry(pmpk(), pendingManagerPublicKey)]
518+ let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
519+ if ((checkManagerPublicKey == checkManagerPublicKey))
520+ then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
485521 else throw("Strict value is not equal to itself.")
486522 }
487523 else throw("Strict value is not equal to itself.")
488524 }
489525
490526
491527
492528 @Callable(i)
493529 func confirmManager () = {
494- let p = pm()
495- let hpm = if (isDefined(p))
530+ let pm = pendingManagerPublicKeyOrUnit()
531+ let hasPM = if (isDefined(pm))
496532 then true
497- else throw("No pending manager")
498- if ((hpm == hpm))
533+ else throwErr("No pending manager")
534+ if ((hasPM == hasPM))
499535 then {
500- let cpm = if ((i.callerPublicKey == value(p)))
536+ let checkPM = if ((i.callerPublicKey == value(pm)))
501537 then true
502- else throw("You are not pending manager")
503- if ((cpm == cpm))
504- then [StringEntry(mpk(), toBase58String(value(p))), DeleteEntry(pmpk())]
538+ else throwErr("You are not pending manager")
539+ if ((checkPM == checkPM))
540+ then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
505541 else throw("Strict value is not equal to itself.")
506542 }
507543 else throw("Strict value is not equal to itself.")
508544 }
509545
510546
511547
512548 @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")
549+func put (slippage,autoStake) = {
550+ let factCfg = getFactoryConfig()
551+ let stakingContract = valueOrErrorMessage(addressFromString(factCfg[idxFactStakCntr]), "Wrong staking contract")
552+ let slippageContract = valueOrErrorMessage(addressFromString(factCfg[idxFactSlippCntr]), "Wrogn slippage contract")
553+ let slippageCheck = if ((slippage >= 0))
554+ then true
555+ else throwErr("wrong slippage")
556+ if ((slippageCheck == slippageCheck))
557+ then {
558+ let paymentsCheck = if ((size(i.payments) == 2))
559+ then true
560+ else throwErr("2 payments expected")
561+ if ((paymentsCheck == paymentsCheck))
562+ then {
563+ 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, "")
564+ let emitLpAmount = estimatePut._2
565+ let lpAssetId = estimatePut._7
566+ let state = estimatePut._9
567+ let amountDiff = estimatePut._10
568+ let priceDiff = estimatePut._11
569+ let amountId = estimatePut._12
570+ let priceId = estimatePut._13
571+ let r = invoke(factoryContract, "emit", [emitLpAmount], nil)
572+ if ((r == r))
573+ then {
574+ let el = match r {
575+ case legacy: Address =>
576+ invoke(legacy, "emit", [emitLpAmount], nil)
577+ case _ =>
578+ unit
579+ }
580+ if ((el == el))
581+ then {
582+ let sa = if ((amountDiff > 0))
583+ then invoke(slippageContract, "put", nil, [AttachedPayment(amountId, amountDiff)])
584+ else nil
585+ if ((sa == sa))
586+ then {
587+ let sp = if ((priceDiff > 0))
588+ then invoke(slippageContract, "put", nil, [AttachedPayment(priceId, priceDiff)])
589+ else nil
590+ if ((sp == sp))
591+ then {
592+ let lpTrasfer = if (autoStake)
593+ then {
594+ let ss = invoke(stakingContract, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmount)])
595+ if ((ss == ss))
596+ then nil
597+ else throw("Strict value is not equal to itself.")
598+ }
599+ else [ScriptTransfer(i.caller, emitLpAmount, lpAssetId)]
600+ (state ++ lpTrasfer)
601+ }
602+ else throw("Strict value is not equal to itself.")
603+ }
604+ else throw("Strict value is not equal to itself.")
605+ }
606+ else throw("Strict value is not equal to itself.")
607+ }
608+ else throw("Strict value is not equal to itself.")
609+ }
610+ else throw("Strict value is not equal to itself.")
611+ }
612+ else throw("Strict value is not equal to itself.")
613+ }
614+
615+
616+
617+@Callable(i)
618+func putOneTkn (amountAssetPart,priceAssetPart,outLp,slippage,autoStake) = {
619+ let cfg = getFactoryConfig()
620+ let stakingContract = valueOrErrorMessage(addressFromString(cfg[idxFactStakCntr]), "Wrong staking contract")
621+ let slippageContract = valueOrErrorMessage(addressFromString(cfg[idxFactSlippCntr]), "Wrong slippage contract")
622+ let gwxRewardContract = valueOrErrorMessage(addressFromString(cfg[idxFactGwxRewCntr]), "Wrong gwx reward contract")
623+ let poolCfg = getPoolConfig()
624+ let amountId = poolCfg[idxAmAsId]
625+ let priceId = poolCfg[idxPrAsId]
626+ let amountDecimals = parseIntValue(poolCfg[idxAmtAsDcm])
627+ let priceDecimals = parseIntValue(poolCfg[idxPriceAsDcm])
628+ let addon = valueOrElse(getString(this, keyAddonAddress()), "")
629+ let userAddress = if ((addon == toString(i.caller)))
630+ then i.originCaller
631+ else i.caller
632+ if (if (if (if ((0 >= slippage))
633+ then true
634+ else (0 >= amountAssetPart))
635+ then true
636+ else (0 >= priceAssetPart))
637+ then true
638+ else (0 >= outLp))
639+ then throwErr("Wrong params")
640+ else if ((size(i.payments) != 1))
641+ then throwErr("1 payment expected")
521642 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))
643+ let payment = value(i.payments[0])
644+ let paymentAssetId = toBase58String(value(payment.assetId))
645+ let paymentAmountRaw = payment.amount
646+ let $t02561725676 = takeFee(paymentAmountRaw)
647+ let paymentAmount = $t02561725676._1
648+ let feeAmount = $t02561725676._2
649+ if (if (if ((amountAssetPart > paymentAmount))
650+ then true
651+ else (priceAssetPart > paymentAmount))
652+ then true
653+ else (10000000 > paymentAmount))
654+ then throwErr("wrong payment amount")
655+ else {
656+ let amountBalance = getAccBalance(amountId)
657+ let priceBalance = getAccBalance(priceId)
658+ let $t02594026395 = if ((paymentAssetId == amountId))
659+ then $Tuple6((amountBalance - paymentAmount), priceBalance, (paymentAmount - amountAssetPart), priceAssetPart, 0, 0)
660+ else if ((paymentAssetId == priceId))
661+ then $Tuple6(amountBalance, (priceBalance - paymentAmount), 0, 0, (paymentAmount - priceAssetPart), amountAssetPart)
662+ else throwErr("wrong paymentAssetId")
663+ let amountBalanceNow = $t02594026395._1
664+ let priceBalanceNow = $t02594026395._2
665+ let virtSwapInAm = $t02594026395._3
666+ let virtSwapOutPr = $t02594026395._4
667+ let virtSwapInPr = $t02594026395._5
668+ let virtSwapOutAm = $t02594026395._6
669+ let D0 = invoke(gwxRewardContract, "calcD", [toString(amountBalanceNow), toString(priceBalanceNow), amplificator, Amult, Dconv], nil)
670+ let D1 = invoke(gwxRewardContract, "calcD", [toString(toBigInt(((amountBalanceNow + virtSwapInAm) - virtSwapOutAm))), toString(toBigInt(((priceBalanceNow + virtSwapInPr) - virtSwapOutPr))), amplificator, Amult, Dconv], nil)
671+ let D0vsD1 = validateD(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
672+ if ((D0vsD1 == D0vsD1))
540673 then {
541- let sa = if ((amDiff > 0))
542- then invoke(slipCntr, "put", nil, [AttachedPayment(amId, amDiff)])
543- else nil
544- if ((sa == sa))
674+ let estimatePut = commonPut(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(fromBase58String(amountId), amountAssetPart), AttachedPayment(fromBase58String(priceId), priceAssetPart), slippage, true, true, paymentAmount, paymentAssetId)
675+ let estimateLP = estimatePut._2
676+ let lpAssetId = estimatePut._7
677+ let state = estimatePut._9
678+ let amountDiff = estimatePut._10
679+ let priceDiff = estimatePut._11
680+ let lpCalcRes = validateAbsDiff(toBigInt(estimateLP), toBigInt(outLp), toBigInt(slippage))
681+ let emitLpAmount = toInt(lpCalcRes._2)
682+ let e = invoke(factoryContract, "emit", [emitLpAmount], nil)
683+ if ((e == e))
545684 then {
546- let sp = if ((prDiff > 0))
547- then invoke(slipCntr, "put", nil, [AttachedPayment(prId, prDiff)])
548- else nil
549- if ((sp == sp))
685+ let el = match e {
686+ case legacy: Address =>
687+ invoke(legacy, "emit", [emitLpAmount], nil)
688+ case _ =>
689+ unit
690+ }
691+ if ((el == el))
550692 then {
551- let lpTrnsfr = if (autoStake)
693+ let sa = if ((amountDiff > 0))
694+ then invoke(slippageContract, "put", nil, [AttachedPayment(fromBase58String(amountId), amountDiff)])
695+ else nil
696+ if ((sa == sa))
552697 then {
553- let ss = invoke(stakingCntr, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmt)])
554- if ((ss == ss))
555- then nil
698+ let sp = if ((priceDiff > 0))
699+ then invoke(slippageContract, "put", nil, [AttachedPayment(fromBase58String(priceId), priceDiff)])
700+ else nil
701+ if ((sp == sp))
702+ then {
703+ let lpTrasfer = if (autoStake)
704+ then {
705+ let ss = invoke(stakingContract, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmount)])
706+ if ((ss == ss))
707+ then nil
708+ else throw("Strict value is not equal to itself.")
709+ }
710+ else [ScriptTransfer(i.caller, emitLpAmount, lpAssetId)]
711+ let sendFeeToMatcher = if ((feeAmount > 0))
712+ then [ScriptTransfer(matcherAddress, feeAmount, fromBase58String(paymentAssetId))]
713+ else nil
714+ ((state ++ lpTrasfer) ++ sendFeeToMatcher)
715+ }
556716 else throw("Strict value is not equal to itself.")
557717 }
558- else [ScriptTransfer(i.caller, emitLpAmt, lpAssetId)]
559- (state ++ lpTrnsfr)
718+ else throw("Strict value is not equal to itself.")
560719 }
561720 else throw("Strict value is not equal to itself.")
562721 }
563722 else throw("Strict value is not equal to itself.")
564723 }
565724 else throw("Strict value is not equal to itself.")
566725 }
567- else throw("Strict value is not equal to itself.")
568726 }
569727 }
570728
571729
572730
573731 @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")
732+func putForFree (maxslippage) = if ((0 > maxslippage))
733+ then throwErr("wrong slippage")
688734 else if ((size(i.payments) != 2))
689- then throw("2 pmnts expd")
735+ then throwErr("2 payments expected")
690736 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
737+ 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, "")
738+ estimatePut._9
693739 }
694740
695741
696742
697743 @Callable(i)
698744 func get () = {
699- let r = cg(i)
745+ let r = commonGet(i)
700746 let outAmtAmt = r._1
701- let outPrAmt = r._2
702- let pmtAmt = r._3
703- let pmtAssetId = r._4
747+ let outPriceAmount = r._2
748+ let paymentAmount = r._3
749+ let paymentAssetId = r._4
704750 let state = r._5
705- let b = invoke(fca, "burn", [pmtAmt], [AttachedPayment(pmtAssetId, pmtAmt)])
751+ let b = invoke(factoryContract, "burn", [paymentAmount], [AttachedPayment(paymentAssetId, paymentAmount)])
706752 if ((b == b))
707753 then state
708754 else throw("Strict value is not equal to itself.")
709755 }
710756
711757
712758
713759 @Callable(i)
714760 func getOneTkn (exchResult,notUsed,outAmount,outAssetId,slippage) = if ((size(i.payments) != 1))
715- then throw("1 pmnt expd")
761+ then throwErr("1 payment expected")
716762 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])
763+ let cfg = getPoolConfig()
764+ let lpAssetId = cfg[idxLPAsId]
765+ let amountId = cfg[idxAmAsId]
766+ let priceId = cfg[idxPrAsId]
767+ let amountDecimals = parseIntValue(cfg[idxAmtAsDcm])
768+ let priceDecimals = parseIntValue(cfg[idxPriceAsDcm])
723769 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()), "")
770+ let factCfg = getFactoryConfig()
771+ let gwxRewardContract = valueOrErrorMessage(addressFromString(factCfg[idxFactGwxRewCntr]), "Wrong gwxRewardContract address")
772+ let payment = value(i.payments[0])
773+ let addon = valueOrElse(getString(this, keyAddonAddress()), "")
728774 let userAddress = if ((addon == toString(i.caller)))
729775 then i.originCaller
730776 else i.caller
731777 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.")
778+ let paymentAssetId = value(payment.assetId)
779+ let paymentAmount = payment.amount
780+ if ((1000000000 > paymentAmount))
781+ then throwErr("Min payment 10 LP")
782+ else if (if (if ((0 > slippage))
783+ then true
784+ else (0 > exchResult))
785+ then true
786+ else (0 > outAmount))
787+ then throwErr("Wrong params")
788+ else if ((lpAssetId != toBase58String(paymentAssetId)))
789+ then throwErr("Wrong LP")
790+ else {
791+ let r = estimateGetOperation(toBase58String(i.transactionId), toBase58String(paymentAssetId), paymentAmount, i.caller)
792+ let estimAmAmt = r._1
793+ let estimPrAmt = r._2
794+ let amountBalance = getAccBalance(amountId)
795+ let priceBalance = getAccBalance(priceId)
796+ let $t03153432002 = if ((outAssetId == amountId))
797+ then $Tuple7((amountBalance - estimAmAmt), (priceBalance - estimPrAmt), exchResult, estimPrAmt, 0, 0, (estimAmAmt + exchResult))
798+ else if ((outAssetId == priceId))
799+ then $Tuple7((amountBalance - estimAmAmt), (priceBalance - estimPrAmt), 0, 0, exchResult, estimAmAmt, (estimPrAmt + exchResult))
800+ else throwErr("wrong outAssetId")
801+ let amountBalanceNow = $t03153432002._1
802+ let priceBalanceNow = $t03153432002._2
803+ let virtSwapInAm = $t03153432002._3
804+ let virtSwapOutPr = $t03153432002._4
805+ let virtSwapInPr = $t03153432002._5
806+ let virtSwapOutAm = $t03153432002._6
807+ let totalGet = $t03153432002._7
808+ if (if ((0 > virtSwapInAm))
809+ then true
810+ else (0 > virtSwapInPr))
811+ then throwErr("Wrong calc")
812+ else {
813+ let D0 = invoke(gwxRewardContract, "calcD", [toString(amountBalanceNow), toString(priceBalanceNow), amplificator, Amult, Dconv], nil)
814+ let D1 = invoke(gwxRewardContract, "calcD", [toString(((amountBalanceNow - virtSwapInAm) + virtSwapOutAm)), toString(((priceBalanceNow + virtSwapOutPr) - virtSwapInPr)), amplificator, Amult, Dconv], nil)
815+ let D0vsD1 = validateD(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
816+ if ((D0vsD1 == D0vsD1))
817+ then {
818+ let finalRes = validateAbsDiff(toBigInt(totalGet), toBigInt(outAmount), toBigInt(slippage))
819+ if ((finalRes == finalRes))
820+ then {
821+ let $t03267132779 = if ((outAssetId == amountId))
822+ then $Tuple2(toInt(finalRes._2), 0)
823+ else $Tuple2(0, toInt(finalRes._2))
824+ let outAm = $t03267132779._1
825+ let outPr = $t03267132779._2
826+ let totalAmountRaw = (outAm + outPr)
827+ let $t03281932874 = takeFee(totalAmountRaw)
828+ let totalAmount = $t03281932874._1
829+ let feeAmount = $t03281932874._2
830+ let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
831+ then unit
832+ else fromBase58String(outAssetId)
833+ let sendFeeToMatcher = if ((feeAmount > 0))
834+ then [ScriptTransfer(matcherAddress, feeAmount, outAssetIdOrWaves)]
835+ else nil
836+ let decimals = if ((amountDecimals >= priceDecimals))
837+ then amountDecimals
838+ else priceDecimals
839+ if ((decimals == decimals))
840+ then {
841+ let curPrX18 = calcPriceBigInt(toX18(priceBalance, decimals), toX18(amountBalance, decimals))
842+ let curPr = fromX18(curPrX18, scale8)
843+ 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)]
844+ if ((state == state))
845+ then {
846+ let burn = invoke(factoryContract, "burn", [paymentAmount], [AttachedPayment(paymentAssetId, paymentAmount)])
847+ if ((burn == burn))
848+ then (state ++ sendFeeToMatcher)
849+ else throw("Strict value is not equal to itself.")
850+ }
851+ else throw("Strict value is not equal to itself.")
852+ }
853+ else throw("Strict value is not equal to itself.")
854+ }
855+ else throw("Strict value is not equal to itself.")
856+ }
857+ else throw("Strict value is not equal to itself.")
858+ }
859+ }
803860 }
804861
805862
806863
807864 @Callable(i)
808865 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
866+ let r = commonGet(i)
867+ let outAmountAmount = r._1
868+ let outPriceAmount = r._2
869+ let paymentAmount = r._3
870+ let paymentAssetId = r._4
814871 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- }
872+ let checkOutAmountAmount = if ((outAmountAmount >= noLessThenAmtAsset))
873+ then true
874+ else throwErr(((("Failed: " + toString(outAmountAmount)) + " < ") + toString(noLessThenAmtAsset)))
875+ if ((checkOutAmountAmount == checkOutAmountAmount))
876+ then {
877+ let checkOutPriceAmount = if ((outPriceAmount >= noLessThenPriceAsset))
878+ then true
879+ else throwErr(((("Failed: " + toString(outPriceAmount)) + " < ") + toString(noLessThenPriceAsset)))
880+ if ((checkOutPriceAmount == checkOutPriceAmount))
881+ then {
882+ let burnLPAssetOnFactory = invoke(factoryContract, "burn", [paymentAmount], [AttachedPayment(paymentAssetId, paymentAmount)])
883+ if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
884+ then state
885+ else throw("Strict value is not equal to itself.")
886+ }
887+ else throw("Strict value is not equal to itself.")
888+ }
889+ else throw("Strict value is not equal to itself.")
825890 }
826891
827892
828893
829894 @Callable(i)
830895 func unstakeAndGet (amount) = {
831896 let checkPayments = if ((size(i.payments) != 0))
832- then throw("No pmnts expd")
897+ then throwErr("no payments expected")
833898 else true
834899 if ((checkPayments == checkPayments))
835900 then {
836- let cfg = gpc()
837- let factoryCfg = gfc()
901+ let cfg = getPoolConfig()
902+ let factoryCfg = getFactoryConfig()
838903 let lpAssetId = fromBase58String(cfg[idxLPAsId])
839- let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "Wr st addr")
904+ let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "wrong")
840905 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), amount], nil)
841906 if ((unstakeInv == unstakeInv))
842907 then {
843- let r = ego(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
908+ let r = estimateGetOperation(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
844909 let sts = parseIntValue(r._9)
845910 let state = r._10
846- let v = if (if (igs())
911+ let v = if (if (isGlobalShutdown())
847912 then true
848913 else (sts == PoolShutdown))
849- then throw(("Blocked: " + toString(sts)))
914+ then throwErr(("Blocked: " + toString(sts)))
850915 else true
851916 if ((v == v))
852917 then {
853- let burnA = invoke(fca, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
918+ let burnA = invoke(factoryContract, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
854919 if ((burnA == burnA))
855920 then state
856921 else throw("Strict value is not equal to itself.")
857922 }
858923 else throw("Strict value is not equal to itself.")
859924 }
860925 else throw("Strict value is not equal to itself.")
861926 }
862927 else throw("Strict value is not equal to itself.")
863928 }
864929
865930
866931
867932 @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")
933+func activate (amtAsStr,prAsStr) = if ((toString(i.caller) != toString(factoryContract)))
934+ then throwErr("denied")
935+ else $Tuple2([StringEntry(keyAmountAsset(), amtAsStr), StringEntry(keyPriceAsset(), prAsStr)], "success")
871936
872937
873938
874939 @Callable(i)
875-func setS (k,v) = if ((toString(i.caller) != strf(this, ada())))
940+func setS (k,v) = if ((toString(i.caller) != getStringOrFail(this, keyAddonAddress())))
876941 then pd
877942 else [StringEntry(k, v)]
878943
879944
880945
881946 @Callable(i)
882-func setI (k,v) = if ((toString(i.caller) != strf(this, ada())))
947+func setI (k,v) = if ((toString(i.caller) != getStringOrFail(this, keyAddonAddress())))
883948 then pd
884949 else [IntegerEntry(k, v)]
885950
886951
887952
888953 @Callable(i)
889-func getPoolConfigWrapperREADONLY () = $Tuple2(nil, gpc())
954+func getPoolConfigWrapperREADONLY () = $Tuple2(nil, getPoolConfig())
890955
891956
892957
893958 @Callable(i)
894959 func getAccBalanceWrapperREADONLY (assetId) = $Tuple2(nil, getAccBalance(assetId))
895960
896961
897962
898963 @Callable(i)
899964 func calcPricesWrapperREADONLY (amAmt,prAmt,lpAmt) = {
900965 let pr = calcPrices(amAmt, prAmt, lpAmt)
901966 $Tuple2(nil, [toString(pr[0]), toString(pr[1]), toString(pr[2])])
902967 }
903968
904969
905970
906971 @Callable(i)
907-func fromX18WrapperREADONLY (val,resScaleMult) = $Tuple2(nil, f1(parseBigIntValue(val), resScaleMult))
972+func fromX18WrapperREADONLY (val,resScaleMult) = $Tuple2(nil, fromX18(parseBigIntValue(val), resScaleMult))
908973
909974
910975
911976 @Callable(i)
912-func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(t1(origVal, origScaleMult)))
977+func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(toX18(origVal, origScaleMult)))
913978
914979
915980
916981 @Callable(i)
917-func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(cpbi(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
982+func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(calcPriceBigInt(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
918983
919984
920985
921986 @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, ""))
987+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, ""))
923988
924989
925990
926991 @Callable(i)
927-func estimateGetOperationWrapperREADONLY (txId58,pmtAsId,pmtLpAmt,usrAddr) = {
928- let r = ego(txId58, pmtAsId, pmtLpAmt, addressFromStringValue(usrAddr))
992+func estimateGetOperationWrapperREADONLY (txId58,paymentAsId,paymentLpAmount,usrAddr) = {
993+ let r = estimateGetOperation(txId58, paymentAsId, paymentLpAmount, addressFromStringValue(usrAddr))
929994 $Tuple2(nil, $Tuple10(r._1, r._2, r._3, r._4, r._5, r._6, r._7, toString(r._8), r._9, r._10))
930995 }
931996
932997
933998 @Verifier(tx)
934999 func verify () = match tx {
9351000 case order: Order =>
936- let mtchPub = mp()
937- let orV = moa(order)
1001+ let mtchPub = getMatcherPubOrFail()
1002+ let orV = validateMatcherOrderAllowed(order)
9381003 let sndrV = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
9391004 let mtchV = sigVerify(order.bodyBytes, order.proofs[1], mtchPub)
9401005 if (if (if (orV)
9411006 then sndrV
9421007 else false)
9431008 then mtchV
9441009 else false)
9451010 then true
946- else toe(orV, sndrV, mtchV)
1011+ else throwOrderError(orV, sndrV, mtchV)
9471012 case _ =>
948- let targetPublicKey = match m() {
1013+ let targetPublicKey = match managerPublicKeyOrUnit() {
9491014 case pk: ByteVector =>
9501015 pk
9511016 case _: Unit =>
9521017 tx.senderPublicKey
9531018 case _ =>
9541019 throw("Match error")
9551020 }
9561021 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
9571022 }
9581023

github/deemru/w8io/c3f4982 
166.52 ms