2023.11.13 11:09 [3907195] smart account 3P8qJyxUqizCWWtEn2zsLZVPzZAjdNGppB1 > SELF 0.00000000 Waves

{ "type": 13, "id": "CUcAwBqoaR4GQKKqqfj1KngrcAQoNHhyCAYtHQP9HNGr", "fee": 4100000, "feeAssetId": null, "timestamp": 1699862986471, "version": 2, "chainId": 87, "sender": "3P8qJyxUqizCWWtEn2zsLZVPzZAjdNGppB1", "senderPublicKey": "HGVrLrtmJhSigh8z7HZvZPThVzQpT5YsqPDaQia6EreW", "proofs": [ "dS12gEvsTT5xSaQrD3Qqmn3arWJGddQtQzpdLSsyVvmpfiQGghn2U1nVpPvuvrgtAxeNmM16NS4hQ9bJmjae73k" ], "script": "base64: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AQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAABHRoaXMJAQAAAAprZXlGYWN0b3J5AAAAAAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAASTm8gY29uZmlnIGF0IHRoaXM9CQAEJQAAAAEFAAAABHRoaXMCAAAACSBmb3Iga2V5PQkBAAAACmtleUZhY3RvcnkAAAAAAQAAABJrZXlGYWN0b3J5QXNzZXRDZmcAAAABAAAAD2Fzc2V0QWRkcmVzc1N0cgkAASwAAAACCQABLAAAAAICAAAAEyVzJXMlc19fZGVmb0Fzc2V0X18FAAAAD2Fzc2V0QWRkcmVzc1N0cgIAAAAIX19jb25maWcBAAAAIGtleUZhY3RvcnlEZWZvQWRkcmVzc0J5QXNzZXRDb2RlAAAAAQAAAAlhc3NldENvZGUJAAEsAAAAAgkAASwAAAACAgAAABMlcyVzJXNfX2RlZm9Bc3NldF9fBQAAAAlhc3NldENvZGUCAAAAFF9fYWRkcmVzc0J5QXNzZXRDb2RlAAAAABBJZHhEZWZvQXNzZXRDb2RlAAAAAAAAAAABAAAAAA5JZHhEZWZvQXNzZXRJZAAAAAAAAAAAAgAAAAASSWR4RGVmb0Fzc2V0U3RhdHVzAAAAAAAAAAADAAAAABBJZHhQcmljZURlY2ltYWxzAAAAAAAAAAAEAAAAAA5JZHhCYXNlQXNzZXRJZAAAAAAAAAAABQAAAAAYSWR4T3ZlckNvbGxhdGVyYWxQZXJjZW50AAAAAAAAAAAGAAAAAA5JZHhNaW5Jbml0UG9vbAAAAAAAAAAABwAAAAAVSWR4UHJpY2VPcmFjbGVBZGRyZXNzAAAAAAAAAAAIAAAAABBJZHhNaW5CdXlQYXltZW50AAAAAAAAAAAJAAAAABFJZHhNaW5TZWxsUGF5bWVudAAAAAAAAAAACgAAAAASSWR4QnV5TG9ja0ludGVydmFsAAAAAAAAAAALAAAAABNJZHhTZWxsTG9ja0ludGVydmFsAAAAAAAAAAAMAAAAABBJZHhCdXlGZWVQZXJjZW50AAAAAAAAAAANAAAAABFJZHhTZWxsRmVlUGVyY2VudAAAAAAAAAAADgEAAAAcZmFjdG9yeVJlYWRBc3NldENmZ0J5QWRkcmVzcwAAAAEAAAAPYXNzZXRBZGRyZXNzU3RyCQAEtQAAAAIJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAApmYWN0b3J5QWNjCQEAAAASa2V5RmFjdG9yeUFzc2V0Q2ZnAAAAAQUAAAAPYXNzZXRBZGRyZXNzU3RyCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAABVObyBjb25maWcgYXQgZmFjdG9yeT0JAAQlAAAAAQUAAAAKZmFjdG9yeUFjYwIAAAAJIGZvciBrZXk9CQEAAAASa2V5RmFjdG9yeUFzc2V0Q2ZnAAAAAQUAAAAPYXNzZXRBZGRyZXNzU3RyAgAAAAJfXwEAAAAZZmFjdG9yeVJlYWRBc3NldENmZ0J5Q29kZQAAAAEAAAAJYXNzZXRDb2RlBAAAAA9hc3NldEFkZHJlc3NTdHIJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAApmYWN0b3J5QWNjCQEAAAAga2V5RmFjdG9yeURlZm9BZGRyZXNzQnlBc3NldENvZGUAAAABBQAAAAlhc3NldENvZGUJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAFU5vIGNvbmZpZyBhdCBmYWN0b3J5PQkABCUAAAABBQAAAApmYWN0b3J5QWNjAgAAAAkgZm9yIGtleT0JAQAAACBrZXlGYWN0b3J5RGVmb0FkZHJlc3NCeUFzc2V0Q29kZQAAAAEFAAAACWFzc2V0Q29kZQkABRQAAAACBQAAAA9hc3NldEFkZHJlc3NTdHIJAQAAABxmYWN0b3J5UmVhZEFzc2V0Q2ZnQnlBZGRyZXNzAAAAAQUAAAAPYXNzZXRBZGRyZXNzU3RyAQAAABJmb3JtYXR0aW5nUHJpY2VNc2cAAAACAAAADGN1cnJlbmN5Q29kZQAAAAVwcmljZQkAAZsAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAQV0FWRVNERUZPUFJFRklYXwUAAAAMY3VycmVuY3lDb2RlAgAAAAFfCQABpAAAAAEFAAAABmhlaWdodAIAAAABXwkAAaQAAAABBQAAAAVwcmljZQEAAAARZmluZFByaWNlc0luUmFuZ2UAAAABAAAABnByaWNlcwQAAAAPbWluUGVyY2Vu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CQEAAAARdGhyb3dCbG9ja2VkRXJyb3IAAAAAAwkBAAAAAiE9AAAAAgUAAAAGaGVpZ2h0BQAAAAlmaW5IZWlnaHQJAQAAAB50aHJvd0ludmFsaWRGaW5hbGl6YXRpb25IZWlnaHQAAAABBQAAAAxmaW5IZWlnaHRTdHIDCQEAAAARaXNHcm91cEZpbmFsYWl6ZWQAAAACBQAAAAhncm91cE51bQUAAAAMZmluSGVpZ2h0U3RyCQEAAAAadGhyb3dHcm91cEFscmVhZHlGaW5hbGl6ZWQAAAACBQAAAAhncm91cE51bQUAAAAMZmluSGVpZ2h0U3RyAwkBAAAAAiE9AAAAAgkAAZEAAAACBQAAABFwdWJLZXlPcmFjbGVzTGlzdAkAAGoAAAACBQAAAAZoZWlnaHQFAAAAC29yYWNsZUNvdW50CQACWAAAAAEIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQkBAAAAGnRocm93T3V0T2ZUdXJuRmluYWxpemF0aW9uAAAAAAMJAQAAAAIhPQAAAAIJAADIAAAAAQUAAAAGc2lnbnMwBQAAAAtzaWduc0xlbmd0aAkBAAAAHHRocm93SW52YWxpZFNpZ25zUGFyYW1MZW5ndGgAAAACAAAAAAAAAAAABQAAAAZzaWduczADCQEAAAACIT0AAAACCQAAyAAAAAEFAAAABnNpZ25zMQUAAAALc2lnbnNMZW5ndGgJAQAAABx0aHJvd0ludmFsaWRTaWduc1BhcmFtTGVuZ3RoAAAAAgAAAAAAAAAAAQUAAAAGc2lnbnMxAwkBAAAAAiE9AAAAAgkAAMgAAAABBQAAAAZzaWduczIFAAAAC3NpZ25zTGVuZ3RoCQEAAAAcdGhyb3dJbnZhbGlkU2lnbnNQYXJhbUxlbmd0aAAAAAIAAAAAAAAAAAIFAAAABnNpZ25zMgMJAQAAAAIhPQAAAAIJAADIAAAAAQUAAAAGc2lnbnMzBQAAAAtzaWduc0xlbmd0aAkBAAAAHHRocm93SW52YWxpZFNpZ25zUGFyYW1MZW5ndGgAAAACAAAAAAAAAAADBQAAAAZzaWduczMEAAAADGdyb3VwRGF0YUtleQkBAAAADGtleUdyb3VwRGF0YQAAAAEFAAAACGdyb3VwTnVtBAAAAAxncm91cERhdGFTdHIJAQAAABN2YWx1ZU9y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CQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAEGtleVByaWNlQnlIZWlnaHQAAAACBQAAAAxjdXJyZW5jeUNvZGUFAAAABmhlaWdodAUAAAAIbmV3UHJpY2UJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAAZrZXlJZHgAAAABBQAAAAxjdXJyZW5jeUNvZGUFAAAABm5ld0lkeAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAADWtleUlkeDJIZWlnaHQAAAACBQAAAAxjdXJyZW5jeUNvZGUFAAAABm5ld0lkeAUAAAAGaGVpZ2h0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAANa2V5SGVpZ2h0MklkeAAAAAIFAAAADGN1cnJlbmN5Q29kZQUAAAAGaGVpZ2h0BQAAAAZuZXdJZHgFAAAAA25pbAAAAAEAAAACdHgBAAAABnZlcmlmeQAAAAAJAAnIAAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAACQACWQAAAAECAAAALEF0SE1ManIyVFB5OGJkcHNNMXJqdXNDeW83Z2h2M2NDWGRFUFpxNFJ0aTJhmUAeXQ==", "height": 3907195, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8UAVcgmuoVSUUsa9hagNzH4QnCqthFf6styCYJhRVkUQ Next: DUgbRSa45VK4q5Ct8yc87Vay8WrDtgDSdxmqKXgR2JZc Full:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let minPricesCount = 3
77
88 let percentPriceOffset = 5
99
1010 func keyFactory () = "%s__factory"
1111
1212
1313 func keyPrice (currencyCode) = ("%s%s__price__" + currencyCode)
1414
1515
1616 func keyPriceFailure (currencyCode) = makeString(["%s%s%d__finalizationFailure", currencyCode, toString(height)], SEP)
1717
1818
1919 func keyLastHeight (currencyCode) = ("%s%s__lastHeight__" + currencyCode)
2020
2121
2222 func keyPriceByHeight (currencyCode,h) = makeString(["%s%s%d__priceByHeight", currencyCode, toString(h)], SEP)
2323
2424
2525 func keyIdx (currencyCode) = ("%s%s__idxCurrent__" + currencyCode)
2626
2727
2828 func keyIdx2Height (currencyCode,idx) = makeString(["%s%s%d__idx2Height", currencyCode, toString(idx)], SEP)
2929
3030
3131 func keyHeight2Idx (currencyCode,h) = makeString(["%s%s%d__height2Idx", currencyCode, toString(h)], SEP)
3232
3333
3434 func keyGroupFinStatus (groupNum,finHeightStr) = makeString(["%s%d%d__groupFinStatus", groupNum, finHeightStr], SEP)
3535
3636
3737 func keyIsMarketOpened (currencyCode) = ("%s%s__isMarketOpened__" + currencyCode)
3838
3939
4040 func keyGroupData (groupNum) = ("%s%d__group__" + groupNum)
4141
4242
4343 func keyEmptyPriceMsg (position) = makeString(["%s%d%d__emptyPriceMsg", toString(height), toString(position)], SEP)
4444
4545
4646 func keyIsBlocked () = "%s__isBlocked"
4747
4848
4949 func keyIsBlockedSender () = "%s%s__isBlocked__sender"
5050
5151
5252 func keyIsBlockedReason () = "%s%s__isBlocked__reason"
5353
5454
5555 func keyOracles () = "%s%s__config__oracles"
5656
5757
5858 func keyBlackSwarmPrice (h) = ("%s%s%d__isBlocked__blackSwarmPrice__" + toString(h))
5959
6060
6161 let factoryAcc = addressFromStringValue(valueOrErrorMessage(getString(this, keyFactory()), ((("No config at this=" + toString(this)) + " for key=") + keyFactory())))
6262
6363 func keyFactoryAssetCfg (assetAddressStr) = (("%s%s%s__defoAsset__" + assetAddressStr) + "__config")
6464
6565
6666 func keyFactoryDefoAddressByAssetCode (assetCode) = (("%s%s%s__defoAsset__" + assetCode) + "__addressByAssetCode")
6767
6868
6969 let IdxDefoAssetCode = 1
7070
7171 let IdxDefoAssetId = 2
7272
7373 let IdxDefoAssetStatus = 3
7474
7575 let IdxPriceDecimals = 4
7676
7777 let IdxBaseAssetId = 5
7878
7979 let IdxOverCollateralPercent = 6
8080
8181 let IdxMinInitPool = 7
8282
8383 let IdxPriceOracleAddress = 8
8484
8585 let IdxMinBuyPayment = 9
8686
8787 let IdxMinSellPayment = 10
8888
8989 let IdxBuyLockInterval = 11
9090
9191 let IdxSellLockInterval = 12
9292
9393 let IdxBuyFeePercent = 13
9494
9595 let IdxSellFeePercent = 14
9696
9797 func factoryReadAssetCfgByAddress (assetAddressStr) = split(valueOrErrorMessage(getString(factoryAcc, keyFactoryAssetCfg(assetAddressStr)), ((("No config at factory=" + toString(factoryAcc)) + " for key=") + keyFactoryAssetCfg(assetAddressStr))), "__")
9898
9999
100100 func factoryReadAssetCfgByCode (assetCode) = {
101101 let assetAddressStr = valueOrErrorMessage(getString(factoryAcc, keyFactoryDefoAddressByAssetCode(assetCode)), ((("No config at factory=" + toString(factoryAcc)) + " for key=") + keyFactoryDefoAddressByAssetCode(assetCode)))
102102 $Tuple2(assetAddressStr, factoryReadAssetCfgByAddress(assetAddressStr))
103103 }
104104
105105
106106 func formattingPriceMsg (currencyCode,price) = toBytes(((((("WAVESDEFOPREFIX_" + currencyCode) + "_") + toString(height)) + "_") + toString(price)))
107107
108108
109109 func findPricesInRange (prices) = {
110110 let minPercentBound = 90
111111 let maxPercentBound = 110
112112 let p0 = prices[0]
113113 let check0 = if ((0 >= prices[0]))
114114 then [0]
115115 else {
116116 let p01 = ((prices[1] * 100) / p0)
117117 let p02 = ((prices[2] * 100) / p0)
118118 let p03 = ((prices[3] * 100) / p0)
119119 let p04 = ((prices[4] * 100) / p0)
120120 let array1 = if (if ((maxPercentBound > p01))
121121 then (p01 > minPercentBound)
122122 else false)
123123 then [1, 0]
124124 else [0]
125125 let array2 = if (if ((maxPercentBound > p02))
126126 then (p02 > minPercentBound)
127127 else false)
128128 then 2 :: array1
129129 else array1
130130 let array3 = if (if ((maxPercentBound > p03))
131131 then (p03 > minPercentBound)
132132 else false)
133133 then 3 :: array2
134134 else array2
135135 if (if ((maxPercentBound > p04))
136136 then (p04 > minPercentBound)
137137 else false)
138138 then 4 :: array3
139139 else array3
140140 }
141141 let check1 = if ((size(check0) >= minPricesCount))
142142 then check0
143143 else {
144144 let p1 = prices[1]
145145 if ((0 >= p1))
146146 then [1]
147147 else {
148148 let p10 = ((prices[0] * 100) / p1)
149149 let p12 = ((prices[2] * 100) / p1)
150150 let p13 = ((prices[3] * 100) / p1)
151151 let p14 = ((prices[4] * 100) / p1)
152152 let array1 = if (if ((maxPercentBound > p10))
153153 then (p10 > minPercentBound)
154154 else false)
155155 then [0, 1]
156156 else [1]
157157 let array2 = if (if ((maxPercentBound > p12))
158158 then (p12 > minPercentBound)
159159 else false)
160160 then 2 :: array1
161161 else array1
162162 let array3 = if (if ((maxPercentBound > p13))
163163 then (p13 > minPercentBound)
164164 else false)
165165 then 3 :: array2
166166 else array2
167167 if (if ((maxPercentBound > p14))
168168 then (p14 > minPercentBound)
169169 else false)
170170 then 4 :: array3
171171 else array3
172172 }
173173 }
174174 let check2 = if ((size(check1) >= minPricesCount))
175175 then check1
176176 else {
177177 let p2 = prices[2]
178178 if ((0 >= p2))
179179 then [2]
180180 else {
181181 let p20 = ((prices[0] * 100) / p2)
182182 let p21 = ((prices[1] * 100) / p2)
183183 let p23 = ((prices[3] * 100) / p2)
184184 let p24 = ((prices[4] * 100) / p2)
185185 let array1 = if (if ((maxPercentBound > p20))
186186 then (p20 > minPercentBound)
187187 else false)
188188 then [0, 2]
189189 else [2]
190190 let array2 = if (if ((maxPercentBound > p21))
191191 then (p21 > minPercentBound)
192192 else false)
193193 then 1 :: array1
194194 else array1
195195 let array3 = if (if ((maxPercentBound > p23))
196196 then (p23 > minPercentBound)
197197 else false)
198198 then 3 :: array2
199199 else array2
200200 if (if ((maxPercentBound > p24))
201201 then (p24 > minPercentBound)
202202 else false)
203203 then 4 :: array3
204204 else array3
205205 }
206206 }
207207 let check3 = if ((size(check2) >= minPricesCount))
208208 then check2
209209 else {
210210 let p3 = prices[3]
211211 if ((0 >= p3))
212212 then [3]
213213 else {
214214 let p30 = ((prices[0] * 100) / p3)
215215 let p31 = ((prices[1] * 100) / p3)
216216 let p32 = ((prices[2] * 100) / p3)
217217 let p34 = ((prices[4] * 100) / p3)
218218 let array1 = if (if ((maxPercentBound > p30))
219219 then (p30 > minPercentBound)
220220 else false)
221221 then [0, 3]
222222 else [3]
223223 let array2 = if (if ((maxPercentBound > p31))
224224 then (p31 > minPercentBound)
225225 else false)
226226 then 1 :: array1
227227 else array1
228228 let array3 = if (if ((maxPercentBound > p32))
229229 then (p32 > minPercentBound)
230230 else false)
231231 then 2 :: array2
232232 else array2
233233 if (if ((maxPercentBound > p34))
234234 then (p34 > minPercentBound)
235235 else false)
236236 then 4 :: array3
237237 else array3
238238 }
239239 }
240240 if ((size(check3) >= minPricesCount))
241241 then check3
242242 else {
243243 let p4 = prices[4]
244244 if ((0 >= p4))
245245 then [4]
246246 else {
247247 let p40 = ((prices[0] * 100) / p4)
248248 let p41 = ((prices[1] * 100) / p4)
249249 let p42 = ((prices[2] * 100) / p4)
250250 let p43 = ((prices[3] * 100) / p4)
251251 let array1 = if (if ((maxPercentBound > p40))
252252 then (p40 > minPercentBound)
253253 else false)
254254 then [0, 4]
255255 else [4]
256256 let array2 = if (if ((maxPercentBound > p41))
257257 then (p41 > minPercentBound)
258258 else false)
259259 then 1 :: array1
260260 else array1
261261 let array3 = if (if ((maxPercentBound > p42))
262262 then (p42 > minPercentBound)
263263 else false)
264264 then 2 :: array2
265265 else array2
266266 if (if ((maxPercentBound > p43))
267267 then (p43 > minPercentBound)
268268 else false)
269269 then 3 :: array3
270270 else array3
271271 }
272272 }
273273 }
274274
275275
276276 func readPriceByHeight (currencyCode,h) = valueOrElse(getInteger(this, keyPriceByHeight(currencyCode, h)), 0)
277277
278278
279279 func isGroupFinalaized (groupNum,finHeightStr) = isDefined(getBoolean(this, keyGroupFinStatus(groupNum, finHeightStr)))
280280
281281
282282 func readGroupDataOrFail (groupNum) = {
283283 let k = keyGroupData(groupNum)
284284 let groupDataOpt = getString(this, k)
285285 if (isDefined(groupDataOpt))
286286 then value(groupDataOpt)
287287 else throw(("empty group data for key=" + k))
288288 }
289289
290290
291291 let isBlocked = valueOrElse(getBoolean(this, keyIsBlocked()), false)
292292
293293 let pubKeyOraclesList = split(getStringValue(this, keyOracles()), ",")
294294
295295 let oracleCount = size(pubKeyOraclesList)
296296
297297 func throwInvalidFinalizationHeight (finHeightStr) = throw(((("invalid finalization height: height=" + toString(height)) + " finalizationHeight=") + finHeightStr))
298298
299299
300300 func throwGroupAlreadyFinalized (groupNum,finHeightStr) = throw((((("prices for groupNum=" + groupNum) + " at ") + finHeightStr) + " height have been already finalized"))
301301
302302
303303 func throwInvalidSignsParamLength (num,param) = throw(((((("invalid signs" + toString(num)) + " parameter: actual.size=") + toString(size(param))) + " base58Val=") + toBase58String(param)))
304304
305305
306306 func throwOutOfTurnFinalization () = throw(((("Out of turn finalization: " + toString(height)) + " block should be finalize by ") + pubKeyOraclesList[(height % oracleCount)]))
307307
308308
309309 func throwBlockedError () = throw("contract is blocked by EMERGENCY SHUTDOWN action")
310310
311311
312312 func finalizePriceV2Common (position,groupNum,groupDataStr,msgArray,signs) = {
313313 let msgOffset = (position * 3)
314314 if ((msgOffset >= size(msgArray)))
315315 then [StringEntry(keyEmptyPriceMsg(position), "price data is empty")]
316316 else {
317317 let currencyCode = msgArray[(msgOffset + 0)]
318318 let newPriceStr = msgArray[(msgOffset + 1)]
319319 let isMarketOpenedStr = msgArray[(msgOffset + 2)]
320320 let newPriceOpt = parseInt(newPriceStr)
321321 let isMarketOpenedOpt = parseInt(isMarketOpenedStr)
322322 let sig0 = take(signs, 64)
323323 let sig1 = take(drop(signs, 64), 64)
324324 let sig2 = take(drop(signs, 128), 64)
325325 let sig3 = take(drop(signs, 192), 64)
326326 let sig4 = takeRightBytes(signs, 64)
327327 if (contains(groupDataStr, currencyCode))
328328 then if (if (isDefined(newPriceOpt))
329329 then isDefined(isMarketOpenedOpt)
330330 else false)
331331 then {
332332 let newPrice = value(newPriceOpt)
333333 let isMarketOpened = if ((value(isMarketOpenedOpt) == 1))
334334 then true
335335 else false
336336 let priceMsgStr = makeString(["WAVES:DEFO:PROTOCOL:PRICE:V002", groupNum, toString(height), currencyCode, newPriceStr, isMarketOpenedStr], "_")
337337 let priceMsg = toBytes(priceMsgStr)
338338 let verificationsCount = (((((if (sigVerify_8Kb(priceMsg, sig0, fromBase58String(pubKeyOraclesList[0])))
339339 then 1
340340 else 0) + (if (sigVerify_8Kb(priceMsg, sig1, fromBase58String(pubKeyOraclesList[1])))
341341 then 1
342342 else 0)) + (if (sigVerify_8Kb(priceMsg, sig2, fromBase58String(pubKeyOraclesList[2])))
343343 then 1
344344 else 0)) + (if (sigVerify_8Kb(priceMsg, sig3, fromBase58String(pubKeyOraclesList[3])))
345345 then 1
346346 else 0)) + (if (sigVerify_8Kb(priceMsg, sig4, fromBase58String(pubKeyOraclesList[4])))
347347 then 1
348348 else 0))
349349 if ((verificationsCount >= minPricesCount))
350350 then {
351351 let price = valueOrElse(getInteger(this, keyPrice(currencyCode)), 0)
352352 let idx = valueOrElse(getInteger(this, keyIdx(currencyCode)), 0)
353353 if (if ((price != 0))
354354 then if ((newPrice >= (price + ((price * percentPriceOffset) / 100))))
355355 then true
356356 else ((price - ((price * percentPriceOffset) / 100)) >= newPrice)
357357 else false)
358358 then {
359359 let reason = "automatic emergency shutdown because of large price variability"
360360 [BooleanEntry(keyIsBlocked(), true), StringEntry(keyIsBlockedSender(), toString(this)), StringEntry(keyIsBlockedReason(), reason), IntegerEntry(keyBlackSwarmPrice(height), newPrice)]
361361 }
362362 else {
363363 let newIdx = (idx + 1)
364364 [IntegerEntry(keyPrice(currencyCode), newPrice), IntegerEntry(keyLastHeight(currencyCode), height), IntegerEntry(keyPriceByHeight(currencyCode, height), newPrice), IntegerEntry(keyIdx(currencyCode), newIdx), IntegerEntry(keyIdx2Height(currencyCode, newIdx), height), IntegerEntry(keyHeight2Idx(currencyCode, height), newIdx), BooleanEntry(keyIsMarketOpened(currencyCode), isMarketOpened)]
365365 }
366366 }
367367 else [StringEntry(keyPriceFailure(currencyCode), ((((((((("verificationsCount = " + toString(verificationsCount)) + "signs0.length=") + toString(size(signs))) + " msg0 = ") + priceMsgStr) + " sig0 = ") + toBase58String(sig0)) + " key0 = ") + pubKeyOraclesList[0]))]
368368 }
369369 else [StringEntry(keyPriceFailure(currencyCode), ((("data parsing error: newPrice=" + newPriceStr) + " isMarketOpened=") + isMarketOpenedStr))]
370370 else [StringEntry(keyPriceFailure(currencyCode), ((currencyCode + " doesn't exist in group: groupDataStr=") + groupDataStr))]
371371 }
372372 }
373373
374374
375375 @Callable(i)
376376 func finalizeCurrentPriceV2 (header,msg,signs0,signs1,signs2,signs3) = {
377377 let headerArray = split(header, "_")
378378 let groupNum = headerArray[1]
379379 let finHeightStr = headerArray[2]
380380 let finHeight = parseIntValue(finHeightStr)
381381 let signsLength = (64 * oracleCount)
382382 if (isBlocked)
383383 then throwBlockedError()
384384 else if ((height != finHeight))
385385 then throwInvalidFinalizationHeight(finHeightStr)
386386 else if (isGroupFinalaized(groupNum, finHeightStr))
387387 then throwGroupAlreadyFinalized(groupNum, finHeightStr)
388388 else if ((pubKeyOraclesList[(height % oracleCount)] != toBase58String(i.callerPublicKey)))
389389 then throwOutOfTurnFinalization()
390390 else if ((size(signs0) != signsLength))
391391 then throwInvalidSignsParamLength(0, signs0)
392392 else if ((size(signs1) != signsLength))
393393 then throwInvalidSignsParamLength(1, signs1)
394394 else if ((size(signs2) != signsLength))
395395 then throwInvalidSignsParamLength(2, signs2)
396396 else if ((size(signs3) != signsLength))
397397 then throwInvalidSignsParamLength(3, signs3)
398398 else {
399399 let groupDataKey = keyGroupData(groupNum)
400400 let groupDataStr = valueOrErrorMessage(getString(this, groupDataKey), ("empty group data for key=" + groupDataKey))
401401 let msgArray = split(msg, "_")
402402 if (((size(msgArray) % 3) != 0))
403403 then throw(("msg parameters count must be multiple of 3: msgArray.size=" + toString(size(msg))))
404404 else ((((finalizePriceV2Common(0, groupNum, groupDataStr, msgArray, signs0) ++ finalizePriceV2Common(1, groupNum, groupDataStr, msgArray, signs1)) ++ finalizePriceV2Common(2, groupNum, groupDataStr, msgArray, signs2)) ++ finalizePriceV2Common(3, groupNum, groupDataStr, msgArray, signs3)) :+ BooleanEntry(keyGroupFinStatus(groupNum, finHeightStr), true))
405405 }
406406 }
407407
408408
409409
410410 @Callable(i)
411411 func finalizeCurrentPrice (currencyCode,price1,sign1,price2,sign2,price3,sign3,price4,sign4,price5,sign5) = {
412412 let price = valueOrElse(getInteger(this, keyPrice(currencyCode)), 0)
413413 let idx = valueOrElse(getInteger(this, keyIdx(currencyCode)), 0)
414414 let currencyCfg = factoryReadAssetCfgByCode(currencyCode)._2
415415 if (isBlocked)
416416 then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
417417 else if ((currencyCfg[IdxDefoAssetStatus] != "ISSUED"))
418418 then throw(((currencyCode + " has not been issued yet: status=") + currencyCfg[IdxDefoAssetStatus]))
419419 else if ((readPriceByHeight(currencyCode, height) != 0))
420420 then throw("wait next block")
421421 else if ((pubKeyOraclesList[(height % 5)] != toBase58String(i.callerPublicKey)))
422422 then throw(((("Out of turn finalization: " + toString(height)) + " block should be finalize by ") + pubKeyOraclesList[(height % 5)]))
423423 else {
424424 let prices = [if (sigVerify_8Kb(formattingPriceMsg(currencyCode, price1), sign1, fromBase58String(pubKeyOraclesList[0])))
425425 then price1
426426 else 0, if (sigVerify_8Kb(formattingPriceMsg(currencyCode, price2), sign2, fromBase58String(pubKeyOraclesList[1])))
427427 then price2
428428 else 0, if (sigVerify_8Kb(formattingPriceMsg(currencyCode, price3), sign3, fromBase58String(pubKeyOraclesList[2])))
429429 then price3
430430 else 0, if (sigVerify_8Kb(formattingPriceMsg(currencyCode, price4), sign4, fromBase58String(pubKeyOraclesList[3])))
431431 then price4
432432 else 0, if (sigVerify_8Kb(formattingPriceMsg(currencyCode, price5), sign5, fromBase58String(pubKeyOraclesList[4])))
433433 then price5
434434 else 0]
435435 let zeroPriceCount = (((((if ((prices[0] == 0))
436436 then 1
437437 else 0) + (if ((prices[1] == 0))
438438 then 1
439439 else 0)) + (if ((prices[2] == 0))
440440 then 1
441441 else 0)) + (if ((prices[3] == 0))
442442 then 1
443443 else 0)) + (if ((prices[4] == 0))
444444 then 1
445445 else 0))
446446 if ((zeroPriceCount >= minPricesCount))
447447 then throw((toString(minPricesCount) + " prices or more are equals to 0"))
448448 else {
449449 let pricesInRange = findPricesInRange(prices)
450450 let priceProvidingCount = size(pricesInRange)
451451 if ((minPricesCount > priceProvidingCount))
452452 then throw(((((((((((((((((((((("Could not finalize price because of big variation: height=" + toString(height)) + "
453453 ") + pubKeyOraclesList[0]) + "=") + toString(prices[0])) + "
454454 ") + pubKeyOraclesList[1]) + "=") + toString(prices[1])) + "
455455 ") + pubKeyOraclesList[2]) + "=") + toString(prices[2])) + "
456456 ") + pubKeyOraclesList[3]) + "=") + toString(prices[3])) + "
457457 ") + pubKeyOraclesList[4]) + "=") + toString(prices[4])))
458458 else {
459459 let sum1 = ((prices[pricesInRange[0]] + prices[pricesInRange[1]]) + prices[pricesInRange[2]])
460460 let sum2 = if ((priceProvidingCount >= 4))
461461 then (sum1 + prices[pricesInRange[3]])
462462 else sum1
463463 let priceSum = if ((priceProvidingCount >= 5))
464464 then (sum2 + prices[pricesInRange[4]])
465465 else sum2
466466 if ((priceProvidingCount >= 6))
467467 then throw("Invalid pricesInRange creation")
468468 else {
469469 let newPrice = (priceSum / priceProvidingCount)
470470 if (if ((price != 0))
471471 then if ((newPrice >= (price + ((price * percentPriceOffset) / 100))))
472472 then true
473473 else ((price - ((price * percentPriceOffset) / 100)) >= newPrice)
474474 else false)
475475 then {
476476 let reason = "automatic emergency shutdown because of large price variability"
477477 [BooleanEntry(keyIsBlocked(), true), StringEntry(keyIsBlockedSender(), toString(this)), StringEntry(keyIsBlockedReason(), reason), IntegerEntry(keyBlackSwarmPrice(height), newPrice)]
478478 }
479479 else {
480480 let newIdx = (idx + 1)
481481 [IntegerEntry(keyPrice(currencyCode), newPrice), IntegerEntry(keyLastHeight(currencyCode), height), IntegerEntry(keyPriceByHeight(currencyCode, height), newPrice), IntegerEntry(keyIdx(currencyCode), newIdx), IntegerEntry(keyIdx2Height(currencyCode, newIdx), height), IntegerEntry(keyHeight2Idx(currencyCode, height), newIdx)]
482482 }
483483 }
484484 }
485485 }
486486 }
487487 }
488488
489489
490490 @Verifier(tx)
491491 func verify () = sigVerify_128Kb(tx.bodyBytes, tx.proofs[0], fromBase58String("AtHMLjr2TPy8bdpsM1rjusCyo7ghv3cCXdEPZq4Rti2a"))
492492

github/deemru/w8io/786bc32 
69.96 ms