2022.10.13 17:45 [3336166] smart account 3P8w8NXZUtYdCA13tHbDY5sW4mC27ZFJgG3 > SELF 0.00000000 Waves

{ "type": 13, "id": "G4ZV5HPmVK7hK96j9CKhNKREiKJVQ3oRkVAhxAs6q2tV", "fee": 3300000, "feeAssetId": null, "timestamp": 1665668585769, "version": 1, "sender": "3P8w8NXZUtYdCA13tHbDY5sW4mC27ZFJgG3", "senderPublicKey": "6uKJV5r5qjqG9uVK4Q24W7zG5KZtGtKXz3NWRMwfZbB7", "proofs": [ "", "PxRhwokvH1hYTXyvVdqc3sb4zPb7JbPfeHCWoFzhnNd9nQqdM3bjcwQVv1ShXQii1gZhtLajYFUWwhzTQ9qErwZ", "", "nQmtkurs78J5tB1H22x8Q5DgVhFz4UPqC9JKX3PQbuqktykpxiwCkREcu1katjSSwcrmiRhQM1GcmCcxCQWYNi5" ], "script": "base64:AAIFAAAAAAAAACkIAhIHCgUICAEBCBIAEgMKAQESABIAEgASAwoBCBIECgIIARIECgIIAQAAAFAAAAAAC3JldmlzaW9uTnVtAgAAACg2YTk0Yjg0MWIzODdlNWQ0YmQ4YmU4ZjhlZDVmODAwNTdlZjg2MTg2AAAAAAlzZXBhcmF0b3ICAAAAAl9fAAAAAANTRVACAAAAAl9fAAAAAAVNVUxUNgAAAAAAAA9CQAAAAAAFTVVMVDgAAAAAAAX14QAAAAAABk1VTFRYNgkAATYAAAABBQAAAAVNVUxUNgAAAAAGTVVMVFg4CQABNgAAAAEFAAAABU1VTFQ4AAAAAAdNVUxUWDE4CQABNgAAAAEADeC2s6dkAAAAAAAACldBVkVTSURTVFICAAAABVdBVkVTAAAAAAdXQVZFU0lECQACWQAAAAEFAAAACldBVkVTSURTVFIAAAAACURBWU1JTExJUwAAAAAABSZcAAAAAAAZSWR4Q29udHJvbENmZ05ldXRyaW5vRGFwcAAAAAAAAAAAAQAAAAAYSWR4Q29udHJvbENmZ0F1Y3Rpb25EYXBwAAAAAAAAAAACAAAAABRJZHhDb250cm9sQ2ZnUnBkRGFwcAAAAAAAAAAAAwAAAAAVSWR4Q29udHJvbENmZ01hdGhEYXBwAAAAAAAAAAAEAAAAABxJZHhDb250cm9sQ2ZnTGlxdWlkYXRpb25EYXBwAAAAAAAAAAAFAAAAABVJZHhDb250cm9sQ2ZnUmVzdERhcHAAAAAAAAAAAAYAAAAAHUlkeENvbnRyb2xDZmdOb2RlUmVnaXN0cnlEYXBwAAAAAAAAAAAHAAAAABxJZHhDb250cm9sQ2ZnTnNidFN0YWtpbmdEYXBwAAAAAAAAAAAIAAAAABlJZHhDb250cm9sQ2ZnTWVkaWF0b3JEYXBwAAAAAAAAAAAJAQAAAA9nZXRTdHJpbmdPckZhaWwAAAACAAAAB2FkZHJlc3MAAAADa2V5CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAHYWRkcmVzcwUAAAADa2V5CQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACm1hbmRhdG9yeSAJAAQlAAAAAQUAAAAHYWRkcmVzcwIAAAABLgUAAAADa2V5AgAAAA8gaXMgbm90IGRlZmluZWQBAAAAEWtleUNvbnRyb2xBZGRyZXNzAAAAAAIAAAAcJXMlc19fY29uZmlnX19jb250cm9sQWRkcmVzcwEAAAANa2V5Q29udHJvbENmZwAAAAACAAAAESVzX19jb250cm9sQ29uZmlnAQAAABRyZWFkQ29udHJvbENmZ09yRmFpbAAAAAEAAAAHY29udHJvbAkABLUAAAACCQEAAAAPZ2V0U3RyaW5nT3JGYWlsAAAAAgUAAAAHY29udHJvbAkBAAAADWtleUNvbnRyb2xDZmcAAAAABQAAAANTRVABAAAAGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAAAAAIAAAAKY29udHJvbENmZwAAAANpZHgJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABCQABkQAAAAIFAAAACmNvbnRyb2xDZmcFAAAAA2lkeAkAASwAAAACAgAAAC1Db250cm9sIGNmZyBkb2Vzbid0IGNvbnRhaW4gYWRkcmVzcyBhdCBpbmRleCAJAAGkAAAAAQUAAAADaWR4AAAAAA9jb250cm9sQ29udHJhY3QJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwkBAAAAEWtleUNvbnRyb2xBZGRyZXNzAAAAAAIAAAAjM1A1QmZkNThQUGZOdkJNMkh5OFFmYmNEcU1lTnR6ZzdLZlAAAAAACmNvbnRyb2xDZmcJAQAAABRyZWFkQ29udHJvbENmZ09yRmFpbAAAAAEFAAAAD2NvbnRyb2xDb250cmFjdAAAAAAMbWF0aENvbnRyYWN0CQEAAAAYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAAAAAgUAAAAKY29udHJvbENmZwUAAAAVSWR4Q29udHJvbENmZ01hdGhEYXBwAAAAABBuZXV0cmlub0NvbnRyYWN0CQEAAAAYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAAAAAgUAAAAKY29udHJvbENmZwUAAAAZSWR4Q29udHJvbENmZ05ldXRyaW5vRGFwcAAAAAAPYXVjdGlvbkNvbnRyYWN0CQEAAAAYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAAAAAgUAAAAKY29udHJvbENm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ZFN0YXJ0CQAETAAAAAIJAAGkAAAAAQUAAAAJbmV3QW1vdW50CQAETAAAAAIJAAGkAAAAAQUAAAAIbmV3U3RhcnQFAAAAA25pbAUAAAAJc2VwYXJhdG9yAQAAABhmb3JtYXRDbGFpbUhpc3RvcnlSZWNvcmQAAAACAAAABHVzZXIAAAAOY2xhaW1lZFJld2FyZHMJAAS5AAAAAgkABEwAAAACAgAAAAglcyVkJWQlcwkABEwAAAACBQAAAAR1c2VyCQAETAAAAAIJAAGkAAAAAQgFAAAACWxhc3RCbG9jawAAAAZoZWlnaHQJAARMAAAAAgkAAaQAAAABCAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAkABEwAAAACBQAAAA5jbGFpbWVkUmV3YXJkcwUAAAADbmlsBQAAAAlzZXBhcmF0b3IBAAAAEkhpc3RvcnlSZWNvcmRFbnRyeQAAAAcAAAAEdHlwZQAAAAt1c2VyQWRkcmVzcwAAAAR0eElkAAAACW9sZEFtb3VudAAAAAhvbGRTdGFydAAAAAluZXdBbW91bnQAAAAIbmV3U3RhcnQJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABBrZXlIaXN0b3J5UmVjb3JkAAAAAwUAAAAEdHlwZQUAAAALdXNlckFkZHJlc3MFAAAABHR4SWQJAQAAABNmb3JtYXRIaXN0b3J5UmVjb3JkAAAABAUAAAAJb2xkQW1vdW50BQAAAAhvbGRTdGFydAUAAAAJbmV3QW1vdW50BQAAAAhuZXdTdGFydAEAAAARQ2xhaW1IaXN0b3J5RW50cnkAAAADAAAAC3VzZXJBZGRyZXNzAAAABHR4SWQAAAAOY2xhaW1lZFJld2FyZHMJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABBrZXlIaXN0b3J5UmVjb3JkAAAAAwIAAAAFY2xhaW0FAAAAC3VzZXJBZGRyZXNzBQAAAAR0eElkCQEAAAAYZm9ybWF0Q2xhaW1IaXN0b3J5UmVjb3JkAAAAAgkABCUAAAABBQAAAAt1c2VyQWRkcmVzcwUAAAAOY2xhaW1lZFJld2FyZHMBAAAAC1N0YXRzUmVzdWx0AAAAAwAAAA50b3RhbExvY2tlZEluYwAAAAxsb2NrQ291bnRJbmMAAAANdXNlcnNDb3VudEluYwQAAAAKbG9ja3NDb3VudAkBAAAADGdldEludE9yWmVybwAAAAEJAQAAABJrZXlTdGF0c0xvY2tzQ291bnQAAAAABAAAAAp1c2Vyc0NvdW50CQEAAAAMZ2V0SW50T3JaZXJvAAAAAQkBAAAAEmtleVN0YXRzVXNlcnNDb3VudAAAAAAEAAAAC3RvdGFsQW1vdW50CQEAAAAMZ2V0SW50T3JaZXJvAAAAAQkBAAAAF2tleUxvY2tQYXJhbVRvdGFsQW1vdW50AAAAAAQAAAAOdG90YWxBbW91bnROZXcJAABkAAAAAgUAAAALdG90YWxBbW91bnQFAAAADnRvdGFsTG9ja2VkSW5jCQAFFQAAAAMJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABJrZXlTdGF0c0xvY2tzQ291bnQAAAAACQAAZAAAAAIFAAAACmxvY2tzQ291bnQFAAAADGxvY2tDb3VudEluYwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAEmtleVN0YXRzVXNlcnNDb3VudAAAAAAJAABkAAAAAgUAAAAKdXNlcnNDb3VudAUAAAANdXNlcnNDb3VudEluYwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAF2tleUxvY2tQYXJhbVRvdGFsQW1vdW50AAAAAAUAAAAOdG90YWxBbW91bnROZXcFAAAAA25pbAUAAAALdG90YWxBbW91bnQFAAAADnRvdGFsQW1vdW50TmV3AQAAAA9Mb2NrUGFyYW1zRW50cnkAAAADAAAAC3VzZXJBZGRyZXNzAAAABmFtb3VudAAAAAVzdGFydAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAFmtleUxvY2tQYXJhbVVzZXJBbW91bnQAAAABBQAAAAt1c2VyQWRkcmVzcwUAAAAGYW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAWa2V5TG9ja1BhcmFtU3RhcnRCbG9jawAAAAEFAAAAC3VzZXJBZGRyZXNzBQAAAAVzdGFydAUAAAADbmlsAQAAAA9nZXRQYXJhbXNPckZhaWwAAAAACQAFFQAAAAMJAAJZAAAAAQkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgUAAAAQbmV1dHJpbm9Db250cmFjdAkBAAAADGtleUJvbmRBc3NldAAAAAAJAQAAAAxnZXRJbnRPckZhaWwAAAABCQEAAAAQa2V5TWluTG9ja0Ftb3VudAAAAAAJAQAAAAxnZXRJbnRPckZhaWwAAAABCQEAAAALa2V5SGFsZkxpZmUAAAAAAQAAAAxpc0FjdGl2ZVVzZXIAAAABAAAAC3VzZXJBZGRyZXNzCQAAZgAAAAIJAQAAAAxnZXRJbnRPckVsc2UAAAACCQEAAAAWa2V5TG9ja1BhcmFtVXNlckFtb3VudAAAAAEFAAAAC3VzZXJBZGRyZXNzAAAAAAAAAAAAAAAAAAAAAAAAAQAAABNnZXRVc2VyUGFyYW1zT3JVbml0AAAAAQAAAAt1c2VyQWRkcmVzcwMJAQAAAAxpc0FjdGl2ZVVzZXIAAAABBQAAAAt1c2VyQWRkcmVzcwkABRUAAAADBwkBAAAADGdldEludE9yRmFpbAAAAAEJAQAAABZrZXlMb2NrUGFyYW1Vc2VyQW1vdW50AAAAAQUAAAALdXNlckFkZHJlc3MJAQAAAAxnZXRJbnRPckZhaWwAAAABCQEAAAAWa2V5TG9ja1BhcmFtU3RhcnRCbG9jawAAAAEFAAAAC3VzZXJBZGRyZXNzBQAAAAR1bml0AQAAABNnZXRVc2VyUGFyYW1zT3JGYWlsAAAAAQAAAAt1c2VyQWRkcmVzcwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQEAAAATZ2V0VXNlclBhcmFtc09yVW5pdAAAAAEFAAAAC3VzZXJBZGRyZXNzCQABLAAAAAIJAAEsAAAAAgIAAAAFVXNlciAJAAQlAAAAAQUAAAALdXNlckFkZHJlc3MCAAAADyBpcyBub3QgZGVmaW5lZAAAAAASc3VwcG9ydGVkQXNzZXRzU3RyCQEAAAAMZ2V0U3RyT3JFbHNlAAAAAgkBAAAAGGtleVN1cHBvcnRlZFJld2FyZEFzc2V0cwAAAAACAAAAAAAAAAATc3VwcG9ydGVkQXNzZXRzTGlzdAkABLUAAAACBQAAABJzdXBwb3J0ZWRBc3NldHNTdHICAAAAAV8BAAAACmNhbGNSZXdhcmQAAAAFAAAAC3VzZXJBZGRyZXNzAAAAB2Fzc2V0SWQAAAANc3Rha2VkQW1vdW50WAAAAA5kZXBvc2l0TnVtVXNlcgAAAA5kZXBvc2l0TnVtTGFzdAQAAAAXcmV3YXJkUGVyTnNidFN1bUxhc3RLRVkJAQAAABVrZXlSZXdhcmRQZXJOc2J0U3VtQXQAAAACBQAAAA5kZXBvc2l0TnVtTGFzdAUAAAAHYXNzZXRJZAQAAAAKc3VtTGFzdFgxOAkAAacAAAABCQEAAAAMZ2V0U3RyT3JFbHNlAAAAAgkBAAAAFWtleVJld2FyZFBlck5zYnRTdW1BdAAAAAIFAAAADmRlcG9zaXROdW1MYXN0BQAAAAdhc3NldElkAgAAAAEwBAAAAApzdW1Vc2VyWDE4CQABpwAAAAEJAQAAAAxnZXRTdHJPckVsc2UAAAACCQEAAAAVa2V5UmV3YXJkUGVyTnNidFN1bUF0AAAAAgUAAAAOZGVwb3NpdE51bVVzZXIFAAAAB2Fzc2V0SWQCAAAAATAEAAAAEXJld2FyZER5bmFtaWNQYXJ0CQABoAAAAAEJAAE8AAAAAwkAATgAAAACBQAAAApzdW1MYXN0WDE4BQAAAApzdW1Vc2VyWDE4BQAAAA1zdGFrZWRBbW91bnRYBQAAAAdNVUxUWDE4BAAAABNyZXdhcmRDYWNoZWRQYXJ0S0VZCQEAAAAJa2V5UmV3YXJkAAAAAgUAAAALdXNlckFkZHJlc3MFAAAAB2Fzc2V0SWQEAAAAEHJld2FyZENhY2hlZFBhcnQJAQAAAAxnZXRJbnRPckVsc2UAAAACBQAAABNyZXdhcmRDYWNoZWRQYXJ0S0VZAAAAAAAAAAAACQAFFgAAAAQJAABkAAAAAgUAAAAQcmV3YXJkQ2FjaGVkUGFydAUAAAARcmV3YXJkRHluYW1pY1BhcnQFAAAAEHJld2FyZENhY2hlZFBhcnQFAAAAEXJld2FyZER5bmFtaWNQYXJ0BQAAABNyZXdhcmRDYWNoZWRQYXJ0S0VZAQAAAAx0b1N0YXJ0T2ZEYXkAAAABAAAACXRpbWVzdGFtcAkAAGgAAAACCQAAaQAAAAIFAAAACXRpbWVzdGFtcAUAAAAJREFZTUlMTElTBQAAAAlEQVlNSUxMSVMBAAAAE2ZpbmRFbGVtZW50UG9zaXRpb24AAAADAAAAA3NyYwAAAAdlbGVtZW50AAAAA3NlcAQAAAAMZWxlbWVudFN0YXJ0CQEAAAATdmFs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X18wX18wX18wX18wX18wX18wX18wX18wX18wX18wX18wBAAAAA5jdXJyVG90YWxzREFUQQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAAAl0b3RhbHNLRVkFAAAAC2RlZmF1bHREQVRBBAAAAA1uZXdUb3RhbHNEQVRBCQEAAAATdXBkYXRlRGVwb3NpdFRvdGFscwAAAAMFAAAADmN1cnJUb3RhbHNEQVRBCQAAZAAAAAIFAAAACHBvc2l0aW9uAAAAAAAAAAABBQAAAA1kZXBvc2l0QW1vdW50CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAACXRvdGFsc0tFWQUAAAANbmV3VG90YWxzREFUQQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAAhieURheUtFWQUAAAANbmV3VG90YWxzREFUQQUAAAADbmlsAQAAAA1SZXdhcmRFbnRyaWVzAAAAAwAAAAlpc05ld1VzZXIAAAALdXNlckFkZHJlc3MAAAAMc3Rha2VkQW1vdW50BAAAAA1zdGFrZWRBbW91bnRYCQABNgAAAAEFAAAADHN0YWtlZEFtb3VudAQAAAAbdXNlclJld2FyZEZyb21EZXBvc2l0TnVtS0VZCQEAAAAba2V5VXNlclJld2FyZEZyb21EZXBvc2l0TnVtAAAAAQUAAAALdXNlckFkZHJlc3MEAAAADmRlcG9zaXROdW1Vc2VyCQEAAAAMZ2V0SW50T3JFbHNlAAAAAgUAAAAbdXNlclJld2FyZEZyb21EZXBvc2l0TnVtS0VZAP//////////BAAAAA5kZXBvc2l0TnVtTGFzdAkBAAAADGdldEludE9yRWxzZQAAAAIJAQAAABFrZXlEZXBvc2l0TnVtTGFzdAAAAAAA//////////8KAQAAABtmb3JFYWNoQXNzZXRDYWNoZVVzZXJSZXdhcmQAAAACAAAABWFjY3VtAAAABWFzc2V0BAAAAA0kdDAxMDU3NzEwNzEyCQEAAAAKY2FsY1Jld2FyZAAAAAUFAAAAC3VzZXJBZGRyZXNzBQAAAAVhc3NldAUAAAANc3Rha2VkQW1vdW50WAUAAAAOZGVwb3NpdE51bVVzZXIFAAAADmRlcG9zaXROdW1MYXN0BAAAAAtyZXdhcmRUb3RhbAgFAAAADSR0MDEwNTc3MTA3MTIAAAACXzEEAAAABmNhY2hlZAgFAAAADSR0MDEwNTc3MTA3MTIAAAACXzIEAAAAB2R5bmFtaWMIBQAAAA0kdDAxMDU3NzEwNzEyAAAAAl8zBAAAABNyZXdhcmRDYWNoZWRQYXJ0S0VZCAUAAAANJHQwMTA1NzcxMDcxMgAAAAJfNAkABE0AAAACBQAAAAVhY2N1bQkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAE3Jld2FyZENhY2hlZFBhcnRLRVkFAAAAC3Jld2FyZFRvdGFsAwMJAAAAAAAAAgUAAAAOZGVwb3NpdE51bUxhc3QA//////////8JAAAAAAAAAgUAAAAOZGVwb3NpdE51bVVzZXIA//////////8HBQAAAANuaWwDAwkAAAAAAAACBQAAAA5kZXBvc2l0TnVtTGFzdAD//////////wkAAGYAAAACBQAAAA5kZXBvc2l0TnVtVXNlcgD//////////wcJAAACAAAAAQIAAAAvaW52YWxpZCBkZXBvc2l0TnVtTGFzdCBhbmQgZGVwb3NpdE51bVVzZXIgc3RhdGUDAwkAAGYAAAACBQAAAA5kZXBvc2l0TnVtTGFzdAD//////////wkAAGcAAAACBQAAAA5kZXBvc2l0TnVtVXNlcgD//////////wcDBQAAAAlpc05ld1VzZXIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQUAAAAOZGVwb3NpdE51bUxhc3QFAAAAA25pbAkABE0AAAACCgAAAAACJGwFAAAAE3N1cHBvcnRlZEFzc2V0c0xpc3QKAAAAAAIkcwkAAZAAAAABBQAAAAIkbAoAAAAABSRhY2MwBQAAAANuaWwKAQAAAAUkZjBfMQAAAAIAAAACJGEAAAACJGkDCQAAZwAAAAIFAAAAAiRpBQAAAAIkcwUAAAACJGEJAQAAABtmb3JFYWNoQXNzZXRDYWNoZVVzZXJSZXdhcmQAAAACBQAAAAIkYQkAAZEAAAACBQAAAAIkbAUAAAACJGkKAQAAAAUkZjBfMgAAAAIAAAACJGEAAAACJGkDCQAAZwAAAAIFAAAAAiRpBQAAAAIkcwUAAAACJGEJAAACAAAAAQIAAAATTGlzdCBzaXplIGV4Y2VlZHMgOQkBAAAABSRmMF8yAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgUAAAAFJGFjYzAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAIAAAAAAAAAAAMAAAAAAAAAAAQAAAAAAAAAAAUAAAAAAAAAAAYAAAAAAAAAAAcAAAAAAAAAAAgAAAAAAAAAAAkJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABt1c2VyUmV3YXJkRnJvbURlcG9zaXROdW1LRVkFAAAADmRlcG9zaXROdW1MYXN0CQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAJHVuY292ZXJlZCBjb25kaXRpb246IGRlcG9zaXROdW1MYXN0PQkAAaQAAAABBQAAAA5kZXBvc2l0TnVtTGFzdAIAAAAQIGRlcG9zaXROdW1Vc2VyPQkAAaQAAAABBQAAAA5kZXBvc2l0TnVtVXNlcgEAAAAiSW5jcmVtZW50Tm90RGlzdHJpYnV0ZWRSZXdhcmRFbnRyeQAAAAIAAAADdGtuAAAACWFtb3VudEluYwQAAAAXbm90RGlzdHJpYnV0ZWRSZXdhcmRLRVkJAQAAABdrZXlOb3REaXN0cmlidXRlZFJld2FyZAAAAAEFAAAAA3RrbgQAAAAUbm90RGlzdHJpYnV0ZWRSZXdhcmQJAQAAAAxnZXRJbnRPckVsc2UAAAACBQAAABdub3REaXN0cmlidXRlZFJld2FyZEtFWQAAAAAAAAAAAAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAXbm90RGlzdHJpYnV0ZWRSZXdhcmRLRVkJAABkAAAAAgUAAAAUbm90RGlzdHJpYnV0ZWRSZXdhcmQFAAAACWFtb3VudEluYwUAAAADbmlsAQAAAAtjb21tb25DbGFpbQAAAAIAAAALdXNlckFkZHJlc3MAAAABaQQAAAAOdXNlckFkZHJlc3NTdHIJAAQlAAAAAQUAAAALdXNlckFkZHJlc3MDCQAAZgAAAAIJAAGQAAAAAQgFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAJAAACAAAAAQIAAAAZcGF5bWVudHMgYXJlIG5vdCBhY2NlcHRlZAQAAAANJHQwMTM2NTUxMzc2MAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkBAAAAE2dldFVzZXJQYXJhbXNPclVuaXQAAAABBQAAAAt1c2VyQWRkcmVzcwkABRUAAAADBgAAAAAAAAAAAAAAAAAAAAAAAAQAAAAJaXNOZXdVc2VyCAUAAAANJHQwMTM2NTUxMzc2MAAAAAJfMQQAAAAMc3Rha2VkQW1vdW50CAUAAAANJHQwMTM2NTUxMzc2MAAAAAJfMgQAAAAMc3Rha2luZ1N0YXJ0CAUAAAANJHQwMTM2NTUxMzc2MAAAAAJfMwQAAAANc3Rha2VkQW1vdW50WAkAATYAAAABBQAAAAxzdGFrZWRBbW91bnQEAAAAG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQkBAAAAG2tleVVzZXJSZXdhcmRGcm9tRGVwb3NpdE51bQAAAAEFAAAADnVzZXJBZGRyZXNzU3RyBAAAAA5kZXBvc2l0TnVtVXNlcgkBAAAADGdldEludE9yRWxzZQAAAAIFAAAAG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQD//////////wQAAAAOZGVwb3NpdE51bUxhc3QJAQAAAAxnZXRJbnRPckVsc2UAAAACCQEAAAARa2V5RGVwb3NpdE51bUxhc3QAAAAAAP//////////CgEAAAAfZm9yRWFjaEFzc2V0Q2FsY1VuY2xhaW1lZFJld2FyZAAAAAIAAAAFYWNjdW0AAAAFYXNzZXQEAAAADSR0MDE0MTMxMTQyNjkJAQAAAApjYWxjUmV3YXJkAAAABQUAAAAOdXNlckFkZHJlc3NTdHIFAAAABWFzc2V0BQAAAA1zdGFrZWRBbW91bnRYBQAAAA5kZXBvc2l0TnVtVXNlcgUAAAAOZGVwb3NpdE51bUxhc3QEAAAAC3Jld2FyZFRvdGFsCAUAAAANJHQwMTQxMzExNDI2OQAAAAJfMQQAAAAGY2FjaGVkCAUAAAANJHQwMTQxMzExNDI2OQAAAAJfMgQAAAAHZHluYW1pYwgFAAAADSR0MDE0MTMx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b25zdHJ1Y3RvcgAAAAUAAAAXbmV1dHJpbm9Db250cmFjdEFkZHJlc3MAAAATbWF0aENvbnRyYWN0QWRkcmVzcwAAAA1taW5Mb2NrQW1vdW50AAAACGhhbGZMaWZlAAAAFXN1cHBvcnRlZFJld2FyZEFzc2V0cwMJAQAAAAIhPQAAAAIIBQAAAAFpAAAABmNhbGxlcgUAAAAEdGhpcwkAAAIAAAABAgAAABFQZXJtaXNzaW9uIGRlbmllZAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAaa2V5TmV1dHJpbm9Db250cmFjdEFkZHJlc3MAAAAABQAAABduZXV0cmlub0NvbnRyYWN0QWRkcmVzcwkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAWa2V5TWF0aENvbnRyYWN0QWRkcmVzcwAAAAAFAAAAE21hdGhDb250cmFjdEFkZHJlc3MJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABBrZXlNaW5Mb2NrQW1vdW50AAAAAAUAAAANbWluTG9ja0Ftb3VudAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAC2tleUhhbGZMaWZlAAAAAAUAAAAIaGFsZkxpZmUJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAGGtleVN1cHBvcnRlZFJld2FyZEFzc2V0cwAAAAAFAAAAFXN1cHBvcnRlZFJld2FyZEFzc2V0cwUAAAADbmlsAAAAAWkBAAAABXN0YWtlAAAAAAQAAAANJHQwMTU3ODgxNTg1MAkBAAAAD2dldFBhcmFtc09yRmFpbAAAAAAEAAAAC2JvbmRBc3NldElkCAUAAAANJHQwMTU3ODgxNTg1MAAAAAJfMQQAAAANbWluTG9ja0Ftb3VudAgFAAAADSR0MDE1Nzg4MTU4NTAAAAACXzIEAAAACGhhbGZMaWZlCAUAAAANJHQwMTU3ODgxNTg1MAAAAAJfMwMJAQAAAAIhPQAAAAIJAAGQAAAAAQgFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEJAAACAAAAAQIAAAAVSW52YWxpZCBwYXltZW50cyBzaXplBAAAAAdwYXltZW50CQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAABAAAAAZhbW91bnQIBQAAAAdwYXltZW50AAAABmFtb3VudAQAAAATaW52YWxpZEFzc2V0TWVzc2FnZQkAASwAAAACCQABLAAAAAICAAAAD0ludmFsaWQgYXNzZXQuIAkAAlgAAAABBQAAAAtib25kQXNzZXRJZAIAAAAMIGlzIGV4cGVjdGVkBAAAAAdhc3NldElkCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIIBQAAAAdwYXltZW50AAAAB2Fzc2V0SWQFAAAAE2ludmFsaWRBc3NldE1lc3NhZ2UDCQEAAAACIT0AAAACBQAAAAdhc3NldElkBQAAAAtib25kQXNzZXRJZAkAAAIAAAABBQAAABNpbnZhbGlkQXNzZXRNZXNzYWdlBAAAAAt1c2VyQWRkcmVzcwgFAAAAAWkAAAAGY2FsbGVyBAAAAA51c2VyQWRkcmVzc1N0cgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAADSR0MDE2MzkyMTY0OTkJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAQAAABNnZXRVc2VyUGFyYW1zT3JVbml0AAAAAQUAAAALdXNlckFkZHJlc3MJAAUVAAAAAwYAAAAAAAAAAAAA//////////8EAAAACWlzTmV3VXNlcggFAAAADSR0MDE2MzkyMTY0OTkAAAACXzEEAAAACmxvY2tBbW91bnQIBQAAAA0kdDAxNjM5MjE2NDk5AAAAAl8yBAAAAA9sb2NrU3RhcnRIZWlnaHQIBQAAAA0kdDAxNjM5MjE2NDk5AAAAAl8zBAAAAAxtZXJnZWRBbW91bnQDBQAAAAlpc05ld1VzZXIFAAAABmFtb3VudAkAAGQAAAACBQAAAAZhbW91bnQFAAAACmxvY2tBbW91bnQEAAAAEW1lcmdlZFN0YXJ0SGVpZ2h0AwUAAAAJaXNOZXdVc2VyBQAAAAZoZWlnaHQJAQAAAAVhc0ludAAAAAEJAAP8AAAABAUAAAAMbWF0aENvbnRyYWN0AgAAABNtZXJnZVN0YWtlc1JFQURPTkxZCQAETAAAAAIFAAAABmFtb3VudAkABEwAAAACBQAAAAZoZWlnaHQJAARMAAAAAgUAAAAKbG9ja0Ftb3VudAkABEwAAAACBQAAAA9sb2NrU3RhcnRIZWlnaHQJAARMAAAAAgUAAAAIaGFsZkxpZmUFAAAAA25pbAUAAAADbmlsAwkAAGYAAAACBQAAAA1taW5Mb2NrQW1vdW50BQAAAAxtZXJnZWRBbW91bnQJAAACAAAAAQkAASwAAAACAgAAABNNaW4gbG9jayBhbW91bnQgaXMgCQABpAAAAAEFAAAADW1pbkxvY2tBbW91bnQEAAAADSR0MDE2ODYwMTY5NjIJAQAAAAtTdGF0c1Jlc3VsdAAAAAMFAAAABmFtb3VudAAAAAAAAAAAAQMFAAAACWlzTmV3VXNlcgAAAAAAAAAAAQAAAAAAAAAAAAQAAAAMc3RhdHNFbnRyaWVzCAUAAAANJHQwMTY4NjAxNjk2MgAAAAJfMQQAAAALdG90YWxTdGFrZWQIBQAAAA0kdDAxNjg2MDE2OTYyAAAAAl8yBAAAAA50b3RhbFN0YWtlZE5ldwgFAAAADSR0MDE2ODYwMTY5NjIAAAACXzMJAAROAAAAAgkABE4AAAACCQAETgAAAAIJAARMAAAAAgkBAAAAEkhpc3RvcnlSZWNvcmRFbnRyeQAAAAcCAAAABXN0YWtlBQAAAAt1c2VyQWRkcmVzcwgFAAAAAWkAAAANdHJhbnNhY3Rpb25JZAUAAAAKbG9ja0Ftb3VudAUAAAAPbG9ja1N0YXJ0SGVpZ2h0BQAAAAxtZXJnZWRBbW91bnQFAAAAEW1lcmdlZFN0YXJ0SGVpZ2h0BQAAAANuaWwJAQAAAA1SZXdhcmRFbnRyaWVzAAAAAwUAAAAJaXNOZXdVc2VyBQAAAA51c2VyQWRkcmVzc1N0cgUAAAAKbG9ja0Ftb3VudAkBAAAAD0xvY2tQYXJhbXNFbnRyeQAAAAMFAAAAC3VzZXJBZGRyZXNzBQAAAAxtZXJnZWRBbW91bnQFAAAAEW1lcmdlZFN0YXJ0SGVpZ2h0BQAAAAxzdGF0c0VudHJpZXMAAAABaQEAAAAHdW5zdGFrZQAAAAEAAAAGYW1vdW50AwkBAAAAAiE9AAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAkAAAIAAAABAgAAACN1bnN0YWtlIGRvZXNuJ3QgcmVxdWlyZSBhbnkgcGF5bWVudAQAAAALdXNlckFkZHJlc3MIBQAAAAFpAAAABmNhbGxlcgQAAAAOdXNlckFk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AAAACnBtdEFzc2V0SWQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIIBQAAAANwbXQAAAAHYXNzZXRJZAUAAAAHV0FWRVNJRAQAAAANcG10QXNzZXRJZFN0cgkAAlgAAAABBQAAAApwbXRBc3NldElkBAAAAAhwbXRNdWx0WAMJAAAAAAAAAgUAAAAKcG10QXNzZXRJZAUAAAAHV0FWRVNJRAUAAAAGTVVMVFg4BQAAAAZNVUxUWDYEAAAAB2Ftb3VudFgJAAE2AAAAAQUAAAAGYW1vdW50BAAAAAt0b3RhbFN0YWtlZAkBAAAADGdldEludE9yRWxzZQAAAAIJAQAAABdrZXlMb2NrUGFyYW1Ub3RhbEFtb3VudAAAAAAAAAAAAAAAAAAEAAAADHRvdGFsU3Rha2VkWAkAATYAAAABBQAAAAt0b3RhbFN0YWtlZAMJAABmAAAAAgAAAAAAAAAAAAUAAAALdG90YWxTdGFrZWQJAAACAAAAAQIAAAAbVE9ETzogY2FzZSBpcyBub3Qgc3VwcG9ydGVkAwkAAAAAAAACBQAAAAt0b3RhbFN0YWtlZAAAAAAAAAAAAAkBAAAAIkluY3JlbWVudE5vdERpc3RyaWJ1dGVkUmV3YXJkRW50cnkAAAACBQAAAA1wbXRBc3NldElkU3RyBQAAAAZhbW91bnQEAAAAEHJld2FyZFBlck5zYnRYMTgJAAE8AAAAAwUAAAAHYW1vdW50WAUAAAAHTVVMVFgxOAUAAAAMdG90YWxTdGFrZWRYBAAAABFkZXBvc2l0TnVtTGFzdEtFWQkBAAAAEWtleURlcG9zaXROdW1MYXN0AAAAAAQAAAAOZGVwb3NpdE51bUxhc3QJAQAAAAxnZXRJbnRPckVsc2UAAAACBQAAABFkZXBvc2l0TnVtTGFzdEtFWQD//////////wQAAAANZGVwb3NpdE51bU5ldwkAAGQAAAACBQAAAA5kZXBvc2l0TnVtTGFzdAAAAAAAAAAAAQMJAQAAAAEhAAAAAQkBAAAACGNvbnRhaW5zAAAAAgUAAAASc3VwcG9ydGVkQXNzZXRzU3RyBQAAAA1wbXRBc3NldElkU3RyCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACBQAAABJzdXBwb3J0ZWRBc3NldHNTdHICAAAAESBkb2Vzbid0IGNvbnRhaW4gBQAA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AAAOdXNlckFkZHJlc3NTdHIEAAAADSR0MDIzMDQ4MjMxNTIJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAQAAABNnZXRVc2VyUGFyYW1zT3JVbml0AAAAAQUAAAALdXNlckFkZHJlc3MJAAUVAAAAAwYAAAAAAAAAAAAAAAAAAAAAAAAEAAAACWlzTmV3VXNlcggFAAAADSR0MDIzMDQ4MjMxNTIAAAACXzEEAAAAC3VzZXJOc2J0QW10CAUAAAANJHQwMjMwNDgyMzE1MgAAAAJfMgQAAAAMc3Rha2luZ1N0YXJ0CAUAAAANJHQwMjMwNDgyMzE1MgAAAAJfMwkABRQAAAACBQAAAANuaWwJAARMAAAAAgUAAAALdXNlck5zYnRBbXQJAARMAAAAAgUAAAAMdG90YWxOc2J0QW10CQAETAAAAAIFAAAADHN0YWtpbmdTdGFydAUAAAADbmlsAAAAAQAAAAJ0eAEAAAAGdmVyaWZ5AAAAAAQAAAATcHViS2V5QWRtaW5zTGlzdFN0cgkABLkAAAACCQAETAAAAAICAAAALEdKZExTYUxpdjVLN3h1ZWphYzhtY1JjSG95bzNkUHJFU3J2a3RHM2E2TUFSCQAETAAAAAICAAAALEVZd1ptVVJkNUtLYVFSQmpzVmE2ZzhEUGlzRm9TNlNvdlJKdEZpTDVnTUhVCQAETAAAAAICAAAALER0bUFmdURkQ3JISzhzcGRBZUFZenE2TXNaZWdlRDlnbnNycHVUUmtDYlZBCQAETAAAAAICAAAALDVXUlhGU2p3Y1RiTmZLY0pzOFpxWG1TU1dZc1NWSlV0TXZNcVpqNWhINE5jBQAAAANuaWwFAAAAA1NFUAQAAAAQcHViS2V5QWRtaW5zTGlzdAkABLUAAAACCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAAD2NvbnRyb2xDb250cmFjdAIAAAAMJXNfX211bHRpc2lnBQAAABNwdWJLZXlBZG1pbnNMaXN0U3RyBQAAAANTRVAEAAAABWNvdW50CQAAZAAAAAIJAABkAAAAAgkAAGQAAAACAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAJAAJZAAAAAQkAAZEAAAACBQAAABBwdWJLZXlBZG1pbnNMaXN0AAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAEJAAJZAAAAAQkAAZEAAAACBQAAABBwdWJLZXlBZG1pbnNMaXN0AAAAAAAAAAABAAAAAAAAAAABAAAAAAAAAAAAAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAIJAAJZAAAAAQkAAZEAAAACBQAAABBwdWJLZXlBZG1pbnNMaXN0AAAAAAAAAAACAAAAAAAAAAABAAAAAAAAAAAAAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAMJAAJZAAAAAQkAAZEAAAACBQAAABBwdWJLZXlBZG1pbnNMaXN0AAAAAAAAAAADAAAAAAAAAAACAAAAAAAAAAAACQAAZwAAAAIFAAAABWNvdW50AAAAAAAAAAADdqWOxA==", "chainId": 87, "height": 3336166, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 24XWyrzVBWBFbvMCBpUzntzxhT7R5zqdh2HJ47vNwbY4 Next: AyMiW85d5HfV6hPQxuAfFS4sGWDyUFnCZsKdYUJHPvDM Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let revisionNum = "cbd0bdc8bbba91db64066b16a84913a4c965e23e"
4+let revisionNum = "6a94b841b387e5d4bd8be8f8ed5f80057ef86186"
55
66 let separator = "__"
77
2020 let WAVESIDSTR = "WAVES"
2121
2222 let WAVESID = fromBase58String(WAVESIDSTR)
23+
24+let DAYMILLIS = 86400000
2325
2426 let IdxControlCfgNeutrinoDapp = 1
2527
9597
9698
9799 func keyStatsUsersCount () = makeString(["%s%s", "stats", "activeUsersCount"], separator)
100+
101+
102+func keyStatsDepositAmtByDay (timestamp) = makeString(["%s%s%d", "stats", "depositAmtByDay", toString(timestamp)], separator)
103+
104+
105+func keyStatsDepositAmtTotals () = makeString(["%s%s%d", "stats", "depositAmtTotals"], separator)
98106
99107
100108 func keyNextPeriod () = "%s__nextPeriod"
205213 }
206214
207215
216+func toStartOfDay (timestamp) = ((timestamp / DAYMILLIS) * DAYMILLIS)
217+
218+
219+func findElementPosition (src,element,sep) = {
220+ let elementStart = valueOrErrorMessage(indexOf(src, element), ((("there is no substring " + element) + " in ") + src))
221+ if ((elementStart == 0))
222+ then 0
223+ else {
224+ let left = take(src, elementStart)
225+ (size(split(left, sep)) - 1)
226+ }
227+ }
228+
229+
230+let DepositTotalsPREFIX = "%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d"
231+
232+func updateDepositTotals (currVal,idxToUpdate,deltaAmt) = {
233+ let currArr = split(currVal, SEP)
234+ func updDepTotByIdx (idx) = if ((idx != idxToUpdate))
235+ then currArr[idx]
236+ else toString((parseIntValue(currArr[idx]) + deltaAmt))
237+
238+ makeString([DepositTotalsPREFIX, updDepTotByIdx(1), updDepTotByIdx(2), updDepTotByIdx(3), updDepTotByIdx(4), updDepTotByIdx(5), updDepTotByIdx(6), updDepTotByIdx(7), updDepTotByIdx(8), updDepTotByIdx(9), updDepTotByIdx(10), updDepTotByIdx(11), updDepTotByIdx(12), updDepTotByIdx(13), updDepTotByIdx(14), updDepTotByIdx(15), updDepTotByIdx(16), updDepTotByIdx(17), updDepTotByIdx(18)], SEP)
239+ }
240+
241+
242+func DepositsTotalsEntries (depositAmount,assetIdStr) = {
243+ let startOfDay = toStartOfDay(lastBlock.timestamp)
244+ let byDayKEY = keyStatsDepositAmtByDay(startOfDay)
245+ let totalsKEY = keyStatsDepositAmtTotals()
246+ let position = findElementPosition(supportedAssetsStr, assetIdStr, "_")
247+ let defaultDATA = (DepositTotalsPREFIX + "__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0")
248+ let currTotalsDATA = valueOrElse(getString(this, totalsKEY), defaultDATA)
249+ let newTotalsDATA = updateDepositTotals(currTotalsDATA, (position + 1), depositAmount)
250+[StringEntry(totalsKEY, newTotalsDATA), StringEntry(byDayKEY, newTotalsDATA)]
251+ }
252+
253+
208254 func RewardEntries (isNewUser,userAddress,stakedAmount) = {
209255 let stakedAmountX = toBigInt(stakedAmount)
210256 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddress)
211257 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
212258 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
213259 func forEachAssetCacheUserReward (accum,asset) = {
214- let $t084508585 = calcReward(userAddress, asset, stakedAmountX, depositNumUser, depositNumLast)
215- let rewardTotal = $t084508585._1
216- let cached = $t084508585._2
217- let dynamic = $t084508585._3
218- let rewardCachedPartKEY = $t084508585._4
260+ let $t01057710712 = calcReward(userAddress, asset, stakedAmountX, depositNumUser, depositNumLast)
261+ let rewardTotal = $t01057710712._1
262+ let cached = $t01057710712._2
263+ let dynamic = $t01057710712._3
264+ let rewardCachedPartKEY = $t01057710712._4
219265 (accum :+ IntegerEntry(rewardCachedPartKEY, rewardTotal))
220266 }
221267
242288
243289 func $f0_2 ($a,$i) = if (($i >= $s))
244290 then $a
245- else throw("List size exceeds 10")
291+ else throw("List size exceeds 9")
246292
247- $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)
293+ $f0_2($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)
248294 } :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast))
249295 else throw(((("uncovered condition: depositNumLast=" + toString(depositNumLast)) + " depositNumUser=") + toString(depositNumUser)))
250296 }
262308 if ((size(i.payments) > 0))
263309 then throw("payments are not accepted")
264310 else {
265- let $t01152911634 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
266- let isNewUser = $t01152911634._1
267- let stakedAmount = $t01152911634._2
268- let stakingStart = $t01152911634._3
311+ let $t01365513760 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
312+ let isNewUser = $t01365513760._1
313+ let stakedAmount = $t01365513760._2
314+ let stakingStart = $t01365513760._3
269315 let stakedAmountX = toBigInt(stakedAmount)
270316 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
271317 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
272318 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
273319 func forEachAssetCalcUnclaimedReward (accum,asset) = {
274- let $t01200512143 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
275- let rewardTotal = $t01200512143._1
276- let cached = $t01200512143._2
277- let dynamic = $t01200512143._3
278- let rewardCachedPartKEY = $t01200512143._4
320+ let $t01413114269 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
321+ let rewardTotal = $t01413114269._1
322+ let cached = $t01413114269._2
323+ let dynamic = $t01413114269._3
324+ let rewardCachedPartKEY = $t01413114269._4
279325 let claimedKEY = keyClaimed(userAddressStr, asset)
280- let $t01220312240 = accum
281- let data = $t01220312240._1
282- let claimedAmtByAsset = $t01220312240._2
326+ let $t01432914366 = accum
327+ let data = $t01432914366._1
328+ let claimedAmtByAsset = $t01432914366._2
283329 let newPart = makeString([asset, toString(rewardTotal)], ":")
284330 let claimedAmtByAssetNew = makeString([claimedAmtByAsset, newPart], "_")
285331 if ((0 >= rewardTotal))
287333 else $Tuple2((((data :+ ScriptTransfer(userAddress, rewardTotal, toAssetVect(asset))) :+ IntegerEntry(claimedKEY, (valueOrElse(getInteger(claimedKEY), 0) + rewardTotal))) :+ IntegerEntry(rewardCachedPartKEY, 0)), claimedAmtByAssetNew)
288334 }
289335
290- let $t01270012814 = {
336+ let $t01482614939 = {
291337 let $l = supportedAssetsList
292338 let $s = size($l)
293339 let $acc0 = $Tuple2(nil, "")
297343
298344 func $f0_2 ($a,$i) = if (($i >= $s))
299345 then $a
300- else throw("List size exceeds 10")
346+ else throw("List size exceeds 9")
301347
302- $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)
348+ $f0_2($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)
303349 }
304- let transfers = $t01270012814._1
305- let claimedAmtByAssetResult = $t01270012814._2
350+ let transfers = $t01482614939._1
351+ let claimedAmtByAssetResult = $t01482614939._2
306352 if ((0 >= size(transfers)))
307- then nil
308- else ((transfers :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)) :+ ClaimHistoryEntry(userAddress, i.transactionId, drop(claimedAmtByAssetResult, 1)))
353+ then $Tuple2(nil, 0)
354+ else $Tuple2(((transfers :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)) :+ ClaimHistoryEntry(userAddress, i.transactionId, drop(claimedAmtByAssetResult, 1))), size(transfers))
309355 }
310356 }
311357
319365
320366 @Callable(i)
321367 func stake () = {
322- let $t01363813700 = getParamsOrFail()
323- let bondAssetId = $t01363813700._1
324- let minLockAmount = $t01363813700._2
325- let halfLife = $t01363813700._3
368+ let $t01578815850 = getParamsOrFail()
369+ let bondAssetId = $t01578815850._1
370+ let minLockAmount = $t01578815850._2
371+ let halfLife = $t01578815850._3
326372 if ((size(i.payments) != 1))
327373 then throw("Invalid payments size")
328374 else {
335381 else {
336382 let userAddress = i.caller
337383 let userAddressStr = toString(i.caller)
338- let $t01424214349 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, -1))
339- let isNewUser = $t01424214349._1
340- let lockAmount = $t01424214349._2
341- let lockStartHeight = $t01424214349._3
384+ let $t01639216499 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, -1))
385+ let isNewUser = $t01639216499._1
386+ let lockAmount = $t01639216499._2
387+ let lockStartHeight = $t01639216499._3
342388 let mergedAmount = if (isNewUser)
343389 then amount
344390 else (amount + lockAmount)
348394 if ((minLockAmount > mergedAmount))
349395 then throw(("Min lock amount is " + toString(minLockAmount)))
350396 else {
351- let $t01471014812 = StatsResult(amount, 1, if (isNewUser)
397+ let $t01686016962 = StatsResult(amount, 1, if (isNewUser)
352398 then 1
353399 else 0)
354- let statsEntries = $t01471014812._1
355- let totalStaked = $t01471014812._2
356- let totalStakedNew = $t01471014812._3
400+ let statsEntries = $t01686016962._1
401+ let totalStaked = $t01686016962._2
402+ let totalStakedNew = $t01686016962._3
357403 ((([HistoryRecordEntry("stake", userAddress, i.transactionId, lockAmount, lockStartHeight, mergedAmount, mergedStartHeight)] ++ RewardEntries(isNewUser, userAddressStr, lockAmount)) ++ LockParamsEntry(userAddress, mergedAmount, mergedStartHeight)) ++ statsEntries)
358404 }
359405 }
368414 else {
369415 let userAddress = i.caller
370416 let userAddressStr = toString(userAddress)
371- let $t01529815360 = getParamsOrFail()
372- let bondAssetId = $t01529815360._1
373- let minLockAmount = $t01529815360._2
374- let halfLife = $t01529815360._3
375- let $t01536315437 = getUserParamsOrFail(userAddress)
376- let isNewUser = $t01536315437._1
377- let lockAmount = $t01536315437._2
378- let lockStart = $t01536315437._3
417+ let $t01744817510 = getParamsOrFail()
418+ let bondAssetId = $t01744817510._1
419+ let minLockAmount = $t01744817510._2
420+ let halfLife = $t01744817510._3
421+ let $t01751317587 = getUserParamsOrFail(userAddress)
422+ let isNewUser = $t01751317587._1
423+ let lockAmount = $t01751317587._2
424+ let lockStart = $t01751317587._3
379425 if ((0 >= lockAmount))
380426 then throw("Nothing to unstake")
381427 else if ((amount > lockAmount))
382428 then throw(((("Requested " + toString(amount)) + ", but staked only ") + toString(lockAmount)))
383429 else {
384430 let comissionAmount = asInt(invoke(mathContract, "getUnstakeComissionAmountREADONLY", [amount, lockStart, halfLife], nil))
385- let $t01575115905 = StatsResult(-(amount), if ((amount == lockAmount))
431+ let $t01790118055 = StatsResult(-(amount), if ((amount == lockAmount))
386432 then -1
387433 else 0, if ((amount == lockAmount))
388434 then -1
389435 else 0)
390- let statsEntries = $t01575115905._1
391- let totalStaked = $t01575115905._2
392- let totalStakedNew = $t01575115905._3
436+ let statsEntries = $t01790118055._1
437+ let totalStaked = $t01790118055._2
438+ let totalStakedNew = $t01790118055._3
393439 ((([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)
394440 }
395441 }
430476 else StringEntry(rewardPerNsbtSumNewKEY, sumLastStr)))
431477 }
432478
433- ({
479+ (({
434480 let $l = supportedAssetsList
435481 let $s = size($l)
436482 let $acc0 = nil
440486
441487 func $f0_2 ($a,$i) = if (($i >= $s))
442488 then $a
443- else throw("List size exceeds 10")
489+ else throw("List size exceeds 9")
444490
445- $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)
446- } :+ IntegerEntry(depositNumLastKEY, depositNumNew))
491+ $f0_2($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)
492+ } :+ IntegerEntry(depositNumLastKEY, depositNumNew)) ++ DepositsTotalsEntries(amount, pmtAssetIdStr))
447493 }
448494 }
449495 }
475521
476522 func $f0_2 ($a,$i) = if (($i >= $s))
477523 then $a
478- else throw("List size exceeds 10")
524+ else throw("List size exceeds 9")
479525
480- $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)
526+ $f0_2($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)
481527 }
482528 else {
483529 let userAddress = addressFromStringValue(userAddressStr)
484- let $t01858118686 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
485- let isNewUser = $t01858118686._1
486- let stakedAmount = $t01858118686._2
487- let stakingStart = $t01858118686._3
530+ let $t02078120886 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
531+ let isNewUser = $t02078120886._1
532+ let stakedAmount = $t02078120886._2
533+ let stakingStart = $t02078120886._3
488534 let stakedAmountX = toBigInt(stakedAmount)
489535 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
490536 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
491537 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
492538 func forEachAssetCalcUnclaimedReward (accum,asset) = {
493- let $t01903219170 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
494- let rewardTotal = $t01903219170._1
495- let cached = $t01903219170._2
496- let dynamic = $t01903219170._3
497- let rewardCachedPartKEY = $t01903219170._4
539+ let $t02123221370 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
540+ let rewardTotal = $t02123221370._1
541+ let cached = $t02123221370._2
542+ let dynamic = $t02123221370._3
543+ let rewardCachedPartKEY = $t02123221370._4
498544 let claimed = valueOrElse(getInteger(keyClaimed(userAddressStr, asset)), 0)
499545 ((accum + makeString([asset, toString(rewardTotal), toString(claimed)], ":")) + "_")
500546 }
508554
509555 func $f0_2 ($a,$i) = if (($i >= $s))
510556 then $a
511- else throw("List size exceeds 10")
557+ else throw("List size exceeds 9")
512558
513- $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)
559+ $f0_2($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)
514560 }
515561 $Tuple2(nil, dropRight(unclaimedRewardStr, 1))
516562 }
553599 then $Tuple2(nil, [0, totalNsbtAmt, 0])
554600 else {
555601 let userAddress = toAddressOrFail(userAddressStr)
556- let $t02084920953 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
557- let isNewUser = $t02084920953._1
558- let userNsbtAmt = $t02084920953._2
559- let stakingStart = $t02084920953._3
602+ let $t02304823152 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
603+ let isNewUser = $t02304823152._1
604+ let userNsbtAmt = $t02304823152._2
605+ let stakingStart = $t02304823152._3
560606 $Tuple2(nil, [userNsbtAmt, totalNsbtAmt, stakingStart])
561607 }
562608 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let revisionNum = "cbd0bdc8bbba91db64066b16a84913a4c965e23e"
4+let revisionNum = "6a94b841b387e5d4bd8be8f8ed5f80057ef86186"
55
66 let separator = "__"
77
88 let SEP = "__"
99
1010 let MULT6 = 1000000
1111
1212 let MULT8 = 100000000
1313
1414 let MULTX6 = toBigInt(MULT6)
1515
1616 let MULTX8 = toBigInt(MULT8)
1717
1818 let MULTX18 = toBigInt(1000000000000000000)
1919
2020 let WAVESIDSTR = "WAVES"
2121
2222 let WAVESID = fromBase58String(WAVESIDSTR)
23+
24+let DAYMILLIS = 86400000
2325
2426 let IdxControlCfgNeutrinoDapp = 1
2527
2628 let IdxControlCfgAuctionDapp = 2
2729
2830 let IdxControlCfgRpdDapp = 3
2931
3032 let IdxControlCfgMathDapp = 4
3133
3234 let IdxControlCfgLiquidationDapp = 5
3335
3436 let IdxControlCfgRestDapp = 6
3537
3638 let IdxControlCfgNodeRegistryDapp = 7
3739
3840 let IdxControlCfgNsbtStakingDapp = 8
3941
4042 let IdxControlCfgMediatorDapp = 9
4143
4244 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), (((("mandatory " + toString(address)) + ".") + key) + " is not defined"))
4345
4446
4547 func keyControlAddress () = "%s%s__config__controlAddress"
4648
4749
4850 func keyControlCfg () = "%s__controlConfig"
4951
5052
5153 func readControlCfgOrFail (control) = split(getStringOrFail(control, keyControlCfg()), SEP)
5254
5355
5456 func getContractAddressOrFail (controlCfg,idx) = valueOrErrorMessage(addressFromString(controlCfg[idx]), ("Control cfg doesn't contain address at index " + toString(idx)))
5557
5658
5759 let controlContract = addressFromStringValue(valueOrElse(getString(this, keyControlAddress()), "3P5Bfd58PPfNvBM2Hy8QfbcDqMeNtzg7KfP"))
5860
5961 let controlCfg = readControlCfgOrFail(controlContract)
6062
6163 let mathContract = getContractAddressOrFail(controlCfg, IdxControlCfgMathDapp)
6264
6365 let neutrinoContract = getContractAddressOrFail(controlCfg, IdxControlCfgNeutrinoDapp)
6466
6567 let auctionContract = getContractAddressOrFail(controlCfg, IdxControlCfgAuctionDapp)
6668
6769 func keyBondAsset () = "bond_asset_id"
6870
6971
7072 func keyNeutrinoContractAddress () = "%s__neutrinoContractAddress"
7173
7274
7375 func keyMathContractAddress () = "%s__mathContract"
7476
7577
7678 func keyMinLockAmount () = "%s__minLockAmount"
7779
7880
7981 func keyHalfLife () = "%s__halfLife"
8082
8183
8284 func keyLockParamUserAmount (userAddress) = makeString(["%s%s%s", "paramByUser", toString(userAddress), "amount"], separator)
8385
8486
8587 func keyLockParamStartBlock (userAddress) = makeString(["%s%s%s", "paramByUser", toString(userAddress), "start"], separator)
8688
8789
8890 func keyHistoryRecord (type,userAddress,txId) = makeString(["%s%s%s%s", "history", type, toString(userAddress), toBase58String(txId)], separator)
8991
9092
9193 func keyLockParamTotalAmount () = makeString(["%s%s", "stats", "activeTotalLocked"], separator)
9294
9395
9496 func keyStatsLocksCount () = makeString(["%s%s", "stats", "locksCount"], separator)
9597
9698
9799 func keyStatsUsersCount () = makeString(["%s%s", "stats", "activeUsersCount"], separator)
100+
101+
102+func keyStatsDepositAmtByDay (timestamp) = makeString(["%s%s%d", "stats", "depositAmtByDay", toString(timestamp)], separator)
103+
104+
105+func keyStatsDepositAmtTotals () = makeString(["%s%s%d", "stats", "depositAmtTotals"], separator)
98106
99107
100108 func keyNextPeriod () = "%s__nextPeriod"
101109
102110
103111 func keySupportedRewardAssets () = "supportedRewardAssets"
104112
105113
106114 func keyDepositNumLast () = makeString(["%s%s%s", "dep", "lastNum"], separator)
107115
108116
109117 func keyUserRewardFromDepositNum (userAddress) = makeString(["%s%s%s", "userRwdFromDepNum", userAddress], separator)
110118
111119
112120 func keyRewardPerNsbtSumAt (depositNum,tkn) = makeString(["%s%d", "rwdPerNsbtSumByDepNum", toString(depositNum), tkn], separator)
113121
114122
115123 func keyReward (userAddress,tkn) = makeString(["%s%s%s", "rwd", userAddress, tkn], separator)
116124
117125
118126 func keyClaimed (userAddress,tkn) = makeString(["%s%s%s", "clm", userAddress, tkn], separator)
119127
120128
121129 func keyNotDistributedReward (tkn) = makeString(["%s%s", "notDistributed", tkn], separator)
122130
123131
124132 func toX18 (origVal,origMult) = fraction(toBigInt(origVal), MULTX18, origMult)
125133
126134
127135 func getIntOrZero (key) = valueOrElse(getInteger(this, key), 0)
128136
129137
130138 func getIntOrElse (key,defaultVal) = valueOrElse(getInteger(this, key), defaultVal)
131139
132140
133141 func getIntOrFail (key) = valueOrErrorMessage(getInteger(this, key), (("Mandatory this." + key) + " is not defined"))
134142
135143
136144 func getStrOrElse (key,defaultVal) = valueOrElse(getString(this, key), defaultVal)
137145
138146
139147 func toAddressOrFail (addressStr) = valueOrErrorMessage(addressFromString(addressStr), ("couldn't parse passed addressStr=" + addressStr))
140148
141149
142150 func toAssetVect (assetStr) = if ((assetStr == WAVESIDSTR))
143151 then unit
144152 else fromBase58String(assetStr)
145153
146154
147155 func asInt (val) = match val {
148156 case valInt: Int =>
149157 valInt
150158 case _ =>
151159 throw("fail to cast into Int")
152160 }
153161
154162
155163 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)
156164
157165
158166 func formatClaimHistoryRecord (user,claimedRewards) = makeString(["%s%d%d%s", user, toString(lastBlock.height), toString(lastBlock.timestamp), claimedRewards], separator)
159167
160168
161169 func HistoryRecordEntry (type,userAddress,txId,oldAmount,oldStart,newAmount,newStart) = StringEntry(keyHistoryRecord(type, userAddress, txId), formatHistoryRecord(oldAmount, oldStart, newAmount, newStart))
162170
163171
164172 func ClaimHistoryEntry (userAddress,txId,claimedRewards) = StringEntry(keyHistoryRecord("claim", userAddress, txId), formatClaimHistoryRecord(toString(userAddress), claimedRewards))
165173
166174
167175 func StatsResult (totalLockedInc,lockCountInc,usersCountInc) = {
168176 let locksCount = getIntOrZero(keyStatsLocksCount())
169177 let usersCount = getIntOrZero(keyStatsUsersCount())
170178 let totalAmount = getIntOrZero(keyLockParamTotalAmount())
171179 let totalAmountNew = (totalAmount + totalLockedInc)
172180 $Tuple3([IntegerEntry(keyStatsLocksCount(), (locksCount + lockCountInc)), IntegerEntry(keyStatsUsersCount(), (usersCount + usersCountInc)), IntegerEntry(keyLockParamTotalAmount(), totalAmountNew)], totalAmount, totalAmountNew)
173181 }
174182
175183
176184 func LockParamsEntry (userAddress,amount,start) = [IntegerEntry(keyLockParamUserAmount(userAddress), amount), IntegerEntry(keyLockParamStartBlock(userAddress), start)]
177185
178186
179187 func getParamsOrFail () = $Tuple3(fromBase58String(getStringValue(neutrinoContract, keyBondAsset())), getIntOrFail(keyMinLockAmount()), getIntOrFail(keyHalfLife()))
180188
181189
182190 func isActiveUser (userAddress) = (getIntOrElse(keyLockParamUserAmount(userAddress), 0) > 0)
183191
184192
185193 func getUserParamsOrUnit (userAddress) = if (isActiveUser(userAddress))
186194 then $Tuple3(false, getIntOrFail(keyLockParamUserAmount(userAddress)), getIntOrFail(keyLockParamStartBlock(userAddress)))
187195 else unit
188196
189197
190198 func getUserParamsOrFail (userAddress) = valueOrErrorMessage(getUserParamsOrUnit(userAddress), (("User " + toString(userAddress)) + " is not defined"))
191199
192200
193201 let supportedAssetsStr = getStrOrElse(keySupportedRewardAssets(), "")
194202
195203 let supportedAssetsList = split(supportedAssetsStr, "_")
196204
197205 func calcReward (userAddress,assetId,stakedAmountX,depositNumUser,depositNumLast) = {
198206 let rewardPerNsbtSumLastKEY = keyRewardPerNsbtSumAt(depositNumLast, assetId)
199207 let sumLastX18 = parseBigIntValue(getStrOrElse(keyRewardPerNsbtSumAt(depositNumLast, assetId), "0"))
200208 let sumUserX18 = parseBigIntValue(getStrOrElse(keyRewardPerNsbtSumAt(depositNumUser, assetId), "0"))
201209 let rewardDynamicPart = toInt(fraction((sumLastX18 - sumUserX18), stakedAmountX, MULTX18))
202210 let rewardCachedPartKEY = keyReward(userAddress, assetId)
203211 let rewardCachedPart = getIntOrElse(rewardCachedPartKEY, 0)
204212 $Tuple4((rewardCachedPart + rewardDynamicPart), rewardCachedPart, rewardDynamicPart, rewardCachedPartKEY)
205213 }
206214
207215
216+func toStartOfDay (timestamp) = ((timestamp / DAYMILLIS) * DAYMILLIS)
217+
218+
219+func findElementPosition (src,element,sep) = {
220+ let elementStart = valueOrErrorMessage(indexOf(src, element), ((("there is no substring " + element) + " in ") + src))
221+ if ((elementStart == 0))
222+ then 0
223+ else {
224+ let left = take(src, elementStart)
225+ (size(split(left, sep)) - 1)
226+ }
227+ }
228+
229+
230+let DepositTotalsPREFIX = "%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d"
231+
232+func updateDepositTotals (currVal,idxToUpdate,deltaAmt) = {
233+ let currArr = split(currVal, SEP)
234+ func updDepTotByIdx (idx) = if ((idx != idxToUpdate))
235+ then currArr[idx]
236+ else toString((parseIntValue(currArr[idx]) + deltaAmt))
237+
238+ makeString([DepositTotalsPREFIX, updDepTotByIdx(1), updDepTotByIdx(2), updDepTotByIdx(3), updDepTotByIdx(4), updDepTotByIdx(5), updDepTotByIdx(6), updDepTotByIdx(7), updDepTotByIdx(8), updDepTotByIdx(9), updDepTotByIdx(10), updDepTotByIdx(11), updDepTotByIdx(12), updDepTotByIdx(13), updDepTotByIdx(14), updDepTotByIdx(15), updDepTotByIdx(16), updDepTotByIdx(17), updDepTotByIdx(18)], SEP)
239+ }
240+
241+
242+func DepositsTotalsEntries (depositAmount,assetIdStr) = {
243+ let startOfDay = toStartOfDay(lastBlock.timestamp)
244+ let byDayKEY = keyStatsDepositAmtByDay(startOfDay)
245+ let totalsKEY = keyStatsDepositAmtTotals()
246+ let position = findElementPosition(supportedAssetsStr, assetIdStr, "_")
247+ let defaultDATA = (DepositTotalsPREFIX + "__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0")
248+ let currTotalsDATA = valueOrElse(getString(this, totalsKEY), defaultDATA)
249+ let newTotalsDATA = updateDepositTotals(currTotalsDATA, (position + 1), depositAmount)
250+[StringEntry(totalsKEY, newTotalsDATA), StringEntry(byDayKEY, newTotalsDATA)]
251+ }
252+
253+
208254 func RewardEntries (isNewUser,userAddress,stakedAmount) = {
209255 let stakedAmountX = toBigInt(stakedAmount)
210256 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddress)
211257 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
212258 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
213259 func forEachAssetCacheUserReward (accum,asset) = {
214- let $t084508585 = calcReward(userAddress, asset, stakedAmountX, depositNumUser, depositNumLast)
215- let rewardTotal = $t084508585._1
216- let cached = $t084508585._2
217- let dynamic = $t084508585._3
218- let rewardCachedPartKEY = $t084508585._4
260+ let $t01057710712 = calcReward(userAddress, asset, stakedAmountX, depositNumUser, depositNumLast)
261+ let rewardTotal = $t01057710712._1
262+ let cached = $t01057710712._2
263+ let dynamic = $t01057710712._3
264+ let rewardCachedPartKEY = $t01057710712._4
219265 (accum :+ IntegerEntry(rewardCachedPartKEY, rewardTotal))
220266 }
221267
222268 if (if ((depositNumLast == -1))
223269 then (depositNumUser == -1)
224270 else false)
225271 then nil
226272 else if (if ((depositNumLast == -1))
227273 then (depositNumUser > -1)
228274 else false)
229275 then throw("invalid depositNumLast and depositNumUser state")
230276 else if (if ((depositNumLast > -1))
231277 then (depositNumUser >= -1)
232278 else false)
233279 then if (isNewUser)
234280 then [IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)]
235281 else ({
236282 let $l = supportedAssetsList
237283 let $s = size($l)
238284 let $acc0 = nil
239285 func $f0_1 ($a,$i) = if (($i >= $s))
240286 then $a
241287 else forEachAssetCacheUserReward($a, $l[$i])
242288
243289 func $f0_2 ($a,$i) = if (($i >= $s))
244290 then $a
245- else throw("List size exceeds 10")
291+ else throw("List size exceeds 9")
246292
247- $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)
293+ $f0_2($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)
248294 } :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast))
249295 else throw(((("uncovered condition: depositNumLast=" + toString(depositNumLast)) + " depositNumUser=") + toString(depositNumUser)))
250296 }
251297
252298
253299 func IncrementNotDistributedRewardEntry (tkn,amountInc) = {
254300 let notDistributedRewardKEY = keyNotDistributedReward(tkn)
255301 let notDistributedReward = getIntOrElse(notDistributedRewardKEY, 0)
256302 [IntegerEntry(notDistributedRewardKEY, (notDistributedReward + amountInc))]
257303 }
258304
259305
260306 func commonClaim (userAddress,i) = {
261307 let userAddressStr = toString(userAddress)
262308 if ((size(i.payments) > 0))
263309 then throw("payments are not accepted")
264310 else {
265- let $t01152911634 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
266- let isNewUser = $t01152911634._1
267- let stakedAmount = $t01152911634._2
268- let stakingStart = $t01152911634._3
311+ let $t01365513760 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
312+ let isNewUser = $t01365513760._1
313+ let stakedAmount = $t01365513760._2
314+ let stakingStart = $t01365513760._3
269315 let stakedAmountX = toBigInt(stakedAmount)
270316 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
271317 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
272318 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
273319 func forEachAssetCalcUnclaimedReward (accum,asset) = {
274- let $t01200512143 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
275- let rewardTotal = $t01200512143._1
276- let cached = $t01200512143._2
277- let dynamic = $t01200512143._3
278- let rewardCachedPartKEY = $t01200512143._4
320+ let $t01413114269 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
321+ let rewardTotal = $t01413114269._1
322+ let cached = $t01413114269._2
323+ let dynamic = $t01413114269._3
324+ let rewardCachedPartKEY = $t01413114269._4
279325 let claimedKEY = keyClaimed(userAddressStr, asset)
280- let $t01220312240 = accum
281- let data = $t01220312240._1
282- let claimedAmtByAsset = $t01220312240._2
326+ let $t01432914366 = accum
327+ let data = $t01432914366._1
328+ let claimedAmtByAsset = $t01432914366._2
283329 let newPart = makeString([asset, toString(rewardTotal)], ":")
284330 let claimedAmtByAssetNew = makeString([claimedAmtByAsset, newPart], "_")
285331 if ((0 >= rewardTotal))
286332 then $Tuple2(data, claimedAmtByAssetNew)
287333 else $Tuple2((((data :+ ScriptTransfer(userAddress, rewardTotal, toAssetVect(asset))) :+ IntegerEntry(claimedKEY, (valueOrElse(getInteger(claimedKEY), 0) + rewardTotal))) :+ IntegerEntry(rewardCachedPartKEY, 0)), claimedAmtByAssetNew)
288334 }
289335
290- let $t01270012814 = {
336+ let $t01482614939 = {
291337 let $l = supportedAssetsList
292338 let $s = size($l)
293339 let $acc0 = $Tuple2(nil, "")
294340 func $f0_1 ($a,$i) = if (($i >= $s))
295341 then $a
296342 else forEachAssetCalcUnclaimedReward($a, $l[$i])
297343
298344 func $f0_2 ($a,$i) = if (($i >= $s))
299345 then $a
300- else throw("List size exceeds 10")
346+ else throw("List size exceeds 9")
301347
302- $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)
348+ $f0_2($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)
303349 }
304- let transfers = $t01270012814._1
305- let claimedAmtByAssetResult = $t01270012814._2
350+ let transfers = $t01482614939._1
351+ let claimedAmtByAssetResult = $t01482614939._2
306352 if ((0 >= size(transfers)))
307- then nil
308- else ((transfers :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)) :+ ClaimHistoryEntry(userAddress, i.transactionId, drop(claimedAmtByAssetResult, 1)))
353+ then $Tuple2(nil, 0)
354+ else $Tuple2(((transfers :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)) :+ ClaimHistoryEntry(userAddress, i.transactionId, drop(claimedAmtByAssetResult, 1))), size(transfers))
309355 }
310356 }
311357
312358
313359 @Callable(i)
314360 func constructor (neutrinoContractAddress,mathContractAddress,minLockAmount,halfLife,supportedRewardAssets) = if ((i.caller != this))
315361 then throw("Permission denied")
316362 else [StringEntry(keyNeutrinoContractAddress(), neutrinoContractAddress), StringEntry(keyMathContractAddress(), mathContractAddress), IntegerEntry(keyMinLockAmount(), minLockAmount), IntegerEntry(keyHalfLife(), halfLife), StringEntry(keySupportedRewardAssets(), supportedRewardAssets)]
317363
318364
319365
320366 @Callable(i)
321367 func stake () = {
322- let $t01363813700 = getParamsOrFail()
323- let bondAssetId = $t01363813700._1
324- let minLockAmount = $t01363813700._2
325- let halfLife = $t01363813700._3
368+ let $t01578815850 = getParamsOrFail()
369+ let bondAssetId = $t01578815850._1
370+ let minLockAmount = $t01578815850._2
371+ let halfLife = $t01578815850._3
326372 if ((size(i.payments) != 1))
327373 then throw("Invalid payments size")
328374 else {
329375 let payment = i.payments[0]
330376 let amount = payment.amount
331377 let invalidAssetMessage = (("Invalid asset. " + toBase58String(bondAssetId)) + " is expected")
332378 let assetId = valueOrErrorMessage(payment.assetId, invalidAssetMessage)
333379 if ((assetId != bondAssetId))
334380 then throw(invalidAssetMessage)
335381 else {
336382 let userAddress = i.caller
337383 let userAddressStr = toString(i.caller)
338- let $t01424214349 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, -1))
339- let isNewUser = $t01424214349._1
340- let lockAmount = $t01424214349._2
341- let lockStartHeight = $t01424214349._3
384+ let $t01639216499 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, -1))
385+ let isNewUser = $t01639216499._1
386+ let lockAmount = $t01639216499._2
387+ let lockStartHeight = $t01639216499._3
342388 let mergedAmount = if (isNewUser)
343389 then amount
344390 else (amount + lockAmount)
345391 let mergedStartHeight = if (isNewUser)
346392 then height
347393 else asInt(invoke(mathContract, "mergeStakesREADONLY", [amount, height, lockAmount, lockStartHeight, halfLife], nil))
348394 if ((minLockAmount > mergedAmount))
349395 then throw(("Min lock amount is " + toString(minLockAmount)))
350396 else {
351- let $t01471014812 = StatsResult(amount, 1, if (isNewUser)
397+ let $t01686016962 = StatsResult(amount, 1, if (isNewUser)
352398 then 1
353399 else 0)
354- let statsEntries = $t01471014812._1
355- let totalStaked = $t01471014812._2
356- let totalStakedNew = $t01471014812._3
400+ let statsEntries = $t01686016962._1
401+ let totalStaked = $t01686016962._2
402+ let totalStakedNew = $t01686016962._3
357403 ((([HistoryRecordEntry("stake", userAddress, i.transactionId, lockAmount, lockStartHeight, mergedAmount, mergedStartHeight)] ++ RewardEntries(isNewUser, userAddressStr, lockAmount)) ++ LockParamsEntry(userAddress, mergedAmount, mergedStartHeight)) ++ statsEntries)
358404 }
359405 }
360406 }
361407 }
362408
363409
364410
365411 @Callable(i)
366412 func unstake (amount) = if ((size(i.payments) != 0))
367413 then throw("unstake doesn't require any payment")
368414 else {
369415 let userAddress = i.caller
370416 let userAddressStr = toString(userAddress)
371- let $t01529815360 = getParamsOrFail()
372- let bondAssetId = $t01529815360._1
373- let minLockAmount = $t01529815360._2
374- let halfLife = $t01529815360._3
375- let $t01536315437 = getUserParamsOrFail(userAddress)
376- let isNewUser = $t01536315437._1
377- let lockAmount = $t01536315437._2
378- let lockStart = $t01536315437._3
417+ let $t01744817510 = getParamsOrFail()
418+ let bondAssetId = $t01744817510._1
419+ let minLockAmount = $t01744817510._2
420+ let halfLife = $t01744817510._3
421+ let $t01751317587 = getUserParamsOrFail(userAddress)
422+ let isNewUser = $t01751317587._1
423+ let lockAmount = $t01751317587._2
424+ let lockStart = $t01751317587._3
379425 if ((0 >= lockAmount))
380426 then throw("Nothing to unstake")
381427 else if ((amount > lockAmount))
382428 then throw(((("Requested " + toString(amount)) + ", but staked only ") + toString(lockAmount)))
383429 else {
384430 let comissionAmount = asInt(invoke(mathContract, "getUnstakeComissionAmountREADONLY", [amount, lockStart, halfLife], nil))
385- let $t01575115905 = StatsResult(-(amount), if ((amount == lockAmount))
431+ let $t01790118055 = StatsResult(-(amount), if ((amount == lockAmount))
386432 then -1
387433 else 0, if ((amount == lockAmount))
388434 then -1
389435 else 0)
390- let statsEntries = $t01575115905._1
391- let totalStaked = $t01575115905._2
392- let totalStakedNew = $t01575115905._3
436+ let statsEntries = $t01790118055._1
437+ let totalStaked = $t01790118055._2
438+ let totalStakedNew = $t01790118055._3
393439 ((([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)
394440 }
395441 }
396442
397443
398444
399445 @Callable(i)
400446 func deposit () = if ((size(i.payments) != 1))
401447 then throw("exact 1 payment is allowed only")
402448 else {
403449 let pmt = i.payments[0]
404450 let amount = pmt.amount
405451 let pmtAssetId = valueOrElse(pmt.assetId, WAVESID)
406452 let pmtAssetIdStr = toBase58String(pmtAssetId)
407453 let pmtMultX = if ((pmtAssetId == WAVESID))
408454 then MULTX8
409455 else MULTX6
410456 let amountX = toBigInt(amount)
411457 let totalStaked = getIntOrElse(keyLockParamTotalAmount(), 0)
412458 let totalStakedX = toBigInt(totalStaked)
413459 if ((0 > totalStaked))
414460 then throw("TODO: case is not supported")
415461 else if ((totalStaked == 0))
416462 then IncrementNotDistributedRewardEntry(pmtAssetIdStr, amount)
417463 else {
418464 let rewardPerNsbtX18 = fraction(amountX, MULTX18, totalStakedX)
419465 let depositNumLastKEY = keyDepositNumLast()
420466 let depositNumLast = getIntOrElse(depositNumLastKEY, -1)
421467 let depositNumNew = (depositNumLast + 1)
422468 if (!(contains(supportedAssetsStr, pmtAssetIdStr)))
423469 then throw(((supportedAssetsStr + " doesn't contain ") + pmtAssetIdStr))
424470 else {
425471 func refreshRewardPerNsbtSUM (accum,nextAsset) = {
426472 let rewardPerNsbtSumNewKEY = keyRewardPerNsbtSumAt(depositNumNew, nextAsset)
427473 let sumLastStr = getStrOrElse(keyRewardPerNsbtSumAt(depositNumLast, nextAsset), "0")
428474 (accum :+ (if ((nextAsset == pmtAssetIdStr))
429475 then StringEntry(rewardPerNsbtSumNewKEY, toString((parseBigIntValue(sumLastStr) + rewardPerNsbtX18)))
430476 else StringEntry(rewardPerNsbtSumNewKEY, sumLastStr)))
431477 }
432478
433- ({
479+ (({
434480 let $l = supportedAssetsList
435481 let $s = size($l)
436482 let $acc0 = nil
437483 func $f0_1 ($a,$i) = if (($i >= $s))
438484 then $a
439485 else refreshRewardPerNsbtSUM($a, $l[$i])
440486
441487 func $f0_2 ($a,$i) = if (($i >= $s))
442488 then $a
443- else throw("List size exceeds 10")
489+ else throw("List size exceeds 9")
444490
445- $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)
446- } :+ IntegerEntry(depositNumLastKEY, depositNumNew))
491+ $f0_2($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)
492+ } :+ IntegerEntry(depositNumLastKEY, depositNumNew)) ++ DepositsTotalsEntries(amount, pmtAssetIdStr))
447493 }
448494 }
449495 }
450496
451497
452498
453499 @Callable(i)
454500 func claimRewards () = commonClaim(i.caller, i)
455501
456502
457503
458504 @Callable(i)
459505 func claimRewardsByOriginCaller () = commonClaim(i.originCaller, i)
460506
461507
462508
463509 @Callable(i)
464510 func unclaimedRewardsREADONLY (userAddressStr) = {
465511 func forEachAssetZeroReward (accum,asset) = ((accum + makeString([asset, "0", "0"], ":")) + "_")
466512
467513 let unclaimedRewardStr = if ((userAddressStr == ""))
468514 then {
469515 let $l = supportedAssetsList
470516 let $s = size($l)
471517 let $acc0 = ""
472518 func $f0_1 ($a,$i) = if (($i >= $s))
473519 then $a
474520 else forEachAssetZeroReward($a, $l[$i])
475521
476522 func $f0_2 ($a,$i) = if (($i >= $s))
477523 then $a
478- else throw("List size exceeds 10")
524+ else throw("List size exceeds 9")
479525
480- $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)
526+ $f0_2($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)
481527 }
482528 else {
483529 let userAddress = addressFromStringValue(userAddressStr)
484- let $t01858118686 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
485- let isNewUser = $t01858118686._1
486- let stakedAmount = $t01858118686._2
487- let stakingStart = $t01858118686._3
530+ let $t02078120886 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
531+ let isNewUser = $t02078120886._1
532+ let stakedAmount = $t02078120886._2
533+ let stakingStart = $t02078120886._3
488534 let stakedAmountX = toBigInt(stakedAmount)
489535 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
490536 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
491537 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
492538 func forEachAssetCalcUnclaimedReward (accum,asset) = {
493- let $t01903219170 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
494- let rewardTotal = $t01903219170._1
495- let cached = $t01903219170._2
496- let dynamic = $t01903219170._3
497- let rewardCachedPartKEY = $t01903219170._4
539+ let $t02123221370 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
540+ let rewardTotal = $t02123221370._1
541+ let cached = $t02123221370._2
542+ let dynamic = $t02123221370._3
543+ let rewardCachedPartKEY = $t02123221370._4
498544 let claimed = valueOrElse(getInteger(keyClaimed(userAddressStr, asset)), 0)
499545 ((accum + makeString([asset, toString(rewardTotal), toString(claimed)], ":")) + "_")
500546 }
501547
502548 let $l = supportedAssetsList
503549 let $s = size($l)
504550 let $acc0 = ""
505551 func $f0_1 ($a,$i) = if (($i >= $s))
506552 then $a
507553 else forEachAssetCalcUnclaimedReward($a, $l[$i])
508554
509555 func $f0_2 ($a,$i) = if (($i >= $s))
510556 then $a
511- else throw("List size exceeds 10")
557+ else throw("List size exceeds 9")
512558
513- $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)
559+ $f0_2($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)
514560 }
515561 $Tuple2(nil, dropRight(unclaimedRewardStr, 1))
516562 }
517563
518564
519565
520566 @Callable(i)
521567 func nsbtUnstakingSYSREADONLY (userAddressStrOrEmpty,unstakeAmtP) = {
522568 let resultArray = if ((userAddressStrOrEmpty == ""))
523569 then [0, 0, 0, 0]
524570 else {
525571 let userAddress = addressFromStringValue(userAddressStrOrEmpty)
526572 let cfgDATA = getParamsOrFail()
527573 let nsbtAssetId = cfgDATA._1
528574 let minLockAmount = cfgDATA._2
529575 let halfLife = cfgDATA._3
530576 let userDATA = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
531577 let isNewUser = userDATA._1
532578 let stakedAmount = userDATA._2
533579 let lockStart = userDATA._3
534580 let unstakeAmt = if ((unstakeAmtP > stakedAmount))
535581 then stakedAmount
536582 else unstakeAmtP
537583 let stakedAmountNEW = (stakedAmount - unstakeAmt)
538584 let comissionAmount = if ((unstakeAmt == 0))
539585 then 0
540586 else asInt(invoke(mathContract, "getUnstakeComissionAmountREADONLY", [unstakeAmt, lockStart, halfLife], nil))
541587 let receiveAmount = (unstakeAmt - comissionAmount)
542588 [stakedAmount, stakedAmountNEW, receiveAmount, comissionAmount]
543589 }
544590 $Tuple2(nil, resultArray)
545591 }
546592
547593
548594
549595 @Callable(i)
550596 func nsbtStakingSYSREADONLY (userAddressStr,nsbtDiff) = {
551597 let totalNsbtAmt = getIntOrElse(keyLockParamTotalAmount(), 0)
552598 if ((userAddressStr == ""))
553599 then $Tuple2(nil, [0, totalNsbtAmt, 0])
554600 else {
555601 let userAddress = toAddressOrFail(userAddressStr)
556- let $t02084920953 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
557- let isNewUser = $t02084920953._1
558- let userNsbtAmt = $t02084920953._2
559- let stakingStart = $t02084920953._3
602+ let $t02304823152 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
603+ let isNewUser = $t02304823152._1
604+ let userNsbtAmt = $t02304823152._2
605+ let stakingStart = $t02304823152._3
560606 $Tuple2(nil, [userNsbtAmt, totalNsbtAmt, stakingStart])
561607 }
562608 }
563609
564610
565611 @Verifier(tx)
566612 func verify () = {
567613 let pubKeyAdminsListStr = makeString(["GJdLSaLiv5K7xuejac8mcRcHoyo3dPrESrvktG3a6MAR", "EYwZmURd5KKaQRBjsVa6g8DPisFoS6SovRJtFiL5gMHU", "DtmAfuDdCrHK8spdAeAYzq6MsZegeD9gnsrpuTRkCbVA", "5WRXFSjwcTbNfKcJs8ZqXmSSWYsSVJUtMvMqZj5hH4Nc"], SEP)
568614 let pubKeyAdminsList = split(valueOrElse(getString(controlContract, "%s__multisig"), pubKeyAdminsListStr), SEP)
569615 let count = ((((if (sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(pubKeyAdminsList[0])))
570616 then 1
571617 else 0) + (if (sigVerify(tx.bodyBytes, tx.proofs[1], fromBase58String(pubKeyAdminsList[1])))
572618 then 1
573619 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[2], fromBase58String(pubKeyAdminsList[2])))
574620 then 1
575621 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[3], fromBase58String(pubKeyAdminsList[3])))
576622 then 2
577623 else 0))
578624 (count >= 3)
579625 }
580626

github/deemru/w8io/786bc32 
98.82 ms