tx · FauhTV3t1uKipTbcvoFgNQJJeBu7ZNnSzhSCch6HpHzk 3P38c43ME7gAtDWoM9NqA6juRMzjF2Uxz3b: -0.01000000 Waves 2022.11.26 16:41 [3399611] smart account 3P38c43ME7gAtDWoM9NqA6juRMzjF2Uxz3b > SELF 0.00000000 Waves
{ "type": 13, "id": "FauhTV3t1uKipTbcvoFgNQJJeBu7ZNnSzhSCch6HpHzk", "fee": 1000000, "feeAssetId": null, "timestamp": 1669470130863, "version": 2, "chainId": 87, "sender": "3P38c43ME7gAtDWoM9NqA6juRMzjF2Uxz3b", "senderPublicKey": "736nx537Ug8JwwEykQDqQ4Grp4QqYmec6SfQ29hQkq4U", "proofs": [ "4WQnsci7uHuNkGRD4YMVWerkqyvuQGLjZmLLcughycEjpwx6BS6FuoAS9wyHt3iwHkjdhop4SvrLEGcfocACURd" ], "script": "base64:BgIXCAISAwoBCBIDCgEIEgASABIDCgEIEgAcARV0cnlHZXRJbnRlZ2VyRXh0ZXJuYWwCB2FkZHJlc3MDa2V5BAckbWF0Y2gwCQCaCAIFB2FkZHJlc3MFA2tleQMJAAECBQckbWF0Y2gwAgNJbnQEAWIFByRtYXRjaDAFAWIAAAEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCB2FkZHJlc3MDa2V5BAckbWF0Y2gwCQCdCAIFB2FkZHJlc3MFA2tleQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAFAWECAAENdHJ5R2V0Qm9vbGVhbgEDa2V5BAckbWF0Y2gwCQCgCAEFA2tleQMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAFiBQckbWF0Y2gwBQFiBwENdHJ5R2V0SW50ZWdlcgEDa2V5CQEVdHJ5R2V0SW50ZWdlckV4dGVybmFsAgUEdGhpcwUDa2V5AQx0cnlHZXRTdHJpbmcBA2tleQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgUEdGhpcwUDa2V5ARBnZXRWb3RlSGVpZ2h0S2V5AQppZGVudGlmaWVyCQCsAgICElZPVEVfSEVJR0hUX1NUQVJUXwUKaWRlbnRpZmllcgEKdG90YWxWb3RlZAEKaWRlbnRpZmllcgkArAICAg1BTU9VTlRfVk9URVNfBQppZGVudGlmaWVyAQ50b3RhbFByb2Nlc3NlZAEKaWRlbnRpZmllcgkArAICAhdBTU9VTlRfVk9URVNfUFJPQ0VTU0VEXwUKaWRlbnRpZmllcgEaZ2V0QWN0aXZlVm90ZUlkZW50aWZpZXJLZXkAAhdDVVJSRU5UX1ZPVEVfSURFTlRJRklFUgEOZ2V0RHVyYXRpb25LZXkAAg1WT1RFX0RVUkFUSU9OAQ9nZXRWb3RlUG93ZXJLZXkBB2FkZHJlc3MJAKwCAgkArAICAgV1c2VyXwUHYWRkcmVzcwILX3ZvdGUtcG93ZXIBG2dldFVzZXJWb3RlRm9ySWRlbnRpZmllcktleQIHYWRkcmVzcwppZGVudGlmaWVyCQCsAgIJAKwCAgkArAICCQCsAgICBXVzZXJfBQdhZGRyZXNzAgxfaWRlbnRpZmllcl8FCmlkZW50aWZpZXICBV92b3RlASBnZXRVc2VyUHJvY2Vzc2VkRm9ySWRlbnRpZmllcktleQIHYWRkcmVzcwppZGVudGlmaWVyCQCsAgIJAKwCAgkArAICCQCsAgICBXVzZXJfBQdhZGRyZXNzAgxfaWRlbnRpZmllcl8FCmlkZW50aWZpZXICCl9wcm9jZXNzZWQBIWdldFZvdGVzRm9ySWRlbnRpZmllckFuZE9wdGlvbktleQIKaWRlbnRpZmllcgZvcHRpb24JAKwCAgkArAICCQCsAgICDHRvdGFsX3ZvdGVzXwUKaWRlbnRpZmllcgIIX29wdGlvbl8FBm9wdGlvbgEJZ2V0T3JhY2xlAAkBB0FkZHJlc3MBCQDZBAEJAQx0cnlHZXRTdHJpbmcBAhRzdGF0aWNfb3JhY2xlQWRkcmVzcwENZ2V0RWdnQXNzZXRJZAAJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQACEXN0YXRpY19lZ2dBc3NldElkAQtnZXREdXJhdGlvbgADCQAAAgkBFXRyeUdldEludGVnZXJFeHRlcm5hbAIJAQlnZXRPcmFjbGUACQEOZ2V0RHVyYXRpb25LZXkAAAAAkE4JARV0cnlHZXRJbnRlZ2VyRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAkBDmdldER1cmF0aW9uS2V5AAENZ2V0Vm90ZUhlaWdodAEKaWRlbnRpZmllcgkBDXRyeUdldEludGVnZXIBCQEQZ2V0Vm90ZUhlaWdodEtleQEFCmlkZW50aWZpZXIBF2dldEFjdGl2ZVZvdGVJZGVudGlmaWVyAAkBDHRyeUdldFN0cmluZwEJARpnZXRBY3RpdmVWb3RlSWRlbnRpZmllcktleQABDGdldFZvdGVQb3dlcgEHYWRkcmVzcwkBDXRyeUdldEludGVnZXIBCQEPZ2V0Vm90ZVBvd2VyS2V5AQUHYWRkcmVzcwEQZ2V0VXNlclZvdGVQb3dlcgEHYWRkcmVzcwkBDXRyeUdldEludGVnZXIBCQEPZ2V0Vm90ZVBvd2VyS2V5AQUHYWRkcmVzcwEYZ2V0VXNlclZvdGVGb3JJZGVudGlmaWVyAgdhZGRyZXNzCmlkZW50aWZpZXIJAQx0cnlHZXRTdHJpbmcBCQEbZ2V0VXNlclZvdGVGb3JJZGVudGlmaWVyS2V5AgUHYWRkcmVzcwUKaWRlbnRpZmllcgENZ2V0VG90YWxWb3RlZAEKaWRlbnRpZmllcgkBDXRyeUdldEludGVnZXIBCQEKdG90YWxWb3RlZAEFCmlkZW50aWZpZXIBEWdldFRvdGFsUHJvY2Vzc2VkAQppZGVudGlmaWVyCQENdHJ5R2V0SW50ZWdlcgEJAQ50b3RhbFByb2Nlc3NlZAEFCmlkZW50aWZpZXIBHWdldFVzZXJQcm9jZXNzZWRGb3JJZGVudGlmaWVyAgdhZGRyZXNzCmlkZW50aWZpZXIJAQ10cnlHZXRCb29sZWFuAQkBIGdldFVzZXJQcm9jZXNzZWRGb3JJZGVudGlmaWVyS2V5AgUHYWRkcmVzcwUKaWRlbnRpZmllcgEeZ2V0Vm90ZXNGb3JJZGVudGlmaWVyQW5kT3B0aW9uAgppZGVudGlmaWVyBm9wdGlvbgkBDXRyeUdldEludGVnZXIBCQEhZ2V0Vm90ZXNGb3JJZGVudGlmaWVyQW5kT3B0aW9uS2V5AgUKaWRlbnRpZmllcgUGb3B0aW9uAQx2b3RlSXNBY3RpdmUABAppZGVudGlmaWVyCQEXZ2V0QWN0aXZlVm90ZUlkZW50aWZpZXIAAwkAAAIFCmlkZW50aWZpZXICAAcECnZvdGVIZWlnaHQJAQ1nZXRWb3RlSGVpZ2h0AQUKaWRlbnRpZmllcgkAZgIJAGQCBQp2b3RlSGVpZ2h0CQELZ2V0RHVyYXRpb24ABQZoZWlnaHQBDnZvdGVQcm9jZXNzaW5nAgFpBHZvdGUDCQEBIQEJAQx2b3RlSXNBY3RpdmUACQACAQIhRlZQOiBObyB2b3RlIGlzIGN1cnJlbnRseSBydW5uaW5nBAppZGVudGlmaWVyCQEXZ2V0QWN0aXZlVm90ZUlkZW50aWZpZXIABAZmcFVzZXIJARBnZXRVc2VyVm90ZVBvd2VyAQkApQgBCAUBaQZjYWxsZXIDCQAAAgUGZnBVc2VyAAAJAAIBAiNGVlA6IFBsZWFzZSBzdGFrZSBzb21lIGR1Y2tzIGZpcnN0IQQHb2xkVm90ZQkBGGdldFVzZXJWb3RlRm9ySWRlbnRpZmllcgIJAKUIAQgFAWkGY2FsbGVyBQppZGVudGlmaWVyBAt1bmlxdWVWb3RlcwMJAAACBQdvbGRWb3RlAgAJAGQCCQENZ2V0VG90YWxWb3RlZAEFCmlkZW50aWZpZXIAAQkBDWdldFRvdGFsVm90ZWQBBQppZGVudGlmaWVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEKdG90YWxWb3RlZAEFCmlkZW50aWZpZXIFC3VuaXF1ZVZvdGVzCQDMCAIJAQtTdHJpbmdFbnRyeQIJARtnZXRVc2VyVm90ZUZvcklkZW50aWZpZXJLZXkCCQClCAEIBQFpBmNhbGxlcgUKaWRlbnRpZmllcgkApQMBBQR2b3RlBQNuaWwGAWkBD2NvbmZpZ3VyZU9yYWNsZQEGb3JhY2xlAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIPUkNPOiBhZG1pbiBvbmx5CQDMCAIJAQtTdHJpbmdFbnRyeQICFHN0YXRpY19vcmFjbGVBZGRyZXNzBQZvcmFjbGUFA25pbAFpAQlzdGFydFZvdGUBCmlkZW50aWZpZXIDCQECIT0CCAUBaQZjYWxsZXIJAQlnZXRPcmFjbGUACQACAQkArAICCQCsAgIJAKwCAgIuRVNWOiBPbmx5IHRoZSBhZG1pbiBjYW4gc3RhcnQgYSB2b3RlIGZvciBub3chIAkApQgBCAUBaQZjYWxsZXICASAJAKUIAQkBCWdldE9yYWNsZQADCQEMdm90ZUlzQWN0aXZlAAkAAgECJUNTVjogVGhlcmUgaXMgYWxyZWFkeSBhIHZvdGUgcnVubmluZyEJAMwIAgkBC1N0cmluZ0VudHJ5AgIXQ1VSUkVOVF9WT1RFX0lERU5USUZJRVIFCmlkZW50aWZpZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgISVk9URV9IRUlHSFRfU1RBUlRfBQppZGVudGlmaWVyBQZoZWlnaHQFA25pbAFpAQd2b3RlWWVzAAkBDnZvdGVQcm9jZXNzaW5nAgUBaQYBaQEGdm90ZU5vAAkBDnZvdGVQcm9jZXNzaW5nAgUBaQcBaQEOY2FsY3VsYXRlVm90ZXMBB3dhbGxldHMECmlkZW50aWZpZXIJARdnZXRBY3RpdmVWb3RlSWRlbnRpZmllcgADCQAAAgUKaWRlbnRpZmllcgIACQACAQIcRkNWOiBObyBhY3RpdmUgdm90ZSBydW5uaW5nIQQKdm90ZUhlaWdodAkBDWdldFZvdGVIZWlnaHQBBQppZGVudGlmaWVyAwkAZgIJAGQCBQp2b3RlSGVpZ2h0CQELZ2V0RHVyYXRpb24ABQZoZWlnaHQJAAIBAh5GRlY6IFZvdGUgaXMgbm90IGZpbmlzaGVkIHlldCEEC3dhbGxldHNMaXN0CQC1CQIFB3dhbGxldHMCATsKAQxoYW5kbGVWb3RlcnMCA2FjYwV2b3RlcgQEdXNlcgUFdm90ZXIDCQEdZ2V0VXNlclByb2Nlc3NlZEZvcklkZW50aWZpZXICBQR1c2VyBQppZGVudGlmaWVyCQACAQkArAICCQCsAgICBUZDVjogBQR1c2VyAhYgaXMgYWxyZWFkeSBwcm9jZXNzZWQhBAZ1c2VyRlAJARBnZXRVc2VyVm90ZVBvd2VyAQUEdXNlcgQEdm90ZQkBGGdldFVzZXJWb3RlRm9ySWRlbnRpZmllcgIFBHVzZXIFCmlkZW50aWZpZXIDCQAAAgUEdm90ZQIACQACAQkArAICCQCsAgICBUZDVjogBQR1c2VyAg4gZGlkIG5vdCB2b3RlIQQHdm90ZUtleQkBIWdldFZvdGVzRm9ySWRlbnRpZmllckFuZE9wdGlvbktleQIFCmlkZW50aWZpZXIFBHZvdGUEB3ZvdGVTVW0DCQAAAgUEdm90ZQIEdHJ1ZQkAZAIIBQNhY2MCXzIFBnVzZXJGUAkAZAIIBQNhY2MCXzMFBnVzZXJGUAMJAAACBQd2b3RlU1VtBQd2b3RlU1VtCQDOCAIIBQNhY2MCXzEJAMwIAgkBDEJvb2xlYW5FbnRyeQIJASBnZXRVc2VyUHJvY2Vzc2VkRm9ySWRlbnRpZmllcktleQIFBHVzZXIFCmlkZW50aWZpZXIGBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4EBnJlc3VsdAoAAiRsBQt3YWxsZXRzTGlzdAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwUDbmlsCQEeZ2V0Vm90ZXNGb3JJZGVudGlmaWVyQW5kT3B0aW9uAgUKaWRlbnRpZmllcgIEdHJ1ZQkBHmdldFZvdGVzRm9ySWRlbnRpZmllckFuZE9wdGlvbgIFCmlkZW50aWZpZXICBWZhbHNlCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQxoYW5kbGVWb3RlcnMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAQRbmV3VG90YWxQcm9jZXNzZWQJAGQCCQERZ2V0VG90YWxQcm9jZXNzZWQBBQppZGVudGlmaWVyCQCQAwEFC3dhbGxldHNMaXN0CQDOCAIIBQZyZXN1bHQCXzEJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ50b3RhbFByb2Nlc3NlZAEFCmlkZW50aWZpZXIFEW5ld1RvdGFsUHJvY2Vzc2VkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEhZ2V0Vm90ZXNGb3JJZGVudGlmaWVyQW5kT3B0aW9uS2V5AgUKaWRlbnRpZmllcgIEdHJ1ZQgFBnJlc3VsdAJfMgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBIWdldFZvdGVzRm9ySWRlbnRpZmllckFuZE9wdGlvbktleQIFCmlkZW50aWZpZXICBWZhbHNlCAUGcmVzdWx0Al8zBQNuaWwBaQEMZmluYWxpemVWb3RlAAQKaWRlbnRpZmllcgkBF2dldEFjdGl2ZVZvdGVJZGVudGlmaWVyAAMJAAACBQppZGVudGlmaWVyAgAJAAIBAhxGRlY6IE5vIGFjdGl2ZSB2b3RlIHJ1bm5pbmchBAp2b3RlSGVpZ2h0CQENZ2V0Vm90ZUhlaWdodAEFCmlkZW50aWZpZXIDCQBmAgkAZAIFCnZvdGVIZWlnaHQJAQtnZXREdXJhdGlvbgAFBmhlaWdodAkAAgECHkZGVjogVm90ZSBpcyBub3QgZmluaXNoZWQgeWV0IQQKZmluaXNoVm90ZQkAAAIJARFnZXRUb3RhbFByb2Nlc3NlZAEFCmlkZW50aWZpZXIJAQ1nZXRUb3RhbFZvdGVkAQUKaWRlbnRpZmllcgMJAQEhAQUKZmluaXNoVm90ZQkAAgECHUZGVjogVm90ZSBpcyBub3QgY291bnRlZCB5ZXQhBAZyZXN1bHQJAGYCCQEeZ2V0Vm90ZXNGb3JJZGVudGlmaWVyQW5kT3B0aW9uAgUKaWRlbnRpZmllcgIEdHJ1ZQkBHmdldFZvdGVzRm9ySWRlbnRpZmllckFuZE9wdGlvbgIFCmlkZW50aWZpZXICBWZhbHNlCQDMCAIJAQtEZWxldGVFbnRyeQEJARpnZXRBY3RpdmVWb3RlSWRlbnRpZmllcktleQAJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICAgdSRVNVTFRfBQppZGVudGlmaWVyCQClAwEFBnJlc3VsdAUDbmlsAGcoYDM=", "height": 3399611, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: FEXUm49QDeJrV5y4i6MdWE3Jzy1bPF1p5tY5bvQZoum1 Next: E11H3hHudnqg3kuujnqoxevaiS9iYMgU87vX7htH4c8k Diff:
Old | New | Differences | |
---|---|---|---|
172 | 172 | then throw((("FCV: " + user) + " did not vote!")) | |
173 | 173 | else { | |
174 | 174 | let voteKey = getVotesForIdentifierAndOptionKey(identifier, vote) | |
175 | - | let currentVoteAmount = getVotesForIdentifierAndOption(identifier, vote) | |
176 | - | (acc ++ [BooleanEntry(getUserProcessedForIdentifierKey(user, identifier), true), IntegerEntry(voteKey, (currentVoteAmount + userFP))]) | |
175 | + | let voteSUm = if ((vote == "true")) | |
176 | + | then (acc._2 + userFP) | |
177 | + | else (acc._3 + userFP) | |
178 | + | if ((voteSUm == voteSUm)) | |
179 | + | then (acc._1 ++ [BooleanEntry(getUserProcessedForIdentifierKey(user, identifier), true)]) | |
180 | + | else throw("Strict value is not equal to itself.") | |
177 | 181 | } | |
178 | 182 | } | |
179 | 183 | } | |
181 | 185 | let result = { | |
182 | 186 | let $l = walletsList | |
183 | 187 | let $s = size($l) | |
184 | - | let $acc0 = nil | |
188 | + | let $acc0 = $Tuple3(nil, getVotesForIdentifierAndOption(identifier, "true"), getVotesForIdentifierAndOption(identifier, "false")) | |
185 | 189 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
186 | 190 | then $a | |
187 | 191 | else handleVoters($a, $l[$i]) | |
193 | 197 | $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($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), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20) | |
194 | 198 | } | |
195 | 199 | let newTotalProcessed = (getTotalProcessed(identifier) + size(walletsList)) | |
196 | - | (result ++ [IntegerEntry(totalProcessed(identifier), newTotalProcessed)]) | |
200 | + | (result._1 ++ [IntegerEntry(totalProcessed(identifier), newTotalProcessed), IntegerEntry(getVotesForIdentifierAndOptionKey(identifier, "true"), result._2), IntegerEntry(getVotesForIdentifierAndOptionKey(identifier, "false"), result._3)]) | |
197 | 201 | } | |
198 | 202 | } | |
199 | 203 | } |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | func tryGetIntegerExternal (address,key) = match getInteger(address, key) { | |
5 | 5 | case b: Int => | |
6 | 6 | b | |
7 | 7 | case _ => | |
8 | 8 | 0 | |
9 | 9 | } | |
10 | 10 | ||
11 | 11 | ||
12 | 12 | func tryGetStringExternal (address,key) = match getString(address, key) { | |
13 | 13 | case a: String => | |
14 | 14 | a | |
15 | 15 | case _ => | |
16 | 16 | "" | |
17 | 17 | } | |
18 | 18 | ||
19 | 19 | ||
20 | 20 | func tryGetBoolean (key) = match getBoolean(key) { | |
21 | 21 | case b: Boolean => | |
22 | 22 | b | |
23 | 23 | case _ => | |
24 | 24 | false | |
25 | 25 | } | |
26 | 26 | ||
27 | 27 | ||
28 | 28 | func tryGetInteger (key) = tryGetIntegerExternal(this, key) | |
29 | 29 | ||
30 | 30 | ||
31 | 31 | func tryGetString (key) = tryGetStringExternal(this, key) | |
32 | 32 | ||
33 | 33 | ||
34 | 34 | func getVoteHeightKey (identifier) = ("VOTE_HEIGHT_START_" + identifier) | |
35 | 35 | ||
36 | 36 | ||
37 | 37 | func totalVoted (identifier) = ("AMOUNT_VOTES_" + identifier) | |
38 | 38 | ||
39 | 39 | ||
40 | 40 | func totalProcessed (identifier) = ("AMOUNT_VOTES_PROCESSED_" + identifier) | |
41 | 41 | ||
42 | 42 | ||
43 | 43 | func getActiveVoteIdentifierKey () = "CURRENT_VOTE_IDENTIFIER" | |
44 | 44 | ||
45 | 45 | ||
46 | 46 | func getDurationKey () = "VOTE_DURATION" | |
47 | 47 | ||
48 | 48 | ||
49 | 49 | func getVotePowerKey (address) = (("user_" + address) + "_vote-power") | |
50 | 50 | ||
51 | 51 | ||
52 | 52 | func getUserVoteForIdentifierKey (address,identifier) = (((("user_" + address) + "_identifier_") + identifier) + "_vote") | |
53 | 53 | ||
54 | 54 | ||
55 | 55 | func getUserProcessedForIdentifierKey (address,identifier) = (((("user_" + address) + "_identifier_") + identifier) + "_processed") | |
56 | 56 | ||
57 | 57 | ||
58 | 58 | func getVotesForIdentifierAndOptionKey (identifier,option) = ((("total_votes_" + identifier) + "_option_") + option) | |
59 | 59 | ||
60 | 60 | ||
61 | 61 | func getOracle () = Address(fromBase58String(tryGetString("static_oracleAddress"))) | |
62 | 62 | ||
63 | 63 | ||
64 | 64 | func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), "static_eggAssetId")) | |
65 | 65 | ||
66 | 66 | ||
67 | 67 | func getDuration () = if ((tryGetIntegerExternal(getOracle(), getDurationKey()) == 0)) | |
68 | 68 | then 10000 | |
69 | 69 | else tryGetIntegerExternal(getOracle(), getDurationKey()) | |
70 | 70 | ||
71 | 71 | ||
72 | 72 | func getVoteHeight (identifier) = tryGetInteger(getVoteHeightKey(identifier)) | |
73 | 73 | ||
74 | 74 | ||
75 | 75 | func getActiveVoteIdentifier () = tryGetString(getActiveVoteIdentifierKey()) | |
76 | 76 | ||
77 | 77 | ||
78 | 78 | func getVotePower (address) = tryGetInteger(getVotePowerKey(address)) | |
79 | 79 | ||
80 | 80 | ||
81 | 81 | func getUserVotePower (address) = tryGetInteger(getVotePowerKey(address)) | |
82 | 82 | ||
83 | 83 | ||
84 | 84 | func getUserVoteForIdentifier (address,identifier) = tryGetString(getUserVoteForIdentifierKey(address, identifier)) | |
85 | 85 | ||
86 | 86 | ||
87 | 87 | func getTotalVoted (identifier) = tryGetInteger(totalVoted(identifier)) | |
88 | 88 | ||
89 | 89 | ||
90 | 90 | func getTotalProcessed (identifier) = tryGetInteger(totalProcessed(identifier)) | |
91 | 91 | ||
92 | 92 | ||
93 | 93 | func getUserProcessedForIdentifier (address,identifier) = tryGetBoolean(getUserProcessedForIdentifierKey(address, identifier)) | |
94 | 94 | ||
95 | 95 | ||
96 | 96 | func getVotesForIdentifierAndOption (identifier,option) = tryGetInteger(getVotesForIdentifierAndOptionKey(identifier, option)) | |
97 | 97 | ||
98 | 98 | ||
99 | 99 | func voteIsActive () = { | |
100 | 100 | let identifier = getActiveVoteIdentifier() | |
101 | 101 | if ((identifier == "")) | |
102 | 102 | then false | |
103 | 103 | else { | |
104 | 104 | let voteHeight = getVoteHeight(identifier) | |
105 | 105 | ((voteHeight + getDuration()) > height) | |
106 | 106 | } | |
107 | 107 | } | |
108 | 108 | ||
109 | 109 | ||
110 | 110 | func voteProcessing (i,vote) = if (!(voteIsActive())) | |
111 | 111 | then throw("FVP: No vote is currently running") | |
112 | 112 | else { | |
113 | 113 | let identifier = getActiveVoteIdentifier() | |
114 | 114 | let fpUser = getUserVotePower(toString(i.caller)) | |
115 | 115 | if ((fpUser == 0)) | |
116 | 116 | then throw("FVP: Please stake some ducks first!") | |
117 | 117 | else { | |
118 | 118 | let oldVote = getUserVoteForIdentifier(toString(i.caller), identifier) | |
119 | 119 | let uniqueVotes = if ((oldVote == "")) | |
120 | 120 | then (getTotalVoted(identifier) + 1) | |
121 | 121 | else getTotalVoted(identifier) | |
122 | 122 | [IntegerEntry(totalVoted(identifier), uniqueVotes), StringEntry(getUserVoteForIdentifierKey(toString(i.caller), identifier), toString(vote))] | |
123 | 123 | } | |
124 | 124 | } | |
125 | 125 | ||
126 | 126 | ||
127 | 127 | @Callable(i) | |
128 | 128 | func configureOracle (oracle) = if ((i.caller != this)) | |
129 | 129 | then throw("RCO: admin only") | |
130 | 130 | else [StringEntry("static_oracleAddress", oracle)] | |
131 | 131 | ||
132 | 132 | ||
133 | 133 | ||
134 | 134 | @Callable(i) | |
135 | 135 | func startVote (identifier) = if ((i.caller != getOracle())) | |
136 | 136 | then throw(((("ESV: Only the admin can start a vote for now! " + toString(i.caller)) + " ") + toString(getOracle()))) | |
137 | 137 | else if (voteIsActive()) | |
138 | 138 | then throw("CSV: There is already a vote running!") | |
139 | 139 | else [StringEntry("CURRENT_VOTE_IDENTIFIER", identifier), IntegerEntry(("VOTE_HEIGHT_START_" + identifier), height)] | |
140 | 140 | ||
141 | 141 | ||
142 | 142 | ||
143 | 143 | @Callable(i) | |
144 | 144 | func voteYes () = voteProcessing(i, true) | |
145 | 145 | ||
146 | 146 | ||
147 | 147 | ||
148 | 148 | @Callable(i) | |
149 | 149 | func voteNo () = voteProcessing(i, false) | |
150 | 150 | ||
151 | 151 | ||
152 | 152 | ||
153 | 153 | @Callable(i) | |
154 | 154 | func calculateVotes (wallets) = { | |
155 | 155 | let identifier = getActiveVoteIdentifier() | |
156 | 156 | if ((identifier == "")) | |
157 | 157 | then throw("FCV: No active vote running!") | |
158 | 158 | else { | |
159 | 159 | let voteHeight = getVoteHeight(identifier) | |
160 | 160 | if (((voteHeight + getDuration()) > height)) | |
161 | 161 | then throw("FFV: Vote is not finished yet!") | |
162 | 162 | else { | |
163 | 163 | let walletsList = split(wallets, ";") | |
164 | 164 | func handleVoters (acc,voter) = { | |
165 | 165 | let user = voter | |
166 | 166 | if (getUserProcessedForIdentifier(user, identifier)) | |
167 | 167 | then throw((("FCV: " + user) + " is already processed!")) | |
168 | 168 | else { | |
169 | 169 | let userFP = getUserVotePower(user) | |
170 | 170 | let vote = getUserVoteForIdentifier(user, identifier) | |
171 | 171 | if ((vote == "")) | |
172 | 172 | then throw((("FCV: " + user) + " did not vote!")) | |
173 | 173 | else { | |
174 | 174 | let voteKey = getVotesForIdentifierAndOptionKey(identifier, vote) | |
175 | - | let currentVoteAmount = getVotesForIdentifierAndOption(identifier, vote) | |
176 | - | (acc ++ [BooleanEntry(getUserProcessedForIdentifierKey(user, identifier), true), IntegerEntry(voteKey, (currentVoteAmount + userFP))]) | |
175 | + | let voteSUm = if ((vote == "true")) | |
176 | + | then (acc._2 + userFP) | |
177 | + | else (acc._3 + userFP) | |
178 | + | if ((voteSUm == voteSUm)) | |
179 | + | then (acc._1 ++ [BooleanEntry(getUserProcessedForIdentifierKey(user, identifier), true)]) | |
180 | + | else throw("Strict value is not equal to itself.") | |
177 | 181 | } | |
178 | 182 | } | |
179 | 183 | } | |
180 | 184 | ||
181 | 185 | let result = { | |
182 | 186 | let $l = walletsList | |
183 | 187 | let $s = size($l) | |
184 | - | let $acc0 = nil | |
188 | + | let $acc0 = $Tuple3(nil, getVotesForIdentifierAndOption(identifier, "true"), getVotesForIdentifierAndOption(identifier, "false")) | |
185 | 189 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
186 | 190 | then $a | |
187 | 191 | else handleVoters($a, $l[$i]) | |
188 | 192 | ||
189 | 193 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
190 | 194 | then $a | |
191 | 195 | else throw("List size exceeds 20") | |
192 | 196 | ||
193 | 197 | $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($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), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20) | |
194 | 198 | } | |
195 | 199 | let newTotalProcessed = (getTotalProcessed(identifier) + size(walletsList)) | |
196 | - | (result ++ [IntegerEntry(totalProcessed(identifier), newTotalProcessed)]) | |
200 | + | (result._1 ++ [IntegerEntry(totalProcessed(identifier), newTotalProcessed), IntegerEntry(getVotesForIdentifierAndOptionKey(identifier, "true"), result._2), IntegerEntry(getVotesForIdentifierAndOptionKey(identifier, "false"), result._3)]) | |
197 | 201 | } | |
198 | 202 | } | |
199 | 203 | } | |
200 | 204 | ||
201 | 205 | ||
202 | 206 | ||
203 | 207 | @Callable(i) | |
204 | 208 | func finalizeVote () = { | |
205 | 209 | let identifier = getActiveVoteIdentifier() | |
206 | 210 | if ((identifier == "")) | |
207 | 211 | then throw("FFV: No active vote running!") | |
208 | 212 | else { | |
209 | 213 | let voteHeight = getVoteHeight(identifier) | |
210 | 214 | if (((voteHeight + getDuration()) > height)) | |
211 | 215 | then throw("FFV: Vote is not finished yet!") | |
212 | 216 | else { | |
213 | 217 | let finishVote = (getTotalProcessed(identifier) == getTotalVoted(identifier)) | |
214 | 218 | if (!(finishVote)) | |
215 | 219 | then throw("FFV: Vote is not counted yet!") | |
216 | 220 | else { | |
217 | 221 | let result = (getVotesForIdentifierAndOption(identifier, "true") > getVotesForIdentifierAndOption(identifier, "false")) | |
218 | 222 | [DeleteEntry(getActiveVoteIdentifierKey()), StringEntry(("RESULT_" + identifier), toString(result))] | |
219 | 223 | } | |
220 | 224 | } | |
221 | 225 | } | |
222 | 226 | } | |
223 | 227 | ||
224 | 228 |
github/deemru/w8io/3ef1775 37.37 ms ◑