tx · 5JFSmeG8TDDvJaRzviBgq84YqNaAef5fdRLxwmrGcLaS

3NBFNzUQ8Y7FC2gkuLSr6yRrTLydGn1vcJw:  -0.01000000 Waves

2021.11.25 17:41 [1806700] smart account 3NBFNzUQ8Y7FC2gkuLSr6yRrTLydGn1vcJw > SELF 0.00000000 Waves

{ "type": 13, "id": "5JFSmeG8TDDvJaRzviBgq84YqNaAef5fdRLxwmrGcLaS", "fee": 1000000, "feeAssetId": null, "timestamp": 1637851343537, "version": 1, "sender": "3NBFNzUQ8Y7FC2gkuLSr6yRrTLydGn1vcJw", "senderPublicKey": "2h5WUYrDouLj41YkFTC8akD2W7ryFwpyqMMAKcn8KVsA", "proofs": [ "316i3NTfP1fmnLPLvKNqvyDP1QaTpinwVw7yUSXHmy4TRLJX7bJ9VoiGkXy3gmik6WAV3dRdJvATT2cFbSJyFSoC" ], "script": "base64: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AAAAAAAABQAAAAAVSWR4RmFjdG9yeUNmZ1Jlc3REYXBwAAAAAAAAAAAGAAAAABlJZHhGYWN0b3J5Q2ZnU2xpcHBhZ2VEYXBwAAAAAAAAAAAHAQAAAA1rZXlGYWN0b3J5Q2ZnAAAAAAIAAAARJXNfX2ZhY3RvcnlDb25maWcBAAAAGmtleUZhY3RvcnlMcDJBc3NldHNNYXBwaW5nAAAAAQAAAApscEFzc2V0U3RyCQAEuQAAAAIJAARMAAAAAgIAAAAGJXMlcyVzCQAETAAAAAIFAAAACmxwQXNzZXRTdHIJAARMAAAAAgIAAAAebWFwcGluZ3NfX2xwQXNzZXQyUG9vbENvbnRyYWN0BQAAAANuaWwFAAAAA1NFUAEAAAAQa2V5RmFjdG9yeUxwTGlzdAAAAAACAAAAECVzX19scFRva2Vuc0xpc3QBAAAAJmtleUZhY3RvcnlMcEFzc2V0VG9Qb29sQ29udHJhY3RBZGRyZXNzAAAAAQAAAApscEFzc2V0U3RyCQAEuQAAAAIJAARMAAAAAgIAAAAGJXMlcyVzCQAETAAAAAIFAAAACmxwQXNzZXRTdHIJAARMAAAAAgIAAAAebWFwcGluZ3NfX2xwQXNzZXQyUG9vbENvbnRyYWN0BQAAAANuaWwFAAAAA1NFUAEAAAAUa2V5RmFjdG9yeVBvb2xXZWlnaHQAAAABAAAAD2NvbnRyYWN0QWRkcmVzcwkABLkAAAACCQAETAAAAAICAAAABCVzJXMJAARMAAAAAgIAAAAKcG9vbFdlaWdodAkABEwAAAACBQAAAA9jb250cmFjdEFkZHJlc3MFAAAAA25pbAUAAAADU0VQAQAAABhyZWFkRmFjdG9yeUFkZHJlc3NPckZhaWwAAAAACQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAQkBAAAAEWtleUZhY3RvcnlBZGRyZXNzAAAAAAEAAAAKcmVhZExwTGlzdAAAAAAJAAS1AAAAAgkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACCQEAAAAYcmVhZEZhY3RvcnlBZGRyZXNzT3JGYWlsAAAAAAkBAAAAEGtleUZhY3RvcnlMcExpc3QAAAAAAgAAAAAFAAAAA1NFUAEAAAAUcmVhZEZhY3RvcnlDZmdPckZhaWwAAAABAAAAB2ZhY3RvcnkJAAS1AAAAAgkBAAAAGGdldFN0cmluZ0J5QWRkcmVzc09yRmFpbAAAAAIFAAAAB2ZhY3RvcnkJAQAAAA1rZXlGYWN0b3J5Q2ZnAAAAAAUAAAADU0VQAQAAABhnZXRCb29zdGluZ0FkZHJlc3NPckZhaWwAAAABAAAACmZhY3RvcnlDZmcJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEJAAGRAAAAAgUAAAAKZmFjdG9yeUNmZwUAAAAZSWR4RmFjdG9yeUNmZ0Jvb3N0aW5nRGFwcAEAAAAYZ2V0RW1pc3Npb25BZGRyZXNzT3JGYWlsAAAAAQAAAApmYWN0b3J5Q2ZnCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQABkQAAAAIFAAAACmZhY3RvcnlDZmcFAAAAGUlkeEZhY3RvcnlDZmdFbWlzc2lvbkRhcHABAAAAF2dldFN0YWtpbmdBZGRyZXNzT3JGYWlsAAAAAQAAAApmYWN0b3J5Q2ZnCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQABkQAAAAIFAAAACmZhY3RvcnlDZmcFAAAAGElkeEZhY3RvcnlDZmdTdGFraW5nRGFwcAEAAAAea2V5RW1pc3Npb25SYXRlUGVyQmxvY2tDdXJyZW50AAAAAAIAAAAbJXMlc19fcmF0ZVBlckJsb2NrX19jdXJyZW50AQAAACFrZXlFbWlzc2lvblJhdGVQZXJCbG9ja01heEN1cnJlbnQAAAAAAgAAAB4lcyVzX19yYXRlUGVyQmxvY2tNYXhfX2N1cnJlbnQBAAAAFWtleUVtaXNzaW9uU3RhcnRCbG9jawAAAAACAAAAGiVzJXNfX2VtaXNzaW9uX19zdGFydEJsb2NrAQAAABtrZXlFbWlzc2lvbkR1cmF0aW9uSW5CbG9ja3MAAAAAAgAAABglcyVzX19lbWlzc2lvbl9fZHVyYXRpb24BAAAAE2tleUVtaXNzaW9uRW5kQmxvY2sAAAAAAgAAABglcyVzX19lbWlzc2lvbl9fZW5kQmxvY2sBAAAAD2tleVN0YWtlZEJ5VXNlcgAAAAIAAAAOdXNlckFkZHJlc3NTdHIAAAAMbHBBc3NldElkU3RyCQAEuQAAAAIJAARMAAAAAgIAAAAOJXMlcyVz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b3JkAAAABAUAAAALdXNlckFkZHJlc3MFAAAACWxwQXNzZXRJZAUAAAAEdHlwZQUAAAAGYW1vdW50AAAAAA9mYWN0b3J5Q29udHJhY3QJAQAAABhyZWFkRmFjdG9yeUFkZHJlc3NPckZhaWwAAAAAAAAAAApmYWN0b3J5Q2ZnCQEAAAAUcmVhZEZhY3RvcnlDZmdPckZhaWwAAAABBQAAAA9mYWN0b3J5Q29udHJhY3QAAAAAEGVtaXNzaW9uQ29udHJhY3QJAQAAABhnZXRFbWlzc2lvbkFkZHJlc3NPckZhaWwAAAABBQAAAApmYWN0b3J5Q2ZnAAAAABBib29zdGluZ0NvbnRyYWN0CQEAAAAYZ2V0Qm9vc3RpbmdBZGRyZXNzT3JGYWlsAAAAAQUAAAAKZmFjdG9yeUNmZwEAAAAbY2FsY1d4UGVyTHBJbnRlZ3JhbFVzZXJMYXN0AAAABAAAAAxzdGFrZWRCeVVzZXIAAAAmd3hQZXJMcEludGVncmFsVXNlckxhc3RVcGRIZWlnaHRPclplcm8AAAASd3hQZXJMcEludGVncmFsTmV3AAAAGnd4UGVyTHBJbnRlZ3JhbFVzZXJMYXN0S0VZAwMJAAAAAAAAAgUAAAAmd3hQZXJMcEludGVncmFsVXNlckxhc3RVcGRIZWlnaHRPclplcm8AAAAAAAAAAAAJAABmAAAAAgUAAAAMc3Rha2VkQnlVc2VyAAAAAAAAAAAABwAAAAAAAAAAAAMJAAAAAAAAAgUAAAAMc3Rha2VkQnlVc2VyAAAAAAAAAAAABQAAABJ3eFBlckxwSW50ZWdyYWxOZXcDAwkAAGYAAAACBQAAACZ3eFBlckxwSW50ZWdyYWxVc2VyTGFzdFVwZEhlaWdodE9yWmVybwAAAAAAAAAAAAkAAGYAAAACBQAAAAxzdGFrZWRCeVVzZXIAAAAAAAAAAAAHCQEAAAAMZ2V0SW50T3JGYWlsAAAAAgUAAAAEdGhpcwUAAAAad3hQZXJMcEludGVncmFsVXNlckxhc3RLRVkJAAACAAAAAQIAAAAtY2FsY1d4UGVyTHBJbnRlZ3JhbFVzZXJMYXN0OiB1bmV4cGVjdGVkIHN0YXRlAQAAABByZWZyZXNoSU5URUdSQUxTAAAABAAAAAxscEFzc2V0SWRTdHIAAAAOdXNlckFkZHJlc3NTdHIAAAAOcG9vbEFkZHJlc3NTdHIAAAANbHBEZWx0YUFtb3VudAQAAAAPc3Rha2VkQnlVc2VyS0VZCQEAAAAPa2V5U3Rha2VkQnlVc2VyAAAAAgUAAAAOdXNlckFkZHJlc3NTdHIFAAAADGxwQXNzZXRJZFN0cgQAAAAOc3Rha2VkVG90YWxLRVkJAQAAAA5rZXlTdGFrZWRUb3RhbAAAAAEFAAAADGxwQXNzZXRJZFN0cgQAAAAMc3Rha2VkQnlVc2VyCQEAAAAKcmVhZFN0YWtlZAAAAAEFAAAAD3N0YWtlZEJ5VXNlcktFWQQAAAALc3Rha2VkVG90YWwJAQAAAApyZWFkU3Rha2VkAAAAAQUAAAAOc3Rha2VkVG90YWxLRVkEAAAACnBvb2xXZWlnaHQJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAAD2ZhY3RvcnlDb250cmFjdAkBAAAAFGtleUZhY3RvcnlQb29sV2VpZ2h0AAAAAQUAAAAOcG9vbEFkZHJlc3NTdHIEAAAAEmVtaXNzaW9uU3RhcnRCbG9jawkBAAAADGdldEludE9yRmFpbAAAAAIFAAAAEGVtaXNzaW9uQ29udHJhY3QJAQAAABVrZXlFbWlzc2lvblN0YXJ0QmxvY2sAAAAABAAAABJ3eEVtaXNzaW9uUGVyQmxvY2sJAQAAAAxnZXRJbnRPckZhaWwAAAACBQAAABBlbWlzc2lvbkNvbnRyYWN0CQEAAAAea2V5RW1pc3Npb25SYXRlUGVyQmxvY2tDdXJyZW50AAAAAAQAAAAWcG9vbFd4RW1pc3Npb25QZXJCbG9jawkAAGsAAAADBQAAABJ3eEVtaXNzaW9uUGVyQmxvY2sFAAAACnBvb2xXZWlnaHQJAABoAAAAAgUAAAAOUE9PTFdFSUdIVE1VTFQAAAAAAAAAAAMEAAAAEnd4UGVyTHBJbnRlZ3JhbEtFWQkBAAAAEmtleVd4UGVyTHBJbnRlZ3JhbAAAAAEFAAAADGxwQXNzZXRJZFN0cgQAAAAfd3hQZXJMcEludGVncmFsTGFzdFVwZEhlaWdodEtFWQkBAAAAH2tleVd4UGVyTHBJbnRlZ3JhbExhc3RVcGRIZWlnaHQAAAABBQAAAAxscEFzc2V0SWRTdHIEAAAAEHd4VG9DbGFpbVVzZXJLRVkJAQAAABBrZXlXeFRvQ2xhaW1Vc2VyAAAAAgUAAAAMbHBBc3NldElkU3RyBQAAAA51c2VyQWRkcmVzc1N0cgQAAAAjd3hQZXJMcEludGVncmFsVXNlckxhc3RVcGRIZWlnaHRLRVkJAQAAACNrZXlXeFBlckxwSW50ZWdyYWxVc2VyTGFzdFVwZEhlaWdodAAAAAIFAAAADGxwQXNzZXRJZFN0cgUAAAAOdXNlckFkZHJlc3NTdHIEAAAACnd4UGVyTHBLRVkJAQAAAAprZXlXeFBlckxwAAAAAQUAAAAMbHBBc3NldElkU3RyBAAAABp3eFBlckxwSW50ZWdyYWxVc2VyTGFzdEtFWQkBAAAAGmtleVd4UGVyTHBJbnRlZ3JhbFVzZXJMYXN0AAAAAgUAAAAMbHBBc3NldElkU3RyBQAAAA51c2VyQWRkcmVzc1N0cgQAAAAcd3hQZXJMcEludGVncmFsTGFzdFVwZEhlaWdodAkBAAAAD2dldEludE9yRGVmYXVsdAAAAAMFAAAABHRoaXMFAAAAH3d4UGVyTHBJbnRlZ3JhbExhc3RVcGRIZWlnaHRLRVkFAAAAEmVtaXNzaW9uU3RhcnRCbG9jawQAAAAPd3hQZXJMcEludGVncmFsCQEAAAAMZ2V0SW50T3JaZXJvAAAAAgUAAAAEdGhpcwUAAAASd3hQZXJMcEludGVncmFsS0VZBAAAAA13eFRvQ2xhaW1Vc2VyCQEAAAAMZ2V0SW50T3JaZXJvAAAAAgUAAAAEdGhpcwUAAAAQd3hUb0NsYWltVXNlcktFWQQAAAAmd3hQZXJMcEludGVncmFsVXNlckxhc3RVcGRIZWlnaHRPclplcm8JAQAAAAxnZXRJbnRPclplcm8AAAACBQAAAAR0aGlzBQAAACN3eFBlckxwSW50ZWdyYWxVc2VyTGFzdFVwZEhlaWdodEtFWQQAAAAPd3hQZXJMcE9yWmVyb1g4CQEAAAAMZ2V0SW50T3JaZXJvAAAAAgUAAAAEdGhpcwUAAAAKd3hQZXJMcEtFWQQAAAACZGgJAAGWAAAAAQkABEwAAAACCQAAZQAAAAIFAAAABmhlaWdodAUAAAAcd3hQZXJMcEludGVncmFsTGFzdFVwZEhlaWdodAkABEwAAAACAAAAAAAAAAAABQAAAANuaWwEAAAACXd4UGVyTHBYOAMJAQAAAAIhPQAAAAIFAAAAD3d4UGVyTHBPclplcm9YOAAAAAAAAAAAAAUAAAAPd3hQZXJMcE9yWmVyb1g4CQAAawAAAAMFAAAAFnBvb2xXeEVtaXNzaW9uUGVyQmxvY2sFAAAABU1VTFQ4BQAAAAtzdGFrZWRUb3RhbAQAAAAOc3Rha2VkVG90YWxOZXcJAABkAAAAAgUAAAALc3Rha2VkVG90YWwFAAAADWxwRGVsdGFBbW91bnQEAAAAEnd4UGVyTHBJbnRlZ3JhbE5ldwkAAGQAAAACBQAAAA93eFBlckxwSW50ZWdyYWwJAABoAAAAAgUAAAAJd3hQZXJMcFg4BQAAAAJkaAQAAAAXd3hQZXJMcEludGVncmFsVXNlckxhc3QJAQAAABtjYWxjV3hQZXJMcEludGVncmFsVXNlckxhc3QAAAAEBQAAAAxzdGFrZWRCeVVzZXIFAAAAJnd4UGVyTHBJbnRlZ3JhbFVzZXJMYXN0VXBkSGVpZ2h0T3JaZXJvBQAAABJ3eFBlckxwSW50ZWdyYWxOZXcFAAAAGnd4UGVyTHBJbnRlZ3JhbFVzZXJMYXN0S0VZBAAAABB3eFRvQ2xhaW1Vc2VyTmV3CQAAZAAAAAIFAAAADXd4VG9DbGFpbVVzZXIJAABrAAAAAwkAAGUAAAACBQAAABJ3eFBlckxwSW50ZWdyYWxOZXcFAAAAF3d4UGVyTHBJbnRlZ3JhbFVzZXJMYXN0BQAAAAxzdGFrZWRCeVVzZXIFAAAABU1VTFQ4BAAAABp3eFBlckxwSW50ZWdyYWxVc2VyTGFzdE5ldwUAAAASd3hQZXJMcEludGVncmFsTmV3BAAAAAx3eFBlckxwTmV3WDgJAABpAAAAAgUAAAAWcG9vbFd4RW1pc3Npb25QZXJCbG9jawUAAAAOc3Rha2VkVG90YWxOZXcEAAAAH3d4UGVyTHBJbnRlZ3JhbExhc3RVcGRIZWlnaHROZXcFAAAABmhlaWdodAQAAAAjd3hQZXJMcEludGVncmFsVXNlckxhc3RVcGRIZWlnaHROZXcFAAAABmhlaWdodAQAAAAFZGVidWcJAAS5AAAAAgkABEwAAAACCQABpAAAAAEFAAAAEHd4VG9DbGFpbVVzZXJOZXcJAARMAAAAAgkAAaQAAAABBQAAABJ3eFBlckxwSW50ZWdyYWxOZXcJAARMAAAAAgkAAaQAAAABBQAAABd3eFBlckxwSW50ZWdyYWxVc2VyTGFzdAkABEwAAAACCQABpAAAAAEFAAAADHN0YWtlZEJ5VXNlcgkABEwAAAACCQABpAAAAAEFAAAAAmRoCQAETAAAAAIJAAGkAAAAAQUAAAAJd3hQZXJMcFg4CQAETAAAAAIJAAGkAAAAAQUAAAALc3Rha2VkVG90YWwJAARMAAAAAgkAAaQAAAABBQAAABZwb29sV3hFbWlzc2lvblBlckJsb2NrCQAETAAAAAIJAAGkAAAAAQUAAAASd3hFbWlzc2lvblBlckJsb2NrCQAETAAAAAIJAAGkAAAAAQUAAAAKcG9vbFdlaWdodAkABEwAAAACCQABpAAAAAEFAAAABmhlaWdodAUAAAADbmlsAgAAAAI6OgkABRUAAAADBQAAABB3eFRvQ2xhaW1Vc2VyTmV3CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABJ3eFBlckxwSW50ZWdyYWxLRVkFAAAAEnd4UGVyTHBJbnRlZ3JhbE5ldwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAfd3hQZXJMcEludGVncmFsTGFzdFVwZEhlaWdodEtFWQUAAAAfd3hQZXJMcEludGVncmFsTGFzdFVwZEhlaWdodE5ldwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAQd3hUb0NsYWltVXNlcktFWQUAAAAQd3hUb0NsYWltVXNlck5ldwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAjd3hQZXJMcEludGVncmFsVXNlckxhc3RVcGRIZWlnaHRLRVkFAAAAI3d4UGVyTHBJbnRlZ3JhbFVzZXJMYXN0VXBkSGVpZ2h0TmV3CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAp3eFBlckxwS0VZBQAAAAx3eFBlckxwTmV3WDgJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAGnd4UGVyTHBJbnRlZ3JhbFVzZXJMYXN0S0VZBQAAABp3eFBlckxwSW50ZWdyYWxVc2VyTGFzdE5ldwUAAAADbmlsBQAAAAVkZWJ1ZwAAAAUAAAABaQEAAAALY29uc3RydWN0b3IAAAABAAAAEWZhY3RvcnlBZGRyZXNzU3RyAwkBAAAAAiE9AAAAAggFAAAAAWkAAAAGY2FsbGVyBQAAAAR0aGlzCQAAAgAAAAECAAAADm5vdCBhdXRob3JpemVkCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABFrZXlGYWN0b3J5QWRkcmVzcwAAAAAFAAAAEWZhY3RvcnlBZGRyZXNzU3RyBQAAAANuaWwAAAABaQEAAAAFc3Rha2UAAAAAAwkBAAAAAiE9AAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQkAAAIAAAABAgAAADRpbnZhbGlkIHBheW1lbnQgLSBleGFjdCBvbmUgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBAAAAANwbXQJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAEAAAACWxwQXNzZXRJZAkBAAAABXZhbHVlAAAAAQgFAAAAA3BtdAAAAAdhc3NldElkBAAAAAxscEFzc2V0SWRTdHIJAAJYAAAAAQUAAAAJbHBBc3NldElkBAAAAAZhbW91bnQIBQAAAANwbXQAAAAGYW1vdW50BAAAAA5wb29sQWRkcmVzc1N0cgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAAD2ZhY3RvcnlDb250cmFjdAkBAAAAGmtleUZhY3RvcnlMcDJBc3NldHNNYXBwaW5nAAAAAQUAAAAMbHBBc3NldElkU3RyCQABLAAAAAICAAAAFXVuc3VwcG9ydGVkIGxwIGFzc2V0IAUAAAAMbHBBc3NldElkU3RyBAAAAAljYWxsZXJTdHIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAA51c2VyQWRkcmVzc1N0cgMJAAAAAAAAAgUAAAAJY2FsbGVyU3RyBQAAAA5wb29sQWRkcmVzc1N0cgkABCUAAAABCAUAAAABaQAAAAxvcmlnaW5DYWxsZXIFAAAACWNhbGxlclN0cgQAAAAPc3Rha2VkQnlVc2VyS0VZCQEAAAAPa2V5U3Rha2VkQnlVc2VyAAAAAgUAAAAOdXNlckFkZHJlc3NTdHIFAAAADGxwQXNzZXRJZFN0cgQAAAAOc3Rha2VkVG90YWxLRVkJAQAAAA5rZXlTdGFrZWRUb3RhbAAAAAEFAAAADGxwQXNzZXRJZFN0cgQAAAAMc3Rha2VkQnlVc2VyCQEAAAAKcmVhZFN0YWtlZAAAAAEFAAAAD3N0YWtlZEJ5VXNlcktFWQQAAAALc3Rha2VkVG90YWwJAQAAAApyZWFkU3Rha2VkAAAAAQUAAAAOc3Rha2VkVG90YWxLRVkEAAAADSR0MDEyNDI3MTI1NDQJAQAAABByZWZyZXNoSU5URUdSQUxTAAAABAUAAAAMbHBBc3NldElkU3RyBQAAAA51c2VyQWRkcmVzc1N0cgUAAAAOcG9vbEFkZHJlc3NTdHIFAAAABmFtb3VudAQAAAAQd3hUb0NsYWltVXNlck5ldwgFAAAADSR0MDEyNDI3MTI1NDQAAAACXzEEAAAADWludGVncmFsU1RBVEUIBQAAAA0kdDAxMjQyNzEyNTQ0AAAAAl8yBAAAAAVkZWJ1ZwgFAAAADSR0MDEyNDI3MTI1NDQAAAACXzMJAAROAAAAAgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAPc3Rha2VkQnlVc2VyS0VZCQAAZAAAAAIFAAAADHN0YWtlZEJ5VXNlcgUAAAAGYW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAA5zdGFrZWRUb3RhbEtFWQkAAGQAAAACBQAAAAtzdGFrZWRUb3RhbAUAAAAGYW1vdW50CQAETAAAAAIJAQAAABVPcGVyYXRpb25IaXN0b3J5RW50cnkAAAAFAgAAAAVzdGFrZQUAAAAOdXNlckFkZHJlc3NTdHIFAAAADGxwQXNzZXRJZFN0cgUAAAAGYW1vdW50CAUAAAABaQAAAA10cmFuc2FjdGlvbklkBQAAAANuaWwFAAAADWludGVncmFsU1RBVEUAAAABaQEAAAAHdW5zdGFrZQAAAAIAAAAMbHBBc3NldElkU3RyAAAABmFtb3VudAQAAAAOdXNlckFkZHJlc3NTdHIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAAlscEFzc2V0SWQJAAJZAAAAAQUAAAAMbHBBc3NldElkU3RyBAAAAA5wb29sQWRkcmVzc1N0cgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAAD2ZhY3RvcnlDb250cmFjdAkBAAAAGmtleUZhY3RvcnlMcDJBc3NldHNNYXBwaW5nAAAAAQUAAAAMbHBBc3NldElkU3RyCQABLAAAAAICAAAAFXVuc3VwcG9ydGVkIGxwIGFzc2V0IAUAAAAMbHBBc3NldElkU3RyBAAAAA9zdGFrZWRCeVVzZXJLRVkJAQAAAA9rZXlTdGFrZWRCeVVzZXIAAAACBQAAAA51c2VyQWRkcmVzc1N0cgUAAAAMbHBBc3NldElkU3RyBAAAAA5zdGFrZWRUb3RhbEtFWQkBAAAADmtleVN0YWtlZFRvdGFsAAAAAQUAAAAMbHBBc3NldElkU3RyBAAAAAxzdGFrZWRCeVVzZXIJAQAAAApyZWFkU3Rha2VkAAAAAQUAAAAPc3Rha2VkQnlVc2VyS0VZBAAAAAtzdGFrZWRUb3RhbAkBAAAACnJlYWRTdGFrZWQAAAABBQAAAA5zdGFrZWRUb3RhbEtFWQQAAAANJHQwMTMzNjExMzQ3OQkBAAAAEHJlZnJlc2hJTlRFR1JBTFMAAAAEBQAAAAxscEFzc2V0SWRTdHIFAAAADnVzZXJBZGRyZXNzU3RyBQAAAA5wb29sQWRkcmVzc1N0cgkBAAAAAS0AAAABBQAAAAZhbW91bnQEAAAAEHd4VG9DbGFpbVVzZXJOZXcIBQAAAA0kdDAxMzM2MTEzNDc5AAAAAl8xBAAAAA1pbnRlZ3JhbFNUQVRFCAUAAAANJHQwMTMzNjExMzQ3OQAAAAJfMgQAAAAFZGVidWcIBQAAAA0kdDAxMzM2MTEzNDc5AAAAAl8zAwkAAGYAAAACBQAAAAZhbW91bnQFAAAADHN0YWtlZEJ5VXNlcgkAAAIAAAABAgAAACRwYXNzZWQgYW1vdW50IGlzIGxlc3MgdGhlbiBhdmFpbGFibGUJAAROAAAAAgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAPc3Rha2VkQnlVc2VyS0VZCQAAZQAAAAIFAAAADHN0YWtlZEJ5VXNlcgUAAAAGYW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAA5zdGFrZWRUb3RhbEtFWQkAAGUAAAACBQAAAAtzdGFrZWRUb3RhbAUAAAAGYW1vdW50CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAGYW1vdW50BQAAAAlscEFzc2V0SWQJAARMAAAAAgkBAAAAFU9wZXJhdGlvbkhpc3RvcnlFbnRyeQAAAAUCAAAAB3Vuc3Rha2UFAAAADnVzZXJBZGRyZXNzU3RyBQAAAAxscEFzc2V0SWRTdHIFAAAABmFtb3VudAgFAAAAAWkAAAANdHJhbnNhY3Rpb25JZAUAAAADbmlsBQAAAA1pbnRlZ3JhbFNUQVRFAAAAAWkBAAAAB2NsYWltV3gAAAABAAAADGxwQXNzZXRJZFN0cgQAAAALdXNlckFkZHJlc3MIBQAAAAFpAAAABmNhbGxlcgQAAAAOdXNlckFkZHJlc3NTdHIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAA5wb29sQWRkcmVzc1N0cgkBAAAAGGdldFN0cmluZ0J5QWRkcmVzc09yRmFpbAAAAAIFAAAAD2ZhY3RvcnlDb250cmFjdAkBAAAAJmtleUZhY3RvcnlMcEFzc2V0VG9Qb29sQ29udHJhY3RBZGRyZXNzAAAAAQUAAAAMbHBBc3NldElkU3RyBAAAABBjbGFpbWVkQnlVc2VyS0VZCQEAAAAQa2V5Q2xhaW1lZEJ5VXNlcgAAAAIFAAAADGxwQXNzZXRJZFN0cgUAAAAOdXNlckFkZHJlc3NTdHIEAAAAD2NsYWltZWRUb3RhbEtFWQkBAAAAD2tleUNsYWltZWRUb3RhbAAAAAEFAAAADGxwQXNzZXRJZFN0cgQAAAAZY2xhaW1lZEJ5VXNlck1pblJld2FyZEtFWQkBAAAAGWtleUNsYWltZWRCeVVzZXJNaW5SZXdhcmQAAAACBQAAAAxscEFzc2V0SWRTdHIFAAAADnVzZXJBZGRyZXNzU3RyBAAAABtjbGFpbWVkQnlVc2VyQm9vc3RSZXdhcmRLRVkJAQAAABtrZXlDbGFpbWVkQnlVc2VyQm9vc3RSZXdhcmQAAAACBQAAAAxscEFzc2V0SWRTdHIFAAAADnVzZXJBZGRyZXNzU3RyBAAAAA1jbGFpbWVkQnlVc2VyCQEAAAAMZ2V0SW50T3JaZXJvAAAAAgUAAAAEdGhpcwUAAAAQY2xhaW1lZEJ5VXNlcktFWQQAAAAWY2xhaW1lZEJ5VXNlck1pblJld2FyZAkBAAAADGdldEludE9yWmVybwAAAAIFAAAABHRoaXMFAAAAGWNsYWltZWRCeVVzZXJNaW5SZXdhcmRLRVkEAAAAGGNsYWltZWRCeVVzZXJCb29zdFJld2FyZAkBAAAADGdldEludE9yWmVybwAAAAIFAAAABHRoaXMFAAAAG2NsYWltZWRCeVVzZXJCb29zdFJld2FyZEtFWQQAAAAMY2xhaW1lZFRvdGFsCQEAAAAMZ2V0SW50T3JaZXJvAAAAAgUAAAAEdGhpcwUAAAAPY2xhaW1lZFRvdGFsS0VZBAAAAA0kdDAxNDY3MTE0NzgzCQEAAAAQcmVmcmVzaElOVEVHUkFMUwAAAAQFAAAADGxwQXNzZXRJZFN0cgUAAAAOdXNlckFkZHJlc3NTdHIFAAAADnBvb2xBZGRyZXNzU3RyAAAAAAAAAAAABAAAABB3eFRvQ2xhaW1Vc2VyTmV3CAUAAAANJHQwMTQ2NzExNDc4MwAAAAJfMQQAAAANaW50ZWdyYWxTVEFURQgFAAAADSR0MDE0NjcxMTQ3ODMAAAACXzIEAAAABWRlYnVnCAUAAAANJHQwMTQ2NzExNDc4MwAAAAJfMwQAAAAQYXZhaWxhYmxlVG9DbGFpbQkAAGUAAAACBQAAABB3eFRvQ2xhaW1Vc2VyTmV3BQAAAA1jbGFpbWVkQnlVc2VyAwkAAGcAAAACAAAAAAAAAAAABQAAABBhdmFpbGFibGVUb0NsYWltCQAAAgAAAAECAAAAEG5vdGhpbmcgdG8gY2xhaW0EAAAAEnd4QW1vdW50Qm9vc3RUb3RhbAkBAAAABWFzSW50AAAAAQkAAZEAAAACCQEAAAAJYXNBbnlMaXN0AAAAAQkAA/wAAAAEBQAAABBib29zdGluZ0NvbnRyYWN0AgAAAAxjbGFpbVd4Qm9vc3QJAARMAAAAAgUAAAAOdXNlckFkZHJlc3NTdHIFAAAAA25pbAUAAAADbmlsAAAAAAAAAAAABAAAAApwb29sV2VpZ2h0CQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAA9mYWN0b3J5Q29udHJhY3QJAQAAABRrZXlGYWN0b3J5UG9vbFdlaWdodAAAAAEFAAAADnBvb2xBZGRyZXNzU3RyBAAAABJib29zdFJld2FyZFBhcnRUTVAJAABrAAAAAwUAAAASd3hBbW91bnRCb29zdFRvdGFsBQAAAApwb29sV2VpZ2h0BQAAAA5QT09MV0VJR0hUTVVMVAQAAAANbWluUmV3YXJkUGFydAUAAAAQYXZhaWxhYmxlVG9DbGFpbQQAAAAPYm9vc3RSZXdhcmRQYXJ0CQABlwAAAAEJAARMAAAAAgkAAGgAAAACBQAAAA1taW5SZXdhcmRQYXJ0AAAAAAAAAAADCQAETAAAAAIFAAAAEmJvb3N0UmV3YXJkUGFydFRNUAUAAAADbmlsBAAAAAl3eEFzc2V0SWQJAQAAAAxhc0J5dGVWZWN0b3IAAAABCQABkQAAAAIJAQAAAAlhc0FueUxpc3QAAAABCQAD/AAAAAQFAAAAEGVtaXNzaW9uQ29udHJhY3QCAAAABGVtaXQJAARMAAAAAgUAAAANbWluUmV3YXJkUGFydAUAAAADbmlsBQAAAANuaWwAAAAAAAAAAAAEAAAACWVtaXRCb29zdAkBAAAACWFzQW55TGlzdAAAAAEJAAP8AAAABAUAAAAQZW1pc3Npb25Db250cmFjdAIAAAAEZW1pdAkABEwAAAACBQAAAA9ib29zdFJld2FyZFBhcnQFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAAllbWl0Qm9vc3QFAAAACWVtaXRCb29zdAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAQY2xhaW1lZEJ5VXNlcktFWQkAAGQAAAACBQAAAA1jbGFpbWVkQnlVc2VyBQAAABBhdmFpbGFibGVUb0NsYWltCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABljbGFpbWVkQnlVc2VyTWluUmV3YXJkS0VZCQAAZAAAAAIFAAAAFmNsYWltZWRCeVVzZXJNaW5SZXdhcmQFAAAADW1pblJld2FyZFBhcnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAG2NsYWltZWRCeVVzZXJCb29zdFJld2FyZEtFWQkAAGQAAAACBQAAABhjbGFpbWVkQnlVc2VyQm9vc3RSZXdhcmQFAAAAD2Jvb3N0UmV3YXJkUGFydAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAPY2xhaW1lZFRvdGFsS0VZCQAAZAAAAAIFAAAADGNsYWltZWRUb3RhbAUAAAAQYXZhaWxhYmxlVG9DbGFpbQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAAt1c2VyQWRkcmVzcwUAAAAQYXZhaWxhYmxlVG9DbGFpbQUAAAAJd3hBc3NldElkCQAETAAAAAIJAQAAABVPcGVyYXRpb25IaXN0b3J5RW50cnkAAAAFAgAAAAVjbGFpbQUAAAAOdXNlckFkZHJlc3NTdHIFAAAADGxwQXNzZXRJZFN0cgUAAAAQYXZhaWxhYmxlVG9DbGFpbQgFAAAAAWkAAAANdHJhbnNhY3Rpb25JZAUAAAADbmlsCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAAA9jbGFpbVd4UkVBRE9OTFkAAAACAAAADGxwQXNzZXRJZFN0cgAAAA51c2VyQWRkcmVzc1N0cgQAAAAPc3Rha2VkQnlVc2VyS0VZCQEAAAAPa2V5U3Rha2VkQnlVc2VyAAAAAgUAAAAOdXNlckFkZHJlc3NTdHIFAAAADGxwQXNzZXRJZFN0cgQAAAAOc3Rha2VkVG90YWxLRVkJAQAAAA5rZXlTdGFrZWRUb3RhbAAAAAEFAAAADGxwQXNzZXRJZFN0cgQAAAAQY2xhaW1lZEJ5VXNlcktFWQkBAAAAEGtleUNsYWltZWRCeVVzZXIAAAACBQAAAAxscEFzc2V0SWRTdHIFAAAADnVzZXJBZGRyZXNzU3RyBAAAAAxzdGFrZWRCeVVzZXIJAQAAAApyZWFkU3Rha2VkAAAAAQUAAAAPc3Rha2VkQnlVc2VyS0VZBAAAAAtzdGFrZWRUb3RhbAkBAAAACnJlYWRTdGFrZWQAAAABBQAAAA5zdGFrZWRUb3RhbEtFWQQAAAANY2xhaW1lZEJ5VXNlcgkBAAAADGdldEludE9yWmVybwAAAAIFAAAABHRoaXMFAAAAEGNsYWltZWRCeVVzZXJLRVkEAAAADnBvb2xBZGRyZXNzU3RyCQEAAAAYZ2V0U3RyaW5nQnlBZGRyZXNzT3JGYWlsAAAAAgUAAAAPZmFjdG9yeUNvbnRyYWN0CQEAAAAma2V5RmFjdG9yeUxwQXNzZXRUb1Bvb2xDb250cmFjdEFkZHJlc3MAAAABBQAAAAxscEFzc2V0SWRTdHIEAAAADnBvb2xXZWlnaHRNdWx0BQAAAAVNVUxUOAQAAAAKcG9vbFdlaWdodAkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAPZmFjdG9yeUNvbnRyYWN0CQEAAAAUa2V5RmFjdG9yeVBvb2xXZWlnaHQAAAABBQAAAA5wb29sQWRkcmVzc1N0cgQAAAASd3hFbWlzc2lvblBlckJsb2NrCQEAAAAMZ2V0SW50T3JGYWlsAAAAAgUAAAAQZW1pc3Npb25Db250cmFjdAkBAAAAHmtleUVtaXNzaW9uUmF0ZVBlckJsb2NrQ3VycmVudAAAAAAEAAAAEmVtaXNzaW9uU3RhcnRCbG9jawkBAAAADGdldEludE9yRmFpbAAAAAIFAAAAEGVtaXNzaW9uQ29udHJhY3QJAQAAABVrZXlFbWlzc2lvblN0YXJ0QmxvY2sAAAAABAAAAAxwYXNzZWRCbG9ja3MDCQAAZgAAAAIFAAAAEmVtaXNzaW9uU3RhcnRCbG9jawUAAAAGaGVpZ2h0AAAAAAAAAAAACQAAZQAAAAIFAAAABmhlaWdodAUAAAASZW1pc3Npb25TdGFydEJsb2NrBAAAAA5wb29sV3hFbWlzc2lvbgkAAGsAAAADCQAAaAAAAAIFAAAAEnd4RW1pc3Npb25QZXJCbG9jawUAAAAMcGFzc2VkQmxvY2tzBQAAAApwb29sV2VpZ2h0BQAAAA5wb29sV2VpZ2h0TXVsdAQAAAAMdXNlcld4UmV3YXJkCQAAawAAAAMFAAAADnBvb2xXeEVtaXNzaW9uBQAAAAxzdGFrZWRCeVVzZXIFAAAAC3N0YWtlZFRvdGFsBAAAAA0kdDAxNzE0OTE3MjYxCQEAAAAQcmVmcmVzaElOVEVHUkFMUwAAAAQFAAAADGxwQXNzZXRJZFN0cgUAAAAOdXNlckFkZHJlc3NTdHIFAAAADnBvb2xBZGRyZXNzU3RyAAAAAAAAAAAABAAAABB3eFRvQ2xhaW1Vc2VyTmV3CAUAAAANJHQwMTcxNDkxNzI2MQAAAAJfMQQAAAANaW50ZWdyYWxTVEFURQgFAAAADSR0MDE3MTQ5MTcyNjEAAAACXzIEAAAABWRlYnVnCAUAAAANJHQwMTcxNDkxNzI2MQAAAAJfMwQAAAAQYXZhaWxhYmxlVG9DbGFpbQkAAGUAAAACBQAAABB3eFRvQ2xhaW1Vc2VyTmV3BQAAAA1jbGFpbWVkQnlVc2VyCQAFFAAAAAIFAAAAA25pbAkABLkAAAACCQAETAAAAAICAAAACiVzJXMlZCVkJXMJAARMAAAAAgUAAAAMbHBBc3NldElkU3RyCQAETAAAAAIFAAAADnVzZXJBZGRyZXNzU3RyCQAETAAAAAIJAAGkAAAAAQUAAAAQYXZhaWxhYmxlVG9DbGFpbQkABEwAAAACCQABpAAAAAEFAAAADWNsYWltZWRCeVVzZXIJAARMAAAAAgkAASwAAAACCQABLAAAAAIFAAAABWRlYnVnAgAAAAI6OgkAAaQAAAABBQAAAAx1c2VyV3hSZXdhcmQFAAAAA25pbAUAAAADU0VQAAAAAAY2FqY=", "chainId": 84, "height": 1806700, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 9NGPmTFPthwHCjkDLXRhAyKqpmViiFms6PbshsNu1T7h Next: EHwhHZaoDUxCLSFHKydZB2sVcaj3RGZxVKQSpu7wwtPp Diff:
OldNewDifferences
1818 valAnyLyst
1919 case _ =>
2020 throw("fail to cast into List[Any]")
21+}
22+
23+
24+func asInt (val) = match val {
25+ case valInt: Int =>
26+ valInt
27+ case _ =>
28+ throw("fail to cast into Int")
2129 }
2230
2331
4250
4351
4452 func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), (("mandatory this." + key) + " is not defined"))
53+
54+
55+func toX18 (origVal,origScaleMult) = fraction(toBigInt(origVal), MULT18, toBigInt(origScaleMult))
56+
57+
58+func fromX18 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), MULT18))
4559
4660
4761 func keyFactoryAddress () = "%s%s__config__factoryAddress"
115129 func keyStakedTotal (lpAssetIdStr) = ("%s%s%s__staked__total__" + lpAssetIdStr)
116130
117131
118-func keyClaimedByUser (userAddressStr,lpAssetIdStr) = makeString(["%s%s%s__claimed", userAddressStr, lpAssetIdStr], SEP)
132+func keyClaimedByUser (lpAssetIdStr,userAddressStr) = makeString(["%s%s%s__claimed", userAddressStr, lpAssetIdStr], SEP)
133+
134+
135+func keyClaimedByUserMinReward (lpAssetIdStr,userAddressStr) = makeString(["%s%s%s__claimedMinReward", userAddressStr, lpAssetIdStr], SEP)
136+
137+
138+func keyClaimedByUserBoostReward (lpAssetIdStr,userAddressStr) = makeString(["%s%s%s__claimedBoostReward", userAddressStr, lpAssetIdStr], SEP)
119139
120140
121141 func keyClaimedTotal (lpAssetIdStr) = makeString(["%s%s%s__claimed", "total", lpAssetIdStr], SEP)
157177 func keyWxPerLp (lpAssetId) = makeString(["%s", lpAssetId, "wxPerLp"], SEP)
158178
159179
180+func keyWxPerLpX18 (lpAssetId) = makeString(["%s", lpAssetId, "wxPerLpX18"], SEP)
181+
182+
160183 func keyWxPerLpIntegralUserLast (lpAssetId,userAddress) = makeString(["%s%s%s%s", lpAssetId, userAddress, "uIntL"], SEP)
161184
162185
174197 let factoryCfg = readFactoryCfgOrFail(factoryContract)
175198
176199 let emissionContract = getEmissionAddressOrFail(factoryCfg)
200+
201+let boostingContract = getBoostingAddressOrFail(factoryCfg)
177202
178203 func calcWxPerLpIntegralUserLast (stakedByUser,wxPerLpIntegralUserLastUpdHeightOrZero,wxPerLpIntegralNew,wxPerLpIntegralUserLastKEY) = if (if ((wxPerLpIntegralUserLastUpdHeightOrZero == 0))
179204 then (stakedByUser > 0)
196221 let poolWeight = getIntegerValue(factoryContract, keyFactoryPoolWeight(poolAddressStr))
197222 let emissionStartBlock = getIntOrFail(emissionContract, keyEmissionStartBlock())
198223 let wxEmissionPerBlock = getIntOrFail(emissionContract, keyEmissionRatePerBlockCurrent())
199- let poolWxEmissionPerBlock = fraction(wxEmissionPerBlock, poolWeight, POOLWEIGHTMULT)
224+ let poolWxEmissionPerBlock = fraction(wxEmissionPerBlock, poolWeight, (POOLWEIGHTMULT * 3))
200225 let wxPerLpIntegralKEY = keyWxPerLpIntegral(lpAssetIdStr)
201226 let wxPerLpIntegralLastUpdHeightKEY = keyWxPerLpIntegralLastUpdHeight(lpAssetIdStr)
202227 let wxToClaimUserKEY = keyWxToClaimUser(lpAssetIdStr, userAddressStr)
207232 let wxPerLpIntegral = getIntOrZero(this, wxPerLpIntegralKEY)
208233 let wxToClaimUser = getIntOrZero(this, wxToClaimUserKEY)
209234 let wxPerLpIntegralUserLastUpdHeightOrZero = getIntOrZero(this, wxPerLpIntegralUserLastUpdHeightKEY)
210- let wxPerLpOrZero = getIntOrZero(this, wxPerLpKEY)
235+ let wxPerLpOrZeroX8 = getIntOrZero(this, wxPerLpKEY)
211236 let dh = max([(height - wxPerLpIntegralLastUpdHeight), 0])
212- let wxPerLp = if ((wxPerLpOrZero != 0))
213- then wxPerLpOrZero
237+ let wxPerLpX8 = if ((wxPerLpOrZeroX8 != 0))
238+ then wxPerLpOrZeroX8
214239 else fraction(poolWxEmissionPerBlock, MULT8, stakedTotal)
215240 let stakedTotalNew = (stakedTotal + lpDeltaAmount)
216- let wxPerLpIntegralNew = (wxPerLpIntegral + (wxPerLp * dh))
241+ let wxPerLpIntegralNew = (wxPerLpIntegral + (wxPerLpX8 * dh))
217242 let wxPerLpIntegralUserLast = calcWxPerLpIntegralUserLast(stakedByUser, wxPerLpIntegralUserLastUpdHeightOrZero, wxPerLpIntegralNew, wxPerLpIntegralUserLastKEY)
218243 let wxToClaimUserNew = (wxToClaimUser + fraction((wxPerLpIntegralNew - wxPerLpIntegralUserLast), stakedByUser, MULT8))
219244 let wxPerLpIntegralUserLastNew = wxPerLpIntegralNew
220- let wxPerLpNew = (poolWxEmissionPerBlock / stakedTotalNew)
245+ let wxPerLpNewX8 = (poolWxEmissionPerBlock / stakedTotalNew)
221246 let wxPerLpIntegralLastUpdHeightNew = height
222247 let wxPerLpIntegralUserLastUpdHeightNew = height
223- let debug = makeString([toString(wxToClaimUserNew), toString(wxPerLpIntegralNew), toString(wxPerLpIntegralUserLast), toString(stakedByUser), toString(dh), toString(wxPerLp), toString(stakedTotal), toString(poolWxEmissionPerBlock), toString(wxEmissionPerBlock), toString(poolWeight), toString(height)], "::")
224- $Tuple3(wxToClaimUserNew, [IntegerEntry(wxPerLpIntegralKEY, wxPerLpIntegralNew), IntegerEntry(wxPerLpIntegralLastUpdHeightKEY, wxPerLpIntegralLastUpdHeightNew), IntegerEntry(wxToClaimUserKEY, wxToClaimUserNew), IntegerEntry(wxPerLpIntegralUserLastUpdHeightKEY, wxPerLpIntegralUserLastUpdHeightNew), IntegerEntry(wxPerLpKEY, wxPerLpNew), IntegerEntry(wxPerLpIntegralUserLastKEY, wxPerLpIntegralUserLastNew)], debug)
248+ let debug = makeString([toString(wxToClaimUserNew), toString(wxPerLpIntegralNew), toString(wxPerLpIntegralUserLast), toString(stakedByUser), toString(dh), toString(wxPerLpX8), toString(stakedTotal), toString(poolWxEmissionPerBlock), toString(wxEmissionPerBlock), toString(poolWeight), toString(height)], "::")
249+ $Tuple3(wxToClaimUserNew, [IntegerEntry(wxPerLpIntegralKEY, wxPerLpIntegralNew), IntegerEntry(wxPerLpIntegralLastUpdHeightKEY, wxPerLpIntegralLastUpdHeightNew), IntegerEntry(wxToClaimUserKEY, wxToClaimUserNew), IntegerEntry(wxPerLpIntegralUserLastUpdHeightKEY, wxPerLpIntegralUserLastUpdHeightNew), IntegerEntry(wxPerLpKEY, wxPerLpNewX8), IntegerEntry(wxPerLpIntegralUserLastKEY, wxPerLpIntegralUserLastNew)], debug)
225250 }
226251
227252
249274 let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
250275 let stakedByUser = readStaked(stakedByUserKEY)
251276 let stakedTotal = readStaked(stakedTotalKEY)
252- let $t01155411671 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, amount)
253- let wxToClaimUserNew = $t01155411671._1
254- let integralSTATE = $t01155411671._2
255- let debug = $t01155411671._3
277+ let $t01242712544 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, amount)
278+ let wxToClaimUserNew = $t01242712544._1
279+ let integralSTATE = $t01242712544._2
280+ let debug = $t01242712544._3
256281 ([IntegerEntry(stakedByUserKEY, (stakedByUser + amount)), IntegerEntry(stakedTotalKEY, (stakedTotal + amount)), OperationHistoryEntry("stake", userAddressStr, lpAssetIdStr, amount, i.transactionId)] ++ integralSTATE)
257282 }
258283
267292 let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
268293 let stakedByUser = readStaked(stakedByUserKEY)
269294 let stakedTotal = readStaked(stakedTotalKEY)
270- let $t01248812606 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, -(amount))
271- let wxToClaimUserNew = $t01248812606._1
272- let integralSTATE = $t01248812606._2
273- let debug = $t01248812606._3
295+ let $t01336113479 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, -(amount))
296+ let wxToClaimUserNew = $t01336113479._1
297+ let integralSTATE = $t01336113479._2
298+ let debug = $t01336113479._3
274299 if ((amount > stakedByUser))
275300 then throw("passed amount is less then available")
276301 else ([IntegerEntry(stakedByUserKEY, (stakedByUser - amount)), IntegerEntry(stakedTotalKEY, (stakedTotal - amount)), ScriptTransfer(i.caller, amount, lpAssetId), OperationHistoryEntry("unstake", userAddressStr, lpAssetIdStr, amount, i.transactionId)] ++ integralSTATE)
285310 let poolAddressStr = getStringByAddressOrFail(factoryContract, keyFactoryLpAssetToPoolContractAddress(lpAssetIdStr))
286311 let claimedByUserKEY = keyClaimedByUser(lpAssetIdStr, userAddressStr)
287312 let claimedTotalKEY = keyClaimedTotal(lpAssetIdStr)
313+ let claimedByUserMinRewardKEY = keyClaimedByUserMinReward(lpAssetIdStr, userAddressStr)
314+ let claimedByUserBoostRewardKEY = keyClaimedByUserBoostReward(lpAssetIdStr, userAddressStr)
288315 let claimedByUser = getIntOrZero(this, claimedByUserKEY)
316+ let claimedByUserMinReward = getIntOrZero(this, claimedByUserMinRewardKEY)
317+ let claimedByUserBoostReward = getIntOrZero(this, claimedByUserBoostRewardKEY)
289318 let claimedTotal = getIntOrZero(this, claimedTotalKEY)
290- let $t01345813570 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
291- let wxToClaimUserNew = $t01345813570._1
292- let integralSTATE = $t01345813570._2
293- let debug = $t01345813570._3
319+ let $t01467114783 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
320+ let wxToClaimUserNew = $t01467114783._1
321+ let integralSTATE = $t01467114783._2
322+ let debug = $t01467114783._3
294323 let availableToClaim = (wxToClaimUserNew - claimedByUser)
295324 if ((0 >= availableToClaim))
296325 then throw("nothing to claim")
297326 else {
298- let wxAssetId = asByteVector(asAnyList(invoke(emissionContract, "emit", [availableToClaim], nil))[0])
299-[IntegerEntry(claimedByUserKEY, (claimedByUser + availableToClaim)), IntegerEntry(claimedTotalKEY, (claimedTotal + availableToClaim)), ScriptTransfer(userAddress, availableToClaim, wxAssetId), OperationHistoryEntry("claim", userAddressStr, lpAssetIdStr, availableToClaim, i.transactionId)]
327+ let wxAmountBoostTotal = asInt(asAnyList(invoke(boostingContract, "claimWxBoost", [userAddressStr], nil))[0])
328+ let poolWeight = getIntegerValue(factoryContract, keyFactoryPoolWeight(poolAddressStr))
329+ let boostRewardPartTMP = fraction(wxAmountBoostTotal, poolWeight, POOLWEIGHTMULT)
330+ let minRewardPart = availableToClaim
331+ let boostRewardPart = min([(minRewardPart * 3), boostRewardPartTMP])
332+ let wxAssetId = asByteVector(asAnyList(invoke(emissionContract, "emit", [minRewardPart], nil))[0])
333+ let emitBoost = asAnyList(invoke(emissionContract, "emit", [boostRewardPart], nil))
334+ if ((emitBoost == emitBoost))
335+ then [IntegerEntry(claimedByUserKEY, (claimedByUser + availableToClaim)), IntegerEntry(claimedByUserMinRewardKEY, (claimedByUserMinReward + minRewardPart)), IntegerEntry(claimedByUserBoostRewardKEY, (claimedByUserBoostReward + boostRewardPart)), IntegerEntry(claimedTotalKEY, (claimedTotal + availableToClaim)), ScriptTransfer(userAddress, availableToClaim, wxAssetId), OperationHistoryEntry("claim", userAddressStr, lpAssetIdStr, availableToClaim, i.transactionId)]
336+ else throw("Strict value is not equal to itself.")
300337 }
301338 }
302339
320357 else (height - emissionStartBlock)
321358 let poolWxEmission = fraction((wxEmissionPerBlock * passedBlocks), poolWeight, poolWeightMult)
322359 let userWxReward = fraction(poolWxEmission, stakedByUser, stakedTotal)
323- let $t01523915351 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
324- let wxToClaimUserNew = $t01523915351._1
325- let integralSTATE = $t01523915351._2
326- let debug = $t01523915351._3
360+ let $t01714917261 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
361+ let wxToClaimUserNew = $t01714917261._1
362+ let integralSTATE = $t01714917261._2
363+ let debug = $t01714917261._3
327364 let availableToClaim = (wxToClaimUserNew - claimedByUser)
328365 $Tuple2(nil, makeString(["%s%s%d%d%s", lpAssetIdStr, userAddressStr, toString(availableToClaim), toString(claimedByUser), ((debug + "::") + toString(userWxReward))], SEP))
329366 }
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]")
21+}
22+
23+
24+func asInt (val) = match val {
25+ case valInt: Int =>
26+ valInt
27+ case _ =>
28+ throw("fail to cast into Int")
2129 }
2230
2331
2432 func asByteVector (val) = match val {
2533 case valBin: ByteVector =>
2634 valBin
2735 case _ =>
2836 throw("fail to cast into Int")
2937 }
3038
3139
3240 func getStringOrFail (key) = valueOrErrorMessage(getString(key), (("mandatory this." + key) + " is not defined"))
3341
3442
3543 func getStringByAddressOrFail (address,key) = valueOrErrorMessage(getString(address, key), (((("mandatory " + toString(address)) + ".") + key) + " is not defined"))
3644
3745
3846 func getIntOrZero (address,key) = valueOrElse(getInteger(address, key), 0)
3947
4048
4149 func getIntOrDefault (address,key,defaultVal) = valueOrElse(getInteger(address, key), defaultVal)
4250
4351
4452 func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), (("mandatory this." + key) + " is not defined"))
53+
54+
55+func toX18 (origVal,origScaleMult) = fraction(toBigInt(origVal), MULT18, toBigInt(origScaleMult))
56+
57+
58+func fromX18 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), MULT18))
4559
4660
4761 func keyFactoryAddress () = "%s%s__config__factoryAddress"
4862
4963
5064 let IdxFactoryCfgStakingDapp = 1
5165
5266 let IdxFactoryCfgBoostingDapp = 2
5367
5468 let IdxFactoryCfgIdoDapp = 3
5569
5670 let IdxFactoryCfgTeamDapp = 4
5771
5872 let IdxFactoryCfgEmissionDapp = 5
5973
6074 let IdxFactoryCfgRestDapp = 6
6175
6276 let IdxFactoryCfgSlippageDapp = 7
6377
6478 func keyFactoryCfg () = "%s__factoryConfig"
6579
6680
6781 func keyFactoryLp2AssetsMapping (lpAssetStr) = makeString(["%s%s%s", lpAssetStr, "mappings__lpAsset2PoolContract"], SEP)
6882
6983
7084 func keyFactoryLpList () = "%s__lpTokensList"
7185
7286
7387 func keyFactoryLpAssetToPoolContractAddress (lpAssetStr) = makeString(["%s%s%s", lpAssetStr, "mappings__lpAsset2PoolContract"], SEP)
7488
7589
7690 func keyFactoryPoolWeight (contractAddress) = makeString(["%s%s", "poolWeight", contractAddress], SEP)
7791
7892
7993 func readFactoryAddressOrFail () = addressFromStringValue(getStringOrFail(keyFactoryAddress()))
8094
8195
8296 func readLpList () = split(valueOrElse(getString(readFactoryAddressOrFail(), keyFactoryLpList()), ""), SEP)
8397
8498
8599 func readFactoryCfgOrFail (factory) = split(getStringByAddressOrFail(factory, keyFactoryCfg()), SEP)
86100
87101
88102 func getBoostingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgBoostingDapp])
89103
90104
91105 func getEmissionAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgEmissionDapp])
92106
93107
94108 func getStakingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgStakingDapp])
95109
96110
97111 func keyEmissionRatePerBlockCurrent () = "%s%s__ratePerBlock__current"
98112
99113
100114 func keyEmissionRatePerBlockMaxCurrent () = "%s%s__ratePerBlockMax__current"
101115
102116
103117 func keyEmissionStartBlock () = "%s%s__emission__startBlock"
104118
105119
106120 func keyEmissionDurationInBlocks () = "%s%s__emission__duration"
107121
108122
109123 func keyEmissionEndBlock () = "%s%s__emission__endBlock"
110124
111125
112126 func keyStakedByUser (userAddressStr,lpAssetIdStr) = makeString(["%s%s%s__staked", userAddressStr, lpAssetIdStr], SEP)
113127
114128
115129 func keyStakedTotal (lpAssetIdStr) = ("%s%s%s__staked__total__" + lpAssetIdStr)
116130
117131
118-func keyClaimedByUser (userAddressStr,lpAssetIdStr) = makeString(["%s%s%s__claimed", userAddressStr, lpAssetIdStr], SEP)
132+func keyClaimedByUser (lpAssetIdStr,userAddressStr) = makeString(["%s%s%s__claimed", userAddressStr, lpAssetIdStr], SEP)
133+
134+
135+func keyClaimedByUserMinReward (lpAssetIdStr,userAddressStr) = makeString(["%s%s%s__claimedMinReward", userAddressStr, lpAssetIdStr], SEP)
136+
137+
138+func keyClaimedByUserBoostReward (lpAssetIdStr,userAddressStr) = makeString(["%s%s%s__claimedBoostReward", userAddressStr, lpAssetIdStr], SEP)
119139
120140
121141 func keyClaimedTotal (lpAssetIdStr) = makeString(["%s%s%s__claimed", "total", lpAssetIdStr], SEP)
122142
123143
124144 func readStaked (key) = valueOrElse(getInteger(this, key), 0)
125145
126146
127147 func keyLastTotalLpBalance (lpAssetId) = makeString(["%s%s%s", lpAssetId, "total", "bal"], SEP)
128148
129149
130150 func keyLastUserLpBalance (lpAssetId,userAddress) = makeString(["%s%s%s", lpAssetId, userAddress, "bal"], SEP)
131151
132152
133153 func keyTotalLpBalanceIntegral (lpAssetId) = makeString(["%s%s%s", lpAssetId, "total", "balINT"], SEP)
134154
135155
136156 func keyUserLpBalanceIntegral (lpAssetId,userAddress) = makeString(["%s%s%s", lpAssetId, userAddress, "balINT"], SEP)
137157
138158
139159 func keyTotalLpBalanceIntegralLastUpdHeight (lpAssetId) = makeString(["%s%s%s", lpAssetId, "total", "lastUpd"], SEP)
140160
141161
142162 func keyUserLpBalanceIntegralLastUpdHeight (lpAssetId,userAddress) = makeString(["%s%s%s", lpAssetId, userAddress, "lastUpd"], SEP)
143163
144164
145165 func keyWxPerLpIntegral (lpAssetId) = makeString(["%s%s%s%s", lpAssetId, "common", "lpInt"], SEP)
146166
147167
148168 func keyWxPerLpIntegralLastUpdHeight (lpAssetId) = makeString(["%s%s%s%s", lpAssetId, "common", "lpIntH"], SEP)
149169
150170
151171 func keyWxToClaimUser (lpAssetId,userAddress) = makeString(["%s%s%s%s", lpAssetId, userAddress, "lpInt"], SEP)
152172
153173
154174 func keyWxPerLpIntegralUserLastUpdHeight (lpAssetId,userAddress) = makeString(["%s%s%s%s", lpAssetId, userAddress, "lpIntH"], SEP)
155175
156176
157177 func keyWxPerLp (lpAssetId) = makeString(["%s", lpAssetId, "wxPerLp"], SEP)
158178
159179
180+func keyWxPerLpX18 (lpAssetId) = makeString(["%s", lpAssetId, "wxPerLpX18"], SEP)
181+
182+
160183 func keyWxPerLpIntegralUserLast (lpAssetId,userAddress) = makeString(["%s%s%s%s", lpAssetId, userAddress, "uIntL"], SEP)
161184
162185
163186 func keyOperationHistoryRecord (type,userAddress,txId58) = makeString(["%s%s%s%s__history", type, userAddress, txId58], SEP)
164187
165188
166189 func formatHistoryRecord (userAddress,lpAssetId,type,amount) = makeString(["%s%s%s%d%d%d", userAddress, lpAssetId, type, toString(height), toString(lastBlock.timestamp), toString(amount)], SEP)
167190
168191
169192 func OperationHistoryEntry (type,userAddress,lpAssetId,amount,txId) = StringEntry(keyOperationHistoryRecord(type, userAddress, toBase58String(txId)), formatHistoryRecord(userAddress, lpAssetId, type, amount))
170193
171194
172195 let factoryContract = readFactoryAddressOrFail()
173196
174197 let factoryCfg = readFactoryCfgOrFail(factoryContract)
175198
176199 let emissionContract = getEmissionAddressOrFail(factoryCfg)
200+
201+let boostingContract = getBoostingAddressOrFail(factoryCfg)
177202
178203 func calcWxPerLpIntegralUserLast (stakedByUser,wxPerLpIntegralUserLastUpdHeightOrZero,wxPerLpIntegralNew,wxPerLpIntegralUserLastKEY) = if (if ((wxPerLpIntegralUserLastUpdHeightOrZero == 0))
179204 then (stakedByUser > 0)
180205 else false)
181206 then 0
182207 else if ((stakedByUser == 0))
183208 then wxPerLpIntegralNew
184209 else if (if ((wxPerLpIntegralUserLastUpdHeightOrZero > 0))
185210 then (stakedByUser > 0)
186211 else false)
187212 then getIntOrFail(this, wxPerLpIntegralUserLastKEY)
188213 else throw("calcWxPerLpIntegralUserLast: unexpected state")
189214
190215
191216 func refreshINTEGRALS (lpAssetIdStr,userAddressStr,poolAddressStr,lpDeltaAmount) = {
192217 let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
193218 let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
194219 let stakedByUser = readStaked(stakedByUserKEY)
195220 let stakedTotal = readStaked(stakedTotalKEY)
196221 let poolWeight = getIntegerValue(factoryContract, keyFactoryPoolWeight(poolAddressStr))
197222 let emissionStartBlock = getIntOrFail(emissionContract, keyEmissionStartBlock())
198223 let wxEmissionPerBlock = getIntOrFail(emissionContract, keyEmissionRatePerBlockCurrent())
199- let poolWxEmissionPerBlock = fraction(wxEmissionPerBlock, poolWeight, POOLWEIGHTMULT)
224+ let poolWxEmissionPerBlock = fraction(wxEmissionPerBlock, poolWeight, (POOLWEIGHTMULT * 3))
200225 let wxPerLpIntegralKEY = keyWxPerLpIntegral(lpAssetIdStr)
201226 let wxPerLpIntegralLastUpdHeightKEY = keyWxPerLpIntegralLastUpdHeight(lpAssetIdStr)
202227 let wxToClaimUserKEY = keyWxToClaimUser(lpAssetIdStr, userAddressStr)
203228 let wxPerLpIntegralUserLastUpdHeightKEY = keyWxPerLpIntegralUserLastUpdHeight(lpAssetIdStr, userAddressStr)
204229 let wxPerLpKEY = keyWxPerLp(lpAssetIdStr)
205230 let wxPerLpIntegralUserLastKEY = keyWxPerLpIntegralUserLast(lpAssetIdStr, userAddressStr)
206231 let wxPerLpIntegralLastUpdHeight = getIntOrDefault(this, wxPerLpIntegralLastUpdHeightKEY, emissionStartBlock)
207232 let wxPerLpIntegral = getIntOrZero(this, wxPerLpIntegralKEY)
208233 let wxToClaimUser = getIntOrZero(this, wxToClaimUserKEY)
209234 let wxPerLpIntegralUserLastUpdHeightOrZero = getIntOrZero(this, wxPerLpIntegralUserLastUpdHeightKEY)
210- let wxPerLpOrZero = getIntOrZero(this, wxPerLpKEY)
235+ let wxPerLpOrZeroX8 = getIntOrZero(this, wxPerLpKEY)
211236 let dh = max([(height - wxPerLpIntegralLastUpdHeight), 0])
212- let wxPerLp = if ((wxPerLpOrZero != 0))
213- then wxPerLpOrZero
237+ let wxPerLpX8 = if ((wxPerLpOrZeroX8 != 0))
238+ then wxPerLpOrZeroX8
214239 else fraction(poolWxEmissionPerBlock, MULT8, stakedTotal)
215240 let stakedTotalNew = (stakedTotal + lpDeltaAmount)
216- let wxPerLpIntegralNew = (wxPerLpIntegral + (wxPerLp * dh))
241+ let wxPerLpIntegralNew = (wxPerLpIntegral + (wxPerLpX8 * dh))
217242 let wxPerLpIntegralUserLast = calcWxPerLpIntegralUserLast(stakedByUser, wxPerLpIntegralUserLastUpdHeightOrZero, wxPerLpIntegralNew, wxPerLpIntegralUserLastKEY)
218243 let wxToClaimUserNew = (wxToClaimUser + fraction((wxPerLpIntegralNew - wxPerLpIntegralUserLast), stakedByUser, MULT8))
219244 let wxPerLpIntegralUserLastNew = wxPerLpIntegralNew
220- let wxPerLpNew = (poolWxEmissionPerBlock / stakedTotalNew)
245+ let wxPerLpNewX8 = (poolWxEmissionPerBlock / stakedTotalNew)
221246 let wxPerLpIntegralLastUpdHeightNew = height
222247 let wxPerLpIntegralUserLastUpdHeightNew = height
223- let debug = makeString([toString(wxToClaimUserNew), toString(wxPerLpIntegralNew), toString(wxPerLpIntegralUserLast), toString(stakedByUser), toString(dh), toString(wxPerLp), toString(stakedTotal), toString(poolWxEmissionPerBlock), toString(wxEmissionPerBlock), toString(poolWeight), toString(height)], "::")
224- $Tuple3(wxToClaimUserNew, [IntegerEntry(wxPerLpIntegralKEY, wxPerLpIntegralNew), IntegerEntry(wxPerLpIntegralLastUpdHeightKEY, wxPerLpIntegralLastUpdHeightNew), IntegerEntry(wxToClaimUserKEY, wxToClaimUserNew), IntegerEntry(wxPerLpIntegralUserLastUpdHeightKEY, wxPerLpIntegralUserLastUpdHeightNew), IntegerEntry(wxPerLpKEY, wxPerLpNew), IntegerEntry(wxPerLpIntegralUserLastKEY, wxPerLpIntegralUserLastNew)], debug)
248+ let debug = makeString([toString(wxToClaimUserNew), toString(wxPerLpIntegralNew), toString(wxPerLpIntegralUserLast), toString(stakedByUser), toString(dh), toString(wxPerLpX8), toString(stakedTotal), toString(poolWxEmissionPerBlock), toString(wxEmissionPerBlock), toString(poolWeight), toString(height)], "::")
249+ $Tuple3(wxToClaimUserNew, [IntegerEntry(wxPerLpIntegralKEY, wxPerLpIntegralNew), IntegerEntry(wxPerLpIntegralLastUpdHeightKEY, wxPerLpIntegralLastUpdHeightNew), IntegerEntry(wxToClaimUserKEY, wxToClaimUserNew), IntegerEntry(wxPerLpIntegralUserLastUpdHeightKEY, wxPerLpIntegralUserLastUpdHeightNew), IntegerEntry(wxPerLpKEY, wxPerLpNewX8), IntegerEntry(wxPerLpIntegralUserLastKEY, wxPerLpIntegralUserLastNew)], debug)
225250 }
226251
227252
228253 @Callable(i)
229254 func constructor (factoryAddressStr) = if ((i.caller != this))
230255 then throw("not authorized")
231256 else [StringEntry(keyFactoryAddress(), factoryAddressStr)]
232257
233258
234259
235260 @Callable(i)
236261 func stake () = if ((size(i.payments) != 1))
237262 then throw("invalid payment - exact one payment must be attached")
238263 else {
239264 let pmt = i.payments[0]
240265 let lpAssetId = value(pmt.assetId)
241266 let lpAssetIdStr = toBase58String(lpAssetId)
242267 let amount = pmt.amount
243268 let poolAddressStr = valueOrErrorMessage(getString(factoryContract, keyFactoryLp2AssetsMapping(lpAssetIdStr)), ("unsupported lp asset " + lpAssetIdStr))
244269 let callerStr = toString(i.caller)
245270 let userAddressStr = if ((callerStr == poolAddressStr))
246271 then toString(i.originCaller)
247272 else callerStr
248273 let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
249274 let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
250275 let stakedByUser = readStaked(stakedByUserKEY)
251276 let stakedTotal = readStaked(stakedTotalKEY)
252- let $t01155411671 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, amount)
253- let wxToClaimUserNew = $t01155411671._1
254- let integralSTATE = $t01155411671._2
255- let debug = $t01155411671._3
277+ let $t01242712544 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, amount)
278+ let wxToClaimUserNew = $t01242712544._1
279+ let integralSTATE = $t01242712544._2
280+ let debug = $t01242712544._3
256281 ([IntegerEntry(stakedByUserKEY, (stakedByUser + amount)), IntegerEntry(stakedTotalKEY, (stakedTotal + amount)), OperationHistoryEntry("stake", userAddressStr, lpAssetIdStr, amount, i.transactionId)] ++ integralSTATE)
257282 }
258283
259284
260285
261286 @Callable(i)
262287 func unstake (lpAssetIdStr,amount) = {
263288 let userAddressStr = toString(i.caller)
264289 let lpAssetId = fromBase58String(lpAssetIdStr)
265290 let poolAddressStr = valueOrErrorMessage(getString(factoryContract, keyFactoryLp2AssetsMapping(lpAssetIdStr)), ("unsupported lp asset " + lpAssetIdStr))
266291 let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
267292 let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
268293 let stakedByUser = readStaked(stakedByUserKEY)
269294 let stakedTotal = readStaked(stakedTotalKEY)
270- let $t01248812606 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, -(amount))
271- let wxToClaimUserNew = $t01248812606._1
272- let integralSTATE = $t01248812606._2
273- let debug = $t01248812606._3
295+ let $t01336113479 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, -(amount))
296+ let wxToClaimUserNew = $t01336113479._1
297+ let integralSTATE = $t01336113479._2
298+ let debug = $t01336113479._3
274299 if ((amount > stakedByUser))
275300 then throw("passed amount is less then available")
276301 else ([IntegerEntry(stakedByUserKEY, (stakedByUser - amount)), IntegerEntry(stakedTotalKEY, (stakedTotal - amount)), ScriptTransfer(i.caller, amount, lpAssetId), OperationHistoryEntry("unstake", userAddressStr, lpAssetIdStr, amount, i.transactionId)] ++ integralSTATE)
277302 }
278303
279304
280305
281306 @Callable(i)
282307 func claimWx (lpAssetIdStr) = {
283308 let userAddress = i.caller
284309 let userAddressStr = toString(i.caller)
285310 let poolAddressStr = getStringByAddressOrFail(factoryContract, keyFactoryLpAssetToPoolContractAddress(lpAssetIdStr))
286311 let claimedByUserKEY = keyClaimedByUser(lpAssetIdStr, userAddressStr)
287312 let claimedTotalKEY = keyClaimedTotal(lpAssetIdStr)
313+ let claimedByUserMinRewardKEY = keyClaimedByUserMinReward(lpAssetIdStr, userAddressStr)
314+ let claimedByUserBoostRewardKEY = keyClaimedByUserBoostReward(lpAssetIdStr, userAddressStr)
288315 let claimedByUser = getIntOrZero(this, claimedByUserKEY)
316+ let claimedByUserMinReward = getIntOrZero(this, claimedByUserMinRewardKEY)
317+ let claimedByUserBoostReward = getIntOrZero(this, claimedByUserBoostRewardKEY)
289318 let claimedTotal = getIntOrZero(this, claimedTotalKEY)
290- let $t01345813570 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
291- let wxToClaimUserNew = $t01345813570._1
292- let integralSTATE = $t01345813570._2
293- let debug = $t01345813570._3
319+ let $t01467114783 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
320+ let wxToClaimUserNew = $t01467114783._1
321+ let integralSTATE = $t01467114783._2
322+ let debug = $t01467114783._3
294323 let availableToClaim = (wxToClaimUserNew - claimedByUser)
295324 if ((0 >= availableToClaim))
296325 then throw("nothing to claim")
297326 else {
298- let wxAssetId = asByteVector(asAnyList(invoke(emissionContract, "emit", [availableToClaim], nil))[0])
299-[IntegerEntry(claimedByUserKEY, (claimedByUser + availableToClaim)), IntegerEntry(claimedTotalKEY, (claimedTotal + availableToClaim)), ScriptTransfer(userAddress, availableToClaim, wxAssetId), OperationHistoryEntry("claim", userAddressStr, lpAssetIdStr, availableToClaim, i.transactionId)]
327+ let wxAmountBoostTotal = asInt(asAnyList(invoke(boostingContract, "claimWxBoost", [userAddressStr], nil))[0])
328+ let poolWeight = getIntegerValue(factoryContract, keyFactoryPoolWeight(poolAddressStr))
329+ let boostRewardPartTMP = fraction(wxAmountBoostTotal, poolWeight, POOLWEIGHTMULT)
330+ let minRewardPart = availableToClaim
331+ let boostRewardPart = min([(minRewardPart * 3), boostRewardPartTMP])
332+ let wxAssetId = asByteVector(asAnyList(invoke(emissionContract, "emit", [minRewardPart], nil))[0])
333+ let emitBoost = asAnyList(invoke(emissionContract, "emit", [boostRewardPart], nil))
334+ if ((emitBoost == emitBoost))
335+ then [IntegerEntry(claimedByUserKEY, (claimedByUser + availableToClaim)), IntegerEntry(claimedByUserMinRewardKEY, (claimedByUserMinReward + minRewardPart)), IntegerEntry(claimedByUserBoostRewardKEY, (claimedByUserBoostReward + boostRewardPart)), IntegerEntry(claimedTotalKEY, (claimedTotal + availableToClaim)), ScriptTransfer(userAddress, availableToClaim, wxAssetId), OperationHistoryEntry("claim", userAddressStr, lpAssetIdStr, availableToClaim, i.transactionId)]
336+ else throw("Strict value is not equal to itself.")
300337 }
301338 }
302339
303340
304341
305342 @Callable(i)
306343 func claimWxREADONLY (lpAssetIdStr,userAddressStr) = {
307344 let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
308345 let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
309346 let claimedByUserKEY = keyClaimedByUser(lpAssetIdStr, userAddressStr)
310347 let stakedByUser = readStaked(stakedByUserKEY)
311348 let stakedTotal = readStaked(stakedTotalKEY)
312349 let claimedByUser = getIntOrZero(this, claimedByUserKEY)
313350 let poolAddressStr = getStringByAddressOrFail(factoryContract, keyFactoryLpAssetToPoolContractAddress(lpAssetIdStr))
314351 let poolWeightMult = MULT8
315352 let poolWeight = getIntegerValue(factoryContract, keyFactoryPoolWeight(poolAddressStr))
316353 let wxEmissionPerBlock = getIntOrFail(emissionContract, keyEmissionRatePerBlockCurrent())
317354 let emissionStartBlock = getIntOrFail(emissionContract, keyEmissionStartBlock())
318355 let passedBlocks = if ((emissionStartBlock > height))
319356 then 0
320357 else (height - emissionStartBlock)
321358 let poolWxEmission = fraction((wxEmissionPerBlock * passedBlocks), poolWeight, poolWeightMult)
322359 let userWxReward = fraction(poolWxEmission, stakedByUser, stakedTotal)
323- let $t01523915351 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
324- let wxToClaimUserNew = $t01523915351._1
325- let integralSTATE = $t01523915351._2
326- let debug = $t01523915351._3
360+ let $t01714917261 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
361+ let wxToClaimUserNew = $t01714917261._1
362+ let integralSTATE = $t01714917261._2
363+ let debug = $t01714917261._3
327364 let availableToClaim = (wxToClaimUserNew - claimedByUser)
328365 $Tuple2(nil, makeString(["%s%s%d%d%s", lpAssetIdStr, userAddressStr, toString(availableToClaim), toString(claimedByUser), ((debug + "::") + toString(userWxReward))], SEP))
329366 }
330367
331368

github/deemru/w8io/873ac7e 
176.48 ms