2021.11.25 21:17 [2871836] smart account 3PJL8Hn8LACaSBWLQ3UVhctA5cTQLBFwBAP > SELF 0.00000000 Waves

{ "type": 13, "id": "CzWE5obC3wsBfNtpfmZUWiNQ3kMwybLeBQw8hDFhVxD4", "fee": 1000000, "feeAssetId": null, "timestamp": 1637864278266, "version": 1, "sender": "3PJL8Hn8LACaSBWLQ3UVhctA5cTQLBFwBAP", "senderPublicKey": "6PdA345SW1zresPEKuWiLPsh9Ku14mFDW6cZtpCQrp3E", "proofs": [ "23Ry5Kmi6TM8sgKkPojxR9DwfgaQvks68ik1qXpsfWALjVRygYukhaT8USqH5WqkGxvX4EFi3bDyGpA7EbgZjjje" ], "script": "base64:AAIFAAAAAAAAACoIAhIICgYICAEBAQgSAwoBARIDCgEBEgMKAQgSAwoBCBIDCgEIEgMKAQgAAABSAAAAAANTRVACAAAAAl9fAAAAAAZTQ0FMRTgAAAAAAAAAAAgAAAAABU1VTFQ4AAAAAAAF9eEAAQAAAA9nZXRTdHJpbmdPckZhaWwAAAACAAAAB2FkZHJlc3MAAAADa2V5CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAHYWRkcmVzcwUAAAADa2V5CQABLAAAAAIJAAEsAAAAAgIAAAAPbWFuZGF0b3J5IHRoaXMuBQAAAANrZXkCAAAADyBpcyBub3QgZGVmaW5lZAEAAAAMZ2V0SW50T3JaZXJvAAAAAgAAAAdhZGRyZXNzAAAAA2tleQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAdhZGRyZXNzBQAAAANrZXkAAAAAAAAAAAABAAAAD2dldEludE9yRGVmYXVsdAAAAAMAAAAHYWRkcmVzcwAAAANrZXkAAAAKZGVmYXVsdFZhbAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAdhZGRyZXNzBQAAAANrZXkFAAAACmRlZmF1bHRWYWwBAAAADGdldEludE9yRmFpbAAAAAIAAAAHYWRkcmVzcwAAAANrZXkJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAdhZGRyZXNzBQAAAANrZXkJAAEsAAAAAgkAASwAAAACAgAAAA9tYW5kYXRvcnkgdGhpcy4FAAAAA2tleQIAAAAPIGlzIG5vdCBkZWZpbmVkAQAAAAlhc0FueUxpc3QAAAABAAAAA3ZhbAQAAAAHJG1hdGNoMAUAAAADdmFsAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAlMaXN0W0FueV0EAAAACnZhbEFueUx5c3QFAAAAByRtYXRjaDAFAAAACnZhbEFueUx5c3QJAAACAAAAAQIAAAAbZmFpbCB0byBjYXN0IGludG8gTGlzdFtBbnldAQAAAAVhc0ludAAAAAEAAAADdmFsBAAAAAckbWF0Y2gwBQAAAAN2YWwDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAAGdmFsSW50BQAAAAckbWF0Y2gwBQAAAAZ2YWxJbnQJAAACAAAAAQIAAAAVZmFpbCB0byBjYXN0IGludG8gSW50AQAAABFrZXlGYWN0b3J5QWRkcmVzcwAAAAACAAAAHCVzJXNfX2NvbmZpZ19fZmFjdG9yeUFkZHJlc3MAAAAAGElkeEZhY3RvcnlDZmdTdGFraW5nRGFwcAAAAAAAAAAAAQAAAAAZSWR4RmFjdG9yeUNmZ0Jvb3N0aW5nRGFwcAAAAAAAAAAAAgAAAAAUSWR4RmFjdG9yeUNmZ0lkb0RhcHAAAAAAAAAAAAMAAAAAFUlkeEZhY3RvcnlDZmdUZWFtRGFwcAAAAAAAAAAABAAAAAAZSWR4RmFjdG9yeUNmZ0VtaXNzaW9uRGFwcAAAAAAAAAAABQAAAAAVSWR4RmFjdG9yeUNmZ1Jlc3REYXBwAAAAAAAAAAAGAAAAABlJZHhGYWN0b3J5Q2ZnU2xpcHBhZ2VEYXBwAAAAAAAAAAAHAQAAAA1rZXlGYWN0b3J5Q2ZnAAAAAAIAAAARJXNfX2ZhY3RvcnlDb25maWcBAAAAGmtleUZhY3RvcnlMcDJBc3NldHNNYXBwaW5nAAAAAQAAAApscEFzc2V0U3RyCQAEuQAAAAIJAARMAAAAAgIAAAAGJXMlcyVzCQAETAAAAAIFAAAACmxwQXNzZXRTdHIJAARMAAAAAgIAAAAebWFwcGluZ3NfX2xwQXNzZXQyUG9vbENvbnRyYWN0BQAAAANuaWwFAAAAA1NFUAEAAAAQa2V5RmFjdG9yeUxwTGlzdAAAAAACAAAAECVzX19scFRva2Vuc0xpc3QBAAAAJmtleUZhY3RvcnlMcEFzc2V0VG9Qb29sQ29udHJhY3RBZGRyZXNzAAAAAQAAAApscEFzc2V0U3RyCQAEuQAAAAIJAARMAAAAAgIAAAAGJXMlcyVzCQAETAAAAAIFAAAACmxwQXNzZXRTdHIJAARMAAAAAgIAAAAebWFwcGluZ3NfX2xwQXNzZXQyUG9vbENvbnRyYWN0BQAAAANuaWwFAAAAA1NFUAEAAAAUa2V5RmFjdG9yeVBvb2xXZWlnaHQAAAABAAAAD2NvbnRyYWN0QWRkcmVzcwkABLkAAAACCQAETAAAAAICAAAABCVzJXMJAARMAAAAAgIAAAAKcG9vbFdlaWdodAkABEwAAAACBQAAAA9jb250cmFjdEFkZHJlc3MFAAAAA25pbAUAAAADU0VQAQAAABhyZWFkRmFjdG9yeUFkZHJlc3NPckZhaWwAAAAACQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAgUAAAAEdGhpcwkBAAAAEWtleUZhY3RvcnlBZGRyZXNzAAAAAAEAAAAKcmVhZExwTGlzdAAAAAAJAAS1AAAAAgkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACCQEAAAAYcmVhZEZhY3RvcnlBZGRyZXNzT3JGYWlsAAAAAAkBAAAAEGtleUZhY3RvcnlMcExpc3QAAAAAAgAAAAAFAAAAA1NFUAEAAAAUcmVhZEZhY3RvcnlDZmdPckZhaWwAAAABAAAAB2ZhY3RvcnkJAAS1AAAAAgkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAIFAAAAB2ZhY3RvcnkJAQAAAA1rZXlGYWN0b3J5Q2ZnAAAAAAUAAAADU0VQAQAAABhnZXRCb29zdGluZ0FkZHJlc3NPckZhaWwAAAABAAAACmZhY3RvcnlDZmcJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEJAAGRAAAAAgUAAAAKZmFjdG9yeUNmZwUAAAAZSWR4RmFjdG9yeUNmZ0Jvb3N0aW5nRGFwcAEAAAAYZ2V0RW1pc3Npb25BZGRyZXNzT3JGYWlsAAAAAQAAAApmYWN0b3J5Q2ZnCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQABkQAAAAIFAAAACmZhY3RvcnlDZmcFAAAAGUlkeEZhY3RvcnlDZmdFbWlzc2lvbkRhcHABAAAAF2dldFN0YWtpbmdBZGRyZXNzT3JGYWlsAAAAAQAAAApmYWN0b3J5Q2ZnCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQABkQAAAAIFAAAACmZhY3RvcnlDZmcFAAAAGElkeEZhY3RvcnlDZmdTdGFraW5nRGFwcAEAAAAea2V5RW1pc3Npb25SYXRlUGVyQmxvY2tDdXJyZW50AAAAAAIAAAAbJXMlc19fcmF0ZVBlckJsb2NrX19jdXJyZW50AQAAACFrZXlFbWlzc2lvblJhdGVQZXJCbG9ja01heEN1cnJlbnQAAAAAAgAAAB4lcyVzX19yYXRlUGVyQmxvY2tNYXhfX2N1cnJlbnQBAAAAFWtleUVtaXNzaW9uU3RhcnRCbG9jawAAAAACAAAAGiVzJXNfX2VtaXNzaW9uX19zdGFydEJsb2NrAQAAABtrZXlFbWlzc2lvbkR1cmF0aW9uSW5CbG9ja3MAAAAAAgAAABglcyVzX19lbWlzc2lvbl9fZHVyYXRpb24BAAAAE2tleUVtaXNzaW9uRW5kQmxvY2sAAAAAAgAAABglcyVzX19lbWlzc2lvbl9fZW5kQmxvY2sAAAAADUlkeENmZ0Fzc2V0SWQAAAAAAAAAAAEAAAAAE0lkeENmZ01pbkxvY2tBbW91bnQAAAAAAAAAAAIAAAAAFUlkeENmZ01pbkxvY2tEdXJhdGlvbgAAAAAAAAAAAwAAAAAVSWR4Q2ZnTWF4TG9ja0R1cmF0aW9uAAAAAAAAAAAEAAAAABJJZHhDZmdNYXRoQ29udHJhY3QAAAAAAAAAAAUBAAAACWtleUNvbmZpZwAAAAACAAAACiVzX19jb25maWcBAAAAFXJlYWRDb25maWdBcnJheU9yRmFpbAAAAAAJAAS1AAAAAgkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAIFAAAABHRoaXMJAQAAAAlrZXlDb25maWcAAAAABQAAAANTRVABAAAADWZvcm1hdENvbmZpZ1MAAAAFAAAAB2Fzc2V0SWQAAAANbWluTG9ja0Ftb3VudAAAAA9taW5Mb2NrRHVyYXRpb24AAAAPbWF4TG9ja0R1cmF0aW9uAAAADG1hdGhDb250cmFjdAkABLkAAAACCQAETAAAAAICAAAACCVzJWQlZCVkCQAETAAAAAIFAAAAB2Fzc2V0SWQJAARMAAAAAgUAAAANbWluTG9ja0Ftb3VudAkABEwAAAACBQAAAA9taW5Mb2NrRHVyYXRpb24JAARMAAAAAgUAAAAPbWF4TG9ja0R1cmF0aW9uCQAETAAAAAIFAAAADG1hdGhDb250cmFjdAUAAAADbmlsBQAAAANTRVABAAAADGZvcm1hdENvbmZpZwAAAAUAAAAHYXNzZXRJZAAAAA1taW5Mb2NrQW1vdW50AAAAD21pbkxvY2tEdXJhdGlvbgAAAA9tYXhMb2NrRHVyYXRpb24AAAAMbWF0aENvbnRyYWN0CQEAAAANZm9ybWF0Q29uZmlnUwAAAAUF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AAAAHSVzJXNfX3N0YXRzX19hY3RpdmVVc2Vyc0NvdW50AQAAACBrZXlVc2VyQm9vc3RFbWlzc2lvbkxhc3RJTlRFR1JBTAAAAAEAAAAHdXNlck51bQkABLkAAAACCQAETAAAAAICAAAAHiVzJWRfX3VzZXJCb29zdEVtaXNzaW9uTGFzdEludAkABEwAAAACBQAAAAd1c2VyTnVtBQAAAANuaWwFAAAAA1NFUAEAAAAXa2V5VXNlck1heEJvb3N0SU5URUdSQUwAAAABAAAAB3VzZXJOdW0JAAS5AAAAAgkABEwAAAACAgAAABElcyVkX19tYXhCb29zdEludAkABEwAAAACBQAAAAd1c2VyTnVtBQAAAANuaWwFAAAAA1NFUAEAAAAYa2V5VG90YWxNYXhCb29zdElOVEVHUkFMAAAAAAIAAAAYJXMlc19fbWF4Qm9vc3RJbnRfX3RvdGFsAQAAACFrZXlVc2VyQm9vc3RBdmFsYWlibGVUb0NsYWltVG90YWwAAAABAAAAB3VzZXJOdW0JAAS5AAAAAgkABEwAAAACAgAAACQlcyVkX191c2VyQm9vc3RBdmFsaWFibGVUb0NsYWltVG90YWwJAARMAAAAAgUAAAAHdXNlck51bQUAAAADbmlsBQAAAANTRVABAAAAE2tleVVzZXJCb29zdENsYWltZWQAAAABAAAAB3VzZXJOdW0JAAS5AAAAAgkABEwAAAACAgAAABYlcyVkX191c2VyQm9vc3RDbGFpbWVkCQAETAAAAAIFAAAAB3VzZXJOdW0FAAAAA25pbAUAAAADU0VQAAAAAA9mYWN0b3J5Q29udHJhY3QJAQAAABhyZWFkRmFjdG9yeUFkZHJlc3NPckZhaWwAAAAAAAAAAApmYWN0b3J5Q2ZnCQEAAAAUcmVhZEZhY3RvcnlDZmdPckZhaWwAAAABBQAAAA9mYWN0b3J5Q29udHJhY3QAAAAAEGVtaXNzaW9uQ29udHJhY3QJAQAAABhnZXRFbWlzc2lvbkFkZHJlc3NPckZhaWwAAAABBQAAAApmYWN0b3J5Q2ZnAAAAAA9zdGFraW5nQ29udHJhY3QJAQAAABdnZXRTdGFraW5nQWRkcmVzc09yRmFpbAAAAAEFAAAACmZhY3RvcnlDZmcBAAAADEhpc3RvcnlFbnRyeQAAAAgAAAAEdHlwZQAAAAR1c2VyAAAABmFtb3VudAAAAAlsb2NrU3RhcnQAAAAIZHVyYXRpb24AAAABawAAAAFiAAAAAWkEAAAACmhpc3RvcnlLRVkJAAS5AAAAAgkABEwAAAACAgAAABElcyVzJXMlc19faGlzdG9yeQkABEwAAAACBQAAAAR0eXBlCQAETAAAAAIFAAAABHVzZXIJAARMAAAAAgkAAlgAAAABCAUAAAABaQAAAA10cmFuc2FjdGlvbklkBQAAAANuaWwFAAAAA1NFUAQAAAALaGlzdG9yeURBVEEJAAS5AAAAAgkABEwAAAACAgAAAA4lZCVkJWQlZCVkJWQlZAkABEwAAAACCQABpAAAAAEIBQAAAAlsYXN0QmxvY2sAAAAGaGVpZ2h0CQAETAAAAAIJAAGkAAAAAQgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAJAARMAAAAAgkAAaQAAAABBQAAAAZhbW91bnQJAARMAAAAAgkAAaQAAAABBQAAAAlsb2NrU3RhcnQJAARMAAAAAgkAAaQAAAABBQAAAAhkdXJhdGlvbgkABEwAAAACCQABpAAAAAEFAAAAAWsJAARMAAAAAgkAAaQAAAABBQAAAAFiBQAAAANuaWwFAAAAA1NFUAkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAKaGlzdG9yeUtFWQUAAAALaGlzdG9yeURBVEEBAAAAClN0YXRzRW50cnkAAAAEAAAADnRvdGFsTG9ja2VkSW5jAAAAC2R1cmF0aW9uSW5jAAAADGxvY2tDb3VudEluYwAAAA11c2Vyc0NvdW50SW5jBAAAABtsb2Nrc0R1cmF0aW9uU3VtSW5CbG9ja3NLRVkJAQAAACBrZXlTdGF0c0xvY2tzRHVyYXRpb25TdW1JbkJsb2NrcwAAAAAEAAAADWxvY2tzQ291bnRLRVkJAQAAABJrZXlTdGF0c0xvY2tzQ291bnQAAAAABAAAAA11c2Vyc0NvdW50S0VZCQEAAAASa2V5U3RhdHNVc2Vyc0NvdW50AAAAAAQAAAAOdG90YWxBbW91bnRLRVkJAQAAABdrZXlMb2NrUGFyYW1Ub3RhbEFtb3VudAAAAAAEAAAAGGxvY2tzRHVyYXRpb25TdW1JbkJsb2NrcwkBAAAADGdldEludE9yWmVybwAAAAIFAAAABHRoaXMFAAAAG2xvY2tzRHVyYXRpb25TdW1JbkJsb2Nrc0tFWQQAAAAKbG9ja3NDb3VudAkBAAAADGdldEludE9yWmVybwAAAAIFAAAABHRoaXMFAAAADWxvY2tzQ291bnRLRVkEAAAACnVzZXJzQ291bnQJAQAAAAxnZXRJbnRPclplcm8AAAACBQAAAAR0aGlzBQAAAA11c2Vyc0NvdW50S0VZBAAAAAt0b3RhbEFtb3VudAkBAAAADGdldEludE9yWmVybwAAAAIFAAAABHRoaXMFAAAADnRvdGFsQW1vdW50S0VZCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABtsb2Nrc0R1cmF0aW9uU3VtSW5CbG9ja3NLRVkJAABkAAAAAgUAAAAYbG9ja3NEdXJhdGlvblN1bUluQmxvY2tzBQAAAAtkdXJhdGlvbkluYwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAANbG9ja3NDb3VudEtFWQkAAGQAAAACBQAAAApsb2Nrc0NvdW50BQAAAAxsb2NrQ291bnRJbmMJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAADXVzZXJzQ291bnRLRVkJAABkAAAAAgUAAAAKdXNlcnNDb3VudAUAAAANdXNlcnNDb3VudEluYwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAOdG90YWxBbW91bnRLRVkJAABkAAAAAgUAAAALdG90YWxBbW91bnQFAAAADnRvdGFsTG9ja2VkSW5jBQAAAANuaWwBAAAADWNhbGNHd3hBbW91bnQAAAADAAAABGtSYXcAAAAEYlJhdwAAAAFoBAAAAAVTQ0FMRQAAAAAAAAAD6AkAAGkAAAACCQAAZAAAAAIJAABoAAAAAgUAAAAEa1JhdwUAAAABaAUAAAAEYlJhdwUAAAAFU0NBTEUBAAAAD0xvY2tQYXJhbXNFbnRyeQAAAAgAAAALdXNlckFkZHJlc3MAAAAHdXNlck51bQAAAAZhbW91bnQAAAAFc3RhcnQAAAAIZHVyYXRpb24AAAABawAAAAFiAAAABnBlcmlvZAQAAAANdXNlckFtb3VudEtFWQkBAAAAFmtleUxvY2tQYXJhbVVzZXJBbW91bnQAAAABBQAAAAd1c2VyTnVtBAAAAA1zdGFydEJsb2NrS0VZCQEAAAAWa2V5TG9ja1BhcmFtU3RhcnRCbG9jawAAAAEFAAAAB3VzZXJOdW0EAAAAC2R1cmF0aW9uS0VZCQEAAAAUa2V5TG9ja1BhcmFtRHVyYXRpb24AAAABBQAAAAd1c2VyTnVtBAAAAARrS0VZCQEAAAANa2V5TG9ja1BhcmFtSwAAAAEFAAAAB3VzZXJOdW0EAAAABGJLRVkJAQAAAA1rZXlMb2NrUGFyYW1CAAAAAQUAAAAHdXNlck51bQQAAAALa0J5UGVyaW9LRVkJAQAAABVrZXlMb2NrUGFyYW1CeVBlcmlvZEsAAAACBQAAAAd1c2VyTnVtBQAAAAZwZXJpb2QEAAAADGJCeVBlcmlvZEtFWQkBAAAAFWtleUxvY2tQYXJhbUJ5UGVyaW9kQgAAAAIFAAAAB3VzZXJOdW0FAAAABnBlcmlvZAQAAAAJZ3d4QW1vdW50CQEAAAANY2FsY0d3eEFtb3VudAAAAAMFAAAAAWsFAAAAAWIFAAAABmhlaWdodAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAANdXNlckFtb3VudEtFWQUAAAAGYW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAA1zdGFydEJsb2NrS0VZBQAAAAVzdGFydAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAALZHVyYXRpb25LRVkFAAAACGR1cmF0aW9uCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAARrS0VZBQAAAAFrCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAARiS0VZBQAAAAFiCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAtrQnlQZXJpb0tFWQUAAAABawkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAMYkJ5UGVyaW9kS0VZBQAAAAFiCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABNrZXlMb2NrUGFyYW1zUmVjb3JkAAAAAQUAAAALdXNlckFkZHJlc3MJAQAAABZmb3JtYXRMb2NrUGFyYW1zUmVjb3JkAAAABwUAAAAHdXNlck51bQUAAAAGYW1vdW50BQAAAAVzdGFydAUAAAAIZHVyYXRpb24FAAAAAWsFAAAAAWIFAAAACWd3eEFtb3VudAUAAAADbmlsAQAAACJleHRyYWN0T3B0aW9uYWxQYXltZW50QW1vdW50T3JGYWlsAAAAAgAAAAFpAAAAD2V4cGVjdGVkQXNzZXRJZAMJAABmAAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQkAAAIAAAABAgAAABtvbmx5IG9uZSBwYXltZW50IGlzIGFsbG93ZWQDCQAAAAAAAAIJAAGQAAAAAQgFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAAAAAAAAAEAAAAA3BtdAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAMJAQAAAAIhPQAAAAIJAQAAAAV2YWx1ZQAAAAEIBQAAAANwbXQAAAAHYXNzZXRJZAUAAAAPZXhwZWN0ZWRBc3NldElkCQAAAgAAAAECAAAAG2ludmFsaWQgYXNzZXQgaWQgaW4gcGF5bWVudAgFAAAAA3BtdAAAAAZhbW91bnQBAAAAFGNhbGNDdXJyZW50R3d4QW1vdW50AAAAAQAAAAt1c2VyQWRkcmVzcwQAAAAFRU1QVFkCAAAABWVtcHR5BAAAABJ1c2VyMk51bU1hcHBpbmdLRVkJAQAAABJrZXlVc2VyMk51bU1hcHBpbmcAAAABBQAAAAt1c2VyQWRkcmVzcwQAAAAHdXNlck51bQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABCIAAAABBQAAABJ1c2VyMk51bU1hcHBpbmdLRVkFAAAABUVNUFRZBAAAAAFrCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHwAAAAEJAQAAAA1rZXlMb2NrUGFyYW1LAAAAAQUAAAAHdXNlck51bQAAAAAAAAAAAAQAAAABYgkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB8AAAABCQEAAAANa2V5TG9ja1BhcmFtQgAAAAEFAAAAB3VzZXJOdW0AAAAAAAAAAAAEAAAADWd3eEFtb3VudENhbGMJAQAAAA1jYWxjR3d4QW1vdW50AAAAAwUAAAABawUAAAABYgUAAAAGaGVpZ2h0BAAAAAlnd3hBbW91bnQDCQAAZgAAAAIAAAAAAAAAAAAFAAAADWd3eEFtb3VudENhbGMAAAAAAAAAAAAFAAAADWd3eEFtb3VudENhbGMFAAAACWd3eEFtb3VudAEAAAAUaW50ZXJuYWxDbGFpbVd4Qm9vc3QAAAABAAAADnVzZXJBZGRyZXNzU3RyBAAAAAVFTVBUWQIAAAAFRU1QVFkEAAAAEXVzZXJSZWNvcmRPckVtcHR5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAABHRoaXMJAQAAABNrZXlMb2NrUGFyYW1zUmVjb3JkAAAAAQUAAAAOdXNlckFkZHJlc3NTdHIFAAAABUVNUFRZAwkAAAAAAAACBQAAABF1c2VyUmVjb3JkT3JFbXB0eQUAAAAFRU1QVFkJAAUUAAAAAgAAAAAAAAAAAAUAAAADbmlsBAAAAA91c2VyUmVjb3JkQXJyYXkJAAS1AAAAAgUAAAARdXNlclJlY29yZE9yRW1wdHkFAAAAA1NFUAQAAAAKdXNlck51bVN0cgkAAZEAAAACBQAAAA91c2VyUmVjb3JkQXJyYXkFAAAADklkeExvY2tVc2VyTnVtBAAAABJ3eEVtaXNzaW9uUGVyQmxvY2sJAQAAAAxnZXRJbnRPckZhaWwAAAACBQAAABBlbWlzc2lvbkNvbnRyYWN0CQEAAAAea2V5RW1pc3Npb25SYXRlUGVyQmxvY2tDdXJyZW50AAAAAAQAAAANZW1pc3Npb25TdGFydAkBAAAADGdldEludE9yRmFpbAAAAAIFAAAAEGVtaXNzaW9uQ29udHJhY3QJAQAAABVrZXlFbWlzc2lvblN0YXJ0QmxvY2sAAAAABAAAAAtlbWlzc2lvbkVuZAkBAAAADGdldEludE9yRmFpbAAAAAIFAAAAEGVtaXNzaW9uQ29udHJhY3QJAQAAABNrZXlFbWlzc2lvbkVuZEJsb2NrAAAAAAQAAAABaAMJAABmAAAAAgUAAAAGaGVpZ2h0BQAAAAtlbWlzc2lvbkVuZAUAAAALZW1pc3Npb25FbmQFAAAABmhlaWdodAQAAAACZGgJAAGWAAAAAQkABEwAAAACCQAAZQAAAAIFAAAAAWgFAAAADWVtaXNzaW9uU3RhcnQJAARMAAAAAgAAAAAAAAAAAAUAAAADbmlsBAAAACB1c2VyQm9vc3RFbWlzc2lvbkxhc3RJbnRlZ3JhbEtFWQkBAAAAIGtleVVzZXJCb29zdEVtaXNzaW9uTGFzdElOVEVHUkFMAAAAAQUAAAAKdXNlck51bVN0cgQAAAAddXNlckJvb3N0RW1pc3Npb25MYXN0SW50ZWdyYWwJAQAAAAxnZXRJbnRPclplcm8AAAACBQAAAAR0aGlzBQAAACB1c2VyQm9vc3RFbWlzc2lvbkxhc3RJbnRlZ3JhbEtFWQQAAAAVYm9vc3RFbWlzc2lvbkludGVncmFsCQAAaQAAAAIJAABoAAAAAgkAAGgAAAACBQAAABJ3eEVtaXNzaW9uUGVyQmxvY2sFAAAAAmRoAAAAAAAAAAACAAAAAAAAAAADBAAAABl1c2VyQm9vc3RFbWlzc2lvbkludGVncmFsCQAAZQAAAAIFAAAAFWJvb3N0RW1pc3Npb25JbnRlZ3JhbAUAAAAddXNlckJvb3N0RW1pc3Npb25MYXN0SW50ZWdyYWwDCQAAZgAAAAIAAAAAAAAAAAAFAAAAGXVzZXJCb29zdEVtaXNzaW9uSW50ZWdyYWwJAAACAAAAAQIAAAASd3JvbmcgY2FsY3VsYXRpb25zBAAAABd1c2VyTWF4Qm9vc3RJbnRlZ3JhbEtFWQkBAAAAF2tleVVzZXJNYXhCb29zdElOVEVHUkFMAAAAAQUAAAAKdXNlck51bVN0cgQAAAAYdG90YWxNYXhCb29zdEludGVncmFsS0VZCQEAAAAYa2V5VG90YWxNYXhCb29zdElOVEVHUkFMAAAAAAQAAAAhdXNlckJvb3N0QXZhbGFpYmxlVG9DbGFpbVRvdGFsS0VZCQEAAAAha2V5VXNlckJvb3N0QXZhbGFpYmxlVG9DbGFpbVRvdGFsAAAAAQUAAAAKdXNlck51bVN0cgQAAAAPdXNlck1heEJvb3N0SW50CQEAAAAMZ2V0SW50T3JaZXJvAAAAAgUAAAAEdGhpcwUAAAAXdXNlck1heEJvb3N0SW50ZWdyYWxLRVkEAAAAEHRvdGFsTWF4Qm9vc3RJbnQJAQAAAAxnZXRJbnRPclplcm8AAAACBQAAAAR0aGlzBQAAABh0b3RhbE1heEJvb3N0SW50ZWdyYWxLRVkEAAAAHnVzZXJCb29zdEF2YWxpYWJsZVRvQ2xhaW1Ub3RhbAkBAAAADGdldEludE9yWmVybwAAAAIFAAAABHRoaXMFAAAAIXVzZXJCb29zdEF2YWxhaWJsZVRvQ2xhaW1Ub3RhbEtFWQQAAAAhdXNlckJvb3N0QXZhbGlhYmxlVG9DbGFpbVRvdGFsTmV3CQAAZAAAAAIFAAAAHnVzZXJCb29zdEF2YWxpYWJsZVRvQ2xhaW1Ub3RhbAkAAGsAAAADBQAAABl1c2VyQm9vc3RFbWlzc2lvbkludGVncmFsBQAAAA91c2VyTWF4Qm9vc3RJbnQFAAAAEHRvdGFsTWF4Qm9vc3RJbnQEAAAAE3VzZXJCb29zdENsYWltZWRLRVkJAQAAABNrZXlVc2VyQm9vc3RDbGFpbWVkAAAAAQUAAAAKdXNlck51bVN0cgQAAAAQdXNlckJvb3N0Q2xhaW1lZAkBAAAADGdldEludE9yWmVybwAAAAIFAAAABHRoaXMFAAAAE3VzZXJCb29zdENsYWltZWRLRVkEAAAAEnVzZXJCb29zdEF2YWlsYWJsZQkAAGUAAAACBQAAACF1c2VyQm9vc3RBdmFsaWFibGVUb0NsYWltVG90YWxOZXcFAAAAEHVzZXJCb29zdENsYWltZWQEAAAACWRhdGFTdGF0ZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAhdXNlckJvb3N0QXZhbGFpYmxlVG9DbGFpbVRvdGFsS0VZBQAAACF1c2VyQm9vc3RBdmFsaWFibGVUb0NsYWltVG90YWxOZXcJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAIHVzZXJCb29zdEVtaXNzaW9uTGFzdEludGVncmFsS0VZBQAAABVib29zdEVtaXNzaW9uSW50ZWdyYWwFAAAAA25pbAkABRQAAAACBQAAABJ1c2VyQm9vc3RBdmFpbGFibGUFAAAACWRhdGFTdGF0ZQAAAAcAAAABaQEAAAALY29uc3RydWN0b3IAAAAGAAAAEWZhY3RvcnlBZGRyZXNzU3RyAAAADmxvY2tBc3NldElkU3RyAAAADW1pbkxvY2tBbW91bnQAAAALbWluRHVyYXRpb24AAAALbWF4RHVyYXRpb24AAAAMbWF0aENvbnRyYWN0AwkBAAAAAiE9AAAAAgUAAAAEdGhpcwgFAAAAAWkAAAAGY2FsbGVyCQAAAgAAAAECAAAADm5vdCBhdXRob3JpemVkCQAETgAAAAIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAA5rZXlOZXh0VXNlck51bQAAAAAAAAAAAAAAAAAJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAACWtleUNvbmZpZwAAAAAJAQAAAAxmb3JtYXRDb25maWcAAAAFBQAAAA5sb2NrQXNzZXRJZFN0cgUAAAANbWluTG9ja0Ftb3VudAUAAAALbWluRHVyYXRpb24FAAAAC21heER1cmF0aW9uBQAAAAxtYXRoQ29udHJhY3QJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEWtleUZhY3RvcnlBZGRyZXNzAAAAAAUAAAARZmFjdG9yeUFkZHJlc3NTdHIFAAAAA25pbAkBAAAAClN0YXRzRW50cnkAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWkBAAAABGxvY2sAAAABAAAACGR1cmF0aW9uBAAAAAhjZmdBcnJheQkBAAAAFXJlYWRDb25maWdBcnJheU9yRmFpbAAAAAAEAAAACmFzc2V0SWRTdHIJAAGRAAAAAgUAAAAIY2ZnQXJyYXkFAAAADUlkeENmZ0Fzc2V0SWQEAAAAB2Fzc2V0SWQJAAJZAAAAAQUAAAAKYXNzZXRJZFN0cgQAAAANbWluTG9ja0Ftb3VudAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAACGNmZ0FycmF5BQAAABNJZHhDZmdNaW5Mb2NrQW1vdW50BAAAAA9taW5Mb2NrRHVyYXRpb24JAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAhjZmdBcnJheQUAAAAVSWR4Q2ZnTWluTG9ja0R1cmF0aW9uBAAAAA9tYXhMb2NrRHVyYXRpb24JAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAhjZmdBcnJheQUAAAAVSWR4Q2ZnTWF4TG9ja0R1cmF0aW9uBAAAAAxtYXRoQ29udHJhY3QJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEJAAGRAAAAAgUAAAAIY2ZnQXJyYXkFAAAAEklkeENmZ01hdGhDb250cmFjdAMJAQAAAAIhPQAAAAIJAAGQAAAAAQgFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEJAAACAAAAAQIAAAA0aW52YWxpZCBwYXltZW50IC0gZXhhY3Qgb25lIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQAAAADcG10CQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAABAAAAAlwbXRBbW91bnQIBQAAAANwbXQAAAAGYW1vdW50AwkBAAAAAiE9AAAAAgUAAAAHYXNzZXRJZAkBAAAABXZhbHVlAAAAAQgFAAAAA3BtdAAAAAdhc3NldElkCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACAgAAAB5pbnZhbGlkIGFzc2V0IGlzIGluIHBheW1lbnQgLSAFAAAACmFzc2V0SWRTdHICAAAADCBpcyBleHBlY3RlZAQAAAAObmV4dFVzZXJOdW1LRVkJAQAAAA5rZXlOZXh0VXNlck51bQAAAAAEAAAADnVzZXJBZGRyZXNzU3RyCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAAOdXNlcklzRXhpc3RpbmcJAQAAAAlpc0RlZmluZWQAAAABCQAEIgAAAAEJAQAAABJrZXlVc2VyMk51bU1hcHBpbmcAAAABBQAAAA51c2VyQWRkcmVzc1N0cgQAAAAKdXNlck51bVN0cgMFAAAADnVzZXJJc0V4aXN0aW5nCQEAAAAFdmFsdWUAAAABCQAEIgAAAAEJAQAAABJrZXlVc2VyMk51bU1hcHBpbmcAAAABBQAAAA51c2VyQWRkcmVzc1N0cgkAAaQAAAABCQEAAAAMZ2V0SW50T3JGYWlsAAAAAgUAAAAEdGhpcwUAAAAObmV4dFVzZXJOdW1LRVkEAAAAB3VzZXJOdW0JAQAAAA1wYXJzZUludFZhbHVlAAAAAQUAAAAKdXNlck51bVN0cgQAAAAJbG9ja1N0YXJ0BQAAAAZoZWlnaHQEAAAADXN0YXJ0QmxvY2tLRVkJAQAAABZrZXlMb2NrUGFyYW1TdGFydEJsb2NrAAAAAQUAAAAKdXNlck51bVN0cgQAAAALZHVyYXRpb25LRVkJAQAAABRrZXlMb2NrUGFyYW1EdXJhdGlvbgAAAAEFAAAACnVzZXJOdW1TdHIEAAAADXVzZXJBbW91bnRLRVkJAQAAABZrZXlMb2NrUGFyYW1Vc2VyQW1vdW50AAAAAQUAAAAKdXNlck51bVN0cgMJAABmAAAAAgUAAAANbWluTG9ja0Ftb3VudAUAAAAJcG10QW1vdW50CQAAAgAAAAEJAAEsAAAAAgIAAAAiYW1vdW50IGlzIGxlc3MgdGhlbiBtaW5Mb2NrQW1vdW50PQkAAaQAAAABBQAAAA1taW5Mb2NrQW1vdW50AwkAAGYAAAACBQAAAA9taW5Mb2NrRHVyYXRpb24FAAAACGR1cmF0aW9uCQAAAgAAAAEJAAEsAAAAAgIAAAAtcGFzc2VkIGR1cmF0aW9uIGlzIGxlc3MgdGhlbiBtaW5Mb2NrRHVyYXRpb249CQABpAAAAAEFAAAAD21pbkxvY2tEdXJhdGlvbgMJAABmAAAAAgUAAAAIZHVyYXRpb24FAAAAD21heExvY2tEdXJhdGlvbgkAAAIAAAABCQABLAAAAAICAAAAMHBhc3NlZCBkdXJhdGlvbiBpcyBncmVhdGVyIHRoZW4gbWF4TG9ja0R1cmF0aW9uPQkAAaQAAAABBQAAAA9tYXhMb2NrRHVyYXRpb24DAwUAAAAOdXNlcklzRXhpc3RpbmcJAABnAAAAAgkAAGQAAAACCQEAAAAMZ2V0SW50T3JGYWlsAAAAAgUAAAAEdGhpcwUAAAANc3RhcnRCbG9ja0tFWQkBAAAADGdldEludE9yRmFpbAAAAAIFAAAABHRoaXMFAAAAC2R1cmF0aW9uS0VZBQAAAAlsb2NrU3RhcnQHCQAAAgAAAAECAAAANnRoZXJlIGlzIGFuIGFjdGl2ZSBsb2NrIC0gY29uc2lkZXIgdG8gdXNlIGluY3JlYXNlTG9jawQAAAAHY29lZmZYOAkAAGsAAAADBQAAAAhkdXJhdGlvbgUAAAAFTVVMVDgFAAAAD21heExvY2tEdXJhdGlvbgQAAAAOZ1d4QW1vdW50U3RhcnQJAABrAAAAAwUAAAAJcG10QW1vdW50BQAAAAdjb2VmZlg4BQAAAAVNVUxUOAQAAAATZ1d4UGFyYW1zUmVzdWx0TGlzdAkBAAAACWFzQW55TGlzdAAAAAEJAAP8AAAABAUAAAAMbWF0aENvbnRyYWN0AgAAABVjYWxjR3d4UGFyYW1zUkVBRE9OTFkJAARMAAAAAgUAAAAOZ1d4QW1vdW50U3RhcnQJAARMAAAAAgUAAAAJbG9ja1N0YXJ0CQAETAAAAAIFAAAACGR1cmF0aW9uBQAAAANuaWwFAAAAA25pbAQAAAABawkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAABNnV3hQYXJhbXNSZXN1bHRMaXN0AAAAAAAAAAAABAAAAAFiCQEAAAAFYXNJbnQAAAABCQABkQAAAAIFAAAAE2dXeFBhcmFtc1Jlc3VsdExpc3QAAAAAAAAAAAEEAAAABnBlcmlvZAkAAaQAAAABCQEAAAAFYXNJbnQAAAABCQABkQAAAAIFAAAAE2dXeFBhcmFtc1Jlc3VsdExpc3QAAAAAAAAAAAIEAAAAEnd4RW1pc3Npb25QZXJCbG9jawkBAAAADGdldEludE9yRmFpbAAAAAIFAAAAEGVtaXNzaW9uQ29udHJhY3QJAQAAAB5rZXlFbWlzc2lvblJhdGVQZXJCbG9ja0N1cnJlbnQAAAAABAAAAA1lbWlzc2lvblN0YXJ0CQEAAAAMZ2V0SW50T3JGYWlsAAAAAgUAAAAQZW1pc3Npb25Db250cmFjdAkBAAAAFWtleUVtaXNzaW9uU3RhcnRCbG9jawAAAAAEAAAAC2VtaXNzaW9uRW5kCQEAAAAMZ2V0SW50T3JGYWlsAAAAAgUAAAAQZW1pc3Npb25Db250cmFjdAkBAAAAE2tleUVtaXNzaW9uRW5kQmxvY2sAAAAABAAAAAFoAwkAAGYAAAACBQAAAAZoZWlnaHQFAAAAC2VtaXNzaW9uRW5kBQAAAAtlbWlzc2lvbkVuZAUAAAAGaGVpZ2h0BAAAAAJkaAkAAZYAAAABCQAETAAAAAIJAABlAAAAAgUAAAABaAUAAAANZW1pc3Npb25TdGFydAkABEwAAAACAAAAAAAAAAAABQAAAANuaWwEAAAAIHVzZXJCb29zdEVtaXNzaW9uTGFzdEludGVncmFsS0VZCQEAAAAga2V5VXNlckJvb3N0RW1pc3Npb25MYXN0SU5URUdSQUwAAAABBQAAAAp1c2VyTnVtU3RyBAAAABVib29zdEVtaXNzaW9uSW50ZWdyYWwJAABpAAAAAgkAAGgAAAACCQAAaAAAAAIFAAAAEnd4RW1pc3Npb25QZXJCbG9jawUAAAACZGgAAAAAAAAAAAIAAAAAAAAAAAMEAAAAF3VzZXJNYXhCb29zdEludGVncmFsS0VZCQEAAAAXa2V5VXNlck1heEJvb3N0SU5URUdSQUwAAAABBQAAAAp1c2VyTnVtU3RyBAAAABh0b3RhbE1heEJvb3N0SW50ZWdyYWxLRVkJAQAAABhrZXlUb3RhbE1heEJvb3N0SU5URUdSQUwAAAAABAAAAA91c2VyTWF4Qm9vc3RJbnQJAABpAAAAAgkAAGgAAAACBQAAAA5nV3hBbW91bnRTdGFydAUAAAAIZHVyYXRpb24AAAAAAAAAAAIEAAAAEHRvdGFsTWF4Qm9vc3RJbnQJAQAAAAxnZXRJbnRPclplcm8AAAACBQAAAAR0aGlzBQAAABh0b3RhbE1heEJvb3N0SW50ZWdyYWxLRVkEAAAAA2FycgMFAAAADnVzZXJJc0V4aXN0aW5nBQAAAANuaWwJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAADm5leHRVc2VyTnVtS0VZCQAAZAAAAAIFAAAAB3VzZXJOdW0AAAAAAAAAAAEJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEmtleVVzZXIyTnVtTWFwcGluZwAAAAEFAAAADnVzZXJBZGRyZXNzU3RyBQAAAAp1c2VyTnVtU3RyCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABJrZXlOdW0yVXNlck1hcHBpbmcAAAABBQAAAAp1c2VyTnVtU3RyBQAAAA51c2VyQWRkcmVzc1N0cgUAAAADbmlsCQAETgAAAAIJAARNAAAAAgkABE4AAAACCQAETgAAAAIFAAAAA2FycgkBAAAAD0xvY2tQYXJhbXNFbnRyeQAAAAgFAAAADnVzZXJBZGRyZXNzU3RyBQAAAAp1c2VyTnVtU3RyBQAAAAlwbXRBbW91bnQFAAAACWxvY2tTdGFydAUAAAAIZHVyYXRpb24FAAAAAWsFAAAAAWIFAAAABnBlcmlvZAkBAAAAClN0YXRzRW50cnkAAAAEBQAAAAlwbXRBbW91bnQFAAAACGR1cmF0aW9uAAAAAAAAAAABAwUAAAAOdXNlcklzRXhpc3RpbmcAAAAAAAAAAAAAAAAAAAAAAAEJAQAAAAxIaXN0b3J5RW50cnkAAAAIAgAAAARsb2NrBQAAAA51c2VyQWRkcmVzc1N0cgUAAAAJcG10QW1vdW50BQAAAAlsb2NrU3RhcnQFAAAACGR1cmF0aW9uBQAAAAFrBQAAAAFiBQAAAAFpCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAACB1c2VyQm9vc3RFbWlzc2lvbkxhc3RJbnRlZ3JhbEtFWQUAAAAVYm9vc3RFbWlzc2lvbkludGVncmFsCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABd1c2VyTWF4Qm9vc3RJbnRlZ3JhbEtFWQUAAAAPdXNlck1heEJvb3N0SW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABh0b3RhbE1heEJvb3N0SW50ZWdyYWxLRVkJAABkAAAAAgUAAAAQdG90YWxNYXhCb29zdEludAUAAAAPdXNlck1heEJvb3N0SW50BQAAAANuaWwAAAABaQEAAAAMaW5jcmVhc2VMb2NrAAAAAQAAAA1kZWx0YUR1cmF0aW9uBAAAAAhjZmdBcnJheQkBAAAAFXJlYWRDb25maWdBcnJheU9yRmFpbAAAAAAEAAAACmFzc2V0SWRTdHIJAAGRAAAAAgUAAAAIY2ZnQXJyYXkFAAAADUlkeENmZ0Fzc2V0SWQEAAAAB2Fzc2V0SWQJAAJZAAAAAQUAAAAKYXNzZXRJZFN0cgQAAAAPbWluTG9ja0R1cmF0aW9uCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAIY2ZnQXJyYXkFAAAAFUlkeENmZ01pbkxvY2tEdXJhdGlvbgQAAAAPbWF4TG9ja0R1cmF0aW9uCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAIY2ZnQXJyYXkFAAAAFUlkeENmZ01heExvY2tEdXJhdGlvbgQAAAAMbWF0aENvbnRyYWN0CQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQABkQAAAAIFAAAACGNmZ0FycmF5BQAAABJJZHhDZmdNYXRoQ29udHJhY3QEAAAACXBtdEFtb3VudAkBAAAAImV4dHJhY3RPcHRpb25hbFBheW1lbnRBbW91bnRPckZhaWwAAAACBQAAAAFpBQAAAAdhc3NldElkBAAAAA51c2VyQWRkcmVzc1N0cgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAAD3VzZXJSZWNvcmRBcnJheQkBAAAAGnJlYWRMb2NrUGFyYW1zUmVjb3JkT3JGYWlsAAAAAQUAAAAOdXNlckFkZHJlc3NTdHIEAAAACnVzZXJOdW1TdHIJAAGRAAAAAgUAAAAPdXNlclJlY29yZEFycmF5BQAAAA5JZHhMb2NrVXNlck51bQQAAAAKdXNlckFtb3VudAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAD3VzZXJSZWNvcmRBcnJheQUAAAANSWR4TG9ja0Ftb3VudAQAAAAJbG9ja1N0YXJ0CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAPdXNlclJlY29yZEFycmF5BQAAAAxJZHhMb2NrU3RhcnQEAAAADGxvY2tEdXJhdGlvbgkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAD3VzZXJSZWNvcmRBcnJheQUAAAAPSWR4TG9ja0R1cmF0aW9uBAAAAAdsb2NrRW5kCQAAZAAAAAIFAAAACWxvY2tTdGFydAUAAAAMbG9ja0R1cmF0aW9uBAAAABFyZW1haW5pbmdEdXJhdGlvbgkAAZYAAAABCQAETAAAAAIJAABlAAAAAgUAAAAHbG9ja0VuZAUAAAAGaGVpZ2h0CQAETAAAAAIAAAAAAAAAAAAFAAAAA25pbAQAAAANdXNlckFtb3VudE5ldwkAAGQAAAACBQAAAAp1c2VyQW1vdW50BQAAAAlwbXRBbW91bnQEAAAAD2xvY2tEdXJhdGlvbk5ldwkAAGQAAAACBQAAABFyZW1haW5pbmdEdXJhdGlvbgUAAAANZGVsdGFEdXJhdGlvbgMJAABmAAAAAgAAAAAAAAAAAAUAAAANZGVsdGFEdXJhdGlvbgkAAAIAAAABAgAAABpkdXJhdGlvbiBpcyBsZXNzIHRoZW4gemVybwMJAABmAAAAAgUAAAAPbWluTG9ja0R1cmF0aW9uBQAAAA9sb2NrRHVyYXRpb25OZXcJAAACAAAAAQkAASwAAAACAgAAAC1sb2NrRHVyYXRpb25OZXcgaXMgbGVzcyB0aGVuIG1pbkxvY2tEdXJhdGlvbj0JAAGkAAAAAQUAAAAPbWluTG9ja0R1cmF0aW9uAwkAAGYAAAACBQAAAA9sb2NrRHVyYXRpb25OZXcFAAAAD21heExvY2tEdXJhdGlvbgkAAAIAAAABCQABLAAAAAICAAAARGRlbHRhRHVyYXRpb24gKyBleGlzdGVkTG9ja0R1cmF0aW9uIGlzIGdyZWF0ZXIgdGhlbiBtYXhMb2NrRHVyYXRpb249CQABpAAAAAEFAAAAD21heExvY2tEdXJhdGlvbgMDCQAAZwAAAAIFAAAABmhlaWdodAUAAAAHbG9ja0VuZAkAAGYAAAACBQAAAAp1c2VyQW1vdW50AAAAAAAAAAAABwkAAAIAAAABAgAAADl0aGVyZSBpcyBhbiBleHBpcmVkIGxvY2sgLSBuZWVkIHRvIHVubG9jayBiZWZvcmUgbmV3IGxvY2sEAAAAB2NvZWZmWDgJAABrAAAAAwUAAAAPbG9ja0R1cmF0aW9uTmV3BQAAAAVNVUxUOAUAAAAPbWF4TG9ja0R1cmF0aW9uBAAAAA5nV3hBbW91bnRTdGFydAkAAGsAAAADBQAAAA11c2VyQW1vdW50TmV3BQAAAAdjb2VmZlg4BQAAAAVNVUxUOAQAAAATZ1d4UGFyYW1zUmVzdWx0TGlzdAkBAAAACWFzQW55TGlzdAAAAAEJAAP8AAAABAUAAAAMbWF0aENvbnRyYWN0AgAAABVjYWxjR3d4UGFyYW1zUkVBRE9OTFkJAARMAAAAAgUAAAAOZ1d4QW1vdW50U3RhcnQJAARMAAAAAgUAAAAGaGVpZ2h0CQAETAAAAAIFAAAAD2xvY2tEdXJhdGlvbk5ldwUAAAADbmlsBQAAAANuaWwEAAAAAWsJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAATZ1d4UGFyYW1zUmVzdWx0TGlzdAAAAAAAAAAAAAQAAAABYgkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAABNnV3hQYXJhbXNSZXN1bHRMaXN0AAAAAAAAAAABBAAAAAZwZXJpb2QJAAGkAAAAAQkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAABNnV3hQYXJhbXNSZXN1bHRMaXN0AAAAAAAAAAACBAAAABJ3eEVtaXNzaW9uUGVyQmxvY2sJAQAAAAxnZXRJbnRPckZhaWwAAAACBQAAABBlbWlzc2lvbkNvbnRyYWN0CQEAAAAea2V5RW1pc3Npb25SYXRlUGVyQmxvY2tDdXJyZW50AAAAAAQAAAANZW1pc3Npb25TdGFydAkBAAAADGdldEludE9yRmFpbAAAAAIFAAAAEGVtaXNzaW9uQ29udHJhY3QJAQAAABVrZXlFbWlzc2lvblN0YXJ0QmxvY2sAAAAABAAAAAtlbWlzc2lvbkVuZAkBAAAADGdldEludE9yRmFpbAAAAAIFAAAAEGVtaXNzaW9uQ29udHJhY3QJAQAAABNrZXlFbWlzc2lvbkVuZEJsb2NrAAAAAAQAAAABaAMJAABmAAAAAgUAAAAGaGVpZ2h0BQAAAAtlbWlzc2lvbkVuZAUAAAALZW1pc3Npb25FbmQFAAAABmhlaWdodAQAAAACZGgJAAGWAAAAAQkABEwAAAACCQAAZQAAAAIFAAAAAWgFAAAADWVtaXNzaW9uU3RhcnQJAARMAAAAAgAAAAAAAAAAAAUAAAADbmlsBAAAACB1c2VyQm9vc3RFbWlzc2lvbkxhc3RJbnRlZ3JhbEtFWQkBAAAAIGtleVVzZXJCb29zdEVtaXNzaW9uTGFzdElOVEVHUkFMAAAAAQUAAAAKdXNlck51bVN0cgQAAAAddXNlckJvb3N0RW1pc3Npb25MYXN0SW50ZWdyYWwJAQAAAAxnZXRJbnRPclplcm8AAAACBQAAAAR0aGlzBQAAACB1c2VyQm9vc3RFbWlzc2lvbkxhc3RJbnRlZ3JhbEtFWQQAAAAVYm9vc3RFbWlzc2lvbkludGVncmFsCQAAaQAAAAIJAABoAAAAAgkAAGgAAAACBQAAABJ3eEVtaXNzaW9uUGVyQmxvY2sFAAAAAmRoAAAAAAAAAAACAAAAAAAAAAADBAAAABl1c2VyQm9vc3RFbWlzc2lvbkludGVncmFsCQAAZQAAAAIFAAAAFWJvb3N0RW1pc3Npb25JbnRlZ3JhbAUAAAAddXNlckJvb3N0RW1pc3Npb25MYXN0SW50ZWdyYWwDCQAAZgAAAAIAAAAAAAAAAAAFAAAAGXVzZXJCb29zdEVtaXNzaW9uSW50ZWdyYWwJAAACAAAAAQIAAAASd3JvbmcgY2FsY3VsYXRpb25zBAAAABd1c2VyTWF4Qm9vc3RJbnRlZ3JhbEtFWQkBAAAAF2tleVVzZXJNYXhCb29zdElOVEVHUkFMAAAAAQUAAAAKdXNlck51bVN0cgQAAAAYdG90YWxNYXhCb29zdEludGVncmFsS0VZCQEAAAAYa2V5VG90YWxNYXhCb29zdElOVEVHUkFMAAAAAAQAAAAhdXNlckJvb3N0QXZhbGFpYmxlVG9DbGFpbVRvdGFsS0VZCQEAAAAha2V5VXNlckJvb3N0QXZhbGFpYmxlVG9DbGFpbVRvdGFsAAAAAQUAAAAKdXNlck51bVN0cgQAAAAPdXNlck1heEJvb3N0SW50CQEAAAAMZ2V0SW50T3JaZXJvAAAAAgUAAAAEdGhpcwUAAAAXdXNlck1heEJvb3N0SW50ZWdyYWxLRVkEAAAAEHRvdGFsTWF4Qm9vc3RJbnQJAQAAAAxnZXRJbnRPclplcm8AAAACBQAAAAR0aGlzBQAAABh0b3RhbE1heEJvb3N0SW50ZWdyYWxLRVkEAAAAHnVzZXJCb29zdEF2YWxpYWJsZVRvQ2xhaW1Ub3RhbAkBAAAADGdldEludE9yWmVybwAAAAIFAAAABHRoaXMFAAAAIXVzZXJCb29zdEF2YWxhaWJsZVRvQ2xhaW1Ub3RhbEtFWQQAAAAhdXNlckJvb3N0QXZhbGlhYmxlVG9DbGFpbVRvdGFsTmV3CQAAZAAAAAIFAAAAHnVzZXJCb29zdEF2YWxpYWJsZVRvQ2xhaW1Ub3RhbAkAAGsAAAADBQAAABl1c2VyQm9vc3RFbWlzc2lvbkludGVncmFsBQAAAA91c2VyTWF4Qm9vc3RJbnQFAAAAEHRvdGFsTWF4Qm9vc3RJbnQEAAAAEnVzZXJNYXhCb29zdEludE5ldwkAAGkAAAACCQAAaAAAAAIFAAAADmdXeEFtb3VudFN0YXJ0BQAAAA9sb2NrRHVyYXRpb25OZXcAAAAAAAAAAAIEAAAAC2N1cnJVc2VyR3d4CQEAAAAUY2FsY0N1cnJlbnRHd3hBbW91bnQAAAABBQAAAA51c2VyQWRkcmVzc1N0cgQAAAAYcmVtYWluaW5nVXNlck1heEJvb3N0SW50CQAAaQAAAAIJAABoAAAAAgUAAAALY3VyclVzZXJHd3gFAAAAEXJlbWFpbmluZ0R1cmF0aW9uAAAAAAAAAAACBAAAABN1c2VyTWF4Qm9vc3RJbnREaWZmCQAAZQAAAAIFAAAAEnVzZXJNYXhCb29zdEludE5ldwUAAAAYcmVtYWluaW5nVXNlck1heEJvb3N0SW50AwkAAGYAAAACAAAAAAAAAAAABQAAABN1c2VyTWF4Qm9vc3RJbnREaWZmCQAAAgAAAAECAAAAEndyb25nIGNhbGN1bGF0aW9ucwkABE4AAAACCQAETQAAAAIJAAROAAAAAgkBAAAAD0xvY2tQYXJhbXNFbnRyeQAAAAgFAAAADnVzZXJBZGRyZXNzU3RyBQAAAAp1c2VyTnVtU3RyBQAAAA11c2VyQW1vdW50TmV3BQAAAAlsb2NrU3RhcnQFAAAAD2xvY2tEdXJhdGlvbk5ldwUAAAABawUAAAABYgUAAAAGcGVyaW9kCQEAAAAKU3RhdHNFbnRyeQAAAAQFAAAACXBtdEFtb3VudAUAAAANZGVsdGFEdXJhdGlvbgAAAAAAAAAAAAAAAAAAAAAAAAkBAAAADEhpc3RvcnlFbnRyeQAAAAgCAAAABGxvY2sFAAAADnVzZXJBZGRyZXNzU3RyBQAAAAlwbXRBbW91bnQFAAAACWxvY2tTdGFydAUAAAAPbG9ja0R1cmF0aW9uTmV3BQAAAAFrBQAAAAFiBQAAAAFpCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABd1c2VyTWF4Qm9vc3RJbnRlZ3JhbEtFWQUAAAATdXNlck1heEJvb3N0SW50RGlmZgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAYdG90YWxNYXhCb29zdEludGVncmFsS0VZCQAAZAAAAAIFAAAAEHRvdGFsTWF4Qm9vc3RJbnQFAAAAE3VzZXJNYXhCb29zdEludERpZmYJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAIXVzZXJCb29zdEF2YWxhaWJsZVRvQ2xhaW1Ub3RhbEtFWQUAAAAhdXNlckJvb3N0QXZhbGlhYmxlVG9DbGFpbVRvdGFsTmV3CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAACB1c2VyQm9vc3RFbWlzc2lvbkxhc3RJbnRlZ3JhbEtFWQUAAAAVYm9vc3RFbWlzc2lvbkludGVncmFsBQAAAANuaWwAAAABaQEAAAAMY2xhaW1XeEJvb3N0AAAAAQAAAA51c2VyQWRkcmVzc1N0cgMJAQAAAAIhPQAAAAIFAAAAD3N0YWtpbmdDb250cmFjdAgFAAAAAWkAAAAGY2FsbGVyCQAAAgAAAAECAAAAEnBlcm1pc3Npb25zIGRlbmllZAQAAAANJHQwMjE5MDcyMTk4MQkBAAAAFGludGVybmFsQ2xhaW1XeEJvb3N0AAAAAQUAAAAOdXNlckFkZHJlc3NTdHIEAAAAEnVzZXJCb29zdEF2YWlsYWJsZQgFAAAADSR0MDIxOTA3MjE5ODEAAAACXzEEAAAACWRhdGFTdGF0ZQgFAAAADSR0MDIxOTA3MjE5ODEAAAACXzIJAAUUAAAAAgUAAAAJZGF0YVN0YXRlCQAETAAAAAIFAAAAEnVzZXJCb29zdEF2YWlsYWJsZQUAAAADbmlsAAAAAWkBAAAAFGNsYWltV3hCb29zdFJFQURPTkxZAAAAAQAAAA51c2VyQWRkcmVzc1N0cgQAAAANJHQwMjIwOTEyMjE2NQkBAAAAFGludGVybmFsQ2xhaW1XeEJvb3N0AAAAAQUAAAAOdXNlckFkZHJlc3NTdHIEAAAAEnVzZXJCb29zdEF2YWlsYWJsZQgFAAAADSR0MDIyMDkxMjIxNjUAAAACXzEEAAAACWRhdGFTdGF0ZQgFAAAADSR0MDIyMDkxMjIxNjUAAAACXzIJAAUUAAAAAgUAAAADbmlsCQAETAAAAAIFAAAAEnVzZXJCb29zdEF2YWlsYWJsZQUAAAADbmlsAAAAAWkBAAAABnVubG9jawAAAAEAAAALdXNlckFkZHJlc3MEAAAAD3VzZXJSZWNvcmRBcnJheQkBAAAAGnJlYWRMb2NrUGFyYW1zUmVjb3JkT3JGYWlsAAAAAQUAAAALdXNlckFkZHJlc3MEAAAACnVzZXJOdW1TdHIJAAGRAAAAAgUAAAAPdXNlclJlY29yZEFycmF5BQAAAA5JZHhMb2NrVXNlck51bQQAAAAKdXNlckFtb3VudAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAD3VzZXJSZWNvcmRBcnJheQUAAAANSWR4TG9ja0Ftb3VudAQAAAAJbG9ja1N0YXJ0CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAPdXNlclJlY29yZEFycmF5BQAAAAxJZHhMb2NrU3RhcnQEAAAADGxvY2tEdXJhdGlvbgkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAD3VzZXJSZWNvcmRBcnJheQUAAAAPSWR4TG9ja0R1cmF0aW9uBAAAAAdsb2NrRW5kCQAAZAAAAAIFAAAACWxvY2tTdGFydAUAAAAMbG9ja0R1cmF0aW9uBAAAAAhjZmdBcnJheQkBAAAAFXJlYWRDb25maWdBcnJheU9yRmFpbAAAAAAEAAAAB2Fzc2V0SWQJAAJZAAAAAQkAAZEAAAACBQAAAAhjZmdBcnJheQUAAAANSWR4Q2ZnQXNzZXRJZAMJAABnAAAAAgUAAAAHbG9ja0VuZAUAAAAGaGVpZ2h0CQAAAgAAAAEJAAEsAAAAAgkAASwAAAACAgAAAAV3YWl0IAkAAaQAAAABBQAAAAdsb2NrRW5kAgAAAAogdG8gdW5sb2NrAwkAAGcAAAACAAAAAAAAAAAABQAAAAp1c2VyQW1vdW50CQAAAgAAAAECAAAAEW5vdGhpbmcgdG8gdW5sb2NrBAAAAAZwZXJpb2QCAAAAATAJAARNAAAAAgkABE0AAAACCQAETgAAAAIJAQAAAA9Mb2NrUGFyYW1zRW50cnkAAAAIBQAAAAt1c2VyQWRkcmVzcwUAAAAKdXNlck51bVN0cgAAAAAAAAAAAAUAAAAJbG9ja1N0YXJ0BQAAAAxsb2NrRHVyYXRpb24AAAAAAAAAAAAAAAAAAAAAAAAFAAAABnBlcmlvZAkBAAAAClN0YXRzRW50cnkAAAAECQEAAAABLQAAAAEFAAAACnVzZXJBbW91bnQAAAAAAAAAAAAAAAAAAAAAAAAA//////////8JAQAAAAxIaXN0b3J5RW50cnkAAAAIAgAAAAZ1bmxvY2sFAAAAC3VzZXJBZGRyZXNzBQAAAAp1c2VyQW1vdW50BQAAAAlsb2NrU3RhcnQFAAAADGxvY2tEdXJhdGlvbgAAAAAAAAAAAAAAAAAAAAAAAAUAAAABaQkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAALdXNlckFkZHJlc3MFAAAACnVzZXJBbW91bnQFAAAAB2Fzc2V0SWQAAAABaQEAAAATZ3d4VXNlckluZm9SRUFET05MWQAAAAEAAAALdXNlckFkZHJlc3MEAAAACWd3eEFtb3VudAkBAAAAFGNhbGNDdXJyZW50R3d4QW1vdW50AAAAAQUAAAALdXNlckFkZHJlc3MJAAUUAAAAAgUAAAADbmlsCQAETAAAAAIFAAAACWd3eEFtb3VudAUAAAADbmlsAAAAABcK+YM=", "chainId": 87, "height": 2871836, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: 6yxFzDhTYhXr5QkHDD1Ks7rPyBheMN2nwpHh9yxVJYpD Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 5 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let SEP = "__"
5+
6+let SCALE8 = 8
7+
8+let MULT8 = 100000000
9+
10+func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), (("mandatory this." + key) + " is not defined"))
11+
12+
13+func getIntOrZero (address,key) = valueOrElse(getInteger(address, key), 0)
14+
15+
16+func getIntOrDefault (address,key,defaultVal) = valueOrElse(getInteger(address, key), defaultVal)
17+
18+
19+func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), (("mandatory this." + key) + " is not defined"))
20+
21+
22+func asAnyList (val) = match val {
23+ case valAnyLyst: List[Any] =>
24+ valAnyLyst
25+ case _ =>
26+ throw("fail to cast into List[Any]")
27+}
28+
29+
30+func asInt (val) = match val {
31+ case valInt: Int =>
32+ valInt
33+ case _ =>
34+ throw("fail to cast into Int")
35+}
36+
37+
38+func keyFactoryAddress () = "%s%s__config__factoryAddress"
39+
40+
41+let IdxFactoryCfgStakingDapp = 1
42+
43+let IdxFactoryCfgBoostingDapp = 2
44+
45+let IdxFactoryCfgIdoDapp = 3
46+
47+let IdxFactoryCfgTeamDapp = 4
48+
49+let IdxFactoryCfgEmissionDapp = 5
50+
51+let IdxFactoryCfgRestDapp = 6
52+
53+let IdxFactoryCfgSlippageDapp = 7
54+
55+func keyFactoryCfg () = "%s__factoryConfig"
56+
57+
58+func keyFactoryLp2AssetsMapping (lpAssetStr) = makeString(["%s%s%s", lpAssetStr, "mappings__lpAsset2PoolContract"], SEP)
59+
60+
61+func keyFactoryLpList () = "%s__lpTokensList"
62+
63+
64+func keyFactoryLpAssetToPoolContractAddress (lpAssetStr) = makeString(["%s%s%s", lpAssetStr, "mappings__lpAsset2PoolContract"], SEP)
65+
66+
67+func keyFactoryPoolWeight (contractAddress) = makeString(["%s%s", "poolWeight", contractAddress], SEP)
68+
69+
70+func readFactoryAddressOrFail () = addressFromStringValue(getStringOrFail(this, keyFactoryAddress()))
71+
72+
73+func readLpList () = split(valueOrElse(getString(readFactoryAddressOrFail(), keyFactoryLpList()), ""), SEP)
74+
75+
76+func readFactoryCfgOrFail (factory) = split(getStringOrFail(factory, keyFactoryCfg()), SEP)
77+
78+
79+func getBoostingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgBoostingDapp])
80+
81+
82+func getEmissionAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgEmissionDapp])
83+
84+
85+func getStakingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgStakingDapp])
86+
87+
88+func keyEmissionRatePerBlockCurrent () = "%s%s__ratePerBlock__current"
89+
90+
91+func keyEmissionRatePerBlockMaxCurrent () = "%s%s__ratePerBlockMax__current"
92+
93+
94+func keyEmissionStartBlock () = "%s%s__emission__startBlock"
95+
96+
97+func keyEmissionDurationInBlocks () = "%s%s__emission__duration"
98+
99+
100+func keyEmissionEndBlock () = "%s%s__emission__endBlock"
101+
102+
103+let IdxCfgAssetId = 1
104+
105+let IdxCfgMinLockAmount = 2
106+
107+let IdxCfgMinLockDuration = 3
108+
109+let IdxCfgMaxLockDuration = 4
110+
111+let IdxCfgMathContract = 5
112+
113+func keyConfig () = "%s__config"
114+
115+
116+func readConfigArrayOrFail () = split(getStringOrFail(this, keyConfig()), SEP)
117+
118+
119+func formatConfigS (assetId,minLockAmount,minLockDuration,maxLockDuration,mathContract) = makeString(["%s%d%d%d", assetId, minLockAmount, minLockDuration, maxLockDuration, mathContract], SEP)
120+
121+
122+func formatConfig (assetId,minLockAmount,minLockDuration,maxLockDuration,mathContract) = formatConfigS(assetId, toString(minLockAmount), toString(minLockDuration), toString(maxLockDuration), mathContract)
123+
124+
125+let IdxLockUserNum = 1
126+
127+let IdxLockAmount = 2
128+
129+let IdxLockStart = 3
130+
131+let IdxLockDuration = 4
132+
133+let IdxLockParamK = 5
134+
135+let IdxLockParamB = 6
136+
137+func keyLockParamsRecord (userAddress) = makeString(["%s%s__lock", userAddress], SEP)
138+
139+
140+func readLockParamsRecordOrFail (userAddress) = split(getStringOrFail(this, keyLockParamsRecord(userAddress)), SEP)
141+
142+
143+func formatLockParamsRecordS (userNum,amount,start,duration,paramK,paramB,lastUpdTimestamp,gwxAmount) = makeString(["%d%d%d%d%d%d%d%d", userNum, amount, start, duration, paramK, paramB, lastUpdTimestamp, gwxAmount], SEP)
144+
145+
146+func formatLockParamsRecord (userNum,amount,start,duration,paramK,paramB,gwxAmount) = formatLockParamsRecordS(userNum, toString(amount), toString(start), toString(duration), toString(paramK), toString(paramB), toString(lastBlock.timestamp), toString(gwxAmount))
147+
148+
149+func keyNextUserNum () = "%s__nextUserNum"
150+
151+
152+func keyUser2NumMapping (userAddress) = makeString(["%s%s%s__mapping__user2num", userAddress], SEP)
153+
154+
155+func keyNum2UserMapping (num) = makeString(["%s%s%s__mapping__num2user", num], SEP)
156+
157+
158+func keyLockParamUserAmount (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "amount"], SEP)
159+
160+
161+func keyLockParamStartBlock (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "start"], SEP)
162+
163+
164+func keyLockParamDuration (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "duration"], SEP)
165+
166+
167+func keyLockParamK (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "k"], SEP)
168+
169+
170+func keyLockParamB (userNum) = makeString(["%s%d%s__paramByUserNum", userNum, "b"], SEP)
171+
172+
173+func keyLockParamByPeriodK (userNum,period) = makeString(["%s%d%s%d__paramByPeriod", userNum, "k", period], SEP)
174+
175+
176+func keyLockParamByPeriodB (userNum,period) = makeString(["%s%d%s%d__paramByPeriod", userNum, "b", period], SEP)
177+
178+
179+func keyLockParamTotalAmount () = "%s%s__stats__activeTotalLocked"
180+
181+
182+func keyStatsLocksDurationSumInBlocks () = "%s%s__stats__locksDurationSumInBlocks"
183+
184+
185+func keyStatsLocksCount () = "%s%s__stats__locksCount"
186+
187+
188+func keyStatsUsersCount () = "%s%s__stats__activeUsersCount"
189+
190+
191+func keyUserBoostEmissionLastINTEGRAL (userNum) = makeString(["%s%d__userBoostEmissionLastInt", userNum], SEP)
192+
193+
194+func keyUserMaxBoostINTEGRAL (userNum) = makeString(["%s%d__maxBoostInt", userNum], SEP)
195+
196+
197+func keyTotalMaxBoostINTEGRAL () = "%s%s__maxBoostInt__total"
198+
199+
200+func keyUserBoostAvalaibleToClaimTotal (userNum) = makeString(["%s%d__userBoostAvaliableToClaimTotal", userNum], SEP)
201+
202+
203+func keyUserBoostClaimed (userNum) = makeString(["%s%d__userBoostClaimed", userNum], SEP)
204+
205+
206+let factoryContract = readFactoryAddressOrFail()
207+
208+let factoryCfg = readFactoryCfgOrFail(factoryContract)
209+
210+let emissionContract = getEmissionAddressOrFail(factoryCfg)
211+
212+let stakingContract = getStakingAddressOrFail(factoryCfg)
213+
214+func HistoryEntry (type,user,amount,lockStart,duration,k,b,i) = {
215+ let historyKEY = makeString(["%s%s%s%s__history", type, user, toBase58String(i.transactionId)], SEP)
216+ let historyDATA = makeString(["%d%d%d%d%d%d%d", toString(lastBlock.height), toString(lastBlock.timestamp), toString(amount), toString(lockStart), toString(duration), toString(k), toString(b)], SEP)
217+ StringEntry(historyKEY, historyDATA)
218+ }
219+
220+
221+func StatsEntry (totalLockedInc,durationInc,lockCountInc,usersCountInc) = {
222+ let locksDurationSumInBlocksKEY = keyStatsLocksDurationSumInBlocks()
223+ let locksCountKEY = keyStatsLocksCount()
224+ let usersCountKEY = keyStatsUsersCount()
225+ let totalAmountKEY = keyLockParamTotalAmount()
226+ let locksDurationSumInBlocks = getIntOrZero(this, locksDurationSumInBlocksKEY)
227+ let locksCount = getIntOrZero(this, locksCountKEY)
228+ let usersCount = getIntOrZero(this, usersCountKEY)
229+ let totalAmount = getIntOrZero(this, totalAmountKEY)
230+[IntegerEntry(locksDurationSumInBlocksKEY, (locksDurationSumInBlocks + durationInc)), IntegerEntry(locksCountKEY, (locksCount + lockCountInc)), IntegerEntry(usersCountKEY, (usersCount + usersCountInc)), IntegerEntry(totalAmountKEY, (totalAmount + totalLockedInc))]
231+ }
232+
233+
234+func calcGwxAmount (kRaw,bRaw,h) = {
235+ let SCALE = 1000
236+ (((kRaw * h) + bRaw) / SCALE)
237+ }
238+
239+
240+func LockParamsEntry (userAddress,userNum,amount,start,duration,k,b,period) = {
241+ let userAmountKEY = keyLockParamUserAmount(userNum)
242+ let startBlockKEY = keyLockParamStartBlock(userNum)
243+ let durationKEY = keyLockParamDuration(userNum)
244+ let kKEY = keyLockParamK(userNum)
245+ let bKEY = keyLockParamB(userNum)
246+ let kByPerioKEY = keyLockParamByPeriodK(userNum, period)
247+ let bByPeriodKEY = keyLockParamByPeriodB(userNum, period)
248+ let gwxAmount = calcGwxAmount(k, b, height)
249+[IntegerEntry(userAmountKEY, amount), IntegerEntry(startBlockKEY, start), IntegerEntry(durationKEY, duration), IntegerEntry(kKEY, k), IntegerEntry(bKEY, b), IntegerEntry(kByPerioKEY, k), IntegerEntry(bByPeriodKEY, b), StringEntry(keyLockParamsRecord(userAddress), formatLockParamsRecord(userNum, amount, start, duration, k, b, gwxAmount))]
250+ }
251+
252+
253+func extractOptionalPaymentAmountOrFail (i,expectedAssetId) = if ((size(i.payments) > 1))
254+ then throw("only one payment is allowed")
255+ else if ((size(i.payments) == 0))
256+ then 0
257+ else {
258+ let pmt = i.payments[0]
259+ if ((value(pmt.assetId) != expectedAssetId))
260+ then throw("invalid asset id in payment")
261+ else pmt.amount
262+ }
263+
264+
265+func calcCurrentGwxAmount (userAddress) = {
266+ let EMPTY = "empty"
267+ let user2NumMappingKEY = keyUser2NumMapping(userAddress)
268+ let userNum = valueOrElse(getString(user2NumMappingKEY), EMPTY)
269+ let k = valueOrElse(getInteger(keyLockParamK(userNum)), 0)
270+ let b = valueOrElse(getInteger(keyLockParamB(userNum)), 0)
271+ let gwxAmountCalc = calcGwxAmount(k, b, height)
272+ let gwxAmount = if ((0 > gwxAmountCalc))
273+ then 0
274+ else gwxAmountCalc
275+ gwxAmount
276+ }
277+
278+
279+func internalClaimWxBoost (userAddressStr) = {
280+ let EMPTY = "EMPTY"
281+ let userRecordOrEmpty = valueOrElse(getString(this, keyLockParamsRecord(userAddressStr)), EMPTY)
282+ if ((userRecordOrEmpty == EMPTY))
283+ then $Tuple2(0, nil)
284+ else {
285+ let userRecordArray = split(userRecordOrEmpty, SEP)
286+ let userNumStr = userRecordArray[IdxLockUserNum]
287+ let wxEmissionPerBlock = getIntOrFail(emissionContract, keyEmissionRatePerBlockCurrent())
288+ let emissionStart = getIntOrFail(emissionContract, keyEmissionStartBlock())
289+ let emissionEnd = getIntOrFail(emissionContract, keyEmissionEndBlock())
290+ let h = if ((height > emissionEnd))
291+ then emissionEnd
292+ else height
293+ let dh = max([(h - emissionStart), 0])
294+ let userBoostEmissionLastIntegralKEY = keyUserBoostEmissionLastINTEGRAL(userNumStr)
295+ let userBoostEmissionLastIntegral = getIntOrZero(this, userBoostEmissionLastIntegralKEY)
296+ let boostEmissionIntegral = (((wxEmissionPerBlock * dh) * 2) / 3)
297+ let userBoostEmissionIntegral = (boostEmissionIntegral - userBoostEmissionLastIntegral)
298+ if ((0 > userBoostEmissionIntegral))
299+ then throw("wrong calculations")
300+ else {
301+ let userMaxBoostIntegralKEY = keyUserMaxBoostINTEGRAL(userNumStr)
302+ let totalMaxBoostIntegralKEY = keyTotalMaxBoostINTEGRAL()
303+ let userBoostAvalaibleToClaimTotalKEY = keyUserBoostAvalaibleToClaimTotal(userNumStr)
304+ let userMaxBoostInt = getIntOrZero(this, userMaxBoostIntegralKEY)
305+ let totalMaxBoostInt = getIntOrZero(this, totalMaxBoostIntegralKEY)
306+ let userBoostAvaliableToClaimTotal = getIntOrZero(this, userBoostAvalaibleToClaimTotalKEY)
307+ let userBoostAvaliableToClaimTotalNew = (userBoostAvaliableToClaimTotal + fraction(userBoostEmissionIntegral, userMaxBoostInt, totalMaxBoostInt))
308+ let userBoostClaimedKEY = keyUserBoostClaimed(userNumStr)
309+ let userBoostClaimed = getIntOrZero(this, userBoostClaimedKEY)
310+ let userBoostAvailable = (userBoostAvaliableToClaimTotalNew - userBoostClaimed)
311+ let dataState = [IntegerEntry(userBoostAvalaibleToClaimTotalKEY, userBoostAvaliableToClaimTotalNew), IntegerEntry(userBoostEmissionLastIntegralKEY, boostEmissionIntegral)]
312+ $Tuple2(userBoostAvailable, dataState)
313+ }
314+ }
315+ }
316+
317+
318+@Callable(i)
319+func constructor (factoryAddressStr,lockAssetIdStr,minLockAmount,minDuration,maxDuration,mathContract) = if ((this != i.caller))
320+ then throw("not authorized")
321+ else ([IntegerEntry(keyNextUserNum(), 0), StringEntry(keyConfig(), formatConfig(lockAssetIdStr, minLockAmount, minDuration, maxDuration, mathContract)), StringEntry(keyFactoryAddress(), factoryAddressStr)] ++ StatsEntry(0, 0, 0, 0))
322+
323+
324+
325+@Callable(i)
326+func lock (duration) = {
327+ let cfgArray = readConfigArrayOrFail()
328+ let assetIdStr = cfgArray[IdxCfgAssetId]
329+ let assetId = fromBase58String(assetIdStr)
330+ let minLockAmount = parseIntValue(cfgArray[IdxCfgMinLockAmount])
331+ let minLockDuration = parseIntValue(cfgArray[IdxCfgMinLockDuration])
332+ let maxLockDuration = parseIntValue(cfgArray[IdxCfgMaxLockDuration])
333+ let mathContract = addressFromStringValue(cfgArray[IdxCfgMathContract])
334+ if ((size(i.payments) != 1))
335+ then throw("invalid payment - exact one payment must be attached")
336+ else {
337+ let pmt = i.payments[0]
338+ let pmtAmount = pmt.amount
339+ if ((assetId != value(pmt.assetId)))
340+ then throw((("invalid asset is in payment - " + assetIdStr) + " is expected"))
341+ else {
342+ let nextUserNumKEY = keyNextUserNum()
343+ let userAddressStr = toString(i.caller)
344+ let userIsExisting = isDefined(getString(keyUser2NumMapping(userAddressStr)))
345+ let userNumStr = if (userIsExisting)
346+ then value(getString(keyUser2NumMapping(userAddressStr)))
347+ else toString(getIntOrFail(this, nextUserNumKEY))
348+ let userNum = parseIntValue(userNumStr)
349+ let lockStart = height
350+ let startBlockKEY = keyLockParamStartBlock(userNumStr)
351+ let durationKEY = keyLockParamDuration(userNumStr)
352+ let userAmountKEY = keyLockParamUserAmount(userNumStr)
353+ if ((minLockAmount > pmtAmount))
354+ then throw(("amount is less then minLockAmount=" + toString(minLockAmount)))
355+ else if ((minLockDuration > duration))
356+ then throw(("passed duration is less then minLockDuration=" + toString(minLockDuration)))
357+ else if ((duration > maxLockDuration))
358+ then throw(("passed duration is greater then maxLockDuration=" + toString(maxLockDuration)))
359+ else if (if (userIsExisting)
360+ then ((getIntOrFail(this, startBlockKEY) + getIntOrFail(this, durationKEY)) >= lockStart)
361+ else false)
362+ then throw("there is an active lock - consider to use increaseLock")
363+ else {
364+ let coeffX8 = fraction(duration, MULT8, maxLockDuration)
365+ let gWxAmountStart = fraction(pmtAmount, coeffX8, MULT8)
366+ let gWxParamsResultList = asAnyList(invoke(mathContract, "calcGwxParamsREADONLY", [gWxAmountStart, lockStart, duration], nil))
367+ let k = asInt(gWxParamsResultList[0])
368+ let b = asInt(gWxParamsResultList[1])
369+ let period = toString(asInt(gWxParamsResultList[2]))
370+ let wxEmissionPerBlock = getIntOrFail(emissionContract, keyEmissionRatePerBlockCurrent())
371+ let emissionStart = getIntOrFail(emissionContract, keyEmissionStartBlock())
372+ let emissionEnd = getIntOrFail(emissionContract, keyEmissionEndBlock())
373+ let h = if ((height > emissionEnd))
374+ then emissionEnd
375+ else height
376+ let dh = max([(h - emissionStart), 0])
377+ let userBoostEmissionLastIntegralKEY = keyUserBoostEmissionLastINTEGRAL(userNumStr)
378+ let boostEmissionIntegral = (((wxEmissionPerBlock * dh) * 2) / 3)
379+ let userMaxBoostIntegralKEY = keyUserMaxBoostINTEGRAL(userNumStr)
380+ let totalMaxBoostIntegralKEY = keyTotalMaxBoostINTEGRAL()
381+ let userMaxBoostInt = ((gWxAmountStart * duration) / 2)
382+ let totalMaxBoostInt = getIntOrZero(this, totalMaxBoostIntegralKEY)
383+ let arr = if (userIsExisting)
384+ then nil
385+ else [IntegerEntry(nextUserNumKEY, (userNum + 1)), StringEntry(keyUser2NumMapping(userAddressStr), userNumStr), StringEntry(keyNum2UserMapping(userNumStr), userAddressStr)]
386+ ((((arr ++ LockParamsEntry(userAddressStr, userNumStr, pmtAmount, lockStart, duration, k, b, period)) ++ StatsEntry(pmtAmount, duration, 1, if (userIsExisting)
387+ then 0
388+ else 1)) :+ HistoryEntry("lock", userAddressStr, pmtAmount, lockStart, duration, k, b, i)) ++ [IntegerEntry(userBoostEmissionLastIntegralKEY, boostEmissionIntegral), IntegerEntry(userMaxBoostIntegralKEY, userMaxBoostInt), IntegerEntry(totalMaxBoostIntegralKEY, (totalMaxBoostInt + userMaxBoostInt))])
389+ }
390+ }
391+ }
392+ }
393+
394+
395+
396+@Callable(i)
397+func increaseLock (deltaDuration) = {
398+ let cfgArray = readConfigArrayOrFail()
399+ let assetIdStr = cfgArray[IdxCfgAssetId]
400+ let assetId = fromBase58String(assetIdStr)
401+ let minLockDuration = parseIntValue(cfgArray[IdxCfgMinLockDuration])
402+ let maxLockDuration = parseIntValue(cfgArray[IdxCfgMaxLockDuration])
403+ let mathContract = addressFromStringValue(cfgArray[IdxCfgMathContract])
404+ let pmtAmount = extractOptionalPaymentAmountOrFail(i, assetId)
405+ let userAddressStr = toString(i.caller)
406+ let userRecordArray = readLockParamsRecordOrFail(userAddressStr)
407+ let userNumStr = userRecordArray[IdxLockUserNum]
408+ let userAmount = parseIntValue(userRecordArray[IdxLockAmount])
409+ let lockStart = parseIntValue(userRecordArray[IdxLockStart])
410+ let lockDuration = parseIntValue(userRecordArray[IdxLockDuration])
411+ let lockEnd = (lockStart + lockDuration)
412+ let remainingDuration = max([(lockEnd - height), 0])
413+ let userAmountNew = (userAmount + pmtAmount)
414+ let lockDurationNew = (remainingDuration + deltaDuration)
415+ if ((0 > deltaDuration))
416+ then throw("duration is less then zero")
417+ else if ((minLockDuration > lockDurationNew))
418+ then throw(("lockDurationNew is less then minLockDuration=" + toString(minLockDuration)))
419+ else if ((lockDurationNew > maxLockDuration))
420+ then throw(("deltaDuration + existedLockDuration is greater then maxLockDuration=" + toString(maxLockDuration)))
421+ else if (if ((height >= lockEnd))
422+ then (userAmount > 0)
423+ else false)
424+ then throw("there is an expired lock - need to unlock before new lock")
425+ else {
426+ let coeffX8 = fraction(lockDurationNew, MULT8, maxLockDuration)
427+ let gWxAmountStart = fraction(userAmountNew, coeffX8, MULT8)
428+ let gWxParamsResultList = asAnyList(invoke(mathContract, "calcGwxParamsREADONLY", [gWxAmountStart, height, lockDurationNew], nil))
429+ let k = asInt(gWxParamsResultList[0])
430+ let b = asInt(gWxParamsResultList[1])
431+ let period = toString(asInt(gWxParamsResultList[2]))
432+ let wxEmissionPerBlock = getIntOrFail(emissionContract, keyEmissionRatePerBlockCurrent())
433+ let emissionStart = getIntOrFail(emissionContract, keyEmissionStartBlock())
434+ let emissionEnd = getIntOrFail(emissionContract, keyEmissionEndBlock())
435+ let h = if ((height > emissionEnd))
436+ then emissionEnd
437+ else height
438+ let dh = max([(h - emissionStart), 0])
439+ let userBoostEmissionLastIntegralKEY = keyUserBoostEmissionLastINTEGRAL(userNumStr)
440+ let userBoostEmissionLastIntegral = getIntOrZero(this, userBoostEmissionLastIntegralKEY)
441+ let boostEmissionIntegral = (((wxEmissionPerBlock * dh) * 2) / 3)
442+ let userBoostEmissionIntegral = (boostEmissionIntegral - userBoostEmissionLastIntegral)
443+ if ((0 > userBoostEmissionIntegral))
444+ then throw("wrong calculations")
445+ else {
446+ let userMaxBoostIntegralKEY = keyUserMaxBoostINTEGRAL(userNumStr)
447+ let totalMaxBoostIntegralKEY = keyTotalMaxBoostINTEGRAL()
448+ let userBoostAvalaibleToClaimTotalKEY = keyUserBoostAvalaibleToClaimTotal(userNumStr)
449+ let userMaxBoostInt = getIntOrZero(this, userMaxBoostIntegralKEY)
450+ let totalMaxBoostInt = getIntOrZero(this, totalMaxBoostIntegralKEY)
451+ let userBoostAvaliableToClaimTotal = getIntOrZero(this, userBoostAvalaibleToClaimTotalKEY)
452+ let userBoostAvaliableToClaimTotalNew = (userBoostAvaliableToClaimTotal + fraction(userBoostEmissionIntegral, userMaxBoostInt, totalMaxBoostInt))
453+ let userMaxBoostIntNew = ((gWxAmountStart * lockDurationNew) / 2)
454+ let currUserGwx = calcCurrentGwxAmount(userAddressStr)
455+ let remainingUserMaxBoostInt = ((currUserGwx * remainingDuration) / 2)
456+ let userMaxBoostIntDiff = (userMaxBoostIntNew - remainingUserMaxBoostInt)
457+ if ((0 > userMaxBoostIntDiff))
458+ then throw("wrong calculations")
459+ else (((LockParamsEntry(userAddressStr, userNumStr, userAmountNew, lockStart, lockDurationNew, k, b, period) ++ StatsEntry(pmtAmount, deltaDuration, 0, 0)) :+ HistoryEntry("lock", userAddressStr, pmtAmount, lockStart, lockDurationNew, k, b, i)) ++ [IntegerEntry(userMaxBoostIntegralKEY, userMaxBoostIntDiff), IntegerEntry(totalMaxBoostIntegralKEY, (totalMaxBoostInt + userMaxBoostIntDiff)), IntegerEntry(userBoostAvalaibleToClaimTotalKEY, userBoostAvaliableToClaimTotalNew), IntegerEntry(userBoostEmissionLastIntegralKEY, boostEmissionIntegral)])
460+ }
461+ }
462+ }
463+
464+
465+
466+@Callable(i)
467+func claimWxBoost (userAddressStr) = if ((stakingContract != i.caller))
468+ then throw("permissions denied")
469+ else {
470+ let $t02190721981 = internalClaimWxBoost(userAddressStr)
471+ let userBoostAvailable = $t02190721981._1
472+ let dataState = $t02190721981._2
473+ $Tuple2(dataState, [userBoostAvailable])
474+ }
475+
476+
477+
478+@Callable(i)
479+func claimWxBoostREADONLY (userAddressStr) = {
480+ let $t02209122165 = internalClaimWxBoost(userAddressStr)
481+ let userBoostAvailable = $t02209122165._1
482+ let dataState = $t02209122165._2
483+ $Tuple2(nil, [userBoostAvailable])
484+ }
485+
486+
487+
488+@Callable(i)
489+func unlock (userAddress) = {
490+ let userRecordArray = readLockParamsRecordOrFail(userAddress)
491+ let userNumStr = userRecordArray[IdxLockUserNum]
492+ let userAmount = parseIntValue(userRecordArray[IdxLockAmount])
493+ let lockStart = parseIntValue(userRecordArray[IdxLockStart])
494+ let lockDuration = parseIntValue(userRecordArray[IdxLockDuration])
495+ let lockEnd = (lockStart + lockDuration)
496+ let cfgArray = readConfigArrayOrFail()
497+ let assetId = fromBase58String(cfgArray[IdxCfgAssetId])
498+ if ((lockEnd >= height))
499+ then throw((("wait " + toString(lockEnd)) + " to unlock"))
500+ else if ((0 >= userAmount))
501+ then throw("nothing to unlock")
502+ else {
503+ let period = "0"
504+ (((LockParamsEntry(userAddress, userNumStr, 0, lockStart, lockDuration, 0, 0, period) ++ StatsEntry(-(userAmount), 0, 0, -1)) :+ HistoryEntry("unlock", userAddress, userAmount, lockStart, lockDuration, 0, 0, i)) :+ ScriptTransfer(addressFromStringValue(userAddress), userAmount, assetId))
505+ }
506+ }
507+
508+
509+
510+@Callable(i)
511+func gwxUserInfoREADONLY (userAddress) = {
512+ let gwxAmount = calcCurrentGwxAmount(userAddress)
513+ $Tuple2(nil, [gwxAmount])
514+ }
515+
516+

github/deemru/w8io/786bc32 
44.29 ms