tx · 8G2dAhiHhEbuuaAP2TdFzX1bkwfh2HycbVuLN7e8Yn2y

3PBiotFpqjRMkkeFBccnQNUXUopy7KFez5C:  -0.02600000 Waves

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

{ "type": 13, "id": "8G2dAhiHhEbuuaAP2TdFzX1bkwfh2HycbVuLN7e8Yn2y", "fee": 2600000, "feeAssetId": null, "timestamp": 1665668585769, "version": 1, "sender": "3PBiotFpqjRMkkeFBccnQNUXUopy7KFez5C", "senderPublicKey": "BYLtcNg4P4UcUd6tFdxeuhyRqgkYZujzyfwdEHNmo89c", "proofs": [ "5Rk3Lv48FkiTxmvBsd1HtxTLze6kmj948egSCYwzFYJbr3PiZLfaNYZEjVK7aWvZATWVZeqRYwiTxqh5dzvMVYRw" ], "script": "base64:BgIqCAISBQoDAQgIEgASABIDCgEBEgASABIAEgMKAQgSBAoCCAESAwoBARIAWQALcmV2aXNpb25OdW0CKDZhOTRiODQxYjM4N2U1ZDRiZDhiZThmOGVkNWY4MDA1N2VmODYxODYACXNlcGFyYXRvcgICX18AA1NFUAICX18ABU1VTFQ2AMCEPQAFTVVMVDgAgMLXLwAGTVVMVFg2CQC2AgEFBU1VTFQ2AAZNVUxUWDgJALYCAQUFTVVMVDgAB01VTFRYMTgJALYCAQCAgJC7utat8A0ACldBVkVTSURTVFICBVdBVkVTAAdXQVZFU0lECQDZBAEFCldBVkVTSURTVFIACURBWU1JTExJUwCAuJkpABlJZHhDb250cm9sQ2ZnTmV1dHJpbm9EYXBwAAEAGElkeENvbnRyb2xDZmdBdWN0aW9uRGFwcAACABRJZHhDb250cm9sQ2ZnUnBkRGFwcAADABVJZHhDb250cm9sQ2ZnTWF0aERhcHAABAAcSWR4Q29udHJvbENmZ0xpcXVpZGF0aW9uRGFwcAAFABVJZHhDb250cm9sQ2ZnUmVzdERhcHAABgAdSWR4Q29udHJvbENmZ05vZGVSZWdpc3RyeURhcHAABwAcSWR4Q29udHJvbENmZ05zYnRTdGFraW5nRGFwcAAIABlJZHhDb250cm9sQ2ZnTWVkaWF0b3JEYXBwAAkAHElkeENvbnRyb2xDZmdTdXJmU3Rha2luZ0RhcHAACgAgSWR4Q29udHJvbENmZ0duc2J0Q29udHJvbGxlckRhcHAACwEPZ2V0U3RyaW5nT3JGYWlsAgdhZGRyZXNzA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFB2FkZHJlc3MFA2tleQkArAICCQCsAgIJAKwCAgkArAICAgptYW5kYXRvcnkgCQClCAEFB2FkZHJlc3MCAS4FA2tleQIPIGlzIG5vdCBkZWZpbmVkARFrZXlDb250cm9sQWRkcmVzcwACHCVzJXNfX2NvbmZpZ19fY29udHJvbEFkZHJlc3MBDWtleUNvbnRyb2xDZmcAAhElc19fY29udHJvbENvbmZpZwEVa2V5R25zYnRGcm9tU3VyZkNvZWZmAAIdJXMlc19fY2ZnX19nbnNidEZyb21TdXJmQ29lZmYBFHJlYWRDb250cm9sQ2ZnT3JGYWlsAQdjb250cm9sCQC1CQIJAQ9nZXRTdHJpbmdPckZhaWwCBQdjb250cm9sCQENa2V5Q29udHJvbENmZwAFA1NFUAEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgpjb250cm9sQ2ZnA2lkeAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUKY29udHJvbENmZwUDaWR4CQCsAgICLUNvbnRyb2wgY2ZnIGRvZXNuJ3QgY29udGFpbiBhZGRyZXNzIGF0IGluZGV4IAkApAMBBQNpZHgAD2NvbnRyb2xDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQERa2V5Q29udHJvbEFkZHJlc3MAAiMzUDVCZmQ1OFBQZk52Qk0ySHk4UWZiY0RxTWVOdHpnN0tmUAAKY29udHJvbENmZwkBFHJlYWRDb250cm9sQ2ZnT3JGYWlsAQUPY29udHJvbENvbnRyYWN0AAxtYXRoQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQpjb250cm9sQ2ZnBRVJZHhDb250cm9sQ2ZnTWF0aERhcHAAEG5ldXRyaW5vQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQpjb250cm9sQ2ZnBRlJZHhDb250cm9sQ2ZnTmV1dHJpbm9EYXBwAA9hdWN0aW9uQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQpjb250cm9sQ2ZnBRhJZHhDb250cm9sQ2ZnQXVjdGlvbkRhcHAAEmduc2J0RnJvbVN1cmZDb2VmZgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEVa2V5R25zYnRGcm9tU3VyZkNvZWZmAACsAgEMa2V5Qm9uZEFzc2V0AAINYm9uZF9hc3NldF9pZAEZa2V5QXVjdGlvbkNvbnRyYWN0QWRkcmVzcwACEGF1Y3Rpb25fY29udHJhY3QBEGtleU1pbkxvY2tBbW91bnQAAhElc19fbWluTG9ja0Ftb3VudAEQa2V5U3Rha2VkQXNzZXRJZAACESVzX19zdGFrZWRBc3NldElkARZrZXlMb2NrUGFyYW1Vc2VyQW1vdW50AQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgtwYXJhbUJ5VXNlcgkAzAgCCQClCAEFC3VzZXJBZGRyZXNzCQDMCAICBmFtb3VudAUDbmlsBQlzZXBhcmF0b3IBFmtleUxvY2tQYXJhbVN0YXJ0QmxvY2sBC3VzZXJBZGRyZXNzCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICC3BhcmFtQnlVc2VyCQDMCAIJAKUIAQULdXNlckFkZHJlc3MJAMwIAgIFc3RhcnQFA25pbAUJc2VwYXJhdG9yASZrZXlMb2NrUGFyYW1Wb3RpbmdQb3dlckVmZmVjdGl2ZUhlaWdodAELdXNlckFkZHJlc3MJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgILcGFyYW1CeVVzZXIJAMwIAgkApQgBBQt1c2VyQWRkcmVzcwkAzAgCAhF2cEVmZmVjdGl2ZUhlaWdodAUDbmlsBQlzZXBhcmF0b3IBEGtleUhpc3RvcnlSZWNvcmQDBHR5cGULdXNlckFkZHJlc3MEdHhJZAkAuQkCCQDMCAICCCVzJXMlcyVzCQDMCAICB2hpc3RvcnkJAMwIAgUEdHlwZQkAzAgCCQClCAEFC3VzZXJBZGRyZXNzCQDMCAIJANgEAQUEdHhJZAUDbmlsBQlzZXBhcmF0b3IBF2tleUxvY2tQYXJhbVRvdGFsQW1vdW50AAkAuQkCCQDMCAICBCVzJXMJAMwIAgIFc3RhdHMJAMwIAgIRYWN0aXZlVG90YWxMb2NrZWQFA25pbAUJc2VwYXJhdG9yARJrZXlTdGF0c0xvY2tzQ291bnQACQC5CQIJAMwIAgIEJXMlcwkAzAgCAgVzdGF0cwkAzAgCAgpsb2Nrc0NvdW50BQNuaWwFCXNlcGFyYXRvcgESa2V5U3RhdHNVc2Vyc0NvdW50AAkAuQkCCQDMCAICBCVzJXMJAMwIAgIFc3RhdHMJAMwIAgIQYWN0aXZlVXNlcnNDb3VudAUDbmlsBQlzZXBhcmF0b3IBF2tleVN0YXRzRGVwb3NpdEFtdEJ5RGF5AQl0aW1lc3RhbXAJALkJAgkAzAgCAgYlcyVzJWQJAMwIAgIFc3RhdHMJAMwIAgIPZGVwb3NpdEFtdEJ5RGF5CQDMCAIJAKQDAQUJdGltZXN0YW1wBQNuaWwFCXNlcGFyYXRvcgEYa2V5U3RhdHNEZXBvc2l0QW10VG90YWxzAAkAuQkCCQDMCAICBiVzJXMlZAkAzAgCAgVzdGF0cwkAzAgCAhBkZXBvc2l0QW10VG90YWxzBQNuaWwFCXNlcGFyYXRvcgENa2V5TmV4dFBlcmlvZAACDiVzX19uZXh0UGVyaW9kARhrZXlTdXBwb3J0ZWRSZXdhcmRBc3NldHMAAhVzdXBwb3J0ZWRSZXdhcmRBc3NldHMBEWtleURlcG9zaXROdW1MYXN0AAkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgNkZXAJAMwIAgIHbGFzdE51bQUDbmlsBQlzZXBhcmF0b3IBG2tleVVzZXJSZXdhcmRGcm9tRGVwb3NpdE51bQELdXNlckFkZHJlc3MJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIRdXNlclJ3ZEZyb21EZXBOdW0JAMwIAgULdXNlckFkZHJlc3MFA25pbAUJc2VwYXJhdG9yARVrZXlSZXdhcmRQZXJOc2J0U3VtQXQCCmRlcG9zaXROdW0DdGtuCQC5CQIJAMwIAgIEJXMlZAkAzAgCAhVyd2RQZXJOc2J0U3VtQnlEZXBOdW0JAMwIAgkApAMBBQpkZXBvc2l0TnVtCQDMCAIFA3RrbgUDbmlsBQlzZXBhcmF0b3IBCWtleVJld2FyZAILdXNlckFkZHJlc3MDdGtuCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICA3J3ZAkAzAgCBQt1c2VyQWRkcmVzcwkAzAgCBQN0a24FA25pbAUJc2VwYXJhdG9yAQprZXlDbGFpbWVkAgt1c2VyQWRkcmVzcwN0a24JALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIDY2xtCQDMCAIFC3VzZXJBZGRyZXNzCQDMCAIFA3RrbgUDbmlsBQlzZXBhcmF0b3IBF2tleU5vdERpc3RyaWJ1dGVkUmV3YXJkAQN0a24JALkJAgkAzAgCAgQlcyVzCQDMCAICDm5vdERpc3RyaWJ1dGVkCQDMCAIFA3RrbgUDbmlsBQlzZXBhcmF0b3IBBXRvWDE4AgdvcmlnVmFsCG9yaWdNdWx0CQC8AgMJALYCAQUHb3JpZ1ZhbAUHTVVMVFgxOAUIb3JpZ011bHQBDGdldEludE9yWmVybwEDa2V5CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQAAAQxnZXRJbnRPckVsc2UCA2tleQpkZWZhdWx0VmFsCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQUKZGVmYXVsdFZhbAEMZ2V0SW50T3JGYWlsAQNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzBQNrZXkJAKwCAgkArAICAg9NYW5kYXRvcnkgdGhpcy4FA2tleQIPIGlzIG5vdCBkZWZpbmVkAQxnZXRTdHJPckVsc2UCA2tleQpkZWZhdWx0VmFsCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFA2tleQUKZGVmYXVsdFZhbAEPdG9BZGRyZXNzT3JGYWlsAQphZGRyZXNzU3RyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQUKYWRkcmVzc1N0cgkArAICAiFjb3VsZG4ndCBwYXJzZSBwYXNzZWQgYWRkcmVzc1N0cj0FCmFkZHJlc3NTdHIBC3RvQXNzZXRWZWN0AQhhc3NldFN0cgMJAAACBQhhc3NldFN0cgUKV0FWRVNJRFNUUgUEdW5pdAkA2QQBBQhhc3NldFN0cgEFYXNJbnQBA3ZhbAQHJG1hdGNoMAUDdmFsAwkAAQIFByRtYXRjaDACA0ludAQGdmFsSW50BQckbWF0Y2gwBQZ2YWxJbnQJAAIBAhVmYWlsIHRvIGNhc3QgaW50byBJbnQBEmFzU3dhcFBhcmFtc1NUUlVDVAEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAiMoSW50LCBJbnQsIEludCwgSW50LCBJbnQsIEludCwgSW50KQQGc3RydWN0BQckbWF0Y2gwBQZzdHJ1Y3QJAAIBAhVmYWlsIHRvIGNhc3QgaW50byBJbnQBE2Zvcm1hdEhpc3RvcnlSZWNvcmQECW9sZEFtb3VudAhvbGRTdGFydAluZXdBbW91bnQIbmV3U3RhcnQJALkJAgkAzAgCAgwlZCVkJWQlZCVkJWQJAMwIAgkApAMBCAUJbGFzdEJsb2NrBmhlaWdodAkAzAgCCQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAKQDAQUJb2xkQW1vdW50CQDMCAIJAKQDAQUIb2xkU3RhcnQJAMwIAgkApAMBBQluZXdBbW91bnQJAMwIAgkApAMBBQhuZXdTdGFydAUDbmlsBQlzZXBhcmF0b3IBGGZvcm1hdENsYWltSGlzdG9yeVJlY29yZAIEdXNlcg5jbGFpbWVkUmV3YXJkcwkAuQkCCQDMCAICCCVzJWQlZCVzCQDMCAIFBHVzZXIJAMwIAgkApAMBCAUJbGFzdEJsb2NrBmhlaWdodAkAzAgCCQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIFDmNsYWltZWRSZXdhcmRzBQNuaWwFCXNlcGFyYXRvcgESSGlzdG9yeVJlY29yZEVudHJ5BwR0eXBlC3VzZXJBZGRyZXNzBHR4SWQJb2xkQW1vdW50CG9sZFN0YXJ0CW5ld0Ftb3VudAhuZXdTdGFydAkBC1N0cmluZ0VudHJ5AgkBEGtleUhpc3RvcnlSZWNvcmQDBQR0eXBlBQt1c2VyQWRkcmVzcwUEdHhJZAkBE2Zvcm1hdEhpc3RvcnlSZWNvcmQEBQlvbGRBbW91bnQFCG9sZFN0YXJ0BQluZXdBbW91bnQFCG5ld1N0YXJ0ARFDbGFpbUhpc3RvcnlFbnRyeQMLdXNlckFkZHJlc3MEdHhJZA5jbGFpbWVkUmV3YXJkcwkBC1N0cmluZ0VudHJ5AgkBEGtleUhpc3RvcnlSZWNvcmQDAgVjbGFpbQULdXNlckFkZHJlc3MFBHR4SWQJARhmb3JtYXRDbGFpbUhpc3RvcnlSZWNvcmQCCQClCAEFC3VzZXJBZGRyZXNzBQ5jbGFpbWVkUmV3YXJkcwELU3RhdHNSZXN1bHQDDnRvdGFsTG9ja2VkSW5jDGxvY2tDb3VudEluYw11c2Vyc0NvdW50SW5jBApsb2Nrc0NvdW50CQEMZ2V0SW50T3JaZXJvAQkBEmtleVN0YXRzTG9ja3NDb3VudAAECnVzZXJzQ291bnQJAQxnZXRJbnRPclplcm8BCQESa2V5U3RhdHNVc2Vyc0NvdW50AAQLdG90YWxBbW91bnQJAQxnZXRJbnRPclplcm8BCQEXa2V5TG9ja1BhcmFtVG90YWxBbW91bnQABA50b3RhbEFtb3VudE5ldwkAZAIFC3RvdGFsQW1vdW50BQ50b3RhbExvY2tlZEluYwkAlQoDCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQESa2V5U3RhdHNMb2Nrc0NvdW50AAkAZAIFCmxvY2tzQ291bnQFDGxvY2tDb3VudEluYwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEmtleVN0YXRzVXNlcnNDb3VudAAJAGQCBQp1c2Vyc0NvdW50BQ11c2Vyc0NvdW50SW5jCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEXa2V5TG9ja1BhcmFtVG90YWxBbW91bnQABQ50b3RhbEFtb3VudE5ldwUDbmlsBQt0b3RhbEFtb3VudAUOdG90YWxBbW91bnROZXcBD0xvY2tQYXJhbXNFbnRyeQMLdXNlckFkZHJlc3MGYW1vdW50GnZvdGluZ1Bvd2VyRWZmZWN0aXZlSGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEWa2V5TG9ja1BhcmFtVXNlckFtb3VudAEFC3VzZXJBZGRyZXNzBQZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlMb2NrUGFyYW1TdGFydEJsb2NrAQULdXNlckFkZHJlc3MFGnZvdGluZ1Bvd2VyRWZmZWN0aXZlSGVpZ2h0BQNuaWwBD2dldFBhcmFtc09yRmFpbAAJAJQKAgkA2QQBCQEPZ2V0U3RyaW5nT3JGYWlsAgUEdGhpcwkBEGtleVN0YWtlZEFzc2V0SWQACQEMZ2V0SW50T3JGYWlsAQkBEGtleU1pbkxvY2tBbW91bnQAAQxpc0FjdGl2ZVVzZXIBC3VzZXJBZGRyZXNzCQBmAgkBDGdldEludE9yRWxzZQIJARZrZXlMb2NrUGFyYW1Vc2VyQW1vdW50AQULdXNlckFkZHJlc3MAAAAAARNnZXRVc2VyUGFyYW1zT3JVbml0AQt1c2VyQWRkcmVzcwMJAQxpc0FjdGl2ZVVzZXIBBQt1c2VyQWRkcmVzcwkAlQoDBwkBDGdldEludE9yRmFpbAEJARZrZXlMb2NrUGFyYW1Vc2VyQW1vdW50AQULdXNlckFkZHJlc3MJAQxnZXRJbnRPckZhaWwBCQEWa2V5TG9ja1BhcmFtU3RhcnRCbG9jawEFC3VzZXJBZGRyZXNzBQR1bml0ARNnZXRVc2VyUGFyYW1zT3JGYWlsAQt1c2VyQWRkcmVzcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQETZ2V0VXNlclBhcmFtc09yVW5pdAEFC3VzZXJBZGRyZXNzCQCsAgIJAKwCAgIFVXNlciAJAKUIAQULdXNlckFkZHJlc3MCDyBpcyBub3QgZGVmaW5lZAASc3VwcG9ydGVkQXNzZXRzU3RyCQEMZ2V0U3RyT3JFbHNlAgkBGGtleVN1cHBvcnRlZFJld2FyZEFzc2V0cwACAAATc3VwcG9ydGVkQXNzZXRzTGlzdAkAtQkCBRJzdXBwb3J0ZWRBc3NldHNTdHICAV8BCmNhbGNSZXdhcmQFC3VzZXJBZGRyZXNzB2Fzc2V0SWQNc3Rha2VkQW1vdW50WA5kZXBvc2l0TnVtVXNlcg5kZXBvc2l0TnVtTGFzdAQXcmV3YXJkUGVyTnNidFN1bUxhc3RLRVkJARVrZXlSZXdhcmRQZXJOc2J0U3VtQXQCBQ5kZXBvc2l0TnVtTGFzdAUHYXNzZXRJZAQKc3VtTGFzdFgxOAkApwMBCQEMZ2V0U3RyT3JFbHNlAgkBFWtleVJld2FyZFBlck5zYnRTdW1BdAIFDmRlcG9zaXROdW1MYXN0BQdhc3NldElkAgEwBApzdW1Vc2VyWDE4CQCnAwEJAQxnZXRTdHJPckVsc2UCCQEVa2V5UmV3YXJkUGVyTnNidFN1bUF0AgUOZGVwb3NpdE51bVVzZXIFB2Fzc2V0SWQCATAEEXJld2FyZER5bmFtaWNQYXJ0CQCgAwEJALwCAwkAuAICBQpzdW1MYXN0WDE4BQpzdW1Vc2VyWDE4BQ1zdGFrZWRBbW91bnRYBQdNVUxUWDE4BBNyZXdhcmRDYWNoZWRQYXJ0S0VZCQEJa2V5UmV3YXJkAgULdXNlckFkZHJlc3MFB2Fzc2V0SWQEEHJld2FyZENhY2hlZFBhcnQJAQxnZXRJbnRPckVsc2UCBRNyZXdhcmRDYWNoZWRQYXJ0S0VZAAAJAJYKBAkAZAIFEHJld2FyZENhY2hlZFBhcnQFEXJld2FyZER5bmFtaWNQYXJ0BRByZXdhcmRDYWNoZWRQYXJ0BRFyZXdhcmREeW5hbWljUGFydAUTcmV3YXJkQ2FjaGVkUGFydEtFWQEMdG9TdGFydE9mRGF5AQl0aW1lc3RhbXAJAGgCCQBpAgUJdGltZXN0YW1wBQlEQVlNSUxMSVMFCURBWU1JTExJUwETZmluZEVsZW1lbnRQb3NpdGlvbgMDc3JjB2VsZW1lbnQDc2VwBAxlbGVtZW50U3RhcnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAswkCBQNzcmMFB2VsZW1lbnQJAKwCAgkArAICCQCsAgICFnRoZXJlIGlzIG5vIHN1YnN0cmluZyAFB2VsZW1lbnQCBCBpbiAFA3NyYwMJAAACBQxlbGVtZW50U3RhcnQAAAAABARsZWZ0CQCvAgIFA3NyYwUMZWxlbWVudFN0YXJ0CQBlAgkAkAMBCQC1CQIFBGxlZnQFA3NlcAABABNEZXBvc2l0VG90YWxzUFJFRklYAiQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQlZCVkJWQBE3VwZGF0ZURlcG9zaXRUb3RhbHMDB2N1cnJWYWwLaWR4VG9VcGRhdGUIZGVsdGFBbXQEB2N1cnJBcnIJALUJAgUHY3VyclZhbAUDU0VQCgEOdXBkRGVwVG90QnlJZHgBA2lkeAMJAQIhPQIFA2lkeAULaWR4VG9VcGRhdGUJAJEDAgUHY3VyckFycgUDaWR4CQCkAwEJAGQCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHY3VyckFycgUDaWR4BQhkZWx0YUFtdAkAuQkCCQDMCAIFE0RlcG9zaXRUb3RhbHNQUkVGSVgJAMwIAgkBDnVwZERlcFRvdEJ5SWR4AQABCQDMCAIJAQ51cGREZXBUb3RCeUlkeAEAAgkAzAgCCQEOdXBkRGVwVG90QnlJZHgBAAMJAMwIAgkBDnVwZERlcFRvdEJ5SWR4AQAECQDMCAIJAQ51cGREZXBUb3RCeUlkeAEABQkAzAgCCQEOdXBkRGVwVG90QnlJZHgBAAYJAMwIAgkBDnVwZERlcFRvdEJ5SWR4AQAHCQDMCAIJAQ51cGREZXBUb3RCeUlkeAEACAkAzAgCCQEOdXBkRGVwVG90QnlJZHgBAAkJAMwIAgkBDnVwZERlcFRvdEJ5SWR4AQAKCQDMCAIJAQ51cGREZXBUb3RCeUlkeAEACwkAzAgCCQEOdXBkRGVwVG90QnlJZHgBAAwJAMwIAgkBDnVwZERlcFRvdEJ5SWR4AQANCQDMCAIJAQ51cGREZXBUb3RCeUlkeAEADgkAzAgCCQEOdXBkRGVwVG90QnlJZHgBAA8JAMwIAgkBDnVwZERlcFRvdEJ5SWR4AQAQCQDMCAIJAQ51cGREZXBUb3RCeUlkeAEAEQkAzAgCCQEOdXBkRGVwVG90QnlJZHgBABIFA25pbAUDU0VQARVEZXBvc2l0c1RvdGFsc0VudHJpZXMCDWRlcG9zaXRBbW91bnQKYXNzZXRJZFN0cgQKc3RhcnRPZkRheQkBDHRvU3RhcnRPZkRheQEIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAhieURheUtFWQkBF2tleVN0YXRzRGVwb3NpdEFtdEJ5RGF5AQUKc3RhcnRPZkRheQQJdG90YWxzS0VZCQEYa2V5U3RhdHNEZXBvc2l0QW10VG90YWxzAAQIcG9zaXRpb24JARNmaW5kRWxlbWVudFBvc2l0aW9uAwUSc3VwcG9ydGVkQXNzZXRzU3RyBQphc3NldElkU3RyAgFfBAtkZWZhdWx0REFUQQkArAICBRNEZXBvc2l0VG90YWxzUFJFRklYAjZfXzBfXzBfXzBfXzBfXzBfXzBfXzBfXzBfXzBfXzBfXzBfXzBfXzBfXzBfXzBfXzBfXzBfXzAEDmN1cnJUb3RhbHNEQVRBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFCXRvdGFsc0tFWQULZGVmYXVsdERBVEEEDW5ld1RvdGFsc0RBVEEJARN1cGRhdGVEZXBvc2l0VG90YWxzAwUOY3VyclRvdGFsc0RBVEEJAGQCBQhwb3NpdGlvbgABBQ1kZXBvc2l0QW1vdW50CQDMCAIJAQtTdHJpbmdFbnRyeQIFCXRvdGFsc0tFWQUNbmV3VG90YWxzREFUQQkAzAgCCQELU3RyaW5nRW50cnkCBQhieURheUtFWQUNbmV3VG90YWxzREFUQQUDbmlsAQ1SZXdhcmRFbnRyaWVzAwlpc05ld1VzZXILdXNlckFkZHJlc3MMc3Rha2VkQW1vdW50BA1zdGFrZWRBbW91bnRYCQC2AgEFDHN0YWtlZEFtb3VudAQbdXNlclJld2FyZEZyb21EZXBvc2l0TnVtS0VZCQEba2V5VXNlclJld2FyZEZyb21EZXBvc2l0TnVtAQULdXNlckFkZHJlc3MEDmRlcG9zaXROdW1Vc2VyCQEMZ2V0SW50T3JFbHNlAgUbdXNlclJld2FyZEZyb21EZXBvc2l0TnVtS0VZAP///////////wEEDmRlcG9zaXROdW1MYXN0CQEMZ2V0SW50T3JFbHNlAgkBEWtleURlcG9zaXROdW1MYXN0AAD///////////8BCgEbZm9yRWFjaEFzc2V0Q2FjaGVVc2VyUmV3YXJkAgVhY2N1bQVhc3NldAQNJHQwMTExMjExMTI1NgkBCmNhbGNSZXdhcmQFBQt1c2VyQWRkcmVzcwUFYXNzZXQFDXN0YWtlZEFtb3VudFgFDmRlcG9zaXROdW1Vc2VyBQ5kZXBvc2l0TnVtTGFzdAQLcmV3YXJkVG90YWwIBQ0kdDAxMTEyMTExMjU2Al8xBAZjYWNoZWQIBQ0kdDAxMTEyMTExMjU2Al8yBAdkeW5hbWljCAUNJHQwMTExMjExMTI1NgJfMwQTcmV3YXJkQ2FjaGVkUGFydEtFWQgFDSR0MDExMTIxMTEyNTYCXzQJAM0IAgUFYWNjdW0JAQxJbnRlZ2VyRW50cnkCBRNyZXdhcmRDYWNoZWRQYXJ0S0VZBQtyZXdhcmRUb3RhbAMDCQAAAgUOZGVwb3NpdE51bUxhc3QA////////////AQkAAAIFDmRlcG9zaXROdW1Vc2VyAP///////////wEHBQNuaWwDAwkAAAIFDmRlcG9zaXROdW1MYXN0AP///////////wEJAGYCBQ5kZXBvc2l0TnVtVXNlcgD///////////8BBwkAAgECL2ludmFsaWQgZGVwb3NpdE51bUxhc3QgYW5kIGRlcG9zaXROdW1Vc2VyIHN0YXRlAwMJAGYCBQ5kZXBvc2l0TnVtTGFzdAD///////////8BCQBnAgUOZGVwb3NpdE51bVVzZXIA////////////AQcDBQlpc05ld1VzZXIJAMwIAgkBDEludGVnZXJFbnRyeQIFG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQUOZGVwb3NpdE51bUxhc3QFA25pbAkAzQgCCgACJGwFE3N1cHBvcnRlZEFzc2V0c0xpc3QKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBG2ZvckVhY2hBc3NldENhY2hlVXNlclJld2FyZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgOQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQkBDEludGVnZXJFbnRyeQIFG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQUOZGVwb3NpdE51bUxhc3QJAAIBCQCsAgIJAKwCAgkArAICAiR1bmNvdmVyZWQgY29uZGl0aW9uOiBkZXBvc2l0TnVtTGFzdD0JAKQDAQUOZGVwb3NpdE51bUxhc3QCECBkZXBvc2l0TnVtVXNlcj0JAKQDAQUOZGVwb3NpdE51bVVzZXIBIkluY3JlbWVudE5vdERpc3RyaWJ1dGVkUmV3YXJkRW50cnkCA3RrbglhbW91bnRJbmMEF25vdERpc3RyaWJ1dGVkUmV3YXJkS0VZCQEXa2V5Tm90RGlzdHJpYnV0ZWRSZXdhcmQBBQN0a24EFG5vdERpc3RyaWJ1dGVkUmV3YXJkCQEMZ2V0SW50T3JFbHNlAgUXbm90RGlzdHJpYnV0ZWRSZXdhcmRLRVkAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgUXbm90RGlzdHJpYnV0ZWRSZXdhcmRLRVkJAGQCBRRub3REaXN0cmlidXRlZFJld2FyZAUJYW1vdW50SW5jBQNuaWwBC3N1cmZUb0duc2J0AQdzdXJmQW10CQBpAgUHc3VyZkFtdAUSZ25zYnRGcm9tU3VyZkNvZWZmAR9tZXJnZVZvdGluZ1Bvd2VyRWZmZWN0aXZlSGVpZ2h0BBBxdWFyYW50aW5lUGVyaW9kEXZwRWZmZWN0aXZlSGVpZ2h0CXN0YWtlZEFtdAxzdGFrZWRBbXRORVcED3JlbWFpbmluZ1RvV2FpdAkAZQIFEXZwRWZmZWN0aXZlSGVpZ2h0BQZoZWlnaHQDCQBnAgAABQ9yZW1haW5pbmdUb1dhaXQJAGQCBQZoZWlnaHQFEHF1YXJhbnRpbmVQZXJpb2QEDWFscmVhZHlXYWl0ZWQJAGUCBRBxdWFyYW50aW5lUGVyaW9kBQ9yZW1haW5pbmdUb1dhaXQEA2tYOAMJAQIhPQIFDHN0YWtlZEFtdE5FVwAACQBrAwUJc3Rha2VkQW10BQVNVUxUOAUMc3Rha2VkQW10TkVXBRF2cEVmZmVjdGl2ZUhlaWdodAkAZQIJAGQCBRBxdWFyYW50aW5lUGVyaW9kBQZoZWlnaHQJAGsDBQ1hbHJlYWR5V2FpdGVkBQNrWDgFBU1VTFQ4AQptZXJnZVN0YWtlAgt1c2VyQWRkcmVzcwthbW91bnRUb0FkZAQNJHQwMTQ5MDgxNTAxOAkBC3ZhbHVlT3JFbHNlAgkBE2dldFVzZXJQYXJhbXNPclVuaXQBBQt1c2VyQWRkcmVzcwkAlQoDBgAAAAAECWlzTmV3VXNlcggFDSR0MDE0OTA4MTUwMTgCXzEEDHN0YWtlZEFtb3VudAgFDSR0MDE0OTA4MTUwMTgCXzIEEXZwRWZmZWN0aXZlSGVpZ2h0CAUNJHQwMTQ5MDgxNTAxOAJfMwQPc3Rha2VkQW1vdW50TkVXAwUJaXNOZXdVc2VyBQthbW91bnRUb0FkZAkAZAIFC2Ftb3VudFRvQWRkBQxzdGFrZWRBbW91bnQEEHF1YXJhbnRpbmVQZXJpb2QJAGgCAKALAA4EFHZwRWZmZWN0aXZlSGVpZ2h0TkVXAwUJaXNOZXdVc2VyCQBkAgUQcXVhcmFudGluZVBlcmlvZAUGaGVpZ2h0CQEfbWVyZ2VWb3RpbmdQb3dlckVmZmVjdGl2ZUhlaWdodAQFEHF1YXJhbnRpbmVQZXJpb2QFEXZwRWZmZWN0aXZlSGVpZ2h0BQxzdGFrZWRBbW91bnQFD3N0YWtlZEFtb3VudE5FVwkAlwoFBQlpc05ld1VzZXIFDHN0YWtlZEFtb3VudAURdnBFZmZlY3RpdmVIZWlnaHQFD3N0YWtlZEFtb3VudE5FVwUUdnBFZmZlY3RpdmVIZWlnaHRORVcBC2NvbW1vblN0YWtlAgt1c2VyQWRkcmVzcwFpBA0kdDAxNTUwNDE1NTU4CQEPZ2V0UGFyYW1zT3JGYWlsAAQNc3Rha2VkQXNzZXRJZAgFDSR0MDE1NTA0MTU1NTgCXzEEDW1pbkxvY2tBbW91bnQIBQ0kdDAxNTUwNDE1NTU4Al8yAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIVSW52YWxpZCBwYXltZW50cyBzaXplBAdwYXltZW50CQCRAwIIBQFpCHBheW1lbnRzAAAEBmFtb3VudAgFB3BheW1lbnQGYW1vdW50BBNpbnZhbGlkQXNzZXRNZXNzYWdlCQCsAgIJAKwCAgIPSW52YWxpZCBhc3NldC4gCQDYBAEFDXN0YWtlZEFzc2V0SWQCDCBpcyBleHBlY3RlZAQHYXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCAUHcGF5bWVudAdhc3NldElkBRNpbnZhbGlkQXNzZXRNZXNzYWdlAwkBAiE9AgUHYXNzZXRJZAUNc3Rha2VkQXNzZXRJZAkAAgEFE2ludmFsaWRBc3NldE1lc3NhZ2UEDnVzZXJBZGRyZXNzU3RyCQClCAEFC3VzZXJBZGRyZXNzBAptZXJnZWREYXRhCQEKbWVyZ2VTdGFrZQIFC3VzZXJBZGRyZXNzBQZhbW91bnQECWlzTmV3VXNlcggFCm1lcmdlZERhdGECXzEEDHN0YWtlZEFtb3VudAgFCm1lcmdlZERhdGECXzIEEXZwRWZmZWN0aXZlSGVpZ2h0CAUKbWVyZ2VkRGF0YQJfMwQPc3Rha2VkQW1vdW50TkVXCAUKbWVyZ2VkRGF0YQJfNAQUdnBFZmZlY3RpdmVIZWlnaHRORVcIBQptZXJnZWREYXRhAl81AwkAZgIFDW1pbkxvY2tBbW91bnQFD3N0YWtlZEFtb3VudE5FVwkAAgEJAKwCAgITTWluIGxvY2sgYW1vdW50IGlzIAkApAMBBQ1taW5Mb2NrQW1vdW50BA0kdDAxNjM1NzE2NDU5CQELU3RhdHNSZXN1bHQDBQZhbW91bnQAAQMFCWlzTmV3VXNlcgABAAAEDHN0YXRzRW50cmllcwgFDSR0MDE2MzU3MTY0NTkCXzEEC3RvdGFsU3Rha2VkCAUNJHQwMTYzNTcxNjQ1OQJfMgQOdG90YWxTdGFrZWROZXcIBQ0kdDAxNjM1NzE2NDU5Al8zCQDOCAIJAM4IAgkAzggCCQDMCAIJARJIaXN0b3J5UmVjb3JkRW50cnkHAgVzdGFrZQULdXNlckFkZHJlc3MIBQFpDXRyYW5zYWN0aW9uSWQFDHN0YWtlZEFtb3VudAURdnBFZmZlY3RpdmVIZWlnaHQFD3N0YWtlZEFtb3VudE5FVwUUdnBFZmZlY3RpdmVIZWlnaHRORVcFA25pbAkBDVJld2FyZEVudHJpZXMDBQlpc05ld1VzZXIFDnVzZXJBZGRyZXNzU3RyBQxzdGFrZWRBbW91bnQJAQ9Mb2NrUGFyYW1zRW50cnkDBQt1c2VyQWRkcmVzcwUPc3Rha2VkQW1vdW50TkVXBRR2cEVmZmVjdGl2ZUhlaWdodE5FVwUMc3RhdHNFbnRyaWVzAQtjb21tb25DbGFpbQILdXNlckFkZHJlc3MBaQQOdXNlckFkZHJlc3NTdHIJAKUIAQULdXNlckFkZHJlc3MDCQBmAgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIZcGF5bWVudHMgYXJlIG5vdCBhY2NlcHRlZAQNJHQwMTY5MzgxNzA0MwkBC3ZhbHVlT3JFbHNlAgkBE2dldFVzZXJQYXJhbXNPclVuaXQBBQt1c2VyQWRkcmVzcwkAlQoDBgAAAAAECWlzTmV3VXNlcggFDSR0MDE2OTM4MTcwNDMCXzEEDHN0YWtlZEFtb3VudAgFDSR0MDE2OTM4MTcwNDMCXzIEDHN0YWtpbmdTdGFydAgFDSR0MDE2OTM4MTcwNDMCXzMEDXN0YWtlZEFtb3VudFgJALYCAQUMc3Rha2VkQW1vdW50BBt1c2VyUmV3YXJkRnJvbURlcG9zaXROdW1LRVkJARtrZXlVc2VyUmV3YXJkRnJvbURlcG9zaXROdW0BBQ51c2VyQWRkcmVzc1N0cgQOZGVwb3NpdE51bVVzZXIJAQxnZXRJbnRPckVsc2UCBRt1c2VyUmV3YXJkRnJvbURlcG9zaXROdW1LRVkA////////////AQQOZGVwb3NpdE51bUxhc3QJAQxnZXRJbnRPckVsc2UCCQERa2V5RGVwb3NpdE51bUxhc3QAAP///////////wEKAR9mb3JFYWNoQXNzZXRDYWxjVW5jbGFpbWVkUmV3YXJkAgVhY2N1bQVhc3NldAQNJHQwMTc0MTQxNzU1MgkBCmNhbGNSZXdhcmQFBQ51c2VyQWRkcmVzc1N0cgUFYXNzZXQFDXN0YWtlZEFtb3VudFgFDmRlcG9zaXROdW1Vc2VyBQ5kZXBvc2l0TnVtTGFzdAQLcmV3YXJkVG90YWwIBQ0kdDAxNzQxNDE3NTUyAl8xBAZjYWNoZWQIBQ0kdDAxNzQxNDE3NTUyAl8yBAdkeW5hbWljCAUNJHQwMTc0MTQxNzU1MgJfMwQTcmV3YXJkQ2FjaGVkUGFydEtFWQgFDSR0MDE3NDE0MTc1NTICXzQECmNsYWltZWRLRVkJAQprZXlDbGFpbWVkAgUOdXNlckFkZHJlc3NTdHIFBWFzc2V0BA0kdDAxNzYxMjE3NjQ5BQVhY2N1bQQEZGF0YQgFDSR0MDE3NjEyMTc2NDkCXzEEEWNsYWltZWRBbXRCeUFzc2V0CAUNJHQwMTc2MTIxNzY0OQJfMgQHbmV3UGFydAkAuQkCCQDMCAIFBWFzc2V0CQDMCAIJAKQDAQULcmV3YXJkVG90YWwFA25pbAIBOgQUY2xhaW1lZEFtdEJ5QXNzZXROZXcJALkJAgkAzAgCBRFjbGFpbWVkQW10QnlBc3NldAkAzAgCBQduZXdQYXJ0BQNuaWwCAV8DCQBnAgAABQtyZXdhcmRUb3RhbAkAlAoCBQRkYXRhBRRjbGFpbWVkQW10QnlBc3NldE5ldwkAlAoCCQDNCAIJAM0IAgkAzQgCBQRkYXRhCQEOU2NyaXB0VHJhbnNmZXIDBQt1c2VyQWRkcmVzcwULcmV3YXJkVG90YWwJAQt0b0Fzc2V0VmVjdAEFBWFzc2V0CQEMSW50ZWdlckVudHJ5AgUKY2xhaW1lZEtFWQkAZAIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUKY2xhaW1lZEtFWQAABQtyZXdhcmRUb3RhbAkBDEludGVnZXJFbnRyeQIFE3Jld2FyZENhY2hlZFBhcnRLRVkAAAUUY2xhaW1lZEFtdEJ5QXNzZXROZXcEDSR0MDE4MTA5MTgyMjIKAAIkbAUTc3VwcG9ydGVkQXNzZXRzTGlzdAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsAgAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBH2ZvckVhY2hBc3NldENhbGNVbmNsYWltZWRSZXdhcmQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDkJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkECXRyYW5zZmVycwgFDSR0MDE4MTA5MTgyMjICXzEEF2NsYWltZWRBbXRCeUFzc2V0UmVzdWx0CAUNJHQwMTgxMDkxODIyMgJfMgMJAGcCAAAJAJADAQUJdHJhbnNmZXJzCQCUCgIFA25pbAAACQCUCgIJAM0IAgkAzQgCBQl0cmFuc2ZlcnMJAQxJbnRlZ2VyRW50cnkCBRt1c2VyUmV3YXJkRnJvbURlcG9zaXROdW1LRVkFDmRlcG9zaXROdW1MYXN0CQERQ2xhaW1IaXN0b3J5RW50cnkDBQt1c2VyQWRkcmVzcwgFAWkNdHJhbnNhY3Rpb25JZAkAsAICBRdjbGFpbWVkQW10QnlBc3NldFJlc3VsdAABCQCQAwEFCXRyYW5zZmVycwsBaQELY29uc3RydWN0b3IDDW1pbkxvY2tBbW91bnQVc3VwcG9ydGVkUmV3YXJkQXNzZXRzDXN0YWtlZEFzc2V0SWQDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEGtleU1pbkxvY2tBbW91bnQABQ1taW5Mb2NrQW1vdW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJARhrZXlTdXBwb3J0ZWRSZXdhcmRBc3NldHMABRVzdXBwb3J0ZWRSZXdhcmRBc3NldHMJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEGtleVN0YWtlZEFzc2V0SWQABQ1zdGFrZWRBc3NldElkBQNuaWwBaQEFc3Rha2UACQELY29tbW9uU3Rha2UCCAUBaQZjYWxsZXIFAWkBaQETc3Rha2VCeU9yaWdpbkNhbGxlcgAJAQtjb21tb25TdGFrZQIIBQFpDG9yaWdpbkNhbGxlcgUBaQFpAQd1bnN0YWtlAQZhbW91bnQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAiN1bnN0YWtlIGRvZXNuJ3QgcmVxdWlyZSBhbnkgcGF5bWVudAQLdXNlckFkZHJlc3MIBQFpBmNhbGxlcgQOdXNlckFkZHJlc3NTdHIJAKUIAQULdXNlckFkZHJlc3MEDSR0MDE5MTU2MTkyMTAJAQ9nZXRQYXJhbXNPckZhaWwABA1zdGFrZWRBc3NldElkCAUNJHQwMTkxNTYxOTIxMAJfMQQNbWluTG9ja0Ftb3VudAgFDSR0MDE5MTU2MTkyMTACXzIEDSR0MDE5MjEzMTkyOTcJARNnZXRVc2VyUGFyYW1zT3JGYWlsAQULdXNlckFkZHJlc3MECWlzTmV3VXNlcggFDSR0MDE5MjEzMTkyOTcCXzEEDHN0YWtlZEFtb3VudAgFDSR0MDE5MjEzMTkyOTcCXzIEEXZwRWZmZWN0aXZlSGVpZ2h0CAUNJHQwMTkyMTMxOTI5NwJfMwQQc3dhcFBhcmFtc1NUUlVDVAkBEmFzU3dhcFBhcmFtc1NUUlVDVAEJAP0HBAUQbmV1dHJpbm9Db250cmFjdAIbc3dhcFBhcmFtc0J5VXNlclNZU1JFQURPTkxZCQDMCAIFDnVzZXJBZGRyZXNzU3RyCQDMCAIAAAUDbmlsBQNuaWwEFHN3YXBMaW1pdFNwZW50SW5Vc2RuCAUQc3dhcFBhcmFtc1NUUlVDVAJfMgQOYmxja3MyTG10UmVzZXQIBRBzd2FwUGFyYW1zU1RSVUNUAl8zAwkAZgIFFHN3YXBMaW1pdFNwZW50SW5Vc2RuAAAJAAIBCQCsAgIJAKwCAgItWW91IGhhdmUgYWxyZWFkeSBtYWRlIGEgc3dhcCBvcGVyYXRpb24uIFdhaXQgCQCkAwEJAGQCBQZoZWlnaHQFDmJsY2tzMkxtdFJlc2V0AhIgaGVpZ2h0IHRvIHVuc3Rha2UDCQBnAgAABQxzdGFrZWRBbW91bnQJAAIBAhJOb3RoaW5nIHRvIHVuc3Rha2UDCQBmAgUGYW1vdW50BQxzdGFrZWRBbW91bnQJAAIBCQCsAgIJAKwCAgkArAICAgpSZXF1ZXN0ZWQgCQCkAwEFBmFtb3VudAISLCBidXQgc3Rha2VkIG9ubHkgCQCkAwEFDHN0YWtlZEFtb3VudAQPc3Rha2VkQW1vdW50TkVXCQBlAgUMc3Rha2VkQW1vdW50BQZhbW91bnQEDSR0MDE5OTM1MjAwOTMJAQtTdGF0c1Jlc3VsdAMJAQEtAQUGYW1vdW50AwkAAAIFBmFtb3VudAUMc3Rha2VkQW1vdW50AP///////////wEAAAMJAAACBQZhbW91bnQFDHN0YWtlZEFtb3VudAD///////////8BAAAEDHN0YXRzRW50cmllcwgFDSR0MDE5OTM1MjAwOTMCXzEEC3RvdGFsU3Rha2VkCAUNJHQwMTk5MzUyMDA5MwJfMgQOdG90YWxTdGFrZWROZXcIBQ0kdDAxOTkzNTIwMDkzAl8zCQDOCAIJAM4IAgkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFC3VzZXJBZGRyZXNzBQZhbW91bnQFDXN0YWtlZEFzc2V0SWQJAMwIAgkBEkhpc3RvcnlSZWNvcmRFbnRyeQcCB3Vuc3Rha2UFC3VzZXJBZGRyZXNzCAUBaQ10cmFuc2FjdGlvbklkBQxzdGFrZWRBbW91bnQFEXZwRWZmZWN0aXZlSGVpZ2h0BQ9zdGFrZWRBbW91bnRORVcFEXZwRWZmZWN0aXZlSGVpZ2h0BQNuaWwJAQ1SZXdhcmRFbnRyaWVzAwcFDnVzZXJBZGRyZXNzU3RyBQxzdGFrZWRBbW91bnQJAQ9Mb2NrUGFyYW1zRW50cnkDBQt1c2VyQWRkcmVzcwUPc3Rha2VkQW1vdW50TkVXBRF2cEVmZmVjdGl2ZUhlaWdodAUMc3RhdHNFbnRyaWVzAWkBB2RlcG9zaXQAAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIfZXhhY3QgMSBwYXltZW50IGlzIGFsbG93ZWQgb25seQQDcG10CQCRAwIIBQFpCHBheW1lbnRzAAAEBmFtb3VudAgFA3BtdAZhbW91bnQECnBtdEFzc2V0SWQJAQt2YWx1ZU9yRWxzZQIIBQNwbXQHYXNzZXRJZAUHV0FWRVNJRAQNcG10QXNzZXRJZFN0cgkA2AQBBQpwbXRBc3NldElkBAhwbXRNdWx0WAMJAAACBQpwbXRBc3NldElkBQdXQVZFU0lEBQZNVUxUWDgFBk1VTFRYNgQHYW1vdW50WAkAtgIBBQZhbW91bnQEC3RvdGFsU3Rha2VkCQEMZ2V0SW50T3JFbHNlAgkBF2tleUxvY2tQYXJhbVRvdGFsQW1vdW50AAAABAx0b3RhbFN0YWtlZFgJALYCAQULdG90YWxTdGFrZWQDCQBmAgAABQt0b3RhbFN0YWtlZAkAAgECG1RPRE86IGNhc2UgaXMgbm90IHN1cHBvcnRlZAMJAAACBQt0b3RhbFN0YWtlZAAACQEiSW5jcmVtZW50Tm90RGlzdHJpYnV0ZWRSZXdhcmRFbnRyeQIFDXBtdEFzc2V0SWRTdHIFBmFtb3VudAQQcmV3YXJkUGVyTnNidFgxOAkAvAIDBQdhbW91bnRYBQdNVUxUWDE4BQx0b3RhbFN0YWtlZFgEEWRlcG9zaXROdW1MYXN0S0VZCQERa2V5RGVwb3NpdE51bUxhc3QABA5kZXBvc2l0TnVtTGFzdAkBDGdldEludE9yRWxzZQIFEWRlcG9zaXROdW1MYXN0S0VZAP///////////wEEDWRlcG9zaXROdW1OZXcJAGQCBQ5kZXBvc2l0TnVtTGFzdAABAwkBASEBCQEIY29udGFpbnMCBRJzdXBwb3J0ZWRBc3NldHNTdHIFDXBtdEFzc2V0SWRTdHIJAAIBCQCsAgIJAKwCAgUSc3VwcG9ydGVkQXNzZXRzU3RyAhEgZG9lc24ndCBjb250YWluIAUNcG10QXNzZXRJZFN0cgoBF3JlZnJlc2hSZXdhcmRQZXJOc2J0U1VNAgVhY2N1bQluZXh0QXNzZXQEFnJld2FyZFBlck5zYnRTdW1OZXdLRVkJARVrZXlSZXdhcmRQZXJOc2J0U3VtQXQCBQ1kZXBvc2l0TnVtTmV3BQluZXh0QXNzZXQECnN1bUxhc3RTdHIJAQxnZXRTdHJPckVsc2UCCQEVa2V5UmV3YXJkUGVyTnNidFN1bUF0AgUOZGVwb3NpdE51bUxhc3QFCW5leHRBc3NldAIBMAkAzQgCBQVhY2N1bQMJAAACBQluZXh0QXNzZXQFDXBtdEFzc2V0SWRTdHIJAQtTdHJpbmdFbnRyeQIFFnJld2FyZFBlck5zYnRTdW1OZXdLRVkJAKYDAQkAtwICCQCnAwEFCnN1bUxhc3RTdHIFEHJld2FyZFBlck5zYnRYMTgJAQtTdHJpbmdFbnRyeQIFFnJld2FyZFBlck5zYnRTdW1OZXdLRVkFCnN1bUxhc3RTdHIJAM4IAgkAzQgCCgACJGwFE3N1cHBvcnRlZEFzc2V0c0xpc3QKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBF3JlZnJlc2hSZXdhcmRQZXJOc2J0U1VNAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA5CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJCQEMSW50ZWdlckVudHJ5AgURZGVwb3NpdE51bUxhc3RLRVkFDWRlcG9zaXROdW1OZXcJARVEZXBvc2l0c1RvdGFsc0VudHJpZXMCBQZhbW91bnQFDXBtdEFzc2V0SWRTdHIBaQEMY2xhaW1SZXdhcmRzAAkBC2NvbW1vbkNsYWltAggFAWkGY2FsbGVyBQFpAWkBGmNsYWltUmV3YXJkc0J5T3JpZ2luQ2FsbGVyAAkBC2NvbW1vbkNsYWltAggFAWkMb3JpZ2luQ2FsbGVyBQFpAWkBGHVuY2xhaW1lZFJld2FyZHNSRUFET05MWQEOdXNlckFkZHJlc3NTdHIKARZmb3JFYWNoQXNzZXRaZXJvUmV3YXJkAgVhY2N1bQVhc3NldAkArAICCQCsAgIFBWFjY3VtCQC5CQIJAMwIAgUFYXNzZXQJAMwIAgIBMAkAzAgCAgEwBQNuaWwCAToCAV8EEnVuY2xhaW1lZFJld2FyZFN0cgMJAAACBQ51c2VyQWRkcmVzc1N0cgIACgACJGwFE3N1cHBvcnRlZEFzc2V0c0xpc3QKAAIkcwkAkAMBBQIkbAoABSRhY2MwAgAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBFmZvckVhY2hBc3NldFplcm9SZXdhcmQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDkJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkEC3VzZXJBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBQ51c2VyQWRkcmVzc1N0cgQNJHQwMjI3MTcyMjgyMgkBC3ZhbHVlT3JFbHNlAgkBE2dldFVzZXJQYXJhbXNPclVuaXQBBQt1c2VyQWRkcmVzcwkAlQoDBgAAAAAECWlzTmV3VXNlcggFDSR0MDIyNzE3MjI4MjICXzEEDHN0YWtlZEFtb3VudAgFDSR0MDIyNzE3MjI4MjICXzIEDHN0YWtpbmdTdGFydAgFDSR0MDIyNzE3MjI4MjICXzMEDXN0YWtlZEFtb3VudFgJALYCAQUMc3Rha2VkQW1vdW50BBt1c2VyUmV3YXJkRnJvbURlcG9zaXROdW1LRVkJARtrZXlVc2VyUmV3YXJkRnJvbURlcG9zaXROdW0BBQ51c2VyQWRkcmVzc1N0cgQOZGVwb3NpdE51bVVzZXIJAQxnZXRJbnRPckVsc2UCBRt1c2VyUmV3YXJkRnJvbURlcG9zaXROdW1LRVkA////////////AQQOZGVwb3NpdE51bUxhc3QJAQxnZXRJbnRPckVsc2UCCQERa2V5RGVwb3NpdE51bUxhc3QAAP///////////wEKAR9mb3JFYWNoQXNzZXRDYWxjVW5jbGFpbWVkUmV3YXJkAgVhY2N1bQVhc3NldAQNJHQwMjMxNjgyMzMwNgkBCmNhbGNSZXdhcmQFBQ51c2VyQWRkcmVzc1N0cgUFYXNzZXQFDXN0YWtlZEFtb3VudFgFDmRlcG9zaXROdW1Vc2VyBQ5kZXBvc2l0TnVtTGFzdAQLcmV3YXJkVG90YWwIBQ0kdDAyMzE2ODIzMzA2Al8xBAZjYWNoZWQIBQ0kdDAyMzE2ODIzMzA2Al8yBAdkeW5hbWljCAUNJHQwMjMxNjgyMzMwNgJfMwQTcmV3YXJkQ2FjaGVkUGFydEtFWQgFDSR0MDIzMTY4MjMzMDYCXzQEB2NsYWltZWQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBCmtleUNsYWltZWQCBQ51c2VyQWRkcmVzc1N0cgUFYXNzZXQAAAkArAICCQCsAgIFBWFjY3VtCQC5CQIJAMwIAgUFYXNzZXQJAMwIAgkApAMBBQtyZXdhcmRUb3RhbAkAzAgCCQCkAwEFB2NsYWltZWQFA25pbAIBOgIBXwoAAiRsBRNzdXBwb3J0ZWRBc3NldHNMaXN0CgACJHMJAJADAQUCJGwKAAUkYWNjMAIACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAR9mb3JFYWNoQXNzZXRDYWxjVW5jbGFpbWVkUmV3YXJkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA5CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJCQCUCgIFA25pbAkAswICBRJ1bmNsYWltZWRSZXdhcmRTdHIAAQFpARZzdXJmU3Rha2luZ1NZU1JFQURPTkxZAhV1c2VyQWRkcmVzc1N0ck9yRW1wdHkIc3VyZkRpZmYECXN1cmZUb3RhbAkBDGdldEludE9yRWxzZQIJARdrZXlMb2NrUGFyYW1Ub3RhbEFtb3VudAAAAAQSZ25zYnRGcm9tU3VyZlRvdGFsCQELc3VyZlRvR25zYnQBBQlzdXJmVG90YWwDCQAAAgUVdXNlckFkZHJlc3NTdHJPckVtcHR5AgAJAJQKAgUDbmlsCQDMCAIAAAkAzAgCBQlzdXJmVG90YWwJAMwIAgAACQDMCAIFEmduc2J0RnJvbVN1cmZUb3RhbAkAzAgCAAAJAMwIAgUGaGVpZ2h0CQDMCAIFBmhlaWdodAUDbmlsBAt1c2VyQWRkcmVzcwkBD3RvQWRkcmVzc09yRmFpbAEFFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQQKbWVyZ2VkRGF0YQkBCm1lcmdlU3Rha2UCBQt1c2VyQWRkcmVzcwUIc3VyZkRpZmYECWlzTmV3VXNlcggFCm1lcmdlZERhdGECXzEEDHN0YWtlZEFtb3VudAgFCm1lcmdlZERhdGECXzIEEXZwRWZmZWN0aXZlSGVpZ2h0CAUKbWVyZ2VkRGF0YQJfMwQPc3Rha2VkQW1vdW50TkVXCAUKbWVyZ2VkRGF0YQJfNAQUdnBFZmZlY3RpdmVIZWlnaHRORVcIBQptZXJnZWREYXRhAl81BAhzdXJmVXNlcgUMc3Rha2VkQW1vdW50BBFnbnNidEZyb21TdXJmVXNlcgkBC3N1cmZUb0duc2J0AQUIc3VyZlVzZXIJAJQKAgUDbmlsCQDMCAIFCHN1cmZVc2VyCQDMCAIFCXN1cmZUb3RhbAkAzAgCBRFnbnNidEZyb21TdXJmVXNlcgkAzAgCBRJnbnNidEZyb21TdXJmVG90YWwJAMwIAgURdnBFZmZlY3RpdmVIZWlnaHQJAMwIAgUUdnBFZmZlY3RpdmVIZWlnaHRORVcFA25pbAFpARhnbnNidEZyb21TdXJmU1lTUkVBRE9OTFkBB3N1cmZBbXQJAJQKAgUDbmlsCQELc3VyZlRvR25zYnQBBQdzdXJmQW10AWkBEWNvbmZpZ1NZU1JFQURPTkxZAAQKbWluTG9ja0FtdAkBEUBleHRyTmF0aXZlKDEwNTUpAQkBEGtleU1pbkxvY2tBbW91bnQABCBzdXJmVm90aW5nUG93ZXJSZXN0cmljdGl2ZVBlcmlvZAkAaAIAoAsADgQbYnJUb1N0YXJ0U3VyZlRyYW5zZm9ybWF0aW9uALCYRgkAlAoCBQNuaWwJAMwIAgUKbWluTG9ja0FtdAkAzAgCCQBoAgUSZ25zYnRGcm9tU3VyZkNvZWZmBQVNVUxUNgkAzAgCBSBzdXJmVm90aW5nUG93ZXJSZXN0cmljdGl2ZVBlcmlvZAkAzAgCBRticlRvU3RhcnRTdXJmVHJhbnNmb3JtYXRpb24FA25pbAC7DVGK", "chainId": 87, "height": 3336166, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 9PAfryBuDnVdE792YhSxTUKPZcX1n4S69ZQvwrpYxGK6 Next: DHD1i6nmxwTkbgXS851QSDfKHrxtPcGGRZPz6hzQnD48 Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let revisionNum = "049fe7b78896aec03c7fa106ba92e97b6ce41445"
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
104106
105107
106108 func keyStatsUsersCount () = makeString(["%s%s", "stats", "activeUsersCount"], separator)
109+
110+
111+func keyStatsDepositAmtByDay (timestamp) = makeString(["%s%s%d", "stats", "depositAmtByDay", toString(timestamp)], separator)
112+
113+
114+func keyStatsDepositAmtTotals () = makeString(["%s%s%d", "stats", "depositAmtTotals"], separator)
107115
108116
109117 func keyNextPeriod () = "%s__nextPeriod"
222230 }
223231
224232
233+func toStartOfDay (timestamp) = ((timestamp / DAYMILLIS) * DAYMILLIS)
234+
235+
236+func findElementPosition (src,element,sep) = {
237+ let elementStart = valueOrErrorMessage(indexOf(src, element), ((("there is no substring " + element) + " in ") + src))
238+ if ((elementStart == 0))
239+ then 0
240+ else {
241+ let left = take(src, elementStart)
242+ (size(split(left, sep)) - 1)
243+ }
244+ }
245+
246+
247+let DepositTotalsPREFIX = "%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d"
248+
249+func updateDepositTotals (currVal,idxToUpdate,deltaAmt) = {
250+ let currArr = split(currVal, SEP)
251+ func updDepTotByIdx (idx) = if ((idx != idxToUpdate))
252+ then currArr[idx]
253+ else toString((parseIntValue(currArr[idx]) + deltaAmt))
254+
255+ 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)
256+ }
257+
258+
259+func DepositsTotalsEntries (depositAmount,assetIdStr) = {
260+ let startOfDay = toStartOfDay(lastBlock.timestamp)
261+ let byDayKEY = keyStatsDepositAmtByDay(startOfDay)
262+ let totalsKEY = keyStatsDepositAmtTotals()
263+ let position = findElementPosition(supportedAssetsStr, assetIdStr, "_")
264+ let defaultDATA = (DepositTotalsPREFIX + "__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0")
265+ let currTotalsDATA = valueOrElse(getString(this, totalsKEY), defaultDATA)
266+ let newTotalsDATA = updateDepositTotals(currTotalsDATA, (position + 1), depositAmount)
267+[StringEntry(totalsKEY, newTotalsDATA), StringEntry(byDayKEY, newTotalsDATA)]
268+ }
269+
270+
225271 func RewardEntries (isNewUser,userAddress,stakedAmount) = {
226272 let stakedAmountX = toBigInt(stakedAmount)
227273 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddress)
228274 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
229275 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
230276 func forEachAssetCacheUserReward (accum,asset) = {
231- let $t089939128 = calcReward(userAddress, asset, stakedAmountX, depositNumUser, depositNumLast)
232- let rewardTotal = $t089939128._1
233- let cached = $t089939128._2
234- let dynamic = $t089939128._3
235- let rewardCachedPartKEY = $t089939128._4
277+ let $t01112111256 = calcReward(userAddress, asset, stakedAmountX, depositNumUser, depositNumLast)
278+ let rewardTotal = $t01112111256._1
279+ let cached = $t01112111256._2
280+ let dynamic = $t01112111256._3
281+ let rewardCachedPartKEY = $t01112111256._4
236282 (accum :+ IntegerEntry(rewardCachedPartKEY, rewardTotal))
237283 }
238284
259305
260306 func $f0_2 ($a,$i) = if (($i >= $s))
261307 then $a
262- else throw("List size exceeds 10")
308+ else throw("List size exceeds 9")
263309
264- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
310+ $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)
265311 } :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast))
266312 else throw(((("uncovered condition: depositNumLast=" + toString(depositNumLast)) + " depositNumUser=") + toString(depositNumUser)))
267313 }
292338
293339
294340 func mergeStake (userAddress,amountToAdd) = {
295- let $t01278112891 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
296- let isNewUser = $t01278112891._1
297- let stakedAmount = $t01278112891._2
298- let vpEffectiveHeight = $t01278112891._3
341+ let $t01490815018 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
342+ let isNewUser = $t01490815018._1
343+ let stakedAmount = $t01490815018._2
344+ let vpEffectiveHeight = $t01490815018._3
299345 let stakedAmountNEW = if (isNewUser)
300346 then amountToAdd
301347 else (amountToAdd + stakedAmount)
308354
309355
310356 func commonStake (userAddress,i) = {
311- let $t01337713431 = getParamsOrFail()
312- let stakedAssetId = $t01337713431._1
313- let minLockAmount = $t01337713431._2
357+ let $t01550415558 = getParamsOrFail()
358+ let stakedAssetId = $t01550415558._1
359+ let minLockAmount = $t01550415558._2
314360 if ((size(i.payments) != 1))
315361 then throw("Invalid payments size")
316362 else {
331377 if ((minLockAmount > stakedAmountNEW))
332378 then throw(("Min lock amount is " + toString(minLockAmount)))
333379 else {
334- let $t01423014332 = StatsResult(amount, 1, if (isNewUser)
380+ let $t01635716459 = StatsResult(amount, 1, if (isNewUser)
335381 then 1
336382 else 0)
337- let statsEntries = $t01423014332._1
338- let totalStaked = $t01423014332._2
339- let totalStakedNew = $t01423014332._3
383+ let statsEntries = $t01635716459._1
384+ let totalStaked = $t01635716459._2
385+ let totalStakedNew = $t01635716459._3
340386 ((([HistoryRecordEntry("stake", userAddress, i.transactionId, stakedAmount, vpEffectiveHeight, stakedAmountNEW, vpEffectiveHeightNEW)] ++ RewardEntries(isNewUser, userAddressStr, stakedAmount)) ++ LockParamsEntry(userAddress, stakedAmountNEW, vpEffectiveHeightNEW)) ++ statsEntries)
341387 }
342388 }
349395 if ((size(i.payments) > 0))
350396 then throw("payments are not accepted")
351397 else {
352- let $t01481114916 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
353- let isNewUser = $t01481114916._1
354- let stakedAmount = $t01481114916._2
355- let stakingStart = $t01481114916._3
398+ let $t01693817043 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
399+ let isNewUser = $t01693817043._1
400+ let stakedAmount = $t01693817043._2
401+ let stakingStart = $t01693817043._3
356402 let stakedAmountX = toBigInt(stakedAmount)
357403 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
358404 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
359405 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
360406 func forEachAssetCalcUnclaimedReward (accum,asset) = {
361- let $t01528715425 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
362- let rewardTotal = $t01528715425._1
363- let cached = $t01528715425._2
364- let dynamic = $t01528715425._3
365- let rewardCachedPartKEY = $t01528715425._4
407+ let $t01741417552 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
408+ let rewardTotal = $t01741417552._1
409+ let cached = $t01741417552._2
410+ let dynamic = $t01741417552._3
411+ let rewardCachedPartKEY = $t01741417552._4
366412 let claimedKEY = keyClaimed(userAddressStr, asset)
367- let $t01548515522 = accum
368- let data = $t01548515522._1
369- let claimedAmtByAsset = $t01548515522._2
413+ let $t01761217649 = accum
414+ let data = $t01761217649._1
415+ let claimedAmtByAsset = $t01761217649._2
370416 let newPart = makeString([asset, toString(rewardTotal)], ":")
371417 let claimedAmtByAssetNew = makeString([claimedAmtByAsset, newPart], "_")
372418 if ((0 >= rewardTotal))
374420 else $Tuple2((((data :+ ScriptTransfer(userAddress, rewardTotal, toAssetVect(asset))) :+ IntegerEntry(claimedKEY, (valueOrElse(getInteger(claimedKEY), 0) + rewardTotal))) :+ IntegerEntry(rewardCachedPartKEY, 0)), claimedAmtByAssetNew)
375421 }
376422
377- let $t01598216096 = {
423+ let $t01810918222 = {
378424 let $l = supportedAssetsList
379425 let $s = size($l)
380426 let $acc0 = $Tuple2(nil, "")
384430
385431 func $f0_2 ($a,$i) = if (($i >= $s))
386432 then $a
387- else throw("List size exceeds 10")
433+ else throw("List size exceeds 9")
388434
389- $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)
435+ $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)
390436 }
391- let transfers = $t01598216096._1
392- let claimedAmtByAssetResult = $t01598216096._2
437+ let transfers = $t01810918222._1
438+ let claimedAmtByAssetResult = $t01810918222._2
393439 if ((0 >= size(transfers)))
394- then nil
395- else ((transfers :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)) :+ ClaimHistoryEntry(userAddress, i.transactionId, drop(claimedAmtByAssetResult, 1)))
440+ then $Tuple2(nil, 0)
441+ else $Tuple2(((transfers :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)) :+ ClaimHistoryEntry(userAddress, i.transactionId, drop(claimedAmtByAssetResult, 1))), size(transfers))
396442 }
397443 }
398444
420466 else {
421467 let userAddress = i.caller
422468 let userAddressStr = toString(userAddress)
423- let $t01700517059 = getParamsOrFail()
424- let stakedAssetId = $t01700517059._1
425- let minLockAmount = $t01700517059._2
426- let $t01706217146 = getUserParamsOrFail(userAddress)
427- let isNewUser = $t01706217146._1
428- let stakedAmount = $t01706217146._2
429- let vpEffectiveHeight = $t01706217146._3
469+ let $t01915619210 = getParamsOrFail()
470+ let stakedAssetId = $t01915619210._1
471+ let minLockAmount = $t01915619210._2
472+ let $t01921319297 = getUserParamsOrFail(userAddress)
473+ let isNewUser = $t01921319297._1
474+ let stakedAmount = $t01921319297._2
475+ let vpEffectiveHeight = $t01921319297._3
430476 let swapParamsSTRUCT = asSwapParamsSTRUCT(reentrantInvoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStr, 0], nil))
431477 let swapLimitSpentInUsdn = swapParamsSTRUCT._2
432478 let blcks2LmtReset = swapParamsSTRUCT._3
438484 then throw(((("Requested " + toString(amount)) + ", but staked only ") + toString(stakedAmount)))
439485 else {
440486 let stakedAmountNEW = (stakedAmount - amount)
441- let $t01778417942 = StatsResult(-(amount), if ((amount == stakedAmount))
487+ let $t01993520093 = StatsResult(-(amount), if ((amount == stakedAmount))
442488 then -1
443489 else 0, if ((amount == stakedAmount))
444490 then -1
445491 else 0)
446- let statsEntries = $t01778417942._1
447- let totalStaked = $t01778417942._2
448- let totalStakedNew = $t01778417942._3
492+ let statsEntries = $t01993520093._1
493+ let totalStaked = $t01993520093._2
494+ let totalStakedNew = $t01993520093._3
449495 ((([ScriptTransfer(userAddress, amount, stakedAssetId), HistoryRecordEntry("unstake", userAddress, i.transactionId, stakedAmount, vpEffectiveHeight, stakedAmountNEW, vpEffectiveHeight)] ++ RewardEntries(false, userAddressStr, stakedAmount)) ++ LockParamsEntry(userAddress, stakedAmountNEW, vpEffectiveHeight)) ++ statsEntries)
450496 }
451497 }
486532 else StringEntry(rewardPerNsbtSumNewKEY, sumLastStr)))
487533 }
488534
489- ({
535+ (({
490536 let $l = supportedAssetsList
491537 let $s = size($l)
492538 let $acc0 = nil
496542
497543 func $f0_2 ($a,$i) = if (($i >= $s))
498544 then $a
499- else throw("List size exceeds 10")
545+ else throw("List size exceeds 9")
500546
501- $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)
502- } :+ IntegerEntry(depositNumLastKEY, depositNumNew))
547+ $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)
548+ } :+ IntegerEntry(depositNumLastKEY, depositNumNew)) ++ DepositsTotalsEntries(amount, pmtAssetIdStr))
503549 }
504550 }
505551 }
531577
532578 func $f0_2 ($a,$i) = if (($i >= $s))
533579 then $a
534- else throw("List size exceeds 10")
580+ else throw("List size exceeds 9")
535581
536- $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)
582+ $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)
537583 }
538584 else {
539585 let userAddress = addressFromStringValue(userAddressStr)
540- let $t02051620621 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
541- let isNewUser = $t02051620621._1
542- let stakedAmount = $t02051620621._2
543- let stakingStart = $t02051620621._3
586+ let $t02271722822 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
587+ let isNewUser = $t02271722822._1
588+ let stakedAmount = $t02271722822._2
589+ let stakingStart = $t02271722822._3
544590 let stakedAmountX = toBigInt(stakedAmount)
545591 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
546592 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
547593 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
548594 func forEachAssetCalcUnclaimedReward (accum,asset) = {
549- let $t02096721105 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
550- let rewardTotal = $t02096721105._1
551- let cached = $t02096721105._2
552- let dynamic = $t02096721105._3
553- let rewardCachedPartKEY = $t02096721105._4
595+ let $t02316823306 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
596+ let rewardTotal = $t02316823306._1
597+ let cached = $t02316823306._2
598+ let dynamic = $t02316823306._3
599+ let rewardCachedPartKEY = $t02316823306._4
554600 let claimed = valueOrElse(getInteger(keyClaimed(userAddressStr, asset)), 0)
555601 ((accum + makeString([asset, toString(rewardTotal), toString(claimed)], ":")) + "_")
556602 }
564610
565611 func $f0_2 ($a,$i) = if (($i >= $s))
566612 then $a
567- else throw("List size exceeds 10")
613+ else throw("List size exceeds 9")
568614
569- $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)
615+ $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)
570616 }
571617 $Tuple2(nil, dropRight(unclaimedRewardStr, 1))
572618 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let revisionNum = "049fe7b78896aec03c7fa106ba92e97b6ce41445"
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 let IdxControlCfgSurfStakingDapp = 10
4345
4446 let IdxControlCfgGnsbtControllerDapp = 11
4547
4648 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), (((("mandatory " + toString(address)) + ".") + key) + " is not defined"))
4749
4850
4951 func keyControlAddress () = "%s%s__config__controlAddress"
5052
5153
5254 func keyControlCfg () = "%s__controlConfig"
5355
5456
5557 func keyGnsbtFromSurfCoeff () = "%s%s__cfg__gnsbtFromSurfCoeff"
5658
5759
5860 func readControlCfgOrFail (control) = split(getStringOrFail(control, keyControlCfg()), SEP)
5961
6062
6163 func getContractAddressOrFail (controlCfg,idx) = valueOrErrorMessage(addressFromString(controlCfg[idx]), ("Control cfg doesn't contain address at index " + toString(idx)))
6264
6365
6466 let controlContract = addressFromStringValue(valueOrElse(getString(this, keyControlAddress()), "3P5Bfd58PPfNvBM2Hy8QfbcDqMeNtzg7KfP"))
6567
6668 let controlCfg = readControlCfgOrFail(controlContract)
6769
6870 let mathContract = getContractAddressOrFail(controlCfg, IdxControlCfgMathDapp)
6971
7072 let neutrinoContract = getContractAddressOrFail(controlCfg, IdxControlCfgNeutrinoDapp)
7173
7274 let auctionContract = getContractAddressOrFail(controlCfg, IdxControlCfgAuctionDapp)
7375
7476 let gnsbtFromSurfCoeff = valueOrElse(getInteger(this, keyGnsbtFromSurfCoeff()), 300)
7577
7678 func keyBondAsset () = "bond_asset_id"
7779
7880
7981 func keyAuctionContractAddress () = "auction_contract"
8082
8183
8284 func keyMinLockAmount () = "%s__minLockAmount"
8385
8486
8587 func keyStakedAssetId () = "%s__stakedAssetId"
8688
8789
8890 func keyLockParamUserAmount (userAddress) = makeString(["%s%s%s", "paramByUser", toString(userAddress), "amount"], separator)
8991
9092
9193 func keyLockParamStartBlock (userAddress) = makeString(["%s%s%s", "paramByUser", toString(userAddress), "start"], separator)
9294
9395
9496 func keyLockParamVotingPowerEffectiveHeight (userAddress) = makeString(["%s%s%s", "paramByUser", toString(userAddress), "vpEffectiveHeight"], separator)
9597
9698
9799 func keyHistoryRecord (type,userAddress,txId) = makeString(["%s%s%s%s", "history", type, toString(userAddress), toBase58String(txId)], separator)
98100
99101
100102 func keyLockParamTotalAmount () = makeString(["%s%s", "stats", "activeTotalLocked"], separator)
101103
102104
103105 func keyStatsLocksCount () = makeString(["%s%s", "stats", "locksCount"], separator)
104106
105107
106108 func keyStatsUsersCount () = makeString(["%s%s", "stats", "activeUsersCount"], separator)
109+
110+
111+func keyStatsDepositAmtByDay (timestamp) = makeString(["%s%s%d", "stats", "depositAmtByDay", toString(timestamp)], separator)
112+
113+
114+func keyStatsDepositAmtTotals () = makeString(["%s%s%d", "stats", "depositAmtTotals"], separator)
107115
108116
109117 func keyNextPeriod () = "%s__nextPeriod"
110118
111119
112120 func keySupportedRewardAssets () = "supportedRewardAssets"
113121
114122
115123 func keyDepositNumLast () = makeString(["%s%s%s", "dep", "lastNum"], separator)
116124
117125
118126 func keyUserRewardFromDepositNum (userAddress) = makeString(["%s%s%s", "userRwdFromDepNum", userAddress], separator)
119127
120128
121129 func keyRewardPerNsbtSumAt (depositNum,tkn) = makeString(["%s%d", "rwdPerNsbtSumByDepNum", toString(depositNum), tkn], separator)
122130
123131
124132 func keyReward (userAddress,tkn) = makeString(["%s%s%s", "rwd", userAddress, tkn], separator)
125133
126134
127135 func keyClaimed (userAddress,tkn) = makeString(["%s%s%s", "clm", userAddress, tkn], separator)
128136
129137
130138 func keyNotDistributedReward (tkn) = makeString(["%s%s", "notDistributed", tkn], separator)
131139
132140
133141 func toX18 (origVal,origMult) = fraction(toBigInt(origVal), MULTX18, origMult)
134142
135143
136144 func getIntOrZero (key) = valueOrElse(getInteger(this, key), 0)
137145
138146
139147 func getIntOrElse (key,defaultVal) = valueOrElse(getInteger(this, key), defaultVal)
140148
141149
142150 func getIntOrFail (key) = valueOrErrorMessage(getInteger(this, key), (("Mandatory this." + key) + " is not defined"))
143151
144152
145153 func getStrOrElse (key,defaultVal) = valueOrElse(getString(this, key), defaultVal)
146154
147155
148156 func toAddressOrFail (addressStr) = valueOrErrorMessage(addressFromString(addressStr), ("couldn't parse passed addressStr=" + addressStr))
149157
150158
151159 func toAssetVect (assetStr) = if ((assetStr == WAVESIDSTR))
152160 then unit
153161 else fromBase58String(assetStr)
154162
155163
156164 func asInt (val) = match val {
157165 case valInt: Int =>
158166 valInt
159167 case _ =>
160168 throw("fail to cast into Int")
161169 }
162170
163171
164172 func asSwapParamsSTRUCT (v) = match v {
165173 case struct: (Int, Int, Int, Int, Int, Int, Int) =>
166174 struct
167175 case _ =>
168176 throw("fail to cast into Int")
169177 }
170178
171179
172180 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)
173181
174182
175183 func formatClaimHistoryRecord (user,claimedRewards) = makeString(["%s%d%d%s", user, toString(lastBlock.height), toString(lastBlock.timestamp), claimedRewards], separator)
176184
177185
178186 func HistoryRecordEntry (type,userAddress,txId,oldAmount,oldStart,newAmount,newStart) = StringEntry(keyHistoryRecord(type, userAddress, txId), formatHistoryRecord(oldAmount, oldStart, newAmount, newStart))
179187
180188
181189 func ClaimHistoryEntry (userAddress,txId,claimedRewards) = StringEntry(keyHistoryRecord("claim", userAddress, txId), formatClaimHistoryRecord(toString(userAddress), claimedRewards))
182190
183191
184192 func StatsResult (totalLockedInc,lockCountInc,usersCountInc) = {
185193 let locksCount = getIntOrZero(keyStatsLocksCount())
186194 let usersCount = getIntOrZero(keyStatsUsersCount())
187195 let totalAmount = getIntOrZero(keyLockParamTotalAmount())
188196 let totalAmountNew = (totalAmount + totalLockedInc)
189197 $Tuple3([IntegerEntry(keyStatsLocksCount(), (locksCount + lockCountInc)), IntegerEntry(keyStatsUsersCount(), (usersCount + usersCountInc)), IntegerEntry(keyLockParamTotalAmount(), totalAmountNew)], totalAmount, totalAmountNew)
190198 }
191199
192200
193201 func LockParamsEntry (userAddress,amount,votingPowerEffectiveHeight) = [IntegerEntry(keyLockParamUserAmount(userAddress), amount), IntegerEntry(keyLockParamStartBlock(userAddress), votingPowerEffectiveHeight)]
194202
195203
196204 func getParamsOrFail () = $Tuple2(fromBase58String(getStringOrFail(this, keyStakedAssetId())), getIntOrFail(keyMinLockAmount()))
197205
198206
199207 func isActiveUser (userAddress) = (getIntOrElse(keyLockParamUserAmount(userAddress), 0) > 0)
200208
201209
202210 func getUserParamsOrUnit (userAddress) = if (isActiveUser(userAddress))
203211 then $Tuple3(false, getIntOrFail(keyLockParamUserAmount(userAddress)), getIntOrFail(keyLockParamStartBlock(userAddress)))
204212 else unit
205213
206214
207215 func getUserParamsOrFail (userAddress) = valueOrErrorMessage(getUserParamsOrUnit(userAddress), (("User " + toString(userAddress)) + " is not defined"))
208216
209217
210218 let supportedAssetsStr = getStrOrElse(keySupportedRewardAssets(), "")
211219
212220 let supportedAssetsList = split(supportedAssetsStr, "_")
213221
214222 func calcReward (userAddress,assetId,stakedAmountX,depositNumUser,depositNumLast) = {
215223 let rewardPerNsbtSumLastKEY = keyRewardPerNsbtSumAt(depositNumLast, assetId)
216224 let sumLastX18 = parseBigIntValue(getStrOrElse(keyRewardPerNsbtSumAt(depositNumLast, assetId), "0"))
217225 let sumUserX18 = parseBigIntValue(getStrOrElse(keyRewardPerNsbtSumAt(depositNumUser, assetId), "0"))
218226 let rewardDynamicPart = toInt(fraction((sumLastX18 - sumUserX18), stakedAmountX, MULTX18))
219227 let rewardCachedPartKEY = keyReward(userAddress, assetId)
220228 let rewardCachedPart = getIntOrElse(rewardCachedPartKEY, 0)
221229 $Tuple4((rewardCachedPart + rewardDynamicPart), rewardCachedPart, rewardDynamicPart, rewardCachedPartKEY)
222230 }
223231
224232
233+func toStartOfDay (timestamp) = ((timestamp / DAYMILLIS) * DAYMILLIS)
234+
235+
236+func findElementPosition (src,element,sep) = {
237+ let elementStart = valueOrErrorMessage(indexOf(src, element), ((("there is no substring " + element) + " in ") + src))
238+ if ((elementStart == 0))
239+ then 0
240+ else {
241+ let left = take(src, elementStart)
242+ (size(split(left, sep)) - 1)
243+ }
244+ }
245+
246+
247+let DepositTotalsPREFIX = "%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d"
248+
249+func updateDepositTotals (currVal,idxToUpdate,deltaAmt) = {
250+ let currArr = split(currVal, SEP)
251+ func updDepTotByIdx (idx) = if ((idx != idxToUpdate))
252+ then currArr[idx]
253+ else toString((parseIntValue(currArr[idx]) + deltaAmt))
254+
255+ 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)
256+ }
257+
258+
259+func DepositsTotalsEntries (depositAmount,assetIdStr) = {
260+ let startOfDay = toStartOfDay(lastBlock.timestamp)
261+ let byDayKEY = keyStatsDepositAmtByDay(startOfDay)
262+ let totalsKEY = keyStatsDepositAmtTotals()
263+ let position = findElementPosition(supportedAssetsStr, assetIdStr, "_")
264+ let defaultDATA = (DepositTotalsPREFIX + "__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0__0")
265+ let currTotalsDATA = valueOrElse(getString(this, totalsKEY), defaultDATA)
266+ let newTotalsDATA = updateDepositTotals(currTotalsDATA, (position + 1), depositAmount)
267+[StringEntry(totalsKEY, newTotalsDATA), StringEntry(byDayKEY, newTotalsDATA)]
268+ }
269+
270+
225271 func RewardEntries (isNewUser,userAddress,stakedAmount) = {
226272 let stakedAmountX = toBigInt(stakedAmount)
227273 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddress)
228274 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
229275 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
230276 func forEachAssetCacheUserReward (accum,asset) = {
231- let $t089939128 = calcReward(userAddress, asset, stakedAmountX, depositNumUser, depositNumLast)
232- let rewardTotal = $t089939128._1
233- let cached = $t089939128._2
234- let dynamic = $t089939128._3
235- let rewardCachedPartKEY = $t089939128._4
277+ let $t01112111256 = calcReward(userAddress, asset, stakedAmountX, depositNumUser, depositNumLast)
278+ let rewardTotal = $t01112111256._1
279+ let cached = $t01112111256._2
280+ let dynamic = $t01112111256._3
281+ let rewardCachedPartKEY = $t01112111256._4
236282 (accum :+ IntegerEntry(rewardCachedPartKEY, rewardTotal))
237283 }
238284
239285 if (if ((depositNumLast == -1))
240286 then (depositNumUser == -1)
241287 else false)
242288 then nil
243289 else if (if ((depositNumLast == -1))
244290 then (depositNumUser > -1)
245291 else false)
246292 then throw("invalid depositNumLast and depositNumUser state")
247293 else if (if ((depositNumLast > -1))
248294 then (depositNumUser >= -1)
249295 else false)
250296 then if (isNewUser)
251297 then [IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)]
252298 else ({
253299 let $l = supportedAssetsList
254300 let $s = size($l)
255301 let $acc0 = nil
256302 func $f0_1 ($a,$i) = if (($i >= $s))
257303 then $a
258304 else forEachAssetCacheUserReward($a, $l[$i])
259305
260306 func $f0_2 ($a,$i) = if (($i >= $s))
261307 then $a
262- else throw("List size exceeds 10")
308+ else throw("List size exceeds 9")
263309
264- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
310+ $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)
265311 } :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast))
266312 else throw(((("uncovered condition: depositNumLast=" + toString(depositNumLast)) + " depositNumUser=") + toString(depositNumUser)))
267313 }
268314
269315
270316 func IncrementNotDistributedRewardEntry (tkn,amountInc) = {
271317 let notDistributedRewardKEY = keyNotDistributedReward(tkn)
272318 let notDistributedReward = getIntOrElse(notDistributedRewardKEY, 0)
273319 [IntegerEntry(notDistributedRewardKEY, (notDistributedReward + amountInc))]
274320 }
275321
276322
277323 func surfToGnsbt (surfAmt) = (surfAmt / gnsbtFromSurfCoeff)
278324
279325
280326 func mergeVotingPowerEffectiveHeight (quarantinePeriod,vpEffectiveHeight,stakedAmt,stakedAmtNEW) = {
281327 let remainingToWait = (vpEffectiveHeight - height)
282328 if ((0 >= remainingToWait))
283329 then (height + quarantinePeriod)
284330 else {
285331 let alreadyWaited = (quarantinePeriod - remainingToWait)
286332 let kX8 = if ((stakedAmtNEW != 0))
287333 then fraction(stakedAmt, MULT8, stakedAmtNEW)
288334 else vpEffectiveHeight
289335 ((quarantinePeriod + height) - fraction(alreadyWaited, kX8, MULT8))
290336 }
291337 }
292338
293339
294340 func mergeStake (userAddress,amountToAdd) = {
295- let $t01278112891 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
296- let isNewUser = $t01278112891._1
297- let stakedAmount = $t01278112891._2
298- let vpEffectiveHeight = $t01278112891._3
341+ let $t01490815018 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
342+ let isNewUser = $t01490815018._1
343+ let stakedAmount = $t01490815018._2
344+ let vpEffectiveHeight = $t01490815018._3
299345 let stakedAmountNEW = if (isNewUser)
300346 then amountToAdd
301347 else (amountToAdd + stakedAmount)
302348 let quarantinePeriod = (1440 * 14)
303349 let vpEffectiveHeightNEW = if (isNewUser)
304350 then (quarantinePeriod + height)
305351 else mergeVotingPowerEffectiveHeight(quarantinePeriod, vpEffectiveHeight, stakedAmount, stakedAmountNEW)
306352 $Tuple5(isNewUser, stakedAmount, vpEffectiveHeight, stakedAmountNEW, vpEffectiveHeightNEW)
307353 }
308354
309355
310356 func commonStake (userAddress,i) = {
311- let $t01337713431 = getParamsOrFail()
312- let stakedAssetId = $t01337713431._1
313- let minLockAmount = $t01337713431._2
357+ let $t01550415558 = getParamsOrFail()
358+ let stakedAssetId = $t01550415558._1
359+ let minLockAmount = $t01550415558._2
314360 if ((size(i.payments) != 1))
315361 then throw("Invalid payments size")
316362 else {
317363 let payment = i.payments[0]
318364 let amount = payment.amount
319365 let invalidAssetMessage = (("Invalid asset. " + toBase58String(stakedAssetId)) + " is expected")
320366 let assetId = valueOrErrorMessage(payment.assetId, invalidAssetMessage)
321367 if ((assetId != stakedAssetId))
322368 then throw(invalidAssetMessage)
323369 else {
324370 let userAddressStr = toString(userAddress)
325371 let mergedData = mergeStake(userAddress, amount)
326372 let isNewUser = mergedData._1
327373 let stakedAmount = mergedData._2
328374 let vpEffectiveHeight = mergedData._3
329375 let stakedAmountNEW = mergedData._4
330376 let vpEffectiveHeightNEW = mergedData._5
331377 if ((minLockAmount > stakedAmountNEW))
332378 then throw(("Min lock amount is " + toString(minLockAmount)))
333379 else {
334- let $t01423014332 = StatsResult(amount, 1, if (isNewUser)
380+ let $t01635716459 = StatsResult(amount, 1, if (isNewUser)
335381 then 1
336382 else 0)
337- let statsEntries = $t01423014332._1
338- let totalStaked = $t01423014332._2
339- let totalStakedNew = $t01423014332._3
383+ let statsEntries = $t01635716459._1
384+ let totalStaked = $t01635716459._2
385+ let totalStakedNew = $t01635716459._3
340386 ((([HistoryRecordEntry("stake", userAddress, i.transactionId, stakedAmount, vpEffectiveHeight, stakedAmountNEW, vpEffectiveHeightNEW)] ++ RewardEntries(isNewUser, userAddressStr, stakedAmount)) ++ LockParamsEntry(userAddress, stakedAmountNEW, vpEffectiveHeightNEW)) ++ statsEntries)
341387 }
342388 }
343389 }
344390 }
345391
346392
347393 func commonClaim (userAddress,i) = {
348394 let userAddressStr = toString(userAddress)
349395 if ((size(i.payments) > 0))
350396 then throw("payments are not accepted")
351397 else {
352- let $t01481114916 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
353- let isNewUser = $t01481114916._1
354- let stakedAmount = $t01481114916._2
355- let stakingStart = $t01481114916._3
398+ let $t01693817043 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
399+ let isNewUser = $t01693817043._1
400+ let stakedAmount = $t01693817043._2
401+ let stakingStart = $t01693817043._3
356402 let stakedAmountX = toBigInt(stakedAmount)
357403 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
358404 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
359405 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
360406 func forEachAssetCalcUnclaimedReward (accum,asset) = {
361- let $t01528715425 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
362- let rewardTotal = $t01528715425._1
363- let cached = $t01528715425._2
364- let dynamic = $t01528715425._3
365- let rewardCachedPartKEY = $t01528715425._4
407+ let $t01741417552 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
408+ let rewardTotal = $t01741417552._1
409+ let cached = $t01741417552._2
410+ let dynamic = $t01741417552._3
411+ let rewardCachedPartKEY = $t01741417552._4
366412 let claimedKEY = keyClaimed(userAddressStr, asset)
367- let $t01548515522 = accum
368- let data = $t01548515522._1
369- let claimedAmtByAsset = $t01548515522._2
413+ let $t01761217649 = accum
414+ let data = $t01761217649._1
415+ let claimedAmtByAsset = $t01761217649._2
370416 let newPart = makeString([asset, toString(rewardTotal)], ":")
371417 let claimedAmtByAssetNew = makeString([claimedAmtByAsset, newPart], "_")
372418 if ((0 >= rewardTotal))
373419 then $Tuple2(data, claimedAmtByAssetNew)
374420 else $Tuple2((((data :+ ScriptTransfer(userAddress, rewardTotal, toAssetVect(asset))) :+ IntegerEntry(claimedKEY, (valueOrElse(getInteger(claimedKEY), 0) + rewardTotal))) :+ IntegerEntry(rewardCachedPartKEY, 0)), claimedAmtByAssetNew)
375421 }
376422
377- let $t01598216096 = {
423+ let $t01810918222 = {
378424 let $l = supportedAssetsList
379425 let $s = size($l)
380426 let $acc0 = $Tuple2(nil, "")
381427 func $f0_1 ($a,$i) = if (($i >= $s))
382428 then $a
383429 else forEachAssetCalcUnclaimedReward($a, $l[$i])
384430
385431 func $f0_2 ($a,$i) = if (($i >= $s))
386432 then $a
387- else throw("List size exceeds 10")
433+ else throw("List size exceeds 9")
388434
389- $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)
435+ $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)
390436 }
391- let transfers = $t01598216096._1
392- let claimedAmtByAssetResult = $t01598216096._2
437+ let transfers = $t01810918222._1
438+ let claimedAmtByAssetResult = $t01810918222._2
393439 if ((0 >= size(transfers)))
394- then nil
395- else ((transfers :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)) :+ ClaimHistoryEntry(userAddress, i.transactionId, drop(claimedAmtByAssetResult, 1)))
440+ then $Tuple2(nil, 0)
441+ else $Tuple2(((transfers :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)) :+ ClaimHistoryEntry(userAddress, i.transactionId, drop(claimedAmtByAssetResult, 1))), size(transfers))
396442 }
397443 }
398444
399445
400446 @Callable(i)
401447 func constructor (minLockAmount,supportedRewardAssets,stakedAssetId) = if ((i.caller != this))
402448 then throw("Permission denied")
403449 else [IntegerEntry(keyMinLockAmount(), minLockAmount), StringEntry(keySupportedRewardAssets(), supportedRewardAssets), StringEntry(keyStakedAssetId(), stakedAssetId)]
404450
405451
406452
407453 @Callable(i)
408454 func stake () = commonStake(i.caller, i)
409455
410456
411457
412458 @Callable(i)
413459 func stakeByOriginCaller () = commonStake(i.originCaller, i)
414460
415461
416462
417463 @Callable(i)
418464 func unstake (amount) = if ((size(i.payments) != 0))
419465 then throw("unstake doesn't require any payment")
420466 else {
421467 let userAddress = i.caller
422468 let userAddressStr = toString(userAddress)
423- let $t01700517059 = getParamsOrFail()
424- let stakedAssetId = $t01700517059._1
425- let minLockAmount = $t01700517059._2
426- let $t01706217146 = getUserParamsOrFail(userAddress)
427- let isNewUser = $t01706217146._1
428- let stakedAmount = $t01706217146._2
429- let vpEffectiveHeight = $t01706217146._3
469+ let $t01915619210 = getParamsOrFail()
470+ let stakedAssetId = $t01915619210._1
471+ let minLockAmount = $t01915619210._2
472+ let $t01921319297 = getUserParamsOrFail(userAddress)
473+ let isNewUser = $t01921319297._1
474+ let stakedAmount = $t01921319297._2
475+ let vpEffectiveHeight = $t01921319297._3
430476 let swapParamsSTRUCT = asSwapParamsSTRUCT(reentrantInvoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStr, 0], nil))
431477 let swapLimitSpentInUsdn = swapParamsSTRUCT._2
432478 let blcks2LmtReset = swapParamsSTRUCT._3
433479 if ((swapLimitSpentInUsdn > 0))
434480 then throw((("You have already made a swap operation. Wait " + toString((height + blcks2LmtReset))) + " height to unstake"))
435481 else if ((0 >= stakedAmount))
436482 then throw("Nothing to unstake")
437483 else if ((amount > stakedAmount))
438484 then throw(((("Requested " + toString(amount)) + ", but staked only ") + toString(stakedAmount)))
439485 else {
440486 let stakedAmountNEW = (stakedAmount - amount)
441- let $t01778417942 = StatsResult(-(amount), if ((amount == stakedAmount))
487+ let $t01993520093 = StatsResult(-(amount), if ((amount == stakedAmount))
442488 then -1
443489 else 0, if ((amount == stakedAmount))
444490 then -1
445491 else 0)
446- let statsEntries = $t01778417942._1
447- let totalStaked = $t01778417942._2
448- let totalStakedNew = $t01778417942._3
492+ let statsEntries = $t01993520093._1
493+ let totalStaked = $t01993520093._2
494+ let totalStakedNew = $t01993520093._3
449495 ((([ScriptTransfer(userAddress, amount, stakedAssetId), HistoryRecordEntry("unstake", userAddress, i.transactionId, stakedAmount, vpEffectiveHeight, stakedAmountNEW, vpEffectiveHeight)] ++ RewardEntries(false, userAddressStr, stakedAmount)) ++ LockParamsEntry(userAddress, stakedAmountNEW, vpEffectiveHeight)) ++ statsEntries)
450496 }
451497 }
452498
453499
454500
455501 @Callable(i)
456502 func deposit () = if ((size(i.payments) != 1))
457503 then throw("exact 1 payment is allowed only")
458504 else {
459505 let pmt = i.payments[0]
460506 let amount = pmt.amount
461507 let pmtAssetId = valueOrElse(pmt.assetId, WAVESID)
462508 let pmtAssetIdStr = toBase58String(pmtAssetId)
463509 let pmtMultX = if ((pmtAssetId == WAVESID))
464510 then MULTX8
465511 else MULTX6
466512 let amountX = toBigInt(amount)
467513 let totalStaked = getIntOrElse(keyLockParamTotalAmount(), 0)
468514 let totalStakedX = toBigInt(totalStaked)
469515 if ((0 > totalStaked))
470516 then throw("TODO: case is not supported")
471517 else if ((totalStaked == 0))
472518 then IncrementNotDistributedRewardEntry(pmtAssetIdStr, amount)
473519 else {
474520 let rewardPerNsbtX18 = fraction(amountX, MULTX18, totalStakedX)
475521 let depositNumLastKEY = keyDepositNumLast()
476522 let depositNumLast = getIntOrElse(depositNumLastKEY, -1)
477523 let depositNumNew = (depositNumLast + 1)
478524 if (!(contains(supportedAssetsStr, pmtAssetIdStr)))
479525 then throw(((supportedAssetsStr + " doesn't contain ") + pmtAssetIdStr))
480526 else {
481527 func refreshRewardPerNsbtSUM (accum,nextAsset) = {
482528 let rewardPerNsbtSumNewKEY = keyRewardPerNsbtSumAt(depositNumNew, nextAsset)
483529 let sumLastStr = getStrOrElse(keyRewardPerNsbtSumAt(depositNumLast, nextAsset), "0")
484530 (accum :+ (if ((nextAsset == pmtAssetIdStr))
485531 then StringEntry(rewardPerNsbtSumNewKEY, toString((parseBigIntValue(sumLastStr) + rewardPerNsbtX18)))
486532 else StringEntry(rewardPerNsbtSumNewKEY, sumLastStr)))
487533 }
488534
489- ({
535+ (({
490536 let $l = supportedAssetsList
491537 let $s = size($l)
492538 let $acc0 = nil
493539 func $f0_1 ($a,$i) = if (($i >= $s))
494540 then $a
495541 else refreshRewardPerNsbtSUM($a, $l[$i])
496542
497543 func $f0_2 ($a,$i) = if (($i >= $s))
498544 then $a
499- else throw("List size exceeds 10")
545+ else throw("List size exceeds 9")
500546
501- $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)
502- } :+ IntegerEntry(depositNumLastKEY, depositNumNew))
547+ $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)
548+ } :+ IntegerEntry(depositNumLastKEY, depositNumNew)) ++ DepositsTotalsEntries(amount, pmtAssetIdStr))
503549 }
504550 }
505551 }
506552
507553
508554
509555 @Callable(i)
510556 func claimRewards () = commonClaim(i.caller, i)
511557
512558
513559
514560 @Callable(i)
515561 func claimRewardsByOriginCaller () = commonClaim(i.originCaller, i)
516562
517563
518564
519565 @Callable(i)
520566 func unclaimedRewardsREADONLY (userAddressStr) = {
521567 func forEachAssetZeroReward (accum,asset) = ((accum + makeString([asset, "0", "0"], ":")) + "_")
522568
523569 let unclaimedRewardStr = if ((userAddressStr == ""))
524570 then {
525571 let $l = supportedAssetsList
526572 let $s = size($l)
527573 let $acc0 = ""
528574 func $f0_1 ($a,$i) = if (($i >= $s))
529575 then $a
530576 else forEachAssetZeroReward($a, $l[$i])
531577
532578 func $f0_2 ($a,$i) = if (($i >= $s))
533579 then $a
534- else throw("List size exceeds 10")
580+ else throw("List size exceeds 9")
535581
536- $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)
582+ $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)
537583 }
538584 else {
539585 let userAddress = addressFromStringValue(userAddressStr)
540- let $t02051620621 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
541- let isNewUser = $t02051620621._1
542- let stakedAmount = $t02051620621._2
543- let stakingStart = $t02051620621._3
586+ let $t02271722822 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
587+ let isNewUser = $t02271722822._1
588+ let stakedAmount = $t02271722822._2
589+ let stakingStart = $t02271722822._3
544590 let stakedAmountX = toBigInt(stakedAmount)
545591 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
546592 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
547593 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
548594 func forEachAssetCalcUnclaimedReward (accum,asset) = {
549- let $t02096721105 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
550- let rewardTotal = $t02096721105._1
551- let cached = $t02096721105._2
552- let dynamic = $t02096721105._3
553- let rewardCachedPartKEY = $t02096721105._4
595+ let $t02316823306 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
596+ let rewardTotal = $t02316823306._1
597+ let cached = $t02316823306._2
598+ let dynamic = $t02316823306._3
599+ let rewardCachedPartKEY = $t02316823306._4
554600 let claimed = valueOrElse(getInteger(keyClaimed(userAddressStr, asset)), 0)
555601 ((accum + makeString([asset, toString(rewardTotal), toString(claimed)], ":")) + "_")
556602 }
557603
558604 let $l = supportedAssetsList
559605 let $s = size($l)
560606 let $acc0 = ""
561607 func $f0_1 ($a,$i) = if (($i >= $s))
562608 then $a
563609 else forEachAssetCalcUnclaimedReward($a, $l[$i])
564610
565611 func $f0_2 ($a,$i) = if (($i >= $s))
566612 then $a
567- else throw("List size exceeds 10")
613+ else throw("List size exceeds 9")
568614
569- $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)
615+ $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)
570616 }
571617 $Tuple2(nil, dropRight(unclaimedRewardStr, 1))
572618 }
573619
574620
575621
576622 @Callable(i)
577623 func surfStakingSYSREADONLY (userAddressStrOrEmpty,surfDiff) = {
578624 let surfTotal = getIntOrElse(keyLockParamTotalAmount(), 0)
579625 let gnsbtFromSurfTotal = surfToGnsbt(surfTotal)
580626 if ((userAddressStrOrEmpty == ""))
581627 then $Tuple2(nil, [0, surfTotal, 0, gnsbtFromSurfTotal, 0, height, height])
582628 else {
583629 let userAddress = toAddressOrFail(userAddressStrOrEmpty)
584630 let mergedData = mergeStake(userAddress, surfDiff)
585631 let isNewUser = mergedData._1
586632 let stakedAmount = mergedData._2
587633 let vpEffectiveHeight = mergedData._3
588634 let stakedAmountNEW = mergedData._4
589635 let vpEffectiveHeightNEW = mergedData._5
590636 let surfUser = stakedAmount
591637 let gnsbtFromSurfUser = surfToGnsbt(surfUser)
592638 $Tuple2(nil, [surfUser, surfTotal, gnsbtFromSurfUser, gnsbtFromSurfTotal, vpEffectiveHeight, vpEffectiveHeightNEW])
593639 }
594640 }
595641
596642
597643
598644 @Callable(i)
599645 func gnsbtFromSurfSYSREADONLY (surfAmt) = $Tuple2(nil, surfToGnsbt(surfAmt))
600646
601647
602648
603649 @Callable(i)
604650 func configSYSREADONLY () = {
605651 let minLockAmt = getIntegerValue(keyMinLockAmount())
606652 let surfVotingPowerRestrictivePeriod = (1440 * 14)
607653 let brToStartSurfTransformation = 1150000
608654 $Tuple2(nil, [minLockAmt, (gnsbtFromSurfCoeff * MULT6), surfVotingPowerRestrictivePeriod, brToStartSurfTransformation])
609655 }
610656
611657

github/deemru/w8io/6500d08 
97.26 ms