tx · 4hpWgf1YuT8kw6JJE85jdP3pTtCwtkiRDgdhCMzYG4fm

3MyAeWKH4gAS6iDvTRo42Rz3WCoMEi63WMC:  -0.01400000 Waves

2020.10.26 22:34 [1237994] smart account 3MyAeWKH4gAS6iDvTRo42Rz3WCoMEi63WMC > SELF 0.00000000 Waves

{ "type": 13, "id": "4hpWgf1YuT8kw6JJE85jdP3pTtCwtkiRDgdhCMzYG4fm", "fee": 1400000, "feeAssetId": null, "timestamp": 1603740903050, "version": 1, "sender": "3MyAeWKH4gAS6iDvTRo42Rz3WCoMEi63WMC", "senderPublicKey": "7c9cqT2Lt6fXSVvQwScRZDjnVcpPYhsbxSkh21LEzdY3", "proofs": [ "3WDqTMZnwoBBrGhQmdF4CpApQzaiefUZmbXMJpjBJAbMB2chpdjV6ydxMYd65uhNo3rCHKpfFa7smxK5F6gxg9jw" ], "script": "base64:AAIEAAAAAAAAAAwIAhIICgYICAICAgIAAAAeAAAAAANTRVACAAAAAl9fAQAAAAprZXlGYWN0b3J5AAAAAAIAAAALJXNfX2ZhY3RvcnkBAAAACGtleVByaWNlAAAAAQAAAAxjdXJyZW5jeUNvZGUJAAEsAAAAAgIAAAANJXMlc19fcHJpY2VfXwUAAAAMY3VycmVuY3lDb2RlAQAAAA9rZXlQcmljZUZhaWx1cmUAAAABAAAADGN1cnJlbmN5Q29kZQkABLkAAAACCQAETAAAAAICAAAAGyVzJXMlZF9fZmluYWxpemF0aW9uRmFpbHVyZQkABEwAAAACBQAAAAxjdXJyZW5jeUNvZGUJAARMAAAAAgkAAaQAAAABBQAAAAZoZWlnaHQFAAAAA25pbAUAAAADU0VQAQAAAA1rZXlMYXN0SGVpZ2h0AAAAAQAAAAxjdXJyZW5jeUNvZGUJAAEsAAAAAgIAAAASJXMlc19fbGFzdEhlaWdodF9fBQAAAAxjdXJyZW5jeUNvZGUBAAAAEGtleVByaWNlQnlIZWlnaHQAAAACAAAADGN1cnJlbmN5Q29kZQAAAAFoCQAEuQAAAAIJAARMAAAAAgIAAAAVJXMlcyVkX19wcmljZUJ5SGVpZ2h0CQAETAAAAAIFAAAADGN1cnJlbmN5Q29kZQkABEwAAAACCQABpAAAAAEFAAAAAWgFAAAAA25pbAUAAAADU0VQAQAAAAZrZXlJZHgAAAABAAAADGN1cnJlbmN5Q29kZQkAASwAAAACAgAAABIlcyVzX19pZHhDdXJyZW50X18FAAAADGN1cnJlbmN5Q29kZQEAAAANa2V5SWR4MkhlaWdodAAAAAIAAAAMY3VycmVuY3lDb2RlAAAAA2lkeAkABLkAAAACCQAETAAAAAICAAAAEiVzJXMlZF9faWR4MkhlaWdodAkABEwAAAACBQAAAAxjdXJyZW5jeUNvZGUJAARMAAAAAgkAAaQAAAABBQAAAANpZHgFAAAAA25pbAUAAAADU0VQAQAAAA1rZXlIZWlnaHQySWR4AAAAAgAAAAxjdXJyZW5jeUNvZGUAAAABaAkABLkAAAACCQAETAAAAAICAAAAEiVzJXMlZF9faGVpZ2h0MklkeAkABEwAAAACBQAAAAxjdXJyZW5jeUNvZGUJAARMAAAAAgkAAaQAAAABBQAAAAFoBQAAAANuaWwFAAAAA1NFUAEAAAARa2V5R3JvdXBGaW5TdGF0dXMAAAACAAAACGdyb3VwTnVtAAAADGZpbkhlaWdodFN0cgkABLkAAAACCQAETAAAAAICAAAAFiVzJWQlZF9fZ3JvdXBGaW5TdGF0dXMJAARMAAAAAgUAAAAIZ3JvdXBOdW0JAARMAAAAAgUAAAAMZmluSGVpZ2h0U3RyBQAAAANuaWwFAAAAA1NFUAEAAAARa2V5SXNNYXJrZXRPcGVuZWQAAAABAAAADGN1cnJlbmN5Q29kZQkAASwAAAACAgAAABYlcyVzX19pc01hcmtldE9wZW5lZF9fBQAAAAxjdXJyZW5jeUNvZGUBAAAADGtleUdyb3VwRGF0YQAAAAEAAAAIZ3JvdXBOdW0JAAEsAAAAAgIAAAANJXMlZF9fZ3JvdXBfXwUAAAAIZ3JvdXBOdW0BAAAAEGtleUVtcHR5UHJpY2VNc2cAAAABAAAACHBvc2l0aW9uCQAEuQAAAAIJAARMAAAAAgIAAAAVJXMlZCVkX19lbXB0eVByaWNlTXNnCQAETAAAAAIJAAGkAAAAAQUAAAAGaGVpZ2h0CQAETAAAAAIJAAGkAAAAAQUAAAAIcG9zaXRpb24FAAAAA25pbAUAAAADU0VQAQAAAAxrZXlJc0Jsb2NrZWQAAAAAAgAAAA0lc19faXNCbG9ja2VkAQAAABJrZXlJc0Jsb2NrZWRTZW5kZXIAAAAAAgAAABclcyVzX19pc0Jsb2NrZWRfX3NlbmRlcgEAAAASa2V5SXNCbG9ja2VkUmVhc29uAAAAAAIAAAAXJXMlc19faXNCbG9ja2VkX19yZWFzb24BAAAACmtleU9yYWNsZXMAAAAAAgAAABUlcyVzX19jb25maWdfX29yYWNsZXMBAAAAEmtleUJsYWNrU3dhcm1QcmljZQAAAAEAAAABaAkAASwAAAACAgAAACQlcyVzJWRfX2lzQmxvY2tlZF9fYmxhY2tTd2FybVByaWNlX18JAAGkAAAAAQUAAAABaAEAAAARaXNHcm91cEZpbmFsYWl6ZWQAAAACAAAACGdyb3VwTnVtAAAADGZpbkhlaWdodFN0cgkBAAAACWlzRGVmaW5lZAAAAAEJAAQbAAAAAgUAAAAEdGhpcwkBAAAAEWtleUdyb3VwRmluU3RhdHVzAAAAAgUAAAAIZ3JvdXBOdW0FAAAADGZpbkhlaWdodFN0cgEAAAATcmVhZEdyb3VwRGF0YU9yRmFpbAAAAAEAAAAIZ3JvdXBOdW0EAAAAAWsJAQAAAAxrZXlHcm91cERhdGEAAAABBQAAAAhncm91cE51bQQAAAAMZ3JvdXBEYXRhT3B0CQAEHQAAAAIFAAAABHRoaXMFAAAAAWsDCQEAAAAJaXNEZWZpbmVkAAAAAQUAAAAMZ3JvdXBEYXRhT3B0CQEAAAAFdmFsdWUAAAABBQAAAAxncm91cERhdGFPcHQJAAACAAAAAQkAASwAAAACAgAAABllbXB0eSBncm91cCBkYXRhIGZvciBrZXk9BQAAAAFrAAAAAAlpc0Jsb2NrZWQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQbAAAAAgUAAAAEdGhpcwkBAAAADGtleUlzQmxvY2tlZAAAAAAHAAAAAA5taW5QcmljZXNDb3VudAAAAAAAAAAAAwAAAAAScGVyY2VudFByaWNlT2Zmc2V0AAAAAAAAAAAFAAAAABFwdWJLZXlPcmFjbGVzTGlzdAkABLUAAAACCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACBQAAAAR0aGlzCQEAAAAKa2V5T3JhY2xlcwAAAAACAAAAASwAAAAAC29yYWNsZUNvdW50CQABkAAAAAEFAAAAEXB1YktleU9yYWNsZXNMaXN0AQAAAB50aHJvd0ludmFsaWRGaW5hbGl6YXRpb25IZWlnaHQAAAABAAAADGZpbkhlaWdodFN0cgkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAACRpbnZhbGlkIGZpbmFsaXphdGlvbiBoZWlnaHQ6IGhlaWdodD0JAAGkAAAAAQUAAAAGaGVpZ2h0AgAAABQgZmluYWxpemF0aW9uSGVpZ2h0PQUAAAAMZmluSGVpZ2h0U3RyAQAAABp0aHJvd0dyb3VwQWxyZWFkeUZpbmFsaXplZAAAAAIAAAAIZ3JvdXBOdW0AAAAMZmluSGVpZ2h0U3RyCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAUcHJpY2VzIGZvciBncm91cE51bT0FAAAACGdyb3VwTnVtAgAAAAQgYXQgBQAAAAxmaW5IZWlnaHRT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dGFTdHIFAAAAA25pbAAAAAEAAAABaQEAAAAWZmluYWxpemVDdXJyZW50UHJpY2VWMgAAAAYAAAAGaGVhZGVyAAAAA21zZwAAAAZzaWduczAAAAAGc2lnbnMxAAAABnNpZ25zMgAAAAZzaWduczMEAAAAC2hlYWRlckFycmF5CQAEtQAAAAIFAAAABmhlYWRlcgIAAAABXwQAAAAIZ3JvdXBOdW0JAAGRAAAAAgUAAAALaGVhZGVyQXJyYXkAAAAAAAAAAAEEAAAADGZpbkhlaWdodFN0cgkAAZEAAAACBQAAAAtoZWFkZXJBcnJheQAAAAAAAAAAAgQAAAAJZmluSGVpZ2h0CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEFAAAADGZpbkhlaWdodFN0cgQAAAALc2lnbnNMZW5ndGgJAABoAAAAAgAAAAAAAAAAQAUAAAALb3JhY2xlQ291bnQDCQEAAAACIT0AAAACBQAAAAZoZWlnaHQFAAAACWZpbkhlaWdodAkBAAAAHnRocm93SW52YWxpZEZpbmFsaXphdGlvbkhlaWdodAAAAAEFAAAADGZpbkhlaWdodFN0cgMJAQAAABFpc0dyb3VwRmluYWxhaXplZAAAAAIFAAAACGdyb3VwTnVtBQAAAAxmaW5IZWlnaHRTdHIJAQAAABp0aHJvd0dyb3VwQWxyZWFkeUZpbmFsaXplZAAAAAIFAAAACGdyb3VwTnVtBQAAAAxmaW5IZWlnaHRTdHIDCQEAAAACIT0AAAACCQABkQAAAAIFAAAAEXB1YktleU9yYWNsZXNMaXN0CQAAagAAAAIFAAAABmhlaWdodAUAAAALb3JhY2xlQ291bnQJAAJYAAAAAQgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5CQEAAAAadGhyb3dPdXRPZlR1cm5GaW5hbGl6YXRpb24AAAAAAwkBAAAAAiE9AAAAAgkAAMgAAAABBQAAAAZzaWduczAFAAAAC3NpZ25zTGVuZ3RoCQEAAAAcdGhyb3dJbnZhbGlkU2lnbnNQYXJhbUxlbmd0aAAAAAIAAAAAAAAAAAAFAAAABnNpZ25zMAMJAQAAAAIhPQAAAAIJAADIAAAAAQUAAAAGc2lnbnMxBQAAAAtzaWduc0xlbmd0aAkBAAAAHHRocm93SW52YWxpZFNpZ25zUGFyYW1MZW5ndGgAAAACAAAAAAAAAAABBQAAAAZzaWduczEDCQEAAAACIT0AAAACCQAAyAAAAAEFAAAABnNpZ25zMgUAAAALc2lnbnNMZW5ndGgJAQAAABx0aHJvd0ludmFsaWRTaWduc1BhcmFtTGVuZ3RoAAAAAgAAAAAAAAAAAgUAAAAGc2lnbnMyAwkBAAAAAiE9AAAAAgkAAMgAAAABBQAAAAZzaWduczMFAAAAC3NpZ25zTGVuZ3RoCQEAAAAcdGhyb3dJbnZhbGlkU2lnbnNQYXJhbUxlbmd0aAAAAAIAAAAAAAAAAAMFAAAABnNpZ25zMwQAAAAMZ3JvdXBEYXRhS2V5CQEAAAAMa2V5R3JvdXBEYXRhAAAAAQUAAAAIZ3JvdXBOdW0EAAAADGdyb3VwRGF0YVN0cgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAADGdyb3VwRGF0YUtleQkAASwAAAACAgAAABllbXB0eSBncm91cCBkYXRhIGZvciBrZXk9BQAAAAxncm91cERhdGFLZXkEAAAACG1zZ0FycmF5CQAEtQAAAAIFAAAAA21zZwIAAAABXwMJAQAAAAIhPQAAAAIJAABqAAAAAgkAAZAAAAABBQAAAAhtc2dBcnJheQAAAAAAAAAAAwAAAAAAAAAAAAkAAAIAAAABCQABLAAAAAICAAAAOm1zZyBwYXJhbWV0ZXJzIGNvdW50IG11c3QgYmUgbXVsdGlwbGUgb2YgMzogbXNnQXJyYXkuc2l6ZT0JAAGkAAAAAQkAATEAAAABBQAAAANtc2cJAARNAAAAAgkABE4AAAACCQAETgAAAAIJAAROAAAAAgkBAAAAFWZpbmFsaXplUHJpY2VWMkNvbW1vbgAAAAUAAAAAAAAAAAAFAAAACGdyb3VwTnVtBQAAAAxncm91cERhdGFTdHIFAAAACG1zZ0FycmF5BQAAAAZzaWduczAJAQAAABVmaW5hbGl6ZVByaWNlVjJDb21tb24AAAAFAAAAAAAAAAABBQAAAAhncm91cE51bQUAAAAMZ3JvdXBEYXRhU3RyBQAAAAhtc2dBcnJheQUAAAAGc2lnbnMxCQEAAAAVZmluYWxpemVQcmljZVYyQ29tbW9uAAAABQAAAAAAAAAAAgUAAAAIZ3JvdXBOdW0FAAAADGdyb3VwRGF0YVN0cgUAAAAIbXNnQXJyYXkFAAAABnNpZ25zMgkBAAAAFWZpbmFsaXplUHJpY2VWMkNvbW1vbgAAAAUAAAAAAAAAAAMFAAAACGdyb3VwTnVtBQAAAAxncm91cERhdGFTdHIFAAAACG1zZ0FycmF5BQAAAAZzaWduczMJAQAAAAxCb29sZWFuRW50cnkAAAACCQEAAAARa2V5R3JvdXBGaW5TdGF0dXMAAAACBQAAAAhncm91cE51bQUAAAAMZmluSGVpZ2h0U3RyBgAAAADSlktI", "chainId": 84, "height": 1237994, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: HEsHmpMqcXx39qLDte2PMwSkQXsn5VkcjfxFrgHfpZqi Next: none Diff:
OldNewDifferences
9090
9191 func finalizePriceV2Common (position,groupNum,groupDataStr,msgArray,signs) = {
9292 let msgOffset = (position * 3)
93- if ((msgOffset > size(msgArray)))
93+ if ((msgOffset >= size(msgArray)))
9494 then [StringEntry(keyEmptyPriceMsg(position), "price data is empty")]
9595 else {
9696 let currencyCode = msgArray[(msgOffset + 0)]
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 func keyFactory () = "%s__factory"
77
88
99 func keyPrice (currencyCode) = ("%s%s__price__" + currencyCode)
1010
1111
1212 func keyPriceFailure (currencyCode) = makeString(["%s%s%d__finalizationFailure", currencyCode, toString(height)], SEP)
1313
1414
1515 func keyLastHeight (currencyCode) = ("%s%s__lastHeight__" + currencyCode)
1616
1717
1818 func keyPriceByHeight (currencyCode,h) = makeString(["%s%s%d__priceByHeight", currencyCode, toString(h)], SEP)
1919
2020
2121 func keyIdx (currencyCode) = ("%s%s__idxCurrent__" + currencyCode)
2222
2323
2424 func keyIdx2Height (currencyCode,idx) = makeString(["%s%s%d__idx2Height", currencyCode, toString(idx)], SEP)
2525
2626
2727 func keyHeight2Idx (currencyCode,h) = makeString(["%s%s%d__height2Idx", currencyCode, toString(h)], SEP)
2828
2929
3030 func keyGroupFinStatus (groupNum,finHeightStr) = makeString(["%s%d%d__groupFinStatus", groupNum, finHeightStr], SEP)
3131
3232
3333 func keyIsMarketOpened (currencyCode) = ("%s%s__isMarketOpened__" + currencyCode)
3434
3535
3636 func keyGroupData (groupNum) = ("%s%d__group__" + groupNum)
3737
3838
3939 func keyEmptyPriceMsg (position) = makeString(["%s%d%d__emptyPriceMsg", toString(height), toString(position)], SEP)
4040
4141
4242 func keyIsBlocked () = "%s__isBlocked"
4343
4444
4545 func keyIsBlockedSender () = "%s%s__isBlocked__sender"
4646
4747
4848 func keyIsBlockedReason () = "%s%s__isBlocked__reason"
4949
5050
5151 func keyOracles () = "%s%s__config__oracles"
5252
5353
5454 func keyBlackSwarmPrice (h) = ("%s%s%d__isBlocked__blackSwarmPrice__" + toString(h))
5555
5656
5757 func isGroupFinalaized (groupNum,finHeightStr) = isDefined(getBoolean(this, keyGroupFinStatus(groupNum, finHeightStr)))
5858
5959
6060 func readGroupDataOrFail (groupNum) = {
6161 let k = keyGroupData(groupNum)
6262 let groupDataOpt = getString(this, k)
6363 if (isDefined(groupDataOpt))
6464 then value(groupDataOpt)
6565 else throw(("empty group data for key=" + k))
6666 }
6767
6868
6969 let isBlocked = valueOrElse(getBoolean(this, keyIsBlocked()), false)
7070
7171 let minPricesCount = 3
7272
7373 let percentPriceOffset = 5
7474
7575 let pubKeyOraclesList = split(getStringValue(this, keyOracles()), ",")
7676
7777 let oracleCount = size(pubKeyOraclesList)
7878
7979 func throwInvalidFinalizationHeight (finHeightStr) = throw(((("invalid finalization height: height=" + toString(height)) + " finalizationHeight=") + finHeightStr))
8080
8181
8282 func throwGroupAlreadyFinalized (groupNum,finHeightStr) = throw((((("prices for groupNum=" + groupNum) + " at ") + finHeightStr) + " height have been already finalized"))
8383
8484
8585 func throwInvalidSignsParamLength (num,param) = throw(((((("invalid signs" + toString(num)) + " parameter: actual.size=") + toString(size(param))) + " base58Val=") + toBase58String(param)))
8686
8787
8888 func throwOutOfTurnFinalization () = throw(((("Out of turn finalization: " + toString(height)) + " block should be finalize by ") + pubKeyOraclesList[(height % oracleCount)]))
8989
9090
9191 func finalizePriceV2Common (position,groupNum,groupDataStr,msgArray,signs) = {
9292 let msgOffset = (position * 3)
93- if ((msgOffset > size(msgArray)))
93+ if ((msgOffset >= size(msgArray)))
9494 then [StringEntry(keyEmptyPriceMsg(position), "price data is empty")]
9595 else {
9696 let currencyCode = msgArray[(msgOffset + 0)]
9797 let newPriceStr = msgArray[(msgOffset + 1)]
9898 let isMarketOpenedStr = msgArray[(msgOffset + 2)]
9999 let newPriceOpt = parseInt(newPriceStr)
100100 let isMarketOpenedOpt = parseInt(isMarketOpenedStr)
101101 let sig0 = take(signs, 64)
102102 let sig1 = take(drop(signs, 64), 64)
103103 let sig2 = take(drop(signs, 128), 64)
104104 let sig3 = take(drop(signs, 192), 64)
105105 let sig4 = takeRightBytes(signs, 64)
106106 if (contains(groupDataStr, currencyCode))
107107 then if (if (isDefined(newPriceOpt))
108108 then isDefined(isMarketOpenedOpt)
109109 else false)
110110 then {
111111 let newPrice = value(newPriceOpt)
112112 let isMarketOpened = if ((value(isMarketOpenedOpt) == 1))
113113 then true
114114 else false
115115 let priceMsgStr = makeString(["WAVES:DEFO:PROTOCOL:PRICE:V002", groupNum, toString(height), currencyCode, newPriceStr, isMarketOpenedStr], "_")
116116 let priceMsg = toBytes(priceMsgStr)
117117 let verificationsCount = (((((if (sigVerify_8Kb(priceMsg, sig0, fromBase58String(pubKeyOraclesList[0])))
118118 then 1
119119 else 0) + (if (sigVerify_8Kb(priceMsg, sig1, fromBase58String(pubKeyOraclesList[1])))
120120 then 1
121121 else 0)) + (if (sigVerify_8Kb(priceMsg, sig2, fromBase58String(pubKeyOraclesList[2])))
122122 then 1
123123 else 0)) + (if (sigVerify_8Kb(priceMsg, sig3, fromBase58String(pubKeyOraclesList[3])))
124124 then 1
125125 else 0)) + (if (sigVerify_8Kb(priceMsg, sig4, fromBase58String(pubKeyOraclesList[4])))
126126 then 1
127127 else 0))
128128 if ((verificationsCount >= 3))
129129 then {
130130 let price = valueOrElse(getInteger(this, keyPrice(currencyCode)), 0)
131131 let idx = valueOrElse(getInteger(this, keyIdx(currencyCode)), 0)
132132 if (if ((price != 0))
133133 then if ((newPrice >= (price + ((price * 5) / 100))))
134134 then true
135135 else ((price - ((price * 5) / 100)) >= newPrice)
136136 else false)
137137 then {
138138 let reason = "automatic emergency shutdown because of large price variability"
139139 [BooleanEntry(keyIsBlocked(), true), StringEntry(keyIsBlockedSender(), toString(this)), StringEntry(keyIsBlockedReason(), reason), IntegerEntry(keyBlackSwarmPrice(height), newPrice)]
140140 }
141141 else {
142142 let newIdx = (idx + 1)
143143 [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)]
144144 }
145145 }
146146 else [StringEntry(keyPriceFailure(currencyCode), ((((((((("verificationsCount = " + toString(verificationsCount)) + "signs0.length=") + toString(size(signs))) + " msg0 = ") + priceMsgStr) + " sig0 = ") + toBase58String(sig0)) + " key0 = ") + pubKeyOraclesList[0]))]
147147 }
148148 else [StringEntry(keyPriceFailure(currencyCode), ((("data parsing error: newPrice=" + newPriceStr) + " isMarketOpened=") + isMarketOpenedStr))]
149149 else [StringEntry(keyPriceFailure(currencyCode), ((currencyCode + " doesn't exist in group: groupDataStr=") + groupDataStr))]
150150 }
151151 }
152152
153153
154154 @Callable(i)
155155 func finalizeCurrentPriceV2 (header,msg,signs0,signs1,signs2,signs3) = {
156156 let headerArray = split(header, "_")
157157 let groupNum = headerArray[1]
158158 let finHeightStr = headerArray[2]
159159 let finHeight = parseIntValue(finHeightStr)
160160 let signsLength = (64 * oracleCount)
161161 if ((height != finHeight))
162162 then throwInvalidFinalizationHeight(finHeightStr)
163163 else if (isGroupFinalaized(groupNum, finHeightStr))
164164 then throwGroupAlreadyFinalized(groupNum, finHeightStr)
165165 else if ((pubKeyOraclesList[(height % oracleCount)] != toBase58String(i.callerPublicKey)))
166166 then throwOutOfTurnFinalization()
167167 else if ((size(signs0) != signsLength))
168168 then throwInvalidSignsParamLength(0, signs0)
169169 else if ((size(signs1) != signsLength))
170170 then throwInvalidSignsParamLength(1, signs1)
171171 else if ((size(signs2) != signsLength))
172172 then throwInvalidSignsParamLength(2, signs2)
173173 else if ((size(signs3) != signsLength))
174174 then throwInvalidSignsParamLength(3, signs3)
175175 else {
176176 let groupDataKey = keyGroupData(groupNum)
177177 let groupDataStr = valueOrErrorMessage(getString(this, groupDataKey), ("empty group data for key=" + groupDataKey))
178178 let msgArray = split(msg, "_")
179179 if (((size(msgArray) % 3) != 0))
180180 then throw(("msg parameters count must be multiple of 3: msgArray.size=" + toString(size(msg))))
181181 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))
182182 }
183183 }
184184
185185

github/deemru/w8io/3ef1775 
58.78 ms