tx · Fz8XGheAiqPy5iQSzyAZibArWH7mqsxfC91NZ4Xy29vc

3MuGfNhF98CNBCfthhoJEo6SYUv7zTgkK4J:  -0.01400000 Waves

2022.03.24 09:26 [1977639] smart account 3MuGfNhF98CNBCfthhoJEo6SYUv7zTgkK4J > SELF 0.00000000 Waves

{ "type": 13, "id": "Fz8XGheAiqPy5iQSzyAZibArWH7mqsxfC91NZ4Xy29vc", "fee": 1400000, "feeAssetId": null, "timestamp": 1648103223603, "version": 1, "sender": "3MuGfNhF98CNBCfthhoJEo6SYUv7zTgkK4J", "senderPublicKey": "4DthuG3xjZV9WtZ34Y66AummdAr67wRzwWsVQL4y2bob", "proofs": [ "5tP9bLKVZyyaRcKeLMiEscoHTM5rCd7GWNfKFtexHvHa4RG3i1tWFAhKikQwYucFmr1HoecThD1FfZpxWJfi9ea3" ], "script": "base64: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AaQAAAABCAUAAAAJbGFzdEJsb2NrAAAABmhlaWdodAkABEwAAAACCQABpAAAAAEIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wCQAETAAAAAIJAAGkAAAAAQUAAAAJb2xkQW1vdW50CQAETAAAAAIJAAGkAAAAAQUAAAAIb2xkU3RhcnQJAARMAAAAAgkAAaQAAAABBQAAAAluZXdBbW91bnQJAARMAAAAAgkAAaQAAAABBQAAAAhuZXdTdGFydAUAAAADbmlsBQAAAAlzZXBhcmF0b3IBAAAAGGZvcm1hdENsYWltSGlzdG9yeVJlY29yZAAAAAIAAAAEdXNlcgAAAA5jbGFpbWVkUmV3YXJkcwkABLkAAAACCQAETAAAAAICAAAACCVzJWQlZCVzCQAETAAAAAIFAAAABHVzZXIJAARMAAAAAgkAAaQAAAABCAUAAAAJbGFzdEJsb2NrAAAABmhlaWdodAkABEwAAAACCQABpAAAAAEIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wCQAETAAAAAIFAAAADmNsYWltZWRSZXdhcmRzBQAAAANuaWwFAAAACXNlcGFyYXRvcgEAAAASSGlzdG9yeVJlY29yZEVudHJ5AAAABwAAAAR0eXBlAAAAC3VzZXJBZGRyZXNzAAAABHR4SWQAAAAJb2xkQW1vdW50AAAACG9sZFN0YXJ0AAAACW5ld0Ftb3VudAAAAAhuZXdTdGFydAkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEGtleUhpc3RvcnlSZWNvcmQAAAADBQAAAAR0eXBlBQAAAAt1c2VyQWRkcmVzcwUAAAAEdHhJZAkBAAAAE2Zvcm1hdEhpc3RvcnlSZWNvcmQAAAAEBQAAAAlvbGRBbW91bnQFAAAACG9sZFN0YXJ0BQAAAAluZXdBbW91bnQFAAAACG5ld1N0YXJ0AQAAABFDbGFpbUhpc3RvcnlFbnRyeQAAAAMAAAALdXNlckFkZHJlc3MAAAAEdHhJZAAAAA5jbGFpbWVkUmV3YXJkcwkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEGtleUhpc3RvcnlSZWNvcmQAAAADAgAAAAVjbGFpbQUAAAALdXNlckFkZHJlc3MFAAAABHR4SWQJAQAAABhmb3JtYXRDbGFpbUhpc3RvcnlSZWNvcmQAAAACCQAEJQAAAAEFAAAAC3VzZXJBZGRyZXNzBQAAAA5jbGFpbWVkUmV3YXJkcwEAAAALU3RhdHNSZXN1bHQAAAADAAAADnRvdGFsTG9ja2VkSW5jAAAADGxvY2tDb3VudEluYwAAAA11c2Vyc0NvdW50SW5jBAAAAApsb2Nrc0NvdW50CQEAAAAMZ2V0SW50T3JaZXJvAAAAAQkBAAAAEmtleVN0YXRzTG9ja3NDb3VudAAAAAAEAAAACnVzZXJzQ291bnQJAQAAAAxnZXRJbnRPclplcm8AAAABCQEAAAASa2V5U3RhdHNVc2Vyc0NvdW50AAAAAAQAAAALdG90YWxBbW91bnQJAQAAAAxnZXRJbnRPclplcm8AAAABCQEAAAAXa2V5TG9ja1BhcmFtVG90YWxBbW91bnQAAAAABAAAAA50b3RhbEFtb3VudE5ldwkAAGQAAAACBQAAAAt0b3RhbEFtb3VudAUAAAAOdG90YWxMb2NrZWRJbmMJAAUVAAAAAwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAEmtleVN0YXRzTG9ja3NDb3VudAAAAAAJAABkAAAAAgUAAAAKbG9ja3NDb3VudAUAAAAMbG9ja0NvdW50SW5jCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAASa2V5U3RhdHNVc2Vyc0NvdW50AAAAAAkAAGQAAAACBQAAAAp1c2Vyc0NvdW50BQAAAA11c2Vyc0NvdW50SW5jCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAXa2V5TG9ja1BhcmFtVG90YWxBbW91bnQAAAAABQAAAA50b3RhbEFtb3VudE5ldwUAAAADbmlsBQAAAAt0b3RhbEFtb3VudAUAAAAOdG90YWxBbW91bnROZXcBAAAAD0xvY2tQYXJhbXNFbnRyeQAAAAMAAAALdXNlckFkZHJlc3MAAAAGYW1vdW50AAAABXN0YXJ0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAWa2V5TG9ja1BhcmFtVXNlckFtb3VudAAAAAEFAAAAC3VzZXJBZGRyZXNzBQAAAAZhbW91bnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABZrZXlMb2NrUGFyYW1TdGFydEJsb2NrAAAAAQUAAAALdXNlckFkZHJlc3MFAAAABXN0YXJ0BQAAAANuaWwBAAAAD2dldFBhcmFtc09yRmFpbAAAAAAEAAAAEG5ldXRyaW5vQ29udHJhY3QJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEJAQAAAA9nZXRTdHJpbmdPckZhaWwAAAABCQEAAAAaa2V5TmV1dHJpbm9Db250cmFjdEFkZHJlc3MAAAAACQAFFgAAAAQJAAJZAAAAAQkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAkBAAAAGWtleUF1Y3Rpb25Db250cmFjdEFkZHJlc3MAAAAACQACWQAAAAEJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QJAQAAAAxrZXlCb25kQXNzZXQAAAAACQEAAAAMZ2V0SW50T3JGYWlsAAAAAQkBAAAAEGtleU1pbkxvY2tBbW91bnQAAAAACQEAAAAMZ2V0SW50T3JGYWlsAAAAAQkBAAAAC2tleUhhbGZMaWZlAAAAAAEAAAAMaXNBY3RpdmVVc2VyAAAAAQAAAAt1c2VyQWRkcmVzcwkAAGYAAAACCQEAAAAMZ2V0SW50T3JFbHNlAAAAAgkBAAAAFmtleUxvY2tQYXJhbVVzZXJBbW91bnQAAAABBQAAAAt1c2VyQWRkcmVzcwAAAAAAAAAAAAAAAAAAAAAAAAEAAAATZ2V0VXNlclBhcmFtc09yVW5pdAAAAAEAAAALdXNlckFkZHJlc3MDCQEAAAAMaXNBY3RpdmVVc2VyAAAAAQUAAAALdXNlckFkZHJlc3MJAAUVAAAAAwcJAQAAAAxnZXRJbnRPckZhaWwAAAABCQEAAAAWa2V5TG9ja1BhcmFtVXNlckFtb3VudAAAAAEFAAAAC3VzZXJBZGRyZXNzCQEAAAAMZ2V0SW50T3JGYWlsAAAAAQkBAAAAFmtleUxvY2tQYXJhbVN0YXJ0QmxvY2sAAAABBQAAAAt1c2VyQWRkcmVzcwUAAAAEdW5pdAEAAAATZ2V0VXNlclBhcmFtc09yRmFpbAAAAAEAAAALdXNlckFkZHJlc3MJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkBAAAAE2dldFVzZXJQYXJhbXNPclVuaXQAAAABBQAAAAt1c2VyQWRkcmVzcwkAASwAAAACCQABLAAAAAICAAAABVVzZXIgCQAEJQAAAAEFAAAAC3VzZXJBZGRyZXNzAgAAAA8gaXMgbm90IGRlZmluZWQAAAAAEnN1cHBvcnRlZEFzc2V0c1N0cgkBAAAADGdldFN0ck9yRWxzZQAAAAIJAQAAABhrZXlTdXBwb3J0ZWRSZXdhcmRBc3NldHMAAAAAAgAAAAAAAAAAE3N1cHBvcnRlZEFzc2V0c0xpc3QJAAS1AAAAAgUAAAASc3VwcG9ydGVkQXNzZXRzU3RyAgAAAAFfAQAAAApjYWxjUmV3YXJkAAAABQAAAAt1c2VyQWRkcmVzcwAAAAdhc3NldElkAAAADXN0YWtlZEFtb3VudFgAAAAOZGVwb3NpdE51bVVzZXIAAAAOZGVwb3NpdE51bUxhc3QEAAAAF3Jld2FyZFBlck5zYnRTdW1MYXN0S0VZCQEAAAAVa2V5UmV3YXJkUGVyTnNidFN1bUF0AAAAAgUAAAAOZGVwb3NpdE51bUxhc3QFAAAAB2Fzc2V0SWQEAAAACnN1bUxhc3RYMTgJAAGnAAAAAQkBAAAADGdldFN0ck9yRWxzZQAAAAIJAQAAABVrZXlSZXdhcmRQZXJOc2J0U3VtQXQAAAACBQAAAA5kZXBvc2l0TnVtTGFzdAUAAAAHYXNzZXRJZAIAAAABMAQAAAAKc3VtVXNlclgxOAkAAacAAAABCQEAAAAMZ2V0U3RyT3JFbHNlAAAAAgkBAAAAFWtleVJld2FyZFBlck5zYnRTdW1BdAAAAAIFAAAADmRlcG9zaXROdW1Vc2VyBQAAAAdhc3NldElkAgAAAAEwBAAAABFyZXdhcmREeW5hbWljUGFydAkAAaAAAAABCQABPAAAAAMJAAE4AAAAAgUAAAAKc3VtTGFzdFgxOAUAAAAKc3VtVXNlclgxOAUAAAANc3Rha2VkQW1vdW50WAUAAAAHTVVMVFgxOAQAAAATcmV3YXJkQ2FjaGVkUGFydEtFWQkBAAAACWtleVJld2FyZAAAAAIFAAAAC3VzZXJBZGRyZXNzBQAAAAdhc3NldElkBAAAABByZXdhcmRDYWNoZWRQYXJ0CQEAAAAMZ2V0SW50T3JFbHNlAAAAAgUAAAATcmV3YXJkQ2FjaGVkUGFydEtFWQAAAAAAAAAAAAkABRYAAAAECQAAZAAAAAIFAAAAEHJld2FyZENhY2hlZFBhcnQFAAAAEXJld2FyZER5bmFtaWNQYXJ0BQAAABByZXdhcmRDYWNoZWRQYXJ0BQAAABFyZXdhcmREeW5hbWljUGFydAUAAAATcmV3YXJkQ2FjaGVkUGFydEtFWQEAAAANUmV3YXJkRW50cmllcwAAAAMAAAAJaXNOZXdVc2VyAAAAC3VzZXJBZGRyZXNzAAAADHN0YWtlZEFtb3VudAQAAAANc3Rha2VkQW1vdW50WAkAATYAAAABBQAAAAxzdGFrZWRBbW91bnQEAAAAG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQkBAAAAG2tleVVzZXJSZXdhcmRGcm9tRGVwb3NpdE51bQAAAAEFAAAAC3VzZXJBZGRyZXNzBAAAAA5kZXBvc2l0TnVtVXNlcgkBAAAADGdldEludE9yRWxzZQAAAAIFAAAAG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQD//////////wQAAAAOZGVwb3NpdE51bUxhc3QJAQAAAAxnZXRJbnRPckVsc2UAAAACCQEAAAARa2V5RGVwb3NpdE51bUxhc3QAAAAAAP//////////CgEAAAAbZm9yRWFjaEFzc2V0Q2FjaGVVc2VyUmV3YXJkAAAAAgAAAAVhY2N1bQAAAAVhc3NldAQAAAALJHQwNzM1OTc0OTQJAQAAAApjYWxjUmV3YXJkAAAABQUAAAALdXNlckFkZHJlc3MFAAAABWFzc2V0BQAAAA1zdGFrZWRBbW91bnRYBQAAAA5kZXBvc2l0TnVtVXNlcgUAAAAOZGVwb3NpdE51bUxhc3QEAAAAC3Jld2FyZFRvdGFsCAUAAAALJHQwNzM1OTc0OTQAAAACXzEEAAAABmNhY2hlZAgFAAAACyR0MDczNTk3NDk0AAAAAl8yBAAAAAdkeW5hbWljCAUAAAALJHQwNzM1OTc0OTQAAAACXzMEAAAAE3Jld2FyZENhY2hlZFBhcnRLRVkIBQAAAAskdDA3MzU5NzQ5NAAAAAJfNAkABE0AAAACBQAAAAVhY2N1bQkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAE3Jld2FyZENhY2hlZFBhcnRLRVkFAAAAC3Jld2FyZFRvdGFsAwMJAAAAAAAAAgUAAAAOZGVwb3NpdE51bUxhc3QA//////////8JAAAAAAAAAgUAAAAOZGVwb3NpdE51bVVzZXIA//////////8HBQAAAANuaWwDAwkAAAAAAAACBQAAAA5kZXBvc2l0TnVtTGFzdAD//////////wkAAGYAAAACBQAAAA5kZXBvc2l0TnVtVXNlcgD//////////wcJAAACAAAAAQIAAAAvaW52YWxpZCBkZXBvc2l0TnVtTGFzdCBhbmQgZGVwb3NpdE51bVVzZXIgc3RhdGUDAwkAAGYAAAACBQAAAA5kZXBvc2l0TnVtTGFzdAD//////////wkAAAAAAAACBQAAAA5kZXBvc2l0TnVtVXNlcgD//////////wcDBQAAAAlpc05ld1VzZXIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQUAAAAOZGVwb3NpdE51bUxhc3QFAAAAA25pbAkABE0AAAACCgAAAAACJGwFAAAAE3N1cHBvcnRlZEFzc2V0c0xpc3QKAAAAAAIkcwkAAZAAAAABBQAAAAIkbAoAAAAABSRhY2MwBQAAAANuaWwKAQAAAAUkZjBfMQAAAAIAAAACJGEAAAACJGkDCQAAZwAAAAIFAAAAAiRpBQAAAAIkcwUAAAACJGEJAQAAABtmb3JFYWNoQXNzZXRDYWNoZVVzZXJSZXdhcmQAAAACBQAAAAIkYQkAAZEAAAACBQAAAAIkbAUAAAACJGkKAQAAAAUkZjBfMgAAAAIAAAACJGEAAAACJGkDCQAAZwAAAAIFAAAAAiRpBQAAAAIkcwUAAAACJGEJAAACAAAAAQIAAAAUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQAAAAUkZjBfMgAAAAIJAQAAAAUkZjBfMQAAAAIJAQAAAAUkZjBfMQAAAAIJAQAAAAUkZjBfMQAAAAIJAQAAAAUkZjBfMQAAAAIJAQAAAAUkZjBfMQAAAAIJAQAAAAUkZjBfMQAAAAIJAQAAAAUkZjBfMQAAAAIJAQAAAAUkZjBfMQAAAAIJAQAAAAUkZjBfMQAAAAIJAQAAAAUkZjBfMQAAAAIFAAAABSRhY2MwAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAACAAAAAAAAAAADAAAAAAAAAAAEAAAAAAAAAAAFAAAAAAAAAAAGAAAAAAAAAAAHAAAAAAAAAAAIAAAAAAAAAAAJAAAAAAAAAAAKCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAbdXNlclJld2FyZEZyb21EZXBvc2l0TnVtS0VZBQAAAA5kZXBvc2l0TnVtTGFzdAMDCQAAZgAAAAIFAAAADmRlcG9zaXROdW1MYXN0AP//////////CQAAZgAAAAIFAAAADmRlcG9zaXROdW1Vc2VyAP//////////BwMFAAAACWlzTmV3VXNlcgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAbdXNlclJld2FyZEZyb21EZXBvc2l0TnVtS0VZBQAAAA5kZXBvc2l0TnVtTGFzdAUAAAADbmlsCQAETQAAAAIKAAAAAAIkbAUAAAATc3VwcG9ydGVkQXNzZXRzTGlzdAoAAAAAAiRzCQABkAAAAAEFAAAAAiRsCgAAAAAFJGFjYzAFAAAAA25pbAoBAAAABSRmMF8xAAAAAgAAAAIkYQAAAAIkaQMJAABnAAAAAgUAAAACJGkFAAAAAiRzBQAAAAIkYQkBAAAAG2ZvckVhY2hBc3NldENhY2hlVXNlclJld2FyZAAAAAIFAAAAAiRhCQABkQAAAAIFAAAAAiRsBQAAAAIkaQoBAAAABSRmMF8yAAAAAgAAAAIkYQAAAAIkaQMJAABnAAAAAgUAAAACJGkFAAAAAiRzBQAAAAIkYQkAAAIAAAABAgAAABRMaXN0IHNpemUgZXhjZWVkcyAxMAkBAAAABSRmMF8yAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgUAAAAFJGFjYzAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAIAAAAAAAAAAAMAAAAAAAAAAAQAAAAAAAAAAAUAAAAAAAAAAAYAAAAAAAAAAAcAAAAAAAAAAAgAAAAAAAAAAAkAAAAAAAAAAAoJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABt1c2VyUmV3YXJkRnJvbURlcG9zaXROdW1LRVkFAAAADmRlcG9zaXROdW1MYXN0CQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAJHVuY292ZXJlZCBjb25kaXRpb246IGRlcG9zaXROdW1MYXN0PQkAAaQAAAABBQAAAA5kZXBvc2l0TnVtTGFzdAIAAAAQIGRlcG9zaXROdW1Vc2VyPQkAAaQAAAABBQAAAA5kZXBvc2l0TnVtVXNlcgEAAAAiSW5jcmVtZW50Tm90RGlzdHJpYnV0ZWRSZXdhcmRFbnRyeQAAAAIAAAADdGtuAAAACWFtb3VudEluYwQAAAAXbm90RGlzdHJpYnV0ZWRSZXdhcmRLRVkJAQAAABdrZXlOb3REaXN0cmlidXRlZFJld2FyZAAAAAEFAAAAA3RrbgQAAAAUbm90RGlzdHJpYnV0ZWRSZXdhcmQJAQAAAAxnZXRJbnRPckVsc2UAAAACBQAAABdub3REaXN0cmlidXRlZFJld2FyZEtFWQAAAAAAAAAAAAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAXbm90RGlzdHJpYnV0ZWRSZXdhcmRLRVkJAABkAAAAAgUAAAAUbm90RGlzdHJpYnV0ZWRSZXdhcmQFAAAACWFtb3VudEluYwUAAAADbmlsAAAABwAAAAFpAQAAAAtjb25zdHJ1Y3RvcgAAAAUAAAAXbmV1dHJpbm9Db250cmFjdEFkZHJlc3MAAAATbWF0aENvbnRyYWN0QWRkcmVzcwAAAA1taW5Mb2NrQW1vdW50AAAACGhhbGZMaWZlAAAAFXN1cHBvcnRlZFJld2FyZEFzc2V0cwMJAQAAAAIhPQAAAAIIBQAAAAFpAAAABmNhbGxlcgUAAAAEdGhpcwkAAAIAAAABAgAAABFQZXJtaXNzaW9uIGRlbmllZAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAaa2V5TmV1dHJpbm9Db250cmFjdEFkZHJlc3MAAAAABQAAABduZXV0cmlub0NvbnRyYWN0QWRkcmVzcwkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAWa2V5TWF0aENvbnRyYWN0QWRkcmVzcwAAAAAFAAAAE21hdGhDb250cmFjdEFkZHJlc3MJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABBrZXlNaW5Mb2NrQW1vdW50AAAAAAUAAAANbWluTG9ja0Ftb3VudAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAC2tleUhhbGZMaWZlAAAAAAUAAAAIaGFsZkxpZmUJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAGGtleVN1cHBvcnRlZFJld2FyZEFzc2V0cwAAAAAFAAAAFXN1cHBvcnRlZFJld2FyZEFzc2V0cwUAAAADbmlsAAAAAWkBAAAABXN0YWtlAAAAAAQAAAANJHQwMTExNDgxMTIyNwkBAAAAD2dldFBhcmFtc09yRmFpbAAAAAAEAAAAD2F1Y3Rpb25Db250cmFjdAgFAAAADSR0MDExMTQ4MTEyMjcAAAACXzEEAAAAC2JvbmRBc3NldElkCAUAAAANJHQwMTExNDgxMTIyNwAAAAJfMgQAAAANbWluTG9ja0Ftb3VudAgFAAAADSR0MDExMTQ4MTEyMjcAAAACXzMEAAAACGhhbGZMaWZlCAUAAAANJHQwMTExNDgxMTIyNwAAAAJfNAMJAQAAAAIhPQAAAAIJAAGQAAAAAQgFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEJAAACAAAAAQIAAAAVSW52YWxpZCBwYXltZW50cyBzaXplBAAAAAdwYXltZW50CQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAABAAAAAZhbW91bnQIBQAAAAdwYXltZW50AAAABmFtb3VudAQAAAATaW52YWxpZEFzc2V0TWVzc2FnZQkAASwAAAACCQABLAAAAAICAAAAD0ludmFsaWQgYXNzZXQuIAkAAlgAAAABBQAAAAtib25kQXNzZXRJZAIAAAAMIGlzIGV4cGVjdGVkBAAAAAdhc3NldElkCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIIBQAAAAdwYXltZW50AAAAB2Fzc2V0SWQFAAAAE2ludmFsaWRBc3NldE1lc3NhZ2UDCQEAAAACIT0AAAACBQAAAAdhc3NldElkBQAAAAtib25kQXNzZXRJZAkAAAIAAAABBQAAABNpbnZhbGlkQXNzZXRNZXNzYWdlBAAAAAt1c2VyQWRkcmVzcwgFAAAAAWkAAAAGY2FsbGVyBAAAAA51c2VyQWRkcmVzc1N0cgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAADSR0MDExNzY5MTE4NzYJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAQAAABNnZXRVc2VyUGFyYW1zT3JVbml0AAAAAQUAAAALdXNlckFkZHJlc3MJAAUVAAAAAwYAAAAAAAAAAAAA//////////8EAAAACWlzTmV3VXNlcggFAAAADSR0MDExNzY5MTE4NzYAAAACXzEEAAAACmxvY2tBbW91bnQIBQAAAA0kdDAxMTc2OTExODc2AAAAAl8yBAAAAA9sb2NrU3RhcnRIZWlnaHQIBQAAAA0kdDAxMTc2OTExODc2AAAAAl8zBAAAAAxtZXJnZWRBbW91bnQDBQAAAAlpc05ld1VzZXIFAAAABmFtb3VudAkAAGQAAAACBQAAAAZhbW91bnQFAAAACmxvY2tBbW91bnQEAAAAEW1lcmdlZFN0YXJ0SGVpZ2h0AwUAAAAJaXNOZXdVc2VyBQAAAAZoZWlnaHQEAAAADG1hdGhDb250cmFjdAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAEJAQAAABZrZXlNYXRoQ29udHJhY3RBZGRyZXNzAAAAAAkBAAAABWFzSW50AAAAAQkAA/wAAAAEBQAAAAxtYXRoQ29udHJhY3QCAAAAE21lcmdlU3Rha2VzUkVBRE9OTFkJAARMAAAAAgUAAAAGYW1vdW50CQAETAAAAAIFAAAABmhlaWdodAkABEwAAAACBQAAAApsb2NrQW1vdW50CQAETAAAAAIFAAAAD2xvY2tTdGFydEhlaWdodAkABEwAAAACBQAAAAhoYWxmTGlmZQUAAAADbmlsBQAAAANuaWwDCQAAZgAAAAIFAAAADW1pbkxvY2tBbW91bnQFAAAADG1lcmdlZEFtb3VudAkAAAIAAAABCQABLAAAAAICAAAAE01pbiBsb2NrIGFtb3VudCBpcyAJAAGkAAAAAQUAAAANbWluTG9ja0Ftb3VudAQAAAANJHQwMTIzMjYxMjQyOAkBAAAAC1N0YXRzUmVzdWx0AAAAAwUAAAAGYW1vdW50AAAAAAAAAAABAwUAAAAJaXNOZXdVc2VyAAAAAAAAAAABAAAAAAAAAAAABAAAAAxzdGF0c0VudHJpZXMIBQAAAA0kdDAxMjMyNjEyNDI4AAAAAl8xBAAAAAt0b3RhbFN0YWtlZAgFAAAADSR0MDEyMzI2MTI0MjgAAAACXzIEAAAADnRvdGFsU3Rha2VkTmV3CAUAAAANJHQwMTIzMjYxMjQyOAAAAAJfMwkABE4AAAACCQAETgAAAAIJAAROAAAAAgkABEwAAAACCQEAAAASSGlzdG9yeVJlY29yZEVudHJ5AAAABwIAAAAFc3Rha2UFAAAAC3VzZXJBZGRyZXNzCAUAAAABaQAAAA10cmFuc2FjdGlvbklkBQAAAApsb2NrQW1vdW50BQAAAA9sb2NrU3RhcnRIZWlnaHQFAAAADG1lcmdlZEFtb3VudAUAAAARbWVyZ2VkU3RhcnRIZWlnaHQFAAAAA25pbAkBAAAADVJld2FyZEVudHJpZXMAAAADBQAAAAlpc05ld1VzZXIFAAAADnVzZXJBZGRyZXNzU3RyBQAAAApsb2NrQW1vdW50CQEAAAAPTG9ja1BhcmFtc0VudHJ5AAAAAwUAAAALdXNlckFkZHJlc3MFAAAADG1lcmdlZEFtb3VudAUAAAARbWVyZ2VkU3RhcnRIZWlnaHQFAAAADHN0YXRzRW50cmllcwAAAAFpAQAAAAd1bnN0YWtlAAAAAQAAAAZhbW91bnQDCQEAAAACIT0AAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAACQAAAgAAAAECAAAAI3Vuc3Rha2UgZG9lc24ndCByZXF1aXJlIGFueSBwYXltZW50BAAAAAt1c2VyQWRkcmVzcwgFAAAAAWkAAAAGY2FsbGVyBAAAAA51c2VyQWRkcmVzc1N0cgkABCUAAAABBQAAAAt1c2VyQWRkcmVzcwQAAAANJHQwMTI5MTQxMjk5MgkBAAAAD2dldFBhcmFtc09yRmFpbAAAAAAEAAAADmF1Y3Rpb25BZGRyZXNzCAUAAAANJHQwMTI5MTQxMjk5MgAAAAJfMQQAAAALYm9uZEFzc2V0SWQIBQAAAA0kdDAxMjkxNDEyOTkyAAAAAl8yBAAAAA1taW5Mb2NrQW1vdW50CAUAAAAN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dWVPckVsc2UAAAACCAUAAAADcG10AAAAB2Fzc2V0SWQFAAAAB1dBVkVTSUQEAAAADXBtdEFzc2V0SWRTdHIJAAJYAAAAAQUAAAAKcG10QXNzZXRJZAQAAAAIcG10TXVsdFgDCQAAAAAAAAIFAAAACnBtdEFzc2V0SWQFAAAAB1dBVkVTSUQFAAAABk1VTFRYOAUAAAAGTVVMVFg2BAAAAAdhbW91bnRYCQABNgAAAAEFAAAABmFtb3VudAQAAAALdG90YWxTdGFrZWQJAQAAAAxnZXRJbnRPckVsc2UAAAACCQEAAAAXa2V5TG9ja1BhcmFtVG90YWxBbW91bnQAAAAAAAAAAAAAAAAABAAAAAx0b3RhbFN0YWtlZFgJAAE2AAAAAQUAAAALdG90YWxTdGFrZWQDCQAAZgAAAAIAAAAAAAAAAAAFAAAAC3RvdGFsU3Rha2VkCQAAAgAAAAECAAAAG1RPRE86IGNhc2UgaXMgbm90IHN1cHBvcnRlZAMJAAAAAAAAAgUAAAALdG90YWxTdGFrZWQAAAAAAAAAAAAJAQAAACJJbmNyZW1lbnROb3REaXN0cmlidXRlZFJld2FyZEVudHJ5AAAAAgUAAAANcG10QXNzZXRJZFN0cgUAAAAGYW1vdW50BAAAABByZXdhcmRQZXJOc2J0WDE4CQABPAAAAAMFAAAAB2Ftb3VudFgFAAAAB01VTFRYMTgFAAAADHRvdGFsU3Rha2VkWAQAAAARZGVwb3NpdE51bUxhc3RLRVkJAQAAABFrZXlEZXBvc2l0TnVtTGFzdAAAAAAEAAAADmRlcG9zaXROdW1MYXN0CQEAAAAMZ2V0SW50T3JFbHNlAAAAAgUAAAARZGVwb3NpdE51bUxhc3RLRVkA//////////8EAAAADWRlcG9zaXROdW1OZXcJAABkAAAAAgUAAAAOZGVwb3NpdE51bUxhc3QAAAAAAAAAAAEDCQEAAAABIQAAAAEJAQAAAAhjb250YWlucwAAAAIFAAAAEnN1cHBvcnRlZEFzc2V0c1N0cgUAAAANcG10QXNzZXRJZFN0cgkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgUAAAASc3VwcG9ydGVkQXNzZXRzU3RyAgAAABEgZG9lc24ndCBjb250YWluIAUAAAANcG10QXNzZXRJZFN0cgoBAAAAF3Jl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AAD//////////woBAAAAH2ZvckVhY2hBc3NldENhbGNVbmNsYWltZWRSZXdhcmQAAAACAAAABWFjY3VtAAAABWFzc2V0BAAAAA0kdDAxNjM1NjE2NDk0CQEAAAAKY2FsY1Jld2FyZAAAAAUFAAAADnVzZXJBZGRyZXNzU3RyBQAAAAVhc3NldAUAAAANc3Rha2VkQW1vdW50WAUAAAAOZGVwb3NpdE51bVVzZXIFAAAADmRlcG9zaXROdW1MYXN0BAAAAAtyZXdhcmRUb3RhbAgFAAAADSR0MDE2MzU2MTY0OTQAAAACXzEEAAAABmNhY2hlZAgFAAAADSR0MDE2MzU2MTY0OTQAAAACXzIEAAAAB2R5bmFtaWMIBQAAAA0kdDAxNjM1NjE2NDk0AAAAAl8zBAAAABNyZXdhcmRDYWNoZWRQYXJ0S0VZCAUAAAANJHQwMTYzNTYxNjQ5NAAAAAJfNAQAAAAKY2xhaW1lZEtFWQkBAAAACmtleUNsYWltZWQAAAACBQAAAA51c2VyQWRkcmVzc1N0cgUAAAAFYXNzZXQEAAAADSR0MDE2NTU0MTY1OTEFAAAABWFjY3VtBAAAAARkYXRhCAUAAAANJHQwMTY1NTQxNjU5MQAAAAJfMQQAAAARY2xhaW1lZEFtdEJ5QXNzZXQIBQAAAA0kdDAxNjU1NDE2NTkxAAAAAl8yBAAAAAduZXdQYXJ0CQAEuQAAAAIJAARMAAAAAgUAAAAFYXNzZXQJAARMAAAAAgkAAaQAAAABBQAAAAtyZXdhcmRUb3RhbAUAAAADbmlsAgAAAAE6BAAAABRjbGFpbWVkQW10QnlBc3NldE5ldwkABLkAAAACCQAETAAAAAIFAAAAEWNsYWltZWRBbXRCeUFzc2V0CQAETAAAAAIFAAAAB25ld1BhcnQFAAAAA25pbAIAAAABXwMJAABnAAAAAgAAAAAAAAAAAAUAAAALcmV3YXJkVG90YWwJAAUUAAAAAgUAAAAEZGF0YQUAAAAUY2xhaW1lZEFtdEJ5QXNzZXROZXcJAAUUAAAAAgkABE0AAAACCQAETQAAAAIJAARNAAAAAgUAAAAEZGF0YQkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAALdXNlckFkZHJlc3MFAAAAC3Jld2FyZFRvdGFsCQEAAAALdG9Bc3NldFZlY3QA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BSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgUAAAAFJGFjYzAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAIAAAAAAAAAAAMAAAAAAAAAAAQAAAAAAAAAAAUAAAAAAAAAAAYAAAAAAAAAAAcAAAAAAAAAAAgAAAAAAAAAAAkAAAAAAAAAAAoEAAAAC3VzZXJBZGRyZXNzCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABBQAAAA51c2VyQWRkcmVzc1N0cgQAAAANJHQwMTc4MjQxNzkyOQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkBAAAAE2dldFVzZXJQYXJhbXNPclVuaXQAAAABBQAAAAt1c2VyQWRkcmVzcwkABRUAAAADBgAAAAAAAAAAAAAAAAAAAAAAAAQAAAAJaXNOZXdVc2VyCAUAAAANJHQwMTc4MjQxNzkyOQAAAAJfMQQAAAAMc3Rha2VkQW1vdW50CAUAAAANJHQwMTc4MjQxNzkyOQAAAAJfMgQAAAAMc3Rha2luZ1N0YXJ0CAUAAAANJHQwMTc4MjQxNzkyOQAAAAJfMwQAAAANc3Rha2VkQW1vdW50WAkAATYAAAABBQAAAAxzdGFrZWRBbW91bnQEAAAAG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQkBAAAAG2tleVVzZXJSZXdhcmRGcm9tRGVwb3NpdE51bQAAAAEFAAAADnVzZXJBZGRyZXNzU3RyBAAAAA5kZXBvc2l0TnVtVXNlcgkBAAAADGdldEludE9yRWxzZQAAAAIFAAAAG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQD//////////wQAAAAOZGVwb3NpdE51bUxhc3QJAQAAAAxnZXRJbnRPckVsc2UAAAACCQEAAAARa2V5RGVwb3NpdE51bUxhc3QAAAAAAP//////////CgEAAAAfZm9yRWFjaEFzc2V0Q2FsY1VuY2xhaW1lZFJld2FyZAAAAAIAAAAFYWNjdW0AAAAFYXNzZXQEAAAADSR0MDE4Mjc1MTg0MTMJAQAAAApjYWxjUmV3YXJkAAAABQUAAAAOdXNlckFkZHJlc3NTdHIFAAAA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", "chainId": 84, "height": 1977639, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: DH269kvVhknyaHD8irPkUJFpmN7AL2HoXCJizucjFngr Next: 6dE1gqpaf9zpKivoEwrQki2CfnyWWU8EdDSXpQKEPL6m Diff:
OldNewDifferences
7171 func keyReward (userAddress,tkn) = makeString(["%s%s%s", "rwd", userAddress, tkn], separator)
7272
7373
74+func keyClaimed (userAddress,tkn) = makeString(["%s%s%s", "clm", userAddress, tkn], separator)
75+
76+
7477 func keyNotDistributedReward (tkn) = makeString(["%s%s", "notDistributed", tkn], separator)
7578
7679
111114 func formatHistoryRecord (oldAmount,oldStart,newAmount,newStart) = makeString(["%d%d%d%d%d%d", toString(lastBlock.height), toString(lastBlock.timestamp), toString(oldAmount), toString(oldStart), toString(newAmount), toString(newStart)], separator)
112115
113116
117+func formatClaimHistoryRecord (user,claimedRewards) = makeString(["%s%d%d%s", user, toString(lastBlock.height), toString(lastBlock.timestamp), claimedRewards], separator)
118+
119+
114120 func HistoryRecordEntry (type,userAddress,txId,oldAmount,oldStart,newAmount,newStart) = StringEntry(keyHistoryRecord(type, userAddress, txId), formatHistoryRecord(oldAmount, oldStart, newAmount, newStart))
121+
122+
123+func ClaimHistoryEntry (userAddress,txId,claimedRewards) = StringEntry(keyHistoryRecord("claim", userAddress, txId), formatClaimHistoryRecord(toString(userAddress), claimedRewards))
115124
116125
117126 func StatsResult (totalLockedInc,lockCountInc,usersCountInc) = {
164173 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
165174 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
166175 func forEachAssetCacheUserReward (accum,asset) = {
167- let $t067986933 = calcReward(userAddress, asset, stakedAmountX, depositNumUser, depositNumLast)
168- let rewardTotal = $t067986933._1
169- let cached = $t067986933._2
170- let dynamic = $t067986933._3
171- let rewardCachedPartKEY = $t067986933._4
176+ let $t073597494 = calcReward(userAddress, asset, stakedAmountX, depositNumUser, depositNumLast)
177+ let rewardTotal = $t073597494._1
178+ let cached = $t073597494._2
179+ let dynamic = $t073597494._3
180+ let rewardCachedPartKEY = $t073597494._4
172181 (accum :+ IntegerEntry(rewardCachedPartKEY, rewardTotal))
173182 }
174183
185194 else false)
186195 then if (isNewUser)
187196 then [IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)]
188- else throw("isNewUser must not be false in 5 + 6 cases")
197+ else ({
198+ let $l = supportedAssetsList
199+ let $s = size($l)
200+ let $acc0 = nil
201+ func $f0_1 ($a,$i) = if (($i >= $s))
202+ then $a
203+ else forEachAssetCacheUserReward($a, $l[$i])
204+
205+ func $f0_2 ($a,$i) = if (($i >= $s))
206+ then $a
207+ else throw("List size exceeds 10")
208+
209+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
210+ } :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast))
189211 else if (if ((depositNumLast > -1))
190212 then (depositNumUser > -1)
191213 else false)
192214 then if (isNewUser)
193- then throw((((("invalid management for isNewUser=" + toString(isNewUser)) + " and depositNumUser=") + toString(depositNumUser)) + " during full unstake"))
215+ then [IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)]
194216 else ({
195217 let $l = supportedAssetsList
196218 let $s = size($l)
225247
226248 @Callable(i)
227249 func stake () = {
228- let $t01080310882 = getParamsOrFail()
229- let auctionContract = $t01080310882._1
230- let bondAssetId = $t01080310882._2
231- let minLockAmount = $t01080310882._3
232- let halfLife = $t01080310882._4
250+ let $t01114811227 = getParamsOrFail()
251+ let auctionContract = $t01114811227._1
252+ let bondAssetId = $t01114811227._2
253+ let minLockAmount = $t01114811227._3
254+ let halfLife = $t01114811227._4
233255 if ((size(i.payments) != 1))
234256 then throw("Invalid payments size")
235257 else {
242264 else {
243265 let userAddress = i.caller
244266 let userAddressStr = toString(i.caller)
245- let $t01142411531 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, -1))
246- let isNewUser = $t01142411531._1
247- let lockAmount = $t01142411531._2
248- let lockStartHeight = $t01142411531._3
267+ let $t01176911876 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, -1))
268+ let isNewUser = $t01176911876._1
269+ let lockAmount = $t01176911876._2
270+ let lockStartHeight = $t01176911876._3
249271 let mergedAmount = if (isNewUser)
250272 then amount
251273 else (amount + lockAmount)
258280 if ((minLockAmount > mergedAmount))
259281 then throw(("Min lock amount is " + toString(minLockAmount)))
260282 else {
261- let $t01198112083 = StatsResult(amount, 1, if (isNewUser)
283+ let $t01232612428 = StatsResult(amount, 1, if (isNewUser)
262284 then 1
263285 else 0)
264- let statsEntries = $t01198112083._1
265- let totalStaked = $t01198112083._2
266- let totalStakedNew = $t01198112083._3
286+ let statsEntries = $t01232612428._1
287+ let totalStaked = $t01232612428._2
288+ let totalStakedNew = $t01232612428._3
267289 ((([HistoryRecordEntry("stake", userAddress, i.transactionId, lockAmount, lockStartHeight, mergedAmount, mergedStartHeight)] ++ RewardEntries(isNewUser, userAddressStr, lockAmount)) ++ LockParamsEntry(userAddress, mergedAmount, mergedStartHeight)) ++ statsEntries)
268290 }
269291 }
278300 else {
279301 let userAddress = i.caller
280302 let userAddressStr = toString(userAddress)
281- let $t01256912647 = getParamsOrFail()
282- let auctionAddress = $t01256912647._1
283- let bondAssetId = $t01256912647._2
284- let minLockAmount = $t01256912647._3
285- let halfLife = $t01256912647._4
286- let $t01265012724 = getUserParamsOrFail(userAddress)
287- let isNewUser = $t01265012724._1
288- let lockAmount = $t01265012724._2
289- let lockStart = $t01265012724._3
303+ let $t01291412992 = getParamsOrFail()
304+ let auctionAddress = $t01291412992._1
305+ let bondAssetId = $t01291412992._2
306+ let minLockAmount = $t01291412992._3
307+ let halfLife = $t01291412992._4
308+ let $t01299513069 = getUserParamsOrFail(userAddress)
309+ let isNewUser = $t01299513069._1
310+ let lockAmount = $t01299513069._2
311+ let lockStart = $t01299513069._3
290312 if ((0 >= lockAmount))
291313 then throw("Nothing to unstake")
292314 else if ((amount > lockAmount))
294316 else {
295317 let mathContract = addressFromStringValue(getStringOrFail(keyMathContractAddress()))
296318 let comissionAmount = asInt(invoke(mathContract, "getUnstakeComissionAmountREADONLY", [amount, lockStart, halfLife], nil))
297- let $t01312513279 = StatsResult(-(amount), if ((amount == lockAmount))
319+ let $t01347013624 = StatsResult(-(amount), if ((amount == lockAmount))
298320 then -1
299321 else 0, if ((amount == lockAmount))
300322 then -1
301323 else 0)
302- let statsEntries = $t01312513279._1
303- let totalStaked = $t01312513279._2
304- let totalStakedNew = $t01312513279._3
324+ let statsEntries = $t01347013624._1
325+ let totalStaked = $t01347013624._2
326+ let totalStakedNew = $t01347013624._3
305327 ((([ScriptTransfer(userAddress, (amount - comissionAmount), bondAssetId), ScriptTransfer(Address(auctionAddress), comissionAmount, bondAssetId), HistoryRecordEntry("unstake", userAddress, i.transactionId, lockAmount, lockStart, (lockAmount - amount), lockStart)] ++ RewardEntries(false, userAddressStr, lockAmount)) ++ LockParamsEntry(userAddress, (lockAmount - amount), lockStart)) ++ statsEntries)
306328 }
307329 }
369391 if ((size(i.payments) > 0))
370392 then throw("payments are not accepted")
371393 else {
372- let $t01553515640 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
373- let isNewUser = $t01553515640._1
374- let stakedAmount = $t01553515640._2
375- let stakingStart = $t01553515640._3
394+ let $t01588015985 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
395+ let isNewUser = $t01588015985._1
396+ let stakedAmount = $t01588015985._2
397+ let stakingStart = $t01588015985._3
376398 let stakedAmountX = toBigInt(stakedAmount)
377399 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
378400 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
379401 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
380402 func forEachAssetCalcUnclaimedReward (accum,asset) = {
381- let $t01600116139 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
382- let rewardTotal = $t01600116139._1
383- let cached = $t01600116139._2
384- let dynamic = $t01600116139._3
385- let rewardCachedPartKEY = $t01600116139._4
403+ let $t01635616494 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
404+ let rewardTotal = $t01635616494._1
405+ let cached = $t01635616494._2
406+ let dynamic = $t01635616494._3
407+ let rewardCachedPartKEY = $t01635616494._4
408+ let claimedKEY = keyClaimed(userAddressStr, asset)
409+ let $t01655416591 = accum
410+ let data = $t01655416591._1
411+ let claimedAmtByAsset = $t01655416591._2
412+ let newPart = makeString([asset, toString(rewardTotal)], ":")
413+ let claimedAmtByAssetNew = makeString([claimedAmtByAsset, newPart], "_")
386414 if ((0 >= rewardTotal))
387- then accum
388- else ((accum :+ ScriptTransfer(userAddress, rewardTotal, toAssetVect(asset))) :+ IntegerEntry(rewardCachedPartKEY, 0))
415+ then $Tuple2(data, claimedAmtByAssetNew)
416+ else $Tuple2((((data :+ ScriptTransfer(userAddress, rewardTotal, toAssetVect(asset))) :+ IntegerEntry(claimedKEY, (valueOrElse(getInteger(claimedKEY), 0) + rewardTotal))) :+ IntegerEntry(rewardCachedPartKEY, 0)), claimedAmtByAssetNew)
389417 }
390418
391- let transfers = {
419+ let $t01705117165 = {
392420 let $l = supportedAssetsList
393421 let $s = size($l)
394- let $acc0 = nil
422+ let $acc0 = $Tuple2(nil, "")
395423 func $f0_1 ($a,$i) = if (($i >= $s))
396424 then $a
397425 else forEachAssetCalcUnclaimedReward($a, $l[$i])
402430
403431 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
404432 }
433+ let transfers = $t01705117165._1
434+ let claimedAmtByAssetResult = $t01705117165._2
405435 if ((0 >= size(transfers)))
406436 then throw("nothing to claim")
407- else (transfers :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast))
437+ else ((transfers :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)) :+ ClaimHistoryEntry(userAddress, i.transactionId, drop(claimedAmtByAssetResult, 1)))
408438 }
409439 }
410440
431461 }
432462 else {
433463 let userAddress = addressFromStringValue(userAddressStr)
434- let $t01696817073 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
435- let isNewUser = $t01696817073._1
436- let stakedAmount = $t01696817073._2
437- let stakingStart = $t01696817073._3
464+ let $t01782417929 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
465+ let isNewUser = $t01782417929._1
466+ let stakedAmount = $t01782417929._2
467+ let stakingStart = $t01782417929._3
438468 let stakedAmountX = toBigInt(stakedAmount)
439469 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
440470 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
441471 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
442472 func forEachAssetCalcUnclaimedReward (accum,asset) = {
443- let $t01741917557 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
444- let rewardTotal = $t01741917557._1
445- let cached = $t01741917557._2
446- let dynamic = $t01741917557._3
447- let rewardCachedPartKEY = $t01741917557._4
448- ((accum + makeString([asset, toString(rewardTotal), "0"], ":")) + "_")
473+ let $t01827518413 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
474+ let rewardTotal = $t01827518413._1
475+ let cached = $t01827518413._2
476+ let dynamic = $t01827518413._3
477+ let rewardCachedPartKEY = $t01827518413._4
478+ let claimed = valueOrElse(getInteger(keyClaimed(userAddressStr, asset)), 0)
479+ ((accum + makeString([asset, toString(rewardTotal), toString(claimed)], ":")) + "_")
449480 }
450481
451482 let $l = supportedAssetsList
473504 then $Tuple2(nil, [0, totalNsbtAmt, 0])
474505 else {
475506 let userAddress = toAddressOrFail(userAddressStr)
476- let $t01806418168 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
477- let isNewUser = $t01806418168._1
478- let userNsbtAmt = $t01806418168._2
479- let stakingStart = $t01806418168._3
507+ let $t01901719121 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
508+ let isNewUser = $t01901719121._1
509+ let userNsbtAmt = $t01901719121._2
510+ let stakingStart = $t01901719121._3
480511 $Tuple2(nil, [userNsbtAmt, totalNsbtAmt, stakingStart])
481512 }
482513 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let separator = "__"
55
66 let MULT6 = 1000000
77
88 let MULT8 = 100000000
99
1010 let MULTX6 = toBigInt(MULT6)
1111
1212 let MULTX8 = toBigInt(MULT8)
1313
1414 let MULTX18 = toBigInt(1000000000000000000)
1515
1616 let WAVESIDSTR = "WAVES"
1717
1818 let WAVESID = fromBase58String(WAVESIDSTR)
1919
2020 func keyBondAsset () = "bond_asset_id"
2121
2222
2323 func keyAuctionContractAddress () = "auction_contract"
2424
2525
2626 func keyNeutrinoContractAddress () = "%s__neutrinoContractAddress"
2727
2828
2929 func keyMathContractAddress () = "%s__mathContract"
3030
3131
3232 func keyMinLockAmount () = "%s__minLockAmount"
3333
3434
3535 func keyHalfLife () = "%s__halfLife"
3636
3737
3838 func keyLockParamUserAmount (userAddress) = makeString(["%s%s%s", "paramByUser", toString(userAddress), "amount"], separator)
3939
4040
4141 func keyLockParamStartBlock (userAddress) = makeString(["%s%s%s", "paramByUser", toString(userAddress), "start"], separator)
4242
4343
4444 func keyHistoryRecord (type,userAddress,txId) = makeString(["%s%s%s%s", "history", type, toString(userAddress), toBase58String(txId)], separator)
4545
4646
4747 func keyLockParamTotalAmount () = makeString(["%s%s", "stats", "activeTotalLocked"], separator)
4848
4949
5050 func keyStatsLocksCount () = makeString(["%s%s", "stats", "locksCount"], separator)
5151
5252
5353 func keyStatsUsersCount () = makeString(["%s%s", "stats", "activeUsersCount"], separator)
5454
5555
5656 func keyNextPeriod () = "%s__nextPeriod"
5757
5858
5959 func keySupportedRewardAssets () = "supportedRewardAssets"
6060
6161
6262 func keyDepositNumLast () = makeString(["%s%s%s", "dep", "lastNum"], separator)
6363
6464
6565 func keyUserRewardFromDepositNum (userAddress) = makeString(["%s%s%s", "userRwdFromDepNum", userAddress], separator)
6666
6767
6868 func keyRewardPerNsbtSumAt (depositNum,tkn) = makeString(["%s%d", "rwdPerNsbtSumByDepNum", toString(depositNum), tkn], separator)
6969
7070
7171 func keyReward (userAddress,tkn) = makeString(["%s%s%s", "rwd", userAddress, tkn], separator)
7272
7373
74+func keyClaimed (userAddress,tkn) = makeString(["%s%s%s", "clm", userAddress, tkn], separator)
75+
76+
7477 func keyNotDistributedReward (tkn) = makeString(["%s%s", "notDistributed", tkn], separator)
7578
7679
7780 func toX18 (origVal,origMult) = fraction(toBigInt(origVal), MULTX18, origMult)
7881
7982
8083 func getIntOrZero (key) = valueOrElse(getInteger(this, key), 0)
8184
8285
8386 func getIntOrElse (key,defaultVal) = valueOrElse(getInteger(this, key), defaultVal)
8487
8588
8689 func getIntOrFail (key) = valueOrErrorMessage(getInteger(this, key), (("Mandatory this." + key) + " is not defined"))
8790
8891
8992 func getStrOrElse (key,defaultVal) = valueOrElse(getString(this, key), defaultVal)
9093
9194
9295 func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), (("Mandatory this." + key) + " is not defined"))
9396
9497
9598 func toAddressOrFail (addressStr) = valueOrErrorMessage(addressFromString(addressStr), ("couldn't parse passed addressStr=" + addressStr))
9699
97100
98101 func toAssetVect (assetStr) = if ((assetStr == WAVESIDSTR))
99102 then unit
100103 else fromBase58String(assetStr)
101104
102105
103106 func asInt (val) = match val {
104107 case valInt: Int =>
105108 valInt
106109 case _ =>
107110 throw("fail to cast into Int")
108111 }
109112
110113
111114 func formatHistoryRecord (oldAmount,oldStart,newAmount,newStart) = makeString(["%d%d%d%d%d%d", toString(lastBlock.height), toString(lastBlock.timestamp), toString(oldAmount), toString(oldStart), toString(newAmount), toString(newStart)], separator)
112115
113116
117+func formatClaimHistoryRecord (user,claimedRewards) = makeString(["%s%d%d%s", user, toString(lastBlock.height), toString(lastBlock.timestamp), claimedRewards], separator)
118+
119+
114120 func HistoryRecordEntry (type,userAddress,txId,oldAmount,oldStart,newAmount,newStart) = StringEntry(keyHistoryRecord(type, userAddress, txId), formatHistoryRecord(oldAmount, oldStart, newAmount, newStart))
121+
122+
123+func ClaimHistoryEntry (userAddress,txId,claimedRewards) = StringEntry(keyHistoryRecord("claim", userAddress, txId), formatClaimHistoryRecord(toString(userAddress), claimedRewards))
115124
116125
117126 func StatsResult (totalLockedInc,lockCountInc,usersCountInc) = {
118127 let locksCount = getIntOrZero(keyStatsLocksCount())
119128 let usersCount = getIntOrZero(keyStatsUsersCount())
120129 let totalAmount = getIntOrZero(keyLockParamTotalAmount())
121130 let totalAmountNew = (totalAmount + totalLockedInc)
122131 $Tuple3([IntegerEntry(keyStatsLocksCount(), (locksCount + lockCountInc)), IntegerEntry(keyStatsUsersCount(), (usersCount + usersCountInc)), IntegerEntry(keyLockParamTotalAmount(), totalAmountNew)], totalAmount, totalAmountNew)
123132 }
124133
125134
126135 func LockParamsEntry (userAddress,amount,start) = [IntegerEntry(keyLockParamUserAmount(userAddress), amount), IntegerEntry(keyLockParamStartBlock(userAddress), start)]
127136
128137
129138 func getParamsOrFail () = {
130139 let neutrinoContract = addressFromStringValue(getStringOrFail(keyNeutrinoContractAddress()))
131140 $Tuple4(fromBase58String(getStringValue(neutrinoContract, keyAuctionContractAddress())), fromBase58String(getStringValue(neutrinoContract, keyBondAsset())), getIntOrFail(keyMinLockAmount()), getIntOrFail(keyHalfLife()))
132141 }
133142
134143
135144 func isActiveUser (userAddress) = (getIntOrElse(keyLockParamUserAmount(userAddress), 0) > 0)
136145
137146
138147 func getUserParamsOrUnit (userAddress) = if (isActiveUser(userAddress))
139148 then $Tuple3(false, getIntOrFail(keyLockParamUserAmount(userAddress)), getIntOrFail(keyLockParamStartBlock(userAddress)))
140149 else unit
141150
142151
143152 func getUserParamsOrFail (userAddress) = valueOrErrorMessage(getUserParamsOrUnit(userAddress), (("User " + toString(userAddress)) + " is not defined"))
144153
145154
146155 let supportedAssetsStr = getStrOrElse(keySupportedRewardAssets(), "")
147156
148157 let supportedAssetsList = split(supportedAssetsStr, "_")
149158
150159 func calcReward (userAddress,assetId,stakedAmountX,depositNumUser,depositNumLast) = {
151160 let rewardPerNsbtSumLastKEY = keyRewardPerNsbtSumAt(depositNumLast, assetId)
152161 let sumLastX18 = parseBigIntValue(getStrOrElse(keyRewardPerNsbtSumAt(depositNumLast, assetId), "0"))
153162 let sumUserX18 = parseBigIntValue(getStrOrElse(keyRewardPerNsbtSumAt(depositNumUser, assetId), "0"))
154163 let rewardDynamicPart = toInt(fraction((sumLastX18 - sumUserX18), stakedAmountX, MULTX18))
155164 let rewardCachedPartKEY = keyReward(userAddress, assetId)
156165 let rewardCachedPart = getIntOrElse(rewardCachedPartKEY, 0)
157166 $Tuple4((rewardCachedPart + rewardDynamicPart), rewardCachedPart, rewardDynamicPart, rewardCachedPartKEY)
158167 }
159168
160169
161170 func RewardEntries (isNewUser,userAddress,stakedAmount) = {
162171 let stakedAmountX = toBigInt(stakedAmount)
163172 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddress)
164173 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
165174 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
166175 func forEachAssetCacheUserReward (accum,asset) = {
167- let $t067986933 = calcReward(userAddress, asset, stakedAmountX, depositNumUser, depositNumLast)
168- let rewardTotal = $t067986933._1
169- let cached = $t067986933._2
170- let dynamic = $t067986933._3
171- let rewardCachedPartKEY = $t067986933._4
176+ let $t073597494 = calcReward(userAddress, asset, stakedAmountX, depositNumUser, depositNumLast)
177+ let rewardTotal = $t073597494._1
178+ let cached = $t073597494._2
179+ let dynamic = $t073597494._3
180+ let rewardCachedPartKEY = $t073597494._4
172181 (accum :+ IntegerEntry(rewardCachedPartKEY, rewardTotal))
173182 }
174183
175184 if (if ((depositNumLast == -1))
176185 then (depositNumUser == -1)
177186 else false)
178187 then nil
179188 else if (if ((depositNumLast == -1))
180189 then (depositNumUser > -1)
181190 else false)
182191 then throw("invalid depositNumLast and depositNumUser state")
183192 else if (if ((depositNumLast > -1))
184193 then (depositNumUser == -1)
185194 else false)
186195 then if (isNewUser)
187196 then [IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)]
188- else throw("isNewUser must not be false in 5 + 6 cases")
197+ else ({
198+ let $l = supportedAssetsList
199+ let $s = size($l)
200+ let $acc0 = nil
201+ func $f0_1 ($a,$i) = if (($i >= $s))
202+ then $a
203+ else forEachAssetCacheUserReward($a, $l[$i])
204+
205+ func $f0_2 ($a,$i) = if (($i >= $s))
206+ then $a
207+ else throw("List size exceeds 10")
208+
209+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
210+ } :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast))
189211 else if (if ((depositNumLast > -1))
190212 then (depositNumUser > -1)
191213 else false)
192214 then if (isNewUser)
193- then throw((((("invalid management for isNewUser=" + toString(isNewUser)) + " and depositNumUser=") + toString(depositNumUser)) + " during full unstake"))
215+ then [IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)]
194216 else ({
195217 let $l = supportedAssetsList
196218 let $s = size($l)
197219 let $acc0 = nil
198220 func $f0_1 ($a,$i) = if (($i >= $s))
199221 then $a
200222 else forEachAssetCacheUserReward($a, $l[$i])
201223
202224 func $f0_2 ($a,$i) = if (($i >= $s))
203225 then $a
204226 else throw("List size exceeds 10")
205227
206228 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
207229 } :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast))
208230 else throw(((("uncovered condition: depositNumLast=" + toString(depositNumLast)) + " depositNumUser=") + toString(depositNumUser)))
209231 }
210232
211233
212234 func IncrementNotDistributedRewardEntry (tkn,amountInc) = {
213235 let notDistributedRewardKEY = keyNotDistributedReward(tkn)
214236 let notDistributedReward = getIntOrElse(notDistributedRewardKEY, 0)
215237 [IntegerEntry(notDistributedRewardKEY, (notDistributedReward + amountInc))]
216238 }
217239
218240
219241 @Callable(i)
220242 func constructor (neutrinoContractAddress,mathContractAddress,minLockAmount,halfLife,supportedRewardAssets) = if ((i.caller != this))
221243 then throw("Permission denied")
222244 else [StringEntry(keyNeutrinoContractAddress(), neutrinoContractAddress), StringEntry(keyMathContractAddress(), mathContractAddress), IntegerEntry(keyMinLockAmount(), minLockAmount), IntegerEntry(keyHalfLife(), halfLife), StringEntry(keySupportedRewardAssets(), supportedRewardAssets)]
223245
224246
225247
226248 @Callable(i)
227249 func stake () = {
228- let $t01080310882 = getParamsOrFail()
229- let auctionContract = $t01080310882._1
230- let bondAssetId = $t01080310882._2
231- let minLockAmount = $t01080310882._3
232- let halfLife = $t01080310882._4
250+ let $t01114811227 = getParamsOrFail()
251+ let auctionContract = $t01114811227._1
252+ let bondAssetId = $t01114811227._2
253+ let minLockAmount = $t01114811227._3
254+ let halfLife = $t01114811227._4
233255 if ((size(i.payments) != 1))
234256 then throw("Invalid payments size")
235257 else {
236258 let payment = i.payments[0]
237259 let amount = payment.amount
238260 let invalidAssetMessage = (("Invalid asset. " + toBase58String(bondAssetId)) + " is expected")
239261 let assetId = valueOrErrorMessage(payment.assetId, invalidAssetMessage)
240262 if ((assetId != bondAssetId))
241263 then throw(invalidAssetMessage)
242264 else {
243265 let userAddress = i.caller
244266 let userAddressStr = toString(i.caller)
245- let $t01142411531 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, -1))
246- let isNewUser = $t01142411531._1
247- let lockAmount = $t01142411531._2
248- let lockStartHeight = $t01142411531._3
267+ let $t01176911876 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, -1))
268+ let isNewUser = $t01176911876._1
269+ let lockAmount = $t01176911876._2
270+ let lockStartHeight = $t01176911876._3
249271 let mergedAmount = if (isNewUser)
250272 then amount
251273 else (amount + lockAmount)
252274 let mergedStartHeight = if (isNewUser)
253275 then height
254276 else {
255277 let mathContract = addressFromStringValue(getStringOrFail(keyMathContractAddress()))
256278 asInt(invoke(mathContract, "mergeStakesREADONLY", [amount, height, lockAmount, lockStartHeight, halfLife], nil))
257279 }
258280 if ((minLockAmount > mergedAmount))
259281 then throw(("Min lock amount is " + toString(minLockAmount)))
260282 else {
261- let $t01198112083 = StatsResult(amount, 1, if (isNewUser)
283+ let $t01232612428 = StatsResult(amount, 1, if (isNewUser)
262284 then 1
263285 else 0)
264- let statsEntries = $t01198112083._1
265- let totalStaked = $t01198112083._2
266- let totalStakedNew = $t01198112083._3
286+ let statsEntries = $t01232612428._1
287+ let totalStaked = $t01232612428._2
288+ let totalStakedNew = $t01232612428._3
267289 ((([HistoryRecordEntry("stake", userAddress, i.transactionId, lockAmount, lockStartHeight, mergedAmount, mergedStartHeight)] ++ RewardEntries(isNewUser, userAddressStr, lockAmount)) ++ LockParamsEntry(userAddress, mergedAmount, mergedStartHeight)) ++ statsEntries)
268290 }
269291 }
270292 }
271293 }
272294
273295
274296
275297 @Callable(i)
276298 func unstake (amount) = if ((size(i.payments) != 0))
277299 then throw("unstake doesn't require any payment")
278300 else {
279301 let userAddress = i.caller
280302 let userAddressStr = toString(userAddress)
281- let $t01256912647 = getParamsOrFail()
282- let auctionAddress = $t01256912647._1
283- let bondAssetId = $t01256912647._2
284- let minLockAmount = $t01256912647._3
285- let halfLife = $t01256912647._4
286- let $t01265012724 = getUserParamsOrFail(userAddress)
287- let isNewUser = $t01265012724._1
288- let lockAmount = $t01265012724._2
289- let lockStart = $t01265012724._3
303+ let $t01291412992 = getParamsOrFail()
304+ let auctionAddress = $t01291412992._1
305+ let bondAssetId = $t01291412992._2
306+ let minLockAmount = $t01291412992._3
307+ let halfLife = $t01291412992._4
308+ let $t01299513069 = getUserParamsOrFail(userAddress)
309+ let isNewUser = $t01299513069._1
310+ let lockAmount = $t01299513069._2
311+ let lockStart = $t01299513069._3
290312 if ((0 >= lockAmount))
291313 then throw("Nothing to unstake")
292314 else if ((amount > lockAmount))
293315 then throw(((("Requested " + toString(amount)) + ", but staked only ") + toString(lockAmount)))
294316 else {
295317 let mathContract = addressFromStringValue(getStringOrFail(keyMathContractAddress()))
296318 let comissionAmount = asInt(invoke(mathContract, "getUnstakeComissionAmountREADONLY", [amount, lockStart, halfLife], nil))
297- let $t01312513279 = StatsResult(-(amount), if ((amount == lockAmount))
319+ let $t01347013624 = StatsResult(-(amount), if ((amount == lockAmount))
298320 then -1
299321 else 0, if ((amount == lockAmount))
300322 then -1
301323 else 0)
302- let statsEntries = $t01312513279._1
303- let totalStaked = $t01312513279._2
304- let totalStakedNew = $t01312513279._3
324+ let statsEntries = $t01347013624._1
325+ let totalStaked = $t01347013624._2
326+ let totalStakedNew = $t01347013624._3
305327 ((([ScriptTransfer(userAddress, (amount - comissionAmount), bondAssetId), ScriptTransfer(Address(auctionAddress), comissionAmount, bondAssetId), HistoryRecordEntry("unstake", userAddress, i.transactionId, lockAmount, lockStart, (lockAmount - amount), lockStart)] ++ RewardEntries(false, userAddressStr, lockAmount)) ++ LockParamsEntry(userAddress, (lockAmount - amount), lockStart)) ++ statsEntries)
306328 }
307329 }
308330
309331
310332
311333 @Callable(i)
312334 func deposit () = if ((size(i.payments) != 1))
313335 then throw("exact 1 payment is allowed only")
314336 else {
315337 let pmt = i.payments[0]
316338 let amount = pmt.amount
317339 let pmtAssetId = valueOrElse(pmt.assetId, WAVESID)
318340 let pmtAssetIdStr = toBase58String(pmtAssetId)
319341 let pmtMultX = if ((pmtAssetId == WAVESID))
320342 then MULTX8
321343 else MULTX6
322344 let amountX = toBigInt(amount)
323345 let totalStaked = getIntOrElse(keyLockParamTotalAmount(), 0)
324346 let totalStakedX = toBigInt(totalStaked)
325347 if ((0 > totalStaked))
326348 then throw("TODO: case is not supported")
327349 else if ((totalStaked == 0))
328350 then IncrementNotDistributedRewardEntry(pmtAssetIdStr, amount)
329351 else {
330352 let rewardPerNsbtX18 = fraction(amountX, MULTX18, totalStakedX)
331353 let depositNumLastKEY = keyDepositNumLast()
332354 let depositNumLast = getIntOrElse(depositNumLastKEY, -1)
333355 let depositNumNew = (depositNumLast + 1)
334356 if (!(contains(supportedAssetsStr, pmtAssetIdStr)))
335357 then throw(((supportedAssetsStr + " doesn't contain ") + pmtAssetIdStr))
336358 else {
337359 func refreshRewardPerNsbtSUM (accum,nextAsset) = {
338360 let rewardPerNsbtSumNewKEY = keyRewardPerNsbtSumAt(depositNumNew, nextAsset)
339361 let sumLastStr = getStrOrElse(keyRewardPerNsbtSumAt(depositNumLast, nextAsset), "0")
340362 (accum :+ (if ((nextAsset == pmtAssetIdStr))
341363 then StringEntry(rewardPerNsbtSumNewKEY, toString((parseBigIntValue(sumLastStr) + rewardPerNsbtX18)))
342364 else StringEntry(rewardPerNsbtSumNewKEY, sumLastStr)))
343365 }
344366
345367 ({
346368 let $l = supportedAssetsList
347369 let $s = size($l)
348370 let $acc0 = nil
349371 func $f0_1 ($a,$i) = if (($i >= $s))
350372 then $a
351373 else refreshRewardPerNsbtSUM($a, $l[$i])
352374
353375 func $f0_2 ($a,$i) = if (($i >= $s))
354376 then $a
355377 else throw("List size exceeds 10")
356378
357379 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
358380 } :+ IntegerEntry(depositNumLastKEY, depositNumNew))
359381 }
360382 }
361383 }
362384
363385
364386
365387 @Callable(i)
366388 func claimRewards () = {
367389 let userAddress = i.caller
368390 let userAddressStr = toString(userAddress)
369391 if ((size(i.payments) > 0))
370392 then throw("payments are not accepted")
371393 else {
372- let $t01553515640 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
373- let isNewUser = $t01553515640._1
374- let stakedAmount = $t01553515640._2
375- let stakingStart = $t01553515640._3
394+ let $t01588015985 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
395+ let isNewUser = $t01588015985._1
396+ let stakedAmount = $t01588015985._2
397+ let stakingStart = $t01588015985._3
376398 let stakedAmountX = toBigInt(stakedAmount)
377399 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
378400 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
379401 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
380402 func forEachAssetCalcUnclaimedReward (accum,asset) = {
381- let $t01600116139 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
382- let rewardTotal = $t01600116139._1
383- let cached = $t01600116139._2
384- let dynamic = $t01600116139._3
385- let rewardCachedPartKEY = $t01600116139._4
403+ let $t01635616494 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
404+ let rewardTotal = $t01635616494._1
405+ let cached = $t01635616494._2
406+ let dynamic = $t01635616494._3
407+ let rewardCachedPartKEY = $t01635616494._4
408+ let claimedKEY = keyClaimed(userAddressStr, asset)
409+ let $t01655416591 = accum
410+ let data = $t01655416591._1
411+ let claimedAmtByAsset = $t01655416591._2
412+ let newPart = makeString([asset, toString(rewardTotal)], ":")
413+ let claimedAmtByAssetNew = makeString([claimedAmtByAsset, newPart], "_")
386414 if ((0 >= rewardTotal))
387- then accum
388- else ((accum :+ ScriptTransfer(userAddress, rewardTotal, toAssetVect(asset))) :+ IntegerEntry(rewardCachedPartKEY, 0))
415+ then $Tuple2(data, claimedAmtByAssetNew)
416+ else $Tuple2((((data :+ ScriptTransfer(userAddress, rewardTotal, toAssetVect(asset))) :+ IntegerEntry(claimedKEY, (valueOrElse(getInteger(claimedKEY), 0) + rewardTotal))) :+ IntegerEntry(rewardCachedPartKEY, 0)), claimedAmtByAssetNew)
389417 }
390418
391- let transfers = {
419+ let $t01705117165 = {
392420 let $l = supportedAssetsList
393421 let $s = size($l)
394- let $acc0 = nil
422+ let $acc0 = $Tuple2(nil, "")
395423 func $f0_1 ($a,$i) = if (($i >= $s))
396424 then $a
397425 else forEachAssetCalcUnclaimedReward($a, $l[$i])
398426
399427 func $f0_2 ($a,$i) = if (($i >= $s))
400428 then $a
401429 else throw("List size exceeds 10")
402430
403431 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
404432 }
433+ let transfers = $t01705117165._1
434+ let claimedAmtByAssetResult = $t01705117165._2
405435 if ((0 >= size(transfers)))
406436 then throw("nothing to claim")
407- else (transfers :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast))
437+ else ((transfers :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)) :+ ClaimHistoryEntry(userAddress, i.transactionId, drop(claimedAmtByAssetResult, 1)))
408438 }
409439 }
410440
411441
412442
413443 @Callable(i)
414444 func unclaimedRewardsREADONLY (userAddressStr) = {
415445 func forEachAssetZeroReward (accum,asset) = ((accum + makeString([asset, "0", "0"], ":")) + "_")
416446
417447 let unclaimedRewardStr = if ((userAddressStr == ""))
418448 then {
419449 let $l = supportedAssetsList
420450 let $s = size($l)
421451 let $acc0 = ""
422452 func $f0_1 ($a,$i) = if (($i >= $s))
423453 then $a
424454 else forEachAssetZeroReward($a, $l[$i])
425455
426456 func $f0_2 ($a,$i) = if (($i >= $s))
427457 then $a
428458 else throw("List size exceeds 10")
429459
430460 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
431461 }
432462 else {
433463 let userAddress = addressFromStringValue(userAddressStr)
434- let $t01696817073 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
435- let isNewUser = $t01696817073._1
436- let stakedAmount = $t01696817073._2
437- let stakingStart = $t01696817073._3
464+ let $t01782417929 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
465+ let isNewUser = $t01782417929._1
466+ let stakedAmount = $t01782417929._2
467+ let stakingStart = $t01782417929._3
438468 let stakedAmountX = toBigInt(stakedAmount)
439469 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
440470 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
441471 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
442472 func forEachAssetCalcUnclaimedReward (accum,asset) = {
443- let $t01741917557 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
444- let rewardTotal = $t01741917557._1
445- let cached = $t01741917557._2
446- let dynamic = $t01741917557._3
447- let rewardCachedPartKEY = $t01741917557._4
448- ((accum + makeString([asset, toString(rewardTotal), "0"], ":")) + "_")
473+ let $t01827518413 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
474+ let rewardTotal = $t01827518413._1
475+ let cached = $t01827518413._2
476+ let dynamic = $t01827518413._3
477+ let rewardCachedPartKEY = $t01827518413._4
478+ let claimed = valueOrElse(getInteger(keyClaimed(userAddressStr, asset)), 0)
479+ ((accum + makeString([asset, toString(rewardTotal), toString(claimed)], ":")) + "_")
449480 }
450481
451482 let $l = supportedAssetsList
452483 let $s = size($l)
453484 let $acc0 = ""
454485 func $f0_1 ($a,$i) = if (($i >= $s))
455486 then $a
456487 else forEachAssetCalcUnclaimedReward($a, $l[$i])
457488
458489 func $f0_2 ($a,$i) = if (($i >= $s))
459490 then $a
460491 else throw("List size exceeds 10")
461492
462493 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
463494 }
464495 $Tuple2(nil, dropRight(unclaimedRewardStr, 1))
465496 }
466497
467498
468499
469500 @Callable(i)
470501 func nsbtStakingSYSREADONLY (userAddressStr) = {
471502 let totalNsbtAmt = getIntOrElse(keyLockParamTotalAmount(), 0)
472503 if ((userAddressStr == ""))
473504 then $Tuple2(nil, [0, totalNsbtAmt, 0])
474505 else {
475506 let userAddress = toAddressOrFail(userAddressStr)
476- let $t01806418168 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
477- let isNewUser = $t01806418168._1
478- let userNsbtAmt = $t01806418168._2
479- let stakingStart = $t01806418168._3
507+ let $t01901719121 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
508+ let isNewUser = $t01901719121._1
509+ let userNsbtAmt = $t01901719121._2
510+ let stakingStart = $t01901719121._3
480511 $Tuple2(nil, [userNsbtAmt, totalNsbtAmt, stakingStart])
481512 }
482513 }
483514
484515

github/deemru/w8io/873ac7e 
80.13 ms