tx · DH269kvVhknyaHD8irPkUJFpmN7AL2HoXCJizucjFngr

3MuGfNhF98CNBCfthhoJEo6SYUv7zTgkK4J:  -0.01400000 Waves

2022.03.22 12:31 [1974953] smart account 3MuGfNhF98CNBCfthhoJEo6SYUv7zTgkK4J > SELF 0.00000000 Waves

{ "type": 13, "id": "DH269kvVhknyaHD8irPkUJFpmN7AL2HoXCJizucjFngr", "fee": 1400000, "feeAssetId": null, "timestamp": 1647941483651, "version": 1, "sender": "3MuGfNhF98CNBCfthhoJEo6SYUv7zTgkK4J", "senderPublicKey": "4DthuG3xjZV9WtZ34Y66AummdAr67wRzwWsVQL4y2bob", "proofs": [ "4DEUmyL55MQTv9532bPdmiDMQ4p3Lv1qsRExQuoFysgLSa8k5m5nU7xnEg1iP4Xu176i8cCwgUaE52qJdsisBYbZ" ], "script": "base64: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AAAAAQUAAAAJbmV3QW1vdW50CQAETAAAAAIJAAGkAAAAAQUAAAAIbmV3U3RhcnQFAAAAA25pbAUAAAAJc2VwYXJhdG9yAQAAABJIaXN0b3J5UmVjb3JkRW50cnkAAAAHAAAABHR5cGUAAAALdXNlckFkZHJlc3MAAAAEdHhJZAAAAAlvbGRBbW91bnQAAAAIb2xkU3RhcnQAAAAJbmV3QW1vdW50AAAACG5ld1N0YXJ0CQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAQa2V5SGlzdG9yeVJlY29yZAAAAAMFAAAABHR5cGUFAAAAC3VzZXJBZGRyZXNzBQAAAAR0eElkCQEAAAATZm9ybWF0SGlzdG9yeVJlY29yZAAAAAQFAAAACW9sZEFtb3VudAUAAAAIb2xkU3RhcnQFAAAACW5ld0Ftb3VudAUAAAAIbmV3U3RhcnQBAAAAC1N0YXRzUmVzdWx0AAAAAwAAAA50b3RhbExvY2tlZEluYwAAAAxsb2NrQ291bnRJbmMAAAANdXNlcnNDb3VudEluYwQAAAAKbG9ja3NDb3VudAkBAAAADGdldEludE9yWmVybwAAAAEJAQAAABJrZXlTdGF0c0xvY2tzQ291bnQAAAAABAAAAAp1c2Vyc0NvdW50CQEAAAAMZ2V0SW50T3JaZXJvAAAAAQkBAAAAEmtleVN0YXRzVXNlcnNDb3VudAAAAAAEAAAAC3RvdGFsQW1vdW50CQEAAAAMZ2V0SW50T3JaZXJvAAAAAQkBAAAAF2tleUxvY2tQYXJhbVRvdGFsQW1vdW50AAAAAAQAAAAOdG90YWxBbW91bnROZXcJAABkAAAAAgUAAAALdG90YWxBbW91bnQFAAAADnRvdGFsTG9ja2VkSW5jCQAFFQAAAAMJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABJrZXlTdGF0c0xvY2tzQ291bnQAAAAACQAAZAAAAAIFAAAACmxvY2tzQ291bnQFAAAADGxvY2tDb3VudEluYwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAEmtleVN0YXRzVXNlcnNDb3VudAAAAAAJAABkAAAAAgUAAAAKdXNlcnNDb3VudAUAAAANdXNlcnNDb3VudEluYwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAF2tleUxvY2tQYXJhbVRvdGFsQW1vdW50AAAAAAUAAAAOdG90YWxBbW91bnROZXcFAAAAA25pbAUAAAALdG90YWxBbW91bnQFAAAADnRvdGFsQW1vdW50TmV3AQAAAA9Mb2NrUGFyYW1zRW50cnkAAAADAAAAC3VzZXJBZGRyZXNzAAAABmFtb3VudAAAAAVzdGFydAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAFmtleUxvY2tQYXJhbVVzZXJBbW91bnQAAAABBQAAAAt1c2VyQWRkcmVzcwUAAAAGYW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAWa2V5TG9ja1BhcmFtU3RhcnRCbG9jawAAAAEFAAAAC3VzZXJBZGRyZXNzBQAAAAVzdGFydAUAAAADbmlsAQAAAA9nZXRQYXJhbXNPckZhaWwAAAAABAAAABBuZXV0cmlub0NvbnRyYWN0CQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAQkBAAAAGmtleU5ldXRyaW5vQ29udHJhY3RBZGRyZXNzAAAAAAkABRYAAAAECQACWQAAAAEJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QJAQAAABlrZXlBdWN0aW9uQ29udHJhY3RBZGRyZXNzAAAAAAkAAlkAAAABCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACBQAAABBuZXV0cmlub0NvbnRyYWN0CQEAAAAMa2V5Qm9uZEFzc2V0AAAAAAkBAAAADGdldEludE9yRmFpbAAAAAEJAQAAABBrZXlNaW5Mb2NrQW1vdW50AAAAAAkBAAAADGdldEludE9yRmFpbAAAAAEJAQAAAAtrZXlIYWxmTGlmZQAAAAABAAAADGlzQWN0aXZlVXNlcgAAAAEAAAALdXNlckFkZHJlc3MJAABmAAAAAgkBAAAADGdldEludE9yRWxzZQAAAAIJAQAAABZrZXlMb2NrUGFyYW1Vc2VyQW1vdW50AAAAAQUAAAALdXNlckFkZHJlc3MAAAAAAAAAAAAAAAAAAAAAAAABAAAAE2dldFVzZXJQYXJhbXNPclVuaXQAAAABAAAAC3VzZXJBZGRyZXNzAwkBAAAADGlzQWN0aXZlVXNlcgAAAAEFAAAAC3VzZXJBZGRyZXNzCQAFFQAAAAMHCQEAAAAMZ2V0SW50T3JGYWlsAAAAAQkBAAAAFmtleUxvY2tQYXJhbVVzZXJBbW91bnQAAAABBQAAAAt1c2VyQWRkcmVzcwkBAAAADGdldEludE9yRmFpbAAAAAEJAQAAABZrZXlMb2NrUGFyYW1TdGFydEJsb2NrAAAAAQUAAAALdXNlckFkZHJlc3MFAAAABHVuaXQBAAAAE2dldFVzZXJQYXJhbXNPckZhaWwAAAABAAAAC3VzZXJBZGRyZXNzCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAQAAABNnZXRVc2VyUGFyYW1zT3JVbml0AAAAAQUAAAALdXNlckFkZHJlc3MJAAEsAAAAAgkAASwAAAACAgAAAAVVc2VyIAkABCUAAAABBQAAAAt1c2VyQWRkcmVzcwIAAAAPIGlzIG5vdCBkZWZpbmVkAAAAABJzdXBwb3J0ZWRBc3NldHNTdHIJAQAAAAxnZXRTdHJPckVsc2UAAAACCQEAAAAYa2V5U3VwcG9ydGVkUmV3YXJkQXNzZXRzAAAAAAIAAAAAAAAAABNzdXBwb3J0ZWRBc3NldHNMaXN0CQAEtQAAAAIFAAAAEnN1cHBvcnRlZEFzc2V0c1N0cgIAAAABXwEAAAAKY2FsY1Jld2FyZAAAAAUAAAALdXNlckFkZHJlc3MAAAAHYXNzZXRJZAAAAA1zdGFrZWRBbW91bnRYAAAADmRlcG9zaXROdW1Vc2VyAAAADmRlcG9zaXROdW1MYXN0BAAAABdyZXdhcmRQZXJOc2J0U3VtTGFzdEtFWQkBAAAAFWtleVJld2FyZFBlck5zYnRTdW1BdAAAAAIFAAAADmRlcG9zaXROdW1MYXN0BQAAAAdhc3NldElkBAAAAApzdW1MYXN0WDE4CQABpwAAAAEJAQAAAAxnZXRTdHJPckVsc2UAAAACCQEAAAAVa2V5UmV3YXJkUGVyTnNidFN1bUF0AAAAAgUAAAAOZGVwb3NpdE51bUxhc3QFAAAAB2Fzc2V0SWQCAAAAATAEAAAACnN1bVVzZXJYMTgJAAGnAAAAAQkBAAAADGdldFN0ck9yRWxzZQAAAAIJAQAAABVrZXlSZXdhcmRQZXJOc2J0U3VtQXQAAAACBQAAAA5kZXBvc2l0TnVtVXNlcgUAAAAHYXNzZXRJZAIAAAABMAQAAAARcmV3YXJkRHluYW1pY1BhcnQJAAGgAAAAAQkAATwAAAADCQABOAAAAAIFAAAACnN1bUxhc3RYMTgFAAAACnN1bVVzZXJYMTgFAAAADXN0YWtlZEFtb3VudFgFAAAAB01VTFRYMTgEAAAAE3Jld2FyZENhY2hlZFBhcnRLRVkJAQAAAAlrZXlSZXdhcmQAAAACBQAAAAt1c2VyQWRkcmVzcwUAAAAHYXNzZXRJZAQAAAAQcmV3YXJkQ2FjaGVkUGFydAkBAAAADGdldEludE9yRWxzZQAAAAIFAAAAE3Jld2FyZENhY2hlZFBhcnRLRVkAAAAAAAAAAAAJAAUWAAAABAkAAGQAAAACBQAAABByZXdhcmRDYWNoZWRQYXJ0BQAAABFyZXdhcmREeW5hbWljUGFydAUAAAAQcmV3YXJkQ2FjaGVkUGFydAUAAAARcmV3YXJkRHluYW1pY1BhcnQFAAAAE3Jld2FyZENhY2hlZFBhcnRLRVkBAAAADVJld2FyZEVudHJpZXMAAAADAAAACWlzTmV3VXNlcgAAAAt1c2VyQWRkcmVzcwAAAAxzdGFrZWRBbW91bnQEAAAADXN0YWtlZEFtb3VudFgJAAE2AAAAAQUAAAAMc3Rha2VkQW1vdW50BAAAABt1c2VyUmV3YXJkRnJvbURlcG9zaXROdW1LRVkJAQAAABtrZXlVc2VyUmV3YXJkRnJvbURlcG9zaXROdW0AAAABBQAAAAt1c2VyQWRkcmVzcwQAAAAOZGVwb3NpdE51bVVzZXIJAQAAAAxnZXRJbnRPckVsc2UAAAACBQAAABt1c2VyUmV3YXJkRnJvbURlcG9zaXROdW1LRVkA//////////8EAAAADmRlcG9zaXROdW1MYXN0CQEAAAAMZ2V0SW50T3JFbHNlAAAAAgkBAAAAEWtleURlcG9zaXROdW1MYXN0AAAAAAD//////////woBAAAAG2ZvckVhY2hBc3NldENhY2hlVXNlclJld2FyZAAAAAIAAAAFYWNjdW0AAAAFYXNzZXQEAAAACyR0MDY3OTg2OTMzCQEAAAAKY2FsY1Jld2FyZAAAAAUFAAAAC3VzZXJB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AA5kZXBvc2l0TnVtVXNlcgEAAAAiSW5jcmVtZW50Tm90RGlzdHJpYnV0ZWRSZXdhcmRFbnRyeQAAAAIAAAADdGtuAAAACWFtb3VudEluYwQAAAAXbm90RGlzdHJpYnV0ZWRSZXdhcmRLRVkJAQAAABdrZXlOb3REaXN0cmlidXRlZFJld2FyZAAAAAEFAAAAA3RrbgQAAAAUbm90RGlzdHJpYnV0ZWRSZXdhcmQJAQAAAAxnZXRJbnRPckVsc2UAAAACBQAAABdub3REaXN0cmlidXRlZFJld2FyZEtFWQAAAAAAAAAAAAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAXbm90RGlzdHJpYnV0ZWRSZXdhcmRLRVkJAABkAAAAAgUAAAAUbm90RGlzdHJpYnV0ZWRSZXdhcmQFAAAACWFtb3VudEluYwUAAAADbmlsAAAABwAAAAFpAQAAAAtjb25zdHJ1Y3RvcgAAAAUAAAAXbmV1dHJpbm9Db250cmFjdEFkZHJlc3MAAAATbWF0aENvbnRyYWN0QWRkcmVzcwAAAA1taW5Mb2NrQW1vdW50AAAACGhhbGZMaWZlAAAAFXN1cHBvcnRlZFJld2FyZEFzc2V0cwMJAQAAAAIhPQAAAAIIBQAAAAFpAAAABmNhbGxlcgUAAAAEdGhpcwkAAAIAAAABAgAAABFQZXJtaXNzaW9uIGRlbmllZAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAaa2V5TmV1dHJpbm9Db250cmFjdEFkZHJlc3MAAAAABQAAABduZXV0cmlub0NvbnRyYWN0QWRkcmVzcwkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAWa2V5TWF0aENvbnRyYWN0QWRkcmVzcwAAAAAFAAAAE21hdGhDb250cmFjdEFkZHJlc3MJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABBrZXlNaW5Mb2NrQW1vdW50AAAAAAUAAAANbWluTG9ja0Ftb3VudAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAC2tleUhhbGZMaWZlAAAAAAUAAAAIaGFsZkxpZmUJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAGGtleVN1cHBvcnRlZFJld2FyZEFzc2V0cwAAAAAFAAAAFXN1cHBvcnRlZFJld2FyZEFzc2V0cwUAAAADbmlsAAAAAWkBAAAABXN0YWtlAAAAAAQAAAANJHQwMTA4MDMxMDg4MgkBAAAAD2dldFBhcmFtc09yRmFpbAAAAAAEAAAAD2F1Y3Rpb25Db250cmFjdAgFAAAADSR0MDEwODAzMTA4ODIAAAACXzEEAAAAC2JvbmRBc3NldElkCAUAAAANJHQwMTA4MDMxMDg4MgAAAAJfMgQAAAANbWluTG9ja0Ftb3VudAgFAAAADSR0MDEwODAzMTA4ODIAAAACXzMEAAAACGhhbGZMaWZlCAUAAAANJHQwMTA4MDMxMDg4MgAAAAJfNAMJAQAAAAIhPQAAAAIJAAGQAAAAAQgFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEJAAACAAAAAQIAAAAVSW52YWxpZCBwYXltZW50cyBzaXplBAAAAAdwYXltZW50CQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAABAAAAAZhbW91bnQIBQAAAAdwYXltZW50AAAABmFtb3VudAQAAAATaW52YWxpZEFzc2V0TWVzc2FnZQkAASwAAAACCQABLAAAAAICAAAAD0ludmFsaWQgYXNzZXQuIAkAAlgAAAABBQAAAAtib25kQXNzZXRJZAIAAAAMIGlzIGV4cGVjdGVkBAAAAAdhc3NldElkCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIIBQAAAAdwYXltZW50AAAAB2Fzc2V0SWQFAAAAE2ludmFsaWRBc3NldE1lc3NhZ2UDCQEAAAACIT0AAAACBQAAAAdhc3NldElkBQAAAAtib25kQXNzZXRJZAkAAAIAAAABBQAAABNpbnZhbGlkQXNzZXRNZXNzYWdlBAAAAAt1c2VyQWRkcmVzcwgFAAAAAWkAAAAGY2FsbGVyBAAAAA51c2VyQWRkcmVzc1N0cgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAADSR0MDExNDI0MTE1MzEJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAQAAABNnZXRVc2VyUGFyYW1zT3JVbml0AAAAAQUAAAALdXNlckFkZHJlc3MJAAUVAAAAAwYAAAAAAAAAAAAA//////////8EAAAACWlzTmV3VXNlcggFAAAADSR0MDExNDI0MTE1MzEAAAACXzEEAAAACmxvY2tBbW91bnQIBQAAAA0kdDAxMTQyNDExNTMxAAAAAl8yBAAAAA9sb2NrU3RhcnRIZWlnaHQIBQAAAA0kdDAxMTQyNDExNTMxAAAAAl8zBAAAAAxtZXJnZWRBbW91bnQDBQAAAAlpc05ld1VzZXIFAAAABmFtb3VudAkAAGQAAAACBQAAAAZhbW91bnQFAAAACmxvY2tBbW91bnQEAAAAEW1lcmdlZFN0YXJ0SGVpZ2h0AwUAAAAJaXNOZXdVc2VyBQAAAAZoZWlnaHQEAAAADG1hdGhDb250cmFjdAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAEJAQAAABZrZXlNYXRoQ29udHJhY3RBZGRyZXNzAAAAAAkBAAAABWFzSW50AAAAAQkAA/wAAAAEBQAAAAxtYXRoQ29udHJhY3QCAAAAE21lcmdlU3Rha2VzUkVBRE9OTFkJAARMAAAAAgUAAAAGYW1vdW50CQAETAAAAAIFAAAABmhlaWdodAkABEwAAAACBQAAAApsb2NrQW1vdW50CQAETAAAAAIFAAAAD2xvY2tTdGFydEhlaWdodAkABEwAAAACBQAAAAhoYWxmTGlmZQUAAAADbmlsBQAAAANuaWwDCQAAZgAAAAIFAAAADW1pbkxvY2tBbW91bnQFAAAADG1lcmdlZEFtb3VudAkAAAIAAAABCQABLAAAAAICAAAAE01pbiBsb2NrIGFtb3VudCBpcyAJAAGkAAAAAQUAAAANbWluTG9ja0Ftb3VudAQAAAANJHQwMTE5ODExMjA4MwkBAAAAC1N0YXRzUmVzdWx0AAAAAwUAAAAGYW1vdW50AAAAAAAAAAABAwUAAAAJaXNOZXdVc2VyAAAAAAAAAAABAAAAAAAAAAAABAAAAAxzdGF0c0VudHJpZXMIBQAAAA0kdDAxMTk4MTEyMDgzAAAAAl8xBAAAAAt0b3RhbFN0YWtlZAgFAAAADSR0MDExOTgxMTIwODMAAAACXzIEAAAADnRvdGFsU3Rha2VkTmV3CAUAAAANJHQwMTE5ODExMjA4MwAAAAJfMwkABE4AAAACCQAETgAAAAIJAAROAAAAAgkABEwAAAACCQEAAAASSGlzdG9yeVJlY29yZEVudHJ5AAAABwIAAAAFc3Rha2UFAAAAC3VzZXJBZGRyZXNzCAUAAAABaQAAAA10cmFuc2FjdGlvbklkBQAAAApsb2NrQW1vdW50BQAAAA9sb2NrU3RhcnRIZWlnaHQFAAAADG1lcmdlZEFtb3VudAUAAAARbWVyZ2VkU3RhcnRIZWlnaHQFAAAAA25pbAkBAAAADVJld2FyZEVudHJpZXMAAAADBQAAAAlpc05ld1VzZXIFAAAADnVzZXJBZGRyZXNzU3RyBQAAAApsb2NrQW1vdW50CQEAAAAPTG9ja1BhcmFtc0VudHJ5AAAAAwUAAAALdXNlckFkZHJlc3MFAAAADG1lcmdlZEFtb3VudAUAAAARbWVyZ2VkU3RhcnRIZWlnaHQFAAAADHN0YXRzRW50cmllcwAAAAFpAQAAAAd1bnN0YWtlAAAAAQAAAAZhbW91bnQDCQEAAAACIT0AAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAACQAAAgAAAAECAAAAI3Vuc3Rha2UgZG9lc24ndCByZXF1aXJlIGFueSBwYXltZW50BAAAAAt1c2VyQWRkcmVzcwgFAAAAAWkAAAAGY2FsbGVyBAAAAA51c2VyQWRkcmVzc1N0cgkABCUAAAABBQAAAAt1c2VyQWRkcmVzcwQAAAANJHQwMTI1NjkxMjY0NwkBAAAAD2dldFBhcmFtc09yRmFpbAAAAAAEAAAADmF1Y3Rpb25BZGRyZXNzCAUAAAANJHQwMTI1NjkxMjY0NwAAAAJfMQQAAAALYm9uZEFzc2V0SWQIBQAAAA0kdDAxMjU2OTEyNjQ3AAAAAl8yBAAAAA1taW5Mb2NrQW1vdW50CAUAAAANJHQwMTI1NjkxMjY0NwAAAAJfMwQAAAAIaGFsZkxpZmUIBQAAAA0kdDAxMjU2OTEyNjQ3AAAAAl80BAAAAA0kdDAxMjY1MDEyNzI0CQEAAAATZ2V0VXNlclBhcmFtc09yRmFpbAAAAAEFAAAAC3VzZXJBZGRyZXNzBAAAAAlpc05ld1VzZXIIBQAAAA0kdDAxMjY1MDEyNzI0AAAAAl8xBAAAAApsb2NrQW1vdW50CAUAAAANJHQwMTI2NTAxMjcyNAAAAAJfMgQAAAAJbG9ja1N0YXJ0CAUAAAANJHQwMTI2NTAxMjcyNAAAAAJfMwMJAABnAAAAAgAAAAAAAAAAAAUAAAAKbG9ja0Ftb3VudAkAAAIAAAABAgAAABJOb3RoaW5nIHRvIHVuc3Rha2UDCQAAZgAAAAIFAAAABmFtb3VudAUAAAAKbG9ja0Ftb3VudAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAApSZXF1ZXN0ZWQgCQABpAAAAAEFAAAABmFtb3VudAIAAAASLCBidXQgc3Rha2VkIG9ubHkgCQABpAAAAAEFAAAACmxvY2tBbW91bnQEAAAADG1hdGhDb250cmFjdAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAEJAQAAABZrZXlNYXRoQ29udHJhY3RBZGRyZXNzAAAAAAQAAAAPY29taXNzaW9uQW1vdW50CQEAAAAFYXNJbnQAAAABCQAD/AAAAAQFAAAADG1hdGhDb250cmFjdAIAAAAhZ2V0VW5zdGFrZUNvbWlzc2lvbkFtb3VudFJFQURPTkxZCQAETAAAAAIFAAAABmFtb3VudAkABEwAAAACBQAAAAlsb2NrU3RhcnQJAARMAAAAAgUAAAAIaGFsZkxpZmUFAAAAA25pbAUAAAADbmlsBAAAAA0kdDAxMzEyNTEzMjc5CQEAAAALU3RhdHNSZXN1bHQAAAADCQEAAAABLQAAAAEFAAAABmFtb3VudAMJAAAAAAAAAgUAAAAGYW1vdW50BQAAAApsb2NrQW1vdW50AP//////////AAAAAAAAAAAAAwkAAAAAAAACBQAAAAZhbW91bnQFAAAACmxvY2tBbW91bnQA//////////8AAAAAAAAAAAAEAAAADHN0YXRzRW50cmllcwgFAAAADSR0MDEzMTI1MTMyNzkAAAACXzEEAAAAC3RvdGFsU3Rha2VkCAUAAAANJHQwMTMxMjUxMzI3OQAAAAJfMgQAAAAOdG90YWxTdGFrZWROZXcIBQAAAA0kdDAxMzEyNTEzMjc5AAAAAl8zCQAETgAAAAIJAAROAAAAAgkABE4AAAACCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAC3VzZXJBZGRyZXNzCQAAZQAAAAIFAAAABmFtb3VudAUAAAAPY29taXNzaW9uQW1vdW50BQAAAAtib25kQXNzZXRJZAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAAHQWRkcmVzcwAAAAEFAAAADmF1Y3Rpb25BZGRyZXNzBQAAAA9jb21pc3Npb25BbW91bnQFAAAAC2JvbmRBc3NldElkCQAETAAAAAIJAQAAABJIaXN0b3J5UmVjb3JkRW50cnkAAAAHAgAAAAd1bnN0YWtlBQAAAAt1c2VyQWRkcmVzcwgFAAAAAWkAAAANdHJhbnNhY3Rpb25JZAUAAAAKbG9ja0Ftb3VudAUAAAAJbG9ja1N0YXJ0CQAAZQAAAAIFAAAACmxvY2tBbW91bnQFAAAABmFtb3VudAUAAAAJbG9ja1N0YXJ0BQAAAANuaWwJAQAAAA1SZXdhcmRFbnRyaWVzAAAAAwcFAAAADnVzZXJBZGRyZXNzU3RyBQAAAApsb2NrQW1vdW50CQEAAAAPTG9ja1BhcmFtc0VudHJ5AAAAAwUAAAALdXNlckFkZHJlc3MJAABlAAAAAgUAAAAKbG9ja0Ftb3VudAUAAAAGYW1vdW50BQAAAAlsb2NrU3RhcnQFAAAADHN0YXRzRW50cmllcwAAAAFpAQAAAAdkZXBvc2l0AAAAAAMJAQAAAAIhPQAAAAIJAAGQAAAAAQgFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEJAAACAAAAAQIAAAAfZXhhY3QgMSBwYXltZW50IGlzIGFsbG93ZWQgb25seQQAAAADcG10CQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAABAAAAAZhbW91bnQIBQAAAANwbXQAAAAGYW1vdW50BAAAAApwbXRBc3NldElkCQEAAAALdmFsdWVPckVsc2UAAAACCAUAAAADcG10AAAAB2Fzc2V0SWQFAAAAB1dBVkVTSUQEAAAADXBtdEFzc2V0SWRTdHIJAAJYAAAAAQUAAAAKcG10QXNzZXRJZAQAAAAIcG10TXVsdFgDCQAAAAAAAAIFAAAACnBtdEFzc2V0SWQFAAAAB1dBVkVTSUQFAAAABk1VTFRYOAUAAAAGTVVMVFg2BAAAAAdhbW91bnRYCQABNgAAAAEFAAAABmFtb3VudAQAAAALdG90YWxTdGFrZWQJAQAAAAxnZXRJbnRPckVsc2UAAAACCQEAAAAXa2V5TG9ja1BhcmFtVG90YWxBbW91bnQAAAAAAAAAAAAAAAAABAAAAAx0b3RhbFN0YWtlZFgJAAE2AAAAAQUAAAALdG90YWxTdGFrZWQDCQAAZgAAAAIAAAAAAAAAAAAFAAAAC3RvdGFsU3Rha2VkCQAAAgAAAAECAAAAG1RPRE86IGNhc2UgaXMgbm90IHN1cHBvcnRlZAMJAAAAAAAAAgUAAAALdG90YWxTdGFrZWQAAAAAAAAAAAAJAQAAACJJbmNyZW1lbnROb3REaXN0cmlidXRlZFJld2FyZEVudHJ5AAAAAgUAAAANcG10QXNzZXRJZFN0cgUAAAAGYW1vdW50BAAAABByZXdhcmRQZXJOc2J0WDE4CQABPAAAAAMFAAAAB2Ftb3VudFgFAAAAB01VTFRYMTgFAAAADHRvdGFsU3Rha2VkWAQAAAARZGVwb3NpdE51bUxhc3RLRVkJAQAAABFrZXlEZXBvc2l0TnVtTGFzdAAAAAAEAAAADmRlcG9zaXROdW1MYXN0CQEAAAAMZ2V0SW50T3JFbHNlAAAAAgUAAAARZGVwb3NpdE51bUxhc3RLRVkA//////////8EAAAADWRlcG9zaXROdW1OZXcJAABkAAAAAgUAAAAOZGVwb3NpdE51bUxhc3QAAAAAAAAAAAEDCQEAAAABIQAAAAEJAQAAAAhjb250YWlucwAAAAIFAAAAEnN1cHBvcnRlZEFzc2V0c1N0cgUAAAANcG10QXNzZXRJZFN0cgkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgUAAAASc3VwcG9ydGVkQXNzZXRzU3RyAgAAABEgZG9lc24ndCBjb250YWluIAUAAAANcG10QXNzZXRJZFN0cgoBAAAAF3JlZnJlc2hSZXdhcmRQZXJOc2J0U1VNAAAAAgAAAAVhY2N1bQAAAAluZXh0QXNzZXQEAAAAFnJld2FyZFBlck5zYnRTdW1OZXdLRVkJAQAAABVrZXlSZXdhcmRQZXJOc2J0U3VtQXQAAAACBQAAAA1kZXBvc2l0TnVtTmV3BQAAAAluZXh0QXNzZXQEAAAACnN1bUxhc3RTdHIJAQAAAAxnZXRTdHJPckVsc2UAAAACCQEAAAAVa2V5UmV3YXJkUGVyTnNidFN1bUF0AAAAAgUAAAAOZGVwb3NpdE51bUxhc3QFAAAACW5leHRBc3NldAIAAAABMAkABE0AAAACBQAAAAVhY2N1bQMJAAAAAAAAAgUAAAAJbmV4dEFzc2V0BQAAAA1wbXRBc3NldElkU3RyCQEAAAALU3RyaW5nRW50cnkAAAACBQAAABZyZXdhcmRQZXJOc2J0U3VtTmV3S0VZCQABpgAAAAEJAAE3AAAAAgkAAacAAAABBQAAAApzdW1MYXN0U3RyBQAAABByZXdhcmRQZXJOc2J0WDE4CQEAAAALU3RyaW5nRW50cnkAAAACBQAAABZyZXdhcmRQZXJOc2J0U3VtTmV3S0VZBQAAAApzdW1MYXN0U3RyCQAETQAAAAIKAAAAAAIkbAUAAAATc3VwcG9ydGVkQXNzZXRzTGlzdAoAAAAAAiRzCQABkAAAAAEFAAAAAiRsCgAAAAAFJGFjYzAFAAAAA25pbAoBAAAABSRmMF8xAAAAAgAAAAIkYQAAAAIkaQMJAABnAAAAAgUAAAACJGkFAAAAAiRzBQAAAAIkYQkBAAAAF3JlZnJlc2hSZXdhcmRQZXJOc2J0U1VNAAAAAgUAAAACJGEJAAGRAAAAAgUAAAACJGwFAAAAAiRpCgEAAAAFJGYwXzIAAAACAAAAAiRhAAAAAiRpAwkAAGcAAAACBQAAAAIkaQUAAAACJHMFAAAAAiRhCQAAAgAAAAECAAAAFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEAAAAFJGYwXzIAAAACCQEAAAAFJGYwXzEAAAACCQEAAAAFJGYwXzEAAAACCQEAAAAFJGYwXzEAAAACCQEAAAAFJGYwXzEAAAACCQEAAAAFJGYwXzEAAAACCQEAAAAFJGYwXzEAAAACCQEAAAAFJGYwXzEAAAACCQEAAAAFJGYwXzEAAAACCQEAAAAFJGYwXzEAAAACCQEAAAAFJGYwXzEAAAACBQAAAAUkYWNjMAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAgAAAAAAAAAAAwAAAAAAAAAABAAAAAAAAAAABQAAAAAAAAAABgAAAAAAAAAABwAAAAAAAAAACAAAAAAAAAAACQAAAAAAAAAACgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAEWRlcG9zaXROdW1MYXN0S0VZBQAAAA1kZXBvc2l0TnVtTmV3AAAAAWkBAAAADGNsYWltUmV3YXJkcwAAAAAEAAAAC3VzZXJBZGRyZXNzCAUAAAABaQAAAAZjYWxsZXIEAAAADnVzZXJBZGRyZXNzU3RyCQAEJQAAAAEFAAAAC3VzZXJBZGRyZXNzAwkAAGYAAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAACQAAAgAAAAECAAAAGXBheW1lbnRzIGFyZSBub3QgYWNjZXB0ZWQEAAAADSR0MDE1NTM1MTU2NDAJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAQAAABNnZXRVc2VyUGFyYW1zT3JVbml0AAAAAQUAAAALdXNlckFkZHJlc3MJAAUVAAAAAwYAAAAAAAAAAAAAAAAAAAAAAAAEAAAACWlzTmV3VXNlcggFAAAADSR0MDE1NTM1MTU2NDAAAAACXzEEAAAADHN0YWtlZEFtb3VudAgFAAAADSR0MDE1NTM1MTU2NDAAAAACXzIEAAAADHN0YWtpbmdTdGFydAgFAAAADSR0MDE1NTM1MTU2NDAAAAACXzMEAAAADXN0YWtlZEFtb3VudFgJAAE2AAAAAQUAAAAMc3Rha2VkQW1vdW50BAAAABt1c2VyUmV3YXJkRnJvbURlcG9zaXROdW1LRVkJAQAAABtrZXlVc2VyUmV3YXJkRnJvbURlcG9zaXROdW0AAAABBQAAAA51c2VyQWRkcmVzc1N0cgQAAAAOZGVwb3NpdE51bVVzZXIJAQAAAAxnZXRJbnRPckVsc2UAAAACBQAAABt1c2VyUmV3YXJkRnJvbURlcG9zaXROdW1LRVkA//////////8EAAAADmRlcG9zaXROdW1MYXN0CQEAAAAMZ2V0SW50T3JFbHNlAAAAAgkBAAAAEWtleURlcG9zaXROdW1MYXN0AAAAAAD//////////woBAAAAH2ZvckVhY2hBc3NldENhbGNVbmNsYWltZWRSZXdhcmQAAAACAAAABWFjY3VtAAAABWFzc2V0BAAAAA0kdDAxNjAwMTE2MTM5CQEAAAAKY2FsY1Jld2FyZAAAAAUFAAAADnVzZXJBZGRyZXNzU3RyBQAAAAVhc3NldAUAAAANc3Rha2VkQW1vdW50WAUAAAAOZGVwb3NpdE51bVVzZXIFAAAADmRlcG9zaXROdW1MYXN0BAAAAAtyZXdhcmRUb3RhbAgF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XzEAAAACBQAAAAUkYWNjMAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAgAAAAAAAAAAAwAAAAAAAAAABAAAAAAAAAAABQAAAAAAAAAABgAAAAAAAAAABwAAAAAAAAAACAAAAAAAAAAACQAAAAAAAAAACgQAAAALdXNlckFkZHJlc3MJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAADnVzZXJBZGRyZXNzU3RyBAAAAA0kdDAxNjk2ODE3MDczCQEAAAALdmFsdWVPckVsc2UAAAACCQEAAAATZ2V0VXNlclBhcmFtc09yVW5pdAAAAAEFAAAAC3VzZXJBZGRyZXNzCQAFFQAAAAMGAAAAAAAAAAAAAAAAAAAAAAAABAAAAAlpc05ld1VzZXIIBQAAAA0kdDAxNjk2ODE3MDczAAAAAl8xBAAAAAxzdGFrZWRBbW91bnQIBQAAAA0kdDAxNjk2ODE3MDczAAAAAl8yBAAAAAxzdGFraW5nU3RhcnQIBQAAAA0kdDAxNjk2ODE3MDczAAAAAl8zBAAAAA1zdGFrZWRBbW91bnRYCQABNgAAAAEFAAAADHN0YWtlZEFtb3VudAQAAAAbdXNlclJld2FyZEZyb21EZXBvc2l0TnVtS0VZCQEAAAAba2V5VXNlclJld2FyZEZyb21EZXBvc2l0TnVtAAAAAQUAAAAOdXNlckFkZHJlc3NTdHIEAAAADmRlcG9zaXROdW1Vc2VyCQEAAAAMZ2V0SW50T3JFbHNlAAAAAgUAAAAbdXNlclJld2FyZEZyb21EZXBvc2l0TnVtS0VZAP//////////BAAAAA5kZXBvc2l0TnVtTGFzdAkBAAAADGdldEludE9yRWxzZQAAAAIJAQAAABFrZXlEZXBvc2l0TnVtTGFzdAAAAAAA//////////8KAQAAAB9mb3JFYWNoQXNzZXRDYWxjVW5jbGFpbWVkUmV3YXJkAAAAAgAAAAVhY2N1bQAAAAVhc3NldAQAAAANJHQwMTc0MTkxNzU1NwkBAAAACmNhbGNSZXdhcmQAAAAFBQAAAA51c2VyQWRkcmVzc1N0cgUAAAAFYXNzZXQFAAAADXN0YWtlZEFtb3VudFgFAAAADmRlcG9zaXROdW1Vc2VyBQAAAA5kZXBvc2l0TnVtTGFzdAQAAAALcmV3YXJkVG90YWwI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", "chainId": 84, "height": 1974953, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: EQWgVZuHMZ1EUuDmVr2NRCT7Cqmms6aufdYXKUSsBMSe Next: Fz8XGheAiqPy5iQSzyAZibArWH7mqsxfC91NZ4Xy29vc Diff:
OldNewDifferences
264264 let statsEntries = $t01198112083._1
265265 let totalStaked = $t01198112083._2
266266 let totalStakedNew = $t01198112083._3
267- let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
268- ((([HistoryRecordEntry("stake", userAddress, i.transactionId, lockAmount, lockStartHeight, mergedAmount, mergedStartHeight)] ++ LockParamsEntry(userAddress, mergedAmount, mergedStartHeight)) ++ statsEntries) :+ IntegerEntry(keyUserRewardFromDepositNum(userAddressStr), getIntOrElse(keyDepositNumLast(), -1)))
267+ ((([HistoryRecordEntry("stake", userAddress, i.transactionId, lockAmount, lockStartHeight, mergedAmount, mergedStartHeight)] ++ RewardEntries(isNewUser, userAddressStr, lockAmount)) ++ LockParamsEntry(userAddress, mergedAmount, mergedStartHeight)) ++ statsEntries)
269268 }
270269 }
271270 }
274273
275274
276275 @Callable(i)
277-func unstake (amount) = {
278- let userAddress = i.caller
279- let userAddressStr = toString(userAddress)
280- let $t01258812666 = getParamsOrFail()
281- let auctionAddress = $t01258812666._1
282- let bondAssetId = $t01258812666._2
283- let minLockAmount = $t01258812666._3
284- let halfLife = $t01258812666._4
285- let $t01266912743 = getUserParamsOrFail(userAddress)
286- let isNewUser = $t01266912743._1
287- let lockAmount = $t01266912743._2
288- let lockStart = $t01266912743._3
289- if ((0 >= lockAmount))
290- then throw("Nothing to unstake")
291- else if ((amount > lockAmount))
292- then throw(((("Requested " + toString(amount)) + ", but staked only ") + toString(lockAmount)))
293- else {
294- let mathContract = addressFromStringValue(getStringOrFail(keyMathContractAddress()))
295- let comissionAmount = asInt(invoke(mathContract, "getUnstakeComissionAmountREADONLY", [amount, lockStart, halfLife], nil))
296- let $t01314413298 = StatsResult(-(amount), if ((amount == lockAmount))
297- then -1
298- else 0, if ((amount == lockAmount))
299- then -1
300- else 0)
301- let statsEntries = $t01314413298._1
302- let totalStaked = $t01314413298._2
303- let totalStakedNew = $t01314413298._3
304- ((([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)
305- }
306- }
276+func unstake (amount) = if ((size(i.payments) != 0))
277+ then throw("unstake doesn't require any payment")
278+ else {
279+ let userAddress = i.caller
280+ 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
290+ if ((0 >= lockAmount))
291+ then throw("Nothing to unstake")
292+ else if ((amount > lockAmount))
293+ then throw(((("Requested " + toString(amount)) + ", but staked only ") + toString(lockAmount)))
294+ else {
295+ let mathContract = addressFromStringValue(getStringOrFail(keyMathContractAddress()))
296+ let comissionAmount = asInt(invoke(mathContract, "getUnstakeComissionAmountREADONLY", [amount, lockStart, halfLife], nil))
297+ let $t01312513279 = StatsResult(-(amount), if ((amount == lockAmount))
298+ then -1
299+ else 0, if ((amount == lockAmount))
300+ then -1
301+ else 0)
302+ let statsEntries = $t01312513279._1
303+ let totalStaked = $t01312513279._2
304+ let totalStakedNew = $t01312513279._3
305+ ((([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)
306+ }
307+ }
307308
308309
309310
365366 func claimRewards () = {
366367 let userAddress = i.caller
367368 let userAddressStr = toString(userAddress)
368- let $t01548015585 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
369- let isNewUser = $t01548015585._1
370- let stakedAmount = $t01548015585._2
371- let stakingStart = $t01548015585._3
372- let stakedAmountX = toBigInt(stakedAmount)
373- let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
374- let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
375- let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
376- func forEachAssetCalcUnclaimedReward (accum,asset) = {
377- let $t01594616084 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
378- let rewardTotal = $t01594616084._1
379- let cached = $t01594616084._2
380- let dynamic = $t01594616084._3
381- let rewardCachedPartKEY = $t01594616084._4
382- if ((0 >= rewardTotal))
383- then accum
384- else ((accum :+ ScriptTransfer(userAddress, rewardTotal, toAssetVect(asset))) :+ IntegerEntry(rewardCachedPartKEY, 0))
385- }
369+ if ((size(i.payments) > 0))
370+ then throw("payments are not accepted")
371+ 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
376+ let stakedAmountX = toBigInt(stakedAmount)
377+ let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
378+ let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
379+ let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
380+ 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
386+ if ((0 >= rewardTotal))
387+ then accum
388+ else ((accum :+ ScriptTransfer(userAddress, rewardTotal, toAssetVect(asset))) :+ IntegerEntry(rewardCachedPartKEY, 0))
389+ }
386390
387- let transfers = {
388- let $l = supportedAssetsList
389- let $s = size($l)
390- let $acc0 = nil
391- func $f0_1 ($a,$i) = if (($i >= $s))
392- then $a
393- else forEachAssetCalcUnclaimedReward($a, $l[$i])
391+ let transfers = {
392+ let $l = supportedAssetsList
393+ let $s = size($l)
394+ let $acc0 = nil
395+ func $f0_1 ($a,$i) = if (($i >= $s))
396+ then $a
397+ else forEachAssetCalcUnclaimedReward($a, $l[$i])
394398
395- func $f0_2 ($a,$i) = if (($i >= $s))
396- then $a
397- else throw("List size exceeds 10")
399+ func $f0_2 ($a,$i) = if (($i >= $s))
400+ then $a
401+ else throw("List size exceeds 10")
398402
399- $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)
400- }
401- if ((0 >= size(transfers)))
402- then throw("nothing to claim")
403- else transfers
403+ $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)
404+ }
405+ if ((0 >= size(transfers)))
406+ then throw("nothing to claim")
407+ else (transfers :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast))
408+ }
404409 }
405410
406411
426431 }
427432 else {
428433 let userAddress = addressFromStringValue(userAddressStr)
429- let $t01684816953 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
430- let isNewUser = $t01684816953._1
431- let stakedAmount = $t01684816953._2
432- let stakingStart = $t01684816953._3
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
433438 let stakedAmountX = toBigInt(stakedAmount)
434439 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
435440 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
436441 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
437442 func forEachAssetCalcUnclaimedReward (accum,asset) = {
438- let $t01729917437 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
439- let rewardTotal = $t01729917437._1
440- let cached = $t01729917437._2
441- let dynamic = $t01729917437._3
442- let rewardCachedPartKEY = $t01729917437._4
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
443448 ((accum + makeString([asset, toString(rewardTotal), "0"], ":")) + "_")
444449 }
445450
468473 then $Tuple2(nil, [0, totalNsbtAmt, 0])
469474 else {
470475 let userAddress = toAddressOrFail(userAddressStr)
471- let $t01794418048 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
472- let isNewUser = $t01794418048._1
473- let userNsbtAmt = $t01794418048._2
474- let stakingStart = $t01794418048._3
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
475480 $Tuple2(nil, [userNsbtAmt, totalNsbtAmt, stakingStart])
476481 }
477482 }
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
7474 func keyNotDistributedReward (tkn) = makeString(["%s%s", "notDistributed", tkn], separator)
7575
7676
7777 func toX18 (origVal,origMult) = fraction(toBigInt(origVal), MULTX18, origMult)
7878
7979
8080 func getIntOrZero (key) = valueOrElse(getInteger(this, key), 0)
8181
8282
8383 func getIntOrElse (key,defaultVal) = valueOrElse(getInteger(this, key), defaultVal)
8484
8585
8686 func getIntOrFail (key) = valueOrErrorMessage(getInteger(this, key), (("Mandatory this." + key) + " is not defined"))
8787
8888
8989 func getStrOrElse (key,defaultVal) = valueOrElse(getString(this, key), defaultVal)
9090
9191
9292 func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), (("Mandatory this." + key) + " is not defined"))
9393
9494
9595 func toAddressOrFail (addressStr) = valueOrErrorMessage(addressFromString(addressStr), ("couldn't parse passed addressStr=" + addressStr))
9696
9797
9898 func toAssetVect (assetStr) = if ((assetStr == WAVESIDSTR))
9999 then unit
100100 else fromBase58String(assetStr)
101101
102102
103103 func asInt (val) = match val {
104104 case valInt: Int =>
105105 valInt
106106 case _ =>
107107 throw("fail to cast into Int")
108108 }
109109
110110
111111 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)
112112
113113
114114 func HistoryRecordEntry (type,userAddress,txId,oldAmount,oldStart,newAmount,newStart) = StringEntry(keyHistoryRecord(type, userAddress, txId), formatHistoryRecord(oldAmount, oldStart, newAmount, newStart))
115115
116116
117117 func StatsResult (totalLockedInc,lockCountInc,usersCountInc) = {
118118 let locksCount = getIntOrZero(keyStatsLocksCount())
119119 let usersCount = getIntOrZero(keyStatsUsersCount())
120120 let totalAmount = getIntOrZero(keyLockParamTotalAmount())
121121 let totalAmountNew = (totalAmount + totalLockedInc)
122122 $Tuple3([IntegerEntry(keyStatsLocksCount(), (locksCount + lockCountInc)), IntegerEntry(keyStatsUsersCount(), (usersCount + usersCountInc)), IntegerEntry(keyLockParamTotalAmount(), totalAmountNew)], totalAmount, totalAmountNew)
123123 }
124124
125125
126126 func LockParamsEntry (userAddress,amount,start) = [IntegerEntry(keyLockParamUserAmount(userAddress), amount), IntegerEntry(keyLockParamStartBlock(userAddress), start)]
127127
128128
129129 func getParamsOrFail () = {
130130 let neutrinoContract = addressFromStringValue(getStringOrFail(keyNeutrinoContractAddress()))
131131 $Tuple4(fromBase58String(getStringValue(neutrinoContract, keyAuctionContractAddress())), fromBase58String(getStringValue(neutrinoContract, keyBondAsset())), getIntOrFail(keyMinLockAmount()), getIntOrFail(keyHalfLife()))
132132 }
133133
134134
135135 func isActiveUser (userAddress) = (getIntOrElse(keyLockParamUserAmount(userAddress), 0) > 0)
136136
137137
138138 func getUserParamsOrUnit (userAddress) = if (isActiveUser(userAddress))
139139 then $Tuple3(false, getIntOrFail(keyLockParamUserAmount(userAddress)), getIntOrFail(keyLockParamStartBlock(userAddress)))
140140 else unit
141141
142142
143143 func getUserParamsOrFail (userAddress) = valueOrErrorMessage(getUserParamsOrUnit(userAddress), (("User " + toString(userAddress)) + " is not defined"))
144144
145145
146146 let supportedAssetsStr = getStrOrElse(keySupportedRewardAssets(), "")
147147
148148 let supportedAssetsList = split(supportedAssetsStr, "_")
149149
150150 func calcReward (userAddress,assetId,stakedAmountX,depositNumUser,depositNumLast) = {
151151 let rewardPerNsbtSumLastKEY = keyRewardPerNsbtSumAt(depositNumLast, assetId)
152152 let sumLastX18 = parseBigIntValue(getStrOrElse(keyRewardPerNsbtSumAt(depositNumLast, assetId), "0"))
153153 let sumUserX18 = parseBigIntValue(getStrOrElse(keyRewardPerNsbtSumAt(depositNumUser, assetId), "0"))
154154 let rewardDynamicPart = toInt(fraction((sumLastX18 - sumUserX18), stakedAmountX, MULTX18))
155155 let rewardCachedPartKEY = keyReward(userAddress, assetId)
156156 let rewardCachedPart = getIntOrElse(rewardCachedPartKEY, 0)
157157 $Tuple4((rewardCachedPart + rewardDynamicPart), rewardCachedPart, rewardDynamicPart, rewardCachedPartKEY)
158158 }
159159
160160
161161 func RewardEntries (isNewUser,userAddress,stakedAmount) = {
162162 let stakedAmountX = toBigInt(stakedAmount)
163163 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddress)
164164 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
165165 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
166166 func forEachAssetCacheUserReward (accum,asset) = {
167167 let $t067986933 = calcReward(userAddress, asset, stakedAmountX, depositNumUser, depositNumLast)
168168 let rewardTotal = $t067986933._1
169169 let cached = $t067986933._2
170170 let dynamic = $t067986933._3
171171 let rewardCachedPartKEY = $t067986933._4
172172 (accum :+ IntegerEntry(rewardCachedPartKEY, rewardTotal))
173173 }
174174
175175 if (if ((depositNumLast == -1))
176176 then (depositNumUser == -1)
177177 else false)
178178 then nil
179179 else if (if ((depositNumLast == -1))
180180 then (depositNumUser > -1)
181181 else false)
182182 then throw("invalid depositNumLast and depositNumUser state")
183183 else if (if ((depositNumLast > -1))
184184 then (depositNumUser == -1)
185185 else false)
186186 then if (isNewUser)
187187 then [IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)]
188188 else throw("isNewUser must not be false in 5 + 6 cases")
189189 else if (if ((depositNumLast > -1))
190190 then (depositNumUser > -1)
191191 else false)
192192 then if (isNewUser)
193193 then throw((((("invalid management for isNewUser=" + toString(isNewUser)) + " and depositNumUser=") + toString(depositNumUser)) + " during full unstake"))
194194 else ({
195195 let $l = supportedAssetsList
196196 let $s = size($l)
197197 let $acc0 = nil
198198 func $f0_1 ($a,$i) = if (($i >= $s))
199199 then $a
200200 else forEachAssetCacheUserReward($a, $l[$i])
201201
202202 func $f0_2 ($a,$i) = if (($i >= $s))
203203 then $a
204204 else throw("List size exceeds 10")
205205
206206 $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)
207207 } :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast))
208208 else throw(((("uncovered condition: depositNumLast=" + toString(depositNumLast)) + " depositNumUser=") + toString(depositNumUser)))
209209 }
210210
211211
212212 func IncrementNotDistributedRewardEntry (tkn,amountInc) = {
213213 let notDistributedRewardKEY = keyNotDistributedReward(tkn)
214214 let notDistributedReward = getIntOrElse(notDistributedRewardKEY, 0)
215215 [IntegerEntry(notDistributedRewardKEY, (notDistributedReward + amountInc))]
216216 }
217217
218218
219219 @Callable(i)
220220 func constructor (neutrinoContractAddress,mathContractAddress,minLockAmount,halfLife,supportedRewardAssets) = if ((i.caller != this))
221221 then throw("Permission denied")
222222 else [StringEntry(keyNeutrinoContractAddress(), neutrinoContractAddress), StringEntry(keyMathContractAddress(), mathContractAddress), IntegerEntry(keyMinLockAmount(), minLockAmount), IntegerEntry(keyHalfLife(), halfLife), StringEntry(keySupportedRewardAssets(), supportedRewardAssets)]
223223
224224
225225
226226 @Callable(i)
227227 func stake () = {
228228 let $t01080310882 = getParamsOrFail()
229229 let auctionContract = $t01080310882._1
230230 let bondAssetId = $t01080310882._2
231231 let minLockAmount = $t01080310882._3
232232 let halfLife = $t01080310882._4
233233 if ((size(i.payments) != 1))
234234 then throw("Invalid payments size")
235235 else {
236236 let payment = i.payments[0]
237237 let amount = payment.amount
238238 let invalidAssetMessage = (("Invalid asset. " + toBase58String(bondAssetId)) + " is expected")
239239 let assetId = valueOrErrorMessage(payment.assetId, invalidAssetMessage)
240240 if ((assetId != bondAssetId))
241241 then throw(invalidAssetMessage)
242242 else {
243243 let userAddress = i.caller
244244 let userAddressStr = toString(i.caller)
245245 let $t01142411531 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, -1))
246246 let isNewUser = $t01142411531._1
247247 let lockAmount = $t01142411531._2
248248 let lockStartHeight = $t01142411531._3
249249 let mergedAmount = if (isNewUser)
250250 then amount
251251 else (amount + lockAmount)
252252 let mergedStartHeight = if (isNewUser)
253253 then height
254254 else {
255255 let mathContract = addressFromStringValue(getStringOrFail(keyMathContractAddress()))
256256 asInt(invoke(mathContract, "mergeStakesREADONLY", [amount, height, lockAmount, lockStartHeight, halfLife], nil))
257257 }
258258 if ((minLockAmount > mergedAmount))
259259 then throw(("Min lock amount is " + toString(minLockAmount)))
260260 else {
261261 let $t01198112083 = StatsResult(amount, 1, if (isNewUser)
262262 then 1
263263 else 0)
264264 let statsEntries = $t01198112083._1
265265 let totalStaked = $t01198112083._2
266266 let totalStakedNew = $t01198112083._3
267- let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
268- ((([HistoryRecordEntry("stake", userAddress, i.transactionId, lockAmount, lockStartHeight, mergedAmount, mergedStartHeight)] ++ LockParamsEntry(userAddress, mergedAmount, mergedStartHeight)) ++ statsEntries) :+ IntegerEntry(keyUserRewardFromDepositNum(userAddressStr), getIntOrElse(keyDepositNumLast(), -1)))
267+ ((([HistoryRecordEntry("stake", userAddress, i.transactionId, lockAmount, lockStartHeight, mergedAmount, mergedStartHeight)] ++ RewardEntries(isNewUser, userAddressStr, lockAmount)) ++ LockParamsEntry(userAddress, mergedAmount, mergedStartHeight)) ++ statsEntries)
269268 }
270269 }
271270 }
272271 }
273272
274273
275274
276275 @Callable(i)
277-func unstake (amount) = {
278- let userAddress = i.caller
279- let userAddressStr = toString(userAddress)
280- let $t01258812666 = getParamsOrFail()
281- let auctionAddress = $t01258812666._1
282- let bondAssetId = $t01258812666._2
283- let minLockAmount = $t01258812666._3
284- let halfLife = $t01258812666._4
285- let $t01266912743 = getUserParamsOrFail(userAddress)
286- let isNewUser = $t01266912743._1
287- let lockAmount = $t01266912743._2
288- let lockStart = $t01266912743._3
289- if ((0 >= lockAmount))
290- then throw("Nothing to unstake")
291- else if ((amount > lockAmount))
292- then throw(((("Requested " + toString(amount)) + ", but staked only ") + toString(lockAmount)))
293- else {
294- let mathContract = addressFromStringValue(getStringOrFail(keyMathContractAddress()))
295- let comissionAmount = asInt(invoke(mathContract, "getUnstakeComissionAmountREADONLY", [amount, lockStart, halfLife], nil))
296- let $t01314413298 = StatsResult(-(amount), if ((amount == lockAmount))
297- then -1
298- else 0, if ((amount == lockAmount))
299- then -1
300- else 0)
301- let statsEntries = $t01314413298._1
302- let totalStaked = $t01314413298._2
303- let totalStakedNew = $t01314413298._3
304- ((([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)
305- }
306- }
276+func unstake (amount) = if ((size(i.payments) != 0))
277+ then throw("unstake doesn't require any payment")
278+ else {
279+ let userAddress = i.caller
280+ 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
290+ if ((0 >= lockAmount))
291+ then throw("Nothing to unstake")
292+ else if ((amount > lockAmount))
293+ then throw(((("Requested " + toString(amount)) + ", but staked only ") + toString(lockAmount)))
294+ else {
295+ let mathContract = addressFromStringValue(getStringOrFail(keyMathContractAddress()))
296+ let comissionAmount = asInt(invoke(mathContract, "getUnstakeComissionAmountREADONLY", [amount, lockStart, halfLife], nil))
297+ let $t01312513279 = StatsResult(-(amount), if ((amount == lockAmount))
298+ then -1
299+ else 0, if ((amount == lockAmount))
300+ then -1
301+ else 0)
302+ let statsEntries = $t01312513279._1
303+ let totalStaked = $t01312513279._2
304+ let totalStakedNew = $t01312513279._3
305+ ((([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)
306+ }
307+ }
307308
308309
309310
310311 @Callable(i)
311312 func deposit () = if ((size(i.payments) != 1))
312313 then throw("exact 1 payment is allowed only")
313314 else {
314315 let pmt = i.payments[0]
315316 let amount = pmt.amount
316317 let pmtAssetId = valueOrElse(pmt.assetId, WAVESID)
317318 let pmtAssetIdStr = toBase58String(pmtAssetId)
318319 let pmtMultX = if ((pmtAssetId == WAVESID))
319320 then MULTX8
320321 else MULTX6
321322 let amountX = toBigInt(amount)
322323 let totalStaked = getIntOrElse(keyLockParamTotalAmount(), 0)
323324 let totalStakedX = toBigInt(totalStaked)
324325 if ((0 > totalStaked))
325326 then throw("TODO: case is not supported")
326327 else if ((totalStaked == 0))
327328 then IncrementNotDistributedRewardEntry(pmtAssetIdStr, amount)
328329 else {
329330 let rewardPerNsbtX18 = fraction(amountX, MULTX18, totalStakedX)
330331 let depositNumLastKEY = keyDepositNumLast()
331332 let depositNumLast = getIntOrElse(depositNumLastKEY, -1)
332333 let depositNumNew = (depositNumLast + 1)
333334 if (!(contains(supportedAssetsStr, pmtAssetIdStr)))
334335 then throw(((supportedAssetsStr + " doesn't contain ") + pmtAssetIdStr))
335336 else {
336337 func refreshRewardPerNsbtSUM (accum,nextAsset) = {
337338 let rewardPerNsbtSumNewKEY = keyRewardPerNsbtSumAt(depositNumNew, nextAsset)
338339 let sumLastStr = getStrOrElse(keyRewardPerNsbtSumAt(depositNumLast, nextAsset), "0")
339340 (accum :+ (if ((nextAsset == pmtAssetIdStr))
340341 then StringEntry(rewardPerNsbtSumNewKEY, toString((parseBigIntValue(sumLastStr) + rewardPerNsbtX18)))
341342 else StringEntry(rewardPerNsbtSumNewKEY, sumLastStr)))
342343 }
343344
344345 ({
345346 let $l = supportedAssetsList
346347 let $s = size($l)
347348 let $acc0 = nil
348349 func $f0_1 ($a,$i) = if (($i >= $s))
349350 then $a
350351 else refreshRewardPerNsbtSUM($a, $l[$i])
351352
352353 func $f0_2 ($a,$i) = if (($i >= $s))
353354 then $a
354355 else throw("List size exceeds 10")
355356
356357 $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)
357358 } :+ IntegerEntry(depositNumLastKEY, depositNumNew))
358359 }
359360 }
360361 }
361362
362363
363364
364365 @Callable(i)
365366 func claimRewards () = {
366367 let userAddress = i.caller
367368 let userAddressStr = toString(userAddress)
368- let $t01548015585 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
369- let isNewUser = $t01548015585._1
370- let stakedAmount = $t01548015585._2
371- let stakingStart = $t01548015585._3
372- let stakedAmountX = toBigInt(stakedAmount)
373- let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
374- let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
375- let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
376- func forEachAssetCalcUnclaimedReward (accum,asset) = {
377- let $t01594616084 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
378- let rewardTotal = $t01594616084._1
379- let cached = $t01594616084._2
380- let dynamic = $t01594616084._3
381- let rewardCachedPartKEY = $t01594616084._4
382- if ((0 >= rewardTotal))
383- then accum
384- else ((accum :+ ScriptTransfer(userAddress, rewardTotal, toAssetVect(asset))) :+ IntegerEntry(rewardCachedPartKEY, 0))
385- }
369+ if ((size(i.payments) > 0))
370+ then throw("payments are not accepted")
371+ 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
376+ let stakedAmountX = toBigInt(stakedAmount)
377+ let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
378+ let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
379+ let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
380+ 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
386+ if ((0 >= rewardTotal))
387+ then accum
388+ else ((accum :+ ScriptTransfer(userAddress, rewardTotal, toAssetVect(asset))) :+ IntegerEntry(rewardCachedPartKEY, 0))
389+ }
386390
387- let transfers = {
388- let $l = supportedAssetsList
389- let $s = size($l)
390- let $acc0 = nil
391- func $f0_1 ($a,$i) = if (($i >= $s))
392- then $a
393- else forEachAssetCalcUnclaimedReward($a, $l[$i])
391+ let transfers = {
392+ let $l = supportedAssetsList
393+ let $s = size($l)
394+ let $acc0 = nil
395+ func $f0_1 ($a,$i) = if (($i >= $s))
396+ then $a
397+ else forEachAssetCalcUnclaimedReward($a, $l[$i])
394398
395- func $f0_2 ($a,$i) = if (($i >= $s))
396- then $a
397- else throw("List size exceeds 10")
399+ func $f0_2 ($a,$i) = if (($i >= $s))
400+ then $a
401+ else throw("List size exceeds 10")
398402
399- $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)
400- }
401- if ((0 >= size(transfers)))
402- then throw("nothing to claim")
403- else transfers
403+ $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)
404+ }
405+ if ((0 >= size(transfers)))
406+ then throw("nothing to claim")
407+ else (transfers :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast))
408+ }
404409 }
405410
406411
407412
408413 @Callable(i)
409414 func unclaimedRewardsREADONLY (userAddressStr) = {
410415 func forEachAssetZeroReward (accum,asset) = ((accum + makeString([asset, "0", "0"], ":")) + "_")
411416
412417 let unclaimedRewardStr = if ((userAddressStr == ""))
413418 then {
414419 let $l = supportedAssetsList
415420 let $s = size($l)
416421 let $acc0 = ""
417422 func $f0_1 ($a,$i) = if (($i >= $s))
418423 then $a
419424 else forEachAssetZeroReward($a, $l[$i])
420425
421426 func $f0_2 ($a,$i) = if (($i >= $s))
422427 then $a
423428 else throw("List size exceeds 10")
424429
425430 $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)
426431 }
427432 else {
428433 let userAddress = addressFromStringValue(userAddressStr)
429- let $t01684816953 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
430- let isNewUser = $t01684816953._1
431- let stakedAmount = $t01684816953._2
432- let stakingStart = $t01684816953._3
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
433438 let stakedAmountX = toBigInt(stakedAmount)
434439 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
435440 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
436441 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
437442 func forEachAssetCalcUnclaimedReward (accum,asset) = {
438- let $t01729917437 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
439- let rewardTotal = $t01729917437._1
440- let cached = $t01729917437._2
441- let dynamic = $t01729917437._3
442- let rewardCachedPartKEY = $t01729917437._4
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
443448 ((accum + makeString([asset, toString(rewardTotal), "0"], ":")) + "_")
444449 }
445450
446451 let $l = supportedAssetsList
447452 let $s = size($l)
448453 let $acc0 = ""
449454 func $f0_1 ($a,$i) = if (($i >= $s))
450455 then $a
451456 else forEachAssetCalcUnclaimedReward($a, $l[$i])
452457
453458 func $f0_2 ($a,$i) = if (($i >= $s))
454459 then $a
455460 else throw("List size exceeds 10")
456461
457462 $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)
458463 }
459464 $Tuple2(nil, dropRight(unclaimedRewardStr, 1))
460465 }
461466
462467
463468
464469 @Callable(i)
465470 func nsbtStakingSYSREADONLY (userAddressStr) = {
466471 let totalNsbtAmt = getIntOrElse(keyLockParamTotalAmount(), 0)
467472 if ((userAddressStr == ""))
468473 then $Tuple2(nil, [0, totalNsbtAmt, 0])
469474 else {
470475 let userAddress = toAddressOrFail(userAddressStr)
471- let $t01794418048 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
472- let isNewUser = $t01794418048._1
473- let userNsbtAmt = $t01794418048._2
474- let stakingStart = $t01794418048._3
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
475480 $Tuple2(nil, [userNsbtAmt, totalNsbtAmt, stakingStart])
476481 }
477482 }
478483
479484

github/deemru/w8io/3ef1775 
115.94 ms