tx · CzXTL45gVBcARtUBk9qduHA7wPgmR2QX9cYPDtgvacJe

3P975LUuqc7uBPiSxp3nemf2FZh62zfirSh:  -0.02300000 Waves

2023.01.24 08:57 [3484158] smart account 3P975LUuqc7uBPiSxp3nemf2FZh62zfirSh > SELF 0.00000000 Waves

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

github/deemru/w8io/3ef1775 
80.43 ms