tx · 6ewY79aKdvCVLerKshymQxyaiB83oXpJqb8BYg9xv7aQ 3Mz29fiz3zgY9JDbiHKANvHsFgQutdfu4Ua: -0.01400000 Waves 2021.03.29 03:26 [1458317] smart account 3Mz29fiz3zgY9JDbiHKANvHsFgQutdfu4Ua > SELF 0.00000000 Waves
{ "type": 13, "id": "6ewY79aKdvCVLerKshymQxyaiB83oXpJqb8BYg9xv7aQ", "fee": 1400000, "feeAssetId": null, "timestamp": 1616977641766, "version": 2, "chainId": 84, "sender": "3Mz29fiz3zgY9JDbiHKANvHsFgQutdfu4Ua", "senderPublicKey": "CTyHhnVTxf16Z4CmGGneAK8WB5g2QyT4MB8kUn8vPPcu", "proofs": [ "2VELVBZJ7mQUuCanyoFr1dPPytZZ8d2f4K9K2bezWQfsT7ZnrSXBkPyvamQh2v53opjbNhSn533Wy57Zv8XexZ5v" ], "script": "base64:AAIEAAAAAAAAAAwIAhIECgIICBIAEgAAAAAZAAAAAARzZWxmCQAEJQAAAAEFAAAABHRoaXMAAAAADWdlbmVzaXNIZWlnaHQAAAAAAAAWOGYAAAAAB3dhdmVzSWQCAAAABVdBVkVTAAAAAAZtYXhJbnQAf/////////0AAAAADm1heERhdGFLZXlTaXplAAAAAAAAAAGQAAAAABNtYXhEZXNjcmlwdGlvbkJ5dGVzAAAAAAAAAAPoAAAAAAxjb250cmFjdE5hbWUCAAAADVZhdWx0Q29udHJhY3QAAAAADGNvbnRyYWN0VGV4dAkAASwAAAACCQABLAAAAAICAAAARERvbid0IHRydXN0LCB2ZXJpZnkgISBUaGUgTkZUIElzc3VlciBhbmQgZEFwcCBhcmUgdGhlIHNhbWUgYWRkcmVzcyA8BQAAAARzZWxmAgAAAAI+LgAAAAARY29udHJhY3RTZXBhcmF0b3ICAAAAA19fXwAAAAALcmVjZWlwdE5hbWUCAAAADFZhdWx0UmVjZWlwdAAAAAALcmVjZWlwdFRleHQCAAAACGZ1Y2sgb2ZmAAAAAAx2ZXJpZmllck5hbWUCAAAADVZhdWx0VmVyaWZpZXIAAAAADXZlcmlmaWVyVGV4dDECAAAACEFkZHJlc3M6AAAAAA12ZXJpZmllclRleHQyAgAAABdTSEEyNTYgQmFzZTU4IENoZWNrc3VtOgAAAAANdmVyaWZpZXJUZXh0MwIAAAAHRXJyb3JzOgAAAAAOcnVsZXNTZXBhcmF0b3ICAAAAAV8AAAAAFHJ1bGVzTmVzdGVkU2VwYXJhdG9yAgAAAAErAAAAAA5ydWxlc1VuZGVmaW5lZAIAAAAEbnVsbAAAAAARcnVsZXNLZXlNaW5MZW5ndGgAAAAAAAAAAAEAAAAAD2Vycm9yc1NlcGFyYXRvcgIAAAABfAAAAAAIa2V5UnVsZXMCAAAABl9ydWxlcwAAAAANa2V5Tm9uY2VDb3VudAIAAAALTk9OQ0VfQ09VTlQBAAAACWlzSW5SYW5nZQAAAAEAAAAGbnVtYmVyAwkAAGcAAAACBQAAAAZudW1iZXIAAAAAAAAAAAAJAABmAAAAAgUAAAAGbWF4SW50BQAAAAZudW1iZXIHAQAAAA1nZW5lcmF0ZU5vbmNlAAAAAAQAAAAHJG1hdGNoMAkABBoA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PQAAAAIIBQAAAAxjb250cmFjdEluZm8AAAAKcmVpc3N1YWJsZQcGCQEAAAACIT0AAAACCAUAAAAMY29udHJhY3RJbmZvAAAACHNjcmlwdGVkBwkAAAIAAAABAgAAABdFUlJPUjogQ29udHJhY3Qgbm90IE5GVAQAAAATY29udHJhY3REZXNjcmlwdGlvbgkABLUAAAACCAUAAAAMY29udHJhY3RJbmZvAAAAC2Rlc2NyaXB0aW9uBQAAABFjb250cmFjdFNlcGFyYXRvcgQAAAAOY29udHJhY3RIZWlnaHQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAABNjb250cmFjdERlc2NyaXB0aW9uAAAAAAAAAAABBAAAABVjb250cmFjdENhbGxlckFkZHJlc3MJAAGRAAAAAgUAAAATY29udHJhY3REZXNjcmlwdGlvbgAAAAAAAAAAAgQAAAAPY29udHJhY3RBc3NldElkCQABkQAAAAIFAAAAE2NvbnRyYWN0RGVzY3JpcHRpb24AAAAAAAAAAAMEAAAAFWNvbnRyYWN0QXNzZXRRdWFudGl0eQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAE2NvbnRyYWN0RGVzY3JpcHRpb24AAAAAAAAAAAQEAAAAEWNvbnRyYWN0QXNzZXRJbmZvBAAAAAckbWF0Y2gwCQAD7AAAAAEJAAJZAAAAAQUAAAAPY29udHJhY3RBc3NldElkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAVBc3NldAQAAAAHaXNBc3NldAUAAAAHJG1hdGNoMAUAAAAHaXNBc3NldAkAAAIAAAABAgAAABRFUlJPUjogVW5rbm93biBBc3NldAMJAQAAAAIhPQAAAAIJAAGQAAAAAQUAAAATY29udHJhY3REZXNjcmlwdGlvbgAAAAAAAAAABQkAAAIAAAABAgAAABtFUlJPUjogQ29udHJhY3QgZGVzY3JpcHRpb24DAwkAAGcAAAACBQAAAA1nZW5lc2lzSGVpZ2h0BQAAAA5jb250cmFjdEhlaWdodAYJAABnAAAAAgUAAAAOY29udHJhY3RIZWlnaHQFAAAABmhlaWdodAkAAAIAAAABAgAAAA1FUlJPUjogSGVpZ2h0AwMJAABmAAAAAgAAAAAAAAAAAQUAAAAVY29udHJhY3RBc3NldFF1YW50aXR5BgkAAGYAAAACBQAAABVjb250cmFjdEFzc2V0UXVhbnRpdHkIBQAAABFjb250cmFjdEFzc2V0SW5mbwAAAAhxdWFudGl0eQkAAAIAAAABAgAAABVFUlJPUjogQXNzZXQgcXVhbnRpdHkDCQAAZgAAAAIFAAAAFWNvbnRyYWN0QXNzZXRRdWFudGl0eQkAA/AAAAACBQAAAAR0aGlzCAUAAAARY29udHJhY3RBc3NldEluZm8AAAACaWQJAAACAAAAAQIAAAAURVJST1I6IFZhdWx0IGJhbGFuY2UEAAAABW5vbmNlCQEAAAANZ2VuZXJhdGVOb25jZQAAAAAEAAAAEnJlY2VpcHREZXNjcmlwdGlvbgkABLkAAAACCQAETAAAAAIFAAAAC3JlY2VpcHRUZXh0CQAETAAAAAIJAAGkAAAAAQUAAAAOY29udHJhY3RIZWlnaHQJAARMAAAAAgkAAaQAAAABBQAAAAZoZWlnaHQJAARMAAAAAgkAAlgAAAABBQAAABRjb250cmFjdElkQnl0ZVZlY3RvcgkABEwAAAACBQAAABVjb250cmFjdENhbGxlckFkZHJlc3MJAARMAAAAAgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIJAARMAAAAAgUAAAAPY29udHJhY3RBc3NldElkCQAETAAAAAIJAAGkAAAAAQUAAAAVY29udHJhY3RBc3NldFF1YW50aXR5BQAAAANuaWwFAAAAEWNvbnRyYWN0U2VwYXJhdG9yBAAAAAxyZWNlaXB0SXNzdWUJAARDAAAABwUAAAALcmVjZWlwdE5hbWUFAAAAEnJlY2VpcHREZXNjcmlwdGlvbgAAAAAAAAAAAQAAAAAAAAAAAAcFAAAABHVuaXQFAAAABW5vbmNlBAAAAAlyZWNlaXB0SWQJAAQ4AAAAAQUAAAAMcmVjZWlwdElzc3VlCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAA1rZXlOb25jZUNvdW50BQAAAAVub25jZQkABEwAAAACCQEAAAAEQnVybgAAAAIFAAAAFGNvbnRyYWN0SWRCeXRlVmVjdG9yAAAAAAAAAAABCQAETAAAAAIFAAAADHJlY2VpcHRJc3N1ZQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIIBQAAAAxyZWNlaXB0SXNzdWUAAAAIcXVhbnRpdHkFAAAACXJlY2VpcHRJZAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAAFWNvbnRyYWN0QXNzZXRRdWFudGl0eQgFAAAAEWNvbnRyYWN0QXNzZXRJbmZvAAAAAmlkBQAAAANuaWwAAAABAAAAAnR4AQAAAAZ2ZXJpZnkAAAAACQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAgFAAAAAnR4AAAAD3NlbmRlclB1YmxpY0tleQTmUgc=", "height": 1458317, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GXSzJwK1ziiscB3pY1gXGsEadsuy3guGsKPGbjAjtN6u Next: DCfsvbN6nmuLYpGvvrLT8SpHmq4WsRBqipEknZS7etDZ Diff:
Old | New | Differences | |
---|---|---|---|
36 | 36 | let rulesNestedSeparator = "+" | |
37 | 37 | ||
38 | 38 | let rulesUndefined = "null" | |
39 | + | ||
40 | + | let rulesKeyMinLength = 1 | |
39 | 41 | ||
40 | 42 | let errorsSeparator = "|" | |
41 | 43 | ||
94 | 96 | @Callable(i) | |
95 | 97 | func verifyRules (incRulerAddress,incRulerKey) = if ((this == i.caller)) | |
96 | 98 | then throw("ERROR: Self-invoke is forbidden") | |
97 | - | else { | |
98 | - | let rulerAddress = Address(fromBase58String(incRulerAddress)) | |
99 | - | let rulerKeyRules = (incRulerKey + keyRules) | |
100 | - | if ((size(toBytes(rulerKeyRules)) >= maxDataKeySize)) | |
101 | - | then throw("ERROR: Key size too long") | |
99 | + | else if ((size(i.payments) != 0)) | |
100 | + | then throw("ERROR: No payments required") | |
101 | + | else if ((rulesKeyMinLength > size(incRulerKey))) | |
102 | + | then throw("ERROR: Key too short") | |
102 | 103 | else { | |
103 | - | let rulesString = match getString(rulerAddress, rulerKeyRules) { | |
104 | - | case isString: String => | |
105 | - | isString | |
106 | - | case _ => | |
107 | - | throw("ERROR: Data not found") | |
108 | - | } | |
109 | - | let rulesList = split(rulesString, rulesSeparator) | |
110 | - | if ((size(rulesList) != 15)) | |
111 | - | then throw("ERROR: Wrong amount of rules") | |
104 | + | let rulerAddress = Address(fromBase58String(incRulerAddress)) | |
105 | + | let rulerKeyRules = (incRulerKey + keyRules) | |
106 | + | if ((size(toBytes(rulerKeyRules)) >= maxDataKeySize)) | |
107 | + | then throw("ERROR: Key size too long") | |
112 | 108 | else { | |
113 | - | let errorsList = { | |
114 | - | let $list37323767 = rulesList | |
115 | - | let $size37323767 = size($list37323767) | |
116 | - | let $acc037323767 = nil | |
117 | - | if (($size37323767 == 0)) | |
118 | - | then $acc037323767 | |
119 | - | else { | |
120 | - | let $acc137323767 = verifyRule($acc037323767, $list37323767[0]) | |
121 | - | if (($size37323767 == 1)) | |
122 | - | then $acc137323767 | |
109 | + | let rulesString = match getString(rulerAddress, rulerKeyRules) { | |
110 | + | case isString: String => | |
111 | + | isString | |
112 | + | case _ => | |
113 | + | throw("ERROR: Data not found") | |
114 | + | } | |
115 | + | let rulesList = split(rulesString, rulesSeparator) | |
116 | + | if ((size(rulesList) != 15)) | |
117 | + | then throw("ERROR: Wrong amount of rules") | |
118 | + | else { | |
119 | + | let errorsList = { | |
120 | + | let $list41374172 = rulesList | |
121 | + | let $size41374172 = size($list41374172) | |
122 | + | let $acc041374172 = nil | |
123 | + | if (($size41374172 == 0)) | |
124 | + | then $acc041374172 | |
123 | 125 | else { | |
124 | - | let $ | |
125 | - | if (($ | |
126 | - | then $ | |
126 | + | let $acc141374172 = verifyRule($acc041374172, $list41374172[0]) | |
127 | + | if (($size41374172 == 1)) | |
128 | + | then $acc141374172 | |
127 | 129 | else { | |
128 | - | let $ | |
129 | - | if (($ | |
130 | - | then $ | |
130 | + | let $acc241374172 = verifyRule($acc141374172, $list41374172[1]) | |
131 | + | if (($size41374172 == 2)) | |
132 | + | then $acc241374172 | |
131 | 133 | else { | |
132 | - | let $ | |
133 | - | if (($ | |
134 | - | then $ | |
134 | + | let $acc341374172 = verifyRule($acc241374172, $list41374172[2]) | |
135 | + | if (($size41374172 == 3)) | |
136 | + | then $acc341374172 | |
135 | 137 | else { | |
136 | - | let $ | |
137 | - | if (($ | |
138 | - | then $ | |
138 | + | let $acc441374172 = verifyRule($acc341374172, $list41374172[3]) | |
139 | + | if (($size41374172 == 4)) | |
140 | + | then $acc441374172 | |
139 | 141 | else { | |
140 | - | let $ | |
141 | - | if (($ | |
142 | - | then $ | |
142 | + | let $acc541374172 = verifyRule($acc441374172, $list41374172[4]) | |
143 | + | if (($size41374172 == 5)) | |
144 | + | then $acc541374172 | |
143 | 145 | else { | |
144 | - | let $ | |
145 | - | if (($ | |
146 | - | then $ | |
146 | + | let $acc641374172 = verifyRule($acc541374172, $list41374172[5]) | |
147 | + | if (($size41374172 == 6)) | |
148 | + | then $acc641374172 | |
147 | 149 | else { | |
148 | - | let $ | |
149 | - | if (($ | |
150 | - | then $ | |
150 | + | let $acc741374172 = verifyRule($acc641374172, $list41374172[6]) | |
151 | + | if (($size41374172 == 7)) | |
152 | + | then $acc741374172 | |
151 | 153 | else { | |
152 | - | let $ | |
153 | - | if (($ | |
154 | - | then $ | |
154 | + | let $acc841374172 = verifyRule($acc741374172, $list41374172[7]) | |
155 | + | if (($size41374172 == 8)) | |
156 | + | then $acc841374172 | |
155 | 157 | else { | |
156 | - | let $ | |
157 | - | if (($ | |
158 | - | then $ | |
158 | + | let $acc941374172 = verifyRule($acc841374172, $list41374172[8]) | |
159 | + | if (($size41374172 == 9)) | |
160 | + | then $acc941374172 | |
159 | 161 | else { | |
160 | - | let $ | |
161 | - | if (($ | |
162 | - | then $ | |
162 | + | let $acc1041374172 = verifyRule($acc941374172, $list41374172[9]) | |
163 | + | if (($size41374172 == 10)) | |
164 | + | then $acc1041374172 | |
163 | 165 | else { | |
164 | - | let $ | |
165 | - | if (($ | |
166 | - | then $ | |
166 | + | let $acc1141374172 = verifyRule($acc1041374172, $list41374172[10]) | |
167 | + | if (($size41374172 == 11)) | |
168 | + | then $acc1141374172 | |
167 | 169 | else { | |
168 | - | let $ | |
169 | - | if (($ | |
170 | - | then $ | |
170 | + | let $acc1241374172 = verifyRule($acc1141374172, $list41374172[11]) | |
171 | + | if (($size41374172 == 12)) | |
172 | + | then $acc1241374172 | |
171 | 173 | else { | |
172 | - | let $ | |
173 | - | if (($ | |
174 | - | then $ | |
174 | + | let $acc1341374172 = verifyRule($acc1241374172, $list41374172[12]) | |
175 | + | if (($size41374172 == 13)) | |
176 | + | then $acc1341374172 | |
175 | 177 | else { | |
176 | - | let $ | |
177 | - | if (($ | |
178 | - | then $ | |
178 | + | let $acc1441374172 = verifyRule($acc1341374172, $list41374172[13]) | |
179 | + | if (($size41374172 == 14)) | |
180 | + | then $acc1441374172 | |
179 | 181 | else { | |
180 | - | let $acc1637323767 = verifyRule($acc1537323767, $list37323767[15]) | |
181 | - | throw("List size exceed 15") | |
182 | + | let $acc1541374172 = verifyRule($acc1441374172, $list41374172[14]) | |
183 | + | if (($size41374172 == 15)) | |
184 | + | then $acc1541374172 | |
185 | + | else { | |
186 | + | let $acc1641374172 = verifyRule($acc1541374172, $list41374172[15]) | |
187 | + | throw("List size exceed 15") | |
188 | + | } | |
182 | 189 | } | |
183 | 190 | } | |
184 | 191 | } | |
195 | 202 | } | |
196 | 203 | } | |
197 | 204 | } | |
198 | - | } | |
199 | - | let errorsString = makeString(errorsList, errorsSeparator) | |
200 | - | let nonce = generateNonce() | |
201 | - | let rulesSHA256 = toBase58String(sha256(toBytes(rulesString))) | |
202 | - | let verifierDescription = ((((((((((verifierText1 + " <") + incRulerAddress) + "> ") + verifierText2) + " <") + rulesSHA256) + "> ") + verifierText3) + " ") + errorsString) | |
203 | - | if ((size(toBytes(verifierDescription)) > maxDescriptionBytes)) | |
204 | - | then throw("ERROR: Too much errors") | |
205 | - | else { | |
206 | - | let veriferIssue = Issue(verifierName, verifierDescription, 1, 0, false, unit, nonce) | |
207 | - | let verifierId = calculateAssetId(veriferIssue) | |
205 | + | let errorsString = makeString(errorsList, errorsSeparator) | |
206 | + | let nonce = generateNonce() | |
207 | + | let rulesSHA256 = toBase58String(sha256(toBytes(rulesString))) | |
208 | + | let verifierDescription = ((((((((((verifierText1 + " <") + incRulerAddress) + "> ") + verifierText2) + " <") + rulesSHA256) + "> ") + verifierText3) + " ") + errorsString) | |
209 | + | if ((size(toBytes(verifierDescription)) > maxDescriptionBytes)) | |
210 | + | then throw("ERROR: Too much errors") | |
211 | + | else { | |
212 | + | let veriferIssue = Issue(verifierName, verifierDescription, 1, 0, false, unit, nonce) | |
213 | + | let verifierId = calculateAssetId(veriferIssue) | |
208 | 214 | [IntegerEntry(keyNonceCount, nonce), veriferIssue, ScriptTransfer(i.caller, veriferIssue.quantity, verifierId)] | |
215 | + | } | |
209 | 216 | } | |
210 | 217 | } | |
211 | 218 | } | |
212 | - | } | |
213 | 219 | ||
214 | 220 | ||
215 | 221 | ||
216 | 222 | @Callable(i) | |
217 | - | func deposit ( | |
223 | + | func deposit () = if ((genesisHeight > height)) | |
218 | 224 | then throw(("ERROR: Deposits are denied until block " + toString(genesisHeight))) | |
219 | 225 | else if ((this == i.caller)) | |
220 | 226 | then throw("ERROR: Self-invoke is forbidden") |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 4 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let self = toString(this) | |
5 | 5 | ||
6 | 6 | let genesisHeight = 1456230 | |
7 | 7 | ||
8 | 8 | let wavesId = "WAVES" | |
9 | 9 | ||
10 | 10 | let maxInt = 9223372036854775805 | |
11 | 11 | ||
12 | 12 | let maxDataKeySize = 400 | |
13 | 13 | ||
14 | 14 | let maxDescriptionBytes = 1000 | |
15 | 15 | ||
16 | 16 | let contractName = "VaultContract" | |
17 | 17 | ||
18 | 18 | let contractText = (("Don't trust, verify ! The NFT Issuer and dApp are the same address <" + self) + ">.") | |
19 | 19 | ||
20 | 20 | let contractSeparator = "___" | |
21 | 21 | ||
22 | 22 | let receiptName = "VaultReceipt" | |
23 | 23 | ||
24 | 24 | let receiptText = "fuck off" | |
25 | 25 | ||
26 | 26 | let verifierName = "VaultVerifier" | |
27 | 27 | ||
28 | 28 | let verifierText1 = "Address:" | |
29 | 29 | ||
30 | 30 | let verifierText2 = "SHA256 Base58 Checksum:" | |
31 | 31 | ||
32 | 32 | let verifierText3 = "Errors:" | |
33 | 33 | ||
34 | 34 | let rulesSeparator = "_" | |
35 | 35 | ||
36 | 36 | let rulesNestedSeparator = "+" | |
37 | 37 | ||
38 | 38 | let rulesUndefined = "null" | |
39 | + | ||
40 | + | let rulesKeyMinLength = 1 | |
39 | 41 | ||
40 | 42 | let errorsSeparator = "|" | |
41 | 43 | ||
42 | 44 | let keyRules = "_rules" | |
43 | 45 | ||
44 | 46 | let keyNonceCount = "NONCE_COUNT" | |
45 | 47 | ||
46 | 48 | func isInRange (number) = if ((number >= 0)) | |
47 | 49 | then (maxInt > number) | |
48 | 50 | else false | |
49 | 51 | ||
50 | 52 | ||
51 | 53 | func generateNonce () = match getInteger(this, keyNonceCount) { | |
52 | 54 | case isInt: Int => | |
53 | 55 | if ((isInt >= maxInt)) | |
54 | 56 | then 1 | |
55 | 57 | else (isInt + 1) | |
56 | 58 | case _ => | |
57 | 59 | 1 | |
58 | 60 | } | |
59 | 61 | ||
60 | 62 | ||
61 | 63 | func verifyRule (acc,rule) = if ((rule == rulesUndefined)) | |
62 | 64 | then acc | |
63 | 65 | else { | |
64 | 66 | let ruleValues = split(rule, rulesNestedSeparator) | |
65 | 67 | if ((size(ruleValues) != 4)) | |
66 | 68 | then (("<" + rule) + "> Broken structure") :: acc | |
67 | 69 | else match parseInt(ruleValues[0]) { | |
68 | 70 | case blockStart: Int => | |
69 | 71 | if ((isInRange(blockStart) != true)) | |
70 | 72 | then (("<" + rule) + "> blockStart out-of-range") :: acc | |
71 | 73 | else match parseInt(ruleValues[1]) { | |
72 | 74 | case blockEnd: Int => | |
73 | 75 | if ((isInRange(blockEnd) != true)) | |
74 | 76 | then (("<" + rule) + "> blockEnd out-of-range") :: acc | |
75 | 77 | else match parseInt(ruleValues[2]) { | |
76 | 78 | case isWhitelist: Int => | |
77 | 79 | if (if ((isWhitelist != 0)) | |
78 | 80 | then (isWhitelist != 1) | |
79 | 81 | else false) | |
80 | 82 | then (("<" + rule) + "> isWhitelist is 0 (false) or 1 (true)") :: acc | |
81 | 83 | else acc | |
82 | 84 | case _ => | |
83 | 85 | (("<" + rule) + "> isWhitelist not Integer") :: acc | |
84 | 86 | } | |
85 | 87 | case _ => | |
86 | 88 | (("<" + rule) + "> blockEnd not Integer") :: acc | |
87 | 89 | } | |
88 | 90 | case _ => | |
89 | 91 | (("<" + rule) + "> blockStart not Integer") :: acc | |
90 | 92 | } | |
91 | 93 | } | |
92 | 94 | ||
93 | 95 | ||
94 | 96 | @Callable(i) | |
95 | 97 | func verifyRules (incRulerAddress,incRulerKey) = if ((this == i.caller)) | |
96 | 98 | then throw("ERROR: Self-invoke is forbidden") | |
97 | - | else { | |
98 | - | let rulerAddress = Address(fromBase58String(incRulerAddress)) | |
99 | - | let rulerKeyRules = (incRulerKey + keyRules) | |
100 | - | if ((size(toBytes(rulerKeyRules)) >= maxDataKeySize)) | |
101 | - | then throw("ERROR: Key size too long") | |
99 | + | else if ((size(i.payments) != 0)) | |
100 | + | then throw("ERROR: No payments required") | |
101 | + | else if ((rulesKeyMinLength > size(incRulerKey))) | |
102 | + | then throw("ERROR: Key too short") | |
102 | 103 | else { | |
103 | - | let rulesString = match getString(rulerAddress, rulerKeyRules) { | |
104 | - | case isString: String => | |
105 | - | isString | |
106 | - | case _ => | |
107 | - | throw("ERROR: Data not found") | |
108 | - | } | |
109 | - | let rulesList = split(rulesString, rulesSeparator) | |
110 | - | if ((size(rulesList) != 15)) | |
111 | - | then throw("ERROR: Wrong amount of rules") | |
104 | + | let rulerAddress = Address(fromBase58String(incRulerAddress)) | |
105 | + | let rulerKeyRules = (incRulerKey + keyRules) | |
106 | + | if ((size(toBytes(rulerKeyRules)) >= maxDataKeySize)) | |
107 | + | then throw("ERROR: Key size too long") | |
112 | 108 | else { | |
113 | - | let errorsList = { | |
114 | - | let $list37323767 = rulesList | |
115 | - | let $size37323767 = size($list37323767) | |
116 | - | let $acc037323767 = nil | |
117 | - | if (($size37323767 == 0)) | |
118 | - | then $acc037323767 | |
119 | - | else { | |
120 | - | let $acc137323767 = verifyRule($acc037323767, $list37323767[0]) | |
121 | - | if (($size37323767 == 1)) | |
122 | - | then $acc137323767 | |
109 | + | let rulesString = match getString(rulerAddress, rulerKeyRules) { | |
110 | + | case isString: String => | |
111 | + | isString | |
112 | + | case _ => | |
113 | + | throw("ERROR: Data not found") | |
114 | + | } | |
115 | + | let rulesList = split(rulesString, rulesSeparator) | |
116 | + | if ((size(rulesList) != 15)) | |
117 | + | then throw("ERROR: Wrong amount of rules") | |
118 | + | else { | |
119 | + | let errorsList = { | |
120 | + | let $list41374172 = rulesList | |
121 | + | let $size41374172 = size($list41374172) | |
122 | + | let $acc041374172 = nil | |
123 | + | if (($size41374172 == 0)) | |
124 | + | then $acc041374172 | |
123 | 125 | else { | |
124 | - | let $ | |
125 | - | if (($ | |
126 | - | then $ | |
126 | + | let $acc141374172 = verifyRule($acc041374172, $list41374172[0]) | |
127 | + | if (($size41374172 == 1)) | |
128 | + | then $acc141374172 | |
127 | 129 | else { | |
128 | - | let $ | |
129 | - | if (($ | |
130 | - | then $ | |
130 | + | let $acc241374172 = verifyRule($acc141374172, $list41374172[1]) | |
131 | + | if (($size41374172 == 2)) | |
132 | + | then $acc241374172 | |
131 | 133 | else { | |
132 | - | let $ | |
133 | - | if (($ | |
134 | - | then $ | |
134 | + | let $acc341374172 = verifyRule($acc241374172, $list41374172[2]) | |
135 | + | if (($size41374172 == 3)) | |
136 | + | then $acc341374172 | |
135 | 137 | else { | |
136 | - | let $ | |
137 | - | if (($ | |
138 | - | then $ | |
138 | + | let $acc441374172 = verifyRule($acc341374172, $list41374172[3]) | |
139 | + | if (($size41374172 == 4)) | |
140 | + | then $acc441374172 | |
139 | 141 | else { | |
140 | - | let $ | |
141 | - | if (($ | |
142 | - | then $ | |
142 | + | let $acc541374172 = verifyRule($acc441374172, $list41374172[4]) | |
143 | + | if (($size41374172 == 5)) | |
144 | + | then $acc541374172 | |
143 | 145 | else { | |
144 | - | let $ | |
145 | - | if (($ | |
146 | - | then $ | |
146 | + | let $acc641374172 = verifyRule($acc541374172, $list41374172[5]) | |
147 | + | if (($size41374172 == 6)) | |
148 | + | then $acc641374172 | |
147 | 149 | else { | |
148 | - | let $ | |
149 | - | if (($ | |
150 | - | then $ | |
150 | + | let $acc741374172 = verifyRule($acc641374172, $list41374172[6]) | |
151 | + | if (($size41374172 == 7)) | |
152 | + | then $acc741374172 | |
151 | 153 | else { | |
152 | - | let $ | |
153 | - | if (($ | |
154 | - | then $ | |
154 | + | let $acc841374172 = verifyRule($acc741374172, $list41374172[7]) | |
155 | + | if (($size41374172 == 8)) | |
156 | + | then $acc841374172 | |
155 | 157 | else { | |
156 | - | let $ | |
157 | - | if (($ | |
158 | - | then $ | |
158 | + | let $acc941374172 = verifyRule($acc841374172, $list41374172[8]) | |
159 | + | if (($size41374172 == 9)) | |
160 | + | then $acc941374172 | |
159 | 161 | else { | |
160 | - | let $ | |
161 | - | if (($ | |
162 | - | then $ | |
162 | + | let $acc1041374172 = verifyRule($acc941374172, $list41374172[9]) | |
163 | + | if (($size41374172 == 10)) | |
164 | + | then $acc1041374172 | |
163 | 165 | else { | |
164 | - | let $ | |
165 | - | if (($ | |
166 | - | then $ | |
166 | + | let $acc1141374172 = verifyRule($acc1041374172, $list41374172[10]) | |
167 | + | if (($size41374172 == 11)) | |
168 | + | then $acc1141374172 | |
167 | 169 | else { | |
168 | - | let $ | |
169 | - | if (($ | |
170 | - | then $ | |
170 | + | let $acc1241374172 = verifyRule($acc1141374172, $list41374172[11]) | |
171 | + | if (($size41374172 == 12)) | |
172 | + | then $acc1241374172 | |
171 | 173 | else { | |
172 | - | let $ | |
173 | - | if (($ | |
174 | - | then $ | |
174 | + | let $acc1341374172 = verifyRule($acc1241374172, $list41374172[12]) | |
175 | + | if (($size41374172 == 13)) | |
176 | + | then $acc1341374172 | |
175 | 177 | else { | |
176 | - | let $ | |
177 | - | if (($ | |
178 | - | then $ | |
178 | + | let $acc1441374172 = verifyRule($acc1341374172, $list41374172[13]) | |
179 | + | if (($size41374172 == 14)) | |
180 | + | then $acc1441374172 | |
179 | 181 | else { | |
180 | - | let $acc1637323767 = verifyRule($acc1537323767, $list37323767[15]) | |
181 | - | throw("List size exceed 15") | |
182 | + | let $acc1541374172 = verifyRule($acc1441374172, $list41374172[14]) | |
183 | + | if (($size41374172 == 15)) | |
184 | + | then $acc1541374172 | |
185 | + | else { | |
186 | + | let $acc1641374172 = verifyRule($acc1541374172, $list41374172[15]) | |
187 | + | throw("List size exceed 15") | |
188 | + | } | |
182 | 189 | } | |
183 | 190 | } | |
184 | 191 | } | |
185 | 192 | } | |
186 | 193 | } | |
187 | 194 | } | |
188 | 195 | } | |
189 | 196 | } | |
190 | 197 | } | |
191 | 198 | } | |
192 | 199 | } | |
193 | 200 | } | |
194 | 201 | } | |
195 | 202 | } | |
196 | 203 | } | |
197 | 204 | } | |
198 | - | } | |
199 | - | let errorsString = makeString(errorsList, errorsSeparator) | |
200 | - | let nonce = generateNonce() | |
201 | - | let rulesSHA256 = toBase58String(sha256(toBytes(rulesString))) | |
202 | - | let verifierDescription = ((((((((((verifierText1 + " <") + incRulerAddress) + "> ") + verifierText2) + " <") + rulesSHA256) + "> ") + verifierText3) + " ") + errorsString) | |
203 | - | if ((size(toBytes(verifierDescription)) > maxDescriptionBytes)) | |
204 | - | then throw("ERROR: Too much errors") | |
205 | - | else { | |
206 | - | let veriferIssue = Issue(verifierName, verifierDescription, 1, 0, false, unit, nonce) | |
207 | - | let verifierId = calculateAssetId(veriferIssue) | |
205 | + | let errorsString = makeString(errorsList, errorsSeparator) | |
206 | + | let nonce = generateNonce() | |
207 | + | let rulesSHA256 = toBase58String(sha256(toBytes(rulesString))) | |
208 | + | let verifierDescription = ((((((((((verifierText1 + " <") + incRulerAddress) + "> ") + verifierText2) + " <") + rulesSHA256) + "> ") + verifierText3) + " ") + errorsString) | |
209 | + | if ((size(toBytes(verifierDescription)) > maxDescriptionBytes)) | |
210 | + | then throw("ERROR: Too much errors") | |
211 | + | else { | |
212 | + | let veriferIssue = Issue(verifierName, verifierDescription, 1, 0, false, unit, nonce) | |
213 | + | let verifierId = calculateAssetId(veriferIssue) | |
208 | 214 | [IntegerEntry(keyNonceCount, nonce), veriferIssue, ScriptTransfer(i.caller, veriferIssue.quantity, verifierId)] | |
215 | + | } | |
209 | 216 | } | |
210 | 217 | } | |
211 | 218 | } | |
212 | - | } | |
213 | 219 | ||
214 | 220 | ||
215 | 221 | ||
216 | 222 | @Callable(i) | |
217 | - | func deposit ( | |
223 | + | func deposit () = if ((genesisHeight > height)) | |
218 | 224 | then throw(("ERROR: Deposits are denied until block " + toString(genesisHeight))) | |
219 | 225 | else if ((this == i.caller)) | |
220 | 226 | then throw("ERROR: Self-invoke is forbidden") | |
221 | 227 | else if ((size(i.payments) != 1)) | |
222 | 228 | then throw("ERROR: Attached Payment != 1") | |
223 | 229 | else if (if ((1 > i.payments[0].amount)) | |
224 | 230 | then true | |
225 | 231 | else (i.payments[0].amount > maxInt)) | |
226 | 232 | then throw("ERROR: Payment amount") | |
227 | 233 | else { | |
228 | 234 | let contractAssetId = match i.payments[0].assetId { | |
229 | 235 | case isByteVector: ByteVector => | |
230 | 236 | match assetInfo(isByteVector) { | |
231 | 237 | case isAsset: Asset => | |
232 | 238 | toBase58String(isAsset.id) | |
233 | 239 | case _ => | |
234 | 240 | throw("ERROR: Asset not found") | |
235 | 241 | } | |
236 | 242 | case isWaves: Unit => | |
237 | 243 | wavesId | |
238 | 244 | case _ => | |
239 | 245 | throw("ERROR: Unknown Asset type") | |
240 | 246 | } | |
241 | 247 | let nonce = generateNonce() | |
242 | 248 | let contractDescription = makeString([contractText, toString(height), toString(i.caller), contractAssetId, toString(i.payments[0].amount)], contractSeparator) | |
243 | 249 | if ((size(toBytes(contractDescription)) > maxDescriptionBytes)) | |
244 | 250 | then throw("ERROR: Too long contract") | |
245 | 251 | else { | |
246 | 252 | let contractIssue = Issue(contractName, contractDescription, 1, 0, false, unit, nonce) | |
247 | 253 | let contractId = calculateAssetId(contractIssue) | |
248 | 254 | [IntegerEntry(keyNonceCount, nonce), contractIssue, ScriptTransfer(i.caller, contractIssue.quantity, contractId)] | |
249 | 255 | } | |
250 | 256 | } | |
251 | 257 | ||
252 | 258 | ||
253 | 259 | ||
254 | 260 | @Callable(i) | |
255 | 261 | func withdraw () = if ((this == i.caller)) | |
256 | 262 | then throw("ERROR: Self-invoke is forbidden") | |
257 | 263 | else if ((size(i.payments) != 1)) | |
258 | 264 | then throw("ERROR: Attached Payment != 1") | |
259 | 265 | else if ((i.payments[0].amount != 1)) | |
260 | 266 | then throw("ERROR: Payment amount != 1") | |
261 | 267 | else { | |
262 | 268 | let contractIdByteVector = match i.payments[0].assetId { | |
263 | 269 | case isByteVector: ByteVector => | |
264 | 270 | isByteVector | |
265 | 271 | case _ => | |
266 | 272 | throw("ERROR: Contract type") | |
267 | 273 | } | |
268 | 274 | let contractInfo = match assetInfo(contractIdByteVector) { | |
269 | 275 | case isAsset: Asset => | |
270 | 276 | isAsset | |
271 | 277 | case _ => | |
272 | 278 | throw("ERROR: Unknown Contract") | |
273 | 279 | } | |
274 | 280 | if ((contractInfo.issuer != this)) | |
275 | 281 | then throw("ERROR: Contract Issuer") | |
276 | 282 | else if ((contractInfo.name != contractName)) | |
277 | 283 | then throw("ERROR: Contract name") | |
278 | 284 | else if (if (if (if ((contractInfo.decimals != 0)) | |
279 | 285 | then true | |
280 | 286 | else (contractInfo.quantity != 1)) | |
281 | 287 | then true | |
282 | 288 | else (contractInfo.reissuable != false)) | |
283 | 289 | then true | |
284 | 290 | else (contractInfo.scripted != false)) | |
285 | 291 | then throw("ERROR: Contract not NFT") | |
286 | 292 | else { | |
287 | 293 | let contractDescription = split(contractInfo.description, contractSeparator) | |
288 | 294 | let contractHeight = parseIntValue(contractDescription[1]) | |
289 | 295 | let contractCallerAddress = contractDescription[2] | |
290 | 296 | let contractAssetId = contractDescription[3] | |
291 | 297 | let contractAssetQuantity = parseIntValue(contractDescription[4]) | |
292 | 298 | let contractAssetInfo = match assetInfo(fromBase58String(contractAssetId)) { | |
293 | 299 | case isAsset: Asset => | |
294 | 300 | isAsset | |
295 | 301 | case _ => | |
296 | 302 | throw("ERROR: Unknown Asset") | |
297 | 303 | } | |
298 | 304 | if ((size(contractDescription) != 5)) | |
299 | 305 | then throw("ERROR: Contract description") | |
300 | 306 | else if (if ((genesisHeight >= contractHeight)) | |
301 | 307 | then true | |
302 | 308 | else (contractHeight >= height)) | |
303 | 309 | then throw("ERROR: Height") | |
304 | 310 | else if (if ((1 > contractAssetQuantity)) | |
305 | 311 | then true | |
306 | 312 | else (contractAssetQuantity > contractAssetInfo.quantity)) | |
307 | 313 | then throw("ERROR: Asset quantity") | |
308 | 314 | else if ((contractAssetQuantity > assetBalance(this, contractAssetInfo.id))) | |
309 | 315 | then throw("ERROR: Vault balance") | |
310 | 316 | else { | |
311 | 317 | let nonce = generateNonce() | |
312 | 318 | let receiptDescription = makeString([receiptText, toString(contractHeight), toString(height), toBase58String(contractIdByteVector), contractCallerAddress, toString(i.caller), contractAssetId, toString(contractAssetQuantity)], contractSeparator) | |
313 | 319 | let receiptIssue = Issue(receiptName, receiptDescription, 1, 0, false, unit, nonce) | |
314 | 320 | let receiptId = calculateAssetId(receiptIssue) | |
315 | 321 | [IntegerEntry(keyNonceCount, nonce), Burn(contractIdByteVector, 1), receiptIssue, ScriptTransfer(i.caller, receiptIssue.quantity, receiptId), ScriptTransfer(i.caller, contractAssetQuantity, contractAssetInfo.id)] | |
316 | 322 | } | |
317 | 323 | } | |
318 | 324 | } | |
319 | 325 | ||
320 | 326 | ||
321 | 327 | @Verifier(tx) | |
322 | 328 | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
323 | 329 |
github/deemru/w8io/169f3d6 243.02 ms ◑![]()