tx · E7cc1EWWn6RTTR6pQvhj14wHYucdv7hQPFMMfTvCoWND

3P975LUuqc7uBPiSxp3nemf2FZh62zfirSh:  -0.01300000 Waves

2023.01.16 00:46 [3472113] smart account 3P975LUuqc7uBPiSxp3nemf2FZh62zfirSh > SELF 0.00000000 Waves

{ "type": 13, "id": "E7cc1EWWn6RTTR6pQvhj14wHYucdv7hQPFMMfTvCoWND", "fee": 1300000, "feeAssetId": null, "timestamp": 1673819248940, "version": 2, "chainId": 87, "sender": "3P975LUuqc7uBPiSxp3nemf2FZh62zfirSh", "senderPublicKey": "6Dx2LuCqezyDYjt3zMEL6WRrs5oaor6aK3L6QouPMP1b", "proofs": [ "66SPMxPcw5nRLhyWwLznpazSG9RKLcFYZsEyuGa8FnAmphQwvxGUP3zDSFG3LrsJrHCac5H84GgmMBDmzCXzf4N" ], "script": "base64:BgIgCAISABIDCgEIEgMKAQgSAwoBCBIECgIICBIDCgEIEgANAA9jcmVhdGlvbkFkZHJlc3MJAQdBZGRyZXNzAQEaAVeT3cTSF+cgCv33IRJO8PB2ZyaDA3jUXEwAC1VTRFRBc3NldElkASAelAcTUnahJZX9yGGogl8Qf986Tym7/JpGP1r9Nk+fkQAOdG90YWxTdGFrZWRLZXkCDHRvdGFsX3N0YWtlZAANdG90YWxQb3dlcktleQILdG90YWxfcG93ZXIAFWFsbFN0YWtlZEFkZHJlc3Nlc0tleQIUYWxsX3N0YWtlZF9hZGRyZXNzZXMAC1BPV0VSX0xJTUlUAOgHAAl3aGl0ZWxpc3QJAMwIAgIjM1BKS21Yb0hKdlZlUVhqU0pkaHRrVWNGRHRkaVFxTWJVVEQFA25pbAEIY2hlY2tORlQBBWFzc2V0AwMDAwkAAAIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFD2NyZWF0aW9uQWRkcmVzcwkArAICCQCsAgICBG5mdF8JANgEAQgFBWFzc2V0AmlkAgdfaXNzdWVyCQClCAEFBHRoaXMJAAACCAUFYXNzZXQGaXNzdWVyBQ9jcmVhdGlvbkFkZHJlc3MHCQAAAggFBWFzc2V0CGRlY2ltYWxzAAAHCQAAAggFBWFzc2V0CnJlaXNzdWFibGUHBwkAAAIIBQVhc3NldAhxdWFudGl0eQABBwELZ2V0UG93ZXJORlQBBWFzc2V0BAZwYXJhbXMJARFAZXh0ck5hdGl2ZSgxMDUzKQIFD2NyZWF0aW9uQWRkcmVzcwkArAICCQCsAgICBG5mdF8JANgEAQgFBWFzc2V0AmlkAgdfcGFyYW1zAwkAAAIFBnBhcmFtcwIEZ29sZABkACgBE2dldENvbGxlY3Rpb25Jc3N1ZXIBDGNvbGxlY3Rpb25JZAQHYXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9jcmVhdGlvbkFkZHJlc3MJAKwCAgkArAICAgtjb2xsZWN0aW9uXwUMY29sbGVjdGlvbklkAghfYXNzZXRJZAIACQELdmFsdWVPckVsc2UCCQCdCAIFD2NyZWF0aW9uQWRkcmVzcwkArAICCQCsAgICBG5mdF8FB2Fzc2V0SWQCB19pc3N1ZXICAAEOaXNWb3RpbmdDbG9zZWQBBnZvdGVJZAQQdm90ZUNvbmZpcm1lZEtleQkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCCl9jb25maXJtZWQED3ZvdGVSZWplY3RlZEtleQkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCCV9yZWplY3RlZAQLaXNDb25maXJtZWQJAQt2YWx1ZU9yRWxzZQIJAKAIAQUQdm90ZUNvbmZpcm1lZEtleQcECmlzUmVqZWN0ZWQJAQt2YWx1ZU9yRWxzZQIJAKAIAQUPdm90ZVJlamVjdGVkS2V5BwMFC2lzQ29uZmlybWVkBgUKaXNSZWplY3RlZAEVYWRkQWRkcmVzc1RvU3Rha2VkQWxsAQdhZGRyZXNzBBJhbGxTdGFrZWRBZGRyZXNzZXMJAQt2YWx1ZU9yRWxzZQIJAKIIAQUVYWxsU3Rha2VkQWRkcmVzc2VzS2V5AgADCQEBIQEJAQlpc0RlZmluZWQBCQCzCQIFEmFsbFN0YWtlZEFkZHJlc3NlcwUHYWRkcmVzcwMJAAACCQCxAgEFEmFsbFN0YWtlZEFkZHJlc3NlcwAACQDMCAIJAQtTdHJpbmdFbnRyeQIFFWFsbFN0YWtlZEFkZHJlc3Nlc0tleQUHYWRkcmVzcwUDbmlsCQDMCAIJAQtTdHJpbmdFbnRyeQIFFWFsbFN0YWtlZEFkZHJlc3Nlc0tleQkAuwkCCQDNCAIJAL0JAgUSYWxsU3Rha2VkQWRkcmVzc2VzAgEsBQdhZGRyZXNzAgEsBQNuaWwFA25pbAEacmVtb3ZlQWRkcmVzc0Zyb21TdGFrZWRBbGwBB2FkZHJlc3MEEmFsbFN0YWtlZEFkZHJlc3NlcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEFFWFsbFN0YWtlZEFkZHJlc3Nlc0tleQIjQWxsIHN0YWtlZCBhZGRyZXNzIHN0cmluZyBub3QgZm91bmQDCQEJaXNEZWZpbmVkAQkAswkCBRJhbGxTdGFrZWRBZGRyZXNzZXMFB2FkZHJlc3MEDWFkZHJlc3Nlc0xpc3QJAL0JAgUSYWxsU3Rha2VkQWRkcmVzc2VzAgEsBAxhZGRyZXNzSW5kZXgJAQV2YWx1ZQEJAM8IAgUNYWRkcmVzc2VzTGlzdAUHYWRkcmVzcwkAzAgCCQELU3RyaW5nRW50cnkCBRVhbGxTdGFrZWRBZGRyZXNzZXNLZXkJALsJAgkA0QgCBQ1hZGRyZXNzZXNMaXN0BQxhZGRyZXNzSW5kZXgCASwFA25pbAUDbmlsBwFpAQVzdGFrZQAECmFkZHJlc3NTdHIJAKUIAQgFAWkGY2FsbGVyBAFwCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJEDAggFAWkIcGF5bWVudHMAAAILTm8gcGF5bWVudHMEBWFzc2V0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCAUBcAdhc3NldElkAg9JbnZhbGlkIHBheW1lbnQCEEludmFsaWQgYXNzZXQgSWQDAwkAZgIIBQFwBmFtb3VudAAACQEIY2hlY2tORlQBBQVhc3NldAcEC3RvdGFsU3Rha2VkCQELdmFsdWVPckVsc2UCCQCfCAEFDnRvdGFsU3Rha2VkS2V5AAAECnRvdGFsUG93ZXIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUNdG90YWxQb3dlcktleQAABA9hZGRyZXNzUG93ZXJLZXkJAKwCAgkArAICAghhZGRyZXNzXwUKYWRkcmVzc1N0cgIGX3Bvd2VyBBVhZGRyZXNzVG90YWxTdGFrZWRLZXkJAKwCAgkArAICAghhZGRyZXNzXwUKYWRkcmVzc1N0cgIMX3RvdGFsU3Rha2VkBBRhZGRyZXNzU3Rha2VkTmZ0c0tleQkArAICCQCsAgICCGFkZHJlc3NfBQphZGRyZXNzU3RyAgtfc3Rha2VkTmZ0cwQMYWRkcmVzc1Bvd2VyCQELdmFsdWVPckVsc2UCCQCfCAEFD2FkZHJlc3NQb3dlcktleQAABBJhZGRyZXNzVG90YWxTdGFrZWQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUVYWRkcmVzc1RvdGFsU3Rha2VkS2V5AAAEEWFkZHJlc3NTdGFrZWROZnRzCQELdmFsdWVPckVsc2UCCQCiCAEFFGFkZHJlc3NTdGFrZWROZnRzS2V5AgADCQBnAgkAZAIFEmFkZHJlc3NUb3RhbFN0YWtlZAABAAUJAAIBAhlZb3UgY2FuIHN0YWtlIG9ubHkgNSBORlRzBAhuZnRQb3dlcgkBC2dldFBvd2VyTkZUAQUFYXNzZXQECG5mdElkU3RyCQDYBAEIBQVhc3NldAJpZAQWYWRkcmVzc1N0YWtlZE5mdHNTdGF0ZQMJAAACCQCxAgEFEWFkZHJlc3NTdGFrZWROZnRzAAAJAMwIAgkBC1N0cmluZ0VudHJ5AgUUYWRkcmVzc1N0YWtlZE5mdHNLZXkFCG5mdElkU3RyBQNuaWwJAMwIAgkBC1N0cmluZ0VudHJ5AgUUYWRkcmVzc1N0YWtlZE5mdHNLZXkJALkJAgkAzQgCCQC1CQIFEWFkZHJlc3NTdGFrZWROZnRzAgEsBQhuZnRJZFN0cgIBLAUDbmlsCQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUOdG90YWxTdGFrZWRLZXkJAGQCBQt0b3RhbFN0YWtlZAABCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ10b3RhbFBvd2VyS2V5CQBkAgUKdG90YWxQb3dlcgUIbmZ0UG93ZXIJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICBG5mdF8FCG5mdElkU3RyAgZfb3duZXIFCmFkZHJlc3NTdHIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAgRuZnRfBQhuZnRJZFN0cgIGX3Bvd2VyBQhuZnRQb3dlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgUPYWRkcmVzc1Bvd2VyS2V5CQBkAgUMYWRkcmVzc1Bvd2VyBQhuZnRQb3dlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgUVYWRkcmVzc1RvdGFsU3Rha2VkS2V5CQBkAgUSYWRkcmVzc1RvdGFsU3Rha2VkAAEFA25pbAkBFWFkZEFkZHJlc3NUb1N0YWtlZEFsbAEFCmFkZHJlc3NTdHIFFmFkZHJlc3NTdGFrZWROZnRzU3RhdGUJAAIBAgtObyBwYXltZW50cwFpAQd1bnN0YWtlAQhuZnRJZFN0cgQKYWRkcmVzc1N0cgkApQgBCAUBaQZjYWxsZXIEBWFzc2V0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQkA2QQBBQhuZnRJZFN0cgIOSW52YWxpZCBuZnQgSWQEDG93bmVyQWRkcmVzcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJAKwCAgkArAICAgRuZnRfBQhuZnRJZFN0cgIGX293bmVyAhJPd25lciBkYXRhIGludmFsaWQDCQECIT0CBQxvd25lckFkZHJlc3MFCmFkZHJlc3NTdHIJAAIBAhVZb3UgYXJlIG5vdCB0aGUgb3duZXIDCQEIY2hlY2tORlQBBQVhc3NldAQLdG90YWxTdGFrZWQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUOdG90YWxTdGFrZWRLZXkAAAQKdG90YWxQb3dlcgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQ10b3RhbFBvd2VyS2V5AAAED2FkZHJlc3NQb3dlcktleQkArAICCQCsAgICCGFkZHJlc3NfBQphZGRyZXNzU3RyAgZfcG93ZXIEFWFkZHJlc3NUb3RhbFN0YWtlZEtleQkArAICCQCsAgICCGFkZHJlc3NfBQphZGRyZXNzU3RyAgxfdG90YWxTdGFrZWQEFGFkZHJlc3NTdGFrZWROZnRzS2V5CQCsAgIJAKwCAgIIYWRkcmVzc18FCmFkZHJlc3NTdHICC19zdGFrZWROZnRzBAxhZGRyZXNzUG93ZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBQ9hZGRyZXNzUG93ZXJLZXkCHUFkZHJlc3MgcG93ZXIgdmFsdWUgbm90IGZvdW5kBBJhZGRyZXNzVG90YWxTdGFrZWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBRVhZGRyZXNzVG90YWxTdGFrZWRLZXkCJEFkZHJlc3MgdG90YWwgc3Rha2VkIHZhbHVlIG5vdCBmb3VuZAQRYWRkcmVzc1N0YWtlZE5mdHMJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBBRRhZGRyZXNzU3Rha2VkTmZ0c0tleQIjQWRkcmVzcyBzdGFrZWQgTmZ0cyB2YWx1ZSBub3QgZm91bmQEDW5mdEFzc2V0SWRTdHIJANgEAQgFBWFzc2V0AmlkBAhuZnRQb3dlcgkBEUBleHRyTmF0aXZlKDEwNTUpAQkArAICCQCsAgICBG5mdF8FDW5mdEFzc2V0SWRTdHICBl9wb3dlcgQTdXBkYXRlZEFkZHJlc3NQb3dlcgkAZQIFDGFkZHJlc3NQb3dlcgUIbmZ0UG93ZXIEE3JlbW92ZVN0YWtlZEFkZHJlc3MDCQAAAgUTdXBkYXRlZEFkZHJlc3NQb3dlcgAACQEacmVtb3ZlQWRkcmVzc0Zyb21TdGFrZWRBbGwBBQphZGRyZXNzU3RyBQNuaWwEFWFkZHJlc3NTdGFrZWROZnRzTGlzdAkAtQkCBRFhZGRyZXNzU3Rha2VkTmZ0cwIBLAQVYWRkcmVzc1N0YWtlZE5mdEluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUVYWRkcmVzc1N0YWtlZE5mdHNMaXN0BQhuZnRJZFN0cgIlTkZUIG5vdCBmb3VuZWQgaW4gYWRkcmVzcyBzdGFrZWQgbGlzdAkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgABCAUFYXNzZXQCaWQJAMwIAgkBDEludGVnZXJFbnRyeQIFDnRvdGFsU3Rha2VkS2V5CQBlAgULdG90YWxTdGFrZWQAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgUNdG90YWxQb3dlcktleQkAZQIFCnRvdGFsUG93ZXIFCG5mdFBvd2VyCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICAgRuZnRfBQ1uZnRBc3NldElkU3RyAgZfb3duZXIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgICBG5mdF8FDW5mdEFzc2V0SWRTdHICBl9wb3dlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgUPYWRkcmVzc1Bvd2VyS2V5BRN1cGRhdGVkQWRkcmVzc1Bvd2VyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRVhZGRyZXNzVG90YWxTdGFrZWRLZXkJAGUCBRJhZGRyZXNzVG90YWxTdGFrZWQAAQkAzAgCCQELU3RyaW5nRW50cnkCBRRhZGRyZXNzU3Rha2VkTmZ0c0tleQkAuQkCCQDRCAIFFWFkZHJlc3NTdGFrZWROZnRzTGlzdAUVYWRkcmVzc1N0YWtlZE5mdEluZGV4AgEsBQNuaWwFE3JlbW92ZVN0YWtlZEFkZHJlc3MJAAIBAg5JbnZhbGlkIG5mdCBJZAFpAQpzZW5kVG9Wb3RlAQxjb2xsZWN0aW9uSWQEBmlzc3VlcgkBE2dldENvbGxlY3Rpb25Jc3N1ZXIBBQxjb2xsZWN0aW9uSWQEB2lzRXhpc3QEByRtYXRjaDAJAKIIAQkArAICCQCsAgICC2NvbGxlY3Rpb25fBQxjb2xsZWN0aW9uSWQCB192b3RlSWQDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAF0BQckbWF0Y2gwBgcDCQAAAgkAsQIBBQZpc3N1ZXIAAAkAAgECG0NvbGxlY3Rpb24gaXNzdWVyIG5vdCBmb3VuZAMFB2lzRXhpc3QJAAIBAjBDb2xsZWN0aW9uIGhhcyBhbHJlYWR5IGJlZW4gc3VibWl0dGVkIGZvciB2b3RpbmcDCQAAAgkAzwgCBQl3aGl0ZWxpc3QJAKUIAQgFAWkGY2FsbGVyBQR1bml0CQACAQIlRnVuY3Rpb25hbGl0eSB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZQMJAQIhPQIFBmlzc3VlcgkApQgBCAUBaQZjYWxsZXIJAAIBAiZPbmx5IHRoZSBpc3N1ZXIgY2FuIHN1Ym1pdCB0byB0aGUgdm90ZQQGdm90ZUlkCQDYBAEJANQWAQkAmwMBBQxjb2xsZWN0aW9uSWQECnRvdGFsVm90ZXMJAQt2YWx1ZU9yRWxzZQIJAJ8IAQILdG90YWxfdm90ZXMAAAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgILY29sbGVjdGlvbl8FDGNvbGxlY3Rpb25JZAIHX3ZvdGVJZAUGdm90ZUlkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAg1fY29sbGVjdGlvbklkBQxjb2xsZWN0aW9uSWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCBl9vd25lcgkApQgBCAUBaQZjYWxsZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAgpfY3JlYXRlZEF0BQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQICC3RvdGFsX3ZvdGVzCQBkAgUKdG90YWxWb3RlcwABBQNuaWwBaQEOcmVtb3ZlRnJvbVZvdGUBBnZvdGVJZAQMY29sbGVjdGlvbklkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCDV9jb2xsZWN0aW9uSWQCF0NvbGxlY3Rpb24gSWQgbm90IGZvdW5kBAVvd25lcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAgZfb3duZXICD093bmVyIG5vdCBmb3VuZAMJAQIhPQIFBW93bmVyCQClCAEIBQFpBmNhbGxlcgkAAgECFVlvdSBhcmUgbm90IHRoZSBvd25lcgMJAQ5pc1ZvdGluZ0Nsb3NlZAEFBnZvdGVJZAkAAgECEFZvdGluZyBpcyBjbG9zZWQECnRvdGFsVm90ZXMJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBAgt0b3RhbF92b3RlcwIbdG90YWwgdm90ZXMgdmFsdWUgbm90IGZvdW5kCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICAgtjb2xsZWN0aW9uXwUMY29sbGVjdGlvbklkAgdfdm90ZUlkCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAg1fY29sbGVjdGlvbklkCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAgZfb3duZXIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCCl9jcmVhdGVkQXQJAMwIAgkBDEludGVnZXJFbnRyeQICC3RvdGFsX3ZvdGVzCQBlAgUKdG90YWxWb3RlcwABBQNuaWwBaQEEdm90ZQIGdm90ZUlkBHR5cGUECmFkZHJlc3NTdHIJAKUIAQgFAWkGY2FsbGVyBAVleGlzdAQHJG1hdGNoMAkAoggBCQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAINX2NvbGxlY3Rpb25JZAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXQFByRtYXRjaDAGBwQMdm90ZXJWb3RlS2V5CQCsAgIJAKwCAgkArAICCQCsAgICBnZvdGVyXwUKYWRkcmVzc1N0cgIGX3ZvdGVfBQZ2b3RlSWQCCF9pc1ZvdGVkBBB2b3RlclZvdGVUeXBlS2V5CQCsAgIJAKwCAgkArAICCQCsAgICBnZvdGVyXwUKYWRkcmVzc1N0cgIGX3ZvdGVfBQZ2b3RlSWQCBV90eXBlBBF2b3RlclZvdGVQb3dlcktleQkArAICCQCsAgIJAKwCAgkArAICAgZ2b3Rlcl8FCmFkZHJlc3NTdHICBl92b3RlXwUGdm90ZUlkAgZfcG93ZXIEE3ZvdGVyVm90ZUNyZWF0ZWRLZXkJAKwCAgkArAICCQCsAgIJAKwCAgIGdm90ZXJfBQphZGRyZXNzU3RyAgZfdm90ZV8FBnZvdGVJZAIIX2NyZWF0ZWQEEnZvdGVyVm90ZXNDb3VudEtleQkArAICCQCsAgICBnZvdGVyXwUKYWRkcmVzc1N0cgILX3ZvdGVzQ291bnQEEnZvdGVyU3BlbnRQb3dlcktleQkArAICCQCsAgICBnZvdGVyXwUKYWRkcmVzc1N0cgILX3NwZW50UG93ZXIEDnZvdGVVcENvdW50S2V5CQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAIIX3VwQ291bnQEEHZvdGVEb3duQ291bnRLZXkJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAgpfZG93bkNvdW50BBF2b3RlVG90YWxDb3VudEtleQkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCC190b3RhbENvdW50BBB2b3RlQ29uZmlybWVkS2V5CQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAIKX2NvbmZpcm1lZAQPdm90ZVJlamVjdGVkS2V5CQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAIJX3JlamVjdGVkBAxhZGRyZXNzUG93ZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBCQCsAgIJAKwCAgIIYWRkcmVzc18FCmFkZHJlc3NTdHICBl9wb3dlcgIfVGhlIGFkZHJlc3MgaGFzIG5vIHZvdGluZyBwb3dlcgQOdG90YWxWb3RlQ291bnQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQURdm90ZVRvdGFsQ291bnRLZXkAAAQPdm90ZXJWb3Rlc0NvdW50CQELdmFsdWVPckVsc2UCCQCfCAEFEnZvdGVyVm90ZXNDb3VudEtleQAABA92b3RlclNwZW50UG93ZXIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUSdm90ZXJTcGVudFBvd2VyS2V5AAAEC3VwQ291bnREYXBwCQELdmFsdWVPckVsc2UCCQCfCAEFDnZvdGVVcENvdW50S2V5AAAEDWRvd25Db3VudERhcHAJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUQdm90ZURvd25Db3VudEtleQAABAd1cENvdW50AwkAAAIFBHR5cGUCAnVwCQBkAgULdXBDb3VudERhcHAFDGFkZHJlc3NQb3dlcgULdXBDb3VudERhcHAECWRvd25Db3VudAMJAAACBQR0eXBlAgRkb3duCQBkAgUNZG93bkNvdW50RGFwcAUMYWRkcmVzc1Bvd2VyBQ1kb3duQ291bnREYXBwBA1pc0NhbGxlclZvdGVkCQELdmFsdWVPckVsc2UCCQCgCAEFDHZvdGVyVm90ZUtleQcDBQ1pc0NhbGxlclZvdGVkCQACAQIWWW91IGhhdmUgYWxyZWFkeSB2b3RlZAMJAQ5pc1ZvdGluZ0Nsb3NlZAEFBnZvdGVJZAkAAgECEFZvdGluZyBpcyBjbG9zZWQDCQEBIQEFBWV4aXN0CQACAQIUQ29sbGVjdGlvbiBub3QgZm91bmQDAwkBAiE9AgUEdHlwZQICdXAJAQIhPQIFBHR5cGUCBGRvd24HCQACAQIVSW52YWxpZCB0eXBlIHBhcmFtZXRyBBB1cGRhdGVkVm90ZUNvdW50CQBkAgUOdG90YWxWb3RlQ291bnQFDGFkZHJlc3NQb3dlcgQNZW5kVm90ZVN0YXRlcwMJAGcCBRB1cGRhdGVkVm90ZUNvdW50BQtQT1dFUl9MSU1JVAQJdXBQZXJjZW50CQBrAwUHdXBDb3VudABkBRB1cGRhdGVkVm90ZUNvdW50BAtkb3duUGVyY2VudAkAawMFCWRvd25Db3VudABkBRB1cGRhdGVkVm90ZUNvdW50AwkAZwIFCXVwUGVyY2VudAAyCQDMCAIJAQxCb29sZWFuRW50cnkCBRB2b3RlQ29uZmlybWVkS2V5BgUDbmlsCQDMCAIJAQxCb29sZWFuRW50cnkCBQ92b3RlUmVqZWN0ZWRLZXkGBQNuaWwFA25pbAkAzggCCQDMCAIJAQxCb29sZWFuRW50cnkCBQx2b3RlclZvdGVLZXkGCQDMCAIJAQtTdHJpbmdFbnRyeQIFEHZvdGVyVm90ZVR5cGVLZXkFBHR5cGUJAMwIAgkBDEludGVnZXJFbnRyeQIFE3ZvdGVyVm90ZUNyZWF0ZWRLZXkFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgURdm90ZXJWb3RlUG93ZXJLZXkFDGFkZHJlc3NQb3dlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgUSdm90ZXJWb3Rlc0NvdW50S2V5CQBkAgUPdm90ZXJWb3Rlc0NvdW50AAEJAMwIAgkBDEludGVnZXJFbnRyeQIFEnZvdGVyU3BlbnRQb3dlcktleQkAZAIFD3ZvdGVyU3BlbnRQb3dlcgUMYWRkcmVzc1Bvd2VyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ52b3RlVXBDb3VudEtleQUHdXBDb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUQdm90ZURvd25Db3VudEtleQUJZG93bkNvdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRF2b3RlVG90YWxDb3VudEtleQUQdXBkYXRlZFZvdGVDb3VudAUDbmlsBQ1lbmRWb3RlU3RhdGVzAWkBBnVudm90ZQEGdm90ZUlkBAphZGRyZXNzU3RyCQClCAEIBQFpBmNhbGxlcgQMdm90ZXJWb3RlS2V5CQCsAgIJAKwCAgkArAICCQCsAgICBnZvdGVyXwUKYWRkcmVzc1N0cgIGX3ZvdGVfBQZ2b3RlSWQCCF9pc1ZvdGVkBBB2b3RlclZvdGVUeXBlS2V5CQCsAgIJAKwCAgkArAICCQCsAgICBnZvdGVyXwUKYWRkcmVzc1N0cgIGX3ZvdGVfBQZ2b3RlSWQCBV90eXBlBBF2b3RlclZvdGVQb3dlcktleQkArAICCQCsAgIJAKwCAgkArAICAgZ2b3Rlcl8FCmFkZHJlc3NTdHICBl92b3RlXwUGdm90ZUlkAgZfcG93ZXIEE3ZvdGVyVm90ZUNyZWF0ZWRLZXkJAKwCAgkArAICCQCsAgIJAKwCAgIGdm90ZXJfBQphZGRyZXNzU3RyAgZfdm90ZV8FBnZvdGVJZAIIX2NyZWF0ZWQEEnZvdGVyVm90ZXNDb3VudEtleQkArAICCQCsAgICBnZvdGVyXwUKYWRkcmVzc1N0cgILX3ZvdGVzQ291bnQEEnZvdGVyU3BlbnRQb3dlcktleQkArAICCQCsAgICBnZvdGVyXwUKYWRkcmVzc1N0cgILX3NwZW50UG93ZXIEDnZvdGVVcENvdW50S2V5CQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAIIX3VwQ291bnQEEHZvdGVEb3duQ291bnRLZXkJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAgpfZG93bkNvdW50BBF2b3RlVG90YWxDb3VudEtleQkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCC190b3RhbENvdW50BBB2b3RlQ29uZmlybWVkS2V5CQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAIKX2NvbmZpcm1lZAQPdm90ZVJlamVjdGVkS2V5CQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAIJX3JlamVjdGVkBAp2b3RlSWRUeXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQUQdm90ZXJWb3RlVHlwZUtleQIYVm90ZSBJZCB0eXBlIG5vdCBmb3VuZGVkBAt2b3RlSWRQb3dlcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEFEXZvdGVyVm90ZVBvd2VyS2V5AhlWb3RlIElkIHBvd2VyIG5vdCBmb3VuZGVkBAp0b3RhbENvdW50CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQURdm90ZVRvdGFsQ291bnRLZXkCH1ZvdGUgSWQgdG90YWwgY291bnQgbm90IGZvdW5kZWQED3ZvdGVyVm90ZXNDb3VudAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEFEnZvdGVyVm90ZXNDb3VudEtleQIjVm90ZXIgdm90ZXMgY291bnQgdmFsdWUgbm90IGZvdW5kZWQED3ZvdGVyU3BlbnRQb3dlcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCfCAEFEnZvdGVyU3BlbnRQb3dlcktleQIjVm90ZXIgc3BlbnQgcG93ZXIgdmFsdWUgbm90IGZvdW5kZWQEC3VwQ291bnREYXBwCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQUOdm90ZVVwQ291bnRLZXkCE1VwIGNvdW50IG5vdGUgZm91bmQEDWRvd25Db3VudERhcHAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBRB2b3RlRG93bkNvdW50S2V5AhVEb3duIGNvdW50IG5vdGUgZm91bmQEB3VwQ291bnQDCQAAAgUKdm90ZUlkVHlwZQICdXAJAGUCBQt1cENvdW50RGFwcAULdm90ZUlkUG93ZXIFC3VwQ291bnREYXBwBAlkb3duQ291bnQDCQAAAgUKdm90ZUlkVHlwZQIEZG93bgkAZQIFDWRvd25Db3VudERhcHAFC3ZvdGVJZFBvd2VyBQ1kb3duQ291bnREYXBwBA1pc0NhbGxlclZvdGVkCQELdmFsdWVPckVsc2UCCQCgCAEFDHZvdGVyVm90ZUtleQcDCQEBIQEFDWlzQ2FsbGVyVm90ZWQJAAIBAhVZb3UgaGF2ZW4ndCB2b3RlZCB5ZXQDCQEOaXNWb3RpbmdDbG9zZWQBBQZ2b3RlSWQJAAIBAhBWb3RpbmcgaXMgY2xvc2VkAwMJAQIhPQIFCnZvdGVJZFR5cGUCAnVwCQECIT0CBQp2b3RlSWRUeXBlAgRkb3duBwkAAgECFUludmFsaWQgdHlwZSBwYXJhbWV0cgkAzAgCCQELRGVsZXRlRW50cnkBBQx2b3RlclZvdGVLZXkJAMwIAgkBC0RlbGV0ZUVudHJ5AQUQdm90ZXJWb3RlVHlwZUtleQkAzAgCCQELRGVsZXRlRW50cnkBBRN2b3RlclZvdGVDcmVhdGVkS2V5CQDMCAIJAQtEZWxldGVFbnRyeQEFEXZvdGVyVm90ZVBvd2VyS2V5CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJ2b3RlclZvdGVzQ291bnRLZXkJAGUCBQ92b3RlclZvdGVzQ291bnQAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgUSdm90ZXJTcGVudFBvd2VyS2V5CQBlAgUPdm90ZXJTcGVudFBvd2VyBQt2b3RlSWRQb3dlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgUOdm90ZVVwQ291bnRLZXkFB3VwQ291bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFEHZvdGVEb3duQ291bnRLZXkFCWRvd25Db3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgURdm90ZVRvdGFsQ291bnRLZXkJAGUCBQp0b3RhbENvdW50BQt2b3RlSWRQb3dlcgUDbmlsAWkBDWZpbGxUcmVhc3VhcnkAAwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECCk5vIHBheW1lbnQDCQAAAggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQAAAkAAgECFlBheW1lbnQgbXVzdCBiZSBtb3JlIDADCQECIT0CCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFC1VTRFRBc3NldElkCQACAQIXUGF5bWVudCBtdXN0IGJlIGluIFVTRFQEBmFtb3VudAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQEB2Fzc2V0SWQJAQV2YWx1ZQEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQZdHJlYXN1YXJ5QXNzZXRJZEF2YWlsYWJsZQkArAICCQCsAgICCnRyZWFzdWFyeV8JANgEAQUHYXNzZXRJZAIKX2F2YWlsYWJsZQQddHJlYXN1YXJ5QXNzZXRJZFRvdGFsUmVjZWl2ZWQJAKwCAgkArAICAgp0cmVhc3VhcnlfCQDYBAEFB2Fzc2V0SWQCDl90b3RhbFJlY2VpdmVkBAlhdmFpbGFibGUJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUZdHJlYXN1YXJ5QXNzZXRJZEF2YWlsYWJsZQAABA10b3RhbFJlY2VpdmVkCQELdmFsdWVPckVsc2UCCQCfCAEFHXRyZWFzdWFyeUFzc2V0SWRUb3RhbFJlY2VpdmVkAAAJAMwIAgkBDEludGVnZXJFbnRyeQIFGXRyZWFzdWFyeUFzc2V0SWRBdmFpbGFibGUJAGQCBQlhdmFpbGFibGUFBmFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgUddHJlYXN1YXJ5QXNzZXRJZFRvdGFsUmVjZWl2ZWQJAGQCBQ10b3RhbFJlY2VpdmVkBQZhbW91bnQFA25pbAECdHgBBnZlcmlmeQAJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXnJ05ah", "height": 3472113, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 65N3oARPgBjTAUD7acy8QyJFEnwYPsJGVCXN5oFm6Fw8 Next: BU8ZkeBMsoCBTwPuokZJSrQ4NZECz5hCAuPWfkiyXhQg Diff:
OldNewDifferences
2929 func getPowerNFT (asset) = {
3030 let params = getStringValue(creationAddress, (("nft_" + toBase58String(asset.id)) + "_params"))
3131 if ((params == "gold"))
32- then 50
33- else 10
32+ then 100
33+ else 40
3434 }
3535
3636
5151 }
5252
5353
54-func addAddressToStaked (address) = {
54+func addAddressToStakedAll (address) = {
5555 let allStakedAddresses = valueOrElse(getString(allStakedAddressesKey), "")
5656 if (!(isDefined(indexOf(allStakedAddresses, address))))
5757 then if ((size(allStakedAddresses) == 0))
6161 }
6262
6363
64-func removeAddressFromStaked (address) = {
64+func removeAddressFromStakedAll (address) = {
6565 let allStakedAddresses = valueOrErrorMessage(getString(allStakedAddressesKey), "All staked address string not found")
6666 if (isDefined(indexOf(allStakedAddresses, address)))
6767 then {
8484 then {
8585 let totalStaked = valueOrElse(getInteger(totalStakedKey), 0)
8686 let totalPower = valueOrElse(getInteger(totalPowerKey), 0)
87- let addressPower = valueOrElse(getInteger((("address_" + addressStr) + "_power")), 0)
88- let nftPower = getPowerNFT(asset)
89- let nftIdStr = toBase58String(asset.id)
90- ([IntegerEntry(totalStakedKey, (totalStaked + 1)), IntegerEntry(totalPowerKey, (totalPower + nftPower)), StringEntry((("nft_" + nftIdStr) + "_owner"), addressStr), IntegerEntry((("nft_" + nftIdStr) + "_power"), nftPower), IntegerEntry((("address_" + addressStr) + "_power"), (addressPower + nftPower))] ++ addAddressToStaked(addressStr))
87+ let addressPowerKey = (("address_" + addressStr) + "_power")
88+ let addressTotalStakedKey = (("address_" + addressStr) + "_totalStaked")
89+ let addressStakedNftsKey = (("address_" + addressStr) + "_stakedNfts")
90+ let addressPower = valueOrElse(getInteger(addressPowerKey), 0)
91+ let addressTotalStaked = valueOrElse(getInteger(addressTotalStakedKey), 0)
92+ let addressStakedNfts = valueOrElse(getString(addressStakedNftsKey), "")
93+ if (((addressTotalStaked + 1) >= 5))
94+ then throw("You can stake only 5 NFTs")
95+ else {
96+ let nftPower = getPowerNFT(asset)
97+ let nftIdStr = toBase58String(asset.id)
98+ let addressStakedNftsState = if ((size(addressStakedNfts) == 0))
99+ then [StringEntry(addressStakedNftsKey, nftIdStr)]
100+ else [StringEntry(addressStakedNftsKey, makeString((split(addressStakedNfts, ",") :+ nftIdStr), ","))]
101+ (([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))] ++ addAddressToStakedAll(addressStr)) ++ addressStakedNftsState)
102+ }
91103 }
92104 else throw("No payments")
93105 }
105117 then {
106118 let totalStaked = valueOrElse(getInteger(totalStakedKey), 0)
107119 let totalPower = valueOrElse(getInteger(totalPowerKey), 0)
108- let addressPower = valueOrElse(getInteger((("address_" + addressStr) + "_power")), 0)
120+ let addressPowerKey = (("address_" + addressStr) + "_power")
121+ let addressTotalStakedKey = (("address_" + addressStr) + "_totalStaked")
122+ let addressStakedNftsKey = (("address_" + addressStr) + "_stakedNfts")
123+ let addressPower = valueOrErrorMessage(getInteger(addressPowerKey), "Address power value not found")
124+ let addressTotalStaked = valueOrErrorMessage(getInteger(addressTotalStakedKey), "Address total staked value not found")
125+ let addressStakedNfts = valueOrErrorMessage(getString(addressStakedNftsKey), "Address staked Nfts value not found")
109126 let nftAssetIdStr = toBase58String(asset.id)
110127 let nftPower = getIntegerValue((("nft_" + nftAssetIdStr) + "_power"))
111128 let updatedAddressPower = (addressPower - nftPower)
112129 let removeStakedAddress = if ((updatedAddressPower == 0))
113- then removeAddressFromStaked(addressStr)
130+ then removeAddressFromStakedAll(addressStr)
114131 else nil
115- ([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"), updatedAddressPower)] ++ removeStakedAddress)
132+ let addressStakedNftsList = split(addressStakedNfts, ",")
133+ let addressStakedNftIndex = valueOrErrorMessage(indexOf(addressStakedNftsList, nftIdStr), "NFT not founed in address staked list")
134+ ([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)
116135 }
117136 else throw("Invalid nft Id")
118137 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let creationAddress = Address(base58'3PFQjjDMiZKQZdu5JqTHD7HwgSXyp9Rw9By')
55
66 let USDTAssetId = base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ'
77
88 let totalStakedKey = "total_staked"
99
1010 let totalPowerKey = "total_power"
1111
1212 let allStakedAddressesKey = "all_staked_addresses"
1313
1414 let POWER_LIMIT = 1000
1515
1616 let whitelist = ["3PJKmXoHJvVeQXjSJdhtkUcFDtdiQqMbUTD"]
1717
1818 func checkNFT (asset) = if (if (if (if ((getStringValue(creationAddress, (("nft_" + toBase58String(asset.id)) + "_issuer")) == toString(this)))
1919 then (asset.issuer == creationAddress)
2020 else false)
2121 then (asset.decimals == 0)
2222 else false)
2323 then (asset.reissuable == false)
2424 else false)
2525 then (asset.quantity == 1)
2626 else false
2727
2828
2929 func getPowerNFT (asset) = {
3030 let params = getStringValue(creationAddress, (("nft_" + toBase58String(asset.id)) + "_params"))
3131 if ((params == "gold"))
32- then 50
33- else 10
32+ then 100
33+ else 40
3434 }
3535
3636
3737 func getCollectionIssuer (collectionId) = {
3838 let assetId = valueOrElse(getString(creationAddress, (("collection_" + collectionId) + "_assetId")), "")
3939 valueOrElse(getString(creationAddress, (("nft_" + assetId) + "_issuer")), "")
4040 }
4141
4242
4343 func isVotingClosed (voteId) = {
4444 let voteConfirmedKey = (("vote_" + voteId) + "_confirmed")
4545 let voteRejectedKey = (("vote_" + voteId) + "_rejected")
4646 let isConfirmed = valueOrElse(getBoolean(voteConfirmedKey), false)
4747 let isRejected = valueOrElse(getBoolean(voteRejectedKey), false)
4848 if (isConfirmed)
4949 then true
5050 else isRejected
5151 }
5252
5353
54-func addAddressToStaked (address) = {
54+func addAddressToStakedAll (address) = {
5555 let allStakedAddresses = valueOrElse(getString(allStakedAddressesKey), "")
5656 if (!(isDefined(indexOf(allStakedAddresses, address))))
5757 then if ((size(allStakedAddresses) == 0))
5858 then [StringEntry(allStakedAddressesKey, address)]
5959 else [StringEntry(allStakedAddressesKey, makeString_11C((split_51C(allStakedAddresses, ",") :+ address), ","))]
6060 else nil
6161 }
6262
6363
64-func removeAddressFromStaked (address) = {
64+func removeAddressFromStakedAll (address) = {
6565 let allStakedAddresses = valueOrErrorMessage(getString(allStakedAddressesKey), "All staked address string not found")
6666 if (isDefined(indexOf(allStakedAddresses, address)))
6767 then {
6868 let addressesList = split_51C(allStakedAddresses, ",")
6969 let addressIndex = value(indexOf(addressesList, address))
7070 [StringEntry(allStakedAddressesKey, makeString_11C(removeByIndex(addressesList, addressIndex), ","))]
7171 }
7272 else nil
7373 }
7474
7575
7676 @Callable(i)
7777 func stake () = {
7878 let addressStr = toString(i.caller)
7979 let p = valueOrErrorMessage(i.payments[0], "No payments")
8080 let asset = valueOrErrorMessage(assetInfo(valueOrErrorMessage(p.assetId, "Invalid payment")), "Invalid asset Id")
8181 if (if ((p.amount > 0))
8282 then checkNFT(asset)
8383 else false)
8484 then {
8585 let totalStaked = valueOrElse(getInteger(totalStakedKey), 0)
8686 let totalPower = valueOrElse(getInteger(totalPowerKey), 0)
87- let addressPower = valueOrElse(getInteger((("address_" + addressStr) + "_power")), 0)
88- let nftPower = getPowerNFT(asset)
89- let nftIdStr = toBase58String(asset.id)
90- ([IntegerEntry(totalStakedKey, (totalStaked + 1)), IntegerEntry(totalPowerKey, (totalPower + nftPower)), StringEntry((("nft_" + nftIdStr) + "_owner"), addressStr), IntegerEntry((("nft_" + nftIdStr) + "_power"), nftPower), IntegerEntry((("address_" + addressStr) + "_power"), (addressPower + nftPower))] ++ addAddressToStaked(addressStr))
87+ let addressPowerKey = (("address_" + addressStr) + "_power")
88+ let addressTotalStakedKey = (("address_" + addressStr) + "_totalStaked")
89+ let addressStakedNftsKey = (("address_" + addressStr) + "_stakedNfts")
90+ let addressPower = valueOrElse(getInteger(addressPowerKey), 0)
91+ let addressTotalStaked = valueOrElse(getInteger(addressTotalStakedKey), 0)
92+ let addressStakedNfts = valueOrElse(getString(addressStakedNftsKey), "")
93+ if (((addressTotalStaked + 1) >= 5))
94+ then throw("You can stake only 5 NFTs")
95+ else {
96+ let nftPower = getPowerNFT(asset)
97+ let nftIdStr = toBase58String(asset.id)
98+ let addressStakedNftsState = if ((size(addressStakedNfts) == 0))
99+ then [StringEntry(addressStakedNftsKey, nftIdStr)]
100+ else [StringEntry(addressStakedNftsKey, makeString((split(addressStakedNfts, ",") :+ nftIdStr), ","))]
101+ (([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))] ++ addAddressToStakedAll(addressStr)) ++ addressStakedNftsState)
102+ }
91103 }
92104 else throw("No payments")
93105 }
94106
95107
96108
97109 @Callable(i)
98110 func unstake (nftIdStr) = {
99111 let addressStr = toString(i.caller)
100112 let asset = valueOrErrorMessage(assetInfo(fromBase58String(nftIdStr)), "Invalid nft Id")
101113 let ownerAddress = valueOrErrorMessage(getString((("nft_" + nftIdStr) + "_owner")), "Owner data invalid")
102114 if ((ownerAddress != addressStr))
103115 then throw("You are not the owner")
104116 else if (checkNFT(asset))
105117 then {
106118 let totalStaked = valueOrElse(getInteger(totalStakedKey), 0)
107119 let totalPower = valueOrElse(getInteger(totalPowerKey), 0)
108- let addressPower = valueOrElse(getInteger((("address_" + addressStr) + "_power")), 0)
120+ let addressPowerKey = (("address_" + addressStr) + "_power")
121+ let addressTotalStakedKey = (("address_" + addressStr) + "_totalStaked")
122+ let addressStakedNftsKey = (("address_" + addressStr) + "_stakedNfts")
123+ let addressPower = valueOrErrorMessage(getInteger(addressPowerKey), "Address power value not found")
124+ let addressTotalStaked = valueOrErrorMessage(getInteger(addressTotalStakedKey), "Address total staked value not found")
125+ let addressStakedNfts = valueOrErrorMessage(getString(addressStakedNftsKey), "Address staked Nfts value not found")
109126 let nftAssetIdStr = toBase58String(asset.id)
110127 let nftPower = getIntegerValue((("nft_" + nftAssetIdStr) + "_power"))
111128 let updatedAddressPower = (addressPower - nftPower)
112129 let removeStakedAddress = if ((updatedAddressPower == 0))
113- then removeAddressFromStaked(addressStr)
130+ then removeAddressFromStakedAll(addressStr)
114131 else nil
115- ([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"), updatedAddressPower)] ++ removeStakedAddress)
132+ let addressStakedNftsList = split(addressStakedNfts, ",")
133+ let addressStakedNftIndex = valueOrErrorMessage(indexOf(addressStakedNftsList, nftIdStr), "NFT not founed in address staked list")
134+ ([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)
116135 }
117136 else throw("Invalid nft Id")
118137 }
119138
120139
121140
122141 @Callable(i)
123142 func sendToVote (collectionId) = {
124143 let issuer = getCollectionIssuer(collectionId)
125144 let isExist = match getString((("collection_" + collectionId) + "_voteId")) {
126145 case t: String =>
127146 true
128147 case _ =>
129148 false
130149 }
131150 if ((size(issuer) == 0))
132151 then throw("Collection issuer not found")
133152 else if (isExist)
134153 then throw("Collection has already been submitted for voting")
135154 else if ((indexOf(whitelist, toString(i.caller)) == unit))
136155 then throw("Functionality temporarily unavailable")
137156 else if ((issuer != toString(i.caller)))
138157 then throw("Only the issuer can submit to the vote")
139158 else {
140159 let voteId = toBase58String(sha256_16Kb(toBytes(collectionId)))
141160 let totalVotes = valueOrElse(getInteger("total_votes"), 0)
142161 [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))]
143162 }
144163 }
145164
146165
147166
148167 @Callable(i)
149168 func removeFromVote (voteId) = {
150169 let collectionId = valueOrErrorMessage(getString((("vote_" + voteId) + "_collectionId")), "Collection Id not found")
151170 let owner = valueOrErrorMessage(getString((("vote_" + voteId) + "_owner")), "Owner not found")
152171 if ((owner != toString(i.caller)))
153172 then throw("You are not the owner")
154173 else if (isVotingClosed(voteId))
155174 then throw("Voting is closed")
156175 else {
157176 let totalVotes = valueOrErrorMessage(getInteger("total_votes"), "total votes value not found")
158177 [DeleteEntry((("collection_" + collectionId) + "_voteId")), DeleteEntry((("vote_" + voteId) + "_collectionId")), DeleteEntry((("vote_" + voteId) + "_owner")), DeleteEntry((("vote_" + voteId) + "_createdAt")), IntegerEntry("total_votes", (totalVotes - 1))]
159178 }
160179 }
161180
162181
163182
164183 @Callable(i)
165184 func vote (voteId,type) = {
166185 let addressStr = toString(i.caller)
167186 let exist = match getString((("vote_" + voteId) + "_collectionId")) {
168187 case t: String =>
169188 true
170189 case _ =>
171190 false
172191 }
173192 let voterVoteKey = (((("voter_" + addressStr) + "_vote_") + voteId) + "_isVoted")
174193 let voterVoteTypeKey = (((("voter_" + addressStr) + "_vote_") + voteId) + "_type")
175194 let voterVotePowerKey = (((("voter_" + addressStr) + "_vote_") + voteId) + "_power")
176195 let voterVoteCreatedKey = (((("voter_" + addressStr) + "_vote_") + voteId) + "_created")
177196 let voterVotesCountKey = (("voter_" + addressStr) + "_votesCount")
178197 let voterSpentPowerKey = (("voter_" + addressStr) + "_spentPower")
179198 let voteUpCountKey = (("vote_" + voteId) + "_upCount")
180199 let voteDownCountKey = (("vote_" + voteId) + "_downCount")
181200 let voteTotalCountKey = (("vote_" + voteId) + "_totalCount")
182201 let voteConfirmedKey = (("vote_" + voteId) + "_confirmed")
183202 let voteRejectedKey = (("vote_" + voteId) + "_rejected")
184203 let addressPower = valueOrErrorMessage(getInteger((("address_" + addressStr) + "_power")), "The address has no voting power")
185204 let totalVoteCount = valueOrElse(getInteger(voteTotalCountKey), 0)
186205 let voterVotesCount = valueOrElse(getInteger(voterVotesCountKey), 0)
187206 let voterSpentPower = valueOrElse(getInteger(voterSpentPowerKey), 0)
188207 let upCountDapp = valueOrElse(getInteger(voteUpCountKey), 0)
189208 let downCountDapp = valueOrElse(getInteger(voteDownCountKey), 0)
190209 let upCount = if ((type == "up"))
191210 then (upCountDapp + addressPower)
192211 else upCountDapp
193212 let downCount = if ((type == "down"))
194213 then (downCountDapp + addressPower)
195214 else downCountDapp
196215 let isCallerVoted = valueOrElse(getBoolean(voterVoteKey), false)
197216 if (isCallerVoted)
198217 then throw("You have already voted")
199218 else if (isVotingClosed(voteId))
200219 then throw("Voting is closed")
201220 else if (!(exist))
202221 then throw("Collection not found")
203222 else if (if ((type != "up"))
204223 then (type != "down")
205224 else false)
206225 then throw("Invalid type parametr")
207226 else {
208227 let updatedVoteCount = (totalVoteCount + addressPower)
209228 let endVoteStates = if ((updatedVoteCount >= POWER_LIMIT))
210229 then {
211230 let upPercent = fraction(upCount, 100, updatedVoteCount)
212231 let downPercent = fraction(downCount, 100, updatedVoteCount)
213232 if ((upPercent >= 50))
214233 then [BooleanEntry(voteConfirmedKey, true)]
215234 else [BooleanEntry(voteRejectedKey, true)]
216235 }
217236 else nil
218237 ([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)
219238 }
220239 }
221240
222241
223242
224243 @Callable(i)
225244 func unvote (voteId) = {
226245 let addressStr = toString(i.caller)
227246 let voterVoteKey = (((("voter_" + addressStr) + "_vote_") + voteId) + "_isVoted")
228247 let voterVoteTypeKey = (((("voter_" + addressStr) + "_vote_") + voteId) + "_type")
229248 let voterVotePowerKey = (((("voter_" + addressStr) + "_vote_") + voteId) + "_power")
230249 let voterVoteCreatedKey = (((("voter_" + addressStr) + "_vote_") + voteId) + "_created")
231250 let voterVotesCountKey = (("voter_" + addressStr) + "_votesCount")
232251 let voterSpentPowerKey = (("voter_" + addressStr) + "_spentPower")
233252 let voteUpCountKey = (("vote_" + voteId) + "_upCount")
234253 let voteDownCountKey = (("vote_" + voteId) + "_downCount")
235254 let voteTotalCountKey = (("vote_" + voteId) + "_totalCount")
236255 let voteConfirmedKey = (("vote_" + voteId) + "_confirmed")
237256 let voteRejectedKey = (("vote_" + voteId) + "_rejected")
238257 let voteIdType = valueOrErrorMessage(getString(voterVoteTypeKey), "Vote Id type not founded")
239258 let voteIdPower = valueOrErrorMessage(getInteger(voterVotePowerKey), "Vote Id power not founded")
240259 let totalCount = valueOrErrorMessage(getInteger(voteTotalCountKey), "Vote Id total count not founded")
241260 let voterVotesCount = valueOrErrorMessage(getInteger(voterVotesCountKey), "Voter votes count value not founded")
242261 let voterSpentPower = valueOrErrorMessage(getInteger(voterSpentPowerKey), "Voter spent power value not founded")
243262 let upCountDapp = valueOrErrorMessage(getInteger(voteUpCountKey), "Up count note found")
244263 let downCountDapp = valueOrErrorMessage(getInteger(voteDownCountKey), "Down count note found")
245264 let upCount = if ((voteIdType == "up"))
246265 then (upCountDapp - voteIdPower)
247266 else upCountDapp
248267 let downCount = if ((voteIdType == "down"))
249268 then (downCountDapp - voteIdPower)
250269 else downCountDapp
251270 let isCallerVoted = valueOrElse(getBoolean(voterVoteKey), false)
252271 if (!(isCallerVoted))
253272 then throw("You haven't voted yet")
254273 else if (isVotingClosed(voteId))
255274 then throw("Voting is closed")
256275 else if (if ((voteIdType != "up"))
257276 then (voteIdType != "down")
258277 else false)
259278 then throw("Invalid type parametr")
260279 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))]
261280 }
262281
263282
264283
265284 @Callable(i)
266285 func fillTreasuary () = if ((size(i.payments) == 0))
267286 then throw("No payment")
268287 else if ((i.payments[0].amount == 0))
269288 then throw("Payment must be more 0")
270289 else if ((i.payments[0].assetId != USDTAssetId))
271290 then throw("Payment must be in USDT")
272291 else {
273292 let amount = i.payments[0].amount
274293 let assetId = value(i.payments[0].assetId)
275294 let treasuaryAssetIdAvailable = (("treasuary_" + toBase58String(assetId)) + "_available")
276295 let treasuaryAssetIdTotalReceived = (("treasuary_" + toBase58String(assetId)) + "_totalReceived")
277296 let available = valueOrElse(getInteger(treasuaryAssetIdAvailable), 0)
278297 let totalReceived = valueOrElse(getInteger(treasuaryAssetIdTotalReceived), 0)
279298 [IntegerEntry(treasuaryAssetIdAvailable, (available + amount)), IntegerEntry(treasuaryAssetIdTotalReceived, (totalReceived + amount))]
280299 }
281300
282301
283302 @Verifier(tx)
284303 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
285304

github/deemru/w8io/3ef1775 
84.46 ms