tx · 5WiKyA1KQfvsWUt4BFKaDJfAKLpeyhebAVsEceEqi5FU

3MuGfNhF98CNBCfthhoJEo6SYUv7zTgkK4J:  -0.01400000 Waves

2022.04.25 19:27 [2024261] smart account 3MuGfNhF98CNBCfthhoJEo6SYUv7zTgkK4J > SELF 0.00000000 Waves

{ "type": 13, "id": "5WiKyA1KQfvsWUt4BFKaDJfAKLpeyhebAVsEceEqi5FU", "fee": 1400000, "feeAssetId": null, "timestamp": 1650904144769, "version": 1, "sender": "3MuGfNhF98CNBCfthhoJEo6SYUv7zTgkK4J", "senderPublicKey": "4DthuG3xjZV9WtZ34Y66AummdAr67wRzwWsVQL4y2bob", "proofs": [ "dQJUDmC3tjc2V6SVDcHijoGudP3hqPYviyt3zfaFUAjARXsTLxmWRT1B2mv8347h8mhCYfxhwZ6ZXuRRAS2TLnf" ], "script": "base64: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AaQAAAABCAUAAAAJbGFzdEJsb2NrAAAABmhlaWdodAkABEwAAAACCQABpAAAAAEIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wCQAETAAAAAIJAAGkAAAAAQUAAAAJb2xkQW1vdW50CQAETAAAAAIJAAGkAAAAAQUAAAAIb2xkU3RhcnQJAARMAAAAAgkAAaQAAAABBQAAAAluZXdBbW91bnQJAARMAAAAAgkAAaQAAAABBQAAAAhuZXdTdGFydAUAAAADbmlsBQAAAAlzZXBhcmF0b3IBAAAAGGZvcm1hdENsYWltSGlzdG9yeVJlY29yZAAAAAIAAAAEdXNlcgAAAA5jbGFpbWVkUmV3YXJkcwkABLkAAAACCQAETAAAAAICAAAACCVzJWQlZCVzCQAETAAAAAIFAAAABHVzZXIJAARMAAAAAgkAAaQAAAABCAUAAAAJbGFzdEJsb2NrAAAABmhlaWdodAkABEwAAAACCQABpAAAAAEIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wCQAETAAAAAIFAAAADmNsYWltZWRSZXdhcmRzBQAAAANuaWwFAAAACXNlcGFyYXRvcgEAAAASSGlzdG9yeVJlY29yZEVudHJ5AAAABwAAAAR0eXBlAAAAC3VzZXJBZGRyZXNzAAAABHR4SWQAAAAJb2xkQW1vdW50AAAACG9sZFN0YXJ0AAAACW5ld0Ftb3VudAAAAAhuZXdTdGFydAkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEGtleUhpc3RvcnlSZWNvcmQAAAADBQAAAAR0eXBlBQAAAAt1c2VyQWRkcmVzcwUAAAAEdHhJZAkBAAAAE2Zvcm1hdEhpc3RvcnlSZWNvcmQAAAAEBQAAAAlvbGRBbW91bnQFAAAACG9sZFN0YXJ0BQAAAAluZXdBbW91bnQFAAAACG5ld1N0YXJ0AQAAABFDbGFpbUhpc3RvcnlFbnRyeQAAAAMAAAALdXNlckFkZHJlc3MAAAAEdHhJZAAAAA5jbGFpbWVkUmV3YXJkcwkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEGtleUhpc3RvcnlSZWNvcmQAAAADAgAAAAVjbGFpbQUAAAALdXNlckFkZHJlc3MFAAAABHR4SWQJAQAAABhmb3JtYXRDbGFpbUhpc3RvcnlSZWNvcmQAAAACCQAEJQAAAAEFAAAAC3VzZXJBZGRyZXNzBQAAAA5jbGFpbWVkUmV3YXJkcwEAAAALU3RhdHNSZXN1bHQAAAADAAAADnRvdGFsTG9ja2VkSW5jAAAADGxvY2tDb3VudEluYwAAAA11c2Vyc0NvdW50SW5jBAAAAApsb2Nrc0NvdW50CQEAAAAMZ2V0SW50T3JaZXJvAAAAAQkBAAAAEmtleVN0YXRzTG9ja3NDb3VudAAAAAAEAAAACnVzZXJzQ291bnQJAQAAAAxnZXRJbnRPclplcm8AAAABCQEAAAASa2V5U3RhdHNVc2Vyc0NvdW50AAAAAAQAAAALdG90YWxBbW91bnQJAQAAAAxnZXRJbnRPclplcm8AAAABCQEAAAAXa2V5TG9ja1BhcmFtVG90YWxBbW91bnQAAAAABAAAAA50b3RhbEFtb3VudE5ldwkAAGQAAAACBQAAAAt0b3RhbEFtb3VudAUAAAAOdG90YWxMb2NrZWRJbmMJAAUVAAAAAwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAEmtleVN0YXRzTG9ja3NDb3VudAAAAAAJAABkAAAAAgUAAAAKbG9ja3NDb3VudAUAAAAMbG9ja0NvdW50SW5jCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAASa2V5U3RhdHNVc2Vyc0NvdW50AAAAAAkAAGQAAAACBQAAAAp1c2Vyc0NvdW50BQAAAA11c2Vyc0NvdW50SW5jCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAXa2V5TG9ja1BhcmFtVG90YWxBbW91bnQAAAAABQAAAA50b3RhbEFtb3VudE5ldwUAAAADbmlsBQAAAAt0b3RhbEFtb3VudAUAAAAOdG90YWxBbW91bnROZXcBAAAAD0xvY2tQYXJhbXNFbnRyeQAAAAMAAAALdXNlckFkZHJlc3MAAAAGYW1vdW50AAAABXN0YXJ0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAWa2V5TG9ja1BhcmFtVXNlckFtb3VudAAAAAEFAAAAC3VzZXJBZGRyZXNzBQAAAAZhbW91bnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABZrZXlMb2NrUGFyYW1TdGFydEJsb2NrAAAAAQUAAAALdXNlckFkZHJlc3MFAAAABXN0YXJ0BQAAAANuaWwBAAAAD2dldFBhcmFtc09yRmFpbAAAAAAEAAAAEG5ldXRyaW5vQ29udHJhY3QJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEJAQAAAA9nZXRTdHJpbmdPckZhaWwAAAABCQEAAAAaa2V5TmV1dHJpbm9Db250cmFjdEFkZHJlc3MAAAAACQAFFgAAAAQJAAJZAAAAAQkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAkBAAAAGWtleUF1Y3Rpb25Db250cmFjdEFkZHJlc3MAAAAACQACWQAAAAEJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIFAAAAEG5ldXRyaW5vQ29udHJhY3QJAQAAAAxrZXlCb25kQXNzZXQAAAAACQEAAAAMZ2V0SW50T3JGYWlsAAAAAQkBAAAAEGtleU1pbkxvY2tBbW91bnQAAAAACQEAAAAMZ2V0SW50T3JGYWlsAAAAAQkBAAAAC2tleUhhbGZMaWZlAAAAAAEAAAAMaXNBY3RpdmVVc2VyAAAAAQAAAAt1c2VyQWRkcmVzcwkAAGYAAAACCQEAAAAMZ2V0SW50T3JFbHNlAAAAAgkBAAAAFmtleUxvY2tQYXJhbVVzZXJBbW91bnQAAAABBQAAAAt1c2VyQWRkcmVzcwAAAAAAAAAAAAAAAAAAAAAAAAEAAAATZ2V0VXNlclBhcmFtc09yVW5pdAAAAAEAAAALdXNlckFkZHJlc3MDCQEAAAAMaXNBY3RpdmVVc2VyAAAAAQUAAAALdXNlckFkZHJlc3MJAAUVAAAAAwcJAQAAAAxnZXRJbnRPckZhaWwAAAABCQEAAAAWa2V5TG9ja1BhcmFtVXNlckFtb3VudAAAAAEFAAAAC3VzZXJBZGRyZXNzCQEAAAAMZ2V0SW50T3JGYWlsAAAAAQkBAAAAFmtleUxvY2tQYXJhbVN0YXJ0QmxvY2sAAAABBQAAAAt1c2VyQWRkcmVzcwUAAAAEdW5pdAEAAAATZ2V0VXNlclBhcmFtc09yRmFpbAAAAAEAAAALdXNlckFkZHJlc3MJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkBAAAAE2dldFVzZXJQYXJhbXNPclVuaXQAAAABBQAAAAt1c2VyQWRkcmVzcwkAASwAAAACCQABLAAAAAICAAAABVVzZXIgCQAEJQAAAAEFAAAAC3VzZXJBZGRyZXNzAgAAAA8gaXMgbm90IGRlZmluZWQAAAAAEnN1cHBvcnRlZEFzc2V0c1N0cgkBAAAADGdldFN0ck9yRWxzZQAAAAIJAQAAABhrZXlTdXBwb3J0ZWRSZXdhcmRBc3NldHMAAAAAAgAAAAAAAAAAE3N1cHBvcnRlZEFzc2V0c0xpc3QJAAS1AAAAAgUAAAASc3VwcG9ydGVkQXNzZXRzU3RyAgAAAAFfAQAAAApjYWxjUmV3YXJkAAAABQAAAAt1c2VyQWRkcmVzcwAAAAdhc3NldElkAAAADXN0YWtlZEFtb3VudFgAAAAOZGVwb3NpdE51bVVzZXIAAAAOZGVwb3NpdE51bUxhc3QEAAAAF3Jld2FyZFBlck5zYnRTdW1MYXN0S0VZCQEAAAAVa2V5UmV3YXJkUGVyTnNidFN1bUF0AAAAAgUAAAAOZGVwb3NpdE51bUxhc3QFAAAAB2Fzc2V0SWQEAAAACnN1bUxhc3RYMTgJAAGnAAAAAQkBAAAADGdldFN0ck9yRWxzZQAAAAIJAQAAABVrZXlSZXdhcmRQZXJOc2J0U3VtQXQAAAACBQAAAA5kZXBvc2l0TnVtTGFzdAUAAAAHYXNzZXRJZAIAAAABMAQAAAAKc3VtVXNlclgxOAkAAacAAAABCQEAAAAMZ2V0U3RyT3JFbHNlAAAAAgkBAAAAFWtleVJld2FyZFBlck5zYnRTdW1BdAAAAAIFAAAADmRlcG9zaXROdW1Vc2VyBQAAAAdhc3NldElkAgAAAAEwBAAAABFyZXdhcmREeW5hbWljUGFydAkAAaAAAAABCQABPAAAAAMJAAE4AAAAAgUAAAAKc3VtTGFzdFgxOAUAAAAKc3VtVXNlclgxOAUAAAANc3Rha2VkQW1vdW50WAUAAAAHTVVMVFgxOAQAAAATcmV3YXJkQ2FjaGVkUGFydEtFWQkBAAAACWtleVJld2FyZAAAAAIFAAAAC3VzZXJBZGRyZXNzBQAAAAdhc3NldElkBAAAABByZXdhcmRDYWNoZWRQYXJ0CQEAAAAMZ2V0SW50T3JFbHNlAAAAAgUAAAATcmV3YXJkQ2FjaGVkUGFydEtFWQAAAAAAAAAAAAkABRYAAAAECQAAZAAAAAIFAAAAEHJld2FyZENhY2hlZFBhcnQFAAAAEXJld2FyZER5bmFtaWNQYXJ0BQAAABByZXdhcmRDYWNoZWRQYXJ0BQAAABFyZXdhcmREeW5hbWljUGFydAUAAAATcmV3YXJkQ2FjaGVkUGFydEtFWQEAAAANUmV3YXJkRW50cmllcwAAAAMAAAAJaXNOZXdVc2VyAAAAC3VzZXJBZGRyZXNzAAAADHN0YWtlZEFtb3VudAQAAAANc3Rha2VkQW1vdW50WAkAATYAAAABBQAAAAxzdGFrZWRBbW91bnQEAAAAG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQkBAAAAG2tleVVzZXJSZXdhcmRGcm9tRGVwb3NpdE51bQAAAAEFAAAAC3VzZXJBZGRyZXNzBAAAAA5kZXBvc2l0TnVtVXNlcgkBAAAADGdldEludE9yRWxzZQAAAAIFAAAAG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQD//////////wQAAAAOZGVwb3NpdE51bUxhc3QJAQAAAAxnZXRJbnRPckVsc2UAAAACCQEAAAARa2V5RGVwb3NpdE51bUxhc3QAAAAAAP//////////CgEAAAAbZm9yRWFjaEFzc2V0Q2FjaGVVc2VyUmV3YXJkAAAAAgAAAAVhY2N1bQAAAAVhc3NldAQAAAALJHQwNzQwMDc1MzUJAQAAAApjYWxjUmV3YXJkAAAABQUAAAALdXNlckFkZHJlc3MFAAAABWFzc2V0BQAAAA1zdGFrZWRBbW91bnRYBQAAAA5kZXBvc2l0TnVtVXNlcgUAAAAOZGVwb3NpdE51bUxhc3QEAAAAC3Jld2FyZFRvdGFsCAUAAAALJHQwNzQwMDc1MzUAAAACXzEEAAAABmNhY2hlZAgFAAAACyR0MDc0MDA3NTM1AAAAAl8yBAAAAAdkeW5hbWljCAUAAAALJHQwNzQwMDc1MzUAAAACXzMEAAAAE3Jld2FyZENhY2hlZFBhcnRLRVkIBQAAAAskdDA3NDAwNzUzNQAAAAJfNAkABE0AAAACBQAAAAVhY2N1bQkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAE3Jld2FyZENhY2hlZFBhcnRL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AAAAAAoJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABt1c2VyUmV3YXJkRnJvbURlcG9zaXROdW1LRVkFAAAADmRlcG9zaXROdW1MYXN0CQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAJHVuY292ZXJlZCBjb25kaXRpb246IGRlcG9zaXROdW1MYXN0PQkAAaQAAAABBQAAAA5kZXBvc2l0TnVtTGFzdAIAAAAQIGRlcG9zaXROdW1Vc2VyPQkAAaQAAAABBQAAAA5kZXBvc2l0TnVtVXNlcgEAAAAiSW5jcmVtZW50Tm90RGlzdHJpYnV0ZWRSZXdhcmRFbnRyeQAAAAIAAAADdGtuAAAACWFtb3VudEluYwQAAAAXbm90RGlzdHJpYnV0ZWRSZXdhcmRLRVkJAQAAABdrZXlOb3REaXN0cmlidXRlZFJld2FyZAAAAAEFAAAAA3RrbgQAAAAUbm90RGlzdHJpYnV0ZWRSZXdhcmQJAQAAAAxnZXRJbnRPckVsc2UAAAACBQAAABdub3REaXN0cmlidXRlZFJld2FyZEtFWQAAAAAAAAAAAAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAXbm90RGlzdHJpYnV0ZWRSZXdhcmRLRVkJAABkAAAAAgUAAAAUbm90RGlzdHJpYnV0ZWRSZXdhcmQFAAAACWFtb3VudEluYwUAAAADbmlsAAAABwAAAAFpAQAAAAtjb25zdHJ1Y3RvcgAAAAUAAAAXbmV1dHJpbm9Db250cmFjdEFkZHJlc3MAAAATbWF0aENvbnRyYWN0QWRkcmVzcwAAAA1taW5Mb2NrQW1vdW50AAAACGhhbGZMaWZlAAAAFXN1cHBvcnRlZFJld2FyZEFzc2V0cwMJAQAAAAIhPQAAAAIIBQAAAAFpAAAABmNhbGxlcgUAAAAEdGhpcwkAAAIAAAABAgAAABFQZXJtaXNzaW9uIGRlbmllZAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAaa2V5TmV1dHJpbm9Db250cmFjdEFkZHJlc3MAAAAABQAAABduZXV0cmlub0NvbnRyYWN0QWRkcmVzcwkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAWa2V5TWF0aENvbnRyYWN0QWRkcmVzcwAAAAAFAAAAE21hdGhDb250cmFjdEFkZHJlc3MJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABBrZXlNaW5Mb2NrQW1vdW50AAAAAAUAAAANbWluTG9ja0Ftb3VudAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAC2tleUhhbGZMaWZlAAAAAAUAAAAIaGFsZkxpZmUJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAGGtleVN1cHBvcnRlZFJld2FyZEFzc2V0cwAAAAAFAAAAFXN1cHBvcnRlZFJld2FyZEFzc2V0cwUAAAADbmlsAAAAAWkBAAAABXN0YWtlAAAAAAQAAAANJHQwMTExODkxMTI2OAkBAAAAD2dldFBhcmFtc09yRmFpbAAAAAAEAAAAD2F1Y3Rpb25Db250cmFjdAgFAAAADSR0MDExMTg5MTEyNjgAAAACXzEEAAAAC2JvbmRBc3NldElkCAUAAAANJHQwMTExODkxMTI2OAAAAAJfMgQAAAANbWluTG9ja0Ftb3VudAgFAAAADSR0MDExMTg5MTEyNjgAAAACXzMEAAAACGhhbGZMaWZlCAUAAAANJHQwMTExODkxMTI2OAAAAAJfNAMJAQAAAAIhPQAAAAIJAAGQAAAAAQgFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEJAAACAAAAAQIAAAAVSW52YWxpZCBwYXltZW50cyBzaXplBAAAAAdwYXltZW50CQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAABAAAAAZhbW91bnQIBQAAAAdwYXltZW50AAAABmFtb3VudAQAAAATaW52YWxpZEFzc2V0TWVzc2FnZQkAASwAAAACCQABLAAAAAICAAAAD0ludmFsaWQgYXNzZXQuIAkAAlgAAAABBQAAAAtib25kQXNzZXRJZAIAAAAMIGlzIGV4cGVjdGVkBAAAAAdhc3NldElkCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIIBQAAAAdwYXltZW50AAAAB2Fzc2V0SWQFAAAAE2ludmFsaWRBc3NldE1lc3NhZ2UDCQEAAAACIT0AAAACBQAAAAdhc3NldElkBQAAAAtib25kQXNzZXRJZAkAAAIAAAABBQAAABNpbnZhbGlkQXNzZXRNZXNzYWdlBAAAAAt1c2VyQWRkcmVzcwgFAAAAAWkAAAAGY2FsbGVyBAAAAA51c2VyQWRkcmVzc1N0cgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAADSR0MDExODEwMTE5MTcJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAQAAABNnZXRVc2VyUGFyYW1zT3JVbml0AAAAAQUAAAALdXNlckFkZHJlc3MJAAUVAAAAAwYAAAAAAAAAAAAA//////////8EAAAACWlzTmV3VXNlcggFAAAADSR0MDExODEwMTE5MTcAAAACXzEEAAAACmxvY2tBbW91bnQIBQAAAA0kdDAxMTgxMDExOTE3AAAAAl8yBAAAAA9sb2NrU3RhcnRIZWlnaHQIBQAAAA0kdDAxMTgxMDExOTE3AAAAAl8zBAAAAAxtZXJnZWRBbW91bnQDBQAAAAlpc05ld1VzZXIFAAAABmFtb3VudAkAAGQAAAACBQAAAAZhbW91bnQFAAAACmxvY2tBbW91bnQEAAAAEW1lcmdlZFN0YXJ0SGVpZ2h0AwUAAAAJaXNOZXdVc2VyBQAAAAZoZWlnaHQEAAAADG1hdGhDb250cmFjdAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAEJAQAAABZrZXlNYXRoQ29udHJhY3RBZGRyZXNzAAAAAAkBAAAABWFzSW50AAAAAQkAA/wAAAAEBQAAAAxtYXRoQ29udHJhY3QCAAAAE21lcmdlU3Rha2VzUkVBRE9OTFkJAARMAAAAAgUAAAAGYW1vdW50CQAETAAAAAIFAAAABmhlaWdodAkABEwAAAACBQAAAApsb2NrQW1vdW50CQAETAAAAAIFAAAAD2xvY2tTdGFydEhlaWdodAkABEwAAAACBQAAAAhoYWxmTGlmZQUAAAADbmlsBQAAAANuaWwDCQAAZgAAAAIFAAAADW1pbkxvY2tBbW91bnQFAAAADG1lcmdlZEFtb3VudAkAAAIAAAABCQABLAAAAAICAAAAE01pbiBsb2NrIGFtb3VudCBpcyAJAAGkAAAAAQUAAAANbWluTG9ja0Ftb3VudAQAAAANJHQwMTIzNjcxMjQ2OQkBAAAAC1N0YXRzUmVzdWx0AAAAAwUAAAAGYW1vdW50AAAAAAAAAAABAwUAAAAJaXNOZXdVc2VyAAAAAAAAAAABAAAAAAAAAAAABAAAAAxzdGF0c0VudHJpZXMIBQAAAA0kdDAxMjM2NzEyNDY5AAAAAl8xBAAAAAt0b3RhbFN0YWtlZAgFAAAADSR0MDEyMzY3MTI0NjkAAAACXzIEAAAADnRvdGFsU3Rha2VkTmV3CAUAAAANJHQwMTIzNjcxMjQ2OQAAAAJfMwkABE4AAAACCQAETgAAAAIJAAROAAAAAgkABEwAAAACCQEAAAASSGlzdG9yeVJlY29yZEVudHJ5AAAABwIAAAAFc3Rha2UFAAAAC3VzZXJBZGRyZXNzCAUAAAABaQAAAA10cmFuc2FjdGlvbklkBQAAAApsb2NrQW1vdW50BQAAAA9sb2NrU3RhcnRIZWlnaHQFAAAADG1lcmdlZEFtb3VudAUAAAARbWVyZ2VkU3RhcnRIZWlnaHQFAAAAA25pbAkBAAAADVJld2FyZEVudHJpZXMAAAADBQAAAAlpc05ld1VzZXIFAAAADnVzZXJBZGRyZXNzU3RyBQAAAApsb2NrQW1vdW50CQEAAAAPTG9ja1BhcmFtc0VudHJ5AAAAAwUAAAALdXNlckFkZHJlc3MFAAAADG1lcmdlZEFtb3VudAUAAAARbWVyZ2VkU3RhcnRIZWlnaHQFAAAADHN0YXRzRW50cmllcwAAAAFpAQAAAAd1bnN0YWtlAAAAAQAAAAZhbW91bnQDCQEAAAACIT0AAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAACQAAAgAAAAECAAAAI3Vuc3Rha2UgZG9lc24ndCByZXF1aXJlIGFueSBwYXltZW50BAAAAAt1c2VyQWRkcmVzcwgFAAAAAWkAAAAGY2FsbGVyBAAAAA51c2VyQWRkcmVzc1N0cgkABCUAAAABBQAAAAt1c2VyQWRkcmVzcwQAAAANJHQwMTI5NTUxMzAzMwkBAAAAD2dldFBhcmFtc09yRmFpbAAAAAAEAAAADmF1Y3Rpb25BZGRyZXNzCAUAAAANJHQwMTI5NTUxMzAzMwAAAAJfMQQAAAALYm9uZEFzc2V0SWQIBQAAAA0kdDAxMjk1NTEzMDMzAAAAAl8yBAAAAA1taW5Mb2NrQW1vdW50CAUAAAAN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dWVPckVsc2UAAAACCAUAAAADcG10AAAAB2Fzc2V0SWQFAAAAB1dBVkVTSUQEAAAADXBtdEFzc2V0SWRTdHIJAAJYAAAAAQUAAAAKcG10QXNzZXRJZAQAAAAIcG10TXVsdFgDCQAAAAAAAAIFAAAACnBtdEFzc2V0SWQFAAAAB1dBVkVTSUQFAAAABk1VTFRYOAUAAAAGTVVMVFg2BAAAAAdhbW91bnRYCQABNgAAAAEFAAAABmFtb3VudAQAAAALdG90YWxTdGFrZWQJAQAAAAxnZXRJbnRPckVsc2UAAAACCQEAAAAXa2V5TG9ja1BhcmFtVG90YWxBbW91bnQAAAAAAAAAAAAAAAAABAAAAAx0b3RhbFN0YWtlZFgJAAE2AAAAAQUAAAALdG90YWxTdGFrZWQDCQAAZgAAAAIAAAAAAAAAAAAFAAAAC3RvdGFsU3Rha2VkCQAAAgAAAAECAAAAG1RPRE86IGNhc2UgaXMgbm90IHN1cHBvcnRlZAMJAAAAAAAAAgUAAAALdG90YWxTdGFrZWQAAAAAAAAAAAAJAQAAACJJbmNyZW1lbnROb3REaXN0cmlidXRlZFJld2FyZEVudHJ5AAAAAgUAAAANcG10QXNzZXRJZFN0cgUAAAAGYW1vdW50BAAAABByZXdhcmRQZXJOc2J0WDE4CQABPAAAAAMFAAAAB2Ftb3VudFgFAAAAB01VTFRYMTgFAAAADHRvdGFsU3Rha2VkWAQAAAARZGVwb3NpdE51bUxhc3RLRVkJAQAAABFrZXlEZXBvc2l0TnVtTGFzdAAAAAAEAAAADmRlcG9zaXROdW1MYXN0CQEAAAAMZ2V0SW50T3JFbHNlAAAAAgUAAAARZGVwb3NpdE51bUxhc3RLRVkA//////////8EAAAADWRlcG9zaXROdW1OZXcJAABkAAAAAgUAAAAOZGVwb3NpdE51bUxhc3QAAAAAAAAAAAEDCQEAAAABIQAAAAEJAQAAAAhjb250YWlucwAAAAIFAAAAEnN1cHBvcnRlZEFzc2V0c1N0cgUAAAANcG10QXNzZXRJZFN0cgkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgUAAAASc3VwcG9ydGVkQXNzZXRzU3RyAgAAABEgZG9lc24ndCBjb250YWluIAUAAAANcG10QXNzZXRJZFN0cgoBAAAAF3Jl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AAD//////////woBAAAAH2ZvckVhY2hBc3NldENhbGNVbmNsYWltZWRSZXdhcmQAAAACAAAABWFjY3VtAAAABWFzc2V0BAAAAA0kdDAxNjM5NzE2NTM1CQEAAAAKY2FsY1Jld2FyZAAAAAUFAAAADnVzZXJBZGRyZXNzU3RyBQAAAAVhc3NldAUAAAANc3Rha2VkQW1vdW50WAUAAAAOZGVwb3NpdE51bVVzZXIFAAAADmRlcG9zaXROdW1MYXN0BAAAAAtyZXdhcmRUb3RhbAgFAAAADSR0MDE2Mzk3MTY1MzUAAAACXzEEAAAABmNhY2hlZAgFAAAADSR0MDE2Mzk3MTY1MzUAAAACXzIEAAAAB2R5bmFtaWMIBQAAAA0kdDAxNjM5NzE2NTM1AAAAAl8zBAAAABNyZXdhcmRDYWNoZWRQYXJ0S0VZCAUAAAANJHQwMTYzOTcxNjUzNQAAAAJfNAQAAAAKY2xhaW1lZEtFWQkBAAAACmtleUNsYWltZWQAAAACBQAAAA51c2VyQWRkcmVzc1N0cgUAAAAFYXNzZXQEAAAADSR0MDE2NTk1MTY2MzIFAAAABWFjY3VtBAAAAARkYXRhCAUAAAANJHQwMTY1OTUxNjYzMgAAAAJfMQQAAAARY2xhaW1lZEFtdEJ5QXNzZXQIBQAAAA0kdDAxNjU5NTE2NjMyAAAAAl8yBAAAAAduZXdQYXJ0CQAEuQAAAAIJAARMAAAAAgUAAAAFYXNzZXQJAARMAAAAAgkAAaQAAAABBQAAAAtyZXdhcmRUb3RhbAUAAAADbmlsAgAAAAE6BAAAABRjbGFpbWVkQW10QnlBc3NldE5ldwkABLkAAAACCQAETAAAAAIFAAAAEWNsYWltZWRBbXRCeUFzc2V0CQAETAAAAAIFAAAAB25ld1BhcnQFAAAAA25pbAIAAAABXwMJAABnAAAAAgAAAAAAAAAAAAUAAAALcmV3YXJkVG90YWwJAAUUAAAAAgUAAAAEZGF0YQUAAAAUY2xhaW1lZEFtdEJ5QXNzZXROZXcJAAUUAAAAAgkABE0AAAACCQAETQAAAAIJAARNAAAAAgUAAAAEZGF0YQkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAALdXNlckFkZHJlc3MFAAAAC3Jld2FyZFRvdGFsCQEAAAALdG9Bc3NldFZlY3QA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BSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgUAAAAFJGFjYzAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAIAAAAAAAAAAAMAAAAAAAAAAAQAAAAAAAAAAAUAAAAAAAAAAAYAAAAAAAAAAAcAAAAAAAAAAAgAAAAAAAAAAAkAAAAAAAAAAAoEAAAAC3VzZXJBZGRyZXNzCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABBQAAAA51c2VyQWRkcmVzc1N0cgQAAAANJHQwMTc4NjUxNzk3MAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkBAAAAE2dldFVzZXJQYXJhbXNPclVuaXQAAAABBQAAAAt1c2VyQWRkcmVzcwkABRUAAAADBgAAAAAAAAAAAAAAAAAAAAAAAAQAAAAJaXNOZXdVc2VyCAUAAAANJHQwMTc4NjUxNzk3MAAAAAJfMQQAAAAMc3Rha2VkQW1vdW50CAUAAAANJHQwMTc4NjUxNzk3MAAAAAJfMgQAAAAMc3Rha2luZ1N0YXJ0CAUAAAANJHQwMTc4NjUxNzk3MAAAAAJfMwQAAAANc3Rha2VkQW1vdW50WAkAATYAAAABBQAAAAxzdGFrZWRBbW91bnQEAAAAG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQkBAAAAG2tleVVzZXJSZXdhcmRGcm9tRGVwb3NpdE51bQAAAAEFAAAADnVzZXJBZGRyZXNzU3RyBAAAAA5kZXBvc2l0TnVtVXNlcgkBAAAADGdldEludE9yRWxzZQAAAAIFAAAAG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQD//////////wQAAAAOZGVwb3NpdE51bUxhc3QJAQAAAAxnZXRJbnRPckVsc2UAAAACCQEAAAARa2V5RGVwb3NpdE51bUxhc3QAAAAAAP//////////CgEAAAAfZm9yRWFjaEFzc2V0Q2FsY1VuY2xhaW1lZFJld2FyZAAAAAIAAAAFYWNjdW0AAAAFYXNzZXQEAAAADSR0MDE4MzE2MTg0NTQJAQAAAApjYWxjUmV3YXJkAAAABQUAAAAOdXNlckFkZHJlc3NTdHIFAAAA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", "chainId": 84, "height": 2024261, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 6dE1gqpaf9zpKivoEwrQki2CfnyWWU8EdDSXpQKEPL6m Next: FANvdUD69AmAbDDCwtvkxuKJzLMN9ehHWEFBEepVWrrp Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let revisionNum = ""
5-
64 let separator = "__"
75
86 let MULT6 = 1000000
175173 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
176174 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
177175 func forEachAssetCacheUserReward (accum,asset) = {
178- let $t073617496 = calcReward(userAddress, asset, stakedAmountX, depositNumUser, depositNumLast)
179- let rewardTotal = $t073617496._1
180- let cached = $t073617496._2
181- let dynamic = $t073617496._3
182- let rewardCachedPartKEY = $t073617496._4
176+ let $t074007535 = calcReward(userAddress, asset, stakedAmountX, depositNumUser, depositNumLast)
177+ let rewardTotal = $t074007535._1
178+ let cached = $t074007535._2
179+ let dynamic = $t074007535._3
180+ let rewardCachedPartKEY = $t074007535._4
183181 (accum :+ IntegerEntry(rewardCachedPartKEY, rewardTotal))
184182 }
185183
249247
250248 @Callable(i)
251249 func stake () = {
252- let $t01115011229 = getParamsOrFail()
253- let auctionContract = $t01115011229._1
254- let bondAssetId = $t01115011229._2
255- let minLockAmount = $t01115011229._3
256- let halfLife = $t01115011229._4
250+ let $t01118911268 = getParamsOrFail()
251+ let auctionContract = $t01118911268._1
252+ let bondAssetId = $t01118911268._2
253+ let minLockAmount = $t01118911268._3
254+ let halfLife = $t01118911268._4
257255 if ((size(i.payments) != 1))
258256 then throw("Invalid payments size")
259257 else {
266264 else {
267265 let userAddress = i.caller
268266 let userAddressStr = toString(i.caller)
269- let $t01177111878 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, -1))
270- let isNewUser = $t01177111878._1
271- let lockAmount = $t01177111878._2
272- let lockStartHeight = $t01177111878._3
267+ let $t01181011917 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, -1))
268+ let isNewUser = $t01181011917._1
269+ let lockAmount = $t01181011917._2
270+ let lockStartHeight = $t01181011917._3
273271 let mergedAmount = if (isNewUser)
274272 then amount
275273 else (amount + lockAmount)
282280 if ((minLockAmount > mergedAmount))
283281 then throw(("Min lock amount is " + toString(minLockAmount)))
284282 else {
285- let $t01232812430 = StatsResult(amount, 1, if (isNewUser)
283+ let $t01236712469 = StatsResult(amount, 1, if (isNewUser)
286284 then 1
287285 else 0)
288- let statsEntries = $t01232812430._1
289- let totalStaked = $t01232812430._2
290- let totalStakedNew = $t01232812430._3
286+ let statsEntries = $t01236712469._1
287+ let totalStaked = $t01236712469._2
288+ let totalStakedNew = $t01236712469._3
291289 ((([HistoryRecordEntry("stake", userAddress, i.transactionId, lockAmount, lockStartHeight, mergedAmount, mergedStartHeight)] ++ RewardEntries(isNewUser, userAddressStr, lockAmount)) ++ LockParamsEntry(userAddress, mergedAmount, mergedStartHeight)) ++ statsEntries)
292290 }
293291 }
302300 else {
303301 let userAddress = i.caller
304302 let userAddressStr = toString(userAddress)
305- let $t01291612994 = getParamsOrFail()
306- let auctionAddress = $t01291612994._1
307- let bondAssetId = $t01291612994._2
308- let minLockAmount = $t01291612994._3
309- let halfLife = $t01291612994._4
310- let $t01299713071 = getUserParamsOrFail(userAddress)
311- let isNewUser = $t01299713071._1
312- let lockAmount = $t01299713071._2
313- let lockStart = $t01299713071._3
303+ let $t01295513033 = getParamsOrFail()
304+ let auctionAddress = $t01295513033._1
305+ let bondAssetId = $t01295513033._2
306+ let minLockAmount = $t01295513033._3
307+ let halfLife = $t01295513033._4
308+ let $t01303613110 = getUserParamsOrFail(userAddress)
309+ let isNewUser = $t01303613110._1
310+ let lockAmount = $t01303613110._2
311+ let lockStart = $t01303613110._3
314312 if ((0 >= lockAmount))
315313 then throw("Nothing to unstake")
316314 else if ((amount > lockAmount))
318316 else {
319317 let mathContract = addressFromStringValue(getStringOrFail(keyMathContractAddress()))
320318 let comissionAmount = asInt(invoke(mathContract, "getUnstakeComissionAmountREADONLY", [amount, lockStart, halfLife], nil))
321- let $t01347213626 = StatsResult(-(amount), if ((amount == lockAmount))
319+ let $t01351113665 = StatsResult(-(amount), if ((amount == lockAmount))
322320 then -1
323321 else 0, if ((amount == lockAmount))
324322 then -1
325323 else 0)
326- let statsEntries = $t01347213626._1
327- let totalStaked = $t01347213626._2
328- let totalStakedNew = $t01347213626._3
324+ let statsEntries = $t01351113665._1
325+ let totalStaked = $t01351113665._2
326+ let totalStakedNew = $t01351113665._3
329327 ((([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)
330328 }
331329 }
393391 if ((size(i.payments) > 0))
394392 then throw("payments are not accepted")
395393 else {
396- let $t01588215987 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
397- let isNewUser = $t01588215987._1
398- let stakedAmount = $t01588215987._2
399- let stakingStart = $t01588215987._3
394+ let $t01592116026 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
395+ let isNewUser = $t01592116026._1
396+ let stakedAmount = $t01592116026._2
397+ let stakingStart = $t01592116026._3
400398 let stakedAmountX = toBigInt(stakedAmount)
401399 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
402400 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
403401 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
404402 func forEachAssetCalcUnclaimedReward (accum,asset) = {
405- let $t01635816496 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
406- let rewardTotal = $t01635816496._1
407- let cached = $t01635816496._2
408- let dynamic = $t01635816496._3
409- let rewardCachedPartKEY = $t01635816496._4
403+ let $t01639716535 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
404+ let rewardTotal = $t01639716535._1
405+ let cached = $t01639716535._2
406+ let dynamic = $t01639716535._3
407+ let rewardCachedPartKEY = $t01639716535._4
410408 let claimedKEY = keyClaimed(userAddressStr, asset)
411- let $t01655616593 = accum
412- let data = $t01655616593._1
413- let claimedAmtByAsset = $t01655616593._2
409+ let $t01659516632 = accum
410+ let data = $t01659516632._1
411+ let claimedAmtByAsset = $t01659516632._2
414412 let newPart = makeString([asset, toString(rewardTotal)], ":")
415413 let claimedAmtByAssetNew = makeString([claimedAmtByAsset, newPart], "_")
416414 if ((0 >= rewardTotal))
418416 else $Tuple2((((data :+ ScriptTransfer(userAddress, rewardTotal, toAssetVect(asset))) :+ IntegerEntry(claimedKEY, (valueOrElse(getInteger(claimedKEY), 0) + rewardTotal))) :+ IntegerEntry(rewardCachedPartKEY, 0)), claimedAmtByAssetNew)
419417 }
420418
421- let $t01705317167 = {
419+ let $t01709217206 = {
422420 let $l = supportedAssetsList
423421 let $s = size($l)
424422 let $acc0 = $Tuple2(nil, "")
432430
433431 $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)
434432 }
435- let transfers = $t01705317167._1
436- let claimedAmtByAssetResult = $t01705317167._2
433+ let transfers = $t01709217206._1
434+ let claimedAmtByAssetResult = $t01709217206._2
437435 if ((0 >= size(transfers)))
438436 then throw("nothing to claim")
439437 else ((transfers :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)) :+ ClaimHistoryEntry(userAddress, i.transactionId, drop(claimedAmtByAssetResult, 1)))
463461 }
464462 else {
465463 let userAddress = addressFromStringValue(userAddressStr)
466- let $t01782617931 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
467- let isNewUser = $t01782617931._1
468- let stakedAmount = $t01782617931._2
469- let stakingStart = $t01782617931._3
464+ let $t01786517970 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
465+ let isNewUser = $t01786517970._1
466+ let stakedAmount = $t01786517970._2
467+ let stakingStart = $t01786517970._3
470468 let stakedAmountX = toBigInt(stakedAmount)
471469 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
472470 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
473471 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
474472 func forEachAssetCalcUnclaimedReward (accum,asset) = {
475- let $t01827718415 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
476- let rewardTotal = $t01827718415._1
477- let cached = $t01827718415._2
478- let dynamic = $t01827718415._3
479- let rewardCachedPartKEY = $t01827718415._4
473+ let $t01831618454 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
474+ let rewardTotal = $t01831618454._1
475+ let cached = $t01831618454._2
476+ let dynamic = $t01831618454._3
477+ let rewardCachedPartKEY = $t01831618454._4
480478 let claimed = valueOrElse(getInteger(keyClaimed(userAddressStr, asset)), 0)
481- ((accum + makeString([asset, "10", "10"], ":")) + "_")
479+ ((accum + makeString([asset, toString(rewardTotal), toString(claimed)], ":")) + "_")
482480 }
483481
484482 let $l = supportedAssetsList
506504 then $Tuple2(nil, [0, totalNsbtAmt, 0])
507505 else {
508506 let userAddress = toAddressOrFail(userAddressStr)
509- let $t01898719091 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
510- let isNewUser = $t01898719091._1
511- let userNsbtAmt = $t01898719091._2
512- let stakingStart = $t01898719091._3
507+ let $t01905819162 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
508+ let isNewUser = $t01905819162._1
509+ let userNsbtAmt = $t01905819162._2
510+ let stakingStart = $t01905819162._3
513511 $Tuple2(nil, [userNsbtAmt, totalNsbtAmt, stakingStart])
514512 }
515513 }
516514
517515
516+@Verifier(tx)
517+func verify () = {
518+ let pubKeyAdminsList = ["ExtEEK19nmKj9mCpnWyvEEJFYATLMcVEMvohhUHkyHNm", "Ev5py5FfBQX9cZpYKnfQrTB49Byf8QmpZWeDVRim4yV7", "DUuuLjXu98nBwZc7fqwCTjtA3nnRwgTbkMSr5SU2NmDR", "5WRXFSjwcTbNfKcJs8ZqXmSSWYsSVJUtMvMqZj5hH4Nc"]
519+ let count = ((((if (sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(pubKeyAdminsList[0])))
520+ then 1
521+ else 0) + (if (sigVerify(tx.bodyBytes, tx.proofs[1], fromBase58String(pubKeyAdminsList[1])))
522+ then 1
523+ else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[2], fromBase58String(pubKeyAdminsList[2])))
524+ then 1
525+ else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[3], fromBase58String(pubKeyAdminsList[3])))
526+ then 2
527+ else 0))
528+ (count >= 3)
529+ }
530+
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let revisionNum = ""
5-
64 let separator = "__"
75
86 let MULT6 = 1000000
97
108 let MULT8 = 100000000
119
1210 let MULTX6 = toBigInt(MULT6)
1311
1412 let MULTX8 = toBigInt(MULT8)
1513
1614 let MULTX18 = toBigInt(1000000000000000000)
1715
1816 let WAVESIDSTR = "WAVES"
1917
2018 let WAVESID = fromBase58String(WAVESIDSTR)
2119
2220 func keyBondAsset () = "bond_asset_id"
2321
2422
2523 func keyAuctionContractAddress () = "auction_contract"
2624
2725
2826 func keyNeutrinoContractAddress () = "%s__neutrinoContractAddress"
2927
3028
3129 func keyMathContractAddress () = "%s__mathContract"
3230
3331
3432 func keyMinLockAmount () = "%s__minLockAmount"
3533
3634
3735 func keyHalfLife () = "%s__halfLife"
3836
3937
4038 func keyLockParamUserAmount (userAddress) = makeString(["%s%s%s", "paramByUser", toString(userAddress), "amount"], separator)
4139
4240
4341 func keyLockParamStartBlock (userAddress) = makeString(["%s%s%s", "paramByUser", toString(userAddress), "start"], separator)
4442
4543
4644 func keyHistoryRecord (type,userAddress,txId) = makeString(["%s%s%s%s", "history", type, toString(userAddress), toBase58String(txId)], separator)
4745
4846
4947 func keyLockParamTotalAmount () = makeString(["%s%s", "stats", "activeTotalLocked"], separator)
5048
5149
5250 func keyStatsLocksCount () = makeString(["%s%s", "stats", "locksCount"], separator)
5351
5452
5553 func keyStatsUsersCount () = makeString(["%s%s", "stats", "activeUsersCount"], separator)
5654
5755
5856 func keyNextPeriod () = "%s__nextPeriod"
5957
6058
6159 func keySupportedRewardAssets () = "supportedRewardAssets"
6260
6361
6462 func keyDepositNumLast () = makeString(["%s%s%s", "dep", "lastNum"], separator)
6563
6664
6765 func keyUserRewardFromDepositNum (userAddress) = makeString(["%s%s%s", "userRwdFromDepNum", userAddress], separator)
6866
6967
7068 func keyRewardPerNsbtSumAt (depositNum,tkn) = makeString(["%s%d", "rwdPerNsbtSumByDepNum", toString(depositNum), tkn], separator)
7169
7270
7371 func keyReward (userAddress,tkn) = makeString(["%s%s%s", "rwd", userAddress, tkn], separator)
7472
7573
7674 func keyClaimed (userAddress,tkn) = makeString(["%s%s%s", "clm", userAddress, tkn], separator)
7775
7876
7977 func keyNotDistributedReward (tkn) = makeString(["%s%s", "notDistributed", tkn], separator)
8078
8179
8280 func toX18 (origVal,origMult) = fraction(toBigInt(origVal), MULTX18, origMult)
8381
8482
8583 func getIntOrZero (key) = valueOrElse(getInteger(this, key), 0)
8684
8785
8886 func getIntOrElse (key,defaultVal) = valueOrElse(getInteger(this, key), defaultVal)
8987
9088
9189 func getIntOrFail (key) = valueOrErrorMessage(getInteger(this, key), (("Mandatory this." + key) + " is not defined"))
9290
9391
9492 func getStrOrElse (key,defaultVal) = valueOrElse(getString(this, key), defaultVal)
9593
9694
9795 func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), (("Mandatory this." + key) + " is not defined"))
9896
9997
10098 func toAddressOrFail (addressStr) = valueOrErrorMessage(addressFromString(addressStr), ("couldn't parse passed addressStr=" + addressStr))
10199
102100
103101 func toAssetVect (assetStr) = if ((assetStr == WAVESIDSTR))
104102 then unit
105103 else fromBase58String(assetStr)
106104
107105
108106 func asInt (val) = match val {
109107 case valInt: Int =>
110108 valInt
111109 case _ =>
112110 throw("fail to cast into Int")
113111 }
114112
115113
116114 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)
117115
118116
119117 func formatClaimHistoryRecord (user,claimedRewards) = makeString(["%s%d%d%s", user, toString(lastBlock.height), toString(lastBlock.timestamp), claimedRewards], separator)
120118
121119
122120 func HistoryRecordEntry (type,userAddress,txId,oldAmount,oldStart,newAmount,newStart) = StringEntry(keyHistoryRecord(type, userAddress, txId), formatHistoryRecord(oldAmount, oldStart, newAmount, newStart))
123121
124122
125123 func ClaimHistoryEntry (userAddress,txId,claimedRewards) = StringEntry(keyHistoryRecord("claim", userAddress, txId), formatClaimHistoryRecord(toString(userAddress), claimedRewards))
126124
127125
128126 func StatsResult (totalLockedInc,lockCountInc,usersCountInc) = {
129127 let locksCount = getIntOrZero(keyStatsLocksCount())
130128 let usersCount = getIntOrZero(keyStatsUsersCount())
131129 let totalAmount = getIntOrZero(keyLockParamTotalAmount())
132130 let totalAmountNew = (totalAmount + totalLockedInc)
133131 $Tuple3([IntegerEntry(keyStatsLocksCount(), (locksCount + lockCountInc)), IntegerEntry(keyStatsUsersCount(), (usersCount + usersCountInc)), IntegerEntry(keyLockParamTotalAmount(), totalAmountNew)], totalAmount, totalAmountNew)
134132 }
135133
136134
137135 func LockParamsEntry (userAddress,amount,start) = [IntegerEntry(keyLockParamUserAmount(userAddress), amount), IntegerEntry(keyLockParamStartBlock(userAddress), start)]
138136
139137
140138 func getParamsOrFail () = {
141139 let neutrinoContract = addressFromStringValue(getStringOrFail(keyNeutrinoContractAddress()))
142140 $Tuple4(fromBase58String(getStringValue(neutrinoContract, keyAuctionContractAddress())), fromBase58String(getStringValue(neutrinoContract, keyBondAsset())), getIntOrFail(keyMinLockAmount()), getIntOrFail(keyHalfLife()))
143141 }
144142
145143
146144 func isActiveUser (userAddress) = (getIntOrElse(keyLockParamUserAmount(userAddress), 0) > 0)
147145
148146
149147 func getUserParamsOrUnit (userAddress) = if (isActiveUser(userAddress))
150148 then $Tuple3(false, getIntOrFail(keyLockParamUserAmount(userAddress)), getIntOrFail(keyLockParamStartBlock(userAddress)))
151149 else unit
152150
153151
154152 func getUserParamsOrFail (userAddress) = valueOrErrorMessage(getUserParamsOrUnit(userAddress), (("User " + toString(userAddress)) + " is not defined"))
155153
156154
157155 let supportedAssetsStr = getStrOrElse(keySupportedRewardAssets(), "")
158156
159157 let supportedAssetsList = split(supportedAssetsStr, "_")
160158
161159 func calcReward (userAddress,assetId,stakedAmountX,depositNumUser,depositNumLast) = {
162160 let rewardPerNsbtSumLastKEY = keyRewardPerNsbtSumAt(depositNumLast, assetId)
163161 let sumLastX18 = parseBigIntValue(getStrOrElse(keyRewardPerNsbtSumAt(depositNumLast, assetId), "0"))
164162 let sumUserX18 = parseBigIntValue(getStrOrElse(keyRewardPerNsbtSumAt(depositNumUser, assetId), "0"))
165163 let rewardDynamicPart = toInt(fraction((sumLastX18 - sumUserX18), stakedAmountX, MULTX18))
166164 let rewardCachedPartKEY = keyReward(userAddress, assetId)
167165 let rewardCachedPart = getIntOrElse(rewardCachedPartKEY, 0)
168166 $Tuple4((rewardCachedPart + rewardDynamicPart), rewardCachedPart, rewardDynamicPart, rewardCachedPartKEY)
169167 }
170168
171169
172170 func RewardEntries (isNewUser,userAddress,stakedAmount) = {
173171 let stakedAmountX = toBigInt(stakedAmount)
174172 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddress)
175173 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
176174 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
177175 func forEachAssetCacheUserReward (accum,asset) = {
178- let $t073617496 = calcReward(userAddress, asset, stakedAmountX, depositNumUser, depositNumLast)
179- let rewardTotal = $t073617496._1
180- let cached = $t073617496._2
181- let dynamic = $t073617496._3
182- let rewardCachedPartKEY = $t073617496._4
176+ let $t074007535 = calcReward(userAddress, asset, stakedAmountX, depositNumUser, depositNumLast)
177+ let rewardTotal = $t074007535._1
178+ let cached = $t074007535._2
179+ let dynamic = $t074007535._3
180+ let rewardCachedPartKEY = $t074007535._4
183181 (accum :+ IntegerEntry(rewardCachedPartKEY, rewardTotal))
184182 }
185183
186184 if (if ((depositNumLast == -1))
187185 then (depositNumUser == -1)
188186 else false)
189187 then nil
190188 else if (if ((depositNumLast == -1))
191189 then (depositNumUser > -1)
192190 else false)
193191 then throw("invalid depositNumLast and depositNumUser state")
194192 else if (if ((depositNumLast > -1))
195193 then (depositNumUser == -1)
196194 else false)
197195 then if (isNewUser)
198196 then [IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)]
199197 else ({
200198 let $l = supportedAssetsList
201199 let $s = size($l)
202200 let $acc0 = nil
203201 func $f0_1 ($a,$i) = if (($i >= $s))
204202 then $a
205203 else forEachAssetCacheUserReward($a, $l[$i])
206204
207205 func $f0_2 ($a,$i) = if (($i >= $s))
208206 then $a
209207 else throw("List size exceeds 10")
210208
211209 $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)
212210 } :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast))
213211 else if (if ((depositNumLast > -1))
214212 then (depositNumUser > -1)
215213 else false)
216214 then if (isNewUser)
217215 then [IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)]
218216 else ({
219217 let $l = supportedAssetsList
220218 let $s = size($l)
221219 let $acc0 = nil
222220 func $f0_1 ($a,$i) = if (($i >= $s))
223221 then $a
224222 else forEachAssetCacheUserReward($a, $l[$i])
225223
226224 func $f0_2 ($a,$i) = if (($i >= $s))
227225 then $a
228226 else throw("List size exceeds 10")
229227
230228 $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)
231229 } :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast))
232230 else throw(((("uncovered condition: depositNumLast=" + toString(depositNumLast)) + " depositNumUser=") + toString(depositNumUser)))
233231 }
234232
235233
236234 func IncrementNotDistributedRewardEntry (tkn,amountInc) = {
237235 let notDistributedRewardKEY = keyNotDistributedReward(tkn)
238236 let notDistributedReward = getIntOrElse(notDistributedRewardKEY, 0)
239237 [IntegerEntry(notDistributedRewardKEY, (notDistributedReward + amountInc))]
240238 }
241239
242240
243241 @Callable(i)
244242 func constructor (neutrinoContractAddress,mathContractAddress,minLockAmount,halfLife,supportedRewardAssets) = if ((i.caller != this))
245243 then throw("Permission denied")
246244 else [StringEntry(keyNeutrinoContractAddress(), neutrinoContractAddress), StringEntry(keyMathContractAddress(), mathContractAddress), IntegerEntry(keyMinLockAmount(), minLockAmount), IntegerEntry(keyHalfLife(), halfLife), StringEntry(keySupportedRewardAssets(), supportedRewardAssets)]
247245
248246
249247
250248 @Callable(i)
251249 func stake () = {
252- let $t01115011229 = getParamsOrFail()
253- let auctionContract = $t01115011229._1
254- let bondAssetId = $t01115011229._2
255- let minLockAmount = $t01115011229._3
256- let halfLife = $t01115011229._4
250+ let $t01118911268 = getParamsOrFail()
251+ let auctionContract = $t01118911268._1
252+ let bondAssetId = $t01118911268._2
253+ let minLockAmount = $t01118911268._3
254+ let halfLife = $t01118911268._4
257255 if ((size(i.payments) != 1))
258256 then throw("Invalid payments size")
259257 else {
260258 let payment = i.payments[0]
261259 let amount = payment.amount
262260 let invalidAssetMessage = (("Invalid asset. " + toBase58String(bondAssetId)) + " is expected")
263261 let assetId = valueOrErrorMessage(payment.assetId, invalidAssetMessage)
264262 if ((assetId != bondAssetId))
265263 then throw(invalidAssetMessage)
266264 else {
267265 let userAddress = i.caller
268266 let userAddressStr = toString(i.caller)
269- let $t01177111878 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, -1))
270- let isNewUser = $t01177111878._1
271- let lockAmount = $t01177111878._2
272- let lockStartHeight = $t01177111878._3
267+ let $t01181011917 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, -1))
268+ let isNewUser = $t01181011917._1
269+ let lockAmount = $t01181011917._2
270+ let lockStartHeight = $t01181011917._3
273271 let mergedAmount = if (isNewUser)
274272 then amount
275273 else (amount + lockAmount)
276274 let mergedStartHeight = if (isNewUser)
277275 then height
278276 else {
279277 let mathContract = addressFromStringValue(getStringOrFail(keyMathContractAddress()))
280278 asInt(invoke(mathContract, "mergeStakesREADONLY", [amount, height, lockAmount, lockStartHeight, halfLife], nil))
281279 }
282280 if ((minLockAmount > mergedAmount))
283281 then throw(("Min lock amount is " + toString(minLockAmount)))
284282 else {
285- let $t01232812430 = StatsResult(amount, 1, if (isNewUser)
283+ let $t01236712469 = StatsResult(amount, 1, if (isNewUser)
286284 then 1
287285 else 0)
288- let statsEntries = $t01232812430._1
289- let totalStaked = $t01232812430._2
290- let totalStakedNew = $t01232812430._3
286+ let statsEntries = $t01236712469._1
287+ let totalStaked = $t01236712469._2
288+ let totalStakedNew = $t01236712469._3
291289 ((([HistoryRecordEntry("stake", userAddress, i.transactionId, lockAmount, lockStartHeight, mergedAmount, mergedStartHeight)] ++ RewardEntries(isNewUser, userAddressStr, lockAmount)) ++ LockParamsEntry(userAddress, mergedAmount, mergedStartHeight)) ++ statsEntries)
292290 }
293291 }
294292 }
295293 }
296294
297295
298296
299297 @Callable(i)
300298 func unstake (amount) = if ((size(i.payments) != 0))
301299 then throw("unstake doesn't require any payment")
302300 else {
303301 let userAddress = i.caller
304302 let userAddressStr = toString(userAddress)
305- let $t01291612994 = getParamsOrFail()
306- let auctionAddress = $t01291612994._1
307- let bondAssetId = $t01291612994._2
308- let minLockAmount = $t01291612994._3
309- let halfLife = $t01291612994._4
310- let $t01299713071 = getUserParamsOrFail(userAddress)
311- let isNewUser = $t01299713071._1
312- let lockAmount = $t01299713071._2
313- let lockStart = $t01299713071._3
303+ let $t01295513033 = getParamsOrFail()
304+ let auctionAddress = $t01295513033._1
305+ let bondAssetId = $t01295513033._2
306+ let minLockAmount = $t01295513033._3
307+ let halfLife = $t01295513033._4
308+ let $t01303613110 = getUserParamsOrFail(userAddress)
309+ let isNewUser = $t01303613110._1
310+ let lockAmount = $t01303613110._2
311+ let lockStart = $t01303613110._3
314312 if ((0 >= lockAmount))
315313 then throw("Nothing to unstake")
316314 else if ((amount > lockAmount))
317315 then throw(((("Requested " + toString(amount)) + ", but staked only ") + toString(lockAmount)))
318316 else {
319317 let mathContract = addressFromStringValue(getStringOrFail(keyMathContractAddress()))
320318 let comissionAmount = asInt(invoke(mathContract, "getUnstakeComissionAmountREADONLY", [amount, lockStart, halfLife], nil))
321- let $t01347213626 = StatsResult(-(amount), if ((amount == lockAmount))
319+ let $t01351113665 = StatsResult(-(amount), if ((amount == lockAmount))
322320 then -1
323321 else 0, if ((amount == lockAmount))
324322 then -1
325323 else 0)
326- let statsEntries = $t01347213626._1
327- let totalStaked = $t01347213626._2
328- let totalStakedNew = $t01347213626._3
324+ let statsEntries = $t01351113665._1
325+ let totalStaked = $t01351113665._2
326+ let totalStakedNew = $t01351113665._3
329327 ((([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)
330328 }
331329 }
332330
333331
334332
335333 @Callable(i)
336334 func deposit () = if ((size(i.payments) != 1))
337335 then throw("exact 1 payment is allowed only")
338336 else {
339337 let pmt = i.payments[0]
340338 let amount = pmt.amount
341339 let pmtAssetId = valueOrElse(pmt.assetId, WAVESID)
342340 let pmtAssetIdStr = toBase58String(pmtAssetId)
343341 let pmtMultX = if ((pmtAssetId == WAVESID))
344342 then MULTX8
345343 else MULTX6
346344 let amountX = toBigInt(amount)
347345 let totalStaked = getIntOrElse(keyLockParamTotalAmount(), 0)
348346 let totalStakedX = toBigInt(totalStaked)
349347 if ((0 > totalStaked))
350348 then throw("TODO: case is not supported")
351349 else if ((totalStaked == 0))
352350 then IncrementNotDistributedRewardEntry(pmtAssetIdStr, amount)
353351 else {
354352 let rewardPerNsbtX18 = fraction(amountX, MULTX18, totalStakedX)
355353 let depositNumLastKEY = keyDepositNumLast()
356354 let depositNumLast = getIntOrElse(depositNumLastKEY, -1)
357355 let depositNumNew = (depositNumLast + 1)
358356 if (!(contains(supportedAssetsStr, pmtAssetIdStr)))
359357 then throw(((supportedAssetsStr + " doesn't contain ") + pmtAssetIdStr))
360358 else {
361359 func refreshRewardPerNsbtSUM (accum,nextAsset) = {
362360 let rewardPerNsbtSumNewKEY = keyRewardPerNsbtSumAt(depositNumNew, nextAsset)
363361 let sumLastStr = getStrOrElse(keyRewardPerNsbtSumAt(depositNumLast, nextAsset), "0")
364362 (accum :+ (if ((nextAsset == pmtAssetIdStr))
365363 then StringEntry(rewardPerNsbtSumNewKEY, toString((parseBigIntValue(sumLastStr) + rewardPerNsbtX18)))
366364 else StringEntry(rewardPerNsbtSumNewKEY, sumLastStr)))
367365 }
368366
369367 ({
370368 let $l = supportedAssetsList
371369 let $s = size($l)
372370 let $acc0 = nil
373371 func $f0_1 ($a,$i) = if (($i >= $s))
374372 then $a
375373 else refreshRewardPerNsbtSUM($a, $l[$i])
376374
377375 func $f0_2 ($a,$i) = if (($i >= $s))
378376 then $a
379377 else throw("List size exceeds 10")
380378
381379 $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)
382380 } :+ IntegerEntry(depositNumLastKEY, depositNumNew))
383381 }
384382 }
385383 }
386384
387385
388386
389387 @Callable(i)
390388 func claimRewards () = {
391389 let userAddress = i.caller
392390 let userAddressStr = toString(userAddress)
393391 if ((size(i.payments) > 0))
394392 then throw("payments are not accepted")
395393 else {
396- let $t01588215987 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
397- let isNewUser = $t01588215987._1
398- let stakedAmount = $t01588215987._2
399- let stakingStart = $t01588215987._3
394+ let $t01592116026 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
395+ let isNewUser = $t01592116026._1
396+ let stakedAmount = $t01592116026._2
397+ let stakingStart = $t01592116026._3
400398 let stakedAmountX = toBigInt(stakedAmount)
401399 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
402400 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
403401 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
404402 func forEachAssetCalcUnclaimedReward (accum,asset) = {
405- let $t01635816496 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
406- let rewardTotal = $t01635816496._1
407- let cached = $t01635816496._2
408- let dynamic = $t01635816496._3
409- let rewardCachedPartKEY = $t01635816496._4
403+ let $t01639716535 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
404+ let rewardTotal = $t01639716535._1
405+ let cached = $t01639716535._2
406+ let dynamic = $t01639716535._3
407+ let rewardCachedPartKEY = $t01639716535._4
410408 let claimedKEY = keyClaimed(userAddressStr, asset)
411- let $t01655616593 = accum
412- let data = $t01655616593._1
413- let claimedAmtByAsset = $t01655616593._2
409+ let $t01659516632 = accum
410+ let data = $t01659516632._1
411+ let claimedAmtByAsset = $t01659516632._2
414412 let newPart = makeString([asset, toString(rewardTotal)], ":")
415413 let claimedAmtByAssetNew = makeString([claimedAmtByAsset, newPart], "_")
416414 if ((0 >= rewardTotal))
417415 then $Tuple2(data, claimedAmtByAssetNew)
418416 else $Tuple2((((data :+ ScriptTransfer(userAddress, rewardTotal, toAssetVect(asset))) :+ IntegerEntry(claimedKEY, (valueOrElse(getInteger(claimedKEY), 0) + rewardTotal))) :+ IntegerEntry(rewardCachedPartKEY, 0)), claimedAmtByAssetNew)
419417 }
420418
421- let $t01705317167 = {
419+ let $t01709217206 = {
422420 let $l = supportedAssetsList
423421 let $s = size($l)
424422 let $acc0 = $Tuple2(nil, "")
425423 func $f0_1 ($a,$i) = if (($i >= $s))
426424 then $a
427425 else forEachAssetCalcUnclaimedReward($a, $l[$i])
428426
429427 func $f0_2 ($a,$i) = if (($i >= $s))
430428 then $a
431429 else throw("List size exceeds 10")
432430
433431 $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)
434432 }
435- let transfers = $t01705317167._1
436- let claimedAmtByAssetResult = $t01705317167._2
433+ let transfers = $t01709217206._1
434+ let claimedAmtByAssetResult = $t01709217206._2
437435 if ((0 >= size(transfers)))
438436 then throw("nothing to claim")
439437 else ((transfers :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)) :+ ClaimHistoryEntry(userAddress, i.transactionId, drop(claimedAmtByAssetResult, 1)))
440438 }
441439 }
442440
443441
444442
445443 @Callable(i)
446444 func unclaimedRewardsREADONLY (userAddressStr) = {
447445 func forEachAssetZeroReward (accum,asset) = ((accum + makeString([asset, "0", "0"], ":")) + "_")
448446
449447 let unclaimedRewardStr = if ((userAddressStr == ""))
450448 then {
451449 let $l = supportedAssetsList
452450 let $s = size($l)
453451 let $acc0 = ""
454452 func $f0_1 ($a,$i) = if (($i >= $s))
455453 then $a
456454 else forEachAssetZeroReward($a, $l[$i])
457455
458456 func $f0_2 ($a,$i) = if (($i >= $s))
459457 then $a
460458 else throw("List size exceeds 10")
461459
462460 $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)
463461 }
464462 else {
465463 let userAddress = addressFromStringValue(userAddressStr)
466- let $t01782617931 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
467- let isNewUser = $t01782617931._1
468- let stakedAmount = $t01782617931._2
469- let stakingStart = $t01782617931._3
464+ let $t01786517970 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
465+ let isNewUser = $t01786517970._1
466+ let stakedAmount = $t01786517970._2
467+ let stakingStart = $t01786517970._3
470468 let stakedAmountX = toBigInt(stakedAmount)
471469 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
472470 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
473471 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
474472 func forEachAssetCalcUnclaimedReward (accum,asset) = {
475- let $t01827718415 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
476- let rewardTotal = $t01827718415._1
477- let cached = $t01827718415._2
478- let dynamic = $t01827718415._3
479- let rewardCachedPartKEY = $t01827718415._4
473+ let $t01831618454 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
474+ let rewardTotal = $t01831618454._1
475+ let cached = $t01831618454._2
476+ let dynamic = $t01831618454._3
477+ let rewardCachedPartKEY = $t01831618454._4
480478 let claimed = valueOrElse(getInteger(keyClaimed(userAddressStr, asset)), 0)
481- ((accum + makeString([asset, "10", "10"], ":")) + "_")
479+ ((accum + makeString([asset, toString(rewardTotal), toString(claimed)], ":")) + "_")
482480 }
483481
484482 let $l = supportedAssetsList
485483 let $s = size($l)
486484 let $acc0 = ""
487485 func $f0_1 ($a,$i) = if (($i >= $s))
488486 then $a
489487 else forEachAssetCalcUnclaimedReward($a, $l[$i])
490488
491489 func $f0_2 ($a,$i) = if (($i >= $s))
492490 then $a
493491 else throw("List size exceeds 10")
494492
495493 $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)
496494 }
497495 $Tuple2(nil, dropRight(unclaimedRewardStr, 1))
498496 }
499497
500498
501499
502500 @Callable(i)
503501 func nsbtStakingSYSREADONLY (userAddressStr) = {
504502 let totalNsbtAmt = getIntOrElse(keyLockParamTotalAmount(), 0)
505503 if ((userAddressStr == ""))
506504 then $Tuple2(nil, [0, totalNsbtAmt, 0])
507505 else {
508506 let userAddress = toAddressOrFail(userAddressStr)
509- let $t01898719091 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
510- let isNewUser = $t01898719091._1
511- let userNsbtAmt = $t01898719091._2
512- let stakingStart = $t01898719091._3
507+ let $t01905819162 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
508+ let isNewUser = $t01905819162._1
509+ let userNsbtAmt = $t01905819162._2
510+ let stakingStart = $t01905819162._3
513511 $Tuple2(nil, [userNsbtAmt, totalNsbtAmt, stakingStart])
514512 }
515513 }
516514
517515
516+@Verifier(tx)
517+func verify () = {
518+ let pubKeyAdminsList = ["ExtEEK19nmKj9mCpnWyvEEJFYATLMcVEMvohhUHkyHNm", "Ev5py5FfBQX9cZpYKnfQrTB49Byf8QmpZWeDVRim4yV7", "DUuuLjXu98nBwZc7fqwCTjtA3nnRwgTbkMSr5SU2NmDR", "5WRXFSjwcTbNfKcJs8ZqXmSSWYsSVJUtMvMqZj5hH4Nc"]
519+ let count = ((((if (sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(pubKeyAdminsList[0])))
520+ then 1
521+ else 0) + (if (sigVerify(tx.bodyBytes, tx.proofs[1], fromBase58String(pubKeyAdminsList[1])))
522+ then 1
523+ else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[2], fromBase58String(pubKeyAdminsList[2])))
524+ then 1
525+ else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[3], fromBase58String(pubKeyAdminsList[3])))
526+ then 2
527+ else 0))
528+ (count >= 3)
529+ }
530+

github/deemru/w8io/873ac7e 
99.68 ms