tx · 3rzGJHXHvRXd3QABpzPLJhouc1aYtNphusozUc7E4G8p

3MzKSdTH2jFbypLsoNfrH7QgkzSbx3EYwCA:  -0.02600000 Waves

2022.08.15 15:29 [2185585] smart account 3MzKSdTH2jFbypLsoNfrH7QgkzSbx3EYwCA > SELF 0.00000000 Waves

{ "type": 13, "id": "3rzGJHXHvRXd3QABpzPLJhouc1aYtNphusozUc7E4G8p", "fee": 2600000, "feeAssetId": null, "timestamp": 1660566468761, "version": 1, "sender": "3MzKSdTH2jFbypLsoNfrH7QgkzSbx3EYwCA", "senderPublicKey": "35yd3qw1gxKDxKwGAykHN9fANbXNWwseaUwbWDj24o3x", "proofs": [ "2QRaJeUFNS94Mqd2ygm1B8cHZ83XwU2ZtyxACRPcRX2vjXSn28Sf9jFhuxeNntNYMJfiXotUyCRktjNmtBbX7qYo" ], "script": "base64:BgL+HwgCEgMKAQgSAwoBCBIAEgQKAgEEEgcKBQEBAQEEEgMKAQESABIHCgUBAQEIARIECgIBARIDCgEBEgQKAggIEgQKAggIEgQKAggBEgASAwoBCBIFCgMBAQESBAoCCAESBAoCAQESBAoCCAgSCwoJCAEBAgECCAQEEgYKBAgIAQgiBnNjYWxlOCIMc2NhbGU4QmlnSW50IgdzY2FsZTE4Igh0aG91c2FuZCIKemVyb0JpZ0ludCIJb25lQmlnSW50IgpzbGlwcGFnZTREIgVBbXVsdCIFRGNvbnYiA1NFUCIFRU1QVFkiClBvb2xBY3RpdmUiClBvb2xQdXREaXMiDlBvb2xNYXRjaGVyRGlzIgxQb29sU2h1dGRvd24iDmlkeFBvb2xBZGRyZXNzIglpZHhQb29sU3QiCWlkeExQQXNJZCIJaWR4QW1Bc0lkIglpZHhQckFzSWQiC2lkeEFtdEFzRGNtIg1pZHhQcmljZUFzRGNtIgtpZHhJQW10QXNJZCINaWR4SVByaWNlQXNJZCIPaWR4RmFjdFN0YWtDbnRyIhBpZHhGYWN0U2xpcHBDbnRyIhFpZHhGYWN0R3d4UmV3Q250ciISZmVlUGVybWlsbGVEZWZhdWx0IgV0b1gxOCIHb3JpZ1ZhbCINb3JpZ1NjYWxlTXVsdCIHZnJvbVgxOCIDdmFsIg9yZXN1bHRTY2FsZU11bHQiAnRzIgNhbXQiCHJlc1NjYWxlIghjdXJTY2FsZSIDYWJzIhFrZXlGYWN0b3J5Q29udGFjdCITa2V5TWFuYWdlclB1YmxpY0tleSIaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkiDGtleVByaWNlTGFzdCIPa2V5UHJpY2VIaXN0b3J5IgFoIgF0IhJrZXlQdXRBY3Rpb25CeVVzZXIiAnVhIgR0eElkIhJrZXlHZXRBY3Rpb25CeVVzZXIiDmtleUFtb3VudEFzc2V0Ig1rZXlQcmljZUFzc2V0Ig9rZXlBbXBsaWZpY2F0b3IiD2tleUFkZG9uQWRkcmVzcyIOa2V5RmVlUGVybWlsbGUiC2ZlZVBlcm1pbGxlIgRmY2ZnIgRtdHBrIgJwYyIGaUFtdEFzIgVpUHJBcyIDbWJhIgViQVN0ciIDYXBzIgh0aHJvd0VyciIDbXNnIg90aHJvd09yZGVyRXJyb3IiA29yViIGc2VuZHJWIgZtYXRjaFYiA3N0ciIHJG1hdGNoMCIGdmFsU3RyIg9nZXRTdHJpbmdPckZhaWwiBGFkZHIiA2tleSIMZ2V0SW50T3JGYWlsIg9mYWN0b3J5Q29udHJhY3QiDGFtcGxpZmljYXRvciIQaXNHbG9iYWxTaHV0ZG93biITZ2V0TWF0Y2hlclB1Yk9yRmFpbCIObWF0Y2hlckFkZHJlc3MiDWdldFBvb2xDb25maWciBWFtdEFzIgdwcmljZUFzIghpUHJpY2VBcyIQZ2V0RmFjdG9yeUNvbmZpZyIRZGF0YVB1dEFjdGlvbkluZm8iDWluQW10QXNzZXRBbXQiD2luUHJpY2VBc3NldEFtdCIIb3V0THBBbXQiBXByaWNlIgpzbGlwQnlVc2VyIgxzbGlwcGFnZVJlYWwiCHR4SGVpZ2h0Igt0eFRpbWVzdGFtcCIMc2xpcGFnZUFtQW10IgxzbGlwYWdlUHJBbXQiEWRhdGFHZXRBY3Rpb25JbmZvIg5vdXRBbXRBc3NldEFtdCIQb3V0UHJpY2VBc3NldEFtdCIHaW5McEFtdCINZ2V0QWNjQmFsYW5jZSIHYXNzZXRJZCIPY2FsY1ByaWNlQmlnSW50IghwckFtdFgxOCIIYW1BbXRYMTgiD3ZhbGlkYXRlQWJzRGlmZiIKZXN0aW1hdGVMUCIFb3V0THAiCHNsaXBwYWdlIgRkaWZmIgRwYXNzIgl2YWxpZGF0ZUQiAkQxIgJEMCIEZmFpbCIQcHJpdmF0ZUNhbGNQcmljZSIKYW1Bc3NldERjbSIKcHJBc3NldERjbSIFYW1BbXQiBXByQW10IgthbXRBc0FtdFgxOCIKcHJBc0FtdFgxOCIKY2FsY1ByaWNlcyIFbHBBbXQiA2NmZyIIYW10QXNEY20iB3ByQXNEY20iCHByaWNlWDE4IghscEFtdFgxOCINbHBQckluQW1Bc1gxOCINbHBQckluUHJBc1gxOCIPY2FsY3VsYXRlUHJpY2VzIgFwIhRlc3RpbWF0ZUdldE9wZXJhdGlvbiIGdHhJZDU4Ig5wYXltZW50QXNzZXRJZCIPcGF5bWVudExwQW1vdW50Igt1c2VyQWRkcmVzcyIJbHBBc3NldElkIghhbW91bnRJZCIHcHJpY2VJZCIOYW1vdW50RGVjaW1hbHMiDXByaWNlRGVjaW1hbHMiA3N0cyIKbHBFbWlzc2lvbiIPdmFsaWRhdGlvbkJsb2NrIghkZWNpbWFscyINYW1vdW50QmFsYW5jZSIQYW1vdW50QmFsYW5jZVgxOCIMcHJpY2VCYWxhbmNlIg9wcmljZUJhbGFuY2VYMTgiD2N1cnJlbnRQcmljZVgxOCIIY3VyUHJpY2UiEnBheW1lbnRMcEFtb3VudFgxOCINbHBFbWlzc2lvblgxOCISb3V0QW1vdW50QW1vdW50WDE4IhFvdXRQcmljZUFtb3VudFgxOCIPb3V0QW1vdW50QW1vdW50Ig5vdXRQcmljZUFtb3VudCIFc3RhdGUiFGVzdGltYXRlUHV0T3BlcmF0aW9uIhFzbGlwcGFnZVRvbGVyYW5jZSITaW5BbW91bnRBc3NldEFtb3VudCIPaW5BbW91bnRBc3NldElkIhJpblByaWNlQXNzZXRBbW91bnQiDmluUHJpY2VBc3NldElkIgppc0V2YWx1YXRlIgZlbWl0THAiCmlzT25lQXNzZXQiDXBheW1lbnRBbW91bnQiCXBheW1lbnRJZCILYW1vdW50SWRTdHIiCnByaWNlSWRTdHIiDWluQW1vdW50SWRTdHIiDGluUHJpY2VJZFN0ciIWaW5BbW91bnRBc3NldEFtb3VudFgxOCIVaW5QcmljZUFzc2V0QW1vdW50WDE4Igx1c2VyUHJpY2VYMTgiAXIiC3NsaXBwYWdlWDE4IgtscEFtb3VudFgxOCIPc2xpcHBhZ2VSZWFsWDE4IgpwclZpYUFtWDE4IgphbVZpYVByWDE4Ig9leHBlY3RlZEFtb3VudHMiHGV4cGVjdGVkQW1vdW50QXNzZXRBbW91bnRYMTgiG2V4cGVjdGVkUHJpY2VBc3NldEFtb3VudFgxOCIRY2FsY3VsYXRlTHBBbW91bnQiG2NhbGN1bGF0ZUFtb3VudEFzc2V0UGF5bWVudCIaY2FsY3VsYXRlUHJpY2VBc3NldFBheW1lbnQiDGN1cnJlbnRQcmljZSIRc2xpcHBhZ2VDYWxjdWxhdGUiEWNoZWNrQ2FsY0xwQW1vdW50IgxlbWl0THBBbW91bnQiCmFtb3VudERpZmYiCXByaWNlRGlmZiINJHQwMTYxODkxNjQ0OCIKd3JpdGVBbUFtdCIKd3JpdGVQckFtdCILY29tbW9uU3RhdGUiG3ZhbGlkYXRlTWF0Y2hlck9yZGVyQWxsb3dlZCIFb3JkZXIiB2FtdEFzSWQiBnByQXNJZCIPYWNjQW10QXNCYWxhbmNlIg5hY2NQckFzQmFsYW5jZSIKb3JBbXRBc3NldCIKb3JBbXRBc1N0ciIJb3JQckFzc2V0IglvclByQXNTdHIiCm9yZGVyUHJpY2UiDmNhc3RPcmRlclByaWNlIhFpc09yZGVyUHJpY2VWYWxpZCIJY29tbW9uR2V0IgFpIg1jaGVja1BheW1lbnRzIgdwYXltZW50Igljb21tb25QdXQiBmNhbGxlciISYW1vdW50QXNzZXRQYXltZW50IhFwcmljZUFzc2V0UGF5bWVudCIHdGFrZUZlZSIGYW1vdW50IgNmZWUiFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQiAXMiHXBlbmRpbmdNYW5hZ2VyUHVibGljS2V5T3JVbml0IgJwZCILbXVzdE1hbmFnZXIiAnBrIgtjaGVja0NhbGxlciIXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkiFWNoZWNrTWFuYWdlclB1YmxpY0tleSICcG0iBWhhc1BNIgdjaGVja1BNIglhdXRvU3Rha2UiB2ZhY3RDZmciD3N0YWtpbmdDb250cmFjdCIQc2xpcHBhZ2VDb250cmFjdCINc2xpcHBhZ2VDaGVjayINcGF5bWVudHNDaGVjayILZXN0aW1hdGVQdXQiAmVsIgZsZWdhY3kiAnNhIgJzcCIJbHBUcmFzZmVyIgJzcyIPYW1vdW50QXNzZXRQYXJ0Ig5wcmljZUFzc2V0UGFydCIRZ3d4UmV3YXJkQ29udHJhY3QiB3Bvb2xDZmciBWFkZG9uIhBwYXltZW50QW1vdW50UmF3Ig0kdDAyNTYxNzI1Njc2IglmZWVBbW91bnQiDSR0MDI1OTQwMjYzOTUiEGFtb3VudEJhbGFuY2VOb3ciD3ByaWNlQmFsYW5jZU5vdyIMdmlydFN3YXBJbkFtIg12aXJ0U3dhcE91dFByIgx2aXJ0U3dhcEluUHIiDXZpcnRTd2FwT3V0QW0iBkQwdnNEMSIJbHBDYWxjUmVzIgFlIhBzZW5kRmVlVG9NYXRjaGVyIgttYXhzbGlwcGFnZSIJb3V0QW10QW10IgFiIgpleGNoUmVzdWx0Igdub3RVc2VkIglvdXRBbW91bnQiCm91dEFzc2V0SWQiCmVzdGltQW1BbXQiCmVzdGltUHJBbXQiDSR0MDMxNTM0MzIwMDIiCHRvdGFsR2V0IghmaW5hbFJlcyINJHQwMzI2NzEzMjc3OSIFb3V0QW0iBW91dFByIg50b3RhbEFtb3VudFJhdyINJHQwMzI4MTkzMjg3NCILdG90YWxBbW91bnQiEW91dEFzc2V0SWRPcldhdmVzIghjdXJQclgxOCIFY3VyUHIiBGJ1cm4iEm5vTGVzc1RoZW5BbXRBc3NldCIUbm9MZXNzVGhlblByaWNlQXNzZXQiFGNoZWNrT3V0QW1vdW50QW1vdW50IhNjaGVja091dFByaWNlQW1vdW50IhRidXJuTFBBc3NldE9uRmFjdG9yeSIKZmFjdG9yeUNmZyIHc3Rha2luZyIKdW5zdGFrZUludiIBdiIFYnVybkEiCGFtdEFzU3RyIgdwckFzU3RyIgFrIgJwciIMcmVzU2NhbGVNdWx0IgZpbkFtSWQiBmluUHJJZCIHdXNyQWRkciILcGF5bWVudEFzSWQiAnR4IgZ2ZXJpZnkiB210Y2hQdWIiBXNuZHJWIgVtdGNoViIPdGFyZ2V0UHVibGljS2V5IgckbWF0Y2gxUQABYQCAwtcvAAFiCQC2AgEAgMLXLwABYwkAtgIBAICAkLu61q3wDQABZADoBwABZQkAtgIBAAAAAWYJALYCAQABAAFnCQC2AgEJAGUCBQFhCQBpAgkAaAIFAWEAAQUBYQABaAIDMTAwAAFpAgExAAFqAgJfXwABawIAAAFsAAEAAW0AAgABbgADAAFvAAQAAXAAAQABcQACAAFyAAMAAXMABAABdAAFAAF1AAYAAXYABwABdwAIAAF4AAkAAXkAAQABegAHAAFBAAoAAUIAAAEBQwIBRAFFCQC8AgMJALYCAQUBRAUBYwkAtgIBBQFFAQFGAgFHAUgJAKADAQkAvAIDBQFHCQC2AgEFAUgFAWMBAUkDAUoBSwFMCQBrAwUBSgUBSwUBTAEBTQEBRwMJAL8CAgUBZQUBRwkAvgIBBQFHBQFHAQFOAAITJXNfX2ZhY3RvcnlDb250cmFjdAEBTwACFCVzX19tYW5hZ2VyUHVibGljS2V5AQFQAAIbJXNfX3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5AQFRAAIRJXMlc19fcHJpY2VfX2xhc3QBAVICAVMBVAkAuQkCCQDMCAICGCVzJXMlZCVkX19wcmljZV9faGlzdG9yeQkAzAgCCQCkAwEFAVMJAMwIAgkApAMBBQFUBQNuaWwFAWoBAVUCAVYBVwkArAICCQCsAgIJAKwCAgILJXMlcyVzX19QX18FAVYCAl9fBQFXAQFYAgFWAVcJAKwCAgkArAICCQCsAgICCyVzJXMlc19fR19fBQFWAgJfXwUBVwEBWQACDyVzX19hbW91bnRBc3NldAEBWgACDiVzX19wcmljZUFzc2V0AQJhYQACByVzX19hbXABAmFiAAINJXNfX2FkZG9uQWRkcgACYWMCDyVzX19mZWVQZXJtaWxsZQACYWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUCYWMFAUIBAmFlAAIRJXNfX2ZhY3RvcnlDb25maWcBAmFmAAIYJXMlc19fbWF0Y2hlcl9fcHVibGljS2V5AQJhZwICYWgCYWkJAKwCAgkArAICCQCsAgIJAKwCAgIIJWQlZCVzX18FAmFoAgJfXwUCYWkCCF9fY29uZmlnAQJhagECYWsJAKwCAgIoJXMlcyVzX19tYXBwaW5nc19fYmFzZUFzc2V0MmludGVybmFsSWRfXwUCYWsBAmFsAAIMJXNfX3NodXRkb3duAQJhbQECYW4JAAIBCQC5CQIJAMwIAgIPbHBfc3RhYmxlLnJpZGU6CQDMCAIFAmFuBQNuaWwCASABAmFvAwJhcAJhcQJhcgkBAmFtAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICEUZhaWxlZDogb3JkVmFsaWQ9CQClAwEFAmFwAgsgc25kclZhbGlkPQkApQMBBQJhcQIMIG10Y2hyVmFsaWQ9CQClAwEFAmFyAQJhcwEBRwQCYXQFAUcDCQABAgUCYXQCBlN0cmluZwQCYXUFAmF0BQJhdQkBAmFtAQITZmFpbCBjYXN0IHRvIFN0cmluZwECYXYCAmF3AmF4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUCYXcFAmF4CQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFAmF3CQDMCAICAS4JAMwIAgUCYXgJAMwIAgIMIG5vdCBkZWZpbmVkBQNuaWwCAAECYXkCAmF3AmF4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUCYXcFAmF4CQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFAmF3CQDMCAICAS4JAMwIAgUCYXgJAMwIAgIMIG5vdCBkZWZpbmVkBQNuaWwCAAACYXoJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQJhdgIFBHRoaXMJAQFOAAACYUEJAQJhdgIFBHRoaXMJAQJhYQABAmFCAAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQJhegkBAmFsAAcBAmFDAAkA2QQBCQECYXYCBQJhegkBAmFmAAACYUQJAKcIAQkBAmFDAAECYUUABAJhRgkBAmF2AgUEdGhpcwkBAVkABAJhRwkBAmF2AgUEdGhpcwkBAVoABAJhSAkBAmF5AgUCYXoJAQJhagEFAmFHBAJhaAkBAmF5AgUCYXoJAQJhagEFAmFGCQC1CQIJAQJhdgIFAmF6CQECYWcCCQCkAwEFAmFoCQCkAwEFAmFIBQFqAQJhSQAJALUJAgkBAmF2AgUCYXoJAQJhZQAFAWoBAmFKCgJhSwJhTAJhTQJhTgJhTwJhUAJhUQJhUgJhUwJhVAkAuQkCCQDMCAICFCVkJWQlZCVkJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQUCYUsJAMwIAgkApAMBBQJhTAkAzAgCCQCkAwEFAmFNCQDMCAIJAKQDAQUCYU4JAMwIAgkApAMBBQJhTwkAzAgCCQCkAwEFAmFQCQDMCAIJAKQDAQUCYVEJAMwIAgkApAMBBQJhUgkAzAgCCQCkAwEFAmFTCQDMCAIJAKQDAQUCYVQFA25pbAUBagECYVUGAmFWAmFXAmFYAmFOAmFRAmFSCQC5CQIJAMwIAgIMJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQUCYVYJAMwIAgkApAMBBQJhVwkAzAgCCQCkAwEFAmFYCQDMCAIJAKQDAQUCYU4JAMwIAgkApAMBBQJhUQkAzAgCCQCkAwEFAmFSBQNuaWwFAWoBAmFZAQJhWgMJAAACBQJhWgIFV0FWRVMICQDvBwEFBHRoaXMJYXZhaWxhYmxlCQDwBwIFBHRoaXMJANkEAQUCYVoBAmJhAgJiYgJiYwkAvAIDBQJiYgUBYwUCYmMBAmJkAwJiZQJiZgJiZwQCYmgJALwCAwkAuAICBQJiZQUCYmYFAWIFAmJmBAJiaQkAvwICCQC4AgIFAmJnCQEBTQEFAmJoBQFlAwkBASEBBQJiaQkBAmFtAQkArAICAg5CaWcgc2xpcHBhZ2U6IAkApgMBBQJiaAkAlAoCBQJiaQkAmQMBCQDMCAIFAmJlCQDMCAIFAmJmBQNuaWwBAmJqAwJiawJibAJiZwQCYmgJALwCAwUCYmwFAWIFAmJrBAJibQkAvwICBQJiZwUCYmgDAwUCYm0GCQC/AgIFAmJsBQJiawkBAmFtAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApgMBBQJibAIBIAkApgMBBQJiawIBIAkApgMBBQJiaAIBIAkApgMBBQJiZwUCYm0BAmJuBAJibwJicAJicQJicgQCYnMJAQFDAgUCYnEFAmJvBAJidAkBAUMCBQJicgUCYnAJAQJiYQIFAmJ0BQJicwECYnUDAmJxAmJyAmJ2BAJidwkBAmFFAAQCYngJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJidwUBdQQCYnkJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJidwUBdgQCYnoJAQJibgQFAmJ4BQJieQUCYnEFAmJyBAJiYwkBAUMCBQJicQUCYngEAmJiCQEBQwIFAmJyBQJieQQCYkEJAQFDAgUCYnYFAWEEAmJCCQECYmECBQJiYwUCYkEEAmJDCQECYmECBQJiYgUCYkEJAMwIAgUCYnoJAMwIAgUCYkIJAMwIAgUCYkMFA25pbAECYkQDAmJxAmJyAmJ2BAJiRQkBAmJ1AwUCYnEFAmJyBQJidgkAzAgCCQEBRgIJAJEDAgUCYkUAAAUBYQkAzAgCCQEBRgIJAJEDAgUCYkUAAQUBYQkAzAgCCQEBRgIJAJEDAgUCYkUAAgUBYQUDbmlsAQJiRgQCYkcCYkgCYkkCYkoEAmJ3CQECYUUABAJiSwkAkQMCBQJidwUBcgQCYkwJAJEDAgUCYncFAXMEAmJNCQCRAwIFAmJ3BQF0BAJiTgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJ3BQF1BAJiTwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJ3BQF2BAJiUAkAkQMCBQJidwUBcQQCYlEICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQJiSwILV3JvbmcgTFAgaWQIcXVhbnRpdHkEAmJSAwkAAAIFAmJLBQJiSAYJAQJhbQECE1dyb25nIHBheW1lbnQgYXNzZXQDCQAAAgUCYlIFAmJSBAJiUwMJAGcCBQJiTgUCYk8FAmJOBQJiTwMJAAACBQJiUwUCYlMEAmJUCQECYVkBBQJiTAQCYlUJAQFDAgUCYlQFAmJTBAJiVgkBAmFZAQUCYk0EAmJXCQEBQwIFAmJWBQJiUwQCYlgJAQJiYQIFAmJXBQJiVQQCYlkJAQFGAgUCYlgFAWEEAmJaCQEBQwIFAmJJBQFhBAJjYQkBAUMCBQJiUQUBYQQCY2IJALwCAwUCYlUFAmJaBQJjYQQCY2MJALwCAwUCYlcFAmJaBQJjYQQCY2QJAQFGAgUCY2IFAmJTBAJjZQkBAUYCBQJjYwUCYlMEAmNmAwkAAAIFAmJHAgAFA25pbAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJiSgUCY2QDCQAAAgUCYkwCBVdBVkVTBQR1bml0CQDZBAEFAmJMCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmJKBQJjZQMJAAACBQJiTQIFV0FWRVMFBHVuaXQJANkEAQUCYk0JAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVgCCQClCAEFAmJKBQJiRwkBAmFVBgUCY2QFAmNlBQJiSQUCYlkFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFRAAUCYlkJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFSAgUGaGVpZ2h0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUCYlkFA25pbAkAnAoKBQJjZAUCY2UFAmJMBQJiTQUCYlQFAmJWBQJiUQUCYlgFAmJQBQJjZgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECY2cMAmJHAmNoAmNpAmNqAmNrAmNsAmJKAmNtAmNuAmNvAmNwAmNxBAJidwkBAmFFAAQCYksJANkEAQkAkQMCBQJidwUBcgQCY3IJAJEDAgUCYncFAXMEAmNzCQCRAwIFAmJ3BQF0BAJjdAkAkQMCBQJidwUBdwQCY3UJAJEDAgUCYncFAXgEAmJOCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYncFAXUEAmJPCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYncFAXYEAmJQCQCRAwIFAmJ3BQFxBAJiUQgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBBQJiSwIOV3JvbmcgbHAgYXNzZXQIcXVhbnRpdHkEAmJUAwUCY20JAQJhWQEFAmNyAwMFAmNvCQAAAgUCY3EFAmNyBwkAZQIJAQJhWQEFAmNyBQJjcAMFAmNvCQECYVkBBQJjcgkAZQIJAQJhWQEFAmNyBQJjaQQCYlYDBQJjbQkBAmFZAQUCY3MDAwUCY28JAAACBQJjcQUCY3MHCQBlAgkBAmFZAQUCY3MFAmNwAwUCY28JAQJhWQEFAmNzCQBlAgkBAmFZAQUCY3MFAmNrBAJiUwMJAGcCBQJiTgUCYk8FAmJOBQJiTwMJAAACBQJiUwUCYlMEAmN2CQEBQwIFAmNpBQJiUwQCY3cJAQFDAgUCY2sFAmJTBAJjeAkBAmJhAgUCY3cFAmN2BAJiVQkBAUMCBQJiVAUCYlMEAmJXCQEBQwIFAmJWBQJiUwQCY3kDCQAAAgUCYlEAAAQCYlgFAWUEAmN6BQFlBAJjQQkAdgYJALkCAgUCY3YFAmN3AAAJALYCAQAFAAEAAAUERE9XTgkAlwoFCQEBRgIFAmNBBQFhCQEBRgIFAmN2BQJiUwkBAUYCBQJjdwUCYlMJAQJiYQIJALcCAgUCYlcFAmN3CQC3AgIFAmJVBQJjdgUCY3oEAmJYCQECYmECBQJiVwUCYlUEAmNCCQC8AgMJAQFNAQkAuAICBQJiWAUCY3gFAWMFAmJYBAJjegkBAUMCBQJjaAUBYQMDCQECIT0CBQJiWAUBZQkAvwICBQJjQgUCY3oHCQECYW0BCQCsAgIJAKwCAgkArAICAg9QcmljZSBzbGlwcGFnZSAJAKYDAQUCY0ICAyA+IAkApgMBBQJjegQCY2EJAQFDAgUCYlEFAWEEAmNDCQC8AgMFAmN2BQJiWAUBYwQCY0QJALwCAwUCY3cFAWMFAmJYBAJjRQMJAL8CAgUCY0MFAmN3CQCUCgIFAmNEBQJjdgkAlAoCBQJjdgUCY0MEAmNGCAUCY0UCXzEEAmNHCAUCY0UCXzIEAmNBCQC8AgMFAmNhBQJjRwUCYlcJAJcKBQkBAUYCBQJjQQUBYQkBAUYCBQJjRgUCYlMJAQFGAgUCY0cFAmJTBQJiWAUCY3oEAmNICAUCY3kCXzEEAmNJCAUCY3kCXzIEAmNKCAUCY3kCXzMEAmNLCQEBRgIIBQJjeQJfNAUBYQQCY0wJAQFGAggFAmN5Al81BQFhBAJjTQMJAGYCBQJjSAAABgkBAmFtAQIHTFAgPD0gMAMJAAACBQJjTQUCY00EAmNOAwkBASEBBQJjbgAABQJjSAQCY08JAGUCBQJjaQUCY0kEAmNQCQBlAgUCY2sFAmNKBAJjUQMDBQJjbwkAAAIFAmNxBQJjcgcJAJQKAgUCY3AAAAMDBQJjbwkAAAIFAmNxBQJjcwcJAJQKAgAABQJjcAkAlAoCBQJjSQUCY0oEAmNSCAUCY1ECXzEEAmNTCAUCY1ECXzIEAmNUCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBUQAFAmNLCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBUgIFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFAmNLCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFVAgUCYkoFAmJHCQECYUoKBQJjUgUCY1MFAmNOBQJjSwUCY2gFAmNMBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQJjTwUCY1AFA25pbAkAnwoNBQJjSAUCY04FAmNLBQJiVAUCYlYFAmJRBQJiSwUCYlAFAmNUBQJjTwUCY1AFAmNqBQJjbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECY1UBAmNWBAJidwkBAmFFAAQCY1cJAJEDAgUCYncFAXMEAmNYCQCRAwIFAmJ3BQF0BAJiUAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJ3BQFxBAJieAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJ3BQF1BAJieQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJ3BQF2BAJjWQkBAmFZAQUCY1cEAmNaCQECYVkBBQJjWAQCYlgDCQAAAggFAmNWCW9yZGVyVHlwZQUDQnV5CQECYm4EBQJieAUCYnkJAGQCBQJjWQgFAmNWBmFtb3VudAUCY1oJAQJibgQFAmJ4BQJieQkAZQIFAmNZCAUCY1YGYW1vdW50BQJjWgQCYlkJAQFGAgUCYlgFAWEDAwMJAQJhQgAGCQAAAgUCYlAFAW4GCQAAAgUCYlAFAW8JAQJhbQECDUFkbWluIGJsb2NrZWQEAmRhCAgFAmNWCWFzc2V0UGFpcgthbW91bnRBc3NldAQCZGIDCQAAAgUCZGEFBHVuaXQCBVdBVkVTCQDYBAEJAQV2YWx1ZQEFAmRhBAJkYwgIBQJjVglhc3NldFBhaXIKcHJpY2VBc3NldAQCZGQDCQAAAgUCZGMFBHVuaXQCBVdBVkVTCQDYBAEJAQV2YWx1ZQEFAmRjAwMJAQIhPQIFAmRiBQJjVwYJAQIhPQIFAmRkBQJjWAkBAmFtAQIJV3IgYXNzZXRzBAJkZQgFAmNWBXByaWNlBAJiTwkAawMFAWEFAmJ5BQJieAQCZGYJAQFJAwUCZGUFAWEFAmJPBAJkZwMJAAACCAUCY1YJb3JkZXJUeXBlBQNCdXkJAGcCBQJiWQUCZGYJAGcCBQJkZgUCYlkGAQJkaAECZGkEAmRqAwkAAAIJAJADAQgFAmRpCHBheW1lbnRzAAEGCQECYW0BAhIxIHBheW1lbnQgZXhwZWN0ZWQDCQAAAgUCZGoFAmRqBAJkawkBBXZhbHVlAQkAkQMCCAUCZGkIcGF5bWVudHMAAAQCYkgJAQV2YWx1ZQEIBQJkawdhc3NldElkBAJjcAgFAmRrBmFtb3VudAQCY3kJAQJiRgQJANgEAQgFAmRpDXRyYW5zYWN0aW9uSWQJANgEAQUCYkgFAmNwCAUCZGkGY2FsbGVyBAJjZAgFAmN5Al8xBAJjZQgFAmN5Al8yBAJiUAkBDXBhcnNlSW50VmFsdWUBCAUCY3kCXzkEAmNmCAUCY3kDXzEwAwMJAQJhQgAGCQAAAgUCYlAFAW8JAQJhbQEJAKwCAgIPQWRtaW4gYmxvY2tlZDogCQCkAwEFAmJQCQCXCgUFAmNkBQJjZQUCY3AFAmJIBQJjZgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECZGwJAmRtAVcCZG4CZG8CYmcCY24CY28CY3ACY3EEAmN5CQECY2cMBQFXBQJiZwgJAQV2YWx1ZQEFAmRuBmFtb3VudAgJAQV2YWx1ZQEFAmRuB2Fzc2V0SWQICQEFdmFsdWUBBQJkbwZhbW91bnQICQEFdmFsdWUBBQJkbwdhc3NldElkBQJkbQcFAmNuBQJjbwUCY3AFAmNxBAJiUAkBDXBhcnNlSW50VmFsdWUBCAUCY3kCXzgDAwMJAQJhQgAGCQAAAgUCYlAFAW0GCQAAAgUCYlAFAW8JAQJhbQEJAKwCAgIIQmxvY2tlZDoJAKQDAQUCYlAFAmN5AQJkcAECZHEEAmRyCQBrAwUCZHEFAmFkBQFkCQCUCgIJAGUCBQJkcQUCZHIFAmRyAQJkcwAEAmF0CQCiCAEJAQFPAAMJAAECBQJhdAIGU3RyaW5nBAJkdAUCYXQJANkEAQUCZHQDCQABAgUCYXQCBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgECZHUABAJhdAkAoggBCQEBUAADCQABAgUCYXQCBlN0cmluZwQCZHQFAmF0CQDZBAEFAmR0AwkAAQIFAmF0AgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IAAmR2CQECYW0BAhFQZXJtaXNzaW9uIGRlbmllZAECZHcBAmRpBAJhdAkBAmRzAAMJAAECBQJhdAIKQnl0ZVZlY3RvcgQCZHgFAmF0AwkAAAIIBQJkaQ9jYWxsZXJQdWJsaWNLZXkFAmR4BgUCZHYDCQABAgUCYXQCBFVuaXQDCQAAAggFAmRpBmNhbGxlcgUEdGhpcwYFAmR2CQACAQILTWF0Y2ggZXJyb3IVAmRpAQtjb25zdHJ1Y3RvcgECYXoEAmR5CQECZHcBBQJkaQMJAAACBQJkeQUCZHkJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAU4ABQJhegUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRpAQpzZXRNYW5hZ2VyAQJkegQCZHkJAQJkdwEFAmRpAwkAAAIFAmR5BQJkeQQCZEEJANkEAQUCZHoDCQAAAgUCZEEFAmRBCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFQAAUCZHoFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkaQEOY29uZmlybU1hbmFnZXIABAJkQgkBAmR1AAQCZEMDCQEJaXNEZWZpbmVkAQUCZEIGCQECYW0BAhJObyBwZW5kaW5nIG1hbmFnZXIDCQAAAgUCZEMFAmRDBAJkRAMJAAACCAUCZGkPY2FsbGVyUHVibGljS2V5CQEFdmFsdWUBBQJkQgYJAQJhbQECG1lvdSBhcmUgbm90IHBlbmRpbmcgbWFuYWdlcgMJAAACBQJkRAUCZEQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAU8ACQDYBAEJAQV2YWx1ZQEFAmRCCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFQAAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRpAQNwdXQCAmJnAmRFBAJkRgkBAmFJAAQCZEcJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmRGBQF5AhZXcm9uZyBzdGFraW5nIGNvbnRyYWN0BAJkSAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCZEYFAXoCF1dyb2duIHNsaXBwYWdlIGNvbnRyYWN0BAJkSQMJAGcCBQJiZwAABgkBAmFtAQIOd3Jvbmcgc2xpcHBhZ2UDCQAAAgUCZEkFAmRJBAJkSgMJAAACCQCQAwEIBQJkaQhwYXltZW50cwACBgkBAmFtAQITMiBwYXltZW50cyBleHBlY3RlZAMJAAACBQJkSgUCZEoEAmRLCQECZGwJCQClCAEIBQJkaQZjYWxsZXIJANgEAQgFAmRpDXRyYW5zYWN0aW9uSWQJAQ9BdHRhY2hlZFBheW1lbnQCCAkBBXZhbHVlAQkAkQMCCAUCZGkIcGF5bWVudHMAAAdhc3NldElkCAkBBXZhbHVlAQkAkQMCCAUCZGkIcGF5bWVudHMAAAZhbW91bnQJAJEDAggFAmRpCHBheW1lbnRzAAEFAmJnBgcAAAIABAJjTggFAmRLAl8yBAJiSwgFAmRLAl83BAJjZggFAmRLAl85BAJjTwgFAmRLA18xMAQCY1AIBQJkSwNfMTEEAmJMCAUCZEsDXzEyBAJiTQgFAmRLA18xMwQCY3kJAPwHBAUCYXoCBGVtaXQJAMwIAgUCY04FA25pbAUDbmlsAwkAAAIFAmN5BQJjeQQCZEwEAmF0BQJjeQMJAAECBQJhdAIHQWRkcmVzcwQCZE0FAmF0CQD8BwQFAmRNAgRlbWl0CQDMCAIFAmNOBQNuaWwFA25pbAUEdW5pdAMJAAACBQJkTAUCZEwEAmROAwkAZgIFAmNPAAAJAPwHBAUCZEgCA3B1dAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJiTAUCY08FA25pbAUDbmlsAwkAAAIFAmROBQJkTgQCZE8DCQBmAgUCY1AAAAkA/AcEBQJkSAIDcHV0BQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmJNBQJjUAUDbmlsBQNuaWwDCQAAAgUCZE8FAmRPBAJkUAMFAmRFBAJkUQkA/AcEBQJkRwIFc3Rha2UFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCYksFAmNOBQNuaWwDCQAAAgUCZFEFAmRRBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAmRpBmNhbGxlcgUCY04FAmJLBQNuaWwJAM4IAgUCY2YFAmRQCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRpAQlwdXRPbmVUa24FAmRSAmRTAmJmAmJnAmRFBAJidwkBAmFJAAQCZEcJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmJ3BQF5AhZXcm9uZyBzdGFraW5nIGNvbnRyYWN0BAJkSAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCYncFAXoCF1dyb25nIHNsaXBwYWdlIGNvbnRyYWN0BAJkVAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUCYncFAUECGVdyb25nIGd3eCByZXdhcmQgY29udHJhY3QEAmRVCQECYUUABAJiTAkAkQMCBQJkVQUBcwQCYk0JAJEDAgUCZFUFAXQEAmJOCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZFUFAXUEAmJPCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCZFUFAXYEAmRWCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQJhYgACAAQCYkoDCQAAAgUCZFYJAKUIAQgFAmRpBmNhbGxlcggFAmRpDG9yaWdpbkNhbGxlcggFAmRpBmNhbGxlcgMDAwMJAGcCAAAFAmJnBgkAZwIAAAUCZFIGCQBnAgAABQJkUwYJAGcCAAAFAmJmCQECYW0BAgxXcm9uZyBwYXJhbXMDCQECIT0CCQCQAwEIBQJkaQhwYXltZW50cwABCQECYW0BAhIxIHBheW1lbnQgZXhwZWN0ZWQEAmRrCQEFdmFsdWUBCQCRAwIIBQJkaQhwYXltZW50cwAABAJiSAkA2AQBCQEFdmFsdWUBCAUCZGsHYXNzZXRJZAQCZFcIBQJkawZhbW91bnQEAmRYCQECZHABBQJkVwQCY3AIBQJkWAJfMQQCZFkIBQJkWAJfMgMDAwkAZgIFAmRSBQJjcAYJAGYCBQJkUwUCY3AGCQBmAgCAreIEBQJjcAkBAmFtAQIUd3JvbmcgcGF5bWVudCBhbW91bnQEAmJUCQECYVkBBQJiTAQCYlYJAQJhWQEFAmJNBAJkWgMJAAACBQJiSAUCYkwJAJgKBgkAZQIFAmJUBQJjcAUCYlYJAGUCBQJjcAUCZFIFAmRTAAAAAAMJAAACBQJiSAUCYk0JAJgKBgUCYlQJAGUCBQJiVgUCY3AAAAAACQBlAgUCY3AFAmRTBQJkUgkBAmFtAQIUd3JvbmcgcGF5bWVudEFzc2V0SWQEAmVhCAUCZFoCXzEEAmViCAUCZFoCXzIEAmVjCAUCZFoCXzMEAmVkCAUCZFoCXzQEAmVlCAUCZFoCXzUEAmVmCAUCZFoCXzYEAmJsCQD8BwQFAmRUAgVjYWxjRAkAzAgCCQCkAwEFAmVhCQDMCAIJAKQDAQUCZWIJAMwIAgUCYUEJAMwIAgUBaAkAzAgCBQFpBQNuaWwFA25pbAQCYmsJAPwHBAUCZFQCBWNhbGNECQDMCAIJAKYDAQkAtgIBCQBlAgkAZAIFAmVhBQJlYwUCZWYJAMwIAgkApgMBCQC2AgEJAGUCCQBkAgUCZWIFAmVlBQJlZAkAzAgCBQJhQQkAzAgCBQFoCQDMCAIFAWkFA25pbAUDbmlsBAJlZwkBAmJqAwkApwMBCQECYXMBBQJiawkApwMBCQECYXMBBQJibAUBZwMJAAACBQJlZwUCZWcEAmRLCQECZGwJCQClCAEIBQJkaQZjYWxsZXIJANgEAQgFAmRpDXRyYW5zYWN0aW9uSWQJAQ9BdHRhY2hlZFBheW1lbnQCCQDZBAEFAmJMBQJkUgkBD0F0dGFjaGVkUGF5bWVudAIJANkEAQUCYk0FAmRTBQJiZwYGBQJjcAUCYkgEAmJlCAUCZEsCXzIEAmJLCAUCZEsCXzcEAmNmCAUCZEsCXzkEAmNPCAUCZEsDXzEwBAJjUAgFAmRLA18xMQQCZWgJAQJiZAMJALYCAQUCYmUJALYCAQUCYmYJALYCAQUCYmcEAmNOCQCgAwEIBQJlaAJfMgQCZWkJAPwHBAUCYXoCBGVtaXQJAMwIAgUCY04FA25pbAUDbmlsAwkAAAIFAmVpBQJlaQQCZEwEAmF0BQJlaQMJAAECBQJhdAIHQWRkcmVzcwQCZE0FAmF0CQD8BwQFAmRNAgRlbWl0CQDMCAIFAmNOBQNuaWwFA25pbAUEdW5pdAMJAAACBQJkTAUCZEwEAmROAwkAZgIFAmNPAAAJAPwHBAUCZEgCA3B1dAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQDZBAEFAmJMBQJjTwUDbmlsBQNuaWwDCQAAAgUCZE4FAmROBAJkTwMJAGYCBQJjUAAACQD8BwQFAmRIAgNwdXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkA2QQBBQJiTQUCY1AFA25pbAUDbmlsAwkAAAIFAmRPBQJkTwQCZFADBQJkRQQCZFEJAPwHBAUCZEcCBXN0YWtlBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmJLBQJjTgUDbmlsAwkAAAIFAmRRBQJkUQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQJkaQZjYWxsZXIFAmNOBQJiSwUDbmlsBAJlagMJAGYCBQJkWQAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmFEBQJkWQkA2QQBBQJiSAUDbmlsBQNuaWwJAM4IAgkAzggCBQJjZgUCZFAFAmVqCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRpAQpwdXRGb3JGcmVlAQJlawMJAGYCAAAFAmVrCQECYW0BAg53cm9uZyBzbGlwcGFnZQMJAQIhPQIJAJADAQgFAmRpCHBheW1lbnRzAAIJAQJhbQECEzIgcGF5bWVudHMgZXhwZWN0ZWQEAmRLCQECZGwJCQClCAEIBQJkaQZjYWxsZXIJANgEAQgFAmRpDXRyYW5zYWN0aW9uSWQJAQ9BdHRhY2hlZFBheW1lbnQCCAkBBXZhbHVlAQkAkQMCCAUCZGkIcGF5bWVudHMAAAdhc3NldElkCAkBBXZhbHVlAQkAkQMCCAUCZGkIcGF5bWVudHMAAAZhbW91bnQJAJEDAggFAmRpCHBheW1lbnRzAAEFAmVrBwcAAAIACAUCZEsCXzkCZGkBA2dldAAEAmN5CQECZGgBBQJkaQQCZWwIBQJjeQJfMQQCY2UIBQJjeQJfMgQCY3AIBQJjeQJfMwQCYkgIBQJjeQJfNAQCY2YIBQJjeQJfNQQCZW0JAPwHBAUCYXoCBGJ1cm4JAMwIAgUCY3AFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUCYkgFAmNwBQNuaWwDCQAAAgUCZW0FAmVtBQJjZgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJkaQEJZ2V0T25lVGtuBQJlbgJlbwJlcAJlcQJiZwMJAQIhPQIJAJADAQgFAmRpCHBheW1lbnRzAAEJAQJhbQECEjEgcGF5bWVudCBleHBlY3RlZAQCYncJAQJhRQAEAmJLCQCRAwIFAmJ3BQFyBAJiTAkAkQMCBQJidwUBcwQCYk0JAJEDAgUCYncFAXQEAmJOCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYncFAXUEAmJPCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYncFAXYEAmJQCQCRAwIFAmJ3BQFxBAJkRgkBAmFJAAQCZFQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmRGBQFBAh9Xcm9uZyBnd3hSZXdhcmRDb250cmFjdCBhZGRyZXNzBAJkawkBBXZhbHVlAQkAkQMCCAUCZGkIcGF5bWVudHMAAAQCZFYJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBAmFiAAIABAJiSgMJAAACBQJkVgkApQgBCAUCZGkGY2FsbGVyCAUCZGkMb3JpZ2luQ2FsbGVyCAUCZGkGY2FsbGVyBAJiRwkA2AQBCAUCZGkNdHJhbnNhY3Rpb25JZAQCYkgJAQV2YWx1ZQEIBQJkawdhc3NldElkBAJjcAgFAmRrBmFtb3VudAMJAGYCAICU69wDBQJjcAkBAmFtAQIRTWluIHBheW1lbnQgMTAgTFADAwMJAGYCAAAFAmJnBgkAZgIAAAUCZW4GCQBmAgAABQJlcAkBAmFtAQIMV3JvbmcgcGFyYW1zAwkBAiE9AgUCYksJANgEAQUCYkgJAQJhbQECCFdyb25nIExQBAJjeQkBAmJGBAkA2AQBCAUCZGkNdHJhbnNhY3Rpb25JZAkA2AQBBQJiSAUCY3AIBQJkaQZjYWxsZXIEAmVyCAUCY3kCXzEEAmVzCAUCY3kCXzIEAmJUCQECYVkBBQJiTAQCYlYJAQJhWQEFAmJNBAJldAMJAAACBQJlcQUCYkwJAJkKBwkAZQIFAmJUBQJlcgkAZQIFAmJWBQJlcwUCZW4FAmVzAAAAAAkAZAIFAmVyBQJlbgMJAAACBQJlcQUCYk0JAJkKBwkAZQIFAmJUBQJlcgkAZQIFAmJWBQJlcwAAAAAFAmVuBQJlcgkAZAIFAmVzBQJlbgkBAmFtAQIQd3Jvbmcgb3V0QXNzZXRJZAQCZWEIBQJldAJfMQQCZWIIBQJldAJfMgQCZWMIBQJldAJfMwQCZWQIBQJldAJfNAQCZWUIBQJldAJfNQQCZWYIBQJldAJfNgQCZXUIBQJldAJfNwMDCQBmAgAABQJlYwYJAGYCAAAFAmVlCQECYW0BAgpXcm9uZyBjYWxjBAJibAkA/AcEBQJkVAIFY2FsY0QJAMwIAgkApAMBBQJlYQkAzAgCCQCkAwEFAmViCQDMCAIFAmFBCQDMCAIFAWgJAMwIAgUBaQUDbmlsBQNuaWwEAmJrCQD8BwQFAmRUAgVjYWxjRAkAzAgCCQCkAwEJAGQCCQBlAgUCZWEFAmVjBQJlZgkAzAgCCQCkAwEJAGUCCQBkAgUCZWIFAmVkBQJlZQkAzAgCBQJhQQkAzAgCBQFoCQDMCAIFAWkFA25pbAUDbmlsBAJlZwkBAmJqAwkApwMBCQECYXMBBQJiawkApwMBCQECYXMBBQJibAUBZwMJAAACBQJlZwUCZWcEAmV2CQECYmQDCQC2AgEFAmV1CQC2AgEFAmVwCQC2AgEFAmJnAwkAAAIFAmV2BQJldgQCZXcDCQAAAgUCZXEFAmJMCQCUCgIJAKADAQgFAmV2Al8yAAAJAJQKAgAACQCgAwEIBQJldgJfMgQCZXgIBQJldwJfMQQCZXkIBQJldwJfMgQCZXoJAGQCBQJleAUCZXkEAmVBCQECZHABBQJlegQCZUIIBQJlQQJfMQQCZFkIBQJlQQJfMgQCZUMDCQAAAgUCZXECBVdBVkVTBQR1bml0CQDZBAEFAmVxBAJlagMJAGYCBQJkWQAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmFEBQJkWQUCZUMFA25pbAUDbmlsBAJiUwMJAGcCBQJiTgUCYk8FAmJOBQJiTwMJAAACBQJiUwUCYlMEAmVECQECYmECCQEBQwIFAmJWBQJiUwkBAUMCBQJiVAUCYlMEAmVFCQEBRgIFAmVEBQFhBAJjZgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJiSgUCZUIFAmVDCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFYAgkApQgBBQJiSgUCYkcJAQJhVQYFAmV4BQJleQUCY3AFAmVFBQZoZWlnaHQIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBUQAFAmVFCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBUgIFBmhlaWdodAgFCWxhc3RCbG9jawl0aW1lc3RhbXAFAmVFBQNuaWwDCQAAAgUCY2YFAmNmBAJlRgkA/AcEBQJhegIEYnVybgkAzAgCBQJjcAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQJiSAUCY3AFA25pbAMJAAACBQJlRgUCZUYJAM4IAgUCY2YFAmVqCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmRpAQlnZXROb0xlc3MCAmVHAmVIBAJjeQkBAmRoAQUCZGkEAmNkCAUCY3kCXzEEAmNlCAUCY3kCXzIEAmNwCAUCY3kCXzMEAmJICAUCY3kCXzQEAmNmCAUCY3kCXzUEAmVJAwkAZwIFAmNkBQJlRwYJAQJhbQEJAKwCAgkArAICCQCsAgICCUZhaWxlZDogIAkApAMBBQJjZAIDIDwgCQCkAwEFAmVHAwkAAAIFAmVJBQJlSQQCZUoDCQBnAgUCY2UFAmVIBgkBAmFtAQkArAICCQCsAgIJAKwCAgIIRmFpbGVkOiAJAKQDAQUCY2UCAyA8IAkApAMBBQJlSAMJAAACBQJlSgUCZUoEAmVLCQD8BwQFAmF6AgRidXJuCQDMCAIFAmNwBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmJIBQJjcAUDbmlsAwkAAAIFAmVLBQJlSwUCY2YJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZGkBDXVuc3Rha2VBbmRHZXQBAmRxBAJkagMJAQIhPQIJAJADAQgFAmRpCHBheW1lbnRzAAAJAQJhbQECFG5vIHBheW1lbnRzIGV4cGVjdGVkBgMJAAACBQJkagUCZGoEAmJ3CQECYUUABAJlTAkBAmFJAAQCYksJANkEAQkAkQMCBQJidwUBcgQCZU0JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFAmVMBQF5AgV3cm9uZwQCZU4JAPwHBAUCZU0CB3Vuc3Rha2UJAMwIAgkA2AQBBQJiSwkAzAgCBQJkcQUDbmlsBQNuaWwDCQAAAgUCZU4FAmVOBAJjeQkBAmJGBAkA2AQBCAUCZGkNdHJhbnNhY3Rpb25JZAkA2AQBBQJiSwUCZHEIBQJkaQZjYWxsZXIEAmJQCQENcGFyc2VJbnRWYWx1ZQEIBQJjeQJfOQQCY2YIBQJjeQNfMTAEAmVPAwMJAQJhQgAGCQAAAgUCYlAFAW8JAQJhbQEJAKwCAgIJQmxvY2tlZDogCQCkAwEFAmJQBgMJAAACBQJlTwUCZU8EAmVQCQD8BwQFAmF6AgRidXJuCQDMCAIFAmRxBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFAmJLBQJkcQUDbmlsAwkAAAIFAmVQBQJlUAUCY2YJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CZGkBCGFjdGl2YXRlAgJlUQJlUgMJAQIhPQIJAKUIAQgFAmRpBmNhbGxlcgkApQgBBQJhegkBAmFtAQIGZGVuaWVkCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVkABQJlUQkAzAgCCQELU3RyaW5nRW50cnkCCQEBWgAFAmVSBQNuaWwCB3N1Y2Nlc3MCZGkBBHNldFMCAmVTAmVPAwkBAiE9AgkApQgBCAUCZGkGY2FsbGVyCQECYXYCBQR0aGlzCQECYWIABQJkdgkAzAgCCQELU3RyaW5nRW50cnkCBQJlUwUCZU8FA25pbAJkaQEEc2V0SQICZVMCZU8DCQECIT0CCQClCAEIBQJkaQZjYWxsZXIJAQJhdgIFBHRoaXMJAQJhYgAFAmR2CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQJlUwUCZU8FA25pbAJkaQEcZ2V0UG9vbENvbmZpZ1dyYXBwZXJSRUFET05MWQAJAJQKAgUDbmlsCQECYUUAAmRpARxnZXRBY2NCYWxhbmNlV3JhcHBlclJFQURPTkxZAQJhWgkAlAoCBQNuaWwJAQJhWQEFAmFaAmRpARljYWxjUHJpY2VzV3JhcHBlclJFQURPTkxZAwJicQJicgJidgQCZVQJAQJidQMFAmJxBQJicgUCYnYJAJQKAgUDbmlsCQDMCAIJAKYDAQkAkQMCBQJlVAAACQDMCAIJAKYDAQkAkQMCBQJlVAABCQDMCAIJAKYDAQkAkQMCBQJlVAACBQNuaWwCZGkBFmZyb21YMThXcmFwcGVyUkVBRE9OTFkCAUcCZVUJAJQKAgUDbmlsCQEBRgIJAKcDAQUBRwUCZVUCZGkBFHRvWDE4V3JhcHBlclJFQURPTkxZAgFEAUUJAJQKAgUDbmlsCQCmAwEJAQFDAgUBRAUBRQJkaQEeY2FsY1ByaWNlQmlnSW50V3JhcHBlclJFQURPTkxZAgJiYgJiYwkAlAoCBQNuaWwJAKYDAQkBAmJhAgkApwMBBQJiYgkApwMBBQJiYwJkaQEjZXN0aW1hdGVQdXRPcGVyYXRpb25XcmFwcGVyUkVBRE9OTFkJAmJHAmJnAmNpAmVWAmNrAmVXAmVYAmNtAmNuCQCUCgIFA25pbAkBAmNnDAUCYkcFAmJnBQJjaQUCZVYFAmNrBQJlVwUCZVgFAmNtBQJjbgcAAAIAAmRpASNlc3RpbWF0ZUdldE9wZXJhdGlvbldyYXBwZXJSRUFET05MWQQCYkcCZVkCYkkCZVgEAmN5CQECYkYEBQJiRwUCZVkFAmJJCQERQGV4dHJOYXRpdmUoMTA2MikBBQJlWAkAlAoCBQNuaWwJAJwKCggFAmN5Al8xCAUCY3kCXzIIBQJjeQJfMwgFAmN5Al80CAUCY3kCXzUIBQJjeQJfNggFAmN5Al83CQCmAwEIBQJjeQJfOAgFAmN5Al85CAUCY3kDXzEwAQJlWgECZmEABAJhdAUCZVoDCQABAgUCYXQCBU9yZGVyBAJjVgUCYXQEAmZiCQECYUMABAJhcAkBAmNVAQUCY1YEAmZjCQD0AwMIBQJjVglib2R5Qnl0ZXMJAJEDAggFAmNWBnByb29mcwAACAUCY1YPc2VuZGVyUHVibGljS2V5BAJmZAkA9AMDCAUCY1YJYm9keUJ5dGVzCQCRAwIIBQJjVgZwcm9vZnMAAQUCZmIDAwMFAmFwBQJmYwcFAmZkBwYJAQJhbwMFAmFwBQJmYwUCZmQEAmZlBAJmZgkBAmRzAAMJAAECBQJmZgIKQnl0ZVZlY3RvcgQCZHgFAmZmBQJkeAMJAAECBQJmZgIEVW5pdAgFAmVaD3NlbmRlclB1YmxpY0tleQkAAgECC01hdGNoIGVycm9yCQD0AwMIBQJlWglib2R5Qnl0ZXMJAJEDAggFAmVaBnByb29mcwAABQJmZd18zmc=", "chainId": 84, "height": 2185585, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: G2de3qtg6qec6pe4qd1Nq8FSwoqQFYrfjsS34p7S31Xr Next: 57oomHZowvc4bbyAq6vCSay5jsR46pp9aAPxKRFFQKy4 Diff:
OldNewDifferences
324324 let currentPriceX18 = calcPriceBigInt(priceBalanceX18, amountBalanceX18)
325325 let slippageRealX18 = fraction(abs((currentPriceX18 - userPriceX18)), scale18, currentPriceX18)
326326 let slippageX18 = toX18(slippageTolerance, scale8)
327- let validateSlippage = if (((if ((currentPriceX18 != zeroBigInt))
327+ if (if ((currentPriceX18 != zeroBigInt))
328328 then (slippageRealX18 > slippageX18)
329- else false) == true))
330- then true
331- else throwErr(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
332- if ((validateSlippage == validateSlippage))
333- then {
329+ else false)
330+ then throwErr(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
331+ else {
334332 let lpEmissionX18 = toX18(lpEmission, scale8)
335333 let prViaAmX18 = fraction(inAmountAssetAmountX18, currentPriceX18, scale18)
336334 let amViaPrX18 = fraction(inPriceAssetAmountX18, scale18, currentPriceX18)
342340 let lpAmountX18 = fraction(lpEmissionX18, expectedPriceAssetAmountX18, priceBalanceX18)
343341 $Tuple5(fromX18(lpAmountX18, scale8), fromX18(expectedAmountAssetAmountX18, decimals), fromX18(expectedPriceAssetAmountX18, decimals), currentPriceX18, slippageX18)
344342 }
345- else throw("Strict value is not equal to itself.")
346343 }
347344 let calculateLpAmount = r._1
348345 let calculateAmountAssetPayment = r._2
359356 else calculateLpAmount
360357 let amountDiff = (inAmountAssetAmount - calculateAmountAssetPayment)
361358 let priceDiff = (inPriceAssetAmount - calculatePriceAssetPayment)
362- let $t01622116480 = if (if (isOneAsset)
359+ let $t01618916448 = if (if (isOneAsset)
363360 then (paymentId == amountIdStr)
364361 else false)
365362 then $Tuple2(paymentAmount, 0)
368365 else false)
369366 then $Tuple2(0, paymentAmount)
370367 else $Tuple2(calculateAmountAssetPayment, calculatePriceAssetPayment)
371- let writeAmAmt = $t01622116480._1
372- let writePrAmt = $t01622116480._2
368+ let writeAmAmt = $t01618916448._1
369+ let writePrAmt = $t01618916448._2
373370 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))]
374371 $Tuple13(calculateLpAmount, emitLpAmount, currentPrice, amountBalance, priceBalance, lpEmission, lpAssetId, sts, commonState, amountDiff, priceDiff, inAmountAssetId, inPriceAssetId)
375372 }
646643 let payment = value(i.payments[0])
647644 let paymentAssetId = toBase58String(value(payment.assetId))
648645 let paymentAmountRaw = payment.amount
649- let $t02564925708 = takeFee(paymentAmountRaw)
650- let paymentAmount = $t02564925708._1
651- let feeAmount = $t02564925708._2
646+ let $t02561725676 = takeFee(paymentAmountRaw)
647+ let paymentAmount = $t02561725676._1
648+ let feeAmount = $t02561725676._2
652649 if (if (if ((amountAssetPart > paymentAmount))
653650 then true
654651 else (priceAssetPart > paymentAmount))
658655 else {
659656 let amountBalance = getAccBalance(amountId)
660657 let priceBalance = getAccBalance(priceId)
661- let $t02597226427 = if ((paymentAssetId == amountId))
658+ let $t02594026395 = if ((paymentAssetId == amountId))
662659 then $Tuple6((amountBalance - paymentAmount), priceBalance, (paymentAmount - amountAssetPart), priceAssetPart, 0, 0)
663660 else if ((paymentAssetId == priceId))
664661 then $Tuple6(amountBalance, (priceBalance - paymentAmount), 0, 0, (paymentAmount - priceAssetPart), amountAssetPart)
665662 else throwErr("wrong paymentAssetId")
666- let amountBalanceNow = $t02597226427._1
667- let priceBalanceNow = $t02597226427._2
668- let virtSwapInAm = $t02597226427._3
669- let virtSwapOutPr = $t02597226427._4
670- let virtSwapInPr = $t02597226427._5
671- let virtSwapOutAm = $t02597226427._6
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
672669 let D0 = invoke(gwxRewardContract, "calcD", [toString(amountBalanceNow), toString(priceBalanceNow), amplificator, Amult, Dconv], nil)
673670 let D1 = invoke(gwxRewardContract, "calcD", [toString(toBigInt(((amountBalanceNow + virtSwapInAm) - virtSwapOutAm))), toString(toBigInt(((priceBalanceNow + virtSwapInPr) - virtSwapOutPr))), amplificator, Amult, Dconv], nil)
674671 let D0vsD1 = validateD(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
796793 let estimPrAmt = r._2
797794 let amountBalance = getAccBalance(amountId)
798795 let priceBalance = getAccBalance(priceId)
799- let $t03156632034 = if ((outAssetId == amountId))
796+ let $t03153432002 = if ((outAssetId == amountId))
800797 then $Tuple7((amountBalance - estimAmAmt), (priceBalance - estimPrAmt), exchResult, estimPrAmt, 0, 0, (estimAmAmt + exchResult))
801798 else if ((outAssetId == priceId))
802799 then $Tuple7((amountBalance - estimAmAmt), (priceBalance - estimPrAmt), 0, 0, exchResult, estimAmAmt, (estimPrAmt + exchResult))
803800 else throwErr("wrong outAssetId")
804- let amountBalanceNow = $t03156632034._1
805- let priceBalanceNow = $t03156632034._2
806- let virtSwapInAm = $t03156632034._3
807- let virtSwapOutPr = $t03156632034._4
808- let virtSwapInPr = $t03156632034._5
809- let virtSwapOutAm = $t03156632034._6
810- let totalGet = $t03156632034._7
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
811808 if (if ((0 > virtSwapInAm))
812809 then true
813810 else (0 > virtSwapInPr))
821818 let finalRes = validateAbsDiff(toBigInt(totalGet), toBigInt(outAmount), toBigInt(slippage))
822819 if ((finalRes == finalRes))
823820 then {
824- let $t03270332811 = if ((outAssetId == amountId))
821+ let $t03267132779 = if ((outAssetId == amountId))
825822 then $Tuple2(toInt(finalRes._2), 0)
826823 else $Tuple2(0, toInt(finalRes._2))
827- let outAm = $t03270332811._1
828- let outPr = $t03270332811._2
824+ let outAm = $t03267132779._1
825+ let outPr = $t03267132779._2
829826 let totalAmountRaw = (outAm + outPr)
830- let $t03285132906 = takeFee(totalAmountRaw)
831- let totalAmount = $t03285132906._1
832- let feeAmount = $t03285132906._2
827+ let $t03281932874 = takeFee(totalAmountRaw)
828+ let totalAmount = $t03281932874._1
829+ let feeAmount = $t03281932874._2
833830 let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
834831 then unit
835832 else fromBase58String(outAssetId)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let scale8 = 100000000
55
66 let scale8BigInt = toBigInt(100000000)
77
88 let scale18 = toBigInt(1000000000000000000)
99
1010 let thousand = 1000
1111
1212 let zeroBigInt = toBigInt(0)
1313
1414 let oneBigInt = toBigInt(1)
1515
1616 let slippage4D = toBigInt((scale8 - ((scale8 * 1) / scale8)))
1717
1818 let Amult = "100"
1919
2020 let Dconv = "1"
2121
2222 let SEP = "__"
2323
2424 let EMPTY = ""
2525
2626 let PoolActive = 1
2727
2828 let PoolPutDis = 2
2929
3030 let PoolMatcherDis = 3
3131
3232 let PoolShutdown = 4
3333
3434 let idxPoolAddress = 1
3535
3636 let idxPoolSt = 2
3737
3838 let idxLPAsId = 3
3939
4040 let idxAmAsId = 4
4141
4242 let idxPrAsId = 5
4343
4444 let idxAmtAsDcm = 6
4545
4646 let idxPriceAsDcm = 7
4747
4848 let idxIAmtAsId = 8
4949
5050 let idxIPriceAsId = 9
5151
5252 let idxFactStakCntr = 1
5353
5454 let idxFactSlippCntr = 7
5555
5656 let idxFactGwxRewCntr = 10
5757
5858 let feePermilleDefault = 0
5959
6060 func toX18 (origVal,origScaleMult) = fraction(toBigInt(origVal), scale18, toBigInt(origScaleMult))
6161
6262
6363 func fromX18 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), scale18))
6464
6565
6666 func ts (amt,resScale,curScale) = fraction(amt, resScale, curScale)
6767
6868
6969 func abs (val) = if ((zeroBigInt > val))
7070 then -(val)
7171 else val
7272
7373
7474 func keyFactoryContact () = "%s__factoryContract"
7575
7676
7777 func keyManagerPublicKey () = "%s__managerPublicKey"
7878
7979
8080 func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
8181
8282
8383 func keyPriceLast () = "%s%s__price__last"
8484
8585
8686 func keyPriceHistory (h,t) = makeString(["%s%s%d%d__price__history", toString(h), toString(t)], SEP)
8787
8888
8989 func keyPutActionByUser (ua,txId) = ((("%s%s%s__P__" + ua) + "__") + txId)
9090
9191
9292 func keyGetActionByUser (ua,txId) = ((("%s%s%s__G__" + ua) + "__") + txId)
9393
9494
9595 func keyAmountAsset () = "%s__amountAsset"
9696
9797
9898 func keyPriceAsset () = "%s__priceAsset"
9999
100100
101101 func keyAmplificator () = "%s__amp"
102102
103103
104104 func keyAddonAddress () = "%s__addonAddr"
105105
106106
107107 let keyFeePermille = "%s__feePermille"
108108
109109 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
126126 func throwErr (msg) = throw(makeString(["lp_stable.ride:", msg], " "))
127127
128128
129129 func throwOrderError (orV,sendrV,matchV) = throwErr(((((("Failed: ordValid=" + toString(orV)) + " sndrValid=") + toString(sendrV)) + " mtchrValid=") + toString(matchV)))
130130
131131
132132 func str (val) = match val {
133133 case valStr: String =>
134134 valStr
135135 case _ =>
136136 throwErr("fail cast to String")
137137 }
138138
139139
140140 func getStringOrFail (addr,key) = valueOrErrorMessage(getString(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
141141
142142
143143 func getIntOrFail (addr,key) = valueOrErrorMessage(getInteger(addr, key), makeString(["mandatory ", toString(addr), ".", key, " not defined"], ""))
144144
145145
146146 let factoryContract = addressFromStringValue(getStringOrFail(this, keyFactoryContact()))
147147
148148 let amplificator = getStringOrFail(this, keyAmplificator())
149149
150150 func isGlobalShutdown () = valueOrElse(getBoolean(factoryContract, aps()), false)
151151
152152
153153 func getMatcherPubOrFail () = fromBase58String(getStringOrFail(factoryContract, mtpk()))
154154
155155
156156 let matcherAddress = addressFromPublicKey(getMatcherPubOrFail())
157157
158158 func getPoolConfig () = {
159159 let amtAs = getStringOrFail(this, keyAmountAsset())
160160 let priceAs = getStringOrFail(this, keyPriceAsset())
161161 let iPriceAs = getIntOrFail(factoryContract, mba(priceAs))
162162 let iAmtAs = getIntOrFail(factoryContract, mba(amtAs))
163163 split(getStringOrFail(factoryContract, pc(toString(iAmtAs), toString(iPriceAs))), SEP)
164164 }
165165
166166
167167 func getFactoryConfig () = split(getStringOrFail(factoryContract, fcfg()), SEP)
168168
169169
170170 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)
171171
172172
173173 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)
174174
175175
176176 func getAccBalance (assetId) = if ((assetId == "WAVES"))
177177 then wavesBalance(this).available
178178 else assetBalance(this, fromBase58String(assetId))
179179
180180
181181 func calcPriceBigInt (prAmtX18,amAmtX18) = fraction(prAmtX18, scale18, amAmtX18)
182182
183183
184184 func validateAbsDiff (estimateLP,outLp,slippage) = {
185185 let diff = fraction((estimateLP - outLp), scale8BigInt, outLp)
186186 let pass = ((slippage - abs(diff)) > zeroBigInt)
187187 if (!(pass))
188188 then throwErr(("Big slippage: " + toString(diff)))
189189 else $Tuple2(pass, min([estimateLP, outLp]))
190190 }
191191
192192
193193 func validateD (D1,D0,slippage) = {
194194 let diff = fraction(D0, scale8BigInt, D1)
195195 let fail = (slippage > diff)
196196 if (if (fail)
197197 then true
198198 else (D0 > D1))
199199 then throwErr(((((((toString(D0) + " ") + toString(D1)) + " ") + toString(diff)) + " ") + toString(slippage)))
200200 else fail
201201 }
202202
203203
204204 func privateCalcPrice (amAssetDcm,prAssetDcm,amAmt,prAmt) = {
205205 let amtAsAmtX18 = toX18(amAmt, amAssetDcm)
206206 let prAsAmtX18 = toX18(prAmt, prAssetDcm)
207207 calcPriceBigInt(prAsAmtX18, amtAsAmtX18)
208208 }
209209
210210
211211 func calcPrices (amAmt,prAmt,lpAmt) = {
212212 let cfg = getPoolConfig()
213213 let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
214214 let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
215215 let priceX18 = privateCalcPrice(amtAsDcm, prAsDcm, amAmt, prAmt)
216216 let amAmtX18 = toX18(amAmt, amtAsDcm)
217217 let prAmtX18 = toX18(prAmt, prAsDcm)
218218 let lpAmtX18 = toX18(lpAmt, scale8)
219219 let lpPrInAmAsX18 = calcPriceBigInt(amAmtX18, lpAmtX18)
220220 let lpPrInPrAsX18 = calcPriceBigInt(prAmtX18, lpAmtX18)
221221 [priceX18, lpPrInAmAsX18, lpPrInPrAsX18]
222222 }
223223
224224
225225 func calculatePrices (amAmt,prAmt,lpAmt) = {
226226 let p = calcPrices(amAmt, prAmt, lpAmt)
227227 [fromX18(p[0], scale8), fromX18(p[1], scale8), fromX18(p[2], scale8)]
228228 }
229229
230230
231231 func estimateGetOperation (txId58,paymentAssetId,paymentLpAmount,userAddress) = {
232232 let cfg = getPoolConfig()
233233 let lpAssetId = cfg[idxLPAsId]
234234 let amountId = cfg[idxAmAsId]
235235 let priceId = cfg[idxPrAsId]
236236 let amountDecimals = parseIntValue(cfg[idxAmtAsDcm])
237237 let priceDecimals = parseIntValue(cfg[idxPriceAsDcm])
238238 let sts = cfg[idxPoolSt]
239239 let lpEmission = valueOrErrorMessage(assetInfo(fromBase58String(lpAssetId)), "Wrong LP id").quantity
240240 let validationBlock = if ((lpAssetId == paymentAssetId))
241241 then true
242242 else throwErr("Wrong payment asset")
243243 if ((validationBlock == validationBlock))
244244 then {
245245 let decimals = if ((amountDecimals >= priceDecimals))
246246 then amountDecimals
247247 else priceDecimals
248248 if ((decimals == decimals))
249249 then {
250250 let amountBalance = getAccBalance(amountId)
251251 let amountBalanceX18 = toX18(amountBalance, decimals)
252252 let priceBalance = getAccBalance(priceId)
253253 let priceBalanceX18 = toX18(priceBalance, decimals)
254254 let currentPriceX18 = calcPriceBigInt(priceBalanceX18, amountBalanceX18)
255255 let curPrice = fromX18(currentPriceX18, scale8)
256256 let paymentLpAmountX18 = toX18(paymentLpAmount, scale8)
257257 let lpEmissionX18 = toX18(lpEmission, scale8)
258258 let outAmountAmountX18 = fraction(amountBalanceX18, paymentLpAmountX18, lpEmissionX18)
259259 let outPriceAmountX18 = fraction(priceBalanceX18, paymentLpAmountX18, lpEmissionX18)
260260 let outAmountAmount = fromX18(outAmountAmountX18, decimals)
261261 let outPriceAmount = fromX18(outPriceAmountX18, decimals)
262262 let state = if ((txId58 == ""))
263263 then nil
264264 else [ScriptTransfer(userAddress, outAmountAmount, if ((amountId == "WAVES"))
265265 then unit
266266 else fromBase58String(amountId)), ScriptTransfer(userAddress, outPriceAmount, if ((priceId == "WAVES"))
267267 then unit
268268 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)]
269269 $Tuple10(outAmountAmount, outPriceAmount, amountId, priceId, amountBalance, priceBalance, lpEmission, currentPriceX18, sts, state)
270270 }
271271 else throw("Strict value is not equal to itself.")
272272 }
273273 else throw("Strict value is not equal to itself.")
274274 }
275275
276276
277277 func estimatePutOperation (txId58,slippageTolerance,inAmountAssetAmount,inAmountAssetId,inPriceAssetAmount,inPriceAssetId,userAddress,isEvaluate,emitLp,isOneAsset,paymentAmount,paymentId) = {
278278 let cfg = getPoolConfig()
279279 let lpAssetId = fromBase58String(cfg[idxLPAsId])
280280 let amountIdStr = cfg[idxAmAsId]
281281 let priceIdStr = cfg[idxPrAsId]
282282 let inAmountIdStr = cfg[idxIAmtAsId]
283283 let inPriceIdStr = cfg[idxIPriceAsId]
284284 let amountDecimals = parseIntValue(cfg[idxAmtAsDcm])
285285 let priceDecimals = parseIntValue(cfg[idxPriceAsDcm])
286286 let sts = cfg[idxPoolSt]
287287 let lpEmission = valueOrErrorMessage(assetInfo(lpAssetId), "Wrong lp asset").quantity
288288 let amountBalance = if (isEvaluate)
289289 then getAccBalance(amountIdStr)
290290 else if (if (isOneAsset)
291291 then (paymentId == amountIdStr)
292292 else false)
293293 then (getAccBalance(amountIdStr) - paymentAmount)
294294 else if (isOneAsset)
295295 then getAccBalance(amountIdStr)
296296 else (getAccBalance(amountIdStr) - inAmountAssetAmount)
297297 let priceBalance = if (isEvaluate)
298298 then getAccBalance(priceIdStr)
299299 else if (if (isOneAsset)
300300 then (paymentId == priceIdStr)
301301 else false)
302302 then (getAccBalance(priceIdStr) - paymentAmount)
303303 else if (isOneAsset)
304304 then getAccBalance(priceIdStr)
305305 else (getAccBalance(priceIdStr) - inPriceAssetAmount)
306306 let decimals = if ((amountDecimals >= priceDecimals))
307307 then amountDecimals
308308 else priceDecimals
309309 if ((decimals == decimals))
310310 then {
311311 let inAmountAssetAmountX18 = toX18(inAmountAssetAmount, decimals)
312312 let inPriceAssetAmountX18 = toX18(inPriceAssetAmount, decimals)
313313 let userPriceX18 = calcPriceBigInt(inPriceAssetAmountX18, inAmountAssetAmountX18)
314314 let amountBalanceX18 = toX18(amountBalance, decimals)
315315 let priceBalanceX18 = toX18(priceBalance, decimals)
316316 let r = if ((lpEmission == 0))
317317 then {
318318 let currentPriceX18 = zeroBigInt
319319 let slippageX18 = zeroBigInt
320320 let lpAmountX18 = pow((inAmountAssetAmountX18 * inPriceAssetAmountX18), 0, toBigInt(5), 1, 0, DOWN)
321321 $Tuple5(fromX18(lpAmountX18, scale8), fromX18(inAmountAssetAmountX18, decimals), fromX18(inPriceAssetAmountX18, decimals), calcPriceBigInt((priceBalanceX18 + inPriceAssetAmountX18), (amountBalanceX18 + inAmountAssetAmountX18)), slippageX18)
322322 }
323323 else {
324324 let currentPriceX18 = calcPriceBigInt(priceBalanceX18, amountBalanceX18)
325325 let slippageRealX18 = fraction(abs((currentPriceX18 - userPriceX18)), scale18, currentPriceX18)
326326 let slippageX18 = toX18(slippageTolerance, scale8)
327- let validateSlippage = if (((if ((currentPriceX18 != zeroBigInt))
327+ if (if ((currentPriceX18 != zeroBigInt))
328328 then (slippageRealX18 > slippageX18)
329- else false) == true))
330- then true
331- else throwErr(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
332- if ((validateSlippage == validateSlippage))
333- then {
329+ else false)
330+ then throwErr(((("Price slippage " + toString(slippageRealX18)) + " > ") + toString(slippageX18)))
331+ else {
334332 let lpEmissionX18 = toX18(lpEmission, scale8)
335333 let prViaAmX18 = fraction(inAmountAssetAmountX18, currentPriceX18, scale18)
336334 let amViaPrX18 = fraction(inPriceAssetAmountX18, scale18, currentPriceX18)
337335 let expectedAmounts = if ((prViaAmX18 > inPriceAssetAmountX18))
338336 then $Tuple2(amViaPrX18, inAmountAssetAmountX18)
339337 else $Tuple2(inAmountAssetAmountX18, prViaAmX18)
340338 let expectedAmountAssetAmountX18 = expectedAmounts._1
341339 let expectedPriceAssetAmountX18 = expectedAmounts._2
342340 let lpAmountX18 = fraction(lpEmissionX18, expectedPriceAssetAmountX18, priceBalanceX18)
343341 $Tuple5(fromX18(lpAmountX18, scale8), fromX18(expectedAmountAssetAmountX18, decimals), fromX18(expectedPriceAssetAmountX18, decimals), currentPriceX18, slippageX18)
344342 }
345- else throw("Strict value is not equal to itself.")
346343 }
347344 let calculateLpAmount = r._1
348345 let calculateAmountAssetPayment = r._2
349346 let calculatePriceAssetPayment = r._3
350347 let currentPrice = fromX18(r._4, scale8)
351348 let slippageCalculate = fromX18(r._5, scale8)
352349 let checkCalcLpAmount = if ((calculateLpAmount > 0))
353350 then true
354351 else throwErr("LP <= 0")
355352 if ((checkCalcLpAmount == checkCalcLpAmount))
356353 then {
357354 let emitLpAmount = if (!(emitLp))
358355 then 0
359356 else calculateLpAmount
360357 let amountDiff = (inAmountAssetAmount - calculateAmountAssetPayment)
361358 let priceDiff = (inPriceAssetAmount - calculatePriceAssetPayment)
362- let $t01622116480 = if (if (isOneAsset)
359+ let $t01618916448 = if (if (isOneAsset)
363360 then (paymentId == amountIdStr)
364361 else false)
365362 then $Tuple2(paymentAmount, 0)
366363 else if (if (isOneAsset)
367364 then (paymentId == priceIdStr)
368365 else false)
369366 then $Tuple2(0, paymentAmount)
370367 else $Tuple2(calculateAmountAssetPayment, calculatePriceAssetPayment)
371- let writeAmAmt = $t01622116480._1
372- let writePrAmt = $t01622116480._2
368+ let writeAmAmt = $t01618916448._1
369+ let writePrAmt = $t01618916448._2
373370 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))]
374371 $Tuple13(calculateLpAmount, emitLpAmount, currentPrice, amountBalance, priceBalance, lpEmission, lpAssetId, sts, commonState, amountDiff, priceDiff, inAmountAssetId, inPriceAssetId)
375372 }
376373 else throw("Strict value is not equal to itself.")
377374 }
378375 else throw("Strict value is not equal to itself.")
379376 }
380377
381378
382379 func validateMatcherOrderAllowed (order) = {
383380 let cfg = getPoolConfig()
384381 let amtAsId = cfg[idxAmAsId]
385382 let prAsId = cfg[idxPrAsId]
386383 let sts = parseIntValue(cfg[idxPoolSt])
387384 let amtAsDcm = parseIntValue(cfg[idxAmtAsDcm])
388385 let prAsDcm = parseIntValue(cfg[idxPriceAsDcm])
389386 let accAmtAsBalance = getAccBalance(amtAsId)
390387 let accPrAsBalance = getAccBalance(prAsId)
391388 let currentPriceX18 = if ((order.orderType == Buy))
392389 then privateCalcPrice(amtAsDcm, prAsDcm, (accAmtAsBalance + order.amount), accPrAsBalance)
393390 else privateCalcPrice(amtAsDcm, prAsDcm, (accAmtAsBalance - order.amount), accPrAsBalance)
394391 let curPrice = fromX18(currentPriceX18, scale8)
395392 if (if (if (isGlobalShutdown())
396393 then true
397394 else (sts == PoolMatcherDis))
398395 then true
399396 else (sts == PoolShutdown))
400397 then throwErr("Admin blocked")
401398 else {
402399 let orAmtAsset = order.assetPair.amountAsset
403400 let orAmtAsStr = if ((orAmtAsset == unit))
404401 then "WAVES"
405402 else toBase58String(value(orAmtAsset))
406403 let orPrAsset = order.assetPair.priceAsset
407404 let orPrAsStr = if ((orPrAsset == unit))
408405 then "WAVES"
409406 else toBase58String(value(orPrAsset))
410407 if (if ((orAmtAsStr != amtAsId))
411408 then true
412409 else (orPrAsStr != prAsId))
413410 then throwErr("Wr assets")
414411 else {
415412 let orderPrice = order.price
416413 let priceDecimals = fraction(scale8, prAsDcm, amtAsDcm)
417414 let castOrderPrice = ts(orderPrice, scale8, priceDecimals)
418415 let isOrderPriceValid = if ((order.orderType == Buy))
419416 then (curPrice >= castOrderPrice)
420417 else (castOrderPrice >= curPrice)
421418 true
422419 }
423420 }
424421 }
425422
426423
427424 func commonGet (i) = {
428425 let checkPayments = if ((size(i.payments) == 1))
429426 then true
430427 else throwErr("1 payment expected")
431428 if ((checkPayments == checkPayments))
432429 then {
433430 let payment = value(i.payments[0])
434431 let paymentAssetId = value(payment.assetId)
435432 let paymentAmount = payment.amount
436433 let r = estimateGetOperation(toBase58String(i.transactionId), toBase58String(paymentAssetId), paymentAmount, i.caller)
437434 let outAmountAmount = r._1
438435 let outPriceAmount = r._2
439436 let sts = parseIntValue(r._9)
440437 let state = r._10
441438 if (if (isGlobalShutdown())
442439 then true
443440 else (sts == PoolShutdown))
444441 then throwErr(("Admin blocked: " + toString(sts)))
445442 else $Tuple5(outAmountAmount, outPriceAmount, paymentAmount, paymentAssetId, state)
446443 }
447444 else throw("Strict value is not equal to itself.")
448445 }
449446
450447
451448 func commonPut (caller,txId,amountAssetPayment,priceAssetPayment,slippage,emitLp,isOneAsset,paymentAmount,paymentId) = {
452449 let r = estimatePutOperation(txId, slippage, value(amountAssetPayment).amount, value(amountAssetPayment).assetId, value(priceAssetPayment).amount, value(priceAssetPayment).assetId, caller, false, emitLp, isOneAsset, paymentAmount, paymentId)
453450 let sts = parseIntValue(r._8)
454451 if (if (if (isGlobalShutdown())
455452 then true
456453 else (sts == PoolPutDis))
457454 then true
458455 else (sts == PoolShutdown))
459456 then throwErr(("Blocked:" + toString(sts)))
460457 else r
461458 }
462459
463460
464461 func takeFee (amount) = {
465462 let fee = fraction(amount, feePermille, thousand)
466463 $Tuple2((amount - fee), fee)
467464 }
468465
469466
470467 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
471468 case s: String =>
472469 fromBase58String(s)
473470 case _: Unit =>
474471 unit
475472 case _ =>
476473 throw("Match error")
477474 }
478475
479476
480477 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
481478 case s: String =>
482479 fromBase58String(s)
483480 case _: Unit =>
484481 unit
485482 case _ =>
486483 throw("Match error")
487484 }
488485
489486
490487 let pd = throwErr("Permission denied")
491488
492489 func mustManager (i) = match managerPublicKeyOrUnit() {
493490 case pk: ByteVector =>
494491 if ((i.callerPublicKey == pk))
495492 then true
496493 else pd
497494 case _: Unit =>
498495 if ((i.caller == this))
499496 then true
500497 else pd
501498 case _ =>
502499 throw("Match error")
503500 }
504501
505502
506503 @Callable(i)
507504 func constructor (factoryContract) = {
508505 let checkCaller = mustManager(i)
509506 if ((checkCaller == checkCaller))
510507 then [StringEntry(keyFactoryContact(), factoryContract)]
511508 else throw("Strict value is not equal to itself.")
512509 }
513510
514511
515512
516513 @Callable(i)
517514 func setManager (pendingManagerPublicKey) = {
518515 let checkCaller = mustManager(i)
519516 if ((checkCaller == checkCaller))
520517 then {
521518 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
522519 if ((checkManagerPublicKey == checkManagerPublicKey))
523520 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
524521 else throw("Strict value is not equal to itself.")
525522 }
526523 else throw("Strict value is not equal to itself.")
527524 }
528525
529526
530527
531528 @Callable(i)
532529 func confirmManager () = {
533530 let pm = pendingManagerPublicKeyOrUnit()
534531 let hasPM = if (isDefined(pm))
535532 then true
536533 else throwErr("No pending manager")
537534 if ((hasPM == hasPM))
538535 then {
539536 let checkPM = if ((i.callerPublicKey == value(pm)))
540537 then true
541538 else throwErr("You are not pending manager")
542539 if ((checkPM == checkPM))
543540 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
544541 else throw("Strict value is not equal to itself.")
545542 }
546543 else throw("Strict value is not equal to itself.")
547544 }
548545
549546
550547
551548 @Callable(i)
552549 func put (slippage,autoStake) = {
553550 let factCfg = getFactoryConfig()
554551 let stakingContract = valueOrErrorMessage(addressFromString(factCfg[idxFactStakCntr]), "Wrong staking contract")
555552 let slippageContract = valueOrErrorMessage(addressFromString(factCfg[idxFactSlippCntr]), "Wrogn slippage contract")
556553 let slippageCheck = if ((slippage >= 0))
557554 then true
558555 else throwErr("wrong slippage")
559556 if ((slippageCheck == slippageCheck))
560557 then {
561558 let paymentsCheck = if ((size(i.payments) == 2))
562559 then true
563560 else throwErr("2 payments expected")
564561 if ((paymentsCheck == paymentsCheck))
565562 then {
566563 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, "")
567564 let emitLpAmount = estimatePut._2
568565 let lpAssetId = estimatePut._7
569566 let state = estimatePut._9
570567 let amountDiff = estimatePut._10
571568 let priceDiff = estimatePut._11
572569 let amountId = estimatePut._12
573570 let priceId = estimatePut._13
574571 let r = invoke(factoryContract, "emit", [emitLpAmount], nil)
575572 if ((r == r))
576573 then {
577574 let el = match r {
578575 case legacy: Address =>
579576 invoke(legacy, "emit", [emitLpAmount], nil)
580577 case _ =>
581578 unit
582579 }
583580 if ((el == el))
584581 then {
585582 let sa = if ((amountDiff > 0))
586583 then invoke(slippageContract, "put", nil, [AttachedPayment(amountId, amountDiff)])
587584 else nil
588585 if ((sa == sa))
589586 then {
590587 let sp = if ((priceDiff > 0))
591588 then invoke(slippageContract, "put", nil, [AttachedPayment(priceId, priceDiff)])
592589 else nil
593590 if ((sp == sp))
594591 then {
595592 let lpTrasfer = if (autoStake)
596593 then {
597594 let ss = invoke(stakingContract, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmount)])
598595 if ((ss == ss))
599596 then nil
600597 else throw("Strict value is not equal to itself.")
601598 }
602599 else [ScriptTransfer(i.caller, emitLpAmount, lpAssetId)]
603600 (state ++ lpTrasfer)
604601 }
605602 else throw("Strict value is not equal to itself.")
606603 }
607604 else throw("Strict value is not equal to itself.")
608605 }
609606 else throw("Strict value is not equal to itself.")
610607 }
611608 else throw("Strict value is not equal to itself.")
612609 }
613610 else throw("Strict value is not equal to itself.")
614611 }
615612 else throw("Strict value is not equal to itself.")
616613 }
617614
618615
619616
620617 @Callable(i)
621618 func putOneTkn (amountAssetPart,priceAssetPart,outLp,slippage,autoStake) = {
622619 let cfg = getFactoryConfig()
623620 let stakingContract = valueOrErrorMessage(addressFromString(cfg[idxFactStakCntr]), "Wrong staking contract")
624621 let slippageContract = valueOrErrorMessage(addressFromString(cfg[idxFactSlippCntr]), "Wrong slippage contract")
625622 let gwxRewardContract = valueOrErrorMessage(addressFromString(cfg[idxFactGwxRewCntr]), "Wrong gwx reward contract")
626623 let poolCfg = getPoolConfig()
627624 let amountId = poolCfg[idxAmAsId]
628625 let priceId = poolCfg[idxPrAsId]
629626 let amountDecimals = parseIntValue(poolCfg[idxAmtAsDcm])
630627 let priceDecimals = parseIntValue(poolCfg[idxPriceAsDcm])
631628 let addon = valueOrElse(getString(this, keyAddonAddress()), "")
632629 let userAddress = if ((addon == toString(i.caller)))
633630 then i.originCaller
634631 else i.caller
635632 if (if (if (if ((0 >= slippage))
636633 then true
637634 else (0 >= amountAssetPart))
638635 then true
639636 else (0 >= priceAssetPart))
640637 then true
641638 else (0 >= outLp))
642639 then throwErr("Wrong params")
643640 else if ((size(i.payments) != 1))
644641 then throwErr("1 payment expected")
645642 else {
646643 let payment = value(i.payments[0])
647644 let paymentAssetId = toBase58String(value(payment.assetId))
648645 let paymentAmountRaw = payment.amount
649- let $t02564925708 = takeFee(paymentAmountRaw)
650- let paymentAmount = $t02564925708._1
651- let feeAmount = $t02564925708._2
646+ let $t02561725676 = takeFee(paymentAmountRaw)
647+ let paymentAmount = $t02561725676._1
648+ let feeAmount = $t02561725676._2
652649 if (if (if ((amountAssetPart > paymentAmount))
653650 then true
654651 else (priceAssetPart > paymentAmount))
655652 then true
656653 else (10000000 > paymentAmount))
657654 then throwErr("wrong payment amount")
658655 else {
659656 let amountBalance = getAccBalance(amountId)
660657 let priceBalance = getAccBalance(priceId)
661- let $t02597226427 = if ((paymentAssetId == amountId))
658+ let $t02594026395 = if ((paymentAssetId == amountId))
662659 then $Tuple6((amountBalance - paymentAmount), priceBalance, (paymentAmount - amountAssetPart), priceAssetPart, 0, 0)
663660 else if ((paymentAssetId == priceId))
664661 then $Tuple6(amountBalance, (priceBalance - paymentAmount), 0, 0, (paymentAmount - priceAssetPart), amountAssetPart)
665662 else throwErr("wrong paymentAssetId")
666- let amountBalanceNow = $t02597226427._1
667- let priceBalanceNow = $t02597226427._2
668- let virtSwapInAm = $t02597226427._3
669- let virtSwapOutPr = $t02597226427._4
670- let virtSwapInPr = $t02597226427._5
671- let virtSwapOutAm = $t02597226427._6
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
672669 let D0 = invoke(gwxRewardContract, "calcD", [toString(amountBalanceNow), toString(priceBalanceNow), amplificator, Amult, Dconv], nil)
673670 let D1 = invoke(gwxRewardContract, "calcD", [toString(toBigInt(((amountBalanceNow + virtSwapInAm) - virtSwapOutAm))), toString(toBigInt(((priceBalanceNow + virtSwapInPr) - virtSwapOutPr))), amplificator, Amult, Dconv], nil)
674671 let D0vsD1 = validateD(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
675672 if ((D0vsD1 == D0vsD1))
676673 then {
677674 let estimatePut = commonPut(toString(i.caller), toBase58String(i.transactionId), AttachedPayment(fromBase58String(amountId), amountAssetPart), AttachedPayment(fromBase58String(priceId), priceAssetPart), slippage, true, true, paymentAmount, paymentAssetId)
678675 let estimateLP = estimatePut._2
679676 let lpAssetId = estimatePut._7
680677 let state = estimatePut._9
681678 let amountDiff = estimatePut._10
682679 let priceDiff = estimatePut._11
683680 let lpCalcRes = validateAbsDiff(toBigInt(estimateLP), toBigInt(outLp), toBigInt(slippage))
684681 let emitLpAmount = toInt(lpCalcRes._2)
685682 let e = invoke(factoryContract, "emit", [emitLpAmount], nil)
686683 if ((e == e))
687684 then {
688685 let el = match e {
689686 case legacy: Address =>
690687 invoke(legacy, "emit", [emitLpAmount], nil)
691688 case _ =>
692689 unit
693690 }
694691 if ((el == el))
695692 then {
696693 let sa = if ((amountDiff > 0))
697694 then invoke(slippageContract, "put", nil, [AttachedPayment(fromBase58String(amountId), amountDiff)])
698695 else nil
699696 if ((sa == sa))
700697 then {
701698 let sp = if ((priceDiff > 0))
702699 then invoke(slippageContract, "put", nil, [AttachedPayment(fromBase58String(priceId), priceDiff)])
703700 else nil
704701 if ((sp == sp))
705702 then {
706703 let lpTrasfer = if (autoStake)
707704 then {
708705 let ss = invoke(stakingContract, "stake", nil, [AttachedPayment(lpAssetId, emitLpAmount)])
709706 if ((ss == ss))
710707 then nil
711708 else throw("Strict value is not equal to itself.")
712709 }
713710 else [ScriptTransfer(i.caller, emitLpAmount, lpAssetId)]
714711 let sendFeeToMatcher = if ((feeAmount > 0))
715712 then [ScriptTransfer(matcherAddress, feeAmount, fromBase58String(paymentAssetId))]
716713 else nil
717714 ((state ++ lpTrasfer) ++ sendFeeToMatcher)
718715 }
719716 else throw("Strict value is not equal to itself.")
720717 }
721718 else throw("Strict value is not equal to itself.")
722719 }
723720 else throw("Strict value is not equal to itself.")
724721 }
725722 else throw("Strict value is not equal to itself.")
726723 }
727724 else throw("Strict value is not equal to itself.")
728725 }
729726 }
730727 }
731728
732729
733730
734731 @Callable(i)
735732 func putForFree (maxslippage) = if ((0 > maxslippage))
736733 then throwErr("wrong slippage")
737734 else if ((size(i.payments) != 2))
738735 then throwErr("2 payments expected")
739736 else {
740737 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, "")
741738 estimatePut._9
742739 }
743740
744741
745742
746743 @Callable(i)
747744 func get () = {
748745 let r = commonGet(i)
749746 let outAmtAmt = r._1
750747 let outPriceAmount = r._2
751748 let paymentAmount = r._3
752749 let paymentAssetId = r._4
753750 let state = r._5
754751 let b = invoke(factoryContract, "burn", [paymentAmount], [AttachedPayment(paymentAssetId, paymentAmount)])
755752 if ((b == b))
756753 then state
757754 else throw("Strict value is not equal to itself.")
758755 }
759756
760757
761758
762759 @Callable(i)
763760 func getOneTkn (exchResult,notUsed,outAmount,outAssetId,slippage) = if ((size(i.payments) != 1))
764761 then throwErr("1 payment expected")
765762 else {
766763 let cfg = getPoolConfig()
767764 let lpAssetId = cfg[idxLPAsId]
768765 let amountId = cfg[idxAmAsId]
769766 let priceId = cfg[idxPrAsId]
770767 let amountDecimals = parseIntValue(cfg[idxAmtAsDcm])
771768 let priceDecimals = parseIntValue(cfg[idxPriceAsDcm])
772769 let sts = cfg[idxPoolSt]
773770 let factCfg = getFactoryConfig()
774771 let gwxRewardContract = valueOrErrorMessage(addressFromString(factCfg[idxFactGwxRewCntr]), "Wrong gwxRewardContract address")
775772 let payment = value(i.payments[0])
776773 let addon = valueOrElse(getString(this, keyAddonAddress()), "")
777774 let userAddress = if ((addon == toString(i.caller)))
778775 then i.originCaller
779776 else i.caller
780777 let txId58 = toBase58String(i.transactionId)
781778 let paymentAssetId = value(payment.assetId)
782779 let paymentAmount = payment.amount
783780 if ((1000000000 > paymentAmount))
784781 then throwErr("Min payment 10 LP")
785782 else if (if (if ((0 > slippage))
786783 then true
787784 else (0 > exchResult))
788785 then true
789786 else (0 > outAmount))
790787 then throwErr("Wrong params")
791788 else if ((lpAssetId != toBase58String(paymentAssetId)))
792789 then throwErr("Wrong LP")
793790 else {
794791 let r = estimateGetOperation(toBase58String(i.transactionId), toBase58String(paymentAssetId), paymentAmount, i.caller)
795792 let estimAmAmt = r._1
796793 let estimPrAmt = r._2
797794 let amountBalance = getAccBalance(amountId)
798795 let priceBalance = getAccBalance(priceId)
799- let $t03156632034 = if ((outAssetId == amountId))
796+ let $t03153432002 = if ((outAssetId == amountId))
800797 then $Tuple7((amountBalance - estimAmAmt), (priceBalance - estimPrAmt), exchResult, estimPrAmt, 0, 0, (estimAmAmt + exchResult))
801798 else if ((outAssetId == priceId))
802799 then $Tuple7((amountBalance - estimAmAmt), (priceBalance - estimPrAmt), 0, 0, exchResult, estimAmAmt, (estimPrAmt + exchResult))
803800 else throwErr("wrong outAssetId")
804- let amountBalanceNow = $t03156632034._1
805- let priceBalanceNow = $t03156632034._2
806- let virtSwapInAm = $t03156632034._3
807- let virtSwapOutPr = $t03156632034._4
808- let virtSwapInPr = $t03156632034._5
809- let virtSwapOutAm = $t03156632034._6
810- let totalGet = $t03156632034._7
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
811808 if (if ((0 > virtSwapInAm))
812809 then true
813810 else (0 > virtSwapInPr))
814811 then throwErr("Wrong calc")
815812 else {
816813 let D0 = invoke(gwxRewardContract, "calcD", [toString(amountBalanceNow), toString(priceBalanceNow), amplificator, Amult, Dconv], nil)
817814 let D1 = invoke(gwxRewardContract, "calcD", [toString(((amountBalanceNow - virtSwapInAm) + virtSwapOutAm)), toString(((priceBalanceNow + virtSwapOutPr) - virtSwapInPr)), amplificator, Amult, Dconv], nil)
818815 let D0vsD1 = validateD(parseBigIntValue(str(D1)), parseBigIntValue(str(D0)), slippage4D)
819816 if ((D0vsD1 == D0vsD1))
820817 then {
821818 let finalRes = validateAbsDiff(toBigInt(totalGet), toBigInt(outAmount), toBigInt(slippage))
822819 if ((finalRes == finalRes))
823820 then {
824- let $t03270332811 = if ((outAssetId == amountId))
821+ let $t03267132779 = if ((outAssetId == amountId))
825822 then $Tuple2(toInt(finalRes._2), 0)
826823 else $Tuple2(0, toInt(finalRes._2))
827- let outAm = $t03270332811._1
828- let outPr = $t03270332811._2
824+ let outAm = $t03267132779._1
825+ let outPr = $t03267132779._2
829826 let totalAmountRaw = (outAm + outPr)
830- let $t03285132906 = takeFee(totalAmountRaw)
831- let totalAmount = $t03285132906._1
832- let feeAmount = $t03285132906._2
827+ let $t03281932874 = takeFee(totalAmountRaw)
828+ let totalAmount = $t03281932874._1
829+ let feeAmount = $t03281932874._2
833830 let outAssetIdOrWaves = if ((outAssetId == "WAVES"))
834831 then unit
835832 else fromBase58String(outAssetId)
836833 let sendFeeToMatcher = if ((feeAmount > 0))
837834 then [ScriptTransfer(matcherAddress, feeAmount, outAssetIdOrWaves)]
838835 else nil
839836 let decimals = if ((amountDecimals >= priceDecimals))
840837 then amountDecimals
841838 else priceDecimals
842839 if ((decimals == decimals))
843840 then {
844841 let curPrX18 = calcPriceBigInt(toX18(priceBalance, decimals), toX18(amountBalance, decimals))
845842 let curPr = fromX18(curPrX18, scale8)
846843 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)]
847844 if ((state == state))
848845 then {
849846 let burn = invoke(factoryContract, "burn", [paymentAmount], [AttachedPayment(paymentAssetId, paymentAmount)])
850847 if ((burn == burn))
851848 then (state ++ sendFeeToMatcher)
852849 else throw("Strict value is not equal to itself.")
853850 }
854851 else throw("Strict value is not equal to itself.")
855852 }
856853 else throw("Strict value is not equal to itself.")
857854 }
858855 else throw("Strict value is not equal to itself.")
859856 }
860857 else throw("Strict value is not equal to itself.")
861858 }
862859 }
863860 }
864861
865862
866863
867864 @Callable(i)
868865 func getNoLess (noLessThenAmtAsset,noLessThenPriceAsset) = {
869866 let r = commonGet(i)
870867 let outAmountAmount = r._1
871868 let outPriceAmount = r._2
872869 let paymentAmount = r._3
873870 let paymentAssetId = r._4
874871 let state = r._5
875872 let checkOutAmountAmount = if ((outAmountAmount >= noLessThenAmtAsset))
876873 then true
877874 else throwErr(((("Failed: " + toString(outAmountAmount)) + " < ") + toString(noLessThenAmtAsset)))
878875 if ((checkOutAmountAmount == checkOutAmountAmount))
879876 then {
880877 let checkOutPriceAmount = if ((outPriceAmount >= noLessThenPriceAsset))
881878 then true
882879 else throwErr(((("Failed: " + toString(outPriceAmount)) + " < ") + toString(noLessThenPriceAsset)))
883880 if ((checkOutPriceAmount == checkOutPriceAmount))
884881 then {
885882 let burnLPAssetOnFactory = invoke(factoryContract, "burn", [paymentAmount], [AttachedPayment(paymentAssetId, paymentAmount)])
886883 if ((burnLPAssetOnFactory == burnLPAssetOnFactory))
887884 then state
888885 else throw("Strict value is not equal to itself.")
889886 }
890887 else throw("Strict value is not equal to itself.")
891888 }
892889 else throw("Strict value is not equal to itself.")
893890 }
894891
895892
896893
897894 @Callable(i)
898895 func unstakeAndGet (amount) = {
899896 let checkPayments = if ((size(i.payments) != 0))
900897 then throwErr("no payments expected")
901898 else true
902899 if ((checkPayments == checkPayments))
903900 then {
904901 let cfg = getPoolConfig()
905902 let factoryCfg = getFactoryConfig()
906903 let lpAssetId = fromBase58String(cfg[idxLPAsId])
907904 let staking = valueOrErrorMessage(addressFromString(factoryCfg[idxFactStakCntr]), "wrong")
908905 let unstakeInv = invoke(staking, "unstake", [toBase58String(lpAssetId), amount], nil)
909906 if ((unstakeInv == unstakeInv))
910907 then {
911908 let r = estimateGetOperation(toBase58String(i.transactionId), toBase58String(lpAssetId), amount, i.caller)
912909 let sts = parseIntValue(r._9)
913910 let state = r._10
914911 let v = if (if (isGlobalShutdown())
915912 then true
916913 else (sts == PoolShutdown))
917914 then throwErr(("Blocked: " + toString(sts)))
918915 else true
919916 if ((v == v))
920917 then {
921918 let burnA = invoke(factoryContract, "burn", [amount], [AttachedPayment(lpAssetId, amount)])
922919 if ((burnA == burnA))
923920 then state
924921 else throw("Strict value is not equal to itself.")
925922 }
926923 else throw("Strict value is not equal to itself.")
927924 }
928925 else throw("Strict value is not equal to itself.")
929926 }
930927 else throw("Strict value is not equal to itself.")
931928 }
932929
933930
934931
935932 @Callable(i)
936933 func activate (amtAsStr,prAsStr) = if ((toString(i.caller) != toString(factoryContract)))
937934 then throwErr("denied")
938935 else $Tuple2([StringEntry(keyAmountAsset(), amtAsStr), StringEntry(keyPriceAsset(), prAsStr)], "success")
939936
940937
941938
942939 @Callable(i)
943940 func setS (k,v) = if ((toString(i.caller) != getStringOrFail(this, keyAddonAddress())))
944941 then pd
945942 else [StringEntry(k, v)]
946943
947944
948945
949946 @Callable(i)
950947 func setI (k,v) = if ((toString(i.caller) != getStringOrFail(this, keyAddonAddress())))
951948 then pd
952949 else [IntegerEntry(k, v)]
953950
954951
955952
956953 @Callable(i)
957954 func getPoolConfigWrapperREADONLY () = $Tuple2(nil, getPoolConfig())
958955
959956
960957
961958 @Callable(i)
962959 func getAccBalanceWrapperREADONLY (assetId) = $Tuple2(nil, getAccBalance(assetId))
963960
964961
965962
966963 @Callable(i)
967964 func calcPricesWrapperREADONLY (amAmt,prAmt,lpAmt) = {
968965 let pr = calcPrices(amAmt, prAmt, lpAmt)
969966 $Tuple2(nil, [toString(pr[0]), toString(pr[1]), toString(pr[2])])
970967 }
971968
972969
973970
974971 @Callable(i)
975972 func fromX18WrapperREADONLY (val,resScaleMult) = $Tuple2(nil, fromX18(parseBigIntValue(val), resScaleMult))
976973
977974
978975
979976 @Callable(i)
980977 func toX18WrapperREADONLY (origVal,origScaleMult) = $Tuple2(nil, toString(toX18(origVal, origScaleMult)))
981978
982979
983980
984981 @Callable(i)
985982 func calcPriceBigIntWrapperREADONLY (prAmtX18,amAmtX18) = $Tuple2(nil, toString(calcPriceBigInt(parseBigIntValue(prAmtX18), parseBigIntValue(amAmtX18))))
986983
987984
988985
989986 @Callable(i)
990987 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, ""))
991988
992989
993990
994991 @Callable(i)
995992 func estimateGetOperationWrapperREADONLY (txId58,paymentAsId,paymentLpAmount,usrAddr) = {
996993 let r = estimateGetOperation(txId58, paymentAsId, paymentLpAmount, addressFromStringValue(usrAddr))
997994 $Tuple2(nil, $Tuple10(r._1, r._2, r._3, r._4, r._5, r._6, r._7, toString(r._8), r._9, r._10))
998995 }
999996
1000997
1001998 @Verifier(tx)
1002999 func verify () = match tx {
10031000 case order: Order =>
10041001 let mtchPub = getMatcherPubOrFail()
10051002 let orV = validateMatcherOrderAllowed(order)
10061003 let sndrV = sigVerify(order.bodyBytes, order.proofs[0], order.senderPublicKey)
10071004 let mtchV = sigVerify(order.bodyBytes, order.proofs[1], mtchPub)
10081005 if (if (if (orV)
10091006 then sndrV
10101007 else false)
10111008 then mtchV
10121009 else false)
10131010 then true
10141011 else throwOrderError(orV, sndrV, mtchV)
10151012 case _ =>
10161013 let targetPublicKey = match managerPublicKeyOrUnit() {
10171014 case pk: ByteVector =>
10181015 pk
10191016 case _: Unit =>
10201017 tx.senderPublicKey
10211018 case _ =>
10221019 throw("Match error")
10231020 }
10241021 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
10251022 }
10261023

github/deemru/w8io/c3f4982 
109.42 ms