tx · 5Vh1TtD7STTgQD7SWojWL9jQxshJdRXxpeVYaD7JPQgL

3P975LUuqc7uBPiSxp3nemf2FZh62zfirSh:  -0.02300000 Waves

2023.01.24 08:52 [3484152] smart account 3P975LUuqc7uBPiSxp3nemf2FZh62zfirSh > SELF 0.00000000 Waves

{ "type": 13, "id": "5Vh1TtD7STTgQD7SWojWL9jQxshJdRXxpeVYaD7JPQgL", "fee": 2300000, "feeAssetId": null, "timestamp": 1674539591101, "version": 2, "chainId": 87, "sender": "3P975LUuqc7uBPiSxp3nemf2FZh62zfirSh", "senderPublicKey": "6Dx2LuCqezyDYjt3zMEL6WRrs5oaor6aK3L6QouPMP1b", "proofs": [ "43vNgbhCUodiEeXjGkCU5yALkXhyw8cS9wpkNbmEJVKeDxHqgq552byxzQX2c294beYWGUNdncgEVFPtW7zvYJSu" ], "script": "base64:BgInCAISAwoBBBIECgIIBBIDCgEIEgMKAQgSBAoCCAgSBAoCCAgSABIAEAAPY3JlYXRpb25BZGRyZXNzCQEHQWRkcmVzcwEBGgFXk93E0hfnIAr99yESTvDwdmcmgwN41FxMABRzaWduQXJ0SXNzdWVyQWRkcmVzcwkBB0FkZHJlc3MBARoBV3tk1VvWnhe5qtPmj/wDXMjEFvibuoYp4gALVVNEVEFzc2V0SWQBIB6UBxNSdqEllf3IYaiCXxB/3zpPKbv8mkY/Wv02T5+RAA50b3RhbFN0YWtlZEtleQIMdG90YWxfc3Rha2VkAA10b3RhbFBvd2VyS2V5Agt0b3RhbF9wb3dlcgASdG90YWxTcGVudFBvd2VyS2V5AhB0b3RhbF9zcGVudFBvd2VyABF2b3RlUG93ZXJMaW1pdEtleQIQVk9URV9QT1dFUl9MSU1JVAAWY3VycmVudFJld29yZHNSb3VuZEtleQIVY3VycmVudF9yZXdvcmRzX3JvdW5kABhmaW5hbFZvdGluZ0NhbmRpZGF0ZXNLZXkCGGZpbmFsX3ZvaXRpbmdfY2FuZGlkYXRlcwAVYWxsU3Rha2VkQWRkcmVzc2VzS2V5AhRhbGxfc3Rha2VkX2FkZHJlc3NlcwAXUHV6emxlRHJhZ29uc1NpZ25BcnRJZHMJAMwIAgIsOWlQTHNZb3o4Zk55VXA5cWNnZUFGUHBNaktHY2I0bU5VUmhBWjdkZnpYZWoJAMwIAgIsMks4NDdHZEFjcWFISFluMWRTUzFGM05Zcml1cXVKS0t6TW9CRVMxY240TWIJAMwIAgIsN0QxZUNWZU1iakhMcGpZdXFLWjk2TG9XUHdENzFxdXd1V3BaeGN1S25rSjcJAMwIAgIrempFNWR3VHYzQXVrUWo2eE15ZGRqY3FBODJiS3ZTTkxlYUtMaG5GWUtHZgkAzAgCAiw0VDhRU3JMTHFVcEhwaThTZWNTUVQxcDV0R28xQ0Fza1RHZ1lnVW1YQllFYgkAzAgCAixBakhrdnhKcGd4eDhVQU1tejZndnhqdEJhbkdCSGVFVWFZeHlnZHNUUmNWNgkAzAgCAiw0anJ1Rk0xZ3ZydE1IWGlLZHoyRUt0MTJmSEdqSDVNVDhZY1prRjZLVkdQNwkAzAgCAitaWjFjTThOM1VDM3VBZG9DWEp3VHdrbXBlVFNGanBOQjRHVmE1VXdZVkdTCQDMCAICLDZVQXZvakpwRnhVakFvUkZiM25oeENSVWRHekZDdnhDS25pTHRKcXhWazc3CQDMCAICLDJOU3ZwNUpYOFlUTlhXS1hwRTlraVpBMjJnZzRETTJZYzdtY2I5VTZQa3hCBQNuaWwBCGNoZWNrTkZUAQVhc3NldAQOaXNQdXp6bGVEcmFnb24EByRtYXRjaDAJAM8IAgUXUHV6emxlRHJhZ29uc1NpZ25BcnRJZHMJANgEAQgFBWFzc2V0AmlkAwkAAQIFByRtYXRjaDACA0ludAQBeAUHJG1hdGNoMAkAZwIFAXgAAAcDAwMDAwUOaXNQdXp6bGVEcmFnb24GCQAAAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUPY3JlYXRpb25BZGRyZXNzCQCsAgIJAKwCAgIEbmZ0XwkA2AQBCAUFYXNzZXQCaWQCB19pc3N1ZXIJAKUIAQUEdGhpcwkAAAIIBQVhc3NldAZpc3N1ZXIFD2NyZWF0aW9uQWRkcmVzcwcJAAACCAUFYXNzZXQIZGVjaW1hbHMAAAcJAAACCAUFYXNzZXQKcmVpc3N1YWJsZQcHCQAAAggFBWFzc2V0CHF1YW50aXR5AAEHAQtnZXRQb3dlck5GVAEFYXNzZXQEDmlzUHV6emxlRHJhZ29uBAckbWF0Y2gwCQDPCAIFF1B1enpsZURyYWdvbnNTaWduQXJ0SWRzCQDYBAEIBQVhc3NldAJpZAMJAAECBQckbWF0Y2gwAgNJbnQEAXgFByRtYXRjaDAJAGcCBQF4AAAHAwUOaXNQdXp6bGVEcmFnb24AKAQGcGFyYW1zCQERQGV4dHJOYXRpdmUoMTA1MykCBQ9jcmVhdGlvbkFkZHJlc3MJAKwCAgkArAICAgRuZnRfCQDYBAEIBQVhc3NldAJpZAIHX3BhcmFtcwMJAAACBQZwYXJhbXMCBGdvbGQAZAAoAQ5pc1ZvdGluZ0Nsb3NlZAEGdm90ZUlkBBB2b3RlQ29uZmlybWVkS2V5CQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAIKX2NvbmZpcm1lZAQPdm90ZVJlamVjdGVkS2V5CQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAIJX3JlamVjdGVkBAtpc0NvbmZpcm1lZAkBC3ZhbHVlT3JFbHNlAgkAoAgBBRB2b3RlQ29uZmlybWVkS2V5BwQKaXNSZWplY3RlZAkBC3ZhbHVlT3JFbHNlAgkAoAgBBQ92b3RlUmVqZWN0ZWRLZXkHAwULaXNDb25maXJtZWQGBQppc1JlamVjdGVkARVhZGRTdHJpbmdUb1N0YXRlQXJyYXkCB2RhdGFLZXkEaXRlbQQHYWxsRGF0YQkBC3ZhbHVlT3JFbHNlAgkAoggBBQdkYXRhS2V5AgADCQEBIQEJAQlpc0RlZmluZWQBCQCzCQIFB2FsbERhdGEFBGl0ZW0DCQAAAgkAsQIBBQdhbGxEYXRhAAAJAMwIAgkBC1N0cmluZ0VudHJ5AgUHZGF0YUtleQUEaXRlbQUDbmlsCQDMCAIJAQtTdHJpbmdFbnRyeQIFB2RhdGFLZXkJALsJAgkAzQgCCQC9CQIFB2FsbERhdGECASwFBGl0ZW0CASwFA25pbAUDbmlsARhyZW1vdmVJdGVtRnJvbVN0YXRlQXJyYXkCB2RhdGFLZXkEaXRlbQQHYWxsRGF0YQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEFB2RhdGFLZXkJAKwCAgkArAICAg9EYXRhIGZvciBrZXk6ICcFB2RhdGFLZXkCCycgbm90IGZvdW5kAwkBCWlzRGVmaW5lZAEJALMJAgUHYWxsRGF0YQUEaXRlbQQIZGF0YUxpc3QJAL0JAgUHYWxsRGF0YQIBLAQJaXRlbUluZGV4CQEFdmFsdWUBCQDPCAIFCGRhdGFMaXN0BQRpdGVtCQDMCAIJAQtTdHJpbmdFbnRyeQIFB2RhdGFLZXkJALsJAgkA0QgCBQhkYXRhTGlzdAUJaXRlbUluZGV4AgEsBQNuaWwFA25pbAgBaQEFc3Rha2UBBWRlYnVnBAphZGRyZXNzU3RyCQClCAEIBQFpBmNhbGxlcgQBcAMJAGYCCQCQAwEIBQFpCHBheW1lbnRzAAAJAJEDAggFAWkIcGF5bWVudHMAAAkAAgECC05vIHBheW1lbnRzBAVhc3NldAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAggFAXAHYXNzZXRJZAIPSW52YWxpZCBwYXltZW50AhBJbnZhbGlkIGFzc2V0IElkAwUFZGVidWcJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIOcGF5bWVudHMgc2l6ZSAJAKQDAQkAkAMBCAUBaQhwYXltZW50cwIJIGFzc2V0SWQgCQDYBAEJAQV2YWx1ZQEIBQFwB2Fzc2V0SWQCCCBhbW91bnQgCQCkAwEIBQFwBmFtb3VudAMDCQBmAggFAXAGYW1vdW50AAAJAQhjaGVja05GVAEFBWFzc2V0BwQLdG90YWxTdGFrZWQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUOdG90YWxTdGFrZWRLZXkAAAQKdG90YWxQb3dlcgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQ10b3RhbFBvd2VyS2V5AAAED2FkZHJlc3NQb3dlcktleQkArAICCQCsAgICCGFkZHJlc3NfBQphZGRyZXNzU3RyAgZfcG93ZXIEFWFkZHJlc3NUb3RhbFN0YWtlZEtleQkArAICCQCsAgICCGFkZHJlc3NfBQphZGRyZXNzU3RyAgxfdG90YWxTdGFrZWQEFGFkZHJlc3NTdGFrZWROZnRzS2V5CQCsAgIJAKwCAgIIYWRkcmVzc18FCmFkZHJlc3NTdHICC19zdGFrZWROZnRzBAxhZGRyZXNzUG93ZXIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUPYWRkcmVzc1Bvd2VyS2V5AAAEEmFkZHJlc3NUb3RhbFN0YWtlZAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRVhZGRyZXNzVG90YWxTdGFrZWRLZXkAAAQRYWRkcmVzc1N0YWtlZE5mdHMJAQt2YWx1ZU9yRWxzZQIJAKIIAQUUYWRkcmVzc1N0YWtlZE5mdHNLZXkCAAMJAGYCCQBkAgUSYWRkcmVzc1RvdGFsU3Rha2VkAAEABQkAAgECGVlvdSBjYW4gc3Rha2Ugb25seSA1IE5GVHMECG5mdFBvd2VyCQELZ2V0UG93ZXJORlQBBQVhc3NldAQIbmZ0SWRTdHIJANgEAQgFBWFzc2V0AmlkBBZhZGRyZXNzU3Rha2VkTmZ0c1N0YXRlAwkAAAIJALECAQURYWRkcmVzc1N0YWtlZE5mdHMAAAkAzAgCCQELU3RyaW5nRW50cnkCBRRhZGRyZXNzU3Rha2VkTmZ0c0tleQUIbmZ0SWRTdHIFA25pbAkAzAgCCQELU3RyaW5nRW50cnkCBRRhZGRyZXNzU3Rha2VkTmZ0c0tleQkAuQkCCQDNCAIJALUJAgURYWRkcmVzc1N0YWtlZE5mdHMCASwFCG5mdElkU3RyAgEsBQNuaWwJAM4IAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ50b3RhbFN0YWtlZEtleQkAZAIFC3RvdGFsU3Rha2VkAAEJAMwIAgkBDEludGVnZXJFbnRyeQIFDXRvdGFsUG93ZXJLZXkJAGQCBQp0b3RhbFBvd2VyBQhuZnRQb3dlcgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIEbmZ0XwUIbmZ0SWRTdHICBl9vd25lcgUKYWRkcmVzc1N0cgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICBG5mdF8FCG5mdElkU3RyAgZfcG93ZXIFCG5mdFBvd2VyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9hZGRyZXNzUG93ZXJLZXkJAGQCBQxhZGRyZXNzUG93ZXIFCG5mdFBvd2VyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRVhZGRyZXNzVG90YWxTdGFrZWRLZXkJAGQCBRJhZGRyZXNzVG90YWxTdGFrZWQAAQUDbmlsCQEVYWRkU3RyaW5nVG9TdGF0ZUFycmF5AgUVYWxsU3Rha2VkQWRkcmVzc2VzS2V5BQphZGRyZXNzU3RyBRZhZGRyZXNzU3Rha2VkTmZ0c1N0YXRlCQACAQILTm8gcGF5bWVudHMBaQEHdW5zdGFrZQIIbmZ0SWRTdHIFZGVidWcECmFkZHJlc3NTdHIJAKUIAQgFAWkGY2FsbGVyBAVhc3NldAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEJANkEAQUIbmZ0SWRTdHICDkludmFsaWQgbmZ0IElkBAxvd25lckFkZHJlc3MJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQCsAgIJAKwCAgIEbmZ0XwUIbmZ0SWRTdHICBl9vd25lcgIST3duZXIgZGF0YSBpbnZhbGlkAwkBAiE9AgUMb3duZXJBZGRyZXNzBQphZGRyZXNzU3RyCQACAQIVWW91IGFyZSBub3QgdGhlIG93bmVyAwkBCGNoZWNrTkZUAQUFYXNzZXQEC3RvdGFsU3Rha2VkCQELdmFsdWVPckVsc2UCCQCfCAEFDnRvdGFsU3Rha2VkS2V5AAAECnRvdGFsUG93ZXIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUNdG90YWxQb3dlcktleQAABA9hZGRyZXNzUG93ZXJLZXkJAKwCAgkArAICAghhZGRyZXNzXwUKYWRkcmVzc1N0cgIGX3Bvd2VyBBVhZGRyZXNzVG90YWxTdGFrZWRLZXkJAKwCAgkArAICAghhZGRyZXNzXwUKYWRkcmVzc1N0cgIMX3RvdGFsU3Rha2VkBBRhZGRyZXNzU3Rha2VkTmZ0c0tleQkArAICCQCsAgICCGFkZHJlc3NfBQphZGRyZXNzU3RyAgtfc3Rha2VkTmZ0cwQMYWRkcmVzc1Bvd2VyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQUPYWRkcmVzc1Bvd2VyS2V5Ah1BZGRyZXNzIHBvd2VyIHZhbHVlIG5vdCBmb3VuZAQSYWRkcmVzc1RvdGFsU3Rha2VkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQUVYWRkcmVzc1RvdGFsU3Rha2VkS2V5AiRBZGRyZXNzIHRvdGFsIHN0YWtlZCB2YWx1ZSBub3QgZm91bmQEEWFkZHJlc3NTdGFrZWROZnRzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQUUYWRkcmVzc1N0YWtlZE5mdHNLZXkCI0FkZHJlc3Mgc3Rha2VkIE5mdHMgdmFsdWUgbm90IGZvdW5kBA1uZnRBc3NldElkU3RyCQDYBAEIBQVhc3NldAJpZAQIbmZ0UG93ZXIJARFAZXh0ck5hdGl2ZSgxMDU1KQEJAKwCAgkArAICAgRuZnRfBQ1uZnRBc3NldElkU3RyAgZfcG93ZXIEE3VwZGF0ZWRBZGRyZXNzUG93ZXIJAGUCBQxhZGRyZXNzUG93ZXIFCG5mdFBvd2VyBBNyZW1vdmVTdGFrZWRBZGRyZXNzAwkAAAIFE3VwZGF0ZWRBZGRyZXNzUG93ZXIAAAkBGHJlbW92ZUl0ZW1Gcm9tU3RhdGVBcnJheQIFFWFsbFN0YWtlZEFkZHJlc3Nlc0tleQUKYWRkcmVzc1N0cgUDbmlsBBVhZGRyZXNzU3Rha2VkTmZ0c0xpc3QJALUJAgURYWRkcmVzc1N0YWtlZE5mdHMCASwEFWFkZHJlc3NTdGFrZWROZnRJbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFFWFkZHJlc3NTdGFrZWROZnRzTGlzdAUIbmZ0SWRTdHICJU5GVCBub3QgZm91bmVkIGluIGFkZHJlc3Mgc3Rha2VkIGxpc3QJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIAAQgFBWFzc2V0AmlkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ50b3RhbFN0YWtlZEtleQkAZQIFC3RvdGFsU3Rha2VkAAEJAMwIAgkBDEludGVnZXJFbnRyeQIFDXRvdGFsUG93ZXJLZXkJAGUCBQp0b3RhbFBvd2VyBQhuZnRQb3dlcgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgIEbmZ0XwUNbmZ0QXNzZXRJZFN0cgIGX293bmVyCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICAgRuZnRfBQ1uZnRBc3NldElkU3RyAgZfcG93ZXIJAMwIAgkBDEludGVnZXJFbnRyeQIFD2FkZHJlc3NQb3dlcktleQUTdXBkYXRlZEFkZHJlc3NQb3dlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgUVYWRkcmVzc1RvdGFsU3Rha2VkS2V5CQBlAgUSYWRkcmVzc1RvdGFsU3Rha2VkAAEJAMwIAgkBC1N0cmluZ0VudHJ5AgUUYWRkcmVzc1N0YWtlZE5mdHNLZXkJALkJAgkA0QgCBRVhZGRyZXNzU3Rha2VkTmZ0c0xpc3QFFWFkZHJlc3NTdGFrZWROZnRJbmRleAIBLAUDbmlsBRNyZW1vdmVTdGFrZWRBZGRyZXNzCQACAQIOSW52YWxpZCBuZnQgSWQBaQEKc2VuZFRvVm90ZQEMY29sbGVjdGlvbklkBAZpc3N1ZXIJAJEDAgkAtQkCBQxjb2xsZWN0aW9uSWQCAV8AAAQHaXNFeGlzdAQHJG1hdGNoMAkAoggBCQCsAgIJAKwCAgILY29sbGVjdGlvbl8FDGNvbGxlY3Rpb25JZAIHX3ZvdGVJZAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXQFByRtYXRjaDAGBwMJAAACCQCxAgEFBmlzc3VlcgAACQACAQIbQ29sbGVjdGlvbiBpc3N1ZXIgbm90IGZvdW5kAwUHaXNFeGlzdAkAAgECMENvbGxlY3Rpb24gaGFzIGFscmVhZHkgYmVlbiBzdWJtaXR0ZWQgZm9yIHZvdGluZwMJAQIhPQIFBmlzc3VlcgkApQgBCAUBaQZjYWxsZXIJAAIBAiZPbmx5IHRoZSBpc3N1ZXIgY2FuIHN1Ym1pdCB0byB0aGUgdm90ZQQGdm90ZUlkCQDYBAEJANQWAQkAmwMBBQxjb2xsZWN0aW9uSWQECnRvdGFsVm90ZXMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQILdG90YWxfdm90ZXMAAAQLcXVvcnVtTGltaXQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBRF2b3RlUG93ZXJMaW1pdEtleQIaVm90ZSBwb3dlciBsaW1pdCBub3QgZm91bmQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICC2NvbGxlY3Rpb25fBQxjb2xsZWN0aW9uSWQCB192b3RlSWQFBnZvdGVJZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAINX2NvbGxlY3Rpb25JZAUMY29sbGVjdGlvbklkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAgZfb3duZXIJAKUIAQgFAWkGY2FsbGVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAIKX2NyZWF0ZWRBdAUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAIHX3F1b3J1bQULcXVvcnVtTGltaXQJAMwIAgkBDEludGVnZXJFbnRyeQICC3RvdGFsX3ZvdGVzCQBkAgUKdG90YWxWb3RlcwABBQNuaWwBaQEOcmVtb3ZlRnJvbVZvdGUBBnZvdGVJZAQMY29sbGVjdGlvbklkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCDV9jb2xsZWN0aW9uSWQCF0NvbGxlY3Rpb24gSWQgbm90IGZvdW5kBAVvd25lcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAgZfb3duZXICD093bmVyIG5vdCBmb3VuZAMJAQIhPQIFBW93bmVyCQClCAEIBQFpBmNhbGxlcgkAAgECFVlvdSBhcmUgbm90IHRoZSBvd25lcgMJAQ5pc1ZvdGluZ0Nsb3NlZAEFBnZvdGVJZAkAAgECEFZvdGluZyBpcyBjbG9zZWQECnRvdGFsVm90ZXMJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBAgt0b3RhbF92b3RlcwIbdG90YWwgdm90ZXMgdmFsdWUgbm90IGZvdW5kCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICAgtjb2xsZWN0aW9uXwUMY29sbGVjdGlvbklkAgdfdm90ZUlkCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAg1fY29sbGVjdGlvbklkCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAgZfb3duZXIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCCl9jcmVhdGVkQXQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCB19xdW9ydW0JAMwIAgkBDEludGVnZXJFbnRyeQICC3RvdGFsX3ZvdGVzCQBlAgUKdG90YWxWb3RlcwABBQNuaWwBaQEJdm90ZUJ5TkZUAgZ2b3RlSWQGYXNzZXRzBAphZGRyZXNzU3RyCQClCAEIBQFpBmNhbGxlcgQMY29sbGVjdGlvbklkCQELdmFsdWVPckVsc2UCCQCiCAEJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAg1fY29sbGVjdGlvbklkAgADCQEOaXNWb3RpbmdDbG9zZWQBBQZ2b3RlSWQJAAIBAhBWb3RpbmcgaXMgY2xvc2VkAwkAAAIJALECAQUMY29sbGVjdGlvbklkAAAJAAIBAhRDb2xsZWN0aW9uIG5vdCBmb3VuZAMJAAACCQCxAgEFBmFzc2V0cwAACQACAQIUQXNzZXRzIGxpc3QgaXMgZW1wdHkEDnZvdGVVcFBvd2VyS2V5CQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAIIX3VwUG93ZXIEEHZvdGVEb3duUG93ZXJLZXkJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAgpfZG93blBvd2VyBBF2b3RlVG90YWxQb3dlcktleQkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCC190b3RhbFBvd2VyBA92b3RlVXNlZE5mdHNLZXkJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAglfdXNlZE5mdHMEEnZvdGVyU3BlbnRQb3dlcktleQkArAICCQCsAgICBnZvdGVyXwUKYWRkcmVzc1N0cgILX3NwZW50UG93ZXIEFHZvdGVyVm90ZVVzZWROZnRzS2V5CQCsAgIJAKwCAgkArAICCQCsAgICBnZvdGVyXwUKYWRkcmVzc1N0cgIGX3ZvdGVfBQZ2b3RlSWQCCV91c2VkTmZ0cwQWdm90ZXJWb3RlU3BlbnRQb3dlcktleQkArAICCQCsAgIJAKwCAgkArAICAgZ2b3Rlcl8FCmFkZHJlc3NTdHICBl92b3RlXwUGdm90ZUlkAgtfc3BlbnRQb3dlcgQPYWRkcmVzc1Bvd2VyS2V5CQCsAgIJAKwCAgIIYWRkcmVzc18FCmFkZHJlc3NTdHICBl9wb3dlcgQUYWRkcmVzc1N0YWtlZE5mdHNLZXkJAKwCAgkArAICAghhZGRyZXNzXwUKYWRkcmVzc1N0cgILX3N0YWtlZE5mdHMEC3VwUG93ZXJEYXBwCQELdmFsdWVPckVsc2UCCQCfCAEFDnZvdGVVcFBvd2VyS2V5AAAEDWRvd25Qb3dlckRhcHAJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUQdm90ZURvd25Qb3dlcktleQAABA50b3RhbFZvdGVQb3dlcgkBC3ZhbHVlT3JFbHNlAgkAnwgBBRF2b3RlVG90YWxQb3dlcktleQAABAx2b3RlVXNlZE5mdHMJAQt2YWx1ZU9yRWxzZQIJAKIIAQUPdm90ZVVzZWROZnRzS2V5AgAED3ZvdGVyU3BlbnRQb3dlcgkBC3ZhbHVlT3JFbHNlAgkAnwgBBRJ2b3RlclNwZW50UG93ZXJLZXkAAAQRdm90ZXJWb3RlVXNlZE5mdHMJAQt2YWx1ZU9yRWxzZQIJAKIIAQUUdm90ZXJWb3RlVXNlZE5mdHNLZXkCAAQPdG90YWxTcGVudFBvd2VyCQELdmFsdWVPckVsc2UCCQCfCAEFEnRvdGFsU3BlbnRQb3dlcktleQAABBN2b3RlclZvdGVTcGVudFBvd2VyCQELdmFsdWVPckVsc2UCCQCfCAEFFnZvdGVyVm90ZVNwZW50UG93ZXJLZXkAAAQMYWRkcmVzc1Bvd2VyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQUPYWRkcmVzc1Bvd2VyS2V5AhRZb3UgZG9uJ3QgaGF2ZSBwb3dlcgQRYWRkcmVzc1N0YWtlZE5mdHMJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBBRRhZGRyZXNzU3Rha2VkTmZ0c0tleQIaWW91IGRvbid0IGhhdmUgc3Rha2VkIE5GVHMEGWFkZGVyc3NMYXN0UmV3YXJkUm91bmRLZXkJAKwCAgkArAICAghhZGRyZXNzXwUKYWRkcmVzc1N0cgIRX2xhc3RSZXdhcmRzUm91bmQEE2N1cnJlbnRSZXdvcmRzUm91bmQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUWY3VycmVudFJld29yZHNSb3VuZEtleQAABBZhZGRlcnNzTGFzdFJld2FyZFJvdW5kCQELdmFsdWVPckVsc2UCCQCfCAEFGWFkZGVyc3NMYXN0UmV3YXJkUm91bmRLZXkAAAQKYXNzZXRzTGlzdAkAtQkCBQZhc3NldHMCAXwEEHZvdGVVc2VkTmZ0c0xpc3QDCQAAAgkAsQIBBQx2b3RlVXNlZE5mdHMAAAUDbmlsCQC9CQIFDHZvdGVVc2VkTmZ0cwIBLAQVdm90ZXJWb3RlVXNlZE5mdHNMaXN0AwkAAAIJALECAQURdm90ZXJWb3RlVXNlZE5mdHMAAAUDbmlsCQC9CQIFEXZvdGVyVm90ZVVzZWROZnRzAgEsCgENcHJvY2Vzc0Fzc2V0cwIFYWNjdW0EbmV4dAQFcGFydHMJALUJAgUEbmV4dAIBXwQFbmZ0SWQJAJEDAgUFcGFydHMAAAQEdHlwZQkAkQMCBQVwYXJ0cwABBAVwb3dlcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEJAKwCAgkArAICAgRuZnRfBQVuZnRJZAIGX3Bvd2VyAhNORlQgcG93ZXIgbm90IGZvdW5kBBBzdGFrZWRPd25lckluZGV4CQELdmFsdWVPckVsc2UCCQCzCQIFEWFkZHJlc3NTdGFrZWROZnRzBQVuZnRJZAD///////////8BAwkAAAIFBXBvd2VyAAAJAAIBAhdQb3dlciBtdXN0IGJlIG1vcmUgemVybwMJAAACBRBzdGFrZWRPd25lckluZGV4AP///////////wEJAAIBAhxBc3NldCBkb2VzIG5vdCBiZWxvbmcgdG8geW91BAphc3NldEluZGV4CQELdmFsdWVPckVsc2UCCQDPCAIFEHZvdGVVc2VkTmZ0c0xpc3QFBW5mdElkAP///////////wEDCQAAAgUKYXNzZXRJbmRleAD///////////8BAwMJAQIhPQIFBHR5cGUCAnVwCQECIT0CBQR0eXBlAgRkb3duBwkAAgECDEludmFsaWQgdHlwZQkAlgoECQBkAggFBWFjY3VtAl8xAwkAAAIFBHR5cGUCAnVwBQVwb3dlcgAACQBkAggFBWFjY3VtAl8yAwkAAAIFBHR5cGUCBGRvd24FBXBvd2VyAAAJAM0IAggFBWFjY3VtAl8zBQVuZnRJZAkAzQgCCAUFYWNjdW0CXzQJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgZ2b3Rlcl8FCmFkZHJlc3NTdHICBl92b3RlXwUGdm90ZUlkAglfYXNzZXRJZF8FBW5mdElkCQCsAgIJAKwCAgkArAICCQCsAgIFBHR5cGUCAToJAKQDAQUFcG93ZXICAToJAKQDAQUGaGVpZ2h0BQVhY2N1bQQScHJvY2Vzc1Jlc3VsdFR1cGxlCgACJGwFCmFzc2V0c0xpc3QKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCWCgQAAAAABQNuaWwFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQENcHJvY2Vzc0Fzc2V0cwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUEB3VwUG93ZXIIBRJwcm9jZXNzUmVzdWx0VHVwbGUCXzEECWRvd25Qb3dlcggFEnByb2Nlc3NSZXN1bHRUdXBsZQJfMgQKcG93ZXJWYWx1ZQkAZAIFB3VwUG93ZXIFCWRvd25Qb3dlcgMJAGYCBQpwb3dlclZhbHVlBQxhZGRyZXNzUG93ZXIJAAIBAiJQb3dlciBleGNlZWRzIHBvd2VyIG9mIHRoZSBhY2NvdW50AwkAAAIFCnBvd2VyVmFsdWUAAAkAAgECGE5vdCBlbm91Z2ggcG93ZXIgdG8gdm90ZQMJAAACCQCQAwEIBRJwcm9jZXNzUmVzdWx0VHVwbGUCXzMAAAkAAgECG1VzZWQgbGlzdCBtdXN0IG5vdCBiZSBlbXB0eQMJAAACCQCQAwEIBRJwcm9jZXNzUmVzdWx0VHVwbGUCXzQAAAkAAgECJFN0YXRlIGVudHJpZXMgbGlzdCBtdXN0IG5vdCBiZSBlbXB0eQQLcXVvcnVtTGltaXQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBRF2b3RlUG93ZXJMaW1pdEtleQIaVm90ZSBwb3dlciBsaW1pdCBub3QgZm91bmQEFHVwZGF0ZUNhbmRpdGF0ZXNMaXN0AwkAZgIJAGQCBQ50b3RhbFZvdGVQb3dlcgUKcG93ZXJWYWx1ZQULcXVvcnVtTGltaXQJARVhZGRTdHJpbmdUb1N0YXRlQXJyYXkCBRhmaW5hbFZvdGluZ0NhbmRpZGF0ZXNLZXkFBnZvdGVJZAUDbmlsBBhhZGRyZXNzUmV3b3Jkc1JvdW5kU3RhdGUDAwkAAAIFFmFkZGVyc3NMYXN0UmV3YXJkUm91bmQAAAkAZgIFE2N1cnJlbnRSZXdvcmRzUm91bmQFFmFkZGVyc3NMYXN0UmV3YXJkUm91bmQHCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRlhZGRlcnNzTGFzdFJld2FyZFJvdW5kS2V5BRNjdXJyZW50UmV3b3Jkc1JvdW5kBQNuaWwFA25pbAkAzggCCQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUSdm90ZXJTcGVudFBvd2VyS2V5CQBkAgUPdm90ZXJTcGVudFBvd2VyBQpwb3dlclZhbHVlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJ0b3RhbFNwZW50UG93ZXJLZXkJAGQCBQ90b3RhbFNwZW50UG93ZXIFCnBvd2VyVmFsdWUJAMwIAgkBDEludGVnZXJFbnRyeQIFDnZvdGVVcFBvd2VyS2V5CQBkAgULdXBQb3dlckRhcHAFB3VwUG93ZXIJAMwIAgkBDEludGVnZXJFbnRyeQIFEHZvdGVEb3duUG93ZXJLZXkJAGQCBQ1kb3duUG93ZXJEYXBwBQlkb3duUG93ZXIJAMwIAgkBDEludGVnZXJFbnRyeQIFEXZvdGVUb3RhbFBvd2VyS2V5CQBkAgUOdG90YWxWb3RlUG93ZXIFCnBvd2VyVmFsdWUJAMwIAgkBDEludGVnZXJFbnRyeQIFFnZvdGVyVm90ZVNwZW50UG93ZXJLZXkJAGQCBRN2b3RlclZvdGVTcGVudFBvd2VyBQpwb3dlclZhbHVlCQDMCAIJAQtTdHJpbmdFbnRyeQIFFHZvdGVyVm90ZVVzZWROZnRzS2V5CQC7CQIJAM4IAgUVdm90ZXJWb3RlVXNlZE5mdHNMaXN0CAUScHJvY2Vzc1Jlc3VsdFR1cGxlAl8zAgEsCQDMCAIJAQtTdHJpbmdFbnRyeQIFD3ZvdGVVc2VkTmZ0c0tleQkAuwkCCQDOCAIFEHZvdGVVc2VkTmZ0c0xpc3QIBRJwcm9jZXNzUmVzdWx0VHVwbGUCXzMCASwFA25pbAgFEnByb2Nlc3NSZXN1bHRUdXBsZQJfNAUUdXBkYXRlQ2FuZGl0YXRlc0xpc3QFGGFkZHJlc3NSZXdvcmRzUm91bmRTdGF0ZQFpAQt1bnZvdGVCeU5GVAIGdm90ZUlkBmFzc2V0cwQKYWRkcmVzc1N0cgkApQgBCAUBaQZjYWxsZXIEDGNvbGxlY3Rpb25JZAkBC3ZhbHVlT3JFbHNlAgkAoggBCQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAINX2NvbGxlY3Rpb25JZAIAAwkBDmlzVm90aW5nQ2xvc2VkAQUGdm90ZUlkCQACAQIQVm90aW5nIGlzIGNsb3NlZAMJAAACCQCxAgEFDGNvbGxlY3Rpb25JZAAACQACAQIUQ29sbGVjdGlvbiBub3QgZm91bmQEDnZvdGVVcFBvd2VyS2V5CQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAIIX3VwUG93ZXIEEHZvdGVEb3duUG93ZXJLZXkJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAgpfZG93blBvd2VyBBF2b3RlVG90YWxQb3dlcktleQkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCC190b3RhbFBvd2VyBA92b3RlVXNlZE5mdHNLZXkJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAglfdXNlZE5mdHMEEnZvdGVyU3BlbnRQb3dlcktleQkArAICCQCsAgICBnZvdGVyXwUKYWRkcmVzc1N0cgILX3NwZW50UG93ZXIEFHZvdGVyVm90ZVVzZWROZnRzS2V5CQCsAgIJAKwCAgkArAICCQCsAgICBnZvdGVyXwUKYWRkcmVzc1N0cgIGX3ZvdGVfBQZ2b3RlSWQCCV91c2VkTmZ0cwQWdm90ZXJWb3RlU3BlbnRQb3dlcktleQkArAICCQCsAgIJAKwCAgkArAICAgZ2b3Rlcl8FCmFkZHJlc3NTdHICBl92b3RlXwUGdm90ZUlkAgtfc3BlbnRQb3dlcgQPYWRkcmVzc1Bvd2VyS2V5CQCsAgIJAKwCAgIIYWRkcmVzc18FCmFkZHJlc3NTdHICBl9wb3dlcgQUYWRkcmVzc1N0YWtlZE5mdHNLZXkJAKwCAgkArAICAghhZGRyZXNzXwUKYWRkcmVzc1N0cgILX3N0YWtlZE5mdHMEC3VwUG93ZXJEYXBwCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQUOdm90ZVVwUG93ZXJLZXkCF1VwIHZvdGUgcG93ZXIgbm90IGZvdW5kBA1kb3duUG93ZXJEYXBwCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQUQdm90ZURvd25Qb3dlcktleQIZRG93biB2b3RlIHBvd2VyIG5vdCBmb3VuZAQOdG90YWxWb3RlUG93ZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBRF2b3RlVG90YWxQb3dlcktleQIaVG90YWwgdm90ZSBwb3dlciBub3QgZm91bmQEDHZvdGVVc2VkTmZ0cwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEFD3ZvdGVVc2VkTmZ0c0tleQIZVm90ZSB1c2VkIHBvd2VyIG5vdCBmb3VuZAQPdm90ZXJTcGVudFBvd2VyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQUSdm90ZXJTcGVudFBvd2VyS2V5AhtWb3RlciBzcGVudCBwb3dlciBub3QgZm91bmQEDXZvdGVyVXNlZE5mdHMJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBRR2b3RlclZvdGVVc2VkTmZ0c0tleQIeVm90ZXIgdm90ZSB1c2VkIG5mdHMgbm90IGZvdW5kBBF2b3RlclZvdGVVc2VkTmZ0cwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEFFHZvdGVyVm90ZVVzZWROZnRzS2V5AiNWb3RlciB2b3RlIHVzZWQgbmZ0cyBsaXN0IG5vdCBmb3VuZAQPdG90YWxTcGVudFBvd2VyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQUSdG90YWxTcGVudFBvd2VyS2V5AhtUb3RhbCBzcGVudCBwb3dlciBub3QgZm91bmQEE3ZvdGVyVm90ZVNwZW50UG93ZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBRZ2b3RlclZvdGVTcGVudFBvd2VyS2V5AiJBZGRyZXNzIHZvdGUgc3BlbnQgcG93ZXIgbm90IGZvdW5kBAxhZGRyZXNzUG93ZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBQ9hZGRyZXNzUG93ZXJLZXkCFFlvdSBkb24ndCBoYXZlIHBvd2VyBBFhZGRyZXNzU3Rha2VkTmZ0cwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEFFGFkZHJlc3NTdGFrZWROZnRzS2V5AhpZb3UgZG9uJ3QgaGF2ZSBzdGFrZWQgTkZUcwQKYXNzZXRzTGlzdAMJAGYCCQCxAgEFBmFzc2V0cwAACQC1CQIFBmFzc2V0cwIBfAMJAAACCQCxAgEFEXZvdGVyVm90ZVVzZWROZnRzAAAFA25pbAkAtQkCBRF2b3RlclZvdGVVc2VkTmZ0cwIBLAoBDXByb2Nlc3NBc3NldHMCBWFjY3VtBG5leHQECWFzc2V0Vm90ZQkBC3ZhbHVlT3JFbHNlAgkAoggBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIGdm90ZXJfBQphZGRyZXNzU3RyAgZfdm90ZV8FBnZvdGVJZAIJX2Fzc2V0SWRfBQRuZXh0AgAEBXBhcnRzCQC1CQIFCWFzc2V0Vm90ZQIBOgQEdHlwZQkAkQMCBQVwYXJ0cwAABAVwb3dlcgkBC3ZhbHVlT3JFbHNlAgkAtgkBCQCRAwIFBXBhcnRzAAEAAAQQc3Rha2VkT3duZXJJbmRleAkBC3ZhbHVlT3JFbHNlAgkAswkCBRFhZGRyZXNzU3Rha2VkTmZ0cwUEbmV4dAD///////////8BBBJ2b3RlclZvdGVVc2VkSW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCCAUFYWNjdW0CXzQFBG5leHQCH1ZvdGVyIHZvdGUgdXNlZCBpbmRleCBub3QgZm91bmQDCQAAAgkAsQIBBQlhc3NldFZvdGUAAAUFYWNjdW0DCQAAAgUFcG93ZXIAAAkAAgECF1Bvd2VyIG11c3QgYmUgbW9yZSB6ZXJvAwMJAGYCAAAFEnZvdGVyVm90ZVVzZWRJbmRleAkAAAIFEHN0YWtlZE93bmVySW5kZXgA////////////AQcJAAIBAhxBc3NldCBkb2VzIG5vdCBiZWxvbmcgdG8geW91BA5hc3NldFVzZWRJbmRleAkBC3ZhbHVlT3JFbHNlAgkAzwgCCAUFYWNjdW0CXzMFBG5leHQA////////////AQMJAGcCBQ5hc3NldFVzZWRJbmRleAAAAwMJAQIhPQIFBHR5cGUCAnVwCQECIT0CBQR0eXBlAgRkb3duBwkAAgECDEludmFsaWQgdHlwZQkAlwoFCQBkAggFBWFjY3VtAl8xAwkAAAIFBHR5cGUCAnVwBQVwb3dlcgAACQBkAggFBWFjY3VtAl8yAwkAAAIFBHR5cGUCBGRvd24FBXBvd2VyAAAJANEIAggFBWFjY3VtAl8zBQ5hc3NldFVzZWRJbmRleAkA0QgCCAUFYWNjdW0CXzQFEnZvdGVyVm90ZVVzZWRJbmRleAkAzQgCCAUFYWNjdW0CXzUJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgZ2b3Rlcl8FCmFkZHJlc3NTdHICBl92b3RlXwUGdm90ZUlkAglfYXNzZXRJZF8FBG5leHQFBWFjY3VtBBJwcm9jZXNzUmVzdWx0VHVwbGUKAAIkbAUKYXNzZXRzTGlzdAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJcKBQAAAAAJAL0JAgUMdm90ZVVzZWROZnRzAgEsCQC9CQIFEXZvdGVyVm90ZVVzZWROZnRzAgEsBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDXByb2Nlc3NBc3NldHMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFBAd1cFBvd2VyCAUScHJvY2Vzc1Jlc3VsdFR1cGxlAl8xBAlkb3duUG93ZXIIBRJwcm9jZXNzUmVzdWx0VHVwbGUCXzIECnBvd2VyVmFsdWUJAGQCBQd1cFBvd2VyBQlkb3duUG93ZXIDCQBmAgUKcG93ZXJWYWx1ZQUPdm90ZXJTcGVudFBvd2VyCQACAQIlUG93ZXIgdmFsdWUgZXhjZWVkcyB2b3RlciBzcGVudCBwb3dlcgMJAAACBQpwb3dlclZhbHVlAAAJAAIBAhpOb3QgZW5vdWdoIHBvd2VyIHRvIHVudm90ZQMJAAACCQCQAwEIBRJwcm9jZXNzUmVzdWx0VHVwbGUCXzUAAAkAAgECJFN0YXRlIGVudHJpZXMgbGlzdCBtdXN0IG5vdCBiZSBlbXB0eQQLcXVvcnVtTGltaXQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBRF2b3RlUG93ZXJMaW1pdEtleQIaVm90ZSBwb3dlciBsaW1pdCBub3QgZm91bmQEFHVwZGF0ZUNhbmRpdGF0ZXNMaXN0AwkAZgIFC3F1b3J1bUxpbWl0CQBlAgUOdG90YWxWb3RlUG93ZXIFCnBvd2VyVmFsdWUJARhyZW1vdmVJdGVtRnJvbVN0YXRlQXJyYXkCBRhmaW5hbFZvdGluZ0NhbmRpZGF0ZXNLZXkFBnZvdGVJZAUDbmlsCQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUSdm90ZXJTcGVudFBvd2VyS2V5CQBlAgUPdm90ZXJTcGVudFBvd2VyBQpwb3dlclZhbHVlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJ0b3RhbFNwZW50UG93ZXJLZXkJAGUCBQ90b3RhbFNwZW50UG93ZXIFCnBvd2VyVmFsdWUJAMwIAgkBDEludGVnZXJFbnRyeQIFDnZvdGVVcFBvd2VyS2V5CQBlAgULdXBQb3dlckRhcHAFB3VwUG93ZXIJAMwIAgkBDEludGVnZXJFbnRyeQIFEHZvdGVEb3duUG93ZXJLZXkJAGUCBQ1kb3duUG93ZXJEYXBwBQlkb3duUG93ZXIJAMwIAgkBDEludGVnZXJFbnRyeQIFEXZvdGVUb3RhbFBvd2VyS2V5CQBlAgUOdG90YWxWb3RlUG93ZXIFCnBvd2VyVmFsdWUJAMwIAgkBDEludGVnZXJFbnRyeQIFFnZvdGVyVm90ZVNwZW50UG93ZXJLZXkJAGUCBRN2b3RlclZvdGVTcGVudFBvd2VyBQpwb3dlclZhbHVlCQDMCAIJAQtTdHJpbmdFbnRyeQIFFHZvdGVyVm90ZVVzZWROZnRzS2V5CQC7CQIIBRJwcm9jZXNzUmVzdWx0VHVwbGUCXzQCASwJAMwIAgkBC1N0cmluZ0VudHJ5AgUPdm90ZVVzZWROZnRzS2V5CQC7CQIIBRJwcm9jZXNzUmVzdWx0VHVwbGUCXzMCASwFA25pbAgFEnByb2Nlc3NSZXN1bHRUdXBsZQJfNQUUdXBkYXRlQ2FuZGl0YXRlc0xpc3QBaQENZmlsbFRyZWFzdWFyeQADCQAAAgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIKTm8gcGF5bWVudAMJAAACCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAAACQACAQIWUGF5bWVudCBtdXN0IGJlIG1vcmUgMAMJAQIhPQIICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAULVVNEVEFzc2V0SWQJAAIBAhdQYXltZW50IG11c3QgYmUgaW4gVVNEVAQGYW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQHYXNzZXRJZAkBBXZhbHVlAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBBVmaW5hbFZvdGluZ0NhbmRpZGF0ZXMJAQt2YWx1ZU9yRWxzZQIJAKIIAQUYZmluYWxWb3RpbmdDYW5kaWRhdGVzS2V5AgADCQAAAgkAsQIBBRVmaW5hbFZvdGluZ0NhbmRpZGF0ZXMAAAkAAgECGENhbmRpdGF0ZXMgbGlzdCBpcyBlbXB0eQQZZmluYWxWb3RpbmdDYW5kaWRhdGVzTGlzdAkAtQkCBRVmaW5hbFZvdGluZ0NhbmRpZGF0ZXMCASwKAQtwcm9jZXNzVm90ZQIFYWNjdW0EbmV4dAQGdm90ZUlkBQRuZXh0BA52b3RlVXBQb3dlcktleQkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCCF91cFBvd2VyBBB2b3RlRG93blBvd2VyS2V5CQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAIKX2Rvd25Qb3dlcgQRdm90ZVRvdGFsUG93ZXJLZXkJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAgtfdG90YWxQb3dlcgQLdm90ZVVwUG93ZXIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUOdm90ZVVwUG93ZXJLZXkAAAQNdm90ZURvd25Qb3dlcgkBC3ZhbHVlT3JFbHNlAgkAnwgBBRB2b3RlRG93blBvd2VyS2V5AAAEDnZvdGVUb3RhbFBvd2VyCQELdmFsdWVPckVsc2UCCQCfCAEFEXZvdGVUb3RhbFBvd2VyS2V5AAAEC3F1b3J1bUxpbWl0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQURdm90ZVBvd2VyTGltaXRLZXkCGlZvdGUgcG93ZXIgbGltaXQgbm90IGZvdW5kAwkAAAIFDnZvdGVUb3RhbFBvd2VyAAAJAAIBAhNJbnZhbGlkIHRvdGFsIHBvd2VyAwkAZgIFC3F1b3J1bUxpbWl0BQ52b3RlVG90YWxQb3dlcgkAAgECFVBvd2VyIGxlc3MgdGhhbiBsaW1pdAMJAAACCQBkAgULdm90ZVVwUG93ZXIFDXZvdGVEb3duUG93ZXIAAAkAAgECFkludmFsaWQgdXAsIGRvd24gcG93ZXIDCQEOaXNWb3RpbmdDbG9zZWQBBQZ2b3RlSWQJAJYKBAgFBWFjY3VtAl8xCAUFYWNjdW0CXzIIBQVhY2N1bQJfMwkBGHJlbW92ZUl0ZW1Gcm9tU3RhdGVBcnJheQIFGGZpbmFsVm90aW5nQ2FuZGlkYXRlc0tleQUGdm90ZUlkBAl1cFBlcmNlbnQJAGsDBQt2b3RlVXBQb3dlcgBkBQ52b3RlVG90YWxQb3dlcgQOZmluYWxWb3RlU3RhdGUDCQBmAgUJdXBQZXJjZW50ADIJAQxCb29sZWFuRW50cnkCCQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAIKX2NvbmZpcm1lZAYJAQxCb29sZWFuRW50cnkCCQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAIJX3JlamVjdGVkBgkAlgoECQBkAggFBWFjY3VtAl8xBQ52b3RlVG90YWxQb3dlcgkAzQgCCAUFYWNjdW0CXzIFBnZvdGVJZAkAzQgCCAUFYWNjdW0CXzMFDmZpbmFsVm90ZVN0YXRlCQEYcmVtb3ZlSXRlbUZyb21TdGF0ZUFycmF5AgUYZmluYWxWb3RpbmdDYW5kaWRhdGVzS2V5BQZ2b3RlSWQEC3Jlc3VsdFR1cGxlCgACJGwFGWZpbmFsVm90aW5nQ2FuZGlkYXRlc0xpc3QKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCWCgQAAAUDbmlsBQNuaWwFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQELcHJvY2Vzc1ZvdGUCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoEEGFsbEVuZFZvdGVzUG93ZXIIBQtyZXN1bHRUdXBsZQJfMQQOZmluYWxWb3Rlc0xpc3QIBQtyZXN1bHRUdXBsZQJfMgQPZmluYWxWb3Rlc1N0YXRlCAULcmVzdWx0VHVwbGUCXzMEGnVwZGF0ZWRMaXN0RmluYWxDYW5kaXRhdGVzCAULcmVzdWx0VHVwbGUCXzQDCQAAAgUQYWxsRW5kVm90ZXNQb3dlcgAACQACAQIhTm8gcG93ZXIgYWZ0ZXIgcHJvY2VzcyBjYW5kaXRhdGVzBBNjdXJyZW50UmV3b3Jkc1JvdW5kCQELdmFsdWVPckVsc2UCCQCfCAEFFmN1cnJlbnRSZXdvcmRzUm91bmRLZXkAAAQMY29zdFBlclBvd2VyCQBrAwUGYW1vdW50AAEFEGFsbEVuZFZvdGVzUG93ZXIEGHRyZWFzdWFyeUFzc2V0SWRUb3RhbEtleQkArAICCQCsAgICCnRyZWFzdWFyeV8JANgEAQUHYXNzZXRJZAIGX3RvdGFsBBx0cmVhc3VhcnlBc3NldElkQXZhaWxhYmxlS2V5CQCsAgIJAKwCAgIKdHJlYXN1YXJ5XwkA2AQBBQdhc3NldElkAgpfYXZhaWxhYmxlBBV0cmVhc3VhcnlBc3NldElkVG90YWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUYdHJlYXN1YXJ5QXNzZXRJZFRvdGFsS2V5AAAEGXRyZWFzdWFyeUFzc2V0SWRBdmFpbGFibGUJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUcdHJlYXN1YXJ5QXNzZXRJZEF2YWlsYWJsZUtleQAACQDOCAIJAM4IAgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIHcmV3YXJkXwkApAMBBRNjdXJyZW50UmV3b3Jkc1JvdW5kAglfdm90ZXNJZHMJALkJAgUOZmluYWxWb3Rlc0xpc3QCASwJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICB3Jld2FyZF8JAKQDAQUTY3VycmVudFJld29yZHNSb3VuZAIIX2Fzc2V0SWQJANgEAQUHYXNzZXRJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICB3Jld2FyZF8JAKQDAQUTY3VycmVudFJld29yZHNSb3VuZAINX2Nvc3RQZXJQb3dlcgUMY29zdFBlclBvd2VyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgIHcmV3YXJkXwkApAMBBRNjdXJyZW50UmV3b3Jkc1JvdW5kAgpfcGFpZFBvd2VyBRBhbGxFbmRWb3Rlc1Bvd2VyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRh0cmVhc3VhcnlBc3NldElkVG90YWxLZXkJAGQCBRV0cmVhc3VhcnlBc3NldElkVG90YWwFBmFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUcdHJlYXN1YXJ5QXNzZXRJZEF2YWlsYWJsZUtleQkAZAIFGXRyZWFzdWFyeUFzc2V0SWRBdmFpbGFibGUFBmFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUWY3VycmVudFJld29yZHNSb3VuZEtleQkAZAIFE2N1cnJlbnRSZXdvcmRzUm91bmQAAQUDbmlsBQ9maW5hbFZvdGVzU3RhdGUFGnVwZGF0ZWRMaXN0RmluYWxDYW5kaXRhdGVzAWkBDGNsYWltUmV3YXJkcwAECmFkZHJlc3NTdHIJAKUIAQgFAWkGY2FsbGVyBBlhZGRlcnNzTGFzdFJld2FyZFJvdW5kS2V5CQCsAgIJAKwCAgIIYWRkcmVzc18FCmFkZHJlc3NTdHICEV9sYXN0UmV3YXJkc1JvdW5kBBNjdXJyZW50UmV3b3Jkc1JvdW5kCQELdmFsdWVPckVsc2UCCQCfCAEFFmN1cnJlbnRSZXdvcmRzUm91bmRLZXkAAAQWYWRkZXJzc0xhc3RSZXdhcmRSb3VuZAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRlhZGRlcnNzTGFzdFJld2FyZFJvdW5kS2V5AAADCQAAAgUTY3VycmVudFJld29yZHNSb3VuZAUWYWRkZXJzc0xhc3RSZXdhcmRSb3VuZAkAAgECGlRoZXJlIHdlcmUgbm8gbmV3IHBheW1lbnRzCgEQY2FsY1Jld2FyZHNSb3VuZAIFYWNjdW0EbmV4dAMJAGcCCAUFYWNjdW0CXzEFE2N1cnJlbnRSZXdvcmRzUm91bmQFBWFjY3VtBAh2b3Rlc0lkcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJAKwCAgkArAICAgdyZXdhcmRfCQCkAwEIBQVhY2N1bQJfMQIJX3ZvdGVzSWRzAhpSZXdhcmQgdm90ZXMgaWRzIG5vdCBmb3VuZAQHYXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJAKwCAgkArAICAgdyZXdhcmRfCQCkAwEIBQVhY2N1bQJfMQIIX2Fzc2V0SWQCGFJld2FyZCBhc3NldElkIG5vdCBmb3VuZAQJY29zdFBvd2VyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQkArAICCQCsAgICB3Jld2FyZF8JAKQDAQgFBWFjY3VtAl8xAg1fY29zdFBlclBvd2VyAhtSZXdhcmQgY29zdCBwb3dlciBub3QgZm91bmQEGnRyZWFzdWFyeUFzc2V0SWRDbGFpbWVkS2V5CQCsAgIJAKwCAgIKdHJlYXN1YXJ5XwUHYXNzZXRJZAIIX2NsYWltZWQEHHRyZWFzdWFyeUFzc2V0SWRBdmFpbGFibGVLZXkJAKwCAgkArAICAgp0cmVhc3VhcnlfBQdhc3NldElkAgpfYXZhaWxhYmxlBBd0cmVhc3VhcnlBc3NldElkQ2xhaW1lZAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRp0cmVhc3VhcnlBc3NldElkQ2xhaW1lZEtleQAABBl0cmVhc3VhcnlBc3NldElkQXZhaWxhYmxlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQUcdHJlYXN1YXJ5QXNzZXRJZEF2YWlsYWJsZUtleQIbVHJlYXN1YXJ5IGFzc2V0SWQgbm90IGZvdW5kBBhhZGRyZXNzQXNzZXRJZENsYWltZWRLZXkJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICDHJld2FyZFJvdW5kXwkApAMBCAUFYWNjdW0CXzECCV9hZGRyZXNzXwUKYWRkcmVzc1N0cgIJX2Fzc2V0SWRfBQdhc3NldElkAghfY2xhaW1lZAQVYWRkcmVzc0Fzc2V0SWRDbGFpbWVkCQELdmFsdWVPckVsc2UCCQCfCAEFGGFkZHJlc3NBc3NldElkQ2xhaW1lZEtleQAAAwkAZwIAAAUZdHJlYXN1YXJ5QXNzZXRJZEF2YWlsYWJsZQkAAgECG1RyZWFzdWFyeSBhc3NldCBJZCBpcyBlbXB0eQMJAAACCQCxAgEFCHZvdGVzSWRzAAAJAAIBAhdWb3RlIGlkcyBsaXN0IGFyZSBlbXB0eQMJAAACCQCxAgEFB2Fzc2V0SWQAAAkAAgECEUFzc2V0IGlkIGlzIGVtcHR5AwMJAAACBQljb3N0UG93ZXIAAAYJAGYCAAAFCWNvc3RQb3dlcgkAAgECEkludmFsaWQgY29zdCBwb3dlcgoBFWNhbGNBZGRyZXNzU3BlbnRQb3dlcgIFYWNjdW0EbmV4dAQGdm90ZUlkBQRuZXh0BBFhZGRyZXNzU3BlbnRQb3dlcgkBC3ZhbHVlT3JFbHNlAgkAnwgBCQCsAgIJAKwCAgkArAICCQCsAgICBnZvdGVyXwUKYWRkcmVzc1N0cgIGX3ZvdGVfBQZ2b3RlSWQCC19zcGVudFBvd2VyAAAJAGQCBQVhY2N1bQURYWRkcmVzc1NwZW50UG93ZXIECnNwZW50UG93ZXIKAAIkbAkAtQkCBQh2b3Rlc0lkcwIBLAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEVY2FsY0FkZHJlc3NTcGVudFBvd2VyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAwMJAGcCAAAFCnNwZW50UG93ZXIGCQBmAgUVYWRkcmVzc0Fzc2V0SWRDbGFpbWVkAAAJAJQKAgkAZAIIBQVhY2N1bQJfMQUEbmV4dAgFBWFjY3VtAl8yCQCUCgIJAGQCCAUFYWNjdW0CXzEFBG5leHQJAM4IAggFBWFjY3VtAl8yCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAaAIFCnNwZW50UG93ZXIFCWNvc3RQb3dlcgkA2QQBBQdhc3NldElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRhhZGRyZXNzQXNzZXRJZENsYWltZWRLZXkJAGgCBQpzcGVudFBvd2VyBQljb3N0UG93ZXIJAMwIAgkBDEludGVnZXJFbnRyeQIFGnRyZWFzdWFyeUFzc2V0SWRDbGFpbWVkS2V5CQBkAgUXdHJlYXN1YXJ5QXNzZXRJZENsYWltZWQJAGgCBQpzcGVudFBvd2VyBQljb3N0UG93ZXIJAMwIAgkBDEludGVnZXJFbnRyeQIFHHRyZWFzdWFyeUFzc2V0SWRBdmFpbGFibGVLZXkJAGUCBRl0cmVhc3VhcnlBc3NldElkQXZhaWxhYmxlCQBoAgUKc3BlbnRQb3dlcgUJY29zdFBvd2VyBQNuaWwEAXIKAAIkbAkAzAgCAAEJAMwIAgABCQDMCAIAAQkAzAgCAAEJAMwIAgABBQNuaWwKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFFmFkZGVyc3NMYXN0UmV3YXJkUm91bmQFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEQY2FsY1Jld2FyZHNSb3VuZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUZYWRkZXJzc0xhc3RSZXdhcmRSb3VuZEtleQgFAXICXzEFA25pbAgFAXICXzIBAnR4AQZ2ZXJpZnkACQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5vGQLQw==", "height": 3484152, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: D5ajjbnSaHvHaNYkZxaSkKbMUP2fmfDfmckZEQKvUCM7 Next: CzXTL45gVBcARtUBk9qduHA7wPgmR2QX9cYPDtgvacJe Diff:
OldNewDifferences
9898 @Callable(i)
9999 func stake (debug) = {
100100 let addressStr = toString(i.caller)
101- let p = valueOrErrorMessage(i.payments[0], "No payments")
101+ let p = if ((size(i.payments) > 0))
102+ then i.payments[0]
103+ else throw("No payments")
102104 let asset = valueOrErrorMessage(assetInfo(valueOrErrorMessage(p.assetId, "Invalid payment")), "Invalid asset Id")
103105 if (debug)
104- then throw(("payments size " + toString(size(i.payments))))
106+ then throw(((((("payments size " + toString(size(i.payments))) + " assetId ") + toBase58String(value(p.assetId))) + " amount ") + toString(p.amount)))
105107 else if (if ((p.amount > 0))
106108 then checkNFT(asset)
107109 else false)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let creationAddress = Address(base58'3PFQjjDMiZKQZdu5JqTHD7HwgSXyp9Rw9By')
55
66 let signArtIssuerAddress = Address(base58'3PDBLdsUrcsiPxNbt8g2gQVoefKgzt3kJzV')
77
88 let USDTAssetId = base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ'
99
1010 let totalStakedKey = "total_staked"
1111
1212 let totalPowerKey = "total_power"
1313
1414 let totalSpentPowerKey = "total_spentPower"
1515
1616 let votePowerLimitKey = "VOTE_POWER_LIMIT"
1717
1818 let currentRewordsRoundKey = "current_rewords_round"
1919
2020 let finalVotingCandidatesKey = "final_voiting_candidates"
2121
2222 let allStakedAddressesKey = "all_staked_addresses"
2323
2424 let PuzzleDragonsSignArtIds = ["9iPLsYoz8fNyUp9qcgeAFPpMjKGcb4mNURhAZ7dfzXej", "2K847GdAcqaHHYn1dSS1F3NYriuquJKKzMoBES1cn4Mb", "7D1eCVeMbjHLpjYuqKZ96LoWPwD71quwuWpZxcuKnkJ7", "zjE5dwTv3AukQj6xMyddjcqA82bKvSNLeaKLhnFYKGf", "4T8QSrLLqUpHpi8SecSQT1p5tGo1CAskTGgYgUmXBYEb", "AjHkvxJpgxx8UAMmz6gvxjtBanGBHeEUaYxygdsTRcV6", "4jruFM1gvrtMHXiKdz2EKt12fHGjH5MT8YcZkF6KVGP7", "ZZ1cM8N3UC3uAdoCXJwTwkmpeTSFjpNB4GVa5UwYVGS", "6UAvojJpFxUjAoRFb3nhxCRUdGzFCvxCKniLtJqxVk77", "2NSvp5JX8YTNXWKXpE9kiZA22gg4DM2Yc7mcb9U6PkxB"]
2525
2626 func checkNFT (asset) = {
2727 let isPuzzleDragon = match indexOf(PuzzleDragonsSignArtIds, toBase58String(asset.id)) {
2828 case x: Int =>
2929 (x >= 0)
3030 case _ =>
3131 false
3232 }
3333 if (if (if (if (if (isPuzzleDragon)
3434 then true
3535 else (getStringValue(creationAddress, (("nft_" + toBase58String(asset.id)) + "_issuer")) == toString(this)))
3636 then (asset.issuer == creationAddress)
3737 else false)
3838 then (asset.decimals == 0)
3939 else false)
4040 then (asset.reissuable == false)
4141 else false)
4242 then (asset.quantity == 1)
4343 else false
4444 }
4545
4646
4747 func getPowerNFT (asset) = {
4848 let isPuzzleDragon = match indexOf(PuzzleDragonsSignArtIds, toBase58String(asset.id)) {
4949 case x: Int =>
5050 (x >= 0)
5151 case _ =>
5252 false
5353 }
5454 if (isPuzzleDragon)
5555 then 40
5656 else {
5757 let params = getStringValue(creationAddress, (("nft_" + toBase58String(asset.id)) + "_params"))
5858 if ((params == "gold"))
5959 then 100
6060 else 40
6161 }
6262 }
6363
6464
6565 func isVotingClosed (voteId) = {
6666 let voteConfirmedKey = (("vote_" + voteId) + "_confirmed")
6767 let voteRejectedKey = (("vote_" + voteId) + "_rejected")
6868 let isConfirmed = valueOrElse(getBoolean(voteConfirmedKey), false)
6969 let isRejected = valueOrElse(getBoolean(voteRejectedKey), false)
7070 if (isConfirmed)
7171 then true
7272 else isRejected
7373 }
7474
7575
7676 func addStringToStateArray (dataKey,item) = {
7777 let allData = valueOrElse(getString(dataKey), "")
7878 if (!(isDefined(indexOf(allData, item))))
7979 then if ((size(allData) == 0))
8080 then [StringEntry(dataKey, item)]
8181 else [StringEntry(dataKey, makeString_11C((split_51C(allData, ",") :+ item), ","))]
8282 else nil
8383 }
8484
8585
8686 func removeItemFromStateArray (dataKey,item) = {
8787 let allData = valueOrErrorMessage(getString(dataKey), (("Data for key: '" + dataKey) + "' not found"))
8888 if (isDefined(indexOf(allData, item)))
8989 then {
9090 let dataList = split_51C(allData, ",")
9191 let itemIndex = value(indexOf(dataList, item))
9292 [StringEntry(dataKey, makeString_11C(removeByIndex(dataList, itemIndex), ","))]
9393 }
9494 else nil
9595 }
9696
9797
9898 @Callable(i)
9999 func stake (debug) = {
100100 let addressStr = toString(i.caller)
101- let p = valueOrErrorMessage(i.payments[0], "No payments")
101+ let p = if ((size(i.payments) > 0))
102+ then i.payments[0]
103+ else throw("No payments")
102104 let asset = valueOrErrorMessage(assetInfo(valueOrErrorMessage(p.assetId, "Invalid payment")), "Invalid asset Id")
103105 if (debug)
104- then throw(("payments size " + toString(size(i.payments))))
106+ then throw(((((("payments size " + toString(size(i.payments))) + " assetId ") + toBase58String(value(p.assetId))) + " amount ") + toString(p.amount)))
105107 else if (if ((p.amount > 0))
106108 then checkNFT(asset)
107109 else false)
108110 then {
109111 let totalStaked = valueOrElse(getInteger(totalStakedKey), 0)
110112 let totalPower = valueOrElse(getInteger(totalPowerKey), 0)
111113 let addressPowerKey = (("address_" + addressStr) + "_power")
112114 let addressTotalStakedKey = (("address_" + addressStr) + "_totalStaked")
113115 let addressStakedNftsKey = (("address_" + addressStr) + "_stakedNfts")
114116 let addressPower = valueOrElse(getInteger(addressPowerKey), 0)
115117 let addressTotalStaked = valueOrElse(getInteger(addressTotalStakedKey), 0)
116118 let addressStakedNfts = valueOrElse(getString(addressStakedNftsKey), "")
117119 if (((addressTotalStaked + 1) > 5))
118120 then throw("You can stake only 5 NFTs")
119121 else {
120122 let nftPower = getPowerNFT(asset)
121123 let nftIdStr = toBase58String(asset.id)
122124 let addressStakedNftsState = if ((size(addressStakedNfts) == 0))
123125 then [StringEntry(addressStakedNftsKey, nftIdStr)]
124126 else [StringEntry(addressStakedNftsKey, makeString((split(addressStakedNfts, ",") :+ nftIdStr), ","))]
125127 (([IntegerEntry(totalStakedKey, (totalStaked + 1)), IntegerEntry(totalPowerKey, (totalPower + nftPower)), StringEntry((("nft_" + nftIdStr) + "_owner"), addressStr), IntegerEntry((("nft_" + nftIdStr) + "_power"), nftPower), IntegerEntry(addressPowerKey, (addressPower + nftPower)), IntegerEntry(addressTotalStakedKey, (addressTotalStaked + 1))] ++ addStringToStateArray(allStakedAddressesKey, addressStr)) ++ addressStakedNftsState)
126128 }
127129 }
128130 else throw("No payments")
129131 }
130132
131133
132134
133135 @Callable(i)
134136 func unstake (nftIdStr,debug) = {
135137 let addressStr = toString(i.caller)
136138 let asset = valueOrErrorMessage(assetInfo(fromBase58String(nftIdStr)), "Invalid nft Id")
137139 let ownerAddress = valueOrErrorMessage(getString((("nft_" + nftIdStr) + "_owner")), "Owner data invalid")
138140 if ((ownerAddress != addressStr))
139141 then throw("You are not the owner")
140142 else if (checkNFT(asset))
141143 then {
142144 let totalStaked = valueOrElse(getInteger(totalStakedKey), 0)
143145 let totalPower = valueOrElse(getInteger(totalPowerKey), 0)
144146 let addressPowerKey = (("address_" + addressStr) + "_power")
145147 let addressTotalStakedKey = (("address_" + addressStr) + "_totalStaked")
146148 let addressStakedNftsKey = (("address_" + addressStr) + "_stakedNfts")
147149 let addressPower = valueOrErrorMessage(getInteger(addressPowerKey), "Address power value not found")
148150 let addressTotalStaked = valueOrErrorMessage(getInteger(addressTotalStakedKey), "Address total staked value not found")
149151 let addressStakedNfts = valueOrErrorMessage(getString(addressStakedNftsKey), "Address staked Nfts value not found")
150152 let nftAssetIdStr = toBase58String(asset.id)
151153 let nftPower = getIntegerValue((("nft_" + nftAssetIdStr) + "_power"))
152154 let updatedAddressPower = (addressPower - nftPower)
153155 let removeStakedAddress = if ((updatedAddressPower == 0))
154156 then removeItemFromStateArray(allStakedAddressesKey, addressStr)
155157 else nil
156158 let addressStakedNftsList = split(addressStakedNfts, ",")
157159 let addressStakedNftIndex = valueOrErrorMessage(indexOf(addressStakedNftsList, nftIdStr), "NFT not founed in address staked list")
158160 ([ScriptTransfer(i.caller, 1, asset.id), IntegerEntry(totalStakedKey, (totalStaked - 1)), IntegerEntry(totalPowerKey, (totalPower - nftPower)), DeleteEntry((("nft_" + nftAssetIdStr) + "_owner")), DeleteEntry((("nft_" + nftAssetIdStr) + "_power")), IntegerEntry(addressPowerKey, updatedAddressPower), IntegerEntry(addressTotalStakedKey, (addressTotalStaked - 1)), StringEntry(addressStakedNftsKey, makeString(removeByIndex(addressStakedNftsList, addressStakedNftIndex), ","))] ++ removeStakedAddress)
159161 }
160162 else throw("Invalid nft Id")
161163 }
162164
163165
164166
165167 @Callable(i)
166168 func sendToVote (collectionId) = {
167169 let issuer = split(collectionId, "_")[0]
168170 let isExist = match getString((("collection_" + collectionId) + "_voteId")) {
169171 case t: String =>
170172 true
171173 case _ =>
172174 false
173175 }
174176 if ((size(issuer) == 0))
175177 then throw("Collection issuer not found")
176178 else if (isExist)
177179 then throw("Collection has already been submitted for voting")
178180 else if ((issuer != toString(i.caller)))
179181 then throw("Only the issuer can submit to the vote")
180182 else {
181183 let voteId = toBase58String(sha256_16Kb(toBytes(collectionId)))
182184 let totalVotes = valueOrElse(getInteger("total_votes"), 0)
183185 let quorumLimit = valueOrErrorMessage(getInteger(votePowerLimitKey), "Vote power limit not found")
184186 [StringEntry((("collection_" + collectionId) + "_voteId"), voteId), StringEntry((("vote_" + voteId) + "_collectionId"), collectionId), StringEntry((("vote_" + voteId) + "_owner"), toString(i.caller)), IntegerEntry((("vote_" + voteId) + "_createdAt"), height), IntegerEntry((("vote_" + voteId) + "_quorum"), quorumLimit), IntegerEntry("total_votes", (totalVotes + 1))]
185187 }
186188 }
187189
188190
189191
190192 @Callable(i)
191193 func removeFromVote (voteId) = {
192194 let collectionId = valueOrErrorMessage(getString((("vote_" + voteId) + "_collectionId")), "Collection Id not found")
193195 let owner = valueOrErrorMessage(getString((("vote_" + voteId) + "_owner")), "Owner not found")
194196 if ((owner != toString(i.caller)))
195197 then throw("You are not the owner")
196198 else if (isVotingClosed(voteId))
197199 then throw("Voting is closed")
198200 else {
199201 let totalVotes = valueOrErrorMessage(getInteger("total_votes"), "total votes value not found")
200202 [DeleteEntry((("collection_" + collectionId) + "_voteId")), DeleteEntry((("vote_" + voteId) + "_collectionId")), DeleteEntry((("vote_" + voteId) + "_owner")), DeleteEntry((("vote_" + voteId) + "_createdAt")), DeleteEntry((("vote_" + voteId) + "_quorum")), IntegerEntry("total_votes", (totalVotes - 1))]
201203 }
202204 }
203205
204206
205207
206208 @Callable(i)
207209 func voteByNFT (voteId,assets) = {
208210 let addressStr = toString(i.caller)
209211 let collectionId = valueOrElse(getString((("vote_" + voteId) + "_collectionId")), "")
210212 if (isVotingClosed(voteId))
211213 then throw("Voting is closed")
212214 else if ((size(collectionId) == 0))
213215 then throw("Collection not found")
214216 else if ((size(assets) == 0))
215217 then throw("Assets list is empty")
216218 else {
217219 let voteUpPowerKey = (("vote_" + voteId) + "_upPower")
218220 let voteDownPowerKey = (("vote_" + voteId) + "_downPower")
219221 let voteTotalPowerKey = (("vote_" + voteId) + "_totalPower")
220222 let voteUsedNftsKey = (("vote_" + voteId) + "_usedNfts")
221223 let voterSpentPowerKey = (("voter_" + addressStr) + "_spentPower")
222224 let voterVoteUsedNftsKey = (((("voter_" + addressStr) + "_vote_") + voteId) + "_usedNfts")
223225 let voterVoteSpentPowerKey = (((("voter_" + addressStr) + "_vote_") + voteId) + "_spentPower")
224226 let addressPowerKey = (("address_" + addressStr) + "_power")
225227 let addressStakedNftsKey = (("address_" + addressStr) + "_stakedNfts")
226228 let upPowerDapp = valueOrElse(getInteger(voteUpPowerKey), 0)
227229 let downPowerDapp = valueOrElse(getInteger(voteDownPowerKey), 0)
228230 let totalVotePower = valueOrElse(getInteger(voteTotalPowerKey), 0)
229231 let voteUsedNfts = valueOrElse(getString(voteUsedNftsKey), "")
230232 let voterSpentPower = valueOrElse(getInteger(voterSpentPowerKey), 0)
231233 let voterVoteUsedNfts = valueOrElse(getString(voterVoteUsedNftsKey), "")
232234 let totalSpentPower = valueOrElse(getInteger(totalSpentPowerKey), 0)
233235 let voterVoteSpentPower = valueOrElse(getInteger(voterVoteSpentPowerKey), 0)
234236 let addressPower = valueOrErrorMessage(getInteger(addressPowerKey), "You don't have power")
235237 let addressStakedNfts = valueOrErrorMessage(getString(addressStakedNftsKey), "You don't have staked NFTs")
236238 let adderssLastRewardRoundKey = (("address_" + addressStr) + "_lastRewardsRound")
237239 let currentRewordsRound = valueOrElse(getInteger(currentRewordsRoundKey), 0)
238240 let adderssLastRewardRound = valueOrElse(getInteger(adderssLastRewardRoundKey), 0)
239241 let assetsList = split(assets, "|")
240242 let voteUsedNftsList = if ((size(voteUsedNfts) == 0))
241243 then nil
242244 else split_51C(voteUsedNfts, ",")
243245 let voterVoteUsedNftsList = if ((size(voterVoteUsedNfts) == 0))
244246 then nil
245247 else split_51C(voterVoteUsedNfts, ",")
246248 func processAssets (accum,next) = {
247249 let parts = split(next, "_")
248250 let nftId = parts[0]
249251 let type = parts[1]
250252 let power = valueOrErrorMessage(getInteger((("nft_" + nftId) + "_power")), "NFT power not found")
251253 let stakedOwnerIndex = valueOrElse(indexOf(addressStakedNfts, nftId), -1)
252254 if ((power == 0))
253255 then throw("Power must be more zero")
254256 else if ((stakedOwnerIndex == -1))
255257 then throw("Asset does not belong to you")
256258 else {
257259 let assetIndex = valueOrElse(indexOf(voteUsedNftsList, nftId), -1)
258260 if ((assetIndex == -1))
259261 then if (if ((type != "up"))
260262 then (type != "down")
261263 else false)
262264 then throw("Invalid type")
263265 else $Tuple4((accum._1 + (if ((type == "up"))
264266 then power
265267 else 0)), (accum._2 + (if ((type == "down"))
266268 then power
267269 else 0)), (accum._3 :+ nftId), (accum._4 :+ StringEntry(((((("voter_" + addressStr) + "_vote_") + voteId) + "_assetId_") + nftId), ((((type + ":") + toString(power)) + ":") + toString(height)))))
268270 else accum
269271 }
270272 }
271273
272274 let processResultTuple = {
273275 let $l = assetsList
274276 let $s = size($l)
275277 let $acc0 = $Tuple4(0, 0, nil, nil)
276278 func $f0_1 ($a,$i) = if (($i >= $s))
277279 then $a
278280 else processAssets($a, $l[$i])
279281
280282 func $f0_2 ($a,$i) = if (($i >= $s))
281283 then $a
282284 else throw("List size exceeds 5")
283285
284286 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
285287 }
286288 let upPower = processResultTuple._1
287289 let downPower = processResultTuple._2
288290 let powerValue = (upPower + downPower)
289291 if ((powerValue > addressPower))
290292 then throw("Power exceeds power of the account")
291293 else if ((powerValue == 0))
292294 then throw("Not enough power to vote")
293295 else if ((size(processResultTuple._3) == 0))
294296 then throw("Used list must not be empty")
295297 else if ((size(processResultTuple._4) == 0))
296298 then throw("State entries list must not be empty")
297299 else {
298300 let quorumLimit = valueOrErrorMessage(getInteger(votePowerLimitKey), "Vote power limit not found")
299301 let updateCanditatesList = if (((totalVotePower + powerValue) > quorumLimit))
300302 then addStringToStateArray(finalVotingCandidatesKey, voteId)
301303 else nil
302304 let addressRewordsRoundState = if (if ((adderssLastRewardRound == 0))
303305 then (currentRewordsRound > adderssLastRewardRound)
304306 else false)
305307 then [IntegerEntry(adderssLastRewardRoundKey, currentRewordsRound)]
306308 else nil
307309 ((([IntegerEntry(voterSpentPowerKey, (voterSpentPower + powerValue)), IntegerEntry(totalSpentPowerKey, (totalSpentPower + powerValue)), IntegerEntry(voteUpPowerKey, (upPowerDapp + upPower)), IntegerEntry(voteDownPowerKey, (downPowerDapp + downPower)), IntegerEntry(voteTotalPowerKey, (totalVotePower + powerValue)), IntegerEntry(voterVoteSpentPowerKey, (voterVoteSpentPower + powerValue)), StringEntry(voterVoteUsedNftsKey, makeString_11C((voterVoteUsedNftsList ++ processResultTuple._3), ",")), StringEntry(voteUsedNftsKey, makeString_11C((voteUsedNftsList ++ processResultTuple._3), ","))] ++ processResultTuple._4) ++ updateCanditatesList) ++ addressRewordsRoundState)
308310 }
309311 }
310312 }
311313
312314
313315
314316 @Callable(i)
315317 func unvoteByNFT (voteId,assets) = {
316318 let addressStr = toString(i.caller)
317319 let collectionId = valueOrElse(getString((("vote_" + voteId) + "_collectionId")), "")
318320 if (isVotingClosed(voteId))
319321 then throw("Voting is closed")
320322 else if ((size(collectionId) == 0))
321323 then throw("Collection not found")
322324 else {
323325 let voteUpPowerKey = (("vote_" + voteId) + "_upPower")
324326 let voteDownPowerKey = (("vote_" + voteId) + "_downPower")
325327 let voteTotalPowerKey = (("vote_" + voteId) + "_totalPower")
326328 let voteUsedNftsKey = (("vote_" + voteId) + "_usedNfts")
327329 let voterSpentPowerKey = (("voter_" + addressStr) + "_spentPower")
328330 let voterVoteUsedNftsKey = (((("voter_" + addressStr) + "_vote_") + voteId) + "_usedNfts")
329331 let voterVoteSpentPowerKey = (((("voter_" + addressStr) + "_vote_") + voteId) + "_spentPower")
330332 let addressPowerKey = (("address_" + addressStr) + "_power")
331333 let addressStakedNftsKey = (("address_" + addressStr) + "_stakedNfts")
332334 let upPowerDapp = valueOrErrorMessage(getInteger(voteUpPowerKey), "Up vote power not found")
333335 let downPowerDapp = valueOrErrorMessage(getInteger(voteDownPowerKey), "Down vote power not found")
334336 let totalVotePower = valueOrErrorMessage(getInteger(voteTotalPowerKey), "Total vote power not found")
335337 let voteUsedNfts = valueOrErrorMessage(getString(voteUsedNftsKey), "Vote used power not found")
336338 let voterSpentPower = valueOrErrorMessage(getInteger(voterSpentPowerKey), "Voter spent power not found")
337339 let voterUsedNfts = valueOrErrorMessage(getInteger(voterVoteUsedNftsKey), "Voter vote used nfts not found")
338340 let voterVoteUsedNfts = valueOrErrorMessage(getString(voterVoteUsedNftsKey), "Voter vote used nfts list not found")
339341 let totalSpentPower = valueOrErrorMessage(getInteger(totalSpentPowerKey), "Total spent power not found")
340342 let voterVoteSpentPower = valueOrErrorMessage(getInteger(voterVoteSpentPowerKey), "Address vote spent power not found")
341343 let addressPower = valueOrErrorMessage(getInteger(addressPowerKey), "You don't have power")
342344 let addressStakedNfts = valueOrErrorMessage(getString(addressStakedNftsKey), "You don't have staked NFTs")
343345 let assetsList = if ((size(assets) > 0))
344346 then split(assets, "|")
345347 else if ((size(voterVoteUsedNfts) == 0))
346348 then nil
347349 else split(voterVoteUsedNfts, ",")
348350 func processAssets (accum,next) = {
349351 let assetVote = valueOrElse(getString(((((("voter_" + addressStr) + "_vote_") + voteId) + "_assetId_") + next)), "")
350352 let parts = split(assetVote, ":")
351353 let type = parts[0]
352354 let power = valueOrElse(parseInt(parts[1]), 0)
353355 let stakedOwnerIndex = valueOrElse(indexOf(addressStakedNfts, next), -1)
354356 let voterVoteUsedIndex = valueOrErrorMessage(indexOf(accum._4, next), "Voter vote used index not found")
355357 if ((size(assetVote) == 0))
356358 then accum
357359 else if ((power == 0))
358360 then throw("Power must be more zero")
359361 else if (if ((0 > voterVoteUsedIndex))
360362 then (stakedOwnerIndex == -1)
361363 else false)
362364 then throw("Asset does not belong to you")
363365 else {
364366 let assetUsedIndex = valueOrElse(indexOf(accum._3, next), -1)
365367 if ((assetUsedIndex >= 0))
366368 then if (if ((type != "up"))
367369 then (type != "down")
368370 else false)
369371 then throw("Invalid type")
370372 else $Tuple5((accum._1 + (if ((type == "up"))
371373 then power
372374 else 0)), (accum._2 + (if ((type == "down"))
373375 then power
374376 else 0)), removeByIndex(accum._3, assetUsedIndex), removeByIndex(accum._4, voterVoteUsedIndex), (accum._5 :+ DeleteEntry(((((("voter_" + addressStr) + "_vote_") + voteId) + "_assetId_") + next))))
375377 else accum
376378 }
377379 }
378380
379381 let processResultTuple = {
380382 let $l = assetsList
381383 let $s = size($l)
382384 let $acc0 = $Tuple5(0, 0, split_51C(voteUsedNfts, ","), split_51C(voterVoteUsedNfts, ","), nil)
383385 func $f0_1 ($a,$i) = if (($i >= $s))
384386 then $a
385387 else processAssets($a, $l[$i])
386388
387389 func $f0_2 ($a,$i) = if (($i >= $s))
388390 then $a
389391 else throw("List size exceeds 5")
390392
391393 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
392394 }
393395 let upPower = processResultTuple._1
394396 let downPower = processResultTuple._2
395397 let powerValue = (upPower + downPower)
396398 if ((powerValue > voterSpentPower))
397399 then throw("Power value exceeds voter spent power")
398400 else if ((powerValue == 0))
399401 then throw("Not enough power to unvote")
400402 else if ((size(processResultTuple._5) == 0))
401403 then throw("State entries list must not be empty")
402404 else {
403405 let quorumLimit = valueOrErrorMessage(getInteger(votePowerLimitKey), "Vote power limit not found")
404406 let updateCanditatesList = if ((quorumLimit > (totalVotePower - powerValue)))
405407 then removeItemFromStateArray(finalVotingCandidatesKey, voteId)
406408 else nil
407409 (([IntegerEntry(voterSpentPowerKey, (voterSpentPower - powerValue)), IntegerEntry(totalSpentPowerKey, (totalSpentPower - powerValue)), IntegerEntry(voteUpPowerKey, (upPowerDapp - upPower)), IntegerEntry(voteDownPowerKey, (downPowerDapp - downPower)), IntegerEntry(voteTotalPowerKey, (totalVotePower - powerValue)), IntegerEntry(voterVoteSpentPowerKey, (voterVoteSpentPower - powerValue)), StringEntry(voterVoteUsedNftsKey, makeString_11C(processResultTuple._4, ",")), StringEntry(voteUsedNftsKey, makeString_11C(processResultTuple._3, ","))] ++ processResultTuple._5) ++ updateCanditatesList)
408410 }
409411 }
410412 }
411413
412414
413415
414416 @Callable(i)
415417 func fillTreasuary () = if ((size(i.payments) == 0))
416418 then throw("No payment")
417419 else if ((i.payments[0].amount == 0))
418420 then throw("Payment must be more 0")
419421 else if ((i.payments[0].assetId != USDTAssetId))
420422 then throw("Payment must be in USDT")
421423 else {
422424 let amount = i.payments[0].amount
423425 let assetId = value(i.payments[0].assetId)
424426 let finalVotingCandidates = valueOrElse(getString(finalVotingCandidatesKey), "")
425427 if ((size(finalVotingCandidates) == 0))
426428 then throw("Canditates list is empty")
427429 else {
428430 let finalVotingCandidatesList = split(finalVotingCandidates, ",")
429431 func processVote (accum,next) = {
430432 let voteId = next
431433 let voteUpPowerKey = (("vote_" + voteId) + "_upPower")
432434 let voteDownPowerKey = (("vote_" + voteId) + "_downPower")
433435 let voteTotalPowerKey = (("vote_" + voteId) + "_totalPower")
434436 let voteUpPower = valueOrElse(getInteger(voteUpPowerKey), 0)
435437 let voteDownPower = valueOrElse(getInteger(voteDownPowerKey), 0)
436438 let voteTotalPower = valueOrElse(getInteger(voteTotalPowerKey), 0)
437439 let quorumLimit = valueOrErrorMessage(getInteger(votePowerLimitKey), "Vote power limit not found")
438440 if ((voteTotalPower == 0))
439441 then throw("Invalid total power")
440442 else if ((quorumLimit > voteTotalPower))
441443 then throw("Power less than limit")
442444 else if (((voteUpPower + voteDownPower) == 0))
443445 then throw("Invalid up, down power")
444446 else if (isVotingClosed(voteId))
445447 then $Tuple4(accum._1, accum._2, accum._3, removeItemFromStateArray(finalVotingCandidatesKey, voteId))
446448 else {
447449 let upPercent = fraction(voteUpPower, 100, voteTotalPower)
448450 let finalVoteState = if ((upPercent > 50))
449451 then BooleanEntry((("vote_" + voteId) + "_confirmed"), true)
450452 else BooleanEntry((("vote_" + voteId) + "_rejected"), true)
451453 $Tuple4((accum._1 + voteTotalPower), (accum._2 :+ voteId), (accum._3 :+ finalVoteState), removeItemFromStateArray(finalVotingCandidatesKey, voteId))
452454 }
453455 }
454456
455457 let resultTuple = {
456458 let $l = finalVotingCandidatesList
457459 let $s = size($l)
458460 let $acc0 = $Tuple4(0, nil, nil, nil)
459461 func $f0_1 ($a,$i) = if (($i >= $s))
460462 then $a
461463 else processVote($a, $l[$i])
462464
463465 func $f0_2 ($a,$i) = if (($i >= $s))
464466 then $a
465467 else throw("List size exceeds 10")
466468
467469 $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)
468470 }
469471 let allEndVotesPower = resultTuple._1
470472 let finalVotesList = resultTuple._2
471473 let finalVotesState = resultTuple._3
472474 let updatedListFinalCanditates = resultTuple._4
473475 if ((allEndVotesPower == 0))
474476 then throw("No power after process canditates")
475477 else {
476478 let currentRewordsRound = valueOrElse(getInteger(currentRewordsRoundKey), 0)
477479 let costPerPower = fraction(amount, 1, allEndVotesPower)
478480 let treasuaryAssetIdTotalKey = (("treasuary_" + toBase58String(assetId)) + "_total")
479481 let treasuaryAssetIdAvailableKey = (("treasuary_" + toBase58String(assetId)) + "_available")
480482 let treasuaryAssetIdTotal = valueOrElse(getInteger(treasuaryAssetIdTotalKey), 0)
481483 let treasuaryAssetIdAvailable = valueOrElse(getInteger(treasuaryAssetIdAvailableKey), 0)
482484 (([StringEntry((("reward_" + toString(currentRewordsRound)) + "_votesIds"), makeString(finalVotesList, ",")), StringEntry((("reward_" + toString(currentRewordsRound)) + "_assetId"), toBase58String(assetId)), IntegerEntry((("reward_" + toString(currentRewordsRound)) + "_costPerPower"), costPerPower), IntegerEntry((("reward_" + toString(currentRewordsRound)) + "_paidPower"), allEndVotesPower), IntegerEntry(treasuaryAssetIdTotalKey, (treasuaryAssetIdTotal + amount)), IntegerEntry(treasuaryAssetIdAvailableKey, (treasuaryAssetIdAvailable + amount)), IntegerEntry(currentRewordsRoundKey, (currentRewordsRound + 1))] ++ finalVotesState) ++ updatedListFinalCanditates)
483485 }
484486 }
485487 }
486488
487489
488490
489491 @Callable(i)
490492 func claimRewards () = {
491493 let addressStr = toString(i.caller)
492494 let adderssLastRewardRoundKey = (("address_" + addressStr) + "_lastRewardsRound")
493495 let currentRewordsRound = valueOrElse(getInteger(currentRewordsRoundKey), 0)
494496 let adderssLastRewardRound = valueOrElse(getInteger(adderssLastRewardRoundKey), 0)
495497 if ((currentRewordsRound == adderssLastRewardRound))
496498 then throw("There were no new payments")
497499 else {
498500 func calcRewardsRound (accum,next) = if ((accum._1 >= currentRewordsRound))
499501 then accum
500502 else {
501503 let votesIds = valueOrErrorMessage(getString((("reward_" + toString(accum._1)) + "_votesIds")), "Reward votes ids not found")
502504 let assetId = valueOrErrorMessage(getString((("reward_" + toString(accum._1)) + "_assetId")), "Reward assetId not found")
503505 let costPower = valueOrErrorMessage(getInteger((("reward_" + toString(accum._1)) + "_costPerPower")), "Reward cost power not found")
504506 let treasuaryAssetIdClaimedKey = (("treasuary_" + assetId) + "_claimed")
505507 let treasuaryAssetIdAvailableKey = (("treasuary_" + assetId) + "_available")
506508 let treasuaryAssetIdClaimed = valueOrElse(getInteger(treasuaryAssetIdClaimedKey), 0)
507509 let treasuaryAssetIdAvailable = valueOrErrorMessage(getInteger(treasuaryAssetIdAvailableKey), "Treasuary assetId not found")
508510 let addressAssetIdClaimedKey = (((((("rewardRound_" + toString(accum._1)) + "_address_") + addressStr) + "_assetId_") + assetId) + "_claimed")
509511 let addressAssetIdClaimed = valueOrElse(getInteger(addressAssetIdClaimedKey), 0)
510512 if ((0 >= treasuaryAssetIdAvailable))
511513 then throw("Treasuary asset Id is empty")
512514 else if ((size(votesIds) == 0))
513515 then throw("Vote ids list are empty")
514516 else if ((size(assetId) == 0))
515517 then throw("Asset id is empty")
516518 else if (if ((costPower == 0))
517519 then true
518520 else (0 > costPower))
519521 then throw("Invalid cost power")
520522 else {
521523 func calcAddressSpentPower (accum,next) = {
522524 let voteId = next
523525 let addressSpentPower = valueOrElse(getInteger((((("voter_" + addressStr) + "_vote_") + voteId) + "_spentPower")), 0)
524526 (accum + addressSpentPower)
525527 }
526528
527529 let spentPower = {
528530 let $l = split(votesIds, ",")
529531 let $s = size($l)
530532 let $acc0 = 0
531533 func $f0_1 ($a,$i) = if (($i >= $s))
532534 then $a
533535 else calcAddressSpentPower($a, $l[$i])
534536
535537 func $f0_2 ($a,$i) = if (($i >= $s))
536538 then $a
537539 else throw("List size exceeds 10")
538540
539541 $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)
540542 }
541543 if (if ((0 >= spentPower))
542544 then true
543545 else (addressAssetIdClaimed > 0))
544546 then $Tuple2((accum._1 + next), accum._2)
545547 else $Tuple2((accum._1 + next), (accum._2 ++ [ScriptTransfer(i.caller, (spentPower * costPower), fromBase58String(assetId)), IntegerEntry(addressAssetIdClaimedKey, (spentPower * costPower)), IntegerEntry(treasuaryAssetIdClaimedKey, (treasuaryAssetIdClaimed + (spentPower * costPower))), IntegerEntry(treasuaryAssetIdAvailableKey, (treasuaryAssetIdAvailable - (spentPower * costPower)))]))
546548 }
547549 }
548550
549551 let r = {
550552 let $l = [1, 1, 1, 1, 1]
551553 let $s = size($l)
552554 let $acc0 = $Tuple2(adderssLastRewardRound, nil)
553555 func $f0_1 ($a,$i) = if (($i >= $s))
554556 then $a
555557 else calcRewardsRound($a, $l[$i])
556558
557559 func $f0_2 ($a,$i) = if (($i >= $s))
558560 then $a
559561 else throw("List size exceeds 5")
560562
561563 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
562564 }
563565 ([IntegerEntry(adderssLastRewardRoundKey, r._1)] ++ r._2)
564566 }
565567 }
566568
567569
568570 @Verifier(tx)
569571 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
570572

github/deemru/w8io/3ef1775 
148.89 ms