tx · AFejYePKZKTVeyvdC2M8MXdHRTAzKZCgf3R3kdsqTznS

3MxyAK73VtRLuGw8akjD29XGggSDUv27jnz:  -0.02000000 Waves

2020.03.09 16:04 [901601] smart account 3MxyAK73VtRLuGw8akjD29XGggSDUv27jnz > SELF 0.00000000 Waves

{ "type": 13, "id": "AFejYePKZKTVeyvdC2M8MXdHRTAzKZCgf3R3kdsqTznS", "fee": 2000000, "feeAssetId": null, "timestamp": 1583759093678, "version": 1, "sender": "3MxyAK73VtRLuGw8akjD29XGggSDUv27jnz", "senderPublicKey": "Bh3rq6RyBJuiExqMwRKXWFDcXXqkmXFKfA3pC2akvS2G", "proofs": [ "4iUGoVYq5oGKtT2YetEdujgQVLehmupoVuFzgnKzuPCWrPJjqDpNo9Po2QqoqyxTDDmPn2E6dBdjZBW1D5Bt8QQL" ], "script": "base64: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", "chainId": 84, "height": 901601, "spentComplexity": 0 } View: original | compacted Prev: Dc5VPKxHcEQk2Q4p2aLwL57XayetHCxiceGCm6bKvBMz Next: none Diff:
OldNewDifferences
285285 0
286286 } != 0))
287287 then throw("wait next block")
288- else {
289- let prices = [if (sigVerify(formattingPriceMsg(price1, height), sign1, fromBase58String(pubKeyOraclesList[0])))
290- then price1
291- else 0, if (sigVerify(formattingPriceMsg(price2, height), sign2, fromBase58String(pubKeyOraclesList[1])))
292- then price2
293- else 0, if (sigVerify(formattingPriceMsg(price3, height), sign3, fromBase58String(pubKeyOraclesList[2])))
294- then price3
295- else 0, if (sigVerify(formattingPriceMsg(price4, height), sign4, fromBase58String(pubKeyOraclesList[3])))
296- then price4
297- else 0, if (sigVerify(formattingPriceMsg(price5, height), sign5, fromBase58String(pubKeyOraclesList[4])))
298- then price5
299- else 0]
300- let pricesInRange = findPricesInRange(prices)
301- let priceProvidingCount = size(pricesInRange)
302- if ((3 > priceProvidingCount))
303- then throw(((((((((((((((((((((("Could not finalize price because of big variation: height=" + toString(height)) + "
288+ else if ((pubKeyOraclesList[(height % 5)] != toBase58String(i.callerPublicKey)))
289+ then throw(((("Out of turn finalization: " + toString(height)) + " block should be finalize by ") + pubKeyOraclesList[(height % 5)]))
290+ else {
291+ let prices = [if (sigVerify(formattingPriceMsg(price1, height), sign1, fromBase58String(pubKeyOraclesList[0])))
292+ then price1
293+ else 0, if (sigVerify(formattingPriceMsg(price2, height), sign2, fromBase58String(pubKeyOraclesList[1])))
294+ then price2
295+ else 0, if (sigVerify(formattingPriceMsg(price3, height), sign3, fromBase58String(pubKeyOraclesList[2])))
296+ then price3
297+ else 0, if (sigVerify(formattingPriceMsg(price4, height), sign4, fromBase58String(pubKeyOraclesList[3])))
298+ then price4
299+ else 0, if (sigVerify(formattingPriceMsg(price5, height), sign5, fromBase58String(pubKeyOraclesList[4])))
300+ then price5
301+ else 0]
302+ let pricesInRange = findPricesInRange(prices)
303+ let priceProvidingCount = size(pricesInRange)
304+ if ((3 > priceProvidingCount))
305+ then throw(((((((((((((((((((((("Could not finalize price because of big variation: height=" + toString(height)) + "
304306 ") + pubKeyOraclesList[0]) + "=") + toString(prices[0])) + "
305307 ") + pubKeyOraclesList[1]) + "=") + toString(prices[1])) + "
306308 ") + pubKeyOraclesList[2]) + "=") + toString(prices[2])) + "
307309 ") + pubKeyOraclesList[3]) + "=") + toString(prices[3])) + "
308310 ") + pubKeyOraclesList[4]) + "=") + toString(prices[4])))
309- else {
310- let sum1 = ((prices[pricesInRange[0]] + prices[pricesInRange[1]]) + prices[pricesInRange[2]])
311- let sum2 = if ((priceProvidingCount >= 4))
312- then (sum1 + prices[pricesInRange[3]])
313- else sum1
314- let priceSum = if ((priceProvidingCount >= 5))
315- then (sum2 + prices[pricesInRange[4]])
316- else sum2
317- if ((priceProvidingCount >= 6))
318- then throw("Invalid pricesInRange creation")
319- else {
320- let newPrice = (priceSum / priceProvidingCount)
321- if (if ((newPrice >= (price + ((price * percentPriceOffset) / 100))))
322- then true
323- else ((price - ((price * percentPriceOffset) / 100)) >= newPrice))
324- then WriteSet([DataEntry("is_blocked", true), DataEntry((("black_swarm_price" + "_") + toString(height)), newPrice)])
325- else {
326- let newPriceIndex = (priceIndex + 1)
327- WriteSet([DataEntry("price", newPrice), DataEntry(("price_" + toString(height)), newPrice), DataEntry("price_index", newPriceIndex), DataEntry(("price_index_" + toString(newPriceIndex)), height)])
328- }
329- }
330- }
331- }
311+ else {
312+ let sum1 = ((prices[pricesInRange[0]] + prices[pricesInRange[1]]) + prices[pricesInRange[2]])
313+ let sum2 = if ((priceProvidingCount >= 4))
314+ then (sum1 + prices[pricesInRange[3]])
315+ else sum1
316+ let priceSum = if ((priceProvidingCount >= 5))
317+ then (sum2 + prices[pricesInRange[4]])
318+ else sum2
319+ if ((priceProvidingCount >= 6))
320+ then throw("Invalid pricesInRange creation")
321+ else {
322+ let newPrice = (priceSum / priceProvidingCount)
323+ if (if ((newPrice >= (price + ((price * percentPriceOffset) / 100))))
324+ then true
325+ else ((price - ((price * percentPriceOffset) / 100)) >= newPrice))
326+ then WriteSet([DataEntry("is_blocked", true), DataEntry((("black_swarm_price" + "_") + toString(height)), newPrice)])
327+ else {
328+ let newPriceIndex = (priceIndex + 1)
329+ WriteSet([DataEntry("price", newPrice), DataEntry(("price_" + toString(height)), newPrice), DataEntry("price_index", newPriceIndex), DataEntry(("price_index_" + toString(newPriceIndex)), height)])
330+ }
331+ }
332+ }
333+ }
332334
333335
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func convertWavesToNeutrino (amount,price) = fraction(fraction(amount, price, 100), 1000000, 100000000)
55
66
77 func getStringByKey (key) = match getString(this, key) {
88 case a: String =>
99 a
1010 case _ =>
1111 ""
1212 }
1313
1414
1515 func getNumberByAddressAndKey (address,key) = match getInteger(addressFromStringValue(address), key) {
1616 case a: Int =>
1717 a
1818 case _ =>
1919 0
2020 }
2121
2222
2323 func getOracleProvideHeight (ownerPub,height) = match getInteger(addressFromPublicKey(ownerPub), ("price_" + toString(height))) {
2424 case a: Int =>
2525 a
2626 case _ =>
2727 0
2828 }
2929
3030
3131 func getStringByAddressAndKey (address,key) = match getString(address, key) {
3232 case a: String =>
3333 a
3434 case _ =>
3535 ""
3636 }
3737
3838
3939 func dropElementInJsonArray (array,element) = {
4040 let splitedArray = split(array, element)
4141 if ((take(splitedArray[1], 1) == ","))
4242 then (splitedArray[0] + drop(splitedArray[1], 1))
4343 else (dropRight(splitedArray[0], 1) + splitedArray[1])
4444 }
4545
4646
4747 func convertJsonArrayToList (jsonArray) = split(jsonArray, ",")
4848
4949
5050 let BLOCK = "block"
5151
5252 let UNBLOCK = "unblock"
5353
5454 let UPDATE = "update"
5555
5656 let SIGNPREFIX = "WAVESNEUTRINOPREFIX"
5757
5858 let OraclesKey = "oracles"
5959
6060 let PriceOffsetKey = "price_offset"
6161
6262 let PriceKey = "price"
6363
6464 let IsBlockedKey = "is_blocked"
6565
6666 let PriceIndexKey = "price_index"
6767
6868 let price = match getInteger(this, "price") {
6969 case a: Int =>
7070 a
7171 case _ =>
7272 0
7373 }
7474
7575 let priceIndex = match getInteger(this, "price_index") {
7676 case a: Int =>
7777 a
7878 case _ =>
7979 0
8080 }
8181
8282 let isBlocked = match getBoolean(this, "is_blocked") {
8383 case a: Boolean =>
8484 a
8585 case _ =>
8686 false
8787 }
8888
8989 let percentPriceOffset = 7
9090
9191 let pubKeyOracles = getStringByKey(OraclesKey)
9292
9393 let pubKeyOraclesList = convertJsonArrayToList(pubKeyOracles)
9494
9595 let bftCoefficientOracle = 3
9696
9797 func findPricesInRange (prices) = {
9898 let minPercentBound = 90
9999 let maxPercentBound = 110
100100 let p0 = prices[0]
101101 let check0 = if ((0 >= prices[0]))
102102 then [0]
103103 else {
104104 let p01 = ((prices[1] * 100) / p0)
105105 let p02 = ((prices[2] * 100) / p0)
106106 let p03 = ((prices[3] * 100) / p0)
107107 let p04 = ((prices[4] * 100) / p0)
108108 let array1 = if (if ((maxPercentBound > p01))
109109 then (p01 > minPercentBound)
110110 else false)
111111 then [1, 0]
112112 else [0]
113113 let array2 = if (if ((maxPercentBound > p02))
114114 then (p02 > minPercentBound)
115115 else false)
116116 then 2 :: array1
117117 else array1
118118 let array3 = if (if ((maxPercentBound > p03))
119119 then (p03 > minPercentBound)
120120 else false)
121121 then 3 :: array2
122122 else array2
123123 if (if ((maxPercentBound > p04))
124124 then (p04 > minPercentBound)
125125 else false)
126126 then 4 :: array3
127127 else array3
128128 }
129129 let check1 = if ((size(check0) >= 3))
130130 then check0
131131 else {
132132 let p1 = prices[1]
133133 if ((0 >= p1))
134134 then [1]
135135 else {
136136 let p10 = ((prices[0] * 100) / p1)
137137 let p12 = ((prices[2] * 100) / p1)
138138 let p13 = ((prices[3] * 100) / p1)
139139 let p14 = ((prices[4] * 100) / p1)
140140 let array1 = if (if ((maxPercentBound > p10))
141141 then (p10 > minPercentBound)
142142 else false)
143143 then [0, 1]
144144 else [1]
145145 let array2 = if (if ((maxPercentBound > p12))
146146 then (p12 > minPercentBound)
147147 else false)
148148 then 2 :: array1
149149 else array1
150150 let array3 = if (if ((maxPercentBound > p13))
151151 then (p13 > minPercentBound)
152152 else false)
153153 then 3 :: array2
154154 else array2
155155 if (if ((maxPercentBound > p14))
156156 then (p14 > minPercentBound)
157157 else false)
158158 then 4 :: array3
159159 else array3
160160 }
161161 }
162162 let check2 = if ((size(check1) >= 3))
163163 then check1
164164 else {
165165 let p2 = prices[2]
166166 if ((0 >= p2))
167167 then [2]
168168 else {
169169 let p20 = ((prices[0] * 100) / p2)
170170 let p21 = ((prices[1] * 100) / p2)
171171 let p23 = ((prices[3] * 100) / p2)
172172 let p24 = ((prices[4] * 100) / p2)
173173 let array1 = if (if ((maxPercentBound > p20))
174174 then (p20 > minPercentBound)
175175 else false)
176176 then [0, 2]
177177 else [2]
178178 let array2 = if (if ((maxPercentBound > p21))
179179 then (p21 > minPercentBound)
180180 else false)
181181 then 1 :: array1
182182 else array1
183183 let array3 = if (if ((maxPercentBound > p23))
184184 then (p23 > minPercentBound)
185185 else false)
186186 then 3 :: array2
187187 else array2
188188 if (if ((maxPercentBound > p24))
189189 then (p24 > minPercentBound)
190190 else false)
191191 then 4 :: array3
192192 else array3
193193 }
194194 }
195195 let check3 = if ((size(check2) >= 3))
196196 then check2
197197 else {
198198 let p3 = prices[3]
199199 if ((0 >= p3))
200200 then [3]
201201 else {
202202 let p30 = ((prices[0] * 100) / p3)
203203 let p31 = ((prices[1] * 100) / p3)
204204 let p32 = ((prices[2] * 100) / p3)
205205 let p34 = ((prices[4] * 100) / p3)
206206 let array1 = if (if ((maxPercentBound > p30))
207207 then (p30 > minPercentBound)
208208 else false)
209209 then [0, 3]
210210 else [3]
211211 let array2 = if (if ((maxPercentBound > p31))
212212 then (p31 > minPercentBound)
213213 else false)
214214 then 1 :: array1
215215 else array1
216216 let array3 = if (if ((maxPercentBound > p32))
217217 then (p32 > minPercentBound)
218218 else false)
219219 then 2 :: array2
220220 else array2
221221 if (if ((maxPercentBound > p34))
222222 then (p34 > minPercentBound)
223223 else false)
224224 then 4 :: array3
225225 else array3
226226 }
227227 }
228228 if ((size(check3) >= 3))
229229 then check3
230230 else {
231231 let p4 = prices[4]
232232 if ((0 >= p4))
233233 then [4]
234234 else {
235235 let p40 = ((prices[0] * 100) / p4)
236236 let p41 = ((prices[1] * 100) / p4)
237237 let p42 = ((prices[2] * 100) / p4)
238238 let p43 = ((prices[3] * 100) / p4)
239239 let array1 = if (if ((maxPercentBound > p40))
240240 then (p40 > minPercentBound)
241241 else false)
242242 then [0, 4]
243243 else [4]
244244 let array2 = if (if ((maxPercentBound > p41))
245245 then (p41 > minPercentBound)
246246 else false)
247247 then 1 :: array1
248248 else array1
249249 let array3 = if (if ((maxPercentBound > p42))
250250 then (p42 > minPercentBound)
251251 else false)
252252 then 2 :: array2
253253 else array2
254254 if (if ((maxPercentBound > p43))
255255 then (p43 > minPercentBound)
256256 else false)
257257 then 3 :: array3
258258 else array3
259259 }
260260 }
261261 }
262262
263263
264264 func formattingPriceMsg (price,height) = toBytes(((((SIGNPREFIX + "_") + toString(height)) + "_") + toString(price)))
265265
266266
267267 @Callable(i)
268268 func callEmergencyShutdown (reason) = {
269269 let AutoEmergencyOracleAddress = "3P7ihFVxBNbHK237TNdPxT1xHEu8pHexXTr"
270270 let callerAddress = toString(i.caller)
271271 if ((AutoEmergencyOracleAddress != callerAddress))
272272 then throw("caller must be one an emergency oracle")
273273 else WriteSet([DataEntry("is_blocked", true), DataEntry("is_blocked_caller", callerAddress), DataEntry("is_blocked_reason", reason)])
274274 }
275275
276276
277277
278278 @Callable(i)
279279 func finalizeCurrentPrice (price1,sign1,price2,sign2,price3,sign3,price4,sign4,price5,sign5) = if (isBlocked)
280280 then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles")
281281 else if (( match getInteger(this, ("price_" + toString(height))) {
282282 case a: Int =>
283283 a
284284 case _ =>
285285 0
286286 } != 0))
287287 then throw("wait next block")
288- else {
289- let prices = [if (sigVerify(formattingPriceMsg(price1, height), sign1, fromBase58String(pubKeyOraclesList[0])))
290- then price1
291- else 0, if (sigVerify(formattingPriceMsg(price2, height), sign2, fromBase58String(pubKeyOraclesList[1])))
292- then price2
293- else 0, if (sigVerify(formattingPriceMsg(price3, height), sign3, fromBase58String(pubKeyOraclesList[2])))
294- then price3
295- else 0, if (sigVerify(formattingPriceMsg(price4, height), sign4, fromBase58String(pubKeyOraclesList[3])))
296- then price4
297- else 0, if (sigVerify(formattingPriceMsg(price5, height), sign5, fromBase58String(pubKeyOraclesList[4])))
298- then price5
299- else 0]
300- let pricesInRange = findPricesInRange(prices)
301- let priceProvidingCount = size(pricesInRange)
302- if ((3 > priceProvidingCount))
303- then throw(((((((((((((((((((((("Could not finalize price because of big variation: height=" + toString(height)) + "
288+ else if ((pubKeyOraclesList[(height % 5)] != toBase58String(i.callerPublicKey)))
289+ then throw(((("Out of turn finalization: " + toString(height)) + " block should be finalize by ") + pubKeyOraclesList[(height % 5)]))
290+ else {
291+ let prices = [if (sigVerify(formattingPriceMsg(price1, height), sign1, fromBase58String(pubKeyOraclesList[0])))
292+ then price1
293+ else 0, if (sigVerify(formattingPriceMsg(price2, height), sign2, fromBase58String(pubKeyOraclesList[1])))
294+ then price2
295+ else 0, if (sigVerify(formattingPriceMsg(price3, height), sign3, fromBase58String(pubKeyOraclesList[2])))
296+ then price3
297+ else 0, if (sigVerify(formattingPriceMsg(price4, height), sign4, fromBase58String(pubKeyOraclesList[3])))
298+ then price4
299+ else 0, if (sigVerify(formattingPriceMsg(price5, height), sign5, fromBase58String(pubKeyOraclesList[4])))
300+ then price5
301+ else 0]
302+ let pricesInRange = findPricesInRange(prices)
303+ let priceProvidingCount = size(pricesInRange)
304+ if ((3 > priceProvidingCount))
305+ then throw(((((((((((((((((((((("Could not finalize price because of big variation: height=" + toString(height)) + "
304306 ") + pubKeyOraclesList[0]) + "=") + toString(prices[0])) + "
305307 ") + pubKeyOraclesList[1]) + "=") + toString(prices[1])) + "
306308 ") + pubKeyOraclesList[2]) + "=") + toString(prices[2])) + "
307309 ") + pubKeyOraclesList[3]) + "=") + toString(prices[3])) + "
308310 ") + pubKeyOraclesList[4]) + "=") + toString(prices[4])))
309- else {
310- let sum1 = ((prices[pricesInRange[0]] + prices[pricesInRange[1]]) + prices[pricesInRange[2]])
311- let sum2 = if ((priceProvidingCount >= 4))
312- then (sum1 + prices[pricesInRange[3]])
313- else sum1
314- let priceSum = if ((priceProvidingCount >= 5))
315- then (sum2 + prices[pricesInRange[4]])
316- else sum2
317- if ((priceProvidingCount >= 6))
318- then throw("Invalid pricesInRange creation")
319- else {
320- let newPrice = (priceSum / priceProvidingCount)
321- if (if ((newPrice >= (price + ((price * percentPriceOffset) / 100))))
322- then true
323- else ((price - ((price * percentPriceOffset) / 100)) >= newPrice))
324- then WriteSet([DataEntry("is_blocked", true), DataEntry((("black_swarm_price" + "_") + toString(height)), newPrice)])
325- else {
326- let newPriceIndex = (priceIndex + 1)
327- WriteSet([DataEntry("price", newPrice), DataEntry(("price_" + toString(height)), newPrice), DataEntry("price_index", newPriceIndex), DataEntry(("price_index_" + toString(newPriceIndex)), height)])
328- }
329- }
330- }
331- }
311+ else {
312+ let sum1 = ((prices[pricesInRange[0]] + prices[pricesInRange[1]]) + prices[pricesInRange[2]])
313+ let sum2 = if ((priceProvidingCount >= 4))
314+ then (sum1 + prices[pricesInRange[3]])
315+ else sum1
316+ let priceSum = if ((priceProvidingCount >= 5))
317+ then (sum2 + prices[pricesInRange[4]])
318+ else sum2
319+ if ((priceProvidingCount >= 6))
320+ then throw("Invalid pricesInRange creation")
321+ else {
322+ let newPrice = (priceSum / priceProvidingCount)
323+ if (if ((newPrice >= (price + ((price * percentPriceOffset) / 100))))
324+ then true
325+ else ((price - ((price * percentPriceOffset) / 100)) >= newPrice))
326+ then WriteSet([DataEntry("is_blocked", true), DataEntry((("black_swarm_price" + "_") + toString(height)), newPrice)])
327+ else {
328+ let newPriceIndex = (priceIndex + 1)
329+ WriteSet([DataEntry("price", newPrice), DataEntry(("price_" + toString(height)), newPrice), DataEntry("price_index", newPriceIndex), DataEntry(("price_index_" + toString(newPriceIndex)), height)])
330+ }
331+ }
332+ }
333+ }
332334
333335

github/deemru/w8io/169f3d6 
54.26 ms