tx · CG7KVqCcnKv6x8HarFkyTrUWRkxG6c1CMjuJ9uw5zoNC

3MyN19SDzDpXyEtabWvag2P5mkeFrdFVd4h:  -0.01900000 Waves

2022.10.14 12:00 [2271812] smart account 3MyN19SDzDpXyEtabWvag2P5mkeFrdFVd4h > SELF 0.00000000 Waves

{ "type": 13, "id": "CG7KVqCcnKv6x8HarFkyTrUWRkxG6c1CMjuJ9uw5zoNC", "fee": 1900000, "feeAssetId": null, "timestamp": 1665738129490, "version": 1, "sender": "3MyN19SDzDpXyEtabWvag2P5mkeFrdFVd4h", "senderPublicKey": "4HqqczFwZHAsxp1oNq8dQkRStfCKBL79X99icQ2B6FYn", "proofs": [ "ciYKCLGoLbiCwYjUGGnajqsese9XWKRndkEJkC8WMCtFg8DFydBb1WDWp4VWhPA9FZSyS266kL5saDg73926bq3" ], "script": "base64:BgIlCAISBQoDAQgIEgASABIDCgEBEgASABIAEgMKAQgSBAoCCAESAEwAC3JldmlzaW9uTnVtAgAACXNlcGFyYXRvcgICX18AA1NFUAICX18ABU1VTFQ2AMCEPQAFTVVMVDgAgMLXLwAGTVVMVFg2CQC2AgEFBU1VTFQ2AAZNVUxUWDgJALYCAQUFTVVMVDgAB01VTFRYMTgJALYCAQCAgJC7utat8A0AGUlkeENvbnRyb2xDZmdOZXV0cmlub0RhcHAAAQAYSWR4Q29udHJvbENmZ0F1Y3Rpb25EYXBwAAIAFElkeENvbnRyb2xDZmdScGREYXBwAAMAFUlkeENvbnRyb2xDZmdNYXRoRGFwcAAEABxJZHhDb250cm9sQ2ZnTGlxdWlkYXRpb25EYXBwAAUAFUlkeENvbnRyb2xDZmdSZXN0RGFwcAAGAB1JZHhDb250cm9sQ2ZnTm9kZVJlZ2lzdHJ5RGFwcAAHABxJZHhDb250cm9sQ2ZnTnNidFN0YWtpbmdEYXBwAAgAGUlkeENvbnRyb2xDZmdNZWRpYXRvckRhcHAACQAcSWR4Q29udHJvbENmZ1N1cmZTdGFraW5nRGFwcAAKACBJZHhDb250cm9sQ2ZnR25zYnRDb250cm9sbGVyRGFwcAALAQ9nZXRTdHJpbmdPckZhaWwCB2FkZHJlc3MDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUHYWRkcmVzcwUDa2V5CQCsAgIJAKwCAgkArAICCQCsAgICCm1hbmRhdG9yeSAJAKUIAQUHYWRkcmVzcwIBLgUDa2V5Ag8gaXMgbm90IGRlZmluZWQBEWtleUNvbnRyb2xBZGRyZXNzAAIcJXMlc19fY29uZmlnX19jb250cm9sQWRkcmVzcwENa2V5Q29udHJvbENmZwACESVzX19jb250cm9sQ29uZmlnARRyZWFkQ29udHJvbENmZ09yRmFpbAEHY29udHJvbAkAtQkCCQEPZ2V0U3RyaW5nT3JGYWlsAgUHY29udHJvbAkBDWtleUNvbnRyb2xDZmcABQNTRVABGGdldENvbnRyYWN0QWRkcmVzc09yRmFpbAIKY29udHJvbENmZwNpZHgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFCmNvbnRyb2xDZmcFA2lkeAkArAICAi1Db250cm9sIGNmZyBkb2Vzbid0IGNvbnRhaW4gYWRkcmVzcyBhdCBpbmRleCAJAKQDAQUDaWR4AA9jb250cm9sQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwkBEWtleUNvbnRyb2xBZGRyZXNzAAIjM1A1QmZkNThQUGZOdkJNMkh5OFFmYmNEcU1lTnR6ZzdLZlAACmNvbnRyb2xDZmcJARRyZWFkQ29udHJvbENmZ09yRmFpbAEFD2NvbnRyb2xDb250cmFjdAAMbWF0aENvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUKY29udHJvbENmZwUVSWR4Q29udHJvbENmZ01hdGhEYXBwABBuZXV0cmlub0NvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUKY29udHJvbENmZwUZSWR4Q29udHJvbENmZ05ldXRyaW5vRGFwcAAPYXVjdGlvbkNvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUKY29udHJvbENmZwUYSWR4Q29udHJvbENmZ0F1Y3Rpb25EYXBwAQxrZXlCb25kQXNzZXQAAg1ib25kX2Fzc2V0X2lkARlrZXlBdWN0aW9uQ29udHJhY3RBZGRyZXNzAAIQYXVjdGlvbl9jb250cmFjdAEQa2V5TWluTG9ja0Ftb3VudAACESVzX19taW5Mb2NrQW1vdW50ARBrZXlTdGFrZWRBc3NldElkAAIRJXNfX3N0YWtlZEFzc2V0SWQBFmtleUxvY2tQYXJhbVVzZXJBbW91bnQBC3VzZXJBZGRyZXNzCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICC3BhcmFtQnlVc2VyCQDMCAIJAKUIAQULdXNlckFkZHJlc3MJAMwIAgIGYW1vdW50BQNuaWwFCXNlcGFyYXRvcgEWa2V5TG9ja1BhcmFtU3RhcnRCbG9jawELdXNlckFkZHJlc3MJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgILcGFyYW1CeVVzZXIJAMwIAgkApQgBBQt1c2VyQWRkcmVzcwkAzAgCAgVzdGFydAUDbmlsBQlzZXBhcmF0b3IBJmtleUxvY2tQYXJhbVZvdGluZ1Bvd2VyRWZmZWN0aXZlSGVpZ2h0AQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgtwYXJhbUJ5VXNlcgkAzAgCCQClCAEFC3VzZXJBZGRyZXNzCQDMCAICEXZwRWZmZWN0aXZlSGVpZ2h0BQNuaWwFCXNlcGFyYXRvcgEQa2V5SGlzdG9yeVJlY29yZAMEdHlwZQt1c2VyQWRkcmVzcwR0eElkCQC5CQIJAMwIAgIIJXMlcyVzJXMJAMwIAgIHaGlzdG9yeQkAzAgCBQR0eXBlCQDMCAIJAKUIAQULdXNlckFkZHJlc3MJAMwIAgkA2AQBBQR0eElkBQNuaWwFCXNlcGFyYXRvcgEXa2V5TG9ja1BhcmFtVG90YWxBbW91bnQACQC5CQIJAMwIAgIEJXMlcwkAzAgCAgVzdGF0cwkAzAgCAhFhY3RpdmVUb3RhbExvY2tlZAUDbmlsBQlzZXBhcmF0b3IBEmtleVN0YXRzTG9ja3NDb3VudAAJALkJAgkAzAgCAgQlcyVzCQDMCAICBXN0YXRzCQDMCAICCmxvY2tzQ291bnQFA25pbAUJc2VwYXJhdG9yARJrZXlTdGF0c1VzZXJzQ291bnQACQC5CQIJAMwIAgIEJXMlcwkAzAgCAgVzdGF0cwkAzAgCAhBhY3RpdmVVc2Vyc0NvdW50BQNuaWwFCXNlcGFyYXRvcgENa2V5TmV4dFBlcmlvZAACDiVzX19uZXh0UGVyaW9kARhrZXlTdXBwb3J0ZWRSZXdhcmRBc3NldHMAAhVzdXBwb3J0ZWRSZXdhcmRBc3NldHMBEWtleURlcG9zaXROdW1MYXN0AAkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgNkZXAJAMwIAgIHbGFzdE51bQUDbmlsBQlzZXBhcmF0b3IBG2tleVVzZXJSZXdhcmRGcm9tRGVwb3NpdE51bQELdXNlckFkZHJlc3MJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIRdXNlclJ3ZEZyb21EZXBOdW0JAMwIAgULdXNlckFkZHJlc3MFA25pbAUJc2VwYXJhdG9yARVrZXlSZXdhcmRQZXJOc2J0U3VtQXQCCmRlcG9zaXROdW0DdGtuCQC5CQIJAMwIAgIEJXMlZAkAzAgCAhVyd2RQZXJOc2J0U3VtQnlEZXBOdW0JAMwIAgkApAMBBQpkZXBvc2l0TnVtCQDMCAIFA3RrbgUDbmlsBQlzZXBhcmF0b3IBCWtleVJld2FyZAILdXNlckFkZHJlc3MDdGtuCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICA3J3ZAkAzAgCBQt1c2VyQWRkcmVzcwkAzAgCBQN0a24FA25pbAUJc2VwYXJhdG9yAQprZXlDbGFpbWVkAgt1c2VyQWRkcmVzcwN0a24JALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIDY2xtCQDMCAIFC3VzZXJBZGRyZXNzCQDMCAIFA3RrbgUDbmlsBQlzZXBhcmF0b3IBF2tleU5vdERpc3RyaWJ1dGVkUmV3YXJkAQN0a24JALkJAgkAzAgCAgQlcyVzCQDMCAICDm5vdERpc3RyaWJ1dGVkCQDMCAIFA3RrbgUDbmlsBQlzZXBhcmF0b3IBBXRvWDE4AgdvcmlnVmFsCG9yaWdNdWx0CQC8AgMJALYCAQUHb3JpZ1ZhbAUHTVVMVFgxOAUIb3JpZ011bHQBDGdldEludE9yWmVybwEDa2V5CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQAAAQxnZXRJbnRPckVsc2UCA2tleQpkZWZhdWx0VmFsCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQUKZGVmYXVsdFZhbAEMZ2V0SW50T3JGYWlsAQNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzBQNrZXkJAKwCAgkArAICAg9NYW5kYXRvcnkgdGhpcy4FA2tleQIPIGlzIG5vdCBkZWZpbmVkAQxnZXRTdHJPckVsc2UCA2tleQpkZWZhdWx0VmFsCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFA2tleQUKZGVmYXVsdFZhbAEPdG9BZGRyZXNzT3JGYWlsAQphZGRyZXNzU3RyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQUKYWRkcmVzc1N0cgkArAICAiFjb3VsZG4ndCBwYXJzZSBwYXNzZWQgYWRkcmVzc1N0cj0FCmFkZHJlc3NTdHIBC3RvQXNzZXRWZWN0AQhhc3NldFN0cgkA2QQBBQhhc3NldFN0cgEFYXNJbnQBA3ZhbAQHJG1hdGNoMAUDdmFsAwkAAQIFByRtYXRjaDACA0ludAQGdmFsSW50BQckbWF0Y2gwBQZ2YWxJbnQJAAIBAhVmYWlsIHRvIGNhc3QgaW50byBJbnQBEmFzU3dhcFBhcmFtc1NUUlVDVAEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAiMoSW50LCBJbnQsIEludCwgSW50LCBJbnQsIEludCwgSW50KQQGc3RydWN0BQckbWF0Y2gwBQZzdHJ1Y3QJAAIBAhVmYWlsIHRvIGNhc3QgaW50byBJbnQBE2Zvcm1hdEhpc3RvcnlSZWNvcmQECW9sZEFtb3VudAhvbGRTdGFydAluZXdBbW91bnQIbmV3U3RhcnQJALkJAgkAzAgCAgwlZCVkJWQlZCVkJWQJAMwIAgkApAMBCAUJbGFzdEJsb2NrBmhlaWdodAkAzAgCCQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAKQDAQUJb2xkQW1vdW50CQDMCAIJAKQDAQUIb2xkU3RhcnQJAMwIAgkApAMBBQluZXdBbW91bnQJAMwIAgkApAMBBQhuZXdTdGFydAUDbmlsBQlzZXBhcmF0b3IBGGZvcm1hdENsYWltSGlzdG9yeVJlY29yZAIEdXNlcg5jbGFpbWVkUmV3YXJkcwkAuQkCCQDMCAICCCVzJWQlZCVzCQDMCAIFBHVzZXIJAMwIAgkApAMBCAUJbGFzdEJsb2NrBmhlaWdodAkAzAgCCQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIFDmNsYWltZWRSZXdhcmRzBQNuaWwFCXNlcGFyYXRvcgESSGlzdG9yeVJlY29yZEVudHJ5BwR0eXBlC3VzZXJBZGRyZXNzBHR4SWQJb2xkQW1vdW50CG9sZFN0YXJ0CW5ld0Ftb3VudAhuZXdTdGFydAkBC1N0cmluZ0VudHJ5AgkBEGtleUhpc3RvcnlSZWNvcmQDBQR0eXBlBQt1c2VyQWRkcmVzcwUEdHhJZAkBE2Zvcm1hdEhpc3RvcnlSZWNvcmQEBQlvbGRBbW91bnQFCG9sZFN0YXJ0BQluZXdBbW91bnQFCG5ld1N0YXJ0ARFDbGFpbUhpc3RvcnlFbnRyeQMLdXNlckFkZHJlc3MEdHhJZA5jbGFpbWVkUmV3YXJkcwkBC1N0cmluZ0VudHJ5AgkBEGtleUhpc3RvcnlSZWNvcmQDAgVjbGFpbQULdXNlckFkZHJlc3MFBHR4SWQJARhmb3JtYXRDbGFpbUhpc3RvcnlSZWNvcmQCCQClCAEFC3VzZXJBZGRyZXNzBQ5jbGFpbWVkUmV3YXJkcwELU3RhdHNSZXN1bHQDDnRvdGFsTG9ja2VkSW5jDGxvY2tDb3VudEluYw11c2Vyc0NvdW50SW5jBApsb2Nrc0NvdW50CQEMZ2V0SW50T3JaZXJvAQkBEmtleVN0YXRzTG9ja3NDb3VudAAECnVzZXJzQ291bnQJAQxnZXRJbnRPclplcm8BCQESa2V5U3RhdHNVc2Vyc0NvdW50AAQLdG90YWxBbW91bnQJAQxnZXRJbnRPclplcm8BCQEXa2V5TG9ja1BhcmFtVG90YWxBbW91bnQABA50b3RhbEFtb3VudE5ldwkAZAIFC3RvdGFsQW1vdW50BQ50b3RhbExvY2tlZEluYwkAlQoDCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQESa2V5U3RhdHNMb2Nrc0NvdW50AAkAZAIFCmxvY2tzQ291bnQFDGxvY2tDb3VudEluYwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEmtleVN0YXRzVXNlcnNDb3VudAAJAGQCBQp1c2Vyc0NvdW50BQ11c2Vyc0NvdW50SW5jCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEXa2V5TG9ja1BhcmFtVG90YWxBbW91bnQABQ50b3RhbEFtb3VudE5ldwUDbmlsBQt0b3RhbEFtb3VudAUOdG90YWxBbW91bnROZXcBD0xvY2tQYXJhbXNFbnRyeQMLdXNlckFkZHJlc3MGYW1vdW50GnZvdGluZ1Bvd2VyRWZmZWN0aXZlSGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEWa2V5TG9ja1BhcmFtVXNlckFtb3VudAEFC3VzZXJBZGRyZXNzBQZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlMb2NrUGFyYW1TdGFydEJsb2NrAQULdXNlckFkZHJlc3MFGnZvdGluZ1Bvd2VyRWZmZWN0aXZlSGVpZ2h0BQNuaWwBD2dldFBhcmFtc09yRmFpbAAJAJQKAgkA2QQBCQEPZ2V0U3RyaW5nT3JGYWlsAgUEdGhpcwkBEGtleVN0YWtlZEFzc2V0SWQACQEMZ2V0SW50T3JGYWlsAQkBEGtleU1pbkxvY2tBbW91bnQAAQxpc0FjdGl2ZVVzZXIBC3VzZXJBZGRyZXNzCQBmAgkBDGdldEludE9yRWxzZQIJARZrZXlMb2NrUGFyYW1Vc2VyQW1vdW50AQULdXNlckFkZHJlc3MAAAAAARNnZXRVc2VyUGFyYW1zT3JVbml0AQt1c2VyQWRkcmVzcwMJAQxpc0FjdGl2ZVVzZXIBBQt1c2VyQWRkcmVzcwkAlQoDBwkBDGdldEludE9yRmFpbAEJARZrZXlMb2NrUGFyYW1Vc2VyQW1vdW50AQULdXNlckFkZHJlc3MJAQxnZXRJbnRPckZhaWwBCQEWa2V5TG9ja1BhcmFtU3RhcnRCbG9jawEFC3VzZXJBZGRyZXNzBQR1bml0ARNnZXRVc2VyUGFyYW1zT3JGYWlsAQt1c2VyQWRkcmVzcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQETZ2V0VXNlclBhcmFtc09yVW5pdAEFC3VzZXJBZGRyZXNzCQCsAgIJAKwCAgIFVXNlciAJAKUIAQULdXNlckFkZHJlc3MCDyBpcyBub3QgZGVmaW5lZAASc3VwcG9ydGVkQXNzZXRzU3RyCQEMZ2V0U3RyT3JFbHNlAgkBGGtleVN1cHBvcnRlZFJld2FyZEFzc2V0cwACAAATc3VwcG9ydGVkQXNzZXRzTGlzdAkAtQkCBRJzdXBwb3J0ZWRBc3NldHNTdHICAV8BCmNhbGNSZXdhcmQFC3VzZXJBZGRyZXNzB2Fzc2V0SWQNc3Rha2VkQW1vdW50WA5kZXBvc2l0TnVtVXNlcg5kZXBvc2l0TnVtTGFzdAQXcmV3YXJkUGVyTnNidFN1bUxhc3RLRVkJARVrZXlSZXdhcmRQZXJOc2J0U3VtQXQCBQ5kZXBvc2l0TnVtTGFzdAUHYXNzZXRJZAQKc3VtTGFzdFgxOAkApwMBCQEMZ2V0U3RyT3JFbHNlAgkBFWtleVJld2FyZFBlck5zYnRTdW1BdAIFDmRlcG9zaXROdW1MYXN0BQdhc3NldElkAgEwBApzdW1Vc2VyWDE4CQCnAwEJAQxnZXRTdHJPckVsc2UCCQEVa2V5UmV3YXJkUGVyTnNidFN1bUF0AgUOZGVwb3NpdE51bVVzZXIFB2Fzc2V0SWQCATAEEXJld2FyZER5bmFtaWNQYXJ0CQCgAwEJALwCAwkAuAICBQpzdW1MYXN0WDE4BQpzdW1Vc2VyWDE4BQ1zdGFrZWRBbW91bnRYBQdNVUxUWDE4BBNyZXdhcmRDYWNoZWRQYXJ0S0VZCQEJa2V5UmV3YXJkAgULdXNlckFkZHJlc3MFB2Fzc2V0SWQEEHJld2FyZENhY2hlZFBhcnQJAQxnZXRJbnRPckVsc2UCBRNyZXdhcmRDYWNoZWRQYXJ0S0VZAAAJAJYKBAkAZAIFEHJld2FyZENhY2hlZFBhcnQFEXJld2FyZER5bmFtaWNQYXJ0BRByZXdhcmRDYWNoZWRQYXJ0BRFyZXdhcmREeW5hbWljUGFydAUTcmV3YXJkQ2FjaGVkUGFydEtFWQENUmV3YXJkRW50cmllcwMJaXNOZXdVc2VyC3VzZXJBZGRyZXNzDHN0YWtlZEFtb3VudAQNc3Rha2VkQW1vdW50WAkAtgIBBQxzdGFrZWRBbW91bnQEG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQkBG2tleVVzZXJSZXdhcmRGcm9tRGVwb3NpdE51bQEFC3VzZXJBZGRyZXNzBA5kZXBvc2l0TnVtVXNlcgkBDGdldEludE9yRWxzZQIFG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQD///////////8BBA5kZXBvc2l0TnVtTGFzdAkBDGdldEludE9yRWxzZQIJARFrZXlEZXBvc2l0TnVtTGFzdAAA////////////AQoBG2ZvckVhY2hBc3NldENhY2hlVXNlclJld2FyZAIFYWNjdW0FYXNzZXQECyR0MDg3MDg4ODQzCQEKY2FsY1Jld2FyZAUFC3VzZXJBZGRyZXNzBQVhc3NldAUNc3Rha2VkQW1vdW50WAUOZGVwb3NpdE51bVVzZXIFDmRlcG9zaXROdW1MYXN0BAtyZXdhcmRUb3RhbAgFCyR0MDg3MDg4ODQzAl8xBAZjYWNoZWQIBQskdDA4NzA4ODg0MwJfMgQHZHluYW1pYwgFCyR0MDg3MDg4ODQzAl8zBBNyZXdhcmRDYWNoZWRQYXJ0S0VZCAULJHQwODcwODg4NDMCXzQJAM0IAgUFYWNjdW0JAQxJbnRlZ2VyRW50cnkCBRNyZXdhcmRDYWNoZWRQYXJ0S0VZBQtyZXdhcmRUb3RhbAMDCQAAAgUOZGVwb3NpdE51bUxhc3QA////////////AQkAAAIFDmRlcG9zaXROdW1Vc2VyAP///////////wEHBQNuaWwDAwkAAAIFDmRlcG9zaXROdW1MYXN0AP///////////wEJAGYCBQ5kZXBvc2l0TnVtVXNlcgD///////////8BBwkAAgECL2ludmFsaWQgZGVwb3NpdE51bUxhc3QgYW5kIGRlcG9zaXROdW1Vc2VyIHN0YXRlAwMJAGYCBQ5kZXBvc2l0TnVtTGFzdAD///////////8BCQBnAgUOZGVwb3NpdE51bVVzZXIA////////////AQcDBQlpc05ld1VzZXIJAMwIAgkBDEludGVnZXJFbnRyeQIFG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQUOZGVwb3NpdE51bUxhc3QFA25pbAkAzQgCCgACJGwFE3N1cHBvcnRlZEFzc2V0c0xpc3QKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBG2ZvckVhY2hBc3NldENhY2hlVXNlclJld2FyZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgkBDEludGVnZXJFbnRyeQIFG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQUOZGVwb3NpdE51bUxhc3QJAAIBCQCsAgIJAKwCAgkArAICAiR1bmNvdmVyZWQgY29uZGl0aW9uOiBkZXBvc2l0TnVtTGFzdD0JAKQDAQUOZGVwb3NpdE51bUxhc3QCECBkZXBvc2l0TnVtVXNlcj0JAKQDAQUOZGVwb3NpdE51bVVzZXIBIkluY3JlbWVudE5vdERpc3RyaWJ1dGVkUmV3YXJkRW50cnkCA3RrbglhbW91bnRJbmMEF25vdERpc3RyaWJ1dGVkUmV3YXJkS0VZCQEXa2V5Tm90RGlzdHJpYnV0ZWRSZXdhcmQBBQN0a24EFG5vdERpc3RyaWJ1dGVkUmV3YXJkCQEMZ2V0SW50T3JFbHNlAgUXbm90RGlzdHJpYnV0ZWRSZXdhcmRLRVkAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgUXbm90RGlzdHJpYnV0ZWRSZXdhcmRLRVkJAGQCBRRub3REaXN0cmlidXRlZFJld2FyZAUJYW1vdW50SW5jBQNuaWwBH21lcmdlVm90aW5nUG93ZXJFZmZlY3RpdmVIZWlnaHQEEHF1YXJhbnRpbmVQZXJpb2QRdnBFZmZlY3RpdmVIZWlnaHQJc3Rha2VkQW10DHN0YWtlZEFtdE5FVwQPcmVtYWluaW5nVG9XYWl0CQBlAgURdnBFZmZlY3RpdmVIZWlnaHQFBmhlaWdodAMJAGcCAAAFD3JlbWFpbmluZ1RvV2FpdAkAZAIFBmhlaWdodAUQcXVhcmFudGluZVBlcmlvZAQNYWxyZWFkeVdhaXRlZAkAZQIFEHF1YXJhbnRpbmVQZXJpb2QFD3JlbWFpbmluZ1RvV2FpdAQDa1g4AwkBAiE9AgUMc3Rha2VkQW10TkVXAAAJAGsDBQlzdGFrZWRBbXQFBU1VTFQ4BQxzdGFrZWRBbXRORVcFEXZwRWZmZWN0aXZlSGVpZ2h0CQBlAgkAZAIFEHF1YXJhbnRpbmVQZXJpb2QFBmhlaWdodAkAawMFDWFscmVhZHlXYWl0ZWQFA2tYOAUFTVVMVDgBCm1lcmdlU3Rha2UCC3VzZXJBZGRyZXNzC2Ftb3VudFRvQWRkBA0kdDAxMDY1ODEwNzY4CQELdmFsdWVPckVsc2UCCQETZ2V0VXNlclBhcmFtc09yVW5pdAEFC3VzZXJBZGRyZXNzCQCVCgMGAAAAAAQJaXNOZXdVc2VyCAUNJHQwMTA2NTgxMDc2OAJfMQQMc3Rha2VkQW1vdW50CAUNJHQwMTA2NTgxMDc2OAJfMgQRdnBFZmZlY3RpdmVIZWlnaHQIBQ0kdDAxMDY1ODEwNzY4Al8zBA9zdGFrZWRBbW91bnRORVcDBQlpc05ld1VzZXIFC2Ftb3VudFRvQWRkCQBkAgULYW1vdW50VG9BZGQFDHN0YWtlZEFtb3VudAQQcXVhcmFudGluZVBlcmlvZAkAaAIAoAsADgQUdnBFZmZlY3RpdmVIZWlnaHRORVcDBQlpc05ld1VzZXIJAGQCBRBxdWFyYW50aW5lUGVyaW9kBQZoZWlnaHQJAR9tZXJnZVZvdGluZ1Bvd2VyRWZmZWN0aXZlSGVpZ2h0BAUQcXVhcmFudGluZVBlcmlvZAURdnBFZmZlY3RpdmVIZWlnaHQFDHN0YWtlZEFtb3VudAUPc3Rha2VkQW1vdW50TkVXCQCXCgUFCWlzTmV3VXNlcgUMc3Rha2VkQW1vdW50BRF2cEVmZmVjdGl2ZUhlaWdodAUPc3Rha2VkQW1vdW50TkVXBRR2cEVmZmVjdGl2ZUhlaWdodE5FVwELY29tbW9uU3Rha2UCC3VzZXJBZGRyZXNzAWkEDSR0MDExMjU0MTEzMDgJAQ9nZXRQYXJhbXNPckZhaWwABA1zdGFrZWRBc3NldElkCAUNJHQwMTEyNTQxMTMwOAJfMQQNbWluTG9ja0Ftb3VudAgFDSR0MDExMjU0MTEzMDgCXzIDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAhVJbnZhbGlkIHBheW1lbnRzIHNpemUEB3BheW1lbnQJAJEDAggFAWkIcGF5bWVudHMAAAQGYW1vdW50CAUHcGF5bWVudAZhbW91bnQEE2ludmFsaWRBc3NldE1lc3NhZ2UJAKwCAgkArAICAg9JbnZhbGlkIGFzc2V0LiAJANgEAQUNc3Rha2VkQXNzZXRJZAIMIGlzIGV4cGVjdGVkBAdhc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIIBQdwYXltZW50B2Fzc2V0SWQFE2ludmFsaWRBc3NldE1lc3NhZ2UDCQECIT0CBQdhc3NldElkBQ1zdGFrZWRBc3NldElkCQACAQUTaW52YWxpZEFzc2V0TWVzc2FnZQQOdXNlckFkZHJlc3NTdHIJAKUIAQULdXNlckFkZHJlc3MECm1lcmdlZERhdGEJAQptZXJnZVN0YWtlAgULdXNlckFkZHJlc3MFBmFtb3VudAQJaXNOZXdVc2VyCAUKbWVyZ2VkRGF0YQJfMQQMc3Rha2VkQW1vdW50CAUKbWVyZ2VkRGF0YQJfMgQRdnBFZmZlY3RpdmVIZWlnaHQIBQptZXJnZWREYXRhAl8zBA9zdGFrZWRBbW91bnRORVcIBQptZXJnZWREYXRhAl80BBR2cEVmZmVjdGl2ZUhlaWdodE5FVwgFCm1lcmdlZERhdGECXzUDCQBmAgUNbWluTG9ja0Ftb3VudAUPc3Rha2VkQW1vdW50TkVXCQACAQkArAICAhNNaW4gbG9jayBhbW91bnQgaXMgCQCkAwEFDW1pbkxvY2tBbW91bnQEDSR0MDEyMTA3MTIyMDkJAQtTdGF0c1Jlc3VsdAMFBmFtb3VudAABAwUJaXNOZXdVc2VyAAEAAAQMc3RhdHNFbnRyaWVzCAUNJHQwMTIxMDcxMjIwOQJfMQQLdG90YWxTdGFrZWQIBQ0kdDAxMjEwNzEyMjA5Al8yBA50b3RhbFN0YWtlZE5ldwgFDSR0MDEyMTA3MTIyMDkCXzMJAM4IAgkAzggCCQDOCAIJAMwIAgkBEkhpc3RvcnlSZWNvcmRFbnRyeQcCBXN0YWtlBQt1c2VyQWRkcmVzcwgFAWkNdHJhbnNhY3Rpb25JZAUMc3Rha2VkQW1vdW50BRF2cEVmZmVjdGl2ZUhlaWdodAUPc3Rha2VkQW1vdW50TkVXBRR2cEVmZmVjdGl2ZUhlaWdodE5FVwUDbmlsCQENUmV3YXJkRW50cmllcwMFCWlzTmV3VXNlcgUOdXNlckFkZHJlc3NTdHIFDHN0YWtlZEFtb3VudAkBD0xvY2tQYXJhbXNFbnRyeQMFC3VzZXJBZGRyZXNzBQ9zdGFrZWRBbW91bnRORVcFFHZwRWZmZWN0aXZlSGVpZ2h0TkVXBQxzdGF0c0VudHJpZXMBC2NvbW1vbkNsYWltAgt1c2VyQWRkcmVzcwFpBA51c2VyQWRkcmVzc1N0cgkApQgBBQt1c2VyQWRkcmVzcwMJAGYCCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhlwYXltZW50cyBhcmUgbm90IGFjY2VwdGVkBA0kdDAxMjY4ODEyNzkzCQELdmFsdWVPckVsc2UCCQETZ2V0VXNlclBhcmFtc09yVW5pdAEFC3VzZXJBZGRyZXNzCQCVCgMGAAAAAAQJaXNOZXdVc2VyCAUNJHQwMTI2ODgxMjc5MwJfMQQMc3Rha2VkQW1vdW50CAUNJHQwMTI2ODgxMjc5MwJfMgQMc3Rha2luZ1N0YXJ0CAUNJHQwMTI2ODgxMjc5MwJfMwQNc3Rha2VkQW1vdW50WAkAtgIBBQxzdGFrZWRBbW91bnQEG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQkBG2tleVVzZXJSZXdhcmRGcm9tRGVwb3NpdE51bQEFDnVzZXJBZGRyZXNzU3RyBA5kZXBvc2l0TnVtVXNlcgkBDGdldEludE9yRWxzZQIFG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQD///////////8BBA5kZXBvc2l0TnVtTGFzdAkBDGdldEludE9yRWxzZQIJARFrZXlEZXBvc2l0TnVtTGFzdAAA////////////AQoBH2ZvckVhY2hBc3NldENhbGNVbmNsYWltZWRSZXdhcmQCBWFjY3VtBWFzc2V0BA0kdDAxMzE2NDEzMzAyCQEKY2FsY1Jld2FyZAUFDnVzZXJBZGRyZXNzU3RyBQVhc3NldAUNc3Rha2VkQW1vdW50WAUOZGVwb3NpdE51bVVzZXIFDmRlcG9zaXROdW1MYXN0BAtyZXdhcmRUb3RhbAgFDSR0MDEzMTY0MTMzMDICXzEEBmNhY2hlZAgFDSR0MDEzMTY0MTMzMDICXzIEB2R5bmFtaWMIBQ0kdDAxMzE2NDEzMzAyAl8zBBNyZXdhcmRDYWNoZWRQYXJ0S0VZCAUNJHQwMTMxNjQxMzMwMgJfNAQKY2xhaW1lZEtFWQkBCmtleUNsYWltZWQCBQ51c2VyQWRkcmVzc1N0cgUFYXNzZXQEDSR0MDEzMzYyMTMzOTkFBWFjY3VtBARkYXRhCAUNJHQwMTMzNjIxMzM5OQJfMQQRY2xhaW1lZEFtdEJ5QXNzZXQIBQ0kdDAxMzM2MjEzMzk5Al8yBAduZXdQYXJ0CQC5CQIJAMwIAgUFYXNzZXQJAMwIAgkApAMBBQtyZXdhcmRUb3RhbAUDbmlsAgE6BBRjbGFpbWVkQW10QnlBc3NldE5ldwkAuQkCCQDMCAIFEWNsYWltZWRBbXRCeUFzc2V0CQDMCAIFB25ld1BhcnQFA25pbAIBXwMJAGcCAAAFC3Jld2FyZFRvdGFsCQCUCgIFBGRhdGEFFGNsYWltZWRBbXRCeUFzc2V0TmV3CQCUCgIJAM0IAgkAzQgCCQDNCAIFBGRhdGEJAQ5TY3JpcHRUcmFuc2ZlcgMFC3VzZXJBZGRyZXNzBQtyZXdhcmRUb3RhbAkBC3RvQXNzZXRWZWN0AQUFYXNzZXQJAQxJbnRlZ2VyRW50cnkCBQpjbGFpbWVkS0VZCQBkAgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQpjbGFpbWVkS0VZAAAFC3Jld2FyZFRvdGFsCQEMSW50ZWdlckVudHJ5AgUTcmV3YXJkQ2FjaGVkUGFydEtFWQAABRRjbGFpbWVkQW10QnlBc3NldE5ldwQNJHQwMTM4NTkxMzk3MwoAAiRsBRNzdXBwb3J0ZWRBc3NldHNMaXN0CgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwCAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEfZm9yRWFjaEFzc2V0Q2FsY1VuY2xhaW1lZFJld2FyZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQJdHJhbnNmZXJzCAUNJHQwMTM4NTkxMzk3MwJfMQQXY2xhaW1lZEFtdEJ5QXNzZXRSZXN1bHQIBQ0kdDAxMzg1OTEzOTczAl8yAwkAZwIAAAkAkAMBBQl0cmFuc2ZlcnMFA25pbAkAzQgCCQDNCAIFCXRyYW5zZmVycwkBDEludGVnZXJFbnRyeQIFG3VzZXJSZXdhcmRGcm9tRGVwb3NpdE51bUtFWQUOZGVwb3NpdE51bUxhc3QJARFDbGFpbUhpc3RvcnlFbnRyeQMFC3VzZXJBZGRyZXNzCAUBaQ10cmFuc2FjdGlvbklkCQCwAgIFF2NsYWltZWRBbXRCeUFzc2V0UmVzdWx0AAEKAWkBC2NvbnN0cnVjdG9yAw1taW5Mb2NrQW1vdW50FXN1cHBvcnRlZFJld2FyZEFzc2V0cw1zdGFrZWRBc3NldElkAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIRUGVybWlzc2lvbiBkZW5pZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJARBrZXlNaW5Mb2NrQW1vdW50AAUNbWluTG9ja0Ftb3VudAkAzAgCCQELU3RyaW5nRW50cnkCCQEYa2V5U3VwcG9ydGVkUmV3YXJkQXNzZXRzAAUVc3VwcG9ydGVkUmV3YXJkQXNzZXRzCQDMCAIJAQtTdHJpbmdFbnRyeQIJARBrZXlTdGFrZWRBc3NldElkAAUNc3Rha2VkQXNzZXRJZAUDbmlsAWkBBXN0YWtlAAkBC2NvbW1vblN0YWtlAggFAWkGY2FsbGVyBQFpAWkBE3N0YWtlQnlPcmlnaW5DYWxsZXIACQELY29tbW9uU3Rha2UCCAUBaQxvcmlnaW5DYWxsZXIFAWkBaQEHdW5zdGFrZQEGYW1vdW50AwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIjdW5zdGFrZSBkb2Vzbid0IHJlcXVpcmUgYW55IHBheW1lbnQEC3VzZXJBZGRyZXNzCAUBaQZjYWxsZXIEDnVzZXJBZGRyZXNzU3RyCQClCAEFC3VzZXJBZGRyZXNzBA0kdDAxNDg4MjE0OTM2CQEPZ2V0UGFyYW1zT3JGYWlsAAQNc3Rha2VkQXNzZXRJZAgFDSR0MDE0ODgyMTQ5MzYCXzEEDW1pbkxvY2tBbW91bnQIBQ0kdDAxNDg4MjE0OTM2Al8yBA0kdDAxNDkzOTE1MDIzCQETZ2V0VXNlclBhcmFtc09yRmFpbAEFC3VzZXJBZGRyZXNzBAlpc05ld1VzZXIIBQ0kdDAxNDkzOTE1MDIzAl8xBAxzdGFrZWRBbW91bnQIBQ0kdDAxNDkzOTE1MDIzAl8yBBF2cEVmZmVjdGl2ZUhlaWdodAgFDSR0MDE0OTM5MTUwMjMCXzMEEHN3YXBQYXJhbXNTVFJVQ1QJARJhc1N3YXBQYXJhbXNTVFJVQ1QBCQD9BwQFEG5ldXRyaW5vQ29udHJhY3QCG3N3YXBQYXJhbXNCeVVzZXJTWVNSRUFET05MWQkAzAgCBQ51c2VyQWRkcmVzc1N0cgkAzAgCAAAFA25pbAUDbmlsBBRzd2FwTGltaXRTcGVudEluVXNkbggFEHN3YXBQYXJhbXNTVFJVQ1QCXzIEDmJsY2tzMkxtdFJlc2V0CAUQc3dhcFBhcmFtc1NUUlVDVAJfMwMJAGYCBRRzd2FwTGltaXRTcGVudEluVXNkbgAACQACAQkArAICCQCsAgICLVlvdSBoYXZlIGFscmVhZHkgbWFkZSBhIHN3YXAgb3BlcmF0aW9uLiBXYWl0IAkApAMBCQBkAgUGaGVpZ2h0BQ5ibGNrczJMbXRSZXNldAISIGhlaWdodCB0byB1bnN0YWtlAwkAZwIAAAUMc3Rha2VkQW1vdW50CQACAQISTm90aGluZyB0byB1bnN0YWtlAwkAZgIFBmFtb3VudAUMc3Rha2VkQW1vdW50CQACAQkArAICCQCsAgIJAKwCAgIKUmVxdWVzdGVkIAkApAMBBQZhbW91bnQCEiwgYnV0IHN0YWtlZCBvbmx5IAkApAMBBQxzdGFrZWRBbW91bnQED3N0YWtlZEFtb3VudE5FVwkAZQIFDHN0YWtlZEFtb3VudAUGYW1vdW50BA0kdDAxNTY2MTE1ODE5CQELU3RhdHNSZXN1bHQDCQEBLQEFBmFtb3VudAMJAAACBQZhbW91bnQFDHN0YWtlZEFtb3VudAD///////////8BAAADCQAAAgUGYW1vdW50BQxzdGFrZWRBbW91bnQA////////////AQAABAxzdGF0c0VudHJpZXMIBQ0kdDAxNTY2MTE1ODE5Al8xBAt0b3RhbFN0YWtlZAgFDSR0MDE1NjYxMTU4MTkCXzIEDnRvdGFsU3Rha2VkTmV3CAUNJHQwMTU2NjExNTgxOQJfMwkAzggCCQDOCAIJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQt1c2VyQWRkcmVzcwUGYW1vdW50BQ1zdGFrZWRBc3NldElkCQDMCAIJARJIaXN0b3J5UmVjb3JkRW50cnkHAgd1bnN0YWtlBQt1c2VyQWRkcmVzcwgFAWkNdHJhbnNhY3Rpb25JZAUMc3Rha2VkQW1vdW50BRF2cEVmZmVjdGl2ZUhlaWdodAUPc3Rha2VkQW1vdW50TkVXBRF2cEVmZmVjdGl2ZUhlaWdodAUDbmlsCQENUmV3YXJkRW50cmllcwMHBQ51c2VyQWRkcmVzc1N0cgUMc3Rha2VkQW1vdW50CQEPTG9ja1BhcmFtc0VudHJ5AwULdXNlckFkZHJlc3MFD3N0YWtlZEFtb3VudE5FVwURdnBFZmZlY3RpdmVIZWlnaHQFDHN0YXRzRW50cmllcwFpAQdkZXBvc2l0AAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECH2V4YWN0IDEgcGF5bWVudCBpcyBhbGxvd2VkIG9ubHkEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABAZhbW91bnQIBQNwbXQGYW1vdW50BApwbXRBc3NldElkCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQEDXBtdEFzc2V0SWRTdHIJANgEAQUKcG10QXNzZXRJZAQIcG10TXVsdFgFBk1VTFRYNgQHYW1vdW50WAkAtgIBBQZhbW91bnQEC3RvdGFsU3Rha2VkCQEMZ2V0SW50T3JFbHNlAgkBF2tleUxvY2tQYXJhbVRvdGFsQW1vdW50AAAABAx0b3RhbFN0YWtlZFgJALYCAQULdG90YWxTdGFrZWQDCQBmAgAABQt0b3RhbFN0YWtlZAkAAgECG1RPRE86IGNhc2UgaXMgbm90IHN1cHBvcnRlZAMJAAACBQt0b3RhbFN0YWtlZAAACQEiSW5jcmVtZW50Tm90RGlzdHJpYnV0ZWRSZXdhcmRFbnRyeQIFDXBtdEFzc2V0SWRTdHIFBmFtb3VudAQQcmV3YXJkUGVyTnNidFgxOAkAvAIDBQdhbW91bnRYBQdNVUxUWDE4BQx0b3RhbFN0YWtlZFgEEWRlcG9zaXROdW1MYXN0S0VZCQERa2V5RGVwb3NpdE51bUxhc3QABA5kZXBvc2l0TnVtTGFzdAkBDGdldEludE9yRWxzZQIFEWRlcG9zaXROdW1MYXN0S0VZAP///////////wEEDWRlcG9zaXROdW1OZXcJAGQCBQ5kZXBvc2l0TnVtTGFzdAABAwkBASEBCQEIY29udGFpbnMCBRJzdXBwb3J0ZWRBc3NldHNTdHIFDXBtdEFzc2V0SWRTdHIJAAIBCQCsAgIJAKwCAgUSc3VwcG9ydGVkQXNzZXRzU3RyAhEgZG9lc24ndCBjb250YWluIAUNcG10QXNzZXRJZFN0cgoBF3JlZnJlc2hSZXdhcmRQZXJOc2J0U1VNAgVhY2N1bQluZXh0QXNzZXQEFnJld2FyZFBlck5zYnRTdW1OZXdLRVkJARVrZXlSZXdhcmRQZXJOc2J0U3VtQXQCBQ1kZXBvc2l0TnVtTmV3BQluZXh0QXNzZXQECnN1bUxhc3RTdHIJAQxnZXRTdHJPckVsc2UCCQEVa2V5UmV3YXJkUGVyTnNidFN1bUF0AgUOZGVwb3NpdE51bUxhc3QFCW5leHRBc3NldAIBMAkAzQgCBQVhY2N1bQMJAAACBQluZXh0QXNzZXQFDXBtdEFzc2V0SWRTdHIJAQtTdHJpbmdFbnRyeQIFFnJld2FyZFBlck5zYnRTdW1OZXdLRVkJAKYDAQkAtwICCQCnAwEFCnN1bUxhc3RTdHIFEHJld2FyZFBlck5zYnRYMTgJAQtTdHJpbmdFbnRyeQIFFnJld2FyZFBlck5zYnRTdW1OZXdLRVkFCnN1bUxhc3RTdHIJAM0IAgoAAiRsBRNzdXBwb3J0ZWRBc3NldHNMaXN0CgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARdyZWZyZXNoUmV3YXJkUGVyTnNidFNVTQIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgkBDEludGVnZXJFbnRyeQIFEWRlcG9zaXROdW1MYXN0S0VZBQ1kZXBvc2l0TnVtTmV3AWkBDGNsYWltUmV3YXJkcwAJAQtjb21tb25DbGFpbQIIBQFpBmNhbGxlcgUBaQFpARpjbGFpbVJld2FyZHNCeU9yaWdpbkNhbGxlcgAJAQtjb21tb25DbGFpbQIIBQFpDG9yaWdpbkNhbGxlcgUBaQFpARh1bmNsYWltZWRSZXdhcmRzUkVBRE9OTFkBDnVzZXJBZGRyZXNzU3RyCgEWZm9yRWFjaEFzc2V0WmVyb1Jld2FyZAIFYWNjdW0FYXNzZXQJAKwCAgkArAICBQVhY2N1bQkAuQkCCQDMCAIFBWFzc2V0CQDMCAICATAJAMwIAgIBMAUDbmlsAgE6AgFfBBJ1bmNsYWltZWRSZXdhcmRTdHIDCQAAAgUOdXNlckFkZHJlc3NTdHICAAoAAiRsBRNzdXBwb3J0ZWRBc3NldHNMaXN0CgACJHMJAJADAQUCJGwKAAUkYWNjMAIACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARZmb3JFYWNoQXNzZXRaZXJvUmV3YXJkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBAt1c2VyQWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQUOdXNlckFkZHJlc3NTdHIEDSR0MDE4MzM2MTg0NDEJAQt2YWx1ZU9yRWxzZQIJARNnZXRVc2VyUGFyYW1zT3JVbml0AQULdXNlckFkZHJlc3MJAJUKAwYAAAAABAlpc05ld1VzZXIIBQ0kdDAxODMzNjE4NDQxAl8xBAxzdGFrZWRBbW91bnQIBQ0kdDAxODMzNjE4NDQxAl8yBAxzdGFraW5nU3RhcnQIBQ0kdDAxODMzNjE4NDQxAl8zBA1zdGFrZWRBbW91bnRYCQC2AgEFDHN0YWtlZEFtb3VudAQbdXNlclJld2FyZEZyb21EZXBvc2l0TnVtS0VZCQEba2V5VXNlclJld2FyZEZyb21EZXBvc2l0TnVtAQUOdXNlckFkZHJlc3NTdHIEDmRlcG9zaXROdW1Vc2VyCQEMZ2V0SW50T3JFbHNlAgUbdXNlclJld2FyZEZyb21EZXBvc2l0TnVtS0VZAP///////////wEEDmRlcG9zaXROdW1MYXN0CQEMZ2V0SW50T3JFbHNlAgkBEWtleURlcG9zaXROdW1MYXN0AAD///////////8BCgEfZm9yRWFjaEFzc2V0Q2FsY1VuY2xhaW1lZFJld2FyZAIFYWNjdW0FYXNzZXQEDSR0MDE4Nzg3MTg5MjUJAQpjYWxjUmV3YXJkBQUOdXNlckFkZHJlc3NTdHIFBWFzc2V0BQ1zdGFrZWRBbW91bnRYBQ5kZXBvc2l0TnVtVXNlcgUOZGVwb3NpdE51bUxhc3QEC3Jld2FyZFRvdGFsCAUNJHQwMTg3ODcxODkyNQJfMQQGY2FjaGVkCAUNJHQwMTg3ODcxODkyNQJfMgQHZHluYW1pYwgFDSR0MDE4Nzg3MTg5MjUCXzMEE3Jld2FyZENhY2hlZFBhcnRLRVkIBQ0kdDAxODc4NzE4OTI1Al80BAdjbGFpbWVkCQELdmFsdWVPckVsc2UCCQCfCAEJAQprZXlDbGFpbWVkAgUOdXNlckFkZHJlc3NTdHIFBWFzc2V0AAAJAKwCAgkArAICBQVhY2N1bQkAuQkCCQDMCAIFBWFzc2V0CQDMCAIJAKQDAQULcmV3YXJkVG90YWwJAMwIAgkApAMBBQdjbGFpbWVkBQNuaWwCAToCAV8KAAIkbAUTc3VwcG9ydGVkQXNzZXRzTGlzdAoAAiRzCQCQAwEFAiRsCgAFJGFjYzACAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEfZm9yRWFjaEFzc2V0Q2FsY1VuY2xhaW1lZFJld2FyZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgkAlAoCBQNuaWwJALMCAgUSdW5jbGFpbWVkUmV3YXJkU3RyAAEBaQEWdXNkblN0YWtpbmdTWVNSRUFET05MWQIVdXNlckFkZHJlc3NTdHJPckVtcHR5CHVzZG5EaWZmBAl1c2RuVG90YWwJAQxnZXRJbnRPckVsc2UCCQEXa2V5TG9ja1BhcmFtVG90YWxBbW91bnQAAAADCQAAAgUVdXNlckFkZHJlc3NTdHJPckVtcHR5AgAJAJQKAgUDbmlsCQDMCAIAAAkAzAgCBQl1c2RuVG90YWwJAMwIAgAACQDMCAIAAAkAzAgCAAAJAMwIAgUGaGVpZ2h0CQDMCAIFBmhlaWdodAUDbmlsBAt1c2VyQWRkcmVzcwkBD3RvQWRkcmVzc09yRmFpbAEFFXVzZXJBZGRyZXNzU3RyT3JFbXB0eQQKbWVyZ2VkRGF0YQkBCm1lcmdlU3Rha2UCBQt1c2VyQWRkcmVzcwUIdXNkbkRpZmYECWlzTmV3VXNlcggFCm1lcmdlZERhdGECXzEEDHN0YWtlZEFtb3VudAgFCm1lcmdlZERhdGECXzIEEXZwRWZmZWN0aXZlSGVpZ2h0CAUKbWVyZ2VkRGF0YQJfMwQPc3Rha2VkQW1vdW50TkVXCAUKbWVyZ2VkRGF0YQJfNAQUdnBFZmZlY3RpdmVIZWlnaHRORVcIBQptZXJnZWREYXRhAl81BAh1c2RuVXNlcgUMc3Rha2VkQW1vdW50CQCUCgIFA25pbAkAzAgCBQh1c2RuVXNlcgkAzAgCBQl1c2RuVG90YWwJAMwIAgAACQDMCAIAAAkAzAgCBRF2cEVmZmVjdGl2ZUhlaWdodAkAzAgCBRR2cEVmZmVjdGl2ZUhlaWdodE5FVwUDbmlsAWkBEWNvbmZpZ1NZU1JFQURPTkxZAAQKbWluTG9ja0FtdAkBEUBleHRyTmF0aXZlKDEwNTUpAQkBEGtleU1pbkxvY2tBbW91bnQACQCUCgIFA25pbAkAzAgCBQptaW5Mb2NrQW10BQNuaWwA0yQ9mQ==", "chainId": 84, "height": 2271812, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: E3yMgRXnYujy2oV8W5LDv98PeUamSkJTT1ZuDPSXTS8W Next: EuP2aX2tH2ZQYRYmZmHRg9P7PpKetkVW2xd3gDa6rgaF Diff:
OldNewDifferences
217217 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
218218 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
219219 func forEachAssetCacheUserReward (accum,asset) = {
220- let $t086918826 = calcReward(userAddress, asset, stakedAmountX, depositNumUser, depositNumLast)
221- let rewardTotal = $t086918826._1
222- let cached = $t086918826._2
223- let dynamic = $t086918826._3
224- let rewardCachedPartKEY = $t086918826._4
220+ let $t087088843 = calcReward(userAddress, asset, stakedAmountX, depositNumUser, depositNumLast)
221+ let rewardTotal = $t087088843._1
222+ let cached = $t087088843._2
223+ let dynamic = $t087088843._3
224+ let rewardCachedPartKEY = $t087088843._4
225225 (accum :+ IntegerEntry(rewardCachedPartKEY, rewardTotal))
226226 }
227227
278278
279279
280280 func mergeStake (userAddress,amountToAdd) = {
281- let $t01241112521 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
282- let isNewUser = $t01241112521._1
283- let stakedAmount = $t01241112521._2
284- let vpEffectiveHeight = $t01241112521._3
281+ let $t01065810768 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
282+ let isNewUser = $t01065810768._1
283+ let stakedAmount = $t01065810768._2
284+ let vpEffectiveHeight = $t01065810768._3
285285 let stakedAmountNEW = if (isNewUser)
286286 then amountToAdd
287287 else (amountToAdd + stakedAmount)
294294
295295
296296 func commonStake (userAddress,i) = {
297- let $t01300713061 = getParamsOrFail()
298- let stakedAssetId = $t01300713061._1
299- let minLockAmount = $t01300713061._2
297+ let $t01125411308 = getParamsOrFail()
298+ let stakedAssetId = $t01125411308._1
299+ let minLockAmount = $t01125411308._2
300300 if ((size(i.payments) != 1))
301301 then throw("Invalid payments size")
302302 else {
317317 if ((minLockAmount > stakedAmountNEW))
318318 then throw(("Min lock amount is " + toString(minLockAmount)))
319319 else {
320- let $t01386013962 = StatsResult(amount, 1, if (isNewUser)
320+ let $t01210712209 = StatsResult(amount, 1, if (isNewUser)
321321 then 1
322322 else 0)
323- let statsEntries = $t01386013962._1
324- let totalStaked = $t01386013962._2
325- let totalStakedNew = $t01386013962._3
323+ let statsEntries = $t01210712209._1
324+ let totalStaked = $t01210712209._2
325+ let totalStakedNew = $t01210712209._3
326326 ((([HistoryRecordEntry("stake", userAddress, i.transactionId, stakedAmount, vpEffectiveHeight, stakedAmountNEW, vpEffectiveHeightNEW)] ++ RewardEntries(isNewUser, userAddressStr, stakedAmount)) ++ LockParamsEntry(userAddress, stakedAmountNEW, vpEffectiveHeightNEW)) ++ statsEntries)
327327 }
328328 }
335335 if ((size(i.payments) > 0))
336336 then throw("payments are not accepted")
337337 else {
338- let $t01444114546 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
339- let isNewUser = $t01444114546._1
340- let stakedAmount = $t01444114546._2
341- let stakingStart = $t01444114546._3
338+ let $t01268812793 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
339+ let isNewUser = $t01268812793._1
340+ let stakedAmount = $t01268812793._2
341+ let stakingStart = $t01268812793._3
342342 let stakedAmountX = toBigInt(stakedAmount)
343343 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
344344 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
345345 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
346346 func forEachAssetCalcUnclaimedReward (accum,asset) = {
347- let $t01491715055 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
348- let rewardTotal = $t01491715055._1
349- let cached = $t01491715055._2
350- let dynamic = $t01491715055._3
351- let rewardCachedPartKEY = $t01491715055._4
347+ let $t01316413302 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
348+ let rewardTotal = $t01316413302._1
349+ let cached = $t01316413302._2
350+ let dynamic = $t01316413302._3
351+ let rewardCachedPartKEY = $t01316413302._4
352352 let claimedKEY = keyClaimed(userAddressStr, asset)
353- let $t01511515152 = accum
354- let data = $t01511515152._1
355- let claimedAmtByAsset = $t01511515152._2
353+ let $t01336213399 = accum
354+ let data = $t01336213399._1
355+ let claimedAmtByAsset = $t01336213399._2
356356 let newPart = makeString([asset, toString(rewardTotal)], ":")
357357 let claimedAmtByAssetNew = makeString([claimedAmtByAsset, newPart], "_")
358358 if ((0 >= rewardTotal))
360360 else $Tuple2((((data :+ ScriptTransfer(userAddress, rewardTotal, toAssetVect(asset))) :+ IntegerEntry(claimedKEY, (valueOrElse(getInteger(claimedKEY), 0) + rewardTotal))) :+ IntegerEntry(rewardCachedPartKEY, 0)), claimedAmtByAssetNew)
361361 }
362362
363- let $t01561215726 = {
363+ let $t01385913973 = {
364364 let $l = supportedAssetsList
365365 let $s = size($l)
366366 let $acc0 = $Tuple2(nil, "")
374374
375375 $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)
376376 }
377- let transfers = $t01561215726._1
378- let claimedAmtByAssetResult = $t01561215726._2
377+ let transfers = $t01385913973._1
378+ let claimedAmtByAssetResult = $t01385913973._2
379379 if ((0 >= size(transfers)))
380380 then nil
381381 else ((transfers :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)) :+ ClaimHistoryEntry(userAddress, i.transactionId, drop(claimedAmtByAssetResult, 1)))
406406 else {
407407 let userAddress = i.caller
408408 let userAddressStr = toString(userAddress)
409- let $t01663516689 = getParamsOrFail()
410- let stakedAssetId = $t01663516689._1
411- let minLockAmount = $t01663516689._2
412- let $t01669216776 = getUserParamsOrFail(userAddress)
413- let isNewUser = $t01669216776._1
414- let stakedAmount = $t01669216776._2
415- let vpEffectiveHeight = $t01669216776._3
409+ let $t01488214936 = getParamsOrFail()
410+ let stakedAssetId = $t01488214936._1
411+ let minLockAmount = $t01488214936._2
412+ let $t01493915023 = getUserParamsOrFail(userAddress)
413+ let isNewUser = $t01493915023._1
414+ let stakedAmount = $t01493915023._2
415+ let vpEffectiveHeight = $t01493915023._3
416416 let swapParamsSTRUCT = asSwapParamsSTRUCT(reentrantInvoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStr, 0], nil))
417417 let swapLimitSpentInUsdn = swapParamsSTRUCT._2
418418 let blcks2LmtReset = swapParamsSTRUCT._3
424424 then throw(((("Requested " + toString(amount)) + ", but staked only ") + toString(stakedAmount)))
425425 else {
426426 let stakedAmountNEW = (stakedAmount - amount)
427- let $t01741417572 = StatsResult(-(amount), if ((amount == stakedAmount))
427+ let $t01566115819 = StatsResult(-(amount), if ((amount == stakedAmount))
428428 then -1
429429 else 0, if ((amount == stakedAmount))
430430 then -1
431431 else 0)
432- let statsEntries = $t01741417572._1
433- let totalStaked = $t01741417572._2
434- let totalStakedNew = $t01741417572._3
432+ let statsEntries = $t01566115819._1
433+ let totalStaked = $t01566115819._2
434+ let totalStakedNew = $t01566115819._3
435435 ((([ScriptTransfer(userAddress, amount, stakedAssetId), HistoryRecordEntry("unstake", userAddress, i.transactionId, stakedAmount, vpEffectiveHeight, stakedAmountNEW, vpEffectiveHeight)] ++ RewardEntries(false, userAddressStr, stakedAmount)) ++ LockParamsEntry(userAddress, stakedAmountNEW, vpEffectiveHeight)) ++ statsEntries)
436436 }
437437 }
521521 }
522522 else {
523523 let userAddress = addressFromStringValue(userAddressStr)
524- let $t02008920194 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
525- let isNewUser = $t02008920194._1
526- let stakedAmount = $t02008920194._2
527- let stakingStart = $t02008920194._3
524+ let $t01833618441 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
525+ let isNewUser = $t01833618441._1
526+ let stakedAmount = $t01833618441._2
527+ let stakingStart = $t01833618441._3
528528 let stakedAmountX = toBigInt(stakedAmount)
529529 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
530530 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
531531 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
532532 func forEachAssetCalcUnclaimedReward (accum,asset) = {
533- let $t02054020678 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
534- let rewardTotal = $t02054020678._1
535- let cached = $t02054020678._2
536- let dynamic = $t02054020678._3
537- let rewardCachedPartKEY = $t02054020678._4
533+ let $t01878718925 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
534+ let rewardTotal = $t01878718925._1
535+ let cached = $t01878718925._2
536+ let dynamic = $t01878718925._3
537+ let rewardCachedPartKEY = $t01878718925._4
538538 let claimed = valueOrElse(getInteger(keyClaimed(userAddressStr, asset)), 0)
539539 ((accum + makeString([asset, toString(rewardTotal), toString(claimed)], ":")) + "_")
540540 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let revisionNum = ""
55
66 let separator = "__"
77
88 let SEP = "__"
99
1010 let MULT6 = 1000000
1111
1212 let MULT8 = 100000000
1313
1414 let MULTX6 = toBigInt(MULT6)
1515
1616 let MULTX8 = toBigInt(MULT8)
1717
1818 let MULTX18 = toBigInt(1000000000000000000)
1919
2020 let IdxControlCfgNeutrinoDapp = 1
2121
2222 let IdxControlCfgAuctionDapp = 2
2323
2424 let IdxControlCfgRpdDapp = 3
2525
2626 let IdxControlCfgMathDapp = 4
2727
2828 let IdxControlCfgLiquidationDapp = 5
2929
3030 let IdxControlCfgRestDapp = 6
3131
3232 let IdxControlCfgNodeRegistryDapp = 7
3333
3434 let IdxControlCfgNsbtStakingDapp = 8
3535
3636 let IdxControlCfgMediatorDapp = 9
3737
3838 let IdxControlCfgSurfStakingDapp = 10
3939
4040 let IdxControlCfgGnsbtControllerDapp = 11
4141
4242 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), (((("mandatory " + toString(address)) + ".") + key) + " is not defined"))
4343
4444
4545 func keyControlAddress () = "%s%s__config__controlAddress"
4646
4747
4848 func keyControlCfg () = "%s__controlConfig"
4949
5050
5151 func readControlCfgOrFail (control) = split(getStringOrFail(control, keyControlCfg()), SEP)
5252
5353
5454 func getContractAddressOrFail (controlCfg,idx) = valueOrErrorMessage(addressFromString(controlCfg[idx]), ("Control cfg doesn't contain address at index " + toString(idx)))
5555
5656
5757 let controlContract = addressFromStringValue(valueOrElse(getString(this, keyControlAddress()), "3P5Bfd58PPfNvBM2Hy8QfbcDqMeNtzg7KfP"))
5858
5959 let controlCfg = readControlCfgOrFail(controlContract)
6060
6161 let mathContract = getContractAddressOrFail(controlCfg, IdxControlCfgMathDapp)
6262
6363 let neutrinoContract = getContractAddressOrFail(controlCfg, IdxControlCfgNeutrinoDapp)
6464
6565 let auctionContract = getContractAddressOrFail(controlCfg, IdxControlCfgAuctionDapp)
6666
6767 func keyBondAsset () = "bond_asset_id"
6868
6969
7070 func keyAuctionContractAddress () = "auction_contract"
7171
7272
7373 func keyMinLockAmount () = "%s__minLockAmount"
7474
7575
7676 func keyStakedAssetId () = "%s__stakedAssetId"
7777
7878
7979 func keyLockParamUserAmount (userAddress) = makeString(["%s%s%s", "paramByUser", toString(userAddress), "amount"], separator)
8080
8181
8282 func keyLockParamStartBlock (userAddress) = makeString(["%s%s%s", "paramByUser", toString(userAddress), "start"], separator)
8383
8484
8585 func keyLockParamVotingPowerEffectiveHeight (userAddress) = makeString(["%s%s%s", "paramByUser", toString(userAddress), "vpEffectiveHeight"], separator)
8686
8787
8888 func keyHistoryRecord (type,userAddress,txId) = makeString(["%s%s%s%s", "history", type, toString(userAddress), toBase58String(txId)], separator)
8989
9090
9191 func keyLockParamTotalAmount () = makeString(["%s%s", "stats", "activeTotalLocked"], separator)
9292
9393
9494 func keyStatsLocksCount () = makeString(["%s%s", "stats", "locksCount"], separator)
9595
9696
9797 func keyStatsUsersCount () = makeString(["%s%s", "stats", "activeUsersCount"], separator)
9898
9999
100100 func keyNextPeriod () = "%s__nextPeriod"
101101
102102
103103 func keySupportedRewardAssets () = "supportedRewardAssets"
104104
105105
106106 func keyDepositNumLast () = makeString(["%s%s%s", "dep", "lastNum"], separator)
107107
108108
109109 func keyUserRewardFromDepositNum (userAddress) = makeString(["%s%s%s", "userRwdFromDepNum", userAddress], separator)
110110
111111
112112 func keyRewardPerNsbtSumAt (depositNum,tkn) = makeString(["%s%d", "rwdPerNsbtSumByDepNum", toString(depositNum), tkn], separator)
113113
114114
115115 func keyReward (userAddress,tkn) = makeString(["%s%s%s", "rwd", userAddress, tkn], separator)
116116
117117
118118 func keyClaimed (userAddress,tkn) = makeString(["%s%s%s", "clm", userAddress, tkn], separator)
119119
120120
121121 func keyNotDistributedReward (tkn) = makeString(["%s%s", "notDistributed", tkn], separator)
122122
123123
124124 func toX18 (origVal,origMult) = fraction(toBigInt(origVal), MULTX18, origMult)
125125
126126
127127 func getIntOrZero (key) = valueOrElse(getInteger(this, key), 0)
128128
129129
130130 func getIntOrElse (key,defaultVal) = valueOrElse(getInteger(this, key), defaultVal)
131131
132132
133133 func getIntOrFail (key) = valueOrErrorMessage(getInteger(this, key), (("Mandatory this." + key) + " is not defined"))
134134
135135
136136 func getStrOrElse (key,defaultVal) = valueOrElse(getString(this, key), defaultVal)
137137
138138
139139 func toAddressOrFail (addressStr) = valueOrErrorMessage(addressFromString(addressStr), ("couldn't parse passed addressStr=" + addressStr))
140140
141141
142142 func toAssetVect (assetStr) = fromBase58String(assetStr)
143143
144144
145145 func asInt (val) = match val {
146146 case valInt: Int =>
147147 valInt
148148 case _ =>
149149 throw("fail to cast into Int")
150150 }
151151
152152
153153 func asSwapParamsSTRUCT (v) = match v {
154154 case struct: (Int, Int, Int, Int, Int, Int, Int) =>
155155 struct
156156 case _ =>
157157 throw("fail to cast into Int")
158158 }
159159
160160
161161 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)
162162
163163
164164 func formatClaimHistoryRecord (user,claimedRewards) = makeString(["%s%d%d%s", user, toString(lastBlock.height), toString(lastBlock.timestamp), claimedRewards], separator)
165165
166166
167167 func HistoryRecordEntry (type,userAddress,txId,oldAmount,oldStart,newAmount,newStart) = StringEntry(keyHistoryRecord(type, userAddress, txId), formatHistoryRecord(oldAmount, oldStart, newAmount, newStart))
168168
169169
170170 func ClaimHistoryEntry (userAddress,txId,claimedRewards) = StringEntry(keyHistoryRecord("claim", userAddress, txId), formatClaimHistoryRecord(toString(userAddress), claimedRewards))
171171
172172
173173 func StatsResult (totalLockedInc,lockCountInc,usersCountInc) = {
174174 let locksCount = getIntOrZero(keyStatsLocksCount())
175175 let usersCount = getIntOrZero(keyStatsUsersCount())
176176 let totalAmount = getIntOrZero(keyLockParamTotalAmount())
177177 let totalAmountNew = (totalAmount + totalLockedInc)
178178 $Tuple3([IntegerEntry(keyStatsLocksCount(), (locksCount + lockCountInc)), IntegerEntry(keyStatsUsersCount(), (usersCount + usersCountInc)), IntegerEntry(keyLockParamTotalAmount(), totalAmountNew)], totalAmount, totalAmountNew)
179179 }
180180
181181
182182 func LockParamsEntry (userAddress,amount,votingPowerEffectiveHeight) = [IntegerEntry(keyLockParamUserAmount(userAddress), amount), IntegerEntry(keyLockParamStartBlock(userAddress), votingPowerEffectiveHeight)]
183183
184184
185185 func getParamsOrFail () = $Tuple2(fromBase58String(getStringOrFail(this, keyStakedAssetId())), getIntOrFail(keyMinLockAmount()))
186186
187187
188188 func isActiveUser (userAddress) = (getIntOrElse(keyLockParamUserAmount(userAddress), 0) > 0)
189189
190190
191191 func getUserParamsOrUnit (userAddress) = if (isActiveUser(userAddress))
192192 then $Tuple3(false, getIntOrFail(keyLockParamUserAmount(userAddress)), getIntOrFail(keyLockParamStartBlock(userAddress)))
193193 else unit
194194
195195
196196 func getUserParamsOrFail (userAddress) = valueOrErrorMessage(getUserParamsOrUnit(userAddress), (("User " + toString(userAddress)) + " is not defined"))
197197
198198
199199 let supportedAssetsStr = getStrOrElse(keySupportedRewardAssets(), "")
200200
201201 let supportedAssetsList = split(supportedAssetsStr, "_")
202202
203203 func calcReward (userAddress,assetId,stakedAmountX,depositNumUser,depositNumLast) = {
204204 let rewardPerNsbtSumLastKEY = keyRewardPerNsbtSumAt(depositNumLast, assetId)
205205 let sumLastX18 = parseBigIntValue(getStrOrElse(keyRewardPerNsbtSumAt(depositNumLast, assetId), "0"))
206206 let sumUserX18 = parseBigIntValue(getStrOrElse(keyRewardPerNsbtSumAt(depositNumUser, assetId), "0"))
207207 let rewardDynamicPart = toInt(fraction((sumLastX18 - sumUserX18), stakedAmountX, MULTX18))
208208 let rewardCachedPartKEY = keyReward(userAddress, assetId)
209209 let rewardCachedPart = getIntOrElse(rewardCachedPartKEY, 0)
210210 $Tuple4((rewardCachedPart + rewardDynamicPart), rewardCachedPart, rewardDynamicPart, rewardCachedPartKEY)
211211 }
212212
213213
214214 func RewardEntries (isNewUser,userAddress,stakedAmount) = {
215215 let stakedAmountX = toBigInt(stakedAmount)
216216 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddress)
217217 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
218218 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
219219 func forEachAssetCacheUserReward (accum,asset) = {
220- let $t086918826 = calcReward(userAddress, asset, stakedAmountX, depositNumUser, depositNumLast)
221- let rewardTotal = $t086918826._1
222- let cached = $t086918826._2
223- let dynamic = $t086918826._3
224- let rewardCachedPartKEY = $t086918826._4
220+ let $t087088843 = calcReward(userAddress, asset, stakedAmountX, depositNumUser, depositNumLast)
221+ let rewardTotal = $t087088843._1
222+ let cached = $t087088843._2
223+ let dynamic = $t087088843._3
224+ let rewardCachedPartKEY = $t087088843._4
225225 (accum :+ IntegerEntry(rewardCachedPartKEY, rewardTotal))
226226 }
227227
228228 if (if ((depositNumLast == -1))
229229 then (depositNumUser == -1)
230230 else false)
231231 then nil
232232 else if (if ((depositNumLast == -1))
233233 then (depositNumUser > -1)
234234 else false)
235235 then throw("invalid depositNumLast and depositNumUser state")
236236 else if (if ((depositNumLast > -1))
237237 then (depositNumUser >= -1)
238238 else false)
239239 then if (isNewUser)
240240 then [IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)]
241241 else ({
242242 let $l = supportedAssetsList
243243 let $s = size($l)
244244 let $acc0 = nil
245245 func $f0_1 ($a,$i) = if (($i >= $s))
246246 then $a
247247 else forEachAssetCacheUserReward($a, $l[$i])
248248
249249 func $f0_2 ($a,$i) = if (($i >= $s))
250250 then $a
251251 else throw("List size exceeds 10")
252252
253253 $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)
254254 } :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast))
255255 else throw(((("uncovered condition: depositNumLast=" + toString(depositNumLast)) + " depositNumUser=") + toString(depositNumUser)))
256256 }
257257
258258
259259 func IncrementNotDistributedRewardEntry (tkn,amountInc) = {
260260 let notDistributedRewardKEY = keyNotDistributedReward(tkn)
261261 let notDistributedReward = getIntOrElse(notDistributedRewardKEY, 0)
262262 [IntegerEntry(notDistributedRewardKEY, (notDistributedReward + amountInc))]
263263 }
264264
265265
266266 func mergeVotingPowerEffectiveHeight (quarantinePeriod,vpEffectiveHeight,stakedAmt,stakedAmtNEW) = {
267267 let remainingToWait = (vpEffectiveHeight - height)
268268 if ((0 >= remainingToWait))
269269 then (height + quarantinePeriod)
270270 else {
271271 let alreadyWaited = (quarantinePeriod - remainingToWait)
272272 let kX8 = if ((stakedAmtNEW != 0))
273273 then fraction(stakedAmt, MULT8, stakedAmtNEW)
274274 else vpEffectiveHeight
275275 ((quarantinePeriod + height) - fraction(alreadyWaited, kX8, MULT8))
276276 }
277277 }
278278
279279
280280 func mergeStake (userAddress,amountToAdd) = {
281- let $t01241112521 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
282- let isNewUser = $t01241112521._1
283- let stakedAmount = $t01241112521._2
284- let vpEffectiveHeight = $t01241112521._3
281+ let $t01065810768 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
282+ let isNewUser = $t01065810768._1
283+ let stakedAmount = $t01065810768._2
284+ let vpEffectiveHeight = $t01065810768._3
285285 let stakedAmountNEW = if (isNewUser)
286286 then amountToAdd
287287 else (amountToAdd + stakedAmount)
288288 let quarantinePeriod = (1440 * 14)
289289 let vpEffectiveHeightNEW = if (isNewUser)
290290 then (quarantinePeriod + height)
291291 else mergeVotingPowerEffectiveHeight(quarantinePeriod, vpEffectiveHeight, stakedAmount, stakedAmountNEW)
292292 $Tuple5(isNewUser, stakedAmount, vpEffectiveHeight, stakedAmountNEW, vpEffectiveHeightNEW)
293293 }
294294
295295
296296 func commonStake (userAddress,i) = {
297- let $t01300713061 = getParamsOrFail()
298- let stakedAssetId = $t01300713061._1
299- let minLockAmount = $t01300713061._2
297+ let $t01125411308 = getParamsOrFail()
298+ let stakedAssetId = $t01125411308._1
299+ let minLockAmount = $t01125411308._2
300300 if ((size(i.payments) != 1))
301301 then throw("Invalid payments size")
302302 else {
303303 let payment = i.payments[0]
304304 let amount = payment.amount
305305 let invalidAssetMessage = (("Invalid asset. " + toBase58String(stakedAssetId)) + " is expected")
306306 let assetId = valueOrErrorMessage(payment.assetId, invalidAssetMessage)
307307 if ((assetId != stakedAssetId))
308308 then throw(invalidAssetMessage)
309309 else {
310310 let userAddressStr = toString(userAddress)
311311 let mergedData = mergeStake(userAddress, amount)
312312 let isNewUser = mergedData._1
313313 let stakedAmount = mergedData._2
314314 let vpEffectiveHeight = mergedData._3
315315 let stakedAmountNEW = mergedData._4
316316 let vpEffectiveHeightNEW = mergedData._5
317317 if ((minLockAmount > stakedAmountNEW))
318318 then throw(("Min lock amount is " + toString(minLockAmount)))
319319 else {
320- let $t01386013962 = StatsResult(amount, 1, if (isNewUser)
320+ let $t01210712209 = StatsResult(amount, 1, if (isNewUser)
321321 then 1
322322 else 0)
323- let statsEntries = $t01386013962._1
324- let totalStaked = $t01386013962._2
325- let totalStakedNew = $t01386013962._3
323+ let statsEntries = $t01210712209._1
324+ let totalStaked = $t01210712209._2
325+ let totalStakedNew = $t01210712209._3
326326 ((([HistoryRecordEntry("stake", userAddress, i.transactionId, stakedAmount, vpEffectiveHeight, stakedAmountNEW, vpEffectiveHeightNEW)] ++ RewardEntries(isNewUser, userAddressStr, stakedAmount)) ++ LockParamsEntry(userAddress, stakedAmountNEW, vpEffectiveHeightNEW)) ++ statsEntries)
327327 }
328328 }
329329 }
330330 }
331331
332332
333333 func commonClaim (userAddress,i) = {
334334 let userAddressStr = toString(userAddress)
335335 if ((size(i.payments) > 0))
336336 then throw("payments are not accepted")
337337 else {
338- let $t01444114546 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
339- let isNewUser = $t01444114546._1
340- let stakedAmount = $t01444114546._2
341- let stakingStart = $t01444114546._3
338+ let $t01268812793 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
339+ let isNewUser = $t01268812793._1
340+ let stakedAmount = $t01268812793._2
341+ let stakingStart = $t01268812793._3
342342 let stakedAmountX = toBigInt(stakedAmount)
343343 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
344344 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
345345 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
346346 func forEachAssetCalcUnclaimedReward (accum,asset) = {
347- let $t01491715055 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
348- let rewardTotal = $t01491715055._1
349- let cached = $t01491715055._2
350- let dynamic = $t01491715055._3
351- let rewardCachedPartKEY = $t01491715055._4
347+ let $t01316413302 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
348+ let rewardTotal = $t01316413302._1
349+ let cached = $t01316413302._2
350+ let dynamic = $t01316413302._3
351+ let rewardCachedPartKEY = $t01316413302._4
352352 let claimedKEY = keyClaimed(userAddressStr, asset)
353- let $t01511515152 = accum
354- let data = $t01511515152._1
355- let claimedAmtByAsset = $t01511515152._2
353+ let $t01336213399 = accum
354+ let data = $t01336213399._1
355+ let claimedAmtByAsset = $t01336213399._2
356356 let newPart = makeString([asset, toString(rewardTotal)], ":")
357357 let claimedAmtByAssetNew = makeString([claimedAmtByAsset, newPart], "_")
358358 if ((0 >= rewardTotal))
359359 then $Tuple2(data, claimedAmtByAssetNew)
360360 else $Tuple2((((data :+ ScriptTransfer(userAddress, rewardTotal, toAssetVect(asset))) :+ IntegerEntry(claimedKEY, (valueOrElse(getInteger(claimedKEY), 0) + rewardTotal))) :+ IntegerEntry(rewardCachedPartKEY, 0)), claimedAmtByAssetNew)
361361 }
362362
363- let $t01561215726 = {
363+ let $t01385913973 = {
364364 let $l = supportedAssetsList
365365 let $s = size($l)
366366 let $acc0 = $Tuple2(nil, "")
367367 func $f0_1 ($a,$i) = if (($i >= $s))
368368 then $a
369369 else forEachAssetCalcUnclaimedReward($a, $l[$i])
370370
371371 func $f0_2 ($a,$i) = if (($i >= $s))
372372 then $a
373373 else throw("List size exceeds 10")
374374
375375 $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)
376376 }
377- let transfers = $t01561215726._1
378- let claimedAmtByAssetResult = $t01561215726._2
377+ let transfers = $t01385913973._1
378+ let claimedAmtByAssetResult = $t01385913973._2
379379 if ((0 >= size(transfers)))
380380 then nil
381381 else ((transfers :+ IntegerEntry(userRewardFromDepositNumKEY, depositNumLast)) :+ ClaimHistoryEntry(userAddress, i.transactionId, drop(claimedAmtByAssetResult, 1)))
382382 }
383383 }
384384
385385
386386 @Callable(i)
387387 func constructor (minLockAmount,supportedRewardAssets,stakedAssetId) = if ((i.caller != this))
388388 then throw("Permission denied")
389389 else [IntegerEntry(keyMinLockAmount(), minLockAmount), StringEntry(keySupportedRewardAssets(), supportedRewardAssets), StringEntry(keyStakedAssetId(), stakedAssetId)]
390390
391391
392392
393393 @Callable(i)
394394 func stake () = commonStake(i.caller, i)
395395
396396
397397
398398 @Callable(i)
399399 func stakeByOriginCaller () = commonStake(i.originCaller, i)
400400
401401
402402
403403 @Callable(i)
404404 func unstake (amount) = if ((size(i.payments) != 0))
405405 then throw("unstake doesn't require any payment")
406406 else {
407407 let userAddress = i.caller
408408 let userAddressStr = toString(userAddress)
409- let $t01663516689 = getParamsOrFail()
410- let stakedAssetId = $t01663516689._1
411- let minLockAmount = $t01663516689._2
412- let $t01669216776 = getUserParamsOrFail(userAddress)
413- let isNewUser = $t01669216776._1
414- let stakedAmount = $t01669216776._2
415- let vpEffectiveHeight = $t01669216776._3
409+ let $t01488214936 = getParamsOrFail()
410+ let stakedAssetId = $t01488214936._1
411+ let minLockAmount = $t01488214936._2
412+ let $t01493915023 = getUserParamsOrFail(userAddress)
413+ let isNewUser = $t01493915023._1
414+ let stakedAmount = $t01493915023._2
415+ let vpEffectiveHeight = $t01493915023._3
416416 let swapParamsSTRUCT = asSwapParamsSTRUCT(reentrantInvoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddressStr, 0], nil))
417417 let swapLimitSpentInUsdn = swapParamsSTRUCT._2
418418 let blcks2LmtReset = swapParamsSTRUCT._3
419419 if ((swapLimitSpentInUsdn > 0))
420420 then throw((("You have already made a swap operation. Wait " + toString((height + blcks2LmtReset))) + " height to unstake"))
421421 else if ((0 >= stakedAmount))
422422 then throw("Nothing to unstake")
423423 else if ((amount > stakedAmount))
424424 then throw(((("Requested " + toString(amount)) + ", but staked only ") + toString(stakedAmount)))
425425 else {
426426 let stakedAmountNEW = (stakedAmount - amount)
427- let $t01741417572 = StatsResult(-(amount), if ((amount == stakedAmount))
427+ let $t01566115819 = StatsResult(-(amount), if ((amount == stakedAmount))
428428 then -1
429429 else 0, if ((amount == stakedAmount))
430430 then -1
431431 else 0)
432- let statsEntries = $t01741417572._1
433- let totalStaked = $t01741417572._2
434- let totalStakedNew = $t01741417572._3
432+ let statsEntries = $t01566115819._1
433+ let totalStaked = $t01566115819._2
434+ let totalStakedNew = $t01566115819._3
435435 ((([ScriptTransfer(userAddress, amount, stakedAssetId), HistoryRecordEntry("unstake", userAddress, i.transactionId, stakedAmount, vpEffectiveHeight, stakedAmountNEW, vpEffectiveHeight)] ++ RewardEntries(false, userAddressStr, stakedAmount)) ++ LockParamsEntry(userAddress, stakedAmountNEW, vpEffectiveHeight)) ++ statsEntries)
436436 }
437437 }
438438
439439
440440
441441 @Callable(i)
442442 func deposit () = if ((size(i.payments) != 1))
443443 then throw("exact 1 payment is allowed only")
444444 else {
445445 let pmt = i.payments[0]
446446 let amount = pmt.amount
447447 let pmtAssetId = value(pmt.assetId)
448448 let pmtAssetIdStr = toBase58String(pmtAssetId)
449449 let pmtMultX = MULTX6
450450 let amountX = toBigInt(amount)
451451 let totalStaked = getIntOrElse(keyLockParamTotalAmount(), 0)
452452 let totalStakedX = toBigInt(totalStaked)
453453 if ((0 > totalStaked))
454454 then throw("TODO: case is not supported")
455455 else if ((totalStaked == 0))
456456 then IncrementNotDistributedRewardEntry(pmtAssetIdStr, amount)
457457 else {
458458 let rewardPerNsbtX18 = fraction(amountX, MULTX18, totalStakedX)
459459 let depositNumLastKEY = keyDepositNumLast()
460460 let depositNumLast = getIntOrElse(depositNumLastKEY, -1)
461461 let depositNumNew = (depositNumLast + 1)
462462 if (!(contains(supportedAssetsStr, pmtAssetIdStr)))
463463 then throw(((supportedAssetsStr + " doesn't contain ") + pmtAssetIdStr))
464464 else {
465465 func refreshRewardPerNsbtSUM (accum,nextAsset) = {
466466 let rewardPerNsbtSumNewKEY = keyRewardPerNsbtSumAt(depositNumNew, nextAsset)
467467 let sumLastStr = getStrOrElse(keyRewardPerNsbtSumAt(depositNumLast, nextAsset), "0")
468468 (accum :+ (if ((nextAsset == pmtAssetIdStr))
469469 then StringEntry(rewardPerNsbtSumNewKEY, toString((parseBigIntValue(sumLastStr) + rewardPerNsbtX18)))
470470 else StringEntry(rewardPerNsbtSumNewKEY, sumLastStr)))
471471 }
472472
473473 ({
474474 let $l = supportedAssetsList
475475 let $s = size($l)
476476 let $acc0 = nil
477477 func $f0_1 ($a,$i) = if (($i >= $s))
478478 then $a
479479 else refreshRewardPerNsbtSUM($a, $l[$i])
480480
481481 func $f0_2 ($a,$i) = if (($i >= $s))
482482 then $a
483483 else throw("List size exceeds 10")
484484
485485 $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)
486486 } :+ IntegerEntry(depositNumLastKEY, depositNumNew))
487487 }
488488 }
489489 }
490490
491491
492492
493493 @Callable(i)
494494 func claimRewards () = commonClaim(i.caller, i)
495495
496496
497497
498498 @Callable(i)
499499 func claimRewardsByOriginCaller () = commonClaim(i.originCaller, i)
500500
501501
502502
503503 @Callable(i)
504504 func unclaimedRewardsREADONLY (userAddressStr) = {
505505 func forEachAssetZeroReward (accum,asset) = ((accum + makeString([asset, "0", "0"], ":")) + "_")
506506
507507 let unclaimedRewardStr = if ((userAddressStr == ""))
508508 then {
509509 let $l = supportedAssetsList
510510 let $s = size($l)
511511 let $acc0 = ""
512512 func $f0_1 ($a,$i) = if (($i >= $s))
513513 then $a
514514 else forEachAssetZeroReward($a, $l[$i])
515515
516516 func $f0_2 ($a,$i) = if (($i >= $s))
517517 then $a
518518 else throw("List size exceeds 10")
519519
520520 $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)
521521 }
522522 else {
523523 let userAddress = addressFromStringValue(userAddressStr)
524- let $t02008920194 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
525- let isNewUser = $t02008920194._1
526- let stakedAmount = $t02008920194._2
527- let stakingStart = $t02008920194._3
524+ let $t01833618441 = valueOrElse(getUserParamsOrUnit(userAddress), $Tuple3(true, 0, 0))
525+ let isNewUser = $t01833618441._1
526+ let stakedAmount = $t01833618441._2
527+ let stakingStart = $t01833618441._3
528528 let stakedAmountX = toBigInt(stakedAmount)
529529 let userRewardFromDepositNumKEY = keyUserRewardFromDepositNum(userAddressStr)
530530 let depositNumUser = getIntOrElse(userRewardFromDepositNumKEY, -1)
531531 let depositNumLast = getIntOrElse(keyDepositNumLast(), -1)
532532 func forEachAssetCalcUnclaimedReward (accum,asset) = {
533- let $t02054020678 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
534- let rewardTotal = $t02054020678._1
535- let cached = $t02054020678._2
536- let dynamic = $t02054020678._3
537- let rewardCachedPartKEY = $t02054020678._4
533+ let $t01878718925 = calcReward(userAddressStr, asset, stakedAmountX, depositNumUser, depositNumLast)
534+ let rewardTotal = $t01878718925._1
535+ let cached = $t01878718925._2
536+ let dynamic = $t01878718925._3
537+ let rewardCachedPartKEY = $t01878718925._4
538538 let claimed = valueOrElse(getInteger(keyClaimed(userAddressStr, asset)), 0)
539539 ((accum + makeString([asset, toString(rewardTotal), toString(claimed)], ":")) + "_")
540540 }
541541
542542 let $l = supportedAssetsList
543543 let $s = size($l)
544544 let $acc0 = ""
545545 func $f0_1 ($a,$i) = if (($i >= $s))
546546 then $a
547547 else forEachAssetCalcUnclaimedReward($a, $l[$i])
548548
549549 func $f0_2 ($a,$i) = if (($i >= $s))
550550 then $a
551551 else throw("List size exceeds 10")
552552
553553 $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)
554554 }
555555 $Tuple2(nil, dropRight(unclaimedRewardStr, 1))
556556 }
557557
558558
559559
560560 @Callable(i)
561561 func usdnStakingSYSREADONLY (userAddressStrOrEmpty,usdnDiff) = {
562562 let usdnTotal = getIntOrElse(keyLockParamTotalAmount(), 0)
563563 if ((userAddressStrOrEmpty == ""))
564564 then $Tuple2(nil, [0, usdnTotal, 0, 0, 0, height, height])
565565 else {
566566 let userAddress = toAddressOrFail(userAddressStrOrEmpty)
567567 let mergedData = mergeStake(userAddress, usdnDiff)
568568 let isNewUser = mergedData._1
569569 let stakedAmount = mergedData._2
570570 let vpEffectiveHeight = mergedData._3
571571 let stakedAmountNEW = mergedData._4
572572 let vpEffectiveHeightNEW = mergedData._5
573573 let usdnUser = stakedAmount
574574 $Tuple2(nil, [usdnUser, usdnTotal, 0, 0, vpEffectiveHeight, vpEffectiveHeightNEW])
575575 }
576576 }
577577
578578
579579
580580 @Callable(i)
581581 func configSYSREADONLY () = {
582582 let minLockAmt = getIntegerValue(keyMinLockAmount())
583583 $Tuple2(nil, [minLockAmt])
584584 }
585585
586586

github/deemru/w8io/3ef1775 
129.52 ms