tx · 8maSBmYqQFexo1HMTtVeSuaCdBwnfMisExQsCgJ9Mrpt

3MuGfNhF98CNBCfthhoJEo6SYUv7zTgkK4J:  -0.04000000 Waves

2022.08.02 17:10 [2166972] smart account 3MuGfNhF98CNBCfthhoJEo6SYUv7zTgkK4J > SELF 0.00000000 Waves

{ "type": 13, "id": "8maSBmYqQFexo1HMTtVeSuaCdBwnfMisExQsCgJ9Mrpt", "fee": 4000000, "feeAssetId": null, "timestamp": 1659449433859, "version": 1, "sender": "3MuGfNhF98CNBCfthhoJEo6SYUv7zTgkK4J", "senderPublicKey": "4DthuG3xjZV9WtZ34Y66AummdAr67wRzwWsVQL4y2bob", "proofs": [ "3Z7o77w9ezmrnEoxpSzhkotKk5SMfKsQZgXgj9Nh9kskSZxhgvng4AQH53LTim2Fzr5ixXdAL666CkaJ6RQD53eS", "3a9VsB7qfFg79qQp7g3fiUGE2vfnGEvD8NvYHwPDepwGAjM75FgbyYgzLi7QkKsSRKLVYpPdZLbdzdrK8YmgU9Ln", "4abSKR9ZizeiGPmwLno3zZ9ZRjJ5wskvD21tLfaFzWKHFSLLh9XZqxvujzTrJKsdMJ2fcM8nn32Xq4dfmdYkUgfc" ], "script": "base64:AAIFAAAAAAAAACgIAhIHCgUICAEBCBIAEgMKAQESABIAEgASAwoBCBIECgIIARIDCgEIAAAARwAAAAAJc2VwYXJhdG9yAgAAAAJfXwAAAAADU0VQAgAAAAJfXwAAAAAFTVVMVDYAAAAAAAAPQkAAAAAABU1VTFQ4AAAAAAAF9eEAAAAAAAZNVUxUWDYJAAE2AAAAAQUAAAAFTVVMVDYAAAAABk1VTFRYOAkAATYAAAABBQAAAAVNVUxUOAAAAAAHTVVMVFgxOAkAATYAAAABAA3gtrOnZAAAAAAAAApXQVZFU0lEU1RSAgAAAAVXQVZFUwAAAAAHV0FWRVNJRAkAAlkAAAABBQAAAApXQVZFU0lEU1RSAAAAABlJZHhDb250cm9sQ2ZnTmV1dHJpbm9EYXBwAAAAAAAAAAABAAAAABhJZHhDb250cm9sQ2ZnQXVjdGlvbkRhcHAAAAAAAAAAAAIAAAAAFElkeENvbnRyb2xDZmdScGREYXBwAAAAAAAAAAADAAAAABVJZHhDb250cm9sQ2ZnTWF0aERhcHAAAAAAAAAAAAQAAAAAHElkeENvbnRyb2xDZmdMaXF1aWRhdGlvbkRhcHAAAAAAAAAAAAUAAAAAFUlkeENvbnRyb2xDZmdSZXN0RGFwcAAAAAAAAAAABgAAAAAdSWR4Q29udHJvbENmZ05vZGVSZWdpc3RyeURhcHAAAAAAAAAAAAcAAAAAHElkeENvbnRyb2xDZmdOc2J0U3Rha2luZ0RhcHAAAAAAAAAAAAgAAAAAGUlkeENvbnRyb2xDZmdNZWRpYXRvckRhcHAAAAAAAAAAAAkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAIAAAAHYWRkcmVzcwAAAANrZXkJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAdhZGRyZXNzBQAAAANrZXkJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAKbWFuZGF0b3J5IAkABCUAAAABBQAAAAdhZGRyZXNzAgAAAAEuBQAAAANrZXkCAAAADyBpcyBub3QgZGVmaW5lZAEAAAARa2V5Q29udHJvbEFkZHJlc3MAAAAAAgAAABwlcyVzX19jb25maWdfX2NvbnRyb2xBZGRyZXNzAQAAAA1rZXlDb250cm9sQ2ZnAAAAAAIAAAARJXNfX2NvbnRyb2xDb25maWcBAAAAFHJlYWRDb250cm9sQ2ZnT3JGYWlsAAAAAQAAAAdjb250cm9sCQAEtQAAAAIJAQAAAA9nZXRTdHJpbmdPckZhaWwAAAACBQAAAAdjb250cm9sCQEAAAANa2V5Q29udHJvbENmZwAAAAAFAAAAA1NFUAEAAAAYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAAAAAgAAAApjb250cm9sQ2ZnAAAAA2lkeAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEJgAAAAEJAAGRAAAAAgUAAAAKY29udHJvbENmZwUAAAADaWR4CQABLAAAAAICAAAALUNvbnRyb2wgY2ZnIGRvZXNuJ3QgY29udGFpbiBhZGRyZXNzIGF0IGluZGV4IAkAAaQAAAABBQAAAANpZHgAAAAAD2NvbnRyb2xDb250cmFjdAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAR0aGlzCQEAAAARa2V5Q29udHJvbEFkZHJlc3MAAAAAAgAAACMzTjROUzdkNEpvOWE2RjE0TGlGVUtLWVZkVWtrZjJlUDRaeAAAAAAKY29udHJvbENmZwkBAAAAFHJlYWRDb250cm9sQ2ZnT3JGYWlsAAAAAQUAAAAPY29udHJvbENvbnRyYWN0AAAAAAxtYXRoQ29udHJhY3QJAQAAABhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwAAAACBQAAAApjb250cm9sQ2ZnBQAAABVJZHhDb250cm9sQ2ZnTWF0aERhcHAAAAAAEG5ldXRyaW5vQ29udHJhY3QJAQAAABhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwAAAACBQAAAApjb250cm9sQ2ZnBQAAABlJZHhDb250cm9sQ2ZnTmV1dHJpbm9EYXBwAAAAAA9hdWN0aW9uQ29udHJhY3QJAQAAABhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwAAAACBQAAAApjb250cm9sQ2ZnBQAAABhJZHhDb250cm9sQ2ZnQXVjdGlvbkRhcHABAAAADGtleUJvbmRBc3NldAAAAAACAAAADWJvbmRfYXNzZXRfaWQBAAAAGmtleU5ldXRyaW5v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AAAACW9sZEFtb3VudAAAAAhvbGRTdGFydAAAAAluZXdBbW91bnQAAAAIbmV3U3RhcnQJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABBrZXlIaXN0b3J5UmVjb3JkAAAAAwUAAAAEdHlwZQUAAAALdXNlckFkZHJlc3MFAAAABHR4SWQJAQAAABNmb3JtYXRIaXN0b3J5UmVjb3JkAAAABAUAAAAJb2xkQW1vdW50BQAAAAhvbGRTdGFydAUAAAAJbmV3QW1vdW50BQAAAAhuZXdTdGFydAEAAAARQ2xhaW1IaXN0b3J5RW50cnkAAAADAAAAC3VzZXJBZGRyZXNzAAAABHR4SWQAAAAOY2xhaW1lZFJld2FyZHMJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABBrZXlIaXN0b3J5UmVjb3JkAAAAAwIAAAAFY2xhaW0FAAAAC3VzZXJBZGRyZXNzBQAAAAR0eElkCQEAAAAYZm9ybWF0Q2xhaW1IaXN0b3J5UmVjb3JkAAAAAgkABCUAAAABBQAAAAt1c2VyQWRkcmVzcwUAAAAOY2xhaW1lZFJld2FyZHMBAAAAC1N0YXRzUmVzdWx0AAAAAwAAAA50b3RhbExvY2tlZEluYwAAAAxsb2NrQ291bnRJbmMAAAANdXNlcnNDb3VudEluYwQAAAAKbG9ja3NDb3VudAkBAAAADGdldEludE9yWmVybwAAAAEJAQAAABJrZXlTdGF0c0xvY2tzQ291bnQAAAAABAAAAAp1c2Vyc0NvdW50CQEAAAAMZ2V0SW50T3JaZXJvAAAAAQkBAAAAEmtleVN0YXRzVXNlcnNDb3VudAAAAAAEAAAAC3RvdGFsQW1vdW50CQEAAAAMZ2V0SW50T3JaZXJvAAAAAQkBAAAAF2tleUxvY2tQYXJhbVRvdGFsQW1vdW50AAAAAAQAAAAOdG90YWxBbW91bnROZXcJAABkAAAAAgUAAAALdG90YWxBbW91bnQFAAAADnRvdGFsTG9ja2VkSW5jCQAFFQAAAAMJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABJrZXlTdGF0c0xvY2tzQ291bnQAAAAACQAAZAAAAAIFAAAACmxvY2tzQ291bnQFAAAADGxvY2tDb3VudEluYwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAEmtleVN0YXRzVXNlcnNDb3VudAAAAAAJAABkAAAAAgUAAAAKdXNlcnNDb3VudAUAAAANdXNlcnNDb3VudEluYwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAF2tleUxvY2tQYXJhbVRvdGFsQW1vdW50AAAAAAUAAAAOdG90YWxBbW91bnROZXcFAAAAA25pbAUAAAALdG90YWxBbW91bnQFAAAADnRvdGFsQW1vdW50TmV3AQAAAA9Mb2NrUGFyYW1zRW50cnkAAAADAAAAC3VzZXJBZGRyZXNzAAAABmFtb3VudAAAAAVzdGFydAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAFmtleUxvY2tQYXJhbVVzZXJBbW91bnQAAAABBQAAAAt1c2VyQWRkcmVzcwUAAAAGYW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAWa2V5TG9ja1BhcmFtU3RhcnRCbG9jawAAAAEFAAAAC3VzZXJBZGRyZXNzBQAAAAVzdGFydAUAAAADbmlsAQAAAA9nZXRQYXJhbXNPckZhaWwAAAAACQAFFQAAAAMJAAJZAAAAAQkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAkBAAAADGtleUJvbmRBc3NldAAAAAAJAQAAAAxnZXRJbnRPckZhaWwAAAABCQEAAAAQa2V5TWluTG9ja0Ftb3VudAAAAAAJAQAAAAxnZXRJbnRPckZhaWwAAAABCQEAAAALa2V5SGFsZkxpZmUAAAAAAQAAAAxpc0FjdGl2ZVVzZXIAAAABAAAAC3VzZXJBZGRyZXNzCQAAZgAAAAIJAQAAAAxnZXRJbnRPckVsc2UAAAACCQEAAAAWa2V5TG9ja1BhcmFtVXNlckFtb3VudAAAAAEFAAAAC3VzZXJBZGRyZXNzAAAAAAAAAAAAAAAAAAAAAAAAAQAAABNnZXRVc2VyUGFyYW1zT3JVbml0AAAAAQAAAAt1c2VyQWRkcmVzcwMJAQAAAAxpc0FjdGl2ZVVzZXIAAAABBQAAAAt1c2VyQWRkcmVzcwkABRUAAAADBwkBAAAADGdldEludE9yRmFpbAAAAAEJAQAAABZrZXlMb2NrUGFyYW1Vc2VyQW1vdW50AAAAAQUAAAALdXNlckFkZHJlc3MJAQAAAAxnZXRJbnRPckZhaWwAAAABCQEAAAAWa2V5TG9ja1BhcmFtU3RhcnRCbG9jawAAAAEFAAAAC3VzZXJBZGRyZXNzBQAAAAR1bml0AQAAABNnZXRVc2VyUGFyYW1zT3JGYWlsAAAAAQAAAAt1c2VyQWRkcmVzcwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQEAAAATZ2V0VXNlclBhcmFtc09yVW5pdAAAAAEFAAAAC3VzZXJBZGRyZXNzCQABLAAAAAIJAAEsAAAAAgIAAAAFVXNlciAJAAQlAAAAAQUAAAALdXNlckFkZHJlc3MCAAAADyBpcyBub3QgZGVmaW5lZAAAAAASc3VwcG9ydGVkQXNzZXRzU3RyCQEAAAAMZ2V0U3RyT3JFbHNlAAAAAgkBAAAAGGtleVN1cHBvcnRlZFJld2FyZEFzc2V0cwAAAAACAAAAAAAAAAATc3VwcG9ydGVkQXNzZXRzTGlzdAkABLUAAAACBQAAABJzdXBwb3J0ZWRBc3NldHNTdHICAAAAAV8BAAAACmNhbGNSZXdhcmQAAAAFAAAAC3VzZXJBZGRyZXNzAAAAB2Fzc2V0SWQAAAANc3Rha2VkQW1vdW50WAAAAA5kZXBvc2l0TnVtVXNlcgAAAA5kZXBvc2l0TnVtTGFzdAQAAAAXcmV3YXJkUGVyTnNidFN1bUxhc3RLRVkJAQAAABVrZXlSZXdhcmRQZXJOc2J0U3VtQXQAAAACBQAAAA5kZXBvc2l0TnVtTGFzdAUAAAAHYXNzZXRJZAQAAAAKc3VtTGFzdFgxOAkAAacAAAABCQEAAAAMZ2V0U3RyT3JFbHNlAAAAAgkBAAAAFWtleVJld2FyZFBlck5zYnRTdW1BdAAAAAIFAAAADmRlcG9zaXROdW1MYXN0BQAAAAdhc3NldElkAgAAAAEwBAAAAApzdW1Vc2VyWDE4CQABpwAAAAEJAQAAAAxnZXRTdHJPckVsc2UAAAACCQEAAAAVa2V5UmV3YXJkUGVyTnNidFN1bUF0AAAAAgUAAAAOZGVwb3NpdE51bVVzZXIFAAAAB2Fzc2V0SWQCAAAAATAEAAAAEXJld2FyZER5bmFtaWNQYXJ0CQABoAAAAAEJAAE8AAAAAwkAATgAAAACBQAAAApzdW1MYXN0WDE4BQAAAApzdW1Vc2VyWDE4BQAAAA1zdGFrZWRBbW91bnRYBQAAAAdNVUxUWDE4BAAAABNyZXdhcmRDYWNoZWRQYXJ0S0VZCQEAAAAJa2V5UmV3YXJkAAAAAgUAAAALdXNlckFkZHJlc3MFAAAAB2Fzc2V0SWQEAAAAEHJld2FyZENhY2hlZFBhcnQJAQAAAAxnZXRJbnRPckVsc2UAAAACBQAAABNyZXdhcmRDYWNoZWRQYXJ0S0VZAAAAAAAAAAAACQAFFgAAAAQJAABkAAAAAgUAAAAQcmV3YXJkQ2FjaGVkUGFydAUAAAARcmV3YXJkRHluYW1pY1BhcnQFAAAAEHJld2FyZENhY2hlZFBhcnQFAAAAEXJld2FyZER5bmFtaWNQYXJ0BQAAABNyZXdhcmRDYWNoZWRQYXJ0S0VZAQAAAA1SZXdhcmRFbnRyaWVzAAAAAwAAAAlpc05ld1VzZXIAAAALdXNlckFkZHJlc3MAAAAMc3Rha2VkQW1vdW50BAAAAA1zdGFrZWRBbW91bnRYCQABNgAAAAEFAAAADHN0YWtlZEFtb3VudAQAAAAbdXNlclJld2FyZEZyb21EZXBvc2l0TnVtS0VZCQEAAAAba2V5VXNlclJld2FyZEZyb21EZXBvc2l0TnVtAAAAAQUAAAALdXNlckFkZHJlc3MEAAAADmRlcG9zaXROdW1Vc2VyCQEAAAAMZ2V0SW50T3JFbHNlAAAAAgUAAAAbdXNlclJld2FyZEZyb21EZXBvc2l0TnVtS0VZAP//////////BAAAAA5kZXBvc2l0TnVtTGFzdAkBAAAADGdldEludE9yRWxzZQAAAAIJAQAAABFrZXlEZXBvc2l0TnVtTGFzdAAAAAAA//////////8KAQAAABtmb3JFYWNoQXNzZXRDYWNoZVVzZXJSZXdhcmQAAAACAAAABWFjY3VtAAAABWFzc2V0BAAAAAskdDA4NDA5ODU0NAkBAAAACmNhbGNSZXdhcmQAAAAFBQAAAAt1c2VyQWRkcmVzcwUAAAAFYXNzZXQFAAAADXN0YWtlZEFtb3VudFgFAAAADmRlcG9zaXROdW1Vc2VyBQAAAA5kZXBvc2l0TnVtTGFzdAQAAAALcmV3YXJkVG90YWwIBQAAAAskdDA4NDA5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ZHJlc3MDCQAAZgAAAAIJAAGQAAAAAQgFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAJAAACAAAAAQIAAAAZcGF5bWVudHMgYXJlIG5vdCBhY2NlcHRlZAQAAAANJHQwMTE0ODgxMTU5MwkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkBAAAAE2dldFVzZXJQYXJhbXNPclVuaXQAAAABBQAAAAt1c2VyQWRkcmVzcwkABRUAAAADBgAAAAAAAAAAAAAAAAAAAAAAAAQAAAAJaXNOZXdVc2VyCAUAAAANJHQwMTE0ODgxMTU5MwAAAAJfMQQAAAAMc3Rha2VkQW1vdW50CAUAAAANJHQwMTE0ODgxMTU5MwAAAAJfMgQAAAAMc3Rha2luZ1N0YXJ0CAUAAAANJHQwMTE0ODgxMTU5MwAAAAJfMwQAAAANc3Rha2VkQW1vdW50WAkAATYAAAABBQAAAAxzdGFrZWRBbW91bnQEAAAAG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQkBAAAAG2tleVVzZXJSZXdhcmRGcm9tRGVwb3NpdE51bQAAAAEFAAAADnVzZXJBZGRyZXNzU3RyBAAAAA5kZXBvc2l0TnVtVXNlcgkBAAAADGdldEludE9yRWxzZQAAAAIFAAAAG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQD//////////wQAAAAOZGVwb3NpdE51bUxhc3QJAQAAAAxnZXRJbnRPckVsc2UAAAACCQEAAAARa2V5RGVwb3NpdE51bUxhc3QAAAAAAP//////////CgEAAAAfZm9yRWFjaEFzc2V0Q2FsY1VuY2xhaW1lZFJld2FyZAAAAAIAAAAFYWNjdW0AAAAFYXNzZXQEAAAADSR0MDExOTY0MTIxMDIJAQAAAApjYWxjUmV3YXJkAAAABQUAAAAOdXNlckFkZHJlc3NTdHIFAAAABWFzc2V0BQAAAA1zdGFrZWRBbW91bnRYBQAAAA5kZXBvc2l0TnVtVXNlcgUAAAAOZGVwb3NpdE51bUxhc3QEAAAAC3Jld2FyZFRvdGFsCAUAAAANJHQwMTE5NjQxMjEwMgAAAAJfMQQAAAAGY2FjaGVkCAUAAAANJHQwMTE5NjQxMjEwMgAAAAJfMgQAAAAHZHluYW1pYwgFAAAADSR0MDExOTY0MTIx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cnVjdG9yAAAABQAAABduZXV0cmlub0NvbnRyYWN0QWRkcmVzcwAAABNtYXRoQ29udHJhY3RBZGRyZXNzAAAADW1pbkxvY2tBbW91bnQAAAAIaGFsZkxpZmUAAAAVc3VwcG9ydGVkUmV3YXJkQXNzZXRzAwkBAAAAAiE9AAAAAggFAAAAAWkAAAAGY2FsbGVyBQAAAAR0aGlzCQAAAgAAAAECAAAAEVBlcm1pc3Npb24gZGVuaWVkCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABprZXlOZXV0cmlub0NvbnRyYWN0QWRkcmVzcwAAAAAFAAAAF25ldXRyaW5vQ29udHJhY3RBZGRyZXNzCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABZrZXlNYXRoQ29udHJhY3RBZGRyZXNzAAAAAAUAAAATbWF0aENvbnRyYWN0QWRkcmVzcwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAEGtleU1pbkxvY2tBbW91bnQAAAAABQAAAA1taW5Mb2NrQW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAALa2V5SGFsZkxpZmUAAAAABQAAAAhoYWxmTGlmZQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAYa2V5U3VwcG9ydGVkUmV3YXJkQXNzZXRzAAAAAAUAAAAVc3VwcG9ydGVkUmV3YXJkQXNzZXRzBQAAAANuaWwAAAABaQEAAAAFc3Rha2UAAAAABAAAAA0kdDAxMzYyMDEzNjgyCQEAAAAPZ2V0UGFyYW1zT3JGYWlsAAAAAAQAAAALYm9uZEFzc2V0SWQIBQAAAA0kdDAxMzYyMDEzNjgyAAAAAl8xBAAAAA1taW5Mb2NrQW1vdW50CAUAAAANJHQwMTM2MjAxMzY4MgAAAAJfMgQAAAAIaGFsZkxpZmUIBQAAAA0kdDAxMzYyMDEzNjgyAAAAAl8zAwkBAAAAAiE9AAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQkAAAIAAAABAgAAABVJbnZhbGlkIHBheW1lbnRzIHNpemUEAAAAB3BheW1lbnQJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAEAAAABmFtb3VudAgFAAAAB3BheW1lbnQAAAAGYW1vdW50BAAAABNpbnZhbGlkQXNzZXRNZXNzYWdlCQABLAAAAAIJAAEsAAAAAgIAAAAPSW52YWxpZCBhc3NldC4gCQACWAAAAAEFAAAAC2JvbmRBc3NldElkAgAAAAwgaXMgZXhwZWN0ZWQEAAAAB2Fzc2V0SWQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAggFAAAAB3BheW1lbnQAAAAHYXNzZXRJZAUAAAATaW52YWxpZEFzc2V0TWVzc2FnZQMJAQAAAAIhPQAAAAIFAAAAB2Fzc2V0SWQFAAAAC2JvbmRBc3NldElkCQAAAgAAAAEFAAAAE2ludmFsaWRBc3NldE1lc3NhZ2UEAAAAC3VzZXJBZGRyZXNzCAUAAAABaQAAAAZjYWxsZXIEAAAADnVzZXJBZGRyZXNzU3RyCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAANJHQwMTQyMjQxNDMzMQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkBAAAAE2dldFVzZXJQYXJhbXNPclVuaXQAAAABBQAAAAt1c2VyQWRkcmVzcwkABRUAAAADBgAAAAAAAAAAAAD//////////wQAAAAJaXNOZXdVc2VyCAUAAAANJHQwMTQyMjQxNDMzMQAAAAJfMQQAAAAKbG9ja0Ftb3VudAgFAAAADSR0MDE0MjI0MTQzMzEAAAACXzIEAAAAD2xvY2tTdGFydEhlaWdodAgFAAAADSR0MDE0MjI0MTQzMzEAAAACXzMEAAAADG1lcmdlZEFtb3VudAMFAAAACWlzTmV3VXNlcgUAAAAGYW1vdW50CQAAZAAAAAIFAAAABmFtb3VudAUAAAAKbG9ja0Ftb3VudAQAAAARbWVyZ2VkU3RhcnRIZWlnaHQDBQAAAAlpc05ld1VzZXIFAAAABmhlaWdodAkBAAAABWFzSW50AAAAAQkAA/wAAAAEBQAAAAxtYXRoQ29udHJhY3QCAAAAE21lcmdlU3Rha2VzUkVBRE9OTFkJAARMAAAAAgUAAAAGYW1vdW50CQAETAAAAAIFAAAABmhlaWdodAkABEwAAAACBQAAAApsb2NrQW1vdW50CQAETAAAAAIFAAAAD2xvY2tTdGFydEhlaWdodAkABEwAAAACBQAAAAhoYWxmTGlmZQUAAAADbmlsBQAAAANuaWwDCQAAZgAAAAIFAAAADW1pbkxvY2tBbW91bnQFAAAADG1lcmdlZEFtb3VudAkAAAIAAAABCQABLAAAAAICAAAAE01pbiBsb2NrIGFtb3VudCBpcyAJAAGkAAAAAQUAAAANbWluTG9ja0Ftb3VudAQAAAANJHQwMTQ2OTIxNDc5NAkBAAAAC1N0YXRzUmVzdWx0AAAAAwUAAAAGYW1vdW50AAAAAAAAAAABAwUAAAAJaXNOZXdVc2VyAAAAAAAAAAABAAAAAAAAAAAABAAAAAxzdGF0c0VudHJpZXMIBQAAAA0kdDAxNDY5MjE0Nzk0AAAAAl8xBAAAAAt0b3RhbFN0YWtlZAgFAAAADSR0MDE0NjkyMTQ3OTQAAAACXzIEAAAADnRvdGFsU3Rha2VkTmV3CAUAAAANJHQwMTQ2OTIxNDc5NAAAAAJfMwkABE4AAAACCQAETgAAAAIJAAROAAAAAgkABEwAAAACCQEAAAASSGlzdG9yeVJlY29yZEVudHJ5AAAABwIAAAAFc3Rha2UFAAAAC3VzZXJBZGRyZXNzCAUAAAABaQAAAA10cmFuc2FjdGlvbklkBQAAAApsb2NrQW1vdW50BQAAAA9sb2NrU3RhcnRIZWlnaHQFAAAADG1lcmdlZEFtb3VudAUAAAARbWVyZ2VkU3RhcnRIZWlnaHQFAAAAA25pbAkBAAAADVJld2FyZEVudHJpZXMAAAADBQAAAAlpc05ld1VzZXIFAAAADnVzZXJBZGRyZXNzU3RyBQAAAApsb2NrQW1vdW50CQEAAAAPTG9ja1BhcmFtc0VudHJ5AAAAAwUAAAALdXNlckFkZHJlc3MFAAAADG1lcmdlZEFtb3VudAUAAAARbWVyZ2VkU3RhcnRIZWlnaHQFAAAADHN0YXRzRW50cmllcwAAAAFpAQAAAAd1bnN0YWtlAAAAAQAAAAZhbW91bnQDCQEAAAACIT0AAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAACQAAAgAAAAECAAAAI3Vuc3Rha2UgZG9lc24ndCByZXF1aXJlIGFueSBwYXltZW50BAAAAAt1c2VyQWRkcmVzcwgFAAAAAWkAAAAGY2FsbGVyBAAAAA51c2VyQWRkcmVz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cG10QXNzZXRJZAkBAAAAC3ZhbHVlT3JFbHNlAAAAAggFAAAAA3BtdAAAAAdhc3NldElkBQAAAAdXQVZFU0lEBAAAAA1wbXRBc3NldElkU3RyCQACWAAAAAEFAAAACnBtdEFzc2V0SWQEAAAACHBtdE11bHRYAwkAAAAAAAACBQAAAApwbXRBc3NldElkBQAAAAdXQVZFU0lEBQAAAAZNVUxUWDgFAAAABk1VTFRYNgQAAAAHYW1vdW50WAkAATYAAAABBQAAAAZhbW91bnQEAAAAC3RvdGFsU3Rha2VkCQEAAAAMZ2V0SW50T3JFbHNlAAAAAgkBAAAAF2tleUxvY2tQYXJhbVRvdGFsQW1vdW50AAAAAAAAAAAAAAAAAAQAAAAMdG90YWxTdGFrZWRYCQABNgAAAAEFAAAAC3RvdGFsU3Rha2VkAwkAAGYAAAACAAAAAAAAAAAABQAAAAt0b3RhbFN0YWtlZAkAAAIAAAABAgAAABtUT0RPOiBjYXNlIGlzIG5vdCBzdXBwb3J0ZWQDCQAAAAAAAAIFAAAAC3RvdGFsU3Rha2VkAAAAAAAAAAAACQEAAAAiSW5jcmVtZW50Tm90RGlzdHJpYnV0ZWRSZXdhcmRFbnRyeQAAAAIFAAAADXBtdEFzc2V0SWRTdHIFAAAABmFtb3VudAQAAAAQcmV3YXJkUGVyTnNidFgxOAkAATwAAAADBQAAAAdhbW91bnRYBQAAAAdNVUxUWDE4BQAAAAx0b3RhbFN0YWtlZFgEAAAAEWRlcG9zaXROdW1MYXN0S0VZCQEAAAARa2V5RGVwb3NpdE51bUxhc3QAAAAABAAAAA5kZXBvc2l0TnVtTGFzdAkBAAAADGdldEludE9yRWxzZQAAAAIFAAAAEWRlcG9zaXROdW1MYXN0S0VZAP//////////BAAAAA1kZXBvc2l0TnVtTmV3CQAAZAAAAAIFAAAADmRlcG9zaXROdW1MYXN0AAAAAAAAAAABAwkBAAAAASEAAAABCQEAAAAIY29udGFpbnMAAAACBQAAABJzdXBwb3J0ZWRBc3NldHNTdHIFAAAADXBtdEFzc2V0SWRTdHIJAAACAAAAAQkAASwAAAACCQABLAAAAAIFAAAAEnN1cHBvcnRlZEFzc2V0c1N0cgIAAAARIGRvZXNuJ3QgY29udGFpbiAFAAAADXBt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", "chainId": 84, "height": 2166972, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GwHC76UTqducv5ydSGKa3NgRFCBe8P499EuCy1ohuPa6 Next: 4gcVtk4cUXd8Ms5ZV9nR8FyMFQ6LGEGPFi4zgrdEPrm1 Diff:
OldNewDifferences
244244
245245 $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)
246246 } :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast))
247- else if (if ((depositNumLast > -1))
248- then (depositNumUser > -1)
249- else false)
250- then if (isNewUser)
251- then [IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)]
252- else ({
253- let $l = supportedAssetsList
254- let $s = size($l)
255- let $acc0 = nil
256- func $f0_1 ($a,$i) = if (($i >= $s))
257- then $a
258- else forEachAssetCacheUserReward($a, $l[$i])
259-
260- func $f0_2 ($a,$i) = if (($i >= $s))
261- then $a
262- else throw("List size exceeds 10")
263-
264- $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)
265- } :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast))
266- else throw(((("uncovered condition: depositNumLast=" + toString(depositNumLast)) + " depositNumUser=") + toString(depositNumUser)))
247+ else throw(((("uncovered condition: depositNumLast=" + toString(depositNumLast)) + " depositNumUser=") + toString(depositNumUser)))
267248 }
268249
269250
271252 let notDistributedRewardKEY = keyNotDistributedReward(tkn)
272253 let notDistributedReward = getIntOrElse(notDistributedRewardKEY, 0)
273254 [IntegerEntry(notDistributedRewardKEY, (notDistributedReward + amountInc))]
255+ }
256+
257+
258+func commonClaim (userAddress,i) = {
259+ let userAddressStr = toString(userAddress)
260+ if ((size(i.payments) > 0))
261+ then throw("payments are not accepted")
262+ else {
263+ let $t01148811593 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
264+ let isNewUser = $t01148811593._1
265+ let stakedAmount = $t01148811593._2
266+ let stakingStart = $t01148811593._3
267+ let stakedAmountX = toBigInt(stakedAmount)
268+ let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
269+ let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
270+ let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
271+ func forEachAssetCalcUnclaimedReward (accum,asset) = {
272+ let $t01196412102 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
273+ let rewardTotal = $t01196412102._1
274+ let cached = $t01196412102._2
275+ let dynamic = $t01196412102._3
276+ let rewardCachedPartKEY = $t01196412102._4
277+ let claimedKEY = keyClaimed(userAddressStr, asset)
278+ let $t01216212199 = accum
279+ let data = $t01216212199._1
280+ let claimedAmtByAsset = $t01216212199._2
281+ let newPart = makeString([asset, toString(rewardTotal)], ":")
282+ let claimedAmtByAssetNew = makeString([claimedAmtByAsset, newPart], "_")
283+ if ((0 >= rewardTotal))
284+ then $Tuple2(data, claimedAmtByAssetNew)
285+ else $Tuple2((((data :+ ScriptTransfer(userAddress, rewardTotal, toAssetVect(asset))) :+ IntegerEntry(claimedKEY, (valueOrElse(getInteger(claimedKEY), 0) + rewardTotal))) :+ IntegerEntry(rewardCachedPartKEY, 0)), claimedAmtByAssetNew)
286+ }
287+
288+ let $t01265912773 = {
289+ let $l = supportedAssetsList
290+ let $s = size($l)
291+ let $acc0 = $Tuple2(nil, "")
292+ func $f0_1 ($a,$i) = if (($i >= $s))
293+ then $a
294+ else forEachAssetCalcUnclaimedReward($a, $l[$i])
295+
296+ func $f0_2 ($a,$i) = if (($i >= $s))
297+ then $a
298+ else throw("List size exceeds 10")
299+
300+ $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)
301+ }
302+ let transfers = $t01265912773._1
303+ let claimedAmtByAssetResult = $t01265912773._2
304+ if ((0 >= size(transfers)))
305+ then throw("nothing to claim")
306+ else ((transfers :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)) :+ ClaimHistoryEntry(userAddress, i.transactionId, drop(claimedAmtByAssetResult, 1)))
307+ }
274308 }
275309
276310
283317
284318 @Callable(i)
285319 func stake () = {
286- let $t01221812280 = getParamsOrFail()
287- let bondAssetId = $t01221812280._1
288- let minLockAmount = $t01221812280._2
289- let halfLife = $t01221812280._3
320+ let $t01362013682 = getParamsOrFail()
321+ let bondAssetId = $t01362013682._1
322+ let minLockAmount = $t01362013682._2
323+ let halfLife = $t01362013682._3
290324 if ((size(i.payments) != 1))
291325 then throw("Invalid payments size")
292326 else {
299333 else {
300334 let userAddress = i.caller
301335 let userAddressStr = toString(i.caller)
302- let $t01282212929 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, -1))
303- let isNewUser = $t01282212929._1
304- let lockAmount = $t01282212929._2
305- let lockStartHeight = $t01282212929._3
336+ let $t01422414331 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, -1))
337+ let isNewUser = $t01422414331._1
338+ let lockAmount = $t01422414331._2
339+ let lockStartHeight = $t01422414331._3
306340 let mergedAmount = if (isNewUser)
307341 then amount
308342 else (amount + lockAmount)
312346 if ((minLockAmount > mergedAmount))
313347 then throw(("Min lock amount is " + toString(minLockAmount)))
314348 else {
315- let $t01329013392 = StatsResult(amount, 1, if (isNewUser)
349+ let $t01469214794 = StatsResult(amount, 1, if (isNewUser)
316350 then 1
317351 else 0)
318- let statsEntries = $t01329013392._1
319- let totalStaked = $t01329013392._2
320- let totalStakedNew = $t01329013392._3
352+ let statsEntries = $t01469214794._1
353+ let totalStaked = $t01469214794._2
354+ let totalStakedNew = $t01469214794._3
321355 ((([HistoryRecordEntry("stake", userAddress, i.transactionId, lockAmount, lockStartHeight, mergedAmount, mergedStartHeight)] ++ RewardEntries(isNewUser, userAddressStr, lockAmount)) ++ LockParamsEntry(userAddress, mergedAmount, mergedStartHeight)) ++ statsEntries)
322356 }
323357 }
332366 else {
333367 let userAddress = i.caller
334368 let userAddressStr = toString(userAddress)
335- let $t01387813940 = getParamsOrFail()
336- let bondAssetId = $t01387813940._1
337- let minLockAmount = $t01387813940._2
338- let halfLife = $t01387813940._3
339- let $t01394314017 = getUserParamsOrFail(userAddress)
340- let isNewUser = $t01394314017._1
341- let lockAmount = $t01394314017._2
342- let lockStart = $t01394314017._3
369+ let $t01528015342 = getParamsOrFail()
370+ let bondAssetId = $t01528015342._1
371+ let minLockAmount = $t01528015342._2
372+ let halfLife = $t01528015342._3
373+ let $t01534515419 = getUserParamsOrFail(userAddress)
374+ let isNewUser = $t01534515419._1
375+ let lockAmount = $t01534515419._2
376+ let lockStart = $t01534515419._3
343377 if ((0 >= lockAmount))
344378 then throw("Nothing to unstake")
345379 else if ((amount > lockAmount))
346380 then throw(((("Requested " + toString(amount)) + ", but staked only ") + toString(lockAmount)))
347381 else {
348382 let comissionAmount = asInt(invoke(mathContract, "getUnstakeComissionAmountREADONLY", [amount, lockStart, halfLife], nil))
349- let $t01433114485 = StatsResult(-(amount), if ((amount == lockAmount))
383+ let $t01573315887 = StatsResult(-(amount), if ((amount == lockAmount))
350384 then -1
351385 else 0, if ((amount == lockAmount))
352386 then -1
353387 else 0)
354- let statsEntries = $t01433114485._1
355- let totalStaked = $t01433114485._2
356- let totalStakedNew = $t01433114485._3
388+ let statsEntries = $t01573315887._1
389+ let totalStaked = $t01573315887._2
390+ let totalStakedNew = $t01573315887._3
357391 ((([ScriptTransfer(userAddress, (amount - comissionAmount), bondAssetId), ScriptTransfer(auctionContract, comissionAmount, bondAssetId), HistoryRecordEntry("unstake", userAddress, i.transactionId, lockAmount, lockStart, (lockAmount - amount), lockStart)] ++ RewardEntries(false, userAddressStr, lockAmount)) ++ LockParamsEntry(userAddress, (lockAmount - amount), lockStart)) ++ statsEntries)
358392 }
359393 }
415449
416450
417451 @Callable(i)
418-func claimRewards () = {
419- let userAddress = i.caller
420- let userAddressStr = toString(userAddress)
421- if ((size(i.payments) > 0))
422- then throw("payments are not accepted")
423- else {
424- let $t01673216837 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
425- let isNewUser = $t01673216837._1
426- let stakedAmount = $t01673216837._2
427- let stakingStart = $t01673216837._3
428- let stakedAmountX = toBigInt(stakedAmount)
429- let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
430- let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
431- let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
432- func forEachAssetCalcUnclaimedReward (accum,asset) = {
433- let $t01720817346 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
434- let rewardTotal = $t01720817346._1
435- let cached = $t01720817346._2
436- let dynamic = $t01720817346._3
437- let rewardCachedPartKEY = $t01720817346._4
438- let claimedKEY = keyClaimed(userAddressStr, asset)
439- let $t01740617443 = accum
440- let data = $t01740617443._1
441- let claimedAmtByAsset = $t01740617443._2
442- let newPart = makeString([asset, toString(rewardTotal)], ":")
443- let claimedAmtByAssetNew = makeString([claimedAmtByAsset, newPart], "_")
444- if ((0 >= rewardTotal))
445- then $Tuple2(data, claimedAmtByAssetNew)
446- else $Tuple2((((data :+ ScriptTransfer(userAddress, rewardTotal, toAssetVect(asset))) :+ IntegerEntry(claimedKEY, (valueOrElse(getInteger(claimedKEY), 0) + rewardTotal))) :+ IntegerEntry(rewardCachedPartKEY, 0)), claimedAmtByAssetNew)
447- }
452+func claimRewards () = commonClaim(i.caller, i)
448453
449- let $t01790318017 = {
450- let $l = supportedAssetsList
451- let $s = size($l)
452- let $acc0 = $Tuple2(nil, "")
453- func $f0_1 ($a,$i) = if (($i >= $s))
454- then $a
455- else forEachAssetCalcUnclaimedReward($a, $l[$i])
456454
457- func $f0_2 ($a,$i) = if (($i >= $s))
458- then $a
459- else throw("List size exceeds 10")
460455
461- $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)
462- }
463- let transfers = $t01790318017._1
464- let claimedAmtByAssetResult = $t01790318017._2
465- if ((0 >= size(transfers)))
466- then throw("nothing to claim")
467- else ((transfers :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)) :+ ClaimHistoryEntry(userAddress, i.transactionId, drop(claimedAmtByAssetResult, 1)))
468- }
469- }
456+@Callable(i)
457+func claimRewardsByOriginCaller () = commonClaim(i.originCaller, i)
470458
471459
472460
491479 }
492480 else {
493481 let userAddress = addressFromStringValue(userAddressStr)
494- let $t01871518820 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
495- let isNewUser = $t01871518820._1
496- let stakedAmount = $t01871518820._2
497- let stakingStart = $t01871518820._3
482+ let $t01856318668 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
483+ let isNewUser = $t01856318668._1
484+ let stakedAmount = $t01856318668._2
485+ let stakingStart = $t01856318668._3
498486 let stakedAmountX = toBigInt(stakedAmount)
499487 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
500488 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
501489 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
502490 func forEachAssetCalcUnclaimedReward (accum,asset) = {
503- let $t01916619304 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
504- let rewardTotal = $t01916619304._1
505- let cached = $t01916619304._2
506- let dynamic = $t01916619304._3
507- let rewardCachedPartKEY = $t01916619304._4
491+ let $t01901419152 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
492+ let rewardTotal = $t01901419152._1
493+ let cached = $t01901419152._2
494+ let dynamic = $t01901419152._3
495+ let rewardCachedPartKEY = $t01901419152._4
508496 let claimed = valueOrElse(getInteger(keyClaimed(userAddressStr, asset)), 0)
509497 ((accum + makeString([asset, toString(rewardTotal), toString(claimed)], ":")) + "_")
510498 }
533521 then [0, 0, 0, 0]
534522 else {
535523 let userAddress = addressFromStringValue(userAddressStrOrEmpty)
536- let $t01984319905 = getParamsOrFail()
537- let nsbtAssetId = $t01984319905._1
538- let minLockAmount = $t01984319905._2
539- let halfLife = $t01984319905._3
540- let $t01990819984 = getUserParamsOrFail(userAddress)
541- let isNewUser = $t01990819984._1
542- let stakedAmount = $t01990819984._2
543- let lockStart = $t01990819984._3
524+ let $t01969119753 = getParamsOrFail()
525+ let nsbtAssetId = $t01969119753._1
526+ let minLockAmount = $t01969119753._2
527+ let halfLife = $t01969119753._3
528+ let $t01975619832 = getUserParamsOrFail(userAddress)
529+ let isNewUser = $t01975619832._1
530+ let stakedAmount = $t01975619832._2
531+ let lockStart = $t01975619832._3
544532 let stakedAmountNEW = (stakedAmount - unstakeAmt)
545533 let comissionAmount = asInt(invoke(mathContract, "getUnstakeComissionAmountREADONLY", [unstakeAmt, lockStart, halfLife], nil))
546534 let receiveAmount = (unstakeAmt - comissionAmount)
558546 then $Tuple2(nil, [0, totalNsbtAmt, 0])
559547 else {
560548 let userAddress = toAddressOrFail(userAddressStr)
561- let $t02067120775 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
562- let isNewUser = $t02067120775._1
563- let userNsbtAmt = $t02067120775._2
564- let stakingStart = $t02067120775._3
549+ let $t02051920623 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
550+ let isNewUser = $t02051920623._1
551+ let userNsbtAmt = $t02051920623._2
552+ let stakingStart = $t02051920623._3
565553 $Tuple2(nil, [userNsbtAmt, totalNsbtAmt, stakingStart])
566554 }
567555 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let separator = "__"
55
66 let SEP = "__"
77
88 let MULT6 = 1000000
99
1010 let MULT8 = 100000000
1111
1212 let MULTX6 = toBigInt(MULT6)
1313
1414 let MULTX8 = toBigInt(MULT8)
1515
1616 let MULTX18 = toBigInt(1000000000000000000)
1717
1818 let WAVESIDSTR = "WAVES"
1919
2020 let WAVESID = fromBase58String(WAVESIDSTR)
2121
2222 let IdxControlCfgNeutrinoDapp = 1
2323
2424 let IdxControlCfgAuctionDapp = 2
2525
2626 let IdxControlCfgRpdDapp = 3
2727
2828 let IdxControlCfgMathDapp = 4
2929
3030 let IdxControlCfgLiquidationDapp = 5
3131
3232 let IdxControlCfgRestDapp = 6
3333
3434 let IdxControlCfgNodeRegistryDapp = 7
3535
3636 let IdxControlCfgNsbtStakingDapp = 8
3737
3838 let IdxControlCfgMediatorDapp = 9
3939
4040 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), (((("mandatory " + toString(address)) + ".") + key) + " is not defined"))
4141
4242
4343 func keyControlAddress () = "%s%s__config__controlAddress"
4444
4545
4646 func keyControlCfg () = "%s__controlConfig"
4747
4848
4949 func readControlCfgOrFail (control) = split(getStringOrFail(control, keyControlCfg()), SEP)
5050
5151
5252 func getContractAddressOrFail (controlCfg,idx) = valueOrErrorMessage(addressFromString(controlCfg[idx]), ("Control cfg doesn't contain address at index " + toString(idx)))
5353
5454
5555 let controlContract = addressFromStringValue(valueOrElse(getString(this, keyControlAddress()), "3N4NS7d4Jo9a6F14LiFUKKYVdUkkf2eP4Zx"))
5656
5757 let controlCfg = readControlCfgOrFail(controlContract)
5858
5959 let mathContract = getContractAddressOrFail(controlCfg, IdxControlCfgMathDapp)
6060
6161 let neutrinoContract = getContractAddressOrFail(controlCfg, IdxControlCfgNeutrinoDapp)
6262
6363 let auctionContract = getContractAddressOrFail(controlCfg, IdxControlCfgAuctionDapp)
6464
6565 func keyBondAsset () = "bond_asset_id"
6666
6767
6868 func keyNeutrinoContractAddress () = "%s__neutrinoContractAddress"
6969
7070
7171 func keyMathContractAddress () = "%s__mathContract"
7272
7373
7474 func keyMinLockAmount () = "%s__minLockAmount"
7575
7676
7777 func keyHalfLife () = "%s__halfLife"
7878
7979
8080 func keyLockParamUserAmount (userAddress) = makeString(["%s%s%s", "paramByUser", toString(userAddress), "amount"], separator)
8181
8282
8383 func keyLockParamStartBlock (userAddress) = makeString(["%s%s%s", "paramByUser", toString(userAddress), "start"], separator)
8484
8585
8686 func keyHistoryRecord (type,userAddress,txId) = makeString(["%s%s%s%s", "history", type, toString(userAddress), toBase58String(txId)], separator)
8787
8888
8989 func keyLockParamTotalAmount () = makeString(["%s%s", "stats", "activeTotalLocked"], separator)
9090
9191
9292 func keyStatsLocksCount () = makeString(["%s%s", "stats", "locksCount"], separator)
9393
9494
9595 func keyStatsUsersCount () = makeString(["%s%s", "stats", "activeUsersCount"], separator)
9696
9797
9898 func keyNextPeriod () = "%s__nextPeriod"
9999
100100
101101 func keySupportedRewardAssets () = "supportedRewardAssets"
102102
103103
104104 func keyDepositNumLast () = makeString(["%s%s%s", "dep", "lastNum"], separator)
105105
106106
107107 func keyUserRewardFromDepositNum (userAddress) = makeString(["%s%s%s", "userRwdFromDepNum", userAddress], separator)
108108
109109
110110 func keyRewardPerNsbtSumAt (depositNum,tkn) = makeString(["%s%d", "rwdPerNsbtSumByDepNum", toString(depositNum), tkn], separator)
111111
112112
113113 func keyReward (userAddress,tkn) = makeString(["%s%s%s", "rwd", userAddress, tkn], separator)
114114
115115
116116 func keyClaimed (userAddress,tkn) = makeString(["%s%s%s", "clm", userAddress, tkn], separator)
117117
118118
119119 func keyNotDistributedReward (tkn) = makeString(["%s%s", "notDistributed", tkn], separator)
120120
121121
122122 func toX18 (origVal,origMult) = fraction(toBigInt(origVal), MULTX18, origMult)
123123
124124
125125 func getIntOrZero (key) = valueOrElse(getInteger(this, key), 0)
126126
127127
128128 func getIntOrElse (key,defaultVal) = valueOrElse(getInteger(this, key), defaultVal)
129129
130130
131131 func getIntOrFail (key) = valueOrErrorMessage(getInteger(this, key), (("Mandatory this." + key) + " is not defined"))
132132
133133
134134 func getStrOrElse (key,defaultVal) = valueOrElse(getString(this, key), defaultVal)
135135
136136
137137 func toAddressOrFail (addressStr) = valueOrErrorMessage(addressFromString(addressStr), ("couldn't parse passed addressStr=" + addressStr))
138138
139139
140140 func toAssetVect (assetStr) = if ((assetStr == WAVESIDSTR))
141141 then unit
142142 else fromBase58String(assetStr)
143143
144144
145145 func asInt (val) = match val {
146146 case valInt: Int =>
147147 valInt
148148 case _ =>
149149 throw("fail to cast into Int")
150150 }
151151
152152
153153 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)
154154
155155
156156 func formatClaimHistoryRecord (user,claimedRewards) = makeString(["%s%d%d%s", user, toString(lastBlock.height), toString(lastBlock.timestamp), claimedRewards], separator)
157157
158158
159159 func HistoryRecordEntry (type,userAddress,txId,oldAmount,oldStart,newAmount,newStart) = StringEntry(keyHistoryRecord(type, userAddress, txId), formatHistoryRecord(oldAmount, oldStart, newAmount, newStart))
160160
161161
162162 func ClaimHistoryEntry (userAddress,txId,claimedRewards) = StringEntry(keyHistoryRecord("claim", userAddress, txId), formatClaimHistoryRecord(toString(userAddress), claimedRewards))
163163
164164
165165 func StatsResult (totalLockedInc,lockCountInc,usersCountInc) = {
166166 let locksCount = getIntOrZero(keyStatsLocksCount())
167167 let usersCount = getIntOrZero(keyStatsUsersCount())
168168 let totalAmount = getIntOrZero(keyLockParamTotalAmount())
169169 let totalAmountNew = (totalAmount + totalLockedInc)
170170 $Tuple3([IntegerEntry(keyStatsLocksCount(), (locksCount + lockCountInc)), IntegerEntry(keyStatsUsersCount(), (usersCount + usersCountInc)), IntegerEntry(keyLockParamTotalAmount(), totalAmountNew)], totalAmount, totalAmountNew)
171171 }
172172
173173
174174 func LockParamsEntry (userAddress,amount,start) = [IntegerEntry(keyLockParamUserAmount(userAddress), amount), IntegerEntry(keyLockParamStartBlock(userAddress), start)]
175175
176176
177177 func getParamsOrFail () = $Tuple3(fromBase58String(getStringValue(neutrinoContract, keyBondAsset())), getIntOrFail(keyMinLockAmount()), getIntOrFail(keyHalfLife()))
178178
179179
180180 func isActiveUser (userAddress) = (getIntOrElse(keyLockParamUserAmount(userAddress), 0) > 0)
181181
182182
183183 func getUserParamsOrUnit (userAddress) = if (isActiveUser(userAddress))
184184 then $Tuple3(false, getIntOrFail(keyLockParamUserAmount(userAddress)), getIntOrFail(keyLockParamStartBlock(userAddress)))
185185 else unit
186186
187187
188188 func getUserParamsOrFail (userAddress) = valueOrErrorMessage(getUserParamsOrUnit(userAddress), (("User " + toString(userAddress)) + " is not defined"))
189189
190190
191191 let supportedAssetsStr = getStrOrElse(keySupportedRewardAssets(), "")
192192
193193 let supportedAssetsList = split(supportedAssetsStr, "_")
194194
195195 func calcReward (userAddress,assetId,stakedAmountX,depositNumUser,depositNumLast) = {
196196 let rewardPerNsbtSumLastKEY = keyRewardPerNsbtSumAt(depositNumLast, assetId)
197197 let sumLastX18 = parseBigIntValue(getStrOrElse(keyRewardPerNsbtSumAt(depositNumLast, assetId), "0"))
198198 let sumUserX18 = parseBigIntValue(getStrOrElse(keyRewardPerNsbtSumAt(depositNumUser, assetId), "0"))
199199 let rewardDynamicPart = toInt(fraction((sumLastX18 - sumUserX18), stakedAmountX, MULTX18))
200200 let rewardCachedPartKEY = keyReward(userAddress, assetId)
201201 let rewardCachedPart = getIntOrElse(rewardCachedPartKEY, 0)
202202 $Tuple4((rewardCachedPart + rewardDynamicPart), rewardCachedPart, rewardDynamicPart, rewardCachedPartKEY)
203203 }
204204
205205
206206 func RewardEntries (isNewUser,userAddress,stakedAmount) = {
207207 let stakedAmountX = toBigInt(stakedAmount)
208208 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddress)
209209 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
210210 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
211211 func forEachAssetCacheUserReward (accum,asset) = {
212212 let $t084098544 = calcReward(userAddress, asset, stakedAmountX, depositNumUser, depositNumLast)
213213 let rewardTotal = $t084098544._1
214214 let cached = $t084098544._2
215215 let dynamic = $t084098544._3
216216 let rewardCachedPartKEY = $t084098544._4
217217 (accum :+ IntegerEntry(rewardCachedPartKEY, rewardTotal))
218218 }
219219
220220 if (if ((depositNumLast == -1))
221221 then (depositNumUser == -1)
222222 else false)
223223 then nil
224224 else if (if ((depositNumLast == -1))
225225 then (depositNumUser > -1)
226226 else false)
227227 then throw("invalid depositNumLast and depositNumUser state")
228228 else if (if ((depositNumLast > -1))
229229 then (depositNumUser == -1)
230230 else false)
231231 then if (isNewUser)
232232 then [IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)]
233233 else ({
234234 let $l = supportedAssetsList
235235 let $s = size($l)
236236 let $acc0 = nil
237237 func $f0_1 ($a,$i) = if (($i >= $s))
238238 then $a
239239 else forEachAssetCacheUserReward($a, $l[$i])
240240
241241 func $f0_2 ($a,$i) = if (($i >= $s))
242242 then $a
243243 else throw("List size exceeds 10")
244244
245245 $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)
246246 } :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast))
247- else if (if ((depositNumLast > -1))
248- then (depositNumUser > -1)
249- else false)
250- then if (isNewUser)
251- then [IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)]
252- else ({
253- let $l = supportedAssetsList
254- let $s = size($l)
255- let $acc0 = nil
256- func $f0_1 ($a,$i) = if (($i >= $s))
257- then $a
258- else forEachAssetCacheUserReward($a, $l[$i])
259-
260- func $f0_2 ($a,$i) = if (($i >= $s))
261- then $a
262- else throw("List size exceeds 10")
263-
264- $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)
265- } :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast))
266- else throw(((("uncovered condition: depositNumLast=" + toString(depositNumLast)) + " depositNumUser=") + toString(depositNumUser)))
247+ else throw(((("uncovered condition: depositNumLast=" + toString(depositNumLast)) + " depositNumUser=") + toString(depositNumUser)))
267248 }
268249
269250
270251 func IncrementNotDistributedRewardEntry (tkn,amountInc) = {
271252 let notDistributedRewardKEY = keyNotDistributedReward(tkn)
272253 let notDistributedReward = getIntOrElse(notDistributedRewardKEY, 0)
273254 [IntegerEntry(notDistributedRewardKEY, (notDistributedReward + amountInc))]
255+ }
256+
257+
258+func commonClaim (userAddress,i) = {
259+ let userAddressStr = toString(userAddress)
260+ if ((size(i.payments) > 0))
261+ then throw("payments are not accepted")
262+ else {
263+ let $t01148811593 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
264+ let isNewUser = $t01148811593._1
265+ let stakedAmount = $t01148811593._2
266+ let stakingStart = $t01148811593._3
267+ let stakedAmountX = toBigInt(stakedAmount)
268+ let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
269+ let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
270+ let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
271+ func forEachAssetCalcUnclaimedReward (accum,asset) = {
272+ let $t01196412102 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
273+ let rewardTotal = $t01196412102._1
274+ let cached = $t01196412102._2
275+ let dynamic = $t01196412102._3
276+ let rewardCachedPartKEY = $t01196412102._4
277+ let claimedKEY = keyClaimed(userAddressStr, asset)
278+ let $t01216212199 = accum
279+ let data = $t01216212199._1
280+ let claimedAmtByAsset = $t01216212199._2
281+ let newPart = makeString([asset, toString(rewardTotal)], ":")
282+ let claimedAmtByAssetNew = makeString([claimedAmtByAsset, newPart], "_")
283+ if ((0 >= rewardTotal))
284+ then $Tuple2(data, claimedAmtByAssetNew)
285+ else $Tuple2((((data :+ ScriptTransfer(userAddress, rewardTotal, toAssetVect(asset))) :+ IntegerEntry(claimedKEY, (valueOrElse(getInteger(claimedKEY), 0) + rewardTotal))) :+ IntegerEntry(rewardCachedPartKEY, 0)), claimedAmtByAssetNew)
286+ }
287+
288+ let $t01265912773 = {
289+ let $l = supportedAssetsList
290+ let $s = size($l)
291+ let $acc0 = $Tuple2(nil, "")
292+ func $f0_1 ($a,$i) = if (($i >= $s))
293+ then $a
294+ else forEachAssetCalcUnclaimedReward($a, $l[$i])
295+
296+ func $f0_2 ($a,$i) = if (($i >= $s))
297+ then $a
298+ else throw("List size exceeds 10")
299+
300+ $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)
301+ }
302+ let transfers = $t01265912773._1
303+ let claimedAmtByAssetResult = $t01265912773._2
304+ if ((0 >= size(transfers)))
305+ then throw("nothing to claim")
306+ else ((transfers :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)) :+ ClaimHistoryEntry(userAddress, i.transactionId, drop(claimedAmtByAssetResult, 1)))
307+ }
274308 }
275309
276310
277311 @Callable(i)
278312 func constructor (neutrinoContractAddress,mathContractAddress,minLockAmount,halfLife,supportedRewardAssets) = if ((i.caller != this))
279313 then throw("Permission denied")
280314 else [StringEntry(keyNeutrinoContractAddress(), neutrinoContractAddress), StringEntry(keyMathContractAddress(), mathContractAddress), IntegerEntry(keyMinLockAmount(), minLockAmount), IntegerEntry(keyHalfLife(), halfLife), StringEntry(keySupportedRewardAssets(), supportedRewardAssets)]
281315
282316
283317
284318 @Callable(i)
285319 func stake () = {
286- let $t01221812280 = getParamsOrFail()
287- let bondAssetId = $t01221812280._1
288- let minLockAmount = $t01221812280._2
289- let halfLife = $t01221812280._3
320+ let $t01362013682 = getParamsOrFail()
321+ let bondAssetId = $t01362013682._1
322+ let minLockAmount = $t01362013682._2
323+ let halfLife = $t01362013682._3
290324 if ((size(i.payments) != 1))
291325 then throw("Invalid payments size")
292326 else {
293327 let payment = i.payments[0]
294328 let amount = payment.amount
295329 let invalidAssetMessage = (("Invalid asset. " + toBase58String(bondAssetId)) + " is expected")
296330 let assetId = valueOrErrorMessage(payment.assetId, invalidAssetMessage)
297331 if ((assetId != bondAssetId))
298332 then throw(invalidAssetMessage)
299333 else {
300334 let userAddress = i.caller
301335 let userAddressStr = toString(i.caller)
302- let $t01282212929 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, -1))
303- let isNewUser = $t01282212929._1
304- let lockAmount = $t01282212929._2
305- let lockStartHeight = $t01282212929._3
336+ let $t01422414331 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, -1))
337+ let isNewUser = $t01422414331._1
338+ let lockAmount = $t01422414331._2
339+ let lockStartHeight = $t01422414331._3
306340 let mergedAmount = if (isNewUser)
307341 then amount
308342 else (amount + lockAmount)
309343 let mergedStartHeight = if (isNewUser)
310344 then height
311345 else asInt(invoke(mathContract, "mergeStakesREADONLY", [amount, height, lockAmount, lockStartHeight, halfLife], nil))
312346 if ((minLockAmount > mergedAmount))
313347 then throw(("Min lock amount is " + toString(minLockAmount)))
314348 else {
315- let $t01329013392 = StatsResult(amount, 1, if (isNewUser)
349+ let $t01469214794 = StatsResult(amount, 1, if (isNewUser)
316350 then 1
317351 else 0)
318- let statsEntries = $t01329013392._1
319- let totalStaked = $t01329013392._2
320- let totalStakedNew = $t01329013392._3
352+ let statsEntries = $t01469214794._1
353+ let totalStaked = $t01469214794._2
354+ let totalStakedNew = $t01469214794._3
321355 ((([HistoryRecordEntry("stake", userAddress, i.transactionId, lockAmount, lockStartHeight, mergedAmount, mergedStartHeight)] ++ RewardEntries(isNewUser, userAddressStr, lockAmount)) ++ LockParamsEntry(userAddress, mergedAmount, mergedStartHeight)) ++ statsEntries)
322356 }
323357 }
324358 }
325359 }
326360
327361
328362
329363 @Callable(i)
330364 func unstake (amount) = if ((size(i.payments) != 0))
331365 then throw("unstake doesn't require any payment")
332366 else {
333367 let userAddress = i.caller
334368 let userAddressStr = toString(userAddress)
335- let $t01387813940 = getParamsOrFail()
336- let bondAssetId = $t01387813940._1
337- let minLockAmount = $t01387813940._2
338- let halfLife = $t01387813940._3
339- let $t01394314017 = getUserParamsOrFail(userAddress)
340- let isNewUser = $t01394314017._1
341- let lockAmount = $t01394314017._2
342- let lockStart = $t01394314017._3
369+ let $t01528015342 = getParamsOrFail()
370+ let bondAssetId = $t01528015342._1
371+ let minLockAmount = $t01528015342._2
372+ let halfLife = $t01528015342._3
373+ let $t01534515419 = getUserParamsOrFail(userAddress)
374+ let isNewUser = $t01534515419._1
375+ let lockAmount = $t01534515419._2
376+ let lockStart = $t01534515419._3
343377 if ((0 >= lockAmount))
344378 then throw("Nothing to unstake")
345379 else if ((amount > lockAmount))
346380 then throw(((("Requested " + toString(amount)) + ", but staked only ") + toString(lockAmount)))
347381 else {
348382 let comissionAmount = asInt(invoke(mathContract, "getUnstakeComissionAmountREADONLY", [amount, lockStart, halfLife], nil))
349- let $t01433114485 = StatsResult(-(amount), if ((amount == lockAmount))
383+ let $t01573315887 = StatsResult(-(amount), if ((amount == lockAmount))
350384 then -1
351385 else 0, if ((amount == lockAmount))
352386 then -1
353387 else 0)
354- let statsEntries = $t01433114485._1
355- let totalStaked = $t01433114485._2
356- let totalStakedNew = $t01433114485._3
388+ let statsEntries = $t01573315887._1
389+ let totalStaked = $t01573315887._2
390+ let totalStakedNew = $t01573315887._3
357391 ((([ScriptTransfer(userAddress, (amount - comissionAmount), bondAssetId), ScriptTransfer(auctionContract, comissionAmount, bondAssetId), HistoryRecordEntry("unstake", userAddress, i.transactionId, lockAmount, lockStart, (lockAmount - amount), lockStart)] ++ RewardEntries(false, userAddressStr, lockAmount)) ++ LockParamsEntry(userAddress, (lockAmount - amount), lockStart)) ++ statsEntries)
358392 }
359393 }
360394
361395
362396
363397 @Callable(i)
364398 func deposit () = if ((size(i.payments) != 1))
365399 then throw("exact 1 payment is allowed only")
366400 else {
367401 let pmt = i.payments[0]
368402 let amount = pmt.amount
369403 let pmtAssetId = valueOrElse(pmt.assetId, WAVESID)
370404 let pmtAssetIdStr = toBase58String(pmtAssetId)
371405 let pmtMultX = if ((pmtAssetId == WAVESID))
372406 then MULTX8
373407 else MULTX6
374408 let amountX = toBigInt(amount)
375409 let totalStaked = getIntOrElse(keyLockParamTotalAmount(), 0)
376410 let totalStakedX = toBigInt(totalStaked)
377411 if ((0 > totalStaked))
378412 then throw("TODO: case is not supported")
379413 else if ((totalStaked == 0))
380414 then IncrementNotDistributedRewardEntry(pmtAssetIdStr, amount)
381415 else {
382416 let rewardPerNsbtX18 = fraction(amountX, MULTX18, totalStakedX)
383417 let depositNumLastKEY = keyDepositNumLast()
384418 let depositNumLast = getIntOrElse(depositNumLastKEY, -1)
385419 let depositNumNew = (depositNumLast + 1)
386420 if (!(contains(supportedAssetsStr, pmtAssetIdStr)))
387421 then throw(((supportedAssetsStr + " doesn't contain ") + pmtAssetIdStr))
388422 else {
389423 func refreshRewardPerNsbtSUM (accum,nextAsset) = {
390424 let rewardPerNsbtSumNewKEY = keyRewardPerNsbtSumAt(depositNumNew, nextAsset)
391425 let sumLastStr = getStrOrElse(keyRewardPerNsbtSumAt(depositNumLast, nextAsset), "0")
392426 (accum :+ (if ((nextAsset == pmtAssetIdStr))
393427 then StringEntry(rewardPerNsbtSumNewKEY, toString((parseBigIntValue(sumLastStr) + rewardPerNsbtX18)))
394428 else StringEntry(rewardPerNsbtSumNewKEY, sumLastStr)))
395429 }
396430
397431 ({
398432 let $l = supportedAssetsList
399433 let $s = size($l)
400434 let $acc0 = nil
401435 func $f0_1 ($a,$i) = if (($i >= $s))
402436 then $a
403437 else refreshRewardPerNsbtSUM($a, $l[$i])
404438
405439 func $f0_2 ($a,$i) = if (($i >= $s))
406440 then $a
407441 else throw("List size exceeds 10")
408442
409443 $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)
410444 } :+ IntegerEntry(depositNumLastKEY, depositNumNew))
411445 }
412446 }
413447 }
414448
415449
416450
417451 @Callable(i)
418-func claimRewards () = {
419- let userAddress = i.caller
420- let userAddressStr = toString(userAddress)
421- if ((size(i.payments) > 0))
422- then throw("payments are not accepted")
423- else {
424- let $t01673216837 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
425- let isNewUser = $t01673216837._1
426- let stakedAmount = $t01673216837._2
427- let stakingStart = $t01673216837._3
428- let stakedAmountX = toBigInt(stakedAmount)
429- let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
430- let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
431- let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
432- func forEachAssetCalcUnclaimedReward (accum,asset) = {
433- let $t01720817346 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
434- let rewardTotal = $t01720817346._1
435- let cached = $t01720817346._2
436- let dynamic = $t01720817346._3
437- let rewardCachedPartKEY = $t01720817346._4
438- let claimedKEY = keyClaimed(userAddressStr, asset)
439- let $t01740617443 = accum
440- let data = $t01740617443._1
441- let claimedAmtByAsset = $t01740617443._2
442- let newPart = makeString([asset, toString(rewardTotal)], ":")
443- let claimedAmtByAssetNew = makeString([claimedAmtByAsset, newPart], "_")
444- if ((0 >= rewardTotal))
445- then $Tuple2(data, claimedAmtByAssetNew)
446- else $Tuple2((((data :+ ScriptTransfer(userAddress, rewardTotal, toAssetVect(asset))) :+ IntegerEntry(claimedKEY, (valueOrElse(getInteger(claimedKEY), 0) + rewardTotal))) :+ IntegerEntry(rewardCachedPartKEY, 0)), claimedAmtByAssetNew)
447- }
452+func claimRewards () = commonClaim(i.caller, i)
448453
449- let $t01790318017 = {
450- let $l = supportedAssetsList
451- let $s = size($l)
452- let $acc0 = $Tuple2(nil, "")
453- func $f0_1 ($a,$i) = if (($i >= $s))
454- then $a
455- else forEachAssetCalcUnclaimedReward($a, $l[$i])
456454
457- func $f0_2 ($a,$i) = if (($i >= $s))
458- then $a
459- else throw("List size exceeds 10")
460455
461- $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)
462- }
463- let transfers = $t01790318017._1
464- let claimedAmtByAssetResult = $t01790318017._2
465- if ((0 >= size(transfers)))
466- then throw("nothing to claim")
467- else ((transfers :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)) :+ ClaimHistoryEntry(userAddress, i.transactionId, drop(claimedAmtByAssetResult, 1)))
468- }
469- }
456+@Callable(i)
457+func claimRewardsByOriginCaller () = commonClaim(i.originCaller, i)
470458
471459
472460
473461 @Callable(i)
474462 func unclaimedRewardsREADONLY (userAddressStr) = {
475463 func forEachAssetZeroReward (accum,asset) = ((accum + makeString([asset, "0", "0"], ":")) + "_")
476464
477465 let unclaimedRewardStr = if ((userAddressStr == ""))
478466 then {
479467 let $l = supportedAssetsList
480468 let $s = size($l)
481469 let $acc0 = ""
482470 func $f0_1 ($a,$i) = if (($i >= $s))
483471 then $a
484472 else forEachAssetZeroReward($a, $l[$i])
485473
486474 func $f0_2 ($a,$i) = if (($i >= $s))
487475 then $a
488476 else throw("List size exceeds 10")
489477
490478 $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)
491479 }
492480 else {
493481 let userAddress = addressFromStringValue(userAddressStr)
494- let $t01871518820 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
495- let isNewUser = $t01871518820._1
496- let stakedAmount = $t01871518820._2
497- let stakingStart = $t01871518820._3
482+ let $t01856318668 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
483+ let isNewUser = $t01856318668._1
484+ let stakedAmount = $t01856318668._2
485+ let stakingStart = $t01856318668._3
498486 let stakedAmountX = toBigInt(stakedAmount)
499487 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
500488 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
501489 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
502490 func forEachAssetCalcUnclaimedReward (accum,asset) = {
503- let $t01916619304 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
504- let rewardTotal = $t01916619304._1
505- let cached = $t01916619304._2
506- let dynamic = $t01916619304._3
507- let rewardCachedPartKEY = $t01916619304._4
491+ let $t01901419152 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
492+ let rewardTotal = $t01901419152._1
493+ let cached = $t01901419152._2
494+ let dynamic = $t01901419152._3
495+ let rewardCachedPartKEY = $t01901419152._4
508496 let claimed = valueOrElse(getInteger(keyClaimed(userAddressStr, asset)), 0)
509497 ((accum + makeString([asset, toString(rewardTotal), toString(claimed)], ":")) + "_")
510498 }
511499
512500 let $l = supportedAssetsList
513501 let $s = size($l)
514502 let $acc0 = ""
515503 func $f0_1 ($a,$i) = if (($i >= $s))
516504 then $a
517505 else forEachAssetCalcUnclaimedReward($a, $l[$i])
518506
519507 func $f0_2 ($a,$i) = if (($i >= $s))
520508 then $a
521509 else throw("List size exceeds 10")
522510
523511 $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)
524512 }
525513 $Tuple2(nil, dropRight(unclaimedRewardStr, 1))
526514 }
527515
528516
529517
530518 @Callable(i)
531519 func nsbtUnstakingSYSREADONLY (userAddressStrOrEmpty,unstakeAmt) = {
532520 let resultArray = if ((userAddressStrOrEmpty == ""))
533521 then [0, 0, 0, 0]
534522 else {
535523 let userAddress = addressFromStringValue(userAddressStrOrEmpty)
536- let $t01984319905 = getParamsOrFail()
537- let nsbtAssetId = $t01984319905._1
538- let minLockAmount = $t01984319905._2
539- let halfLife = $t01984319905._3
540- let $t01990819984 = getUserParamsOrFail(userAddress)
541- let isNewUser = $t01990819984._1
542- let stakedAmount = $t01990819984._2
543- let lockStart = $t01990819984._3
524+ let $t01969119753 = getParamsOrFail()
525+ let nsbtAssetId = $t01969119753._1
526+ let minLockAmount = $t01969119753._2
527+ let halfLife = $t01969119753._3
528+ let $t01975619832 = getUserParamsOrFail(userAddress)
529+ let isNewUser = $t01975619832._1
530+ let stakedAmount = $t01975619832._2
531+ let lockStart = $t01975619832._3
544532 let stakedAmountNEW = (stakedAmount - unstakeAmt)
545533 let comissionAmount = asInt(invoke(mathContract, "getUnstakeComissionAmountREADONLY", [unstakeAmt, lockStart, halfLife], nil))
546534 let receiveAmount = (unstakeAmt - comissionAmount)
547535 [stakedAmount, stakedAmountNEW, receiveAmount, comissionAmount]
548536 }
549537 $Tuple2(nil, resultArray)
550538 }
551539
552540
553541
554542 @Callable(i)
555543 func nsbtStakingSYSREADONLY (userAddressStr) = {
556544 let totalNsbtAmt = getIntOrElse(keyLockParamTotalAmount(), 0)
557545 if ((userAddressStr == ""))
558546 then $Tuple2(nil, [0, totalNsbtAmt, 0])
559547 else {
560548 let userAddress = toAddressOrFail(userAddressStr)
561- let $t02067120775 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
562- let isNewUser = $t02067120775._1
563- let userNsbtAmt = $t02067120775._2
564- let stakingStart = $t02067120775._3
549+ let $t02051920623 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
550+ let isNewUser = $t02051920623._1
551+ let userNsbtAmt = $t02051920623._2
552+ let stakingStart = $t02051920623._3
565553 $Tuple2(nil, [userNsbtAmt, totalNsbtAmt, stakingStart])
566554 }
567555 }
568556
569557
570558 @Verifier(tx)
571559 func verify () = {
572560 let pubKeyAdminsListStr = makeString(["ExtEEK19nmKj9mCpnWyvEEJFYATLMcVEMvohhUHkyHNm", "Ev5py5FfBQX9cZpYKnfQrTB49Byf8QmpZWeDVRim4yV7", "DUuuLjXu98nBwZc7fqwCTjtA3nnRwgTbkMSr5SU2NmDR", "DUuuLjXu98nBwZc7fqwCTjtA3nnRwgTbkMSr5SU2NmDR"], SEP)
573561 let pubKeyAdminsList = split(valueOrElse(getString(controlContract, "%s__multisig"), pubKeyAdminsListStr), SEP)
574562 let count = ((((if (sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(pubKeyAdminsList[0])))
575563 then 1
576564 else 0) + (if (sigVerify(tx.bodyBytes, tx.proofs[1], fromBase58String(pubKeyAdminsList[1])))
577565 then 1
578566 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[2], fromBase58String(pubKeyAdminsList[2])))
579567 then 1
580568 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[3], fromBase58String(pubKeyAdminsList[3])))
581569 then 2
582570 else 0))
583571 (count >= 3)
584572 }
585573

github/deemru/w8io/873ac7e 
84.55 ms