tx · JBfAzmUi2ZLu8c1H7egHQAj1S3yKoRsSdwUseHzhpJAD

3P975LUuqc7uBPiSxp3nemf2FZh62zfirSh:  -0.01000000 Waves

2023.01.08 19:00 [3461699] smart account 3P975LUuqc7uBPiSxp3nemf2FZh62zfirSh > SELF 0.00000000 Waves

{ "type": 13, "id": "JBfAzmUi2ZLu8c1H7egHQAj1S3yKoRsSdwUseHzhpJAD", "fee": 1000000, "feeAssetId": null, "timestamp": 1673193651659, "version": 2, "chainId": 87, "sender": "3P975LUuqc7uBPiSxp3nemf2FZh62zfirSh", "senderPublicKey": "6Dx2LuCqezyDYjt3zMEL6WRrs5oaor6aK3L6QouPMP1b", "proofs": [ "4LfnNv2XryzJMHwW4hXe8u45fbqevKSrHjhJzhYj2pFSnABMiCdhFCaVv69eNconK2nYyU4mivkKwGHWEZFHeZiv" ], "script": "base64:BgIeCAISABIDCgEIEgMKAQgSAwoBCBIECgIICBIDCgEICQAPY3JlYXRpb25BZGRyZXNzCQEHQWRkcmVzcwEBGgFXk93E0hfnIAr99yESTvDwdmcmgwN41FxMAA50b3RhbFN0YWtlZEtleQIMdG90YWxfc3Rha2VkAA10b3RhbFBvd2VyS2V5Agt0b3RhbF9wb3dlcgALUE9XRVJfTElNSVQA6AcACXdoaXRlbGlzdAkAzAgCAiMzUEpLbVhvSEp2VmVRWGpTSmRodGtVY0ZEdGRpUXFNYlVURAUDbmlsAQhjaGVja05GVAEFYXNzZXQDAwMDCQAAAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUPY3JlYXRpb25BZGRyZXNzCQCsAgIJAKwCAgIEbmZ0XwkA2AQBCAUFYXNzZXQCaWQCB19pc3N1ZXIJAKUIAQUEdGhpcwkAAAIIBQVhc3NldAZpc3N1ZXIFD2NyZWF0aW9uQWRkcmVzcwcJAAACCAUFYXNzZXQIZGVjaW1hbHMAAAcJAAACCAUFYXNzZXQKcmVpc3N1YWJsZQcHCQAAAggFBWFzc2V0CHF1YW50aXR5AAEHAQtnZXRQb3dlck5GVAEFYXNzZXQEBnBhcmFtcwkBEUBleHRyTmF0aXZlKDEwNTMpAgUPY3JlYXRpb25BZGRyZXNzCQCsAgIJAKwCAgIEbmZ0XwkA2AQBCAUFYXNzZXQCaWQCB19wYXJhbXMDCQAAAgUGcGFyYW1zAgRnb2xkADIACgETZ2V0Q29sbGVjdGlvbklzc3VlcgEMY29sbGVjdGlvbklkBAdhc3NldElkCQELdmFsdWVPckVsc2UCCQCdCAIFD2NyZWF0aW9uQWRkcmVzcwkArAICCQCsAgICC2NvbGxlY3Rpb25fBQxjb2xsZWN0aW9uSWQCCF9hc3NldElkAgAJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPY3JlYXRpb25BZGRyZXNzCQCsAgIJAKwCAgIEbmZ0XwUHYXNzZXRJZAIHX2lzc3VlcgIAAQ5pc1ZvdGluZ0Nsb3NlZAEGdm90ZUlkBBB2b3RlQ29uZmlybWVkS2V5CQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAIKX2NvbmZpcm1lZAQPdm90ZVJlamVjdGVkS2V5CQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAIJX3JlamVjdGVkBAtpc0NvbmZpcm1lZAkBC3ZhbHVlT3JFbHNlAgkAoAgBBRB2b3RlQ29uZmlybWVkS2V5BwQKaXNSZWplY3RlZAkBC3ZhbHVlT3JFbHNlAgkAoAgBBQ92b3RlUmVqZWN0ZWRLZXkHAwULaXNDb25maXJtZWQGBQppc1JlamVjdGVkBgFpAQVzdGFrZQAECmFkZHJlc3NTdHIJAKUIAQgFAWkGY2FsbGVyBAFwCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJEDAggFAWkIcGF5bWVudHMAAAILTm8gcGF5bWVudHMEBWFzc2V0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCAUBcAdhc3NldElkAg9JbnZhbGlkIHBheW1lbnQCEEludmFsaWQgYXNzZXQgSWQDAwkAZgIIBQFwBmFtb3VudAAACQEIY2hlY2tORlQBBQVhc3NldAcEC3RvdGFsU3Rha2VkCQELdmFsdWVPckVsc2UCCQCfCAEFDnRvdGFsU3Rha2VkS2V5AAAECnRvdGFsUG93ZXIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUNdG90YWxQb3dlcktleQAABAxhZGRyZXNzUG93ZXIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkArAICCQCsAgICCGFkZHJlc3NfBQphZGRyZXNzU3RyAgZfcG93ZXIAAAQIbmZ0UG93ZXIJAQtnZXRQb3dlck5GVAEFBWFzc2V0BAhuZnRJZFN0cgkA2AQBCAUFYXNzZXQCaWQJAMwIAgkBDEludGVnZXJFbnRyeQIFDnRvdGFsU3Rha2VkS2V5CQBkAgULdG90YWxTdGFrZWQAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgUNdG90YWxQb3dlcktleQkAZAIFCnRvdGFsUG93ZXIFCG5mdFBvd2VyCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAgRuZnRfBQhuZnRJZFN0cgIGX293bmVyBQphZGRyZXNzU3RyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgIEbmZ0XwUIbmZ0SWRTdHICBl9wb3dlcgUIbmZ0UG93ZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAghhZGRyZXNzXwUKYWRkcmVzc1N0cgIGX3Bvd2VyCQBkAgUMYWRkcmVzc1Bvd2VyBQhuZnRQb3dlcgUDbmlsCQACAQILTm8gcGF5bWVudHMBaQEHdW5zdGFrZQEIbmZ0SWRTdHIECmFkZHJlc3NTdHIJAKUIAQgFAWkGY2FsbGVyBAVhc3NldAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEJANkEAQUIbmZ0SWRTdHICDkludmFsaWQgbmZ0IElkBAxvd25lckFkZHJlc3MJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQCsAgIJAKwCAgIEbmZ0XwUIbmZ0SWRTdHICBl9vd25lcgIST3duZXIgZGF0YSBpbnZhbGlkAwkBAiE9AgUMb3duZXJBZGRyZXNzBQphZGRyZXNzU3RyCQACAQIVWW91IGFyZSBub3QgdGhlIG93bmVyAwkBCGNoZWNrTkZUAQUFYXNzZXQEC3RvdGFsU3Rha2VkCQELdmFsdWVPckVsc2UCCQCfCAEFDnRvdGFsU3Rha2VkS2V5AAAECnRvdGFsUG93ZXIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUNdG90YWxQb3dlcktleQAABAxhZGRyZXNzUG93ZXIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkArAICCQCsAgICCGFkZHJlc3NfBQphZGRyZXNzU3RyAgZfcG93ZXIAAAQNbmZ0QXNzZXRJZFN0cgkA2AQBCAUFYXNzZXQCaWQECG5mdFBvd2VyCQERQGV4dHJOYXRpdmUoMTA1NSkBCQCsAgIJAKwCAgIEbmZ0XwUNbmZ0QXNzZXRJZFN0cgIGX3Bvd2VyCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgABCAUFYXNzZXQCaWQJAMwIAgkBDEludGVnZXJFbnRyeQIFDnRvdGFsU3Rha2VkS2V5CQBlAgULdG90YWxTdGFrZWQAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgUNdG90YWxQb3dlcktleQkAZQIFCnRvdGFsUG93ZXIFCG5mdFBvd2VyCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICAgRuZnRfBQ1uZnRBc3NldElkU3RyAgZfb3duZXIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgICBG5mdF8FDW5mdEFzc2V0SWRTdHICBl9wb3dlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICCGFkZHJlc3NfBQphZGRyZXNzU3RyAgZfcG93ZXIJAGUCBQxhZGRyZXNzUG93ZXIFCG5mdFBvd2VyBQNuaWwJAAIBAg5JbnZhbGlkIG5mdCBJZAFpAQpzZW5kVG9Wb3RlAQxjb2xsZWN0aW9uSWQEBmlzc3VlcgkBE2dldENvbGxlY3Rpb25Jc3N1ZXIBBQxjb2xsZWN0aW9uSWQEB2lzRXhpc3QEByRtYXRjaDAJAKIIAQkArAICCQCsAgICC2NvbGxlY3Rpb25fBQxjb2xsZWN0aW9uSWQCB192b3RlSWQDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAF0BQckbWF0Y2gwBgcDCQAAAgkAsQIBBQZpc3N1ZXIAAAkAAgECG0NvbGxlY3Rpb24gaXNzdWVyIG5vdCBmb3VuZAMFB2lzRXhpc3QJAAIBAjBDb2xsZWN0aW9uIGhhcyBhbHJlYWR5IGJlZW4gc3VibWl0dGVkIGZvciB2b3RpbmcDCQAAAgkAzwgCBQl3aGl0ZWxpc3QJAKUIAQgFAWkGY2FsbGVyBQR1bml0CQACAQIlRnVuY3Rpb25hbGl0eSB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZQMJAQIhPQIFBmlzc3VlcgkApQgBCAUBaQZjYWxsZXIJAAIBAiZPbmx5IHRoZSBpc3N1ZXIgY2FuIHN1Ym1pdCB0byB0aGUgdm90ZQQGdm90ZUlkCQDYBAEJANQWAQkAmwMBBQxjb2xsZWN0aW9uSWQECnRvdGFsVm90ZXMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQILdG90YWxfdm90ZXMAAAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgILY29sbGVjdGlvbl8FDGNvbGxlY3Rpb25JZAIHX3ZvdGVJZAUGdm90ZUlkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAg1fY29sbGVjdGlvbklkBQxjb2xsZWN0aW9uSWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCBl9vd25lcgkApQgBCAUBaQZjYWxsZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAgpfY3JlYXRlZEF0BQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQICC3RvdGFsX3ZvdGVzCQBkAgUKdG90YWxWb3RlcwABBQNuaWwBaQEOcmVtb3ZlRnJvbVZvdGUBBnZvdGVJZAQMY29sbGVjdGlvbklkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCDV9jb2xsZWN0aW9uSWQCF0NvbGxlY3Rpb24gSWQgbm90IGZvdW5kBAVvd25lcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAgZfb3duZXICD093bmVyIG5vdCBmb3VuZAMJAQIhPQIFBW93bmVyCQClCAEIBQFpBmNhbGxlcgkAAgECFVlvdSBhcmUgbm90IHRoZSBvd25lcgMJAQ5pc1ZvdGluZ0Nsb3NlZAEFBnZvdGVJZAkAAgECEFZvdGluZyBpcyBjbG9zZWQECnRvdGFsVm90ZXMJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBAgt0b3RhbF92b3RlcwIbdG90YWwgdm90ZXMgdmFsdWUgbm90IGZvdW5kCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICAgtjb2xsZWN0aW9uXwUMY29sbGVjdGlvbklkAgdfdm90ZUlkCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAg1fY29sbGVjdGlvbklkCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAgZfb3duZXIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCCl9jcmVhdGVkQXQJAMwIAgkBDEludGVnZXJFbnRyeQICC3RvdGFsX3ZvdGVzCQBlAgUKdG90YWxWb3RlcwABBQNuaWwBaQEEdm90ZQIGdm90ZUlkBHR5cGUECmFkZHJlc3NTdHIJAKUIAQgFAWkGY2FsbGVyBAVleGlzdAQHJG1hdGNoMAkAoggBCQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAINX2NvbGxlY3Rpb25JZAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXQFByRtYXRjaDAGBwQMdm90ZXJWb3RlS2V5CQCsAgIJAKwCAgkArAICCQCsAgICBnZvdGVyXwUKYWRkcmVzc1N0cgIGX3ZvdGVfBQZ2b3RlSWQCCF9pc1ZvdGVkBBB2b3RlclZvdGVUeXBlS2V5CQCsAgIJAKwCAgkArAICCQCsAgICBnZvdGVyXwUKYWRkcmVzc1N0cgIGX3ZvdGVfBQZ2b3RlSWQCBV90eXBlBBF2b3RlclZvdGVQb3dlcktleQkArAICCQCsAgIJAKwCAgkArAICAgZ2b3Rlcl8FCmFkZHJlc3NTdHICBl92b3RlXwUGdm90ZUlkAgZfcG93ZXIEE3ZvdGVyVm90ZUNyZWF0ZWRLZXkJAKwCAgkArAICCQCsAgIJAKwCAgIGdm90ZXJfBQphZGRyZXNzU3RyAgZfdm90ZV8FBnZvdGVJZAIIX2NyZWF0ZWQEEnZvdGVyVm90ZXNDb3VudEtleQkArAICCQCsAgICBnZvdGVyXwUKYWRkcmVzc1N0cgILX3ZvdGVzQ291bnQEEnZvdGVyU3BlbnRQb3dlcktleQkArAICCQCsAgICBnZvdGVyXwUKYWRkcmVzc1N0cgILX3NwZW50UG93ZXIEDnZvdGVVcENvdW50S2V5CQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAIIX3VwQ291bnQEEHZvdGVEb3duQ291bnRLZXkJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAgpfZG93bkNvdW50BBF2b3RlVG90YWxDb3VudEtleQkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCC190b3RhbENvdW50BBB2b3RlQ29uZmlybWVkS2V5CQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAIKX2NvbmZpcm1lZAQPdm90ZVJlamVjdGVkS2V5CQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAIJX3JlamVjdGVkBAxhZGRyZXNzUG93ZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBCQCsAgIJAKwCAgIIYWRkcmVzc18FCmFkZHJlc3NTdHICBl9wb3dlcgIfVGhlIGFkZHJlc3MgaGFzIG5vIHZvdGluZyBwb3dlcgQOdG90YWxWb3RlQ291bnQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQURdm90ZVRvdGFsQ291bnRLZXkAAAQPdm90ZXJWb3Rlc0NvdW50CQELdmFsdWVPckVsc2UCCQCfCAEFEnZvdGVyVm90ZXNDb3VudEtleQAABA92b3RlclNwZW50UG93ZXIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUSdm90ZXJTcGVudFBvd2VyS2V5AAAEC3VwQ291bnREYXBwCQELdmFsdWVPckVsc2UCCQCfCAEFDnZvdGVVcENvdW50S2V5AAAEDWRvd25Db3VudERhcHAJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUQdm90ZURvd25Db3VudEtleQAABAd1cENvdW50AwkAAAIFBHR5cGUCAnVwCQBkAgULdXBDb3VudERhcHAFDGFkZHJlc3NQb3dlcgULdXBDb3VudERhcHAECWRvd25Db3VudAMJAAACBQR0eXBlAgRkb3duCQBkAgUNZG93bkNvdW50RGFwcAUMYWRkcmVzc1Bvd2VyBQ1kb3duQ291bnREYXBwBA1pc0NhbGxlclZvdGVkCQELdmFsdWVPckVsc2UCCQCgCAEFDHZvdGVyVm90ZUtleQcDBQ1pc0NhbGxlclZvdGVkCQACAQIWWW91IGhhdmUgYWxyZWFkeSB2b3RlZAMJAQ5pc1ZvdGluZ0Nsb3NlZAEFBnZvdGVJZAkAAgECEFZvdGluZyBpcyBjbG9zZWQDCQEBIQEFBWV4aXN0CQACAQIUQ29sbGVjdGlvbiBub3QgZm91bmQDAwkBAiE9AgUEdHlwZQICdXAJAQIhPQIFBHR5cGUCBGRvd24HCQACAQIVSW52YWxpZCB0eXBlIHBhcmFtZXRyBBB1cGRhdGVkVm90ZUNvdW50CQBkAgUOdG90YWxWb3RlQ291bnQFDGFkZHJlc3NQb3dlcgQNZW5kVm90ZVN0YXRlcwMJAGcCBRB1cGRhdGVkVm90ZUNvdW50BQtQT1dFUl9MSU1JVAQJdXBQZXJjZW50CQBrAwUHdXBDb3VudABkBRB1cGRhdGVkVm90ZUNvdW50BAtkb3duUGVyY2VudAkAawMFCWRvd25Db3VudABkBRB1cGRhdGVkVm90ZUNvdW50AwkAZwIFCXVwUGVyY2VudAAyCQDMCAIJAQxCb29sZWFuRW50cnkCBRB2b3RlQ29uZmlybWVkS2V5BgUDbmlsCQDMCAIJAQxCb29sZWFuRW50cnkCBQ92b3RlUmVqZWN0ZWRLZXkGBQNuaWwFA25pbAkAzggCCQDMCAIJAQxCb29sZWFuRW50cnkCBQx2b3RlclZvdGVLZXkGCQDMCAIJAQtTdHJpbmdFbnRyeQIFEHZvdGVyVm90ZVR5cGVLZXkFBHR5cGUJAMwIAgkBDEludGVnZXJFbnRyeQIFE3ZvdGVyVm90ZUNyZWF0ZWRLZXkFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgURdm90ZXJWb3RlUG93ZXJLZXkFDGFkZHJlc3NQb3dlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgUSdm90ZXJWb3Rlc0NvdW50S2V5CQBkAgUPdm90ZXJWb3Rlc0NvdW50AAEJAMwIAgkBDEludGVnZXJFbnRyeQIFEnZvdGVyU3BlbnRQb3dlcktleQkAZAIFD3ZvdGVyU3BlbnRQb3dlcgUMYWRkcmVzc1Bvd2VyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ52b3RlVXBDb3VudEtleQUHdXBDb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUQdm90ZURvd25Db3VudEtleQUJZG93bkNvdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRF2b3RlVG90YWxDb3VudEtleQUQdXBkYXRlZFZvdGVDb3VudAUDbmlsBQ1lbmRWb3RlU3RhdGVzAWkBBnVudm90ZQEGdm90ZUlkBAphZGRyZXNzU3RyCQClCAEIBQFpBmNhbGxlcgQMdm90ZXJWb3RlS2V5CQCsAgIJAKwCAgkArAICCQCsAgICBnZvdGVyXwUKYWRkcmVzc1N0cgIGX3ZvdGVfBQZ2b3RlSWQCCF9pc1ZvdGVkBBB2b3RlclZvdGVUeXBlS2V5CQCsAgIJAKwCAgkArAICCQCsAgICBnZvdGVyXwUKYWRkcmVzc1N0cgIGX3ZvdGVfBQZ2b3RlSWQCBV90eXBlBBF2b3RlclZvdGVQb3dlcktleQkArAICCQCsAgIJAKwCAgkArAICAgZ2b3Rlcl8FCmFkZHJlc3NTdHICBl92b3RlXwUGdm90ZUlkAgZfcG93ZXIEE3ZvdGVyVm90ZUNyZWF0ZWRLZXkJAKwCAgkArAICCQCsAgIJAKwCAgIGdm90ZXJfBQphZGRyZXNzU3RyAgZfdm90ZV8FBnZvdGVJZAIIX2NyZWF0ZWQEEnZvdGVyVm90ZXNDb3VudEtleQkArAICCQCsAgICBnZvdGVyXwUKYWRkcmVzc1N0cgILX3ZvdGVzQ291bnQEEnZvdGVyU3BlbnRQb3dlcktleQkArAICCQCsAgICBnZvdGVyXwUKYWRkcmVzc1N0cgILX3NwZW50UG93ZXIEDnZvdGVVcENvdW50S2V5CQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAIIX3VwQ291bnQEEHZvdGVEb3duQ291bnRLZXkJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAgpfZG93bkNvdW50BBF2b3RlVG90YWxDb3VudEtleQkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCC190b3RhbENvdW50BBB2b3RlQ29uZmlybWVkS2V5CQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAIKX2NvbmZpcm1lZAQPdm90ZVJlamVjdGVkS2V5CQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAIJX3JlamVjdGVkBAp2b3RlSWRUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQUQdm90ZXJWb3RlVHlwZUtleQIYVm90ZSBJZCB0eXBlIG5vdCBmb3VuZGVkBAt2b3RlSWRQb3dlcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEFEXZvdGVyVm90ZVBvd2VyS2V5AhlWb3RlIElkIHBvd2VyIG5vdCBmb3VuZGVkBAp0b3RhbENvdW50CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQURdm90ZVRvdGFsQ291bnRLZXkCH1ZvdGUgSWQgdG90YWwgY291bnQgbm90IGZvdW5kZWQED3ZvdGVyVm90ZXNDb3VudAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEFEnZvdGVyVm90ZXNDb3VudEtleQIjVm90ZXIgdm90ZXMgY291bnQgdmFsdWUgbm90IGZvdW5kZWQED3ZvdGVyU3BlbnRQb3dlcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEFEnZvdGVyU3BlbnRQb3dlcktleQIjVm90ZXIgc3BlbnQgcG93ZXIgdmFsdWUgbm90IGZvdW5kZWQEC3VwQ291bnREYXBwCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQUOdm90ZVVwQ291bnRLZXkCE1VwIGNvdW50IG5vdGUgZm91bmQEDWRvd25Db3VudERhcHAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBRB2b3RlRG93bkNvdW50S2V5AhVEb3duIGNvdW50IG5vdGUgZm91bmQEB3VwQ291bnQDCQAAAgUKdm90ZUlkVHlwZQICdXAJAGUCBQt1cENvdW50RGFwcAULdm90ZUlkUG93ZXIFC3VwQ291bnREYXBwBAlkb3duQ291bnQDCQAAAgUKdm90ZUlkVHlwZQIEZG93bgkAZQIFDWRvd25Db3VudERhcHAFC3ZvdGVJZFBvd2VyBQ1kb3duQ291bnREYXBwBA1pc0NhbGxlclZvdGVkCQELdmFsdWVPckVsc2UCCQCgCAEFDHZvdGVyVm90ZUtleQcDCQEBIQEFDWlzQ2FsbGVyVm90ZWQJAAIBAhVZb3UgaGF2ZW4ndCB2b3RlZCB5ZXQDCQEOaXNWb3RpbmdDbG9zZWQBBQZ2b3RlSWQJAAIBAhBWb3RpbmcgaXMgY2xvc2VkAwMJAQIhPQIFCnZvdGVJZFR5cGUCAnVwCQECIT0CBQp2b3RlSWRUeXBlAgRkb3duBwkAAgECFUludmFsaWQgdHlwZSBwYXJhbWV0cgkAzAgCCQELRGVsZXRlRW50cnkBBQx2b3RlclZvdGVLZXkJAMwIAgkBC0RlbGV0ZUVudHJ5AQUQdm90ZXJWb3RlVHlwZUtleQkAzAgCCQELRGVsZXRlRW50cnkBBRN2b3RlclZvdGVDcmVhdGVkS2V5CQDMCAIJAQtEZWxldGVFbnRyeQEFEXZvdGVyVm90ZVBvd2VyS2V5CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJ2b3RlclZvdGVzQ291bnRLZXkJAGUCBQ92b3RlclZvdGVzQ291bnQAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgUSdm90ZXJTcGVudFBvd2VyS2V5CQBlAgUPdm90ZXJTcGVudFBvd2VyBQt2b3RlSWRQb3dlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgUOdm90ZVVwQ291bnRLZXkFB3VwQ291bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFEHZvdGVEb3duQ291bnRLZXkFCWRvd25Db3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgURdm90ZVRvdGFsQ291bnRLZXkJAGUCBQp0b3RhbENvdW50BQt2b3RlSWRQb3dlcgUDbmlsAQJ0eAEGdmVyaWZ5AAkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleaKluLc=", "height": 3461699, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: E3vShmbRyxA75gnRVEyeed1F1LwCmriErJaNPfvJjGsL Next: 9uTjXspTpLg2c3pa2CChHzPqyTs2NroEMqSFoisAsqnY Diff:
OldNewDifferences
107107 else if ((issuer != toString(i.caller)))
108108 then throw("Only the issuer can submit to the vote")
109109 else {
110- let voteId = toBase58String(i.transactionId)
110+ let voteId = toBase58String(sha256_16Kb(toBytes(collectionId)))
111111 let totalVotes = valueOrElse(getInteger("total_votes"), 0)
112112 [StringEntry((("collection_" + collectionId) + "_voteId"), voteId), StringEntry((("vote_" + voteId) + "_collectionId"), collectionId), StringEntry((("vote_" + voteId) + "_owner"), toString(i.caller)), IntegerEntry((("vote_" + voteId) + "_createdAt"), height), IntegerEntry("total_votes", (totalVotes + 1))]
113113 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let creationAddress = Address(base58'3PFQjjDMiZKQZdu5JqTHD7HwgSXyp9Rw9By')
55
66 let totalStakedKey = "total_staked"
77
88 let totalPowerKey = "total_power"
99
1010 let POWER_LIMIT = 1000
1111
1212 let whitelist = ["3PJKmXoHJvVeQXjSJdhtkUcFDtdiQqMbUTD"]
1313
1414 func checkNFT (asset) = if (if (if (if ((getStringValue(creationAddress, (("nft_" + toBase58String(asset.id)) + "_issuer")) == toString(this)))
1515 then (asset.issuer == creationAddress)
1616 else false)
1717 then (asset.decimals == 0)
1818 else false)
1919 then (asset.reissuable == false)
2020 else false)
2121 then (asset.quantity == 1)
2222 else false
2323
2424
2525 func getPowerNFT (asset) = {
2626 let params = getStringValue(creationAddress, (("nft_" + toBase58String(asset.id)) + "_params"))
2727 if ((params == "gold"))
2828 then 50
2929 else 10
3030 }
3131
3232
3333 func getCollectionIssuer (collectionId) = {
3434 let assetId = valueOrElse(getString(creationAddress, (("collection_" + collectionId) + "_assetId")), "")
3535 valueOrElse(getString(creationAddress, (("nft_" + assetId) + "_issuer")), "")
3636 }
3737
3838
3939 func isVotingClosed (voteId) = {
4040 let voteConfirmedKey = (("vote_" + voteId) + "_confirmed")
4141 let voteRejectedKey = (("vote_" + voteId) + "_rejected")
4242 let isConfirmed = valueOrElse(getBoolean(voteConfirmedKey), false)
4343 let isRejected = valueOrElse(getBoolean(voteRejectedKey), false)
4444 if (isConfirmed)
4545 then true
4646 else isRejected
4747 }
4848
4949
5050 @Callable(i)
5151 func stake () = {
5252 let addressStr = toString(i.caller)
5353 let p = valueOrErrorMessage(i.payments[0], "No payments")
5454 let asset = valueOrErrorMessage(assetInfo(valueOrErrorMessage(p.assetId, "Invalid payment")), "Invalid asset Id")
5555 if (if ((p.amount > 0))
5656 then checkNFT(asset)
5757 else false)
5858 then {
5959 let totalStaked = valueOrElse(getInteger(totalStakedKey), 0)
6060 let totalPower = valueOrElse(getInteger(totalPowerKey), 0)
6161 let addressPower = valueOrElse(getInteger((("address_" + addressStr) + "_power")), 0)
6262 let nftPower = getPowerNFT(asset)
6363 let nftIdStr = toBase58String(asset.id)
6464 [IntegerEntry(totalStakedKey, (totalStaked + 1)), IntegerEntry(totalPowerKey, (totalPower + nftPower)), StringEntry((("nft_" + nftIdStr) + "_owner"), addressStr), IntegerEntry((("nft_" + nftIdStr) + "_power"), nftPower), IntegerEntry((("address_" + addressStr) + "_power"), (addressPower + nftPower))]
6565 }
6666 else throw("No payments")
6767 }
6868
6969
7070
7171 @Callable(i)
7272 func unstake (nftIdStr) = {
7373 let addressStr = toString(i.caller)
7474 let asset = valueOrErrorMessage(assetInfo(fromBase58String(nftIdStr)), "Invalid nft Id")
7575 let ownerAddress = valueOrErrorMessage(getString((("nft_" + nftIdStr) + "_owner")), "Owner data invalid")
7676 if ((ownerAddress != addressStr))
7777 then throw("You are not the owner")
7878 else if (checkNFT(asset))
7979 then {
8080 let totalStaked = valueOrElse(getInteger(totalStakedKey), 0)
8181 let totalPower = valueOrElse(getInteger(totalPowerKey), 0)
8282 let addressPower = valueOrElse(getInteger((("address_" + addressStr) + "_power")), 0)
8383 let nftAssetIdStr = toBase58String(asset.id)
8484 let nftPower = getIntegerValue((("nft_" + nftAssetIdStr) + "_power"))
8585 [ScriptTransfer(i.caller, 1, asset.id), IntegerEntry(totalStakedKey, (totalStaked - 1)), IntegerEntry(totalPowerKey, (totalPower - nftPower)), DeleteEntry((("nft_" + nftAssetIdStr) + "_owner")), DeleteEntry((("nft_" + nftAssetIdStr) + "_power")), IntegerEntry((("address_" + addressStr) + "_power"), (addressPower - nftPower))]
8686 }
8787 else throw("Invalid nft Id")
8888 }
8989
9090
9191
9292 @Callable(i)
9393 func sendToVote (collectionId) = {
9494 let issuer = getCollectionIssuer(collectionId)
9595 let isExist = match getString((("collection_" + collectionId) + "_voteId")) {
9696 case t: String =>
9797 true
9898 case _ =>
9999 false
100100 }
101101 if ((size(issuer) == 0))
102102 then throw("Collection issuer not found")
103103 else if (isExist)
104104 then throw("Collection has already been submitted for voting")
105105 else if ((indexOf(whitelist, toString(i.caller)) == unit))
106106 then throw("Functionality temporarily unavailable")
107107 else if ((issuer != toString(i.caller)))
108108 then throw("Only the issuer can submit to the vote")
109109 else {
110- let voteId = toBase58String(i.transactionId)
110+ let voteId = toBase58String(sha256_16Kb(toBytes(collectionId)))
111111 let totalVotes = valueOrElse(getInteger("total_votes"), 0)
112112 [StringEntry((("collection_" + collectionId) + "_voteId"), voteId), StringEntry((("vote_" + voteId) + "_collectionId"), collectionId), StringEntry((("vote_" + voteId) + "_owner"), toString(i.caller)), IntegerEntry((("vote_" + voteId) + "_createdAt"), height), IntegerEntry("total_votes", (totalVotes + 1))]
113113 }
114114 }
115115
116116
117117
118118 @Callable(i)
119119 func removeFromVote (voteId) = {
120120 let collectionId = valueOrErrorMessage(getString((("vote_" + voteId) + "_collectionId")), "Collection Id not found")
121121 let owner = valueOrErrorMessage(getString((("vote_" + voteId) + "_owner")), "Owner not found")
122122 if ((owner != toString(i.caller)))
123123 then throw("You are not the owner")
124124 else if (isVotingClosed(voteId))
125125 then throw("Voting is closed")
126126 else {
127127 let totalVotes = valueOrErrorMessage(getInteger("total_votes"), "total votes value not found")
128128 [DeleteEntry((("collection_" + collectionId) + "_voteId")), DeleteEntry((("vote_" + voteId) + "_collectionId")), DeleteEntry((("vote_" + voteId) + "_owner")), DeleteEntry((("vote_" + voteId) + "_createdAt")), IntegerEntry("total_votes", (totalVotes - 1))]
129129 }
130130 }
131131
132132
133133
134134 @Callable(i)
135135 func vote (voteId,type) = {
136136 let addressStr = toString(i.caller)
137137 let exist = match getString((("vote_" + voteId) + "_collectionId")) {
138138 case t: String =>
139139 true
140140 case _ =>
141141 false
142142 }
143143 let voterVoteKey = (((("voter_" + addressStr) + "_vote_") + voteId) + "_isVoted")
144144 let voterVoteTypeKey = (((("voter_" + addressStr) + "_vote_") + voteId) + "_type")
145145 let voterVotePowerKey = (((("voter_" + addressStr) + "_vote_") + voteId) + "_power")
146146 let voterVoteCreatedKey = (((("voter_" + addressStr) + "_vote_") + voteId) + "_created")
147147 let voterVotesCountKey = (("voter_" + addressStr) + "_votesCount")
148148 let voterSpentPowerKey = (("voter_" + addressStr) + "_spentPower")
149149 let voteUpCountKey = (("vote_" + voteId) + "_upCount")
150150 let voteDownCountKey = (("vote_" + voteId) + "_downCount")
151151 let voteTotalCountKey = (("vote_" + voteId) + "_totalCount")
152152 let voteConfirmedKey = (("vote_" + voteId) + "_confirmed")
153153 let voteRejectedKey = (("vote_" + voteId) + "_rejected")
154154 let addressPower = valueOrErrorMessage(getInteger((("address_" + addressStr) + "_power")), "The address has no voting power")
155155 let totalVoteCount = valueOrElse(getInteger(voteTotalCountKey), 0)
156156 let voterVotesCount = valueOrElse(getInteger(voterVotesCountKey), 0)
157157 let voterSpentPower = valueOrElse(getInteger(voterSpentPowerKey), 0)
158158 let upCountDapp = valueOrElse(getInteger(voteUpCountKey), 0)
159159 let downCountDapp = valueOrElse(getInteger(voteDownCountKey), 0)
160160 let upCount = if ((type == "up"))
161161 then (upCountDapp + addressPower)
162162 else upCountDapp
163163 let downCount = if ((type == "down"))
164164 then (downCountDapp + addressPower)
165165 else downCountDapp
166166 let isCallerVoted = valueOrElse(getBoolean(voterVoteKey), false)
167167 if (isCallerVoted)
168168 then throw("You have already voted")
169169 else if (isVotingClosed(voteId))
170170 then throw("Voting is closed")
171171 else if (!(exist))
172172 then throw("Collection not found")
173173 else if (if ((type != "up"))
174174 then (type != "down")
175175 else false)
176176 then throw("Invalid type parametr")
177177 else {
178178 let updatedVoteCount = (totalVoteCount + addressPower)
179179 let endVoteStates = if ((updatedVoteCount >= POWER_LIMIT))
180180 then {
181181 let upPercent = fraction(upCount, 100, updatedVoteCount)
182182 let downPercent = fraction(downCount, 100, updatedVoteCount)
183183 if ((upPercent >= 50))
184184 then [BooleanEntry(voteConfirmedKey, true)]
185185 else [BooleanEntry(voteRejectedKey, true)]
186186 }
187187 else nil
188188 ([BooleanEntry(voterVoteKey, true), StringEntry(voterVoteTypeKey, type), IntegerEntry(voterVoteCreatedKey, height), IntegerEntry(voterVotePowerKey, addressPower), IntegerEntry(voterVotesCountKey, (voterVotesCount + 1)), IntegerEntry(voterSpentPowerKey, (voterSpentPower + addressPower)), IntegerEntry(voteUpCountKey, upCount), IntegerEntry(voteDownCountKey, downCount), IntegerEntry(voteTotalCountKey, updatedVoteCount)] ++ endVoteStates)
189189 }
190190 }
191191
192192
193193
194194 @Callable(i)
195195 func unvote (voteId) = {
196196 let addressStr = toString(i.caller)
197197 let voterVoteKey = (((("voter_" + addressStr) + "_vote_") + voteId) + "_isVoted")
198198 let voterVoteTypeKey = (((("voter_" + addressStr) + "_vote_") + voteId) + "_type")
199199 let voterVotePowerKey = (((("voter_" + addressStr) + "_vote_") + voteId) + "_power")
200200 let voterVoteCreatedKey = (((("voter_" + addressStr) + "_vote_") + voteId) + "_created")
201201 let voterVotesCountKey = (("voter_" + addressStr) + "_votesCount")
202202 let voterSpentPowerKey = (("voter_" + addressStr) + "_spentPower")
203203 let voteUpCountKey = (("vote_" + voteId) + "_upCount")
204204 let voteDownCountKey = (("vote_" + voteId) + "_downCount")
205205 let voteTotalCountKey = (("vote_" + voteId) + "_totalCount")
206206 let voteConfirmedKey = (("vote_" + voteId) + "_confirmed")
207207 let voteRejectedKey = (("vote_" + voteId) + "_rejected")
208208 let voteIdType = valueOrErrorMessage(getString(voterVoteTypeKey), "Vote Id type not founded")
209209 let voteIdPower = valueOrErrorMessage(getInteger(voterVotePowerKey), "Vote Id power not founded")
210210 let totalCount = valueOrErrorMessage(getInteger(voteTotalCountKey), "Vote Id total count not founded")
211211 let voterVotesCount = valueOrErrorMessage(getInteger(voterVotesCountKey), "Voter votes count value not founded")
212212 let voterSpentPower = valueOrErrorMessage(getInteger(voterSpentPowerKey), "Voter spent power value not founded")
213213 let upCountDapp = valueOrErrorMessage(getInteger(voteUpCountKey), "Up count note found")
214214 let downCountDapp = valueOrErrorMessage(getInteger(voteDownCountKey), "Down count note found")
215215 let upCount = if ((voteIdType == "up"))
216216 then (upCountDapp - voteIdPower)
217217 else upCountDapp
218218 let downCount = if ((voteIdType == "down"))
219219 then (downCountDapp - voteIdPower)
220220 else downCountDapp
221221 let isCallerVoted = valueOrElse(getBoolean(voterVoteKey), false)
222222 if (!(isCallerVoted))
223223 then throw("You haven't voted yet")
224224 else if (isVotingClosed(voteId))
225225 then throw("Voting is closed")
226226 else if (if ((voteIdType != "up"))
227227 then (voteIdType != "down")
228228 else false)
229229 then throw("Invalid type parametr")
230230 else [DeleteEntry(voterVoteKey), DeleteEntry(voterVoteTypeKey), DeleteEntry(voterVoteCreatedKey), DeleteEntry(voterVotePowerKey), IntegerEntry(voterVotesCountKey, (voterVotesCount - 1)), IntegerEntry(voterSpentPowerKey, (voterSpentPower - voteIdPower)), IntegerEntry(voteUpCountKey, upCount), IntegerEntry(voteDownCountKey, downCount), IntegerEntry(voteTotalCountKey, (totalCount - voteIdPower))]
231231 }
232232
233233
234234 @Verifier(tx)
235235 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
236236

github/deemru/w8io/3ef1775 
37.01 ms