tx · CcGH7yZgP3KsW9T98fwiQHtprj1dbf7uqTKYAHHQR9Jt

3N5yarEiTQccnnuerogYT3BxM5Zc5bRgDZy:  -0.04000000 Waves

2022.08.05 15:00 [2171153] smart account 3N5yarEiTQccnnuerogYT3BxM5Zc5bRgDZy > SELF 0.00000000 Waves

{ "type": 13, "id": "CcGH7yZgP3KsW9T98fwiQHtprj1dbf7uqTKYAHHQR9Jt", "fee": 4000000, "feeAssetId": null, "timestamp": 1659700881596, "version": 1, "sender": "3N5yarEiTQccnnuerogYT3BxM5Zc5bRgDZy", "senderPublicKey": "FK9j3YFWVChXKESTn33fMZz1JseCNMMqHhfB7smxJo4e", "proofs": [ "5jcQfizJpJcWepS32yvVkA52Eux471ViJ4JEovA6qnevJ4CjfnJy4UhmgtbZU9RCpnHB4nKNvR7k8mcYYc5SQWGh" ], "script": "base64:BgIlCAISBQoDAQgIEgASABIDCgEBEgASABIAEgMKAQgSBAoCCAESAE0ACXNlcGFyYXRvcgICX18AA1NFUAICX18ABU1VTFQ2AMCEPQAFTVVMVDgAgMLXLwAGTVVMVFg2CQC2AgEFBU1VTFQ2AAZNVUxUWDgJALYCAQUFTVVMVDgAB01VTFRYMTgJALYCAQCAgJC7utat8A0ACldBVkVTSURTVFICBVdBVkVTAAdXQVZFU0lECQDZBAEFCldBVkVTSURTVFIAGUlkeENvbnRyb2xDZmdOZXV0cmlub0RhcHAAAQAYSWR4Q29udHJvbENmZ0F1Y3Rpb25EYXBwAAIAFElkeENvbnRyb2xDZmdScGREYXBwAAMAFUlkeENvbnRyb2xDZmdNYXRoRGFwcAAEABxJZHhDb250cm9sQ2ZnTGlxdWlkYXRpb25EYXBwAAUAFUlkeENvbnRyb2xDZmdSZXN0RGFwcAAGAB1JZHhDb250cm9sQ2ZnTm9kZVJlZ2lzdHJ5RGFwcAAHABxJZHhDb250cm9sQ2ZnTnNidFN0YWtpbmdEYXBwAAgAGUlkeENvbnRyb2xDZmdNZWRpYXRvckRhcHAACQAcSWR4Q29udHJvbENmZ1N1cmZTdGFraW5nRGFwcAAKACBJZHhDb250cm9sQ2ZnR25zYnRDb250cm9sbGVyRGFwcAALAQ9nZXRTdHJpbmdPckZhaWwCB2FkZHJlc3MDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUHYWRkcmVzcwUDa2V5CQCsAgIJAKwCAgkArAICCQCsAgICCm1hbmRhdG9yeSAJAKUIAQUHYWRkcmVzcwIBLgUDa2V5Ag8gaXMgbm90IGRlZmluZWQBEWtleUNvbnRyb2xBZGRyZXNzAAIcJXMlc19fY29uZmlnX19jb250cm9sQWRkcmVzcwENa2V5Q29udHJvbENmZwACESVzX19jb250cm9sQ29uZmlnARRyZWFkQ29udHJvbENmZ09yRmFpbAEHY29udHJvbAkAtQkCCQEPZ2V0U3RyaW5nT3JGYWlsAgUHY29udHJvbAkBDWtleUNvbnRyb2xDZmcABQNTRVABGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIKY29udHJvbENmZwNpZHgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFCmNvbnRyb2xDZmcFA2lkeAkArAICAi1Db250cm9sIGNmZyBkb2Vzbid0IGNvbnRhaW4gYWRkcmVzcyBhdCBpbmRleCAJAKQDAQUDaWR4AA9jb250cm9sQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBEWtleUNvbnRyb2xBZGRyZXNzAAIjM040TlM3ZDRKbzlhNkYxNExpRlVLS1lWZFVra2YyZVA0WngACmNvbnRyb2xDZmcJARRyZWFkQ29udHJvbENmZ09yRmFpbAEFD2NvbnRyb2xDb250cmFjdAAMbWF0aENvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUKY29udHJvbENmZwUVSWR4Q29udHJvbENmZ01hdGhEYXBwABBuZXV0cmlub0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUKY29udHJvbENmZwUZSWR4Q29udHJvbENmZ05ldXRyaW5vRGFwcAAPYXVjdGlvbkNvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUKY29udHJvbENmZwUYSWR4Q29udHJvbENmZ0F1Y3Rpb25EYXBwAQxrZXlCb25kQXNzZXQAAg1ib25kX2Fzc2V0X2lkARlrZXlBdWN0aW9uQ29udHJhY3RBZGRyZXNzAAIQYXVjdGlvbl9jb250cmFjdAEQa2V5TWluTG9ja0Ftb3VudAACESVzX19taW5Mb2NrQW1vdW50ARBrZXlTdGFrZWRBc3NldElkAAIRJXNfX3N0YWtlZEFzc2V0SWQBFmtleUxvY2tQYXJhbVVzZXJBbW91bnQBC3VzZXJBZGRyZXNzCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICC3BhcmFtQnlVc2VyCQDMCAIJAKUIAQULdXNlckFkZHJlc3MJAMwIAgIGYW1vdW50BQNuaWwFCXNlcGFyYXRvcgEWa2V5TG9ja1BhcmFtU3RhcnRCbG9jawELdXNlckFkZHJlc3MJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgILcGFyYW1CeVVzZXIJAMwIAgkApQgBBQt1c2VyQWRkcmVzcwkAzAgCAgVzdGFydAUDbmlsBQlzZXBhcmF0b3IBJmtleUxvY2tQYXJhbVZvdGluZ1Bvd2VyRWZmZWN0aXZlSGVpZ2h0AQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgtwYXJhbUJ5VXNlcgkAzAgCCQClCAEFC3VzZXJBZGRyZXNzCQDMCAICEXZwRWZmZWN0aXZlSGVpZ2h0BQNuaWwFCXNlcGFyYXRvcgEQa2V5SGlzdG9yeVJlY29yZAMEdHlwZQt1c2VyQWRkcmVzcwR0eElkCQC5CQIJAMwIAgIIJXMlcyVzJXMJAMwIAgIHaGlzdG9yeQkAzAgCBQR0eXBlCQDMCAIJAKUIAQULdXNlckFkZHJlc3MJAMwIAgkA2AQBBQR0eElkBQNuaWwFCXNlcGFyYXRvcgEXa2V5TG9ja1BhcmFtVG90YWxBbW91bnQACQC5CQIJAMwIAgIEJXMlcwkAzAgCAgVzdGF0cwkAzAgCAhFhY3RpdmVUb3RhbExvY2tlZAUDbmlsBQlzZXBhcmF0b3IBEmtleVN0YXRzTG9ja3NDb3VudAAJALkJAgkAzAgCAgQlcyVzCQDMCAICBXN0YXRzCQDMCAICCmxvY2tzQ291bnQFA25pbAUJc2VwYXJhdG9yARJrZXlTdGF0c1VzZXJzQ291bnQACQC5CQIJAMwIAgIEJXMlcwkAzAgCAgVzdGF0cwkAzAgCAhBhY3RpdmVVc2Vyc0NvdW50BQNuaWwFCXNlcGFyYXRvcgENa2V5TmV4dFBlcmlvZAACDiVzX19uZXh0UGVyaW9kARhrZXlTdXBwb3J0ZWRSZXdhcmRBc3NldHMAAhVzdXBwb3J0ZWRSZXdhcmRBc3NldHMBEWtleURlcG9zaXROdW1MYXN0AAkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgNkZXAJAMwIAgIHbGFzdE51bQUDbmlsBQlzZXBhcmF0b3IBG2tleVVzZXJSZXdhcmRGcm9tRGVwb3NpdE51bQELdXNlckFkZHJlc3MJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIRdXNlclJ3ZEZyb21EZXBOdW0JAMwIAgULdXNlckFkZHJlc3MFA25pbAUJc2VwYXJhdG9yARVrZXlSZXdhcmRQZXJOc2J0U3VtQXQCCmRlcG9zaXROdW0DdGtuCQC5CQIJAMwIAgIEJXMlZAkAzAgCAhVyd2RQZXJOc2J0U3VtQnlEZXBOdW0JAMwIAgkApAMBBQpkZXBvc2l0TnVtCQDMCAIFA3RrbgUDbmlsBQlzZXBhcmF0b3IBCWtleVJld2FyZAILdXNlckFkZHJlc3MDdGtuCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICA3J3ZAkAzAgCBQt1c2VyQWRkcmVzcwkAzAgCBQN0a24FA25pbAUJc2VwYXJhdG9yAQprZXlDbGFpbWVkAgt1c2VyQWRkcmVzcwN0a24JALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIDY2xtCQDMCAIFC3VzZXJBZGRyZXNzCQDMCAIFA3RrbgUDbmlsBQlzZXBhcmF0b3IBF2tleU5vdERpc3RyaWJ1dGVkUmV3YXJkAQN0a24JALkJAgkAzAgCAgQlcyVzCQDMCAICDm5vdERpc3RyaWJ1dGVkCQDMCAIFA3RrbgUDbmlsBQlzZXBhcmF0b3IBBXRvWDE4AgdvcmlnVmFsCG9yaWdNdWx0CQC8AgMJALYCAQUHb3JpZ1ZhbAUHTVVMVFgxOAUIb3JpZ011bHQBDGdldEludE9yWmVybwEDa2V5CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQAAAQxnZXRJbnRPckVsc2UCA2tleQpkZWZhdWx0VmFsCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQUKZGVmYXVsdFZhbAEMZ2V0SW50T3JGYWlsAQNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzBQNrZXkJAKwCAgkArAICAg9NYW5kYXRvcnkgdGhpcy4FA2tleQIPIGlzIG5vdCBkZWZpbmVkAQxnZXRTdHJPckVsc2UCA2tleQpkZWZhdWx0VmFsCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFA2tleQUKZGVmYXVsdFZhbAEPdG9BZGRyZXNzT3JGYWlsAQphZGRyZXNzU3RyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQUKYWRkcmVzc1N0cgkArAICAiFjb3VsZG4ndCBwYXJzZSBwYXNzZWQgYWRkcmVzc1N0cj0FCmFkZHJlc3NTdHIBC3RvQXNzZXRWZWN0AQhhc3NldFN0cgMJAAACBQhhc3NldFN0cgUKV0FWRVNJRFNUUgUEdW5pdAkA2QQBBQhhc3NldFN0cgEFYXNJbnQBA3ZhbAQHJG1hdGNoMAUDdmFsAwkAAQIFByRtYXRjaDACA0ludAQGdmFsSW50BQckbWF0Y2gwBQZ2YWxJbnQJAAIBAhVmYWlsIHRvIGNhc3QgaW50byBJbnQBE2Zvcm1hdEhpc3RvcnlSZWNvcmQECW9sZEFtb3VudAhvbGRTdGFydAluZXdBbW91bnQIbmV3U3RhcnQJALkJAgkAzAgCAgwlZCVkJWQlZCVkJWQJAMwIAgkApAMBCAUJbGFzdEJsb2NrBmhlaWdodAkAzAgCCQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAKQDAQUJb2xkQW1vdW50CQDMCAIJAKQDAQUIb2xkU3RhcnQJAMwIAgkApAMBBQluZXdBbW91bnQJAMwIAgkApAMBBQhuZXdTdGFydAUDbmlsBQlzZXBhcmF0b3IBGGZvcm1hdENsYWltSGlzdG9yeVJlY29yZAIEdXNlcg5jbGFpbWVkUmV3YXJkcwkAuQkCCQDMCAICCCVzJWQlZCVzCQDMCAIFBHVzZXIJAMwIAgkApAMBCAUJbGFzdEJsb2NrBmhlaWdodAkAzAgCCQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIFDmNsYWltZWRSZXdhcmRzBQNuaWwFCXNlcGFyYXRvcgESSGlzdG9yeVJlY29yZEVudHJ5BwR0eXBlC3VzZXJBZGRyZXNzBHR4SWQJb2xkQW1vdW50CG9sZFN0YXJ0CW5ld0Ftb3VudAhuZXdTdGFydAkBC1N0cmluZ0VudHJ5AgkBEGtleUhpc3RvcnlSZWNvcmQDBQR0eXBlBQt1c2VyQWRkcmVzcwUEdHhJZAkBE2Zvcm1hdEhpc3RvcnlSZWNvcmQEBQlvbGRBbW91bnQFCG9sZFN0YXJ0BQluZXdBbW91bnQFCG5ld1N0YXJ0ARFDbGFpbUhpc3RvcnlFbnRyeQMLdXNlckFkZHJlc3MEdHhJZA5jbGFpbWVkUmV3YXJkcwkBC1N0cmluZ0VudHJ5AgkBEGtleUhpc3RvcnlSZWNvcmQDAgVjbGFpbQULdXNlckFkZHJlc3MFBHR4SWQJARhmb3JtYXRDbGFpbUhpc3RvcnlSZWNvcmQCCQClCAEFC3VzZXJBZGRyZXNzBQ5jbGFpbWVkUmV3YXJkcwELU3RhdHNSZXN1bHQDDnRvdGFsTG9ja2VkSW5jDGxvY2tDb3VudEluYw11c2Vyc0NvdW50SW5jBApsb2Nrc0NvdW50CQEMZ2V0SW50T3JaZXJvAQkBEmtleVN0YXRzTG9ja3NDb3VudAAECnVzZXJzQ291bnQJAQxnZXRJbnRPclplcm8BCQESa2V5U3RhdHNVc2Vyc0NvdW50AAQLdG90YWxBbW91bnQJAQxnZXRJbnRPclplcm8BCQEXa2V5TG9ja1BhcmFtVG90YWxBbW91bnQABA50b3RhbEFtb3VudE5ldwkAZAIFC3RvdGFsQW1vdW50BQ50b3RhbExvY2tlZEluYwkAlQoDCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQESa2V5U3RhdHNMb2Nrc0NvdW50AAkAZAIFCmxvY2tzQ291bnQFDGxvY2tDb3VudEluYwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEmtleVN0YXRzVXNlcnNDb3VudAAJAGQCBQp1c2Vyc0NvdW50BQ11c2Vyc0NvdW50SW5jCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEXa2V5TG9ja1BhcmFtVG90YWxBbW91bnQABQ50b3RhbEFtb3VudE5ldwUDbmlsBQt0b3RhbEFtb3VudAUOdG90YWxBbW91bnROZXcBD0xvY2tQYXJhbXNFbnRyeQMLdXNlckFkZHJlc3MGYW1vdW50GnZvdGluZ1Bvd2VyRWZmZWN0aXZlSGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEWa2V5TG9ja1BhcmFtVXNlckFtb3VudAEFC3VzZXJBZGRyZXNzBQZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlMb2NrUGFyYW1TdGFydEJsb2NrAQULdXNlckFkZHJlc3MFGnZvdGluZ1Bvd2VyRWZmZWN0aXZlSGVpZ2h0BQNuaWwBD2dldFBhcmFtc09yRmFpbAAJAJQKAgkA2QQBCQEPZ2V0U3RyaW5nT3JGYWlsAgUEdGhpcwkBEGtleVN0YWtlZEFzc2V0SWQACQEMZ2V0SW50T3JGYWlsAQkBEGtleU1pbkxvY2tBbW91bnQAAQxpc0FjdGl2ZVVzZXIBC3VzZXJBZGRyZXNzCQBmAgkBDGdldEludE9yRWxzZQIJARZrZXlMb2NrUGFyYW1Vc2VyQW1vdW50AQULdXNlckFkZHJlc3MAAAAAARNnZXRVc2VyUGFyYW1zT3JVbml0AQt1c2VyQWRkcmVzcwMJAQxpc0FjdGl2ZVVzZXIBBQt1c2VyQWRkcmVzcwkAlQoDBwkBDGdldEludE9yRmFpbAEJARZrZXlMb2NrUGFyYW1Vc2VyQW1vdW50AQULdXNlckFkZHJlc3MJAQxnZXRJbnRPckZhaWwBCQEWa2V5TG9ja1BhcmFtU3RhcnRCbG9jawEFC3VzZXJBZGRyZXNzBQR1bml0ARNnZXRVc2VyUGFyYW1zT3JGYWlsAQt1c2VyQWRkcmVzcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQETZ2V0VXNlclBhcmFtc09yVW5pdAEFC3VzZXJBZGRyZXNzCQCsAgIJAKwCAgIFVXNlciAJAKUIAQULdXNlckFkZHJlc3MCDyBpcyBub3QgZGVmaW5lZAASc3VwcG9ydGVkQXNzZXRzU3RyCQEMZ2V0U3RyT3JFbHNlAgkBGGtleVN1cHBvcnRlZFJld2FyZEFzc2V0cwACAAATc3VwcG9ydGVkQXNzZXRzTGlzdAkAtQkCBRJzdXBwb3J0ZWRBc3NldHNTdHICAV8BCmNhbGNSZXdhcmQFC3VzZXJBZGRyZXNzB2Fzc2V0SWQNc3Rha2VkQW1vdW50WA5kZXBvc2l0TnVtVXNlcg5kZXBvc2l0TnVtTGFzdAQXcmV3YXJkUGVyTnNidFN1bUxhc3RLRVkJARVrZXlSZXdhcmRQZXJOc2J0U3VtQXQCBQ5kZXBvc2l0TnVtTGFzdAUHYXNzZXRJZAQKc3VtTGFzdFgxOAkApwMBCQEMZ2V0U3RyT3JFbHNlAgkBFWtleVJld2FyZFBlck5zYnRTdW1BdAIFDmRlcG9zaXROdW1MYXN0BQdhc3NldElkAgEwBApzdW1Vc2VyWDE4CQCnAwEJAQxnZXRTdHJPckVsc2UCCQEVa2V5UmV3YXJkUGVyTnNidFN1bUF0AgUOZGVwb3NpdE51bVVzZXIFB2Fzc2V0SWQCATAEEXJld2FyZER5bmFtaWNQYXJ0CQCgAwEJALwCAwkAuAICBQpzdW1MYXN0WDE4BQpzdW1Vc2VyWDE4BQ1zdGFrZWRBbW91bnRYBQdNVUxUWDE4BBNyZXdhcmRDYWNoZWRQYXJ0S0VZCQEJa2V5UmV3YXJkAgULdXNlckFkZHJlc3MFB2Fzc2V0SWQEEHJld2FyZENhY2hlZFBhcnQJAQxnZXRJbnRPckVsc2UCBRNyZXdhcmRDYWNoZWRQYXJ0S0VZAAAJAJYKBAkAZAIFEHJld2FyZENhY2hlZFBhcnQFEXJld2FyZER5bmFtaWNQYXJ0BRByZXdhcmRDYWNoZWRQYXJ0BRFyZXdhcmREeW5hbWljUGFydAUTcmV3YXJkQ2FjaGVkUGFydEtFWQENUmV3YXJkRW50cmllcwMJaXNOZXdVc2VyC3VzZXJBZGRyZXNzDHN0YWtlZEFtb3VudAQNc3Rha2VkQW1vdW50WAkAtgIBBQxzdGFrZWRBbW91bnQEG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQkBG2tleVVzZXJSZXdhcmRGcm9tRGVwb3NpdE51bQEFC3VzZXJBZGRyZXNzBA5kZXBvc2l0TnVtVXNlcgkBDGdldEludE9yRWxzZQIFG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQD///////////8BBA5kZXBvc2l0TnVtTGFzdAkBDGdldEludE9yRWxzZQIJARFrZXlEZXBvc2l0TnVtTGFzdAAA////////////AQoBG2ZvckVhY2hBc3NldENhY2hlVXNlclJld2FyZAIFYWNjdW0FYXNzZXQECyR0MDg2Mzk4Nzc0CQEKY2FsY1Jld2FyZAUFC3VzZXJBZGRyZXNzBQVhc3NldAUNc3Rha2VkQW1vdW50WAUOZGVwb3NpdE51bVVzZXIFDmRlcG9zaXROdW1MYXN0BAtyZXdhcmRUb3RhbAgFCyR0MDg2Mzk4Nzc0Al8xBAZjYWNoZWQIBQskdDA4NjM5ODc3NAJfMgQHZHluYW1pYwgFCyR0MDg2Mzk4Nzc0Al8zBBNyZXdhcmRDYWNoZWRQYXJ0S0VZCAULJHQwODYzOTg3NzQCXzQJAM0IAgUFYWNjdW0JAQxJbnRlZ2VyRW50cnkCBRNyZXdhcmRDYWNoZWRQYXJ0S0VZBQtyZXdhcmRUb3RhbAMDCQAAAgUOZGVwb3NpdE51bUxhc3QA////////////AQkAAAIFDmRlcG9zaXROdW1Vc2VyAP///////////wEHBQNuaWwDAwkAAAIFDmRlcG9zaXROdW1MYXN0AP///////////wEJAGYCBQ5kZXBvc2l0TnVtVXNlcgD///////////8BBwkAAgECL2ludmFsaWQgZGVwb3NpdE51bUxhc3QgYW5kIGRlcG9zaXROdW1Vc2VyIHN0YXRlAwMJAGYCBQ5kZXBvc2l0TnVtTGFzdAD///////////8BCQBnAgUOZGVwb3NpdE51bVVzZXIA////////////AQcDBQlpc05ld1VzZXIJAMwIAgkBDEludGVnZXJFbnRyeQIFG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQUOZGVwb3NpdE51bUxhc3QFA25pbAkAzQgCCgACJGwFE3N1cHBvcnRlZEFzc2V0c0xpc3QKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBG2ZvckVhY2hBc3NldENhY2hlVXNlclJld2FyZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgkBDEludGVnZXJFbnRyeQIFG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQUOZGVwb3NpdE51bUxhc3QJAAIBCQCsAgIJAKwCAgkArAICAiR1bmNvdmVyZWQgY29uZGl0aW9uOiBkZXBvc2l0TnVtTGFzdD0JAKQDAQUOZGVwb3NpdE51bUxhc3QCECBkZXBvc2l0TnVtVXNlcj0JAKQDAQUOZGVwb3NpdE51bVVzZXIBIkluY3JlbWVudE5vdERpc3RyaWJ1dGVkUmV3YXJkRW50cnkCA3RrbglhbW91bnRJbmMEF25vdERpc3RyaWJ1dGVkUmV3YXJkS0VZCQEXa2V5Tm90RGlzdHJpYnV0ZWRSZXdhcmQBBQN0a24EFG5vdERpc3RyaWJ1dGVkUmV3YXJkCQEMZ2V0SW50T3JFbHNlAgUXbm90RGlzdHJpYnV0ZWRSZXdhcmRLRVkAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgUXbm90RGlzdHJpYnV0ZWRSZXdhcmRLRVkJAGQCBRRub3REaXN0cmlidXRlZFJld2FyZAUJYW1vdW50SW5jBQNuaWwBC3N1cmZUb0duc2J0AQdzdXJmQW10CQBpAgUHc3VyZkFtdACsAgEfbWVyZ2VWb3RpbmdQb3dlckVmZmVjdGl2ZUhlaWdodAQQcXVhcmFudGluZVBlcmlvZBF2cEVmZmVjdGl2ZUhlaWdodAlzdGFrZWRBbXQMc3Rha2VkQW10TkVXBA9yZW1haW5pbmdUb1dhaXQJAGUCBRF2cEVmZmVjdGl2ZUhlaWdodAUGaGVpZ2h0AwkAZwIAAAUPcmVtYWluaW5nVG9XYWl0CQBkAgUGaGVpZ2h0BRBxdWFyYW50aW5lUGVyaW9kBA1hbHJlYWR5V2FpdGVkCQBlAgUQcXVhcmFudGluZVBlcmlvZAUPcmVtYWluaW5nVG9XYWl0BANrWDgDCQECIT0CBQxzdGFrZWRBbXRORVcAAAkAawMFCXN0YWtlZEFtdAUFTVVMVDgFDHN0YWtlZEFtdE5FVwURdnBFZmZlY3RpdmVIZWlnaHQJAGUCCQBkAgUQcXVhcmFudGluZVBlcmlvZAUGaGVpZ2h0CQBrAwUNYWxyZWFkeVdhaXRlZAUDa1g4BQVNVUxUOAEKbWVyZ2VTdGFrZQILdXNlckFkZHJlc3MLYW1vdW50VG9BZGQEDSR0MDEyNDE5MTI1MjkJAQt2YWx1ZU9yRWxzZQIJARNnZXRVc2VyUGFyYW1zT3JVbml0AQULdXNlckFkZHJlc3MJAJUKAwYAAAAABAlpc05ld1VzZXIIBQ0kdDAxMjQxOTEyNTI5Al8xBAxzdGFrZWRBbW91bnQIBQ0kdDAxMjQxOTEyNTI5Al8yBBF2cEVmZmVjdGl2ZUhlaWdodAgFDSR0MDEyNDE5MTI1MjkCXzMED3N0YWtlZEFtb3VudE5FVwMFCWlzTmV3VXNlcgULYW1vdW50VG9BZGQJAGQCBQthbW91bnRUb0FkZAUMc3Rha2VkQW1vdW50BBBxdWFyYW50aW5lUGVyaW9kCQBoAgCgCwAOBBR2cEVmZmVjdGl2ZUhlaWdodE5FVwMFCWlzTmV3VXNlcgkAZAIFEHF1YXJhbnRpbmVQZXJpb2QFBmhlaWdodAkBH21lcmdlVm90aW5nUG93ZXJFZmZlY3RpdmVIZWlnaHQEBRBxdWFyYW50aW5lUGVyaW9kBRF2cEVmZmVjdGl2ZUhlaWdodAUMc3Rha2VkQW1vdW50BQ9zdGFrZWRBbW91bnRORVcJAJcKBQUJaXNOZXdVc2VyBQxzdGFrZWRBbW91bnQFEXZwRWZmZWN0aXZlSGVpZ2h0BQ9zdGFrZWRBbW91bnRORVcFFHZwRWZmZWN0aXZlSGVpZ2h0TkVXAQtjb21tb25TdGFrZQILdXNlckFkZHJlc3MBaQQNJHQwMTMwMTUxMzA2OQkBD2dldFBhcmFtc09yRmFpbAAEDXN0YWtlZEFzc2V0SWQIBQ0kdDAxMzAxNTEzMDY5Al8xBA1taW5Mb2NrQW1vdW50CAUNJHQwMTMwMTUxMzA2OQJfMgMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECFUludmFsaWQgcGF5bWVudHMgc2l6ZQQHcGF5bWVudAkAkQMCCAUBaQhwYXltZW50cwAABAZhbW91bnQIBQdwYXltZW50BmFtb3VudAQTaW52YWxpZEFzc2V0TWVzc2FnZQkArAICCQCsAgICD0ludmFsaWQgYXNzZXQuIAkA2AQBBQ1zdGFrZWRBc3NldElkAgwgaXMgZXhwZWN0ZWQEB2Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAggFB3BheW1lbnQHYXNzZXRJZAUTaW52YWxpZEFzc2V0TWVzc2FnZQMJAQIhPQIFB2Fzc2V0SWQFDXN0YWtlZEFzc2V0SWQJAAIBBRNpbnZhbGlkQXNzZXRNZXNzYWdlBA51c2VyQWRkcmVzc1N0cgkApQgBBQt1c2VyQWRkcmVzcwQKbWVyZ2VkRGF0YQkBCm1lcmdlU3Rha2UCBQt1c2VyQWRkcmVzcwUGYW1vdW50BAlpc05ld1VzZXIIBQptZXJnZWREYXRhAl8xBAxzdGFrZWRBbW91bnQIBQptZXJnZWREYXRhAl8yBBF2cEVmZmVjdGl2ZUhlaWdodAgFCm1lcmdlZERhdGECXzMED3N0YWtlZEFtb3VudE5FVwgFCm1lcmdlZERhdGECXzQEFHZwRWZmZWN0aXZlSGVpZ2h0TkVXCAUKbWVyZ2VkRGF0YQJfNQMJAGYCBQ1taW5Mb2NrQW1vdW50BQ9zdGFrZWRBbW91bnRORVcJAAIBCQCsAgICE01pbiBsb2NrIGFtb3VudCBpcyAJAKQDAQUNbWluTG9ja0Ftb3VudAQNJHQwMTM4NjgxMzk3MAkBC1N0YXRzUmVzdWx0AwUGYW1vdW50AAEDBQlpc05ld1VzZXIAAQAABAxzdGF0c0VudHJpZXMIBQ0kdDAxMzg2ODEzOTcwAl8xBAt0b3RhbFN0YWtlZAgFDSR0MDEzODY4MTM5NzACXzIEDnRvdGFsU3Rha2VkTmV3CAUNJHQwMTM4NjgxMzk3MAJfMwkAzggCCQDOCAIJAM4IAgkAzAgCCQESSGlzdG9yeVJlY29yZEVudHJ5BwIFc3Rha2UFC3VzZXJBZGRyZXNzCAUBaQ10cmFuc2FjdGlvbklkBQxzdGFrZWRBbW91bnQFEXZwRWZmZWN0aXZlSGVpZ2h0BQ9zdGFrZWRBbW91bnRORVcFFHZwRWZmZWN0aXZlSGVpZ2h0TkVXBQNuaWwJAQ1SZXdhcmRFbnRyaWVzAwUJaXNOZXdVc2VyBQ51c2VyQWRkcmVzc1N0cgUMc3Rha2VkQW1vdW50CQEPTG9ja1BhcmFtc0VudHJ5AwULdXNlckFkZHJlc3MFD3N0YWtlZEFtb3VudE5FVwUUdnBFZmZlY3RpdmVIZWlnaHRORVcFDHN0YXRzRW50cmllcwELY29tbW9uQ2xhaW0CC3VzZXJBZGRyZXNzAWkEDnVzZXJBZGRyZXNzU3RyCQClCAEFC3VzZXJBZGRyZXNzAwkAZgIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECGXBheW1lbnRzIGFyZSBub3QgYWNjZXB0ZWQEDSR0MDE0NDQ5MTQ1NTQJAQt2YWx1ZU9yRWxzZQIJARNnZXRVc2VyUGFyYW1zT3JVbml0AQULdXNlckFkZHJlc3MJAJUKAwYAAAAABAlpc05ld1VzZXIIBQ0kdDAxNDQ0OTE0NTU0Al8xBAxzdGFrZWRBbW91bnQIBQ0kdDAxNDQ0OTE0NTU0Al8yBAxzdGFraW5nU3RhcnQIBQ0kdDAxNDQ0OTE0NTU0Al8zBA1zdGFrZWRBbW91bnRYCQC2AgEFDHN0YWtlZEFtb3VudAQbdXNlclJld2FyZEZyb21EZXBvc2l0TnVtS0VZCQEba2V5VXNlclJld2FyZEZyb21EZXBvc2l0TnVtAQUOdXNlckFkZHJlc3NTdHIEDmRlcG9zaXROdW1Vc2VyCQEMZ2V0SW50T3JFbHNlAgUbdXNlclJld2FyZEZyb21EZXBvc2l0TnVtS0VZAP///////////wEEDmRlcG9zaXROdW1MYXN0CQEMZ2V0SW50T3JFbHNlAgkBEWtleURlcG9zaXROdW1MYXN0AAD///////////8BCgEfZm9yRWFjaEFzc2V0Q2FsY1VuY2xhaW1lZFJld2FyZAIFYWNjdW0FYXNzZXQEDSR0MDE0OTI1MTUwNjMJAQpjYWxjUmV3YXJkBQUOdXNlckFkZHJlc3NTdHIFBWFzc2V0BQ1zdGFrZWRBbW91bnRYBQ5kZXBvc2l0TnVtVXNlcgUOZGVwb3NpdE51bUxhc3QEC3Jld2FyZFRvdGFsCAUNJHQwMTQ5MjUxNTA2MwJfMQQGY2FjaGVkCAUNJHQwMTQ5MjUxNTA2MwJfMgQHZHluYW1pYwgFDSR0MDE0OTI1MTUwNjMCXzMEE3Jld2FyZENhY2hlZFBhcnRLRVkIBQ0kdDAxNDkyNTE1MDYzAl80BApjbGFpbWVkS0VZCQEKa2V5Q2xhaW1lZAIFDnVzZXJBZGRyZXNzU3RyBQVhc3NldAQNJHQwMTUxMjMxNTE2MAUFYWNjdW0EBGRhdGEIBQ0kdDAxNTEyMzE1MTYwAl8xBBFjbGFpbWVkQW10QnlBc3NldAgFDSR0MDE1MTIzMTUxNjACXzIEB25ld1BhcnQJALkJAgkAzAgCBQVhc3NldAkAzAgCCQCkAwEFC3Jld2FyZFRvdGFsBQNuaWwCAToEFGNsYWltZWRBbXRCeUFzc2V0TmV3CQC5CQIJAMwIAgURY2xhaW1lZEFtdEJ5QXNzZXQJAMwIAgUHbmV3UGFydAUDbmlsAgFfAwkAZwIAAAULcmV3YXJkVG90YWwJAJQKAgUEZGF0YQUUY2xhaW1lZEFtdEJ5QXNzZXROZXcJAJQKAgkAzQgCCQDNCAIJAM0IAgUEZGF0YQkBDlNjcmlwdFRyYW5zZmVyAwULdXNlckFkZHJlc3MFC3Jld2FyZFRvdGFsCQELdG9Bc3NldFZlY3QBBQVhc3NldAkBDEludGVnZXJFbnRyeQIFCmNsYWltZWRLRVkJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEFCmNsYWltZWRLRVkAAAULcmV3YXJkVG90YWwJAQxJbnRlZ2VyRW50cnkCBRNyZXdhcmRDYWNoZWRQYXJ0S0VZAAAFFGNsYWltZWRBbXRCeUFzc2V0TmV3BA0kdDAxNTYyMDE1NzM0CgACJGwFE3N1cHBvcnRlZEFzc2V0c0xpc3QKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAIACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAR9mb3JFYWNoQXNzZXRDYWxjVW5jbGFpbWVkUmV3YXJkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBAl0cmFuc2ZlcnMIBQ0kdDAxNTYyMDE1NzM0Al8xBBdjbGFpbWVkQW10QnlBc3NldFJlc3VsdAgFDSR0MDE1NjIwMTU3MzQCXzIDCQBnAgAACQCQAwEFCXRyYW5zZmVycwUDbmlsCQDNCAIJAM0IAgUJdHJhbnNmZXJzCQEMSW50ZWdlckVudHJ5AgUbdXNlclJld2FyZEZyb21EZXBvc2l0TnVtS0VZBQ5kZXBvc2l0TnVtTGFzdAkBEUNsYWltSGlzdG9yeUVudHJ5AwULdXNlckFkZHJlc3MIBQFpDXRyYW5zYWN0aW9uSWQJALACAgUXY2xhaW1lZEFtdEJ5QXNzZXRSZXN1bHQAAQoBaQELY29uc3RydWN0b3IDDW1pbkxvY2tBbW91bnQVc3VwcG9ydGVkUmV3YXJkQXNzZXRzDXN0YWtlZEFzc2V0SWQDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEGtleU1pbkxvY2tBbW91bnQABQ1taW5Mb2NrQW1vdW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJARhrZXlTdXBwb3J0ZWRSZXdhcmRBc3NldHMABRVzdXBwb3J0ZWRSZXdhcmRBc3NldHMJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEGtleVN0YWtlZEFzc2V0SWQABQ1zdGFrZWRBc3NldElkBQNuaWwBaQEFc3Rha2UACQELY29tbW9uU3Rha2UCCAUBaQZjYWxsZXIFAWkBaQETc3Rha2VCeU9yaWdpbkNhbGxlcgAJAQtjb21tb25TdGFrZQIIBQFpDG9yaWdpbkNhbGxlcgUBaQFpAQd1bnN0YWtlAQZhbW91bnQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAiN1bnN0YWtlIGRvZXNuJ3QgcmVxdWlyZSBhbnkgcGF5bWVudAQLdXNlckFkZHJlc3MIBQFpBmNhbGxlcgQOdXNlckFkZHJlc3NTdHIJAKUIAQULdXNlckFkZHJlc3MEDSR0MDE2NjQzMTY2OTcJAQ9nZXRQYXJhbXNPckZhaWwABA1zdGFrZWRBc3NldElkCAUNJHQwMTY2NDMxNjY5NwJfMQQNbWluTG9ja0Ftb3VudAgFDSR0MDE2NjQzMTY2OTcCXzIEDSR0MDE2NzAwMTY3ODQJARNnZXRVc2VyUGFyYW1zT3JGYWlsAQULdXNlckFkZHJlc3MECWlzTmV3VXNlcggFDSR0MDE2NzAwMTY3ODQCXzEEDHN0YWtlZEFtb3VudAgFDSR0MDE2NzAwMTY3ODQCXzIEEXZwRWZmZWN0aXZlSGVpZ2h0CAUNJHQwMTY3MDAxNjc4NAJfMwMJAGcCAAAFDHN0YWtlZEFtb3VudAkAAgECEk5vdGhpbmcgdG8gdW5zdGFrZQMJAGYCBQZhbW91bnQFDHN0YWtlZEFtb3VudAkAAgEJAKwCAgkArAICCQCsAgICClJlcXVlc3RlZCAJAKQDAQUGYW1vdW50AhIsIGJ1dCBzdGFrZWQgb25seSAJAKQDAQUMc3Rha2VkQW1vdW50BA9zdGFrZWRBbW91bnRORVcJAGUCBQxzdGFrZWRBbW91bnQFBmFtb3VudAQNJHQwMTcwMjYxNzE4NAkBC1N0YXRzUmVzdWx0AwkBAS0BBQZhbW91bnQDCQAAAgUGYW1vdW50BQxzdGFrZWRBbW91bnQA////////////AQAAAwkAAAIFBmFtb3VudAUMc3Rha2VkQW1vdW50AP///////////wEAAAQMc3RhdHNFbnRyaWVzCAUNJHQwMTcwMjYxNzE4NAJfMQQLdG90YWxTdGFrZWQIBQ0kdDAxNzAyNjE3MTg0Al8yBA50b3RhbFN0YWtlZE5ldwgFDSR0MDE3MDI2MTcxODQCXzMJAM4IAgkAzggCCQDOCAIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwULdXNlckFkZHJlc3MFBmFtb3VudAUNc3Rha2VkQXNzZXRJZAkAzAgCCQESSGlzdG9yeVJlY29yZEVudHJ5BwIHdW5zdGFrZQULdXNlckFkZHJlc3MIBQFpDXRyYW5zYWN0aW9uSWQFDHN0YWtlZEFtb3VudAURdnBFZmZlY3RpdmVIZWlnaHQFD3N0YWtlZEFtb3VudE5FVwURdnBFZmZlY3RpdmVIZWlnaHQFA25pbAkBDVJld2FyZEVudHJpZXMDBwUOdXNlckFkZHJlc3NTdHIFDHN0YWtlZEFtb3VudAkBD0xvY2tQYXJhbXNFbnRyeQMFC3VzZXJBZGRyZXNzBQ9zdGFrZWRBbW91bnRORVcFEXZwRWZmZWN0aXZlSGVpZ2h0BQxzdGF0c0VudHJpZXMBaQEHZGVwb3NpdAADCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAh9leGFjdCAxIHBheW1lbnQgaXMgYWxsb3dlZCBvbmx5BANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQGYW1vdW50CAUDcG10BmFtb3VudAQKcG10QXNzZXRJZAkBC3ZhbHVlT3JFbHNlAggFA3BtdAdhc3NldElkBQdXQVZFU0lEBA1wbXRBc3NldElkU3RyCQDYBAEFCnBtdEFzc2V0SWQECHBtdE11bHRYAwkAAAIFCnBtdEFzc2V0SWQFB1dBVkVTSUQFBk1VTFRYOAUGTVVMVFg2BAdhbW91bnRYCQC2AgEFBmFtb3VudAQLdG90YWxTdGFrZWQJAQxnZXRJbnRPckVsc2UCCQEXa2V5TG9ja1BhcmFtVG90YWxBbW91bnQAAAAEDHRvdGFsU3Rha2VkWAkAtgIBBQt0b3RhbFN0YWtlZAMJAGYCAAAFC3RvdGFsU3Rha2VkCQACAQIbVE9ETzogY2FzZSBpcyBub3Qgc3VwcG9ydGVkAwkAAAIFC3RvdGFsU3Rha2VkAAAJASJJbmNyZW1lbnROb3REaXN0cmlidXRlZFJld2FyZEVudHJ5AgUNcG10QXNzZXRJZFN0cgUGYW1vdW50BBByZXdhcmRQZXJOc2J0WDE4CQC8AgMFB2Ftb3VudFgFB01VTFRYMTgFDHRvdGFsU3Rha2VkWAQRZGVwb3NpdE51bUxhc3RLRVkJARFrZXlEZXBvc2l0TnVtTGFzdAAEDmRlcG9zaXROdW1MYXN0CQEMZ2V0SW50T3JFbHNlAgURZGVwb3NpdE51bUxhc3RLRVkA////////////AQQNZGVwb3NpdE51bU5ldwkAZAIFDmRlcG9zaXROdW1MYXN0AAEDCQEBIQEJAQhjb250YWlucwIFEnN1cHBvcnRlZEFzc2V0c1N0cgUNcG10QXNzZXRJZFN0cgkAAgEJAKwCAgkArAICBRJzdXBwb3J0ZWRBc3NldHNTdHICESBkb2Vzbid0IGNvbnRhaW4gBQ1wbXRBc3NldElkU3RyCgEXcmVmcmVzaFJld2FyZFBlck5zYnRTVU0CBWFjY3VtCW5leHRBc3NldAQWcmV3YXJkUGVyTnNidFN1bU5ld0tFWQkBFWtleVJld2FyZFBlck5zYnRTdW1BdAIFDWRlcG9zaXROdW1OZXcFCW5leHRBc3NldAQKc3VtTGFzdFN0cgkBDGdldFN0ck9yRWxzZQIJARVrZXlSZXdhcmRQZXJOc2J0U3VtQXQCBQ5kZXBvc2l0TnVtTGFzdAUJbmV4dEFzc2V0AgEwCQDNCAIFBWFjY3VtAwkAAAIFCW5leHRBc3NldAUNcG10QXNzZXRJZFN0cgkBC1N0cmluZ0VudHJ5AgUWcmV3YXJkUGVyTnNidFN1bU5ld0tFWQkApgMBCQC3AgIJAKcDAQUKc3VtTGFzdFN0cgUQcmV3YXJkUGVyTnNidFgxOAkBC1N0cmluZ0VudHJ5AgUWcmV3YXJkUGVyTnNidFN1bU5ld0tFWQUKc3VtTGFzdFN0cgkAzQgCCgACJGwFE3N1cHBvcnRlZEFzc2V0c0xpc3QKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBF3JlZnJlc2hSZXdhcmRQZXJOc2J0U1VNAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKCQEMSW50ZWdlckVudHJ5AgURZGVwb3NpdE51bUxhc3RLRVkFDWRlcG9zaXROdW1OZXcBaQEMY2xhaW1SZXdhcmRzAAkBC2NvbW1vbkNsYWltAggFAWkGY2FsbGVyBQFpAWkBGmNsYWltUmV3YXJkc0J5T3JpZ2luQ2FsbGVyAAkBC2NvbW1vbkNsYWltAggFAWkMb3JpZ2luQ2FsbGVyBQFpAWkBGHVuY2xhaW1lZFJld2FyZHNSRUFET05MWQEOdXNlckFkZHJlc3NTdHIKARZmb3JFYWNoQXNzZXRaZXJvUmV3YXJkAgVhY2N1bQVhc3NldAkArAICCQCsAgIFBWFjY3VtCQC5CQIJAMwIAgUFYXNzZXQJAMwIAgIBMAkAzAgCAgEwBQNuaWwCAToCAV8EEnVuY2xhaW1lZFJld2FyZFN0cgMJAAACBQ51c2VyQWRkcmVzc1N0cgIACgACJGwFE3N1cHBvcnRlZEFzc2V0c0xpc3QKAAIkcwkAkAMBBQIkbAoABSRhY2MwAgAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBFmZvckVhY2hBc3NldFplcm9SZXdhcmQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoEC3VzZXJBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBQ51c2VyQWRkcmVzc1N0cgQNJHQwMTk3NTgxOTg2MwkBC3ZhbHVlT3JFbHNlAgkBE2dldFVzZXJQYXJhbXNPclVuaXQBBQt1c2VyQWRkcmVzcwkAlQoDBgAAAAAECWlzTmV3VXNlcggFDSR0MDE5NzU4MTk4NjMCXzEEDHN0YWtlZEFtb3VudAgFDSR0MDE5NzU4MTk4NjMCXzIEDHN0YWtpbmdTdGFydAgFDSR0MDE5NzU4MTk4NjMCXzMEDXN0YWtlZEFtb3VudFgJALYCAQUMc3Rha2VkQW1vdW50BBt1c2VyUmV3YXJkRnJvbURlcG9zaXROdW1LRVkJARtrZXlVc2VyUmV3YXJkRnJvbURlcG9zaXROdW0BBQ51c2VyQWRkcmVzc1N0cgQOZGVwb3NpdE51bVVzZXIJAQxnZXRJbnRPckVsc2UCBRt1c2VyUmV3YXJkRnJvbURlcG9zaXROdW1LRVkA////////////AQQOZGVwb3NpdE51bUxhc3QJAQxnZXRJbnRPckVsc2UCCQERa2V5RGVwb3NpdE51bUxhc3QAAP///////////wEKAR9mb3JFYWNoQXNzZXRDYWxjVW5jbGFpbWVkUmV3YXJkAgVhY2N1bQVhc3NldAQNJHQwMjAyMDkyMDM0NwkBCmNhbGNSZXdhcmQFBQ51c2VyQWRkcmVzc1N0cgUFYXNzZXQFDXN0YWtlZEFtb3VudFgFDmRlcG9zaXROdW1Vc2VyBQ5kZXBvc2l0TnVtTGFzdAQLcmV3YXJkVG90YWwIBQ0kdDAyMDIwOTIwMzQ3Al8xBAZjYWNoZWQIBQ0kdDAyMDIwOTIwMzQ3Al8yBAdkeW5hbWljCAUNJHQwMjAyMDkyMDM0NwJfMwQTcmV3YXJkQ2FjaGVkUGFydEtFWQgFDSR0MDIwMjA5MjAzNDcCXzQEB2NsYWltZWQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBCmtleUNsYWltZWQCBQ51c2VyQWRkcmVzc1N0cgUFYXNzZXQAAAkArAICCQCsAgIFBWFjY3VtCQC5CQIJAMwIAgUFYXNzZXQJAMwIAgkApAMBBQtyZXdhcmRUb3RhbAkAzAgCCQCkAwEFB2NsYWltZWQFA25pbAIBOgIBXwoAAiRsBRNzdXBwb3J0ZWRBc3NldHNMaXN0CgACJHMJAJADAQUCJGwKAAUkYWNjMAIACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAR9mb3JFYWNoQXNzZXRDYWxjVW5jbGFpbWVkUmV3YXJkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKCQCUCgIFA25pbAkAswICBRJ1bmNsYWltZWRSZXdhcmRTdHIAAQFpARZzdXJmU3Rha2luZ1NZU1JFQURPTkxZAhV1c2VyQWRkcmVzc1N0ck9yRW1wdHkIc3VyZkRpZmYECXN1cmZUb3RhbAkBDGdldEludE9yRWxzZQIJARdrZXlMb2NrUGFyYW1Ub3RhbEFtb3VudAAAAAQSZ25zYnRGcm9tU3VyZlRvdGFsCQELc3VyZlRvR25zYnQBBQlzdXJmVG90YWwDCQAAAgUVdXNlckFkZHJlc3NTdHJPckVtcHR5AgAJAJQKAgUDbmlsCQDMCAIAAAkAzAgCBQlzdXJmVG90YWwJAMwIAgAACQDMCAIFEmduc2J0RnJvbVN1cmZUb3RhbAkAzAgCAAAJAMwIAgUGaGVpZ2h0CQDMCAIFBmhlaWdodAUDbmlsBAt1c2VyQWRkcmVzcwkBD3RvQWRkcmVzc09yRmFpbAEFFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQQKbWVyZ2VkRGF0YQkBCm1lcmdlU3Rha2UCBQt1c2VyQWRkcmVzcwUIc3VyZkRpZmYECWlzTmV3VXNlcggFCm1lcmdlZERhdGECXzEEDHN0YWtlZEFtb3VudAgFCm1lcmdlZERhdGECXzIEEXZwRWZmZWN0aXZlSGVpZ2h0CAUKbWVyZ2VkRGF0YQJfMwQPc3Rha2VkQW1vdW50TkVXCAUKbWVyZ2VkRGF0YQJfNAQUdnBFZmZlY3RpdmVIZWlnaHRORVcIBQptZXJnZWREYXRhAl81BAhzdXJmVXNlcgUMc3Rha2VkQW1vdW50BBFnbnNidEZyb21TdXJmVXNlcgkBC3N1cmZUb0duc2J0AQUIc3VyZlVzZXIJAJQKAgUDbmlsCQDMCAIFCHN1cmZVc2VyCQDMCAIFCXN1cmZUb3RhbAkAzAgCBRFnbnNidEZyb21TdXJmVXNlcgkAzAgCBRJnbnNidEZyb21TdXJmVG90YWwJAMwIAgURdnBFZmZlY3RpdmVIZWlnaHQJAMwIAgUUdnBFZmZlY3RpdmVIZWlnaHRORVcFA25pbAFpARFjb25maWdTWVNSRUFET05MWQAECm1pbkxvY2tBbXQJARFAZXh0ck5hdGl2ZSgxMDU1KQEJARBrZXlNaW5Mb2NrQW1vdW50AAQSZ25zYnRGcm9tU3VyZkNvZWZmCQBoAgCsAgUFTVVMVDYEIHN1cmZWb3RpbmdQb3dlclJlc3RyaWN0aXZlUGVyaW9kCQBoAgCgCwAOBBticlRvU3RhcnRTdXJmVHJhbnNmb3JtYXRpb24AsJhGCQCUCgIFA25pbAkAzAgCBQptaW5Mb2NrQW10CQDMCAIFEmduc2J0RnJvbVN1cmZDb2VmZgkAzAgCBSBzdXJmVm90aW5nUG93ZXJSZXN0cmljdGl2ZVBlcmlvZAkAzAgCBRticlRvU3RhcnRTdXJmVHJhbnNmb3JtYXRpb24FA25pbAAhs3qK", "chainId": 84, "height": 2171153, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: BpFBPt4RYhW9VKevUY1B1p2diT7NWx66HPzzCB9PHuKf Next: GFD3midDb5GQmYzmU1e1UhA3DVBCZJiHoRYw2dZaGe6b Diff:
OldNewDifferences
259259 }
260260
261261
262-func surfToGnsbt (surfAmt) = (surfAmt / 60)
262+func surfToGnsbt (surfAmt) = (surfAmt / 300)
263263
264264
265265 func mergeVotingPowerEffectiveHeight (quarantinePeriod,vpEffectiveHeight,stakedAmt,stakedAmtNEW) = {
277277
278278
279279 func mergeStake (userAddress,amountToAdd) = {
280- let $t01241812528 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
281- let isNewUser = $t01241812528._1
282- let stakedAmount = $t01241812528._2
283- let vpEffectiveHeight = $t01241812528._3
280+ let $t01241912529 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
281+ let isNewUser = $t01241912529._1
282+ let stakedAmount = $t01241912529._2
283+ let vpEffectiveHeight = $t01241912529._3
284284 let stakedAmountNEW = if (isNewUser)
285285 then amountToAdd
286286 else (amountToAdd + stakedAmount)
293293
294294
295295 func commonStake (userAddress,i) = {
296- let $t01301413068 = getParamsOrFail()
297- let stakedAssetId = $t01301413068._1
298- let minLockAmount = $t01301413068._2
296+ let $t01301513069 = getParamsOrFail()
297+ let stakedAssetId = $t01301513069._1
298+ let minLockAmount = $t01301513069._2
299299 if ((size(i.payments) != 1))
300300 then throw("Invalid payments size")
301301 else {
316316 if ((minLockAmount > stakedAmountNEW))
317317 then throw(("Min lock amount is " + toString(minLockAmount)))
318318 else {
319- let $t01386713969 = StatsResult(amount, 1, if (isNewUser)
319+ let $t01386813970 = StatsResult(amount, 1, if (isNewUser)
320320 then 1
321321 else 0)
322- let statsEntries = $t01386713969._1
323- let totalStaked = $t01386713969._2
324- let totalStakedNew = $t01386713969._3
322+ let statsEntries = $t01386813970._1
323+ let totalStaked = $t01386813970._2
324+ let totalStakedNew = $t01386813970._3
325325 ((([HistoryRecordEntry("stake", userAddress, i.transactionId, stakedAmount, vpEffectiveHeight, stakedAmountNEW, vpEffectiveHeightNEW)] ++ RewardEntries(isNewUser, userAddressStr, stakedAmount)) ++ LockParamsEntry(userAddress, stakedAmountNEW, vpEffectiveHeightNEW)) ++ statsEntries)
326326 }
327327 }
334334 if ((size(i.payments) > 0))
335335 then throw("payments are not accepted")
336336 else {
337- let $t01444814553 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
338- let isNewUser = $t01444814553._1
339- let stakedAmount = $t01444814553._2
340- let stakingStart = $t01444814553._3
337+ let $t01444914554 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
338+ let isNewUser = $t01444914554._1
339+ let stakedAmount = $t01444914554._2
340+ let stakingStart = $t01444914554._3
341341 let stakedAmountX = toBigInt(stakedAmount)
342342 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
343343 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
344344 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
345345 func forEachAssetCalcUnclaimedReward (accum,asset) = {
346- let $t01492415062 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
347- let rewardTotal = $t01492415062._1
348- let cached = $t01492415062._2
349- let dynamic = $t01492415062._3
350- let rewardCachedPartKEY = $t01492415062._4
346+ let $t01492515063 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
347+ let rewardTotal = $t01492515063._1
348+ let cached = $t01492515063._2
349+ let dynamic = $t01492515063._3
350+ let rewardCachedPartKEY = $t01492515063._4
351351 let claimedKEY = keyClaimed(userAddressStr, asset)
352- let $t01512215159 = accum
353- let data = $t01512215159._1
354- let claimedAmtByAsset = $t01512215159._2
352+ let $t01512315160 = accum
353+ let data = $t01512315160._1
354+ let claimedAmtByAsset = $t01512315160._2
355355 let newPart = makeString([asset, toString(rewardTotal)], ":")
356356 let claimedAmtByAssetNew = makeString([claimedAmtByAsset, newPart], "_")
357357 if ((0 >= rewardTotal))
359359 else $Tuple2((((data :+ ScriptTransfer(userAddress, rewardTotal, toAssetVect(asset))) :+ IntegerEntry(claimedKEY, (valueOrElse(getInteger(claimedKEY), 0) + rewardTotal))) :+ IntegerEntry(rewardCachedPartKEY, 0)), claimedAmtByAssetNew)
360360 }
361361
362- let $t01561915733 = {
362+ let $t01562015734 = {
363363 let $l = supportedAssetsList
364364 let $s = size($l)
365365 let $acc0 = $Tuple2(nil, "")
373373
374374 $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)
375375 }
376- let transfers = $t01561915733._1
377- let claimedAmtByAssetResult = $t01561915733._2
376+ let transfers = $t01562015734._1
377+ let claimedAmtByAssetResult = $t01562015734._2
378378 if ((0 >= size(transfers)))
379379 then nil
380380 else ((transfers :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)) :+ ClaimHistoryEntry(userAddress, i.transactionId, drop(claimedAmtByAssetResult, 1)))
405405 else {
406406 let userAddress = i.caller
407407 let userAddressStr = toString(userAddress)
408- let $t01664216696 = getParamsOrFail()
409- let stakedAssetId = $t01664216696._1
410- let minLockAmount = $t01664216696._2
411- let $t01669916783 = getUserParamsOrFail(userAddress)
412- let isNewUser = $t01669916783._1
413- let stakedAmount = $t01669916783._2
414- let vpEffectiveHeight = $t01669916783._3
408+ let $t01664316697 = getParamsOrFail()
409+ let stakedAssetId = $t01664316697._1
410+ let minLockAmount = $t01664316697._2
411+ let $t01670016784 = getUserParamsOrFail(userAddress)
412+ let isNewUser = $t01670016784._1
413+ let stakedAmount = $t01670016784._2
414+ let vpEffectiveHeight = $t01670016784._3
415415 if ((0 >= stakedAmount))
416416 then throw("Nothing to unstake")
417417 else if ((amount > stakedAmount))
418418 then throw(((("Requested " + toString(amount)) + ", but staked only ") + toString(stakedAmount)))
419419 else {
420420 let stakedAmountNEW = (stakedAmount - amount)
421- let $t01702517183 = StatsResult(-(amount), if ((amount == stakedAmount))
421+ let $t01702617184 = StatsResult(-(amount), if ((amount == stakedAmount))
422422 then -1
423423 else 0, if ((amount == stakedAmount))
424424 then -1
425425 else 0)
426- let statsEntries = $t01702517183._1
427- let totalStaked = $t01702517183._2
428- let totalStakedNew = $t01702517183._3
426+ let statsEntries = $t01702617184._1
427+ let totalStaked = $t01702617184._2
428+ let totalStakedNew = $t01702617184._3
429429 ((([ScriptTransfer(userAddress, amount, stakedAssetId), HistoryRecordEntry("unstake", userAddress, i.transactionId, stakedAmount, vpEffectiveHeight, stakedAmountNEW, vpEffectiveHeight)] ++ RewardEntries(false, userAddressStr, stakedAmount)) ++ LockParamsEntry(userAddress, stakedAmountNEW, vpEffectiveHeight)) ++ statsEntries)
430430 }
431431 }
517517 }
518518 else {
519519 let userAddress = addressFromStringValue(userAddressStr)
520- let $t01975719862 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
521- let isNewUser = $t01975719862._1
522- let stakedAmount = $t01975719862._2
523- let stakingStart = $t01975719862._3
520+ let $t01975819863 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
521+ let isNewUser = $t01975819863._1
522+ let stakedAmount = $t01975819863._2
523+ let stakingStart = $t01975819863._3
524524 let stakedAmountX = toBigInt(stakedAmount)
525525 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
526526 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
527527 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
528528 func forEachAssetCalcUnclaimedReward (accum,asset) = {
529- let $t02020820346 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
530- let rewardTotal = $t02020820346._1
531- let cached = $t02020820346._2
532- let dynamic = $t02020820346._3
533- let rewardCachedPartKEY = $t02020820346._4
529+ let $t02020920347 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
530+ let rewardTotal = $t02020920347._1
531+ let cached = $t02020920347._2
532+ let dynamic = $t02020920347._3
533+ let rewardCachedPartKEY = $t02020920347._4
534534 let claimed = valueOrElse(getInteger(keyClaimed(userAddressStr, asset)), 0)
535535 ((accum + makeString([asset, toString(rewardTotal), toString(claimed)], ":")) + "_")
536536 }
578578 @Callable(i)
579579 func configSYSREADONLY () = {
580580 let minLockAmt = getIntegerValue(keyMinLockAmount())
581- let gnsbtFromSurfCoeff = (60 * MULT6)
581+ let gnsbtFromSurfCoeff = (300 * MULT6)
582582 let surfVotingPowerRestrictivePeriod = (1440 * 14)
583583 let brToStartSurfTransformation = 1150000
584584 $Tuple2(nil, [minLockAmt, gnsbtFromSurfCoeff, surfVotingPowerRestrictivePeriod, brToStartSurfTransformation])
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 keyLockParamVotingPowerEffectiveHeight (userAddress) = makeString(["%s%s%s", "paramByUser", toString(userAddress), "vpEffectiveHeight"], separator)
8888
8989
9090 func keyHistoryRecord (type,userAddress,txId) = makeString(["%s%s%s%s", "history", type, toString(userAddress), toBase58String(txId)], separator)
9191
9292
9393 func keyLockParamTotalAmount () = makeString(["%s%s", "stats", "activeTotalLocked"], separator)
9494
9595
9696 func keyStatsLocksCount () = makeString(["%s%s", "stats", "locksCount"], separator)
9797
9898
9999 func keyStatsUsersCount () = makeString(["%s%s", "stats", "activeUsersCount"], separator)
100100
101101
102102 func keyNextPeriod () = "%s__nextPeriod"
103103
104104
105105 func keySupportedRewardAssets () = "supportedRewardAssets"
106106
107107
108108 func keyDepositNumLast () = makeString(["%s%s%s", "dep", "lastNum"], separator)
109109
110110
111111 func keyUserRewardFromDepositNum (userAddress) = makeString(["%s%s%s", "userRwdFromDepNum", userAddress], separator)
112112
113113
114114 func keyRewardPerNsbtSumAt (depositNum,tkn) = makeString(["%s%d", "rwdPerNsbtSumByDepNum", toString(depositNum), tkn], separator)
115115
116116
117117 func keyReward (userAddress,tkn) = makeString(["%s%s%s", "rwd", userAddress, tkn], separator)
118118
119119
120120 func keyClaimed (userAddress,tkn) = makeString(["%s%s%s", "clm", userAddress, tkn], separator)
121121
122122
123123 func keyNotDistributedReward (tkn) = makeString(["%s%s", "notDistributed", tkn], separator)
124124
125125
126126 func toX18 (origVal,origMult) = fraction(toBigInt(origVal), MULTX18, origMult)
127127
128128
129129 func getIntOrZero (key) = valueOrElse(getInteger(this, key), 0)
130130
131131
132132 func getIntOrElse (key,defaultVal) = valueOrElse(getInteger(this, key), defaultVal)
133133
134134
135135 func getIntOrFail (key) = valueOrErrorMessage(getInteger(this, key), (("Mandatory this." + key) + " is not defined"))
136136
137137
138138 func getStrOrElse (key,defaultVal) = valueOrElse(getString(this, key), defaultVal)
139139
140140
141141 func toAddressOrFail (addressStr) = valueOrErrorMessage(addressFromString(addressStr), ("couldn't parse passed addressStr=" + addressStr))
142142
143143
144144 func toAssetVect (assetStr) = if ((assetStr == WAVESIDSTR))
145145 then unit
146146 else fromBase58String(assetStr)
147147
148148
149149 func asInt (val) = match val {
150150 case valInt: Int =>
151151 valInt
152152 case _ =>
153153 throw("fail to cast into Int")
154154 }
155155
156156
157157 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)
158158
159159
160160 func formatClaimHistoryRecord (user,claimedRewards) = makeString(["%s%d%d%s", user, toString(lastBlock.height), toString(lastBlock.timestamp), claimedRewards], separator)
161161
162162
163163 func HistoryRecordEntry (type,userAddress,txId,oldAmount,oldStart,newAmount,newStart) = StringEntry(keyHistoryRecord(type, userAddress, txId), formatHistoryRecord(oldAmount, oldStart, newAmount, newStart))
164164
165165
166166 func ClaimHistoryEntry (userAddress,txId,claimedRewards) = StringEntry(keyHistoryRecord("claim", userAddress, txId), formatClaimHistoryRecord(toString(userAddress), claimedRewards))
167167
168168
169169 func StatsResult (totalLockedInc,lockCountInc,usersCountInc) = {
170170 let locksCount = getIntOrZero(keyStatsLocksCount())
171171 let usersCount = getIntOrZero(keyStatsUsersCount())
172172 let totalAmount = getIntOrZero(keyLockParamTotalAmount())
173173 let totalAmountNew = (totalAmount + totalLockedInc)
174174 $Tuple3([IntegerEntry(keyStatsLocksCount(), (locksCount + lockCountInc)), IntegerEntry(keyStatsUsersCount(), (usersCount + usersCountInc)), IntegerEntry(keyLockParamTotalAmount(), totalAmountNew)], totalAmount, totalAmountNew)
175175 }
176176
177177
178178 func LockParamsEntry (userAddress,amount,votingPowerEffectiveHeight) = [IntegerEntry(keyLockParamUserAmount(userAddress), amount), IntegerEntry(keyLockParamStartBlock(userAddress), votingPowerEffectiveHeight)]
179179
180180
181181 func getParamsOrFail () = $Tuple2(fromBase58String(getStringOrFail(this, keyStakedAssetId())), getIntOrFail(keyMinLockAmount()))
182182
183183
184184 func isActiveUser (userAddress) = (getIntOrElse(keyLockParamUserAmount(userAddress), 0) > 0)
185185
186186
187187 func getUserParamsOrUnit (userAddress) = if (isActiveUser(userAddress))
188188 then $Tuple3(false, getIntOrFail(keyLockParamUserAmount(userAddress)), getIntOrFail(keyLockParamStartBlock(userAddress)))
189189 else unit
190190
191191
192192 func getUserParamsOrFail (userAddress) = valueOrErrorMessage(getUserParamsOrUnit(userAddress), (("User " + toString(userAddress)) + " is not defined"))
193193
194194
195195 let supportedAssetsStr = getStrOrElse(keySupportedRewardAssets(), "")
196196
197197 let supportedAssetsList = split(supportedAssetsStr, "_")
198198
199199 func calcReward (userAddress,assetId,stakedAmountX,depositNumUser,depositNumLast) = {
200200 let rewardPerNsbtSumLastKEY = keyRewardPerNsbtSumAt(depositNumLast, assetId)
201201 let sumLastX18 = parseBigIntValue(getStrOrElse(keyRewardPerNsbtSumAt(depositNumLast, assetId), "0"))
202202 let sumUserX18 = parseBigIntValue(getStrOrElse(keyRewardPerNsbtSumAt(depositNumUser, assetId), "0"))
203203 let rewardDynamicPart = toInt(fraction((sumLastX18 - sumUserX18), stakedAmountX, MULTX18))
204204 let rewardCachedPartKEY = keyReward(userAddress, assetId)
205205 let rewardCachedPart = getIntOrElse(rewardCachedPartKEY, 0)
206206 $Tuple4((rewardCachedPart + rewardDynamicPart), rewardCachedPart, rewardDynamicPart, rewardCachedPartKEY)
207207 }
208208
209209
210210 func RewardEntries (isNewUser,userAddress,stakedAmount) = {
211211 let stakedAmountX = toBigInt(stakedAmount)
212212 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddress)
213213 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
214214 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
215215 func forEachAssetCacheUserReward (accum,asset) = {
216216 let $t086398774 = calcReward(userAddress, asset, stakedAmountX, depositNumUser, depositNumLast)
217217 let rewardTotal = $t086398774._1
218218 let cached = $t086398774._2
219219 let dynamic = $t086398774._3
220220 let rewardCachedPartKEY = $t086398774._4
221221 (accum :+ IntegerEntry(rewardCachedPartKEY, rewardTotal))
222222 }
223223
224224 if (if ((depositNumLast == -1))
225225 then (depositNumUser == -1)
226226 else false)
227227 then nil
228228 else if (if ((depositNumLast == -1))
229229 then (depositNumUser > -1)
230230 else false)
231231 then throw("invalid depositNumLast and depositNumUser state")
232232 else if (if ((depositNumLast > -1))
233233 then (depositNumUser >= -1)
234234 else false)
235235 then if (isNewUser)
236236 then [IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)]
237237 else ({
238238 let $l = supportedAssetsList
239239 let $s = size($l)
240240 let $acc0 = nil
241241 func $f0_1 ($a,$i) = if (($i >= $s))
242242 then $a
243243 else forEachAssetCacheUserReward($a, $l[$i])
244244
245245 func $f0_2 ($a,$i) = if (($i >= $s))
246246 then $a
247247 else throw("List size exceeds 10")
248248
249249 $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)
250250 } :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast))
251251 else throw(((("uncovered condition: depositNumLast=" + toString(depositNumLast)) + " depositNumUser=") + toString(depositNumUser)))
252252 }
253253
254254
255255 func IncrementNotDistributedRewardEntry (tkn,amountInc) = {
256256 let notDistributedRewardKEY = keyNotDistributedReward(tkn)
257257 let notDistributedReward = getIntOrElse(notDistributedRewardKEY, 0)
258258 [IntegerEntry(notDistributedRewardKEY, (notDistributedReward + amountInc))]
259259 }
260260
261261
262-func surfToGnsbt (surfAmt) = (surfAmt / 60)
262+func surfToGnsbt (surfAmt) = (surfAmt / 300)
263263
264264
265265 func mergeVotingPowerEffectiveHeight (quarantinePeriod,vpEffectiveHeight,stakedAmt,stakedAmtNEW) = {
266266 let remainingToWait = (vpEffectiveHeight - height)
267267 if ((0 >= remainingToWait))
268268 then (height + quarantinePeriod)
269269 else {
270270 let alreadyWaited = (quarantinePeriod - remainingToWait)
271271 let kX8 = if ((stakedAmtNEW != 0))
272272 then fraction(stakedAmt, MULT8, stakedAmtNEW)
273273 else vpEffectiveHeight
274274 ((quarantinePeriod + height) - fraction(alreadyWaited, kX8, MULT8))
275275 }
276276 }
277277
278278
279279 func mergeStake (userAddress,amountToAdd) = {
280- let $t01241812528 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
281- let isNewUser = $t01241812528._1
282- let stakedAmount = $t01241812528._2
283- let vpEffectiveHeight = $t01241812528._3
280+ let $t01241912529 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
281+ let isNewUser = $t01241912529._1
282+ let stakedAmount = $t01241912529._2
283+ let vpEffectiveHeight = $t01241912529._3
284284 let stakedAmountNEW = if (isNewUser)
285285 then amountToAdd
286286 else (amountToAdd + stakedAmount)
287287 let quarantinePeriod = (1440 * 14)
288288 let vpEffectiveHeightNEW = if (isNewUser)
289289 then (quarantinePeriod + height)
290290 else mergeVotingPowerEffectiveHeight(quarantinePeriod, vpEffectiveHeight, stakedAmount, stakedAmountNEW)
291291 $Tuple5(isNewUser, stakedAmount, vpEffectiveHeight, stakedAmountNEW, vpEffectiveHeightNEW)
292292 }
293293
294294
295295 func commonStake (userAddress,i) = {
296- let $t01301413068 = getParamsOrFail()
297- let stakedAssetId = $t01301413068._1
298- let minLockAmount = $t01301413068._2
296+ let $t01301513069 = getParamsOrFail()
297+ let stakedAssetId = $t01301513069._1
298+ let minLockAmount = $t01301513069._2
299299 if ((size(i.payments) != 1))
300300 then throw("Invalid payments size")
301301 else {
302302 let payment = i.payments[0]
303303 let amount = payment.amount
304304 let invalidAssetMessage = (("Invalid asset. " + toBase58String(stakedAssetId)) + " is expected")
305305 let assetId = valueOrErrorMessage(payment.assetId, invalidAssetMessage)
306306 if ((assetId != stakedAssetId))
307307 then throw(invalidAssetMessage)
308308 else {
309309 let userAddressStr = toString(userAddress)
310310 let mergedData = mergeStake(userAddress, amount)
311311 let isNewUser = mergedData._1
312312 let stakedAmount = mergedData._2
313313 let vpEffectiveHeight = mergedData._3
314314 let stakedAmountNEW = mergedData._4
315315 let vpEffectiveHeightNEW = mergedData._5
316316 if ((minLockAmount > stakedAmountNEW))
317317 then throw(("Min lock amount is " + toString(minLockAmount)))
318318 else {
319- let $t01386713969 = StatsResult(amount, 1, if (isNewUser)
319+ let $t01386813970 = StatsResult(amount, 1, if (isNewUser)
320320 then 1
321321 else 0)
322- let statsEntries = $t01386713969._1
323- let totalStaked = $t01386713969._2
324- let totalStakedNew = $t01386713969._3
322+ let statsEntries = $t01386813970._1
323+ let totalStaked = $t01386813970._2
324+ let totalStakedNew = $t01386813970._3
325325 ((([HistoryRecordEntry("stake", userAddress, i.transactionId, stakedAmount, vpEffectiveHeight, stakedAmountNEW, vpEffectiveHeightNEW)] ++ RewardEntries(isNewUser, userAddressStr, stakedAmount)) ++ LockParamsEntry(userAddress, stakedAmountNEW, vpEffectiveHeightNEW)) ++ statsEntries)
326326 }
327327 }
328328 }
329329 }
330330
331331
332332 func commonClaim (userAddress,i) = {
333333 let userAddressStr = toString(userAddress)
334334 if ((size(i.payments) > 0))
335335 then throw("payments are not accepted")
336336 else {
337- let $t01444814553 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
338- let isNewUser = $t01444814553._1
339- let stakedAmount = $t01444814553._2
340- let stakingStart = $t01444814553._3
337+ let $t01444914554 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
338+ let isNewUser = $t01444914554._1
339+ let stakedAmount = $t01444914554._2
340+ let stakingStart = $t01444914554._3
341341 let stakedAmountX = toBigInt(stakedAmount)
342342 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
343343 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
344344 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
345345 func forEachAssetCalcUnclaimedReward (accum,asset) = {
346- let $t01492415062 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
347- let rewardTotal = $t01492415062._1
348- let cached = $t01492415062._2
349- let dynamic = $t01492415062._3
350- let rewardCachedPartKEY = $t01492415062._4
346+ let $t01492515063 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
347+ let rewardTotal = $t01492515063._1
348+ let cached = $t01492515063._2
349+ let dynamic = $t01492515063._3
350+ let rewardCachedPartKEY = $t01492515063._4
351351 let claimedKEY = keyClaimed(userAddressStr, asset)
352- let $t01512215159 = accum
353- let data = $t01512215159._1
354- let claimedAmtByAsset = $t01512215159._2
352+ let $t01512315160 = accum
353+ let data = $t01512315160._1
354+ let claimedAmtByAsset = $t01512315160._2
355355 let newPart = makeString([asset, toString(rewardTotal)], ":")
356356 let claimedAmtByAssetNew = makeString([claimedAmtByAsset, newPart], "_")
357357 if ((0 >= rewardTotal))
358358 then $Tuple2(data, claimedAmtByAssetNew)
359359 else $Tuple2((((data :+ ScriptTransfer(userAddress, rewardTotal, toAssetVect(asset))) :+ IntegerEntry(claimedKEY, (valueOrElse(getInteger(claimedKEY), 0) + rewardTotal))) :+ IntegerEntry(rewardCachedPartKEY, 0)), claimedAmtByAssetNew)
360360 }
361361
362- let $t01561915733 = {
362+ let $t01562015734 = {
363363 let $l = supportedAssetsList
364364 let $s = size($l)
365365 let $acc0 = $Tuple2(nil, "")
366366 func $f0_1 ($a,$i) = if (($i >= $s))
367367 then $a
368368 else forEachAssetCalcUnclaimedReward($a, $l[$i])
369369
370370 func $f0_2 ($a,$i) = if (($i >= $s))
371371 then $a
372372 else throw("List size exceeds 10")
373373
374374 $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)
375375 }
376- let transfers = $t01561915733._1
377- let claimedAmtByAssetResult = $t01561915733._2
376+ let transfers = $t01562015734._1
377+ let claimedAmtByAssetResult = $t01562015734._2
378378 if ((0 >= size(transfers)))
379379 then nil
380380 else ((transfers :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)) :+ ClaimHistoryEntry(userAddress, i.transactionId, drop(claimedAmtByAssetResult, 1)))
381381 }
382382 }
383383
384384
385385 @Callable(i)
386386 func constructor (minLockAmount,supportedRewardAssets,stakedAssetId) = if ((i.caller != this))
387387 then throw("Permission denied")
388388 else [IntegerEntry(keyMinLockAmount(), minLockAmount), StringEntry(keySupportedRewardAssets(), supportedRewardAssets), StringEntry(keyStakedAssetId(), stakedAssetId)]
389389
390390
391391
392392 @Callable(i)
393393 func stake () = commonStake(i.caller, i)
394394
395395
396396
397397 @Callable(i)
398398 func stakeByOriginCaller () = commonStake(i.originCaller, i)
399399
400400
401401
402402 @Callable(i)
403403 func unstake (amount) = if ((size(i.payments) != 0))
404404 then throw("unstake doesn't require any payment")
405405 else {
406406 let userAddress = i.caller
407407 let userAddressStr = toString(userAddress)
408- let $t01664216696 = getParamsOrFail()
409- let stakedAssetId = $t01664216696._1
410- let minLockAmount = $t01664216696._2
411- let $t01669916783 = getUserParamsOrFail(userAddress)
412- let isNewUser = $t01669916783._1
413- let stakedAmount = $t01669916783._2
414- let vpEffectiveHeight = $t01669916783._3
408+ let $t01664316697 = getParamsOrFail()
409+ let stakedAssetId = $t01664316697._1
410+ let minLockAmount = $t01664316697._2
411+ let $t01670016784 = getUserParamsOrFail(userAddress)
412+ let isNewUser = $t01670016784._1
413+ let stakedAmount = $t01670016784._2
414+ let vpEffectiveHeight = $t01670016784._3
415415 if ((0 >= stakedAmount))
416416 then throw("Nothing to unstake")
417417 else if ((amount > stakedAmount))
418418 then throw(((("Requested " + toString(amount)) + ", but staked only ") + toString(stakedAmount)))
419419 else {
420420 let stakedAmountNEW = (stakedAmount - amount)
421- let $t01702517183 = StatsResult(-(amount), if ((amount == stakedAmount))
421+ let $t01702617184 = StatsResult(-(amount), if ((amount == stakedAmount))
422422 then -1
423423 else 0, if ((amount == stakedAmount))
424424 then -1
425425 else 0)
426- let statsEntries = $t01702517183._1
427- let totalStaked = $t01702517183._2
428- let totalStakedNew = $t01702517183._3
426+ let statsEntries = $t01702617184._1
427+ let totalStaked = $t01702617184._2
428+ let totalStakedNew = $t01702617184._3
429429 ((([ScriptTransfer(userAddress, amount, stakedAssetId), HistoryRecordEntry("unstake", userAddress, i.transactionId, stakedAmount, vpEffectiveHeight, stakedAmountNEW, vpEffectiveHeight)] ++ RewardEntries(false, userAddressStr, stakedAmount)) ++ LockParamsEntry(userAddress, stakedAmountNEW, vpEffectiveHeight)) ++ statsEntries)
430430 }
431431 }
432432
433433
434434
435435 @Callable(i)
436436 func deposit () = if ((size(i.payments) != 1))
437437 then throw("exact 1 payment is allowed only")
438438 else {
439439 let pmt = i.payments[0]
440440 let amount = pmt.amount
441441 let pmtAssetId = valueOrElse(pmt.assetId, WAVESID)
442442 let pmtAssetIdStr = toBase58String(pmtAssetId)
443443 let pmtMultX = if ((pmtAssetId == WAVESID))
444444 then MULTX8
445445 else MULTX6
446446 let amountX = toBigInt(amount)
447447 let totalStaked = getIntOrElse(keyLockParamTotalAmount(), 0)
448448 let totalStakedX = toBigInt(totalStaked)
449449 if ((0 > totalStaked))
450450 then throw("TODO: case is not supported")
451451 else if ((totalStaked == 0))
452452 then IncrementNotDistributedRewardEntry(pmtAssetIdStr, amount)
453453 else {
454454 let rewardPerNsbtX18 = fraction(amountX, MULTX18, totalStakedX)
455455 let depositNumLastKEY = keyDepositNumLast()
456456 let depositNumLast = getIntOrElse(depositNumLastKEY, -1)
457457 let depositNumNew = (depositNumLast + 1)
458458 if (!(contains(supportedAssetsStr, pmtAssetIdStr)))
459459 then throw(((supportedAssetsStr + " doesn't contain ") + pmtAssetIdStr))
460460 else {
461461 func refreshRewardPerNsbtSUM (accum,nextAsset) = {
462462 let rewardPerNsbtSumNewKEY = keyRewardPerNsbtSumAt(depositNumNew, nextAsset)
463463 let sumLastStr = getStrOrElse(keyRewardPerNsbtSumAt(depositNumLast, nextAsset), "0")
464464 (accum :+ (if ((nextAsset == pmtAssetIdStr))
465465 then StringEntry(rewardPerNsbtSumNewKEY, toString((parseBigIntValue(sumLastStr) + rewardPerNsbtX18)))
466466 else StringEntry(rewardPerNsbtSumNewKEY, sumLastStr)))
467467 }
468468
469469 ({
470470 let $l = supportedAssetsList
471471 let $s = size($l)
472472 let $acc0 = nil
473473 func $f0_1 ($a,$i) = if (($i >= $s))
474474 then $a
475475 else refreshRewardPerNsbtSUM($a, $l[$i])
476476
477477 func $f0_2 ($a,$i) = if (($i >= $s))
478478 then $a
479479 else throw("List size exceeds 10")
480480
481481 $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)
482482 } :+ IntegerEntry(depositNumLastKEY, depositNumNew))
483483 }
484484 }
485485 }
486486
487487
488488
489489 @Callable(i)
490490 func claimRewards () = commonClaim(i.caller, i)
491491
492492
493493
494494 @Callable(i)
495495 func claimRewardsByOriginCaller () = commonClaim(i.originCaller, i)
496496
497497
498498
499499 @Callable(i)
500500 func unclaimedRewardsREADONLY (userAddressStr) = {
501501 func forEachAssetZeroReward (accum,asset) = ((accum + makeString([asset, "0", "0"], ":")) + "_")
502502
503503 let unclaimedRewardStr = if ((userAddressStr == ""))
504504 then {
505505 let $l = supportedAssetsList
506506 let $s = size($l)
507507 let $acc0 = ""
508508 func $f0_1 ($a,$i) = if (($i >= $s))
509509 then $a
510510 else forEachAssetZeroReward($a, $l[$i])
511511
512512 func $f0_2 ($a,$i) = if (($i >= $s))
513513 then $a
514514 else throw("List size exceeds 10")
515515
516516 $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)
517517 }
518518 else {
519519 let userAddress = addressFromStringValue(userAddressStr)
520- let $t01975719862 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
521- let isNewUser = $t01975719862._1
522- let stakedAmount = $t01975719862._2
523- let stakingStart = $t01975719862._3
520+ let $t01975819863 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
521+ let isNewUser = $t01975819863._1
522+ let stakedAmount = $t01975819863._2
523+ let stakingStart = $t01975819863._3
524524 let stakedAmountX = toBigInt(stakedAmount)
525525 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
526526 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
527527 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
528528 func forEachAssetCalcUnclaimedReward (accum,asset) = {
529- let $t02020820346 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
530- let rewardTotal = $t02020820346._1
531- let cached = $t02020820346._2
532- let dynamic = $t02020820346._3
533- let rewardCachedPartKEY = $t02020820346._4
529+ let $t02020920347 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
530+ let rewardTotal = $t02020920347._1
531+ let cached = $t02020920347._2
532+ let dynamic = $t02020920347._3
533+ let rewardCachedPartKEY = $t02020920347._4
534534 let claimed = valueOrElse(getInteger(keyClaimed(userAddressStr, asset)), 0)
535535 ((accum + makeString([asset, toString(rewardTotal), toString(claimed)], ":")) + "_")
536536 }
537537
538538 let $l = supportedAssetsList
539539 let $s = size($l)
540540 let $acc0 = ""
541541 func $f0_1 ($a,$i) = if (($i >= $s))
542542 then $a
543543 else forEachAssetCalcUnclaimedReward($a, $l[$i])
544544
545545 func $f0_2 ($a,$i) = if (($i >= $s))
546546 then $a
547547 else throw("List size exceeds 10")
548548
549549 $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)
550550 }
551551 $Tuple2(nil, dropRight(unclaimedRewardStr, 1))
552552 }
553553
554554
555555
556556 @Callable(i)
557557 func surfStakingSYSREADONLY (userAddressStrOrEmpty,surfDiff) = {
558558 let surfTotal = getIntOrElse(keyLockParamTotalAmount(), 0)
559559 let gnsbtFromSurfTotal = surfToGnsbt(surfTotal)
560560 if ((userAddressStrOrEmpty == ""))
561561 then $Tuple2(nil, [0, surfTotal, 0, gnsbtFromSurfTotal, 0, height, height])
562562 else {
563563 let userAddress = toAddressOrFail(userAddressStrOrEmpty)
564564 let mergedData = mergeStake(userAddress, surfDiff)
565565 let isNewUser = mergedData._1
566566 let stakedAmount = mergedData._2
567567 let vpEffectiveHeight = mergedData._3
568568 let stakedAmountNEW = mergedData._4
569569 let vpEffectiveHeightNEW = mergedData._5
570570 let surfUser = stakedAmount
571571 let gnsbtFromSurfUser = surfToGnsbt(surfUser)
572572 $Tuple2(nil, [surfUser, surfTotal, gnsbtFromSurfUser, gnsbtFromSurfTotal, vpEffectiveHeight, vpEffectiveHeightNEW])
573573 }
574574 }
575575
576576
577577
578578 @Callable(i)
579579 func configSYSREADONLY () = {
580580 let minLockAmt = getIntegerValue(keyMinLockAmount())
581- let gnsbtFromSurfCoeff = (60 * MULT6)
581+ let gnsbtFromSurfCoeff = (300 * MULT6)
582582 let surfVotingPowerRestrictivePeriod = (1440 * 14)
583583 let brToStartSurfTransformation = 1150000
584584 $Tuple2(nil, [minLockAmt, gnsbtFromSurfCoeff, surfVotingPowerRestrictivePeriod, brToStartSurfTransformation])
585585 }
586586
587587

github/deemru/w8io/873ac7e 
150.05 ms