tx · D3JjRWutre32Zb5g5R72BVEmue31JMX2Ki4A36cF1ZTu

3N9yYa7DXfSFLkgzWHmwzTpwd21GUxQApy9:  -0.05000000 Waves

2021.08.12 17:27 [1655270] smart account 3N9yYa7DXfSFLkgzWHmwzTpwd21GUxQApy9 > SELF 0.00000000 Waves

{ "type": 13, "id": "D3JjRWutre32Zb5g5R72BVEmue31JMX2Ki4A36cF1ZTu", "fee": 5000000, "feeAssetId": null, "timestamp": 1628778530784, "version": 2, "chainId": 84, "sender": "3N9yYa7DXfSFLkgzWHmwzTpwd21GUxQApy9", "senderPublicKey": "AzWZ4rwReUMi2EBexU5XceFGKPvTcfdkZnygszAEtnYv", "proofs": [ "2mWYtSaPwkjJnbyNLeeW8whJASDBsk2qY2u6g2QDo7rAN7zGshbFW7YceFpQs2d7n3JomZnCQemtNz3WPeoMyKaC" ], "script": "base64:AAIFAAAAAAAAABcIAhIDCgEBEgASBwoFCAgICAESAwoBAQAAACoAAAAACmxQZGVjaW1hbHMAAAAAAAAAAAgAAAAAEWRlY2ltYWxzTXVsdFByaWNlCQAAaAAAAAIJAABoAAAAAgAAAAAAAAAAZAAAAAAAAAAD6AAAAAAAAAAD6AAAAAADU0VQAgAAAAJfXwAAAAAKUG9vbEFjdGl2ZQAAAAAAAAAAAQAAAAAPUG9vbFB1dERpc2FibGVkAAAAAAAAAAACAAAAABNQb29sTWF0Y2hlckRpc2FibGVkAAAAAAAAAAADAAAAAAxQb29sU2h1dGRvd24AAAAAAAAAAAQAAAAAEGZhY3RvcnlQdWJsaWNLZXkJAAJZAAAAAQIAAAAsNnBKa3J3Zld5aFpqbTNMb1FXUmpqTlZhTHQ1Q1F6cWZnZ3pYeXFyN25yd0EAAAAADmlkeFBvb2xBZGRyZXNzAAAAAAAAAAABAAAAAA1pZHhQb29sU3RhdHVzAAAAAAAAAAACAAAAABBpZHhQb29sTFBBc3NldElkAAAAAAAAAAADAAAAABBpZHhBbW91bnRBc3NldElkAAAAAAAAAAAEAAAAAA9pZHhQcmljZUFzc2V0SWQAAAAAAAAAAAUAAAAAFmlkeEFtb3VudEFzc2V0RGVjaW1hbHMAAAAAAAAAAAYAAAAAFWlkeFByaWNlQXNzZXREZWNpbWFscwAAAAAAAAAABwAAAAAYaWR4QW1vdW50QXNzZXRJbnRlcm5hbElkAAAAAAAAAAAIAAAAABdpZHhQcmljZUFzc2V0SW50ZXJuYWxJZAAAAAAAAAAACQAAAAANaWR4UG9vbFdlaWdodAAAAAAAAAAACgAAAAAVaWR4UG9vbEFtb3VudEFzc2V0QW10AAAAAAAAAAABAAAAABRpZHhQb29sUHJpY2VBc3NldEFtdAAAAAAAAAAAAgAAAAARaWR4UG9vbExQQXNzZXRBbXQAAAAAAAAAAAMBAAAADGtleVByaWNlTGFzdAAAAAACAAAAESVzJXNfX3ByaWNlX19sYXN0AQAAAA9rZXlQcmljZUhpc3RvcnkAAAACAAAAAWgAAAAJdGltZXN0YW1wCQAEuQAAAAIJAARMAAAAAgIAAAAYJXMlcyVkJWRfX3ByaWNlX19oaXN0b3J5CQAETAAAAAIJAAGkAAAAAQUAAAABaAkABEwAAAACCQABpAAAAAEFAAAACXRpbWVzdGFtcAUAAAADbmlsBQAAAANTRVABAAAAEGtleVBvb2xMaXF1aWRpdHkAAAACAAAAE2ludGVybmFsQW1vdW50QXNzZXQAAAASaW50ZXJuYWxQcmljZUFzc2V0CQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACCVkJWQlc19fBQAAABNpbnRlcm5hbEFtb3VudEFzc2V0AgAAAAJfXwUAAAASaW50ZXJuYWxQcmljZUFzc2V0AgAAAAhfX2xvY2tlZAEAAAAWa2V5UG9vbExpcXVpZGl0eUJ5VXNlcgAAAAMAAAATaW50ZXJuYWxBbW91bnRBc3NldAAAABJpbnRlcm5hbFByaWNlQXNzZXQAAAALdXNlckFkZHJlc3MJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACiVkJWQlcyVzX18FAAAAE2ludGVybmFsQW1vdW50QXNzZXQCAAAAAl9fBQAAABJpbnRlcm5hbFByaWNlQXNzZXQCAAAAAl9fBQAAAAt1c2VyQWRkcmVzcwIAAAAIX19sb2NrZWQBAAAAEmtleVB1dEFjdGlvbkJ5VXNlcgAAAAIAAAALdXNlckFkZHJlc3MAAAAEdHhJZAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAALJXMlcyVzX19QX18FAAAAC3VzZXJBZGRyZXNzAgAAAAJfXwUAAAAEdHhJZAEAAAASa2V5R2V0QWN0aW9uQnlVc2VyAAAAAgAAAAt1c2VyQWRkcmVzcwAAAAR0eElkCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAslcyVzJXNfX0dfXwUAAAALdXNlckFkZHJlc3MCAAAAAl9fBQAAAAR0eElkAQAAAClrZXlNYXBwaW5nUG9vbENvbnRyYWN0QWRkcmVzc1RvUG9vbEFzc2V0cwAAAAEAAAATcG9vbENvbnRyYWN0QWRkcmVzcwkAASwAAAACCQABLAAAAAICAAAACCVzJXMlc19fBQAAABNwb29sQ29udHJhY3RBZGRyZXNzAgAAACBfX21hcHBpbmdzX19wb29sQ29udHJhY3QyTHBBc3NldAEAAAANa2V5UG9vbENvbmZpZwAAAAIAAAATYW1vdW50QXNzZXRJbnRlcm5hbAAAABJwcmljZUFzc2V0SW50ZXJuYWwJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAIJWQlZCVzX18FAAAAE2Ftb3VudEFzc2V0SW50ZXJuYWwCAAAAAl9fBQAAABJwcmljZUFzc2V0SW50ZXJuYWwCAAAACF9fY29uZmlnAQAAAA1nZXRQb29sQ29uZmlnAAAAAAQAAAAOZmFjdG9yeUFkZHJlc3MJAQAAABRhZGRyZXNzRnJvbVB1YmxpY0tleQAAAAEFAAAAEGZhY3RvcnlQdWJsaWNLZXkEAAAAEWN1cnJlbnRQb29sQXNzZXRzCQAEtQAAAAIJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAA5mYWN0b3J5QWRkcmVzcwkBAAAAKWtleU1hcHBpbmdQb29sQ29udHJhY3RBZGRyZXNzVG9Qb29sQXNzZXRzAAAAAQkABCUAAAABBQAAAAR0aGlzAgAAAClObyBmYWN0b3J5IGNvbmZpZyBmb3VuZCBmb3IgcG9vbCBhZGRyZXNzLgUAAAADU0VQBAAAABFjdXJyZW50UG9vbENvbmZpZwkABLUAAAACCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAOZmFjdG9yeUFkZHJlc3MJAQAAAA1rZXlQb29sQ29uZmlnAAAAAgkAAZEAAAACBQAAABFjdXJyZW50UG9vbEFzc2V0cwAAAAAAAAAAAQkAAZEAAAACBQAAABFjdXJyZW50UG9vbEFzc2V0cwAAAAAAAAAAAgIAAAAoTm8gZmFjdG9yeSBjb25maWcgZm91bmQgZm9yIHBvb2wgYXNzZXRzLgUAAAADU0VQBQAAABFjdXJyZW50UG9vbENvbmZpZwEAAAAQZ2V0UG9vbExpcXVpZGl0eQAAAAIAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkBAAAABljdXJyZW50UG9vbExpcXVpZGl0eVZhbHVlCQAEIgAAAAEJAQAAABBrZXlQb29sTGlxdWlkaXR5AAAAAgUAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkBQAAABRwcmljZUFzc2V0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AAAAEWFtb3VudEFzc2V0TG9ja2VkCQAETAAAAAIJAAGkAAAAAQUAAAAQcHJpY2VBc3NldExvY2tlZAkABEwAAAACCQABpAAAAAEFAAAADWxwVG9rZW5Mb2NrZWQFAAAAA25pbAUAAAADU0VQAQAAAA1nZXRTY3JpcHRIYXNoAAAAAAkAAloAAAABCQEAAAAFdmFsdWUAAAABCQAD8QAAAAEFAAAABHRoaXMBAAAAHHByaXZhdGVDYXN0QXNzZXRUb0xQRGVjaW1hbHMAAAACAAAADWFzc2V0RGVjaW1hbHMAAAALYXNzZXRBbW91bnQEAAAADGRlY2ltYWxzTXVsdAkAAGwAAAAGAAAAAAAAAAAKAAAAAAAAAAAACQAAZQAAAAIFAAAACmxQZGVjaW1hbHMFAAAADWFzc2V0RGVjaW1hbHMAAAAAAAAAAAAAAAAAAAAAAAAFAAAABERPV04JAAUUAAAAAgkAAGgAAAACBQAAAAthc3NldEFtb3VudAUAAAAMZGVjaW1hbHNNdWx0BQAAAAxkZWNpbWFsc011bHQBAAAAFXByaXZhdGVDYWxjdWxhdGVQcmljZQAAAAQAAAASYW1vdXRBc3NldERlY2ltYWxzAAAAEnByaWNlQXNzZXREZWNpbWFscwAAAA5hbW91bnRBc3NldEFtdAAAAA1wcmljZUFzc2V0QW10BAAAABhhbW91bnRBc3NldFBvb2xMb2NrZWRBbXQICQEAAAAccHJpdmF0ZUNhc3RBc3NldFRvTFBEZWNpbWFscwAAAAIFAAAAEmFtb3V0QXNzZXREZWNpbWFscwUAAAAOYW1vdW50QXNzZXRBbXQAAAACXzEEAAAAF3ByaWNlQXNzZXRQb29sTG9ja2VkQW10CAkBAAAAHHByaXZhdGVDYXN0QXNzZXRUb0xQRGVjaW1hbHMAAAACBQAAABJwcmljZUFzc2V0RGVjaW1hbHMFAAAADXByaWNlQXNzZXRBbXQAAAACXzEJAABrAAAAAwUAAAAXcHJpY2VBc3NldFBvb2xMb2NrZWRBbXQFAAAAEWRlY2ltYWxzTXVsdFByaWNlBQAAABhhbW91bnRBc3NldFBvb2xMb2NrZWRBbXQBAAAAGHByaXZhdGVHZXRQb29sU3RhdGlzdGljcwAAAAAEAAAAEnBvb2xDb25maWdEYXRhTGlzdAkBAAAADWdldFBvb2xDb25maWcAAAAABAAAAAlscEFzc2V0SWQJAAJZAAAAAQkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAEGlkeFBvb2xMUEFzc2V0SWQEAAAADWFtb3VudEFzc2V0SWQJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABBpZHhBbW91bnRBc3NldElkBAAAAAxwcmljZUFzc2V0SWQJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAAA9pZHhQcmljZUFzc2V0SWQEAAAAFWFtb3VudEFzc2V0SW50ZXJuYWxJZAkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAGGlkeEFtb3VudEFzc2V0SW50ZXJuYWxJZAQAAAAUcHJpY2VBc3NldEludGVybmFsSWQJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABdpZHhQcmljZUFzc2V0SW50ZXJuYWxJZAQAAAASYW1vdXRBc3NldERlY2ltYWxzCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAScG9vbENvbmZpZ0RhdGFMaXN0BQAAABZpZHhBbW91bnRBc3NldERlY2ltYWxzBAAAABJwcmljZUFzc2V0RGVjaW1hbHMJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAFWlkeFByaWNlQXNzZXREZWNpbWFscwQAAAAVcG9vbExpcXVpZGl0eURhdGFMaXN0CQEAAAAQZ2V0UG9vbExpcXVpZGl0eQAAAAIFAAAAFWFtb3VudEFzc2V0SW50ZXJuYWxJZAUAAAAUcHJpY2VBc3NldEludGVybmFsSWQEAAAAFnBvb2xBbW91bnRBc3NldEJhbGFuY2UJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABVwb29sTGlxdWlkaXR5RGF0YUxpc3QFAAAAFWlkeFBvb2xBbW91bnRBc3NldEFtdAQAAAAVcG9vbFByaWNlQXNzZXRCYWxhbmNlCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAVcG9vbExpcXVpZGl0eURhdGFMaXN0BQAAABRpZHhQb29sUHJpY2VBc3NldEFtdAQAAAANcG9vbExQQmFsYW5jZQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAFXBvb2xMaXF1aWRpdHlEYXRhTGlzdAUAAAARaWR4UG9vbExQQXNzZXRBbXQEAAAAGGFtb3VudEFzc2V0UG9vbExvY2tlZEFtdAgJAQAAABxwcml2YXRlQ2FzdEFzc2V0VG9MUERlY2ltYWxzAAAAAgUAAAASYW1vdXRBc3NldERlY2ltYWxzBQAAABZwb29sQW1vdW50QXNzZXRCYWxhbmNlAAAAAl8xBAAAABdwcmljZUFzc2V0UG9vbExvY2tlZEFtdAgJAQAAABxwcml2YXRlQ2FzdEFzc2V0VG9MUERlY2ltYWxzAAAAAgUAAAAScHJpY2VBc3NldERlY2ltYWxzBQAAABVwb29sUHJpY2VBc3NldEJhbGFuY2UAAAACXzEEAAAAFGxwUHJpY2VJbkFtb3VudEFzc2V0CQAAawAAAAMFAAAAGGFtb3VudEFzc2V0UG9vbExvY2tlZEFtdAkAAGgAAAACAAAAAAAAAAABBQAAABFkZWNpbWFsc011bHRQcmljZQUAAAANcG9vbExQQmFsYW5jZQQAAAATbHBQcmljZUluUHJpY2VBc3NldAkAAGsAAAADBQAAABdwcmljZUFzc2V0UG9vbExvY2tlZEFtdAkAAGgAAAACAAAAAAAAAAABBQAAABFkZWNpbWFsc011bHRQcmljZQUAAAANcG9vbExQQmFsYW5jZQQAAAAMY3VycmVudFByaWNlCQEAAAAVcHJpdmF0ZUNhbGN1bGF0ZVByaWNlAAAABAUAAAASYW1vdXRBc3NldERlY2ltYWxzBQAAABJwcmljZUFzc2V0RGVjaW1hbHMFAAAAFnBvb2xBbW91bnRBc3NldEJhbGFuY2UFAAAAFXBvb2xQcmljZUFzc2V0QmFsYW5jZQkABEwAAAACBQAAABZwb29sQW1vdW50QXNzZXRCYWxhbmNlCQAETAAAAAIFAAAAFXBvb2xQcmljZUFzc2V0QmFsYW5jZQkABEwAAAACBQAAAA1wb29sTFBCYWxhbmNlCQAETAAAAAIFAAAADGN1cnJlbnRQcmljZQkABEwAAAACBQAAABRscFByaWNlSW5BbW91bnRBc3NldAkABEwAAAACBQAAABNscFByaWNlSW5QcmljZUFzc2V0BQAAAANuaWwBAAAAG3ByaXZhdGVFc3RpbWF0ZUdldE9wZXJhdGlvbgAAAAMAAAAQcGF5bWVudExwQXNzZXRJZAAAAA9wYXltZW50THBBbW91bnQAAAALdXNlckFkZHJlc3MEAAAADnBvb2xDb25maWdMaXN0CQEAAAANZ2V0UG9vbENvbmZpZwAAAAAEAAAACWxwQXNzZXRJZAkAAZEAAAACBQAAAA5wb29sQ29uZmlnTGlzdAUAAAAQaWR4UG9vbExQQXNzZXRJZAQAAAANYW1vdW50QXNzZXRJZAkAAZEAAAACBQAAAA5wb29sQ29uZmlnTGlzdAUAAAAQaWR4QW1vdW50QXNzZXRJZAQAAAAMcHJpY2VBc3NldElkCQABkQAAAAIFAAAADnBvb2xDb25maWdMaXN0BQAAAA9pZHhQcmljZUFzc2V0SWQEAAAAFWFtb3VudEFzc2V0SW50ZXJuYWxJZAkAAZEAAAACBQAAAA5wb29sQ29uZmlnTGlzdAUAAAAYaWR4QW1vdW50QXNzZXRJbnRlcm5hbElkBAAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAkAAZEAAAACBQAAAA5wb29sQ29uZmlnTGlzdAUAAAAXaWR4UHJpY2VBc3NldEludGVybmFsSWQEAAAAEmFtb3V0QXNzZXREZWNpbWFscwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAADnBvb2xDb25maWdMaXN0BQAAABZpZHhBbW91bnRBc3NldERlY2ltYWxzBAAAABJwcmljZUFzc2V0RGVjaW1hbHMJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAA5wb29sQ29uZmlnTGlzdAUAAAAVaWR4UHJpY2VBc3NldERlY2ltYWxzBAAAABF1c2VyTGlxdWlkaXR5TGlzdAkBAAAAFmdldFBvb2xMaXF1aWRpdHlCeVVzZXIAAAADBQAAABVhbW91bnRBc3NldEludGVybmFsSWQFAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkBQAAAAt1c2VyQWRkcmVzcwQAAAANdXNlckxQQmFsYW5jZQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAEXVzZXJMaXF1aWRpdHlMaXN0BQAAABFpZHhQb29sTFBBc3NldEFtdAQAAAAWdXNlckFtb3VudEFzc2V0QmFsYW5jZQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAEXVzZXJMaXF1aWRpdHlMaXN0BQAAABVpZHhQb29sQW1vdW50QXNzZXRBbXQEAAAAFXVzZXJQcmljZUFzc2V0QmFsYW5jZQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAEXVzZXJMaXF1aWRpdHlMaXN0BQAAABRpZHhQb29sUHJpY2VBc3NldEFtdAQAAAARcG9vbExpcXVpZGl0eUxpc3QJAQAAABBnZXRQb29sTGlxdWlkaXR5AAAAAgUAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkBQAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAQAAAANcG9vbExQQmFsYW5jZQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAEXBvb2xMaXF1aWRpdHlMaXN0BQAAABFpZHhQb29sTFBBc3NldEFtdAQAAAAWcG9vbEFtb3VudEFzc2V0QmFsYW5jZQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAEXBvb2xMaXF1aWRpdHlMaXN0BQAAABVpZHhQb29sQW1vdW50QXNzZXRBbXQEAAAAFXBvb2xQcmljZUFzc2V0QmFsYW5jZQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAEXBvb2xMaXF1aWRpdHlMaXN0BQAAABRpZHhQb29sUHJpY2VBc3NldEFtdAMJAQAAAAIhPQAAAAIFAAAACWxwQXNzZXRJZAUAAAAQcGF5bWVudExwQXNzZXRJZAkAAAIAAAABAgAAABVJbnZhbGlkIGFzc2V0IHBhc3NlZC4DCQAAZgAAAAIFAAAAD3BheW1lbnRMcEFtb3VudAUAAAANdXNlckxQQmFsYW5jZQkAAAIAAAABAgAAADJJbnZhbGlkIGFtb3VudCBwYXNzZWQuIEFtb3VudCBsZXNzIHRoYW4gYXZhaWxhYmxlLgQAAAAYYW1vdW50QXNzZXRQb29sTG9ja2VkQW10CAkBAAAAHHByaXZhdGVDYXN0QXNzZXRUb0xQRGVjaW1hbHMAAAACBQAAABJhbW91dEFzc2V0RGVjaW1hbHMFAAAAFnBvb2xBbW91bnRBc3NldEJhbGFuY2UAAAACXzEEAAAAF3ByaWNlQXNzZXRQb29sTG9ja2VkQW10CAkBAAAAHHByaXZhdGVDYXN0QXNzZXRUb0xQRGVjaW1hbHMAAAACBQAAABJwcmljZUFzc2V0RGVjaW1hbHMFAAAAFXBvb2xQcmljZUFzc2V0QmFsYW5jZQAAAAJfMQQAAAARb3V0QW1vdW50QXNzZXRBbXQJAABrAAAAAwUAAAAYYW1vdW50QXNzZXRQb29sTG9ja2VkQW10BQAAAA9wYXltZW50THBBbW91bnQFAAAADXBvb2xMUEJhbGFuY2UEAAAAEG91dFByaWNlQXNzZXRBbXQJAABrAAAAAwUAAAAXcHJpY2VBc3NldFBvb2xMb2NrZWRBbXQFAAAAD3BheW1lbnRMcEFtb3VudAUAAAANcG9vbExQQmFsYW5jZQQAAAAMY3VycmVudFByaWNlCQAAawAAAAMFAAAAF3ByaWNlQXNzZXRQb29sTG9ja2VkQW10BQAAABFkZWNpbWFsc011bHRQcmljZQUAAAAYYW1vdW50QXNzZXRQb29sTG9ja2VkQW10CQAFIAAAAA4FAAAADWFtb3VudEFzc2V0SWQFAAAADHByaWNlQXNzZXRJZAUAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkBQAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAUAAAAWdXNlckFtb3VudEFzc2V0QmFsYW5jZQUAAAARb3V0QW1vdW50QXNzZXRBbXQFAAAAFXVzZXJQcmljZUFzc2V0QmFsYW5jZQUAAAAQb3V0UHJpY2VBc3NldEFtdAUAAAARb3V0QW1vdW50QXNzZXRBbXQFAAAADXVzZXJMUEJhbGFuY2UFAAAAFnBvb2xBbW91bnRBc3NldEJhbGFuY2UFAAAAFXBvb2xQcmljZUFzc2V0QmFsYW5jZQUAAAANcG9vbExQQmFsYW5jZQUAAAAMY3VycmVudFByaWNlAQAAABtwcml2YXRlRXN0aW1hdGVQdXRPcGVyYXRpb24AAAAGAAAAEXNsaXBwYWdlVG9sZXJhbmNlAAAAEGluQW1vdW50QXNzZXRBbXQAAAAPaW5BbW91bnRBc3NldElkAAAAD2luUHJpY2VBc3NldEFtdAAAAA5pblByaWNlQXNzZXRJZAAAAAt1c2VyQWRkcmVzcwQAAAAScG9vbENvbmZpZ0RhdGFMaXN0CQEAAAANZ2V0UG9vbENvbmZpZwAAAAAEAAAACWxwQXNzZXRJZAkAAlkAAAABCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAQaWR4UG9vbExQQXNzZXRJZAQAAAANYW1vdW50QXNzZXRJZAkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAEGlkeEFtb3VudEFzc2V0SWQEAAAADHByaWNlQXNzZXRJZAkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAD2lkeFByaWNlQXNzZXRJZAQAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAYaWR4QW1vdW50QXNzZXRJbnRlcm5hbElkBAAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAF2lkeFByaWNlQXNzZXRJbnRlcm5hbElkBAAAABJhbW91dEFzc2V0RGVjaW1hbHMJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABJwb29sQ29uZmlnRGF0YUxpc3QFAAAAFmlkeEFtb3VudEFzc2V0RGVjaW1hbHMEAAAAEnByaWNlQXNzZXREZWNpbWFscwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAEnBvb2xDb25maWdEYXRhTGlzdAUAAAAVaWR4UHJpY2VBc3NldERlY2ltYWxzBAAAABVwb29sTGlxdWlkaXR5RGF0YUxpc3QJAQAAABBnZXRQb29sTGlxdWlkaXR5AAAAAgUAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkBQAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAQAAAAWcG9vbEFtb3VudEFzc2V0QmFsYW5jZQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAFXBvb2xMaXF1aWRpdHlEYXRhTGlzdAUAAAAVaWR4UG9vbEFtb3VudEFzc2V0QW10BAAAABVwb29sUHJpY2VBc3NldEJhbGFuY2UJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABVwb29sTGlxdWlkaXR5RGF0YUxpc3QFAAAAFGlkeFBvb2xQcmljZUFzc2V0QW10BAAAAA1wb29sTFBCYWxhbmNlCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAVcG9vbExpcXVpZGl0eURhdGFMaXN0BQAAABFpZHhQb29sTFBBc3NldEFtdAQAAAAVdXNlckxpcXVpZGl0eURhdGFMaXN0CQEAAAAWZ2V0UG9vbExpcXVpZGl0eUJ5VXNlcgAAAAMFAAAAFWFtb3VudEFzc2V0SW50ZXJuYWxJZAUAAAAUcHJpY2VBc3NldEludGVybmFsSWQFAAAAC3VzZXJBZGRyZXNzBAAAABZ1c2VyQW1vdW50QXNzZXRCYWxhbmNlCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAVdXNlckxpcXVpZGl0eURhdGFMaXN0BQAAABVpZHhQb29sQW1vdW50QXNzZXRBbXQEAAAAFXVzZXJQcmljZUFzc2V0QmFsYW5jZQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAFXVzZXJMaXF1aWRpdHlEYXRhTGlzdAUAAAAUaWR4UG9vbFByaWNlQXNzZXRBbXQEAAAADXVzZXJMUEJhbGFuY2UJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABV1c2VyTGlxdWlkaXR5RGF0YUxpc3QFAAAAEWlkeFBvb2xMUEFzc2V0QW10AwMJAQAAAAIhPQAAAAIFAAAADWFtb3VudEFzc2V0SWQFAAAAD2luQW1vdW50QXNzZXRJZAYJAQAAAAIhPQAAAAIFAAAADHByaWNlQXNzZXRJZAUAAAAOaW5QcmljZUFzc2V0SWQJAAACAAAAAQIAAAAlSW52YWxpZCBhbW91bnQgb3IgcHJpY2UgYXNzZXQgcGFzc2VkLgQAAAAfaW5BbW91bnRBc3NldEFtdENhbGN1bGF0ZWRUdXBsZQkBAAAAHHByaXZhdGVDYXN0QXNzZXRUb0xQRGVjaW1hbHMAAAACBQAAABJhbW91dEFzc2V0RGVjaW1hbHMFAAAAEGluQW1vdW50QXNzZXRBbXQEAAAAHmluUHJpY2VBc3NldEFtdENhbGN1bGF0ZWRUdXBsZQkBAAAAHHByaXZhdGVDYXN0QXNzZXRUb0xQRGVjaW1hbHMAAAACBQAAABJwcmljZUFzc2V0RGVjaW1hbHMFAAAAD2luUHJpY2VBc3NldEFtdAQAAAAaaW5BbW91bnRBc3NldEFtdENhbGN1bGF0ZWQIBQAAAB9pbkFtb3VudEFzc2V0QW10Q2FsY3VsYXRlZFR1cGxlAAAAAl8xBAAAABlpblByaWNlQXNzZXRBbXRDYWxjdWxhdGVkCAUAAAAeaW5QcmljZUFzc2V0QW10Q2FsY3VsYXRlZFR1cGxlAAAAAl8xBAAAAAl1c2VyUHJpY2UJAABrAAAAAwUAAAAZaW5QcmljZUFzc2V0QW10Q2FsY3VsYXRlZAUAAAARZGVjaW1hbHNNdWx0UHJpY2UFAAAAGmluQW1vdW50QXNzZXRBbXRDYWxjdWxhdGVkBAAAABhhbW91bnRBc3NldFBvb2xMb2NrZWRBbXQJAABoAAAAAgUAAAAWcG9vbEFtb3VudEFzc2V0QmFsYW5jZQgFAAAAH2luQW1vdW50QXNzZXRBbXRDYWxjdWxhdGVkVHVwbGUAAAACXzIEAAAAF3ByaWNlQXNzZXRQb29sTG9ja2VkQW10CQAAaAAAAAIFAAAAFXBvb2xQcmljZUFzc2V0QmFsYW5jZQgFAAAAHmluUHJpY2VBc3NldEFtdENhbGN1bGF0ZWRUdXBsZQAAAAJfMgQAAAALY3VyZW50UHJpY2UDCQAAAAAAAAIFAAAADXBvb2xMUEJhbGFuY2UAAAAAAAAAAAAAAAAAAAAAAAAJAABrAAAAAwUAAAAXcHJpY2VBc3NldFBvb2xMb2NrZWRBbXQFAAAAEWRlY2ltYWxzTXVsdFByaWNlBQAAABhhbW91bnRBc3NldFBvb2xMb2NrZWRBbXQEAAAAC291dExwQW1vdW50AwkAAAAAAAACBQAAAA1wb29sTFBCYWxhbmNlAAAAAAAAAAAABAAAAAVwYXJ0QQkAAGwAAAAGBQAAABppbkFtb3VudEFzc2V0QW10Q2FsY3VsYXRlZAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAQAAAAAAAAAAAAUAAAAERE9XTgQAAAAFcGFydEIJAABsAAAABgUAAAAZaW5QcmljZUFzc2V0QW10Q2FsY3VsYXRlZAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAQAAAAAAAAAAAAUAAAAERE9XTgkAAGgAAAACBQAAAAVwYXJ0QQUAAAAFcGFydEIEAAAACHNsaXBwYWdlCQAAawAAAAMFAAAAC2N1cmVudFByaWNlAAAAAAAAAABkBQAAAAl1c2VyUHJpY2UDCQAAZgAAAAIFAAAACHNsaXBwYWdlBQAAABFzbGlwcGFnZVRvbGVyYW5jZQkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAA9QcmljZSBzbGlwcGFnZSAJAAGkAAAAAQUAAAAIc2xpcHBhZ2UCAAAAHiBleGNlZWRlZCB0aGUgcGFzc2VkIGxpbWl0IG9mIAkAAaQAAAABBQAAABFzbGlwcGFnZVRvbGVyYW5jZQQAAAASbHBBbXRCeUFtb3VudEFzc2V0CQAAawAAAAMFAAAADXBvb2xMUEJhbGFuY2UFAAAAGmluQW1vdW50QXNzZXRBbXRDYWxjdWxhdGVkBQAAABhhbW91bnRBc3NldFBvb2xMb2NrZWRBbXQEAAAAEWxwQW10QnlQcmljZUFzc2V0CQAAawAAAAMFAAAADXBvb2xMUEJhbGFuY2UFAAAAGWluUHJpY2VBc3NldEFtdENhbGN1bGF0ZWQFAAAAF3ByaWNlQXNzZXRQb29sTG9ja2VkQW10AwkAAGYAAAACBQAAABFscEFtdEJ5UHJpY2VBc3NldAUAAAASbHBBbXRCeUFtb3VudEFzc2V0BQAAABJscEFtdEJ5QW1vdW50QXNzZXQFAAAAEWxwQW10QnlQcmljZUFzc2V0CQAFHQAAAAsFAAAAC291dExwQW1vdW50BQAAAAtjdXJlbnRQcmljZQUAAAAWdXNlckFtb3VudEFzc2V0QmFsYW5jZQUAAAAVdXNlclByaWNlQXNzZXRCYWxhbmNlBQAAAA11c2VyTFBCYWxhbmNlBQAAABZwb29sQW1vdW50QXNzZXRCYWxhbmNlBQAAABVwb29sUHJpY2VBc3NldEJhbGFuY2UFAAAADXBvb2xMUEJhbGFuY2UFAAAAFWFtb3VudEFzc2V0SW50ZXJuYWxJZAUAAAAUcHJpY2VBc3NldEludGVybmFsSWQFAAAACWxwQXNzZXRJZAAAAAQAAAABaQEAAAADcHV0AAAAAQAAABFzbGlwcGFnZVRvbGVyYW5jZQQAAAAOcG10QW1vdW50QXNzZXQJAQAAAAV2YWx1ZQAAAAEJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAEAAAAEGluQW1vdW50QXNzZXRBbXQIBQAAAA5wbXRBbW91bnRBc3NldAAAAAZhbW91bnQDBgkAAAIAAAABAgAAAAhhc3NldCA9IAQAAAAPaW5BbW91bnRBc3NldElkAwkBAAAAASEAAAABCQEAAAAJaXNEZWZpbmVkAAAAAQUAAAAOcG10QW1vdW50QXNzZXQJAAJZAAAAAQIAAAAACQAAAgAAAAECAAAABGRkZGQEAAAADXBtdFByaWNlQXNzZXQJAQAAAAV2YWx1ZQAAAAEJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEEAAAAD2luUHJpY2VBc3NldEFtdAgFAAAADXBtdFByaWNlQXNzZXQAAAAGYW1vdW50BAAAAA5pblByaWNlQXNzZXRJZAkBAAAABXZhbHVlAAAAAQgFAAAADXBtdFByaWNlQXNzZXQAAAAHYXNzZXRJZAQAAAATZXN0aW1hdGVkUHV0UmVzdWx0cwkBAAAAG3ByaXZhdGVFc3RpbWF0ZVB1dE9wZXJhdGlvbgAAAAYFAAAAEXNsaXBwYWdlVG9sZXJhbmNlBQAAABBpbkFtb3VudEFzc2V0QW10CQACWAAAAAEFAAAAD2luQW1vdW50QXNzZXRJZAUAAAAPaW5QcmljZUFzc2V0QW10CQACWAAAAAEFAAAADmluUHJpY2VBc3NldElkCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAALb3V0THBBbW91bnQIBQAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzAAAAAl8xBAAAAAtjdXJlbnRQcmljZQgFAAAAE2VzdGltYXRlZFB1dFJlc3VsdHMAAAACXzIEAAAAFnVzZXJBbW91bnRBc3NldEJhbGFuY2UIBQAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzAAAAAl8zBAAAABV1c2VyUHJpY2VBc3NldEJhbGFuY2UIBQAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzAAAAAl80BAAAAA11c2VyTFBCYWxhbmNlCAUAAAATZXN0aW1hdGVkUHV0UmVzdWx0cwAAAAJfNQQAAAAWcG9vbEFtb3VudEFzc2V0QmFsYW5jZQgFAAAAE2VzdGltYXRlZFB1dFJlc3VsdHMAAAACXzYEAAAAFXBvb2xQcmljZUFzc2V0QmFsYW5jZQgFAAAAE2VzdGltYXRlZFB1dFJlc3VsdHMAAAACXzcEAAAADXBvb2xMUEJhbGFuY2UIBQAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzAAAAAl84BAAAABVhbW91bnRBc3NldEludGVybmFsSWQIBQAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzAAAAAl85BAAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAgFAAAAE2VzdGltYXRlZFB1dFJlc3VsdHMAAAADXzEwBAAAAAlscEFzc2V0SWQIBQAAABNlc3RpbWF0ZWRQdXRSZXN1bHRzAAAAA18xMQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAMa2V5UHJpY2VMYXN0AAAAAAkAASwAAAACAgAAAAQlc19fCQABpAAAAAEFAAAAC2N1cmVudFByaWNlCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAA9rZXlQcmljZUhpc3RvcnkAAAACBQAAAAZoZWlnaHQIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wCQABLAAAAAICAAAABCVzX18JAAGkAAAAAQUAAAALY3VyZW50UHJpY2UJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEmtleVB1dEFjdGlvbkJ5VXNlcgAAAAIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyCQACWAAAAAEIBQAAAAFpAAAADXRyYW5zYWN0aW9uSWQJAQAAABFkYXRhUHV0QWN0aW9uSW5mbwAAAAcFAAAAEGluQW1vdW50QXNzZXRBbXQFAAAAD2luUHJpY2VBc3NldEFtdAUAAAALb3V0THBBbW91bnQFAAAAC2N1cmVudFByaWNlBQAAABFzbGlwcGFnZVRvbGVyYW5jZQUAAAAGaGVpZ2h0CAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAWa2V5UG9vbExpcXVpZGl0eUJ5VXNlcgAAAAMFAAAAFWFtb3VudEFzc2V0SW50ZXJuYWxJZAUAAAAUcHJpY2VBc3NldEludGVybmFsSWQJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyCQEAAAARZGF0YVBvb2xMaXF1aWRpdHkAAAADCQAAZAAAAAIFAAAAFnVzZXJBbW91bnRBc3NldEJhbGFuY2UFAAAAEGluQW1vdW50QXNzZXRBbXQJAABkAAAAAgUAAAAVdXNlclByaWNlQXNzZXRCYWxhbmNlBQAAAA9pblByaWNlQXNzZXRBbXQJAABkAAAAAgUAAAANdXNlckxQQmFsYW5jZQUAAAALb3V0THBBbW91bnQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEGtleVBvb2xMaXF1aWRpdHkAAAACBQAAABVhbW91bnRBc3NldEludGVybmFsSWQFAAAAFHByaWNlQXNzZXRJbnRlcm5hbElkCQEAAAARZGF0YVBvb2xMaXF1aWRpdHkAAAADCQAAZAAAAAIFAAAAFnBvb2xBbW91bnRBc3NldEJhbGFuY2UFAAAAEGluQW1vdW50QXNzZXRBbXQJAABkAAAAAgUAAAAVcG9vbFByaWNlQXNzZXRCYWxhbmNlBQAAAA9pblByaWNlQXNzZXRBbXQJAABkAAAAAgUAAAANcG9vbExQQmFsYW5jZQUAAAALb3V0THBBbW91bnQJAARMAAAAAgkBAAAAB1JlaXNzdWUAAAADBQAAAAlscEFzc2V0SWQFAAAAC291dExwQW1vdW50BgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAAC291dExwQW1vdW50BQAAAAlscEFzc2V0SWQFAAAAA25pbAAAAAFpAQAAAANnZXQAAAAABAAAAA5wbXRBbW91bnRBc3NldAkBAAAABXZhbHVlAAAAAQkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAQAAAAKcG10QXNzZXRJZAkBAAAABXZhbHVlAAAAAQgFAAAADnBtdEFtb3VudEFzc2V0AAAAB2Fzc2V0SWQEAAAADnBtdEFzc2V0QW1vdW50CAUAAAAOcG10QW1vdW50QXNzZXQAAAAGYW1vdW50BAAAAAdyZXN1bHRzCQEAAAAbcHJpdmF0ZUVzdGltYXRlR2V0T3BlcmF0aW9uAAAAAwkAAlgAAAABBQAAAApwbXRBc3NldElkBQAAAA5wbXRBc3NldEFtb3VudAkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAADWFtb3VudEFzc2V0SWQIBQAAAAdyZXN1bHRzAAAAAl8xBAAAAAxwcmljZUFzc2V0SWQIBQAAAAdyZXN1bHRzAAAAAl8yBAAAABVhbW91bnRBc3NldEludGVybmFsSWQIBQAAAAdyZXN1bHRzAAAAAl8zBAAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAgFAAAAB3Jlc3VsdHMAAAACXzQEAAAAFnVzZXJBbW91bnRBc3NldEJhbGFuY2UIBQAAAAdyZXN1bHRzAAAAAl81BAAAABFvdXRBbW91bnRBc3NldEFtdAgFAAAAB3Jlc3VsdHMAAAACXzYEAAAAFXVzZXJQcmljZUFzc2V0QmFsYW5jZQgFAAAAB3Jlc3VsdHMAAAACXzcEAAAAEG91dFByaWNlQXNzZXRBbXQIBQAAAAdyZXN1bHRzAAAAAl84BAAAAA11c2VyTFBCYWxhbmNlCAUAAAAHcmVzdWx0cwAAAAJfOQQAAAAWcG9vbEFtb3VudEFzc2V0QmFsYW5jZQgFAAAAB3Jlc3VsdHMAAAADXzExBAAAABVwb29sUHJpY2VBc3NldEJhbGFuY2UIBQAAAAdyZXN1bHRzAAAAA18xMgQAAAANcG9vbExQQmFsYW5jZQgFAAAAB3Jlc3VsdHMAAAADXzEzBAAAAAxjdXJyZW50UHJpY2UIBQAAAAdyZXN1bHRzAAAAA18xNAkABEwAAAACCQEAAAAEQnVybgAAAAIFAAAACnBtdEFzc2V0SWQFAAAADnBtdEFzc2V0QW1vdW50CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAARb3V0QW1vdW50QXNzZXRBbXQJAAJZAAAAAQUAAAANYW1vdW50QXNzZXRJZAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAAEG91dFByaWNlQXNzZXRBbXQJAAJZAAAAAQUAAAAMcHJpY2VBc3NldElkCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABZrZXlQb29sTGlxdWlkaXR5QnlVc2VyAAAAAwUAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkBQAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIJAQAAABFkYXRhUG9vbExpcXVpZGl0eQAAAAMJAABlAAAAAgUAAAAWdXNlckFtb3VudEFzc2V0QmFsYW5jZQUAAAARb3V0QW1vdW50QXNzZXRBbXQJAABlAAAAAgUAAAAVdXNlclByaWNlQXNzZXRCYWxhbmNlBQAAABBvdXRQcmljZUFzc2V0QW10CQAAZQAAAAIFAAAADXVzZXJMUEJhbGFuY2UFAAAADnBtdEFzc2V0QW1vdW50CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABBrZXlQb29sTGlxdWlkaXR5AAAAAgUAAAAVYW1vdW50QXNzZXRJbnRlcm5hbElkBQAAABRwcmljZUFzc2V0SW50ZXJuYWxJZAkBAAAAEWRhdGFQb29sTGlxdWlkaXR5AAAAAwkAAGUAAAACBQAAABZwb29sQW1vdW50QXNzZXRCYWxhbmNlBQAAABFvdXRBbW91bnRBc3NldEFtdAkAAGUAAAACBQAAABVwb29sUHJpY2VBc3NldEJhbGFuY2UFAAAAEG91dFByaWNlQXNzZXRBbXQJAABlAAAAAgUAAAANcG9vbExQQmFsYW5jZQUAAAAOcG10QXNzZXRBbW91bnQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEmtleUdldEFjdGlvbkJ5VXNlcgAAAAIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyCQACWAAAAAEIBQAAAAFpAAAADXRyYW5zYWN0aW9uSWQJAQAAABFkYXRhR2V0QWN0aW9uSW5mbwAAAAYFAAAAEW91dEFtb3VudEFzc2V0QW10BQAAABBvdXRQcmljZUFzc2V0QW10BQAAAA5wbXRBc3NldEFtb3VudAUAAAAMY3VycmVudFByaWNlBQAAAAZoZWlnaHQIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAxrZXlQcmljZUxhc3QAAAAACQABLAAAAAICAAAABCVzX18JAAGkAAAAAQUAAAAMY3VycmVudFByaWNlCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAA9rZXlQcmljZUhpc3RvcnkAAAACBQAAAAZoZWlnaHQIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wCQABLAAAAAICAAAABCVzX18JAAGkAAAAAQUAAAAMY3VycmVudFByaWNlBQAAAANuaWwAAAABaQEAAAAIYWN0aXZhdGUAAAAFAAAADmFtb3VudEFzc2V0U3RyAAAADXByaWNlQXNzZXRTdHIAAAALbHBBc3NldE5hbWUAAAAMbHBBc3NldERlc2NyAAAACnBvb2xXZWlnaHQDCQEAAAACIT0AAAACCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkFAAAAEGZhY3RvcnlQdWJsaWNLZXkJAAACAAAAAQIAAAAScGVybWlzc2lvbnMgZGVuaWVkBAAAAA1hbW91bnRBc3NldElkCQACWQAAAAEFAAAADmFtb3VudEFzc2V0U3RyBAAAABNhbW91bnRBc3NldERlY2ltYWxzCAkBAAAABXZhbHVlAAAAAQkAA+wAAAABBQAAAA1hbW91bnRBc3NldElkAAAACGRlY2ltYWxzBAAAAAxwcmljZUFzc2V0SWQJAAJZAAAAAQUAAAANcHJpY2VBc3NldFN0cgQAAAAScHJpY2VBc3NldERlY2ltYWxzCAkBAAAABXZhbHVlAAAAAQkAA+wAAAABBQAAAAxwcmljZUFzc2V0SWQAAAAIZGVjaW1hbHMEAAAAEmxwQXNzZXRJc3N1ZUFjdGlvbgkABEIAAAAFBQAAAAtscEFzc2V0TmFtZQUAAAAMbHBBc3NldERlc2NyAAAAAAAAAAABAAAAAAAAAAAIBgQAAAAJbHBBc3NldElkCQAEOAAAAAEFAAAAEmxwQXNzZXRJc3N1ZUFjdGlvbgQAAAARbHBBc3NldElkQXNTdHJpbmcJAAJYAAAAAQUAAAAJbHBBc3NldElkCQAFFAAAAAIJAARMAAAAAgUAAAASbHBBc3NldElzc3VlQWN0aW9uCQAETAAAAAIJAQAAAARCdXJuAAAAAgUAAAAJbHBBc3NldElkAAAAAAAAAAABBQAAAANuaWwFAAAAEWxwQXNzZXRJZEFzU3RyaW5nAAAAAWkBAAAABm1hbmFnZQAAAAEAAAAGc3RhdHVzBQAAAANuaWwAAAABAAAAAnR4AQAAAAZ2ZXJpZnkAAAAACQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAgFAAAAAnR4AAAAD3NlbmRlclB1YmxpY0tlee9cRq4=", "height": 1655270, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: BrRbYcgqez4ZumwcWpuSi3k5pL1E2DRoxf8k9UxGU5wQ Next: EgQPqJukJD9fh8XXRfCRJZKwUNqwgZ8x1VTg8tQsrkEg Diff:
OldNewDifferences
232232 func put (slippageTolerance) = {
233233 let pmtAmountAsset = value(i.payments[0])
234234 let inAmountAssetAmt = pmtAmountAsset.amount
235- let inAmountAssetId = if (!(isDefined(pmtAmountAsset)))
236- then fromBase58String("")
237- else throw("dddd")
238- let pmtPriceAsset = value(i.payments[1])
239- let inPriceAssetAmt = pmtPriceAsset.amount
240- let inPriceAssetId = value(pmtPriceAsset.assetId)
241235 if (true)
242- then throw(("asset = " + toBase58String(inAmountAssetId)))
236+ then throw("asset = ")
243237 else {
238+ let inAmountAssetId = if (!(isDefined(pmtAmountAsset)))
239+ then fromBase58String("")
240+ else throw("dddd")
241+ let pmtPriceAsset = value(i.payments[1])
242+ let inPriceAssetAmt = pmtPriceAsset.amount
243+ let inPriceAssetId = value(pmtPriceAsset.assetId)
244244 let estimatedPutResults = privateEstimatePutOperation(slippageTolerance, inAmountAssetAmt, toBase58String(inAmountAssetId), inPriceAssetAmt, toBase58String(inPriceAssetId), toString(i.caller))
245245 let outLpAmount = estimatedPutResults._1
246246 let curentPrice = estimatedPutResults._2
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let lPdecimals = 8
55
66 let decimalsMultPrice = ((100 * 1000) * 1000)
77
88 let SEP = "__"
99
1010 let PoolActive = 1
1111
1212 let PoolPutDisabled = 2
1313
1414 let PoolMatcherDisabled = 3
1515
1616 let PoolShutdown = 4
1717
1818 let factoryPublicKey = fromBase58String("6pJkrwfWyhZjm3LoQWRjjNVaLt5CQzqfggzXyqr7nrwA")
1919
2020 let idxPoolAddress = 1
2121
2222 let idxPoolStatus = 2
2323
2424 let idxPoolLPAssetId = 3
2525
2626 let idxAmountAssetId = 4
2727
2828 let idxPriceAssetId = 5
2929
3030 let idxAmountAssetDecimals = 6
3131
3232 let idxPriceAssetDecimals = 7
3333
3434 let idxAmountAssetInternalId = 8
3535
3636 let idxPriceAssetInternalId = 9
3737
3838 let idxPoolWeight = 10
3939
4040 let idxPoolAmountAssetAmt = 1
4141
4242 let idxPoolPriceAssetAmt = 2
4343
4444 let idxPoolLPAssetAmt = 3
4545
4646 func keyPriceLast () = "%s%s__price__last"
4747
4848
4949 func keyPriceHistory (h,timestamp) = makeString(["%s%s%d%d__price__history", toString(h), toString(timestamp)], SEP)
5050
5151
5252 func keyPoolLiquidity (internalAmountAsset,internalPriceAsset) = (((("%d%d%s__" + internalAmountAsset) + "__") + internalPriceAsset) + "__locked")
5353
5454
5555 func keyPoolLiquidityByUser (internalAmountAsset,internalPriceAsset,userAddress) = (((((("%d%d%s%s__" + internalAmountAsset) + "__") + internalPriceAsset) + "__") + userAddress) + "__locked")
5656
5757
5858 func keyPutActionByUser (userAddress,txId) = ((("%s%s%s__P__" + userAddress) + "__") + txId)
5959
6060
6161 func keyGetActionByUser (userAddress,txId) = ((("%s%s%s__G__" + userAddress) + "__") + txId)
6262
6363
6464 func keyMappingPoolContractAddressToPoolAssets (poolContractAddress) = (("%s%s%s__" + poolContractAddress) + "__mappings__poolContract2LpAsset")
6565
6666
6767 func keyPoolConfig (amountAssetInternal,priceAssetInternal) = (((("%d%d%s__" + amountAssetInternal) + "__") + priceAssetInternal) + "__config")
6868
6969
7070 func getPoolConfig () = {
7171 let factoryAddress = addressFromPublicKey(factoryPublicKey)
7272 let currentPoolAssets = split(valueOrErrorMessage(getString(factoryAddress, keyMappingPoolContractAddressToPoolAssets(toString(this))), "No factory config found for pool address."), SEP)
7373 let currentPoolConfig = split(valueOrErrorMessage(getString(factoryAddress, keyPoolConfig(currentPoolAssets[1], currentPoolAssets[2])), "No factory config found for pool assets."), SEP)
7474 currentPoolConfig
7575 }
7676
7777
7878 func getPoolLiquidity (amountAssetInternalId,priceAssetInternalId) = {
7979 let currentPoolLiquidityValue = getString(keyPoolLiquidity(amountAssetInternalId, priceAssetInternalId))
8080 if (!(isDefined(currentPoolLiquidityValue)))
8181 then ["", "0", "0", "0"]
8282 else split(value(currentPoolLiquidityValue), SEP)
8383 }
8484
8585
8686 func getPoolLiquidityByUser (amountAssetInternalId,priceAssetInternalId,userAddress) = {
8787 let currentPoolLiquidityValue = getString(keyPoolLiquidityByUser(amountAssetInternalId, priceAssetInternalId, userAddress))
8888 if (!(isDefined(currentPoolLiquidityValue)))
8989 then ["", "0", "0", "0", "0"]
9090 else split(value(currentPoolLiquidityValue), SEP)
9191 }
9292
9393
9494 func dataPoolLiquidity (amountAssetLocked,priceAssetLocked,lpTokenLocked) = makeString(["%d%d%d", toString(amountAssetLocked), toString(priceAssetLocked), toString(lpTokenLocked)], SEP)
9595
9696
9797 func dataPutActionInfo (inAmountAssetAmt,inPriceAssetAmt,outLpAmt,price,slippageTolerancePassedByUser,txHeight,txTimestamp) = makeString(["%d%d%d%d%d%d%d", toString(inAmountAssetAmt), toString(inPriceAssetAmt), toString(outLpAmt), toString(price), toString(slippageTolerancePassedByUser), toString(txHeight), toString(txTimestamp)], SEP)
9898
9999
100100 func dataGetActionInfo (outAmountAssetAmt,outPriceAssetAmt,inLpAmt,price,txHeight,txTimestamp) = makeString(["%d%d%d%d%d%d", toString(outAmountAssetAmt), toString(outPriceAssetAmt), toString(inLpAmt), toString(price), toString(txHeight), toString(txTimestamp)], SEP)
101101
102102
103103 func dataPoolLiquidityByUser (amountAssetLocked,priceAssetLocked,lpTokenLocked,userAddress) = makeString(["%d%d%d", toString(amountAssetLocked), toString(priceAssetLocked), toString(lpTokenLocked)], SEP)
104104
105105
106106 func getScriptHash () = toBase64String(value(scriptHash(this)))
107107
108108
109109 func privateCastAssetToLPDecimals (assetDecimals,assetAmount) = {
110110 let decimalsMult = pow(10, 0, (lPdecimals - assetDecimals), 0, 0, DOWN)
111111 $Tuple2((assetAmount * decimalsMult), decimalsMult)
112112 }
113113
114114
115115 func privateCalculatePrice (amoutAssetDecimals,priceAssetDecimals,amountAssetAmt,priceAssetAmt) = {
116116 let amountAssetPoolLockedAmt = privateCastAssetToLPDecimals(amoutAssetDecimals, amountAssetAmt)._1
117117 let priceAssetPoolLockedAmt = privateCastAssetToLPDecimals(priceAssetDecimals, priceAssetAmt)._1
118118 fraction(priceAssetPoolLockedAmt, decimalsMultPrice, amountAssetPoolLockedAmt)
119119 }
120120
121121
122122 func privateGetPoolStatistics () = {
123123 let poolConfigDataList = getPoolConfig()
124124 let lpAssetId = fromBase58String(poolConfigDataList[idxPoolLPAssetId])
125125 let amountAssetId = poolConfigDataList[idxAmountAssetId]
126126 let priceAssetId = poolConfigDataList[idxPriceAssetId]
127127 let amountAssetInternalId = poolConfigDataList[idxAmountAssetInternalId]
128128 let priceAssetInternalId = poolConfigDataList[idxPriceAssetInternalId]
129129 let amoutAssetDecimals = parseIntValue(poolConfigDataList[idxAmountAssetDecimals])
130130 let priceAssetDecimals = parseIntValue(poolConfigDataList[idxPriceAssetDecimals])
131131 let poolLiquidityDataList = getPoolLiquidity(amountAssetInternalId, priceAssetInternalId)
132132 let poolAmountAssetBalance = parseIntValue(poolLiquidityDataList[idxPoolAmountAssetAmt])
133133 let poolPriceAssetBalance = parseIntValue(poolLiquidityDataList[idxPoolPriceAssetAmt])
134134 let poolLPBalance = parseIntValue(poolLiquidityDataList[idxPoolLPAssetAmt])
135135 let amountAssetPoolLockedAmt = privateCastAssetToLPDecimals(amoutAssetDecimals, poolAmountAssetBalance)._1
136136 let priceAssetPoolLockedAmt = privateCastAssetToLPDecimals(priceAssetDecimals, poolPriceAssetBalance)._1
137137 let lpPriceInAmountAsset = fraction(amountAssetPoolLockedAmt, (1 * decimalsMultPrice), poolLPBalance)
138138 let lpPriceInPriceAsset = fraction(priceAssetPoolLockedAmt, (1 * decimalsMultPrice), poolLPBalance)
139139 let currentPrice = privateCalculatePrice(amoutAssetDecimals, priceAssetDecimals, poolAmountAssetBalance, poolPriceAssetBalance)
140140 [poolAmountAssetBalance, poolPriceAssetBalance, poolLPBalance, currentPrice, lpPriceInAmountAsset, lpPriceInPriceAsset]
141141 }
142142
143143
144144 func privateEstimateGetOperation (paymentLpAssetId,paymentLpAmount,userAddress) = {
145145 let poolConfigList = getPoolConfig()
146146 let lpAssetId = poolConfigList[idxPoolLPAssetId]
147147 let amountAssetId = poolConfigList[idxAmountAssetId]
148148 let priceAssetId = poolConfigList[idxPriceAssetId]
149149 let amountAssetInternalId = poolConfigList[idxAmountAssetInternalId]
150150 let priceAssetInternalId = poolConfigList[idxPriceAssetInternalId]
151151 let amoutAssetDecimals = parseIntValue(poolConfigList[idxAmountAssetDecimals])
152152 let priceAssetDecimals = parseIntValue(poolConfigList[idxPriceAssetDecimals])
153153 let userLiquidityList = getPoolLiquidityByUser(amountAssetInternalId, priceAssetInternalId, userAddress)
154154 let userLPBalance = parseIntValue(userLiquidityList[idxPoolLPAssetAmt])
155155 let userAmountAssetBalance = parseIntValue(userLiquidityList[idxPoolAmountAssetAmt])
156156 let userPriceAssetBalance = parseIntValue(userLiquidityList[idxPoolPriceAssetAmt])
157157 let poolLiquidityList = getPoolLiquidity(amountAssetInternalId, priceAssetInternalId)
158158 let poolLPBalance = parseIntValue(poolLiquidityList[idxPoolLPAssetAmt])
159159 let poolAmountAssetBalance = parseIntValue(poolLiquidityList[idxPoolAmountAssetAmt])
160160 let poolPriceAssetBalance = parseIntValue(poolLiquidityList[idxPoolPriceAssetAmt])
161161 if ((lpAssetId != paymentLpAssetId))
162162 then throw("Invalid asset passed.")
163163 else if ((paymentLpAmount > userLPBalance))
164164 then throw("Invalid amount passed. Amount less than available.")
165165 else {
166166 let amountAssetPoolLockedAmt = privateCastAssetToLPDecimals(amoutAssetDecimals, poolAmountAssetBalance)._1
167167 let priceAssetPoolLockedAmt = privateCastAssetToLPDecimals(priceAssetDecimals, poolPriceAssetBalance)._1
168168 let outAmountAssetAmt = fraction(amountAssetPoolLockedAmt, paymentLpAmount, poolLPBalance)
169169 let outPriceAssetAmt = fraction(priceAssetPoolLockedAmt, paymentLpAmount, poolLPBalance)
170170 let currentPrice = fraction(priceAssetPoolLockedAmt, decimalsMultPrice, amountAssetPoolLockedAmt)
171171 $Tuple14(amountAssetId, priceAssetId, amountAssetInternalId, priceAssetInternalId, userAmountAssetBalance, outAmountAssetAmt, userPriceAssetBalance, outPriceAssetAmt, outAmountAssetAmt, userLPBalance, poolAmountAssetBalance, poolPriceAssetBalance, poolLPBalance, currentPrice)
172172 }
173173 }
174174
175175
176176 func privateEstimatePutOperation (slippageTolerance,inAmountAssetAmt,inAmountAssetId,inPriceAssetAmt,inPriceAssetId,userAddress) = {
177177 let poolConfigDataList = getPoolConfig()
178178 let lpAssetId = fromBase58String(poolConfigDataList[idxPoolLPAssetId])
179179 let amountAssetId = poolConfigDataList[idxAmountAssetId]
180180 let priceAssetId = poolConfigDataList[idxPriceAssetId]
181181 let amountAssetInternalId = poolConfigDataList[idxAmountAssetInternalId]
182182 let priceAssetInternalId = poolConfigDataList[idxPriceAssetInternalId]
183183 let amoutAssetDecimals = parseIntValue(poolConfigDataList[idxAmountAssetDecimals])
184184 let priceAssetDecimals = parseIntValue(poolConfigDataList[idxPriceAssetDecimals])
185185 let poolLiquidityDataList = getPoolLiquidity(amountAssetInternalId, priceAssetInternalId)
186186 let poolAmountAssetBalance = parseIntValue(poolLiquidityDataList[idxPoolAmountAssetAmt])
187187 let poolPriceAssetBalance = parseIntValue(poolLiquidityDataList[idxPoolPriceAssetAmt])
188188 let poolLPBalance = parseIntValue(poolLiquidityDataList[idxPoolLPAssetAmt])
189189 let userLiquidityDataList = getPoolLiquidityByUser(amountAssetInternalId, priceAssetInternalId, userAddress)
190190 let userAmountAssetBalance = parseIntValue(userLiquidityDataList[idxPoolAmountAssetAmt])
191191 let userPriceAssetBalance = parseIntValue(userLiquidityDataList[idxPoolPriceAssetAmt])
192192 let userLPBalance = parseIntValue(userLiquidityDataList[idxPoolLPAssetAmt])
193193 if (if ((amountAssetId != inAmountAssetId))
194194 then true
195195 else (priceAssetId != inPriceAssetId))
196196 then throw("Invalid amount or price asset passed.")
197197 else {
198198 let inAmountAssetAmtCalculatedTuple = privateCastAssetToLPDecimals(amoutAssetDecimals, inAmountAssetAmt)
199199 let inPriceAssetAmtCalculatedTuple = privateCastAssetToLPDecimals(priceAssetDecimals, inPriceAssetAmt)
200200 let inAmountAssetAmtCalculated = inAmountAssetAmtCalculatedTuple._1
201201 let inPriceAssetAmtCalculated = inPriceAssetAmtCalculatedTuple._1
202202 let userPrice = fraction(inPriceAssetAmtCalculated, decimalsMultPrice, inAmountAssetAmtCalculated)
203203 let amountAssetPoolLockedAmt = (poolAmountAssetBalance * inAmountAssetAmtCalculatedTuple._2)
204204 let priceAssetPoolLockedAmt = (poolPriceAssetBalance * inPriceAssetAmtCalculatedTuple._2)
205205 let curentPrice = if ((poolLPBalance == 0))
206206 then 0
207207 else fraction(priceAssetPoolLockedAmt, decimalsMultPrice, amountAssetPoolLockedAmt)
208208 let outLpAmount = if ((poolLPBalance == 0))
209209 then {
210210 let partA = pow(inAmountAssetAmtCalculated, 0, 5, 1, 0, DOWN)
211211 let partB = pow(inPriceAssetAmtCalculated, 0, 5, 1, 0, DOWN)
212212 (partA * partB)
213213 }
214214 else {
215215 let slippage = fraction(curentPrice, 100, userPrice)
216216 if ((slippage > slippageTolerance))
217217 then throw(((("Price slippage " + toString(slippage)) + " exceeded the passed limit of ") + toString(slippageTolerance)))
218218 else {
219219 let lpAmtByAmountAsset = fraction(poolLPBalance, inAmountAssetAmtCalculated, amountAssetPoolLockedAmt)
220220 let lpAmtByPriceAsset = fraction(poolLPBalance, inPriceAssetAmtCalculated, priceAssetPoolLockedAmt)
221221 if ((lpAmtByPriceAsset > lpAmtByAmountAsset))
222222 then lpAmtByAmountAsset
223223 else lpAmtByPriceAsset
224224 }
225225 }
226226 $Tuple11(outLpAmount, curentPrice, userAmountAssetBalance, userPriceAssetBalance, userLPBalance, poolAmountAssetBalance, poolPriceAssetBalance, poolLPBalance, amountAssetInternalId, priceAssetInternalId, lpAssetId)
227227 }
228228 }
229229
230230
231231 @Callable(i)
232232 func put (slippageTolerance) = {
233233 let pmtAmountAsset = value(i.payments[0])
234234 let inAmountAssetAmt = pmtAmountAsset.amount
235- let inAmountAssetId = if (!(isDefined(pmtAmountAsset)))
236- then fromBase58String("")
237- else throw("dddd")
238- let pmtPriceAsset = value(i.payments[1])
239- let inPriceAssetAmt = pmtPriceAsset.amount
240- let inPriceAssetId = value(pmtPriceAsset.assetId)
241235 if (true)
242- then throw(("asset = " + toBase58String(inAmountAssetId)))
236+ then throw("asset = ")
243237 else {
238+ let inAmountAssetId = if (!(isDefined(pmtAmountAsset)))
239+ then fromBase58String("")
240+ else throw("dddd")
241+ let pmtPriceAsset = value(i.payments[1])
242+ let inPriceAssetAmt = pmtPriceAsset.amount
243+ let inPriceAssetId = value(pmtPriceAsset.assetId)
244244 let estimatedPutResults = privateEstimatePutOperation(slippageTolerance, inAmountAssetAmt, toBase58String(inAmountAssetId), inPriceAssetAmt, toBase58String(inPriceAssetId), toString(i.caller))
245245 let outLpAmount = estimatedPutResults._1
246246 let curentPrice = estimatedPutResults._2
247247 let userAmountAssetBalance = estimatedPutResults._3
248248 let userPriceAssetBalance = estimatedPutResults._4
249249 let userLPBalance = estimatedPutResults._5
250250 let poolAmountAssetBalance = estimatedPutResults._6
251251 let poolPriceAssetBalance = estimatedPutResults._7
252252 let poolLPBalance = estimatedPutResults._8
253253 let amountAssetInternalId = estimatedPutResults._9
254254 let priceAssetInternalId = estimatedPutResults._10
255255 let lpAssetId = estimatedPutResults._11
256256 [StringEntry(keyPriceLast(), ("%s__" + toString(curentPrice))), StringEntry(keyPriceHistory(height, lastBlock.timestamp), ("%s__" + toString(curentPrice))), StringEntry(keyPutActionByUser(toString(i.caller), toBase58String(i.transactionId)), dataPutActionInfo(inAmountAssetAmt, inPriceAssetAmt, outLpAmount, curentPrice, slippageTolerance, height, lastBlock.timestamp)), StringEntry(keyPoolLiquidityByUser(amountAssetInternalId, priceAssetInternalId, toString(i.caller)), dataPoolLiquidity((userAmountAssetBalance + inAmountAssetAmt), (userPriceAssetBalance + inPriceAssetAmt), (userLPBalance + outLpAmount))), StringEntry(keyPoolLiquidity(amountAssetInternalId, priceAssetInternalId), dataPoolLiquidity((poolAmountAssetBalance + inAmountAssetAmt), (poolPriceAssetBalance + inPriceAssetAmt), (poolLPBalance + outLpAmount))), Reissue(lpAssetId, outLpAmount, true), ScriptTransfer(i.caller, outLpAmount, lpAssetId)]
257257 }
258258 }
259259
260260
261261
262262 @Callable(i)
263263 func get () = {
264264 let pmtAmountAsset = value(i.payments[0])
265265 let pmtAssetId = value(pmtAmountAsset.assetId)
266266 let pmtAssetAmount = pmtAmountAsset.amount
267267 let results = privateEstimateGetOperation(toBase58String(pmtAssetId), pmtAssetAmount, toString(i.caller))
268268 let amountAssetId = results._1
269269 let priceAssetId = results._2
270270 let amountAssetInternalId = results._3
271271 let priceAssetInternalId = results._4
272272 let userAmountAssetBalance = results._5
273273 let outAmountAssetAmt = results._6
274274 let userPriceAssetBalance = results._7
275275 let outPriceAssetAmt = results._8
276276 let userLPBalance = results._9
277277 let poolAmountAssetBalance = results._11
278278 let poolPriceAssetBalance = results._12
279279 let poolLPBalance = results._13
280280 let currentPrice = results._14
281281 [Burn(pmtAssetId, pmtAssetAmount), ScriptTransfer(i.caller, outAmountAssetAmt, fromBase58String(amountAssetId)), ScriptTransfer(i.caller, outPriceAssetAmt, fromBase58String(priceAssetId)), StringEntry(keyPoolLiquidityByUser(amountAssetInternalId, priceAssetInternalId, toString(i.caller)), dataPoolLiquidity((userAmountAssetBalance - outAmountAssetAmt), (userPriceAssetBalance - outPriceAssetAmt), (userLPBalance - pmtAssetAmount))), StringEntry(keyPoolLiquidity(amountAssetInternalId, priceAssetInternalId), dataPoolLiquidity((poolAmountAssetBalance - outAmountAssetAmt), (poolPriceAssetBalance - outPriceAssetAmt), (poolLPBalance - pmtAssetAmount))), StringEntry(keyGetActionByUser(toString(i.caller), toBase58String(i.transactionId)), dataGetActionInfo(outAmountAssetAmt, outPriceAssetAmt, pmtAssetAmount, currentPrice, height, lastBlock.timestamp)), StringEntry(keyPriceLast(), ("%s__" + toString(currentPrice))), StringEntry(keyPriceHistory(height, lastBlock.timestamp), ("%s__" + toString(currentPrice)))]
282282 }
283283
284284
285285
286286 @Callable(i)
287287 func activate (amountAssetStr,priceAssetStr,lpAssetName,lpAssetDescr,poolWeight) = if ((i.callerPublicKey != factoryPublicKey))
288288 then throw("permissions denied")
289289 else {
290290 let amountAssetId = fromBase58String(amountAssetStr)
291291 let amountAssetDecimals = value(assetInfo(amountAssetId)).decimals
292292 let priceAssetId = fromBase58String(priceAssetStr)
293293 let priceAssetDecimals = value(assetInfo(priceAssetId)).decimals
294294 let lpAssetIssueAction = Issue(lpAssetName, lpAssetDescr, 1, 8, true)
295295 let lpAssetId = calculateAssetId(lpAssetIssueAction)
296296 let lpAssetIdAsString = toBase58String(lpAssetId)
297297 $Tuple2([lpAssetIssueAction, Burn(lpAssetId, 1)], lpAssetIdAsString)
298298 }
299299
300300
301301
302302 @Callable(i)
303303 func manage (status) = nil
304304
305305
306306 @Verifier(tx)
307307 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
308308

github/deemru/w8io/3ef1775 
81.80 ms