tx · BpFBPt4RYhW9VKevUY1B1p2diT7NWx66HPzzCB9PHuKf

3N5yarEiTQccnnuerogYT3BxM5Zc5bRgDZy:  -0.04000000 Waves

2022.08.05 08:27 [2170757] smart account 3N5yarEiTQccnnuerogYT3BxM5Zc5bRgDZy > SELF 0.00000000 Waves

{ "type": 13, "id": "BpFBPt4RYhW9VKevUY1B1p2diT7NWx66HPzzCB9PHuKf", "fee": 4000000, "feeAssetId": null, "timestamp": 1659677273351, "version": 1, "sender": "3N5yarEiTQccnnuerogYT3BxM5Zc5bRgDZy", "senderPublicKey": "FK9j3YFWVChXKESTn33fMZz1JseCNMMqHhfB7smxJo4e", "proofs": [ "5sUx3pjkzxuCwt9ZNvnt7kCGoWyu1adLkespn8k8ho3XJTip7b4NkZkbXgtvprmP5rNeRcJ6fxczCh79JHjEfRp8" ], "script": "base64:BgIlCAISBQoDAQgIEgASABIDCgEBEgASABIAEgMKAQgSBAoCCAESAE0ACXNlcGFyYXRvcgICX18AA1NFUAICX18ABU1VTFQ2AMCEPQAFTVVMVDgAgMLXLwAGTVVMVFg2CQC2AgEFBU1VTFQ2AAZNVUxUWDgJALYCAQUFTVVMVDgAB01VTFRYMTgJALYCAQCAgJC7utat8A0ACldBVkVTSURTVFICBVdBVkVTAAdXQVZFU0lECQDZBAEFCldBVkVTSURTVFIAGUlkeENvbnRyb2xDZmdOZXV0cmlub0RhcHAAAQAYSWR4Q29udHJvbENmZ0F1Y3Rpb25EYXBwAAIAFElkeENvbnRyb2xDZmdScGREYXBwAAMAFUlkeENvbnRyb2xDZmdNYXRoRGFwcAAEABxJZHhDb250cm9sQ2ZnTGlxdWlkYXRpb25EYXBwAAUAFUlkeENvbnRyb2xDZmdSZXN0RGFwcAAGAB1JZHhDb250cm9sQ2ZnTm9kZVJlZ2lzdHJ5RGFwcAAHABxJZHhDb250cm9sQ2ZnTnNidFN0YWtpbmdEYXBwAAgAGUlkeENvbnRyb2xDZmdNZWRpYXRvckRhcHAACQAcSWR4Q29udHJvbENmZ1N1cmZTdGFraW5nRGFwcAAKACBJZHhDb250cm9sQ2ZnR25zYnRDb250cm9sbGVyRGFwcAALAQ9nZXRTdHJpbmdPckZhaWwCB2FkZHJlc3MDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUHYWRkcmVzcwUDa2V5CQCsAgIJAKwCAgkArAICCQCsAgICCm1hbmRhdG9yeSAJAKUIAQUHYWRkcmVzcwIBLgUDa2V5Ag8gaXMgbm90IGRlZmluZWQBEWtleUNvbnRyb2xBZGRyZXNzAAIcJXMlc19fY29uZmlnX19jb250cm9sQWRkcmVzcwENa2V5Q29udHJvbENmZwACESVzX19jb250cm9sQ29uZmlnARRyZWFkQ29udHJvbENmZ09yRmFpbAEHY29udHJvbAkAtQkCCQEPZ2V0U3RyaW5nT3JGYWlsAgUHY29udHJvbAkBDWtleUNvbnRyb2xDZmcABQNTRVABGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIKY29udHJvbENmZwNpZHgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFCmNvbnRyb2xDZmcFA2lkeAkArAICAi1Db250cm9sIGNmZyBkb2Vzbid0IGNvbnRhaW4gYWRkcmVzcyBhdCBpbmRleCAJAKQDAQUDaWR4AA9jb250cm9sQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBEWtleUNvbnRyb2xBZGRyZXNzAAIjM040TlM3ZDRKbzlhNkYxNExpRlVLS1lWZFVra2YyZVA0WngACmNvbnRyb2xDZmcJARRyZWFkQ29udHJvbENmZ09yRmFpbAEFD2NvbnRyb2xDb250cmFjdAAMbWF0aENvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUKY29udHJvbENmZwUVSWR4Q29udHJvbENmZ01hdGhEYXBwABBuZXV0cmlub0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUKY29udHJvbENmZwUZSWR4Q29udHJvbENmZ05ldXRyaW5vRGFwcAAPYXVjdGlvbkNvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUKY29udHJvbENmZwUYSWR4Q29udHJvbENmZ0F1Y3Rpb25EYXBwAQxrZXlCb25kQXNzZXQAAg1ib25kX2Fzc2V0X2lkARlrZXlBdWN0aW9uQ29udHJhY3RBZGRyZXNzAAIQYXVjdGlvbl9jb250cmFjdAEQa2V5TWluTG9ja0Ftb3VudAACESVzX19taW5Mb2NrQW1vdW50ARBrZXlTdGFrZWRBc3NldElkAAIRJXNfX3N0YWtlZEFzc2V0SWQBFmtleUxvY2tQYXJhbVVzZXJBbW91bnQBC3VzZXJBZGRyZXNzCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICC3BhcmFtQnlVc2VyCQDMCAIJAKUIAQULdXNlckFkZHJlc3MJAMwIAgIGYW1vdW50BQNuaWwFCXNlcGFyYXRvcgEWa2V5TG9ja1BhcmFtU3RhcnRCbG9jawELdXNlckFkZHJlc3MJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgILcGFyYW1CeVVzZXIJAMwIAgkApQgBBQt1c2VyQWRkcmVzcwkAzAgCAgVzdGFydAUDbmlsBQlzZXBhcmF0b3IBJmtleUxvY2tQYXJhbVZvdGluZ1Bvd2VyRWZmZWN0aXZlSGVpZ2h0AQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgtwYXJhbUJ5VXNlcgkAzAgCCQClCAEFC3VzZXJBZGRyZXNzCQDMCAICEXZwRWZmZWN0aXZlSGVpZ2h0BQNuaWwFCXNlcGFyYXRvcgEQa2V5SGlzdG9yeVJlY29yZAMEdHlwZQt1c2VyQWRkcmVzcwR0eElkCQC5CQIJAMwIAgIIJXMlcyVzJXMJAMwIAgIHaGlzdG9yeQkAzAgCBQR0eXBlCQDMCAIJAKUIAQULdXNlckFkZHJlc3MJAMwIAgkA2AQBBQR0eElkBQNuaWwFCXNlcGFyYXRvcgEXa2V5TG9ja1BhcmFtVG90YWxBbW91bnQACQC5CQIJAMwIAgIEJXMlcwkAzAgCAgVzdGF0cwkAzAgCAhFhY3RpdmVUb3RhbExvY2tlZAUDbmlsBQlzZXBhcmF0b3IBEmtleVN0YXRzTG9ja3NDb3VudAAJALkJAgkAzAgCAgQlcyVzCQDMCAICBXN0YXRzCQDMCAICCmxvY2tzQ291bnQFA25pbAUJc2VwYXJhdG9yARJrZXlTdGF0c1VzZXJzQ291bnQACQC5CQIJAMwIAgIEJXMlcwkAzAgCAgVzdGF0cwkAzAgCAhBhY3RpdmVVc2Vyc0NvdW50BQNuaWwFCXNlcGFyYXRvcgENa2V5TmV4dFBlcmlvZAACDiVzX19uZXh0UGVyaW9kARhrZXlTdXBwb3J0ZWRSZXdhcmRBc3NldHMAAhVzdXBwb3J0ZWRSZXdhcmRBc3NldHMBEWtleURlcG9zaXROdW1MYXN0AAkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgNkZXAJAMwIAgIHbGFzdE51bQUDbmlsBQlzZXBhcmF0b3IBG2tleVVzZXJSZXdhcmRGcm9tRGVwb3NpdE51bQELdXNlckFkZHJlc3MJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIRdXNlclJ3ZEZyb21EZXBOdW0JAMwIAgULdXNlckFkZHJlc3MFA25pbAUJc2VwYXJhdG9yARVrZXlSZXdhcmRQZXJOc2J0U3VtQXQCCmRlcG9zaXROdW0DdGtuCQC5CQIJAMwIAgIEJXMlZAkAzAgCAhVyd2RQZXJOc2J0U3VtQnlEZXBOdW0JAMwIAgkApAMBBQpkZXBvc2l0TnVtCQDMCAIFA3RrbgUDbmlsBQlzZXBhcmF0b3IBCWtleVJld2FyZAILdXNlckFkZHJlc3MDdGtuCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICA3J3ZAkAzAgCBQt1c2VyQWRkcmVzcwkAzAgCBQN0a24FA25pbAUJc2VwYXJhdG9yAQprZXlDbGFpbWVkAgt1c2VyQWRkcmVzcwN0a24JALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIDY2xtCQDMCAIFC3VzZXJBZGRyZXNzCQDMCAIFA3RrbgUDbmlsBQlzZXBhcmF0b3IBF2tleU5vdERpc3RyaWJ1dGVkUmV3YXJkAQN0a24JALkJAgkAzAgCAgQlcyVzCQDMCAICDm5vdERpc3RyaWJ1dGVkCQDMCAIFA3RrbgUDbmlsBQlzZXBhcmF0b3IBBXRvWDE4AgdvcmlnVmFsCG9yaWdNdWx0CQC8AgMJALYCAQUHb3JpZ1ZhbAUHTVVMVFgxOAUIb3JpZ011bHQBDGdldEludE9yWmVybwEDa2V5CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQAAAQxnZXRJbnRPckVsc2UCA2tleQpkZWZhdWx0VmFsCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQUKZGVmYXVsdFZhbAEMZ2V0SW50T3JGYWlsAQNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzBQNrZXkJAKwCAgkArAICAg9NYW5kYXRvcnkgdGhpcy4FA2tleQIPIGlzIG5vdCBkZWZpbmVkAQxnZXRTdHJPckVsc2UCA2tleQpkZWZhdWx0VmFsCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFA2tleQUKZGVmYXVsdFZhbAEPdG9BZGRyZXNzT3JGYWlsAQphZGRyZXNzU3RyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQUKYWRkcmVzc1N0cgkArAICAiFjb3VsZG4ndCBwYXJzZSBwYXNzZWQgYWRkcmVzc1N0cj0FCmFkZHJlc3NTdHIBC3RvQXNzZXRWZWN0AQhhc3NldFN0cgMJAAACBQhhc3NldFN0cgUKV0FWRVNJRFNUUgUEdW5pdAkA2QQBBQhhc3NldFN0cgEFYXNJbnQBA3ZhbAQHJG1hdGNoMAUDdmFsAwkAAQIFByRtYXRjaDACA0ludAQGdmFsSW50BQckbWF0Y2gwBQZ2YWxJbnQJAAIBAhVmYWlsIHRvIGNhc3QgaW50byBJbnQBE2Zvcm1hdEhpc3RvcnlSZWNvcmQECW9sZEFtb3VudAhvbGRTdGFydAluZXdBbW91bnQIbmV3U3RhcnQJALkJAgkAzAgCAgwlZCVkJWQlZCVkJWQJAMwIAgkApAMBCAUJbGFzdEJsb2NrBmhlaWdodAkAzAgCCQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAKQDAQUJb2xkQW1vdW50CQDMCAIJAKQDAQUIb2xkU3RhcnQJAMwIAgkApAMBBQluZXdBbW91bnQJAMwIAgkApAMBBQhuZXdTdGFydAUDbmlsBQlzZXBhcmF0b3IBGGZvcm1hdENsYWltSGlzdG9yeVJlY29yZAIEdXNlcg5jbGFpbWVkUmV3YXJkcwkAuQkCCQDMCAICCCVzJWQlZCVzCQDMCAIFBHVzZXIJAMwIAgkApAMBCAUJbGFzdEJsb2NrBmhlaWdodAkAzAgCCQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIFDmNsYWltZWRSZXdhcmRzBQNuaWwFCXNlcGFyYXRvcgESSGlzdG9yeVJlY29yZEVudHJ5BwR0eXBlC3VzZXJBZGRyZXNzBHR4SWQJb2xkQW1vdW50CG9sZFN0YXJ0CW5ld0Ftb3VudAhuZXdTdGFydAkBC1N0cmluZ0VudHJ5AgkBEGtleUhpc3RvcnlSZWNvcmQDBQR0eXBlBQt1c2VyQWRkcmVzcwUEdHhJZAkBE2Zvcm1hdEhpc3RvcnlSZWNvcmQEBQlvbGRBbW91bnQFCG9sZFN0YXJ0BQluZXdBbW91bnQFCG5ld1N0YXJ0ARFDbGFpbUhpc3RvcnlFbnRyeQMLdXNlckFkZHJlc3MEdHhJZA5jbGFpbWVkUmV3YXJkcwkBC1N0cmluZ0VudHJ5AgkBEGtleUhpc3RvcnlSZWNvcmQDAgVjbGFpbQULdXNlckFkZHJlc3MFBHR4SWQJARhmb3JtYXRDbGFpbUhpc3RvcnlSZWNvcmQCCQClCAEFC3VzZXJBZGRyZXNzBQ5jbGFpbWVkUmV3YXJkcwELU3RhdHNSZXN1bHQDDnRvdGFsTG9ja2VkSW5jDGxvY2tDb3VudEluYw11c2Vyc0NvdW50SW5jBApsb2Nrc0NvdW50CQEMZ2V0SW50T3JaZXJvAQkBEmtleVN0YXRzTG9ja3NDb3VudAAECnVzZXJzQ291bnQJAQxnZXRJbnRPclplcm8BCQESa2V5U3RhdHNVc2Vyc0NvdW50AAQLdG90YWxBbW91bnQJAQxnZXRJbnRPclplcm8BCQEXa2V5TG9ja1BhcmFtVG90YWxBbW91bnQABA50b3RhbEFtb3VudE5ldwkAZAIFC3RvdGFsQW1vdW50BQ50b3RhbExvY2tlZEluYwkAlQoDCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQESa2V5U3RhdHNMb2Nrc0NvdW50AAkAZAIFCmxvY2tzQ291bnQFDGxvY2tDb3VudEluYwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEmtleVN0YXRzVXNlcnNDb3VudAAJAGQCBQp1c2Vyc0NvdW50BQ11c2Vyc0NvdW50SW5jCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEXa2V5TG9ja1BhcmFtVG90YWxBbW91bnQABQ50b3RhbEFtb3VudE5ldwUDbmlsBQt0b3RhbEFtb3VudAUOdG90YWxBbW91bnROZXcBD0xvY2tQYXJhbXNFbnRyeQMLdXNlckFkZHJlc3MGYW1vdW50GnZvdGluZ1Bvd2VyRWZmZWN0aXZlSGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEWa2V5TG9ja1BhcmFtVXNlckFtb3VudAEFC3VzZXJBZGRyZXNzBQZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlMb2NrUGFyYW1TdGFydEJsb2NrAQULdXNlckFkZHJlc3MFGnZvdGluZ1Bvd2VyRWZmZWN0aXZlSGVpZ2h0BQNuaWwBD2dldFBhcmFtc09yRmFpbAAJAJQKAgkA2QQBCQEPZ2V0U3RyaW5nT3JGYWlsAgUEdGhpcwkBEGtleVN0YWtlZEFzc2V0SWQACQEMZ2V0SW50T3JGYWlsAQkBEGtleU1pbkxvY2tBbW91bnQAAQxpc0FjdGl2ZVVzZXIBC3VzZXJBZGRyZXNzCQBmAgkBDGdldEludE9yRWxzZQIJARZrZXlMb2NrUGFyYW1Vc2VyQW1vdW50AQULdXNlckFkZHJlc3MAAAAAARNnZXRVc2VyUGFyYW1zT3JVbml0AQt1c2VyQWRkcmVzcwMJAQxpc0FjdGl2ZVVzZXIBBQt1c2VyQWRkcmVzcwkAlQoDBwkBDGdldEludE9yRmFpbAEJARZrZXlMb2NrUGFyYW1Vc2VyQW1vdW50AQULdXNlckFkZHJlc3MJAQxnZXRJbnRPckZhaWwBCQEWa2V5TG9ja1BhcmFtU3RhcnRCbG9jawEFC3VzZXJBZGRyZXNzBQR1bml0ARNnZXRVc2VyUGFyYW1zT3JGYWlsAQt1c2VyQWRkcmVzcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQETZ2V0VXNlclBhcmFtc09yVW5pdAEFC3VzZXJBZGRyZXNzCQCsAgIJAKwCAgIFVXNlciAJAKUIAQULdXNlckFkZHJlc3MCDyBpcyBub3QgZGVmaW5lZAASc3VwcG9ydGVkQXNzZXRzU3RyCQEMZ2V0U3RyT3JFbHNlAgkBGGtleVN1cHBvcnRlZFJld2FyZEFzc2V0cwACAAATc3VwcG9ydGVkQXNzZXRzTGlzdAkAtQkCBRJzdXBwb3J0ZWRBc3NldHNTdHICAV8BCmNhbGNSZXdhcmQFC3VzZXJBZGRyZXNzB2Fzc2V0SWQNc3Rha2VkQW1vdW50WA5kZXBvc2l0TnVtVXNlcg5kZXBvc2l0TnVtTGFzdAQXcmV3YXJkUGVyTnNidFN1bUxhc3RLRVkJARVrZXlSZXdhcmRQZXJOc2J0U3VtQXQCBQ5kZXBvc2l0TnVtTGFzdAUHYXNzZXRJZAQKc3VtTGFzdFgxOAkApwMBCQEMZ2V0U3RyT3JFbHNlAgkBFWtleVJld2FyZFBlck5zYnRTdW1BdAIFDmRlcG9zaXROdW1MYXN0BQdhc3NldElkAgEwBApzdW1Vc2VyWDE4CQCnAwEJAQxnZXRTdHJPckVsc2UCCQEVa2V5UmV3YXJkUGVyTnNidFN1bUF0AgUOZGVwb3NpdE51bVVzZXIFB2Fzc2V0SWQCATAEEXJld2FyZER5bmFtaWNQYXJ0CQCgAwEJALwCAwkAuAICBQpzdW1MYXN0WDE4BQpzdW1Vc2VyWDE4BQ1zdGFrZWRBbW91bnRYBQdNVUxUWDE4BBNyZXdhcmRDYWNoZWRQYXJ0S0VZCQEJa2V5UmV3YXJkAgULdXNlckFkZHJlc3MFB2Fzc2V0SWQEEHJld2FyZENhY2hlZFBhcnQJAQxnZXRJbnRPckVsc2UCBRNyZXdhcmRDYWNoZWRQYXJ0S0VZAAAJAJYKBAkAZAIFEHJld2FyZENhY2hlZFBhcnQFEXJld2FyZER5bmFtaWNQYXJ0BRByZXdhcmRDYWNoZWRQYXJ0BRFyZXdhcmREeW5hbWljUGFydAUTcmV3YXJkQ2FjaGVkUGFydEtFWQENUmV3YXJkRW50cmllcwMJaXNOZXdVc2VyC3VzZXJBZGRyZXNzDHN0YWtlZEFtb3VudAQNc3Rha2VkQW1vdW50WAkAtgIBBQxzdGFrZWRBbW91bnQEG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQkBG2tleVVzZXJSZXdhcmRGcm9tRGVwb3NpdE51bQEFC3VzZXJBZGRyZXNzBA5kZXBvc2l0TnVtVXNlcgkBDGdldEludE9yRWxzZQIFG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQD///////////8BBA5kZXBvc2l0TnVtTGFzdAkBDGdldEludE9yRWxzZQIJARFrZXlEZXBvc2l0TnVtTGFzdAAA////////////AQoBG2ZvckVhY2hBc3NldENhY2hlVXNlclJld2FyZAIFYWNjdW0FYXNzZXQECyR0MDg2Mzk4Nzc0CQEKY2FsY1Jld2FyZAUFC3VzZXJBZGRyZXNzBQVhc3NldAUNc3Rha2VkQW1vdW50WAUOZGVwb3NpdE51bVVzZXIFDmRlcG9zaXROdW1MYXN0BAtyZXdhcmRUb3RhbAgFCyR0MDg2Mzk4Nzc0Al8xBAZjYWNoZWQIBQskdDA4NjM5ODc3NAJfMgQHZHluYW1pYwgFCyR0MDg2Mzk4Nzc0Al8zBBNyZXdhcmRDYWNoZWRQYXJ0S0VZCAULJHQwODYzOTg3NzQCXzQJAM0IAgUFYWNjdW0JAQxJbnRlZ2VyRW50cnkCBRNyZXdhcmRDYWNoZWRQYXJ0S0VZBQtyZXdhcmRUb3RhbAMDCQAAAgUOZGVwb3NpdE51bUxhc3QA////////////AQkAAAIFDmRlcG9zaXROdW1Vc2VyAP///////////wEHBQNuaWwDAwkAAAIFDmRlcG9zaXROdW1MYXN0AP///////////wEJAGYCBQ5kZXBvc2l0TnVtVXNlcgD///////////8BBwkAAgECL2ludmFsaWQgZGVwb3NpdE51bUxhc3QgYW5kIGRlcG9zaXROdW1Vc2VyIHN0YXRlAwMJAGYCBQ5kZXBvc2l0TnVtTGFzdAD///////////8BCQBnAgUOZGVwb3NpdE51bVVzZXIA////////////AQcDBQlpc05ld1VzZXIJAMwIAgkBDEludGVnZXJFbnRyeQIFG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQUOZGVwb3NpdE51bUxhc3QFA25pbAkAzQgCCgACJGwFE3N1cHBvcnRlZEFzc2V0c0xpc3QKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBG2ZvckVhY2hBc3NldENhY2hlVXNlclJld2FyZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgkBDEludGVnZXJFbnRyeQIFG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQUOZGVwb3NpdE51bUxhc3QJAAIBCQCsAgIJAKwCAgkArAICAiR1bmNvdmVyZWQgY29uZGl0aW9uOiBkZXBvc2l0TnVtTGFzdD0JAKQDAQUOZGVwb3NpdE51bUxhc3QCECBkZXBvc2l0TnVtVXNlcj0JAKQDAQUOZGVwb3NpdE51bVVzZXIBIkluY3JlbWVudE5vdERpc3RyaWJ1dGVkUmV3YXJkRW50cnkCA3RrbglhbW91bnRJbmMEF25vdERpc3RyaWJ1dGVkUmV3YXJkS0VZCQEXa2V5Tm90RGlzdHJpYnV0ZWRSZXdhcmQBBQN0a24EFG5vdERpc3RyaWJ1dGVkUmV3YXJkCQEMZ2V0SW50T3JFbHNlAgUXbm90RGlzdHJpYnV0ZWRSZXdhcmRLRVkAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgUXbm90RGlzdHJpYnV0ZWRSZXdhcmRLRVkJAGQCBRRub3REaXN0cmlidXRlZFJld2FyZAUJYW1vdW50SW5jBQNuaWwBC3N1cmZUb0duc2J0AQdzdXJmQW10CQBpAgUHc3VyZkFtdAA8AR9tZXJnZVZvdGluZ1Bvd2VyRWZmZWN0aXZlSGVpZ2h0BBBxdWFyYW50aW5lUGVyaW9kEXZwRWZmZWN0aXZlSGVpZ2h0CXN0YWtlZEFtdAxzdGFrZWRBbXRORVcED3JlbWFpbmluZ1RvV2FpdAkAZQIFEXZwRWZmZWN0aXZlSGVpZ2h0BQZoZWlnaHQDCQBnAgAABQ9yZW1haW5pbmdUb1dhaXQJAGQCBQZoZWlnaHQFEHF1YXJhbnRpbmVQZXJpb2QEDWFscmVhZHlXYWl0ZWQJAGUCBRBxdWFyYW50aW5lUGVyaW9kBQ9yZW1haW5pbmdUb1dhaXQEA2tYOAMJAQIhPQIFDHN0YWtlZEFtdE5FVwAACQBrAwUJc3Rha2VkQW10BQVNVUxUOAUMc3Rha2VkQW10TkVXBRF2cEVmZmVjdGl2ZUhlaWdodAkAZQIJAGQCBRBxdWFyYW50aW5lUGVyaW9kBQZoZWlnaHQJAGsDBQ1hbHJlYWR5V2FpdGVkBQNrWDgFBU1VTFQ4AQptZXJnZVN0YWtlAgt1c2VyQWRkcmVzcwthbW91bnRUb0FkZAQNJHQwMTI0MTgxMjUyOAkBC3ZhbHVlT3JFbHNlAgkBE2dldFVzZXJQYXJhbXNPclVuaXQBBQt1c2VyQWRkcmVzcwkAlQoDBgAAAAAECWlzTmV3VXNlcggFDSR0MDEyNDE4MTI1MjgCXzEEDHN0YWtlZEFtb3VudAgFDSR0MDEyNDE4MTI1MjgCXzIEEXZwRWZmZWN0aXZlSGVpZ2h0CAUNJHQwMTI0MTgxMjUyOAJfMwQPc3Rha2VkQW1vdW50TkVXAwUJaXNOZXdVc2VyBQthbW91bnRUb0FkZAkAZAIFC2Ftb3VudFRvQWRkBQxzdGFrZWRBbW91bnQEEHF1YXJhbnRpbmVQZXJpb2QJAGgCAKALAA4EFHZwRWZmZWN0aXZlSGVpZ2h0TkVXAwUJaXNOZXdVc2VyCQBkAgUQcXVhcmFudGluZVBlcmlvZAUGaGVpZ2h0CQEfbWVyZ2VWb3RpbmdQb3dlckVmZmVjdGl2ZUhlaWdodAQFEHF1YXJhbnRpbmVQZXJpb2QFEXZwRWZmZWN0aXZlSGVpZ2h0BQxzdGFrZWRBbW91bnQFD3N0YWtlZEFtb3VudE5FVwkAlwoFBQlpc05ld1VzZXIFDHN0YWtlZEFtb3VudAURdnBFZmZlY3RpdmVIZWlnaHQFD3N0YWtlZEFtb3VudE5FVwUUdnBFZmZlY3RpdmVIZWlnaHRORVcBC2NvbW1vblN0YWtlAgt1c2VyQWRkcmVzcwFpBA0kdDAxMzAxNDEzMDY4CQEPZ2V0UGFyYW1zT3JGYWlsAAQNc3Rha2VkQXNzZXRJZAgFDSR0MDEzMDE0MTMwNjgCXzEEDW1pbkxvY2tBbW91bnQIBQ0kdDAxMzAxNDEzMDY4Al8yAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABCQACAQIVSW52YWxpZCBwYXltZW50cyBzaXplBAdwYXltZW50CQCRAwIIBQFpCHBheW1lbnRzAAAEBmFtb3VudAgFB3BheW1lbnQGYW1vdW50BBNpbnZhbGlkQXNzZXRNZXNzYWdlCQCsAgIJAKwCAgIPSW52YWxpZCBhc3NldC4gCQDYBAEFDXN0YWtlZEFzc2V0SWQCDCBpcyBleHBlY3RlZAQHYXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCAUHcGF5bWVudAdhc3NldElkBRNpbnZhbGlkQXNzZXRNZXNzYWdlAwkBAiE9AgUHYXNzZXRJZAUNc3Rha2VkQXNzZXRJZAkAAgEFE2ludmFsaWRBc3NldE1lc3NhZ2UEDnVzZXJBZGRyZXNzU3RyCQClCAEFC3VzZXJBZGRyZXNzBAptZXJnZWREYXRhCQEKbWVyZ2VTdGFrZQIFC3VzZXJBZGRyZXNzBQZhbW91bnQECWlzTmV3VXNlcggFCm1lcmdlZERhdGECXzEEDHN0YWtlZEFtb3VudAgFCm1lcmdlZERhdGECXzIEEXZwRWZmZWN0aXZlSGVpZ2h0CAUKbWVyZ2VkRGF0YQJfMwQPc3Rha2VkQW1vdW50TkVXCAUKbWVyZ2VkRGF0YQJfNAQUdnBFZmZlY3RpdmVIZWlnaHRORVcIBQptZXJnZWREYXRhAl81AwkAZgIFDW1pbkxvY2tBbW91bnQFD3N0YWtlZEFtb3VudE5FVwkAAgEJAKwCAgITTWluIGxvY2sgYW1vdW50IGlzIAkApAMBBQ1taW5Mb2NrQW1vdW50BA0kdDAxMzg2NzEzOTY5CQELU3RhdHNSZXN1bHQDBQZhbW91bnQAAQMFCWlzTmV3VXNlcgABAAAEDHN0YXRzRW50cmllcwgFDSR0MDEzODY3MTM5NjkCXzEEC3RvdGFsU3Rha2VkCAUNJHQwMTM4NjcxMzk2OQJfMgQOdG90YWxTdGFrZWROZXcIBQ0kdDAxMzg2NzEzOTY5Al8zCQDOCAIJAM4IAgkAzggCCQDMCAIJARJIaXN0b3J5UmVjb3JkRW50cnkHAgVzdGFrZQULdXNlckFkZHJlc3MIBQFpDXRyYW5zYWN0aW9uSWQFDHN0YWtlZEFtb3VudAURdnBFZmZlY3RpdmVIZWlnaHQFD3N0YWtlZEFtb3VudE5FVwUUdnBFZmZlY3RpdmVIZWlnaHRORVcFA25pbAkBDVJld2FyZEVudHJpZXMDBQlpc05ld1VzZXIFDnVzZXJBZGRyZXNzU3RyBQxzdGFrZWRBbW91bnQJAQ9Mb2NrUGFyYW1zRW50cnkDBQt1c2VyQWRkcmVzcwUPc3Rha2VkQW1vdW50TkVXBRR2cEVmZmVjdGl2ZUhlaWdodE5FVwUMc3RhdHNFbnRyaWVzAQtjb21tb25DbGFpbQILdXNlckFkZHJlc3MBaQQOdXNlckFkZHJlc3NTdHIJAKUIAQULdXNlckFkZHJlc3MDCQBmAgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIZcGF5bWVudHMgYXJlIG5vdCBhY2NlcHRlZAQNJHQwMTQ0NDgxNDU1MwkBC3ZhbHVlT3JFbHNlAgkBE2dldFVzZXJQYXJhbXNPclVuaXQBBQt1c2VyQWRkcmVzcwkAlQoDBgAAAAAECWlzTmV3VXNlcggFDSR0MDE0NDQ4MTQ1NTMCXzEEDHN0YWtlZEFtb3VudAgFDSR0MDE0NDQ4MTQ1NTMCXzIEDHN0YWtpbmdTdGFydAgFDSR0MDE0NDQ4MTQ1NTMCXzMEDXN0YWtlZEFtb3VudFgJALYCAQUMc3Rha2VkQW1vdW50BBt1c2VyUmV3YXJkRnJvbURlcG9zaXROdW1LRVkJARtrZXlVc2VyUmV3YXJkRnJvbURlcG9zaXROdW0BBQ51c2VyQWRkcmVzc1N0cgQOZGVwb3NpdE51bVVzZXIJAQxnZXRJbnRPckVsc2UCBRt1c2VyUmV3YXJkRnJvbURlcG9zaXROdW1LRVkA////////////AQQOZGVwb3NpdE51bUxhc3QJAQxnZXRJbnRPckVsc2UCCQERa2V5RGVwb3NpdE51bUxhc3QAAP///////////wEKAR9mb3JFYWNoQXNzZXRDYWxjVW5jbGFpbWVkUmV3YXJkAgVhY2N1bQVhc3NldAQNJHQwMTQ5MjQxNTA2MgkBCmNhbGNSZXdhcmQFBQ51c2VyQWRkcmVzc1N0cgUFYXNzZXQFDXN0YWtlZEFtb3VudFgFDmRlcG9zaXROdW1Vc2VyBQ5kZXBvc2l0TnVtTGFzdAQLcmV3YXJkVG90YWwIBQ0kdDAxNDkyNDE1MDYyAl8xBAZjYWNoZWQIBQ0kdDAxNDkyNDE1MDYyAl8yBAdkeW5hbWljCAUNJHQwMTQ5MjQxNTA2MgJfMwQTcmV3YXJkQ2FjaGVkUGFydEtFWQgFDSR0MDE0OTI0MTUwNjICXzQECmNsYWltZWRLRVkJAQprZXlDbGFpbWVkAgUOdXNlckFkZHJlc3NTdHIFBWFzc2V0BA0kdDAxNTEyMjE1MTU5BQVhY2N1bQQEZGF0YQgFDSR0MDE1MTIyMTUxNTkCXzEEEWNsYWltZWRBbXRCeUFzc2V0CAUNJHQwMTUxMjIxNTE1OQJfMgQHbmV3UGFydAkAuQkCCQDMCAIFBWFzc2V0CQDMCAIJAKQDAQULcmV3YXJkVG90YWwFA25pbAIBOgQUY2xhaW1lZEFtdEJ5QXNzZXROZXcJALkJAgkAzAgCBRFjbGFpbWVkQW10QnlBc3NldAkAzAgCBQduZXdQYXJ0BQNuaWwCAV8DCQBnAgAABQtyZXdhcmRUb3RhbAkAlAoCBQRkYXRhBRRjbGFpbWVkQW10QnlBc3NldE5ldwkAlAoCCQDNCAIJAM0IAgkAzQgCBQRkYXRhCQEOU2NyaXB0VHJhbnNmZXIDBQt1c2VyQWRkcmVzcwULcmV3YXJkVG90YWwJAQt0b0Fzc2V0VmVjdAEFBWFzc2V0CQEMSW50ZWdlckVudHJ5AgUKY2xhaW1lZEtFWQkAZAIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUKY2xhaW1lZEtFWQAABQtyZXdhcmRUb3RhbAkBDEludGVnZXJFbnRyeQIFE3Jld2FyZENhY2hlZFBhcnRLRVkAAAUUY2xhaW1lZEFtdEJ5QXNzZXROZXcEDSR0MDE1NjE5MTU3MzMKAAIkbAUTc3VwcG9ydGVkQXNzZXRzTGlzdAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsAgAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBH2ZvckVhY2hBc3NldENhbGNVbmNsYWltZWRSZXdhcmQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoECXRyYW5zZmVycwgFDSR0MDE1NjE5MTU3MzMCXzEEF2NsYWltZWRBbXRCeUFzc2V0UmVzdWx0CAUNJHQwMTU2MTkxNTczMwJfMgMJAGcCAAAJAJADAQUJdHJhbnNmZXJzBQNuaWwJAM0IAgkAzQgCBQl0cmFuc2ZlcnMJAQxJbnRlZ2VyRW50cnkCBRt1c2VyUmV3YXJkRnJvbURlcG9zaXROdW1LRVkFDmRlcG9zaXROdW1MYXN0CQERQ2xhaW1IaXN0b3J5RW50cnkDBQt1c2VyQWRkcmVzcwgFAWkNdHJhbnNhY3Rpb25JZAkAsAICBRdjbGFpbWVkQW10QnlBc3NldFJlc3VsdAABCgFpAQtjb25zdHJ1Y3RvcgMNbWluTG9ja0Ftb3VudBVzdXBwb3J0ZWRSZXdhcmRBc3NldHMNc3Rha2VkQXNzZXRJZAMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECEVBlcm1pc3Npb24gZGVuaWVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEQa2V5TWluTG9ja0Ftb3VudAAFDW1pbkxvY2tBbW91bnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBGGtleVN1cHBvcnRlZFJld2FyZEFzc2V0cwAFFXN1cHBvcnRlZFJld2FyZEFzc2V0cwkAzAgCCQELU3RyaW5nRW50cnkCCQEQa2V5U3Rha2VkQXNzZXRJZAAFDXN0YWtlZEFzc2V0SWQFA25pbAFpAQVzdGFrZQAJAQtjb21tb25TdGFrZQIIBQFpBmNhbGxlcgUBaQFpARNzdGFrZUJ5T3JpZ2luQ2FsbGVyAAkBC2NvbW1vblN0YWtlAggFAWkMb3JpZ2luQ2FsbGVyBQFpAWkBB3Vuc3Rha2UBBmFtb3VudAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECI3Vuc3Rha2UgZG9lc24ndCByZXF1aXJlIGFueSBwYXltZW50BAt1c2VyQWRkcmVzcwgFAWkGY2FsbGVyBA51c2VyQWRkcmVzc1N0cgkApQgBBQt1c2VyQWRkcmVzcwQNJHQwMTY2NDIxNjY5NgkBD2dldFBhcmFtc09yRmFpbAAEDXN0YWtlZEFzc2V0SWQIBQ0kdDAxNjY0MjE2Njk2Al8xBA1taW5Mb2NrQW1vdW50CAUNJHQwMTY2NDIxNjY5NgJfMgQNJHQwMTY2OTkxNjc4MwkBE2dldFVzZXJQYXJhbXNPckZhaWwBBQt1c2VyQWRkcmVzcwQJaXNOZXdVc2VyCAUNJHQwMTY2OTkxNjc4MwJfMQQMc3Rha2VkQW1vdW50CAUNJHQwMTY2OTkxNjc4MwJfMgQRdnBFZmZlY3RpdmVIZWlnaHQIBQ0kdDAxNjY5OTE2NzgzAl8zAwkAZwIAAAUMc3Rha2VkQW1vdW50CQACAQISTm90aGluZyB0byB1bnN0YWtlAwkAZgIFBmFtb3VudAUMc3Rha2VkQW1vdW50CQACAQkArAICCQCsAgIJAKwCAgIKUmVxdWVzdGVkIAkApAMBBQZhbW91bnQCEiwgYnV0IHN0YWtlZCBvbmx5IAkApAMBBQxzdGFrZWRBbW91bnQED3N0YWtlZEFtb3VudE5FVwkAZQIFDHN0YWtlZEFtb3VudAUGYW1vdW50BA0kdDAxNzAyNTE3MTgzCQELU3RhdHNSZXN1bHQDCQEBLQEFBmFtb3VudAMJAAACBQZhbW91bnQFDHN0YWtlZEFtb3VudAD///////////8BAAADCQAAAgUGYW1vdW50BQxzdGFrZWRBbW91bnQA////////////AQAABAxzdGF0c0VudHJpZXMIBQ0kdDAxNzAyNTE3MTgzAl8xBAt0b3RhbFN0YWtlZAgFDSR0MDE3MDI1MTcxODMCXzIEDnRvdGFsU3Rha2VkTmV3CAUNJHQwMTcwMjUxNzE4MwJfMwkAzggCCQDOCAIJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQt1c2VyQWRkcmVzcwUGYW1vdW50BQ1zdGFrZWRBc3NldElkCQDMCAIJARJIaXN0b3J5UmVjb3JkRW50cnkHAgd1bnN0YWtlBQt1c2VyQWRkcmVzcwgFAWkNdHJhbnNhY3Rpb25JZAUMc3Rha2VkQW1vdW50BRF2cEVmZmVjdGl2ZUhlaWdodAUPc3Rha2VkQW1vdW50TkVXBRF2cEVmZmVjdGl2ZUhlaWdodAUDbmlsCQENUmV3YXJkRW50cmllcwMHBQ51c2VyQWRkcmVzc1N0cgUMc3Rha2VkQW1vdW50CQEPTG9ja1BhcmFtc0VudHJ5AwULdXNlckFkZHJlc3MFD3N0YWtlZEFtb3VudE5FVwURdnBFZmZlY3RpdmVIZWlnaHQFDHN0YXRzRW50cmllcwFpAQdkZXBvc2l0AAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECH2V4YWN0IDEgcGF5bWVudCBpcyBhbGxvd2VkIG9ubHkEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABAZhbW91bnQIBQNwbXQGYW1vdW50BApwbXRBc3NldElkCQELdmFsdWVPckVsc2UCCAUDcG10B2Fzc2V0SWQFB1dBVkVTSUQEDXBtdEFzc2V0SWRTdHIJANgEAQUKcG10QXNzZXRJZAQIcG10TXVsdFgDCQAAAgUKcG10QXNzZXRJZAUHV0FWRVNJRAUGTVVMVFg4BQZNVUxUWDYEB2Ftb3VudFgJALYCAQUGYW1vdW50BAt0b3RhbFN0YWtlZAkBDGdldEludE9yRWxzZQIJARdrZXlMb2NrUGFyYW1Ub3RhbEFtb3VudAAAAAQMdG90YWxTdGFrZWRYCQC2AgEFC3RvdGFsU3Rha2VkAwkAZgIAAAULdG90YWxTdGFrZWQJAAIBAhtUT0RPOiBjYXNlIGlzIG5vdCBzdXBwb3J0ZWQDCQAAAgULdG90YWxTdGFrZWQAAAkBIkluY3JlbWVudE5vdERpc3RyaWJ1dGVkUmV3YXJkRW50cnkCBQ1wbXRBc3NldElkU3RyBQZhbW91bnQEEHJld2FyZFBlck5zYnRYMTgJALwCAwUHYW1vdW50WAUHTVVMVFgxOAUMdG90YWxTdGFrZWRYBBFkZXBvc2l0TnVtTGFzdEtFWQkBEWtleURlcG9zaXROdW1MYXN0AAQOZGVwb3NpdE51bUxhc3QJAQxnZXRJbnRPckVsc2UCBRFkZXBvc2l0TnVtTGFzdEtFWQD///////////8BBA1kZXBvc2l0TnVtTmV3CQBkAgUOZGVwb3NpdE51bUxhc3QAAQMJAQEhAQkBCGNvbnRhaW5zAgUSc3VwcG9ydGVkQXNzZXRzU3RyBQ1wbXRBc3NldElkU3RyCQACAQkArAICCQCsAgIFEnN1cHBvcnRlZEFzc2V0c1N0cgIRIGRvZXNuJ3QgY29udGFpbiAFDXBtdEFzc2V0SWRTdHIKARdyZWZyZXNoUmV3YXJkUGVyTnNidFNVTQIFYWNjdW0JbmV4dEFzc2V0BBZyZXdhcmRQZXJOc2J0U3VtTmV3S0VZCQEVa2V5UmV3YXJkUGVyTnNidFN1bUF0AgUNZGVwb3NpdE51bU5ldwUJbmV4dEFzc2V0BApzdW1MYXN0U3RyCQEMZ2V0U3RyT3JFbHNlAgkBFWtleVJld2FyZFBlck5zYnRTdW1BdAIFDmRlcG9zaXROdW1MYXN0BQluZXh0QXNzZXQCATAJAM0IAgUFYWNjdW0DCQAAAgUJbmV4dEFzc2V0BQ1wbXRBc3NldElkU3RyCQELU3RyaW5nRW50cnkCBRZyZXdhcmRQZXJOc2J0U3VtTmV3S0VZCQCmAwEJALcCAgkApwMBBQpzdW1MYXN0U3RyBRByZXdhcmRQZXJOc2J0WDE4CQELU3RyaW5nRW50cnkCBRZyZXdhcmRQZXJOc2J0U3VtTmV3S0VZBQpzdW1MYXN0U3RyCQDNCAIKAAIkbAUTc3VwcG9ydGVkQXNzZXRzTGlzdAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEXcmVmcmVzaFJld2FyZFBlck5zYnRTVU0CBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoJAQxJbnRlZ2VyRW50cnkCBRFkZXBvc2l0TnVtTGFzdEtFWQUNZGVwb3NpdE51bU5ldwFpAQxjbGFpbVJld2FyZHMACQELY29tbW9uQ2xhaW0CCAUBaQZjYWxsZXIFAWkBaQEaY2xhaW1SZXdhcmRzQnlPcmlnaW5DYWxsZXIACQELY29tbW9uQ2xhaW0CCAUBaQxvcmlnaW5DYWxsZXIFAWkBaQEYdW5jbGFpbWVkUmV3YXJkc1JFQURPTkxZAQ51c2VyQWRkcmVzc1N0cgoBFmZvckVhY2hBc3NldFplcm9SZXdhcmQCBWFjY3VtBWFzc2V0CQCsAgIJAKwCAgUFYWNjdW0JALkJAgkAzAgCBQVhc3NldAkAzAgCAgEwCQDMCAICATAFA25pbAIBOgIBXwQSdW5jbGFpbWVkUmV3YXJkU3RyAwkAAAIFDnVzZXJBZGRyZXNzU3RyAgAKAAIkbAUTc3VwcG9ydGVkQXNzZXRzTGlzdAoAAiRzCQCQAwEFAiRsCgAFJGFjYzACAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEWZm9yRWFjaEFzc2V0WmVyb1Jld2FyZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQLdXNlckFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDYyKQEFDnVzZXJBZGRyZXNzU3RyBA0kdDAxOTc1NzE5ODYyCQELdmFsdWVPckVsc2UCCQETZ2V0VXNlclBhcmFtc09yVW5pdAEFC3VzZXJBZGRyZXNzCQCVCgMGAAAAAAQJaXNOZXdVc2VyCAUNJHQwMTk3NTcxOTg2MgJfMQQMc3Rha2VkQW1vdW50CAUNJHQwMTk3NTcxOTg2MgJfMgQMc3Rha2luZ1N0YXJ0CAUNJHQwMTk3NTcxOTg2MgJfMwQNc3Rha2VkQW1vdW50WAkAtgIBBQxzdGFrZWRBbW91bnQEG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQkBG2tleVVzZXJSZXdhcmRGcm9tRGVwb3NpdE51bQEFDnVzZXJBZGRyZXNzU3RyBA5kZXBvc2l0TnVtVXNlcgkBDGdldEludE9yRWxzZQIFG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQD///////////8BBA5kZXBvc2l0TnVtTGFzdAkBDGdldEludE9yRWxzZQIJARFrZXlEZXBvc2l0TnVtTGFzdAAA////////////AQoBH2ZvckVhY2hBc3NldENhbGNVbmNsYWltZWRSZXdhcmQCBWFjY3VtBWFzc2V0BA0kdDAyMDIwODIwMzQ2CQEKY2FsY1Jld2FyZAUFDnVzZXJBZGRyZXNzU3RyBQVhc3NldAUNc3Rha2VkQW1vdW50WAUOZGVwb3NpdE51bVVzZXIFDmRlcG9zaXROdW1MYXN0BAtyZXdhcmRUb3RhbAgFDSR0MDIwMjA4MjAzNDYCXzEEBmNhY2hlZAgFDSR0MDIwMjA4MjAzNDYCXzIEB2R5bmFtaWMIBQ0kdDAyMDIwODIwMzQ2Al8zBBNyZXdhcmRDYWNoZWRQYXJ0S0VZCAUNJHQwMjAyMDgyMDM0NgJfNAQHY2xhaW1lZAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEKa2V5Q2xhaW1lZAIFDnVzZXJBZGRyZXNzU3RyBQVhc3NldAAACQCsAgIJAKwCAgUFYWNjdW0JALkJAgkAzAgCBQVhc3NldAkAzAgCCQCkAwEFC3Jld2FyZFRvdGFsCQDMCAIJAKQDAQUHY2xhaW1lZAUDbmlsAgE6AgFfCgACJGwFE3N1cHBvcnRlZEFzc2V0c0xpc3QKAAIkcwkAkAMBBQIkbAoABSRhY2MwAgAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBH2ZvckVhY2hBc3NldENhbGNVbmNsYWltZWRSZXdhcmQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoJAJQKAgUDbmlsCQCzAgIFEnVuY2xhaW1lZFJld2FyZFN0cgABAWkBFnN1cmZTdGFraW5nU1lTUkVBRE9OTFkCFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQhzdXJmRGlmZgQJc3VyZlRvdGFsCQEMZ2V0SW50T3JFbHNlAgkBF2tleUxvY2tQYXJhbVRvdGFsQW1vdW50AAAABBJnbnNidEZyb21TdXJmVG90YWwJAQtzdXJmVG9HbnNidAEFCXN1cmZUb3RhbAMJAAACBRV1c2VyQWRkcmVzc1N0ck9yRW1wdHkCAAkAlAoCBQNuaWwJAMwIAgAACQDMCAIFCXN1cmZUb3RhbAkAzAgCAAAJAMwIAgUSZ25zYnRGcm9tU3VyZlRvdGFsCQDMCAIAAAkAzAgCBQZoZWlnaHQJAMwIAgUGaGVpZ2h0BQNuaWwEC3VzZXJBZGRyZXNzCQEPdG9BZGRyZXNzT3JGYWlsAQUVdXNlckFkZHJlc3NTdHJPckVtcHR5BAptZXJnZWREYXRhCQEKbWVyZ2VTdGFrZQIFC3VzZXJBZGRyZXNzBQhzdXJmRGlmZgQJaXNOZXdVc2VyCAUKbWVyZ2VkRGF0YQJfMQQMc3Rha2VkQW1vdW50CAUKbWVyZ2VkRGF0YQJfMgQRdnBFZmZlY3RpdmVIZWlnaHQIBQptZXJnZWREYXRhAl8zBA9zdGFrZWRBbW91bnRORVcIBQptZXJnZWREYXRhAl80BBR2cEVmZmVjdGl2ZUhlaWdodE5FVwgFCm1lcmdlZERhdGECXzUECHN1cmZVc2VyBQxzdGFrZWRBbW91bnQEEWduc2J0RnJvbVN1cmZVc2VyCQELc3VyZlRvR25zYnQBBQhzdXJmVXNlcgkAlAoCBQNuaWwJAMwIAgUIc3VyZlVzZXIJAMwIAgUJc3VyZlRvdGFsCQDMCAIFEWduc2J0RnJvbVN1cmZVc2VyCQDMCAIFEmduc2J0RnJvbVN1cmZUb3RhbAkAzAgCBRF2cEVmZmVjdGl2ZUhlaWdodAkAzAgCBRR2cEVmZmVjdGl2ZUhlaWdodE5FVwUDbmlsAWkBEWNvbmZpZ1NZU1JFQURPTkxZAAQKbWluTG9ja0FtdAkBEUBleHRyTmF0aXZlKDEwNTUpAQkBEGtleU1pbkxvY2tBbW91bnQABBJnbnNidEZyb21TdXJmQ29lZmYJAGgCADwFBU1VTFQ2BCBzdXJmVm90aW5nUG93ZXJSZXN0cmljdGl2ZVBlcmlvZAkAaAIAoAsADgQbYnJUb1N0YXJ0U3VyZlRyYW5zZm9ybWF0aW9uALCYRgkAlAoCBQNuaWwJAMwIAgUKbWluTG9ja0FtdAkAzAgCBRJnbnNidEZyb21TdXJmQ29lZmYJAMwIAgUgc3VyZlZvdGluZ1Bvd2VyUmVzdHJpY3RpdmVQZXJpb2QJAMwIAgUbYnJUb1N0YXJ0U3VyZlRyYW5zZm9ybWF0aW9uBQNuaWwA7Wtygg==", "chainId": 84, "height": 2170757, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: ATGScZ2BnkhhsgpdgkAYoeFEXYbXSJHxdc4eZnYCaAtS Next: CcGH7yZgP3KsW9T98fwiQHtprj1dbf7uqTKYAHHQR9Jt Diff:
OldNewDifferences
268268 then (height + quarantinePeriod)
269269 else {
270270 let alreadyWaited = (quarantinePeriod - remainingToWait)
271- let kX8 = fraction(stakedAmt, MULT8, stakedAmtNEW)
271+ let kX8 = if ((stakedAmtNEW != 0))
272+ then fraction(stakedAmt, MULT8, stakedAmtNEW)
273+ else vpEffectiveHeight
272274 ((quarantinePeriod + height) - fraction(alreadyWaited, kX8, MULT8))
273275 }
274276 }
275277
276278
277279 func mergeStake (userAddress,amountToAdd) = {
278- let $t01236712477 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
279- let isNewUser = $t01236712477._1
280- let stakedAmount = $t01236712477._2
281- let vpEffectiveHeight = $t01236712477._3
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
282284 let stakedAmountNEW = if (isNewUser)
283285 then amountToAdd
284286 else (amountToAdd + stakedAmount)
291293
292294
293295 func commonStake (userAddress,i) = {
294- let $t01296313017 = getParamsOrFail()
295- let stakedAssetId = $t01296313017._1
296- let minLockAmount = $t01296313017._2
296+ let $t01301413068 = getParamsOrFail()
297+ let stakedAssetId = $t01301413068._1
298+ let minLockAmount = $t01301413068._2
297299 if ((size(i.payments) != 1))
298300 then throw("Invalid payments size")
299301 else {
314316 if ((minLockAmount > stakedAmountNEW))
315317 then throw(("Min lock amount is " + toString(minLockAmount)))
316318 else {
317- let $t01381613918 = StatsResult(amount, 1, if (isNewUser)
319+ let $t01386713969 = StatsResult(amount, 1, if (isNewUser)
318320 then 1
319321 else 0)
320- let statsEntries = $t01381613918._1
321- let totalStaked = $t01381613918._2
322- let totalStakedNew = $t01381613918._3
322+ let statsEntries = $t01386713969._1
323+ let totalStaked = $t01386713969._2
324+ let totalStakedNew = $t01386713969._3
323325 ((([HistoryRecordEntry("stake", userAddress, i.transactionId, stakedAmount, vpEffectiveHeight, stakedAmountNEW, vpEffectiveHeightNEW)] ++ RewardEntries(isNewUser, userAddressStr, stakedAmount)) ++ LockParamsEntry(userAddress, stakedAmountNEW, vpEffectiveHeightNEW)) ++ statsEntries)
324326 }
325327 }
332334 if ((size(i.payments) > 0))
333335 then throw("payments are not accepted")
334336 else {
335- let $t01439714502 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
336- let isNewUser = $t01439714502._1
337- let stakedAmount = $t01439714502._2
338- let stakingStart = $t01439714502._3
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
339341 let stakedAmountX = toBigInt(stakedAmount)
340342 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
341343 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
342344 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
343345 func forEachAssetCalcUnclaimedReward (accum,asset) = {
344- let $t01487315011 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
345- let rewardTotal = $t01487315011._1
346- let cached = $t01487315011._2
347- let dynamic = $t01487315011._3
348- let rewardCachedPartKEY = $t01487315011._4
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
349351 let claimedKEY = keyClaimed(userAddressStr, asset)
350- let $t01507115108 = accum
351- let data = $t01507115108._1
352- let claimedAmtByAsset = $t01507115108._2
352+ let $t01512215159 = accum
353+ let data = $t01512215159._1
354+ let claimedAmtByAsset = $t01512215159._2
353355 let newPart = makeString([asset, toString(rewardTotal)], ":")
354356 let claimedAmtByAssetNew = makeString([claimedAmtByAsset, newPart], "_")
355357 if ((0 >= rewardTotal))
357359 else $Tuple2((((data :+ ScriptTransfer(userAddress, rewardTotal, toAssetVect(asset))) :+ IntegerEntry(claimedKEY, (valueOrElse(getInteger(claimedKEY), 0) + rewardTotal))) :+ IntegerEntry(rewardCachedPartKEY, 0)), claimedAmtByAssetNew)
358360 }
359361
360- let $t01556815682 = {
362+ let $t01561915733 = {
361363 let $l = supportedAssetsList
362364 let $s = size($l)
363365 let $acc0 = $Tuple2(nil, "")
371373
372374 $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)
373375 }
374- let transfers = $t01556815682._1
375- let claimedAmtByAssetResult = $t01556815682._2
376+ let transfers = $t01561915733._1
377+ let claimedAmtByAssetResult = $t01561915733._2
376378 if ((0 >= size(transfers)))
377379 then nil
378380 else ((transfers :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)) :+ ClaimHistoryEntry(userAddress, i.transactionId, drop(claimedAmtByAssetResult, 1)))
403405 else {
404406 let userAddress = i.caller
405407 let userAddressStr = toString(userAddress)
406- let $t01659116645 = getParamsOrFail()
407- let stakedAssetId = $t01659116645._1
408- let minLockAmount = $t01659116645._2
409- let $t01664816722 = getUserParamsOrFail(userAddress)
410- let isNewUser = $t01664816722._1
411- let lockAmount = $t01664816722._2
412- let lockStart = $t01664816722._3
413- if ((0 >= lockAmount))
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
415+ if ((0 >= stakedAmount))
414416 then throw("Nothing to unstake")
415- else if ((amount > lockAmount))
416- then throw(((("Requested " + toString(amount)) + ", but staked only ") + toString(lockAmount)))
417+ else if ((amount > stakedAmount))
418+ then throw(((("Requested " + toString(amount)) + ", but staked only ") + toString(stakedAmount)))
417419 else {
418- let $t01691217066 = StatsResult(-(amount), if ((amount == lockAmount))
420+ let stakedAmountNEW = (stakedAmount - amount)
421+ let $t01702517183 = StatsResult(-(amount), if ((amount == stakedAmount))
419422 then -1
420- else 0, if ((amount == lockAmount))
423+ else 0, if ((amount == stakedAmount))
421424 then -1
422425 else 0)
423- let statsEntries = $t01691217066._1
424- let totalStaked = $t01691217066._2
425- let totalStakedNew = $t01691217066._3
426- ((([ScriptTransfer(userAddress, amount, stakedAssetId), HistoryRecordEntry("unstake", userAddress, i.transactionId, lockAmount, lockStart, (lockAmount - amount), lockStart)] ++ RewardEntries(false, userAddressStr, lockAmount)) ++ LockParamsEntry(userAddress, (lockAmount - amount), lockStart)) ++ statsEntries)
426+ let statsEntries = $t01702517183._1
427+ let totalStaked = $t01702517183._2
428+ let totalStakedNew = $t01702517183._3
429+ ((([ScriptTransfer(userAddress, amount, stakedAssetId), HistoryRecordEntry("unstake", userAddress, i.transactionId, stakedAmount, vpEffectiveHeight, stakedAmountNEW, vpEffectiveHeight)] ++ RewardEntries(false, userAddressStr, stakedAmount)) ++ LockParamsEntry(userAddress, stakedAmountNEW, vpEffectiveHeight)) ++ statsEntries)
427430 }
428431 }
429432
514517 }
515518 else {
516519 let userAddress = addressFromStringValue(userAddressStr)
517- let $t01962019725 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
518- let isNewUser = $t01962019725._1
519- let stakedAmount = $t01962019725._2
520- let stakingStart = $t01962019725._3
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
521524 let stakedAmountX = toBigInt(stakedAmount)
522525 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
523526 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
524527 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
525528 func forEachAssetCalcUnclaimedReward (accum,asset) = {
526- let $t02007120209 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
527- let rewardTotal = $t02007120209._1
528- let cached = $t02007120209._2
529- let dynamic = $t02007120209._3
530- let rewardCachedPartKEY = $t02007120209._4
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
531534 let claimed = valueOrElse(getInteger(keyClaimed(userAddressStr, asset)), 0)
532535 ((accum + makeString([asset, toString(rewardTotal), toString(claimed)], ":")) + "_")
533536 }
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
262262 func surfToGnsbt (surfAmt) = (surfAmt / 60)
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)
271- let kX8 = fraction(stakedAmt, MULT8, stakedAmtNEW)
271+ let kX8 = if ((stakedAmtNEW != 0))
272+ then fraction(stakedAmt, MULT8, stakedAmtNEW)
273+ else vpEffectiveHeight
272274 ((quarantinePeriod + height) - fraction(alreadyWaited, kX8, MULT8))
273275 }
274276 }
275277
276278
277279 func mergeStake (userAddress,amountToAdd) = {
278- let $t01236712477 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
279- let isNewUser = $t01236712477._1
280- let stakedAmount = $t01236712477._2
281- let vpEffectiveHeight = $t01236712477._3
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
282284 let stakedAmountNEW = if (isNewUser)
283285 then amountToAdd
284286 else (amountToAdd + stakedAmount)
285287 let quarantinePeriod = (1440 * 14)
286288 let vpEffectiveHeightNEW = if (isNewUser)
287289 then (quarantinePeriod + height)
288290 else mergeVotingPowerEffectiveHeight(quarantinePeriod, vpEffectiveHeight, stakedAmount, stakedAmountNEW)
289291 $Tuple5(isNewUser, stakedAmount, vpEffectiveHeight, stakedAmountNEW, vpEffectiveHeightNEW)
290292 }
291293
292294
293295 func commonStake (userAddress,i) = {
294- let $t01296313017 = getParamsOrFail()
295- let stakedAssetId = $t01296313017._1
296- let minLockAmount = $t01296313017._2
296+ let $t01301413068 = getParamsOrFail()
297+ let stakedAssetId = $t01301413068._1
298+ let minLockAmount = $t01301413068._2
297299 if ((size(i.payments) != 1))
298300 then throw("Invalid payments size")
299301 else {
300302 let payment = i.payments[0]
301303 let amount = payment.amount
302304 let invalidAssetMessage = (("Invalid asset. " + toBase58String(stakedAssetId)) + " is expected")
303305 let assetId = valueOrErrorMessage(payment.assetId, invalidAssetMessage)
304306 if ((assetId != stakedAssetId))
305307 then throw(invalidAssetMessage)
306308 else {
307309 let userAddressStr = toString(userAddress)
308310 let mergedData = mergeStake(userAddress, amount)
309311 let isNewUser = mergedData._1
310312 let stakedAmount = mergedData._2
311313 let vpEffectiveHeight = mergedData._3
312314 let stakedAmountNEW = mergedData._4
313315 let vpEffectiveHeightNEW = mergedData._5
314316 if ((minLockAmount > stakedAmountNEW))
315317 then throw(("Min lock amount is " + toString(minLockAmount)))
316318 else {
317- let $t01381613918 = StatsResult(amount, 1, if (isNewUser)
319+ let $t01386713969 = StatsResult(amount, 1, if (isNewUser)
318320 then 1
319321 else 0)
320- let statsEntries = $t01381613918._1
321- let totalStaked = $t01381613918._2
322- let totalStakedNew = $t01381613918._3
322+ let statsEntries = $t01386713969._1
323+ let totalStaked = $t01386713969._2
324+ let totalStakedNew = $t01386713969._3
323325 ((([HistoryRecordEntry("stake", userAddress, i.transactionId, stakedAmount, vpEffectiveHeight, stakedAmountNEW, vpEffectiveHeightNEW)] ++ RewardEntries(isNewUser, userAddressStr, stakedAmount)) ++ LockParamsEntry(userAddress, stakedAmountNEW, vpEffectiveHeightNEW)) ++ statsEntries)
324326 }
325327 }
326328 }
327329 }
328330
329331
330332 func commonClaim (userAddress,i) = {
331333 let userAddressStr = toString(userAddress)
332334 if ((size(i.payments) > 0))
333335 then throw("payments are not accepted")
334336 else {
335- let $t01439714502 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
336- let isNewUser = $t01439714502._1
337- let stakedAmount = $t01439714502._2
338- let stakingStart = $t01439714502._3
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
339341 let stakedAmountX = toBigInt(stakedAmount)
340342 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
341343 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
342344 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
343345 func forEachAssetCalcUnclaimedReward (accum,asset) = {
344- let $t01487315011 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
345- let rewardTotal = $t01487315011._1
346- let cached = $t01487315011._2
347- let dynamic = $t01487315011._3
348- let rewardCachedPartKEY = $t01487315011._4
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
349351 let claimedKEY = keyClaimed(userAddressStr, asset)
350- let $t01507115108 = accum
351- let data = $t01507115108._1
352- let claimedAmtByAsset = $t01507115108._2
352+ let $t01512215159 = accum
353+ let data = $t01512215159._1
354+ let claimedAmtByAsset = $t01512215159._2
353355 let newPart = makeString([asset, toString(rewardTotal)], ":")
354356 let claimedAmtByAssetNew = makeString([claimedAmtByAsset, newPart], "_")
355357 if ((0 >= rewardTotal))
356358 then $Tuple2(data, claimedAmtByAssetNew)
357359 else $Tuple2((((data :+ ScriptTransfer(userAddress, rewardTotal, toAssetVect(asset))) :+ IntegerEntry(claimedKEY, (valueOrElse(getInteger(claimedKEY), 0) + rewardTotal))) :+ IntegerEntry(rewardCachedPartKEY, 0)), claimedAmtByAssetNew)
358360 }
359361
360- let $t01556815682 = {
362+ let $t01561915733 = {
361363 let $l = supportedAssetsList
362364 let $s = size($l)
363365 let $acc0 = $Tuple2(nil, "")
364366 func $f0_1 ($a,$i) = if (($i >= $s))
365367 then $a
366368 else forEachAssetCalcUnclaimedReward($a, $l[$i])
367369
368370 func $f0_2 ($a,$i) = if (($i >= $s))
369371 then $a
370372 else throw("List size exceeds 10")
371373
372374 $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)
373375 }
374- let transfers = $t01556815682._1
375- let claimedAmtByAssetResult = $t01556815682._2
376+ let transfers = $t01561915733._1
377+ let claimedAmtByAssetResult = $t01561915733._2
376378 if ((0 >= size(transfers)))
377379 then nil
378380 else ((transfers :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)) :+ ClaimHistoryEntry(userAddress, i.transactionId, drop(claimedAmtByAssetResult, 1)))
379381 }
380382 }
381383
382384
383385 @Callable(i)
384386 func constructor (minLockAmount,supportedRewardAssets,stakedAssetId) = if ((i.caller != this))
385387 then throw("Permission denied")
386388 else [IntegerEntry(keyMinLockAmount(), minLockAmount), StringEntry(keySupportedRewardAssets(), supportedRewardAssets), StringEntry(keyStakedAssetId(), stakedAssetId)]
387389
388390
389391
390392 @Callable(i)
391393 func stake () = commonStake(i.caller, i)
392394
393395
394396
395397 @Callable(i)
396398 func stakeByOriginCaller () = commonStake(i.originCaller, i)
397399
398400
399401
400402 @Callable(i)
401403 func unstake (amount) = if ((size(i.payments) != 0))
402404 then throw("unstake doesn't require any payment")
403405 else {
404406 let userAddress = i.caller
405407 let userAddressStr = toString(userAddress)
406- let $t01659116645 = getParamsOrFail()
407- let stakedAssetId = $t01659116645._1
408- let minLockAmount = $t01659116645._2
409- let $t01664816722 = getUserParamsOrFail(userAddress)
410- let isNewUser = $t01664816722._1
411- let lockAmount = $t01664816722._2
412- let lockStart = $t01664816722._3
413- if ((0 >= lockAmount))
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
415+ if ((0 >= stakedAmount))
414416 then throw("Nothing to unstake")
415- else if ((amount > lockAmount))
416- then throw(((("Requested " + toString(amount)) + ", but staked only ") + toString(lockAmount)))
417+ else if ((amount > stakedAmount))
418+ then throw(((("Requested " + toString(amount)) + ", but staked only ") + toString(stakedAmount)))
417419 else {
418- let $t01691217066 = StatsResult(-(amount), if ((amount == lockAmount))
420+ let stakedAmountNEW = (stakedAmount - amount)
421+ let $t01702517183 = StatsResult(-(amount), if ((amount == stakedAmount))
419422 then -1
420- else 0, if ((amount == lockAmount))
423+ else 0, if ((amount == stakedAmount))
421424 then -1
422425 else 0)
423- let statsEntries = $t01691217066._1
424- let totalStaked = $t01691217066._2
425- let totalStakedNew = $t01691217066._3
426- ((([ScriptTransfer(userAddress, amount, stakedAssetId), HistoryRecordEntry("unstake", userAddress, i.transactionId, lockAmount, lockStart, (lockAmount - amount), lockStart)] ++ RewardEntries(false, userAddressStr, lockAmount)) ++ LockParamsEntry(userAddress, (lockAmount - amount), lockStart)) ++ statsEntries)
426+ let statsEntries = $t01702517183._1
427+ let totalStaked = $t01702517183._2
428+ let totalStakedNew = $t01702517183._3
429+ ((([ScriptTransfer(userAddress, amount, stakedAssetId), HistoryRecordEntry("unstake", userAddress, i.transactionId, stakedAmount, vpEffectiveHeight, stakedAmountNEW, vpEffectiveHeight)] ++ RewardEntries(false, userAddressStr, stakedAmount)) ++ LockParamsEntry(userAddress, stakedAmountNEW, vpEffectiveHeight)) ++ statsEntries)
427430 }
428431 }
429432
430433
431434
432435 @Callable(i)
433436 func deposit () = if ((size(i.payments) != 1))
434437 then throw("exact 1 payment is allowed only")
435438 else {
436439 let pmt = i.payments[0]
437440 let amount = pmt.amount
438441 let pmtAssetId = valueOrElse(pmt.assetId, WAVESID)
439442 let pmtAssetIdStr = toBase58String(pmtAssetId)
440443 let pmtMultX = if ((pmtAssetId == WAVESID))
441444 then MULTX8
442445 else MULTX6
443446 let amountX = toBigInt(amount)
444447 let totalStaked = getIntOrElse(keyLockParamTotalAmount(), 0)
445448 let totalStakedX = toBigInt(totalStaked)
446449 if ((0 > totalStaked))
447450 then throw("TODO: case is not supported")
448451 else if ((totalStaked == 0))
449452 then IncrementNotDistributedRewardEntry(pmtAssetIdStr, amount)
450453 else {
451454 let rewardPerNsbtX18 = fraction(amountX, MULTX18, totalStakedX)
452455 let depositNumLastKEY = keyDepositNumLast()
453456 let depositNumLast = getIntOrElse(depositNumLastKEY, -1)
454457 let depositNumNew = (depositNumLast + 1)
455458 if (!(contains(supportedAssetsStr, pmtAssetIdStr)))
456459 then throw(((supportedAssetsStr + " doesn't contain ") + pmtAssetIdStr))
457460 else {
458461 func refreshRewardPerNsbtSUM (accum,nextAsset) = {
459462 let rewardPerNsbtSumNewKEY = keyRewardPerNsbtSumAt(depositNumNew, nextAsset)
460463 let sumLastStr = getStrOrElse(keyRewardPerNsbtSumAt(depositNumLast, nextAsset), "0")
461464 (accum :+ (if ((nextAsset == pmtAssetIdStr))
462465 then StringEntry(rewardPerNsbtSumNewKEY, toString((parseBigIntValue(sumLastStr) + rewardPerNsbtX18)))
463466 else StringEntry(rewardPerNsbtSumNewKEY, sumLastStr)))
464467 }
465468
466469 ({
467470 let $l = supportedAssetsList
468471 let $s = size($l)
469472 let $acc0 = nil
470473 func $f0_1 ($a,$i) = if (($i >= $s))
471474 then $a
472475 else refreshRewardPerNsbtSUM($a, $l[$i])
473476
474477 func $f0_2 ($a,$i) = if (($i >= $s))
475478 then $a
476479 else throw("List size exceeds 10")
477480
478481 $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)
479482 } :+ IntegerEntry(depositNumLastKEY, depositNumNew))
480483 }
481484 }
482485 }
483486
484487
485488
486489 @Callable(i)
487490 func claimRewards () = commonClaim(i.caller, i)
488491
489492
490493
491494 @Callable(i)
492495 func claimRewardsByOriginCaller () = commonClaim(i.originCaller, i)
493496
494497
495498
496499 @Callable(i)
497500 func unclaimedRewardsREADONLY (userAddressStr) = {
498501 func forEachAssetZeroReward (accum,asset) = ((accum + makeString([asset, "0", "0"], ":")) + "_")
499502
500503 let unclaimedRewardStr = if ((userAddressStr == ""))
501504 then {
502505 let $l = supportedAssetsList
503506 let $s = size($l)
504507 let $acc0 = ""
505508 func $f0_1 ($a,$i) = if (($i >= $s))
506509 then $a
507510 else forEachAssetZeroReward($a, $l[$i])
508511
509512 func $f0_2 ($a,$i) = if (($i >= $s))
510513 then $a
511514 else throw("List size exceeds 10")
512515
513516 $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)
514517 }
515518 else {
516519 let userAddress = addressFromStringValue(userAddressStr)
517- let $t01962019725 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
518- let isNewUser = $t01962019725._1
519- let stakedAmount = $t01962019725._2
520- let stakingStart = $t01962019725._3
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
521524 let stakedAmountX = toBigInt(stakedAmount)
522525 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
523526 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
524527 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
525528 func forEachAssetCalcUnclaimedReward (accum,asset) = {
526- let $t02007120209 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
527- let rewardTotal = $t02007120209._1
528- let cached = $t02007120209._2
529- let dynamic = $t02007120209._3
530- let rewardCachedPartKEY = $t02007120209._4
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
531534 let claimed = valueOrElse(getInteger(keyClaimed(userAddressStr, asset)), 0)
532535 ((accum + makeString([asset, toString(rewardTotal), toString(claimed)], ":")) + "_")
533536 }
534537
535538 let $l = supportedAssetsList
536539 let $s = size($l)
537540 let $acc0 = ""
538541 func $f0_1 ($a,$i) = if (($i >= $s))
539542 then $a
540543 else forEachAssetCalcUnclaimedReward($a, $l[$i])
541544
542545 func $f0_2 ($a,$i) = if (($i >= $s))
543546 then $a
544547 else throw("List size exceeds 10")
545548
546549 $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)
547550 }
548551 $Tuple2(nil, dropRight(unclaimedRewardStr, 1))
549552 }
550553
551554
552555
553556 @Callable(i)
554557 func surfStakingSYSREADONLY (userAddressStrOrEmpty,surfDiff) = {
555558 let surfTotal = getIntOrElse(keyLockParamTotalAmount(), 0)
556559 let gnsbtFromSurfTotal = surfToGnsbt(surfTotal)
557560 if ((userAddressStrOrEmpty == ""))
558561 then $Tuple2(nil, [0, surfTotal, 0, gnsbtFromSurfTotal, 0, height, height])
559562 else {
560563 let userAddress = toAddressOrFail(userAddressStrOrEmpty)
561564 let mergedData = mergeStake(userAddress, surfDiff)
562565 let isNewUser = mergedData._1
563566 let stakedAmount = mergedData._2
564567 let vpEffectiveHeight = mergedData._3
565568 let stakedAmountNEW = mergedData._4
566569 let vpEffectiveHeightNEW = mergedData._5
567570 let surfUser = stakedAmount
568571 let gnsbtFromSurfUser = surfToGnsbt(surfUser)
569572 $Tuple2(nil, [surfUser, surfTotal, gnsbtFromSurfUser, gnsbtFromSurfTotal, vpEffectiveHeight, vpEffectiveHeightNEW])
570573 }
571574 }
572575
573576
574577
575578 @Callable(i)
576579 func configSYSREADONLY () = {
577580 let minLockAmt = getIntegerValue(keyMinLockAmount())
578581 let gnsbtFromSurfCoeff = (60 * MULT6)
579582 let surfVotingPowerRestrictivePeriod = (1440 * 14)
580583 let brToStartSurfTransformation = 1150000
581584 $Tuple2(nil, [minLockAmt, gnsbtFromSurfCoeff, surfVotingPowerRestrictivePeriod, brToStartSurfTransformation])
582585 }
583586
584587

github/deemru/w8io/873ac7e 
85.41 ms