tx · 4uyQG26L8DS9xHuToj1YnTDvgkgELmg7Nm7osZV1J9Tk

3N2Gaubi51KGxUWyg36Q6sEon8nSKK3YmLK:  -0.01000000 Waves

2023.05.26 12:46 [2594783] smart account 3N2Gaubi51KGxUWyg36Q6sEon8nSKK3YmLK > SELF 0.00000000 Waves

{ "type": 13, "id": "4uyQG26L8DS9xHuToj1YnTDvgkgELmg7Nm7osZV1J9Tk", "fee": 1000000, "feeAssetId": null, "timestamp": 1685094303206, "version": 2, "chainId": 84, "sender": "3N2Gaubi51KGxUWyg36Q6sEon8nSKK3YmLK", "senderPublicKey": "GLYPQRdW58KJs72SRSnkiA5EswHHd3SpyBVb7exXreYE", "proofs": [], "script": "base64:BgIHCAISAwoBCBwAA1NFUAICX18AEGNvbnRyYWN0RmlsZW5hbWUCDXRyZWFzdXJ5LnJpZGUAD0FETUlOX0xJU1RfU0laRQAFAAZRVU9SVU0AAwARVFhJRF9CWVRFU19MRU5HVEgAIAEHd3JhcEVycgEBcwkArAICCQCsAgIFEGNvbnRyYWN0RmlsZW5hbWUCAjogBQFzAQh0aHJvd0VycgEBcwkAAgEJAQd3cmFwRXJyAQUBcwEYa2V5QWxsb3dlZFR4SWRWb3RlUHJlZml4AQR0eElkCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICCWFsbG93VHhJZAkAzAgCBQR0eElkBQNuaWwFA1NFUAEQa2V5RnVsbEFkbWluVm90ZQIGcHJlZml4DGFkbWluQWRkcmVzcwkAuQkCCQDMCAIFBnByZWZpeAkAzAgCBQxhZG1pbkFkZHJlc3MFA25pbAUDU0VQARNrZXlBZG1pbkFkZHJlc3NMaXN0AAkAuQkCCQDMCAICAiVzCQDMCAICEGFkbWluQWRkcmVzc0xpc3QFA25pbAUDU0VQAQ5rZXlBbGxvd2VkVHhJZAAJALkJAgkAzAgCAgIlcwkAzAgCAgR0eElkBQNuaWwFA1NFUAEQa2V5Q29uZmlnQWRkcmVzcwACCiVzX19jb25maWcBFmtleVZvdGluZ1Jlc3VsdEFkZHJlc3MAAhZjb250cmFjdF92b3RpbmdfcmVzdWx0ARlrZXlQcm9wb3NhbEFsbG93QnJvYWRjYXN0AgdhZGRyZXNzBHR4SWQJAKwCAgkArAICCQCsAgICGXByb3Bvc2FsX2FsbG93X2Jyb2FkY2FzdF8JAKUIAQUHYWRkcmVzcwIBXwkA2AQBBQR0eElkABNjb25maWdBZGRyZXNzT3B0aW9uBAckbWF0Y2gwCQCdCAIFBHRoaXMJARBrZXlDb25maWdBZGRyZXNzAAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJAKYIAQUBcwMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IADWNvbmZpZ0FkZHJlc3MJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgUTY29uZmlnQWRkcmVzc09wdGlvbgkBB3dyYXBFcnIBAhZpbnZhbGlkIGNvbmZpZyBhZGRyZXNzABp2b3RpbmdSZXN1bHRDb250cmFjdE9wdGlvbgQHJG1hdGNoMAUTY29uZmlnQWRkcmVzc09wdGlvbgMJAAECBQckbWF0Y2gwAgdBZGRyZXNzBAFhBQckbWF0Y2gwBAckbWF0Y2gxCQCdCAIFAWEJARZrZXlWb3RpbmdSZXN1bHRBZGRyZXNzAAMJAAECBQckbWF0Y2gxAgZTdHJpbmcEAXMFByRtYXRjaDEJAKYIAQUBcwMJAAECBQckbWF0Y2gxAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yABR2b3RpbmdSZXN1bHRDb250cmFjdAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCBRp2b3RpbmdSZXN1bHRDb250cmFjdE9wdGlvbgkBB3dyYXBFcnIBAh1pbnZhbGlkIHZvdGluZyByZXN1bHQgYWRkcmVzcwEMZ2V0QWRtaW5Wb3RlAgZwcmVmaXgFYWRtaW4EB3ZvdGVLZXkJARBrZXlGdWxsQWRtaW5Wb3RlAgUGcHJlZml4BQVhZG1pbgkBC3ZhbHVlT3JFbHNlAgkAnwgBBQd2b3RlS2V5AAABDWdldEFkbWluc0xpc3QABAckbWF0Y2gwCQCdCAIFBHRoaXMJARNrZXlBZG1pbkFkZHJlc3NMaXN0AAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJALUJAgUBcwUDU0VQBQNuaWwBDWlzSW5BZG1pbkxpc3QBB2FkZHJlc3MJAQ9jb250YWluc0VsZW1lbnQCCQENZ2V0QWRtaW5zTGlzdAAFB2FkZHJlc3MBEmdlblZvdGVzS2V5c0hlbHBlcgIBYQxhZG1pbkFkZHJlc3MECyR0MDIwMjAyMDQ0BQFhBAZyZXN1bHQIBQskdDAyMDIwMjA0NAJfMQQGcHJlZml4CAULJHQwMjAyMDIwNDQCXzIJAJQKAgkAzQgCBQZyZXN1bHQJARBrZXlGdWxsQWRtaW5Wb3RlAgUGcHJlZml4BQxhZG1pbkFkZHJlc3MFBnByZWZpeAEMZ2VuVm90ZXNLZXlzAQlrZXlQcmVmaXgECWFkbWluTGlzdAkBE2tleUFkbWluQWRkcmVzc0xpc3QABAskdDAyMTkxMjI3NQoAAiRsCQENZ2V0QWRtaW5zTGlzdAAKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAUJa2V5UHJlZml4CgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARJnZW5Wb3Rlc0tleXNIZWxwZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFBAZyZXN1bHQIBQskdDAyMTkxMjI3NQJfMQQGcHJlZml4CAULJHQwMjE5MTIyNzUCXzIFBnJlc3VsdAEQY291bnRWb3Rlc0hlbHBlcgIGcmVzdWx0B3ZvdGVLZXkJAGQCBQZyZXN1bHQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUHdm90ZUtleQAAAQpjb3VudFZvdGVzAQZwcmVmaXgEBXZvdGVzCQEMZ2VuVm90ZXNLZXlzAQUGcHJlZml4CgACJGwFBXZvdGVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARBjb3VudFZvdGVzSGVscGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQEQY2xlYXJWb3Rlc0hlbHBlcgIGcmVzdWx0A2tleQkAzQgCBQZyZXN1bHQJAQtEZWxldGVFbnRyeQEFA2tleQETZ2V0Q2xlYXJWb3RlRW50cmllcwEGcHJlZml4BAV2b3RlcwkBDGdlblZvdGVzS2V5cwEFBnByZWZpeAoAAiRsBQV2b3RlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEQY2xlYXJWb3Rlc0hlbHBlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUBDHZvdGVJTlRFUk5BTAQTY2FsbGVyQWRkcmVzc1N0cmluZwlrZXlQcmVmaXgIbWluVm90ZXMKdm90ZVJlc3VsdAQHdm90ZUtleQkBEGtleUZ1bGxBZG1pblZvdGUCBQlrZXlQcmVmaXgFE2NhbGxlckFkZHJlc3NTdHJpbmcEEGFkbWluQ3VycmVudFZvdGUJAQxnZXRBZG1pblZvdGUCBQlrZXlQcmVmaXgFE2NhbGxlckFkZHJlc3NTdHJpbmcEA2VycgMJAQEhAQkBDWlzSW5BZG1pbkxpc3QBBRNjYWxsZXJBZGRyZXNzU3RyaW5nCQEIdGhyb3dFcnIBCQCsAgIJAKwCAgIJQWRkcmVzczogBRNjYWxsZXJBZGRyZXNzU3RyaW5nAhIgbm90IGluIEFkbWluIGxpc3QDCQAAAgUQYWRtaW5DdXJyZW50Vm90ZQABCQEIdGhyb3dFcnIBCQCsAgIFB3ZvdGVLZXkCEiB5b3UgYWxyZWFkeSB2b3RlZAUEdW5pdAMJAAACBQNlcnIFA2VycgQFdm90ZXMJAQpjb3VudFZvdGVzAQUJa2V5UHJlZml4AwkAZwIJAGQCBQV2b3RlcwABBQhtaW5Wb3RlcwQQY2xlYXJWb3RlRW50cmllcwkBE2dldENsZWFyVm90ZUVudHJpZXMBBQlrZXlQcmVmaXgJAM4IAgUQY2xlYXJWb3RlRW50cmllcwUKdm90ZVJlc3VsdAkAzAgCCQEMSW50ZWdlckVudHJ5AgUHdm90ZUtleQABBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAWkBC3ZvdGVGb3JUeElkAQR0eElkBBNjYWxsZXJBZGRyZXNzU3RyaW5nCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMECWtleVByZWZpeAkBGGtleUFsbG93ZWRUeElkVm90ZVByZWZpeAEFBHR4SWQEBnJlc3VsdAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5QWxsb3dlZFR4SWQABQR0eElkBQNuaWwEEWFsbG93ZWRUeElkT3B0aW9uCQCdCAIFBHRoaXMJAQ5rZXlBbGxvd2VkVHhJZAAEA2VycgkAzAgCAwkAAAIJAMgBAQkA2QQBBQR0eElkBRFUWElEX0JZVEVTX0xFTkdUSAYJAQh0aHJvd0VycgEJAKwCAgUEdHhJZAISIGlzIG5vdCB2YWxpZCB0eElkCQDMCAIDAwkAAAIFEWFsbG93ZWRUeElkT3B0aW9uBQR1bml0BgkBAiE9AgkBBXZhbHVlAQURYWxsb3dlZFR4SWRPcHRpb24FBHR4SWQGCQEIdGhyb3dFcnIBCQCsAgIFBHR4SWQCEyBpcyBhbHJlYWR5IGFsbG93ZWQFA25pbAMJAAACBQNlcnIFA2VycgkBDHZvdGVJTlRFUk5BTAQFE2NhbGxlckFkZHJlc3NTdHJpbmcFCWtleVByZWZpeAUGUVVPUlVNBQZyZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABBdhbGxvd2VkVHhJZFN0cmluZ09wdGlvbgkAoggBCQEOa2V5QWxsb3dlZFR4SWQABBBjdXJyZW50QWRtaW5MaXN0CQENZ2V0QWRtaW5zTGlzdAAECmJ5UHJvcG9zYWwJAQt2YWx1ZU9yRWxzZQIJAJsIAgUUdm90aW5nUmVzdWx0Q29udHJhY3QJARlrZXlQcm9wb3NhbEFsbG93QnJvYWRjYXN0AgUEdGhpcwgFAnR4AmlkBwQIYnlBZG1pbnMDCQECIT0CBRdhbGxvd2VkVHhJZFN0cmluZ09wdGlvbgUEdW5pdAkAAAIIBQJ0eAJpZAkA2QQBCQEFdmFsdWUBBRdhbGxvd2VkVHhJZFN0cmluZ09wdGlvbgcEB2J5T3duZXIJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXkDAwkBAiE9AgUTY29uZmlnQWRkcmVzc09wdGlvbgUEdW5pdAkAAAIJAJADAQUQY3VycmVudEFkbWluTGlzdAUPQURNSU5fTElTVF9TSVpFBwMDCQECIT0CBRp2b3RpbmdSZXN1bHRDb250cmFjdE9wdGlvbgUEdW5pdAUKYnlQcm9wb3NhbAcGBQhieUFkbWlucwUHYnlPd25lcu4IJF8=", "height": 2594783, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3p6xYjwdz1o5X9G1NN9EKwbAR4KDacjVsBugtYE2aMah Next: none Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let contractFilename = "treasury.ride"
77
88 let ADMIN_LIST_SIZE = 5
99
1010 let QUORUM = 3
1111
1212 let TXID_BYTES_LENGTH = 32
1313
1414 func wrapErr (s) = ((contractFilename + ": ") + s)
1515
1616
1717 func throwErr (s) = throw(wrapErr(s))
1818
1919
2020 func keyAllowedTxIdVotePrefix (txId) = makeString(["%s%s%s", "allowTxId", txId], SEP)
2121
2222
2323 func keyFullAdminVote (prefix,adminAddress) = makeString([prefix, adminAddress], SEP)
2424
2525
2626 func keyAdminAddressList () = makeString(["%s", "adminAddressList"], SEP)
2727
2828
2929 func keyAllowedTxId () = makeString(["%s", "txId"], SEP)
3030
3131
3232 func keyConfigAddress () = "%s__config"
3333
3434
3535 func keyVotingResultAddress () = "contract_voting_result"
3636
3737
3838 func keyProposalAllowBroadcast (address,txId) = ((("proposal_allow_broadcast_" + toString(address)) + "_") + toBase58String(txId))
3939
4040
4141 let configAddressOption = match getString(this, keyConfigAddress()) {
4242 case s: String =>
4343 addressFromString(s)
4444 case _: Unit =>
4545 unit
4646 case _ =>
4747 throw("Match error")
4848 }
4949
5050 let configAddress = valueOrErrorMessage(configAddressOption, wrapErr("invalid config address"))
5151
5252 let votingResultContractOption = match configAddressOption {
5353 case a: Address =>
5454 match getString(a, keyVotingResultAddress()) {
5555 case s: String =>
5656 addressFromString(s)
5757 case _: Unit =>
5858 unit
5959 case _ =>
6060 throw("Match error")
6161 }
6262 case _: Unit =>
6363 unit
6464 case _ =>
6565 throw("Match error")
6666 }
6767
6868 let votingResultContract = valueOrErrorMessage(votingResultContractOption, wrapErr("invalid voting result address"))
6969
7070 func getAdminVote (prefix,admin) = {
7171 let voteKey = keyFullAdminVote(prefix, admin)
7272 valueOrElse(getInteger(voteKey), 0)
7373 }
7474
7575
7676 func getAdminsList () = match getString(this, keyAdminAddressList()) {
7777 case s: String =>
7878 split(s, SEP)
7979 case _ =>
8080 nil
8181 }
8282
8383
8484 func isInAdminList (address) = containsElement(getAdminsList(), address)
8585
8686
8787 func genVotesKeysHelper (a,adminAddress) = {
8888 let $t020202044 = a
8989 let result = $t020202044._1
9090 let prefix = $t020202044._2
9191 $Tuple2((result :+ keyFullAdminVote(prefix, adminAddress)), prefix)
9292 }
9393
9494
9595 func genVotesKeys (keyPrefix) = {
9696 let adminList = keyAdminAddressList()
9797 let $t021912275 = {
9898 let $l = getAdminsList()
9999 let $s = size($l)
100100 let $acc0 = $Tuple2(nil, keyPrefix)
101101 func $f0_1 ($a,$i) = if (($i >= $s))
102102 then $a
103103 else genVotesKeysHelper($a, $l[$i])
104104
105105 func $f0_2 ($a,$i) = if (($i >= $s))
106106 then $a
107107 else throw("List size exceeds 5")
108108
109109 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
110110 }
111111 let result = $t021912275._1
112112 let prefix = $t021912275._2
113113 result
114114 }
115115
116116
117117 func countVotesHelper (result,voteKey) = (result + valueOrElse(getInteger(voteKey), 0))
118118
119119
120120 func countVotes (prefix) = {
121121 let votes = genVotesKeys(prefix)
122122 let $l = votes
123123 let $s = size($l)
124124 let $acc0 = 0
125125 func $f0_1 ($a,$i) = if (($i >= $s))
126126 then $a
127127 else countVotesHelper($a, $l[$i])
128128
129129 func $f0_2 ($a,$i) = if (($i >= $s))
130130 then $a
131131 else throw("List size exceeds 5")
132132
133133 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
134134 }
135135
136136
137137 func clearVotesHelper (result,key) = (result :+ DeleteEntry(key))
138138
139139
140140 func getClearVoteEntries (prefix) = {
141141 let votes = genVotesKeys(prefix)
142142 let $l = votes
143143 let $s = size($l)
144144 let $acc0 = nil
145145 func $f0_1 ($a,$i) = if (($i >= $s))
146146 then $a
147147 else clearVotesHelper($a, $l[$i])
148148
149149 func $f0_2 ($a,$i) = if (($i >= $s))
150150 then $a
151151 else throw("List size exceeds 5")
152152
153153 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
154154 }
155155
156156
157157 func voteINTERNAL (callerAddressString,keyPrefix,minVotes,voteResult) = {
158158 let voteKey = keyFullAdminVote(keyPrefix, callerAddressString)
159159 let adminCurrentVote = getAdminVote(keyPrefix, callerAddressString)
160160 let err = if (!(isInAdminList(callerAddressString)))
161161 then throwErr((("Address: " + callerAddressString) + " not in Admin list"))
162162 else if ((adminCurrentVote == 1))
163163 then throwErr((voteKey + " you already voted"))
164164 else unit
165165 if ((err == err))
166166 then {
167167 let votes = countVotes(keyPrefix)
168168 if (((votes + 1) >= minVotes))
169169 then {
170170 let clearVoteEntries = getClearVoteEntries(keyPrefix)
171171 (clearVoteEntries ++ voteResult)
172172 }
173173 else [IntegerEntry(voteKey, 1)]
174174 }
175175 else throw("Strict value is not equal to itself.")
176176 }
177177
178178
179179 @Callable(i)
180180 func voteForTxId (txId) = {
181181 let callerAddressString = toBase58String(i.caller.bytes)
182182 let keyPrefix = keyAllowedTxIdVotePrefix(txId)
183183 let result = [StringEntry(keyAllowedTxId(), txId)]
184184 let allowedTxIdOption = getString(this, keyAllowedTxId())
185185 let err = [if ((size(fromBase58String(txId)) == TXID_BYTES_LENGTH))
186186 then true
187187 else throwErr((txId + " is not valid txId")), if (if ((allowedTxIdOption == unit))
188188 then true
189189 else (value(allowedTxIdOption) != txId))
190190 then true
191191 else throwErr((txId + " is already allowed"))]
192192 if ((err == err))
193193 then voteINTERNAL(callerAddressString, keyPrefix, QUORUM, result)
194194 else throw("Strict value is not equal to itself.")
195195 }
196196
197197
198198 @Verifier(tx)
199199 func verify () = {
200200 let allowedTxIdStringOption = getString(keyAllowedTxId())
201201 let currentAdminList = getAdminsList()
202202 let byProposal = valueOrElse(getBoolean(votingResultContract, keyProposalAllowBroadcast(this, tx.id)), false)
203203 let byAdmins = if ((allowedTxIdStringOption != unit))
204204 then (tx.id == fromBase58String(value(allowedTxIdStringOption)))
205205 else false
206206 let byOwner = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
207207 if (if ((configAddressOption != unit))
208208 then (size(currentAdminList) == ADMIN_LIST_SIZE)
209209 else false)
210210 then if (if ((votingResultContractOption != unit))
211211 then byProposal
212212 else false)
213213 then true
214214 else byAdmins
215215 else byOwner
216216 }
217217

github/deemru/w8io/c3f4982 
31.00 ms