2023.01.07 23:25 [3460515] smart account 3P975LUuqc7uBPiSxp3nemf2FZh62zfirSh > SELF 0.00000000 Waves
{ "type": 13, "id": "9sRbdjPYJ2rjmqpuKVy7VNgu6MGNziULLmsHe6X8eCqu", "fee": 1000000, "feeAssetId": null, "timestamp": 1673123189057, "version": 2, "chainId": 87, "sender": "3P975LUuqc7uBPiSxp3nemf2FZh62zfirSh", "senderPublicKey": "6Dx2LuCqezyDYjt3zMEL6WRrs5oaor6aK3L6QouPMP1b", "proofs": [ "53nErzRsey4nGjQKUdFJDBDgAvN4zvByzy9M6pagsF7HDVGLxDd2uB5gL5Xopo8EmjTuDGXjRkTwhHgwFGRt5ZJU" ], "script": "base64:BgIeCAISABIDCgEIEgMKAQgSAwoBCBIECgIICBIDCgEIBgAPY3JlYXRpb25BZGRyZXNzCQEHQWRkcmVzcwEBGgFXk93E0hfnIAr99yESTvDwdmcmgwN41FxMAA50b3RhbFN0YWtlZEtleQIMdG90YWxfc3Rha2VkAA10b3RhbFBvd2VyS2V5Agt0b3RhbF9wb3dlcgEIY2hlY2tORlQBBWFzc2V0AwMDAwkAAAIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFD2NyZWF0aW9uQWRkcmVzcwkArAICCQCsAgICBG5mdF8JANgEAQgFBWFzc2V0AmlkAgdfaXNzdWVyCQClCAEFBHRoaXMJAAACCAUFYXNzZXQGaXNzdWVyBQ9jcmVhdGlvbkFkZHJlc3MHCQAAAggFBWFzc2V0CGRlY2ltYWxzAAAHCQAAAggFBWFzc2V0CnJlaXNzdWFibGUHBwkAAAIIBQVhc3NldAhxdWFudGl0eQABBwELZ2V0UG93ZXJORlQBBWFzc2V0BAZwYXJhbXMJARFAZXh0ck5hdGl2ZSgxMDUzKQIFD2NyZWF0aW9uQWRkcmVzcwkArAICCQCsAgICBG5mdF8JANgEAQgFBWFzc2V0AmlkAgdfcGFyYW1zAwkAAAIFBnBhcmFtcwIEZ29sZAAyAAoBE2dldENvbGxlY3Rpb25Jc3N1ZXIBDGNvbGxlY3Rpb25JZAQHYXNzZXRJZAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9jcmVhdGlvbkFkZHJlc3MJAKwCAgkArAICAgtjb2xsZWN0aW9uXwUMY29sbGVjdGlvbklkAghfYXNzZXRJZAIACQELdmFsdWVPckVsc2UCCQCdCAIFD2NyZWF0aW9uQWRkcmVzcwkArAICCQCsAgICBG5mdF8FB2Fzc2V0SWQCB19pc3N1ZXICAAYBaQEFc3Rha2UABAphZGRyZXNzU3RyCQClCAEIBQFpBmNhbGxlcgQBcAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCRAwIIBQFpCHBheW1lbnRzAAACC05vIHBheW1lbnRzBAVhc3NldAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDsBwEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAggFAXAHYXNzZXRJZAIPSW52YWxpZCBwYXltZW50AhBJbnZhbGlkIGFzc2V0IElkAwMJAGYCCAUBcAZhbW91bnQAAAkBCGNoZWNrTkZUAQUFYXNzZXQHBAt0b3RhbFN0YWtlZAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQ50b3RhbFN0YWtlZEtleQAABAp0b3RhbFBvd2VyCQELdmFsdWVPckVsc2UCCQCfCAEFDXRvdGFsUG93ZXJLZXkAAAQMYWRkcmVzc1Bvd2VyCQELdmFsdWVPckVsc2UCCQCfCAEJAKwCAgkArAICAghhZGRyZXNzXwUKYWRkcmVzc1N0cgIGX3Bvd2VyAAAECG5mdFBvd2VyCQELZ2V0UG93ZXJORlQBBQVhc3NldAQIbmZ0SWRTdHIJANgEAQgFBWFzc2V0AmlkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ50b3RhbFN0YWtlZEtleQkAZAIFC3RvdGFsU3Rha2VkAAEJAMwIAgkBDEludGVnZXJFbnRyeQIFDXRvdGFsUG93ZXJLZXkJAGQCBQp0b3RhbFBvd2VyBQhuZnRQb3dlcgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIEbmZ0XwUIbmZ0SWRTdHICBl9vd25lcgUKYWRkcmVzc1N0cgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICBG5mdF8FCG5mdElkU3RyAgZfcG93ZXIFCG5mdFBvd2VyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgIIYWRkcmVzc18FCmFkZHJlc3NTdHICBl9wb3dlcgkAZAIFDGFkZHJlc3NQb3dlcgUIbmZ0UG93ZXIFA25pbAkAAgECC05vIHBheW1lbnRzAWkBB3Vuc3Rha2UBCG5mdElkU3RyBAphZGRyZXNzU3RyCQClCAEIBQFpBmNhbGxlcgQFYXNzZXQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBCQDZBAEFCG5mdElkU3RyAg5JbnZhbGlkIG5mdCBJZAQMb3duZXJBZGRyZXNzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkArAICCQCsAgICBG5mdF8FCG5mdElkU3RyAgZfb3duZXICEk93bmVyIGRhdGEgaW52YWxpZAMJAQIhPQIFDG93bmVyQWRkcmVzcwUKYWRkcmVzc1N0cgkAAgECFVlvdSBhcmUgbm90IHRoZSBvd25lcgMJAQhjaGVja05GVAEFBWFzc2V0BAt0b3RhbFN0YWtlZAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQ50b3RhbFN0YWtlZEtleQAABAp0b3RhbFBvd2VyCQELdmFsdWVPckVsc2UCCQCfCAEFDXRvdGFsUG93ZXJLZXkAAAQMYWRkcmVzc1Bvd2VyCQELdmFsdWVPckVsc2UCCQCfCAEJAKwCAgkArAICAghhZGRyZXNzXwUKYWRkcmVzc1N0cgIGX3Bvd2VyAAAEDW5mdEFzc2V0SWRTdHIJANgEAQgFBWFzc2V0AmlkBAhuZnRQb3dlcgkBEUBleHRyTmF0aXZlKDEwNTUpAQkArAICCQCsAgICBG5mdF8FDW5mdEFzc2V0SWRTdHICBl9wb3dlcgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIAAQgFBWFzc2V0AmlkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ50b3RhbFN0YWtlZEtleQkAZQIFC3RvdGFsU3Rha2VkAAEJAMwIAgkBDEludGVnZXJFbnRyeQIFDXRvdGFsUG93ZXJLZXkJAGUCBQp0b3RhbFBvd2VyBQhuZnRQb3dlcgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgIEbmZ0XwUNbmZ0QXNzZXRJZFN0cgIGX293bmVyCQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgkArAICAgRuZnRfBQ1uZnRBc3NldElkU3RyAgZfcG93ZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAghhZGRyZXNzXwUKYWRkcmVzc1N0cgIGX3Bvd2VyCQBlAgUMYWRkcmVzc1Bvd2VyBQhuZnRQb3dlcgUDbmlsCQACAQIOSW52YWxpZCBuZnQgSWQBaQEKc2VuZFRvVm90ZQEMY29sbGVjdGlvbklkBAZpc3N1ZXIJARNnZXRDb2xsZWN0aW9uSXNzdWVyAQUMY29sbGVjdGlvbklkAwkAAAIJALECAQUGaXNzdWVyAAAJAAIBAhtDb2xsZWN0aW9uIGlzc3VlciBub3QgZm91bmQDCQECIT0CBQZpc3N1ZXIJAKUIAQgFAWkGY2FsbGVyCQACAQImT25seSB0aGUgaXNzdWVyIGNhbiBzdWJtaXQgdG8gdGhlIHZvdGUEBnZvdGVJZAkA2AQBCAUBaQ10cmFuc2FjdGlvbklkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAgtjb2xsZWN0aW9uXwUMY29sbGVjdGlvbklkAgdfdm90ZUlkBQZ2b3RlSWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCDV9jb2xsZWN0aW9uSWQFDGNvbGxlY3Rpb25JZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAIGX293bmVyCQClCAEIBQFpBmNhbGxlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCCl9jcmVhdGVkQXQFBmhlaWdodAUDbmlsAWkBDnJlbW92ZUZyb21Wb3RlAQZ2b3RlSWQEDGNvbGxlY3Rpb25JZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAg1fY29sbGVjdGlvbklkAhdDb2xsZWN0aW9uIElkIG5vdCBmb3VuZAQFb3duZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAIGX293bmVyAg9Pd25lciBub3QgZm91bmQDCQECIT0CBQVvd25lcgkApQgBCAUBaQZjYWxsZXIJAAIBAhVZb3UgYXJlIG5vdCB0aGUgb3duZXIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgICC2NvbGxlY3Rpb25fBQxjb2xsZWN0aW9uSWQCB192b3RlSWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCDV9jb2xsZWN0aW9uSWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCBl9vd25lcgkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAIKX2NyZWF0ZWRBdAUDbmlsAWkBBHZvdGUCBnZvdGVJZAR0eXBlBAphZGRyZXNzU3RyCQClCAEIBQFpBmNhbGxlcgQFZXhpc3QEByRtYXRjaDAJAKIIAQkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCDV9jb2xsZWN0aW9uSWQDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAF0BQckbWF0Y2gwBgcEDHZvdGVyVm90ZUtleQkArAICCQCsAgIJAKwCAgkArAICAgZ2b3Rlcl8FCmFkZHJlc3NTdHICBl92b3RlXwUGdm90ZUlkAghfaXNWb3RlZAQQdm90ZXJWb3RlVHlwZUtleQkArAICCQCsAgIJAKwCAgkArAICAgZ2b3Rlcl8FCmFkZHJlc3NTdHICBl92b3RlXwUGdm90ZUlkAgVfdHlwZQQRdm90ZXJWb3RlUG93ZXJLZXkJAKwCAgkArAICCQCsAgIJAKwCAgIGdm90ZXJfBQphZGRyZXNzU3RyAgZfdm90ZV8FBnZvdGVJZAIGX3Bvd2VyBBJ2b3RlclZvdGVzQ291bnRLZXkJAKwCAgkArAICAgZ2b3Rlcl8FCmFkZHJlc3NTdHICC192b3Rlc0NvdW50BBJ2b3RlclNwZW50UG93ZXJLZXkJAKwCAgkArAICAgZ2b3Rlcl8FCmFkZHJlc3NTdHICC19zcGVudFBvd2VyBA52b3RlVXBDb3VudEtleQkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCCF91cENvdW50BBB2b3RlRG93bkNvdW50S2V5CQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAIKX2Rvd25Db3VudAQRdm90ZVRvdGFsQ291bnRLZXkJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAgtfdG90YWxDb3VudAQMYWRkcmVzc1Bvd2VyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQkArAICCQCsAgICCGFkZHJlc3NfBQphZGRyZXNzU3RyAgZfcG93ZXICH1RoZSBhZGRyZXNzIGhhcyBubyB2b3RpbmcgcG93ZXIECnRvdGFsQ291bnQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQURdm90ZVRvdGFsQ291bnRLZXkAAAQPdm90ZXJWb3Rlc0NvdW50CQELdmFsdWVPckVsc2UCCQCfCAEFEnZvdGVyVm90ZXNDb3VudEtleQAABA92b3RlclNwZW50UG93ZXIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUSdm90ZXJTcGVudFBvd2VyS2V5AAAEEHZvdGVDaGFuZ2VTdGF0ZXMDCQAAAgUEdHlwZQICdXAEB3VwQ291bnQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUOdm90ZVVwQ291bnRLZXkAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgUOdm90ZVVwQ291bnRLZXkJAGQCBQd1cENvdW50BQxhZGRyZXNzUG93ZXIFA25pbAMJAAACBQR0eXBlAgRkb3duBAlkb3duQ291bnQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUQdm90ZURvd25Db3VudEtleQAACQDMCAIJAQxJbnRlZ2VyRW50cnkCBRB2b3RlRG93bkNvdW50S2V5CQBkAgUJZG93bkNvdW50BQxhZGRyZXNzUG93ZXIFA25pbAkAAgECDEludmFsaWQgdHlwZQQNaXNDYWxsZXJWb3RlZAkBC3ZhbHVlT3JFbHNlAgkAoAgBBQx2b3RlclZvdGVLZXkHAwUNaXNDYWxsZXJWb3RlZAkAAgECFllvdSBoYXZlIGFscmVhZHkgdm90ZWQDCQEBIQEFBWV4aXN0CQACAQIUQ29sbGVjdGlvbiBub3QgZm91bmQJAM4IAgkAzAgCCQEMQm9vbGVhbkVudHJ5AgUMdm90ZXJWb3RlS2V5BgkAzAgCCQELU3RyaW5nRW50cnkCBRB2b3RlclZvdGVUeXBlS2V5BQR0eXBlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRF2b3RlclZvdGVQb3dlcktleQUMYWRkcmVzc1Bvd2VyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJ2b3RlclZvdGVzQ291bnRLZXkJAGQCBQ92b3RlclZvdGVzQ291bnQAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgUSdm90ZXJTcGVudFBvd2VyS2V5CQBkAgUPdm90ZXJTcGVudFBvd2VyBQxhZGRyZXNzUG93ZXIJAMwIAgkBDEludGVnZXJFbnRyeQIFEXZvdGVUb3RhbENvdW50S2V5CQBkAgUKdG90YWxDb3VudAUMYWRkcmVzc1Bvd2VyBQNuaWwFEHZvdGVDaGFuZ2VTdGF0ZXMBaQEGdW52b3RlAQZ2b3RlSWQECmFkZHJlc3NTdHIJAKUIAQgFAWkGY2FsbGVyBAx2b3RlclZvdGVLZXkJAKwCAgkArAICCQCsAgIJAKwCAgIGdm90ZXJfBQphZGRyZXNzU3RyAgZfdm90ZV8FBnZvdGVJZAIIX2lzVm90ZWQEEHZvdGVyVm90ZVR5cGVLZXkJAKwCAgkArAICCQCsAgIJAKwCAgIGdm90ZXJfBQphZGRyZXNzU3RyAgZfdm90ZV8FBnZvdGVJZAIFX3R5cGUEEXZvdGVyVm90ZVBvd2VyS2V5CQCsAgIJAKwCAgkArAICCQCsAgICBnZvdGVyXwUKYWRkcmVzc1N0cgIGX3ZvdGVfBQZ2b3RlSWQCBl9wb3dlcgQSdm90ZXJWb3Rlc0NvdW50S2V5CQCsAgIJAKwCAgIGdm90ZXJfBQphZGRyZXNzU3RyAgtfdm90ZXNDb3VudAQSdm90ZXJTcGVudFBvd2VyS2V5CQCsAgIJAKwCAgIGdm90ZXJfBQphZGRyZXNzU3RyAgtfc3BlbnRQb3dlcgQOdm90ZVVwQ291bnRLZXkJAKwCAgkArAICAgV2b3RlXwUGdm90ZUlkAghfdXBDb3VudAQQdm90ZURvd25Db3VudEtleQkArAICCQCsAgICBXZvdGVfBQZ2b3RlSWQCCl9kb3duQ291bnQEEXZvdGVUb3RhbENvdW50S2V5CQCsAgIJAKwCAgIFdm90ZV8FBnZvdGVJZAILX3RvdGFsQ291bnQECnZvdGVJZFR5cGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBBRB2b3RlclZvdGVUeXBlS2V5AhhWb3RlIElkIHR5cGUgbm90IGZvdW5kZWQEC3ZvdGVJZFBvd2VyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQURdm90ZXJWb3RlUG93ZXJLZXkCGVZvdGUgSWQgcG93ZXIgbm90IGZvdW5kZWQECnRvdGFsQ291bnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBRF2b3RlVG90YWxDb3VudEtleQIfVm90ZSBJZCB0b3RhbCBjb3VudCBub3QgZm91bmRlZAQPdm90ZXJWb3Rlc0NvdW50CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQUSdm90ZXJWb3Rlc0NvdW50S2V5AiNWb3RlciB2b3RlcyBjb3VudCB2YWx1ZSBub3QgZm91bmRlZAQPdm90ZXJTcGVudFBvd2VyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQUSdm90ZXJTcGVudFBvd2VyS2V5AiNWb3RlciBzcGVudCBwb3dlciB2YWx1ZSBub3QgZm91bmRlZAQQdm90ZUNoYW5nZVN0YXRlcwMJAAACBQp2b3RlSWRUeXBlAgJ1cAQHdXBDb3VudAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQ52b3RlVXBDb3VudEtleQAACQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ52b3RlVXBDb3VudEtleQkAZQIFB3VwQ291bnQFC3ZvdGVJZFBvd2VyBQNuaWwDCQAAAgUKdm90ZUlkVHlwZQIEZG93bgQJZG93bkNvdW50CQELdmFsdWVPckVsc2UCCQCfCAEFEHZvdGVEb3duQ291bnRLZXkAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgUQdm90ZURvd25Db3VudEtleQkAZQIFCWRvd25Db3VudAULdm90ZUlkUG93ZXIFA25pbAkAAgECDEludmFsaWQgdHlwZQQNaXNDYWxsZXJWb3RlZAkBC3ZhbHVlT3JFbHNlAgkAoAgBBQx2b3RlclZvdGVLZXkHAwkBASEBBQ1pc0NhbGxlclZvdGVkCQACAQIVWW91IGhhdmVuJ3Qgdm90ZWQgeWV0CQDOCAIJAMwIAgkBC0RlbGV0ZUVudHJ5AQUMdm90ZXJWb3RlS2V5CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRJ2b3RlclZvdGVzQ291bnRLZXkJAGUCBQ92b3RlclZvdGVzQ291bnQAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgUSdm90ZXJTcGVudFBvd2VyS2V5CQBlAgUPdm90ZXJTcGVudFBvd2VyBQt2b3RlSWRQb3dlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgURdm90ZVRvdGFsQ291bnRLZXkJAGUCBQp0b3RhbENvdW50BQt2b3RlSWRQb3dlcgUDbmlsBRB2b3RlQ2hhbmdlU3RhdGVzAQJ0eAEGdmVyaWZ5AAkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleXo3jts=", "height": 3460515, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 6kjK3EFnJKs6Xrzej4Wr49Mdqj1rbU154jgXoNPgtiY5 Next: H2bLPbiP4bVh3wqDqxwNnggsYEBoi2XXmtbJZxa7FbNJ Diff:
Old | New | Differences | |
---|---|---|---|
109 | 109 | case _ => | |
110 | 110 | false | |
111 | 111 | } | |
112 | - | let voterVoteKey = ((("voter_" + addressStr) + "_vote_") + voteId) | |
112 | + | let voterVoteKey = (((("voter_" + addressStr) + "_vote_") + voteId) + "_isVoted") | |
113 | + | let voterVoteTypeKey = (((("voter_" + addressStr) + "_vote_") + voteId) + "_type") | |
114 | + | let voterVotePowerKey = (((("voter_" + addressStr) + "_vote_") + voteId) + "_power") | |
113 | 115 | let voterVotesCountKey = (("voter_" + addressStr) + "_votesCount") | |
114 | 116 | let voterSpentPowerKey = (("voter_" + addressStr) + "_spentPower") | |
115 | 117 | let voteUpCountKey = (("vote_" + voteId) + "_upCount") | |
135 | 137 | then throw("You have already voted") | |
136 | 138 | else if (!(exist)) | |
137 | 139 | then throw("Collection not found") | |
138 | - | else ([BooleanEntry(voterVoteKey, true), IntegerEntry(voterVotesCountKey, (voterVotesCount + 1)), IntegerEntry(voterSpentPowerKey, (voterSpentPower + addressPower)), IntegerEntry(voteTotalCountKey, (totalCount + addressPower))] ++ voteChangeStates) | |
140 | + | else ([BooleanEntry(voterVoteKey, true), StringEntry(voterVoteTypeKey, type), IntegerEntry(voterVotePowerKey, addressPower), IntegerEntry(voterVotesCountKey, (voterVotesCount + 1)), IntegerEntry(voterSpentPowerKey, (voterSpentPower + addressPower)), IntegerEntry(voteTotalCountKey, (totalCount + addressPower))] ++ voteChangeStates) | |
139 | 141 | } | |
140 | 142 | ||
141 | 143 | ||
142 | 144 | ||
143 | 145 | @Callable(i) | |
144 | - | func unvote (voteId | |
146 | + | func unvote (voteId) = { | |
145 | 147 | let addressStr = toString(i.caller) | |
146 | - | let voterVoteKey = ((("voter_" + addressStr) + "_vote_") + voteId) | |
148 | + | let voterVoteKey = (((("voter_" + addressStr) + "_vote_") + voteId) + "_isVoted") | |
149 | + | let voterVoteTypeKey = (((("voter_" + addressStr) + "_vote_") + voteId) + "_type") | |
150 | + | let voterVotePowerKey = (((("voter_" + addressStr) + "_vote_") + voteId) + "_power") | |
147 | 151 | let voterVotesCountKey = (("voter_" + addressStr) + "_votesCount") | |
148 | 152 | let voterSpentPowerKey = (("voter_" + addressStr) + "_spentPower") | |
149 | 153 | let voteUpCountKey = (("vote_" + voteId) + "_upCount") | |
150 | 154 | let voteDownCountKey = (("vote_" + voteId) + "_downCount") | |
151 | 155 | let voteTotalCountKey = (("vote_" + voteId) + "_totalCount") | |
152 | - | let addressPower = valueOrErrorMessage(getInteger((("address_" + addressStr) + "_power")), "The address has no voting power") | |
153 | - | let totalCount = valueOrElse(getInteger(voteTotalCountKey), 0) | |
154 | - | let voterVotesCount = valueOrElse(getInteger(voterVotesCountKey), 0) | |
155 | - | let voterSpentPower = valueOrElse(getInteger(voterSpentPowerKey), 0) | |
156 | - | let voteChangeStates = if ((type == "up")) | |
156 | + | let voteIdType = valueOrErrorMessage(getString(voterVoteTypeKey), "Vote Id type not founded") | |
157 | + | let voteIdPower = valueOrErrorMessage(getInteger(voterVotePowerKey), "Vote Id power not founded") | |
158 | + | let totalCount = valueOrErrorMessage(getInteger(voteTotalCountKey), "Vote Id total count not founded") | |
159 | + | let voterVotesCount = valueOrErrorMessage(getInteger(voterVotesCountKey), "Voter votes count value not founded") | |
160 | + | let voterSpentPower = valueOrErrorMessage(getInteger(voterSpentPowerKey), "Voter spent power value not founded") | |
161 | + | let voteChangeStates = if ((voteIdType == "up")) | |
157 | 162 | then { | |
158 | 163 | let upCount = valueOrElse(getInteger(voteUpCountKey), 0) | |
159 | - | [IntegerEntry(voteUpCountKey, (upCount - | |
164 | + | [IntegerEntry(voteUpCountKey, (upCount - voteIdPower))] | |
160 | 165 | } | |
161 | - | else if (( | |
166 | + | else if ((voteIdType == "down")) | |
162 | 167 | then { | |
163 | 168 | let downCount = valueOrElse(getInteger(voteDownCountKey), 0) | |
164 | - | [IntegerEntry(voteDownCountKey, (downCount - | |
169 | + | [IntegerEntry(voteDownCountKey, (downCount - voteIdPower))] | |
165 | 170 | } | |
166 | 171 | else throw("Invalid type") | |
167 | 172 | let isCallerVoted = valueOrElse(getBoolean(voterVoteKey), false) | |
168 | 173 | if (!(isCallerVoted)) | |
169 | 174 | then throw("You haven't voted yet") | |
170 | - | else ([DeleteEntry(voterVoteKey), IntegerEntry(voterVotesCountKey, (voterVotesCount - 1)), IntegerEntry(voterSpentPowerKey, (voterSpentPower - | |
175 | + | else ([DeleteEntry(voterVoteKey), IntegerEntry(voterVotesCountKey, (voterVotesCount - 1)), IntegerEntry(voterSpentPowerKey, (voterSpentPower - voteIdPower)), IntegerEntry(voteTotalCountKey, (totalCount - voteIdPower))] ++ voteChangeStates) | |
171 | 176 | } | |
172 | 177 | ||
173 | 178 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let creationAddress = Address(base58'3PFQjjDMiZKQZdu5JqTHD7HwgSXyp9Rw9By') | |
5 | 5 | ||
6 | 6 | let totalStakedKey = "total_staked" | |
7 | 7 | ||
8 | 8 | let totalPowerKey = "total_power" | |
9 | 9 | ||
10 | 10 | func checkNFT (asset) = if (if (if (if ((getStringValue(creationAddress, (("nft_" + toBase58String(asset.id)) + "_issuer")) == toString(this))) | |
11 | 11 | then (asset.issuer == creationAddress) | |
12 | 12 | else false) | |
13 | 13 | then (asset.decimals == 0) | |
14 | 14 | else false) | |
15 | 15 | then (asset.reissuable == false) | |
16 | 16 | else false) | |
17 | 17 | then (asset.quantity == 1) | |
18 | 18 | else false | |
19 | 19 | ||
20 | 20 | ||
21 | 21 | func getPowerNFT (asset) = { | |
22 | 22 | let params = getStringValue(creationAddress, (("nft_" + toBase58String(asset.id)) + "_params")) | |
23 | 23 | if ((params == "gold")) | |
24 | 24 | then 50 | |
25 | 25 | else 10 | |
26 | 26 | } | |
27 | 27 | ||
28 | 28 | ||
29 | 29 | func getCollectionIssuer (collectionId) = { | |
30 | 30 | let assetId = valueOrElse(getString(creationAddress, (("collection_" + collectionId) + "_assetId")), "") | |
31 | 31 | valueOrElse(getString(creationAddress, (("nft_" + assetId) + "_issuer")), "") | |
32 | 32 | } | |
33 | 33 | ||
34 | 34 | ||
35 | 35 | @Callable(i) | |
36 | 36 | func stake () = { | |
37 | 37 | let addressStr = toString(i.caller) | |
38 | 38 | let p = valueOrErrorMessage(i.payments[0], "No payments") | |
39 | 39 | let asset = valueOrErrorMessage(assetInfo(valueOrErrorMessage(p.assetId, "Invalid payment")), "Invalid asset Id") | |
40 | 40 | if (if ((p.amount > 0)) | |
41 | 41 | then checkNFT(asset) | |
42 | 42 | else false) | |
43 | 43 | then { | |
44 | 44 | let totalStaked = valueOrElse(getInteger(totalStakedKey), 0) | |
45 | 45 | let totalPower = valueOrElse(getInteger(totalPowerKey), 0) | |
46 | 46 | let addressPower = valueOrElse(getInteger((("address_" + addressStr) + "_power")), 0) | |
47 | 47 | let nftPower = getPowerNFT(asset) | |
48 | 48 | let nftIdStr = toBase58String(asset.id) | |
49 | 49 | [IntegerEntry(totalStakedKey, (totalStaked + 1)), IntegerEntry(totalPowerKey, (totalPower + nftPower)), StringEntry((("nft_" + nftIdStr) + "_owner"), addressStr), IntegerEntry((("nft_" + nftIdStr) + "_power"), nftPower), IntegerEntry((("address_" + addressStr) + "_power"), (addressPower + nftPower))] | |
50 | 50 | } | |
51 | 51 | else throw("No payments") | |
52 | 52 | } | |
53 | 53 | ||
54 | 54 | ||
55 | 55 | ||
56 | 56 | @Callable(i) | |
57 | 57 | func unstake (nftIdStr) = { | |
58 | 58 | let addressStr = toString(i.caller) | |
59 | 59 | let asset = valueOrErrorMessage(assetInfo(fromBase58String(nftIdStr)), "Invalid nft Id") | |
60 | 60 | let ownerAddress = valueOrErrorMessage(getString((("nft_" + nftIdStr) + "_owner")), "Owner data invalid") | |
61 | 61 | if ((ownerAddress != addressStr)) | |
62 | 62 | then throw("You are not the owner") | |
63 | 63 | else if (checkNFT(asset)) | |
64 | 64 | then { | |
65 | 65 | let totalStaked = valueOrElse(getInteger(totalStakedKey), 0) | |
66 | 66 | let totalPower = valueOrElse(getInteger(totalPowerKey), 0) | |
67 | 67 | let addressPower = valueOrElse(getInteger((("address_" + addressStr) + "_power")), 0) | |
68 | 68 | let nftAssetIdStr = toBase58String(asset.id) | |
69 | 69 | let nftPower = getIntegerValue((("nft_" + nftAssetIdStr) + "_power")) | |
70 | 70 | [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))] | |
71 | 71 | } | |
72 | 72 | else throw("Invalid nft Id") | |
73 | 73 | } | |
74 | 74 | ||
75 | 75 | ||
76 | 76 | ||
77 | 77 | @Callable(i) | |
78 | 78 | func sendToVote (collectionId) = { | |
79 | 79 | let issuer = getCollectionIssuer(collectionId) | |
80 | 80 | if ((size(issuer) == 0)) | |
81 | 81 | then throw("Collection issuer not found") | |
82 | 82 | else if ((issuer != toString(i.caller))) | |
83 | 83 | then throw("Only the issuer can submit to the vote") | |
84 | 84 | else { | |
85 | 85 | let voteId = toBase58String(i.transactionId) | |
86 | 86 | [StringEntry((("collection_" + collectionId) + "_voteId"), voteId), StringEntry((("vote_" + voteId) + "_collectionId"), collectionId), StringEntry((("vote_" + voteId) + "_owner"), toString(i.caller)), IntegerEntry((("vote_" + voteId) + "_createdAt"), height)] | |
87 | 87 | } | |
88 | 88 | } | |
89 | 89 | ||
90 | 90 | ||
91 | 91 | ||
92 | 92 | @Callable(i) | |
93 | 93 | func removeFromVote (voteId) = { | |
94 | 94 | let collectionId = valueOrErrorMessage(getString((("vote_" + voteId) + "_collectionId")), "Collection Id not found") | |
95 | 95 | let owner = valueOrErrorMessage(getString((("vote_" + voteId) + "_owner")), "Owner not found") | |
96 | 96 | if ((owner != toString(i.caller))) | |
97 | 97 | then throw("You are not the owner") | |
98 | 98 | else [DeleteEntry((("collection_" + collectionId) + "_voteId")), DeleteEntry((("vote_" + voteId) + "_collectionId")), DeleteEntry((("vote_" + voteId) + "_owner")), DeleteEntry((("vote_" + voteId) + "_createdAt"))] | |
99 | 99 | } | |
100 | 100 | ||
101 | 101 | ||
102 | 102 | ||
103 | 103 | @Callable(i) | |
104 | 104 | func vote (voteId,type) = { | |
105 | 105 | let addressStr = toString(i.caller) | |
106 | 106 | let exist = match getString((("vote_" + voteId) + "_collectionId")) { | |
107 | 107 | case t: String => | |
108 | 108 | true | |
109 | 109 | case _ => | |
110 | 110 | false | |
111 | 111 | } | |
112 | - | let voterVoteKey = ((("voter_" + addressStr) + "_vote_") + voteId) | |
112 | + | let voterVoteKey = (((("voter_" + addressStr) + "_vote_") + voteId) + "_isVoted") | |
113 | + | let voterVoteTypeKey = (((("voter_" + addressStr) + "_vote_") + voteId) + "_type") | |
114 | + | let voterVotePowerKey = (((("voter_" + addressStr) + "_vote_") + voteId) + "_power") | |
113 | 115 | let voterVotesCountKey = (("voter_" + addressStr) + "_votesCount") | |
114 | 116 | let voterSpentPowerKey = (("voter_" + addressStr) + "_spentPower") | |
115 | 117 | let voteUpCountKey = (("vote_" + voteId) + "_upCount") | |
116 | 118 | let voteDownCountKey = (("vote_" + voteId) + "_downCount") | |
117 | 119 | let voteTotalCountKey = (("vote_" + voteId) + "_totalCount") | |
118 | 120 | let addressPower = valueOrErrorMessage(getInteger((("address_" + addressStr) + "_power")), "The address has no voting power") | |
119 | 121 | let totalCount = valueOrElse(getInteger(voteTotalCountKey), 0) | |
120 | 122 | let voterVotesCount = valueOrElse(getInteger(voterVotesCountKey), 0) | |
121 | 123 | let voterSpentPower = valueOrElse(getInteger(voterSpentPowerKey), 0) | |
122 | 124 | let voteChangeStates = if ((type == "up")) | |
123 | 125 | then { | |
124 | 126 | let upCount = valueOrElse(getInteger(voteUpCountKey), 0) | |
125 | 127 | [IntegerEntry(voteUpCountKey, (upCount + addressPower))] | |
126 | 128 | } | |
127 | 129 | else if ((type == "down")) | |
128 | 130 | then { | |
129 | 131 | let downCount = valueOrElse(getInteger(voteDownCountKey), 0) | |
130 | 132 | [IntegerEntry(voteDownCountKey, (downCount + addressPower))] | |
131 | 133 | } | |
132 | 134 | else throw("Invalid type") | |
133 | 135 | let isCallerVoted = valueOrElse(getBoolean(voterVoteKey), false) | |
134 | 136 | if (isCallerVoted) | |
135 | 137 | then throw("You have already voted") | |
136 | 138 | else if (!(exist)) | |
137 | 139 | then throw("Collection not found") | |
138 | - | else ([BooleanEntry(voterVoteKey, true), IntegerEntry(voterVotesCountKey, (voterVotesCount + 1)), IntegerEntry(voterSpentPowerKey, (voterSpentPower + addressPower)), IntegerEntry(voteTotalCountKey, (totalCount + addressPower))] ++ voteChangeStates) | |
140 | + | else ([BooleanEntry(voterVoteKey, true), StringEntry(voterVoteTypeKey, type), IntegerEntry(voterVotePowerKey, addressPower), IntegerEntry(voterVotesCountKey, (voterVotesCount + 1)), IntegerEntry(voterSpentPowerKey, (voterSpentPower + addressPower)), IntegerEntry(voteTotalCountKey, (totalCount + addressPower))] ++ voteChangeStates) | |
139 | 141 | } | |
140 | 142 | ||
141 | 143 | ||
142 | 144 | ||
143 | 145 | @Callable(i) | |
144 | - | func unvote (voteId | |
146 | + | func unvote (voteId) = { | |
145 | 147 | let addressStr = toString(i.caller) | |
146 | - | let voterVoteKey = ((("voter_" + addressStr) + "_vote_") + voteId) | |
148 | + | let voterVoteKey = (((("voter_" + addressStr) + "_vote_") + voteId) + "_isVoted") | |
149 | + | let voterVoteTypeKey = (((("voter_" + addressStr) + "_vote_") + voteId) + "_type") | |
150 | + | let voterVotePowerKey = (((("voter_" + addressStr) + "_vote_") + voteId) + "_power") | |
147 | 151 | let voterVotesCountKey = (("voter_" + addressStr) + "_votesCount") | |
148 | 152 | let voterSpentPowerKey = (("voter_" + addressStr) + "_spentPower") | |
149 | 153 | let voteUpCountKey = (("vote_" + voteId) + "_upCount") | |
150 | 154 | let voteDownCountKey = (("vote_" + voteId) + "_downCount") | |
151 | 155 | let voteTotalCountKey = (("vote_" + voteId) + "_totalCount") | |
152 | - | let addressPower = valueOrErrorMessage(getInteger((("address_" + addressStr) + "_power")), "The address has no voting power") | |
153 | - | let totalCount = valueOrElse(getInteger(voteTotalCountKey), 0) | |
154 | - | let voterVotesCount = valueOrElse(getInteger(voterVotesCountKey), 0) | |
155 | - | let voterSpentPower = valueOrElse(getInteger(voterSpentPowerKey), 0) | |
156 | - | let voteChangeStates = if ((type == "up")) | |
156 | + | let voteIdType = valueOrErrorMessage(getString(voterVoteTypeKey), "Vote Id type not founded") | |
157 | + | let voteIdPower = valueOrErrorMessage(getInteger(voterVotePowerKey), "Vote Id power not founded") | |
158 | + | let totalCount = valueOrErrorMessage(getInteger(voteTotalCountKey), "Vote Id total count not founded") | |
159 | + | let voterVotesCount = valueOrErrorMessage(getInteger(voterVotesCountKey), "Voter votes count value not founded") | |
160 | + | let voterSpentPower = valueOrErrorMessage(getInteger(voterSpentPowerKey), "Voter spent power value not founded") | |
161 | + | let voteChangeStates = if ((voteIdType == "up")) | |
157 | 162 | then { | |
158 | 163 | let upCount = valueOrElse(getInteger(voteUpCountKey), 0) | |
159 | - | [IntegerEntry(voteUpCountKey, (upCount - | |
164 | + | [IntegerEntry(voteUpCountKey, (upCount - voteIdPower))] | |
160 | 165 | } | |
161 | - | else if (( | |
166 | + | else if ((voteIdType == "down")) | |
162 | 167 | then { | |
163 | 168 | let downCount = valueOrElse(getInteger(voteDownCountKey), 0) | |
164 | - | [IntegerEntry(voteDownCountKey, (downCount - | |
169 | + | [IntegerEntry(voteDownCountKey, (downCount - voteIdPower))] | |
165 | 170 | } | |
166 | 171 | else throw("Invalid type") | |
167 | 172 | let isCallerVoted = valueOrElse(getBoolean(voterVoteKey), false) | |
168 | 173 | if (!(isCallerVoted)) | |
169 | 174 | then throw("You haven't voted yet") | |
170 | - | else ([DeleteEntry(voterVoteKey), IntegerEntry(voterVotesCountKey, (voterVotesCount - 1)), IntegerEntry(voterSpentPowerKey, (voterSpentPower - | |
175 | + | else ([DeleteEntry(voterVoteKey), IntegerEntry(voterVotesCountKey, (voterVotesCount - 1)), IntegerEntry(voterSpentPowerKey, (voterSpentPower - voteIdPower)), IntegerEntry(voteTotalCountKey, (totalCount - voteIdPower))] ++ voteChangeStates) | |
171 | 176 | } | |
172 | 177 | ||
173 | 178 | ||
174 | 179 | @Verifier(tx) | |
175 | 180 | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
176 | 181 |
github/deemru/w8io/786bc32 49.11 ms ◑