2022.07.13 01:03 [3202669] smart account 3P8qJyxUqizCWWtEn2zsLZVPzZAjdNGppB1 > SELF 0.00000000 Waves
{ "type": 13, "id": "8UAVcgmuoVSUUsa9hagNzH4QnCqthFf6styCYJhRVkUQ", "fee": 2100000, "feeAssetId": null, "timestamp": 1657663471926, "version": 1, "sender": "3P8qJyxUqizCWWtEn2zsLZVPzZAjdNGppB1", "senderPublicKey": "HGVrLrtmJhSigh8z7HZvZPThVzQpT5YsqPDaQia6EreW", "proofs": [ "3NqAgqKAmztz3XaEfssUNcsueXpjKmWiaajJkjUgfPC6Mx5jxHYZqsfZNvTC2LqoKhJGzjkJVsCvvCaC2hF1RNMK" ], "script": "base64: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AQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAABHRoaXMJAQAAAAprZXlGYWN0b3J5AAAAAAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAASTm8gY29uZmlnIGF0IHRoaXM9CQAEJQAAAAEFAAAABHRoaXMCAAAACSBmb3Iga2V5PQkBAAAACmtleUZhY3RvcnkAAAAAAQAAABJrZXlGYWN0b3J5QXNzZXRDZmcAAAABAAAAD2Fzc2V0QWRkcmVzc1N0cgkAASwAAAACCQABLAAAAAICAAAAEyVzJXMlc19fZGVmb0Fzc2V0X18FAAAAD2Fzc2V0QWRkcmVzc1N0cgIAAAAIX19jb25maWcBAAAAIGtleUZhY3RvcnlEZWZvQWRkcmVzc0J5QXNzZXRDb2RlAAAAAQAAAAlhc3NldENvZGUJAAEsAAAAAgkAASwAAAACAgAAABMlcyVzJXNfX2RlZm9Bc3NldF9fBQAAAAlhc3NldENvZGUCAAAAFF9fYWRkcmVzc0J5QXNzZXRDb2RlAAAAABBJZHhEZWZvQXNzZXRDb2RlAAAAAAAAAAABAAAAAA5JZHhEZWZvQXNzZXRJZAAAAAAAAAAAAgAAAAASSWR4RGVmb0Fzc2V0U3RhdHVzAAAAAAAAAAADAAAAABBJZHhQcmljZURlY2ltYWxzAAAAAAAAAAAEAAAAAA5JZHhCYXNlQXNzZXRJZAAAAAAAAAAABQAAAAAYSWR4T3ZlckNvbGxhdGVyYWxQZXJjZW50AAAAAAAAAAAGAAAAAA5JZHhNaW5Jbml0UG9vbAAAAAAAAAAABwAAAAAVSWR4UHJpY2VPcmFjbGVBZGRyZXNzAAAAAAAAAAAIAAAAABBJZHhNaW5CdXlQYXltZW50AAAAAAAAAAAJAAAAABFJZHhNaW5TZWxsUGF5bWVudAAAAAAAAAAACgAAAAASSWR4QnV5TG9ja0ludGVydmFsAAAAAAAAAAALAAAAABNJZHhTZWxsTG9ja0ludGVydmFsAAAAAAAAAAAMAAAAABBJZHhCdXlGZWVQZXJjZW50AAAAAAAAAAANAAAAABFJZHhTZWxsRmVlUGVyY2VudAAAAAAAAAAADgEAAAAcZmFjdG9yeVJlYWRBc3NldENmZ0J5QWRkcmVzcwAAAAEAAAAPYXNzZXRBZGRyZXNzU3RyCQAEtQAAAAIJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAApmYWN0b3J5QWNjCQEAAAASa2V5RmFjdG9yeUFzc2V0Q2ZnAAAAAQUAAAAPYXNzZXRBZGRyZXNzU3RyCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAABVObyBjb25maWcgYXQgZmFjdG9yeT0JAAQlAAAAAQUAAAAKZmFjdG9yeUFjYwIAAAAJIGZvciBrZXk9CQEAAAASa2V5RmFjdG9yeUFzc2V0Q2ZnAAAAAQUAAAAPYXNzZXRBZGRyZXNzU3RyAgAAAAJfXwEAAAAZZmFjdG9yeVJlYWRBc3NldENmZ0J5Q29kZQAAAAEAAAAJYXNzZXRDb2RlBAAAAA9hc3NldEFkZHJlc3NTdHIJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAApmYWN0b3J5QWNjCQEAAAAga2V5RmFjdG9yeURlZm9BZGRyZXNzQnlBc3NldENvZGUAAAABBQAAAAlhc3NldENvZGUJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAFU5vIGNvbmZpZyBhdCBmYWN0b3J5PQkABCUAAAABBQAAAApmYWN0b3J5QWNjAgAAAAkgZm9yIGtleT0JAQAAACBrZXlGYWN0b3J5RGVmb0FkZHJlc3NCeUFzc2V0Q29kZQAAAAEFAAAACWFzc2V0Q29kZQkABRQAAAACBQAAAA9hc3NldEFkZHJlc3NTdHIJAQAAABxmYWN0b3J5UmVhZEFzc2V0Q2ZnQnlBZGRyZXNzAAAAAQUAAAAPYXNzZXRBZGRyZXNzU3RyAQAAABJmb3JtYXR0aW5nUHJpY2VNc2cAAAACAAAADGN1cnJlbmN5Q29kZQAAAAVwcmljZQkAAZsAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAQV0FWRVNERUZPUFJFRklYXwUAAAAMY3VycmVuY3lDb2RlAgAAAAFfCQABpAAAAAEFAAAABmhlaWdodAIAAAABXwkAAaQAAAABBQAAAAVwcmljZQEAAAARZmluZFByaWNlc0luUmFuZ2UAAAABAAAABnByaWNlcwQAAAAPbWluUGVyY2Vu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CQEAAAARdGhyb3dCbG9ja2VkRXJyb3IAAAAAAwkBAAAAAiE9AAAAAgUAAAAGaGVpZ2h0BQAAAAlmaW5IZWlnaHQJAQAAAB50aHJvd0ludmFsaWRGaW5hbGl6YXRpb25IZWlnaHQAAAABBQAAAAxmaW5IZWlnaHRTdHIDCQEAAAARaXNHcm91cEZpbmFsYWl6ZWQAAAACBQAAAAhncm91cE51bQUAAAAMZmluSGVpZ2h0U3RyCQEAAAAadGhyb3dHcm91cEFscmVhZHlGaW5hbGl6ZWQAAAACBQAAAAhncm91cE51bQUAAAAMZmluSGVpZ2h0U3RyAwkBAAAAAiE9AAAAAgkAAZEAAAACBQAAABFwdWJLZXlPcmFjbGVzTGlzdAkAAGoAAAACBQAAAAZoZWlnaHQFAAAAC29yYWNsZUNvdW50CQACWAAAAAEIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQkBAAAAGnRocm93T3V0T2ZUdXJuRmluYWxpemF0aW9uAAAAAAMJAQAAAAIhPQAAAAIJAADIAAAAAQUAAAAGc2lnbnMwBQAAAAtzaWduc0xlbmd0aAkBAAAAHHRocm93SW52YWxpZFNpZ25zUGFyYW1MZW5ndGgAAAACAAAAAAAAAAAABQAAAAZzaWduczADCQEAAAACIT0AAAACCQAAyAAAAAEFAAAABnNpZ25zMQUAAAALc2lnbnNMZW5ndGgJAQAAABx0aHJvd0ludmFsaWRTaWduc1BhcmFtTGVuZ3RoAAAAAgAAAAAAAAAAAQUAAAAGc2lnbnMxAwkBAAAAAiE9AAAAAgkAAMgAAAABBQAAAAZzaWduczIFAAAAC3NpZ25zTGVuZ3RoCQEAAAAcdGhyb3dJbnZhbGlkU2lnbnNQYXJhbUxlbmd0aAAAAAIAAAAAAAAAAAIFAAAABnNpZ25zMgMJAQAAAAIhPQAAAAIJAADIAAAAAQUAAAAGc2lnbnMzBQAAAAtzaWduc0xlbmd0aAkBAAAAHHRocm93SW52YWxpZFNpZ25zUGFyYW1MZW5ndGgAAAACAAAAAAAAAAADBQAAAAZzaWduczMEAAAADGdyb3VwRGF0YUtleQkBAAAADGtleUdyb3VwRGF0YQAAAAEFAAAACGdyb3VwTnVtBAAAAAxncm91cERhdGFTdHIJAQAAABN2YWx1ZU9y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CQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAEGtleVByaWNlQnlIZWlnaHQAAAACBQAAAAxjdXJyZW5jeUNvZGUFAAAABmhlaWdodAUAAAAIbmV3UHJpY2UJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAAZrZXlJZHgAAAABBQAAAAxjdXJyZW5jeUNvZGUFAAAABm5ld0lkeAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAADWtleUlkeDJIZWlnaHQAAAACBQAAAAxjdXJyZW5jeUNvZGUFAAAABm5ld0lkeAUAAAAGaGVpZ2h0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAANa2V5SGVpZ2h0MklkeAAAAAIFAAAADGN1cnJlbmN5Q29kZQUAAAAGaGVpZ2h0BQAAAAZuZXdJZHgFAAAAA25pbAAAAAEAAAACdHgBAAAABnZlcmlmeQAAAAAJAAnIAAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAACQACWQAAAAECAAAALEF0SE1ManIyVFB5OGJkcHNNMXJqdXNDeW83Z2h2M2NDWGRFUFpxNFJ0aTJhmUAeXQ==", "chainId": 87, "height": 3202669, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: HqesgWUfSxzmXVVUpxRTBd7wtWghGAfy1GDZjvEdETiZ Next: CUcAwBqoaR4GQKKqqfj1KngrcAQoNHhyCAYtHQP9HNGr Diff:
Old | New | Differences | |
---|---|---|---|
487 | 487 | } | |
488 | 488 | ||
489 | 489 | ||
490 | + | @Verifier(tx) | |
491 | + | func verify () = sigVerify_128Kb(tx.bodyBytes, tx.proofs[0], fromBase58String("AtHMLjr2TPy8bdpsM1rjusCyo7ghv3cCXdEPZq4Rti2a")) | |
492 | + |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 4 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let SEP = "__" | |
5 | 5 | ||
6 | 6 | let minPricesCount = 3 | |
7 | 7 | ||
8 | 8 | let percentPriceOffset = 5 | |
9 | 9 | ||
10 | 10 | func keyFactory () = "%s__factory" | |
11 | 11 | ||
12 | 12 | ||
13 | 13 | func keyPrice (currencyCode) = ("%s%s__price__" + currencyCode) | |
14 | 14 | ||
15 | 15 | ||
16 | 16 | func keyPriceFailure (currencyCode) = makeString(["%s%s%d__finalizationFailure", currencyCode, toString(height)], SEP) | |
17 | 17 | ||
18 | 18 | ||
19 | 19 | func keyLastHeight (currencyCode) = ("%s%s__lastHeight__" + currencyCode) | |
20 | 20 | ||
21 | 21 | ||
22 | 22 | func keyPriceByHeight (currencyCode,h) = makeString(["%s%s%d__priceByHeight", currencyCode, toString(h)], SEP) | |
23 | 23 | ||
24 | 24 | ||
25 | 25 | func keyIdx (currencyCode) = ("%s%s__idxCurrent__" + currencyCode) | |
26 | 26 | ||
27 | 27 | ||
28 | 28 | func keyIdx2Height (currencyCode,idx) = makeString(["%s%s%d__idx2Height", currencyCode, toString(idx)], SEP) | |
29 | 29 | ||
30 | 30 | ||
31 | 31 | func keyHeight2Idx (currencyCode,h) = makeString(["%s%s%d__height2Idx", currencyCode, toString(h)], SEP) | |
32 | 32 | ||
33 | 33 | ||
34 | 34 | func keyGroupFinStatus (groupNum,finHeightStr) = makeString(["%s%d%d__groupFinStatus", groupNum, finHeightStr], SEP) | |
35 | 35 | ||
36 | 36 | ||
37 | 37 | func keyIsMarketOpened (currencyCode) = ("%s%s__isMarketOpened__" + currencyCode) | |
38 | 38 | ||
39 | 39 | ||
40 | 40 | func keyGroupData (groupNum) = ("%s%d__group__" + groupNum) | |
41 | 41 | ||
42 | 42 | ||
43 | 43 | func keyEmptyPriceMsg (position) = makeString(["%s%d%d__emptyPriceMsg", toString(height), toString(position)], SEP) | |
44 | 44 | ||
45 | 45 | ||
46 | 46 | func keyIsBlocked () = "%s__isBlocked" | |
47 | 47 | ||
48 | 48 | ||
49 | 49 | func keyIsBlockedSender () = "%s%s__isBlocked__sender" | |
50 | 50 | ||
51 | 51 | ||
52 | 52 | func keyIsBlockedReason () = "%s%s__isBlocked__reason" | |
53 | 53 | ||
54 | 54 | ||
55 | 55 | func keyOracles () = "%s%s__config__oracles" | |
56 | 56 | ||
57 | 57 | ||
58 | 58 | func keyBlackSwarmPrice (h) = ("%s%s%d__isBlocked__blackSwarmPrice__" + toString(h)) | |
59 | 59 | ||
60 | 60 | ||
61 | 61 | let factoryAcc = addressFromStringValue(valueOrErrorMessage(getString(this, keyFactory()), ((("No config at this=" + toString(this)) + " for key=") + keyFactory()))) | |
62 | 62 | ||
63 | 63 | func keyFactoryAssetCfg (assetAddressStr) = (("%s%s%s__defoAsset__" + assetAddressStr) + "__config") | |
64 | 64 | ||
65 | 65 | ||
66 | 66 | func keyFactoryDefoAddressByAssetCode (assetCode) = (("%s%s%s__defoAsset__" + assetCode) + "__addressByAssetCode") | |
67 | 67 | ||
68 | 68 | ||
69 | 69 | let IdxDefoAssetCode = 1 | |
70 | 70 | ||
71 | 71 | let IdxDefoAssetId = 2 | |
72 | 72 | ||
73 | 73 | let IdxDefoAssetStatus = 3 | |
74 | 74 | ||
75 | 75 | let IdxPriceDecimals = 4 | |
76 | 76 | ||
77 | 77 | let IdxBaseAssetId = 5 | |
78 | 78 | ||
79 | 79 | let IdxOverCollateralPercent = 6 | |
80 | 80 | ||
81 | 81 | let IdxMinInitPool = 7 | |
82 | 82 | ||
83 | 83 | let IdxPriceOracleAddress = 8 | |
84 | 84 | ||
85 | 85 | let IdxMinBuyPayment = 9 | |
86 | 86 | ||
87 | 87 | let IdxMinSellPayment = 10 | |
88 | 88 | ||
89 | 89 | let IdxBuyLockInterval = 11 | |
90 | 90 | ||
91 | 91 | let IdxSellLockInterval = 12 | |
92 | 92 | ||
93 | 93 | let IdxBuyFeePercent = 13 | |
94 | 94 | ||
95 | 95 | let IdxSellFeePercent = 14 | |
96 | 96 | ||
97 | 97 | func factoryReadAssetCfgByAddress (assetAddressStr) = split(valueOrErrorMessage(getString(factoryAcc, keyFactoryAssetCfg(assetAddressStr)), ((("No config at factory=" + toString(factoryAcc)) + " for key=") + keyFactoryAssetCfg(assetAddressStr))), "__") | |
98 | 98 | ||
99 | 99 | ||
100 | 100 | func factoryReadAssetCfgByCode (assetCode) = { | |
101 | 101 | let assetAddressStr = valueOrErrorMessage(getString(factoryAcc, keyFactoryDefoAddressByAssetCode(assetCode)), ((("No config at factory=" + toString(factoryAcc)) + " for key=") + keyFactoryDefoAddressByAssetCode(assetCode))) | |
102 | 102 | $Tuple2(assetAddressStr, factoryReadAssetCfgByAddress(assetAddressStr)) | |
103 | 103 | } | |
104 | 104 | ||
105 | 105 | ||
106 | 106 | func formattingPriceMsg (currencyCode,price) = toBytes(((((("WAVESDEFOPREFIX_" + currencyCode) + "_") + toString(height)) + "_") + toString(price))) | |
107 | 107 | ||
108 | 108 | ||
109 | 109 | func findPricesInRange (prices) = { | |
110 | 110 | let minPercentBound = 90 | |
111 | 111 | let maxPercentBound = 110 | |
112 | 112 | let p0 = prices[0] | |
113 | 113 | let check0 = if ((0 >= prices[0])) | |
114 | 114 | then [0] | |
115 | 115 | else { | |
116 | 116 | let p01 = ((prices[1] * 100) / p0) | |
117 | 117 | let p02 = ((prices[2] * 100) / p0) | |
118 | 118 | let p03 = ((prices[3] * 100) / p0) | |
119 | 119 | let p04 = ((prices[4] * 100) / p0) | |
120 | 120 | let array1 = if (if ((maxPercentBound > p01)) | |
121 | 121 | then (p01 > minPercentBound) | |
122 | 122 | else false) | |
123 | 123 | then [1, 0] | |
124 | 124 | else [0] | |
125 | 125 | let array2 = if (if ((maxPercentBound > p02)) | |
126 | 126 | then (p02 > minPercentBound) | |
127 | 127 | else false) | |
128 | 128 | then 2 :: array1 | |
129 | 129 | else array1 | |
130 | 130 | let array3 = if (if ((maxPercentBound > p03)) | |
131 | 131 | then (p03 > minPercentBound) | |
132 | 132 | else false) | |
133 | 133 | then 3 :: array2 | |
134 | 134 | else array2 | |
135 | 135 | if (if ((maxPercentBound > p04)) | |
136 | 136 | then (p04 > minPercentBound) | |
137 | 137 | else false) | |
138 | 138 | then 4 :: array3 | |
139 | 139 | else array3 | |
140 | 140 | } | |
141 | 141 | let check1 = if ((size(check0) >= minPricesCount)) | |
142 | 142 | then check0 | |
143 | 143 | else { | |
144 | 144 | let p1 = prices[1] | |
145 | 145 | if ((0 >= p1)) | |
146 | 146 | then [1] | |
147 | 147 | else { | |
148 | 148 | let p10 = ((prices[0] * 100) / p1) | |
149 | 149 | let p12 = ((prices[2] * 100) / p1) | |
150 | 150 | let p13 = ((prices[3] * 100) / p1) | |
151 | 151 | let p14 = ((prices[4] * 100) / p1) | |
152 | 152 | let array1 = if (if ((maxPercentBound > p10)) | |
153 | 153 | then (p10 > minPercentBound) | |
154 | 154 | else false) | |
155 | 155 | then [0, 1] | |
156 | 156 | else [1] | |
157 | 157 | let array2 = if (if ((maxPercentBound > p12)) | |
158 | 158 | then (p12 > minPercentBound) | |
159 | 159 | else false) | |
160 | 160 | then 2 :: array1 | |
161 | 161 | else array1 | |
162 | 162 | let array3 = if (if ((maxPercentBound > p13)) | |
163 | 163 | then (p13 > minPercentBound) | |
164 | 164 | else false) | |
165 | 165 | then 3 :: array2 | |
166 | 166 | else array2 | |
167 | 167 | if (if ((maxPercentBound > p14)) | |
168 | 168 | then (p14 > minPercentBound) | |
169 | 169 | else false) | |
170 | 170 | then 4 :: array3 | |
171 | 171 | else array3 | |
172 | 172 | } | |
173 | 173 | } | |
174 | 174 | let check2 = if ((size(check1) >= minPricesCount)) | |
175 | 175 | then check1 | |
176 | 176 | else { | |
177 | 177 | let p2 = prices[2] | |
178 | 178 | if ((0 >= p2)) | |
179 | 179 | then [2] | |
180 | 180 | else { | |
181 | 181 | let p20 = ((prices[0] * 100) / p2) | |
182 | 182 | let p21 = ((prices[1] * 100) / p2) | |
183 | 183 | let p23 = ((prices[3] * 100) / p2) | |
184 | 184 | let p24 = ((prices[4] * 100) / p2) | |
185 | 185 | let array1 = if (if ((maxPercentBound > p20)) | |
186 | 186 | then (p20 > minPercentBound) | |
187 | 187 | else false) | |
188 | 188 | then [0, 2] | |
189 | 189 | else [2] | |
190 | 190 | let array2 = if (if ((maxPercentBound > p21)) | |
191 | 191 | then (p21 > minPercentBound) | |
192 | 192 | else false) | |
193 | 193 | then 1 :: array1 | |
194 | 194 | else array1 | |
195 | 195 | let array3 = if (if ((maxPercentBound > p23)) | |
196 | 196 | then (p23 > minPercentBound) | |
197 | 197 | else false) | |
198 | 198 | then 3 :: array2 | |
199 | 199 | else array2 | |
200 | 200 | if (if ((maxPercentBound > p24)) | |
201 | 201 | then (p24 > minPercentBound) | |
202 | 202 | else false) | |
203 | 203 | then 4 :: array3 | |
204 | 204 | else array3 | |
205 | 205 | } | |
206 | 206 | } | |
207 | 207 | let check3 = if ((size(check2) >= minPricesCount)) | |
208 | 208 | then check2 | |
209 | 209 | else { | |
210 | 210 | let p3 = prices[3] | |
211 | 211 | if ((0 >= p3)) | |
212 | 212 | then [3] | |
213 | 213 | else { | |
214 | 214 | let p30 = ((prices[0] * 100) / p3) | |
215 | 215 | let p31 = ((prices[1] * 100) / p3) | |
216 | 216 | let p32 = ((prices[2] * 100) / p3) | |
217 | 217 | let p34 = ((prices[4] * 100) / p3) | |
218 | 218 | let array1 = if (if ((maxPercentBound > p30)) | |
219 | 219 | then (p30 > minPercentBound) | |
220 | 220 | else false) | |
221 | 221 | then [0, 3] | |
222 | 222 | else [3] | |
223 | 223 | let array2 = if (if ((maxPercentBound > p31)) | |
224 | 224 | then (p31 > minPercentBound) | |
225 | 225 | else false) | |
226 | 226 | then 1 :: array1 | |
227 | 227 | else array1 | |
228 | 228 | let array3 = if (if ((maxPercentBound > p32)) | |
229 | 229 | then (p32 > minPercentBound) | |
230 | 230 | else false) | |
231 | 231 | then 2 :: array2 | |
232 | 232 | else array2 | |
233 | 233 | if (if ((maxPercentBound > p34)) | |
234 | 234 | then (p34 > minPercentBound) | |
235 | 235 | else false) | |
236 | 236 | then 4 :: array3 | |
237 | 237 | else array3 | |
238 | 238 | } | |
239 | 239 | } | |
240 | 240 | if ((size(check3) >= minPricesCount)) | |
241 | 241 | then check3 | |
242 | 242 | else { | |
243 | 243 | let p4 = prices[4] | |
244 | 244 | if ((0 >= p4)) | |
245 | 245 | then [4] | |
246 | 246 | else { | |
247 | 247 | let p40 = ((prices[0] * 100) / p4) | |
248 | 248 | let p41 = ((prices[1] * 100) / p4) | |
249 | 249 | let p42 = ((prices[2] * 100) / p4) | |
250 | 250 | let p43 = ((prices[3] * 100) / p4) | |
251 | 251 | let array1 = if (if ((maxPercentBound > p40)) | |
252 | 252 | then (p40 > minPercentBound) | |
253 | 253 | else false) | |
254 | 254 | then [0, 4] | |
255 | 255 | else [4] | |
256 | 256 | let array2 = if (if ((maxPercentBound > p41)) | |
257 | 257 | then (p41 > minPercentBound) | |
258 | 258 | else false) | |
259 | 259 | then 1 :: array1 | |
260 | 260 | else array1 | |
261 | 261 | let array3 = if (if ((maxPercentBound > p42)) | |
262 | 262 | then (p42 > minPercentBound) | |
263 | 263 | else false) | |
264 | 264 | then 2 :: array2 | |
265 | 265 | else array2 | |
266 | 266 | if (if ((maxPercentBound > p43)) | |
267 | 267 | then (p43 > minPercentBound) | |
268 | 268 | else false) | |
269 | 269 | then 3 :: array3 | |
270 | 270 | else array3 | |
271 | 271 | } | |
272 | 272 | } | |
273 | 273 | } | |
274 | 274 | ||
275 | 275 | ||
276 | 276 | func readPriceByHeight (currencyCode,h) = valueOrElse(getInteger(this, keyPriceByHeight(currencyCode, h)), 0) | |
277 | 277 | ||
278 | 278 | ||
279 | 279 | func isGroupFinalaized (groupNum,finHeightStr) = isDefined(getBoolean(this, keyGroupFinStatus(groupNum, finHeightStr))) | |
280 | 280 | ||
281 | 281 | ||
282 | 282 | func readGroupDataOrFail (groupNum) = { | |
283 | 283 | let k = keyGroupData(groupNum) | |
284 | 284 | let groupDataOpt = getString(this, k) | |
285 | 285 | if (isDefined(groupDataOpt)) | |
286 | 286 | then value(groupDataOpt) | |
287 | 287 | else throw(("empty group data for key=" + k)) | |
288 | 288 | } | |
289 | 289 | ||
290 | 290 | ||
291 | 291 | let isBlocked = valueOrElse(getBoolean(this, keyIsBlocked()), false) | |
292 | 292 | ||
293 | 293 | let pubKeyOraclesList = split(getStringValue(this, keyOracles()), ",") | |
294 | 294 | ||
295 | 295 | let oracleCount = size(pubKeyOraclesList) | |
296 | 296 | ||
297 | 297 | func throwInvalidFinalizationHeight (finHeightStr) = throw(((("invalid finalization height: height=" + toString(height)) + " finalizationHeight=") + finHeightStr)) | |
298 | 298 | ||
299 | 299 | ||
300 | 300 | func throwGroupAlreadyFinalized (groupNum,finHeightStr) = throw((((("prices for groupNum=" + groupNum) + " at ") + finHeightStr) + " height have been already finalized")) | |
301 | 301 | ||
302 | 302 | ||
303 | 303 | func throwInvalidSignsParamLength (num,param) = throw(((((("invalid signs" + toString(num)) + " parameter: actual.size=") + toString(size(param))) + " base58Val=") + toBase58String(param))) | |
304 | 304 | ||
305 | 305 | ||
306 | 306 | func throwOutOfTurnFinalization () = throw(((("Out of turn finalization: " + toString(height)) + " block should be finalize by ") + pubKeyOraclesList[(height % oracleCount)])) | |
307 | 307 | ||
308 | 308 | ||
309 | 309 | func throwBlockedError () = throw("contract is blocked by EMERGENCY SHUTDOWN action") | |
310 | 310 | ||
311 | 311 | ||
312 | 312 | func finalizePriceV2Common (position,groupNum,groupDataStr,msgArray,signs) = { | |
313 | 313 | let msgOffset = (position * 3) | |
314 | 314 | if ((msgOffset >= size(msgArray))) | |
315 | 315 | then [StringEntry(keyEmptyPriceMsg(position), "price data is empty")] | |
316 | 316 | else { | |
317 | 317 | let currencyCode = msgArray[(msgOffset + 0)] | |
318 | 318 | let newPriceStr = msgArray[(msgOffset + 1)] | |
319 | 319 | let isMarketOpenedStr = msgArray[(msgOffset + 2)] | |
320 | 320 | let newPriceOpt = parseInt(newPriceStr) | |
321 | 321 | let isMarketOpenedOpt = parseInt(isMarketOpenedStr) | |
322 | 322 | let sig0 = take(signs, 64) | |
323 | 323 | let sig1 = take(drop(signs, 64), 64) | |
324 | 324 | let sig2 = take(drop(signs, 128), 64) | |
325 | 325 | let sig3 = take(drop(signs, 192), 64) | |
326 | 326 | let sig4 = takeRightBytes(signs, 64) | |
327 | 327 | if (contains(groupDataStr, currencyCode)) | |
328 | 328 | then if (if (isDefined(newPriceOpt)) | |
329 | 329 | then isDefined(isMarketOpenedOpt) | |
330 | 330 | else false) | |
331 | 331 | then { | |
332 | 332 | let newPrice = value(newPriceOpt) | |
333 | 333 | let isMarketOpened = if ((value(isMarketOpenedOpt) == 1)) | |
334 | 334 | then true | |
335 | 335 | else false | |
336 | 336 | let priceMsgStr = makeString(["WAVES:DEFO:PROTOCOL:PRICE:V002", groupNum, toString(height), currencyCode, newPriceStr, isMarketOpenedStr], "_") | |
337 | 337 | let priceMsg = toBytes(priceMsgStr) | |
338 | 338 | let verificationsCount = (((((if (sigVerify_8Kb(priceMsg, sig0, fromBase58String(pubKeyOraclesList[0]))) | |
339 | 339 | then 1 | |
340 | 340 | else 0) + (if (sigVerify_8Kb(priceMsg, sig1, fromBase58String(pubKeyOraclesList[1]))) | |
341 | 341 | then 1 | |
342 | 342 | else 0)) + (if (sigVerify_8Kb(priceMsg, sig2, fromBase58String(pubKeyOraclesList[2]))) | |
343 | 343 | then 1 | |
344 | 344 | else 0)) + (if (sigVerify_8Kb(priceMsg, sig3, fromBase58String(pubKeyOraclesList[3]))) | |
345 | 345 | then 1 | |
346 | 346 | else 0)) + (if (sigVerify_8Kb(priceMsg, sig4, fromBase58String(pubKeyOraclesList[4]))) | |
347 | 347 | then 1 | |
348 | 348 | else 0)) | |
349 | 349 | if ((verificationsCount >= minPricesCount)) | |
350 | 350 | then { | |
351 | 351 | let price = valueOrElse(getInteger(this, keyPrice(currencyCode)), 0) | |
352 | 352 | let idx = valueOrElse(getInteger(this, keyIdx(currencyCode)), 0) | |
353 | 353 | if (if ((price != 0)) | |
354 | 354 | then if ((newPrice >= (price + ((price * percentPriceOffset) / 100)))) | |
355 | 355 | then true | |
356 | 356 | else ((price - ((price * percentPriceOffset) / 100)) >= newPrice) | |
357 | 357 | else false) | |
358 | 358 | then { | |
359 | 359 | let reason = "automatic emergency shutdown because of large price variability" | |
360 | 360 | [BooleanEntry(keyIsBlocked(), true), StringEntry(keyIsBlockedSender(), toString(this)), StringEntry(keyIsBlockedReason(), reason), IntegerEntry(keyBlackSwarmPrice(height), newPrice)] | |
361 | 361 | } | |
362 | 362 | else { | |
363 | 363 | let newIdx = (idx + 1) | |
364 | 364 | [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)] | |
365 | 365 | } | |
366 | 366 | } | |
367 | 367 | else [StringEntry(keyPriceFailure(currencyCode), ((((((((("verificationsCount = " + toString(verificationsCount)) + "signs0.length=") + toString(size(signs))) + " msg0 = ") + priceMsgStr) + " sig0 = ") + toBase58String(sig0)) + " key0 = ") + pubKeyOraclesList[0]))] | |
368 | 368 | } | |
369 | 369 | else [StringEntry(keyPriceFailure(currencyCode), ((("data parsing error: newPrice=" + newPriceStr) + " isMarketOpened=") + isMarketOpenedStr))] | |
370 | 370 | else [StringEntry(keyPriceFailure(currencyCode), ((currencyCode + " doesn't exist in group: groupDataStr=") + groupDataStr))] | |
371 | 371 | } | |
372 | 372 | } | |
373 | 373 | ||
374 | 374 | ||
375 | 375 | @Callable(i) | |
376 | 376 | func finalizeCurrentPriceV2 (header,msg,signs0,signs1,signs2,signs3) = { | |
377 | 377 | let headerArray = split(header, "_") | |
378 | 378 | let groupNum = headerArray[1] | |
379 | 379 | let finHeightStr = headerArray[2] | |
380 | 380 | let finHeight = parseIntValue(finHeightStr) | |
381 | 381 | let signsLength = (64 * oracleCount) | |
382 | 382 | if (isBlocked) | |
383 | 383 | then throwBlockedError() | |
384 | 384 | else if ((height != finHeight)) | |
385 | 385 | then throwInvalidFinalizationHeight(finHeightStr) | |
386 | 386 | else if (isGroupFinalaized(groupNum, finHeightStr)) | |
387 | 387 | then throwGroupAlreadyFinalized(groupNum, finHeightStr) | |
388 | 388 | else if ((pubKeyOraclesList[(height % oracleCount)] != toBase58String(i.callerPublicKey))) | |
389 | 389 | then throwOutOfTurnFinalization() | |
390 | 390 | else if ((size(signs0) != signsLength)) | |
391 | 391 | then throwInvalidSignsParamLength(0, signs0) | |
392 | 392 | else if ((size(signs1) != signsLength)) | |
393 | 393 | then throwInvalidSignsParamLength(1, signs1) | |
394 | 394 | else if ((size(signs2) != signsLength)) | |
395 | 395 | then throwInvalidSignsParamLength(2, signs2) | |
396 | 396 | else if ((size(signs3) != signsLength)) | |
397 | 397 | then throwInvalidSignsParamLength(3, signs3) | |
398 | 398 | else { | |
399 | 399 | let groupDataKey = keyGroupData(groupNum) | |
400 | 400 | let groupDataStr = valueOrErrorMessage(getString(this, groupDataKey), ("empty group data for key=" + groupDataKey)) | |
401 | 401 | let msgArray = split(msg, "_") | |
402 | 402 | if (((size(msgArray) % 3) != 0)) | |
403 | 403 | then throw(("msg parameters count must be multiple of 3: msgArray.size=" + toString(size(msg)))) | |
404 | 404 | 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)) | |
405 | 405 | } | |
406 | 406 | } | |
407 | 407 | ||
408 | 408 | ||
409 | 409 | ||
410 | 410 | @Callable(i) | |
411 | 411 | func finalizeCurrentPrice (currencyCode,price1,sign1,price2,sign2,price3,sign3,price4,sign4,price5,sign5) = { | |
412 | 412 | let price = valueOrElse(getInteger(this, keyPrice(currencyCode)), 0) | |
413 | 413 | let idx = valueOrElse(getInteger(this, keyIdx(currencyCode)), 0) | |
414 | 414 | let currencyCfg = factoryReadAssetCfgByCode(currencyCode)._2 | |
415 | 415 | if (isBlocked) | |
416 | 416 | then throw("contract is blocked by EMERGENCY SHUTDOWN actions untill reactivation by emergency oracles") | |
417 | 417 | else if ((currencyCfg[IdxDefoAssetStatus] != "ISSUED")) | |
418 | 418 | then throw(((currencyCode + " has not been issued yet: status=") + currencyCfg[IdxDefoAssetStatus])) | |
419 | 419 | else if ((readPriceByHeight(currencyCode, height) != 0)) | |
420 | 420 | then throw("wait next block") | |
421 | 421 | else if ((pubKeyOraclesList[(height % 5)] != toBase58String(i.callerPublicKey))) | |
422 | 422 | then throw(((("Out of turn finalization: " + toString(height)) + " block should be finalize by ") + pubKeyOraclesList[(height % 5)])) | |
423 | 423 | else { | |
424 | 424 | let prices = [if (sigVerify_8Kb(formattingPriceMsg(currencyCode, price1), sign1, fromBase58String(pubKeyOraclesList[0]))) | |
425 | 425 | then price1 | |
426 | 426 | else 0, if (sigVerify_8Kb(formattingPriceMsg(currencyCode, price2), sign2, fromBase58String(pubKeyOraclesList[1]))) | |
427 | 427 | then price2 | |
428 | 428 | else 0, if (sigVerify_8Kb(formattingPriceMsg(currencyCode, price3), sign3, fromBase58String(pubKeyOraclesList[2]))) | |
429 | 429 | then price3 | |
430 | 430 | else 0, if (sigVerify_8Kb(formattingPriceMsg(currencyCode, price4), sign4, fromBase58String(pubKeyOraclesList[3]))) | |
431 | 431 | then price4 | |
432 | 432 | else 0, if (sigVerify_8Kb(formattingPriceMsg(currencyCode, price5), sign5, fromBase58String(pubKeyOraclesList[4]))) | |
433 | 433 | then price5 | |
434 | 434 | else 0] | |
435 | 435 | let zeroPriceCount = (((((if ((prices[0] == 0)) | |
436 | 436 | then 1 | |
437 | 437 | else 0) + (if ((prices[1] == 0)) | |
438 | 438 | then 1 | |
439 | 439 | else 0)) + (if ((prices[2] == 0)) | |
440 | 440 | then 1 | |
441 | 441 | else 0)) + (if ((prices[3] == 0)) | |
442 | 442 | then 1 | |
443 | 443 | else 0)) + (if ((prices[4] == 0)) | |
444 | 444 | then 1 | |
445 | 445 | else 0)) | |
446 | 446 | if ((zeroPriceCount >= minPricesCount)) | |
447 | 447 | then throw((toString(minPricesCount) + " prices or more are equals to 0")) | |
448 | 448 | else { | |
449 | 449 | let pricesInRange = findPricesInRange(prices) | |
450 | 450 | let priceProvidingCount = size(pricesInRange) | |
451 | 451 | if ((minPricesCount > priceProvidingCount)) | |
452 | 452 | then throw(((((((((((((((((((((("Could not finalize price because of big variation: height=" + toString(height)) + " | |
453 | 453 | ") + pubKeyOraclesList[0]) + "=") + toString(prices[0])) + " | |
454 | 454 | ") + pubKeyOraclesList[1]) + "=") + toString(prices[1])) + " | |
455 | 455 | ") + pubKeyOraclesList[2]) + "=") + toString(prices[2])) + " | |
456 | 456 | ") + pubKeyOraclesList[3]) + "=") + toString(prices[3])) + " | |
457 | 457 | ") + pubKeyOraclesList[4]) + "=") + toString(prices[4]))) | |
458 | 458 | else { | |
459 | 459 | let sum1 = ((prices[pricesInRange[0]] + prices[pricesInRange[1]]) + prices[pricesInRange[2]]) | |
460 | 460 | let sum2 = if ((priceProvidingCount >= 4)) | |
461 | 461 | then (sum1 + prices[pricesInRange[3]]) | |
462 | 462 | else sum1 | |
463 | 463 | let priceSum = if ((priceProvidingCount >= 5)) | |
464 | 464 | then (sum2 + prices[pricesInRange[4]]) | |
465 | 465 | else sum2 | |
466 | 466 | if ((priceProvidingCount >= 6)) | |
467 | 467 | then throw("Invalid pricesInRange creation") | |
468 | 468 | else { | |
469 | 469 | let newPrice = (priceSum / priceProvidingCount) | |
470 | 470 | if (if ((price != 0)) | |
471 | 471 | then if ((newPrice >= (price + ((price * percentPriceOffset) / 100)))) | |
472 | 472 | then true | |
473 | 473 | else ((price - ((price * percentPriceOffset) / 100)) >= newPrice) | |
474 | 474 | else false) | |
475 | 475 | then { | |
476 | 476 | let reason = "automatic emergency shutdown because of large price variability" | |
477 | 477 | [BooleanEntry(keyIsBlocked(), true), StringEntry(keyIsBlockedSender(), toString(this)), StringEntry(keyIsBlockedReason(), reason), IntegerEntry(keyBlackSwarmPrice(height), newPrice)] | |
478 | 478 | } | |
479 | 479 | else { | |
480 | 480 | let newIdx = (idx + 1) | |
481 | 481 | [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)] | |
482 | 482 | } | |
483 | 483 | } | |
484 | 484 | } | |
485 | 485 | } | |
486 | 486 | } | |
487 | 487 | } | |
488 | 488 | ||
489 | 489 | ||
490 | + | @Verifier(tx) | |
491 | + | func verify () = sigVerify_128Kb(tx.bodyBytes, tx.proofs[0], fromBase58String("AtHMLjr2TPy8bdpsM1rjusCyo7ghv3cCXdEPZq4Rti2a")) | |
492 | + |
github/deemru/w8io/786bc32 60.63 ms ◑