tx · D5ajjbnSaHvHaNYkZxaSkKbMUP2fmfDfmckZEQKvUCM7

3P975LUuqc7uBPiSxp3nemf2FZh62zfirSh:  -0.02300000 Waves

2023.01.24 08:49 [3484147] smart account 3P975LUuqc7uBPiSxp3nemf2FZh62zfirSh > SELF 0.00000000 Waves

{ "type": 13, "id": "D5ajjbnSaHvHaNYkZxaSkKbMUP2fmfDfmckZEQKvUCM7", "fee": 2300000, "feeAssetId": null, "timestamp": 1674539399244, "version": 2, "chainId": 87, "sender": "3P975LUuqc7uBPiSxp3nemf2FZh62zfirSh", "senderPublicKey": "6Dx2LuCqezyDYjt3zMEL6WRrs5oaor6aK3L6QouPMP1b", "proofs": [ "3xj9AcGA8ETDkaP5yA27KuJuY7d5y79LqfbQNAtaH7k2yTBQSVfHbttRRdrgZWGnUwzDUeWQxJ2Tz6rHsAeVtGDZ" ], "script": "base64:BgInCAISAwoBBBIECgIIBBIDCgEIEgMKAQgSBAoCCAgSBAoCCAgSABIAEAAPY3JlYXRpb25BZGRyZXNzCQEHQWRkcmVzcwEBGgFXk93E0hfnIAr99yESTvDwdmcmgwN41FxMABRzaWduQXJ0SXNzdWVyQWRkcmVzcwkBB0FkZHJlc3MBARoBV3tk1VvWnhe5qtPmj/wDXMjEFvibuoYp4gALVVNEVEFzc2V0SWQBIB6UBxNSdqEllf3IYaiCXxB/3zpPKbv8mkY/Wv02T5+RAA50b3RhbFN0YWtlZEtleQIMdG90YWxfc3Rha2VkAA10b3RhbFBvd2VyS2V5Agt0b3RhbF9wb3dlcgASdG90YWxTcGVudFBvd2VyS2V5AhB0b3RhbF9zcGVudFBvd2VyABF2b3RlUG93ZXJMaW1pdEtleQIQVk9URV9QT1dFUl9MSU1JVAAWY3VycmVudFJld29yZHNSb3VuZEtleQIVY3VycmVudF9yZXdvcmRzX3JvdW5kABhmaW5hbFZvdGluZ0NhbmRpZGF0ZXNLZXkCGGZpbmFsX3ZvaXRpbmdfY2FuZGlkYXRlcwAVYWxsU3Rha2VkQWRkcmVzc2VzS2V5AhRhbGxfc3Rha2VkX2FkZHJlc3NlcwAXUHV6emxlRHJhZ29uc1NpZ25BcnRJZHMJAMwIAgIsOWlQTHNZb3o4Zk55VXA5cWNnZUFGUHBNaktHY2I0bU5VUmhBWjdkZnpYZWoJAMwIAgIsMks4NDdHZEFjcWFISFluMWRTUzFGM05Zcml1cXVKS0t6TW9CRVMxY240TWIJAMwIAgIsN0QxZUNWZU1iakhMcGpZdXFLWjk2TG9XUHdENzFxdXd1V3BaeGN1S25rSjcJAMwIAgIrempFNWR3VHYzQXVrUWo2eE15ZGRqY3FBODJiS3ZTTkxlYUtMaG5GWUtHZgkAzAgCAiw0VDhRU3JMTHFVcEhwaThTZWNTUVQxcDV0R28xQ0Fza1RHZ1lnVW1YQllFYgkAzAgCAixBakhrdnhKcGd4eDhVQU1tejZndnhqdEJhbkdCSGVFVWFZeHlnZHNUUmNWNgkAzAgCAiw0anJ1Rk0xZ3ZydE1IWGlLZHoyRUt0MTJmSEdqSDVNVDhZY1prRjZLVkdQNwkAzAgCAitaWjFjTThOM1VDM3VBZG9DWEp3VHdrbXBlVFNGanBOQjRHVmE1VXdZVkdTCQDMCAICLDZVQXZvakpwRnhVakFvUkZiM25oeENSVWRHekZDdnhDS25pTHRKcXhWazc3CQDMCAICLDJOU3ZwNUpYOFlUTlhXS1hwRTlraVpBMjJnZzRETTJZYzdtY2I5VTZQa3hCBQNuaWwBCGNoZWNrTkZUAQVhc3NldAQOaXNQdXp6bGVEcmFnb24EByRtYXRjaDAJAM8IAgUXUHV6emxlRHJhZ29uc1NpZ25BcnRJZHMJANgEAQgFBWFzc2V0AmlkAwkAAQIFByRtYXRjaDACA0ludAQBeAUHJG1hdGNoMAkAZwIFAXgAAAcDAwMDAwUOaXNQdXp6bGVEcmFnb24GCQAAAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUPY3JlYXRpb25BZGRyZXNzCQCsAgIJAKwCAgIEbmZ0XwkA2AQBCAUFYXNzZXQCaWQCB19pc3N1ZXIJAKUIAQUEdGhpcwkAAAIIBQVhc3NldAZpc3N1ZXIFD2NyZWF0aW9uQWRkcmVzcwcJAAACCAUFYXNzZXQIZGVjaW1hbHMAAAcJAAACCAUFYXNzZXQKcmVpc3N1YWJsZQcHCQAAAggFBWFzc2V0CHF1YW50aXR5AAEHAQtnZXRQb3dlck5GVAEFYXNzZXQEDmlzUHV6emxlRHJhZ29uBAckbWF0Y2gwCQDPCAIFF1B1enpsZURyYWdvbnNTaWduQXJ0SWRzCQDYBAEIBQVhc3NldAJpZAMJAAECBQckbWF0Y2gwAgNJbnQEAXgFByRtYXRjaDAJAGcCBQF4AAAHAwUOaXNQdXp6bGVEcmFnb24AKAQGcGFyYW1zCQERQGV4dHJOYXRpdmUoMTA1MykCBQ9jcmVhdGlvbkFkZHJlc3MJAKwCAgkArAICAgRuZnRfCQDYBAEIBQVhc3NldAJpZAIHX3BhcmFtcwMJAAACBQZwYXJhbXMCBGdvbGQAZAAoAQ5pc1ZvdGluZ0Nsb3NlZAEGdm90ZUlkBBB2b3RlQ29uZmlybWVkS2V5CQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAIKX2NvbmZpcm1lZAQPdm90ZVJlamVjdGVkS2V5CQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAIJX3JlamVjdGVkBAtpc0NvbmZpcm1lZAkBC3ZhbHVlT3JFbHNlAgkAoAgBBRB2b3RlQ29uZmlybWVkS2V5BwQKaXNSZWplY3RlZAkBC3ZhbHVlT3JFbHNlAgkAoAgBBQ92b3RlUmVqZWN0ZWRLZXkHAwULaXNDb25maXJtZWQGBQppc1JlamVjdGVkARVhZGRTdHJpbmdUb1N0YXRlQXJyYXkCB2RhdGFLZXkEaXRlbQQHYWxsRGF0YQkBC3ZhbHVlT3JFbHNlAgkAoggBBQdkYXRhS2V5AgADCQEBIQEJAQlpc0RlZmluZWQBCQCzCQIFB2FsbERhdGEFBGl0ZW0DCQAAAgkAsQIBBQdhbGxEYXRhAAAJAMwIAgkBC1N0cmluZ0VudHJ5AgUHZGF0YUtleQUEaXRlbQUDbmlsCQDMCAIJAQtTdHJpbmdFbnRyeQIFB2RhdGFLZXkJALsJAgkAzQgCCQC9CQIFB2FsbERhdGECASwFBGl0ZW0CASwFA25pbAUDbmlsARhyZW1vdmVJdGVtRnJvbVN0YXRlQXJyYXkCB2RhdGFLZXkEaXRlbQQHYWxsRGF0YQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEFB2RhdGFLZXkJAKwCAgkArAICAg9EYXRhIGZvciBrZXk6ICcFB2RhdGFLZXkCCycgbm90IGZvdW5kAwkBCWlzRGVmaW5lZAEJALMJAgUHYWxsRGF0YQUEaXRlbQQIZGF0YUxpc3QJAL0JAgUHYWxsRGF0YQIBLAQJaXRlbUluZGV4CQEFdmFsdWUBCQDPCAIFCGRhdGFMaXN0BQRpdGVtCQDMCAIJAQtTdHJpbmdFbnRyeQIFB2RhdGFLZXkJALsJAgkA0QgCBQhkYXRhTGlzdAUJaXRlbUluZGV4AgEsBQNuaWwFA25pbAgBaQEFc3Rha2UBBWRlYnVnBAphZGRyZXNzU3RyCQClCAEIBQFpBmNhbGxlcgQBcAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCRAwIIBQFpCHBheW1lbnRzAAACC05vIHBheW1lbnRzBAVhc3NldAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAggFAXAHYXNzZXRJZAIPSW52YWxpZCBwYXltZW50AhBJbnZhbGlkIGFzc2V0IElkAwUFZGVidWcJAAIBCQCsAgICDnBheW1lbnRzIHNpemUgCQCkAwEJAJADAQgFAWkIcGF5bWVudHMDAwkAZgIIBQFwBmFtb3VudAAACQEIY2hlY2tORlQBBQVhc3NldAcEC3RvdGFsU3Rha2VkCQELdmFsdWVPckVsc2UCCQCfCAEFDnRvdGFsU3Rha2VkS2V5AAAECnRvdGFsUG93ZXIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUNdG90YWxQb3dlcktleQAABA9hZGRyZXNzUG93ZXJLZXkJAKwCAgkArAICAghhZGRyZXNzXwUKYWRkcmVzc1N0cgIGX3Bvd2VyBBVhZGRyZXNzVG90YWxTdGFrZWRLZXkJAKwCAgkArAICAghhZGRyZXNzXwUKYWRkcmVzc1N0cgIMX3RvdGFsU3Rha2VkBBRhZGRyZXNzU3Rha2VkTmZ0c0tleQkArAICCQCsAgICCGFkZHJlc3NfBQphZGRyZXNzU3RyAgtfc3Rha2VkTmZ0cwQMYWRkcmVzc1Bvd2VyCQELdmFsdWVPckVsc2UCCQCfCAEFD2FkZHJlc3NQb3dlcktleQAABBJhZGRyZXNzVG90YWxTdGFrZWQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUVYWRkcmVzc1RvdGFsU3Rha2VkS2V5AAAEEWFkZHJlc3NTdGFrZWROZnRzCQELdmFsdWVPckVsc2UCCQCiCAEFFGFkZHJlc3NTdGFrZWROZnRzS2V5AgADCQBmAgkAZAIFEmFkZHJlc3NUb3RhbFN0YWtlZAABAAUJAAIBAhlZb3UgY2FuIHN0YWtlIG9ubHkgNSBORlRzBAhuZnRQb3dlcgkBC2dldFBvd2VyTkZUAQUFYXNzZXQECG5mdElkU3RyCQDYBAEIBQVhc3NldAJpZAQWYWRkcmVzc1N0YWtlZE5mdHNTdGF0ZQMJAAACCQCxAgEFEWFkZHJlc3NTdGFrZWROZnRzAAAJAMwIAgkBC1N0cmluZ0VudHJ5AgUUYWRkcmVzc1N0YWtlZE5mdHNLZXkFCG5mdElkU3RyBQNuaWwJAMwIAgkBC1N0cmluZ0VudHJ5AgUUYWRkcmVzc1N0YWtlZE5mdHNLZXkJALkJAgkAzQgCCQC1CQIFEWFkZHJlc3NTdGFrZWROZnRzAgEsBQhuZnRJZFN0cgIBLAUDbmlsCQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUOdG90YWxTdGFrZWRLZXkJAGQCBQt0b3RhbFN0YWtlZAABCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ10b3RhbFBvd2VyS2V5CQBkAgUKdG90YWxQb3dlcgUIbmZ0UG93ZXIJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICBG5mdF8FCG5mdElkU3RyAgZfb3duZXIFCmFkZHJlc3NTdHIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAgRuZnRfBQhuZnRJZFN0cgIGX3Bvd2VyBQhuZnRQb3dlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgUPYWRkcmVzc1Bvd2VyS2V5CQBkAgUMYWRkcmVzc1Bvd2VyBQhuZnRQb3dlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgUVYWRkcmVzc1RvdGFsU3Rha2VkS2V5CQBkAgUSYWRkcmVzc1RvdGFsU3Rha2VkAAEFA25pbAkBFWFkZFN0cmluZ1RvU3RhdGVBcnJheQIFFWFsbFN0YWtlZEFkZHJlc3Nlc0tleQUKYWRkcmVzc1N0cgUWYWRkcmVzc1N0YWtlZE5mdHNTdGF0ZQkAAgECC05vIHBheW1lbnRzAWkBB3Vuc3Rha2UCCG5mdElkU3RyBWRlYnVnBAphZGRyZXNzU3RyCQClCAEIBQFpBmNhbGxlcgQFYXNzZXQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBCQDZBAEFCG5mdElkU3RyAg5JbnZhbGlkIG5mdCBJZAQMb3duZXJBZGRyZXNzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkArAICCQCsAgICBG5mdF8FCG5mdElkU3RyAgZfb3duZXICEk93bmVyIGRhdGEgaW52YWxpZAMJAQIhPQIFDG93bmVyQWRkcmVzcwUKYWRkcmVzc1N0cgkAAgECFVlvdSBhcmUgbm90IHRoZSBvd25lcgMJAQhjaGVja05GVAEFBWFzc2V0BAt0b3RhbFN0YWtlZAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQ50b3RhbFN0YWtlZEtleQAABAp0b3RhbFBvd2VyCQELdmFsdWVPckVsc2UCCQCfCAEFDXRvdGFsUG93ZXJLZXkAAAQPYWRkcmVzc1Bvd2VyS2V5CQCsAgIJAKwCAgIIYWRkcmVzc18FCmFkZHJlc3NTdHICBl9wb3dlcgQVYWRkcmVzc1RvdGFsU3Rha2VkS2V5CQCsAgIJAKwCAgIIYWRkcmVzc18FCmFkZHJlc3NTdHICDF90b3RhbFN0YWtlZAQUYWRkcmVzc1N0YWtlZE5mdHNLZXkJAKwCAgkArAICAghhZGRyZXNzXwUKYWRkcmVzc1N0cgILX3N0YWtlZE5mdHMEDGFkZHJlc3NQb3dlcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEFD2FkZHJlc3NQb3dlcktleQIdQWRkcmVzcyBwb3dlciB2YWx1ZSBub3QgZm91bmQEEmFkZHJlc3NUb3RhbFN0YWtlZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEFFWFkZHJlc3NUb3RhbFN0YWtlZEtleQIkQWRkcmVzcyB0b3RhbCBzdGFrZWQgdmFsdWUgbm90IGZvdW5kBBFhZGRyZXNzU3Rha2VkTmZ0cwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEFFGFkZHJlc3NTdGFrZWROZnRzS2V5AiNBZGRyZXNzIHN0YWtlZCBOZnRzIHZhbHVlIG5vdCBmb3VuZAQNbmZ0QXNzZXRJZFN0cgkA2AQBCAUFYXNzZXQCaWQECG5mdFBvd2VyCQERQGV4dHJOYXRpdmUoMTA1NSkBCQCsAgIJAKwCAgIEbmZ0XwUNbmZ0QXNzZXRJZFN0cgIGX3Bvd2VyBBN1cGRhdGVkQWRkcmVzc1Bvd2VyCQBlAgUMYWRkcmVzc1Bvd2VyBQhuZnRQb3dlcgQTcmVtb3ZlU3Rha2VkQWRkcmVzcwMJAAACBRN1cGRhdGVkQWRkcmVzc1Bvd2VyAAAJARhyZW1vdmVJdGVtRnJvbVN0YXRlQXJyYXkCBRVhbGxTdGFrZWRBZGRyZXNzZXNLZXkFCmFkZHJlc3NTdHIFA25pbAQVYWRkcmVzc1N0YWtlZE5mdHNMaXN0CQC1CQIFEWFkZHJlc3NTdGFrZWROZnRzAgEsBBVhZGRyZXNzU3Rha2VkTmZ0SW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBRVhZGRyZXNzU3Rha2VkTmZ0c0xpc3QFCG5mdElkU3RyAiVORlQgbm90IGZvdW5lZCBpbiBhZGRyZXNzIHN0YWtlZCBsaXN0CQDOCAIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyAAEIBQVhc3NldAJpZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUOdG90YWxTdGFrZWRLZXkJAGUCBQt0b3RhbFN0YWtlZAABCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ10b3RhbFBvd2VyS2V5CQBlAgUKdG90YWxQb3dlcgUIbmZ0UG93ZXIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgICBG5mdF8FDW5mdEFzc2V0SWRTdHICBl9vd25lcgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgIEbmZ0XwUNbmZ0QXNzZXRJZFN0cgIGX3Bvd2VyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ9hZGRyZXNzUG93ZXJLZXkFE3VwZGF0ZWRBZGRyZXNzUG93ZXIJAMwIAgkBDEludGVnZXJFbnRyeQIFFWFkZHJlc3NUb3RhbFN0YWtlZEtleQkAZQIFEmFkZHJlc3NUb3RhbFN0YWtlZAABCQDMCAIJAQtTdHJpbmdFbnRyeQIFFGFkZHJlc3NTdGFrZWROZnRzS2V5CQC5CQIJANEIAgUVYWRkcmVzc1N0YWtlZE5mdHNMaXN0BRVhZGRyZXNzU3Rha2VkTmZ0SW5kZXgCASwFA25pbAUTcmVtb3ZlU3Rha2VkQWRkcmVzcwkAAgECDkludmFsaWQgbmZ0IElkAWkBCnNlbmRUb1ZvdGUBDGNvbGxlY3Rpb25JZAQGaXNzdWVyCQCRAwIJALUJAgUMY29sbGVjdGlvbklkAgFfAAAEB2lzRXhpc3QEByRtYXRjaDAJAKIIAQkArAICCQCsAgICC2NvbGxlY3Rpb25fBQxjb2xsZWN0aW9uSWQCB192b3RlSWQDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAF0BQckbWF0Y2gwBgcDCQAAAgkAsQIBBQZpc3N1ZXIAAAkAAgECG0NvbGxlY3Rpb24gaXNzdWVyIG5vdCBmb3VuZAMFB2lzRXhpc3QJAAIBAjBDb2xsZWN0aW9uIGhhcyBhbHJlYWR5IGJlZW4gc3VibWl0dGVkIGZvciB2b3RpbmcDCQECIT0CBQZpc3N1ZXIJAKUIAQgFAWkGY2FsbGVyCQACAQImT25seSB0aGUgaXNzdWVyIGNhbiBzdWJtaXQgdG8gdGhlIHZvdGUEBnZvdGVJZAkA2AQBCQDUFgEJAJsDAQUMY29sbGVjdGlvbklkBAp0b3RhbFZvdGVzCQELdmFsdWVPckVsc2UCCQCfCAECC3RvdGFsX3ZvdGVzAAAEC3F1b3J1bUxpbWl0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQURdm90ZVBvd2VyTGltaXRLZXkCGlZvdGUgcG93ZXIgbGltaXQgbm90IGZvdW5kCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAgtjb2xsZWN0aW9uXwUMY29sbGVjdGlvbklkAgdfdm90ZUlkBQZ2b3RlSWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCDV9jb2xsZWN0aW9uSWQFDGNvbGxlY3Rpb25JZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAIGX293bmVyCQClCAEIBQFpBmNhbGxlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCCl9jcmVhdGVkQXQFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCB19xdW9ydW0FC3F1b3J1bUxpbWl0CQDMCAIJAQxJbnRlZ2VyRW50cnkCAgt0b3RhbF92b3RlcwkAZAIFCnRvdGFsVm90ZXMAAQUDbmlsAWkBDnJlbW92ZUZyb21Wb3RlAQZ2b3RlSWQEDGNvbGxlY3Rpb25JZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAg1fY29sbGVjdGlvbklkAhdDb2xsZWN0aW9uIElkIG5vdCBmb3VuZAQFb3duZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAIGX293bmVyAg9Pd25lciBub3QgZm91bmQDCQECIT0CBQVvd25lcgkApQgBCAUBaQZjYWxsZXIJAAIBAhVZb3UgYXJlIG5vdCB0aGUgb3duZXIDCQEOaXNWb3RpbmdDbG9zZWQBBQZ2b3RlSWQJAAIBAhBWb3RpbmcgaXMgY2xvc2VkBAp0b3RhbFZvdGVzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQILdG90YWxfdm90ZXMCG3RvdGFsIHZvdGVzIHZhbHVlIG5vdCBmb3VuZAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgILY29sbGVjdGlvbl8FDGNvbGxlY3Rpb25JZAIHX3ZvdGVJZAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAINX2NvbGxlY3Rpb25JZAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAIGX293bmVyCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAgpfY3JlYXRlZEF0CQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAgdfcXVvcnVtCQDMCAIJAQxJbnRlZ2VyRW50cnkCAgt0b3RhbF92b3RlcwkAZQIFCnRvdGFsVm90ZXMAAQUDbmlsAWkBCXZvdGVCeU5GVAIGdm90ZUlkBmFzc2V0cwQKYWRkcmVzc1N0cgkApQgBCAUBaQZjYWxsZXIEDGNvbGxlY3Rpb25JZAkBC3ZhbHVlT3JFbHNlAgkAoggBCQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAINX2NvbGxlY3Rpb25JZAIAAwkBDmlzVm90aW5nQ2xvc2VkAQUGdm90ZUlkCQACAQIQVm90aW5nIGlzIGNsb3NlZAMJAAACCQCxAgEFDGNvbGxlY3Rpb25JZAAACQACAQIUQ29sbGVjdGlvbiBub3QgZm91bmQDCQAAAgkAsQIBBQZhc3NldHMAAAkAAgECFEFzc2V0cyBsaXN0IGlzIGVtcHR5BA52b3RlVXBQb3dlcktleQkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCCF91cFBvd2VyBBB2b3RlRG93blBvd2VyS2V5CQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAIKX2Rvd25Qb3dlcgQRdm90ZVRvdGFsUG93ZXJLZXkJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAgtfdG90YWxQb3dlcgQPdm90ZVVzZWROZnRzS2V5CQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAIJX3VzZWROZnRzBBJ2b3RlclNwZW50UG93ZXJLZXkJAKwCAgkArAICAgZ2b3Rlcl8FCmFkZHJlc3NTdHICC19zcGVudFBvd2VyBBR2b3RlclZvdGVVc2VkTmZ0c0tleQkArAICCQCsAgIJAKwCAgkArAICAgZ2b3Rlcl8FCmFkZHJlc3NTdHICBl92b3RlXwUGdm90ZUlkAglfdXNlZE5mdHMEFnZvdGVyVm90ZVNwZW50UG93ZXJLZXkJAKwCAgkArAICCQCsAgIJAKwCAgIGdm90ZXJfBQphZGRyZXNzU3RyAgZfdm90ZV8FBnZvdGVJZAILX3NwZW50UG93ZXIED2FkZHJlc3NQb3dlcktleQkArAICCQCsAgICCGFkZHJlc3NfBQphZGRyZXNzU3RyAgZfcG93ZXIEFGFkZHJlc3NTdGFrZWROZnRzS2V5CQCsAgIJAKwCAgIIYWRkcmVzc18FCmFkZHJlc3NTdHICC19zdGFrZWROZnRzBAt1cFBvd2VyRGFwcAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQ52b3RlVXBQb3dlcktleQAABA1kb3duUG93ZXJEYXBwCQELdmFsdWVPckVsc2UCCQCfCAEFEHZvdGVEb3duUG93ZXJLZXkAAAQOdG90YWxWb3RlUG93ZXIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQURdm90ZVRvdGFsUG93ZXJLZXkAAAQMdm90ZVVzZWROZnRzCQELdmFsdWVPckVsc2UCCQCiCAEFD3ZvdGVVc2VkTmZ0c0tleQIABA92b3RlclNwZW50UG93ZXIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUSdm90ZXJTcGVudFBvd2VyS2V5AAAEEXZvdGVyVm90ZVVzZWROZnRzCQELdmFsdWVPckVsc2UCCQCiCAEFFHZvdGVyVm90ZVVzZWROZnRzS2V5AgAED3RvdGFsU3BlbnRQb3dlcgkBC3ZhbHVlT3JFbHNlAgkAnwgBBRJ0b3RhbFNwZW50UG93ZXJLZXkAAAQTdm90ZXJWb3RlU3BlbnRQb3dlcgkBC3ZhbHVlT3JFbHNlAgkAnwgBBRZ2b3RlclZvdGVTcGVudFBvd2VyS2V5AAAEDGFkZHJlc3NQb3dlcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEFD2FkZHJlc3NQb3dlcktleQIUWW91IGRvbid0IGhhdmUgcG93ZXIEEWFkZHJlc3NTdGFrZWROZnRzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQUUYWRkcmVzc1N0YWtlZE5mdHNLZXkCGllvdSBkb24ndCBoYXZlIHN0YWtlZCBORlRzBBlhZGRlcnNzTGFzdFJld2FyZFJvdW5kS2V5CQCsAgIJAKwCAgIIYWRkcmVzc18FCmFkZHJlc3NTdHICEV9sYXN0UmV3YXJkc1JvdW5kBBNjdXJyZW50UmV3b3Jkc1JvdW5kCQELdmFsdWVPckVsc2UCCQCfCAEFFmN1cnJlbnRSZXdvcmRzUm91bmRLZXkAAAQWYWRkZXJzc0xhc3RSZXdhcmRSb3VuZAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRlhZGRlcnNzTGFzdFJld2FyZFJvdW5kS2V5AAAECmFzc2V0c0xpc3QJALUJAgUGYXNzZXRzAgF8BBB2b3RlVXNlZE5mdHNMaXN0AwkAAAIJALECAQUMdm90ZVVzZWROZnRzAAAFA25pbAkAvQkCBQx2b3RlVXNlZE5mdHMCASwEFXZvdGVyVm90ZVVzZWROZnRzTGlzdAMJAAACCQCxAgEFEXZvdGVyVm90ZVVzZWROZnRzAAAFA25pbAkAvQkCBRF2b3RlclZvdGVVc2VkTmZ0cwIBLAoBDXByb2Nlc3NBc3NldHMCBWFjY3VtBG5leHQEBXBhcnRzCQC1CQIFBG5leHQCAV8EBW5mdElkCQCRAwIFBXBhcnRzAAAEBHR5cGUJAJEDAgUFcGFydHMAAQQFcG93ZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBCQCsAgIJAKwCAgIEbmZ0XwUFbmZ0SWQCBl9wb3dlcgITTkZUIHBvd2VyIG5vdCBmb3VuZAQQc3Rha2VkT3duZXJJbmRleAkBC3ZhbHVlT3JFbHNlAgkAswkCBRFhZGRyZXNzU3Rha2VkTmZ0cwUFbmZ0SWQA////////////AQMJAAACBQVwb3dlcgAACQACAQIXUG93ZXIgbXVzdCBiZSBtb3JlIHplcm8DCQAAAgUQc3Rha2VkT3duZXJJbmRleAD///////////8BCQACAQIcQXNzZXQgZG9lcyBub3QgYmVsb25nIHRvIHlvdQQKYXNzZXRJbmRleAkBC3ZhbHVlT3JFbHNlAgkAzwgCBRB2b3RlVXNlZE5mdHNMaXN0BQVuZnRJZAD///////////8BAwkAAAIFCmFzc2V0SW5kZXgA////////////AQMDCQECIT0CBQR0eXBlAgJ1cAkBAiE9AgUEdHlwZQIEZG93bgcJAAIBAgxJbnZhbGlkIHR5cGUJAJYKBAkAZAIIBQVhY2N1bQJfMQMJAAACBQR0eXBlAgJ1cAUFcG93ZXIAAAkAZAIIBQVhY2N1bQJfMgMJAAACBQR0eXBlAgRkb3duBQVwb3dlcgAACQDNCAIIBQVhY2N1bQJfMwUFbmZ0SWQJAM0IAggFBWFjY3VtAl80CQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIGdm90ZXJfBQphZGRyZXNzU3RyAgZfdm90ZV8FBnZvdGVJZAIJX2Fzc2V0SWRfBQVuZnRJZAkArAICCQCsAgIJAKwCAgkArAICBQR0eXBlAgE6CQCkAwEFBXBvd2VyAgE6CQCkAwEFBmhlaWdodAUFYWNjdW0EEnByb2Nlc3NSZXN1bHRUdXBsZQoAAiRsBQphc3NldHNMaXN0CgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlgoEAAAAAAUDbmlsBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDXByb2Nlc3NBc3NldHMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFBAd1cFBvd2VyCAUScHJvY2Vzc1Jlc3VsdFR1cGxlAl8xBAlkb3duUG93ZXIIBRJwcm9jZXNzUmVzdWx0VHVwbGUCXzIECnBvd2VyVmFsdWUJAGQCBQd1cFBvd2VyBQlkb3duUG93ZXIDCQBmAgUKcG93ZXJWYWx1ZQUMYWRkcmVzc1Bvd2VyCQACAQIiUG93ZXIgZXhjZWVkcyBwb3dlciBvZiB0aGUgYWNjb3VudAMJAAACBQpwb3dlclZhbHVlAAAJAAIBAhhOb3QgZW5vdWdoIHBvd2VyIHRvIHZvdGUDCQAAAgkAkAMBCAUScHJvY2Vzc1Jlc3VsdFR1cGxlAl8zAAAJAAIBAhtVc2VkIGxpc3QgbXVzdCBub3QgYmUgZW1wdHkDCQAAAgkAkAMBCAUScHJvY2Vzc1Jlc3VsdFR1cGxlAl80AAAJAAIBAiRTdGF0ZSBlbnRyaWVzIGxpc3QgbXVzdCBub3QgYmUgZW1wdHkEC3F1b3J1bUxpbWl0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQURdm90ZVBvd2VyTGltaXRLZXkCGlZvdGUgcG93ZXIgbGltaXQgbm90IGZvdW5kBBR1cGRhdGVDYW5kaXRhdGVzTGlzdAMJAGYCCQBkAgUOdG90YWxWb3RlUG93ZXIFCnBvd2VyVmFsdWUFC3F1b3J1bUxpbWl0CQEVYWRkU3RyaW5nVG9TdGF0ZUFycmF5AgUYZmluYWxWb3RpbmdDYW5kaWRhdGVzS2V5BQZ2b3RlSWQFA25pbAQYYWRkcmVzc1Jld29yZHNSb3VuZFN0YXRlAwMJAAACBRZhZGRlcnNzTGFzdFJld2FyZFJvdW5kAAAJAGYCBRNjdXJyZW50UmV3b3Jkc1JvdW5kBRZhZGRlcnNzTGFzdFJld2FyZFJvdW5kBwkAzAgCCQEMSW50ZWdlckVudHJ5AgUZYWRkZXJzc0xhc3RSZXdhcmRSb3VuZEtleQUTY3VycmVudFJld29yZHNSb3VuZAUDbmlsBQNuaWwJAM4IAgkAzggCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFEnZvdGVyU3BlbnRQb3dlcktleQkAZAIFD3ZvdGVyU3BlbnRQb3dlcgUKcG93ZXJWYWx1ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgUSdG90YWxTcGVudFBvd2VyS2V5CQBkAgUPdG90YWxTcGVudFBvd2VyBQpwb3dlclZhbHVlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ52b3RlVXBQb3dlcktleQkAZAIFC3VwUG93ZXJEYXBwBQd1cFBvd2VyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRB2b3RlRG93blBvd2VyS2V5CQBkAgUNZG93blBvd2VyRGFwcAUJZG93blBvd2VyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRF2b3RlVG90YWxQb3dlcktleQkAZAIFDnRvdGFsVm90ZVBvd2VyBQpwb3dlclZhbHVlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRZ2b3RlclZvdGVTcGVudFBvd2VyS2V5CQBkAgUTdm90ZXJWb3RlU3BlbnRQb3dlcgUKcG93ZXJWYWx1ZQkAzAgCCQELU3RyaW5nRW50cnkCBRR2b3RlclZvdGVVc2VkTmZ0c0tleQkAuwkCCQDOCAIFFXZvdGVyVm90ZVVzZWROZnRzTGlzdAgFEnByb2Nlc3NSZXN1bHRUdXBsZQJfMwIBLAkAzAgCCQELU3RyaW5nRW50cnkCBQ92b3RlVXNlZE5mdHNLZXkJALsJAgkAzggCBRB2b3RlVXNlZE5mdHNMaXN0CAUScHJvY2Vzc1Jlc3VsdFR1cGxlAl8zAgEsBQNuaWwIBRJwcm9jZXNzUmVzdWx0VHVwbGUCXzQFFHVwZGF0ZUNhbmRpdGF0ZXNMaXN0BRhhZGRyZXNzUmV3b3Jkc1JvdW5kU3RhdGUBaQELdW52b3RlQnlORlQCBnZvdGVJZAZhc3NldHMECmFkZHJlc3NTdHIJAKUIAQgFAWkGY2FsbGVyBAxjb2xsZWN0aW9uSWQJAQt2YWx1ZU9yRWxzZQIJAKIIAQkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCDV9jb2xsZWN0aW9uSWQCAAMJAQ5pc1ZvdGluZ0Nsb3NlZAEFBnZvdGVJZAkAAgECEFZvdGluZyBpcyBjbG9zZWQDCQAAAgkAsQIBBQxjb2xsZWN0aW9uSWQAAAkAAgECFENvbGxlY3Rpb24gbm90IGZvdW5kBA52b3RlVXBQb3dlcktleQkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCCF91cFBvd2VyBBB2b3RlRG93blBvd2VyS2V5CQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAIKX2Rvd25Qb3dlcgQRdm90ZVRvdGFsUG93ZXJLZXkJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAgtfdG90YWxQb3dlcgQPdm90ZVVzZWROZnRzS2V5CQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAIJX3VzZWROZnRzBBJ2b3RlclNwZW50UG93ZXJLZXkJAKwCAgkArAICAgZ2b3Rlcl8FCmFkZHJlc3NTdHICC19zcGVudFBvd2VyBBR2b3RlclZvdGVVc2VkTmZ0c0tleQkArAICCQCsAgIJAKwCAgkArAICAgZ2b3Rlcl8FCmFkZHJlc3NTdHICBl92b3RlXwUGdm90ZUlkAglfdXNlZE5mdHMEFnZvdGVyVm90ZVNwZW50UG93ZXJLZXkJAKwCAgkArAICCQCsAgIJAKwCAgIGdm90ZXJfBQphZGRyZXNzU3RyAgZfdm90ZV8FBnZvdGVJZAILX3NwZW50UG93ZXIED2FkZHJlc3NQb3dlcktleQkArAICCQCsAgICCGFkZHJlc3NfBQphZGRyZXNzU3RyAgZfcG93ZXIEFGFkZHJlc3NTdGFrZWROZnRzS2V5CQCsAgIJAKwCAgIIYWRkcmVzc18FCmFkZHJlc3NTdHICC19zdGFrZWROZnRzBAt1cFBvd2VyRGFwcAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEFDnZvdGVVcFBvd2VyS2V5AhdVcCB2b3RlIHBvd2VyIG5vdCBmb3VuZAQNZG93blBvd2VyRGFwcAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEFEHZvdGVEb3duUG93ZXJLZXkCGURvd24gdm90ZSBwb3dlciBub3QgZm91bmQEDnRvdGFsVm90ZVBvd2VyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQURdm90ZVRvdGFsUG93ZXJLZXkCGlRvdGFsIHZvdGUgcG93ZXIgbm90IGZvdW5kBAx2b3RlVXNlZE5mdHMJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBBQ92b3RlVXNlZE5mdHNLZXkCGVZvdGUgdXNlZCBwb3dlciBub3QgZm91bmQED3ZvdGVyU3BlbnRQb3dlcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEFEnZvdGVyU3BlbnRQb3dlcktleQIbVm90ZXIgc3BlbnQgcG93ZXIgbm90IGZvdW5kBA12b3RlclVzZWROZnRzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQUUdm90ZXJWb3RlVXNlZE5mdHNLZXkCHlZvdGVyIHZvdGUgdXNlZCBuZnRzIG5vdCBmb3VuZAQRdm90ZXJWb3RlVXNlZE5mdHMJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBBRR2b3RlclZvdGVVc2VkTmZ0c0tleQIjVm90ZXIgdm90ZSB1c2VkIG5mdHMgbGlzdCBub3QgZm91bmQED3RvdGFsU3BlbnRQb3dlcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEFEnRvdGFsU3BlbnRQb3dlcktleQIbVG90YWwgc3BlbnQgcG93ZXIgbm90IGZvdW5kBBN2b3RlclZvdGVTcGVudFBvd2VyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQUWdm90ZXJWb3RlU3BlbnRQb3dlcktleQIiQWRkcmVzcyB2b3RlIHNwZW50IHBvd2VyIG5vdCBmb3VuZAQMYWRkcmVzc1Bvd2VyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQUPYWRkcmVzc1Bvd2VyS2V5AhRZb3UgZG9uJ3QgaGF2ZSBwb3dlcgQRYWRkcmVzc1N0YWtlZE5mdHMJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBBRRhZGRyZXNzU3Rha2VkTmZ0c0tleQIaWW91IGRvbid0IGhhdmUgc3Rha2VkIE5GVHMECmFzc2V0c0xpc3QDCQBmAgkAsQIBBQZhc3NldHMAAAkAtQkCBQZhc3NldHMCAXwDCQAAAgkAsQIBBRF2b3RlclZvdGVVc2VkTmZ0cwAABQNuaWwJALUJAgURdm90ZXJWb3RlVXNlZE5mdHMCASwKAQ1wcm9jZXNzQXNzZXRzAgVhY2N1bQRuZXh0BAlhc3NldFZvdGUJAQt2YWx1ZU9yRWxzZQIJAKIIAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBnZvdGVyXwUKYWRkcmVzc1N0cgIGX3ZvdGVfBQZ2b3RlSWQCCV9hc3NldElkXwUEbmV4dAIABAVwYXJ0cwkAtQkCBQlhc3NldFZvdGUCAToEBHR5cGUJAJEDAgUFcGFydHMAAAQFcG93ZXIJAQt2YWx1ZU9yRWxzZQIJALYJAQkAkQMCBQVwYXJ0cwABAAAEEHN0YWtlZE93bmVySW5kZXgJAQt2YWx1ZU9yRWxzZQIJALMJAgURYWRkcmVzc1N0YWtlZE5mdHMFBG5leHQA////////////AQQSdm90ZXJWb3RlVXNlZEluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAggFBWFjY3VtAl80BQRuZXh0Ah9Wb3RlciB2b3RlIHVzZWQgaW5kZXggbm90IGZvdW5kAwkAAAIJALECAQUJYXNzZXRWb3RlAAAFBWFjY3VtAwkAAAIFBXBvd2VyAAAJAAIBAhdQb3dlciBtdXN0IGJlIG1vcmUgemVybwMDCQBmAgAABRJ2b3RlclZvdGVVc2VkSW5kZXgJAAACBRBzdGFrZWRPd25lckluZGV4AP///////////wEHCQACAQIcQXNzZXQgZG9lcyBub3QgYmVsb25nIHRvIHlvdQQOYXNzZXRVc2VkSW5kZXgJAQt2YWx1ZU9yRWxzZQIJAM8IAggFBWFjY3VtAl8zBQRuZXh0AP///////////wEDCQBnAgUOYXNzZXRVc2VkSW5kZXgAAAMDCQECIT0CBQR0eXBlAgJ1cAkBAiE9AgUEdHlwZQIEZG93bgcJAAIBAgxJbnZhbGlkIHR5cGUJAJcKBQkAZAIIBQVhY2N1bQJfMQMJAAACBQR0eXBlAgJ1cAUFcG93ZXIAAAkAZAIIBQVhY2N1bQJfMgMJAAACBQR0eXBlAgRkb3duBQVwb3dlcgAACQDRCAIIBQVhY2N1bQJfMwUOYXNzZXRVc2VkSW5kZXgJANEIAggFBWFjY3VtAl80BRJ2b3RlclZvdGVVc2VkSW5kZXgJAM0IAggFBWFjY3VtAl81CQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIGdm90ZXJfBQphZGRyZXNzU3RyAgZfdm90ZV8FBnZvdGVJZAIJX2Fzc2V0SWRfBQRuZXh0BQVhY2N1bQQScHJvY2Vzc1Jlc3VsdFR1cGxlCgACJGwFCmFzc2V0c0xpc3QKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCXCgUAAAAACQC9CQIFDHZvdGVVc2VkTmZ0cwIBLAkAvQkCBRF2b3RlclZvdGVVc2VkTmZ0cwIBLAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQ1wcm9jZXNzQXNzZXRzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQQHdXBQb3dlcggFEnByb2Nlc3NSZXN1bHRUdXBsZQJfMQQJZG93blBvd2VyCAUScHJvY2Vzc1Jlc3VsdFR1cGxlAl8yBApwb3dlclZhbHVlCQBkAgUHdXBQb3dlcgUJZG93blBvd2VyAwkAZgIFCnBvd2VyVmFsdWUFD3ZvdGVyU3BlbnRQb3dlcgkAAgECJVBvd2VyIHZhbHVlIGV4Y2VlZHMgdm90ZXIgc3BlbnQgcG93ZXIDCQAAAgUKcG93ZXJWYWx1ZQAACQACAQIaTm90IGVub3VnaCBwb3dlciB0byB1bnZvdGUDCQAAAgkAkAMBCAUScHJvY2Vzc1Jlc3VsdFR1cGxlAl81AAAJAAIBAiRTdGF0ZSBlbnRyaWVzIGxpc3QgbXVzdCBub3QgYmUgZW1wdHkEC3F1b3J1bUxpbWl0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQURdm90ZVBvd2VyTGltaXRLZXkCGlZvdGUgcG93ZXIgbGltaXQgbm90IGZvdW5kBBR1cGRhdGVDYW5kaXRhdGVzTGlzdAMJAGYCBQtxdW9ydW1MaW1pdAkAZQIFDnRvdGFsVm90ZVBvd2VyBQpwb3dlclZhbHVlCQEYcmVtb3ZlSXRlbUZyb21TdGF0ZUFycmF5AgUYZmluYWxWb3RpbmdDYW5kaWRhdGVzS2V5BQZ2b3RlSWQFA25pbAkAzggCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFEnZvdGVyU3BlbnRQb3dlcktleQkAZQIFD3ZvdGVyU3BlbnRQb3dlcgUKcG93ZXJWYWx1ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgUSdG90YWxTcGVudFBvd2VyS2V5CQBlAgUPdG90YWxTcGVudFBvd2VyBQpwb3dlclZhbHVlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ52b3RlVXBQb3dlcktleQkAZQIFC3VwUG93ZXJEYXBwBQd1cFBvd2VyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRB2b3RlRG93blBvd2VyS2V5CQBlAgUNZG93blBvd2VyRGFwcAUJZG93blBvd2VyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRF2b3RlVG90YWxQb3dlcktleQkAZQIFDnRvdGFsVm90ZVBvd2VyBQpwb3dlclZhbHVlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRZ2b3RlclZvdGVTcGVudFBvd2VyS2V5CQBlAgUTdm90ZXJWb3RlU3BlbnRQb3dlcgUKcG93ZXJWYWx1ZQkAzAgCCQELU3RyaW5nRW50cnkCBRR2b3RlclZvdGVVc2VkTmZ0c0tleQkAuwkCCAUScHJvY2Vzc1Jlc3VsdFR1cGxlAl80AgEsCQDMCAIJAQtTdHJpbmdFbnRyeQIFD3ZvdGVVc2VkTmZ0c0tleQkAuwkCCAUScHJvY2Vzc1Jlc3VsdFR1cGxlAl8zAgEsBQNuaWwIBRJwcm9jZXNzUmVzdWx0VHVwbGUCXzUFFHVwZGF0ZUNhbmRpdGF0ZXNMaXN0AWkBDWZpbGxUcmVhc3VhcnkAAwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECCk5vIHBheW1lbnQDCQAAAggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQAAAkAAgECFlBheW1lbnQgbXVzdCBiZSBtb3JlIDADCQECIT0CCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFC1VTRFRBc3NldElkCQACAQIXUGF5bWVudCBtdXN0IGJlIGluIFVTRFQEBmFtb3VudAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQEB2Fzc2V0SWQJAQV2YWx1ZQEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQVZmluYWxWb3RpbmdDYW5kaWRhdGVzCQELdmFsdWVPckVsc2UCCQCiCAEFGGZpbmFsVm90aW5nQ2FuZGlkYXRlc0tleQIAAwkAAAIJALECAQUVZmluYWxWb3RpbmdDYW5kaWRhdGVzAAAJAAIBAhhDYW5kaXRhdGVzIGxpc3QgaXMgZW1wdHkEGWZpbmFsVm90aW5nQ2FuZGlkYXRlc0xpc3QJALUJAgUVZmluYWxWb3RpbmdDYW5kaWRhdGVzAgEsCgELcHJvY2Vzc1ZvdGUCBWFjY3VtBG5leHQEBnZvdGVJZAUEbmV4dAQOdm90ZVVwUG93ZXJLZXkJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAghfdXBQb3dlcgQQdm90ZURvd25Qb3dlcktleQkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCCl9kb3duUG93ZXIEEXZvdGVUb3RhbFBvd2VyS2V5CQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAILX3RvdGFsUG93ZXIEC3ZvdGVVcFBvd2VyCQELdmFsdWVPckVsc2UCCQCfCAEFDnZvdGVVcFBvd2VyS2V5AAAEDXZvdGVEb3duUG93ZXIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUQdm90ZURvd25Qb3dlcktleQAABA52b3RlVG90YWxQb3dlcgkBC3ZhbHVlT3JFbHNlAgkAnwgBBRF2b3RlVG90YWxQb3dlcktleQAABAtxdW9ydW1MaW1pdAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEFEXZvdGVQb3dlckxpbWl0S2V5AhpWb3RlIHBvd2VyIGxpbWl0IG5vdCBmb3VuZAMJAAACBQ52b3RlVG90YWxQb3dlcgAACQACAQITSW52YWxpZCB0b3RhbCBwb3dlcgMJAGYCBQtxdW9ydW1MaW1pdAUOdm90ZVRvdGFsUG93ZXIJAAIBAhVQb3dlciBsZXNzIHRoYW4gbGltaXQDCQAAAgkAZAIFC3ZvdGVVcFBvd2VyBQ12b3RlRG93blBvd2VyAAAJAAIBAhZJbnZhbGlkIHVwLCBkb3duIHBvd2VyAwkBDmlzVm90aW5nQ2xvc2VkAQUGdm90ZUlkCQCWCgQIBQVhY2N1bQJfMQgFBWFjY3VtAl8yCAUFYWNjdW0CXzMJARhyZW1vdmVJdGVtRnJvbVN0YXRlQXJyYXkCBRhmaW5hbFZvdGluZ0NhbmRpZGF0ZXNLZXkFBnZvdGVJZAQJdXBQZXJjZW50CQBrAwULdm90ZVVwUG93ZXIAZAUOdm90ZVRvdGFsUG93ZXIEDmZpbmFsVm90ZVN0YXRlAwkAZgIFCXVwUGVyY2VudAAyCQEMQm9vbGVhbkVudHJ5AgkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCCl9jb25maXJtZWQGCQEMQm9vbGVhbkVudHJ5AgkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCCV9yZWplY3RlZAYJAJYKBAkAZAIIBQVhY2N1bQJfMQUOdm90ZVRvdGFsUG93ZXIJAM0IAggFBWFjY3VtAl8yBQZ2b3RlSWQJAM0IAggFBWFjY3VtAl8zBQ5maW5hbFZvdGVTdGF0ZQkBGHJlbW92ZUl0ZW1Gcm9tU3RhdGVBcnJheQIFGGZpbmFsVm90aW5nQ2FuZGlkYXRlc0tleQUGdm90ZUlkBAtyZXN1bHRUdXBsZQoAAiRsBRlmaW5hbFZvdGluZ0NhbmRpZGF0ZXNMaXN0CgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlgoEAAAFA25pbAUDbmlsBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBC3Byb2Nlc3NWb3RlAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBBBhbGxFbmRWb3Rlc1Bvd2VyCAULcmVzdWx0VHVwbGUCXzEEDmZpbmFsVm90ZXNMaXN0CAULcmVzdWx0VHVwbGUCXzIED2ZpbmFsVm90ZXNTdGF0ZQgFC3Jlc3VsdFR1cGxlAl8zBBp1cGRhdGVkTGlzdEZpbmFsQ2FuZGl0YXRlcwgFC3Jlc3VsdFR1cGxlAl80AwkAAAIFEGFsbEVuZFZvdGVzUG93ZXIAAAkAAgECIU5vIHBvd2VyIGFmdGVyIHByb2Nlc3MgY2FuZGl0YXRlcwQTY3VycmVudFJld29yZHNSb3VuZAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRZjdXJyZW50UmV3b3Jkc1JvdW5kS2V5AAAEDGNvc3RQZXJQb3dlcgkAawMFBmFtb3VudAABBRBhbGxFbmRWb3Rlc1Bvd2VyBBh0cmVhc3VhcnlBc3NldElkVG90YWxLZXkJAKwCAgkArAICAgp0cmVhc3VhcnlfCQDYBAEFB2Fzc2V0SWQCBl90b3RhbAQcdHJlYXN1YXJ5QXNzZXRJZEF2YWlsYWJsZUtleQkArAICCQCsAgICCnRyZWFzdWFyeV8JANgEAQUHYXNzZXRJZAIKX2F2YWlsYWJsZQQVdHJlYXN1YXJ5QXNzZXRJZFRvdGFsCQELdmFsdWVPckVsc2UCCQCfCAEFGHRyZWFzdWFyeUFzc2V0SWRUb3RhbEtleQAABBl0cmVhc3VhcnlBc3NldElkQXZhaWxhYmxlCQELdmFsdWVPckVsc2UCCQCfCAEFHHRyZWFzdWFyeUFzc2V0SWRBdmFpbGFibGVLZXkAAAkAzggCCQDOCAIJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICB3Jld2FyZF8JAKQDAQUTY3VycmVudFJld29yZHNSb3VuZAIJX3ZvdGVzSWRzCQC5CQIFDmZpbmFsVm90ZXNMaXN0AgEsCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAgdyZXdhcmRfCQCkAwEFE2N1cnJlbnRSZXdvcmRzUm91bmQCCF9hc3NldElkCQDYBAEFB2Fzc2V0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAgdyZXdhcmRfCQCkAwEFE2N1cnJlbnRSZXdvcmRzUm91bmQCDV9jb3N0UGVyUG93ZXIFDGNvc3RQZXJQb3dlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICB3Jld2FyZF8JAKQDAQUTY3VycmVudFJld29yZHNSb3VuZAIKX3BhaWRQb3dlcgUQYWxsRW5kVm90ZXNQb3dlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgUYdHJlYXN1YXJ5QXNzZXRJZFRvdGFsS2V5CQBkAgUVdHJlYXN1YXJ5QXNzZXRJZFRvdGFsBQZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFHHRyZWFzdWFyeUFzc2V0SWRBdmFpbGFibGVLZXkJAGQCBRl0cmVhc3VhcnlBc3NldElkQXZhaWxhYmxlBQZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFFmN1cnJlbnRSZXdvcmRzUm91bmRLZXkJAGQCBRNjdXJyZW50UmV3b3Jkc1JvdW5kAAEFA25pbAUPZmluYWxWb3Rlc1N0YXRlBRp1cGRhdGVkTGlzdEZpbmFsQ2FuZGl0YXRlcwFpAQxjbGFpbVJld2FyZHMABAphZGRyZXNzU3RyCQClCAEIBQFpBmNhbGxlcgQZYWRkZXJzc0xhc3RSZXdhcmRSb3VuZEtleQkArAICCQCsAgICCGFkZHJlc3NfBQphZGRyZXNzU3RyAhFfbGFzdFJld2FyZHNSb3VuZAQTY3VycmVudFJld29yZHNSb3VuZAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRZjdXJyZW50UmV3b3Jkc1JvdW5kS2V5AAAEFmFkZGVyc3NMYXN0UmV3YXJkUm91bmQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUZYWRkZXJzc0xhc3RSZXdhcmRSb3VuZEtleQAAAwkAAAIFE2N1cnJlbnRSZXdvcmRzUm91bmQFFmFkZGVyc3NMYXN0UmV3YXJkUm91bmQJAAIBAhpUaGVyZSB3ZXJlIG5vIG5ldyBwYXltZW50cwoBEGNhbGNSZXdhcmRzUm91bmQCBWFjY3VtBG5leHQDCQBnAggFBWFjY3VtAl8xBRNjdXJyZW50UmV3b3Jkc1JvdW5kBQVhY2N1bQQIdm90ZXNJZHMJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQCsAgIJAKwCAgIHcmV3YXJkXwkApAMBCAUFYWNjdW0CXzECCV92b3Rlc0lkcwIaUmV3YXJkIHZvdGVzIGlkcyBub3QgZm91bmQEB2Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQCsAgIJAKwCAgIHcmV3YXJkXwkApAMBCAUFYWNjdW0CXzECCF9hc3NldElkAhhSZXdhcmQgYXNzZXRJZCBub3QgZm91bmQECWNvc3RQb3dlcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEJAKwCAgkArAICAgdyZXdhcmRfCQCkAwEIBQVhY2N1bQJfMQINX2Nvc3RQZXJQb3dlcgIbUmV3YXJkIGNvc3QgcG93ZXIgbm90IGZvdW5kBBp0cmVhc3VhcnlBc3NldElkQ2xhaW1lZEtleQkArAICCQCsAgICCnRyZWFzdWFyeV8FB2Fzc2V0SWQCCF9jbGFpbWVkBBx0cmVhc3VhcnlBc3NldElkQXZhaWxhYmxlS2V5CQCsAgIJAKwCAgIKdHJlYXN1YXJ5XwUHYXNzZXRJZAIKX2F2YWlsYWJsZQQXdHJlYXN1YXJ5QXNzZXRJZENsYWltZWQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUadHJlYXN1YXJ5QXNzZXRJZENsYWltZWRLZXkAAAQZdHJlYXN1YXJ5QXNzZXRJZEF2YWlsYWJsZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEFHHRyZWFzdWFyeUFzc2V0SWRBdmFpbGFibGVLZXkCG1RyZWFzdWFyeSBhc3NldElkIG5vdCBmb3VuZAQYYWRkcmVzc0Fzc2V0SWRDbGFpbWVkS2V5CQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgxyZXdhcmRSb3VuZF8JAKQDAQgFBWFjY3VtAl8xAglfYWRkcmVzc18FCmFkZHJlc3NTdHICCV9hc3NldElkXwUHYXNzZXRJZAIIX2NsYWltZWQEFWFkZHJlc3NBc3NldElkQ2xhaW1lZAkBC3ZhbHVlT3JFbHNlAgkAnwgBBRhhZGRyZXNzQXNzZXRJZENsYWltZWRLZXkAAAMJAGcCAAAFGXRyZWFzdWFyeUFzc2V0SWRBdmFpbGFibGUJAAIBAhtUcmVhc3VhcnkgYXNzZXQgSWQgaXMgZW1wdHkDCQAAAgkAsQIBBQh2b3Rlc0lkcwAACQACAQIXVm90ZSBpZHMgbGlzdCBhcmUgZW1wdHkDCQAAAgkAsQIBBQdhc3NldElkAAAJAAIBAhFBc3NldCBpZCBpcyBlbXB0eQMDCQAAAgUJY29zdFBvd2VyAAAGCQBmAgAABQljb3N0UG93ZXIJAAIBAhJJbnZhbGlkIGNvc3QgcG93ZXIKARVjYWxjQWRkcmVzc1NwZW50UG93ZXICBWFjY3VtBG5leHQEBnZvdGVJZAUEbmV4dAQRYWRkcmVzc1NwZW50UG93ZXIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkArAICCQCsAgIJAKwCAgkArAICAgZ2b3Rlcl8FCmFkZHJlc3NTdHICBl92b3RlXwUGdm90ZUlkAgtfc3BlbnRQb3dlcgAACQBkAgUFYWNjdW0FEWFkZHJlc3NTcGVudFBvd2VyBApzcGVudFBvd2VyCgACJGwJALUJAgUIdm90ZXNJZHMCASwKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBFWNhbGNBZGRyZXNzU3BlbnRQb3dlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgMDCQBnAgAABQpzcGVudFBvd2VyBgkAZgIFFWFkZHJlc3NBc3NldElkQ2xhaW1lZAAACQCUCgIJAGQCCAUFYWNjdW0CXzEFBG5leHQIBQVhY2N1bQJfMgkAlAoCCQBkAggFBWFjY3VtAl8xBQRuZXh0CQDOCAIIBQVhY2N1bQJfMgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAGgCBQpzcGVudFBvd2VyBQljb3N0UG93ZXIJANkEAQUHYXNzZXRJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUYYWRkcmVzc0Fzc2V0SWRDbGFpbWVkS2V5CQBoAgUKc3BlbnRQb3dlcgUJY29zdFBvd2VyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRp0cmVhc3VhcnlBc3NldElkQ2xhaW1lZEtleQkAZAIFF3RyZWFzdWFyeUFzc2V0SWRDbGFpbWVkCQBoAgUKc3BlbnRQb3dlcgUJY29zdFBvd2VyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRx0cmVhc3VhcnlBc3NldElkQXZhaWxhYmxlS2V5CQBlAgUZdHJlYXN1YXJ5QXNzZXRJZEF2YWlsYWJsZQkAaAIFCnNwZW50UG93ZXIFCWNvc3RQb3dlcgUDbmlsBAFyCgACJGwJAMwIAgABCQDMCAIAAQkAzAgCAAEJAMwIAgABCQDMCAIAAQUDbmlsCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBRZhZGRlcnNzTGFzdFJld2FyZFJvdW5kBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEGNhbGNSZXdhcmRzUm91bmQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFGWFkZGVyc3NMYXN0UmV3YXJkUm91bmRLZXkIBQFyAl8xBQNuaWwIBQFyAl8yAQJ0eAEGdmVyaWZ5AAkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleZJrs2Y=", "height": 3484147, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: HzF1R6LHyVJQGiNwezpP3ukrfwrdmDHZYMLL4om3Q1VQ Next: 5Vh1TtD7STTgQD7SWojWL9jQxshJdRXxpeVYaD7JPQgL Diff:
OldNewDifferences
9696
9797
9898 @Callable(i)
99-func stake () = {
99+func stake (debug) = {
100100 let addressStr = toString(i.caller)
101101 let p = valueOrErrorMessage(i.payments[0], "No payments")
102102 let asset = valueOrErrorMessage(assetInfo(valueOrErrorMessage(p.assetId, "Invalid payment")), "Invalid asset Id")
103- if (if ((p.amount > 0))
104- then checkNFT(asset)
105- else false)
106- then {
107- let totalStaked = valueOrElse(getInteger(totalStakedKey), 0)
108- let totalPower = valueOrElse(getInteger(totalPowerKey), 0)
109- let addressPowerKey = (("address_" + addressStr) + "_power")
110- let addressTotalStakedKey = (("address_" + addressStr) + "_totalStaked")
111- let addressStakedNftsKey = (("address_" + addressStr) + "_stakedNfts")
112- let addressPower = valueOrElse(getInteger(addressPowerKey), 0)
113- let addressTotalStaked = valueOrElse(getInteger(addressTotalStakedKey), 0)
114- let addressStakedNfts = valueOrElse(getString(addressStakedNftsKey), "")
115- if (((addressTotalStaked + 1) > 5))
116- then throw("You can stake only 5 NFTs")
117- else {
118- let nftPower = getPowerNFT(asset)
119- let nftIdStr = toBase58String(asset.id)
120- let addressStakedNftsState = if ((size(addressStakedNfts) == 0))
121- then [StringEntry(addressStakedNftsKey, nftIdStr)]
122- else [StringEntry(addressStakedNftsKey, makeString((split(addressStakedNfts, ",") :+ nftIdStr), ","))]
123- (([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)
124- }
125- }
126- else throw("No payments")
103+ if (debug)
104+ then throw(("payments size " + toString(size(i.payments))))
105+ else if (if ((p.amount > 0))
106+ then checkNFT(asset)
107+ else false)
108+ then {
109+ let totalStaked = valueOrElse(getInteger(totalStakedKey), 0)
110+ let totalPower = valueOrElse(getInteger(totalPowerKey), 0)
111+ let addressPowerKey = (("address_" + addressStr) + "_power")
112+ let addressTotalStakedKey = (("address_" + addressStr) + "_totalStaked")
113+ let addressStakedNftsKey = (("address_" + addressStr) + "_stakedNfts")
114+ let addressPower = valueOrElse(getInteger(addressPowerKey), 0)
115+ let addressTotalStaked = valueOrElse(getInteger(addressTotalStakedKey), 0)
116+ let addressStakedNfts = valueOrElse(getString(addressStakedNftsKey), "")
117+ if (((addressTotalStaked + 1) > 5))
118+ then throw("You can stake only 5 NFTs")
119+ else {
120+ let nftPower = getPowerNFT(asset)
121+ let nftIdStr = toBase58String(asset.id)
122+ let addressStakedNftsState = if ((size(addressStakedNfts) == 0))
123+ then [StringEntry(addressStakedNftsKey, nftIdStr)]
124+ else [StringEntry(addressStakedNftsKey, makeString((split(addressStakedNfts, ",") :+ nftIdStr), ","))]
125+ (([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)
126+ }
127+ }
128+ else throw("No payments")
127129 }
128130
129131
130132
131133 @Callable(i)
132-func unstake (nftIdStr) = {
134+func unstake (nftIdStr,debug) = {
133135 let addressStr = toString(i.caller)
134136 let asset = valueOrErrorMessage(assetInfo(fromBase58String(nftIdStr)), "Invalid nft Id")
135137 let ownerAddress = valueOrErrorMessage(getString((("nft_" + nftIdStr) + "_owner")), "Owner data invalid")
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)
99-func stake () = {
99+func stake (debug) = {
100100 let addressStr = toString(i.caller)
101101 let p = valueOrErrorMessage(i.payments[0], "No payments")
102102 let asset = valueOrErrorMessage(assetInfo(valueOrErrorMessage(p.assetId, "Invalid payment")), "Invalid asset Id")
103- if (if ((p.amount > 0))
104- then checkNFT(asset)
105- else false)
106- then {
107- let totalStaked = valueOrElse(getInteger(totalStakedKey), 0)
108- let totalPower = valueOrElse(getInteger(totalPowerKey), 0)
109- let addressPowerKey = (("address_" + addressStr) + "_power")
110- let addressTotalStakedKey = (("address_" + addressStr) + "_totalStaked")
111- let addressStakedNftsKey = (("address_" + addressStr) + "_stakedNfts")
112- let addressPower = valueOrElse(getInteger(addressPowerKey), 0)
113- let addressTotalStaked = valueOrElse(getInteger(addressTotalStakedKey), 0)
114- let addressStakedNfts = valueOrElse(getString(addressStakedNftsKey), "")
115- if (((addressTotalStaked + 1) > 5))
116- then throw("You can stake only 5 NFTs")
117- else {
118- let nftPower = getPowerNFT(asset)
119- let nftIdStr = toBase58String(asset.id)
120- let addressStakedNftsState = if ((size(addressStakedNfts) == 0))
121- then [StringEntry(addressStakedNftsKey, nftIdStr)]
122- else [StringEntry(addressStakedNftsKey, makeString((split(addressStakedNfts, ",") :+ nftIdStr), ","))]
123- (([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)
124- }
125- }
126- else throw("No payments")
103+ if (debug)
104+ then throw(("payments size " + toString(size(i.payments))))
105+ else if (if ((p.amount > 0))
106+ then checkNFT(asset)
107+ else false)
108+ then {
109+ let totalStaked = valueOrElse(getInteger(totalStakedKey), 0)
110+ let totalPower = valueOrElse(getInteger(totalPowerKey), 0)
111+ let addressPowerKey = (("address_" + addressStr) + "_power")
112+ let addressTotalStakedKey = (("address_" + addressStr) + "_totalStaked")
113+ let addressStakedNftsKey = (("address_" + addressStr) + "_stakedNfts")
114+ let addressPower = valueOrElse(getInteger(addressPowerKey), 0)
115+ let addressTotalStaked = valueOrElse(getInteger(addressTotalStakedKey), 0)
116+ let addressStakedNfts = valueOrElse(getString(addressStakedNftsKey), "")
117+ if (((addressTotalStaked + 1) > 5))
118+ then throw("You can stake only 5 NFTs")
119+ else {
120+ let nftPower = getPowerNFT(asset)
121+ let nftIdStr = toBase58String(asset.id)
122+ let addressStakedNftsState = if ((size(addressStakedNfts) == 0))
123+ then [StringEntry(addressStakedNftsKey, nftIdStr)]
124+ else [StringEntry(addressStakedNftsKey, makeString((split(addressStakedNfts, ",") :+ nftIdStr), ","))]
125+ (([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)
126+ }
127+ }
128+ else throw("No payments")
127129 }
128130
129131
130132
131133 @Callable(i)
132-func unstake (nftIdStr) = {
134+func unstake (nftIdStr,debug) = {
133135 let addressStr = toString(i.caller)
134136 let asset = valueOrErrorMessage(assetInfo(fromBase58String(nftIdStr)), "Invalid nft Id")
135137 let ownerAddress = valueOrErrorMessage(getString((("nft_" + nftIdStr) + "_owner")), "Owner data invalid")
136138 if ((ownerAddress != addressStr))
137139 then throw("You are not the owner")
138140 else if (checkNFT(asset))
139141 then {
140142 let totalStaked = valueOrElse(getInteger(totalStakedKey), 0)
141143 let totalPower = valueOrElse(getInteger(totalPowerKey), 0)
142144 let addressPowerKey = (("address_" + addressStr) + "_power")
143145 let addressTotalStakedKey = (("address_" + addressStr) + "_totalStaked")
144146 let addressStakedNftsKey = (("address_" + addressStr) + "_stakedNfts")
145147 let addressPower = valueOrErrorMessage(getInteger(addressPowerKey), "Address power value not found")
146148 let addressTotalStaked = valueOrErrorMessage(getInteger(addressTotalStakedKey), "Address total staked value not found")
147149 let addressStakedNfts = valueOrErrorMessage(getString(addressStakedNftsKey), "Address staked Nfts value not found")
148150 let nftAssetIdStr = toBase58String(asset.id)
149151 let nftPower = getIntegerValue((("nft_" + nftAssetIdStr) + "_power"))
150152 let updatedAddressPower = (addressPower - nftPower)
151153 let removeStakedAddress = if ((updatedAddressPower == 0))
152154 then removeItemFromStateArray(allStakedAddressesKey, addressStr)
153155 else nil
154156 let addressStakedNftsList = split(addressStakedNfts, ",")
155157 let addressStakedNftIndex = valueOrErrorMessage(indexOf(addressStakedNftsList, nftIdStr), "NFT not founed in address staked list")
156158 ([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)
157159 }
158160 else throw("Invalid nft Id")
159161 }
160162
161163
162164
163165 @Callable(i)
164166 func sendToVote (collectionId) = {
165167 let issuer = split(collectionId, "_")[0]
166168 let isExist = match getString((("collection_" + collectionId) + "_voteId")) {
167169 case t: String =>
168170 true
169171 case _ =>
170172 false
171173 }
172174 if ((size(issuer) == 0))
173175 then throw("Collection issuer not found")
174176 else if (isExist)
175177 then throw("Collection has already been submitted for voting")
176178 else if ((issuer != toString(i.caller)))
177179 then throw("Only the issuer can submit to the vote")
178180 else {
179181 let voteId = toBase58String(sha256_16Kb(toBytes(collectionId)))
180182 let totalVotes = valueOrElse(getInteger("total_votes"), 0)
181183 let quorumLimit = valueOrErrorMessage(getInteger(votePowerLimitKey), "Vote power limit not found")
182184 [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))]
183185 }
184186 }
185187
186188
187189
188190 @Callable(i)
189191 func removeFromVote (voteId) = {
190192 let collectionId = valueOrErrorMessage(getString((("vote_" + voteId) + "_collectionId")), "Collection Id not found")
191193 let owner = valueOrErrorMessage(getString((("vote_" + voteId) + "_owner")), "Owner not found")
192194 if ((owner != toString(i.caller)))
193195 then throw("You are not the owner")
194196 else if (isVotingClosed(voteId))
195197 then throw("Voting is closed")
196198 else {
197199 let totalVotes = valueOrErrorMessage(getInteger("total_votes"), "total votes value not found")
198200 [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))]
199201 }
200202 }
201203
202204
203205
204206 @Callable(i)
205207 func voteByNFT (voteId,assets) = {
206208 let addressStr = toString(i.caller)
207209 let collectionId = valueOrElse(getString((("vote_" + voteId) + "_collectionId")), "")
208210 if (isVotingClosed(voteId))
209211 then throw("Voting is closed")
210212 else if ((size(collectionId) == 0))
211213 then throw("Collection not found")
212214 else if ((size(assets) == 0))
213215 then throw("Assets list is empty")
214216 else {
215217 let voteUpPowerKey = (("vote_" + voteId) + "_upPower")
216218 let voteDownPowerKey = (("vote_" + voteId) + "_downPower")
217219 let voteTotalPowerKey = (("vote_" + voteId) + "_totalPower")
218220 let voteUsedNftsKey = (("vote_" + voteId) + "_usedNfts")
219221 let voterSpentPowerKey = (("voter_" + addressStr) + "_spentPower")
220222 let voterVoteUsedNftsKey = (((("voter_" + addressStr) + "_vote_") + voteId) + "_usedNfts")
221223 let voterVoteSpentPowerKey = (((("voter_" + addressStr) + "_vote_") + voteId) + "_spentPower")
222224 let addressPowerKey = (("address_" + addressStr) + "_power")
223225 let addressStakedNftsKey = (("address_" + addressStr) + "_stakedNfts")
224226 let upPowerDapp = valueOrElse(getInteger(voteUpPowerKey), 0)
225227 let downPowerDapp = valueOrElse(getInteger(voteDownPowerKey), 0)
226228 let totalVotePower = valueOrElse(getInteger(voteTotalPowerKey), 0)
227229 let voteUsedNfts = valueOrElse(getString(voteUsedNftsKey), "")
228230 let voterSpentPower = valueOrElse(getInteger(voterSpentPowerKey), 0)
229231 let voterVoteUsedNfts = valueOrElse(getString(voterVoteUsedNftsKey), "")
230232 let totalSpentPower = valueOrElse(getInteger(totalSpentPowerKey), 0)
231233 let voterVoteSpentPower = valueOrElse(getInteger(voterVoteSpentPowerKey), 0)
232234 let addressPower = valueOrErrorMessage(getInteger(addressPowerKey), "You don't have power")
233235 let addressStakedNfts = valueOrErrorMessage(getString(addressStakedNftsKey), "You don't have staked NFTs")
234236 let adderssLastRewardRoundKey = (("address_" + addressStr) + "_lastRewardsRound")
235237 let currentRewordsRound = valueOrElse(getInteger(currentRewordsRoundKey), 0)
236238 let adderssLastRewardRound = valueOrElse(getInteger(adderssLastRewardRoundKey), 0)
237239 let assetsList = split(assets, "|")
238240 let voteUsedNftsList = if ((size(voteUsedNfts) == 0))
239241 then nil
240242 else split_51C(voteUsedNfts, ",")
241243 let voterVoteUsedNftsList = if ((size(voterVoteUsedNfts) == 0))
242244 then nil
243245 else split_51C(voterVoteUsedNfts, ",")
244246 func processAssets (accum,next) = {
245247 let parts = split(next, "_")
246248 let nftId = parts[0]
247249 let type = parts[1]
248250 let power = valueOrErrorMessage(getInteger((("nft_" + nftId) + "_power")), "NFT power not found")
249251 let stakedOwnerIndex = valueOrElse(indexOf(addressStakedNfts, nftId), -1)
250252 if ((power == 0))
251253 then throw("Power must be more zero")
252254 else if ((stakedOwnerIndex == -1))
253255 then throw("Asset does not belong to you")
254256 else {
255257 let assetIndex = valueOrElse(indexOf(voteUsedNftsList, nftId), -1)
256258 if ((assetIndex == -1))
257259 then if (if ((type != "up"))
258260 then (type != "down")
259261 else false)
260262 then throw("Invalid type")
261263 else $Tuple4((accum._1 + (if ((type == "up"))
262264 then power
263265 else 0)), (accum._2 + (if ((type == "down"))
264266 then power
265267 else 0)), (accum._3 :+ nftId), (accum._4 :+ StringEntry(((((("voter_" + addressStr) + "_vote_") + voteId) + "_assetId_") + nftId), ((((type + ":") + toString(power)) + ":") + toString(height)))))
266268 else accum
267269 }
268270 }
269271
270272 let processResultTuple = {
271273 let $l = assetsList
272274 let $s = size($l)
273275 let $acc0 = $Tuple4(0, 0, nil, nil)
274276 func $f0_1 ($a,$i) = if (($i >= $s))
275277 then $a
276278 else processAssets($a, $l[$i])
277279
278280 func $f0_2 ($a,$i) = if (($i >= $s))
279281 then $a
280282 else throw("List size exceeds 5")
281283
282284 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
283285 }
284286 let upPower = processResultTuple._1
285287 let downPower = processResultTuple._2
286288 let powerValue = (upPower + downPower)
287289 if ((powerValue > addressPower))
288290 then throw("Power exceeds power of the account")
289291 else if ((powerValue == 0))
290292 then throw("Not enough power to vote")
291293 else if ((size(processResultTuple._3) == 0))
292294 then throw("Used list must not be empty")
293295 else if ((size(processResultTuple._4) == 0))
294296 then throw("State entries list must not be empty")
295297 else {
296298 let quorumLimit = valueOrErrorMessage(getInteger(votePowerLimitKey), "Vote power limit not found")
297299 let updateCanditatesList = if (((totalVotePower + powerValue) > quorumLimit))
298300 then addStringToStateArray(finalVotingCandidatesKey, voteId)
299301 else nil
300302 let addressRewordsRoundState = if (if ((adderssLastRewardRound == 0))
301303 then (currentRewordsRound > adderssLastRewardRound)
302304 else false)
303305 then [IntegerEntry(adderssLastRewardRoundKey, currentRewordsRound)]
304306 else nil
305307 ((([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)
306308 }
307309 }
308310 }
309311
310312
311313
312314 @Callable(i)
313315 func unvoteByNFT (voteId,assets) = {
314316 let addressStr = toString(i.caller)
315317 let collectionId = valueOrElse(getString((("vote_" + voteId) + "_collectionId")), "")
316318 if (isVotingClosed(voteId))
317319 then throw("Voting is closed")
318320 else if ((size(collectionId) == 0))
319321 then throw("Collection not found")
320322 else {
321323 let voteUpPowerKey = (("vote_" + voteId) + "_upPower")
322324 let voteDownPowerKey = (("vote_" + voteId) + "_downPower")
323325 let voteTotalPowerKey = (("vote_" + voteId) + "_totalPower")
324326 let voteUsedNftsKey = (("vote_" + voteId) + "_usedNfts")
325327 let voterSpentPowerKey = (("voter_" + addressStr) + "_spentPower")
326328 let voterVoteUsedNftsKey = (((("voter_" + addressStr) + "_vote_") + voteId) + "_usedNfts")
327329 let voterVoteSpentPowerKey = (((("voter_" + addressStr) + "_vote_") + voteId) + "_spentPower")
328330 let addressPowerKey = (("address_" + addressStr) + "_power")
329331 let addressStakedNftsKey = (("address_" + addressStr) + "_stakedNfts")
330332 let upPowerDapp = valueOrErrorMessage(getInteger(voteUpPowerKey), "Up vote power not found")
331333 let downPowerDapp = valueOrErrorMessage(getInteger(voteDownPowerKey), "Down vote power not found")
332334 let totalVotePower = valueOrErrorMessage(getInteger(voteTotalPowerKey), "Total vote power not found")
333335 let voteUsedNfts = valueOrErrorMessage(getString(voteUsedNftsKey), "Vote used power not found")
334336 let voterSpentPower = valueOrErrorMessage(getInteger(voterSpentPowerKey), "Voter spent power not found")
335337 let voterUsedNfts = valueOrErrorMessage(getInteger(voterVoteUsedNftsKey), "Voter vote used nfts not found")
336338 let voterVoteUsedNfts = valueOrErrorMessage(getString(voterVoteUsedNftsKey), "Voter vote used nfts list not found")
337339 let totalSpentPower = valueOrErrorMessage(getInteger(totalSpentPowerKey), "Total spent power not found")
338340 let voterVoteSpentPower = valueOrErrorMessage(getInteger(voterVoteSpentPowerKey), "Address vote spent power not found")
339341 let addressPower = valueOrErrorMessage(getInteger(addressPowerKey), "You don't have power")
340342 let addressStakedNfts = valueOrErrorMessage(getString(addressStakedNftsKey), "You don't have staked NFTs")
341343 let assetsList = if ((size(assets) > 0))
342344 then split(assets, "|")
343345 else if ((size(voterVoteUsedNfts) == 0))
344346 then nil
345347 else split(voterVoteUsedNfts, ",")
346348 func processAssets (accum,next) = {
347349 let assetVote = valueOrElse(getString(((((("voter_" + addressStr) + "_vote_") + voteId) + "_assetId_") + next)), "")
348350 let parts = split(assetVote, ":")
349351 let type = parts[0]
350352 let power = valueOrElse(parseInt(parts[1]), 0)
351353 let stakedOwnerIndex = valueOrElse(indexOf(addressStakedNfts, next), -1)
352354 let voterVoteUsedIndex = valueOrErrorMessage(indexOf(accum._4, next), "Voter vote used index not found")
353355 if ((size(assetVote) == 0))
354356 then accum
355357 else if ((power == 0))
356358 then throw("Power must be more zero")
357359 else if (if ((0 > voterVoteUsedIndex))
358360 then (stakedOwnerIndex == -1)
359361 else false)
360362 then throw("Asset does not belong to you")
361363 else {
362364 let assetUsedIndex = valueOrElse(indexOf(accum._3, next), -1)
363365 if ((assetUsedIndex >= 0))
364366 then if (if ((type != "up"))
365367 then (type != "down")
366368 else false)
367369 then throw("Invalid type")
368370 else $Tuple5((accum._1 + (if ((type == "up"))
369371 then power
370372 else 0)), (accum._2 + (if ((type == "down"))
371373 then power
372374 else 0)), removeByIndex(accum._3, assetUsedIndex), removeByIndex(accum._4, voterVoteUsedIndex), (accum._5 :+ DeleteEntry(((((("voter_" + addressStr) + "_vote_") + voteId) + "_assetId_") + next))))
373375 else accum
374376 }
375377 }
376378
377379 let processResultTuple = {
378380 let $l = assetsList
379381 let $s = size($l)
380382 let $acc0 = $Tuple5(0, 0, split_51C(voteUsedNfts, ","), split_51C(voterVoteUsedNfts, ","), nil)
381383 func $f0_1 ($a,$i) = if (($i >= $s))
382384 then $a
383385 else processAssets($a, $l[$i])
384386
385387 func $f0_2 ($a,$i) = if (($i >= $s))
386388 then $a
387389 else throw("List size exceeds 5")
388390
389391 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
390392 }
391393 let upPower = processResultTuple._1
392394 let downPower = processResultTuple._2
393395 let powerValue = (upPower + downPower)
394396 if ((powerValue > voterSpentPower))
395397 then throw("Power value exceeds voter spent power")
396398 else if ((powerValue == 0))
397399 then throw("Not enough power to unvote")
398400 else if ((size(processResultTuple._5) == 0))
399401 then throw("State entries list must not be empty")
400402 else {
401403 let quorumLimit = valueOrErrorMessage(getInteger(votePowerLimitKey), "Vote power limit not found")
402404 let updateCanditatesList = if ((quorumLimit > (totalVotePower - powerValue)))
403405 then removeItemFromStateArray(finalVotingCandidatesKey, voteId)
404406 else nil
405407 (([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)
406408 }
407409 }
408410 }
409411
410412
411413
412414 @Callable(i)
413415 func fillTreasuary () = if ((size(i.payments) == 0))
414416 then throw("No payment")
415417 else if ((i.payments[0].amount == 0))
416418 then throw("Payment must be more 0")
417419 else if ((i.payments[0].assetId != USDTAssetId))
418420 then throw("Payment must be in USDT")
419421 else {
420422 let amount = i.payments[0].amount
421423 let assetId = value(i.payments[0].assetId)
422424 let finalVotingCandidates = valueOrElse(getString(finalVotingCandidatesKey), "")
423425 if ((size(finalVotingCandidates) == 0))
424426 then throw("Canditates list is empty")
425427 else {
426428 let finalVotingCandidatesList = split(finalVotingCandidates, ",")
427429 func processVote (accum,next) = {
428430 let voteId = next
429431 let voteUpPowerKey = (("vote_" + voteId) + "_upPower")
430432 let voteDownPowerKey = (("vote_" + voteId) + "_downPower")
431433 let voteTotalPowerKey = (("vote_" + voteId) + "_totalPower")
432434 let voteUpPower = valueOrElse(getInteger(voteUpPowerKey), 0)
433435 let voteDownPower = valueOrElse(getInteger(voteDownPowerKey), 0)
434436 let voteTotalPower = valueOrElse(getInteger(voteTotalPowerKey), 0)
435437 let quorumLimit = valueOrErrorMessage(getInteger(votePowerLimitKey), "Vote power limit not found")
436438 if ((voteTotalPower == 0))
437439 then throw("Invalid total power")
438440 else if ((quorumLimit > voteTotalPower))
439441 then throw("Power less than limit")
440442 else if (((voteUpPower + voteDownPower) == 0))
441443 then throw("Invalid up, down power")
442444 else if (isVotingClosed(voteId))
443445 then $Tuple4(accum._1, accum._2, accum._3, removeItemFromStateArray(finalVotingCandidatesKey, voteId))
444446 else {
445447 let upPercent = fraction(voteUpPower, 100, voteTotalPower)
446448 let finalVoteState = if ((upPercent > 50))
447449 then BooleanEntry((("vote_" + voteId) + "_confirmed"), true)
448450 else BooleanEntry((("vote_" + voteId) + "_rejected"), true)
449451 $Tuple4((accum._1 + voteTotalPower), (accum._2 :+ voteId), (accum._3 :+ finalVoteState), removeItemFromStateArray(finalVotingCandidatesKey, voteId))
450452 }
451453 }
452454
453455 let resultTuple = {
454456 let $l = finalVotingCandidatesList
455457 let $s = size($l)
456458 let $acc0 = $Tuple4(0, nil, nil, nil)
457459 func $f0_1 ($a,$i) = if (($i >= $s))
458460 then $a
459461 else processVote($a, $l[$i])
460462
461463 func $f0_2 ($a,$i) = if (($i >= $s))
462464 then $a
463465 else throw("List size exceeds 10")
464466
465467 $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)
466468 }
467469 let allEndVotesPower = resultTuple._1
468470 let finalVotesList = resultTuple._2
469471 let finalVotesState = resultTuple._3
470472 let updatedListFinalCanditates = resultTuple._4
471473 if ((allEndVotesPower == 0))
472474 then throw("No power after process canditates")
473475 else {
474476 let currentRewordsRound = valueOrElse(getInteger(currentRewordsRoundKey), 0)
475477 let costPerPower = fraction(amount, 1, allEndVotesPower)
476478 let treasuaryAssetIdTotalKey = (("treasuary_" + toBase58String(assetId)) + "_total")
477479 let treasuaryAssetIdAvailableKey = (("treasuary_" + toBase58String(assetId)) + "_available")
478480 let treasuaryAssetIdTotal = valueOrElse(getInteger(treasuaryAssetIdTotalKey), 0)
479481 let treasuaryAssetIdAvailable = valueOrElse(getInteger(treasuaryAssetIdAvailableKey), 0)
480482 (([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)
481483 }
482484 }
483485 }
484486
485487
486488
487489 @Callable(i)
488490 func claimRewards () = {
489491 let addressStr = toString(i.caller)
490492 let adderssLastRewardRoundKey = (("address_" + addressStr) + "_lastRewardsRound")
491493 let currentRewordsRound = valueOrElse(getInteger(currentRewordsRoundKey), 0)
492494 let adderssLastRewardRound = valueOrElse(getInteger(adderssLastRewardRoundKey), 0)
493495 if ((currentRewordsRound == adderssLastRewardRound))
494496 then throw("There were no new payments")
495497 else {
496498 func calcRewardsRound (accum,next) = if ((accum._1 >= currentRewordsRound))
497499 then accum
498500 else {
499501 let votesIds = valueOrErrorMessage(getString((("reward_" + toString(accum._1)) + "_votesIds")), "Reward votes ids not found")
500502 let assetId = valueOrErrorMessage(getString((("reward_" + toString(accum._1)) + "_assetId")), "Reward assetId not found")
501503 let costPower = valueOrErrorMessage(getInteger((("reward_" + toString(accum._1)) + "_costPerPower")), "Reward cost power not found")
502504 let treasuaryAssetIdClaimedKey = (("treasuary_" + assetId) + "_claimed")
503505 let treasuaryAssetIdAvailableKey = (("treasuary_" + assetId) + "_available")
504506 let treasuaryAssetIdClaimed = valueOrElse(getInteger(treasuaryAssetIdClaimedKey), 0)
505507 let treasuaryAssetIdAvailable = valueOrErrorMessage(getInteger(treasuaryAssetIdAvailableKey), "Treasuary assetId not found")
506508 let addressAssetIdClaimedKey = (((((("rewardRound_" + toString(accum._1)) + "_address_") + addressStr) + "_assetId_") + assetId) + "_claimed")
507509 let addressAssetIdClaimed = valueOrElse(getInteger(addressAssetIdClaimedKey), 0)
508510 if ((0 >= treasuaryAssetIdAvailable))
509511 then throw("Treasuary asset Id is empty")
510512 else if ((size(votesIds) == 0))
511513 then throw("Vote ids list are empty")
512514 else if ((size(assetId) == 0))
513515 then throw("Asset id is empty")
514516 else if (if ((costPower == 0))
515517 then true
516518 else (0 > costPower))
517519 then throw("Invalid cost power")
518520 else {
519521 func calcAddressSpentPower (accum,next) = {
520522 let voteId = next
521523 let addressSpentPower = valueOrElse(getInteger((((("voter_" + addressStr) + "_vote_") + voteId) + "_spentPower")), 0)
522524 (accum + addressSpentPower)
523525 }
524526
525527 let spentPower = {
526528 let $l = split(votesIds, ",")
527529 let $s = size($l)
528530 let $acc0 = 0
529531 func $f0_1 ($a,$i) = if (($i >= $s))
530532 then $a
531533 else calcAddressSpentPower($a, $l[$i])
532534
533535 func $f0_2 ($a,$i) = if (($i >= $s))
534536 then $a
535537 else throw("List size exceeds 10")
536538
537539 $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)
538540 }
539541 if (if ((0 >= spentPower))
540542 then true
541543 else (addressAssetIdClaimed > 0))
542544 then $Tuple2((accum._1 + next), accum._2)
543545 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)))]))
544546 }
545547 }
546548
547549 let r = {
548550 let $l = [1, 1, 1, 1, 1]
549551 let $s = size($l)
550552 let $acc0 = $Tuple2(adderssLastRewardRound, nil)
551553 func $f0_1 ($a,$i) = if (($i >= $s))
552554 then $a
553555 else calcRewardsRound($a, $l[$i])
554556
555557 func $f0_2 ($a,$i) = if (($i >= $s))
556558 then $a
557559 else throw("List size exceeds 5")
558560
559561 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
560562 }
561563 ([IntegerEntry(adderssLastRewardRoundKey, r._1)] ++ r._2)
562564 }
563565 }
564566
565567
566568 @Verifier(tx)
567569 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
568570

github/deemru/w8io/3ef1775 
64.84 ms