tx · HJTqjVkT2SGpWG59ovziJrU9NtkVVVr9VXDqXcopL1Rn

3Mx3zmXrMcLFCafMuPtXAzR4ZPVeZYb6qLz:  -0.03500000 Waves

2022.06.07 16:51 [2086024] smart account 3Mx3zmXrMcLFCafMuPtXAzR4ZPVeZYb6qLz > SELF 0.00000000 Waves

{ "type": 13, "id": "HJTqjVkT2SGpWG59ovziJrU9NtkVVVr9VXDqXcopL1Rn", "fee": 3500000, "feeAssetId": null, "timestamp": 1654609924144, "version": 1, "sender": "3Mx3zmXrMcLFCafMuPtXAzR4ZPVeZYb6qLz", "senderPublicKey": "D28XoueZWsMfm8Y5pa6C5ZFuYoWgre2Wm8tzJANJgMnq", "proofs": [ "AmF47ysLF673eeih9qVjAD4BLEAL7rvvFmejtExSmHHy7DeK8BCEvkf9CiPeJfxEQYe4TNKruYhSrmaU6Yum7Xf" ], "script": "base64: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a2luZ0RhcHAAAAAAAAAAAAEAAAAAGUlkeEZhY3RvcnlDZmdCb29zdGluZ0RhcHAAAAAAAAAAAAIAAAAAFElkeEZhY3RvcnlDZmdJZG9EYXBwAAAAAAAAAAADAAAAABVJZHhGYWN0b3J5Q2ZnVGVhbURhcHAAAAAAAAAAAAQAAAAAGUlkeEZhY3RvcnlDZmdFbWlzc2lvbkRhcHAAAAAAAAAAAAUAAAAAFUlkeEZhY3RvcnlDZmdSZXN0RGFwcAAAAAAAAAAABgAAAAAZSWR4RmFjdG9yeUNmZ1NsaXBwYWdlRGFwcAAAAAAAAAAABwEAAAANa2V5RmFjdG9yeUNmZwAAAAACAAAAESVzX19mYWN0b3J5Q29uZmlnAQAAABNrZXlNYW5hZ2VyUHVibGljS2V5AAAAAAIAAAAUJXNfX21hbmFnZXJQdWJsaWNLZXkBAAAAGmtleVBlbmRpbmdNYW5hZ2VyUHVibGljS2V5AAAAAAIAAAAbJXNfX3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5AQAAABZrZXlTdGFibGVQb29sQWRkb25BZGRyAAAAAAIAAAAXJXNfX3N0YWJsZVBvb2xBZGRvbkFkZHIBAAAAGmtleUZhY3RvcnlMcDJBc3NldHNNYXBwaW5nAAAAAQAAAApscEFzc2V0U3RyCQAEuQAAAAIJAARMAAAAAgIAAAAGJXMlcyVzCQAETAAAAAIFAAAACmxwQXNzZXRTdHIJAARMAAAAAgIAAAAebWFwcGluZ3NfX2xwQXNzZXQyUG9vbENvbnRyYWN0BQAAAANuaWwFAAAAA1NFUAEAAAAQa2V5RmFjdG9yeUxwTGlzdAAAAAACAAAAECVzX19scFRva2Vuc0xpc3QBAAAAJmtleUZhY3RvcnlMcEFzc2V0VG9Qb29sQ29udHJhY3RBZGRyZXNzAAAAAQAAAApscEFzc2V0U3RyCQAEuQAAAAIJAARMAAAAAgIAAAAGJXMlcyVzCQAETAAAAAIFAAAACmxwQXNzZXRTdHIJAARMAAAAAgIAAAAebWFwcGluZ3NfX2xwQXNzZXQyUG9vbENvbnRyYWN0BQAAAANuaWwFAAAAA1NFUAEAAAAUa2V5RmFjdG9yeVBvb2xXZWlnaHQAAAABAAAAD2NvbnRyYWN0QWRkcmVzcwkABLkAAAACCQAETAAAAAICAAAABCVzJXMJAARMAAAAAgIAAAAKcG9vbFdlaWdodAkABEwAAAACBQAAAA9jb250cmFjdEFkZHJlc3MFAAAAA25pbAUAAAADU0VQAQAAAApyZWFkTHBMaXN0AAAAAQAAAAdmYWN0b3J5CQAEtQAAAAIJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQdAAAAAgUAAAAHZmFjdG9yeQkBAAAAEGtleUZhY3RvcnlMcExpc3QAAAAAAgAAAAAFAAAAA1NFUAEAAAAUcmVhZEZhY3RvcnlDZmdPckZhaWwAAAABAAAAB2ZhY3RvcnkJAAS1AAAAAgkBAAAAGGdldFN0cmluZ0J5QWRkcmVzc09yRmFpbAAAAAIFAAAAB2ZhY3RvcnkJAQAAAA1rZXlGYWN0b3J5Q2ZnAAAAAAUAAAADU0VQAQAAABhnZXRCb29zdGluZ0FkZHJlc3NPckZhaWwAAAABAAAACmZhY3RvcnlDZmcJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEJAAGRAAAAAgUAAAAKZmFjdG9yeUNmZwUAAAAZSWR4RmFjdG9yeUNmZ0Jvb3N0aW5nRGFwcAEAAAAYZ2V0RW1pc3Npb25BZGRyZXNzT3JGYWlsAAAAAQAAAApmYWN0b3J5Q2ZnCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQABkQAAAAIFAAAACmZhY3RvcnlDZmcFAAAAGUlkeEZhY3RvcnlDZmdFbWlzc2lvbkRhcHABAAAAF2dldFN0YWtpbmdBZGRyZXNzT3JGYWlsAAAAAQAAAApmYWN0b3J5Q2ZnCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQABkQAAAAIFAAAACmZhY3RvcnlDZmcFAAAAGElkeEZhY3RvcnlDZmdTdGFraW5nRGFwcAEAAAAea2V5RW1pc3Npb25SYXRlUGVyQmxvY2tDdXJyZW50AAAAAAIAAAAbJXMlc19fcmF0ZVBlckJsb2NrX19jdXJyZW50AQAAACFrZXlFbWlzc2lvblJhdGVQZXJCbG9ja01heEN1cnJlbnQAAAAAAgAAAB4lcyVzX19yYXRlUGVyQmxvY2tNYXhfX2N1cnJlbnQBAAAAFWtleUVtaXNzaW9uU3RhcnRCbG9jawAAAAACAAAAGiVzJXNfX2VtaXNzaW9uX19zdGFydEJsb2NrAQAAABtrZXlFbWlzc2lvbkR1cmF0aW9uSW5CbG9ja3MAAAAAAgAAABglcyVzX19lbWlzc2lvbl9fZHVyYXRpb24BAAAAE2tleUVtaXNzaW9uRW5kQmxvY2sAAAAAAgAAABglcyVzX19lbWlzc2lvbl9fZW5kQmxvY2sBAAAAD2tleVN0YWtlZEJ5VXNlcgAAAAIAAAAOdXNlckFkZHJlc3NTdHIAAAAMbHBBc3NldElkU3RyCQAEuQAAAAIJAARMAAAAAgIAAAAOJXMlcyVzX19zdGFrZWQJAARMAAAAAgUAAAAOdXNlckFkZHJlc3NTdHIJAARMAAAAAgUAAAAMbHBBc3NldElkU3RyBQAAAANuaWwFAAAAA1NFUAEAAAAOa2V5U3Rha2VkVG90YWwAAAABAAAADGxwQXNzZXRJZFN0cgkAASwAAAACAgAAABclcyVzJXNfX3N0YWtlZF9fdG90YWxfXwUAAAAMbHBBc3NldElkU3RyAQAAABBrZXlDbGFpbWVkQnlVc2VyAAAAAgAAAAxscEFzc2V0SWRTdHIAAAAOdXNlckFkZHJlc3NTdHIJAAS5AAAAAgkABEwAAAACAgAAAA8lcyVzJXNfX2NsYWltZWQJAARMAAAAAgUAAAAOdXNlckFkZHJlc3NTdHIJAARMAAAAAgUAAAAMbHBBc3NldElkU3RyBQAAAANuaWwFAAAAA1NFUAEAAAAZa2V5Q2xhaW1lZEJ5VXNlck1pblJld2FyZAAAAAIAAAAMbHBBc3NldElkU3RyAAAADnVzZXJBZGRyZXNzU3RyCQAEuQAAAAIJAARMAAAAAgIAAAAYJXMlcyVzX19jbGFpbWVkTWluUmV3YXJkCQAETAAAAAIFAAAADnVzZXJBZGRyZXNzU3RyCQAETAAAAAIFAAAADGxwQXNzZXRJZFN0cgUAAAADbmlsBQAAAANTRVABAAAAG2tleUNsYWltZWRCeVVzZXJCb29zdFJld2FyZAAAAAIAAAAMbHBBc3NldElkU3RyAAAADnVzZXJBZGRyZXNzU3RyCQAEuQAAAAIJAARMAAAAAgIAAAAaJXMlcyVzX19jbGFpbWVkQm9vc3RSZXdhcmQJAARMAAAAAgUAAAAOdXNlckFkZHJlc3NTdHIJAARMAAAAAgUAAAAMbHBBc3NldElkU3RyBQAAAANu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bAUAAAADU0VQAQAAABVPcGVyYXRpb25IaXN0b3J5RW50cnkAAAAFAAAABHR5cGUAAAALdXNlckFkZHJlc3MAAAAJbHBBc3NldElkAAAABmFtb3VudAAAAAR0eElkCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAZa2V5T3BlcmF0aW9uSGlzdG9yeVJlY29yZAAAAAMFAAAABHR5cGUFAAAAC3VzZXJBZGRyZXNzCQACWAAAAAEFAAAABHR4SWQJAQAAABNmb3JtYXRIaXN0b3J5UmVjb3JkAAAABAUAAAALdXNlckFkZHJlc3MFAAAACWxwQXNzZXRJZAUAAAAEdHlwZQUAAAAGYW1vdW50AAAAAA5mYWN0b3J5QWRkcmVzcwkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAEJAQAAABFrZXlGYWN0b3J5QWRkcmVzcwAAAAAAAAAAD2ZhY3RvcnlDb250cmFjdAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAAOZmFjdG9yeUFkZHJlc3MAAAAACmZhY3RvcnlDZmcJAQAAABRyZWFkRmFjdG9yeUNmZ09yRmFpbAAAAAEFAAAAD2ZhY3RvcnlDb250cmFjdAAAAAAQZW1pc3Npb25Db250cmFjdAkBAAAAGGdldEVtaXNzaW9uQWRkcmVzc09yRmFpbAAAAAEFAAAACmZhY3RvcnlDZmcAAAAAEGJvb3N0aW5nQ29udHJhY3QJAQAAABhnZXRCb29zdGluZ0FkZHJlc3NPckZhaWwAAAABBQAAAApmYWN0b3J5Q2ZnAQAAABtjYWxjV3hQZXJMcEludGVncmFsVXNlckxhc3QAAAAEAAAADHN0YWtlZEJ5VXNlcgAAACZ3eFBlckxwSW50ZWdyYWxVc2VyTGFzdFVwZEhlaWdodE9yWmVybwAAABJ3eFBlckxwSW50ZWdyYWxOZXcAAAAad3hQZXJMcEludGVncmFsVXNlckxhc3RLRVkDAwkAAAAAAAACBQAAACZ3eFBlckxwSW50ZWdyYWxVc2VyTGFzdFVwZEhlaWdodE9yWmVybwAAAAAAAAAAAAkAAGYAAAACBQAAAAxzdGFrZWRCeVVzZXIAAAAAAAAAAAAHAAAAAAAAAAAAAwkAAAAAAAACBQAAAAxzdGFrZWRCeVVzZXIAAAAAAAAAAAAFAAAAEnd4UGVyTHBJbnRlZ3JhbE5ldwMDCQAAZgAAAAIFAAAAJnd4UGVyTHBJbnRlZ3JhbFVzZXJMYXN0VXBkSGVpZ2h0T3JaZXJvAAAAAAAAAAAACQAAZgAAAAIFAAAADHN0YWtlZEJ5VXNlcgAAAAAAAAAAAAcJAQAAAAxnZXRJbnRPckZhaWwAAAACBQAAAAR0aGlzBQAAABp3eFBlckxwSW50ZWdyYWxVc2VyTGFzdEtFWQkAAAIAAAABAgAAAC1jYWxjV3hQZXJMcEludGVncmFsVXNlckxhc3Q6IHVuZXhwZWN0ZWQgc3RhdGUBAAAAFHJlZnJlc2hQb29sSU5URUdSQUxTAAAAAwAAAAxscEFzc2V0SWRTdHIAAAAOcG9vbEFkZHJlc3NTdHIAAAANbHBEZWx0YUFtb3VudAQAAAAOc3Rha2VkVG90YWxLRVkJAQAAAA5rZXlTdGFrZWRUb3RhbAAAAAEFAAAADGxwQXNzZXRJZFN0cgQAAAALc3Rha2VkVG90YWwJAQAAAApyZWFkU3Rha2VkAAAAAQUAAAAOc3Rha2VkVG90YWxLRVkEAAAACnBvb2xXZWlnaHQJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAAD2ZhY3RvcnlDb250cmFjdAkBAAAAFGtleUZhY3RvcnlQb29sV2VpZ2h0AAAAAQUAAAAOcG9vbEFkZHJlc3NTdHIEAAAAEmVtaXNzaW9uU3RhcnRCbG9jawkBAAAADGdldEludE9yRmFpbAAAAAIFAAAAEGVtaXNzaW9uQ29udHJhY3QJAQAAABVrZXlFbWlzc2lvblN0YXJ0QmxvY2sAAAAABAAAAAVNVUxUMwAAAAAAAAAD6AQAAAAUd3hFbWlzc2lvblBlckJsb2NrWDMJAABoAAAAAgkBAAAADGdldEludE9yRmFpbAAAAAIFAAAAEGVtaXNzaW9uQ29udHJhY3QJAQAAAB5rZXlFbWlzc2lvblJhdGVQZXJCbG9ja0N1cnJlbnQAAAAABQAAAAVNVUxUMwQAAAAYcG9vbFd4RW1pc3Npb25QZXJCbG9ja1gzCQAAawAAAAMFAAAAFHd4RW1pc3Npb25QZXJCbG9ja1gzBQAAAApwb29sV2VpZ2h0CQAAaAAAAAIFAAAADlBPT0xXRUlHSFRNVUxUAAAAAAAAAAADBAAAABJ3eFBlckxwSW50ZWdyYWxLRVkJAQAAABJrZXlXeFBlckxwSW50ZWdyYWwAAAABBQAAAAxscEFzc2V0SWRTdHIEAAAAH3d4UGVyTHBJbnRlZ3JhbExhc3RVcGRIZWlnaHRLRVkJAQAAAB9rZXlXeFBlckxwSW50ZWdyYWxMYXN0VXBkSGVpZ2h0AAAAAQUAAAAMbHBBc3NldElkU3RyBAAAAAp3eFBlckxwS0VZCQEAAAAKa2V5V3hQZXJMcAAAAAEFAAAADGxwQXNzZXRJZFN0cgQAAAAcd3hQZXJMcEludGVncmFsTGFzdFVwZEhlaWdodAkBAAAAD2dldEludE9yRGVmYXVsdAAAAAMFAAAABHRoaXMFAAAAH3d4UGVyTHBJbnRlZ3JhbExhc3RVcGRIZWlnaHRLRVkFAAAAEmVtaXNzaW9uU3RhcnRCbG9jawQAAAAPd3hQZXJMcEludGVncmFsCQEAAAAMZ2V0SW50T3JaZXJvAAAAAgUAAAAEdGhpcwUAAAASd3hQZXJMcEludGVncmFsS0VZBAAAAA93eFBlckxwT3JaZXJvWDMAAAAAAAAAAAAEAAAAAmRoCQABlgAAAAEJAARMAAAAAgkAAGUAAAACBQAAAAZoZWlnaHQFAAAAHHd4UGVyTHBJbnRlZ3JhbExhc3RVcGRIZWlnaHQJAARMAAAAAgAAAAAAAAAAAAUAAAADbmlsBAAAAAl3eFBlckxwWDMDCQEAAAACIT0AAAACBQAAAA93eFBlckxwT3JaZXJvWDMAAAAAAAAAAAAFAAAAD3d4UGVyTHBPclplcm9YMwkAAGsAAAADBQAAABhwb29sV3hFbWlzc2lvblBlckJsb2NrWDMFAAAABU1VTFQ4BQAAAAtzdGFrZWRUb3RhbAQAAAAOc3Rha2VkVG90YWxOZXcJAABkAAAAAgUAAAALc3Rha2VkVG90YWwFAAAADWxwRGVsdGFBbW91bnQEAAAAEnd4UGVyTHBJbnRlZ3JhbE5ldwkAAGQAAAACBQAAAA93eFBlckxwSW50ZWdyYWwJAABoAAAAAgUAAAAJd3hQZXJMcFgzBQAAAAJkaAQAAAAMd3hQZXJMcFgzTmV3CQAAaQAAAAIFAAAAGHBvb2xXeEVtaXNzaW9uUGVyQmxvY2tYMwUAAAAOc3Rha2VkVG90YWxOZXcEAAAAH3d4UGVyTHBJbnRlZ3JhbExhc3RVcGRIZWlnaHROZXcFAAAABmhlaWdodAQAAAAFZGVidWcJAAS5AAAAAgkABEwAAAACCQABpAAAAAEFAAAAEnd4UGVyTHBJbnRlZ3JhbE5ldwkABEwAAAACCQABpAAAAAEFAAAAAmRoCQAETAAAAAIJAAGkAAAAAQUAAAAJd3hQZXJMcFgzCQAETAAAAAIJAAGkAAAAAQUAAAALc3Rha2VkVG90YWwJAARMAAAAAgkAAaQAAAABBQAAABhwb29sV3hFbWlzc2lvblBlckJsb2NrWDMJAARMAAAAAgkAAaQAAAABBQAAABR3eEVtaXNzaW9uUGVyQmxvY2tYMwkABEwAAAACCQABpAAAAAEFAAAACnBvb2xXZWlnaHQFAAAAA25pbAIAAAACOjoJAAUVAAAAAwUAAAASd3hQZXJMcEludGVncmFsTmV3CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABJ3eFBlckxwSW50ZWdyYWxLRVkFAAAAEnd4UGVyTHBJbnRlZ3JhbE5ldwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAfd3hQZXJMcEludGVncmFsTGFzdFVwZEhlaWdodEtFWQUAAAAfd3hQZXJMcEludGVncmFsTGFzdFVwZEhlaWdodE5ldwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAKd3hQZXJMcEtFWQUAAAAMd3hQZXJMcFgzTmV3BQAAAANuaWwFAAAABWRlYnVnAQAAABByZWZyZXNoSU5URUdSQUxTAAAABAAAAAxscEFzc2V0SWRTdHIAAAAOdXNlckFkZHJlc3NTdHIAAAAOcG9vbEFkZHJlc3NTdHIAAAANbHBEZWx0YUFtb3VudAQAAAANJHQwMTA0OTQxMDYxNgkBAAAAFHJlZnJlc2hQb29sSU5URUdSQUxTAAAAAwUAAAAMbHBBc3NldElkU3RyBQAAAA5wb29sQWRkcmVzc1N0cgUAAAANbHBEZWx0YUFtb3VudAQAAAASd3hQZXJMcEludGVncmFsTmV3CAUAAAANJHQwMTA0OTQxMDYxNgAAAAJfMQQAAAARcG9vbEludGVncmFsU1RBVEUIBQAAAA0kdDAxMDQ5NDEwNjE2AAAAAl8yBAAAAAlwb29sREVCVUcIBQAAAA0kdDAxMDQ5NDEwNjE2AAAAAl8zBAAAAAVNVUxUMwAAAAAAAAAD6AQAAAAPc3Rha2VkQnlVc2VyS0VZCQEAAAAPa2V5U3Rha2VkQnlVc2VyAAAAAgUAAAAOdXNlckFkZHJlc3NTdHIFAAAADGxwQXNzZXRJZFN0cgQAAAAMc3Rha2VkQnlVc2VyCQEAAAAKcmVhZFN0YWtlZAAAAAEFAAAAD3N0YWtlZEJ5VXNlcktFWQQAAAAQd3hUb0NsYWltVXNlcktFWQkBAAAAEGtleVd4VG9DbGFpbVVzZXIAAAACBQAAAAxscEFzc2V0SWRTdHIFAAAADnVzZXJBZGRyZXNzU3RyBAAAACN3eFBlckxwSW50ZWdyYWxVc2VyTGFzdFVwZEhlaWdodEtFWQkBAAAAI2tleVd4UGVyTHBJbnRlZ3JhbFVzZXJMYXN0VXBkSGVpZ2h0AAAAAgUAAAAMbHBBc3NldElkU3RyBQAAAA51c2VyQWRkcmVzc1N0cgQAAAAad3hQZXJMcEludGVncmFsVXNlckxhc3RLRVkJAQAAABprZXlXeFBlckxwSW50ZWdyYWxVc2VyTGFzdAAAAAIFAAAADGxwQXNzZXRJZFN0cgUAAAAOdXNlckFkZHJlc3NTdHIEAAAADXd4VG9DbGFpbVVzZXIJAQAAAAxnZXRJbnRPclplcm8AAAACBQAAAAR0aGlzBQAAABB3eFRvQ2xhaW1Vc2VyS0VZBAAAACZ3eFBlckxwSW50ZWdyYWxVc2VyTGFzdFVwZEhlaWdodE9yWmVybwkBAAAADGdldEludE9yWmVybwAAAAIFAAAABHRoaXMFAAAAI3d4UGVyTHBJbnRlZ3JhbFVzZXJMYXN0VXBkSGVpZ2h0S0VZBAAAABd3eFBlckxwSW50ZWdyYWxVc2VyTGFzdAkBAAAAG2NhbGNXeFBlckxwSW50ZWdyYWxVc2VyTGFzdAAAAAQFAAAADHN0YWtlZEJ5VXNlcgUAAAAmd3hQZXJMcEludGVncmFsVXNlckxhc3RVcGRIZWlnaHRPclplcm8FAAAAEnd4UGVyTHBJbnRlZ3JhbE5ldwUAAAAad3hQZXJMcEludGVncmFsVXNlckxhc3RLRVkEAAAAEHd4VG9DbGFpbVVzZXJOZXcJAABkAAAAAgUAAAANd3hUb0NsYWltVXNlcgkAAGsAAAADCQAAZQAAAAIFAAAAEnd4UGVyTHBJbnRlZ3JhbE5ldwUAAAAXd3hQZXJMcEludGVncmFsVXNlckxhc3QFAAAADHN0YWtlZEJ5VXNlcgkAAGgAAAACBQAAAAVNVUxUOAUAAAAFTVVMVDMDCQAAAAAAAAIFAAAAEHd4VG9DbGFpbVVzZXJOZXcFAAAAEHd4VG9DbGFpbVVzZXJOZXcEAAAABWVycm9yCQAAAgAAAAECAAAAJWVycm9yIGFmdGVyIHd4VG9DbGFpbVVzZXJOZXcgZnJhY3Rpb24DCQAAAAAAAAIFAAAABWVycm9yBQAAAAVlcnJvcgQAAAAad3hQZXJMcEludGVncmFsVXNlckxhc3ROZXcFAAAAEnd4UGVyTHBJbnRlZ3JhbE5ldwQAAAAjd3hQZXJMcEludGVncmFsVXNlckxhc3RVcGRIZWlnaHROZXcFAAAABmhlaWdodAQAAAAFZGVidWcJAAS5AAAAAgkABEwAAAACCQABpAAAAAEFAAAAEHd4VG9DbGFpbVVzZXJOZXcJAARMAAAAAgkAAaQAAAABBQAAABd3eFBlckxwSW50ZWdyYWxVc2VyTGFzdAkABEwAAAACCQABpAAAAAEFAAAADHN0YWtlZEJ5VXNlcgkABEwAAAACBQAAAAlwb29sREVCVUcJAARMAAAAAgkAAaQAAAABBQAAAAZoZWlnaHQFAAAAA25pbAIAAAACOjoJAAUVAAAAAwUAAAAQd3hUb0NsYWltVXNlck5ldwkABE4AAAACBQAAABFwb29sSW50ZWdyYWxTVEFURQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAQd3hUb0NsYWltVXNlcktFWQUAAAAQd3hUb0NsYWltVXNlck5ldwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAjd3hQZXJMcEludGVncmFsVXNlckxhc3RVcGRIZWlnaHRLRVkFAAAAI3d4UGVyTHBJbnRlZ3JhbFVzZXJMYXN0VXBkSGVpZ2h0TmV3CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABp3eFBlckxwSW50ZWdyYWxVc2VyTGFzdEtFWQUAAAAad3hQZXJMcEludGVncmFsVXNlckxhc3ROZXcFAAAAA25pbAUAAAAFZGVidWcJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEAAAAWbWFuYWdlclB1YmxpY0tleU9yVW5pdAAAAAAEAAAAByRtYXRjaDAJAAQiAAAAAQkBAAAAE2tleU1hbmFnZXJQdWJsaWNLZXkAAAAAAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAXMFAAAAByRtYXRjaDAJAAJZAAAAAQUAAAABcwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAEVW5pdAUAAAAEdW5pdAkAAAIAAAABAgAAAAtNYXRjaCBlcnJvcgEAAAAdcGVuZGluZ01hbmFnZXJQdWJsaWNLZXlPclVuaXQAAAAABAAAAAckbWF0Y2gwCQAEIgAAAAEJAQAAABprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleQAAAAADCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABcwUAAAAHJG1hdGNoMAkAAlkAAAABBQAAAAFzAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAARVbml0BQAAAAR1bml0CQAAAgAAAAECAAAAC01hdGNoIGVycm9yAQAAAAttdXN0TWFuYWdlcgAAAAEAAAABaQQAAAACcGQJAAACAAAAAQIAAAARUGVybWlzc2lvbiBkZW5pZWQEAAAAByRtYXRjaDAJAQAAABZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAAAAAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAKQnl0ZVZlY3RvcgQAAAACcGsFAAAAByRtYXRjaDADCQAAAAAAAAIIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQUAAAACcGsGBQAAAAJwZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAEVW5pdAMJAAAAAAAAAggFAAAAAWkAAAAGY2FsbGVyBQAAAAR0aGlzBgUAAAACcGQJAAACAAAAAQIAAAALTWF0Y2ggZXJyb3IAAAAIAAAAAWkBAAAAC2NvbnN0cnVjdG9yAAAAAQAAABFmYWN0b3J5QWRkcmVzc1N0cgQAAAALY2hlY2tDYWxsZXIJAQAAAAttdXN0TWFuYWdlcgAAAAEFAAAAAWkDCQAAAAAAAAIFAAAAC2NoZWNrQ2FsbGVyBQAAAAtjaGVja0NhbGxlcgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAARa2V5RmFjdG9yeUFkZHJlc3MAAAAABQAAABFmYWN0b3J5QWRkcmVzc1N0cgUAAAADbmlsCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAAApzZXRNYW5hZ2VyAAAAAQAAABdwZW5kaW5nTWFuYWdlclB1YmxpY0tleQQAAAALY2hlY2tDYWxsZXIJAQAAAAttdXN0TWFuYWdlcgAAAAEFAAAAAWkDCQAAAAAAAAIFAAAAC2NoZWNrQ2FsbGVyBQAAAAtjaGVja0NhbGxlcgQAAAAVY2hlY2tNYW5hZ2VyUHVibGljS2V5CQACWQAAAAEFAAAAF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5AwkAAAAAAAACBQAAABVjaGVja01hbmFnZXJQdWJsaWNLZXkFAAAAFWNoZWNrTWFuYWdlclB1YmxpY0tleQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkAAAAABQAAABdwZW5kaW5nTWFuYWdlclB1YmxpY0tleQUAAAADbmlsCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAOY29uZmlybU1hbmFnZXIAAAAABAAAAAJwbQkBAAAAHXBlbmRpbmdNYW5hZ2VyUHVibGljS2V5T3JVbml0AAAAAAQAAAAFaGFzUE0DCQEAAAAJaXNEZWZpbmVkAAAAAQUAAAACcG0GCQAAAgAAAAECAAAAEk5vIHBlbmRpbmcgbWFuYWdlcgMJAAAAAAAAAgUAAAAFaGFzUE0FAAAABWhhc1BNBAAAAAdjaGVja1BNAwkAAAAAAAACCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkJAQAAAAV2YWx1ZQAAAAEFAAAAAnBtBgkAAAIAAAABAgAAABtZb3UgYXJlIG5vdCBwZW5kaW5nIG1hbmFnZXIDCQAAAAAAAAIFAAAAB2NoZWNrUE0FAAAAB2NoZWNrUE0JAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAE2tleU1hbmFnZXJQdWJsaWNLZXkAAAAACQACWAAAAAEJAQAAAAV2YWx1ZQAAAAEFAAAAAnBtCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAABprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleQAAAAAFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAABXN0YWtlAAAAAAMJAQAAAAIhPQAAAAIJAAGQAAAAAQgFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEJAAACAAAAAQIAAAA0aW52YWxpZCBwYXltZW50IC0gZXhhY3Qgb25lIHBheW1lbnQgbXVzdCBiZSBhdHRhY2hlZAQAAAADcG10CQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAABAAAAAlscEFzc2V0SWQJAQAAAAV2YWx1ZQAAAAEIBQAAAANwbXQAAAAHYXNzZXRJZAQAAAAMbHBBc3NldElkU3RyCQACWAAAAAEFAAAACWxwQXNzZXRJZAQAAAAGYW1vdW50CAUAAAADcG10AAAABmFtb3VudAQAAAAOcG9vbEFkZHJlc3NTdHIJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAA9mYWN0b3J5Q29udHJhY3QJAQAAABprZXlGYWN0b3J5THAyQXNzZXRzTWFwcGluZwAAAAEFAAAADGxwQXNzZXRJZFN0cgkAASwAAAACAgAAABV1bnN1cHBvcnRlZCBscCBhc3NldCAFAAAADGxwQXNzZXRJZFN0cgQAAAAJY2FsbGVyU3RyCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAAOdXNlckFkZHJlc3NTdHIDCQAAAAAAAAIFAAAACWNhbGxlclN0cgUAAAAOcG9vbEFkZHJlc3NTdHIJAAQlAAAAAQgFAAAAAWkAAAAMb3JpZ2luQ2FsbGVyBQAAAAljYWxsZXJTdHIEAAAAD3N0YWtlZEJ5VXNlcktFWQkBAAAAD2tleVN0YWtlZEJ5VXNlcgAAAAIFAAAADnVzZXJBZGRyZXNzU3RyBQAAAAxscEFzc2V0SWRTdHIEAAAADnN0YWtlZFRvdGFsS0VZCQEAAAAOa2V5U3Rha2VkVG90YWwAAAABBQAAAAxscEFzc2V0SWRTdHIEAAAADHN0YWtlZEJ5VXNlcgkBAAAACnJlYWRTdGFrZWQAAAABBQAAAA9zdGFrZWRCeVVzZXJLRVkEAAAAC3N0YWtlZFRvdGFsCQEAAAAKcmVhZFN0YWtlZAAAAAEFAAAADnN0YWtlZFRvdGFsS0VZBAAAAA0kdDAxNDM0MzE0NDYwCQEAAAAQcmVmcmVzaElOVEVHUkFMUwAAAAQFAAAADGxwQXNzZXRJZFN0cgUAAAAOdXNlckFkZHJlc3NTdHIFAAAADnBvb2xBZGRyZXNzU3RyBQAAAAZhbW91bnQEAAAAEHd4VG9DbGFpbVVzZXJOZXcIBQAAAA0kdDAxNDM0MzE0NDYwAAAAAl8xBAAAAA1pbnRlZ3JhbFNUQVRFCAUAAAANJHQwMTQzNDMxNDQ2MAAAAAJfMgQAAAAFZGVidWcIBQAAAA0kdDAxNDM0MzE0NDYwAAAAAl8zCQAETgAAAAIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAD3N0YWtlZEJ5VXNlcktFWQkAAGQAAAACBQAAAAxzdGFrZWRCeVVzZXIFAAAABmFtb3VudAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAOc3Rha2VkVG90YWxLRVkJAABkAAAAAgUAAAALc3Rha2VkVG90YWwFAAAABmFtb3VudAkABEwAAAACCQEAAAAVT3BlcmF0aW9uSGlzdG9yeUVudHJ5AAAABQIAAAAFc3Rha2UFAAAADnVzZXJBZGRyZXNzU3RyBQAAAAxscEFzc2V0SWRTdHIFAAAABmFtb3VudAgFAAAAAWkAAAANdHJhbnNhY3Rpb25JZAUAAAADbmlsBQAAAA1pbnRlZ3JhbFNUQVRFAAAAAWkBAAAAB3Vuc3Rha2UAAAACAAAADGxwQXNzZXRJZFN0cgAAAAZhbW91bnQEAAAACWxwQXNzZXRJZAkAAlkAAAABBQAAAAxscEFzc2V0SWRTdHIEAAAADnBvb2xBZGRyZXNzU3RyCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAPZmFjdG9yeUNvbnRyYWN0CQEAAAAaa2V5RmFjdG9yeUxwMkFzc2V0c01hcHBpbmcAAAABBQAAAAxscEFzc2V0SWRTdHIJAAEsAAAAAgIAAAAVdW5zdXBwb3J0ZWQgbHAgYXNzZXQgBQAAAAxscEFzc2V0SWRTdHIEAAAACXBvb2xBZGRvbgkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAR0aGlzCQEAAAAWa2V5U3RhYmxlUG9vbEFkZG9uQWRkcgAAAAAFAAAADnBvb2xBZGRyZXNzU3RyBAAAAAljYWxsZXJTdHIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAA51c2VyQWRkcmVzc1N0cgMDCQAAAAAAAAIFAAAACWNhbGxlclN0cgUAAAAOcG9vbEFkZHJlc3NTdHIGCQAAAAAAAAIFAAAACWNhbGxlclN0cgUAAAAJcG9vbEFkZG9uCQAEJQAAAAEIBQAAAAFpAAAADG9yaWdpbkNhbGxlcgUAAAAJY2FsbGVyU3RyBAAAAA9zdGFrZWRCeVVzZXJLRVkJAQAAAA9rZXlTdGFrZWRCeVVzZXIAAAACBQAAAA51c2VyQWRkcmVzc1N0cgUAAAAMbHBBc3NldElkU3RyBAAAAA5zdGFrZWRUb3RhbEtFWQkBAAAADmtleVN0YWtlZFRvdGFsAAAAAQUAAAAMbHBBc3NldElkU3RyBAAAAAxzdGFrZWRCeVVzZXIJAQAAAApyZWFkU3Rha2VkAAAAAQUAAAAPc3Rha2VkQnlVc2VyS0VZBAAAAAtzdGFrZWRUb3RhbAkBAAAACnJlYWRTdGFrZWQAAAABBQAAAA5zdGFrZWRUb3RhbEtFWQQAAAANJHQwMTU1OTcxNTcxNQkBAAAAEHJlZnJlc2hJTlRFR1JBTFMAAAAEBQAAAAxscEFzc2V0SWRTdHIFAAAADnVzZXJBZGRyZXNzU3RyBQAAAA5wb29sQWRkcmVzc1N0cgkBAAAAAS0AAAABBQAAAAZhbW91bnQEAAAAEHd4VG9DbGFpbVVzZXJOZXcIBQAAAA0kdDAxNTU5NzE1NzE1AAAAAl8xBAAAAA1pbnRlZ3JhbFNUQVRFCAUAAAANJHQwMTU1OTcxNTcxNQAAAAJfMgQAAAAFZGVidWcIBQAAAA0kdDAxNTU5NzE1NzE1AAAAAl8zAwkAAGYAAAACBQAAAAZhbW91bnQFAAAADHN0YWtlZEJ5VXNlcgkAAAIAAAABAgAAACRwYXNzZWQgYW1vdW50IGlzIGxlc3MgdGhlbiBhdmFpbGFibGUJAAROAAAAAgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAPc3Rha2VkQnlVc2VyS0VZCQAAZQAAAAIFAAAADHN0YWtlZEJ5VXNlcgUAAAAGYW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAA5zdGFrZWRUb3RhbEtFWQkAAGUAAAACBQAAAAtzdGFrZWRUb3RhbAUAAAAGYW1vdW50CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAGYW1vdW50BQAAAAlscEFzc2V0SWQJAARMAAAAAgkBAAAAFU9wZXJhdGlvbkhpc3RvcnlFbnRyeQAAAAUCAAAAB3Vuc3Rha2UFAAAADnVzZXJBZGRyZXNzU3RyBQAAAAxscEFzc2V0SWRTdHIFAAAABmFtb3VudAgFAAAAAWkAAAANdHJhbnNhY3Rpb25JZAUAAAADbmlsBQAAAA1pbnRlZ3JhbFNUQVRFAAAAAWkBAAAAB2NsYWltV3gAAAABAAAADGxwQXNzZXRJZFN0cgQAAAALdXNlckFkZHJlc3MIBQAAAAFpAAAABmNhbGxlcgQAAAAOdXNlckFkZHJlc3NTdHIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAA5wb29sQWRkcmVzc1N0cgkBAAAAGGdldFN0cmluZ0J5QWRkcmVzc09yRmFpbAAAAAIFAAAAD2ZhY3RvcnlDb250cmFjdAkBAAAAJmtleUZhY3RvcnlMcEFzc2V0VG9Qb29sQ29udHJhY3RBZGRyZXNzAAAAAQUAAAAMbHBBc3NldElkU3RyBAAAABBjbGFpbWVkQnlVc2VyS0VZCQEAAAAQa2V5Q2xhaW1lZEJ5VXNlcgAAAAIFAAAADGxwQXNzZXRJZFN0cgUAAAAOdXNlckFkZHJlc3NTdHIEAAAAD2NsYWltZWRUb3RhbEtFWQkBAAAAD2tleUNsYWltZWRUb3RhbAAAAAEFAAAADGxwQXNzZXRJZFN0cgQAAAAZY2xhaW1lZEJ5VXNlck1pblJld2FyZEtFWQkBAAAAGWtleUNsYWltZWRCeVVzZXJNaW5SZXdhcmQAAAACBQAAAAxscEFzc2V0SWRTdHIFAAAADnVzZXJBZGRyZXNzU3RyBAAAABtjbGFpbWVkQnlVc2VyQm9vc3RSZXdhcmRLRVkJAQAAABtrZXlDbGFpbWVkQnlVc2VyQm9vc3RSZXdhcmQAAAACBQAAAAxscEFzc2V0SWRTdHIFAAAADnVzZXJBZGRyZXNzU3RyBAAAAA1jbGFpbWVkQnlVc2VyCQEAAAAMZ2V0SW50T3JaZXJvAAAAAgUAAAAEdGhpcwUAAAAQY2xhaW1lZEJ5VXNlcktFWQQAAAAWY2xhaW1lZEJ5VXNlck1pblJld2FyZAkBAAAADGdldEludE9yWmVybwAAAAIFAAAABHRoaXMFAAAAGWNsYWltZWRCeVVzZXJNaW5SZXdhcmRLRVkEAAAAGGNsYWltZWRCeVVzZXJCb29zdFJld2FyZAkBAAAADGdldEludE9yWmVybwAAAAIFAAAABHRoaXMFAAAAG2NsYWltZWRCeVVzZXJCb29zdFJld2FyZEtFWQQAAAAMY2xhaW1lZFRvdGFsCQEAAAAMZ2V0SW50T3JaZXJvAAAAAgUAAAAEdGhpcwUAAAAPY2xhaW1lZFRvdGFsS0VZBAAAAA0kdDAxNjkwNzE3MDE5CQEAAAAQcmVmcmVzaElOVEVHUkFMUwAAAAQFAAAADGxwQXNzZXRJZFN0cgUAAAAOdXNlckFkZHJlc3NTdHIFAAAADnBvb2xBZGRyZXNzU3RyAAAAAAAAAAAABAAAABB3eFRvQ2xhaW1Vc2VyTmV3CAUAAAANJHQwMTY5MDcxNzAxOQAAAAJfMQQAAAANaW50ZWdyYWxTVEFURQgFAAAADSR0MDE2OTA3MTcwMTkAAAACXzIEAAAABWRlYnVnCAUAAAANJHQwMTY5MDcxNzAxOQAAAAJfMwQAAAAQYXZhaWxhYmxlVG9DbGFpbQkAAGUAAAACBQAAABB3eFRvQ2xhaW1Vc2VyTmV3BQAAAA1jbGFpbWVkQnlVc2VyAwkAAGcAAAACAAAAAAAAAAAABQAAABBhdmFpbGFibGVUb0NsYWltCQAAAgAAAAECAAAAEG5vdGhpbmcgdG8gY2xhaW0EAAAAEnd4QW1vdW50Qm9vc3RUb3RhbAkBAAAABWFzSW50AAAAAQkAAZEAAAACCQEAAAAJYXNBbnlMaXN0AAAAAQkAA/wAAAAEBQAAABBib29zdGluZ0NvbnRyYWN0AgAAAAxjbGFpbVd4Qm9vc3QJAARMAAAAAgUAAAAMbHBBc3NldElkU3RyCQAETAAAAAIFAAAADnVzZXJBZGRyZXNzU3RyBQAAAANuaWwFAAAAA25pbAAAAAAAAAAAAAQAAAANbWluUmV3YXJkUGFydAUAAAAQYXZhaWxhYmxlVG9DbGFpbQQAAAAPYm9vc3RSZXdhcmRQYXJ0CQABlwAAAAEJAARMAAAAAgkAAGgAAAACBQAAAA1taW5SZXdhcmRQYXJ0AAAAAAAAAAACCQAETAAAAAIFAAAAEnd4QW1vdW50Qm9vc3RUb3RhbAUAAAADbmlsBAAAAAl3eEFzc2V0SWQJAQAAAAxhc0J5dGVWZWN0b3IAAAABCQABkQAAAAIJAQAAAAlhc0FueUxpc3QAAAABCQAD/AAAAAQFAAAAEGVtaXNzaW9uQ29udHJhY3QCAAAABGVtaXQJAARMAAAAAgUAAAANbWluUmV3YXJkUGFydAUAAAADbmlsBQAAAANuaWwAAAAAAAAAAAAEAAAACWVtaXRCb29zdAkBAAAACWFzQW55TGlzdAAAAAEJAAP8AAAABAUAAAAQZW1pc3Npb25Db250cmFjdAIAAAAEZW1pdAkABEwAAAACBQAAAA9ib29zdFJld2FyZFBhcnQFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAAllbWl0Qm9vc3QFAAAACWVtaXRCb29zdAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAQY2xhaW1lZEJ5VXNlcktFWQkAAGQAAAACBQAAAA1jbGFpbWVkQnlVc2VyBQAAABBhdmFpbGFibGVUb0NsYWltCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABljbGFpbWVkQnlVc2VyTWluUmV3YXJkS0VZCQAAZAAAAAIFAAAAFmNsYWltZWRCeVVzZXJNaW5SZXdhcmQFAAAADW1pblJld2FyZFBhcnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAG2NsYWltZWRCeVVzZXJCb29zdFJld2FyZEtFWQkAAGQAAAACBQAAABhjbGFpbWVkQnlVc2VyQm9vc3RSZXdhcmQFAAAAD2Jvb3N0UmV3YXJkUGFydAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAPY2xhaW1lZFRvdGFsS0VZCQAAZAAAAAIFAAAADGNsYWltZWRUb3RhbAUAAAAQYXZhaWxhYmxlVG9DbGFpbQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAAt1c2VyQWRkcmVzcwUAAAANbWluUmV3YXJkUGFydAUAAAAJd3hBc3NldElkCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAC3VzZXJBZGRyZXNzBQAAAA9ib29zdFJld2FyZFBhcnQFAAAACXd4QXNzZXRJZAkABEwAAAACCQEAAAAVT3BlcmF0aW9uSGlzdG9yeUVudHJ5AAAABQIAAAAFY2xhaW0FAAAADnVzZXJBZGRyZXNzU3RyBQAAAAxscEFzc2V0SWRTdHIFAAAAEGF2YWlsYWJsZVRvQ2xhaW0IBQAAAAFpAAAADXRyYW5zYWN0aW9uSWQFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAPY2xhaW1XeFJFQURPTkxZAAAAAgAAAAxscEFzc2V0SWRTdHIAAAAOdXNlckFkZHJlc3NTdHIEAAAAD3N0YWtlZEJ5VXNlcktFWQkBAAAAD2tleVN0YWtlZEJ5VXNlcgAAAAIFAAAADnVzZXJBZGRyZXNzU3RyBQAAAAxscEFzc2V0SWRTdHIEAAAADnN0YWtlZFRvdGFsS0VZCQEAAAAOa2V5U3Rha2VkVG90YWwAAAABBQAAAAxscEFzc2V0SWRTdHIEAAAAEGNsYWltZWRCeVVzZXJLRVkJAQAAABBrZXlDbGFpbWVkQnlVc2VyAAAAAgUAAAAMbHBBc3NldElkU3RyBQAAAA51c2VyQWRkcmVzc1N0cgQAAAAMc3Rha2VkQnlVc2VyCQEAAAAKcmVhZFN0YWtlZAAAAAEFAAAAD3N0YWtlZEJ5VXNlcktFWQQAAAALc3Rha2VkVG90YWwJAQAAAApyZWFkU3Rha2VkAAAAAQUAAAAOc3Rha2VkVG90YWxLRVkEAAAADWNsYWltZWRCeVVzZXIJAQAAAAxnZXRJbnRPclplcm8AAAACBQAAAAR0aGlzBQAAABBjbGFpbWVkQnlVc2VyS0VZBAAAAA5wb29sQWRkcmVzc1N0cgkBAAAAGGdldFN0cmluZ0J5QWRkcmVzc09yRmFpbAAAAAIFAAAAD2ZhY3RvcnlDb250cmFjdAkBAAAAJmtleUZhY3RvcnlMcEFzc2V0VG9Qb29sQ29udHJhY3RBZGRyZXNzAAAAAQUAAAAMbHBBc3NldElkU3RyBAAAAApwb29sV2VpZ2h0CQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAA9mYWN0b3J5Q29udHJhY3QJAQAAABRrZXlGYWN0b3J5UG9vbFdlaWdodAAAAAEFAAAADnBvb2xBZGRyZXNzU3RyBAAAABJ3eEVtaXNzaW9uUGVyQmxvY2sJAQAAAAxnZXRJbnRPckZhaWwAAAACBQAAABBlbWlzc2lvbkNvbnRyYWN0CQEAAAAea2V5RW1pc3Npb25SYXRlUGVyQmxvY2tDdXJyZW50AAAAAAQAAAASZW1pc3Npb25TdGFydEJsb2NrCQEAAAAMZ2V0SW50T3JGYWlsAAAAAgUAAAAQZW1pc3Npb25Db250cmFjdAkBAAAAFWtleUVtaXNzaW9uU3RhcnRCbG9jawAAAAAEAAAADHBhc3NlZEJsb2NrcwMJAABmAAAAAgUAAAASZW1pc3Npb25TdGFydEJsb2NrBQAAAAZoZWlnaHQAAAAAAAAAAAAJAABlAAAAAgUAAAAGaGVpZ2h0BQAAABJlbWlzc2lvblN0YXJ0QmxvY2sEAAAADnBvb2xXeEVtaXNzaW9uCQAAawAAAAMJAABoAAAAAgUAAAASd3hFbWlzc2lvblBlckJsb2NrBQAAAAxwYXNzZWRCbG9ja3MFAAAACnBvb2xXZWlnaHQFAAAADlBPT0xXRUlHSFRNVUxUBAAAAAx1c2VyV3hSZXdhcmQJAABrAAAAAwUAAAAOcG9vbFd4RW1pc3Npb24FAAAADHN0YWtlZEJ5VXNlcgUAAAALc3Rha2VkVG90YWwEAAAADSR0MDE5MjE5MTkzMzEJAQAAABByZWZyZXNoSU5URUdSQUxTAAAABAUAAAAMbHBBc3NldElkU3RyBQAAAA51c2VyQWRkcmVzc1N0cgUAAAAOcG9vbEFkZHJlc3NTdHIAAAAAAAAAAAAEAAAAEHd4VG9DbGFpbVVzZXJOZXcIBQAAAA0kdDAxOTIxOTE5MzMxAAAAAl8xBAAAAA1pbnRlZ3JhbFNUQVRFCAUAAAANJHQwMTkyMTkxOTMzMQAAAAJfMgQAAAAFZGVidWcIBQAAAA0kdDAxOTIxOTE5MzMxAAAAAl8zBAAAABBhdmFpbGFibGVUb0NsYWltCQAAZQAAAAIFAAAAEHd4VG9DbGFpbVVzZXJOZXcFAAAADWNsYWltZWRCeVVzZXIEAAAADmJvb3N0SW52UmVzdWx0CQEAAAAJYXNBbnlMaXN0AAAAAQkAA/wAAAAEBQAAABBib29zdGluZ0NvbnRyYWN0AgAAABRjbGFpbVd4Qm9vc3RSRUFET05MWQkABEwAAAACBQAAAAxscEFzc2V0SWRTdHIJAARMAAAAAgUAAAAOdXNlckFkZHJlc3NTdHIFAAAAA25pbAUAAAADbmlsBAAAABJ3eEFtb3VudEJvb3N0VG90YWwJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAOYm9vc3RJbnZSZXN1bHQAAAAAAAAAAAAEAAAACmJvb3N0RGVidWcJAQAAAAhhc1N0cmluZwAAAAEJAAGRAAAAAgUAAAAOYm9vc3RJbnZSZXN1bHQAAAAAAAAAAAEEAAAADW1pblJld2FyZFBhcnQFAAAAEGF2YWlsYWJsZVRvQ2xhaW0EAAAAD2Jvb3N0UmV3YXJkUGFydAkAAZcAAAABCQAETAAAAAIJAABoAAAAAgUAAAANbWluUmV3YXJkUGFydAAAAAAAAAAAAgkABEwAAAACBQAAABJ3eEFtb3VudEJvb3N0VG90YWwFAAAAA25pbAQAAAALdG90YWxSZXdhcmQJAABkAAAAAgUAAAANbWluUmV3YXJkUGFydAUAAAAPYm9vc3RSZXdhcmRQYXJ0CQAFFAAAAAIFAAAAA25pbAkABLkAAAACCQAETAAAAAICAAAADiVzJXMlZCVkJWQlZCVzCQAETAAAAAIFAAAADGxwQXNzZXRJZFN0cgkABEwAAAACBQAAAA51c2VyQWRkcmVzc1N0cgkABEwAAAACCQABpAAAAAEFAAAAC3RvdGFsUmV3YXJkCQAETAAAAAIJAAGkAAAAAQUAAAANY2xhaW1lZEJ5VXNlcgkABEwAAAACCQABpAAAAAEFAAAADW1pblJld2FyZFBhcnQJAARMAAAAAgkAAaQAAAABBQAAAA9ib29zdFJld2FyZFBhcnQJAARMAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACBQAAAAVkZWJ1ZwIAAAACOjoJAAGkAAAAAQUAAAAMdXNlcld4UmV3YXJkAgAAAA46OkJPT1NUREVCVUc6OgUAAAAKYm9vc3REZWJ1ZwUAAAADbmlsBQAAAANTRVAAAAABaQEAAAAOb25Nb2RpZnlXZWlnaHQAAAACAAAADGxwQXNzZXRJZFN0cgAAAA5wb29sQWRkcmVzc1N0cgMJAQAAAAIhPQAAAAIIBQAAAAFpAAAABmNhbGxlcgUAAAAPZmFjdG9yeUNvbnRyYWN0CQAAAgAAAAECAAAAEnBlcm1pc3Npb25zIGRlbmllZAQAAAANJHQwMjAyMTEyMDMyMQkBAAAAFHJlZnJlc2hQb29sSU5URUdSQUxTAAAAAwUAAAAMbHBBc3NldElkU3RyBQAAAA5wb29sQWRkcmVzc1N0cgAAAAAAAAAAAAQAAAASd3hQZXJMcEludGVncmFsTmV3CAUAAAANJHQwMjAyMTEyMDMyMQAAAAJfMQQAAAARcG9vbEludGVncmFsU1RBVEUIBQAAAA0kdDAyMDIxMTIwMzIxAAAAAl8yBAAAAAlwb29sREVCVUcIBQAAAA0kdDAyMDIxMTIwMzIxAAAAAl8zBQAAABFwb29sSW50ZWdyYWxTVEFURQAAAAEAAAACdHgBAAAABnZlcmlmeQAAAAAEAAAAD3RhcmdldFB1YmxpY0tleQQAAAAHJG1hdGNoMAkBAAAAFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQAAAAAAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAApCeXRlVmVjdG9yBAAAAAJwawUAAAAHJG1hdGNoMAUAAAACcGsDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABFVuaXQIBQAAAAJ0eAAAAA9zZW5kZXJQdWJsaWNLZXkJAAACAAAAAQIAAAALTWF0Y2ggZXJyb3IJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAABQAAAA90YXJnZXRQdWJsaWNLZXm3ryGc", "chainId": 84, "height": 2086024, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: ERaFv8VLE1nri1BGKLJjT44v62mnqXj7CsPYzJHdMm4V Next: MgANiiWfBgnFReBbftei2VN8FHZA3uCSS79FZyCoxuM Diff:
OldNewDifferences
271271 let wxPerLpIntegralUserLastUpdHeightOrZero = getIntOrZero(this, wxPerLpIntegralUserLastUpdHeightKEY)
272272 let wxPerLpIntegralUserLast = calcWxPerLpIntegralUserLast(stakedByUser, wxPerLpIntegralUserLastUpdHeightOrZero, wxPerLpIntegralNew, wxPerLpIntegralUserLastKEY)
273273 let wxToClaimUserNew = (wxToClaimUser + fraction((wxPerLpIntegralNew - wxPerLpIntegralUserLast), stakedByUser, (MULT8 * MULT3)))
274- let wxPerLpIntegralUserLastNew = wxPerLpIntegralNew
275- let wxPerLpIntegralUserLastUpdHeightNew = height
276- let debug = makeString([toString(wxToClaimUserNew), toString(wxPerLpIntegralUserLast), toString(stakedByUser), poolDEBUG, toString(height)], "::")
277- $Tuple3(wxToClaimUserNew, (poolIntegralSTATE ++ [IntegerEntry(wxToClaimUserKEY, wxToClaimUserNew), IntegerEntry(wxPerLpIntegralUserLastUpdHeightKEY, wxPerLpIntegralUserLastUpdHeightNew), IntegerEntry(wxPerLpIntegralUserLastKEY, wxPerLpIntegralUserLastNew)]), debug)
274+ if ((wxToClaimUserNew == wxToClaimUserNew))
275+ then {
276+ let error = throw("error after wxToClaimUserNew fraction")
277+ if ((error == error))
278+ then {
279+ let wxPerLpIntegralUserLastNew = wxPerLpIntegralNew
280+ let wxPerLpIntegralUserLastUpdHeightNew = height
281+ let debug = makeString([toString(wxToClaimUserNew), toString(wxPerLpIntegralUserLast), toString(stakedByUser), poolDEBUG, toString(height)], "::")
282+ $Tuple3(wxToClaimUserNew, (poolIntegralSTATE ++ [IntegerEntry(wxToClaimUserKEY, wxToClaimUserNew), IntegerEntry(wxPerLpIntegralUserLastUpdHeightKEY, wxPerLpIntegralUserLastUpdHeightNew), IntegerEntry(wxPerLpIntegralUserLastKEY, wxPerLpIntegralUserLastNew)]), debug)
283+ }
284+ else throw("Strict value is not equal to itself.")
285+ }
286+ else throw("Strict value is not equal to itself.")
278287 }
279288
280289
365374 then throw("invalid payment - exact one payment must be attached")
366375 else {
367376 let pmt = i.payments[0]
368- if ((pmt == pmt))
369- then {
370- let lpAssetId = value(pmt.assetId)
371- if ((lpAssetId == lpAssetId))
372- then {
373- let lpAssetIdStr = toBase58String(lpAssetId)
374- if ((lpAssetIdStr == lpAssetIdStr))
375- then {
376- let amount = pmt.amount
377- if ((amount == amount))
378- then {
379- let poolAddressStr = valueOrErrorMessage(getString(factoryContract, keyFactoryLp2AssetsMapping(lpAssetIdStr)), ("unsupported lp asset " + lpAssetIdStr))
380- if ((poolAddressStr == poolAddressStr))
381- then {
382- let callerStr = toString(i.caller)
383- if ((callerStr == callerStr))
384- then {
385- let userAddressStr = if ((callerStr == poolAddressStr))
386- then toString(i.originCaller)
387- else callerStr
388- if ((userAddressStr == userAddressStr))
389- then {
390- let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
391- if ((stakedByUserKEY == stakedByUserKEY))
392- then {
393- let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
394- if ((stakedTotalKEY == stakedTotalKEY))
395- then {
396- let stakedByUser = readStaked(stakedByUserKEY)
397- if ((stakedByUser == stakedByUser))
398- then {
399- let stakedTotal = readStaked(stakedTotalKEY)
400- if ((stakedTotal == stakedTotal))
401- then {
402- let $t01430714427 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, amount)
403- if (($t01430714427 == $t01430714427))
404- then {
405- let debug = $t01430714427._3
406- let integralSTATE = $t01430714427._2
407- let wxToClaimUserNew = $t01430714427._1
408- let error = throw("error after refreshINTEGRALS")
409- if ((error == error))
410- then ([IntegerEntry(stakedByUserKEY, (stakedByUser + amount)), IntegerEntry(stakedTotalKEY, (stakedTotal + amount)), OperationHistoryEntry("stake", userAddressStr, lpAssetIdStr, amount, i.transactionId)] ++ integralSTATE)
411- else throw("Strict value is not equal to itself.")
412- }
413- else throw("Strict value is not equal to itself.")
414- }
415- else throw("Strict value is not equal to itself.")
416- }
417- else throw("Strict value is not equal to itself.")
418- }
419- else throw("Strict value is not equal to itself.")
420- }
421- else throw("Strict value is not equal to itself.")
422- }
423- else throw("Strict value is not equal to itself.")
424- }
425- else throw("Strict value is not equal to itself.")
426- }
427- else throw("Strict value is not equal to itself.")
428- }
429- else throw("Strict value is not equal to itself.")
430- }
431- else throw("Strict value is not equal to itself.")
432- }
433- else throw("Strict value is not equal to itself.")
434- }
435- else throw("Strict value is not equal to itself.")
377+ let lpAssetId = value(pmt.assetId)
378+ let lpAssetIdStr = toBase58String(lpAssetId)
379+ let amount = pmt.amount
380+ let poolAddressStr = valueOrErrorMessage(getString(factoryContract, keyFactoryLp2AssetsMapping(lpAssetIdStr)), ("unsupported lp asset " + lpAssetIdStr))
381+ let callerStr = toString(i.caller)
382+ let userAddressStr = if ((callerStr == poolAddressStr))
383+ then toString(i.originCaller)
384+ else callerStr
385+ let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
386+ let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
387+ let stakedByUser = readStaked(stakedByUserKEY)
388+ let stakedTotal = readStaked(stakedTotalKEY)
389+ let $t01434314460 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, amount)
390+ let wxToClaimUserNew = $t01434314460._1
391+ let integralSTATE = $t01434314460._2
392+ let debug = $t01434314460._3
393+ ([IntegerEntry(stakedByUserKEY, (stakedByUser + amount)), IntegerEntry(stakedTotalKEY, (stakedTotal + amount)), OperationHistoryEntry("stake", userAddressStr, lpAssetIdStr, amount, i.transactionId)] ++ integralSTATE)
436394 }
437395
438396
452410 let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
453411 let stakedByUser = readStaked(stakedByUserKEY)
454412 let stakedTotal = readStaked(stakedTotalKEY)
455- let $t01562015738 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, -(amount))
456- let wxToClaimUserNew = $t01562015738._1
457- let integralSTATE = $t01562015738._2
458- let debug = $t01562015738._3
413+ let $t01559715715 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, -(amount))
414+ let wxToClaimUserNew = $t01559715715._1
415+ let integralSTATE = $t01559715715._2
416+ let debug = $t01559715715._3
459417 if ((amount > stakedByUser))
460418 then throw("passed amount is less then available")
461419 else ([IntegerEntry(stakedByUserKEY, (stakedByUser - amount)), IntegerEntry(stakedTotalKEY, (stakedTotal - amount)), ScriptTransfer(i.caller, amount, lpAssetId), OperationHistoryEntry("unstake", userAddressStr, lpAssetIdStr, amount, i.transactionId)] ++ integralSTATE)
476434 let claimedByUserMinReward = getIntOrZero(this, claimedByUserMinRewardKEY)
477435 let claimedByUserBoostReward = getIntOrZero(this, claimedByUserBoostRewardKEY)
478436 let claimedTotal = getIntOrZero(this, claimedTotalKEY)
479- let $t01693017042 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
480- let wxToClaimUserNew = $t01693017042._1
481- let integralSTATE = $t01693017042._2
482- let debug = $t01693017042._3
437+ let $t01690717019 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
438+ let wxToClaimUserNew = $t01690717019._1
439+ let integralSTATE = $t01690717019._2
440+ let debug = $t01690717019._3
483441 let availableToClaim = (wxToClaimUserNew - claimedByUser)
484442 if ((0 >= availableToClaim))
485443 then throw("nothing to claim")
514472 else (height - emissionStartBlock)
515473 let poolWxEmission = fraction((wxEmissionPerBlock * passedBlocks), poolWeight, POOLWEIGHTMULT)
516474 let userWxReward = fraction(poolWxEmission, stakedByUser, stakedTotal)
517- let $t01924219354 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
518- let wxToClaimUserNew = $t01924219354._1
519- let integralSTATE = $t01924219354._2
520- let debug = $t01924219354._3
475+ let $t01921919331 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
476+ let wxToClaimUserNew = $t01921919331._1
477+ let integralSTATE = $t01921919331._2
478+ let debug = $t01921919331._3
521479 let availableToClaim = (wxToClaimUserNew - claimedByUser)
522480 let boostInvResult = asAnyList(invoke(boostingContract, "claimWxBoostREADONLY", [lpAssetIdStr, userAddressStr], nil))
523481 let wxAmountBoostTotal = asInt(boostInvResult[0])
534492 func onModifyWeight (lpAssetIdStr,poolAddressStr) = if ((i.caller != factoryContract))
535493 then throw("permissions denied")
536494 else {
537- let $t02023420344 = refreshPoolINTEGRALS(lpAssetIdStr, poolAddressStr, 0)
538- let wxPerLpIntegralNew = $t02023420344._1
539- let poolIntegralSTATE = $t02023420344._2
540- let poolDEBUG = $t02023420344._3
495+ let $t02021120321 = refreshPoolINTEGRALS(lpAssetIdStr, poolAddressStr, 0)
496+ let wxPerLpIntegralNew = $t02021120321._1
497+ let poolIntegralSTATE = $t02021120321._2
498+ let poolDEBUG = $t02021120321._3
541499 poolIntegralSTATE
542500 }
543501
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SCALE8 = 8
55
66 let MULT8 = 100000000
77
88 let SCALE18 = 18
99
1010 let MULT18 = toBigInt(1000000000000000000)
1111
1212 let SEP = "__"
1313
1414 let POOLWEIGHTMULT = MULT8
1515
1616 func asAnyList (val) = match val {
1717 case valAnyLyst: List[Any] =>
1818 valAnyLyst
1919 case _ =>
2020 throw("fail to cast into List[Any]")
2121 }
2222
2323
2424 func asInt (val) = match val {
2525 case valInt: Int =>
2626 valInt
2727 case _ =>
2828 throw("fail to cast into Int")
2929 }
3030
3131
3232 func asString (val) = match val {
3333 case valStr: String =>
3434 valStr
3535 case _ =>
3636 throw("fail to cast into Int")
3737 }
3838
3939
4040 func asByteVector (val) = match val {
4141 case valBin: ByteVector =>
4242 valBin
4343 case _ =>
4444 throw("fail to cast into Int")
4545 }
4646
4747
4848 func getStringOrFail (key) = valueOrErrorMessage(getString(key), (("mandatory this." + key) + " is not defined"))
4949
5050
5151 func getStringByAddressOrFail (address,key) = valueOrErrorMessage(getString(address, key), (((("mandatory " + toString(address)) + ".") + key) + " is not defined"))
5252
5353
5454 func getIntOrZero (address,key) = valueOrElse(getInteger(address, key), 0)
5555
5656
5757 func getIntOrDefault (address,key,defaultVal) = valueOrElse(getInteger(address, key), defaultVal)
5858
5959
6060 func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), (("mandatory this." + key) + " is not defined"))
6161
6262
6363 func toX18 (origVal,origScaleMult) = fraction(toBigInt(origVal), MULT18, toBigInt(origScaleMult))
6464
6565
6666 func fromX18 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), MULT18))
6767
6868
6969 func keyFactoryAddress () = "%s%s__config__factoryAddress"
7070
7171
7272 let IdxFactoryCfgStakingDapp = 1
7373
7474 let IdxFactoryCfgBoostingDapp = 2
7575
7676 let IdxFactoryCfgIdoDapp = 3
7777
7878 let IdxFactoryCfgTeamDapp = 4
7979
8080 let IdxFactoryCfgEmissionDapp = 5
8181
8282 let IdxFactoryCfgRestDapp = 6
8383
8484 let IdxFactoryCfgSlippageDapp = 7
8585
8686 func keyFactoryCfg () = "%s__factoryConfig"
8787
8888
8989 func keyManagerPublicKey () = "%s__managerPublicKey"
9090
9191
9292 func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
9393
9494
9595 func keyStablePoolAddonAddr () = "%s__stablePoolAddonAddr"
9696
9797
9898 func keyFactoryLp2AssetsMapping (lpAssetStr) = makeString(["%s%s%s", lpAssetStr, "mappings__lpAsset2PoolContract"], SEP)
9999
100100
101101 func keyFactoryLpList () = "%s__lpTokensList"
102102
103103
104104 func keyFactoryLpAssetToPoolContractAddress (lpAssetStr) = makeString(["%s%s%s", lpAssetStr, "mappings__lpAsset2PoolContract"], SEP)
105105
106106
107107 func keyFactoryPoolWeight (contractAddress) = makeString(["%s%s", "poolWeight", contractAddress], SEP)
108108
109109
110110 func readLpList (factory) = split(valueOrElse(getString(factory, keyFactoryLpList()), ""), SEP)
111111
112112
113113 func readFactoryCfgOrFail (factory) = split(getStringByAddressOrFail(factory, keyFactoryCfg()), SEP)
114114
115115
116116 func getBoostingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgBoostingDapp])
117117
118118
119119 func getEmissionAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgEmissionDapp])
120120
121121
122122 func getStakingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgStakingDapp])
123123
124124
125125 func keyEmissionRatePerBlockCurrent () = "%s%s__ratePerBlock__current"
126126
127127
128128 func keyEmissionRatePerBlockMaxCurrent () = "%s%s__ratePerBlockMax__current"
129129
130130
131131 func keyEmissionStartBlock () = "%s%s__emission__startBlock"
132132
133133
134134 func keyEmissionDurationInBlocks () = "%s%s__emission__duration"
135135
136136
137137 func keyEmissionEndBlock () = "%s%s__emission__endBlock"
138138
139139
140140 func keyStakedByUser (userAddressStr,lpAssetIdStr) = makeString(["%s%s%s__staked", userAddressStr, lpAssetIdStr], SEP)
141141
142142
143143 func keyStakedTotal (lpAssetIdStr) = ("%s%s%s__staked__total__" + lpAssetIdStr)
144144
145145
146146 func keyClaimedByUser (lpAssetIdStr,userAddressStr) = makeString(["%s%s%s__claimed", userAddressStr, lpAssetIdStr], SEP)
147147
148148
149149 func keyClaimedByUserMinReward (lpAssetIdStr,userAddressStr) = makeString(["%s%s%s__claimedMinReward", userAddressStr, lpAssetIdStr], SEP)
150150
151151
152152 func keyClaimedByUserBoostReward (lpAssetIdStr,userAddressStr) = makeString(["%s%s%s__claimedBoostReward", userAddressStr, lpAssetIdStr], SEP)
153153
154154
155155 func keyClaimedTotal (lpAssetIdStr) = makeString(["%s%s%s__claimed", "total", lpAssetIdStr], SEP)
156156
157157
158158 func readStaked (key) = valueOrElse(getInteger(this, key), 0)
159159
160160
161161 func keyLastTotalLpBalance (lpAssetId) = makeString(["%s%s%s", lpAssetId, "total", "bal"], SEP)
162162
163163
164164 func keyLastUserLpBalance (lpAssetId,userAddress) = makeString(["%s%s%s", lpAssetId, userAddress, "bal"], SEP)
165165
166166
167167 func keyTotalLpBalanceIntegral (lpAssetId) = makeString(["%s%s%s", lpAssetId, "total", "balINT"], SEP)
168168
169169
170170 func keyUserLpBalanceIntegral (lpAssetId,userAddress) = makeString(["%s%s%s", lpAssetId, userAddress, "balINT"], SEP)
171171
172172
173173 func keyTotalLpBalanceIntegralLastUpdHeight (lpAssetId) = makeString(["%s%s%s", lpAssetId, "total", "lastUpd"], SEP)
174174
175175
176176 func keyUserLpBalanceIntegralLastUpdHeight (lpAssetId,userAddress) = makeString(["%s%s%s", lpAssetId, userAddress, "lastUpd"], SEP)
177177
178178
179179 func keyWxPerLpIntegral (lpAssetId) = makeString(["%s%s%s%s", lpAssetId, "common", "lpInt"], SEP)
180180
181181
182182 func keyWxPerLpIntegralLastUpdHeight (lpAssetId) = makeString(["%s%s%s%s", lpAssetId, "common", "lpIntH"], SEP)
183183
184184
185185 func keyWxToClaimUser (lpAssetId,userAddress) = makeString(["%s%s%s%s", lpAssetId, userAddress, "lpInt"], SEP)
186186
187187
188188 func keyWxPerLpIntegralUserLastUpdHeight (lpAssetId,userAddress) = makeString(["%s%s%s%s", lpAssetId, userAddress, "lpIntH"], SEP)
189189
190190
191191 func keyWxPerLp (lpAssetId) = makeString(["%s", lpAssetId, "wxPerLp"], SEP)
192192
193193
194194 func keyWxPerLpX18 (lpAssetId) = makeString(["%s", lpAssetId, "wxPerLpX18"], SEP)
195195
196196
197197 func keyWxPerLpIntegralUserLast (lpAssetId,userAddress) = makeString(["%s%s%s%s", lpAssetId, userAddress, "uIntL"], SEP)
198198
199199
200200 func keyOperationHistoryRecord (type,userAddress,txId58) = makeString(["%s%s%s%s__history", type, userAddress, txId58], SEP)
201201
202202
203203 func formatHistoryRecord (userAddress,lpAssetId,type,amount) = makeString(["%s%s%s%d%d%d", userAddress, lpAssetId, type, toString(height), toString(lastBlock.timestamp), toString(amount)], SEP)
204204
205205
206206 func OperationHistoryEntry (type,userAddress,lpAssetId,amount,txId) = StringEntry(keyOperationHistoryRecord(type, userAddress, toBase58String(txId)), formatHistoryRecord(userAddress, lpAssetId, type, amount))
207207
208208
209209 let factoryAddress = getStringOrFail(keyFactoryAddress())
210210
211211 let factoryContract = addressFromStringValue(factoryAddress)
212212
213213 let factoryCfg = readFactoryCfgOrFail(factoryContract)
214214
215215 let emissionContract = getEmissionAddressOrFail(factoryCfg)
216216
217217 let boostingContract = getBoostingAddressOrFail(factoryCfg)
218218
219219 func calcWxPerLpIntegralUserLast (stakedByUser,wxPerLpIntegralUserLastUpdHeightOrZero,wxPerLpIntegralNew,wxPerLpIntegralUserLastKEY) = if (if ((wxPerLpIntegralUserLastUpdHeightOrZero == 0))
220220 then (stakedByUser > 0)
221221 else false)
222222 then 0
223223 else if ((stakedByUser == 0))
224224 then wxPerLpIntegralNew
225225 else if (if ((wxPerLpIntegralUserLastUpdHeightOrZero > 0))
226226 then (stakedByUser > 0)
227227 else false)
228228 then getIntOrFail(this, wxPerLpIntegralUserLastKEY)
229229 else throw("calcWxPerLpIntegralUserLast: unexpected state")
230230
231231
232232 func refreshPoolINTEGRALS (lpAssetIdStr,poolAddressStr,lpDeltaAmount) = {
233233 let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
234234 let stakedTotal = readStaked(stakedTotalKEY)
235235 let poolWeight = getIntegerValue(factoryContract, keyFactoryPoolWeight(poolAddressStr))
236236 let emissionStartBlock = getIntOrFail(emissionContract, keyEmissionStartBlock())
237237 let MULT3 = 1000
238238 let wxEmissionPerBlockX3 = (getIntOrFail(emissionContract, keyEmissionRatePerBlockCurrent()) * MULT3)
239239 let poolWxEmissionPerBlockX3 = fraction(wxEmissionPerBlockX3, poolWeight, (POOLWEIGHTMULT * 3))
240240 let wxPerLpIntegralKEY = keyWxPerLpIntegral(lpAssetIdStr)
241241 let wxPerLpIntegralLastUpdHeightKEY = keyWxPerLpIntegralLastUpdHeight(lpAssetIdStr)
242242 let wxPerLpKEY = keyWxPerLp(lpAssetIdStr)
243243 let wxPerLpIntegralLastUpdHeight = getIntOrDefault(this, wxPerLpIntegralLastUpdHeightKEY, emissionStartBlock)
244244 let wxPerLpIntegral = getIntOrZero(this, wxPerLpIntegralKEY)
245245 let wxPerLpOrZeroX3 = 0
246246 let dh = max([(height - wxPerLpIntegralLastUpdHeight), 0])
247247 let wxPerLpX3 = if ((wxPerLpOrZeroX3 != 0))
248248 then wxPerLpOrZeroX3
249249 else fraction(poolWxEmissionPerBlockX3, MULT8, stakedTotal)
250250 let stakedTotalNew = (stakedTotal + lpDeltaAmount)
251251 let wxPerLpIntegralNew = (wxPerLpIntegral + (wxPerLpX3 * dh))
252252 let wxPerLpX3New = (poolWxEmissionPerBlockX3 / stakedTotalNew)
253253 let wxPerLpIntegralLastUpdHeightNew = height
254254 let debug = makeString([toString(wxPerLpIntegralNew), toString(dh), toString(wxPerLpX3), toString(stakedTotal), toString(poolWxEmissionPerBlockX3), toString(wxEmissionPerBlockX3), toString(poolWeight)], "::")
255255 $Tuple3(wxPerLpIntegralNew, [IntegerEntry(wxPerLpIntegralKEY, wxPerLpIntegralNew), IntegerEntry(wxPerLpIntegralLastUpdHeightKEY, wxPerLpIntegralLastUpdHeightNew), IntegerEntry(wxPerLpKEY, wxPerLpX3New)], debug)
256256 }
257257
258258
259259 func refreshINTEGRALS (lpAssetIdStr,userAddressStr,poolAddressStr,lpDeltaAmount) = {
260260 let $t01049410616 = refreshPoolINTEGRALS(lpAssetIdStr, poolAddressStr, lpDeltaAmount)
261261 let wxPerLpIntegralNew = $t01049410616._1
262262 let poolIntegralSTATE = $t01049410616._2
263263 let poolDEBUG = $t01049410616._3
264264 let MULT3 = 1000
265265 let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
266266 let stakedByUser = readStaked(stakedByUserKEY)
267267 let wxToClaimUserKEY = keyWxToClaimUser(lpAssetIdStr, userAddressStr)
268268 let wxPerLpIntegralUserLastUpdHeightKEY = keyWxPerLpIntegralUserLastUpdHeight(lpAssetIdStr, userAddressStr)
269269 let wxPerLpIntegralUserLastKEY = keyWxPerLpIntegralUserLast(lpAssetIdStr, userAddressStr)
270270 let wxToClaimUser = getIntOrZero(this, wxToClaimUserKEY)
271271 let wxPerLpIntegralUserLastUpdHeightOrZero = getIntOrZero(this, wxPerLpIntegralUserLastUpdHeightKEY)
272272 let wxPerLpIntegralUserLast = calcWxPerLpIntegralUserLast(stakedByUser, wxPerLpIntegralUserLastUpdHeightOrZero, wxPerLpIntegralNew, wxPerLpIntegralUserLastKEY)
273273 let wxToClaimUserNew = (wxToClaimUser + fraction((wxPerLpIntegralNew - wxPerLpIntegralUserLast), stakedByUser, (MULT8 * MULT3)))
274- let wxPerLpIntegralUserLastNew = wxPerLpIntegralNew
275- let wxPerLpIntegralUserLastUpdHeightNew = height
276- let debug = makeString([toString(wxToClaimUserNew), toString(wxPerLpIntegralUserLast), toString(stakedByUser), poolDEBUG, toString(height)], "::")
277- $Tuple3(wxToClaimUserNew, (poolIntegralSTATE ++ [IntegerEntry(wxToClaimUserKEY, wxToClaimUserNew), IntegerEntry(wxPerLpIntegralUserLastUpdHeightKEY, wxPerLpIntegralUserLastUpdHeightNew), IntegerEntry(wxPerLpIntegralUserLastKEY, wxPerLpIntegralUserLastNew)]), debug)
274+ if ((wxToClaimUserNew == wxToClaimUserNew))
275+ then {
276+ let error = throw("error after wxToClaimUserNew fraction")
277+ if ((error == error))
278+ then {
279+ let wxPerLpIntegralUserLastNew = wxPerLpIntegralNew
280+ let wxPerLpIntegralUserLastUpdHeightNew = height
281+ let debug = makeString([toString(wxToClaimUserNew), toString(wxPerLpIntegralUserLast), toString(stakedByUser), poolDEBUG, toString(height)], "::")
282+ $Tuple3(wxToClaimUserNew, (poolIntegralSTATE ++ [IntegerEntry(wxToClaimUserKEY, wxToClaimUserNew), IntegerEntry(wxPerLpIntegralUserLastUpdHeightKEY, wxPerLpIntegralUserLastUpdHeightNew), IntegerEntry(wxPerLpIntegralUserLastKEY, wxPerLpIntegralUserLastNew)]), debug)
283+ }
284+ else throw("Strict value is not equal to itself.")
285+ }
286+ else throw("Strict value is not equal to itself.")
278287 }
279288
280289
281290 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
282291 case s: String =>
283292 fromBase58String(s)
284293 case _: Unit =>
285294 unit
286295 case _ =>
287296 throw("Match error")
288297 }
289298
290299
291300 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
292301 case s: String =>
293302 fromBase58String(s)
294303 case _: Unit =>
295304 unit
296305 case _ =>
297306 throw("Match error")
298307 }
299308
300309
301310 func mustManager (i) = {
302311 let pd = throw("Permission denied")
303312 match managerPublicKeyOrUnit() {
304313 case pk: ByteVector =>
305314 if ((i.callerPublicKey == pk))
306315 then true
307316 else pd
308317 case _: Unit =>
309318 if ((i.caller == this))
310319 then true
311320 else pd
312321 case _ =>
313322 throw("Match error")
314323 }
315324 }
316325
317326
318327 @Callable(i)
319328 func constructor (factoryAddressStr) = {
320329 let checkCaller = mustManager(i)
321330 if ((checkCaller == checkCaller))
322331 then [StringEntry(keyFactoryAddress(), factoryAddressStr)]
323332 else throw("Strict value is not equal to itself.")
324333 }
325334
326335
327336
328337 @Callable(i)
329338 func setManager (pendingManagerPublicKey) = {
330339 let checkCaller = mustManager(i)
331340 if ((checkCaller == checkCaller))
332341 then {
333342 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
334343 if ((checkManagerPublicKey == checkManagerPublicKey))
335344 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
336345 else throw("Strict value is not equal to itself.")
337346 }
338347 else throw("Strict value is not equal to itself.")
339348 }
340349
341350
342351
343352 @Callable(i)
344353 func confirmManager () = {
345354 let pm = pendingManagerPublicKeyOrUnit()
346355 let hasPM = if (isDefined(pm))
347356 then true
348357 else throw("No pending manager")
349358 if ((hasPM == hasPM))
350359 then {
351360 let checkPM = if ((i.callerPublicKey == value(pm)))
352361 then true
353362 else throw("You are not pending manager")
354363 if ((checkPM == checkPM))
355364 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
356365 else throw("Strict value is not equal to itself.")
357366 }
358367 else throw("Strict value is not equal to itself.")
359368 }
360369
361370
362371
363372 @Callable(i)
364373 func stake () = if ((size(i.payments) != 1))
365374 then throw("invalid payment - exact one payment must be attached")
366375 else {
367376 let pmt = i.payments[0]
368- if ((pmt == pmt))
369- then {
370- let lpAssetId = value(pmt.assetId)
371- if ((lpAssetId == lpAssetId))
372- then {
373- let lpAssetIdStr = toBase58String(lpAssetId)
374- if ((lpAssetIdStr == lpAssetIdStr))
375- then {
376- let amount = pmt.amount
377- if ((amount == amount))
378- then {
379- let poolAddressStr = valueOrErrorMessage(getString(factoryContract, keyFactoryLp2AssetsMapping(lpAssetIdStr)), ("unsupported lp asset " + lpAssetIdStr))
380- if ((poolAddressStr == poolAddressStr))
381- then {
382- let callerStr = toString(i.caller)
383- if ((callerStr == callerStr))
384- then {
385- let userAddressStr = if ((callerStr == poolAddressStr))
386- then toString(i.originCaller)
387- else callerStr
388- if ((userAddressStr == userAddressStr))
389- then {
390- let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
391- if ((stakedByUserKEY == stakedByUserKEY))
392- then {
393- let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
394- if ((stakedTotalKEY == stakedTotalKEY))
395- then {
396- let stakedByUser = readStaked(stakedByUserKEY)
397- if ((stakedByUser == stakedByUser))
398- then {
399- let stakedTotal = readStaked(stakedTotalKEY)
400- if ((stakedTotal == stakedTotal))
401- then {
402- let $t01430714427 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, amount)
403- if (($t01430714427 == $t01430714427))
404- then {
405- let debug = $t01430714427._3
406- let integralSTATE = $t01430714427._2
407- let wxToClaimUserNew = $t01430714427._1
408- let error = throw("error after refreshINTEGRALS")
409- if ((error == error))
410- then ([IntegerEntry(stakedByUserKEY, (stakedByUser + amount)), IntegerEntry(stakedTotalKEY, (stakedTotal + amount)), OperationHistoryEntry("stake", userAddressStr, lpAssetIdStr, amount, i.transactionId)] ++ integralSTATE)
411- else throw("Strict value is not equal to itself.")
412- }
413- else throw("Strict value is not equal to itself.")
414- }
415- else throw("Strict value is not equal to itself.")
416- }
417- else throw("Strict value is not equal to itself.")
418- }
419- else throw("Strict value is not equal to itself.")
420- }
421- else throw("Strict value is not equal to itself.")
422- }
423- else throw("Strict value is not equal to itself.")
424- }
425- else throw("Strict value is not equal to itself.")
426- }
427- else throw("Strict value is not equal to itself.")
428- }
429- else throw("Strict value is not equal to itself.")
430- }
431- else throw("Strict value is not equal to itself.")
432- }
433- else throw("Strict value is not equal to itself.")
434- }
435- else throw("Strict value is not equal to itself.")
377+ let lpAssetId = value(pmt.assetId)
378+ let lpAssetIdStr = toBase58String(lpAssetId)
379+ let amount = pmt.amount
380+ let poolAddressStr = valueOrErrorMessage(getString(factoryContract, keyFactoryLp2AssetsMapping(lpAssetIdStr)), ("unsupported lp asset " + lpAssetIdStr))
381+ let callerStr = toString(i.caller)
382+ let userAddressStr = if ((callerStr == poolAddressStr))
383+ then toString(i.originCaller)
384+ else callerStr
385+ let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
386+ let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
387+ let stakedByUser = readStaked(stakedByUserKEY)
388+ let stakedTotal = readStaked(stakedTotalKEY)
389+ let $t01434314460 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, amount)
390+ let wxToClaimUserNew = $t01434314460._1
391+ let integralSTATE = $t01434314460._2
392+ let debug = $t01434314460._3
393+ ([IntegerEntry(stakedByUserKEY, (stakedByUser + amount)), IntegerEntry(stakedTotalKEY, (stakedTotal + amount)), OperationHistoryEntry("stake", userAddressStr, lpAssetIdStr, amount, i.transactionId)] ++ integralSTATE)
436394 }
437395
438396
439397
440398 @Callable(i)
441399 func unstake (lpAssetIdStr,amount) = {
442400 let lpAssetId = fromBase58String(lpAssetIdStr)
443401 let poolAddressStr = valueOrErrorMessage(getString(factoryContract, keyFactoryLp2AssetsMapping(lpAssetIdStr)), ("unsupported lp asset " + lpAssetIdStr))
444402 let poolAddon = valueOrElse(getString(this, keyStablePoolAddonAddr()), poolAddressStr)
445403 let callerStr = toString(i.caller)
446404 let userAddressStr = if (if ((callerStr == poolAddressStr))
447405 then true
448406 else (callerStr == poolAddon))
449407 then toString(i.originCaller)
450408 else callerStr
451409 let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
452410 let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
453411 let stakedByUser = readStaked(stakedByUserKEY)
454412 let stakedTotal = readStaked(stakedTotalKEY)
455- let $t01562015738 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, -(amount))
456- let wxToClaimUserNew = $t01562015738._1
457- let integralSTATE = $t01562015738._2
458- let debug = $t01562015738._3
413+ let $t01559715715 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, -(amount))
414+ let wxToClaimUserNew = $t01559715715._1
415+ let integralSTATE = $t01559715715._2
416+ let debug = $t01559715715._3
459417 if ((amount > stakedByUser))
460418 then throw("passed amount is less then available")
461419 else ([IntegerEntry(stakedByUserKEY, (stakedByUser - amount)), IntegerEntry(stakedTotalKEY, (stakedTotal - amount)), ScriptTransfer(i.caller, amount, lpAssetId), OperationHistoryEntry("unstake", userAddressStr, lpAssetIdStr, amount, i.transactionId)] ++ integralSTATE)
462420 }
463421
464422
465423
466424 @Callable(i)
467425 func claimWx (lpAssetIdStr) = {
468426 let userAddress = i.caller
469427 let userAddressStr = toString(i.caller)
470428 let poolAddressStr = getStringByAddressOrFail(factoryContract, keyFactoryLpAssetToPoolContractAddress(lpAssetIdStr))
471429 let claimedByUserKEY = keyClaimedByUser(lpAssetIdStr, userAddressStr)
472430 let claimedTotalKEY = keyClaimedTotal(lpAssetIdStr)
473431 let claimedByUserMinRewardKEY = keyClaimedByUserMinReward(lpAssetIdStr, userAddressStr)
474432 let claimedByUserBoostRewardKEY = keyClaimedByUserBoostReward(lpAssetIdStr, userAddressStr)
475433 let claimedByUser = getIntOrZero(this, claimedByUserKEY)
476434 let claimedByUserMinReward = getIntOrZero(this, claimedByUserMinRewardKEY)
477435 let claimedByUserBoostReward = getIntOrZero(this, claimedByUserBoostRewardKEY)
478436 let claimedTotal = getIntOrZero(this, claimedTotalKEY)
479- let $t01693017042 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
480- let wxToClaimUserNew = $t01693017042._1
481- let integralSTATE = $t01693017042._2
482- let debug = $t01693017042._3
437+ let $t01690717019 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
438+ let wxToClaimUserNew = $t01690717019._1
439+ let integralSTATE = $t01690717019._2
440+ let debug = $t01690717019._3
483441 let availableToClaim = (wxToClaimUserNew - claimedByUser)
484442 if ((0 >= availableToClaim))
485443 then throw("nothing to claim")
486444 else {
487445 let wxAmountBoostTotal = asInt(asAnyList(invoke(boostingContract, "claimWxBoost", [lpAssetIdStr, userAddressStr], nil))[0])
488446 let minRewardPart = availableToClaim
489447 let boostRewardPart = min([(minRewardPart * 2), wxAmountBoostTotal])
490448 let wxAssetId = asByteVector(asAnyList(invoke(emissionContract, "emit", [minRewardPart], nil))[0])
491449 let emitBoost = asAnyList(invoke(emissionContract, "emit", [boostRewardPart], nil))
492450 if ((emitBoost == emitBoost))
493451 then [IntegerEntry(claimedByUserKEY, (claimedByUser + availableToClaim)), IntegerEntry(claimedByUserMinRewardKEY, (claimedByUserMinReward + minRewardPart)), IntegerEntry(claimedByUserBoostRewardKEY, (claimedByUserBoostReward + boostRewardPart)), IntegerEntry(claimedTotalKEY, (claimedTotal + availableToClaim)), ScriptTransfer(userAddress, minRewardPart, wxAssetId), ScriptTransfer(userAddress, boostRewardPart, wxAssetId), OperationHistoryEntry("claim", userAddressStr, lpAssetIdStr, availableToClaim, i.transactionId)]
494452 else throw("Strict value is not equal to itself.")
495453 }
496454 }
497455
498456
499457
500458 @Callable(i)
501459 func claimWxREADONLY (lpAssetIdStr,userAddressStr) = {
502460 let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
503461 let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
504462 let claimedByUserKEY = keyClaimedByUser(lpAssetIdStr, userAddressStr)
505463 let stakedByUser = readStaked(stakedByUserKEY)
506464 let stakedTotal = readStaked(stakedTotalKEY)
507465 let claimedByUser = getIntOrZero(this, claimedByUserKEY)
508466 let poolAddressStr = getStringByAddressOrFail(factoryContract, keyFactoryLpAssetToPoolContractAddress(lpAssetIdStr))
509467 let poolWeight = getIntegerValue(factoryContract, keyFactoryPoolWeight(poolAddressStr))
510468 let wxEmissionPerBlock = getIntOrFail(emissionContract, keyEmissionRatePerBlockCurrent())
511469 let emissionStartBlock = getIntOrFail(emissionContract, keyEmissionStartBlock())
512470 let passedBlocks = if ((emissionStartBlock > height))
513471 then 0
514472 else (height - emissionStartBlock)
515473 let poolWxEmission = fraction((wxEmissionPerBlock * passedBlocks), poolWeight, POOLWEIGHTMULT)
516474 let userWxReward = fraction(poolWxEmission, stakedByUser, stakedTotal)
517- let $t01924219354 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
518- let wxToClaimUserNew = $t01924219354._1
519- let integralSTATE = $t01924219354._2
520- let debug = $t01924219354._3
475+ let $t01921919331 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
476+ let wxToClaimUserNew = $t01921919331._1
477+ let integralSTATE = $t01921919331._2
478+ let debug = $t01921919331._3
521479 let availableToClaim = (wxToClaimUserNew - claimedByUser)
522480 let boostInvResult = asAnyList(invoke(boostingContract, "claimWxBoostREADONLY", [lpAssetIdStr, userAddressStr], nil))
523481 let wxAmountBoostTotal = asInt(boostInvResult[0])
524482 let boostDebug = asString(boostInvResult[1])
525483 let minRewardPart = availableToClaim
526484 let boostRewardPart = min([(minRewardPart * 2), wxAmountBoostTotal])
527485 let totalReward = (minRewardPart + boostRewardPart)
528486 $Tuple2(nil, makeString(["%s%s%d%d%d%d%s", lpAssetIdStr, userAddressStr, toString(totalReward), toString(claimedByUser), toString(minRewardPart), toString(boostRewardPart), ((((debug + "::") + toString(userWxReward)) + "::BOOSTDEBUG::") + boostDebug)], SEP))
529487 }
530488
531489
532490
533491 @Callable(i)
534492 func onModifyWeight (lpAssetIdStr,poolAddressStr) = if ((i.caller != factoryContract))
535493 then throw("permissions denied")
536494 else {
537- let $t02023420344 = refreshPoolINTEGRALS(lpAssetIdStr, poolAddressStr, 0)
538- let wxPerLpIntegralNew = $t02023420344._1
539- let poolIntegralSTATE = $t02023420344._2
540- let poolDEBUG = $t02023420344._3
495+ let $t02021120321 = refreshPoolINTEGRALS(lpAssetIdStr, poolAddressStr, 0)
496+ let wxPerLpIntegralNew = $t02021120321._1
497+ let poolIntegralSTATE = $t02021120321._2
498+ let poolDEBUG = $t02021120321._3
541499 poolIntegralSTATE
542500 }
543501
544502
545503 @Verifier(tx)
546504 func verify () = {
547505 let targetPublicKey = match managerPublicKeyOrUnit() {
548506 case pk: ByteVector =>
549507 pk
550508 case _: Unit =>
551509 tx.senderPublicKey
552510 case _ =>
553511 throw("Match error")
554512 }
555513 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
556514 }
557515

github/deemru/w8io/873ac7e 
74.01 ms