tx · EHwhHZaoDUxCLSFHKydZB2sVcaj3RGZxVKQSpu7wwtPp

3NBFNzUQ8Y7FC2gkuLSr6yRrTLydGn1vcJw:  -0.01000000 Waves

2021.11.25 17:46 [1806705] smart account 3NBFNzUQ8Y7FC2gkuLSr6yRrTLydGn1vcJw > SELF 0.00000000 Waves

{ "type": 13, "id": "EHwhHZaoDUxCLSFHKydZB2sVcaj3RGZxVKQSpu7wwtPp", "fee": 1000000, "feeAssetId": null, "timestamp": 1637851596631, "version": 1, "sender": "3NBFNzUQ8Y7FC2gkuLSr6yRrTLydGn1vcJw", "senderPublicKey": "2h5WUYrDouLj41YkFTC8akD2W7ryFwpyqMMAKcn8KVsA", "proofs": [ "56V3tZBkC4GnHSm5mDX4RHADiipwyk9X4soiSGB1BPm21yNuPB1j77nKeMqLwzqASvWFs1zADbv7L3xX2Jq2SuRJ" ], "script": "base64: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AAAAAAAABQAAAAAVSWR4RmFjdG9yeUNmZ1Jlc3REYXBwAAAAAAAAAAAGAAAAABlJZHhGYWN0b3J5Q2ZnU2xpcHBhZ2VEYXBwAAAAAAAAAAAHAQAAAA1rZXlGYWN0b3J5Q2ZnAAAAAAIAAAARJXNfX2ZhY3RvcnlDb25maWcBAAAAGmtleUZhY3RvcnlMcDJBc3NldHNNYXBwaW5nAAAAAQAAAApscEFzc2V0U3RyCQAEuQAAAAIJAARMAAAAAgIAAAAGJXMlcyVzCQAETAAAAAIFAAAACmxwQXNzZXRTdHIJAARMAAAAAgIAAAAebWFwcGluZ3NfX2xwQXNzZXQyUG9vbENvbnRyYWN0BQAAAANuaWwFAAAAA1NFUAEAAAAQa2V5RmFjdG9yeUxwTGlzdAAAAAACAAAAECVzX19scFRva2Vuc0xpc3QBAAAAJmtleUZhY3RvcnlMcEFzc2V0VG9Qb29sQ29udHJhY3RBZGRyZXNzAAAAAQAAAApscEFzc2V0U3RyCQAEuQAAAAIJAARMAAAAAgIAAAAGJXMlcyVzCQAETAAAAAIFAAAACmxwQXNzZXRTdHIJAARMAAAAAgIAAAAebWFwcGluZ3NfX2xwQXNzZXQyUG9vbENvbnRyYWN0BQAAAANuaWwFAAAAA1NFUAEAAAAUa2V5RmFjdG9yeVBvb2xXZWlnaHQAAAABAAAAD2NvbnRyYWN0QWRkcmVzcwkABLkAAAACCQAETAAAAAICAAAABCVzJXMJAARMAAAAAgIAAAAKcG9vbFdlaWdodAkABEwAAAACBQAAAA9jb250cmFjdEFkZHJlc3MFAAAAA25pbAUAAAADU0VQAQAAABhyZWFkRmFjdG9yeUFkZHJlc3NPckZhaWwAAAAACQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAQkBAAAAEWtleUZhY3RvcnlBZGRyZXNzAAAAAAEAAAAKcmVhZExwTGlzdAAAAAAJAAS1AAAAAgkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACCQEAAAAYcmVhZEZhY3RvcnlBZGRyZXNzT3JGYWlsAAAAAAkBAAAAEGtleUZhY3RvcnlMcExpc3QAAAAAAgAAAAAFAAAAA1NFUAEAAAAUcmVhZEZhY3RvcnlDZmdPckZhaWwAAAABAAAAB2ZhY3RvcnkJAAS1AAAAAgkBAAAAGGdldFN0cmluZ0J5QWRkcmVzc09yRmFpbAAAAAIFAAAAB2ZhY3RvcnkJAQAAAA1rZXlGYWN0b3J5Q2ZnAAAAAAUAAAADU0VQAQAAABhnZXRCb29zdGluZ0FkZHJlc3NPckZhaWwAAAABAAAACmZhY3RvcnlDZmcJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEJAAGRAAAAAgUAAAAKZmFjdG9yeUNmZwUAAAAZSWR4RmFjdG9yeUNmZ0Jvb3N0aW5nRGFwcAEAAAAYZ2V0RW1pc3Npb25BZGRyZXNzT3JGYWlsAAAAAQAAAApmYWN0b3J5Q2ZnCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQABkQAAAAIFAAAACmZhY3RvcnlDZmcFAAAAGUlkeEZhY3RvcnlDZmdFbWlzc2lvbkRhcHABAAAAF2dldFN0YWtpbmdBZGRyZXNzT3JGYWlsAAAAAQAAAApmYWN0b3J5Q2ZnCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQABkQAAAAIFAAAACmZhY3RvcnlDZmcFAAAAGElkeEZhY3RvcnlDZmdTdGFraW5nRGFwcAEAAAAea2V5RW1pc3Npb25SYXRlUGVyQmxvY2tDdXJyZW50AAAAAAIAAAAbJXMlc19fcmF0ZVBlckJsb2NrX19jdXJyZW50AQAAACFrZXlFbWlzc2lvblJhdGVQZXJCbG9ja01heEN1cnJlbnQAAAAAAgAAAB4lcyVzX19yYXRlUGVyQmxvY2tNYXhfX2N1cnJlbnQBAAAAFWtleUVtaXNzaW9uU3RhcnRCbG9jawAAAAACAAAAGiVzJXNfX2VtaXNzaW9uX19zdGFydEJsb2NrAQAAABtrZXlFbWlzc2lvbkR1cmF0aW9uSW5CbG9ja3MAAAAAAgAAABglcyVzX19lbWlzc2lvbl9fZHVyYXRpb24BAAAAE2tleUVtaXNzaW9uRW5kQmxvY2sAAAAAAgAAABglcyVzX19lbWlzc2lvbl9fZW5kQmxvY2sBAAAAD2tleVN0YWtlZEJ5VXNlcgAAAAIAAAAOdXNlckFkZHJlc3NTdHIAAAAMbHBBc3NldElkU3RyCQAEuQAAAAIJAARMAAAAAgIAAAAOJXMlcyVz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b3JkAAAABAUAAAALdXNlckFkZHJlc3MFAAAACWxwQXNzZXRJZAUAAAAEdHlwZQUAAAAGYW1vdW50AAAAAA9mYWN0b3J5Q29udHJhY3QJAQAAABhyZWFkRmFjdG9yeUFkZHJlc3NPckZhaWwAAAAAAAAAAApmYWN0b3J5Q2ZnCQEAAAAUcmVhZEZhY3RvcnlDZmdPckZhaWwAAAABBQAAAA9mYWN0b3J5Q29udHJhY3QAAAAAEGVtaXNzaW9uQ29udHJhY3QJAQAAABhnZXRFbWlzc2lvbkFkZHJlc3NPckZhaWwAAAABBQAAAApmYWN0b3J5Q2ZnAAAAABBib29zdGluZ0NvbnRyYWN0CQEAAAAYZ2V0Qm9vc3RpbmdBZGRyZXNzT3JGYWlsAAAAAQUAAAAKZmFjdG9yeUNmZwEAAAAbY2FsY1d4UGVyTHBJbnRlZ3JhbFVzZXJMYXN0AAAABAAAAAxzdGFrZWRCeVVzZXIAAAAmd3hQZXJMcEludGVncmFsVXNlckxhc3RVcGRIZWlnaHRPclplcm8AAAASd3hQZXJMcEludGVncmFsTmV3AAAAGnd4UGVyTHBJbnRlZ3JhbFVzZXJMYXN0S0VZAwMJAAAAAAAAAgUAAAAmd3hQZXJMcEludGVncmFsVXNlckxhc3RVcGRIZWlnaHRPclplcm8AAAAAAAAAAAAJAABmAAAAAgUAAAAMc3Rha2VkQnlVc2VyAAAAAAAAAAAABwAAAAAAAAAAAAMJAAAAAAAAAgUAAAAMc3Rha2VkQnlVc2VyAAAAAAAAAAAABQAAABJ3eFBlckxwSW50ZWdyYWxOZXcDAwkAAGYAAAACBQAAACZ3eFBlckxwSW50ZWdyYWxVc2VyTGFzdFVwZEhlaWdodE9yWmVybwAAAAAAAAAAAAkAAGYAAAACBQAAAAxzdGFrZWRCeVVzZXIAAAAAAAAAAAAHCQEAAAAMZ2V0SW50T3JGYWlsAAAAAgUAAAAEdGhpcwUAAAAad3hQZXJMcEludGVncmFsVXNlckxhc3RLRVkJAAACAAAAAQIAAAAtY2FsY1d4UGVyTHBJbnRlZ3JhbFVzZXJMYXN0OiB1bmV4cGVjdGVkIHN0YXRlAQAAABByZWZyZXNoSU5URUdSQUxTAAAABAAAAAxscEFzc2V0SWRTdHIAAAAOdXNlckFkZHJlc3NTdHIAAAAOcG9vbEFkZHJlc3NTdHIAAAANbHBEZWx0YUFtb3VudAQAAAAPc3Rha2VkQnlVc2VyS0VZCQEAAAAPa2V5U3Rha2VkQnlVc2VyAAAAAgUAAAAOdXNlckFkZHJlc3NTdHIFAAAADGxwQXNzZXRJZFN0cgQAAAAOc3Rha2VkVG90YWxLRVkJAQAAAA5rZXlTdGFrZWRUb3RhbAAAAAEFAAAADGxwQXNzZXRJZFN0cgQAAAAMc3Rha2VkQnlVc2VyCQEAAAAKcmVhZFN0YWtlZAAAAAEFAAAAD3N0YWtlZEJ5VXNlcktFWQQAAAALc3Rha2VkVG90YWwJAQAAAApyZWFkU3Rha2VkAAAAAQUAAAAOc3Rha2VkVG90YWxLRVkEAAAACnBvb2xXZWlnaHQJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAAD2ZhY3RvcnlDb250cmFjdAkBAAAAFGtleUZhY3RvcnlQb29sV2VpZ2h0AAAAAQUAAAAOcG9vbEFkZHJlc3NTdHIEAAAAEmVtaXNzaW9uU3RhcnRCbG9jawkBAAAADGdldEludE9yRmFpbAAAAAIFAAAAEGVtaXNzaW9uQ29udHJhY3QJAQAAABVrZXlFbWlzc2lvblN0YXJ0QmxvY2sAAAAABAAAABJ3eEVtaXNzaW9uUGVyQmxvY2sJAQAAAAxnZXRJbnRPckZhaWwAAAACBQAAABBlbWlzc2lvbkNvbnRyYWN0CQEAAAAea2V5RW1pc3Npb25SYXRlUGVyQmxvY2tDdXJyZW50AAAAAAQAAAAWcG9vbFd4RW1pc3Npb25QZXJCbG9jawkAAGsAAAADBQAAABJ3eEVtaXNzaW9uUGVyQmxvY2sFAAAACnBvb2xXZWlnaHQJAABoAAAAAgUAAAAOUE9PTFdFSUdIVE1VTFQAAAAAAAAAAAMEAAAAEnd4UGVyTHBJbnRlZ3JhbEtFWQkBAAAAEmtleVd4UGVyTHBJbnRlZ3JhbAAAAAEFAAAADGxwQXNzZXRJZFN0cgQAAAAfd3hQZXJMcEludGVncmFsTGFzdFVwZEhlaWdodEtFWQkBAAAAH2tleVd4UGVyTHBJbnRlZ3JhbExhc3RVcGRIZWlnaHQAAAABBQAAAAxscEFzc2V0SWRTdHIEAAAAEHd4VG9DbGFpbVVzZXJLRVkJAQAAABBrZXlXeFRvQ2xhaW1Vc2VyAAAAAgUAAAAMbHBBc3NldElkU3RyBQAAAA51c2VyQWRkcmVzc1N0cgQAAAAjd3hQZXJMcEludGVncmFsVXNlckxhc3RVcGRIZWlnaHRLRVkJAQAAACNrZXlXeFBlckxwSW50ZWdyYWxVc2VyTGFzdFVwZEhlaWdodAAAAAIFAAAADGxwQXNzZXRJZFN0cgUAAAAOdXNlckFkZHJlc3NTdHIEAAAACnd4UGVyTHBLRVkJAQAAAAprZXlXeFBlckxwAAAAAQUAAAAMbHBBc3NldElkU3RyBAAAABp3eFBlckxwSW50ZWdyYWxVc2VyTGFzdEtFWQkBAAAAGmtleVd4UGVyTHBJbnRlZ3JhbFVzZXJMYXN0AAAAAgUAAAAMbHBBc3NldElkU3RyBQAAAA51c2VyQWRkcmVzc1N0cgQAAAAcd3hQZXJMcEludGVncmFsTGFzdFVwZEhlaWdodAkBAAAAD2dldEludE9yRGVmYXVsdAAAAAMFAAAABHRoaXMFAAAAH3d4UGVyTHBJbnRlZ3JhbExhc3RVcGRIZWlnaHRLRVkFAAAAEmVtaXNzaW9uU3RhcnRCbG9jawQAAAAPd3hQZXJMcEludGVncmFsCQEAAAAMZ2V0SW50T3JaZXJvAAAAAgUAAAAEdGhpcwUAAAASd3hQZXJMcEludGVncmFsS0VZBAAAAA13eFRvQ2xhaW1Vc2VyCQEAAAAMZ2V0SW50T3JaZXJvAAAAAgUAAAAEdGhpcwUAAAAQd3hUb0NsYWltVXNlcktFWQQAAAAmd3hQZXJMcEludGVncmFsVXNlckxhc3RVcGRIZWlnaHRPclplcm8JAQAAAAxnZXRJbnRPclplcm8AAAACBQAAAAR0aGlzBQAAACN3eFBlckxwSW50ZWdyYWxVc2VyTGFzdFVwZEhlaWdodEtFWQQAAAAPd3hQZXJMcE9yWmVyb1g4CQEAAAAMZ2V0SW50T3JaZXJvAAAAAgUAAAAEdGhpcwUAAAAKd3hQZXJMcEtFWQQAAAACZGgJAAGWAAAAAQkABEwAAAACCQAAZQAAAAIFAAAABmhlaWdodAUAAAAcd3hQZXJMcEludGVncmFsTGFzdFVwZEhlaWdodAkABEwAAAACAAAAAAAAAAAABQAAAANuaWwEAAAACXd4UGVyTHBYOAMJAQAAAAIhPQAAAAIFAAAAD3d4UGVyTHBPclplcm9YOAAAAAAAAAAAAAUAAAAPd3hQZXJMcE9yWmVyb1g4CQAAawAAAAMFAAAAFnBvb2xXeEVtaXNzaW9uUGVyQmxvY2sFAAAABU1VTFQ4BQAAAAtzdGFrZWRUb3RhbAQAAAAOc3Rha2VkVG90YWxOZXcJAABkAAAAAgUAAAALc3Rha2VkVG90YWwFAAAADWxwRGVsdGFBbW91bnQEAAAAEnd4UGVyTHBJbnRlZ3JhbE5ldwkAAGQAAAACBQAAAA93eFBlckxwSW50ZWdyYWwJAABoAAAAAgUAAAAJd3hQZXJMcFg4BQAAAAJkaAQAAAAXd3hQZXJMcEludGVncmFsVXNlckxhc3QJAQAAABtjYWxjV3hQZXJMcEludGVncmFsVXNlckxhc3QAAAAEBQAAAAxzdGFrZWRCeVVzZXIFAAAAJnd4UGVyTHBJbnRlZ3JhbFVzZXJMYXN0VXBkSGVpZ2h0T3JaZXJvBQAAABJ3eFBlckxwSW50ZWdyYWxOZXcFAAAAGnd4UGVyTHBJbnRlZ3JhbFVzZXJMYXN0S0VZBAAAABB3eFRvQ2xhaW1Vc2VyTmV3CQAAZAAAAAIFAAAADXd4VG9DbGFpbVVzZXIJAABrAAAAAwkAAGUAAAACBQAAABJ3eFBlckxwSW50ZWdyYWxOZXcFAAAAF3d4UGVyTHBJbnRlZ3JhbFVzZXJMYXN0BQAAAAxzdGFrZWRCeVVzZXIFAAAABU1VTFQ4BAAAABp3eFBlckxwSW50ZWdyYWxVc2VyTGFzdE5ldwUAAAASd3hQZXJMcEludGVncmFsTmV3BAAAAAx3eFBlckxwTmV3WDgJAABpAAAAAgUAAAAWcG9vbFd4RW1pc3Npb25QZXJCbG9jawUAAAAOc3Rha2VkVG90YWxOZXcEAAAAH3d4UGVyTHBJbnRlZ3JhbExhc3RVcGRIZWlnaHROZXcFAAAABmhlaWdodAQAAAAjd3hQZXJMcEludGVncmFsVXNlckxhc3RVcGRIZWlnaHROZXcFAAAABmhlaWdodAQAAAAFZGVidWcJAAS5AAAAAgkABEwAAAACCQABpAAAAAEFAAAAEHd4VG9DbGFpbVVzZXJOZXcJAARMAAAAAgkAAaQAAAABBQAAABJ3eFBlckxwSW50ZWdyYWxOZXcJAARMAAAAAgkAAaQAAAABBQAAABd3eFBlckxwSW50ZWdyYWxVc2VyTGFzdAkABEwAAAACCQABpAAAAAEFAAAADHN0YWtlZEJ5VXNlcgkABEwAAAACCQABpAAAAAEFAAAAAmRoCQAETAAAAAIJAAGkAAAAAQUAAAAJd3hQZXJMcFg4CQAETAAAAAIJAAGkAAAAAQUAAAALc3Rha2VkVG90YWwJAARMAAAAAgkAAaQAAAABBQAAABZwb29sV3hFbWlzc2lvblBlckJsb2NrCQAETAAAAAIJAAGkAAAAAQUAAAASd3hFbWlzc2lvblBlckJsb2NrCQAETAAAAAIJAAGkAAAAAQUAAAAKcG9vbFdlaWdodAkABEwAAAACCQABpAAAAAEFAAAABmhlaWdodAUAAAADbmlsAgAAAAI6OgkABRUAAAADBQAAABB3eFRvQ2xhaW1Vc2VyTmV3CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABJ3eFBlckxwSW50ZWdyYWxLRVkFAAAAEnd4UGVyTHBJbnRlZ3JhbE5ldwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAfd3hQZXJMcEludGVncmFsTGFzdFVwZEhlaWdodEtFWQUAAAAfd3hQZXJMcEludGVncmFsTGFzdFVwZEhlaWdodE5ldwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAQd3hUb0NsYWltVXNlcktFWQUAAAAQd3hUb0NsYWltVXNlck5ldwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAjd3hQZXJMcEludGVncmFsVXNlckxhc3RVcGRIZWlnaHRLRVkFAAAAI3d4UGVyTHBJbnRlZ3JhbFVzZXJMYXN0VXBkSGVpZ2h0TmV3CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAp3eFBlckxwS0VZBQAAAAx3eFBlckxwTmV3WDgJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAGnd4UGVyTHBJbnRlZ3JhbFVzZXJMYXN0S0VZBQAAABp3eFBlckxwSW50ZWdyYWxVc2VyTGFzdE5ldwUAAAADbmlsBQAAAAVkZWJ1ZwAAAAUAAAABaQEAAAALY29uc3RydWN0b3IAAAABAAAAEWZhY3RvcnlBZGRyZXNzU3RyAwkBAAAAAiE9AAAAAggFAAAAAWkAAAAGY2FsbGVyBQAAAAR0aGlzCQAAAgAAAAECAAAADm5vdCBhdXRob3JpemVkCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABFrZXlGYWN0b3J5QWRkcmVzcwAAAAAFAAAAEWZhY3RvcnlBZGRyZXNzU3RyBQAAAANuaWwAAAABaQEAAAAFc3Rha2UAAAAAAwkBAAAAAiE9AAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQkAAAIAAAABAgAAADRpbnZhbGlkIHBheW1lbnQgLSBleGFjdCBvbmUgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBAAAAANwbXQJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAEAAAACWxwQXNzZXRJZAkBAAAABXZhbHVlAAAAAQgFAAAAA3BtdAAAAAdhc3NldElkBAAAAAxscEFzc2V0SWRTdHIJAAJYAAAAAQUAAAAJbHBBc3NldElkBAAAAAZhbW91bnQIBQAAAANwbXQAAAAGYW1vdW50BAAAAA5wb29sQWRkcmVzc1N0cgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAAD2ZhY3RvcnlDb250cmFjdAkBAAAAGmtleUZhY3RvcnlMcDJBc3NldHNNYXBwaW5nAAAAAQUAAAAMbHBBc3NldElkU3RyCQABLAAAAAICAAAAFXVuc3VwcG9ydGVkIGxwIGFzc2V0IAUAAAAMbHBBc3NldElkU3RyBAAAAAljYWxsZXJTdHIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAA51c2VyQWRkcmVzc1N0cgMJAAAAAAAAAgUAAAAJY2FsbGVyU3RyBQAAAA5wb29sQWRkcmVzc1N0cgkABCUAAAABCAUAAAABaQAAAAxvcmlnaW5DYWxsZXIFAAAACWNhbGxlclN0cgQAAAAPc3Rha2VkQnlVc2VyS0VZCQEAAAAPa2V5U3Rha2VkQnlVc2VyAAAAAgUAAAAOdXNlckFkZHJlc3NTdHIFAAAADGxwQXNzZXRJZFN0cgQAAAAOc3Rha2VkVG90YWxLRVkJAQAAAA5rZXlTdGFrZWRUb3RhbAAAAAEFAAAADGxwQXNzZXRJZFN0cgQAAAAMc3Rha2VkQnlVc2VyCQEAAAAKcmVhZFN0YWtlZAAAAAEFAAAAD3N0YWtlZEJ5VXNlcktFWQQAAAALc3Rha2VkVG90YWwJAQAAAApyZWFkU3Rha2VkAAAAAQUAAAAOc3Rha2VkVG90YWxLRVkEAAAADSR0MDEyNDI3MTI1NDQJAQAAABByZWZyZXNoSU5URUdSQUxTAAAABAUAAAAMbHBBc3NldElkU3RyBQAAAA51c2VyQWRkcmVzc1N0cgUAAAAOcG9vbEFkZHJlc3NTdHIFAAAABmFtb3VudAQAAAAQd3hUb0NsYWltVXNlck5ldwgFAAAADSR0MDEyNDI3MTI1NDQAAAACXzEEAAAADWludGVncmFsU1RBVEUIBQAAAA0kdDAxMjQyNzEyNTQ0AAAAAl8yBAAAAAVkZWJ1ZwgFAAAADSR0MDEyNDI3MTI1NDQAAAACXzMJAAROAAAAAgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAPc3Rha2VkQnlVc2VyS0VZCQAAZAAAAAIFAAAADHN0YWtlZEJ5VXNlcgUAAAAGYW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAA5zdGFrZWRUb3RhbEtFWQkAAGQAAAACBQAAAAtzdGFrZWRUb3RhbAUAAAAGYW1vdW50CQAETAAAAAIJAQAAABVPcGVyYXRpb25IaXN0b3J5RW50cnkAAAAFAgAAAAVzdGFrZQUAAAAOdXNlckFkZHJlc3NTdHIFAAAADGxwQXNzZXRJZFN0cgUAAAAGYW1vdW50CAUAAAABaQAAAA10cmFuc2FjdGlvbklkBQAAAANuaWwFAAAADWludGVncmFsU1RBVEUAAAABaQEAAAAHdW5zdGFrZQAAAAIAAAAMbHBBc3NldElkU3RyAAAABmFtb3VudAQAAAAOdXNlckFkZHJlc3NTdHIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAAlscEFzc2V0SWQJAAJZAAAAAQUAAAAMbHBBc3NldElkU3RyBAAAAA5wb29sQWRkcmVzc1N0cgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAAD2ZhY3RvcnlDb250cmFjdAkBAAAAGmtleUZhY3RvcnlMcDJBc3NldHNNYXBwaW5nAAAAAQUAAAAMbHBBc3NldElkU3RyCQABLAAAAAICAAAAFXVuc3VwcG9ydGVkIGxwIGFzc2V0IAUAAAAMbHBBc3NldElkU3RyBAAAAA9zdGFrZWRCeVVzZXJLRVkJAQAAAA9rZXlTdGFrZWRCeVVzZXIAAAACBQAAAA51c2VyQWRkcmVzc1N0cgUAAAAMbHBBc3NldElkU3RyBAAAAA5zdGFrZWRUb3RhbEtFWQkBAAAADmtleVN0YWtlZFRvdGFsAAAAAQUAAAAMbHBBc3NldElkU3RyBAAAAAxzdGFrZWRCeVVzZXIJAQAAAApyZWFkU3Rha2VkAAAAAQUAAAAPc3Rha2VkQnlVc2VyS0VZBAAAAAtzdGFrZWRUb3RhbAkBAAAACnJlYWRTdGFrZWQAAAABBQAAAA5zdGFrZWRUb3RhbEtFWQQAAAANJHQwMTMzNjExMzQ3OQkBAAAAEHJlZnJlc2hJTlRFR1JBTFMAAAAEBQAAAAxscEFzc2V0SWRTdHIFAAAADnVzZXJBZGRyZXNzU3RyBQAAAA5wb29sQWRkcmVzc1N0cgkBAAAAAS0AAAABBQAAAAZhbW91bnQEAAAAEHd4VG9DbGFpbVVzZXJOZXcIBQAAAA0kdDAxMzM2MTEzNDc5AAAAAl8xBAAAAA1pbnRlZ3JhbFNUQVRFCAUAAAANJHQwMTMzNjExMzQ3OQAAAAJfMgQAAAAFZGVidWcIBQAAAA0kdDAxMzM2MTEzNDc5AAAAAl8zAwkAAGYAAAACBQAAAAZhbW91bnQFAAAADHN0YWtlZEJ5VXNlcgkAAAIAAAABAgAAACRwYXNzZWQgYW1vdW50IGlzIGxlc3MgdGhlbiBhdmFpbGFibGUJAAROAAAAAgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAPc3Rha2VkQnlVc2VyS0VZCQAAZQAAAAIFAAAADHN0YWtlZEJ5VXNlcgUAAAAGYW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAA5zdGFrZWRUb3RhbEtFWQkAAGUAAAACBQAAAAtzdGFrZWRUb3RhbAUAAAAGYW1vdW50CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAGYW1vdW50BQAAAAlscEFzc2V0SWQJAARMAAAAAgkBAAAAFU9wZXJhdGlvbkhpc3RvcnlFbnRyeQAAAAUCAAAAB3Vuc3Rha2UFAAAADnVzZXJBZGRyZXNzU3RyBQAAAAxscEFzc2V0SWRTdHIFAAAABmFtb3VudAgFAAAAAWkAAAANdHJhbnNhY3Rpb25JZAUAAAADbmlsBQAAAA1pbnRlZ3JhbFNUQVRFAAAAAWkBAAAAB2NsYWltV3gAAAABAAAADGxwQXNzZXRJZFN0cgQAAAALdXNlckFkZHJlc3MIBQAAAAFpAAAABmNhbGxlcgQAAAAOdXNlckFkZHJlc3NTdHIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAA5wb29sQWRkcmVzc1N0cgkBAAAAGGdldFN0cmluZ0J5QWRkcmVzc09yRmFpbAAAAAIFAAAAD2ZhY3RvcnlDb250cmFjdAkBAAAAJmtleUZhY3RvcnlMcEFzc2V0VG9Qb29sQ29udHJhY3RBZGRyZXNzAAAAAQUAAAAMbHBBc3NldElkU3RyBAAAABBjbGFpbWVkQnlVc2VyS0VZCQEAAAAQa2V5Q2xhaW1lZEJ5VXNlcgAAAAIFAAAADGxwQXNzZXRJZFN0cgUAAAAOdXNlckFkZHJlc3NTdHIEAAAAD2NsYWltZWRUb3RhbEtFWQkBAAAAD2tleUNsYWltZWRUb3RhbAAAAAEFAAAADGxwQXNzZXRJZFN0cgQAAAAZY2xhaW1lZEJ5VXNlck1pblJld2FyZEtFWQkBAAAAGWtleUNsYWltZWRCeVVzZXJNaW5SZXdhcmQAAAACBQAAAAxscEFzc2V0SWRTdHIFAAAADnVzZXJBZGRyZXNzU3RyBAAAABtjbGFpbWVkQnlVc2VyQm9vc3RSZXdhcmRLRVkJAQAAABtrZXlDbGFpbWVkQnlVc2VyQm9vc3RSZXdhcmQAAAACBQAAAAxscEFzc2V0SWRTdHIFAAAADnVzZXJBZGRyZXNzU3RyBAAAAA1jbGFpbWVkQnlVc2VyCQEAAAAMZ2V0SW50T3JaZXJvAAAAAgUAAAAEdGhpcwUAAAAQY2xhaW1lZEJ5VXNlcktFWQQAAAAWY2xhaW1lZEJ5VXNlck1pblJld2FyZAkBAAAADGdldEludE9yWmVybwAAAAIFAAAABHRoaXMFAAAAGWNsYWltZWRCeVVzZXJNaW5SZXdhcmRLRVkEAAAAGGNsYWltZWRCeVVzZXJCb29zdFJld2FyZAkBAAAADGdldEludE9yWmVybwAAAAIFAAAABHRoaXMFAAAAG2NsYWltZWRCeVVzZXJCb29zdFJld2FyZEtFWQQAAAAMY2xhaW1lZFRvdGFsCQEAAAAMZ2V0SW50T3JaZXJvAAAAAgUAAAAEdGhpcwUAAAAPY2xhaW1lZFRvdGFsS0VZBAAAAA0kdDAxNDY3MTE0NzgzCQEAAAAQcmVmcmVzaElOVEVHUkFMUwAAAAQFAAAADGxwQXNzZXRJZFN0cgUAAAAOdXNlckFkZHJlc3NTdHIFAAAADnBvb2xBZGRyZXNzU3RyAAAAAAAAAAAABAAAABB3eFRvQ2xhaW1Vc2VyTmV3CAUAAAANJHQwMTQ2NzExNDc4MwAAAAJfMQQAAAANaW50ZWdyYWxTVEFURQgFAAAADSR0MDE0NjcxMTQ3ODMAAAACXzIEAAAABWRlYnVnCAUAAAANJHQwMTQ2NzExNDc4MwAAAAJfMwQAAAAQYXZhaWxhYmxlVG9DbGFpbQkAAGUAAAACBQAAABB3eFRvQ2xhaW1Vc2VyTmV3BQAAAA1jbGFpbWVkQnlVc2VyAwkAAGcAAAACAAAAAAAAAAAABQAAABBhdmFpbGFibGVUb0NsYWltCQAAAgAAAAECAAAAEG5vdGhpbmcgdG8gY2xhaW0EAAAAEnd4QW1vdW50Qm9vc3RUb3RhbAkBAAAABWFzSW50AAAAAQkAAZEAAAACCQEAAAAJYXNBbnlMaXN0AAAAAQkAA/wAAAAEBQAAABBib29zdGluZ0NvbnRyYWN0AgAAAAxjbGFpbVd4Qm9vc3QJAARMAAAAAgUAAAAOdXNlckFkZHJlc3NTdHIFAAAAA25pbAUAAAADbmlsAAAAAAAAAAAABAAAAApwb29sV2VpZ2h0CQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAA9mYWN0b3J5Q29udHJhY3QJAQAAABRrZXlGYWN0b3J5UG9vbFdlaWdodAAAAAEFAAAADnBvb2xBZGRyZXNzU3RyBAAAABJib29zdFJld2FyZFBhcnRUTVAJAABrAAAAAwUAAAASd3hBbW91bnRCb29zdFRvdGFsBQAAAApwb29sV2VpZ2h0BQAAAA5QT09MV0VJR0hUTVVMVAQAAAANbWluUmV3YXJkUGFydAUAAAAQYXZhaWxhYmxlVG9DbGFpbQQAAAAPYm9vc3RSZXdhcmRQYXJ0CQABlwAAAAEJAARMAAAAAgkAAGgAAAACBQAAAA1taW5SZXdhcmRQYXJ0AAAAAAAAAAADCQAETAAAAAIFAAAAEmJvb3N0UmV3YXJkUGFydFRNUAUAAAADbmlsBAAAAAl3eEFzc2V0SWQJAQAAAAxhc0J5dGVWZWN0b3IAAAABCQABkQAAAAIJAQAAAAlhc0FueUxpc3QAAAABCQAD/AAAAAQFAAAAEGVtaXNzaW9uQ29udHJhY3QCAAAABGVtaXQJAARMAAAAAgUAAAANbWluUmV3YXJkUGFydAUAAAADbmlsBQAAAANuaWwAAAAAAAAAAAAEAAAACWVtaXRCb29zdAkBAAAACWFzQW55TGlzdAAAAAEJAAP8AAAABAUAAAAQZW1pc3Npb25Db250cmFjdAIAAAAEZW1pdAkABEwAAAACBQAAAA9ib29zdFJld2FyZFBhcnQFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAAllbWl0Qm9vc3QFAAAACWVtaXRCb29zdAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAQY2xhaW1lZEJ5VXNlcktFWQkAAGQAAAACBQAAAA1jbGFpbWVkQnlVc2VyBQAAABBhdmFpbGFibGVUb0NsYWltCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABljbGFpbWVkQnlVc2VyTWluUmV3YXJkS0VZCQAAZAAAAAIFAAAAFmNsYWltZWRCeVVzZXJNaW5SZXdhcmQFAAAADW1pblJld2FyZFBhcnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAG2NsYWltZWRCeVVzZXJCb29zdFJld2FyZEtFWQkAAGQAAAACBQAAABhjbGFpbWVkQnlVc2VyQm9vc3RSZXdhcmQFAAAAD2Jvb3N0UmV3YXJkUGFydAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAPY2xhaW1lZFRvdGFsS0VZCQAAZAAAAAIFAAAADGNsYWltZWRUb3RhbAUAAAAQYXZhaWxhYmxlVG9DbGFpbQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAAt1c2VyQWRkcmVzcwUAAAAQYXZhaWxhYmxlVG9DbGFpbQUAAAAJd3hBc3NldElkCQAETAAAAAIJAQAAABVPcGVyYXRpb25IaXN0b3J5RW50cnkAAAAFAgAAAAVjbGFpbQUAAAAOdXNlckFkZHJlc3NTdHIFAAAADGxwQXNzZXRJZFN0cgUAAAAQYXZhaWxhYmxlVG9DbGFpbQgFAAAAAWkAAAANdHJhbnNhY3Rpb25JZAUAAAADbmlsCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAAA9jbGFpbVd4UkVBRE9OTFkAAAACAAAADGxwQXNzZXRJZFN0cgAAAA51c2VyQWRkcmVzc1N0cgQAAAAPc3Rha2VkQnlVc2VyS0VZCQEAAAAPa2V5U3Rha2VkQnlVc2VyAAAAAgUAAAAOdXNlckFkZHJlc3NTdHIFAAAADGxwQXNzZXRJZFN0cgQAAAAOc3Rha2VkVG90YWxLRVkJAQAAAA5rZXlTdGFrZWRUb3RhbAAAAAEFAAAADGxwQXNzZXRJZFN0cgQAAAAQY2xhaW1lZEJ5VXNlcktFWQkBAAAAEGtleUNsYWltZWRCeVVzZXIAAAACBQAAAAxscEFzc2V0SWRTdHIFAAAADnVzZXJBZGRyZXNzU3RyBAAAAAxzdGFrZWRCeVVzZXIJAQAAAApyZWFkU3Rha2VkAAAAAQUAAAAPc3Rha2VkQnlVc2VyS0VZBAAAAAtzdGFrZWRUb3RhbAkBAAAACnJlYWRTdGFrZWQAAAABBQAAAA5zdGFrZWRUb3RhbEtFWQQAAAANY2xhaW1lZEJ5VXNlcgkBAAAADGdldEludE9yWmVybwAAAAIFAAAABHRoaXMFAAAAEGNsYWltZWRCeVVzZXJLRVkEAAAADnBvb2xBZGRyZXNzU3RyCQEAAAAYZ2V0U3RyaW5nQnlBZGRyZXNzT3JGYWlsAAAAAgUAAAAPZmFjdG9yeUNvbnRyYWN0CQEAAAAma2V5RmFjdG9yeUxwQXNzZXRUb1Bvb2xDb250cmFjdEFkZHJlc3MAAAABBQAAAAxscEFzc2V0SWRTdHIEAAAADnBvb2xXZWlnaHRNdWx0BQAAAAVNVUxUOAQAAAAKcG9vbFdlaWdodAkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAPZmFjdG9yeUNvbnRyYWN0CQEAAAAUa2V5RmFjdG9yeVBvb2xXZWlnaHQAAAABBQAAAA5wb29sQWRkcmVzc1N0cgQAAAASd3hFbWlzc2lvblBlckJsb2NrCQEAAAAMZ2V0SW50T3JGYWlsAAAAAgUAAAAQZW1pc3Npb25Db250cmFjdAkBAAAAHmtleUVtaXNzaW9uUmF0ZVBlckJsb2NrQ3VycmVudAAAAAAEAAAAEmVtaXNzaW9uU3RhcnRCbG9jawkBAAAADGdldEludE9yRmFpbAAAAAIFAAAAEGVtaXNzaW9uQ29udHJhY3QJAQAAABVrZXlFbWlzc2lvblN0YXJ0QmxvY2sAAAAABAAAAAxwYXNzZWRCbG9ja3MDCQAAZgAAAAIFAAAAEmVtaXNzaW9uU3RhcnRCbG9jawUAAAAGaGVpZ2h0AAAAAAAAAAAACQAAZQAAAAIFAAAABmhlaWdodAUAAAASZW1pc3Npb25TdGFydEJsb2NrBAAAAA5wb29sV3hFbWlzc2lvbgkAAGsAAAADCQAAaAAAAAIFAAAAEnd4RW1pc3Npb25QZXJCbG9jawUAAAAMcGFzc2VkQmxvY2tzBQAAAApwb29sV2VpZ2h0BQAAAA5wb29sV2VpZ2h0TXVsdAQAAAAMdXNlcld4UmV3YXJkCQAAawAAAAMFAAAADnBvb2xXeEVtaXNzaW9uBQAAAAxzdGFrZWRCeVVzZXIFAAAAC3N0YWtlZFRvdGFsBAAAAA0kdDAxNzE0OTE3MjYxCQEAAAAQcmVmcmVzaElOVEVHUkFMUwAAAAQFAAAADGxwQXNzZXRJZFN0cgUAAAAOdXNlckFkZHJlc3NTdHIFAAAADnBvb2xBZGRyZXNzU3RyAAAAAAAAAAAABAAAABB3eFRvQ2xhaW1Vc2VyTmV3CAUAAAANJHQwMTcxNDkxNzI2MQAAAAJfMQQAAAANaW50ZWdyYWxTVEFURQgFAAAADSR0MDE3MTQ5MTcyNjEAAAACXzIEAAAABWRlYnVnCAUAAAANJHQwMTcxNDkxNzI2MQAAAAJfMwQAAAAQYXZhaWxhYmxlVG9DbGFpbQkAAGUAAAACBQAAABB3eFRvQ2xhaW1Vc2VyTmV3BQAAAA1jbGFpbWVkQnlVc2VyCQAFFAAAAAIFAAAAA25pbAkABLkAAAACCQAETAAAAAICAAAACiVzJXMlZCVkJXMJAARMAAAAAgUAAAAMbHBBc3NldElkU3RyCQAETAAAAAIFAAAADnVzZXJBZGRyZXNzU3RyCQAETAAAAAIJAAGkAAAAAQUAAAAQYXZhaWxhYmxlVG9DbGFpbQkABEwAAAACCQABpAAAAAEFAAAADWNsYWltZWRCeVVzZXIJAARMAAAAAgkAASwAAAACCQABLAAAAAIFAAAABWRlYnVnAgAAAAI6OgkAAaQAAAABBQAAAAx1c2VyV3hSZXdhcmQFAAAAA25pbAUAAAADU0VQAAAAAAY2FqY=", "chainId": 84, "height": 1806705, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 5JFSmeG8TDDvJaRzviBgq84YqNaAef5fdRLxwmrGcLaS Next: ADforCmiy1ZqAqtJdQcQZhHqpH6eDr1AcdecPyrXztnA 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 asByteVector (val) = match val {
3333 case valBin: ByteVector =>
3434 valBin
3535 case _ =>
3636 throw("fail to cast into Int")
3737 }
3838
3939
4040 func getStringOrFail (key) = valueOrErrorMessage(getString(key), (("mandatory this." + key) + " is not defined"))
4141
4242
4343 func getStringByAddressOrFail (address,key) = valueOrErrorMessage(getString(address, key), (((("mandatory " + toString(address)) + ".") + key) + " is not defined"))
4444
4545
4646 func getIntOrZero (address,key) = valueOrElse(getInteger(address, key), 0)
4747
4848
4949 func getIntOrDefault (address,key,defaultVal) = valueOrElse(getInteger(address, key), defaultVal)
5050
5151
5252 func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), (("mandatory this." + key) + " is not defined"))
5353
5454
5555 func toX18 (origVal,origScaleMult) = fraction(toBigInt(origVal), MULT18, toBigInt(origScaleMult))
5656
5757
5858 func fromX18 (val,resultScaleMult) = toInt(fraction(val, toBigInt(resultScaleMult), MULT18))
5959
6060
6161 func keyFactoryAddress () = "%s%s__config__factoryAddress"
6262
6363
6464 let IdxFactoryCfgStakingDapp = 1
6565
6666 let IdxFactoryCfgBoostingDapp = 2
6767
6868 let IdxFactoryCfgIdoDapp = 3
6969
7070 let IdxFactoryCfgTeamDapp = 4
7171
7272 let IdxFactoryCfgEmissionDapp = 5
7373
7474 let IdxFactoryCfgRestDapp = 6
7575
7676 let IdxFactoryCfgSlippageDapp = 7
7777
7878 func keyFactoryCfg () = "%s__factoryConfig"
7979
8080
8181 func keyFactoryLp2AssetsMapping (lpAssetStr) = makeString(["%s%s%s", lpAssetStr, "mappings__lpAsset2PoolContract"], SEP)
8282
8383
8484 func keyFactoryLpList () = "%s__lpTokensList"
8585
8686
8787 func keyFactoryLpAssetToPoolContractAddress (lpAssetStr) = makeString(["%s%s%s", lpAssetStr, "mappings__lpAsset2PoolContract"], SEP)
8888
8989
9090 func keyFactoryPoolWeight (contractAddress) = makeString(["%s%s", "poolWeight", contractAddress], SEP)
9191
9292
9393 func readFactoryAddressOrFail () = addressFromStringValue(getStringOrFail(keyFactoryAddress()))
9494
9595
9696 func readLpList () = split(valueOrElse(getString(readFactoryAddressOrFail(), keyFactoryLpList()), ""), SEP)
9797
9898
9999 func readFactoryCfgOrFail (factory) = split(getStringByAddressOrFail(factory, keyFactoryCfg()), SEP)
100100
101101
102102 func getBoostingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgBoostingDapp])
103103
104104
105105 func getEmissionAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgEmissionDapp])
106106
107107
108108 func getStakingAddressOrFail (factoryCfg) = addressFromStringValue(factoryCfg[IdxFactoryCfgStakingDapp])
109109
110110
111111 func keyEmissionRatePerBlockCurrent () = "%s%s__ratePerBlock__current"
112112
113113
114114 func keyEmissionRatePerBlockMaxCurrent () = "%s%s__ratePerBlockMax__current"
115115
116116
117117 func keyEmissionStartBlock () = "%s%s__emission__startBlock"
118118
119119
120120 func keyEmissionDurationInBlocks () = "%s%s__emission__duration"
121121
122122
123123 func keyEmissionEndBlock () = "%s%s__emission__endBlock"
124124
125125
126126 func keyStakedByUser (userAddressStr,lpAssetIdStr) = makeString(["%s%s%s__staked", userAddressStr, lpAssetIdStr], SEP)
127127
128128
129129 func keyStakedTotal (lpAssetIdStr) = ("%s%s%s__staked__total__" + lpAssetIdStr)
130130
131131
132132 func keyClaimedByUser (lpAssetIdStr,userAddressStr) = makeString(["%s%s%s__claimed", userAddressStr, lpAssetIdStr], SEP)
133133
134134
135135 func keyClaimedByUserMinReward (lpAssetIdStr,userAddressStr) = makeString(["%s%s%s__claimedMinReward", userAddressStr, lpAssetIdStr], SEP)
136136
137137
138138 func keyClaimedByUserBoostReward (lpAssetIdStr,userAddressStr) = makeString(["%s%s%s__claimedBoostReward", userAddressStr, lpAssetIdStr], SEP)
139139
140140
141141 func keyClaimedTotal (lpAssetIdStr) = makeString(["%s%s%s__claimed", "total", lpAssetIdStr], SEP)
142142
143143
144144 func readStaked (key) = valueOrElse(getInteger(this, key), 0)
145145
146146
147147 func keyLastTotalLpBalance (lpAssetId) = makeString(["%s%s%s", lpAssetId, "total", "bal"], SEP)
148148
149149
150150 func keyLastUserLpBalance (lpAssetId,userAddress) = makeString(["%s%s%s", lpAssetId, userAddress, "bal"], SEP)
151151
152152
153153 func keyTotalLpBalanceIntegral (lpAssetId) = makeString(["%s%s%s", lpAssetId, "total", "balINT"], SEP)
154154
155155
156156 func keyUserLpBalanceIntegral (lpAssetId,userAddress) = makeString(["%s%s%s", lpAssetId, userAddress, "balINT"], SEP)
157157
158158
159159 func keyTotalLpBalanceIntegralLastUpdHeight (lpAssetId) = makeString(["%s%s%s", lpAssetId, "total", "lastUpd"], SEP)
160160
161161
162162 func keyUserLpBalanceIntegralLastUpdHeight (lpAssetId,userAddress) = makeString(["%s%s%s", lpAssetId, userAddress, "lastUpd"], SEP)
163163
164164
165165 func keyWxPerLpIntegral (lpAssetId) = makeString(["%s%s%s%s", lpAssetId, "common", "lpInt"], SEP)
166166
167167
168168 func keyWxPerLpIntegralLastUpdHeight (lpAssetId) = makeString(["%s%s%s%s", lpAssetId, "common", "lpIntH"], SEP)
169169
170170
171171 func keyWxToClaimUser (lpAssetId,userAddress) = makeString(["%s%s%s%s", lpAssetId, userAddress, "lpInt"], SEP)
172172
173173
174174 func keyWxPerLpIntegralUserLastUpdHeight (lpAssetId,userAddress) = makeString(["%s%s%s%s", lpAssetId, userAddress, "lpIntH"], SEP)
175175
176176
177177 func keyWxPerLp (lpAssetId) = makeString(["%s", lpAssetId, "wxPerLp"], SEP)
178178
179179
180180 func keyWxPerLpX18 (lpAssetId) = makeString(["%s", lpAssetId, "wxPerLpX18"], SEP)
181181
182182
183183 func keyWxPerLpIntegralUserLast (lpAssetId,userAddress) = makeString(["%s%s%s%s", lpAssetId, userAddress, "uIntL"], SEP)
184184
185185
186186 func keyOperationHistoryRecord (type,userAddress,txId58) = makeString(["%s%s%s%s__history", type, userAddress, txId58], SEP)
187187
188188
189189 func formatHistoryRecord (userAddress,lpAssetId,type,amount) = makeString(["%s%s%s%d%d%d", userAddress, lpAssetId, type, toString(height), toString(lastBlock.timestamp), toString(amount)], SEP)
190190
191191
192192 func OperationHistoryEntry (type,userAddress,lpAssetId,amount,txId) = StringEntry(keyOperationHistoryRecord(type, userAddress, toBase58String(txId)), formatHistoryRecord(userAddress, lpAssetId, type, amount))
193193
194194
195195 let factoryContract = readFactoryAddressOrFail()
196196
197197 let factoryCfg = readFactoryCfgOrFail(factoryContract)
198198
199199 let emissionContract = getEmissionAddressOrFail(factoryCfg)
200200
201201 let boostingContract = getBoostingAddressOrFail(factoryCfg)
202202
203203 func calcWxPerLpIntegralUserLast (stakedByUser,wxPerLpIntegralUserLastUpdHeightOrZero,wxPerLpIntegralNew,wxPerLpIntegralUserLastKEY) = if (if ((wxPerLpIntegralUserLastUpdHeightOrZero == 0))
204204 then (stakedByUser > 0)
205205 else false)
206206 then 0
207207 else if ((stakedByUser == 0))
208208 then wxPerLpIntegralNew
209209 else if (if ((wxPerLpIntegralUserLastUpdHeightOrZero > 0))
210210 then (stakedByUser > 0)
211211 else false)
212212 then getIntOrFail(this, wxPerLpIntegralUserLastKEY)
213213 else throw("calcWxPerLpIntegralUserLast: unexpected state")
214214
215215
216216 func refreshINTEGRALS (lpAssetIdStr,userAddressStr,poolAddressStr,lpDeltaAmount) = {
217217 let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
218218 let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
219219 let stakedByUser = readStaked(stakedByUserKEY)
220220 let stakedTotal = readStaked(stakedTotalKEY)
221221 let poolWeight = getIntegerValue(factoryContract, keyFactoryPoolWeight(poolAddressStr))
222222 let emissionStartBlock = getIntOrFail(emissionContract, keyEmissionStartBlock())
223223 let wxEmissionPerBlock = getIntOrFail(emissionContract, keyEmissionRatePerBlockCurrent())
224224 let poolWxEmissionPerBlock = fraction(wxEmissionPerBlock, poolWeight, (POOLWEIGHTMULT * 3))
225225 let wxPerLpIntegralKEY = keyWxPerLpIntegral(lpAssetIdStr)
226226 let wxPerLpIntegralLastUpdHeightKEY = keyWxPerLpIntegralLastUpdHeight(lpAssetIdStr)
227227 let wxToClaimUserKEY = keyWxToClaimUser(lpAssetIdStr, userAddressStr)
228228 let wxPerLpIntegralUserLastUpdHeightKEY = keyWxPerLpIntegralUserLastUpdHeight(lpAssetIdStr, userAddressStr)
229229 let wxPerLpKEY = keyWxPerLp(lpAssetIdStr)
230230 let wxPerLpIntegralUserLastKEY = keyWxPerLpIntegralUserLast(lpAssetIdStr, userAddressStr)
231231 let wxPerLpIntegralLastUpdHeight = getIntOrDefault(this, wxPerLpIntegralLastUpdHeightKEY, emissionStartBlock)
232232 let wxPerLpIntegral = getIntOrZero(this, wxPerLpIntegralKEY)
233233 let wxToClaimUser = getIntOrZero(this, wxToClaimUserKEY)
234234 let wxPerLpIntegralUserLastUpdHeightOrZero = getIntOrZero(this, wxPerLpIntegralUserLastUpdHeightKEY)
235235 let wxPerLpOrZeroX8 = getIntOrZero(this, wxPerLpKEY)
236236 let dh = max([(height - wxPerLpIntegralLastUpdHeight), 0])
237237 let wxPerLpX8 = if ((wxPerLpOrZeroX8 != 0))
238238 then wxPerLpOrZeroX8
239239 else fraction(poolWxEmissionPerBlock, MULT8, stakedTotal)
240240 let stakedTotalNew = (stakedTotal + lpDeltaAmount)
241241 let wxPerLpIntegralNew = (wxPerLpIntegral + (wxPerLpX8 * dh))
242242 let wxPerLpIntegralUserLast = calcWxPerLpIntegralUserLast(stakedByUser, wxPerLpIntegralUserLastUpdHeightOrZero, wxPerLpIntegralNew, wxPerLpIntegralUserLastKEY)
243243 let wxToClaimUserNew = (wxToClaimUser + fraction((wxPerLpIntegralNew - wxPerLpIntegralUserLast), stakedByUser, MULT8))
244244 let wxPerLpIntegralUserLastNew = wxPerLpIntegralNew
245245 let wxPerLpNewX8 = (poolWxEmissionPerBlock / stakedTotalNew)
246246 let wxPerLpIntegralLastUpdHeightNew = height
247247 let wxPerLpIntegralUserLastUpdHeightNew = height
248248 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)], "::")
249249 $Tuple3(wxToClaimUserNew, [IntegerEntry(wxPerLpIntegralKEY, wxPerLpIntegralNew), IntegerEntry(wxPerLpIntegralLastUpdHeightKEY, wxPerLpIntegralLastUpdHeightNew), IntegerEntry(wxToClaimUserKEY, wxToClaimUserNew), IntegerEntry(wxPerLpIntegralUserLastUpdHeightKEY, wxPerLpIntegralUserLastUpdHeightNew), IntegerEntry(wxPerLpKEY, wxPerLpNewX8), IntegerEntry(wxPerLpIntegralUserLastKEY, wxPerLpIntegralUserLastNew)], debug)
250250 }
251251
252252
253253 @Callable(i)
254254 func constructor (factoryAddressStr) = if ((i.caller != this))
255255 then throw("not authorized")
256256 else [StringEntry(keyFactoryAddress(), factoryAddressStr)]
257257
258258
259259
260260 @Callable(i)
261261 func stake () = if ((size(i.payments) != 1))
262262 then throw("invalid payment - exact one payment must be attached")
263263 else {
264264 let pmt = i.payments[0]
265265 let lpAssetId = value(pmt.assetId)
266266 let lpAssetIdStr = toBase58String(lpAssetId)
267267 let amount = pmt.amount
268268 let poolAddressStr = valueOrErrorMessage(getString(factoryContract, keyFactoryLp2AssetsMapping(lpAssetIdStr)), ("unsupported lp asset " + lpAssetIdStr))
269269 let callerStr = toString(i.caller)
270270 let userAddressStr = if ((callerStr == poolAddressStr))
271271 then toString(i.originCaller)
272272 else callerStr
273273 let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
274274 let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
275275 let stakedByUser = readStaked(stakedByUserKEY)
276276 let stakedTotal = readStaked(stakedTotalKEY)
277277 let $t01242712544 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, amount)
278278 let wxToClaimUserNew = $t01242712544._1
279279 let integralSTATE = $t01242712544._2
280280 let debug = $t01242712544._3
281281 ([IntegerEntry(stakedByUserKEY, (stakedByUser + amount)), IntegerEntry(stakedTotalKEY, (stakedTotal + amount)), OperationHistoryEntry("stake", userAddressStr, lpAssetIdStr, amount, i.transactionId)] ++ integralSTATE)
282282 }
283283
284284
285285
286286 @Callable(i)
287287 func unstake (lpAssetIdStr,amount) = {
288288 let userAddressStr = toString(i.caller)
289289 let lpAssetId = fromBase58String(lpAssetIdStr)
290290 let poolAddressStr = valueOrErrorMessage(getString(factoryContract, keyFactoryLp2AssetsMapping(lpAssetIdStr)), ("unsupported lp asset " + lpAssetIdStr))
291291 let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
292292 let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
293293 let stakedByUser = readStaked(stakedByUserKEY)
294294 let stakedTotal = readStaked(stakedTotalKEY)
295295 let $t01336113479 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, -(amount))
296296 let wxToClaimUserNew = $t01336113479._1
297297 let integralSTATE = $t01336113479._2
298298 let debug = $t01336113479._3
299299 if ((amount > stakedByUser))
300300 then throw("passed amount is less then available")
301301 else ([IntegerEntry(stakedByUserKEY, (stakedByUser - amount)), IntegerEntry(stakedTotalKEY, (stakedTotal - amount)), ScriptTransfer(i.caller, amount, lpAssetId), OperationHistoryEntry("unstake", userAddressStr, lpAssetIdStr, amount, i.transactionId)] ++ integralSTATE)
302302 }
303303
304304
305305
306306 @Callable(i)
307307 func claimWx (lpAssetIdStr) = {
308308 let userAddress = i.caller
309309 let userAddressStr = toString(i.caller)
310310 let poolAddressStr = getStringByAddressOrFail(factoryContract, keyFactoryLpAssetToPoolContractAddress(lpAssetIdStr))
311311 let claimedByUserKEY = keyClaimedByUser(lpAssetIdStr, userAddressStr)
312312 let claimedTotalKEY = keyClaimedTotal(lpAssetIdStr)
313313 let claimedByUserMinRewardKEY = keyClaimedByUserMinReward(lpAssetIdStr, userAddressStr)
314314 let claimedByUserBoostRewardKEY = keyClaimedByUserBoostReward(lpAssetIdStr, userAddressStr)
315315 let claimedByUser = getIntOrZero(this, claimedByUserKEY)
316316 let claimedByUserMinReward = getIntOrZero(this, claimedByUserMinRewardKEY)
317317 let claimedByUserBoostReward = getIntOrZero(this, claimedByUserBoostRewardKEY)
318318 let claimedTotal = getIntOrZero(this, claimedTotalKEY)
319319 let $t01467114783 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
320320 let wxToClaimUserNew = $t01467114783._1
321321 let integralSTATE = $t01467114783._2
322322 let debug = $t01467114783._3
323323 let availableToClaim = (wxToClaimUserNew - claimedByUser)
324324 if ((0 >= availableToClaim))
325325 then throw("nothing to claim")
326326 else {
327327 let wxAmountBoostTotal = asInt(asAnyList(invoke(boostingContract, "claimWxBoost", [userAddressStr], nil))[0])
328328 let poolWeight = getIntegerValue(factoryContract, keyFactoryPoolWeight(poolAddressStr))
329329 let boostRewardPartTMP = fraction(wxAmountBoostTotal, poolWeight, POOLWEIGHTMULT)
330330 let minRewardPart = availableToClaim
331331 let boostRewardPart = min([(minRewardPart * 3), boostRewardPartTMP])
332332 let wxAssetId = asByteVector(asAnyList(invoke(emissionContract, "emit", [minRewardPart], nil))[0])
333333 let emitBoost = asAnyList(invoke(emissionContract, "emit", [boostRewardPart], nil))
334334 if ((emitBoost == emitBoost))
335335 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)]
336336 else throw("Strict value is not equal to itself.")
337337 }
338338 }
339339
340340
341341
342342 @Callable(i)
343343 func claimWxREADONLY (lpAssetIdStr,userAddressStr) = {
344344 let stakedByUserKEY = keyStakedByUser(userAddressStr, lpAssetIdStr)
345345 let stakedTotalKEY = keyStakedTotal(lpAssetIdStr)
346346 let claimedByUserKEY = keyClaimedByUser(lpAssetIdStr, userAddressStr)
347347 let stakedByUser = readStaked(stakedByUserKEY)
348348 let stakedTotal = readStaked(stakedTotalKEY)
349349 let claimedByUser = getIntOrZero(this, claimedByUserKEY)
350350 let poolAddressStr = getStringByAddressOrFail(factoryContract, keyFactoryLpAssetToPoolContractAddress(lpAssetIdStr))
351351 let poolWeightMult = MULT8
352352 let poolWeight = getIntegerValue(factoryContract, keyFactoryPoolWeight(poolAddressStr))
353353 let wxEmissionPerBlock = getIntOrFail(emissionContract, keyEmissionRatePerBlockCurrent())
354354 let emissionStartBlock = getIntOrFail(emissionContract, keyEmissionStartBlock())
355355 let passedBlocks = if ((emissionStartBlock > height))
356356 then 0
357357 else (height - emissionStartBlock)
358358 let poolWxEmission = fraction((wxEmissionPerBlock * passedBlocks), poolWeight, poolWeightMult)
359359 let userWxReward = fraction(poolWxEmission, stakedByUser, stakedTotal)
360360 let $t01714917261 = refreshINTEGRALS(lpAssetIdStr, userAddressStr, poolAddressStr, 0)
361361 let wxToClaimUserNew = $t01714917261._1
362362 let integralSTATE = $t01714917261._2
363363 let debug = $t01714917261._3
364364 let availableToClaim = (wxToClaimUserNew - claimedByUser)
365365 $Tuple2(nil, makeString(["%s%s%d%d%s", lpAssetIdStr, userAddressStr, toString(availableToClaim), toString(claimedByUser), ((debug + "::") + toString(userWxReward))], SEP))
366366 }
367367
368368

github/deemru/w8io/873ac7e 
113.61 ms