2021.07.02 14:19 [2660670] smart account 3P9ZegsKUtsEpdRPNVrMH7nHEEqY5MrmjDp > SELF 0.00000000 Waves

{ "type": 13, "id": "CQ8sYWsj6AaUnRHTup5g5hR55dU59zbvF7EHsSPpRxm8", "fee": 1400000, "feeAssetId": null, "timestamp": 1625224107975, "version": 1, "sender": "3P9ZegsKUtsEpdRPNVrMH7nHEEqY5MrmjDp", "senderPublicKey": "7ziFsWp9eo6kUB6ovqQzJfjgQarifNfpCGNW9DZi8YhN", "proofs": [ "3gXKukQP4VfCKSR9ovbd3SHnMZqkLSSGPmnJHmBVPmADB7JA4t3Ekfyw99tNNLMew1NE3HHbkGFMxXpPpfZgToYE", "brK3Rkv6TGArXk3cLRbzTddXYmXWGoGHeEgdQERWvwoRWtQ7SVUSeeLgtSv29AfasoyVdtADUFWqFZwg9sL2Yr2" ], "script": "base64:AAIEAAAAAAAAACQIAhIDCgEEEgMKAQQSAwoBARIDCgEBEgQKAggBEgASABIAEgAAAABuAQAAAAJTRQAAAAIAAAABawAAAAF2CQEAAAALU3RyaW5nRW50cnkAAAACBQAAAAFrBQAAAAF2AQAAAAJJRQAAAAIAAAABawAAAAF2CQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAABawUAAAABdgEAAAACU1QAAAADAAAAAWEAAAADYW10AAAAAXQJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAAWEFAAAAA2FtdAUAAAABdAAAAAAEdGVuNgAAAAAAAA9CQAAAAAAEdGVuOAAAAAAABfXhAAAAAAADTUFYAH//////////AAAAABFjb25maWdQcm92aWRlcktleQIAAAAOY29uZmlnUHJvdmlkZXIAAAAADmNvbmZpZ1Byb3ZpZGVyBAAAAAckbWF0Y2gwCQAEHQAAAAIFAAAABHRoaXMFAAAAEWNvbmZpZ1Byb3ZpZGVyS2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAXMFAAAAByRtYXRjaDAJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAAAXMFAAAABHRoaXMBAAAABmxvY2FsSQAAAAIAAAABawAAAAFlCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAABawUAAAABZQEAAAAGbG9jYWxTAAAAAgAAAAFrAAAAAWUJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAAAFrBQAAAAFlAQAAAAVjb25mSQAAAAIAAAABawAAAAFlCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAOY29uZmlnUHJvdmlkZXIFAAAAAWsFAAAAAWUBAAAABWNvbmZTAAAAAgAAAAFrAAAAAWUJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAA5jb25maWdQcm92aWRlcgUAAAABawUAAAABZQAAAAAFQlVMTEsCAAAABkJVTExJZAAAAAAFQkVBUksCAAAABkJFQVJJZAAAAAAFVVNETksCAAAAC21haW5Ub2tlbklkAAAAAAhCVUxMQ09MSwIAAAAOYnVsbENvbGxhdGVyYWwAAAAACEJFQVJDT0xLAgAAAA5iZWFyQ29sbGF0ZXJhbAAAAAAJQlVMTENJUkNLAgAAAA9idWxsQ2lyY3VsYXRpb24AAAAACUJFQVJDSVJDSwIAAAAPYmVhckNpcmN1bGF0aW9uAAAAAAhJU1NQRVJDSwIAAAAPaXNzdWVQZXJjZW50aWxlAAAAAAhSRURQRVJDSwIAAAAQcmVkZWVtUGVyY2VudGlsZQAAAAAHTUlOSVNTSwIAAAAIbWluSXNzdWUAAAAAB01JTlJFREsCAAAACW1pblJlZGVlbQAAAAAITUlOUE9PTEsCAAAAB21pblBvb2wAAAAAB0ZFRUFDQ0sCAAAAD2ZlZXNBY2N1bXVsYXRlZAAAAAAGV0xJU1RLAgAAAA5pc3N1ZVdoaXRlTGlzdAAAAAAIUkVCUEVSQ0sCAAAAE3JlYmFsYW5jZVBlcmNlbnRpbGUAAAAAB1JFQklEWEsCAAAAFWxhc3RTZXR0bGVtZW50UHJpY2VJZAAAAAAFSEVBREsCAAAAC2hlYWRQb2ludGVyAAAAAAVUQUlMSwIAAAALdGFpbFBvaW50ZXIAAAAABlFTSVpFSwIAAAAJcXVldWVTaXplAAAAAAlQT09MVVNETksCAAAAEnBvb2xNYWluVG9rZW5WYWx1ZQAAAAAHUE9PTFVQSwIAAAAGcG9vbFVwAAAAAAhQT09MRFdOSwIAAAAHcG9vbER3bgAAAAAJUE9PTENJUkNLAgAAABRwb29sVG9rZW5DaXJjdWxhdGlvbgAAAAAFUE9PTEsCAAAACXBvb2xUb2tlbgAAAAAIQVNTTkFNRUsCAAAADWRlZm9Bc3NldE5hbWUAAAAABExFVksCAAAACGxldmVyYWdlAAAAAAlXQVZFU0ZFRUsCAAAAEXdhdmVzUGFjZW1ha2VyRmVlAAAAAAhVU0RORkVFSwIAAAAQdXNkblBhY2VtYWtlckZlZQAAAAALb3JhY2xldjJLZXkCAAAACG9yYWNsZXYyAAAAAAxhc3NldGlkdjJLZXkCAAAACWFzc2V0aWR2MgAAAAAIb3JhY2xldjIJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAAAtvcmFjbGV2Mktl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TEsCAAAABW5vIDEyAAAAABRwb29sVG9rZW5DaXJjdWxhdGlvbgkBAAAABmxvY2FsSQAAAAIFAAAACVBPT0xDSVJDSwIAAAAFbm8gMTMAAAAAEHBvb2xCdWxsRXhwb3N1cmUJAABrAAAAAwUAAAAHYnVsbENvbAUAAAAGcG9vbFVwBQAAAAhidWxsQ2lyYwAAAAAQcG9vbEJlYXJFeHBvc3VyZQkAAGsAAAADBQAAAAdiZWFyQ29sBQAAAAdwb29sRHduBQAAAAhiZWFyQ2lyYwAAAAAJcG9vbFZhbHVlCQAAZAAAAAIJAABkAAAAAgUAAAAIcG9vbE1haW4FAAAAEHBvb2xCdWxsRXhwb3N1cmUFAAAAEHBvb2xCZWFyRXhwb3N1cmUAAAAABm9yYWNsZQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEJgAAAAEFAAAACG9yYWNsZXYyAgAAABJiYWQgb3JhY2xlIGFkZHJlc3MAAAAADWNsb3NlSW50ZXJ2YWwJAQAAAAVjb25mSQAAAAICAAAADWNsb3NlSW50ZXJ2YWwCAAAABW5vIENJAAAAABFzZXR0bGVkUHJpY2VJbmRleAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAB1JFQklEWEsCAAAAF25vIGxhc3QgcmViYWxhbmNlIHByaWNlAAAAABBvcmFjbGVQcmljZUluZGV4CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAGb3JhY2xlBQAAABFsYXN0UHJpY2VJbmRleEtleQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAATYmFkIG9yYWNsZSBkYXRhIGF0IAkABCUAAAABBQAAAAZvcmFjbGUCAAAAEDogbm8gaW50ZWdlciBhdCAFAAAAEWxhc3RQcmljZUluZGV4S2V5AAAAAAhsZXZlcmFnZQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAAARMRVZLAAAAAAAAAAADAQAAAA1oZWlnaHRCeUluZGV4AAAAAQAAAApwcmljZUluZGV4CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAGb3JhY2xlCQABLAAAAAIFAAAAEHByaWNlSW5kZXhQcmVmaXgJAAGkAAAAAQUAAAAKcHJpY2VJbmRleAkAASwAAAACAgAAABFubyBkYXRhIGF0IGluZGV4IAkAAaQAAAABBQAAAApwcmljZUluZGV4AQAAAA1wcmljZUJ5SGVpZ2h0AAAAAQAAAAtwcmljZUhlaWdodAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABm9yYWNsZQkAASwAAAACBQAAABFwcmljZUhlaWdodFByZWZpeAkAAaQAAAABBQAAAAtwcmljZUhlaWdodAkAASwAAAACAgAAABNubyBkYXRhIGZvciBoZWlnaHQgCQABpAAAAAEFAAAAC3ByaWNlSGVpZ2h0AQAAAAxwcmljZUJ5SW5kZXgAAAABAAAACnByaWNlSW5kZXgJAQAAAA1wcmljZUJ5SGVpZ2h0AAAAAQkBAAAADWhlaWdodEJ5SW5kZXgAAAABBQAAAApwcmljZUluZGV4AAAAAAlxdWV1ZVNpemUJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAAGUVNJWkVLAAAAAAAAAAAAAAAAAAtoZWFkUG9pbnRlcgkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAAAVIRUFESwIAAAAAAAAAAAt0YWlsUG9pbnRlcgkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAAAVUQUlMSwIAAAAAAAAAAA9mZWVzQWNjdW11bGF0ZWQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAAHRkVFQUNDSwAAAAAAAAAAAAAAAAAFSVNTVUUCAAAABUlTU1VFAAAAAAZSRURFRU0CAAAABlJFREVFTQAAAAAEUE9PTAIAAAAEUE9PTAAAAAAGVU5QT09MAgAAAAZVTlBPT0wAAAAACmZlZUFkZHJLZXkCAAAACmZlZUFkZHJlc3MAAAAADnN0YWtpbmdBZGRyS2V5AgAAAA5zdGFraW5nQWRkcmVzcwAAAAAPZGFlbW9uUHViS2V5S2V5AgAAAA9kYWVtb25QdWJsaWNLZXkAAAAACmZlZUFkZHJlc3MJAQAAABN2YWx1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AAAADHNldHRsZWRQcmljZQUAAAAJbmV4dFByaWNlBQAAAAhsZXZlcmFnZQQAAAATcHJpY2VVcEdvb2RGb3JCdWxscwkAAAAAAAACBQAAAAlhc3NldE5hbWUCAAAAAAQAAAALcHJpY2VHb2VzVXAJAABmAAAAAgUAAAAJbmV4dFByaWNlBQAAAAxzZXR0bGVkUHJpY2UEAAAACWJ1bGxzRWFybgkAAAAAAAACBQAAABNwcmljZVVwR29vZEZvckJ1bGxzBQAAAAtwcmljZUdvZXNVcAQAAAAKbmV3QnVsbENvbAMFAAAACWJ1bGxzRWFybgkAAGQAAAACBQAAAAdidWxsQ29sBQAAAAZyZWRpc3QJAABlAAAAAgUAAAAHYnVsbENvbAUAAAAGcmVkaXN0BAAAAApuZXdCZWFyQ29sAwUAAAAJYnVsbHNFYXJuCQAAZQAAAAIFAAAAB2JlYXJDb2wFAAAABnJlZGlzdAkAAGQAAAACBQAAAAdiZWFyQ29sBQAAAAZyZWRpc3QEAAAADSR0MDE4MzgxMTg1NzkJAQAAAAtwb29sU3VwcG9ydAAAAAgFAAAACm5ld0J1bGxDb2wFAAAACm5ld0JlYXJDb2wFAAAACGJ1bGxDaXJjBQAAAAhiZWFyQ2lyYwUAAAAIcG9vbE1haW4FAAAABnBvb2xVcAUAAAAHcG9vbER3bgUAAAAGb2Zmc2V0BAAAAAp1cGRCdWxsQ29sCAUAAAANJHQwMTgzODExODU3OQAAAAJfMQQAAAAKdXBkQmVhckNvbAgFAAAADSR0MDE4MzgxMTg1NzkAAAACXzIEAAAAC3VwZEJ1bGxDaXJjCAUAAAANJHQwMTgzODExODU3OQAAAAJfMwQAAAALdXBkQmVhckNpcmMIBQAAAA0kdDAxODM4MTE4NTc5AAAAAl80BAAAAAt1cGRQb29sTWFpbggFAAAADSR0MDE4MzgxMTg1NzkAAAACXzUEAAAACXVwZFBvb2xVcAgFAAAADSR0MDE4MzgxMTg1NzkAAAACXzYEAAAACnVwZFBvb2xEd24IBQAAAA0kdDAxODM4MTE4NTc5AAAAAl83CQAETAAAAAIJAQAAAAJJRQAAAAIFAAAACEJVTExDT0xLBQAAAAp1cGRCdWxsQ29sCQAETAAAAAIJAQAAAAJJRQAAAAIFAAAACEJFQVJDT0xL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", "chainId": 87, "height": 2660670, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: AGAB6Z113NVtBHZhBYoTkWdHXp8uWTmdW2TmVykmUYT7 Next: 4dSn7PaFxXxLGBwvUxRqQUyHYST8PviT4z8zdo7EUDdr Diff:
OldNewDifferences
9393
9494 let USDNFEEK = "usdnPacemakerFee"
9595
96-let oraclePKKey = "oracle"
96+let oraclev2Key = "oraclev2"
97+
98+let assetidv2Key = "assetidv2"
99+
100+let oraclev2 = valueOrErrorMessage(getString(this, oraclev2Key), "no oraclev2 key")
101+
102+let assetidv2 = valueOrErrorMessage(getString(this, assetidv2Key), "no assetidv2")
97103
98104 let maxDeviation = valueOrElse(getInteger(configProvider, (toString(this) + "_deviationPercentile")), 0)
99105
100-func lastPriceIndexKey (assetId) = if ((assetId == ""))
101- then "price_index"
102- else ("%s%s__idxCurrent__" + assetId)
106+let lastPriceIndexKey = ("%s%s__idxCurrent__" + assetidv2)
103107
108+let priceIndexPrefix = (("%s%s%d__idx2Height__" + assetidv2) + "__")
104109
105-func priceIndexPrefix (assetId) = if ((assetId == ""))
106- then "price_index_"
107- else (("%s%s%d__idx2Height__" + assetId) + "__")
108-
109-
110-func priceHeightPrefix (assetId) = if ((assetId == ""))
111- then "price_"
112- else (("%s%s%d__priceByHeight__" + assetId) + "__")
113-
110+let priceHeightPrefix = (("%s%s%d__priceByHeight__" + assetidv2) + "__")
114111
115112 let minUsdnFee = valueOrElse(getInteger(configProvider, USDNFEEK), 0)
116113
167164
168165 let poolValue = ((poolMain + poolBullExposure) + poolBearExposure)
169166
170-let oracle = valueOrErrorMessage(addressFromPublicKey(fromBase58String(valueOrErrorMessage(getString(this, oraclePKKey), "no oraclePKKey"))), "bad oracle address")
167+let oracle = valueOrErrorMessage(addressFromString(oraclev2), "bad oracle address")
171168
172169 let closeInterval = confI("closeInterval", "no CI")
173170
174171 let settledPriceIndex = valueOrErrorMessage(getInteger(this, REBIDXK), "no last rebalance price")
175172
176-let oraclePriceIndex = valueOrErrorMessage(getInteger(oracle, lastPriceIndexKey(assetName)), ((("bad oracle data at " + toString(oracle)) + ": no integer at ") + lastPriceIndexKey(assetName)))
173+let oraclePriceIndex = valueOrErrorMessage(getInteger(oracle, lastPriceIndexKey), ((("bad oracle data at " + toString(oracle)) + ": no integer at ") + lastPriceIndexKey))
177174
178175 let leverage = valueOrElse(getInteger(this, LEVK), 3)
179176
180-func heightByIndex (priceIndex) = valueOrErrorMessage(getInteger(oracle, (priceIndexPrefix(assetName) + toString(priceIndex))), ("no data at index " + toString(priceIndex)))
177+func heightByIndex (priceIndex) = valueOrErrorMessage(getInteger(oracle, (priceIndexPrefix + toString(priceIndex))), ("no data at index " + toString(priceIndex)))
181178
182179
183-func priceByHeight (priceHeight) = valueOrErrorMessage(getInteger(oracle, (priceHeightPrefix(assetName) + toString(priceHeight))), ("no data for height " + toString(priceHeight)))
180+func priceByHeight (priceHeight) = valueOrErrorMessage(getInteger(oracle, (priceHeightPrefix + toString(priceHeight))), ("no data for height " + toString(priceHeight)))
184181
185182
186183 func priceByIndex (priceIndex) = priceByHeight(heightByIndex(priceIndex))
323320 $Tuple7((c1 + spentPoolValue), c2, (a0 + acquiredTokens), a1, (c0 - spentPoolValue), (pu + acquiredTokens), pd)
324321 }
325322
326- let $t0926910304 = if ((curBullCol0 > curBearCol0))
323+ let $t0913310168 = if ((curBullCol0 > curBearCol0))
327324 then {
328325 let afterCloseUp = closeUp(curBullCol0, curBearCol0, curBullCirc0, curBearCirc0, curPoolMain0, curPoolUp0, curPoolDwn0)
329- let $t094959632 = afterCloseUp
330- let a = $t094959632._1
331- let b = $t094959632._2
332- let c = $t094959632._3
333- let d = $t094959632._4
334- let e = $t094959632._5
335- let f = $t094959632._6
336- let g = $t094959632._7
326+ let $t093599496 = afterCloseUp
327+ let a = $t093599496._1
328+ let b = $t093599496._2
329+ let c = $t093599496._3
330+ let d = $t093599496._4
331+ let e = $t093599496._5
332+ let f = $t093599496._6
333+ let g = $t093599496._7
337334 if ((f > 0))
338335 then afterCloseUp
339336 else if ((f == 0))
342339 }
343340 else {
344341 let afterCloseDwn = closeDwn(curBullCol0, curBearCol0, curBullCirc0, curBearCirc0, curPoolMain0, curPoolUp0, curPoolDwn0)
345- let $t0998310123 = afterCloseDwn
346- let a = $t0998310123._1
347- let b = $t0998310123._2
348- let c = $t0998310123._3
349- let d = $t0998310123._4
350- let e = $t0998310123._5
351- let f = $t0998310123._6
352- let g = $t0998310123._7
342+ let $t098479987 = afterCloseDwn
343+ let a = $t098479987._1
344+ let b = $t098479987._2
345+ let c = $t098479987._3
346+ let d = $t098479987._4
347+ let e = $t098479987._5
348+ let f = $t098479987._6
349+ let g = $t098479987._7
353350 if ((g > 0))
354351 then afterCloseDwn
355352 else if ((g == 0))
356353 then openUp(a, b, c, d, e, f, g)
357354 else throw("poolDwn < 0")
358355 }
359- let c1 = $t0926910304._1
360- let c2 = $t0926910304._2
361- let a0 = $t0926910304._3
362- let a1 = $t0926910304._4
363- let c0 = $t0926910304._5
364- let pu = $t0926910304._6
365- let pd = $t0926910304._7
356+ let c1 = $t0913310168._1
357+ let c2 = $t0913310168._2
358+ let a0 = $t0913310168._3
359+ let a1 = $t0913310168._4
360+ let c0 = $t0913310168._5
361+ let pu = $t0913310168._6
362+ let pd = $t0913310168._7
366363 let charge = fraction(userDiffAbs(), (rebalancePercentile * steps), ((1440 * 100) * 100))
367364 let c1SplitP = if ((pd > 0))
368365 then charge
375372
376373
377374 func poolSup (curBullCol0,curBearCol0,curBullCirc0,curBearCirc0) = {
378- let $t01072910914 = poolSupport(curBullCol0, curBearCol0, curBullCirc0, curBearCirc0, poolMain, poolUp, poolDwn, 0)
379- let bullCol1 = $t01072910914._1
380- let bearCol1 = $t01072910914._2
381- let bullCic1 = $t01072910914._3
382- let bearCirc1 = $t01072910914._4
383- let poolMain1 = $t01072910914._5
384- let poolUp1 = $t01072910914._6
385- let poolDwn1 = $t01072910914._7
375+ let $t01059310778 = poolSupport(curBullCol0, curBearCol0, curBullCirc0, curBearCirc0, poolMain, poolUp, poolDwn, 0)
376+ let bullCol1 = $t01059310778._1
377+ let bearCol1 = $t01059310778._2
378+ let bullCic1 = $t01059310778._3
379+ let bearCirc1 = $t01059310778._4
380+ let poolMain1 = $t01059310778._5
381+ let poolUp1 = $t01059310778._6
382+ let poolDwn1 = $t01059310778._7
386383 [IE(BULLCOLK, bullCol1), IE(BULLCIRCK, bullCic1), IE(BEARCOLK, bearCol1), IE(BEARCIRCK, bearCirc1), IE(POOLUSDNK, poolMain1), IE(POOLUPK, poolUp1), IE(POOLDWNK, poolDwn1)]
387384 }
388385
427424 else if ((token == BEAR))
428425 then fraction(bearCirc, addedCollateral, bearCol)
429426 else throw("bad token id")
430- let $t01292612999 = sp(defaultAddedTokens, maxPayout)
431- let addedToCirculation = $t01292612999._1
432- let extraTokens = $t01292612999._2
433- let $t01301613187 = if ((token == BULL))
427+ let $t01279012863 = sp(defaultAddedTokens, maxPayout)
428+ let addedToCirculation = $t01279012863._1
429+ let extraTokens = $t01279012863._2
430+ let $t01288013051 = if ((token == BULL))
434431 then $Tuple4(defaultAddedTokens, addedCollateral, 0, 0)
435432 else $Tuple4(0, 0, defaultAddedTokens, addedCollateral)
436- let plusBulls = $t01301613187._1
437- let plusBullCol = $t01301613187._2
438- let plusBears = $t01301613187._3
439- let plusBearCol = $t01301613187._4
433+ let plusBulls = $t01288013051._1
434+ let plusBullCol = $t01288013051._2
435+ let plusBears = $t01288013051._3
436+ let plusBearCol = $t01288013051._4
440437 if ((minPayout > addedToCirculation))
441438 then payback(mainToken)
442439 else (poolSup((bullCol + plusBullCol), (bearCol + plusBearCol), (bullCirc + plusBulls), (bearCirc + plusBears)) ++ [SE(HEADK, next), collectFee(feeSize), decreaseQueueSize, ST(invoker, addedToCirculation, fromBase58String(token)), ST(feeAddress, extraTokens, fromBase58String(token))])
451448 else throw("bad token id")
452449 let feeSize = fraction(estimatedPayout, redeemPercentile, 10000)
453450 let defaultPayout = (estimatedPayout - feeSize)
454- let $t01425414308 = sp(defaultPayout, maxPayout)
455- let userPayout = $t01425414308._1
456- let extra = $t01425414308._2
457- let $t01432514490 = if ((token == BULL))
451+ let $t01411814172 = sp(defaultPayout, maxPayout)
452+ let userPayout = $t01411814172._1
453+ let extra = $t01411814172._2
454+ let $t01418914354 = if ((token == BULL))
458455 then $Tuple4(removedTokens, estimatedPayout, 0, 0)
459456 else $Tuple4(0, 0, removedTokens, estimatedPayout)
460- let minusBulls = $t01432514490._1
461- let minusBullCol = $t01432514490._2
462- let minusBears = $t01432514490._3
463- let minusBearCol = $t01432514490._4
457+ let minusBulls = $t01418914354._1
458+ let minusBullCol = $t01418914354._2
459+ let minusBears = $t01418914354._3
460+ let minusBearCol = $t01418914354._4
464461 if ((minPayout > userPayout))
465462 then payback(token)
466463 else (poolSup((bullCol - minusBullCol), (bearCol - minusBearCol), (bullCirc - minusBulls), (bearCirc - minusBears)) ++ [SE(HEADK, next), collectFee(feeSize), decreaseQueueSize, ST(invoker, userPayout, fromBase58String(mainToken)), ST(feeAddress, extra, fromBase58String(mainToken))])
541538 let newBearCol = if (bullsEarn)
542539 then (bearCol - redist)
543540 else (bearCol + redist)
544- let $t01851718715 = poolSupport(newBullCol, newBearCol, bullCirc, bearCirc, poolMain, poolUp, poolDwn, offset)
545- let updBullCol = $t01851718715._1
546- let updBearCol = $t01851718715._2
547- let updBullCirc = $t01851718715._3
548- let updBearCirc = $t01851718715._4
549- let updPoolMain = $t01851718715._5
550- let updPoolUp = $t01851718715._6
551- let updPoolDwn = $t01851718715._7
541+ let $t01838118579 = poolSupport(newBullCol, newBearCol, bullCirc, bearCirc, poolMain, poolUp, poolDwn, offset)
542+ let updBullCol = $t01838118579._1
543+ let updBearCol = $t01838118579._2
544+ let updBullCirc = $t01838118579._3
545+ let updBearCirc = $t01838118579._4
546+ let updPoolMain = $t01838118579._5
547+ let updPoolUp = $t01838118579._6
548+ let updPoolDwn = $t01838118579._7
552549 [IE(BULLCOLK, updBullCol), IE(BEARCOLK, updBearCol), IE(BULLCIRCK, updBullCirc), IE(BEARCIRCK, updBearCirc), IE(POOLUSDNK, updPoolMain), IE(POOLUPK, updPoolUp), IE(POOLDWNK, updPoolDwn), IE(REBIDXK, unsettledPriceIndex)]
553550 }
554551 }
590587 else false)
591588 then throw("bad token req")
592589 else {
593- let $t02019020329 = if ((tokenId == BULL))
590+ let $t02005420193 = if ((tokenId == BULL))
594591 then $Tuple2(bullCol, bullCirc)
595592 else if ((tokenId == BEAR))
596593 then $Tuple2(bearCol, bearCirc)
597594 else throw("bad token req")
598- let col = $t02019020329._1
599- let circ = $t02019020329._2
595+ let col = $t02005420193._1
596+ let circ = $t02005420193._2
600597 let est = fraction(amt, col, circ)
601- let $t02037720471 = if ((minPayout == 0))
598+ let $t02024120335 = if ((minPayout == 0))
602599 then $Tuple2(0, MAX)
603600 else $Tuple2(minPayout, calcMax(minPayout, est))
604- let minP = $t02037720471._1
605- let maxP = $t02037720471._2
601+ let minP = $t02024120335._1
602+ let maxP = $t02024120335._2
606603 if ((inv.caller == this))
607604 then throw("can't do")
608605 else {
631628 then throw("bad token att")
632629 else {
633630 let amt = inv.payments[0].amount
634- let $t02144021621 = if ((tokenId == BULL))
631+ let $t02130421485 = if ((tokenId == BULL))
635632 then $Tuple2(bullCol, bullCirc)
636633 else if ((tokenId == BEAR))
637634 then $Tuple2(bearCol, bearCirc)
638635 else throw("bad token req")
639- let col = $t02144021621._1
640- let circ = $t02144021621._2
636+ let col = $t02130421485._1
637+ let circ = $t02130421485._2
641638 let est = fraction(amt, circ, col)
642- let $t02166321757 = if ((minPayout == 0))
639+ let $t02152721621 = if ((minPayout == 0))
643640 then $Tuple2(0, MAX)
644641 else $Tuple2(minPayout, calcMax(minPayout, est))
645- let minP = $t02166321757._1
646- let maxP = $t02166321757._2
642+ let minP = $t02152721621._1
643+ let maxP = $t02152721621._2
647644 if ((minIssue > amt))
648645 then throw((("Attached payment too small. Min required: " + toString((minIssue / 1000000))) + " USDN"))
649646 else {
738735 then true
739736 else hasDeviation((settledPriceIndex + shift)))
740737
741- let $t02515425253 = {
742- let $list2519825253 = [1, 2, 3, 4, 5, 6, 7]
743- let $size2519825253 = size($list2519825253)
744- let $acc02519825253 = $Tuple2(settledPriceIndex, false)
745- if (($size2519825253 == 0))
746- then $acc02519825253
738+ let $t02501825117 = {
739+ let $list2506225117 = [1, 2, 3, 4, 5, 6, 7]
740+ let $size2506225117 = size($list2506225117)
741+ let $acc02506225117 = $Tuple2(settledPriceIndex, false)
742+ if (($size2506225117 == 0))
743+ then $acc02506225117
747744 else {
748- let $acc12519825253 = f($acc02519825253, $list2519825253[0])
749- if (($size2519825253 == 1))
750- then $acc12519825253
745+ let $acc12506225117 = f($acc02506225117, $list2506225117[0])
746+ if (($size2506225117 == 1))
747+ then $acc12506225117
751748 else {
752- let $acc22519825253 = f($acc12519825253, $list2519825253[1])
753- if (($size2519825253 == 2))
754- then $acc22519825253
749+ let $acc22506225117 = f($acc12506225117, $list2506225117[1])
750+ if (($size2506225117 == 2))
751+ then $acc22506225117
755752 else {
756- let $acc32519825253 = f($acc22519825253, $list2519825253[2])
757- if (($size2519825253 == 3))
758- then $acc32519825253
753+ let $acc32506225117 = f($acc22506225117, $list2506225117[2])
754+ if (($size2506225117 == 3))
755+ then $acc32506225117
759756 else {
760- let $acc42519825253 = f($acc32519825253, $list2519825253[3])
761- if (($size2519825253 == 4))
762- then $acc42519825253
757+ let $acc42506225117 = f($acc32506225117, $list2506225117[3])
758+ if (($size2506225117 == 4))
759+ then $acc42506225117
763760 else {
764- let $acc52519825253 = f($acc42519825253, $list2519825253[4])
765- if (($size2519825253 == 5))
766- then $acc52519825253
761+ let $acc52506225117 = f($acc42506225117, $list2506225117[4])
762+ if (($size2506225117 == 5))
763+ then $acc52506225117
767764 else {
768- let $acc62519825253 = f($acc52519825253, $list2519825253[5])
769- if (($size2519825253 == 6))
770- then $acc62519825253
765+ let $acc62506225117 = f($acc52506225117, $list2506225117[5])
766+ if (($size2506225117 == 6))
767+ then $acc62506225117
771768 else {
772- let $acc72519825253 = f($acc62519825253, $list2519825253[6])
773- if (($size2519825253 == 7))
774- then $acc72519825253
769+ let $acc72506225117 = f($acc62506225117, $list2506225117[6])
770+ if (($size2506225117 == 7))
771+ then $acc72506225117
775772 else {
776- let $acc82519825253 = f($acc72519825253, $list2519825253[7])
773+ let $acc82506225117 = f($acc72506225117, $list2506225117[7])
777774 throw("List size exceed 7")
778775 }
779776 }
784781 }
785782 }
786783 }
787- let okShift = $t02515425253._1
788- let forcedByDeviationOrTimeout = $t02515425253._2
784+ let okShift = $t02501825117._1
785+ let forcedByDeviationOrTimeout = $t02501825117._2
789786 let queueWaits = (oraclePriceIndex >= queuePriceIndex)
790787 if ((settledPriceIndex > queuePriceIndex))
791788 then throw("settle2: future price already settled/rebalanced")
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func SE (k,v) = StringEntry(k, v)
55
66
77 func IE (k,v) = IntegerEntry(k, v)
88
99
1010 func ST (a,amt,t) = ScriptTransfer(a, amt, t)
1111
1212
1313 let ten6 = 1000000
1414
1515 let ten8 = 100000000
1616
1717 let MAX = 9223372036854775807
1818
1919 let configProviderKey = "configProvider"
2020
2121 let configProvider = match getString(this, configProviderKey) {
2222 case s: String =>
2323 addressFromStringValue(s)
2424 case _ =>
2525 this
2626 }
2727
2828 func localI (k,e) = valueOrErrorMessage(getInteger(this, k), e)
2929
3030
3131 func localS (k,e) = valueOrErrorMessage(getString(this, k), e)
3232
3333
3434 func confI (k,e) = valueOrErrorMessage(getInteger(configProvider, k), e)
3535
3636
3737 func confS (k,e) = valueOrErrorMessage(getString(configProvider, k), e)
3838
3939
4040 let BULLK = "BULLId"
4141
4242 let BEARK = "BEARId"
4343
4444 let USDNK = "mainTokenId"
4545
4646 let BULLCOLK = "bullCollateral"
4747
4848 let BEARCOLK = "bearCollateral"
4949
5050 let BULLCIRCK = "bullCirculation"
5151
5252 let BEARCIRCK = "bearCirculation"
5353
5454 let ISSPERCK = "issuePercentile"
5555
5656 let REDPERCK = "redeemPercentile"
5757
5858 let MINISSK = "minIssue"
5959
6060 let MINREDK = "minRedeem"
6161
6262 let MINPOOLK = "minPool"
6363
6464 let FEEACCK = "feesAccumulated"
6565
6666 let WLISTK = "issueWhiteList"
6767
6868 let REBPERCK = "rebalancePercentile"
6969
7070 let REBIDXK = "lastSettlementPriceId"
7171
7272 let HEADK = "headPointer"
7373
7474 let TAILK = "tailPointer"
7575
7676 let QSIZEK = "queueSize"
7777
7878 let POOLUSDNK = "poolMainTokenValue"
7979
8080 let POOLUPK = "poolUp"
8181
8282 let POOLDWNK = "poolDwn"
8383
8484 let POOLCIRCK = "poolTokenCirculation"
8585
8686 let POOLK = "poolToken"
8787
8888 let ASSNAMEK = "defoAssetName"
8989
9090 let LEVK = "leverage"
9191
9292 let WAVESFEEK = "wavesPacemakerFee"
9393
9494 let USDNFEEK = "usdnPacemakerFee"
9595
96-let oraclePKKey = "oracle"
96+let oraclev2Key = "oraclev2"
97+
98+let assetidv2Key = "assetidv2"
99+
100+let oraclev2 = valueOrErrorMessage(getString(this, oraclev2Key), "no oraclev2 key")
101+
102+let assetidv2 = valueOrErrorMessage(getString(this, assetidv2Key), "no assetidv2")
97103
98104 let maxDeviation = valueOrElse(getInteger(configProvider, (toString(this) + "_deviationPercentile")), 0)
99105
100-func lastPriceIndexKey (assetId) = if ((assetId == ""))
101- then "price_index"
102- else ("%s%s__idxCurrent__" + assetId)
106+let lastPriceIndexKey = ("%s%s__idxCurrent__" + assetidv2)
103107
108+let priceIndexPrefix = (("%s%s%d__idx2Height__" + assetidv2) + "__")
104109
105-func priceIndexPrefix (assetId) = if ((assetId == ""))
106- then "price_index_"
107- else (("%s%s%d__idx2Height__" + assetId) + "__")
108-
109-
110-func priceHeightPrefix (assetId) = if ((assetId == ""))
111- then "price_"
112- else (("%s%s%d__priceByHeight__" + assetId) + "__")
113-
110+let priceHeightPrefix = (("%s%s%d__priceByHeight__" + assetidv2) + "__")
114111
115112 let minUsdnFee = valueOrElse(getInteger(configProvider, USDNFEEK), 0)
116113
117114 let minWavesFee = valueOrElse(getInteger(configProvider, WAVESFEEK), 0)
118115
119116 let assetName = valueOrElse(getString(this, ASSNAMEK), "")
120117
121118 let bullCol = localI(BULLCOLK, "no 0")
122119
123120 let bearCol = localI(BEARCOLK, "no 1")
124121
125122 let bullCirc = localI(BULLCIRCK, "no 2")
126123
127124 let bearCirc = localI(BEARCIRCK, "no 3")
128125
129126 let BULL = localS(BULLK, "no 14")
130127
131128 let BEAR = localS(BEARK, "no 15")
132129
133130 let mainToken = localS(USDNK, "no 16")
134131
135132 let issuePercentile = confI(ISSPERCK, "no 4")
136133
137134 let redeemPercentile = confI(REDPERCK, "no 5")
138135
139136 let minIssue = confI(MINISSK, "no 6")
140137
141138 let minRedeem = confI(MINREDK, "no 7")
142139
143140 let minPool = confI(MINPOOLK, "no 8")
144141
145142 let rebalancePercentile = valueOrElse(getInteger(configProvider, ((toString(this) + "_") + REBPERCK)), 0)
146143
147144 let whitelist = confS(WLISTK, "no 9")
148145
149146 func allowed (a) = if ((whitelist == ""))
150147 then true
151148 else isDefined(indexOf(whitelist, toString(a)))
152149
153150
154151 let poolMain = localI(POOLUSDNK, "no")
155152
156153 let poolUp = localI(POOLUPK, "no 10")
157154
158155 let poolDwn = localI(POOLDWNK, "no 11")
159156
160157 let poolToken = localS(POOLK, "no 12")
161158
162159 let poolTokenCirculation = localI(POOLCIRCK, "no 13")
163160
164161 let poolBullExposure = fraction(bullCol, poolUp, bullCirc)
165162
166163 let poolBearExposure = fraction(bearCol, poolDwn, bearCirc)
167164
168165 let poolValue = ((poolMain + poolBullExposure) + poolBearExposure)
169166
170-let oracle = valueOrErrorMessage(addressFromPublicKey(fromBase58String(valueOrErrorMessage(getString(this, oraclePKKey), "no oraclePKKey"))), "bad oracle address")
167+let oracle = valueOrErrorMessage(addressFromString(oraclev2), "bad oracle address")
171168
172169 let closeInterval = confI("closeInterval", "no CI")
173170
174171 let settledPriceIndex = valueOrErrorMessage(getInteger(this, REBIDXK), "no last rebalance price")
175172
176-let oraclePriceIndex = valueOrErrorMessage(getInteger(oracle, lastPriceIndexKey(assetName)), ((("bad oracle data at " + toString(oracle)) + ": no integer at ") + lastPriceIndexKey(assetName)))
173+let oraclePriceIndex = valueOrErrorMessage(getInteger(oracle, lastPriceIndexKey), ((("bad oracle data at " + toString(oracle)) + ": no integer at ") + lastPriceIndexKey))
177174
178175 let leverage = valueOrElse(getInteger(this, LEVK), 3)
179176
180-func heightByIndex (priceIndex) = valueOrErrorMessage(getInteger(oracle, (priceIndexPrefix(assetName) + toString(priceIndex))), ("no data at index " + toString(priceIndex)))
177+func heightByIndex (priceIndex) = valueOrErrorMessage(getInteger(oracle, (priceIndexPrefix + toString(priceIndex))), ("no data at index " + toString(priceIndex)))
181178
182179
183-func priceByHeight (priceHeight) = valueOrErrorMessage(getInteger(oracle, (priceHeightPrefix(assetName) + toString(priceHeight))), ("no data for height " + toString(priceHeight)))
180+func priceByHeight (priceHeight) = valueOrErrorMessage(getInteger(oracle, (priceHeightPrefix + toString(priceHeight))), ("no data for height " + toString(priceHeight)))
184181
185182
186183 func priceByIndex (priceIndex) = priceByHeight(heightByIndex(priceIndex))
187184
188185
189186 let queueSize = valueOrElse(getInteger(this, QSIZEK), 0)
190187
191188 let headPointer = valueOrElse(getString(this, HEADK), "")
192189
193190 let tailPointer = valueOrElse(getString(this, TAILK), "")
194191
195192 let feesAccumulated = valueOrElse(getInteger(this, FEEACCK), 0)
196193
197194 let ISSUE = "ISSUE"
198195
199196 let REDEEM = "REDEEM"
200197
201198 let POOL = "POOL"
202199
203200 let UNPOOL = "UNPOOL"
204201
205202 let feeAddrKey = "feeAddress"
206203
207204 let stakingAddrKey = "stakingAddress"
208205
209206 let daemonPubKeyKey = "daemonPublicKey"
210207
211208 let feeAddress = valueOrErrorMessage(addressFromString(confS(feeAddrKey, "no feeAddress")), "bad feeAddress")
212209
213210 let stakingAddress = confS(stakingAddrKey, "no stakingAddress")
214211
215212 let daemonPublicKey = fromBase58String(confS(daemonPubKeyKey, "no daemonPublicKey"))
216213
217214 let rpdAddress = addressFromString("3PNikM6yp4NqcSU8guxQtmR5onr2D4e8yTJ")
218215
219216 let admins = ["2HHqV8W9DJayV5R6tBD2Sb8srphpoboDi7r1t1aPiumC", "5ZXe82RRASU7qshXM2J9JNYhqJ9GWYjjVq2gwUV5Naz9", "5WRXFSjwcTbNfKcJs8ZqXmSSWYsSVJUtMvMqZj5hH4Nc"]
220217
221218 let opn = valueOrElse(getBoolean(oracle, ("%s%s__isMarketOpened__" + assetName)), true)
222219
223220 func buildNewItem (action,amt,token,priceIndex,invoker,minPayout,maxPayout) = (((((((((((((action + "|") + toString(amt)) + "|") + token) + "|") + toString(priceIndex)) + "|") + invoker) + "|") + toString(minPayout)) + "|") + toString(maxPayout)) + "|")
224221
225222
226223 func diffAbs (a1,a2) = {
227224 let diff = (a1 - a2)
228225 if ((diff > 0))
229226 then diff
230227 else (0 - diff)
231228 }
232229
233230
234231 func userDiffAbs () = diffAbs((bullCol - poolBullExposure), (bearCol - poolBearExposure))
235232
236233
237234 func maxIssue (tokenId) = {
238235 let poolInvestment = if ((poolUp > 0))
239236 then BULL
240237 else BEAR
241238 if ((tokenId != poolInvestment))
242239 then poolMain
243240 else (userDiffAbs() + poolValue)
244241 }
245242
246243
247244 func validatePMFee (i,minPayout) = if ((0 > minPayout))
248245 then throw("negative min payout")
249246 else {
250247 let p = i.payments[1]
251248 let ok = match p.assetId {
252249 case bv: ByteVector =>
253250 if ((toBase58String(bv) == mainToken))
254251 then (p.amount >= minUsdnFee)
255252 else false
256253 case waves: Unit =>
257254 (p.amount >= minWavesFee)
258255 case _ =>
259256 throw("Match error")
260257 }
261258 if (!(ok))
262259 then throw("incorrect pacemaker fee")
263260 else true
264261 }
265262
266263
267264 func enqueue (id,action,amt,token,priceIndex,invoker,minPayout,maxPayout) = if (!(valueOrElse(getBoolean(this, "enableEnqueue"), true)))
268265 then throw("enqueue paused")
269266 else {
270267 let increaseQueueSize = IE(QSIZEK, (queueSize + 1))
271268 let itm = buildNewItem(action, amt, token, priceIndex, invoker, minPayout, maxPayout)
272269 if ((queueSize == 0))
273270 then [SE(HEADK, id), SE(TAILK, id), SE(id, itm), increaseQueueSize]
274271 else {
275272 let prevId = localS(TAILK, "can't get tail pointer")
276273 let prevItm = localS(prevId, "can't resolve pointer")
277274 let updatedPrevItm = (prevItm + id)
278275 [SE(prevId, updatedPrevItm), SE(id, itm), SE(TAILK, id), increaseQueueSize]
279276 }
280277 }
281278
282279
283280 func poolSupport (curBullCol0,curBearCol0,curBullCirc0,curBearCirc0,curPoolMain0,curPoolUp0,curPoolDwn0,steps) = {
284281 func closeUp (c1,c2,a0,a1,c0,pu,pd) = {
285282 let diff = (c1 - c2)
286283 let exp = fraction(c1, pu, a0)
287284 let liquidatedTokens = if ((diff > exp))
288285 then pu
289286 else fraction(diff, a0, c1)
290287 let liquidatedValue = if ((diff > exp))
291288 then exp
292289 else fraction(liquidatedTokens, c1, a0)
293290 $Tuple7((c1 - liquidatedValue), c2, (a0 - liquidatedTokens), a1, (c0 + liquidatedValue), (pu - liquidatedTokens), pd)
294291 }
295292
296293 func closeDwn (c1,c2,a0,a1,c0,pu,pd) = {
297294 let diff = (c2 - c1)
298295 let exp = fraction(c2, pd, a1)
299296 let liquidatedTokens = if ((diff > exp))
300297 then pd
301298 else fraction(diff, a1, c2)
302299 let liquidatedValue = if ((diff > exp))
303300 then exp
304301 else fraction(liquidatedTokens, c2, a1)
305302 $Tuple7(c1, (c2 - liquidatedValue), a0, (a1 - liquidatedTokens), (c0 + liquidatedValue), pu, (pd - liquidatedTokens))
306303 }
307304
308305 func openDwn (c1,c2,a0,a1,c0,pu,pd) = {
309306 let diff = (c1 - c2)
310307 let spentPoolValue = if ((c0 > diff))
311308 then diff
312309 else c0
313310 let acquiredTokens = fraction(spentPoolValue, a1, c2)
314311 $Tuple7(c1, (c2 + spentPoolValue), a0, (a1 + acquiredTokens), (c0 - spentPoolValue), pu, (pd + acquiredTokens))
315312 }
316313
317314 func openUp (c1,c2,a0,a1,c0,pu,pd) = {
318315 let diff = (c2 - c1)
319316 let spentPoolValue = if ((c0 > diff))
320317 then diff
321318 else c0
322319 let acquiredTokens = fraction(spentPoolValue, a0, c1)
323320 $Tuple7((c1 + spentPoolValue), c2, (a0 + acquiredTokens), a1, (c0 - spentPoolValue), (pu + acquiredTokens), pd)
324321 }
325322
326- let $t0926910304 = if ((curBullCol0 > curBearCol0))
323+ let $t0913310168 = if ((curBullCol0 > curBearCol0))
327324 then {
328325 let afterCloseUp = closeUp(curBullCol0, curBearCol0, curBullCirc0, curBearCirc0, curPoolMain0, curPoolUp0, curPoolDwn0)
329- let $t094959632 = afterCloseUp
330- let a = $t094959632._1
331- let b = $t094959632._2
332- let c = $t094959632._3
333- let d = $t094959632._4
334- let e = $t094959632._5
335- let f = $t094959632._6
336- let g = $t094959632._7
326+ let $t093599496 = afterCloseUp
327+ let a = $t093599496._1
328+ let b = $t093599496._2
329+ let c = $t093599496._3
330+ let d = $t093599496._4
331+ let e = $t093599496._5
332+ let f = $t093599496._6
333+ let g = $t093599496._7
337334 if ((f > 0))
338335 then afterCloseUp
339336 else if ((f == 0))
340337 then openDwn(a, b, c, d, e, f, g)
341338 else throw("poolUp < 0")
342339 }
343340 else {
344341 let afterCloseDwn = closeDwn(curBullCol0, curBearCol0, curBullCirc0, curBearCirc0, curPoolMain0, curPoolUp0, curPoolDwn0)
345- let $t0998310123 = afterCloseDwn
346- let a = $t0998310123._1
347- let b = $t0998310123._2
348- let c = $t0998310123._3
349- let d = $t0998310123._4
350- let e = $t0998310123._5
351- let f = $t0998310123._6
352- let g = $t0998310123._7
342+ let $t098479987 = afterCloseDwn
343+ let a = $t098479987._1
344+ let b = $t098479987._2
345+ let c = $t098479987._3
346+ let d = $t098479987._4
347+ let e = $t098479987._5
348+ let f = $t098479987._6
349+ let g = $t098479987._7
353350 if ((g > 0))
354351 then afterCloseDwn
355352 else if ((g == 0))
356353 then openUp(a, b, c, d, e, f, g)
357354 else throw("poolDwn < 0")
358355 }
359- let c1 = $t0926910304._1
360- let c2 = $t0926910304._2
361- let a0 = $t0926910304._3
362- let a1 = $t0926910304._4
363- let c0 = $t0926910304._5
364- let pu = $t0926910304._6
365- let pd = $t0926910304._7
356+ let c1 = $t0913310168._1
357+ let c2 = $t0913310168._2
358+ let a0 = $t0913310168._3
359+ let a1 = $t0913310168._4
360+ let c0 = $t0913310168._5
361+ let pu = $t0913310168._6
362+ let pd = $t0913310168._7
366363 let charge = fraction(userDiffAbs(), (rebalancePercentile * steps), ((1440 * 100) * 100))
367364 let c1SplitP = if ((pd > 0))
368365 then charge
369366 else 0
370367 let c2SplitP = if ((pu > 0))
371368 then charge
372369 else 0
373370 $Tuple7((c1 - c1SplitP), (c2 - c2SplitP), a0, a1, ((c0 + c1SplitP) + c2SplitP), pu, pd)
374371 }
375372
376373
377374 func poolSup (curBullCol0,curBearCol0,curBullCirc0,curBearCirc0) = {
378- let $t01072910914 = poolSupport(curBullCol0, curBearCol0, curBullCirc0, curBearCirc0, poolMain, poolUp, poolDwn, 0)
379- let bullCol1 = $t01072910914._1
380- let bearCol1 = $t01072910914._2
381- let bullCic1 = $t01072910914._3
382- let bearCirc1 = $t01072910914._4
383- let poolMain1 = $t01072910914._5
384- let poolUp1 = $t01072910914._6
385- let poolDwn1 = $t01072910914._7
375+ let $t01059310778 = poolSupport(curBullCol0, curBearCol0, curBullCirc0, curBearCirc0, poolMain, poolUp, poolDwn, 0)
376+ let bullCol1 = $t01059310778._1
377+ let bearCol1 = $t01059310778._2
378+ let bullCic1 = $t01059310778._3
379+ let bearCirc1 = $t01059310778._4
380+ let poolMain1 = $t01059310778._5
381+ let poolUp1 = $t01059310778._6
382+ let poolDwn1 = $t01059310778._7
386383 [IE(BULLCOLK, bullCol1), IE(BULLCIRCK, bullCic1), IE(BEARCOLK, bearCol1), IE(BEARCIRCK, bearCirc1), IE(POOLUSDNK, poolMain1), IE(POOLUPK, poolUp1), IE(POOLDWNK, poolDwn1)]
387384 }
388385
389386
390387 func dequeue () = {
391388 func sp (a,mx) = if ((mx >= a))
392389 then $Tuple2(a, 0)
393390 else $Tuple2(mx, (a - mx))
394391
395392 if ((queueSize == 0))
396393 then throw("nothing to settle")
397394 else {
398395 func collectFee (fees) = IE(FEEACCK, (feesAccumulated + fees))
399396
400397 let decreaseQueueSize = IE(QSIZEK, (queueSize - 1))
401398 let isLastElement = (headPointer == tailPointer)
402399 let overwriteTail = SE(TAILK, "")
403400 let dataStr = localS(headPointer, "bad head pointer(dequeue)")
404401 let data = split(dataStr, "|")
405402 let action = data[0]
406403 let amt = parseIntValue(data[1])
407404 let token = data[2]
408405 let priceIndex = parseIntValue(data[3])
409406 let invoker = addressFromStringValue(data[4])
410407 let minPayout = if ((8 > size(data)))
411408 then 0
412409 else parseIntValue(data[5])
413410 let maxPayout = if ((8 > size(data)))
414411 then MAX
415412 else parseIntValue(data[6])
416413 let next = data[(size(data) - 1)]
417414 func payback (tkn) = [SE(HEADK, next), decreaseQueueSize, ST(invoker, amt, fromBase58String(tkn))]
418415
419416 let items = if ((settledPriceIndex != priceIndex))
420417 then throw(((("corrupt state, settledPriceIndex=" + toString(settledPriceIndex)) + ", request price id=") + toString(priceIndex)))
421418 else if ((action == ISSUE))
422419 then {
423420 let feeSize = fraction(amt, issuePercentile, 10000)
424421 let addedCollateral = (amt - feeSize)
425422 let defaultAddedTokens = if ((token == BULL))
426423 then fraction(bullCirc, addedCollateral, bullCol)
427424 else if ((token == BEAR))
428425 then fraction(bearCirc, addedCollateral, bearCol)
429426 else throw("bad token id")
430- let $t01292612999 = sp(defaultAddedTokens, maxPayout)
431- let addedToCirculation = $t01292612999._1
432- let extraTokens = $t01292612999._2
433- let $t01301613187 = if ((token == BULL))
427+ let $t01279012863 = sp(defaultAddedTokens, maxPayout)
428+ let addedToCirculation = $t01279012863._1
429+ let extraTokens = $t01279012863._2
430+ let $t01288013051 = if ((token == BULL))
434431 then $Tuple4(defaultAddedTokens, addedCollateral, 0, 0)
435432 else $Tuple4(0, 0, defaultAddedTokens, addedCollateral)
436- let plusBulls = $t01301613187._1
437- let plusBullCol = $t01301613187._2
438- let plusBears = $t01301613187._3
439- let plusBearCol = $t01301613187._4
433+ let plusBulls = $t01288013051._1
434+ let plusBullCol = $t01288013051._2
435+ let plusBears = $t01288013051._3
436+ let plusBearCol = $t01288013051._4
440437 if ((minPayout > addedToCirculation))
441438 then payback(mainToken)
442439 else (poolSup((bullCol + plusBullCol), (bearCol + plusBearCol), (bullCirc + plusBulls), (bearCirc + plusBears)) ++ [SE(HEADK, next), collectFee(feeSize), decreaseQueueSize, ST(invoker, addedToCirculation, fromBase58String(token)), ST(feeAddress, extraTokens, fromBase58String(token))])
443440 }
444441 else if ((action == REDEEM))
445442 then {
446443 let removedTokens = amt
447444 let estimatedPayout = if ((token == BULL))
448445 then fraction(bullCol, removedTokens, bullCirc)
449446 else if ((token == BEAR))
450447 then fraction(bearCol, removedTokens, bearCirc)
451448 else throw("bad token id")
452449 let feeSize = fraction(estimatedPayout, redeemPercentile, 10000)
453450 let defaultPayout = (estimatedPayout - feeSize)
454- let $t01425414308 = sp(defaultPayout, maxPayout)
455- let userPayout = $t01425414308._1
456- let extra = $t01425414308._2
457- let $t01432514490 = if ((token == BULL))
451+ let $t01411814172 = sp(defaultPayout, maxPayout)
452+ let userPayout = $t01411814172._1
453+ let extra = $t01411814172._2
454+ let $t01418914354 = if ((token == BULL))
458455 then $Tuple4(removedTokens, estimatedPayout, 0, 0)
459456 else $Tuple4(0, 0, removedTokens, estimatedPayout)
460- let minusBulls = $t01432514490._1
461- let minusBullCol = $t01432514490._2
462- let minusBears = $t01432514490._3
463- let minusBearCol = $t01432514490._4
457+ let minusBulls = $t01418914354._1
458+ let minusBullCol = $t01418914354._2
459+ let minusBears = $t01418914354._3
460+ let minusBearCol = $t01418914354._4
464461 if ((minPayout > userPayout))
465462 then payback(token)
466463 else (poolSup((bullCol - minusBullCol), (bearCol - minusBearCol), (bullCirc - minusBulls), (bearCirc - minusBears)) ++ [SE(HEADK, next), collectFee(feeSize), decreaseQueueSize, ST(invoker, userPayout, fromBase58String(mainToken)), ST(feeAddress, extra, fromBase58String(mainToken))])
467464 }
468465 else if ((action == POOL))
469466 then {
470467 let issueTokens = fraction(poolTokenCirculation, amt, poolValue)
471468 if ((minPayout > issueTokens))
472469 then payback(mainToken)
473470 else [IE(POOLUSDNK, (poolMain + amt)), IE(POOLCIRCK, (poolTokenCirculation + issueTokens)), SE(HEADK, next), decreaseQueueSize, ST(invoker, issueTokens, fromBase58String(poolToken))]
474471 }
475472 else if ((action == UNPOOL))
476473 then {
477474 func share (a) = fraction(a, amt, poolTokenCirculation)
478475
479476 let unpooledMain = share(poolMain)
480477 let unpooledUp = share(poolUp)
481478 let unpooledDwn = share(poolDwn)
482479 let unpooledUpValue = fraction(unpooledUp, bullCol, bullCirc)
483480 let unpooledDwnValue = fraction(unpooledDwn, bearCol, bearCirc)
484481 let totalUnpooledValue = ((unpooledMain + unpooledUpValue) + unpooledDwnValue)
485482 if ((minPayout > totalUnpooledValue))
486483 then payback(poolToken)
487484 else [IE(POOLUSDNK, (poolMain - unpooledMain)), IE(POOLCIRCK, (poolTokenCirculation - amt)), IE(POOLUPK, (poolUp - unpooledUp)), IE(POOLDWNK, (poolDwn - unpooledDwn)), IE(BULLCIRCK, (bullCirc - unpooledUp)), IE(BEARCIRCK, (bearCirc - unpooledDwn)), IE(BULLCOLK, (bullCol - unpooledUpValue)), IE(BEARCOLK, (bearCol - unpooledDwnValue)), SE(HEADK, next), decreaseQueueSize, ST(invoker, totalUnpooledValue, fromBase58String(mainToken))]
488485 }
489486 else throw(("bad action: " + action))
490487 if (isLastElement)
491488 then overwriteTail :: items
492489 else items
493490 }
494491 }
495492
496493
497494 func rebalance (offset) = if (!(valueOrElse(getBoolean(this, "enableRebalance"), true)))
498495 then throw("rebalance paused")
499496 else if ((offset == 0))
500497 then throw("[OK] offset=0")
501498 else {
502499 func LV (v,p0,p1,m) = {
503500 let denom = {
504501 let md = (((2 * (if ((p1 > p0))
505502 then p1
506503 else p0)) * m) / 3037000499)
507504 if ((10 > md))
508505 then 10
509506 else if ((100 > md))
510507 then 100
511508 else 1000
512509 }
513510 let pmax = ((if ((p1 > p0))
514511 then p1
515512 else p0) / denom)
516513 let pmin = ((if ((p0 > p1))
517514 then p1
518515 else p0) / denom)
519516 let a = (pmin * pmin)
520517 let b = ((((m * m) * pmax) * pmax) - (((((2 * m) * m) - m) * pmax) * pmin))
521518 let ma = ((m * m) - m)
522519 fraction(v, ((ma * a) + b), (((ma + 1) * a) + b))
523520 }
524521
525522 let unsettledPriceIndex = (settledPriceIndex + offset)
526523 if (!(opn))
527524 then [IE(REBIDXK, unsettledPriceIndex)]
528525 else {
529526 let settledPrice = priceByIndex(settledPriceIndex)
530527 let nextPrice = priceByIndex(unsettledPriceIndex)
531528 let minVol = if ((bearCol > bullCol))
532529 then bullCol
533530 else bearCol
534531 let redist = LV(minVol, settledPrice, nextPrice, leverage)
535532 let priceUpGoodForBulls = (assetName == "")
536533 let priceGoesUp = (nextPrice > settledPrice)
537534 let bullsEarn = (priceUpGoodForBulls == priceGoesUp)
538535 let newBullCol = if (bullsEarn)
539536 then (bullCol + redist)
540537 else (bullCol - redist)
541538 let newBearCol = if (bullsEarn)
542539 then (bearCol - redist)
543540 else (bearCol + redist)
544- let $t01851718715 = poolSupport(newBullCol, newBearCol, bullCirc, bearCirc, poolMain, poolUp, poolDwn, offset)
545- let updBullCol = $t01851718715._1
546- let updBearCol = $t01851718715._2
547- let updBullCirc = $t01851718715._3
548- let updBearCirc = $t01851718715._4
549- let updPoolMain = $t01851718715._5
550- let updPoolUp = $t01851718715._6
551- let updPoolDwn = $t01851718715._7
541+ let $t01838118579 = poolSupport(newBullCol, newBearCol, bullCirc, bearCirc, poolMain, poolUp, poolDwn, offset)
542+ let updBullCol = $t01838118579._1
543+ let updBearCol = $t01838118579._2
544+ let updBullCirc = $t01838118579._3
545+ let updBearCirc = $t01838118579._4
546+ let updPoolMain = $t01838118579._5
547+ let updPoolUp = $t01838118579._6
548+ let updPoolDwn = $t01838118579._7
552549 [IE(BULLCOLK, updBullCol), IE(BEARCOLK, updBearCol), IE(BULLCIRCK, updBullCirc), IE(BEARCIRCK, updBearCirc), IE(POOLUSDNK, updPoolMain), IE(POOLUPK, updPoolUp), IE(POOLDWNK, updPoolDwn), IE(REBIDXK, unsettledPriceIndex)]
553550 }
554551 }
555552
556553
557554 func calcMax (min,avg) = if ((min > avg))
558555 then throw(((("price too old: minPayout " + toString(min)) + " > avg = ") + toString(avg)))
559556 else ((avg + avg) - min)
560557
561558
562559 @Callable(i)
563560 func enableEnqueue (arg) = if ((i.caller != feeAddress))
564561 then throw("only admin can")
565562 else [BooleanEntry("enableEnqueue", arg)]
566563
567564
568565
569566 @Callable(i)
570567 func enableRebalance (arg) = if ((i.caller != feeAddress))
571568 then throw("only admin can")
572569 else [BooleanEntry("enableRebalance", arg)]
573570
574571
575572
576573 @Callable(i)
577574 func withdrawFee (amount) = if ((amount > feesAccumulated))
578575 then throw(("too much. available: " + toString(feesAccumulated)))
579576 else [IE(FEEACCK, (feesAccumulated - amount)), ST(feeAddress, amount, fromBase58String(mainToken))]
580577
581578
582579
583580 @Callable(inv)
584581 func requestRedeemSl (minPayout) = if (validatePMFee(inv, minPayout))
585582 then {
586583 let amt = inv.payments[0].amount
587584 let tokenId = toBase58String(valueOrErrorMessage(inv.payments[0].assetId, "bad token att"))
588585 if (if ((tokenId != BULL))
589586 then (tokenId != BEAR)
590587 else false)
591588 then throw("bad token req")
592589 else {
593- let $t02019020329 = if ((tokenId == BULL))
590+ let $t02005420193 = if ((tokenId == BULL))
594591 then $Tuple2(bullCol, bullCirc)
595592 else if ((tokenId == BEAR))
596593 then $Tuple2(bearCol, bearCirc)
597594 else throw("bad token req")
598- let col = $t02019020329._1
599- let circ = $t02019020329._2
595+ let col = $t02005420193._1
596+ let circ = $t02005420193._2
600597 let est = fraction(amt, col, circ)
601- let $t02037720471 = if ((minPayout == 0))
598+ let $t02024120335 = if ((minPayout == 0))
602599 then $Tuple2(0, MAX)
603600 else $Tuple2(minPayout, calcMax(minPayout, est))
604- let minP = $t02037720471._1
605- let maxP = $t02037720471._2
601+ let minP = $t02024120335._1
602+ let maxP = $t02024120335._2
606603 if ((inv.caller == this))
607604 then throw("can't do")
608605 else {
609606 let estimated = fraction(col, amt, circ)
610607 if ((minRedeem > estimated))
611608 then throw((("Attached payment too small. Min redeem amount is " + toString((minRedeem / 1000000))) + " USDN"))
612609 else enqueue(toBase58String(inv.transactionId), REDEEM, amt, tokenId, (oraclePriceIndex + 1), toString(inv.caller), minP, maxP)
613610 }
614611 }
615612 }
616613 else throw()
617614
618615
619616
620617 @Callable(inv)
621618 func requestIssueSl (tokenId,minPayout) = if (validatePMFee(inv, minPayout))
622619 then if (!(opn))
623620 then throw("markets closed")
624621 else if (if ((tokenId != BULL))
625622 then (tokenId != BEAR)
626623 else false)
627624 then throw("bad token req")
628625 else if (!(allowed(inv.caller)))
629626 then throw("only whitelisted can do")
630627 else if ((inv.payments[0].assetId != fromBase58String(mainToken)))
631628 then throw("bad token att")
632629 else {
633630 let amt = inv.payments[0].amount
634- let $t02144021621 = if ((tokenId == BULL))
631+ let $t02130421485 = if ((tokenId == BULL))
635632 then $Tuple2(bullCol, bullCirc)
636633 else if ((tokenId == BEAR))
637634 then $Tuple2(bearCol, bearCirc)
638635 else throw("bad token req")
639- let col = $t02144021621._1
640- let circ = $t02144021621._2
636+ let col = $t02130421485._1
637+ let circ = $t02130421485._2
641638 let est = fraction(amt, circ, col)
642- let $t02166321757 = if ((minPayout == 0))
639+ let $t02152721621 = if ((minPayout == 0))
643640 then $Tuple2(0, MAX)
644641 else $Tuple2(minPayout, calcMax(minPayout, est))
645- let minP = $t02166321757._1
646- let maxP = $t02166321757._2
642+ let minP = $t02152721621._1
643+ let maxP = $t02152721621._2
647644 if ((minIssue > amt))
648645 then throw((("Attached payment too small. Min required: " + toString((minIssue / 1000000))) + " USDN"))
649646 else {
650647 let maxAllowed = maxIssue(tokenId)
651648 if (if ((whitelist == ""))
652649 then (inv.payments[0].amount > maxAllowed)
653650 else false)
654651 then throw((("trying to issue more than pool can handle. Max attachment allowed = " + toString((maxAllowed / 1000000))) + " USDN"))
655652 else enqueue(toBase58String(inv.transactionId), ISSUE, amt, tokenId, (oraclePriceIndex + 1), toString(inv.caller), minP, maxP)
656653 }
657654 }
658655 else throw()
659656
660657
661658
662659 @Callable(inv)
663660 func requestPool () = if (!(allowed(inv.caller)))
664661 then throw("only whitelisted can do")
665662 else {
666663 let pmt = inv.payments[0]
667664 if ((pmt.assetId != fromBase58String(mainToken)))
668665 then throw("USDN required")
669666 else if ((minPool > pmt.amount))
670667 then throw(("pool min: " + toString(minPool)))
671668 else {
672669 let estimate = fraction(poolTokenCirculation, pmt.amount, poolValue)
673670 enqueue(toBase58String(inv.transactionId), POOL, inv.payments[0].amount, "", (oraclePriceIndex + 1), toString(inv.caller), 0, MAX)
674671 }
675672 }
676673
677674
678675
679676 @Callable(inv)
680677 func requestUnpool () = {
681678 let pmt = inv.payments[0]
682679 if ((pmt.assetId != fromBase58String(poolToken)))
683680 then throw("bad token att")
684681 else {
685682 let estimate = fraction(poolValue, pmt.amount, poolTokenCirculation)
686683 if ((minPool > estimate))
687684 then throw(((("unpool at least for" + toString(minPool)) + " ") + mainToken))
688685 else enqueue(toBase58String(inv.transactionId), UNPOOL, inv.payments[0].amount, "", (oraclePriceIndex + 1), toString(inv.caller), 0, MAX)
689686 }
690687 }
691688
692689
693690
694691 @Callable(inv)
695692 func settle () = {
696693 let queueEmpty = (headPointer == "")
697694 let canRebalance = (oraclePriceIndex > settledPriceIndex)
698695 if (queueEmpty)
699696 then if (canRebalance)
700697 then rebalance(1)
701698 else throw("[OK] all done, carry on")
702699 else {
703700 let data = split(valueOrErrorMessage(getString(this, headPointer), ("bad head pointer(settle): " + headPointer)), "|")
704701 let queuePriceIndex = parseIntValue(data[3])
705702 if ((queuePriceIndex > settledPriceIndex))
706703 then if (canRebalance)
707704 then rebalance(1)
708705 else throw("[OK] need to wait")
709706 else if ((queuePriceIndex == settledPriceIndex))
710707 then dequeue()
711708 else throw("future price already rebalanced")
712709 }
713710 }
714711
715712
716713
717714 @Callable(inv)
718715 func settle2 () = {
719716 let queueEmpty = (headPointer == "")
720717 let queuePriceIndex = if (queueEmpty)
721718 then MAX
722719 else {
723720 let data = split(localS(headPointer, "settle2: bad head pointer"), "|")
724721 parseIntValue(data[3])
725722 }
726723 let settledPrice = priceByIndex(settledPriceIndex)
727724 func hasDeviation (priceIndex) = {
728725 let p = priceByIndex(priceIndex)
729726 (fraction(diffAbs(settledPrice, p), 1000000, settledPrice) >= maxDeviation)
730727 }
731728
732729 let maxPossibleShift = (min([queuePriceIndex, oraclePriceIndex]) - settledPriceIndex)
733730 func f (acc,shift) = if (if (acc._2)
734731 then true
735732 else (shift > maxPossibleShift))
736733 then acc
737734 else $Tuple2(shift, if ((shift == 7))
738735 then true
739736 else hasDeviation((settledPriceIndex + shift)))
740737
741- let $t02515425253 = {
742- let $list2519825253 = [1, 2, 3, 4, 5, 6, 7]
743- let $size2519825253 = size($list2519825253)
744- let $acc02519825253 = $Tuple2(settledPriceIndex, false)
745- if (($size2519825253 == 0))
746- then $acc02519825253
738+ let $t02501825117 = {
739+ let $list2506225117 = [1, 2, 3, 4, 5, 6, 7]
740+ let $size2506225117 = size($list2506225117)
741+ let $acc02506225117 = $Tuple2(settledPriceIndex, false)
742+ if (($size2506225117 == 0))
743+ then $acc02506225117
747744 else {
748- let $acc12519825253 = f($acc02519825253, $list2519825253[0])
749- if (($size2519825253 == 1))
750- then $acc12519825253
745+ let $acc12506225117 = f($acc02506225117, $list2506225117[0])
746+ if (($size2506225117 == 1))
747+ then $acc12506225117
751748 else {
752- let $acc22519825253 = f($acc12519825253, $list2519825253[1])
753- if (($size2519825253 == 2))
754- then $acc22519825253
749+ let $acc22506225117 = f($acc12506225117, $list2506225117[1])
750+ if (($size2506225117 == 2))
751+ then $acc22506225117
755752 else {
756- let $acc32519825253 = f($acc22519825253, $list2519825253[2])
757- if (($size2519825253 == 3))
758- then $acc32519825253
753+ let $acc32506225117 = f($acc22506225117, $list2506225117[2])
754+ if (($size2506225117 == 3))
755+ then $acc32506225117
759756 else {
760- let $acc42519825253 = f($acc32519825253, $list2519825253[3])
761- if (($size2519825253 == 4))
762- then $acc42519825253
757+ let $acc42506225117 = f($acc32506225117, $list2506225117[3])
758+ if (($size2506225117 == 4))
759+ then $acc42506225117
763760 else {
764- let $acc52519825253 = f($acc42519825253, $list2519825253[4])
765- if (($size2519825253 == 5))
766- then $acc52519825253
761+ let $acc52506225117 = f($acc42506225117, $list2506225117[4])
762+ if (($size2506225117 == 5))
763+ then $acc52506225117
767764 else {
768- let $acc62519825253 = f($acc52519825253, $list2519825253[5])
769- if (($size2519825253 == 6))
770- then $acc62519825253
765+ let $acc62506225117 = f($acc52506225117, $list2506225117[5])
766+ if (($size2506225117 == 6))
767+ then $acc62506225117
771768 else {
772- let $acc72519825253 = f($acc62519825253, $list2519825253[6])
773- if (($size2519825253 == 7))
774- then $acc72519825253
769+ let $acc72506225117 = f($acc62506225117, $list2506225117[6])
770+ if (($size2506225117 == 7))
771+ then $acc72506225117
775772 else {
776- let $acc82519825253 = f($acc72519825253, $list2519825253[7])
773+ let $acc82506225117 = f($acc72506225117, $list2506225117[7])
777774 throw("List size exceed 7")
778775 }
779776 }
780777 }
781778 }
782779 }
783780 }
784781 }
785782 }
786783 }
787- let okShift = $t02515425253._1
788- let forcedByDeviationOrTimeout = $t02515425253._2
784+ let okShift = $t02501825117._1
785+ let forcedByDeviationOrTimeout = $t02501825117._2
789786 let queueWaits = (oraclePriceIndex >= queuePriceIndex)
790787 if ((settledPriceIndex > queuePriceIndex))
791788 then throw("settle2: future price already settled/rebalanced")
792789 else if ((settledPriceIndex == queuePriceIndex))
793790 then dequeue()
794791 else if (if ((okShift > 0))
795792 then if (forcedByDeviationOrTimeout)
796793 then true
797794 else queueWaits
798795 else false)
799796 then rebalance(okShift)
800797 else throw(("settle2: [OK] all done, carry on. available shift: " + toString(okShift)))
801798 }
802799
803800
804801 @Verifier(tx)
805802 func verify () = {
806803 let adminAction = ((((if (sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(admins[0])))
807804 then 1
808805 else 0) + (if (sigVerify(tx.bodyBytes, tx.proofs[1], fromBase58String(admins[1])))
809806 then 1
810807 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[2], fromBase58String(admins[2])))
811808 then 1
812809 else 0)) > 1)
813810 let stakingAction = match tx {
814811 case tx: InvokeScriptTransaction =>
815812 let signedCorrectly = sigVerify(tx.bodyBytes, tx.proofs[0], daemonPublicKey)
816813 let feesCorrect = if ((tx.feeAssetId == unit))
817814 then ((1000 * 1000) >= tx.fee)
818815 else false
819816 let dappCorrect = (tx.dApp == rpdAddress)
820817 let unlock = (tx.function == "unlockNeutrino")
821818 let lock = if (if ((tx.function == "lockNeutrinoSP"))
822819 then (tx.args[0] == stakingAddress)
823820 else false)
824821 then (wavesBalance(this).available >= ten8)
825822 else false
826823 let funcCorrect = if (lock)
827824 then true
828825 else unlock
829826 if (if (if (signedCorrectly)
830827 then feesCorrect
831828 else false)
832829 then dappCorrect
833830 else false)
834831 then funcCorrect
835832 else false
836833 case _ =>
837834 false
838835 }
839836 if (adminAction)
840837 then true
841838 else stakingAction
842839 }
843840

github/deemru/w8io/786bc32 
171.80 ms