tx · 5QhYwBHtJGPxSwDsWDEUxY7GsRg4Uhbqu794nCFRqNUA

3N5yarEiTQccnnuerogYT3BxM5Zc5bRgDZy:  -0.04000000 Waves

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

{ "type": 13, "id": "5QhYwBHtJGPxSwDsWDEUxY7GsRg4Uhbqu794nCFRqNUA", "fee": 4000000, "feeAssetId": null, "timestamp": 1659449437104, "version": 1, "sender": "3N5yarEiTQccnnuerogYT3BxM5Zc5bRgDZy", "senderPublicKey": "FK9j3YFWVChXKESTn33fMZz1JseCNMMqHhfB7smxJo4e", "proofs": [ "sernKpAz41Kb7zWwB2LWVp4fg5rSdmVhtGXuxGbEUgGogP2nbwNu7kXspL9JNRh7yn7YTqFFtsG4U25SResPJgY" ], "script": "base64:BgIkCAISBQoDAQgIEgASABIDCgEBEgASABIAEgMKAQgSAwoBCBIASgAJc2VwYXJhdG9yAgJfXwADU0VQAgJfXwAFTVVMVDYAwIQ9AAVNVUxUOACAwtcvAAZNVUxUWDYJALYCAQUFTVVMVDYABk1VTFRYOAkAtgIBBQVNVUxUOAAHTVVMVFgxOAkAtgIBAICAkLu61q3wDQAKV0FWRVNJRFNUUgIFV0FWRVMAB1dBVkVTSUQJANkEAQUKV0FWRVNJRFNUUgAZSWR4Q29udHJvbENmZ05ldXRyaW5vRGFwcAABABhJZHhDb250cm9sQ2ZnQXVjdGlvbkRhcHAAAgAUSWR4Q29udHJvbENmZ1JwZERhcHAAAwAVSWR4Q29udHJvbENmZ01hdGhEYXBwAAQAHElkeENvbnRyb2xDZmdMaXF1aWRhdGlvbkRhcHAABQAVSWR4Q29udHJvbENmZ1Jlc3REYXBwAAYAHUlkeENvbnRyb2xDZmdOb2RlUmVnaXN0cnlEYXBwAAcAHElkeENvbnRyb2xDZmdOc2J0U3Rha2luZ0RhcHAACAAZSWR4Q29udHJvbENmZ01lZGlhdG9yRGFwcAAJABxJZHhDb250cm9sQ2ZnU3VyZlN0YWtpbmdEYXBwAAoAIElkeENvbnRyb2xDZmdHbnNidENvbnRyb2xsZXJEYXBwAAsBD2dldFN0cmluZ09yRmFpbAIHYWRkcmVzcwNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQdhZGRyZXNzBQNrZXkJAKwCAgkArAICCQCsAgIJAKwCAgIKbWFuZGF0b3J5IAkApQgBBQdhZGRyZXNzAgEuBQNrZXkCDyBpcyBub3QgZGVmaW5lZAERa2V5Q29udHJvbEFkZHJlc3MAAhwlcyVzX19jb25maWdfX2NvbnRyb2xBZGRyZXNzAQ1rZXlDb250cm9sQ2ZnAAIRJXNfX2NvbnRyb2xDb25maWcBFHJlYWRDb250cm9sQ2ZnT3JGYWlsAQdjb250cm9sCQC1CQIJAQ9nZXRTdHJpbmdPckZhaWwCBQdjb250cm9sCQENa2V5Q29udHJvbENmZwAFA1NFUAEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgpjb250cm9sQ2ZnA2lkeAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUKY29udHJvbENmZwUDaWR4CQCsAgICLUNvbnRyb2wgY2ZnIGRvZXNuJ3QgY29udGFpbiBhZGRyZXNzIGF0IGluZGV4IAkApAMBBQNpZHgAD2NvbnRyb2xDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQERa2V5Q29udHJvbEFkZHJlc3MAAiMzTjROUzdkNEpvOWE2RjE0TGlGVUtLWVZkVWtrZjJlUDRaeAAKY29udHJvbENmZwkBFHJlYWRDb250cm9sQ2ZnT3JGYWlsAQUPY29udHJvbENvbnRyYWN0AAxtYXRoQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQpjb250cm9sQ2ZnBRVJZHhDb250cm9sQ2ZnTWF0aERhcHAAEG5ldXRyaW5vQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQpjb250cm9sQ2ZnBRlJZHhDb250cm9sQ2ZnTmV1dHJpbm9EYXBwAA9hdWN0aW9uQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQpjb250cm9sQ2ZnBRhJZHhDb250cm9sQ2ZnQXVjdGlvbkRhcHABDGtleUJvbmRBc3NldAACDWJvbmRfYXNzZXRfaWQBGWtleUF1Y3Rpb25Db250cmFjdEFkZHJlc3MAAhBhdWN0aW9uX2NvbnRyYWN0ARBrZXlNaW5Mb2NrQW1vdW50AAIRJXNfX21pbkxvY2tBbW91bnQBEGtleVN0YWtlZEFzc2V0SWQAAhElc19fc3Rha2VkQXNzZXRJZAEWa2V5TG9ja1BhcmFtVXNlckFtb3VudAELdXNlckFkZHJlc3MJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgILcGFyYW1CeVVzZXIJAMwIAgkApQgBBQt1c2VyQWRkcmVzcwkAzAgCAgZhbW91bnQFA25pbAUJc2VwYXJhdG9yARZrZXlMb2NrUGFyYW1TdGFydEJsb2NrAQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgtwYXJhbUJ5VXNlcgkAzAgCCQClCAEFC3VzZXJBZGRyZXNzCQDMCAICBXN0YXJ0BQNuaWwFCXNlcGFyYXRvcgEQa2V5SGlzdG9yeVJlY29yZAMEdHlwZQt1c2VyQWRkcmVzcwR0eElkCQC5CQIJAMwIAgIIJXMlcyVzJXMJAMwIAgIHaGlzdG9yeQkAzAgCBQR0eXBlCQDMCAIJAKUIAQULdXNlckFkZHJlc3MJAMwIAgkA2AQBBQR0eElkBQNuaWwFCXNlcGFyYXRvcgEXa2V5TG9ja1BhcmFtVG90YWxBbW91bnQACQC5CQIJAMwIAgIEJXMlcwkAzAgCAgVzdGF0cwkAzAgCAhFhY3RpdmVUb3RhbExvY2tlZAUDbmlsBQlzZXBhcmF0b3IBEmtleVN0YXRzTG9ja3NDb3VudAAJALkJAgkAzAgCAgQlcyVzCQDMCAICBXN0YXRzCQDMCAICCmxvY2tzQ291bnQFA25pbAUJc2VwYXJhdG9yARJrZXlTdGF0c1VzZXJzQ291bnQACQC5CQIJAMwIAgIEJXMlcwkAzAgCAgVzdGF0cwkAzAgCAhBhY3RpdmVVc2Vyc0NvdW50BQNuaWwFCXNlcGFyYXRvcgENa2V5TmV4dFBlcmlvZAACDiVzX19uZXh0UGVyaW9kARhrZXlTdXBwb3J0ZWRSZXdhcmRBc3NldHMAAhVzdXBwb3J0ZWRSZXdhcmRBc3NldHMBEWtleURlcG9zaXROdW1MYXN0AAkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgNkZXAJAMwIAgIHbGFzdE51bQUDbmlsBQlzZXBhcmF0b3IBG2tleVVzZXJSZXdhcmRGcm9tRGVwb3NpdE51bQELdXNlckFkZHJlc3MJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIRdXNlclJ3ZEZyb21EZXBOdW0JAMwIAgULdXNlckFkZHJlc3MFA25pbAUJc2VwYXJhdG9yARVrZXlSZXdhcmRQZXJOc2J0U3VtQXQCCmRlcG9zaXROdW0DdGtuCQC5CQIJAMwIAgIEJXMlZAkAzAgCAhVyd2RQZXJOc2J0U3VtQnlEZXBOdW0JAMwIAgkApAMBBQpkZXBvc2l0TnVtCQDMCAIFA3RrbgUDbmlsBQlzZXBhcmF0b3IBCWtleVJld2FyZAILdXNlckFkZHJlc3MDdGtuCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICA3J3ZAkAzAgCBQt1c2VyQWRkcmVzcwkAzAgCBQN0a24FA25pbAUJc2VwYXJhdG9yAQprZXlDbGFpbWVkAgt1c2VyQWRkcmVzcwN0a24JALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIDY2xtCQDMCAIFC3VzZXJBZGRyZXNzCQDMCAIFA3RrbgUDbmlsBQlzZXBhcmF0b3IBF2tleU5vdERpc3RyaWJ1dGVkUmV3YXJkAQN0a24JALkJAgkAzAgCAgQlcyVzCQDMCAICDm5vdERpc3RyaWJ1dGVkCQDMCAIFA3RrbgUDbmlsBQlzZXBhcmF0b3IBBXRvWDE4AgdvcmlnVmFsCG9yaWdNdWx0CQC8AgMJALYCAQUHb3JpZ1ZhbAUHTVVMVFgxOAUIb3JpZ011bHQBDGdldEludE9yWmVybwEDa2V5CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQAAAQxnZXRJbnRPckVsc2UCA2tleQpkZWZhdWx0VmFsCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQUKZGVmYXVsdFZhbAEMZ2V0SW50T3JGYWlsAQNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzBQNrZXkJAKwCAgkArAICAg9NYW5kYXRvcnkgdGhpcy4FA2tleQIPIGlzIG5vdCBkZWZpbmVkAQxnZXRTdHJPckVsc2UCA2tleQpkZWZhdWx0VmFsCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFA2tleQUKZGVmYXVsdFZhbAEPdG9BZGRyZXNzT3JGYWlsAQphZGRyZXNzU3RyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQUKYWRkcmVzc1N0cgkArAICAiFjb3VsZG4ndCBwYXJzZSBwYXNzZWQgYWRkcmVzc1N0cj0FCmFkZHJlc3NTdHIBC3RvQXNzZXRWZWN0AQhhc3NldFN0cgMJAAACBQhhc3NldFN0cgUKV0FWRVNJRFNUUgUEdW5pdAkA2QQBBQhhc3NldFN0cgEFYXNJbnQBA3ZhbAQHJG1hdGNoMAUDdmFsAwkAAQIFByRtYXRjaDACA0ludAQGdmFsSW50BQckbWF0Y2gwBQZ2YWxJbnQJAAIBAhVmYWlsIHRvIGNhc3QgaW50byBJbnQBE2Zvcm1hdEhpc3RvcnlSZWNvcmQECW9sZEFtb3VudAhvbGRTdGFydAluZXdBbW91bnQIbmV3U3RhcnQJALkJAgkAzAgCAgwlZCVkJWQlZCVkJWQJAMwIAgkApAMBCAUJbGFzdEJsb2NrBmhlaWdodAkAzAgCCQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAKQDAQUJb2xkQW1vdW50CQDMCAIJAKQDAQUIb2xkU3RhcnQJAMwIAgkApAMBBQluZXdBbW91bnQJAMwIAgkApAMBBQhuZXdTdGFydAUDbmlsBQlzZXBhcmF0b3IBGGZvcm1hdENsYWltSGlzdG9yeVJlY29yZAIEdXNlcg5jbGFpbWVkUmV3YXJkcwkAuQkCCQDMCAICCCVzJWQlZCVzCQDMCAIFBHVzZXIJAMwIAgkApAMBCAUJbGFzdEJsb2NrBmhlaWdodAkAzAgCCQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIFDmNsYWltZWRSZXdhcmRzBQNuaWwFCXNlcGFyYXRvcgESSGlzdG9yeVJlY29yZEVudHJ5BwR0eXBlC3VzZXJBZGRyZXNzBHR4SWQJb2xkQW1vdW50CG9sZFN0YXJ0CW5ld0Ftb3VudAhuZXdTdGFydAkBC1N0cmluZ0VudHJ5AgkBEGtleUhpc3RvcnlSZWNvcmQDBQR0eXBlBQt1c2VyQWRkcmVzcwUEdHhJZAkBE2Zvcm1hdEhpc3RvcnlSZWNvcmQEBQlvbGRBbW91bnQFCG9sZFN0YXJ0BQluZXdBbW91bnQFCG5ld1N0YXJ0ARFDbGFpbUhpc3RvcnlFbnRyeQMLdXNlckFkZHJlc3MEdHhJZA5jbGFpbWVkUmV3YXJkcwkBC1N0cmluZ0VudHJ5AgkBEGtleUhpc3RvcnlSZWNvcmQDAgVjbGFpbQULdXNlckFkZHJlc3MFBHR4SWQJARhmb3JtYXRDbGFpbUhpc3RvcnlSZWNvcmQCCQClCAEFC3VzZXJBZGRyZXNzBQ5jbGFpbWVkUmV3YXJkcwELU3RhdHNSZXN1bHQDDnRvdGFsTG9ja2VkSW5jDGxvY2tDb3VudEluYw11c2Vyc0NvdW50SW5jBApsb2Nrc0NvdW50CQEMZ2V0SW50T3JaZXJvAQkBEmtleVN0YXRzTG9ja3NDb3VudAAECnVzZXJzQ291bnQJAQxnZXRJbnRPclplcm8BCQESa2V5U3RhdHNVc2Vyc0NvdW50AAQLdG90YWxBbW91bnQJAQxnZXRJbnRPclplcm8BCQEXa2V5TG9ja1BhcmFtVG90YWxBbW91bnQABA50b3RhbEFtb3VudE5ldwkAZAIFC3RvdGFsQW1vdW50BQ50b3RhbExvY2tlZEluYwkAlQoDCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQESa2V5U3RhdHNMb2Nrc0NvdW50AAkAZAIFCmxvY2tzQ291bnQFDGxvY2tDb3VudEluYwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEmtleVN0YXRzVXNlcnNDb3VudAAJAGQCBQp1c2Vyc0NvdW50BQ11c2Vyc0NvdW50SW5jCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEXa2V5TG9ja1BhcmFtVG90YWxBbW91bnQABQ50b3RhbEFtb3VudE5ldwUDbmlsBQt0b3RhbEFtb3VudAUOdG90YWxBbW91bnROZXcBD0xvY2tQYXJhbXNFbnRyeQMLdXNlckFkZHJlc3MGYW1vdW50BXN0YXJ0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEWa2V5TG9ja1BhcmFtVXNlckFtb3VudAEFC3VzZXJBZGRyZXNzBQZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlMb2NrUGFyYW1TdGFydEJsb2NrAQULdXNlckFkZHJlc3MFBXN0YXJ0BQNuaWwBD2dldFBhcmFtc09yRmFpbAAJAJQKAgkA2QQBCQEPZ2V0U3RyaW5nT3JGYWlsAgUEdGhpcwkBEGtleVN0YWtlZEFzc2V0SWQACQEMZ2V0SW50T3JGYWlsAQkBEGtleU1pbkxvY2tBbW91bnQAAQxpc0FjdGl2ZVVzZXIBC3VzZXJBZGRyZXNzCQBmAgkBDGdldEludE9yRWxzZQIJARZrZXlMb2NrUGFyYW1Vc2VyQW1vdW50AQULdXNlckFkZHJlc3MAAAAAARNnZXRVc2VyUGFyYW1zT3JVbml0AQt1c2VyQWRkcmVzcwMJAQxpc0FjdGl2ZVVzZXIBBQt1c2VyQWRkcmVzcwkAlQoDBwkBDGdldEludE9yRmFpbAEJARZrZXlMb2NrUGFyYW1Vc2VyQW1vdW50AQULdXNlckFkZHJlc3MJAQxnZXRJbnRPckZhaWwBCQEWa2V5TG9ja1BhcmFtU3RhcnRCbG9jawEFC3VzZXJBZGRyZXNzBQR1bml0ARNnZXRVc2VyUGFyYW1zT3JGYWlsAQt1c2VyQWRkcmVzcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQETZ2V0VXNlclBhcmFtc09yVW5pdAEFC3VzZXJBZGRyZXNzCQCsAgIJAKwCAgIFVXNlciAJAKUIAQULdXNlckFkZHJlc3MCDyBpcyBub3QgZGVmaW5lZAASc3VwcG9ydGVkQXNzZXRzU3RyCQEMZ2V0U3RyT3JFbHNlAgkBGGtleVN1cHBvcnRlZFJld2FyZEFzc2V0cwACAAATc3VwcG9ydGVkQXNzZXRzTGlzdAkAtQkCBRJzdXBwb3J0ZWRBc3NldHNTdHICAV8BCmNhbGNSZXdhcmQFC3VzZXJBZGRyZXNzB2Fzc2V0SWQNc3Rha2VkQW1vdW50WA5kZXBvc2l0TnVtVXNlcg5kZXBvc2l0TnVtTGFzdAQXcmV3YXJkUGVyTnNidFN1bUxhc3RLRVkJARVrZXlSZXdhcmRQZXJOc2J0U3VtQXQCBQ5kZXBvc2l0TnVtTGFzdAUHYXNzZXRJZAQKc3VtTGFzdFgxOAkApwMBCQEMZ2V0U3RyT3JFbHNlAgkBFWtleVJld2FyZFBlck5zYnRTdW1BdAIFDmRlcG9zaXROdW1MYXN0BQdhc3NldElkAgEwBApzdW1Vc2VyWDE4CQCnAwEJAQxnZXRTdHJPckVsc2UCCQEVa2V5UmV3YXJkUGVyTnNidFN1bUF0AgUOZGVwb3NpdE51bVVzZXIFB2Fzc2V0SWQCATAEEXJld2FyZER5bmFtaWNQYXJ0CQCgAwEJALwCAwkAuAICBQpzdW1MYXN0WDE4BQpzdW1Vc2VyWDE4BQ1zdGFrZWRBbW91bnRYBQdNVUxUWDE4BBNyZXdhcmRDYWNoZWRQYXJ0S0VZCQEJa2V5UmV3YXJkAgULdXNlckFkZHJlc3MFB2Fzc2V0SWQEEHJld2FyZENhY2hlZFBhcnQJAQxnZXRJbnRPckVsc2UCBRNyZXdhcmRDYWNoZWRQYXJ0S0VZAAAJAJYKBAkAZAIFEHJld2FyZENhY2hlZFBhcnQFEXJld2FyZER5bmFtaWNQYXJ0BRByZXdhcmRDYWNoZWRQYXJ0BRFyZXdhcmREeW5hbWljUGFydAUTcmV3YXJkQ2FjaGVkUGFydEtFWQENUmV3YXJkRW50cmllcwMJaXNOZXdVc2VyC3VzZXJBZGRyZXNzDHN0YWtlZEFtb3VudAQNc3Rha2VkQW1vdW50WAkAtgIBBQxzdGFrZWRBbW91bnQEG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQkBG2tleVVzZXJSZXdhcmRGcm9tRGVwb3NpdE51bQEFC3VzZXJBZGRyZXNzBA5kZXBvc2l0TnVtVXNlcgkBDGdldEludE9yRWxzZQIFG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQD///////////8BBA5kZXBvc2l0TnVtTGFzdAkBDGdldEludE9yRWxzZQIJARFrZXlEZXBvc2l0TnVtTGFzdAAA////////////AQoBG2ZvckVhY2hBc3NldENhY2hlVXNlclJld2FyZAIFYWNjdW0FYXNzZXQECyR0MDg0MzY4NTcxCQEKY2FsY1Jld2FyZAUFC3VzZXJBZGRyZXNzBQVhc3NldAUNc3Rha2VkQW1vdW50WAUOZGVwb3NpdE51bVVzZXIFDmRlcG9zaXROdW1MYXN0BAtyZXdhcmRUb3RhbAgFCyR0MDg0MzY4NTcxAl8xBAZjYWNoZWQIBQskdDA4NDM2ODU3MQJfMgQHZHluYW1pYwgFCyR0MDg0MzY4NTcxAl8zBBNyZXdhcmRDYWNoZWRQYXJ0S0VZCAULJHQwODQzNjg1NzECXzQJAM0IAgUFYWNjdW0JAQxJbnRlZ2VyRW50cnkCBRNyZXdhcmRDYWNoZWRQYXJ0S0VZBQtyZXdhcmRUb3RhbAMDCQAAAgUOZGVwb3NpdE51bUxhc3QA////////////AQkAAAIFDmRlcG9zaXROdW1Vc2VyAP///////////wEHBQNuaWwDAwkAAAIFDmRlcG9zaXROdW1MYXN0AP///////////wEJAGYCBQ5kZXBvc2l0TnVtVXNlcgD///////////8BBwkAAgECL2ludmFsaWQgZGVwb3NpdE51bUxhc3QgYW5kIGRlcG9zaXROdW1Vc2VyIHN0YXRlAwMJAGYCBQ5kZXBvc2l0TnVtTGFzdAD///////////8BCQBnAgUOZGVwb3NpdE51bVVzZXIA////////////AQcDBQlpc05ld1VzZXIJAMwIAgkBDEludGVnZXJFbnRyeQIFG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQUOZGVwb3NpdE51bUxhc3QFA25pbAkAzQgCCgACJGwFE3N1cHBvcnRlZEFzc2V0c0xpc3QKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBG2ZvckVhY2hBc3NldENhY2hlVXNlclJld2FyZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgkBDEludGVnZXJFbnRyeQIFG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQUOZGVwb3NpdE51bUxhc3QJAAIBCQCsAgIJAKwCAgkArAICAiR1bmNvdmVyZWQgY29uZGl0aW9uOiBkZXBvc2l0TnVtTGFzdD0JAKQDAQUOZGVwb3NpdE51bUxhc3QCECBkZXBvc2l0TnVtVXNlcj0JAKQDAQUOZGVwb3NpdE51bVVzZXIBIkluY3JlbWVudE5vdERpc3RyaWJ1dGVkUmV3YXJkRW50cnkCA3RrbglhbW91bnRJbmMEF25vdERpc3RyaWJ1dGVkUmV3YXJkS0VZCQEXa2V5Tm90RGlzdHJpYnV0ZWRSZXdhcmQBBQN0a24EFG5vdERpc3RyaWJ1dGVkUmV3YXJkCQEMZ2V0SW50T3JFbHNlAgUXbm90RGlzdHJpYnV0ZWRSZXdhcmRLRVkAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgUXbm90RGlzdHJpYnV0ZWRSZXdhcmRLRVkJAGQCBRRub3REaXN0cmlidXRlZFJld2FyZAUJYW1vdW50SW5jBQNuaWwBC3N1cmZUb0duc2J0AQdzdXJmQW10CQBpAgUHc3VyZkFtdAA8AQtjb21tb25TdGFrZQILdXNlckFkZHJlc3MBaQQNJHQwMTE0NTUxMTUwOQkBD2dldFBhcmFtc09yRmFpbAAEDXN0YWtlZEFzc2V0SWQIBQ0kdDAxMTQ1NTExNTA5Al8xBA1taW5Mb2NrQW1vdW50CAUNJHQwMTE0NTUxMTUwOQJfMgMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECFUludmFsaWQgcGF5bWVudHMgc2l6ZQQHcGF5bWVudAkAkQMCCAUBaQhwYXltZW50cwAABAZhbW91bnQIBQdwYXltZW50BmFtb3VudAQTaW52YWxpZEFzc2V0TWVzc2FnZQkArAICCQCsAgICD0ludmFsaWQgYXNzZXQuIAkA2AQBBQ1zdGFrZWRBc3NldElkAgwgaXMgZXhwZWN0ZWQEB2Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAggFB3BheW1lbnQHYXNzZXRJZAUTaW52YWxpZEFzc2V0TWVzc2FnZQMJAQIhPQIFB2Fzc2V0SWQFDXN0YWtlZEFzc2V0SWQJAAIBBRNpbnZhbGlkQXNzZXRNZXNzYWdlBA51c2VyQWRkcmVzc1N0cgkApQgBBQt1c2VyQWRkcmVzcwQMZ25zYnRBbXRVc2VyAAAEDWduc2J0QW10VG90YWwAAAQNJHQwMTE5NzgxMjA4NwkBC3ZhbHVlT3JFbHNlAgkBE2dldFVzZXJQYXJhbXNPclVuaXQBBQt1c2VyQWRkcmVzcwkAlQoDBgAAAP///////////wEECWlzTmV3VXNlcggFDSR0MDExOTc4MTIwODcCXzEEDHN0YWtlZEFtb3VudAgFDSR0MDExOTc4MTIwODcCXzIED2xvY2tTdGFydEhlaWdodAgFDSR0MDExOTc4MTIwODcCXzMED3N0YWtlZEFtb3VudE5ldwMFCWlzTmV3VXNlcgUGYW1vdW50CQBkAgUGYW1vdW50BQxzdGFrZWRBbW91bnQEEW1lcmdlZFN0YXJ0SGVpZ2h0AwUJaXNOZXdVc2VyBQZoZWlnaHQJAGQCBQZoZWlnaHQJAGgCAKALAA4DCQBmAgUNbWluTG9ja0Ftb3VudAUPc3Rha2VkQW1vdW50TmV3CQACAQkArAICAhNNaW4gbG9jayBhbW91bnQgaXMgCQCkAwEFDW1pbkxvY2tBbW91bnQEDSR0MDEyMzkwMTI0OTIJAQtTdGF0c1Jlc3VsdAMFBmFtb3VudAABAwUJaXNOZXdVc2VyAAEAAAQMc3RhdHNFbnRyaWVzCAUNJHQwMTIzOTAxMjQ5MgJfMQQLdG90YWxTdGFrZWQIBQ0kdDAxMjM5MDEyNDkyAl8yBA50b3RhbFN0YWtlZE5ldwgFDSR0MDEyMzkwMTI0OTICXzMJAM4IAgkAzggCCQDOCAIJAMwIAgkBEkhpc3RvcnlSZWNvcmRFbnRyeQcCBXN0YWtlBQt1c2VyQWRkcmVzcwgFAWkNdHJhbnNhY3Rpb25JZAUMc3Rha2VkQW1vdW50BQ9sb2NrU3RhcnRIZWlnaHQFD3N0YWtlZEFtb3VudE5ldwURbWVyZ2VkU3RhcnRIZWlnaHQFA25pbAkBDVJld2FyZEVudHJpZXMDBQlpc05ld1VzZXIFDnVzZXJBZGRyZXNzU3RyBQxzdGFrZWRBbW91bnQJAQ9Mb2NrUGFyYW1zRW50cnkDBQt1c2VyQWRkcmVzcwUPc3Rha2VkQW1vdW50TmV3BRFtZXJnZWRTdGFydEhlaWdodAUMc3RhdHNFbnRyaWVzAQtjb21tb25DbGFpbQILdXNlckFkZHJlc3MBaQQOdXNlckFkZHJlc3NTdHIJAKUIAQULdXNlckFkZHJlc3MDCQBmAgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIZcGF5bWVudHMgYXJlIG5vdCBhY2NlcHRlZAQNJHQwMTI5NjMxMzA2OAkBC3ZhbHVlT3JFbHNlAgkBE2dldFVzZXJQYXJhbXNPclVuaXQBBQt1c2VyQWRkcmVzcwkAlQoDBgAAAAAECWlzTmV3VXNlcggFDSR0MDEyOTYzMTMwNjgCXzEEDHN0YWtlZEFtb3VudAgFDSR0MDEyOTYzMTMwNjgCXzIEDHN0YWtpbmdTdGFydAgFDSR0MDEyOTYzMTMwNjgCXzMEDXN0YWtlZEFtb3VudFgJALYCAQUMc3Rha2VkQW1vdW50BBt1c2VyUmV3YXJkRnJvbURlcG9zaXROdW1LRVkJARtrZXlVc2VyUmV3YXJkRnJvbURlcG9zaXROdW0BBQ51c2VyQWRkcmVzc1N0cgQOZGVwb3NpdE51bVVzZXIJAQxnZXRJbnRPckVsc2UCBRt1c2VyUmV3YXJkRnJvbURlcG9zaXROdW1LRVkA////////////AQQOZGVwb3NpdE51bUxhc3QJAQxnZXRJbnRPckVsc2UCCQERa2V5RGVwb3NpdE51bUxhc3QAAP///////////wEKAR9mb3JFYWNoQXNzZXRDYWxjVW5jbGFpbWVkUmV3YXJkAgVhY2N1bQVhc3NldAQNJHQwMTM0MzkxMzU3NwkBCmNhbGNSZXdhcmQFBQ51c2VyQWRkcmVzc1N0cgUFYXNzZXQFDXN0YWtlZEFtb3VudFgFDmRlcG9zaXROdW1Vc2VyBQ5kZXBvc2l0TnVtTGFzdAQLcmV3YXJkVG90YWwIBQ0kdDAxMzQzOTEzNTc3Al8xBAZjYWNoZWQIBQ0kdDAxMzQzOTEzNTc3Al8yBAdkeW5hbWljCAUNJHQwMTM0MzkxMzU3NwJfMwQTcmV3YXJkQ2FjaGVkUGFydEtFWQgFDSR0MDEzNDM5MTM1NzcCXzQECmNsYWltZWRLRVkJAQprZXlDbGFpbWVkAgUOdXNlckFkZHJlc3NTdHIFBWFzc2V0BA0kdDAxMzYzNzEzNjc0BQVhY2N1bQQEZGF0YQgFDSR0MDEzNjM3MTM2NzQCXzEEEWNsYWltZWRBbXRCeUFzc2V0CAUNJHQwMTM2MzcxMzY3NAJfMgQHbmV3UGFydAkAuQkCCQDMCAIFBWFzc2V0CQDMCAIJAKQDAQULcmV3YXJkVG90YWwFA25pbAIBOgQUY2xhaW1lZEFtdEJ5QXNzZXROZXcJALkJAgkAzAgCBRFjbGFpbWVkQW10QnlBc3NldAkAzAgCBQduZXdQYXJ0BQNuaWwCAV8DCQBnAgAABQtyZXdhcmRUb3RhbAkAlAoCBQRkYXRhBRRjbGFpbWVkQW10QnlBc3NldE5ldwkAlAoCCQDNCAIJAM0IAgkAzQgCBQRkYXRhCQEOU2NyaXB0VHJhbnNmZXIDBQt1c2VyQWRkcmVzcwULcmV3YXJkVG90YWwJAQt0b0Fzc2V0VmVjdAEFBWFzc2V0CQEMSW50ZWdlckVudHJ5AgUKY2xhaW1lZEtFWQkAZAIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUKY2xhaW1lZEtFWQAABQtyZXdhcmRUb3RhbAkBDEludGVnZXJFbnRyeQIFE3Jld2FyZENhY2hlZFBhcnRLRVkAAAUUY2xhaW1lZEFtdEJ5QXNzZXROZXcEDSR0MDE0MTM0MTQyNDgKAAIkbAUTc3VwcG9ydGVkQXNzZXRzTGlzdAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsAgAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBH2ZvckVhY2hBc3NldENhbGNVbmNsYWltZWRSZXdhcmQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoECXRyYW5zZmVycwgFDSR0MDE0MTM0MTQyNDgCXzEEF2NsYWltZWRBbXRCeUFzc2V0UmVzdWx0CAUNJHQwMTQxMzQxNDI0OAJfMgMJAGcCAAAJAJADAQUJdHJhbnNmZXJzCQACAQIQbm90aGluZyB0byBjbGFpbQkAzQgCCQDNCAIFCXRyYW5zZmVycwkBDEludGVnZXJFbnRyeQIFG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQUOZGVwb3NpdE51bUxhc3QJARFDbGFpbUhpc3RvcnlFbnRyeQMFC3VzZXJBZGRyZXNzCAUBaQ10cmFuc2FjdGlvbklkCQCwAgIFF2NsYWltZWRBbXRCeUFzc2V0UmVzdWx0AAEKAWkBC2NvbnN0cnVjdG9yAw1taW5Mb2NrQW1vdW50FXN1cHBvcnRlZFJld2FyZEFzc2V0cw1zdGFrZWRBc3NldElkAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIRUGVybWlzc2lvbiBkZW5pZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJARBrZXlNaW5Mb2NrQW1vdW50AAUNbWluTG9ja0Ftb3VudAkAzAgCCQELU3RyaW5nRW50cnkCCQEYa2V5U3VwcG9ydGVkUmV3YXJkQXNzZXRzAAUVc3VwcG9ydGVkUmV3YXJkQXNzZXRzCQDMCAIJAQtTdHJpbmdFbnRyeQIJARBrZXlTdGFrZWRBc3NldElkAAUNc3Rha2VkQXNzZXRJZAUDbmlsAWkBBXN0YWtlAAkBC2NvbW1vblN0YWtlAggFAWkGY2FsbGVyBQFpAWkBE3N0YWtlQnlPcmlnaW5DYWxsZXIACQELY29tbW9uU3Rha2UCCAUBaQxvcmlnaW5DYWxsZXIFAWkBaQEHdW5zdGFrZQEGYW1vdW50AwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIjdW5zdGFrZSBkb2Vzbid0IHJlcXVpcmUgYW55IHBheW1lbnQEC3VzZXJBZGRyZXNzCAUBaQZjYWxsZXIEDnVzZXJBZGRyZXNzU3RyCQClCAEFC3VzZXJBZGRyZXNzBA0kdDAxNTE4MDE1MjM0CQEPZ2V0UGFyYW1zT3JGYWlsAAQNc3Rha2VkQXNzZXRJZAgFDSR0MDE1MTgwMTUyMzQCXzEEDW1pbkxvY2tBbW91bnQIBQ0kdDAxNTE4MDE1MjM0Al8yBA0kdDAxNTIzNzE1MzExCQETZ2V0VXNlclBhcmFtc09yRmFpbAEFC3VzZXJBZGRyZXNzBAlpc05ld1VzZXIIBQ0kdDAxNTIzNzE1MzExAl8xBApsb2NrQW1vdW50CAUNJHQwMTUyMzcxNTMxMQJfMgQJbG9ja1N0YXJ0CAUNJHQwMTUyMzcxNTMxMQJfMwMJAGcCAAAFCmxvY2tBbW91bnQJAAIBAhJOb3RoaW5nIHRvIHVuc3Rha2UDCQBmAgUGYW1vdW50BQpsb2NrQW1vdW50CQACAQkArAICCQCsAgIJAKwCAgIKUmVxdWVzdGVkIAkApAMBBQZhbW91bnQCEiwgYnV0IHN0YWtlZCBvbmx5IAkApAMBBQpsb2NrQW1vdW50BA0kdDAxNTUwMTE1NjU1CQELU3RhdHNSZXN1bHQDCQEBLQEFBmFtb3VudAMJAAACBQZhbW91bnQFCmxvY2tBbW91bnQA////////////AQAAAwkAAAIFBmFtb3VudAUKbG9ja0Ftb3VudAD///////////8BAAAEDHN0YXRzRW50cmllcwgFDSR0MDE1NTAxMTU2NTUCXzEEC3RvdGFsU3Rha2VkCAUNJHQwMTU1MDExNTY1NQJfMgQOdG90YWxTdGFrZWROZXcIBQ0kdDAxNTUwMTE1NjU1Al8zCQDOCAIJAM4IAgkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFC3VzZXJBZGRyZXNzBQZhbW91bnQFDXN0YWtlZEFzc2V0SWQJAMwIAgkBEkhpc3RvcnlSZWNvcmRFbnRyeQcCB3Vuc3Rha2UFC3VzZXJBZGRyZXNzCAUBaQ10cmFuc2FjdGlvbklkBQpsb2NrQW1vdW50BQlsb2NrU3RhcnQJAGUCBQpsb2NrQW1vdW50BQZhbW91bnQFCWxvY2tTdGFydAUDbmlsCQENUmV3YXJkRW50cmllcwMHBQ51c2VyQWRkcmVzc1N0cgUKbG9ja0Ftb3VudAkBD0xvY2tQYXJhbXNFbnRyeQMFC3VzZXJBZGRyZXNzCQBlAgUKbG9ja0Ftb3VudAUGYW1vdW50BQlsb2NrU3RhcnQFDHN0YXRzRW50cmllcwFpAQdkZXBvc2l0AAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECH2V4YWN0IDEgcGF5bWVudCBpcyBhbGxvd2VkIG9ubHkEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABAZhbW91bnQIBQNwbXQGYW1vdW50BApwbXRBc3NldElkCQELdmFsdWVPckVsc2UCCAUDcG10B2Fzc2V0SWQFB1dBVkVTSUQEDXBtdEFzc2V0SWRTdHIJANgEAQUKcG10QXNzZXRJZAQIcG10TXVsdFgDCQAAAgUKcG10QXNzZXRJZAUHV0FWRVNJRAUGTVVMVFg4BQZNVUxUWDYEB2Ftb3VudFgJALYCAQUGYW1vdW50BAt0b3RhbFN0YWtlZAkBDGdldEludE9yRWxzZQIJARdrZXlMb2NrUGFyYW1Ub3RhbEFtb3VudAAAAAQMdG90YWxTdGFrZWRYCQC2AgEFC3RvdGFsU3Rha2VkAwkAZgIAAAULdG90YWxTdGFrZWQJAAIBAhtUT0RPOiBjYXNlIGlzIG5vdCBzdXBwb3J0ZWQDCQAAAgULdG90YWxTdGFrZWQAAAkBIkluY3JlbWVudE5vdERpc3RyaWJ1dGVkUmV3YXJkRW50cnkCBQ1wbXRBc3NldElkU3RyBQZhbW91bnQEEHJld2FyZFBlck5zYnRYMTgJALwCAwUHYW1vdW50WAUHTVVMVFgxOAUMdG90YWxTdGFrZWRYBBFkZXBvc2l0TnVtTGFzdEtFWQkBEWtleURlcG9zaXROdW1MYXN0AAQOZGVwb3NpdE51bUxhc3QJAQxnZXRJbnRPckVsc2UCBRFkZXBvc2l0TnVtTGFzdEtFWQD///////////8BBA1kZXBvc2l0TnVtTmV3CQBkAgUOZGVwb3NpdE51bUxhc3QAAQMJAQEhAQkBCGNvbnRhaW5zAgUSc3VwcG9ydGVkQXNzZXRzU3RyBQ1wbXRBc3NldElkU3RyCQACAQkArAICCQCsAgIFEnN1cHBvcnRlZEFzc2V0c1N0cgIRIGRvZXNuJ3QgY29udGFpbiAFDXBtdEFzc2V0SWRTdHIKARdyZWZyZXNoUmV3YXJkUGVyTnNidFNVTQIFYWNjdW0JbmV4dEFzc2V0BBZyZXdhcmRQZXJOc2J0U3VtTmV3S0VZCQEVa2V5UmV3YXJkUGVyTnNidFN1bUF0AgUNZGVwb3NpdE51bU5ldwUJbmV4dEFzc2V0BApzdW1MYXN0U3RyCQEMZ2V0U3RyT3JFbHNlAgkBFWtleVJld2FyZFBlck5zYnRTdW1BdAIFDmRlcG9zaXROdW1MYXN0BQluZXh0QXNzZXQCATAJAM0IAgUFYWNjdW0DCQAAAgUJbmV4dEFzc2V0BQ1wbXRBc3NldElkU3RyCQELU3RyaW5nRW50cnkCBRZyZXdhcmRQZXJOc2J0U3VtTmV3S0VZCQCmAwEJALcCAgkApwMBBQpzdW1MYXN0U3RyBRByZXdhcmRQZXJOc2J0WDE4CQELU3RyaW5nRW50cnkCBRZyZXdhcmRQZXJOc2J0U3VtTmV3S0VZBQpzdW1MYXN0U3RyCQDNCAIKAAIkbAUTc3VwcG9ydGVkQXNzZXRzTGlzdAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEXcmVmcmVzaFJld2FyZFBlck5zYnRTVU0CBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoJAQxJbnRlZ2VyRW50cnkCBRFkZXBvc2l0TnVtTGFzdEtFWQUNZGVwb3NpdE51bU5ldwFpAQxjbGFpbVJld2FyZHMACQELY29tbW9uQ2xhaW0CCAUBaQZjYWxsZXIFAWkBaQEaY2xhaW1SZXdhcmRzQnlPcmlnaW5DYWxsZXIACQELY29tbW9uQ2xhaW0CCAUBaQxvcmlnaW5DYWxsZXIFAWkBaQEYdW5jbGFpbWVkUmV3YXJkc1JFQURPTkxZAQ51c2VyQWRkcmVzc1N0cgoBFmZvckVhY2hBc3NldFplcm9SZXdhcmQCBWFjY3VtBWFzc2V0CQCsAgIJAKwCAgUFYWNjdW0JALkJAgkAzAgCBQVhc3NldAkAzAgCAgEwCQDMCAICATAFA25pbAIBOgIBXwQSdW5jbGFpbWVkUmV3YXJkU3RyAwkAAAIFDnVzZXJBZGRyZXNzU3RyAgAKAAIkbAUTc3VwcG9ydGVkQXNzZXRzTGlzdAoAAiRzCQCQAwEFAiRsCgAFJGFjYzACAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEWZm9yRWFjaEFzc2V0WmVyb1Jld2FyZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQLdXNlckFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEFDnVzZXJBZGRyZXNzU3RyBA0kdDAxODIwOTE4MzE0CQELdmFsdWVPckVsc2UCCQETZ2V0VXNlclBhcmFtc09yVW5pdAEFC3VzZXJBZGRyZXNzCQCVCgMGAAAAAAQJaXNOZXdVc2VyCAUNJHQwMTgyMDkxODMxNAJfMQQMc3Rha2VkQW1vdW50CAUNJHQwMTgyMDkxODMxNAJfMgQMc3Rha2luZ1N0YXJ0CAUNJHQwMTgyMDkxODMxNAJfMwQNc3Rha2VkQW1vdW50WAkAtgIBBQxzdGFrZWRBbW91bnQEG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQkBG2tleVVzZXJSZXdhcmRGcm9tRGVwb3NpdE51bQEFDnVzZXJBZGRyZXNzU3RyBA5kZXBvc2l0TnVtVXNlcgkBDGdldEludE9yRWxzZQIFG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQD///////////8BBA5kZXBvc2l0TnVtTGFzdAkBDGdldEludE9yRWxzZQIJARFrZXlEZXBvc2l0TnVtTGFzdAAA////////////AQoBH2ZvckVhY2hBc3NldENhbGNVbmNsYWltZWRSZXdhcmQCBWFjY3VtBWFzc2V0BA0kdDAxODY2MDE4Nzk4CQEKY2FsY1Jld2FyZAUFDnVzZXJBZGRyZXNzU3RyBQVhc3NldAUNc3Rha2VkQW1vdW50WAUOZGVwb3NpdE51bVVzZXIFDmRlcG9zaXROdW1MYXN0BAtyZXdhcmRUb3RhbAgFDSR0MDE4NjYwMTg3OTgCXzEEBmNhY2hlZAgFDSR0MDE4NjYwMTg3OTgCXzIEB2R5bmFtaWMIBQ0kdDAxODY2MDE4Nzk4Al8zBBNyZXdhcmRDYWNoZWRQYXJ0S0VZCAUNJHQwMTg2NjAxODc5OAJfNAQHY2xhaW1lZAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEKa2V5Q2xhaW1lZAIFDnVzZXJBZGRyZXNzU3RyBQVhc3NldAAACQCsAgIJAKwCAgUFYWNjdW0JALkJAgkAzAgCBQVhc3NldAkAzAgCCQCkAwEFC3Jld2FyZFRvdGFsCQDMCAIJAKQDAQUHY2xhaW1lZAUDbmlsAgE6AgFfCgACJGwFE3N1cHBvcnRlZEFzc2V0c0xpc3QKAAIkcwkAkAMBBQIkbAoABSRhY2MwAgAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBH2ZvckVhY2hBc3NldENhbGNVbmNsYWltZWRSZXdhcmQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoJAJQKAgUDbmlsCQCzAgIFEnVuY2xhaW1lZFJld2FyZFN0cgABAWkBFnN1cmZTdGFraW5nU1lTUkVBRE9OTFkBFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQQJc3VyZlRvdGFsCQEMZ2V0SW50T3JFbHNlAgkBF2tleUxvY2tQYXJhbVRvdGFsQW1vdW50AAAABBJnbnNidEZyb21TdXJmVG90YWwJAQtzdXJmVG9HbnNidAEFCXN1cmZUb3RhbAMJAAACBRV1c2VyQWRkcmVzc1N0ck9yRW1wdHkCAAkAlAoCBQNuaWwJAMwIAgAACQDMCAIFCXN1cmZUb3RhbAkAzAgCAAAJAMwIAgUSZ25zYnRGcm9tU3VyZlRvdGFsCQDMCAIAAAUDbmlsBAt1c2VyQWRkcmVzcwkBD3RvQWRkcmVzc09yRmFpbAEFFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQQNJHQwMTk0OTAxOTU5MQkBC3ZhbHVlT3JFbHNlAgkBE2dldFVzZXJQYXJhbXNPclVuaXQBBQt1c2VyQWRkcmVzcwkAlQoDBgAAAAAECWlzTmV3VXNlcggFDSR0MDE5NDkwMTk1OTECXzEECHN1cmZVc2VyCAUNJHQwMTk0OTAxOTU5MQJfMgQMc3Rha2luZ1N0YXJ0CAUNJHQwMTk0OTAxOTU5MQJfMwQRZ25zYnRGcm9tU3VyZlVzZXIJAQtzdXJmVG9HbnNidAEFCHN1cmZVc2VyCQCUCgIFA25pbAkAzAgCBQhzdXJmVXNlcgkAzAgCBQlzdXJmVG90YWwJAMwIAgURZ25zYnRGcm9tU3VyZlVzZXIJAMwIAgUSZ25zYnRGcm9tU3VyZlRvdGFsCQDMCAIFDHN0YWtpbmdTdGFydAUDbmlsAWkBEWNvbmZpZ1NZU1JFQURPTkxZAAQKbWluTG9ja0FtdAkBEUBleHRyTmF0aXZlKDEwNTUpAQkBEGtleU1pbkxvY2tBbW91bnQABBJnbnNidEZyb21TdXJmQ29lZmYJAGgCADwFBU1VTFQ2BCBzdXJmVm90aW5nUG93ZXJSZXN0cmljdGl2ZVBlcmlvZAkAaAIAoAsADgQbYnJUb1N0YXJ0U3VyZlRyYW5zZm9ybWF0aW9uAICfSQkAlAoCBQNuaWwJAMwIAgUKbWluTG9ja0FtdAkAzAgCBRJnbnNidEZyb21TdXJmQ29lZmYJAMwIAgUgc3VyZlZvdGluZ1Bvd2VyUmVzdHJpY3RpdmVQZXJpb2QJAMwIAgUbYnJUb1N0YXJ0U3VyZlRyYW5zZm9ybWF0aW9uBQNuaWwAwFxtjw==", "chainId": 84, "height": 2166972, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GG7U6RU6imnkPjoM189Aw2SLTGFWupFoyuXhvc19ZGVQ Next: Eo87tBzH1CUTSnwEXnthCU22SUvdKfdfKxHTDrWjKJw6 Diff:
OldNewDifferences
227227 else false)
228228 then throw("invalid depositNumLast and depositNumUser state")
229229 else if (if ((depositNumLast > -1))
230- then (depositNumUser == -1)
230+ then (depositNumUser >= -1)
231231 else false)
232232 then if (isNewUser)
233233 then [IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)]
245245
246246 $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)
247247 } :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast))
248- else if (if ((depositNumLast > -1))
249- then (depositNumUser > -1)
250- else false)
251- then if (isNewUser)
252- then [IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)]
253- else ({
254- let $l = supportedAssetsList
255- let $s = size($l)
256- let $acc0 = nil
257- func $f0_1 ($a,$i) = if (($i >= $s))
258- then $a
259- else forEachAssetCacheUserReward($a, $l[$i])
260-
261- func $f0_2 ($a,$i) = if (($i >= $s))
262- then $a
263- else throw("List size exceeds 10")
264-
265- $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)
266- } :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast))
267- else throw(((("uncovered condition: depositNumLast=" + toString(depositNumLast)) + " depositNumUser=") + toString(depositNumUser)))
248+ else throw(((("uncovered condition: depositNumLast=" + toString(depositNumLast)) + " depositNumUser=") + toString(depositNumUser)))
268249 }
269250
270251
278259 func surfToGnsbt (surfAmt) = (surfAmt / 60)
279260
280261
281-let ContolContractKey = "control_contract"
282-
283-@Callable(i)
284-func constructor (minLockAmount,supportedRewardAssets,stakedAssetId) = if ((i.caller != this))
285- then throw("Permission denied")
286- else [IntegerEntry(keyMinLockAmount(), minLockAmount), StringEntry(keySupportedRewardAssets(), supportedRewardAssets), StringEntry(keyStakedAssetId(), stakedAssetId)]
287-
288-
289-
290-@Callable(i)
291-func stake () = {
292- let $t01212012174 = getParamsOrFail()
293- let stakedAssetId = $t01212012174._1
294- let minLockAmount = $t01212012174._2
262+func commonStake (userAddress,i) = {
263+ let $t01145511509 = getParamsOrFail()
264+ let stakedAssetId = $t01145511509._1
265+ let minLockAmount = $t01145511509._2
295266 if ((size(i.payments) != 1))
296267 then throw("Invalid payments size")
297268 else {
302273 if ((assetId != stakedAssetId))
303274 then throw(invalidAssetMessage)
304275 else {
305- let userAddress = i.caller
306276 let userAddressStr = toString(userAddress)
307277 let gnsbtAmtUser = 0
308278 let gnsbtAmtTotal = 0
309- let $t01267212781 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, -1))
310- let isNewUser = $t01267212781._1
311- let stakedAmount = $t01267212781._2
312- let lockStartHeight = $t01267212781._3
279+ let $t01197812087 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, -1))
280+ let isNewUser = $t01197812087._1
281+ let stakedAmount = $t01197812087._2
282+ let lockStartHeight = $t01197812087._3
313283 let stakedAmountNew = if (isNewUser)
314284 then amount
315285 else (amount + stakedAmount)
319289 if ((minLockAmount > stakedAmountNew))
320290 then throw(("Min lock amount is " + toString(minLockAmount)))
321291 else {
322- let $t01308413186 = StatsResult(amount, 1, if (isNewUser)
292+ let $t01239012492 = StatsResult(amount, 1, if (isNewUser)
323293 then 1
324294 else 0)
325- let statsEntries = $t01308413186._1
326- let totalStaked = $t01308413186._2
327- let totalStakedNew = $t01308413186._3
295+ let statsEntries = $t01239012492._1
296+ let totalStaked = $t01239012492._2
297+ let totalStakedNew = $t01239012492._3
328298 ((([HistoryRecordEntry("stake", userAddress, i.transactionId, stakedAmount, lockStartHeight, stakedAmountNew, mergedStartHeight)] ++ RewardEntries(isNewUser, userAddressStr, stakedAmount)) ++ LockParamsEntry(userAddress, stakedAmountNew, mergedStartHeight)) ++ statsEntries)
329299 }
330300 }
332302 }
333303
334304
305+func commonClaim (userAddress,i) = {
306+ let userAddressStr = toString(userAddress)
307+ if ((size(i.payments) > 0))
308+ then throw("payments are not accepted")
309+ else {
310+ let $t01296313068 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
311+ let isNewUser = $t01296313068._1
312+ let stakedAmount = $t01296313068._2
313+ let stakingStart = $t01296313068._3
314+ let stakedAmountX = toBigInt(stakedAmount)
315+ let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
316+ let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
317+ let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
318+ func forEachAssetCalcUnclaimedReward (accum,asset) = {
319+ let $t01343913577 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
320+ let rewardTotal = $t01343913577._1
321+ let cached = $t01343913577._2
322+ let dynamic = $t01343913577._3
323+ let rewardCachedPartKEY = $t01343913577._4
324+ let claimedKEY = keyClaimed(userAddressStr, asset)
325+ let $t01363713674 = accum
326+ let data = $t01363713674._1
327+ let claimedAmtByAsset = $t01363713674._2
328+ let newPart = makeString([asset, toString(rewardTotal)], ":")
329+ let claimedAmtByAssetNew = makeString([claimedAmtByAsset, newPart], "_")
330+ if ((0 >= rewardTotal))
331+ then $Tuple2(data, claimedAmtByAssetNew)
332+ else $Tuple2((((data :+ ScriptTransfer(userAddress, rewardTotal, toAssetVect(asset))) :+ IntegerEntry(claimedKEY, (valueOrElse(getInteger(claimedKEY), 0) + rewardTotal))) :+ IntegerEntry(rewardCachedPartKEY, 0)), claimedAmtByAssetNew)
333+ }
334+
335+ let $t01413414248 = {
336+ let $l = supportedAssetsList
337+ let $s = size($l)
338+ let $acc0 = $Tuple2(nil, "")
339+ func $f0_1 ($a,$i) = if (($i >= $s))
340+ then $a
341+ else forEachAssetCalcUnclaimedReward($a, $l[$i])
342+
343+ func $f0_2 ($a,$i) = if (($i >= $s))
344+ then $a
345+ else throw("List size exceeds 10")
346+
347+ $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+ }
349+ let transfers = $t01413414248._1
350+ let claimedAmtByAssetResult = $t01413414248._2
351+ if ((0 >= size(transfers)))
352+ then throw("nothing to claim")
353+ else ((transfers :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)) :+ ClaimHistoryEntry(userAddress, i.transactionId, drop(claimedAmtByAssetResult, 1)))
354+ }
355+ }
356+
335357
336358 @Callable(i)
337-func stakeByOriginCaller () = {
338- let $t01352213576 = getParamsOrFail()
339- let stakedAssetId = $t01352213576._1
340- let minLockAmount = $t01352213576._2
341- if ((size(i.payments) != 1))
342- then throw("Invalid payments size")
343- else {
344- let payment = i.payments[0]
345- let amount = payment.amount
346- let invalidAssetMessage = (("Invalid asset. " + toBase58String(stakedAssetId)) + " is expected")
347- let assetId = valueOrErrorMessage(payment.assetId, invalidAssetMessage)
348- if ((assetId != stakedAssetId))
349- then throw(invalidAssetMessage)
350- else {
351- let userAddress = i.originCaller
352- let userAddressStr = toString(userAddress)
353- let gnsbtAmtUser = 0
354- let gnsbtAmtTotal = 0
355- let $t01408014189 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, -1))
356- let isNewUser = $t01408014189._1
357- let stakedAmount = $t01408014189._2
358- let lockStartHeight = $t01408014189._3
359- let stakedAmountNew = if (isNewUser)
360- then amount
361- else (amount + stakedAmount)
362- let mergedStartHeight = if (isNewUser)
363- then height
364- else (height + (1440 * 14))
365- if ((minLockAmount > stakedAmountNew))
366- then throw(("Min lock amount is " + toString(minLockAmount)))
367- else {
368- let $t01449214594 = StatsResult(amount, 1, if (isNewUser)
369- then 1
370- else 0)
371- let statsEntries = $t01449214594._1
372- let totalStaked = $t01449214594._2
373- let totalStakedNew = $t01449214594._3
374- ((([HistoryRecordEntry("stake", userAddress, i.transactionId, stakedAmount, lockStartHeight, stakedAmountNew, mergedStartHeight)] ++ RewardEntries(isNewUser, userAddressStr, stakedAmount)) ++ LockParamsEntry(userAddress, stakedAmountNew, mergedStartHeight)) ++ statsEntries)
375- }
376- }
377- }
378- }
359+func constructor (minLockAmount,supportedRewardAssets,stakedAssetId) = if ((i.caller != this))
360+ then throw("Permission denied")
361+ else [IntegerEntry(keyMinLockAmount(), minLockAmount), StringEntry(keySupportedRewardAssets(), supportedRewardAssets), StringEntry(keyStakedAssetId(), stakedAssetId)]
362+
363+
364+
365+@Callable(i)
366+func stake () = commonStake(i.caller, i)
367+
368+
369+
370+@Callable(i)
371+func stakeByOriginCaller () = commonStake(i.originCaller, i)
379372
380373
381374
385378 else {
386379 let userAddress = i.caller
387380 let userAddressStr = toString(userAddress)
388- let $t01509015144 = getParamsOrFail()
389- let stakedAssetId = $t01509015144._1
390- let minLockAmount = $t01509015144._2
391- let $t01514715221 = getUserParamsOrFail(userAddress)
392- let isNewUser = $t01514715221._1
393- let lockAmount = $t01514715221._2
394- let lockStart = $t01514715221._3
381+ let $t01518015234 = getParamsOrFail()
382+ let stakedAssetId = $t01518015234._1
383+ let minLockAmount = $t01518015234._2
384+ let $t01523715311 = getUserParamsOrFail(userAddress)
385+ let isNewUser = $t01523715311._1
386+ let lockAmount = $t01523715311._2
387+ let lockStart = $t01523715311._3
395388 if ((0 >= lockAmount))
396389 then throw("Nothing to unstake")
397390 else if ((amount > lockAmount))
398391 then throw(((("Requested " + toString(amount)) + ", but staked only ") + toString(lockAmount)))
399392 else {
400- let $t01541115565 = StatsResult(-(amount), if ((amount == lockAmount))
393+ let $t01550115655 = StatsResult(-(amount), if ((amount == lockAmount))
401394 then -1
402395 else 0, if ((amount == lockAmount))
403396 then -1
404397 else 0)
405- let statsEntries = $t01541115565._1
406- let totalStaked = $t01541115565._2
407- let totalStakedNew = $t01541115565._3
398+ let statsEntries = $t01550115655._1
399+ let totalStaked = $t01550115655._2
400+ let totalStakedNew = $t01550115655._3
408401 ((([ScriptTransfer(userAddress, amount, stakedAssetId), HistoryRecordEntry("unstake", userAddress, i.transactionId, lockAmount, lockStart, (lockAmount - amount), lockStart)] ++ RewardEntries(false, userAddressStr, lockAmount)) ++ LockParamsEntry(userAddress, (lockAmount - amount), lockStart)) ++ statsEntries)
409402 }
410403 }
466459
467460
468461 @Callable(i)
469-func claimRewards () = {
470- let userAddress = i.caller
471- let userAddressStr = toString(userAddress)
472- if ((size(i.payments) > 0))
473- then throw("payments are not accepted")
474- else {
475- let $t01772917834 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
476- let isNewUser = $t01772917834._1
477- let stakedAmount = $t01772917834._2
478- let stakingStart = $t01772917834._3
479- let stakedAmountX = toBigInt(stakedAmount)
480- let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
481- let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
482- let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
483- func forEachAssetCalcUnclaimedReward (accum,asset) = {
484- let $t01820518343 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
485- let rewardTotal = $t01820518343._1
486- let cached = $t01820518343._2
487- let dynamic = $t01820518343._3
488- let rewardCachedPartKEY = $t01820518343._4
489- let claimedKEY = keyClaimed(userAddressStr, asset)
490- let $t01840318440 = accum
491- let data = $t01840318440._1
492- let claimedAmtByAsset = $t01840318440._2
493- let newPart = makeString([asset, toString(rewardTotal)], ":")
494- let claimedAmtByAssetNew = makeString([claimedAmtByAsset, newPart], "_")
495- if ((0 >= rewardTotal))
496- then $Tuple2(data, claimedAmtByAssetNew)
497- else $Tuple2((((data :+ ScriptTransfer(userAddress, rewardTotal, toAssetVect(asset))) :+ IntegerEntry(claimedKEY, (valueOrElse(getInteger(claimedKEY), 0) + rewardTotal))) :+ IntegerEntry(rewardCachedPartKEY, 0)), claimedAmtByAssetNew)
498- }
462+func claimRewards () = commonClaim(i.caller, i)
499463
500- let $t01890019014 = {
501- let $l = supportedAssetsList
502- let $s = size($l)
503- let $acc0 = $Tuple2(nil, "")
504- func $f0_1 ($a,$i) = if (($i >= $s))
505- then $a
506- else forEachAssetCalcUnclaimedReward($a, $l[$i])
507464
508- func $f0_2 ($a,$i) = if (($i >= $s))
509- then $a
510- else throw("List size exceeds 10")
511465
512- $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)
513- }
514- let transfers = $t01890019014._1
515- let claimedAmtByAssetResult = $t01890019014._2
516- if ((0 >= size(transfers)))
517- then throw("nothing to claim")
518- else ((transfers :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)) :+ ClaimHistoryEntry(userAddress, i.transactionId, drop(claimedAmtByAssetResult, 1)))
519- }
520- }
466+@Callable(i)
467+func claimRewardsByOriginCaller () = commonClaim(i.originCaller, i)
521468
522469
523470
542489 }
543490 else {
544491 let userAddress = addressFromStringValue(userAddressStr)
545- let $t01967319778 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
546- let isNewUser = $t01967319778._1
547- let stakedAmount = $t01967319778._2
548- let stakingStart = $t01967319778._3
492+ let $t01820918314 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
493+ let isNewUser = $t01820918314._1
494+ let stakedAmount = $t01820918314._2
495+ let stakingStart = $t01820918314._3
549496 let stakedAmountX = toBigInt(stakedAmount)
550497 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
551498 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
552499 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
553500 func forEachAssetCalcUnclaimedReward (accum,asset) = {
554- let $t02012420262 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
555- let rewardTotal = $t02012420262._1
556- let cached = $t02012420262._2
557- let dynamic = $t02012420262._3
558- let rewardCachedPartKEY = $t02012420262._4
501+ let $t01866018798 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
502+ let rewardTotal = $t01866018798._1
503+ let cached = $t01866018798._2
504+ let dynamic = $t01866018798._3
505+ let rewardCachedPartKEY = $t01866018798._4
559506 let claimed = valueOrElse(getInteger(keyClaimed(userAddressStr, asset)), 0)
560507 ((accum + makeString([asset, toString(rewardTotal), toString(claimed)], ":")) + "_")
561508 }
586533 then $Tuple2(nil, [0, surfTotal, 0, gnsbtFromSurfTotal, 0])
587534 else {
588535 let userAddress = toAddressOrFail(userAddressStrOrEmpty)
589- let $t02095421055 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
590- let isNewUser = $t02095421055._1
591- let surfUser = $t02095421055._2
592- let stakingStart = $t02095421055._3
536+ let $t01949019591 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
537+ let isNewUser = $t01949019591._1
538+ let surfUser = $t01949019591._2
539+ let stakingStart = $t01949019591._3
593540 let gnsbtFromSurfUser = surfToGnsbt(surfUser)
594541 $Tuple2(nil, [surfUser, surfTotal, gnsbtFromSurfUser, gnsbtFromSurfTotal, stakingStart])
595542 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let separator = "__"
55
66 let SEP = "__"
77
88 let MULT6 = 1000000
99
1010 let MULT8 = 100000000
1111
1212 let MULTX6 = toBigInt(MULT6)
1313
1414 let MULTX8 = toBigInt(MULT8)
1515
1616 let MULTX18 = toBigInt(1000000000000000000)
1717
1818 let WAVESIDSTR = "WAVES"
1919
2020 let WAVESID = fromBase58String(WAVESIDSTR)
2121
2222 let IdxControlCfgNeutrinoDapp = 1
2323
2424 let IdxControlCfgAuctionDapp = 2
2525
2626 let IdxControlCfgRpdDapp = 3
2727
2828 let IdxControlCfgMathDapp = 4
2929
3030 let IdxControlCfgLiquidationDapp = 5
3131
3232 let IdxControlCfgRestDapp = 6
3333
3434 let IdxControlCfgNodeRegistryDapp = 7
3535
3636 let IdxControlCfgNsbtStakingDapp = 8
3737
3838 let IdxControlCfgMediatorDapp = 9
3939
4040 let IdxControlCfgSurfStakingDapp = 10
4141
4242 let IdxControlCfgGnsbtControllerDapp = 11
4343
4444 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), (((("mandatory " + toString(address)) + ".") + key) + " is not defined"))
4545
4646
4747 func keyControlAddress () = "%s%s__config__controlAddress"
4848
4949
5050 func keyControlCfg () = "%s__controlConfig"
5151
5252
5353 func readControlCfgOrFail (control) = split(getStringOrFail(control, keyControlCfg()), SEP)
5454
5555
5656 func getContractAddressOrFail (controlCfg,idx) = valueOrErrorMessage(addressFromString(controlCfg[idx]), ("Control cfg doesn't contain address at index " + toString(idx)))
5757
5858
5959 let controlContract = addressFromStringValue(valueOrElse(getString(this, keyControlAddress()), "3N4NS7d4Jo9a6F14LiFUKKYVdUkkf2eP4Zx"))
6060
6161 let controlCfg = readControlCfgOrFail(controlContract)
6262
6363 let mathContract = getContractAddressOrFail(controlCfg, IdxControlCfgMathDapp)
6464
6565 let neutrinoContract = getContractAddressOrFail(controlCfg, IdxControlCfgNeutrinoDapp)
6666
6767 let auctionContract = getContractAddressOrFail(controlCfg, IdxControlCfgAuctionDapp)
6868
6969 func keyBondAsset () = "bond_asset_id"
7070
7171
7272 func keyAuctionContractAddress () = "auction_contract"
7373
7474
7575 func keyMinLockAmount () = "%s__minLockAmount"
7676
7777
7878 func keyStakedAssetId () = "%s__stakedAssetId"
7979
8080
8181 func keyLockParamUserAmount (userAddress) = makeString(["%s%s%s", "paramByUser", toString(userAddress), "amount"], separator)
8282
8383
8484 func keyLockParamStartBlock (userAddress) = makeString(["%s%s%s", "paramByUser", toString(userAddress), "start"], separator)
8585
8686
8787 func keyHistoryRecord (type,userAddress,txId) = makeString(["%s%s%s%s", "history", type, toString(userAddress), toBase58String(txId)], separator)
8888
8989
9090 func keyLockParamTotalAmount () = makeString(["%s%s", "stats", "activeTotalLocked"], separator)
9191
9292
9393 func keyStatsLocksCount () = makeString(["%s%s", "stats", "locksCount"], separator)
9494
9595
9696 func keyStatsUsersCount () = makeString(["%s%s", "stats", "activeUsersCount"], separator)
9797
9898
9999 func keyNextPeriod () = "%s__nextPeriod"
100100
101101
102102 func keySupportedRewardAssets () = "supportedRewardAssets"
103103
104104
105105 func keyDepositNumLast () = makeString(["%s%s%s", "dep", "lastNum"], separator)
106106
107107
108108 func keyUserRewardFromDepositNum (userAddress) = makeString(["%s%s%s", "userRwdFromDepNum", userAddress], separator)
109109
110110
111111 func keyRewardPerNsbtSumAt (depositNum,tkn) = makeString(["%s%d", "rwdPerNsbtSumByDepNum", toString(depositNum), tkn], separator)
112112
113113
114114 func keyReward (userAddress,tkn) = makeString(["%s%s%s", "rwd", userAddress, tkn], separator)
115115
116116
117117 func keyClaimed (userAddress,tkn) = makeString(["%s%s%s", "clm", userAddress, tkn], separator)
118118
119119
120120 func keyNotDistributedReward (tkn) = makeString(["%s%s", "notDistributed", tkn], separator)
121121
122122
123123 func toX18 (origVal,origMult) = fraction(toBigInt(origVal), MULTX18, origMult)
124124
125125
126126 func getIntOrZero (key) = valueOrElse(getInteger(this, key), 0)
127127
128128
129129 func getIntOrElse (key,defaultVal) = valueOrElse(getInteger(this, key), defaultVal)
130130
131131
132132 func getIntOrFail (key) = valueOrErrorMessage(getInteger(this, key), (("Mandatory this." + key) + " is not defined"))
133133
134134
135135 func getStrOrElse (key,defaultVal) = valueOrElse(getString(this, key), defaultVal)
136136
137137
138138 func toAddressOrFail (addressStr) = valueOrErrorMessage(addressFromString(addressStr), ("couldn't parse passed addressStr=" + addressStr))
139139
140140
141141 func toAssetVect (assetStr) = if ((assetStr == WAVESIDSTR))
142142 then unit
143143 else fromBase58String(assetStr)
144144
145145
146146 func asInt (val) = match val {
147147 case valInt: Int =>
148148 valInt
149149 case _ =>
150150 throw("fail to cast into Int")
151151 }
152152
153153
154154 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)
155155
156156
157157 func formatClaimHistoryRecord (user,claimedRewards) = makeString(["%s%d%d%s", user, toString(lastBlock.height), toString(lastBlock.timestamp), claimedRewards], separator)
158158
159159
160160 func HistoryRecordEntry (type,userAddress,txId,oldAmount,oldStart,newAmount,newStart) = StringEntry(keyHistoryRecord(type, userAddress, txId), formatHistoryRecord(oldAmount, oldStart, newAmount, newStart))
161161
162162
163163 func ClaimHistoryEntry (userAddress,txId,claimedRewards) = StringEntry(keyHistoryRecord("claim", userAddress, txId), formatClaimHistoryRecord(toString(userAddress), claimedRewards))
164164
165165
166166 func StatsResult (totalLockedInc,lockCountInc,usersCountInc) = {
167167 let locksCount = getIntOrZero(keyStatsLocksCount())
168168 let usersCount = getIntOrZero(keyStatsUsersCount())
169169 let totalAmount = getIntOrZero(keyLockParamTotalAmount())
170170 let totalAmountNew = (totalAmount + totalLockedInc)
171171 $Tuple3([IntegerEntry(keyStatsLocksCount(), (locksCount + lockCountInc)), IntegerEntry(keyStatsUsersCount(), (usersCount + usersCountInc)), IntegerEntry(keyLockParamTotalAmount(), totalAmountNew)], totalAmount, totalAmountNew)
172172 }
173173
174174
175175 func LockParamsEntry (userAddress,amount,start) = [IntegerEntry(keyLockParamUserAmount(userAddress), amount), IntegerEntry(keyLockParamStartBlock(userAddress), start)]
176176
177177
178178 func getParamsOrFail () = $Tuple2(fromBase58String(getStringOrFail(this, keyStakedAssetId())), getIntOrFail(keyMinLockAmount()))
179179
180180
181181 func isActiveUser (userAddress) = (getIntOrElse(keyLockParamUserAmount(userAddress), 0) > 0)
182182
183183
184184 func getUserParamsOrUnit (userAddress) = if (isActiveUser(userAddress))
185185 then $Tuple3(false, getIntOrFail(keyLockParamUserAmount(userAddress)), getIntOrFail(keyLockParamStartBlock(userAddress)))
186186 else unit
187187
188188
189189 func getUserParamsOrFail (userAddress) = valueOrErrorMessage(getUserParamsOrUnit(userAddress), (("User " + toString(userAddress)) + " is not defined"))
190190
191191
192192 let supportedAssetsStr = getStrOrElse(keySupportedRewardAssets(), "")
193193
194194 let supportedAssetsList = split(supportedAssetsStr, "_")
195195
196196 func calcReward (userAddress,assetId,stakedAmountX,depositNumUser,depositNumLast) = {
197197 let rewardPerNsbtSumLastKEY = keyRewardPerNsbtSumAt(depositNumLast, assetId)
198198 let sumLastX18 = parseBigIntValue(getStrOrElse(keyRewardPerNsbtSumAt(depositNumLast, assetId), "0"))
199199 let sumUserX18 = parseBigIntValue(getStrOrElse(keyRewardPerNsbtSumAt(depositNumUser, assetId), "0"))
200200 let rewardDynamicPart = toInt(fraction((sumLastX18 - sumUserX18), stakedAmountX, MULTX18))
201201 let rewardCachedPartKEY = keyReward(userAddress, assetId)
202202 let rewardCachedPart = getIntOrElse(rewardCachedPartKEY, 0)
203203 $Tuple4((rewardCachedPart + rewardDynamicPart), rewardCachedPart, rewardDynamicPart, rewardCachedPartKEY)
204204 }
205205
206206
207207 func RewardEntries (isNewUser,userAddress,stakedAmount) = {
208208 let stakedAmountX = toBigInt(stakedAmount)
209209 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddress)
210210 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
211211 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
212212 func forEachAssetCacheUserReward (accum,asset) = {
213213 let $t084368571 = calcReward(userAddress, asset, stakedAmountX, depositNumUser, depositNumLast)
214214 let rewardTotal = $t084368571._1
215215 let cached = $t084368571._2
216216 let dynamic = $t084368571._3
217217 let rewardCachedPartKEY = $t084368571._4
218218 (accum :+ IntegerEntry(rewardCachedPartKEY, rewardTotal))
219219 }
220220
221221 if (if ((depositNumLast == -1))
222222 then (depositNumUser == -1)
223223 else false)
224224 then nil
225225 else if (if ((depositNumLast == -1))
226226 then (depositNumUser > -1)
227227 else false)
228228 then throw("invalid depositNumLast and depositNumUser state")
229229 else if (if ((depositNumLast > -1))
230- then (depositNumUser == -1)
230+ then (depositNumUser >= -1)
231231 else false)
232232 then if (isNewUser)
233233 then [IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)]
234234 else ({
235235 let $l = supportedAssetsList
236236 let $s = size($l)
237237 let $acc0 = nil
238238 func $f0_1 ($a,$i) = if (($i >= $s))
239239 then $a
240240 else forEachAssetCacheUserReward($a, $l[$i])
241241
242242 func $f0_2 ($a,$i) = if (($i >= $s))
243243 then $a
244244 else throw("List size exceeds 10")
245245
246246 $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)
247247 } :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast))
248- else if (if ((depositNumLast > -1))
249- then (depositNumUser > -1)
250- else false)
251- then if (isNewUser)
252- then [IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)]
253- else ({
254- let $l = supportedAssetsList
255- let $s = size($l)
256- let $acc0 = nil
257- func $f0_1 ($a,$i) = if (($i >= $s))
258- then $a
259- else forEachAssetCacheUserReward($a, $l[$i])
260-
261- func $f0_2 ($a,$i) = if (($i >= $s))
262- then $a
263- else throw("List size exceeds 10")
264-
265- $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)
266- } :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast))
267- else throw(((("uncovered condition: depositNumLast=" + toString(depositNumLast)) + " depositNumUser=") + toString(depositNumUser)))
248+ else throw(((("uncovered condition: depositNumLast=" + toString(depositNumLast)) + " depositNumUser=") + toString(depositNumUser)))
268249 }
269250
270251
271252 func IncrementNotDistributedRewardEntry (tkn,amountInc) = {
272253 let notDistributedRewardKEY = keyNotDistributedReward(tkn)
273254 let notDistributedReward = getIntOrElse(notDistributedRewardKEY, 0)
274255 [IntegerEntry(notDistributedRewardKEY, (notDistributedReward + amountInc))]
275256 }
276257
277258
278259 func surfToGnsbt (surfAmt) = (surfAmt / 60)
279260
280261
281-let ContolContractKey = "control_contract"
282-
283-@Callable(i)
284-func constructor (minLockAmount,supportedRewardAssets,stakedAssetId) = if ((i.caller != this))
285- then throw("Permission denied")
286- else [IntegerEntry(keyMinLockAmount(), minLockAmount), StringEntry(keySupportedRewardAssets(), supportedRewardAssets), StringEntry(keyStakedAssetId(), stakedAssetId)]
287-
288-
289-
290-@Callable(i)
291-func stake () = {
292- let $t01212012174 = getParamsOrFail()
293- let stakedAssetId = $t01212012174._1
294- let minLockAmount = $t01212012174._2
262+func commonStake (userAddress,i) = {
263+ let $t01145511509 = getParamsOrFail()
264+ let stakedAssetId = $t01145511509._1
265+ let minLockAmount = $t01145511509._2
295266 if ((size(i.payments) != 1))
296267 then throw("Invalid payments size")
297268 else {
298269 let payment = i.payments[0]
299270 let amount = payment.amount
300271 let invalidAssetMessage = (("Invalid asset. " + toBase58String(stakedAssetId)) + " is expected")
301272 let assetId = valueOrErrorMessage(payment.assetId, invalidAssetMessage)
302273 if ((assetId != stakedAssetId))
303274 then throw(invalidAssetMessage)
304275 else {
305- let userAddress = i.caller
306276 let userAddressStr = toString(userAddress)
307277 let gnsbtAmtUser = 0
308278 let gnsbtAmtTotal = 0
309- let $t01267212781 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, -1))
310- let isNewUser = $t01267212781._1
311- let stakedAmount = $t01267212781._2
312- let lockStartHeight = $t01267212781._3
279+ let $t01197812087 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, -1))
280+ let isNewUser = $t01197812087._1
281+ let stakedAmount = $t01197812087._2
282+ let lockStartHeight = $t01197812087._3
313283 let stakedAmountNew = if (isNewUser)
314284 then amount
315285 else (amount + stakedAmount)
316286 let mergedStartHeight = if (isNewUser)
317287 then height
318288 else (height + (1440 * 14))
319289 if ((minLockAmount > stakedAmountNew))
320290 then throw(("Min lock amount is " + toString(minLockAmount)))
321291 else {
322- let $t01308413186 = StatsResult(amount, 1, if (isNewUser)
292+ let $t01239012492 = StatsResult(amount, 1, if (isNewUser)
323293 then 1
324294 else 0)
325- let statsEntries = $t01308413186._1
326- let totalStaked = $t01308413186._2
327- let totalStakedNew = $t01308413186._3
295+ let statsEntries = $t01239012492._1
296+ let totalStaked = $t01239012492._2
297+ let totalStakedNew = $t01239012492._3
328298 ((([HistoryRecordEntry("stake", userAddress, i.transactionId, stakedAmount, lockStartHeight, stakedAmountNew, mergedStartHeight)] ++ RewardEntries(isNewUser, userAddressStr, stakedAmount)) ++ LockParamsEntry(userAddress, stakedAmountNew, mergedStartHeight)) ++ statsEntries)
329299 }
330300 }
331301 }
332302 }
333303
334304
305+func commonClaim (userAddress,i) = {
306+ let userAddressStr = toString(userAddress)
307+ if ((size(i.payments) > 0))
308+ then throw("payments are not accepted")
309+ else {
310+ let $t01296313068 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
311+ let isNewUser = $t01296313068._1
312+ let stakedAmount = $t01296313068._2
313+ let stakingStart = $t01296313068._3
314+ let stakedAmountX = toBigInt(stakedAmount)
315+ let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
316+ let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
317+ let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
318+ func forEachAssetCalcUnclaimedReward (accum,asset) = {
319+ let $t01343913577 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
320+ let rewardTotal = $t01343913577._1
321+ let cached = $t01343913577._2
322+ let dynamic = $t01343913577._3
323+ let rewardCachedPartKEY = $t01343913577._4
324+ let claimedKEY = keyClaimed(userAddressStr, asset)
325+ let $t01363713674 = accum
326+ let data = $t01363713674._1
327+ let claimedAmtByAsset = $t01363713674._2
328+ let newPart = makeString([asset, toString(rewardTotal)], ":")
329+ let claimedAmtByAssetNew = makeString([claimedAmtByAsset, newPart], "_")
330+ if ((0 >= rewardTotal))
331+ then $Tuple2(data, claimedAmtByAssetNew)
332+ else $Tuple2((((data :+ ScriptTransfer(userAddress, rewardTotal, toAssetVect(asset))) :+ IntegerEntry(claimedKEY, (valueOrElse(getInteger(claimedKEY), 0) + rewardTotal))) :+ IntegerEntry(rewardCachedPartKEY, 0)), claimedAmtByAssetNew)
333+ }
334+
335+ let $t01413414248 = {
336+ let $l = supportedAssetsList
337+ let $s = size($l)
338+ let $acc0 = $Tuple2(nil, "")
339+ func $f0_1 ($a,$i) = if (($i >= $s))
340+ then $a
341+ else forEachAssetCalcUnclaimedReward($a, $l[$i])
342+
343+ func $f0_2 ($a,$i) = if (($i >= $s))
344+ then $a
345+ else throw("List size exceeds 10")
346+
347+ $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+ }
349+ let transfers = $t01413414248._1
350+ let claimedAmtByAssetResult = $t01413414248._2
351+ if ((0 >= size(transfers)))
352+ then throw("nothing to claim")
353+ else ((transfers :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)) :+ ClaimHistoryEntry(userAddress, i.transactionId, drop(claimedAmtByAssetResult, 1)))
354+ }
355+ }
356+
335357
336358 @Callable(i)
337-func stakeByOriginCaller () = {
338- let $t01352213576 = getParamsOrFail()
339- let stakedAssetId = $t01352213576._1
340- let minLockAmount = $t01352213576._2
341- if ((size(i.payments) != 1))
342- then throw("Invalid payments size")
343- else {
344- let payment = i.payments[0]
345- let amount = payment.amount
346- let invalidAssetMessage = (("Invalid asset. " + toBase58String(stakedAssetId)) + " is expected")
347- let assetId = valueOrErrorMessage(payment.assetId, invalidAssetMessage)
348- if ((assetId != stakedAssetId))
349- then throw(invalidAssetMessage)
350- else {
351- let userAddress = i.originCaller
352- let userAddressStr = toString(userAddress)
353- let gnsbtAmtUser = 0
354- let gnsbtAmtTotal = 0
355- let $t01408014189 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, -1))
356- let isNewUser = $t01408014189._1
357- let stakedAmount = $t01408014189._2
358- let lockStartHeight = $t01408014189._3
359- let stakedAmountNew = if (isNewUser)
360- then amount
361- else (amount + stakedAmount)
362- let mergedStartHeight = if (isNewUser)
363- then height
364- else (height + (1440 * 14))
365- if ((minLockAmount > stakedAmountNew))
366- then throw(("Min lock amount is " + toString(minLockAmount)))
367- else {
368- let $t01449214594 = StatsResult(amount, 1, if (isNewUser)
369- then 1
370- else 0)
371- let statsEntries = $t01449214594._1
372- let totalStaked = $t01449214594._2
373- let totalStakedNew = $t01449214594._3
374- ((([HistoryRecordEntry("stake", userAddress, i.transactionId, stakedAmount, lockStartHeight, stakedAmountNew, mergedStartHeight)] ++ RewardEntries(isNewUser, userAddressStr, stakedAmount)) ++ LockParamsEntry(userAddress, stakedAmountNew, mergedStartHeight)) ++ statsEntries)
375- }
376- }
377- }
378- }
359+func constructor (minLockAmount,supportedRewardAssets,stakedAssetId) = if ((i.caller != this))
360+ then throw("Permission denied")
361+ else [IntegerEntry(keyMinLockAmount(), minLockAmount), StringEntry(keySupportedRewardAssets(), supportedRewardAssets), StringEntry(keyStakedAssetId(), stakedAssetId)]
362+
363+
364+
365+@Callable(i)
366+func stake () = commonStake(i.caller, i)
367+
368+
369+
370+@Callable(i)
371+func stakeByOriginCaller () = commonStake(i.originCaller, i)
379372
380373
381374
382375 @Callable(i)
383376 func unstake (amount) = if ((size(i.payments) != 0))
384377 then throw("unstake doesn't require any payment")
385378 else {
386379 let userAddress = i.caller
387380 let userAddressStr = toString(userAddress)
388- let $t01509015144 = getParamsOrFail()
389- let stakedAssetId = $t01509015144._1
390- let minLockAmount = $t01509015144._2
391- let $t01514715221 = getUserParamsOrFail(userAddress)
392- let isNewUser = $t01514715221._1
393- let lockAmount = $t01514715221._2
394- let lockStart = $t01514715221._3
381+ let $t01518015234 = getParamsOrFail()
382+ let stakedAssetId = $t01518015234._1
383+ let minLockAmount = $t01518015234._2
384+ let $t01523715311 = getUserParamsOrFail(userAddress)
385+ let isNewUser = $t01523715311._1
386+ let lockAmount = $t01523715311._2
387+ let lockStart = $t01523715311._3
395388 if ((0 >= lockAmount))
396389 then throw("Nothing to unstake")
397390 else if ((amount > lockAmount))
398391 then throw(((("Requested " + toString(amount)) + ", but staked only ") + toString(lockAmount)))
399392 else {
400- let $t01541115565 = StatsResult(-(amount), if ((amount == lockAmount))
393+ let $t01550115655 = StatsResult(-(amount), if ((amount == lockAmount))
401394 then -1
402395 else 0, if ((amount == lockAmount))
403396 then -1
404397 else 0)
405- let statsEntries = $t01541115565._1
406- let totalStaked = $t01541115565._2
407- let totalStakedNew = $t01541115565._3
398+ let statsEntries = $t01550115655._1
399+ let totalStaked = $t01550115655._2
400+ let totalStakedNew = $t01550115655._3
408401 ((([ScriptTransfer(userAddress, amount, stakedAssetId), HistoryRecordEntry("unstake", userAddress, i.transactionId, lockAmount, lockStart, (lockAmount - amount), lockStart)] ++ RewardEntries(false, userAddressStr, lockAmount)) ++ LockParamsEntry(userAddress, (lockAmount - amount), lockStart)) ++ statsEntries)
409402 }
410403 }
411404
412405
413406
414407 @Callable(i)
415408 func deposit () = if ((size(i.payments) != 1))
416409 then throw("exact 1 payment is allowed only")
417410 else {
418411 let pmt = i.payments[0]
419412 let amount = pmt.amount
420413 let pmtAssetId = valueOrElse(pmt.assetId, WAVESID)
421414 let pmtAssetIdStr = toBase58String(pmtAssetId)
422415 let pmtMultX = if ((pmtAssetId == WAVESID))
423416 then MULTX8
424417 else MULTX6
425418 let amountX = toBigInt(amount)
426419 let totalStaked = getIntOrElse(keyLockParamTotalAmount(), 0)
427420 let totalStakedX = toBigInt(totalStaked)
428421 if ((0 > totalStaked))
429422 then throw("TODO: case is not supported")
430423 else if ((totalStaked == 0))
431424 then IncrementNotDistributedRewardEntry(pmtAssetIdStr, amount)
432425 else {
433426 let rewardPerNsbtX18 = fraction(amountX, MULTX18, totalStakedX)
434427 let depositNumLastKEY = keyDepositNumLast()
435428 let depositNumLast = getIntOrElse(depositNumLastKEY, -1)
436429 let depositNumNew = (depositNumLast + 1)
437430 if (!(contains(supportedAssetsStr, pmtAssetIdStr)))
438431 then throw(((supportedAssetsStr + " doesn't contain ") + pmtAssetIdStr))
439432 else {
440433 func refreshRewardPerNsbtSUM (accum,nextAsset) = {
441434 let rewardPerNsbtSumNewKEY = keyRewardPerNsbtSumAt(depositNumNew, nextAsset)
442435 let sumLastStr = getStrOrElse(keyRewardPerNsbtSumAt(depositNumLast, nextAsset), "0")
443436 (accum :+ (if ((nextAsset == pmtAssetIdStr))
444437 then StringEntry(rewardPerNsbtSumNewKEY, toString((parseBigIntValue(sumLastStr) + rewardPerNsbtX18)))
445438 else StringEntry(rewardPerNsbtSumNewKEY, sumLastStr)))
446439 }
447440
448441 ({
449442 let $l = supportedAssetsList
450443 let $s = size($l)
451444 let $acc0 = nil
452445 func $f0_1 ($a,$i) = if (($i >= $s))
453446 then $a
454447 else refreshRewardPerNsbtSUM($a, $l[$i])
455448
456449 func $f0_2 ($a,$i) = if (($i >= $s))
457450 then $a
458451 else throw("List size exceeds 10")
459452
460453 $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)
461454 } :+ IntegerEntry(depositNumLastKEY, depositNumNew))
462455 }
463456 }
464457 }
465458
466459
467460
468461 @Callable(i)
469-func claimRewards () = {
470- let userAddress = i.caller
471- let userAddressStr = toString(userAddress)
472- if ((size(i.payments) > 0))
473- then throw("payments are not accepted")
474- else {
475- let $t01772917834 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
476- let isNewUser = $t01772917834._1
477- let stakedAmount = $t01772917834._2
478- let stakingStart = $t01772917834._3
479- let stakedAmountX = toBigInt(stakedAmount)
480- let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
481- let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
482- let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
483- func forEachAssetCalcUnclaimedReward (accum,asset) = {
484- let $t01820518343 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
485- let rewardTotal = $t01820518343._1
486- let cached = $t01820518343._2
487- let dynamic = $t01820518343._3
488- let rewardCachedPartKEY = $t01820518343._4
489- let claimedKEY = keyClaimed(userAddressStr, asset)
490- let $t01840318440 = accum
491- let data = $t01840318440._1
492- let claimedAmtByAsset = $t01840318440._2
493- let newPart = makeString([asset, toString(rewardTotal)], ":")
494- let claimedAmtByAssetNew = makeString([claimedAmtByAsset, newPart], "_")
495- if ((0 >= rewardTotal))
496- then $Tuple2(data, claimedAmtByAssetNew)
497- else $Tuple2((((data :+ ScriptTransfer(userAddress, rewardTotal, toAssetVect(asset))) :+ IntegerEntry(claimedKEY, (valueOrElse(getInteger(claimedKEY), 0) + rewardTotal))) :+ IntegerEntry(rewardCachedPartKEY, 0)), claimedAmtByAssetNew)
498- }
462+func claimRewards () = commonClaim(i.caller, i)
499463
500- let $t01890019014 = {
501- let $l = supportedAssetsList
502- let $s = size($l)
503- let $acc0 = $Tuple2(nil, "")
504- func $f0_1 ($a,$i) = if (($i >= $s))
505- then $a
506- else forEachAssetCalcUnclaimedReward($a, $l[$i])
507464
508- func $f0_2 ($a,$i) = if (($i >= $s))
509- then $a
510- else throw("List size exceeds 10")
511465
512- $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)
513- }
514- let transfers = $t01890019014._1
515- let claimedAmtByAssetResult = $t01890019014._2
516- if ((0 >= size(transfers)))
517- then throw("nothing to claim")
518- else ((transfers :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)) :+ ClaimHistoryEntry(userAddress, i.transactionId, drop(claimedAmtByAssetResult, 1)))
519- }
520- }
466+@Callable(i)
467+func claimRewardsByOriginCaller () = commonClaim(i.originCaller, i)
521468
522469
523470
524471 @Callable(i)
525472 func unclaimedRewardsREADONLY (userAddressStr) = {
526473 func forEachAssetZeroReward (accum,asset) = ((accum + makeString([asset, "0", "0"], ":")) + "_")
527474
528475 let unclaimedRewardStr = if ((userAddressStr == ""))
529476 then {
530477 let $l = supportedAssetsList
531478 let $s = size($l)
532479 let $acc0 = ""
533480 func $f0_1 ($a,$i) = if (($i >= $s))
534481 then $a
535482 else forEachAssetZeroReward($a, $l[$i])
536483
537484 func $f0_2 ($a,$i) = if (($i >= $s))
538485 then $a
539486 else throw("List size exceeds 10")
540487
541488 $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)
542489 }
543490 else {
544491 let userAddress = addressFromStringValue(userAddressStr)
545- let $t01967319778 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
546- let isNewUser = $t01967319778._1
547- let stakedAmount = $t01967319778._2
548- let stakingStart = $t01967319778._3
492+ let $t01820918314 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
493+ let isNewUser = $t01820918314._1
494+ let stakedAmount = $t01820918314._2
495+ let stakingStart = $t01820918314._3
549496 let stakedAmountX = toBigInt(stakedAmount)
550497 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
551498 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
552499 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
553500 func forEachAssetCalcUnclaimedReward (accum,asset) = {
554- let $t02012420262 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
555- let rewardTotal = $t02012420262._1
556- let cached = $t02012420262._2
557- let dynamic = $t02012420262._3
558- let rewardCachedPartKEY = $t02012420262._4
501+ let $t01866018798 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
502+ let rewardTotal = $t01866018798._1
503+ let cached = $t01866018798._2
504+ let dynamic = $t01866018798._3
505+ let rewardCachedPartKEY = $t01866018798._4
559506 let claimed = valueOrElse(getInteger(keyClaimed(userAddressStr, asset)), 0)
560507 ((accum + makeString([asset, toString(rewardTotal), toString(claimed)], ":")) + "_")
561508 }
562509
563510 let $l = supportedAssetsList
564511 let $s = size($l)
565512 let $acc0 = ""
566513 func $f0_1 ($a,$i) = if (($i >= $s))
567514 then $a
568515 else forEachAssetCalcUnclaimedReward($a, $l[$i])
569516
570517 func $f0_2 ($a,$i) = if (($i >= $s))
571518 then $a
572519 else throw("List size exceeds 10")
573520
574521 $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)
575522 }
576523 $Tuple2(nil, dropRight(unclaimedRewardStr, 1))
577524 }
578525
579526
580527
581528 @Callable(i)
582529 func surfStakingSYSREADONLY (userAddressStrOrEmpty) = {
583530 let surfTotal = getIntOrElse(keyLockParamTotalAmount(), 0)
584531 let gnsbtFromSurfTotal = surfToGnsbt(surfTotal)
585532 if ((userAddressStrOrEmpty == ""))
586533 then $Tuple2(nil, [0, surfTotal, 0, gnsbtFromSurfTotal, 0])
587534 else {
588535 let userAddress = toAddressOrFail(userAddressStrOrEmpty)
589- let $t02095421055 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
590- let isNewUser = $t02095421055._1
591- let surfUser = $t02095421055._2
592- let stakingStart = $t02095421055._3
536+ let $t01949019591 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
537+ let isNewUser = $t01949019591._1
538+ let surfUser = $t01949019591._2
539+ let stakingStart = $t01949019591._3
593540 let gnsbtFromSurfUser = surfToGnsbt(surfUser)
594541 $Tuple2(nil, [surfUser, surfTotal, gnsbtFromSurfUser, gnsbtFromSurfTotal, stakingStart])
595542 }
596543 }
597544
598545
599546
600547 @Callable(i)
601548 func configSYSREADONLY () = {
602549 let minLockAmt = getIntegerValue(keyMinLockAmount())
603550 let gnsbtFromSurfCoeff = (60 * MULT6)
604551 let surfVotingPowerRestrictivePeriod = (1440 * 14)
605552 let brToStartSurfTransformation = 1200000
606553 $Tuple2(nil, [minLockAmt, gnsbtFromSurfCoeff, surfVotingPowerRestrictivePeriod, brToStartSurfTransformation])
607554 }
608555
609556

github/deemru/w8io/169f3d6 
116.17 ms