tx · CkcUbebPJtnqs13nZVsbC4LEFM9bmHEpfd5g7cR2tSf4

3MuGfNhF98CNBCfthhoJEo6SYUv7zTgkK4J:  -0.04000000 Waves

2022.08.03 11:07 [2168046] smart account 3MuGfNhF98CNBCfthhoJEo6SYUv7zTgkK4J > SELF 0.00000000 Waves

{ "type": 13, "id": "CkcUbebPJtnqs13nZVsbC4LEFM9bmHEpfd5g7cR2tSf4", "fee": 4000000, "feeAssetId": null, "timestamp": 1659514060778, "version": 1, "sender": "3MuGfNhF98CNBCfthhoJEo6SYUv7zTgkK4J", "senderPublicKey": "4DthuG3xjZV9WtZ34Y66AummdAr67wRzwWsVQL4y2bob", "proofs": [ "5ADBdZEiyF5GEU9fcSi2h9oVNQG1rwBhxzbxDkj51MMMgoZNM7gqQTb9nLhmWWVDDRdsoLW2Ey1x6ZsaymPNE4Lv", "2NhjTKSMX8KAAboR7pYWd5dMM4s9Gb5wHANNzhs6tgP4tbTS3umcXYV3fQeQ8KX9JyMcvEGhynjw7UEEmjSf2dZD", "2E9aNqPYnCShKd7CCUaTP4vBjDv8SLtEDYWndooRRZLTZgXvpRNWShaWQp6eUeZZ5PxuNfFggyvUd2qTLhwe2hPs" ], "script": "base64:AAIFAAAAAAAAACgIAhIHCgUICAEBCBIAEgMKAQESABIAEgASAwoBCBIECgIIARIDCgEIAAAARwAAAAAJc2VwYXJhdG9yAgAAAAJfXwAAAAADU0VQAgAAAAJfXwAAAAAFTVVMVDYAAAAAAAAPQkAAAAAABU1VTFQ4AAAAAAAF9eEAAAAAAAZNVUxUWDYJAAE2AAAAAQUAAAAFTVVMVDYAAAAABk1VTFRYOAkAATYAAAABBQAAAAVNVUxUOAAAAAAHTVVMVFgxOAkAATYAAAABAA3gtrOnZAAAAAAAAApXQVZFU0lEU1RSAgAAAAVXQVZFUwAAAAAHV0FWRVNJRAkAAlkAAAABBQAAAApXQVZFU0lEU1RSAAAAABlJZHhDb250cm9sQ2ZnTmV1dHJpbm9EYXBwAAAAAAAAAAABAAAAABhJZHhDb250cm9sQ2ZnQXVjdGlvbkRhcHAAAAAAAAAAAAIAAAAAFElkeENvbnRyb2xDZmdScGREYXBwAAAAAAAAAAADAAAAABVJZHhDb250cm9sQ2ZnTWF0aERhcHAAAAAAAAAAAAQAAAAAHElkeENvbnRyb2xDZmdMaXF1aWRhdGlvbkRhcHAAAAAAAAAAAAUAAAAAFUlkeENvbnRyb2xDZmdSZXN0RGFwcAAAAAAAAAAABgAAAAAdSWR4Q29udHJvbENmZ05vZGVSZWdpc3RyeURhcHAAAAAAAAAAAAcAAAAAHElkeENvbnRyb2xDZmdOc2J0U3Rha2luZ0RhcHAAAAAAAAAAAAgAAAAAGUlkeENvbnRyb2xDZmdNZWRpYXRvckRhcHAAAAAAAAAAAAkBAAAAD2dldFN0cmluZ09yRmFpbAAAAAIAAAAHYWRkcmVzcwAAAANrZXkJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAdhZGRyZXNzBQAAAANrZXkJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAKbWFuZGF0b3J5IAkABCUAAAABBQAAAAdhZGRyZXNzAgAAAAEuBQAAAANrZXkCAAAADyBpcyBub3QgZGVmaW5lZAEAAAARa2V5Q29udHJvbEFkZHJlc3MAAAAAAgAAABwlcyVzX19jb25maWdfX2NvbnRyb2xBZGRyZXNzAQAAAA1rZXlDb250cm9sQ2ZnAAAAAAIAAAARJXNfX2NvbnRyb2xDb25maWcBAAAAFHJlYWRDb250cm9sQ2ZnT3JGYWlsAAAAAQAAAAdjb250cm9sCQAEtQAAAAIJAQAAAA9nZXRTdHJpbmdPckZhaWwAAAACBQAAAAdjb250cm9sCQEAAAANa2V5Q29udHJvbENmZwAAAAAFAAAAA1NFUAEAAAAYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAAAAAgAAAApjb250cm9sQ2ZnAAAAA2lkeAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEJgAAAAEJAAGRAAAAAgUAAAAKY29udHJvbENmZwUAAAADaWR4CQABLAAAAAICAAAALUNvbnRyb2wgY2ZnIGRvZXNuJ3QgY29udGFpbiBhZGRyZXNzIGF0IGluZGV4IAkAAaQAAAABBQAAAANpZHgAAAAAD2NvbnRyb2xDb250cmFjdAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAR0aGlzCQEAAAARa2V5Q29udHJvbEFkZHJlc3MAAAAAAgAAACMzTjROUzdkNEpvOWE2RjE0TGlGVUtLWVZkVWtrZjJlUDRaeAAAAAAKY29udHJvbENmZwkBAAAAFHJlYWRDb250cm9sQ2ZnT3JGYWlsAAAAAQUAAAAPY29udHJvbENvbnRyYWN0AAAAAAxtYXRoQ29udHJhY3QJAQAAABhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwAAAACBQAAAApjb250cm9sQ2ZnBQAAABVJZHhDb250cm9sQ2ZnTWF0aERhcHAAAAAAEG5ldXRyaW5vQ29udHJhY3QJAQAAABhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwAAAACBQAAAApjb250cm9sQ2ZnBQAAABlJZHhDb250cm9sQ2ZnTmV1dHJpbm9EYXBwAAAAAA9hdWN0aW9uQ29udHJhY3QJAQAAABhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwAAAACBQAAAApjb250cm9sQ2ZnBQAAABhJZHhDb250cm9sQ2ZnQXVjdGlvbkRhcHABAAAADGtleUJvbmRBc3NldAAAAAACAAAADWJvbmRfYXNzZXRfaWQBAAAAGmtleU5ldXRyaW5v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AAAACW9sZEFtb3VudAAAAAhvbGRTdGFydAAAAAluZXdBbW91bnQAAAAIbmV3U3RhcnQJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABBrZXlIaXN0b3J5UmVjb3JkAAAAAwUAAAAEdHlwZQUAAAALdXNlckFkZHJlc3MFAAAABHR4SWQJAQAAABNmb3JtYXRIaXN0b3J5UmVjb3JkAAAABAUAAAAJb2xkQW1vdW50BQAAAAhvbGRTdGFydAUAAAAJbmV3QW1vdW50BQAAAAhuZXdTdGFydAEAAAARQ2xhaW1IaXN0b3J5RW50cnkAAAADAAAAC3VzZXJBZGRyZXNzAAAABHR4SWQAAAAOY2xhaW1lZFJld2FyZHMJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABBrZXlIaXN0b3J5UmVjb3JkAAAAAwIAAAAFY2xhaW0FAAAAC3VzZXJBZGRyZXNzBQAAAAR0eElkCQEAAAAYZm9ybWF0Q2xhaW1IaXN0b3J5UmVjb3JkAAAAAgkABCUAAAABBQAAAAt1c2VyQWRkcmVzcwUAAAAOY2xhaW1lZFJld2FyZHMBAAAAC1N0YXRzUmVzdWx0AAAAAwAAAA50b3RhbExvY2tlZEluYwAAAAxsb2NrQ291bnRJbmMAAAANdXNlcnNDb3VudEluYwQAAAAKbG9ja3NDb3VudAkBAAAADGdldEludE9yWmVybwAAAAEJAQAAABJrZXlTdGF0c0xvY2tzQ291bnQAAAAABAAAAAp1c2Vyc0NvdW50CQEAAAAMZ2V0SW50T3JaZXJvAAAAAQkBAAAAEmtleVN0YXRzVXNlcnNDb3VudAAAAAAEAAAAC3RvdGFsQW1vdW50CQEAAAAMZ2V0SW50T3JaZXJvAAAAAQkBAAAAF2tleUxvY2tQYXJhbVRvdGFsQW1vdW50AAAAAAQAAAAOdG90YWxBbW91bnROZXcJAABkAAAAAgUAAAALdG90YWxBbW91bnQFAAAADnRvdGFsTG9ja2VkSW5jCQAFFQAAAAMJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABJrZXlTdGF0c0xvY2tzQ291bnQAAAAACQAAZAAAAAIFAAAACmxvY2tzQ291bnQFAAAADGxvY2tDb3VudEluYwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAEmtleVN0YXRzVXNlcnNDb3VudAAAAAAJAABkAAAAAgUAAAAKdXNlcnNDb3VudAUAAAANdXNlcnNDb3VudEluYwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAF2tleUxvY2tQYXJhbVRvdGFsQW1vdW50AAAAAAUAAAAOdG90YWxBbW91bnROZXcFAAAAA25pbAUAAAALdG90YWxBbW91bnQFAAAADnRvdGFsQW1vdW50TmV3AQAAAA9Mb2NrUGFyYW1zRW50cnkAAAADAAAAC3VzZXJBZGRyZXNzAAAABmFtb3VudAAAAAVzdGFydAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAFmtleUxvY2tQYXJhbVVzZXJBbW91bnQAAAABBQAAAAt1c2VyQWRkcmVzcwUAAAAGYW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAWa2V5TG9ja1BhcmFtU3RhcnRCbG9jawAAAAEFAAAAC3VzZXJBZGRyZXNzBQAAAAVzdGFydAUAAAADbmlsAQAAAA9nZXRQYXJhbXNPckZhaWwAAAAACQAFFQAAAAMJAAJZAAAAAQkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAkBAAAADGtleUJvbmRBc3NldAAAAAAJAQAAAAxnZXRJbnRPckZhaWwAAAABCQEAAAAQa2V5TWluTG9ja0Ftb3VudAAAAAAJAQAAAAxnZXRJbnRPckZhaWwAAAABCQEAAAALa2V5SGFsZkxpZmUAAAAAAQAAAAxpc0FjdGl2ZVVzZXIAAAABAAAAC3VzZXJBZGRyZXNzCQAAZgAAAAIJAQAAAAxnZXRJbnRPckVsc2UAAAACCQEAAAAWa2V5TG9ja1BhcmFtVXNlckFtb3VudAAAAAEFAAAAC3VzZXJBZGRyZXNzAAAAAAAAAAAAAAAAAAAAAAAAAQAAABNnZXRVc2VyUGFyYW1zT3JVbml0AAAAAQAAAAt1c2VyQWRkcmVzcwMJAQAAAAxpc0FjdGl2ZVVzZXIAAAABBQAAAAt1c2VyQWRkcmVzcwkABRUAAAADBwkBAAAADGdldEludE9yRmFpbAAAAAEJAQAAABZrZXlMb2NrUGFyYW1Vc2VyQW1vdW50AAAAAQUAAAALdXNlckFkZHJlc3MJAQAAAAxnZXRJbnRPckZhaWwAAAABCQEAAAAWa2V5TG9ja1BhcmFtU3RhcnRCbG9jawAAAAEFAAAAC3VzZXJBZGRyZXNzBQAAAAR1bml0AQAAABNnZXRVc2VyUGFyYW1zT3JGYWlsAAAAAQAAAAt1c2VyQWRkcmVzcwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQEAAAATZ2V0VXNlclBhcmFtc09yVW5pdAAAAAEFAAAAC3VzZXJBZGRyZXNzCQABLAAAAAIJAAEsAAAAAgIAAAAFVXNlciAJAAQlAAAAAQUAAAALdXNlckFkZHJlc3MCAAAADyBpcyBub3QgZGVmaW5lZAAAAAASc3VwcG9ydGVkQXNzZXRzU3RyCQEAAAAMZ2V0U3RyT3JFbHNlAAAAAgkBAAAAGGtleVN1cHBvcnRlZFJld2FyZEFzc2V0cwAAAAACAAAAAAAAAAATc3VwcG9ydGVkQXNzZXRzTGlzdAkABLUAAAACBQAAABJzdXBwb3J0ZWRBc3NldHNTdHICAAAAAV8BAAAACmNhbGNSZXdhcmQAAAAFAAAAC3VzZXJBZGRyZXNzAAAAB2Fzc2V0SWQAAAANc3Rha2VkQW1vdW50WAAAAA5kZXBvc2l0TnVtVXNlcgAAAA5kZXBvc2l0TnVtTGFzdAQAAAAXcmV3YXJkUGVyTnNidFN1bUxhc3RLRVkJAQAAABVrZXlSZXdhcmRQZXJOc2J0U3VtQXQAAAACBQAAAA5kZXBvc2l0TnVtTGFzdAUAAAAHYXNzZXRJZAQAAAAKc3VtTGFzdFgxOAkAAacAAAABCQEAAAAMZ2V0U3RyT3JFbHNlAAAAAgkBAAAAFWtleVJld2FyZFBlck5zYnRTdW1BdAAAAAIFAAAADmRlcG9zaXROdW1MYXN0BQAAAAdhc3NldElkAgAAAAEwBAAAAApzdW1Vc2VyWDE4CQABpwAAAAEJAQAAAAxnZXRTdHJPckVsc2UAAAACCQEAAAAVa2V5UmV3YXJkUGVyTnNidFN1bUF0AAAAAgUAAAAOZGVwb3NpdE51bVVzZXIFAAAAB2Fzc2V0SWQCAAAAATAEAAAAEXJld2FyZER5bmFtaWNQYXJ0CQABoAAAAAEJAAE8AAAAAwkAATgAAAACBQAAAApzdW1MYXN0WDE4BQAAAApzdW1Vc2VyWDE4BQAAAA1zdGFrZWRBbW91bnRYBQAAAAdNVUxUWDE4BAAAABNyZXdhcmRDYWNoZWRQYXJ0S0VZCQEAAAAJa2V5UmV3YXJkAAAAAgUAAAALdXNlckFkZHJlc3MFAAAAB2Fzc2V0SWQEAAAAEHJld2FyZENhY2hlZFBhcnQJAQAAAAxnZXRJbnRPckVsc2UAAAACBQAAABNyZXdhcmRDYWNoZWRQYXJ0S0VZAAAAAAAAAAAACQAFFgAAAAQJAABkAAAAAgUAAAAQcmV3YXJkQ2FjaGVkUGFydAUAAAARcmV3YXJkRHluYW1pY1BhcnQFAAAAEHJld2FyZENhY2hlZFBhcnQFAAAAEXJld2FyZER5bmFtaWNQYXJ0BQAAABNyZXdhcmRDYWNoZWRQYXJ0S0VZAQAAAA1SZXdhcmRFbnRyaWVzAAAAAwAAAAlpc05ld1VzZXIAAAALdXNlckFkZHJlc3MAAAAMc3Rha2VkQW1vdW50BAAAAA1zdGFrZWRBbW91bnRYCQABNgAAAAEFAAAADHN0YWtlZEFtb3VudAQAAAAbdXNlclJld2FyZEZyb21EZXBvc2l0TnVtS0VZCQEAAAAba2V5VXNlclJld2FyZEZyb21EZXBvc2l0TnVtAAAAAQUAAAALdXNlckFkZHJlc3MEAAAADmRlcG9zaXROdW1Vc2VyCQEAAAAMZ2V0SW50T3JFbHNlAAAAAgUAAAAbdXNlclJld2FyZEZyb21EZXBvc2l0TnVtS0VZAP//////////BAAAAA5kZXBvc2l0TnVtTGFzdAkBAAAADGdldEludE9yRWxzZQAAAAIJAQAAABFrZXlEZXBvc2l0TnVtTGFzdAAAAAAA//////////8KAQAAABtmb3JFYWNoQXNzZXRDYWNoZVVzZXJSZXdhcmQAAAACAAAABWFjY3VtAAAABWFzc2V0BAAAAAskdDA4NDA5ODU0NAkBAAAACmNhbGNSZXdhcmQAAAAFBQAAAAt1c2VyQWRkcmVzcwUAAAAFYXNzZXQFAAAADXN0YWtlZEFtb3VudFgFAAAADmRlcG9zaXROdW1Vc2VyBQAAAA5kZXBvc2l0TnVtTGFzdAQAAAALcmV3YXJkVG90YWwIBQAAAAskdDA4NDA5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ZHJlc3MDCQAAZgAAAAIJAAGQAAAAAQgFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAJAAACAAAAAQIAAAAZcGF5bWVudHMgYXJlIG5vdCBhY2NlcHRlZAQAAAANJHQwMTE0ODgxMTU5MwkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkBAAAAE2dldFVzZXJQYXJhbXNPclVuaXQAAAABBQAAAAt1c2VyQWRkcmVzcwkABRUAAAADBgAAAAAAAAAAAAAAAAAAAAAAAAQAAAAJaXNOZXdVc2VyCAUAAAANJHQwMTE0ODgxMTU5MwAAAAJfMQQAAAAMc3Rha2VkQW1vdW50CAUAAAANJHQwMTE0ODgxMTU5MwAAAAJfMgQAAAAMc3Rha2luZ1N0YXJ0CAUAAAANJHQwMTE0ODgxMTU5MwAAAAJfMwQAAAANc3Rha2VkQW1vdW50WAkAATYAAAABBQAAAAxzdGFrZWRBbW91bnQEAAAAG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQkBAAAAG2tleVVzZXJSZXdhcmRGcm9tRGVwb3NpdE51bQAAAAEFAAAADnVzZXJBZGRyZXNzU3RyBAAAAA5kZXBvc2l0TnVtVXNlcgkBAAAADGdldEludE9yRWxzZQAAAAIFAAAAG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQD//////////wQAAAAOZGVwb3NpdE51bUxhc3QJAQAAAAxnZXRJbnRPckVsc2UAAAACCQEAAAARa2V5RGVwb3NpdE51bUxhc3QAAAAAAP//////////CgEAAAAfZm9yRWFjaEFzc2V0Q2FsY1VuY2xhaW1lZFJld2FyZAAAAAIAAAAFYWNjdW0AAAAFYXNzZXQEAAAADSR0MDExOTY0MTIxMDIJAQAAAApjYWxjUmV3YXJkAAAABQUAAAAOdXNlckFkZHJlc3NTdHIFAAAABWFzc2V0BQAAAA1zdGFrZWRBbW91bnRYBQAAAA5kZXBvc2l0TnVtVXNlcgUAAAAOZGVwb3NpdE51bUxhc3QEAAAAC3Jld2FyZFRvdGFsCAUAAAANJHQwMTE5NjQxMjEwMgAAAAJfMQQAAAAGY2FjaGVkCAUAAAANJHQwMTE5NjQxMjEwMgAAAAJfMgQAAAAHZHluYW1pYwgFAAAADSR0MDExOTY0MTIxMDIAAAACXzMEAAAAE3Jld2FyZENhY2hlZFBhcnRLRVkIBQAAAA0kdDAxMTk2NDEyMTAyAAAAAl80BAAAAApjbGFpbWVkS0VZCQEAAAAKa2V5Q2xhaW1lZAAAAAIFAAAADnVzZXJBZGRyZXNzU3RyBQAAAAVhc3NldAQAAAANJHQwMTIxNjIxMjE5OQUAAAAFYWNjdW0EAAAABGRhdGEIBQAAAA0kdDAxMjE2MjEyMTk5AAAAAl8xBAAAABFjbGFpbWVkQW10QnlBc3NldAgFAAAADSR0MDEyMTYyMTIxOTkAAAACXzIEAAAAB25ld1BhcnQJAAS5AAAAAgkABEwAAAACBQAAAAVhc3NldAkABEwAAAACCQABpAAAAAEFAAAAC3Jld2FyZFRvdGFsBQAAAANuaWwCAAAAAToEAAAAFGNsYWltZWRBbXRCeUFzc2V0TmV3CQAEuQAAAAIJAARMAAAAAgUAAAARY2xhaW1lZEFtdEJ5QXNzZXQJAARMAAAAAgUAAAAHbmV3UGFydAUAAAADbmlsAgAAAAFfAwkAAGcAAAACAAAAAAAAAAAABQAAAAtyZXdhcmRUb3RhbAkABRQAAAACBQAAAARkYXRhBQAAABRjbGFpbWVkQW10QnlBc3NldE5ldwkABRQAAAACCQAETQAAAAIJAARNAAAAAgkABE0AAAACBQAAAARkYXRhCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAAt1c2VyQWRkcmVzcwUAAAALcmV3YXJkVG90YWwJAQAAAAt0b0Fzc2V0VmVjdAAAAAEFAAAABWFzc2V0CQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAKY2xhaW1lZEtFWQkAAGQAAAACCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHwAAAAEFAAAACmNsYWltZWRLRVkAAAAAAAAAAAAFAAAAC3Jld2FyZFRvdGFsCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAATcmV3YXJkQ2FjaGVkUGFydEtFWQAAAAAAAAAAAAUAAAAUY2xhaW1lZEFtdEJ5QXNzZXROZXcEAAAADSR0MDEyNjU5MTI3NzMKAAAAAAIkbAUAAAATc3VwcG9ydGVkQXNzZXRzTGlzdAoAAAAAAiRzCQABkAAAAAEFAAAAAiRsCgAAAAAFJGFjYzAJAAUUAAAAAgUAAAADbmlsAgAAAAAKAQAAAAUkZjBfMQAAAAIAAAACJGEAAAACJGkDCQAAZwAAAAIFAAAAAiRpBQAAAAIkcwUAAAACJGEJAQAAAB9mb3JFYWNoQXNzZXRDYWxjVW5jbGFpbWVkUmV3YXJkAAAAAgUAAAACJGEJAAGRAAAAAgUAAAACJGwFAAAAAiRpCgEAAAAFJGYwXzIAAAACAAAAAiRhAAAAAiRpAwkAAGcAAAACBQAAAAIkaQUAAAACJHMFAAAAAiRhCQAAAgAAAAECAAAAFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEAAAAFJGYwXzIAAAACCQEAAAAFJGYwXzEAAAACCQEAAAAFJGYwXzEAAAACCQEAAAAFJGYwXzEAAAACCQEAAAAFJGYwXzEAAAACCQEAAAAFJGYwXzEAAAACCQEAAAAFJGYwXzEAAAACCQEAAAAFJGYwXzEAAAACCQEAAAAFJGYwXzEAAAACCQEAAAAFJGYwXzEAAAACCQEAAAAFJGYwXzEAAAACBQAAAAUkYWNjMAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAgAAAAAAAAAAAwAAAAAAAAAABAAAAAAAAAAABQAAAAAAAAAABgAAAAAAAAAABwAAAAAAAAAACAAAAAAAAAAACQAAAAAAAAAACgQAAAAJdHJhbnNmZXJzCAUAAAANJHQwMTI2NTkxMjc3MwAAAAJfMQQAAAAXY2xhaW1lZEFtdEJ5QXNzZXRSZXN1bHQIBQAAAA0kdDAxMjY1OTEyNzczAAAAAl8yAwkAAGcAAAACAAAAAAAAAAAACQABkAAAAAEFAAAACXRyYW5zZmVycwUAAAADbmlsCQAETQAAAAIJAARNAAAAAgUAAAAJdHJhbnNmZXJzCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAbdXNlclJld2FyZEZyb21EZXBvc2l0TnVtS0VZBQAAAA5kZXBvc2l0TnVtTGFzdAkBAAAAEUNsYWltSGlzdG9yeUVudHJ5AAAAAwUAAAALdXNlckFkZHJlc3MIBQAAAAFpAAAADXRyYW5zYWN0aW9uSWQJAAEwAAAAAgUAAAAXY2xhaW1lZEFtdEJ5QXNzZXRSZXN1bHQAAAAAAAAAAAEAAAAJAAAAAWkBAAAAC2NvbnN0cnVjdG9yAAAABQAAABduZXV0cmlub0NvbnRyYWN0QWRkcmVzcwAAABNtYXRoQ29udHJhY3RBZGRyZXNzAAAADW1pbkxvY2tBbW91bnQAAAAIaGFsZkxpZmUAAAAVc3VwcG9ydGVkUmV3YXJkQXNzZXRzAwkBAAAAAiE9AAAAAggFAAAAAWkAAAAGY2FsbGVyBQAAAAR0aGlzCQAAAgAAAAECAAAAEVBlcm1pc3Npb24gZGVuaWVkCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABprZXlOZXV0cmlub0NvbnRyYWN0QWRkcmVzcwAAAAAFAAAAF25ldXRyaW5vQ29udHJhY3RBZGRyZXNzCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABZrZXlNYXRoQ29udHJhY3RBZGRyZXNzAAAAAAUAAAATbWF0aENvbnRyYWN0QWRkcmVzcwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAEGtleU1pbkxvY2tBbW91bnQAAAAABQAAAA1taW5Mb2NrQW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAALa2V5SGFsZkxpZmUAAAAABQAAAAhoYWxmTGlmZQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAYa2V5U3VwcG9ydGVkUmV3YXJkQXNzZXRzAAAAAAUAAAAVc3VwcG9ydGVkUmV3YXJkQXNzZXRzBQAAAANuaWwAAAABaQEAAAAFc3Rha2UAAAAABAAAAA0kdDAxMzU5NzEzNjU5CQEAAAAPZ2V0UGFyYW1zT3JGYWlsAAAAAAQAAAALYm9uZEFzc2V0SWQIBQAAAA0kdDAxMzU5NzEzNjU5AAAAAl8xBAAAAA1taW5Mb2NrQW1vdW50CAUAAAANJHQwMTM1OTcxMzY1OQAAAAJfMgQAAAAIaGFsZkxpZmUIBQAAAA0kdDAxMzU5NzEzNjU5AAAAAl8zAwkBAAAAAiE9AAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQkAAAIAAAABAgAAABVJbnZhbGlkIHBheW1lbnRzIHNpemUEAAAAB3BheW1lbnQJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAEAAAABmFtb3VudAgFAAAAB3BheW1lbnQAAAAGYW1vdW50BAAAABNpbnZhbGlkQXNzZXRNZXNzYWdlCQABLAAAAAIJAAEsAAAAAgIAAAAPSW52YWxpZCBhc3NldC4gCQACWAAAAAEFAAAAC2JvbmRBc3NldElkAgAAAAwgaXMgZXhwZWN0ZWQEAAAAB2Fzc2V0SWQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAggFAAAAB3BheW1lbnQAAAAHYXNzZXRJZAUAAAATaW52YWxpZEFzc2V0TWVzc2FnZQMJAQAAAAIhPQAAAAIFAAAAB2Fzc2V0SWQFAAAAC2JvbmRBc3NldElkCQAAAgAAAAEFAAAAE2ludmFsaWRBc3NldE1lc3NhZ2UEAAAAC3VzZXJBZGRyZXNzCAUAAAABaQAAAAZjYWxsZXIEAAAADnVzZXJBZGRyZXNzU3RyCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAANJHQwMTQyMDExNDMwOAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkBAAAAE2dldFVzZXJQYXJhbXNPclVuaXQAAAABBQAAAAt1c2VyQWRkcmVzcwkABRUAAAADBgAAAAAAAAAAAAD//////////wQAAAAJaXNOZXdVc2VyCAUAAAANJHQwMTQyMDExNDMwOAAAAAJfMQQAAAAKbG9ja0Ftb3VudAgFAAAADSR0MDE0MjAxMTQzMDgAAAACXzIEAAAAD2xvY2tTdGFydEhlaWdodAgFAAAADSR0MDE0MjAxMTQzMDgAAAACXzMEAAAADG1lcmdlZEFtb3VudAMFAAAACWlzTmV3VXNlcgUAAAAGYW1vdW50CQAAZAAAAAIFAAAABmFtb3VudAUAAAAKbG9ja0Ftb3VudAQAAAARbWVyZ2VkU3RhcnRIZWlnaHQDBQAAAAlpc05ld1VzZXIFAAAABmhlaWdodAkBAAAABWFzSW50AAAAAQkAA/wAAAAEBQAAAAxtYXRoQ29udHJhY3QCAAAAE21lcmdlU3Rha2VzUkVBRE9OTFkJAARMAAAAAgUAAAAGYW1vdW50CQAETAAAAAIFAAAABmhlaWdodAkABEwAAAACBQAAAApsb2NrQW1vdW50CQAETAAAAAIFAAAAD2xvY2tTdGFydEhlaWdodAkABEwAAAACBQAAAAhoYWxmTGlmZQUAAAADbmlsBQAAAANuaWwDCQAAZgAAAAIFAAAADW1pbkxvY2tBbW91bnQFAAAADG1lcmdlZEFtb3VudAkAAAIAAAABCQABLAAAAAICAAAAE01pbiBsb2NrIGFtb3VudCBpcyAJAAGkAAAAAQUAAAANbWluTG9ja0Ftb3VudAQAAAANJHQwMTQ2NjkxNDc3MQkBAAAAC1N0YXRzUmVzdWx0AAAAAwUAAAAGYW1vdW50AAAAAAAAAAABAwUAAAAJaXNOZXdVc2VyAAAAAAAAAAABAAAAAAAAAAAABAAAAAxzdGF0c0VudHJpZXMIBQAAAA0kdDAxNDY2OTE0NzcxAAAAAl8xBAAAAAt0b3RhbFN0YWtlZAgFAAAADSR0MDE0NjY5MTQ3NzEAAAACXzIEAAAADnRvdGFsU3Rha2VkTmV3CAUAAAANJHQwMTQ2NjkxNDc3MQAAAAJfMwkABE4AAAACCQAETgAAAAIJAAROAAAAAgkABEwAAAACCQEAAAASSGlzdG9yeVJlY29yZEVudHJ5AAAABwIAAAAFc3Rha2UFAAAAC3VzZXJBZGRyZXNzCAUAAAABaQAAAA10cmFuc2FjdGlvbklkBQAAAApsb2NrQW1vdW50BQAAAA9sb2NrU3RhcnRIZWlnaHQFAAAADG1lcmdlZEFtb3VudAUAAAARbWVyZ2VkU3RhcnRIZWlnaHQFAAAAA25pbAkBAAAADVJld2FyZEVudHJpZXMAAAADBQAAAAlpc05ld1VzZXIFAAAADnVzZXJBZGRyZXNzU3RyBQAAAApsb2NrQW1vdW50CQEAAAAPTG9ja1BhcmFtc0VudHJ5AAAAAwUAAAALdXNlckFkZHJlc3MFAAAADG1lcmdlZEFtb3VudAUAAAARbWVyZ2VkU3RhcnRIZWlnaHQFAAAADHN0YXRzRW50cmllcwAAAAFpAQAAAAd1bnN0YWtlAAAAAQAAAAZhbW91bnQDCQEAAAACIT0AAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAACQAAAgAAAAECAAAAI3Vuc3Rha2UgZG9lc24ndCByZXF1aXJlIGFueSBwYXltZW50BAAAAAt1c2VyQWRkcmVzcwgFAAAAAWkAAAAGY2FsbGVyBAAAAA51c2VyQWRkcmVzc1N0cgkABCUAAAABBQAAAAt1c2VyQWRkcmVzcwQAAAANJHQwMTUyNTcxNTMxOQkBAAAAD2dldFBhcmFtc09yRmFpbAAAAAAEAAAAC2JvbmRBc3NldElkCAUAAAANJHQwMTUyNTcxNTMxOQAAAAJfMQQAAAANbWluTG9ja0Ftb3VudAgFAAAADSR0MDE1MjU3MTUzMTkAAAACXzIEAAAACGhhbGZMaWZlCAUAAAANJHQwMTUyNTcxNTMxOQAAAAJfMwQAAAANJHQwMTUzMjIxNTM5NgkBAAAAE2dldFVzZXJQYXJhbXNPckZhaWwAAAABBQAAAAt1c2VyQWRkcmVzcwQAAAAJaXNOZXdVc2VyCAUAAAANJHQwMTUzMjIxNTM5NgAAAAJfMQQAAAAKbG9ja0Ftb3VudAgFAAAADSR0MDE1MzIyMTUzOTYAAAACXzIEAAAACWxvY2tTdGFydAgFAAAADSR0MDE1MzIyMTUzOTYAAAACXzMDCQAAZwAAAAIAAAAAAAAAAAAFAAAACmxvY2tBbW91bnQJAAACAAAAAQIAAAASTm90aGluZyB0byB1bnN0YWtlAwkAAGYAAAACBQAAAAZhbW91bnQFAAAACmxvY2tBbW91bnQJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAKUmVxdWVzdGVkIAkAAaQAAAABBQAAAAZhbW91bnQCAAAAEiwgYnV0IHN0YWtlZCBvbmx5IAkAAaQAAAABBQAAAApsb2NrQW1vdW50BAAAAA9jb21pc3Npb25BbW91bnQJAQAAAAVhc0ludAAAAAEJAAP8AAAABAUAAAAMbWF0aENvbnRyYWN0AgAAACFnZXRVbnN0YWtlQ29taXNzaW9uQW1vdW50UkVBRE9OTFkJAARMAAAAAgUAAAAGYW1vdW50CQAETAAAAAIFAAAACWxvY2tTdGFydAkABEwAAAACBQAAAAhoYWxmTGlmZQUAAAADbmlsBQAAAANuaWwEAAAADSR0MDE1NzEwMTU4NjQJAQAAAAtTdGF0c1Jlc3VsdAAAAAMJAQAAAAEtAAAAAQUAAAAGYW1vdW50AwkAAAAAAAACBQAAAAZhbW91bnQFAAAACmxvY2tBbW91bnQA//////////8AAAAAAAAAAAADCQAAAAAAAAIFAAAABmFtb3VudAUAAAAKbG9ja0Ftb3VudAD//////////wAAAAAAAAAAAAQAAAAMc3RhdHNFbnRyaWVzCAUAAAANJHQwMTU3MTAxNTg2NAAAAAJfMQQAAAALdG90YWxTdGFrZWQIBQAAAA0kdDAxNTcxMDE1ODY0AAAAAl8yBAAAAA50b3RhbFN0YWtlZE5ldwgFAAAADSR0MDE1NzEwMTU4NjQAAAACXzMJAAROAAAAAgkABE4AAAACCQAETgAAAAIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAALdXNlckFkZHJlc3MJAABlAAAAAgUAAAAGYW1vdW50BQAAAA9jb21pc3Npb25BbW91bnQFAAAAC2JvbmRBc3NldElkCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAD2F1Y3Rpb25Db250cmFjdAUAAAAPY29taXNzaW9uQW1vdW50BQAAAAtib25kQXNzZXRJZAkABEwAAAACCQEAAAASSGlzdG9yeVJlY29yZEVudHJ5AAAABwIAAAAHdW5zdGFrZQUAAAALdXNlckFkZHJlc3MIBQAAAAFpAAAADXRyYW5zYWN0aW9uSWQFAAAACmxvY2tBbW91bnQFAAAACWxvY2tTdGFydAkAAGUAAAACBQAAAApsb2NrQW1vdW50BQAAAAZhbW91bnQFAAAACWxvY2tTdGFydAUAAAADbmlsCQEAAAANUmV3YXJkRW50cmllcwAAAAMHBQAAAA51c2VyQWRkcmVzc1N0cgUAAAAKbG9ja0Ftb3VudAkBAAAAD0xvY2tQYXJhbXNFbnRyeQAAAAMFAAAAC3VzZXJBZGRyZXNzCQAAZQAAAAIFAAAACmxvY2tBbW91bnQFAAAABmFtb3VudAUAAAAJbG9ja1N0YXJ0BQAAAAxzdGF0c0VudHJpZXMAAAABaQEAAAAHZGVwb3NpdAAAAAADCQEAAAACIT0AAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABCQAAAgAAAAECAAAAH2V4YWN0IDEgcGF5bWVudCBpcyBhbGxvd2VkIG9ubHkEAAAAA3BtdAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAQAAAAGYW1vdW50CAUAAAADcG10AAAABmFtb3VudAQAAAAKcG10QXNzZXRJZAkBAAAAC3ZhbHVlT3JFbHNlAAAAAggFAAAAA3BtdAAAAAdhc3NldElkBQAAAAdXQVZFU0lEBAAAAA1wbXRBc3NldElkU3RyCQACWAAAAAEFAAAACnBtdEFzc2V0SWQEAAAACHBtdE11bHRYAwkAAAAAAAACBQAAAApwbXRBc3NldElkBQAAAAdXQVZFU0lEBQAAAAZNVUxUWDgFAAAABk1VTFRYNgQAAAAHYW1vdW50WAkAATYAAAABBQAAAAZhbW91bnQEAAAAC3RvdGFsU3Rha2VkCQEAAAAMZ2V0SW50T3JFbHNlAAAAAgkBAAAAF2tleUxvY2tQYXJhbVRvdGFsQW1vdW50AAAAAAAAAAAAAAAAAAQAAAAMdG90YWxTdGFrZWRYCQABNgAAAAEFAAAAC3RvdGFsU3Rha2VkAwkAAGYAAAACAAAAAAAAAAAABQAAAAt0b3RhbFN0YWtlZAkAAAIAAAABAgAAABtUT0RPOiBjYXNlIGlzIG5vdCBzdXBwb3J0ZWQDCQAAAAAAAAIFAAAAC3RvdGFsU3Rha2VkAAAAAAAAAAAACQEAAAAiSW5jcmVtZW50Tm90RGlzdHJpYnV0ZWRSZXdhcmRFbnRyeQAAAAIFAAAADXBtdEFzc2V0SWRTdHIFAAAABmFtb3VudAQAAAAQcmV3YXJkUGVyTnNidFgxOAkAATwAAAADBQAAAAdhbW91bnRYBQAAAAdNVUxUWDE4BQAAAAx0b3RhbFN0YWtlZFgEAAAAEWRlcG9zaXROdW1MYXN0S0VZCQEAAAARa2V5RGVwb3NpdE51bUxhc3QAAAAABAAAAA5kZXBvc2l0TnVtTGFzdAkBAAAADGdldEludE9yRWxzZQAAAAIFAAAAEWRlcG9zaXROdW1MYXN0S0VZAP//////////BAAAAA1kZXBvc2l0TnVtTmV3CQAAZAAAAAIFAAAADmRlcG9zaXROdW1MYXN0AAAAAAAAAAABAwkBAAAAASEAAAABCQEAAAAIY29udGFpbnMAAAACBQAAABJzdXBwb3J0ZWRBc3NldHNTdHIFAAAADXBtdEFzc2V0SWRTdHIJAAACAAAAAQkAASwAAAACCQABLAAAAAIFAAAAEnN1cHBvcnRlZEFzc2V0c1N0cgIAAAARIGRvZXNuJ3QgY29udGFpbiAFAAAADXBtdEFzc2V0SWRTdHIKAQAAABdyZWZy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ZWRBbW91bnRORVcJAABlAAAAAgUAAAAMc3Rha2VkQW1vdW50BQAAAAp1bnN0YWtlQW10BAAAAA9jb21pc3Npb25BbW91bnQJAQAAAAVhc0ludAAAAAEJAAP8AAAABAUAAAAMbWF0aENvbnRyYWN0AgAAACFnZXRVbnN0YWtlQ29taXNzaW9uQW1vdW50UkVBRE9OTFkJAARMAAAAAgUAAAAKdW5zdGFrZUFtdAkABEwAAAACBQAAAAlsb2NrU3RhcnQJAARMAAAAAgUAAAAIaGFsZkxpZmUFAAAAA25pbAUAAAADbmlsBAAAAA1yZWNlaXZlQW1vdW50CQAAZQAAAAIFAAAACnVuc3Rha2VBbXQFAAAAD2NvbWlzc2lvbkFtb3VudAkABEwAAAACBQAAAAxzdGFrZWRBbW91bnQJAARMAAAAAgUAAAAPc3Rha2VkQW1vdW50TkVXCQAETAAAAAIFAAAADXJlY2VpdmVBbW91bnQJAARMAAAAAgUAAAAPY29taXNzaW9uQW1vdW50BQAAAANuaWwJAAUUAAAAAgUAAAADbmlsBQAAAAtyZXN1bHRBcnJheQAAAAFpAQAAABZuc2J0U3Rha2luZ1NZU1JFQURPTkxZAAAAAQAAAA51c2VyQWRkcmVzc1N0cgQAAAAMdG90YWxOc2J0QW10CQEAAAAMZ2V0SW50T3JFbHNlAAAAAgkBAAAAF2tleUxvY2tQYXJhbVRvdGFsQW1vdW50AAAAAAAAAAAAAAAAAAMJAAAAAAAAAgUAAAAOdXNlckFkZHJlc3NTdHICAAAAAAkABRQAAAACBQAAAANuaWwJAARMAAAAAgAAAAAAAAAAAAkABEwAAAACBQAAAAx0b3RhbE5zYnRBbXQJAARMAAAAAgAAAAAAAAAAAAUAAAADbmlsBAAAAAt1c2VyQWRkcmVzcwkBAAAAD3RvQWRkcmVzc09yRmFpbAAAAAEFAAAADnVzZXJBZGRyZXNzU3RyBAAAAA0kdDAyMDQ5NjIwNjAwCQEAAAALdmFsdWVPckVsc2UAAAACCQEAAAATZ2V0VXNlclBhcmFtc09yVW5pdAAAAAEFAAAAC3VzZXJBZGRyZXNzCQAFFQAAAAMGAAAAAAAAAAAAAAAAAAAAAAAABAAAAAlpc05ld1VzZXIIBQAAAA0kdDAyMDQ5NjIwNjAwAAAAAl8xBAAAAAt1c2VyTnNidEFtdAgFAAAADSR0MDIwNDk2MjA2MDAAAAACXzIEAAAADHN0YWtpbmdTdGFydAgFAAAADSR0MDIwNDk2MjA2MDAAAAACXzMJAAUUAAAAAgUAAAADbmlsCQAETAAAAAIFAAAAC3VzZXJOc2J0QW10CQAETAAAAAIFAAAADHRvdGFsTnNidEFtdAkABEwAAAACBQAAAAxzdGFraW5nU3RhcnQFAAAAA25pbAAAAAEAAAACdHgBAAAABnZlcmlmeQAAAAAEAAAAE3B1YktleUFkbWluc0xpc3RTdHIJAAS5AAAAAgkABEwAAAACAgAAACxFeHRFRUsxOW5tS2o5bUNwbld5dkVFSkZZQVRMTWNWRU12b2hoVUhreUhObQkABEwAAAACAgAAACxFdjVweTVGZkJRWDljWnBZS25mUXJUQjQ5QnlmOFFtcFpXZURWUmltNHlWNwkABEwAAAACAgAAACxEVXV1TGpYdTk4bkJ3WmM3ZnF3Q1RqdEEzbm5Sd2dUYmtNU3I1U1UyTm1EUgkABEwAAAACAgAAACxEVXV1TGpYdTk4bkJ3WmM3ZnF3Q1RqdEEzbm5Sd2dUYmtNU3I1U1UyTm1EUgUAAAADbmlsBQAAAANTRVAEAAAAEHB1YktleUFkbWluc0xpc3QJAAS1AAAAAgkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAA9jb250cm9sQ29udHJhY3QCAAAADCVzX19tdWx0aXNpZwUAAAATcHViS2V5QWRtaW5zTGlzdFN0cgUAAAADU0VQBAAAAAVjb3VudAkAAGQAAAACCQAAZAAAAAIJAABkAAAAAgMJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAACQACWQAAAAEJAAGRAAAAAgUAAAAQcHViS2V5QWRtaW5zTGlzdAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAMJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAABCQACWQAAAAEJAAGRAAAAAgUAAAAQcHViS2V5QWRtaW5zTGlzdAAAAAAAAAAAAQAAAAAAAAAAAQAAAAAAAAAAAAMJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAACCQACWQAAAAEJAAGRAAAAAgUAAAAQcHViS2V5QWRtaW5zTGlzdAAAAAAAAAAAAgAAAAAAAAAAAQAAAAAAAAAAAAMJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAADCQACWQAAAAEJAAGRAAAAAgUAAAAQcHViS2V5QWRtaW5zTGlzdAAAAAAAAAAAAwAAAAAAAAAAAgAAAAAAAAAAAAkAAGcAAAACBQAAAAVjb3VudAAAAAAAAAAAA1HR0I0=", "chainId": 84, "height": 2168046, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 4gcVtk4cUXd8Ms5ZV9nR8FyMFQ6LGEGPFi4zgrdEPrm1 Next: DqEskSNZdQz2LbsAovFHboAoJ7Qs5dsZkAd9ADfod3m8 Diff:
OldNewDifferences
226226 else false)
227227 then throw("invalid depositNumLast and depositNumUser state")
228228 else if (if ((depositNumLast > -1))
229- then (depositNumUser == -1)
229+ then (depositNumUser >= -1)
230230 else false)
231231 then if (isNewUser)
232232 then [IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)]
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))
229- then (depositNumUser == -1)
229+ 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))
247247 else throw(((("uncovered condition: depositNumLast=" + toString(depositNumLast)) + " depositNumUser=") + toString(depositNumUser)))
248248 }
249249
250250
251251 func IncrementNotDistributedRewardEntry (tkn,amountInc) = {
252252 let notDistributedRewardKEY = keyNotDistributedReward(tkn)
253253 let notDistributedReward = getIntOrElse(notDistributedRewardKEY, 0)
254254 [IntegerEntry(notDistributedRewardKEY, (notDistributedReward + amountInc))]
255255 }
256256
257257
258258 func commonClaim (userAddress,i) = {
259259 let userAddressStr = toString(userAddress)
260260 if ((size(i.payments) > 0))
261261 then throw("payments are not accepted")
262262 else {
263263 let $t01148811593 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
264264 let isNewUser = $t01148811593._1
265265 let stakedAmount = $t01148811593._2
266266 let stakingStart = $t01148811593._3
267267 let stakedAmountX = toBigInt(stakedAmount)
268268 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
269269 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
270270 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
271271 func forEachAssetCalcUnclaimedReward (accum,asset) = {
272272 let $t01196412102 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
273273 let rewardTotal = $t01196412102._1
274274 let cached = $t01196412102._2
275275 let dynamic = $t01196412102._3
276276 let rewardCachedPartKEY = $t01196412102._4
277277 let claimedKEY = keyClaimed(userAddressStr, asset)
278278 let $t01216212199 = accum
279279 let data = $t01216212199._1
280280 let claimedAmtByAsset = $t01216212199._2
281281 let newPart = makeString([asset, toString(rewardTotal)], ":")
282282 let claimedAmtByAssetNew = makeString([claimedAmtByAsset, newPart], "_")
283283 if ((0 >= rewardTotal))
284284 then $Tuple2(data, claimedAmtByAssetNew)
285285 else $Tuple2((((data :+ ScriptTransfer(userAddress, rewardTotal, toAssetVect(asset))) :+ IntegerEntry(claimedKEY, (valueOrElse(getInteger(claimedKEY), 0) + rewardTotal))) :+ IntegerEntry(rewardCachedPartKEY, 0)), claimedAmtByAssetNew)
286286 }
287287
288288 let $t01265912773 = {
289289 let $l = supportedAssetsList
290290 let $s = size($l)
291291 let $acc0 = $Tuple2(nil, "")
292292 func $f0_1 ($a,$i) = if (($i >= $s))
293293 then $a
294294 else forEachAssetCalcUnclaimedReward($a, $l[$i])
295295
296296 func $f0_2 ($a,$i) = if (($i >= $s))
297297 then $a
298298 else throw("List size exceeds 10")
299299
300300 $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)
301301 }
302302 let transfers = $t01265912773._1
303303 let claimedAmtByAssetResult = $t01265912773._2
304304 if ((0 >= size(transfers)))
305305 then nil
306306 else ((transfers :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)) :+ ClaimHistoryEntry(userAddress, i.transactionId, drop(claimedAmtByAssetResult, 1)))
307307 }
308308 }
309309
310310
311311 @Callable(i)
312312 func constructor (neutrinoContractAddress,mathContractAddress,minLockAmount,halfLife,supportedRewardAssets) = if ((i.caller != this))
313313 then throw("Permission denied")
314314 else [StringEntry(keyNeutrinoContractAddress(), neutrinoContractAddress), StringEntry(keyMathContractAddress(), mathContractAddress), IntegerEntry(keyMinLockAmount(), minLockAmount), IntegerEntry(keyHalfLife(), halfLife), StringEntry(keySupportedRewardAssets(), supportedRewardAssets)]
315315
316316
317317
318318 @Callable(i)
319319 func stake () = {
320320 let $t01359713659 = getParamsOrFail()
321321 let bondAssetId = $t01359713659._1
322322 let minLockAmount = $t01359713659._2
323323 let halfLife = $t01359713659._3
324324 if ((size(i.payments) != 1))
325325 then throw("Invalid payments size")
326326 else {
327327 let payment = i.payments[0]
328328 let amount = payment.amount
329329 let invalidAssetMessage = (("Invalid asset. " + toBase58String(bondAssetId)) + " is expected")
330330 let assetId = valueOrErrorMessage(payment.assetId, invalidAssetMessage)
331331 if ((assetId != bondAssetId))
332332 then throw(invalidAssetMessage)
333333 else {
334334 let userAddress = i.caller
335335 let userAddressStr = toString(i.caller)
336336 let $t01420114308 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, -1))
337337 let isNewUser = $t01420114308._1
338338 let lockAmount = $t01420114308._2
339339 let lockStartHeight = $t01420114308._3
340340 let mergedAmount = if (isNewUser)
341341 then amount
342342 else (amount + lockAmount)
343343 let mergedStartHeight = if (isNewUser)
344344 then height
345345 else asInt(invoke(mathContract, "mergeStakesREADONLY", [amount, height, lockAmount, lockStartHeight, halfLife], nil))
346346 if ((minLockAmount > mergedAmount))
347347 then throw(("Min lock amount is " + toString(minLockAmount)))
348348 else {
349349 let $t01466914771 = StatsResult(amount, 1, if (isNewUser)
350350 then 1
351351 else 0)
352352 let statsEntries = $t01466914771._1
353353 let totalStaked = $t01466914771._2
354354 let totalStakedNew = $t01466914771._3
355355 ((([HistoryRecordEntry("stake", userAddress, i.transactionId, lockAmount, lockStartHeight, mergedAmount, mergedStartHeight)] ++ RewardEntries(isNewUser, userAddressStr, lockAmount)) ++ LockParamsEntry(userAddress, mergedAmount, mergedStartHeight)) ++ statsEntries)
356356 }
357357 }
358358 }
359359 }
360360
361361
362362
363363 @Callable(i)
364364 func unstake (amount) = if ((size(i.payments) != 0))
365365 then throw("unstake doesn't require any payment")
366366 else {
367367 let userAddress = i.caller
368368 let userAddressStr = toString(userAddress)
369369 let $t01525715319 = getParamsOrFail()
370370 let bondAssetId = $t01525715319._1
371371 let minLockAmount = $t01525715319._2
372372 let halfLife = $t01525715319._3
373373 let $t01532215396 = getUserParamsOrFail(userAddress)
374374 let isNewUser = $t01532215396._1
375375 let lockAmount = $t01532215396._2
376376 let lockStart = $t01532215396._3
377377 if ((0 >= lockAmount))
378378 then throw("Nothing to unstake")
379379 else if ((amount > lockAmount))
380380 then throw(((("Requested " + toString(amount)) + ", but staked only ") + toString(lockAmount)))
381381 else {
382382 let comissionAmount = asInt(invoke(mathContract, "getUnstakeComissionAmountREADONLY", [amount, lockStart, halfLife], nil))
383383 let $t01571015864 = StatsResult(-(amount), if ((amount == lockAmount))
384384 then -1
385385 else 0, if ((amount == lockAmount))
386386 then -1
387387 else 0)
388388 let statsEntries = $t01571015864._1
389389 let totalStaked = $t01571015864._2
390390 let totalStakedNew = $t01571015864._3
391391 ((([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)
392392 }
393393 }
394394
395395
396396
397397 @Callable(i)
398398 func deposit () = if ((size(i.payments) != 1))
399399 then throw("exact 1 payment is allowed only")
400400 else {
401401 let pmt = i.payments[0]
402402 let amount = pmt.amount
403403 let pmtAssetId = valueOrElse(pmt.assetId, WAVESID)
404404 let pmtAssetIdStr = toBase58String(pmtAssetId)
405405 let pmtMultX = if ((pmtAssetId == WAVESID))
406406 then MULTX8
407407 else MULTX6
408408 let amountX = toBigInt(amount)
409409 let totalStaked = getIntOrElse(keyLockParamTotalAmount(), 0)
410410 let totalStakedX = toBigInt(totalStaked)
411411 if ((0 > totalStaked))
412412 then throw("TODO: case is not supported")
413413 else if ((totalStaked == 0))
414414 then IncrementNotDistributedRewardEntry(pmtAssetIdStr, amount)
415415 else {
416416 let rewardPerNsbtX18 = fraction(amountX, MULTX18, totalStakedX)
417417 let depositNumLastKEY = keyDepositNumLast()
418418 let depositNumLast = getIntOrElse(depositNumLastKEY, -1)
419419 let depositNumNew = (depositNumLast + 1)
420420 if (!(contains(supportedAssetsStr, pmtAssetIdStr)))
421421 then throw(((supportedAssetsStr + " doesn't contain ") + pmtAssetIdStr))
422422 else {
423423 func refreshRewardPerNsbtSUM (accum,nextAsset) = {
424424 let rewardPerNsbtSumNewKEY = keyRewardPerNsbtSumAt(depositNumNew, nextAsset)
425425 let sumLastStr = getStrOrElse(keyRewardPerNsbtSumAt(depositNumLast, nextAsset), "0")
426426 (accum :+ (if ((nextAsset == pmtAssetIdStr))
427427 then StringEntry(rewardPerNsbtSumNewKEY, toString((parseBigIntValue(sumLastStr) + rewardPerNsbtX18)))
428428 else StringEntry(rewardPerNsbtSumNewKEY, sumLastStr)))
429429 }
430430
431431 ({
432432 let $l = supportedAssetsList
433433 let $s = size($l)
434434 let $acc0 = nil
435435 func $f0_1 ($a,$i) = if (($i >= $s))
436436 then $a
437437 else refreshRewardPerNsbtSUM($a, $l[$i])
438438
439439 func $f0_2 ($a,$i) = if (($i >= $s))
440440 then $a
441441 else throw("List size exceeds 10")
442442
443443 $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)
444444 } :+ IntegerEntry(depositNumLastKEY, depositNumNew))
445445 }
446446 }
447447 }
448448
449449
450450
451451 @Callable(i)
452452 func claimRewards () = commonClaim(i.caller, i)
453453
454454
455455
456456 @Callable(i)
457457 func claimRewardsByOriginCaller () = commonClaim(i.originCaller, i)
458458
459459
460460
461461 @Callable(i)
462462 func unclaimedRewardsREADONLY (userAddressStr) = {
463463 func forEachAssetZeroReward (accum,asset) = ((accum + makeString([asset, "0", "0"], ":")) + "_")
464464
465465 let unclaimedRewardStr = if ((userAddressStr == ""))
466466 then {
467467 let $l = supportedAssetsList
468468 let $s = size($l)
469469 let $acc0 = ""
470470 func $f0_1 ($a,$i) = if (($i >= $s))
471471 then $a
472472 else forEachAssetZeroReward($a, $l[$i])
473473
474474 func $f0_2 ($a,$i) = if (($i >= $s))
475475 then $a
476476 else throw("List size exceeds 10")
477477
478478 $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)
479479 }
480480 else {
481481 let userAddress = addressFromStringValue(userAddressStr)
482482 let $t01854018645 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
483483 let isNewUser = $t01854018645._1
484484 let stakedAmount = $t01854018645._2
485485 let stakingStart = $t01854018645._3
486486 let stakedAmountX = toBigInt(stakedAmount)
487487 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
488488 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
489489 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
490490 func forEachAssetCalcUnclaimedReward (accum,asset) = {
491491 let $t01899119129 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
492492 let rewardTotal = $t01899119129._1
493493 let cached = $t01899119129._2
494494 let dynamic = $t01899119129._3
495495 let rewardCachedPartKEY = $t01899119129._4
496496 let claimed = valueOrElse(getInteger(keyClaimed(userAddressStr, asset)), 0)
497497 ((accum + makeString([asset, toString(rewardTotal), toString(claimed)], ":")) + "_")
498498 }
499499
500500 let $l = supportedAssetsList
501501 let $s = size($l)
502502 let $acc0 = ""
503503 func $f0_1 ($a,$i) = if (($i >= $s))
504504 then $a
505505 else forEachAssetCalcUnclaimedReward($a, $l[$i])
506506
507507 func $f0_2 ($a,$i) = if (($i >= $s))
508508 then $a
509509 else throw("List size exceeds 10")
510510
511511 $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)
512512 }
513513 $Tuple2(nil, dropRight(unclaimedRewardStr, 1))
514514 }
515515
516516
517517
518518 @Callable(i)
519519 func nsbtUnstakingSYSREADONLY (userAddressStrOrEmpty,unstakeAmt) = {
520520 let resultArray = if ((userAddressStrOrEmpty == ""))
521521 then [0, 0, 0, 0]
522522 else {
523523 let userAddress = addressFromStringValue(userAddressStrOrEmpty)
524524 let $t01966819730 = getParamsOrFail()
525525 let nsbtAssetId = $t01966819730._1
526526 let minLockAmount = $t01966819730._2
527527 let halfLife = $t01966819730._3
528528 let $t01973319809 = getUserParamsOrFail(userAddress)
529529 let isNewUser = $t01973319809._1
530530 let stakedAmount = $t01973319809._2
531531 let lockStart = $t01973319809._3
532532 let stakedAmountNEW = (stakedAmount - unstakeAmt)
533533 let comissionAmount = asInt(invoke(mathContract, "getUnstakeComissionAmountREADONLY", [unstakeAmt, lockStart, halfLife], nil))
534534 let receiveAmount = (unstakeAmt - comissionAmount)
535535 [stakedAmount, stakedAmountNEW, receiveAmount, comissionAmount]
536536 }
537537 $Tuple2(nil, resultArray)
538538 }
539539
540540
541541
542542 @Callable(i)
543543 func nsbtStakingSYSREADONLY (userAddressStr) = {
544544 let totalNsbtAmt = getIntOrElse(keyLockParamTotalAmount(), 0)
545545 if ((userAddressStr == ""))
546546 then $Tuple2(nil, [0, totalNsbtAmt, 0])
547547 else {
548548 let userAddress = toAddressOrFail(userAddressStr)
549549 let $t02049620600 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
550550 let isNewUser = $t02049620600._1
551551 let userNsbtAmt = $t02049620600._2
552552 let stakingStart = $t02049620600._3
553553 $Tuple2(nil, [userNsbtAmt, totalNsbtAmt, stakingStart])
554554 }
555555 }
556556
557557
558558 @Verifier(tx)
559559 func verify () = {
560560 let pubKeyAdminsListStr = makeString(["ExtEEK19nmKj9mCpnWyvEEJFYATLMcVEMvohhUHkyHNm", "Ev5py5FfBQX9cZpYKnfQrTB49Byf8QmpZWeDVRim4yV7", "DUuuLjXu98nBwZc7fqwCTjtA3nnRwgTbkMSr5SU2NmDR", "DUuuLjXu98nBwZc7fqwCTjtA3nnRwgTbkMSr5SU2NmDR"], SEP)
561561 let pubKeyAdminsList = split(valueOrElse(getString(controlContract, "%s__multisig"), pubKeyAdminsListStr), SEP)
562562 let count = ((((if (sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(pubKeyAdminsList[0])))
563563 then 1
564564 else 0) + (if (sigVerify(tx.bodyBytes, tx.proofs[1], fromBase58String(pubKeyAdminsList[1])))
565565 then 1
566566 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[2], fromBase58String(pubKeyAdminsList[2])))
567567 then 1
568568 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[3], fromBase58String(pubKeyAdminsList[3])))
569569 then 2
570570 else 0))
571571 (count >= 3)
572572 }
573573

github/deemru/w8io/3ef1775 
110.84 ms