2021.07.02 14:08 [2660660] smart account 3P9ZegsKUtsEpdRPNVrMH7nHEEqY5MrmjDp > SELF 0.00000000 Waves

{ "type": 13, "id": "AGAB6Z113NVtBHZhBYoTkWdHXp8uWTmdW2TmVykmUYT7", "fee": 1400000, "feeAssetId": null, "timestamp": 1625224107975, "version": 1, "sender": "3P9ZegsKUtsEpdRPNVrMH7nHEEqY5MrmjDp", "senderPublicKey": "7ziFsWp9eo6kUB6ovqQzJfjgQarifNfpCGNW9DZi8YhN", "proofs": [ "JPWYdGVR5kmZ8imKBPSkwEGFZk3XDFE4KWmheLUo3RhCLtnCc9b2AS3okH9tXc4Q2sv9gPnws1tH9VVNrTooWpw", "5UM9cwhtYi6f2co5YqpLuf1taP9iZwhxGQqyUwaAu9RJFQigeXqA3AcSM2qLfrYRopVLsaMMpyh2fJjr8apHMpaq" ], "script": "base64:AAIEAAAAAAAAACQIAhIDCgEEEgMKAQQSAwoBARIDCgEBEgQKAggBEgASABIAEgAAAABrAQAAAAJTRQAAAAIAAAABawAAAAF2CQEAAAALU3RyaW5nRW50cnkAAAACBQAAAAFrBQAAAAF2AQAAAAJJRQAAAAIAAAABawAAAAF2CQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAABawUAAAABdgEAAAACU1QAAAADAAAAAWEAAAADYW10AAAAAXQJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAAWEFAAAAA2FtdAUAAAABdAAAAAAEdGVuNgAAAAAAAA9CQAAAAAAEdGVuOAAAAAAABfXhAAAAAAADTUFYAH//////////AAAAABFjb25maWdQcm92aWRlcktleQIAAAAOY29uZmlnUHJvdmlkZXIAAAAADmNvbmZpZ1Byb3ZpZGVyBAAAAAckbWF0Y2gwCQAEHQAAAAIFAAAABHRoaXMFAAAAEWNvbmZpZ1Byb3ZpZGVyS2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAXMFAAAAByRtYXRjaDAJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAAAXMFAAAABHRoaXMBAAAABmxvY2FsSQAAAAIAAAABawAAAAFlCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAABawUAAAABZQEAAAAGbG9jYWxTAAAAAgAAAAFrAAAAAWUJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAAAFrBQAAAAFlAQAAAAVjb25mSQAAAAIAAAABawAAAAFlCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAOY29uZmlnUHJvdmlkZXIFAAAAAWsFAAAAAWUBAAAABWNvbmZTAAAAAgAAAAFrAAAAAWUJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAA5jb25maWdQcm92aWRlcgUAAAABawUAAAABZQAAAAAFQlVMTEsCAAAABkJVTExJZAAAAAAFQkVBUksCAAAABkJFQVJJZAAAAAAFVVNETksCAAAAC21haW5Ub2tlbklkAAAAAAhCVUxMQ09MSwIAAAAOYnVsbENvbGxhdGVyYWwAAAAACEJFQVJDT0xLAgAAAA5iZWFyQ29sbGF0ZXJhbAAAAAAJQlVMTENJUkNLAgAAAA9idWxsQ2lyY3VsYXRpb24AAAAACUJFQVJDSVJDSwIAAAAPYmVhckNpcmN1bGF0aW9uAAAAAAhJU1NQRVJDSwIAAAAPaXNzdWVQZXJjZW50aWxlAAAAAAhSRURQRVJDSwIAAAAQcmVkZWVtUGVyY2VudGlsZQAAAAAHTUlOSVNTSwIAAAAIbWluSXNzdWUAAAAAB01JTlJFREsCAAAACW1pblJlZGVlbQAAAAAITUlOUE9PTEsCAAAAB21pblBvb2wAAAAAB0ZFRUFDQ0sCAAAAD2ZlZXNBY2N1bXVsYXRlZAAAAAAGV0xJU1RLAgAAAA5pc3N1ZVdoaXRlTGlzdAAAAAAIUkVCUEVSQ0sCAAAAE3JlYmFsYW5jZVBlcmNlbnRpbGUAAAAAB1JFQklEWEsCAAAAFWxhc3RTZXR0bGVtZW50UHJpY2VJZAAAAAAFSEVBREsCAAAAC2hlYWRQb2ludGVyAAAAAAVUQUlMSwIAAAALdGFpbFBvaW50ZXIAAAAABlFTSVpFSwIAAAAJcXVldWVTaXplAAAAAAlQT09MVVNETksCAAAAEnBvb2xNYWluVG9rZW5WYWx1ZQAAAAAHUE9PTFVQSwIAAAAGcG9vbFVwAAAAAAhQT09MRFdOSwIAAAAHcG9vbER3bgAAAAAJUE9PTENJUkNLAgAAABRwb29sVG9rZW5DaXJjdWxhdGlvbgAAAAAFUE9PTEsCAAAACXBvb2xUb2tlbgAAAAAIQVNTTkFNRUsCAAAADWRlZm9Bc3NldE5hbWUAAAAABExFVksCAAAACGxldmVyYWdlAAAAAAlXQVZFU0ZFRUsCAAAAEXdhdmVzUGFjZW1ha2VyRmVlAAAAAAhVU0RORkVFSwIAAAAQdXNkblBhY2VtYWtlckZlZQAAAAALb3JhY2xlUEtLZXkCAAAABm9yYWNsZQAAAAAMbWF4RGV2aWF0aW9uCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAADmNvbmZpZ1Byb3ZpZGVyCQABLAAAAAIJAAQlAAAAAQUAAAAEdGhpcwIAAAAUX2RldmlhdGlvblBl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TENJUkNLAgAAAAVubyAxMwAAAAAQcG9vbEJ1bGxFeHBvc3VyZQkAAGsAAAADBQAAAAdidWxsQ29sBQAAAAZwb29sVXAFAAAACGJ1bGxDaXJjAAAAABBwb29sQmVhckV4cG9zdXJlCQAAawAAAAMFAAAAB2JlYXJDb2wFAAAAB3Bvb2xEd24FAAAACGJlYXJDaXJjAAAAAAlwb29sVmFsdWUJAABkAAAAAgkAAGQAAAACBQAAAAhwb29sTWFpbgUAAAAQcG9vbEJ1bGxFeHBvc3VyZQUAAAAQcG9vbEJlYXJFeHBvc3VyZQAAAAAGb3JhY2xlCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAQAAABRhZGRyZXNzRnJvbVB1YmxpY0tleQAAAAEJAAJZAAAAAQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAAC29yYWNsZVBLS2V5AgAAAA5ubyBvcmFjbGVQS0tleQIAAAASYmFkIG9yYWNsZSBhZGRyZXNzAAAAAA1jbG9zZUludGVydmFsCQEAAAAFY29uZkkAAAACAgAAAA1jbG9zZUludGVydmFsAgAAAAVubyBDSQAAAAARc2V0dGxlZFByaWNlSW5kZXgJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAAAdSRUJJRFhLAgAAABdubyBsYXN0IHJlYmFsYW5jZSBwcmljZQAAAAAQb3JhY2xlUHJpY2VJbmRleAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABm9yYWNsZQkBAAAAEWxhc3RQcmljZUluZGV4S2V5AAAAAQUAAAAJYXNzZXROYW1lCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAABNiYWQgb3JhY2xlIGRhdGEgYXQgCQAEJQAAAAEFAAAABm9yYWNsZQIAAAAQOiBubyBpbnRlZ2VyIGF0IAkBAAAAEWxhc3RQcmljZUluZGV4S2V5AAAAAQUAAAAJYXNzZXROYW1lAAAAAAhsZXZlcmFnZQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAAARMRVZLAAAAAAAAAAADAQAAAA1oZWlnaHRCeUluZGV4AAAAAQAAAApwcmljZUluZGV4CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAGb3JhY2xlCQABLAAAAAIJAQAAABBwcmljZUluZGV4UHJlZml4AAAAAQUAAAAJYXNzZXROYW1lCQABpAAAAAEFAAAACnByaWNlSW5kZXgJAAEsAAAAAgIAAAARbm8gZGF0YSBhdCBpbmRleCAJAAGkAAAAAQUAAAAKcHJpY2VJbmRleAEAAAANcHJpY2VCeUhlaWdodAAAAAEAAAALcHJpY2VIZWlnaHQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAZvcmFjbGUJAAEsAAAAAgkBAAAAEXByaWNlSGVpZ2h0UHJlZml4AAAAAQUAAAAJYXNzZXROYW1lCQABpAAAAAEFAAAAC3ByaWNlSGVpZ2h0CQABLAAAAAICAAAAE25vIGRhdGEgZm9yIGhlaWdodCAJAAGkAAAAAQUAAAALcHJpY2VIZWlnaHQBAAAADHByaWNlQnlJbmRleAAAAAEAAAAKcHJpY2VJbmRleAkBAAAADXByaWNlQnlIZWlnaHQAAAABCQEAAAANaGVpZ2h0QnlJbmRleAAAAAEFAAAACnByaWNlSW5kZXgAAAAACXF1ZXVlU2l6ZQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAAAZRU0laRUsAAAAAAAAAAAAAAAAAC2hlYWRQb2ludGVyCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAABUhFQURLAgAAAAAAAAAAC3RhaWxQb2ludGVyCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAABVRBSUxLAgAAAAAAAAAAD2ZlZXNBY2N1bXVsYXRlZAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAAAdGRUVBQ0NLAAAAAAAAAAAAAAAAAAVJU1NVRQIAAAAFSVNTVUUAAAAABlJFREVFTQIAAAAGUkVERUVNAAAAAARQT09MAgAAAARQT09MAAAAAAZVTlBPT0wCAAAABlVOUE9PTAAAAAAKZmVlQWRkcktleQIAAAAKZmVlQWRkcmVzcwAAAAAOc3Rha2luZ0FkZHJLZXkCAAAADnN0YWtpbmdBZGRyZXNzAAAAAA9kYWVtb25QdWJLZXlLZXkCAAAAD2RhZW1vblB1YmxpY0tleQAAAAAKZmVlQWRkcmVzcwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEJgAAAAEJAQAAAAVjb25mUwAAAAIFAAAACmZlZUFkZHJLZXkCAAAADW5vIGZlZUFkZHJlc3MCAAAADmJhZCBmZWVBZGRyZXNzAAAAAA5zdGFraW5nQWRkcmVzcwkBAAAABWNvbmZTAAAAAgUAAAAOc3Rha2luZ0FkZHJLZXkCAAAAEW5vIHN0YWtpbmdBZGRyZXNzAAAAAA9kYWVtb25QdWJsaWNLZXkJAAJZAAAAAQkBAAAABWNvbmZTAAAAAgUAAAAPZGFlbW9uUHViS2V5S2V5AgAAABJubyBkYWVtb25QdWJsaWNLZXkAAAAACnJwZEFkZHJlc3MJAAQmAAAAAQIAAAAjM1BOaWtNNnlwNE5xY1NVOGd1eFF0bVI1b25yMkQ0ZTh5VEoAAAAABmFkbWlucwkABEwAAAACAgAAACwySEhxVjhXOURKYXlWNVI2dEJEMlNiOHNycGhwb2JvRGk3cjF0MWFQaXVtQwkABEwAAAACAgAAACw1WlhlODJSUkFTVTdxc2hYTTJKOUpOWWhxSjlHV1lqalZxMmd3VVY1TmF6OQkABEwAAAACAgAAACw1V1JYRlNqd2NUYk5mS2NKczhacVhtU1NXWXNTVkpVdE12TXFaajVoSDROYwUAAAADbmlsAAAAAANvcG4JAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQbAAAAAgUAAAAGb3JhY2xlCQABLAAAAAICAAAAFiVzJXNfX2lzTWFya2V0T3BlbmVkX18FAAAACWFzc2V0TmFtZQYBAAAADGJ1aWxkTmV3SXRlbQAAAAcAAAAGYWN0aW9uAAAAA2FtdAAAAAV0b2tlbgAAAApwcmljZUluZGV4AAAAB2ludm9rZXIAAAAJbWluUGF5b3V0AAAACW1heFBheW91dAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQAB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bnNldHRsZWRQcmljZUluZGV4BAAAAAZtaW5Wb2wDCQAAZgAAAAIFAAAAB2JlYXJDb2wFAAAAB2J1bGxDb2wFAAAAB2J1bGxDb2wFAAAAB2JlYXJDb2wEAAAABnJlZGlzdAkBAAAAAkxWAAAABAUAAAAGbWluVm9sBQAAAAxzZXR0bGVkUHJpY2UFAAAACW5leHRQcmljZQUAAAAIbGV2ZXJhZ2UEAAAAE3ByaWNlVXBHb29kRm9yQnVsbHMJAAAAAAAAAgUAAAAJYXNzZXROYW1lAgAAAAAEAAAAC3ByaWNlR29lc1VwCQAAZgAAAAIFAAAACW5leHRQcmljZQUAAAAMc2V0dGxlZFByaWNlBAAAAAlidWxsc0Vhcm4JAAAAAAAAAgUAAAATcHJpY2VVcEdvb2RGb3JCdWxscwUAAAALcHJpY2VHb2VzVXAEAAAACm5ld0J1bGxDb2wDBQAAAAlidWxsc0Vhcm4JAABkAAAAAgUAAAAHYnVsbENvbAUAAAAGcmVkaXN0CQAAZQAAAAIFAAAAB2J1bGxDb2wFAAAABnJlZGlzdAQAAAAKbmV3QmVhckNvbAMFAAAACWJ1bGxzRWFybgkAAGUAAAACBQAAAAdiZWFyQ29sBQAAAAZyZWRpc3QJAABkAAAAAgUAAAAHYmVhckNvbAUAAAAGcmVkaXN0BAAAAA0kdDAxODUxNzE4NzE1CQEAAAALcG9vbFN1cHBvcnQAAAAIBQAAAApuZXdCdWxsQ29sBQAAAApuZXdCZWFyQ29sBQAAAAhidWxsQ2lyYwUAAAAIYmVhckNpcmMFAAAACHBvb2xNYWluBQAAAAZwb29sVXAFAAAAB3Bvb2xEd24FAAAABm9mZnNldAQAAAAKdXBkQnVsbENvbAgFAAAADSR0MDE4NTE3MTg3MTUAAAACXzEEAAAACnVwZEJlYXJDb2wIBQAAAA0kdDAxODUxNzE4NzE1AAAAAl8yBAAAAAt1cGRCdWxsQ2lyYwgFAAAADSR0MDE4NTE3MTg3MTUAAAACXzMEAAAAC3VwZEJlYXJDaXJjCAUAAAANJHQwMTg1MTcxODcxNQAAAAJfNAQAAAALdXBkUG9vbE1haW4IBQAAAA0kdDAxODUxNzE4NzE1AAAAAl81BAAAAAl1cGRQb29sVXAIBQAAAA0kdDAxODUxNzE4NzE1AAAAAl82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", "chainId": 87, "height": 2660660, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 78rdPnjXLm4fYKaXMQYyoQYZPnbQ56XtR1Svvg9BCZQP Next: CQ8sYWsj6AaUnRHTup5g5hR55dU59zbvF7EHsSPpRxm8 Diff:
OldNewDifferences
169169
170170 let oracle = valueOrErrorMessage(addressFromPublicKey(fromBase58String(valueOrErrorMessage(getString(this, oraclePKKey), "no oraclePKKey"))), "bad oracle address")
171171
172+let closeInterval = confI("closeInterval", "no CI")
173+
172174 let settledPriceIndex = valueOrErrorMessage(getInteger(this, REBIDXK), "no last rebalance price")
173175
174176 let oraclePriceIndex = valueOrErrorMessage(getInteger(oracle, lastPriceIndexKey(assetName)), ((("bad oracle data at " + toString(oracle)) + ": no integer at ") + lastPriceIndexKey(assetName)))
262264 }
263265
264266
265-func validateRequestRedeem (inv) = if ((inv.caller == this))
266- then throw("can't do")
267+func enqueue (id,action,amt,token,priceIndex,invoker,minPayout,maxPayout) = if (!(valueOrElse(getBoolean(this, "enableEnqueue"), true)))
268+ then throw("enqueue paused")
267269 else {
268- func errorMessage (got) = throw(((((("bad token att: only BULL(" + BULL) + ") or BEAR(") + BEAR) + ") tokens are accepted, received: ") + got))
269-
270- let assetId = toBase58String(valueOrErrorMessage(value(inv.payments[0]).assetId, "bad token att"))
271- if (if ((assetId != BEAR))
272- then (assetId != BULL)
273- else false)
274- then errorMessage(assetId)
270+ let increaseQueueSize = IE(QSIZEK, (queueSize + 1))
271+ let itm = buildNewItem(action, amt, token, priceIndex, invoker, minPayout, maxPayout)
272+ if ((queueSize == 0))
273+ then [SE(HEADK, id), SE(TAILK, id), SE(id, itm), increaseQueueSize]
275274 else {
276- let attachedAmount = inv.payments[0].amount
277- let col = if ((assetId == BEAR))
278- then bearCol
279- else bullCol
280- let circ = if ((assetId == BEAR))
281- then bearCirc
282- else bullCirc
283- let estimated = fraction(col, attachedAmount, circ)
284- if ((minRedeem > estimated))
285- then throw((((((((((("Attached payment too small. Min redeem amount is " + toString((minRedeem / 1000000))) + " USDN, ") + "attached amount: ") + toString(attachedAmount)) + ", col: ") + toString(col)) + ", circ: ") + toString(circ)) + ", estimated: ") + toString(estimated)))
286- else unit
275+ let prevId = localS(TAILK, "can't get tail pointer")
276+ let prevItm = localS(prevId, "can't resolve pointer")
277+ let updatedPrevItm = (prevItm + id)
278+[SE(prevId, updatedPrevItm), SE(id, itm), SE(TAILK, id), increaseQueueSize]
287279 }
288280 }
289-
290-
291-func enqueue (id,action,amt,token,priceIndex,invoker,minPayout,maxPayout) = {
292- let increaseQueueSize = IE(QSIZEK, (queueSize + 1))
293- let itm = buildNewItem(action, amt, token, priceIndex, invoker, minPayout, maxPayout)
294- if ((queueSize == 0))
295- then [SE(HEADK, id), SE(TAILK, id), SE(id, itm), increaseQueueSize]
296- else {
297- let prevId = localS(TAILK, "can't get tail pointer")
298- let prevItm = localS(prevId, "can't resolve pointer")
299- let updatedPrevItm = (prevItm + id)
300-[SE(prevId, updatedPrevItm), SE(id, itm), SE(TAILK, id), increaseQueueSize]
301- }
302- }
303281
304282
305283 func poolSupport (curBullCol0,curBearCol0,curBullCirc0,curBearCirc0,curPoolMain0,curPoolUp0,curPoolDwn0,steps) = {
345323 $Tuple7((c1 + spentPoolValue), c2, (a0 + acquiredTokens), a1, (c0 - spentPoolValue), (pu + acquiredTokens), pd)
346324 }
347325
348- let $t01030211337 = if ((curBullCol0 > curBearCol0))
326+ let $t0926910304 = if ((curBullCol0 > curBearCol0))
349327 then {
350328 let afterCloseUp = closeUp(curBullCol0, curBearCol0, curBullCirc0, curBearCirc0, curPoolMain0, curPoolUp0, curPoolDwn0)
351- let $t01052810665 = afterCloseUp
352- let a = $t01052810665._1
353- let b = $t01052810665._2
354- let c = $t01052810665._3
355- let d = $t01052810665._4
356- let e = $t01052810665._5
357- let f = $t01052810665._6
358- let g = $t01052810665._7
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
359337 if ((f > 0))
360338 then afterCloseUp
361339 else if ((f == 0))
364342 }
365343 else {
366344 let afterCloseDwn = closeDwn(curBullCol0, curBearCol0, curBullCirc0, curBearCirc0, curPoolMain0, curPoolUp0, curPoolDwn0)
367- let $t01101611156 = afterCloseDwn
368- let a = $t01101611156._1
369- let b = $t01101611156._2
370- let c = $t01101611156._3
371- let d = $t01101611156._4
372- let e = $t01101611156._5
373- let f = $t01101611156._6
374- let g = $t01101611156._7
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
375353 if ((g > 0))
376354 then afterCloseDwn
377355 else if ((g == 0))
378356 then openUp(a, b, c, d, e, f, g)
379357 else throw("poolDwn < 0")
380358 }
381- let c1 = $t01030211337._1
382- let c2 = $t01030211337._2
383- let a0 = $t01030211337._3
384- let a1 = $t01030211337._4
385- let c0 = $t01030211337._5
386- let pu = $t01030211337._6
387- let pd = $t01030211337._7
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
388366 let charge = fraction(userDiffAbs(), (rebalancePercentile * steps), ((1440 * 100) * 100))
389367 let c1SplitP = if ((pd > 0))
390368 then charge
397375
398376
399377 func poolSup (curBullCol0,curBearCol0,curBullCirc0,curBearCirc0) = {
400- let $t01176211947 = poolSupport(curBullCol0, curBearCol0, curBullCirc0, curBearCirc0, poolMain, poolUp, poolDwn, 0)
401- let bullCol1 = $t01176211947._1
402- let bearCol1 = $t01176211947._2
403- let bullCic1 = $t01176211947._3
404- let bearCirc1 = $t01176211947._4
405- let poolMain1 = $t01176211947._5
406- let poolUp1 = $t01176211947._6
407- let poolDwn1 = $t01176211947._7
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
408386 [IE(BULLCOLK, bullCol1), IE(BULLCIRCK, bullCic1), IE(BEARCOLK, bearCol1), IE(BEARCIRCK, bearCirc1), IE(POOLUSDNK, poolMain1), IE(POOLUPK, poolUp1), IE(POOLDWNK, poolDwn1)]
409387 }
410388
449427 else if ((token == BEAR))
450428 then fraction(bearCirc, addedCollateral, bearCol)
451429 else throw("bad token id")
452- let $t01395914032 = sp(defaultAddedTokens, maxPayout)
453- let addedToCirculation = $t01395914032._1
454- let extraTokens = $t01395914032._2
455- let $t01404914220 = if ((token == BULL))
430+ let $t01292612999 = sp(defaultAddedTokens, maxPayout)
431+ let addedToCirculation = $t01292612999._1
432+ let extraTokens = $t01292612999._2
433+ let $t01301613187 = if ((token == BULL))
456434 then $Tuple4(defaultAddedTokens, addedCollateral, 0, 0)
457435 else $Tuple4(0, 0, defaultAddedTokens, addedCollateral)
458- let plusBulls = $t01404914220._1
459- let plusBullCol = $t01404914220._2
460- let plusBears = $t01404914220._3
461- let plusBearCol = $t01404914220._4
436+ let plusBulls = $t01301613187._1
437+ let plusBullCol = $t01301613187._2
438+ let plusBears = $t01301613187._3
439+ let plusBearCol = $t01301613187._4
462440 if ((minPayout > addedToCirculation))
463441 then payback(mainToken)
464442 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))])
473451 else throw("bad token id")
474452 let feeSize = fraction(estimatedPayout, redeemPercentile, 10000)
475453 let defaultPayout = (estimatedPayout - feeSize)
476- let $t01528715341 = sp(defaultPayout, maxPayout)
477- let userPayout = $t01528715341._1
478- let extra = $t01528715341._2
479- let $t01535815523 = if ((token == BULL))
454+ let $t01425414308 = sp(defaultPayout, maxPayout)
455+ let userPayout = $t01425414308._1
456+ let extra = $t01425414308._2
457+ let $t01432514490 = if ((token == BULL))
480458 then $Tuple4(removedTokens, estimatedPayout, 0, 0)
481459 else $Tuple4(0, 0, removedTokens, estimatedPayout)
482- let minusBulls = $t01535815523._1
483- let minusBullCol = $t01535815523._2
484- let minusBears = $t01535815523._3
485- let minusBearCol = $t01535815523._4
460+ let minusBulls = $t01432514490._1
461+ let minusBullCol = $t01432514490._2
462+ let minusBears = $t01432514490._3
463+ let minusBearCol = $t01432514490._4
486464 if ((minPayout > userPayout))
487465 then payback(token)
488466 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))])
516494 }
517495
518496
519-func rebalance (offset) = if ((offset == 0))
520- then throw("[OK] offset=0")
521- else {
522- func LV (v,p0,p1,m) = {
523- let denom = {
524- let md = (((2 * (if ((p1 > p0))
497+func rebalance (offset) = if (!(valueOrElse(getBoolean(this, "enableRebalance"), true)))
498+ then throw("rebalance paused")
499+ else if ((offset == 0))
500+ then throw("[OK] offset=0")
501+ else {
502+ func LV (v,p0,p1,m) = {
503+ let denom = {
504+ let md = (((2 * (if ((p1 > p0))
505+ then p1
506+ else p0)) * m) / 3037000499)
507+ if ((10 > md))
508+ then 10
509+ else if ((100 > md))
510+ then 100
511+ else 1000
512+ }
513+ let pmax = ((if ((p1 > p0))
525514 then p1
526- else p0)) * m) / 3037000499)
527- if ((10 > md))
528- then 10
529- else if ((100 > md))
530- then 100
531- else 1000
515+ else p0) / denom)
516+ let pmin = ((if ((p0 > p1))
517+ then p1
518+ else p0) / denom)
519+ let a = (pmin * pmin)
520+ let b = ((((m * m) * pmax) * pmax) - (((((2 * m) * m) - m) * pmax) * pmin))
521+ let ma = ((m * m) - m)
522+ fraction(v, ((ma * a) + b), (((ma + 1) * a) + b))
532523 }
533- let pmax = ((if ((p1 > p0))
534- then p1
535- else p0) / denom)
536- let pmin = ((if ((p0 > p1))
537- then p1
538- else p0) / denom)
539- let a = (pmin * pmin)
540- let b = ((((m * m) * pmax) * pmax) - (((((2 * m) * m) - m) * pmax) * pmin))
541- let ma = ((m * m) - m)
542- fraction(v, ((ma * a) + b), (((ma + 1) * a) + b))
524+
525+ let unsettledPriceIndex = (settledPriceIndex + offset)
526+ if (!(opn))
527+ then [IE(REBIDXK, unsettledPriceIndex)]
528+ else {
529+ let settledPrice = priceByIndex(settledPriceIndex)
530+ let nextPrice = priceByIndex(unsettledPriceIndex)
531+ let minVol = if ((bearCol > bullCol))
532+ then bullCol
533+ else bearCol
534+ let redist = LV(minVol, settledPrice, nextPrice, leverage)
535+ let priceUpGoodForBulls = (assetName == "")
536+ let priceGoesUp = (nextPrice > settledPrice)
537+ let bullsEarn = (priceUpGoodForBulls == priceGoesUp)
538+ let newBullCol = if (bullsEarn)
539+ then (bullCol + redist)
540+ else (bullCol - redist)
541+ let newBearCol = if (bullsEarn)
542+ then (bearCol - redist)
543+ 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
552+[IE(BULLCOLK, updBullCol), IE(BEARCOLK, updBearCol), IE(BULLCIRCK, updBullCirc), IE(BEARCIRCK, updBearCirc), IE(POOLUSDNK, updPoolMain), IE(POOLUPK, updPoolUp), IE(POOLDWNK, updPoolDwn), IE(REBIDXK, unsettledPriceIndex)]
553+ }
543554 }
544-
545- let unsettledPriceIndex = (settledPriceIndex + offset)
546- if (!(opn))
547- then [IE(REBIDXK, unsettledPriceIndex)]
548- else {
549- let settledPrice = priceByIndex(settledPriceIndex)
550- let nextPrice = priceByIndex(unsettledPriceIndex)
551- let minVol = if ((bearCol > bullCol))
552- then bullCol
553- else bearCol
554- let redist = LV(minVol, settledPrice, nextPrice, leverage)
555- let priceUpGoodForBulls = (assetName == "")
556- let priceGoesUp = (nextPrice > settledPrice)
557- let bullsEarn = (priceUpGoodForBulls == priceGoesUp)
558- let newBullCol = if (bullsEarn)
559- then (bullCol + redist)
560- else (bullCol - redist)
561- let newBearCol = if (bullsEarn)
562- then (bearCol - redist)
563- else (bearCol + redist)
564- let $t01945219650 = poolSupport(newBullCol, newBearCol, bullCirc, bearCirc, poolMain, poolUp, poolDwn, offset)
565- let updBullCol = $t01945219650._1
566- let updBearCol = $t01945219650._2
567- let updBullCirc = $t01945219650._3
568- let updBearCirc = $t01945219650._4
569- let updPoolMain = $t01945219650._5
570- let updPoolUp = $t01945219650._6
571- let updPoolDwn = $t01945219650._7
572-[IE(BULLCOLK, updBullCol), IE(BEARCOLK, updBearCol), IE(BULLCIRCK, updBullCirc), IE(BEARCIRCK, updBearCirc), IE(POOLUSDNK, updPoolMain), IE(POOLUPK, updPoolUp), IE(POOLDWNK, updPoolDwn), IE(REBIDXK, unsettledPriceIndex)]
573- }
574- }
575555
576556
577557 func calcMax (min,avg) = if ((min > avg))
579559 else ((avg + avg) - min)
580560
581561
582-func requestIssueInternal (inv,tokenId,minPayout) = if (!(opn))
583- then throw("markets closed")
584- else if (if ((tokenId != BULL))
585- then (tokenId != BEAR)
586- else false)
587- then throw("bad token req")
588- else if ((inv.caller == this))
589- then throw("can't do")
590- else if (!(allowed(inv.caller)))
591- then throw("only whitelisted can do")
592- else {
593- let errorMessage = (((("bad token req, only BULL(" + BULL) + ") or BEAR(") + BEAR) + ") allowed")
594- if ((inv.payments[0].assetId != fromBase58String(mainToken)))
595- then throw("bad token att")
596- else {
597- let amt = inv.payments[0].amount
598- let $t02074720925 = if ((tokenId == BULL))
599- then $Tuple2(bullCol, bullCirc)
600- else if ((tokenId == BEAR))
601- then $Tuple2(bearCol, bearCirc)
602- else throw(errorMessage)
603- let col = $t02074720925._1
604- let circ = $t02074720925._2
605- let est = fraction(amt, circ, col)
606- let $t02096721061 = if ((minPayout == 0))
607- then $Tuple2(0, MAX)
608- else $Tuple2(minPayout, calcMax(minPayout, est))
609- let minP = $t02096721061._1
610- let maxP = $t02096721061._2
611- if ((minIssue > amt))
612- then throw((("Attached payment too small. Min required: " + toString((minIssue / 1000000))) + " USDN"))
613- else {
614- let maxAllowed = maxIssue(tokenId)
615- if (if ((whitelist == ""))
616- then (inv.payments[0].amount > maxAllowed)
617- else false)
618- then throw((("trying to issue more than pool can handle. Max attachment allowed = " + toString((maxAllowed / 1000000))) + " USDN"))
619- else enqueue(toBase58String(inv.transactionId), ISSUE, amt, tokenId, (oraclePriceIndex + 1), toString(inv.caller), minP, maxP)
620- }
621- }
622- }
562+@Callable(i)
563+func enableEnqueue (arg) = if ((i.caller != feeAddress))
564+ then throw("only admin can")
565+ else [BooleanEntry("enableEnqueue", arg)]
623566
624567
625-func requestRedeemInternal (inv,minPayout) = {
626- let amt = inv.payments[0].amount
627- let tokenId = toBase58String(valueOrErrorMessage(inv.payments[0].assetId, "bad token att"))
628- if (if ((tokenId != BULL))
629- then (tokenId != BEAR)
630- else false)
631- then throw("bad token req")
632- else {
633- let $t02202322162 = if ((tokenId == BULL))
634- then $Tuple2(bullCol, bullCirc)
635- else if ((tokenId == BEAR))
636- then $Tuple2(bearCol, bearCirc)
637- else throw("bad token req")
638- let col = $t02202322162._1
639- let circ = $t02202322162._2
640- let est = fraction(amt, col, circ)
641- let $t02221022304 = if ((minPayout == 0))
642- then $Tuple2(0, MAX)
643- else $Tuple2(minPayout, calcMax(minPayout, est))
644- let minP = $t02221022304._1
645- let maxP = $t02221022304._2
646- if ((validateRequestRedeem(inv) == unit))
647- then enqueue(toBase58String(inv.transactionId), REDEEM, amt, tokenId, (oraclePriceIndex + 1), toString(inv.caller), minP, maxP)
648- else throw("doesn't happen")
649- }
650- }
651568
569+@Callable(i)
570+func enableRebalance (arg) = if ((i.caller != feeAddress))
571+ then throw("only admin can")
572+ else [BooleanEntry("enableRebalance", arg)]
652573
653-func requestPoolInternal (inv,minPayout) = if (!(allowed(inv.caller)))
654- then throw("only whitelisted can do")
655- else {
656- let errMessage = "USDN required"
657- let pmt = inv.payments[0]
658- if ((pmt.assetId != fromBase58String(mainToken)))
659- then throw(errMessage)
660- else if ((minPool > pmt.amount))
661- then throw(("pool min: " + toString(minPool)))
662- else {
663- let estimate = fraction(poolTokenCirculation, pmt.amount, poolValue)
664- let $t02309723196 = if ((minPayout == 0))
665- then $Tuple2(0, MAX)
666- else $Tuple2(minPayout, calcMax(minPayout, estimate))
667- let minP = $t02309723196._1
668- let maxP = $t02309723196._2
669- enqueue(toBase58String(inv.transactionId), POOL, inv.payments[0].amount, "", (oraclePriceIndex + 1), toString(inv.caller), minP, maxP)
670- }
671- }
672-
673-
674-func requestUnpoolInternal (inv,minPayout) = {
675- let errMessage = (("only pool token allowed(" + poolToken) + ")")
676- let pmt = inv.payments[0]
677- if ((pmt.assetId != fromBase58String(poolToken)))
678- then throw(errMessage)
679- else {
680- let estimate = fraction(poolValue, pmt.amount, poolTokenCirculation)
681- if ((minPool > estimate))
682- then throw(((("unpool at least for" + toString(minPool)) + " ") + mainToken))
683- else {
684- let $t02385323952 = if ((minPayout == 0))
685- then $Tuple2(0, MAX)
686- else $Tuple2(minPayout, calcMax(minPayout, estimate))
687- let minP = $t02385323952._1
688- let maxP = $t02385323952._2
689- enqueue(toBase58String(inv.transactionId), UNPOOL, inv.payments[0].amount, "", (oraclePriceIndex + 1), toString(inv.caller), minP, maxP)
690- }
691- }
692- }
693574
694575
695576 @Callable(i)
700581
701582
702583 @Callable(inv)
703-func requestRedeem () = requestRedeemInternal(inv, 0)
704-
705-
706-
707-@Callable(inv)
708-func requestRedeemSl (sl) = if (validatePMFee(inv, sl))
709- then requestRedeemInternal(inv, sl)
584+func requestRedeemSl (minPayout) = if (validatePMFee(inv, minPayout))
585+ then {
586+ let amt = inv.payments[0].amount
587+ let tokenId = toBase58String(valueOrErrorMessage(inv.payments[0].assetId, "bad token att"))
588+ if (if ((tokenId != BULL))
589+ then (tokenId != BEAR)
590+ else false)
591+ then throw("bad token req")
592+ else {
593+ let $t02019020329 = if ((tokenId == BULL))
594+ then $Tuple2(bullCol, bullCirc)
595+ else if ((tokenId == BEAR))
596+ then $Tuple2(bearCol, bearCirc)
597+ else throw("bad token req")
598+ let col = $t02019020329._1
599+ let circ = $t02019020329._2
600+ let est = fraction(amt, col, circ)
601+ let $t02037720471 = if ((minPayout == 0))
602+ then $Tuple2(0, MAX)
603+ else $Tuple2(minPayout, calcMax(minPayout, est))
604+ let minP = $t02037720471._1
605+ let maxP = $t02037720471._2
606+ if ((inv.caller == this))
607+ then throw("can't do")
608+ else {
609+ let estimated = fraction(col, amt, circ)
610+ if ((minRedeem > estimated))
611+ then throw((("Attached payment too small. Min redeem amount is " + toString((minRedeem / 1000000))) + " USDN"))
612+ else enqueue(toBase58String(inv.transactionId), REDEEM, amt, tokenId, (oraclePriceIndex + 1), toString(inv.caller), minP, maxP)
613+ }
614+ }
615+ }
710616 else throw()
711617
712618
713619
714620 @Callable(inv)
715-func requestIssue (tokenId) = requestIssueInternal(inv, tokenId, 0)
716-
717-
718-
719-@Callable(inv)
720-func requestIssueSl (tokenId,sl) = if (validatePMFee(inv, sl))
721- then requestIssueInternal(inv, tokenId, sl)
621+func requestIssueSl (tokenId,minPayout) = if (validatePMFee(inv, minPayout))
622+ then if (!(opn))
623+ then throw("markets closed")
624+ else if (if ((tokenId != BULL))
625+ then (tokenId != BEAR)
626+ else false)
627+ then throw("bad token req")
628+ else if (!(allowed(inv.caller)))
629+ then throw("only whitelisted can do")
630+ else if ((inv.payments[0].assetId != fromBase58String(mainToken)))
631+ then throw("bad token att")
632+ else {
633+ let amt = inv.payments[0].amount
634+ let $t02144021621 = if ((tokenId == BULL))
635+ then $Tuple2(bullCol, bullCirc)
636+ else if ((tokenId == BEAR))
637+ then $Tuple2(bearCol, bearCirc)
638+ else throw("bad token req")
639+ let col = $t02144021621._1
640+ let circ = $t02144021621._2
641+ let est = fraction(amt, circ, col)
642+ let $t02166321757 = if ((minPayout == 0))
643+ then $Tuple2(0, MAX)
644+ else $Tuple2(minPayout, calcMax(minPayout, est))
645+ let minP = $t02166321757._1
646+ let maxP = $t02166321757._2
647+ if ((minIssue > amt))
648+ then throw((("Attached payment too small. Min required: " + toString((minIssue / 1000000))) + " USDN"))
649+ else {
650+ let maxAllowed = maxIssue(tokenId)
651+ if (if ((whitelist == ""))
652+ then (inv.payments[0].amount > maxAllowed)
653+ else false)
654+ then throw((("trying to issue more than pool can handle. Max attachment allowed = " + toString((maxAllowed / 1000000))) + " USDN"))
655+ else enqueue(toBase58String(inv.transactionId), ISSUE, amt, tokenId, (oraclePriceIndex + 1), toString(inv.caller), minP, maxP)
656+ }
657+ }
722658 else throw()
723659
724660
725661
726662 @Callable(inv)
727-func requestPool () = requestPoolInternal(inv, 0)
663+func requestPool () = if (!(allowed(inv.caller)))
664+ then throw("only whitelisted can do")
665+ else {
666+ let pmt = inv.payments[0]
667+ if ((pmt.assetId != fromBase58String(mainToken)))
668+ then throw("USDN required")
669+ else if ((minPool > pmt.amount))
670+ then throw(("pool min: " + toString(minPool)))
671+ else {
672+ let estimate = fraction(poolTokenCirculation, pmt.amount, poolValue)
673+ enqueue(toBase58String(inv.transactionId), POOL, inv.payments[0].amount, "", (oraclePriceIndex + 1), toString(inv.caller), 0, MAX)
674+ }
675+ }
728676
729677
730678
731679 @Callable(inv)
732-func requestPoolSl (sl) = if (validatePMFee(inv, sl))
733- then requestPoolInternal(inv, sl)
734- else throw()
735-
736-
737-
738-@Callable(inv)
739-func requestUnpool () = requestUnpoolInternal(inv, 0)
740-
741-
742-
743-@Callable(inv)
744-func requestUnpoolSl (sl) = if (validatePMFee(inv, sl))
745- then requestUnpoolInternal(inv, sl)
746- else throw()
680+func requestUnpool () = {
681+ let pmt = inv.payments[0]
682+ if ((pmt.assetId != fromBase58String(poolToken)))
683+ then throw("bad token att")
684+ else {
685+ let estimate = fraction(poolValue, pmt.amount, poolTokenCirculation)
686+ if ((minPool > estimate))
687+ then throw(((("unpool at least for" + toString(minPool)) + " ") + mainToken))
688+ else enqueue(toBase58String(inv.transactionId), UNPOOL, inv.payments[0].amount, "", (oraclePriceIndex + 1), toString(inv.caller), 0, MAX)
689+ }
690+ }
747691
748692
749693
794738 then true
795739 else hasDeviation((settledPriceIndex + shift)))
796740
797- let $t02683026929 = {
798- let $list2687426929 = [1, 2, 3, 4, 5, 6, 7]
799- let $size2687426929 = size($list2687426929)
800- let $acc02687426929 = $Tuple2(settledPriceIndex, false)
801- if (($size2687426929 == 0))
802- then $acc02687426929
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
803747 else {
804- let $acc12687426929 = f($acc02687426929, $list2687426929[0])
805- if (($size2687426929 == 1))
806- then $acc12687426929
748+ let $acc12519825253 = f($acc02519825253, $list2519825253[0])
749+ if (($size2519825253 == 1))
750+ then $acc12519825253
807751 else {
808- let $acc22687426929 = f($acc12687426929, $list2687426929[1])
809- if (($size2687426929 == 2))
810- then $acc22687426929
752+ let $acc22519825253 = f($acc12519825253, $list2519825253[1])
753+ if (($size2519825253 == 2))
754+ then $acc22519825253
811755 else {
812- let $acc32687426929 = f($acc22687426929, $list2687426929[2])
813- if (($size2687426929 == 3))
814- then $acc32687426929
756+ let $acc32519825253 = f($acc22519825253, $list2519825253[2])
757+ if (($size2519825253 == 3))
758+ then $acc32519825253
815759 else {
816- let $acc42687426929 = f($acc32687426929, $list2687426929[3])
817- if (($size2687426929 == 4))
818- then $acc42687426929
760+ let $acc42519825253 = f($acc32519825253, $list2519825253[3])
761+ if (($size2519825253 == 4))
762+ then $acc42519825253
819763 else {
820- let $acc52687426929 = f($acc42687426929, $list2687426929[4])
821- if (($size2687426929 == 5))
822- then $acc52687426929
764+ let $acc52519825253 = f($acc42519825253, $list2519825253[4])
765+ if (($size2519825253 == 5))
766+ then $acc52519825253
823767 else {
824- let $acc62687426929 = f($acc52687426929, $list2687426929[5])
825- if (($size2687426929 == 6))
826- then $acc62687426929
768+ let $acc62519825253 = f($acc52519825253, $list2519825253[5])
769+ if (($size2519825253 == 6))
770+ then $acc62519825253
827771 else {
828- let $acc72687426929 = f($acc62687426929, $list2687426929[6])
829- if (($size2687426929 == 7))
830- then $acc72687426929
772+ let $acc72519825253 = f($acc62519825253, $list2519825253[6])
773+ if (($size2519825253 == 7))
774+ then $acc72519825253
831775 else {
832- let $acc82687426929 = f($acc72687426929, $list2687426929[7])
776+ let $acc82519825253 = f($acc72519825253, $list2519825253[7])
833777 throw("List size exceed 7")
834778 }
835779 }
840784 }
841785 }
842786 }
843- let okShift = $t02683026929._1
844- let forcedByDeviationOrTimeout = $t02683026929._2
787+ let okShift = $t02515425253._1
788+ let forcedByDeviationOrTimeout = $t02515425253._2
845789 let queueWaits = (oraclePriceIndex >= queuePriceIndex)
846790 if ((settledPriceIndex > queuePriceIndex))
847791 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
9696 let oraclePKKey = "oracle"
9797
9898 let maxDeviation = valueOrElse(getInteger(configProvider, (toString(this) + "_deviationPercentile")), 0)
9999
100100 func lastPriceIndexKey (assetId) = if ((assetId == ""))
101101 then "price_index"
102102 else ("%s%s__idxCurrent__" + assetId)
103103
104104
105105 func priceIndexPrefix (assetId) = if ((assetId == ""))
106106 then "price_index_"
107107 else (("%s%s%d__idx2Height__" + assetId) + "__")
108108
109109
110110 func priceHeightPrefix (assetId) = if ((assetId == ""))
111111 then "price_"
112112 else (("%s%s%d__priceByHeight__" + assetId) + "__")
113113
114114
115115 let minUsdnFee = valueOrElse(getInteger(configProvider, USDNFEEK), 0)
116116
117117 let minWavesFee = valueOrElse(getInteger(configProvider, WAVESFEEK), 0)
118118
119119 let assetName = valueOrElse(getString(this, ASSNAMEK), "")
120120
121121 let bullCol = localI(BULLCOLK, "no 0")
122122
123123 let bearCol = localI(BEARCOLK, "no 1")
124124
125125 let bullCirc = localI(BULLCIRCK, "no 2")
126126
127127 let bearCirc = localI(BEARCIRCK, "no 3")
128128
129129 let BULL = localS(BULLK, "no 14")
130130
131131 let BEAR = localS(BEARK, "no 15")
132132
133133 let mainToken = localS(USDNK, "no 16")
134134
135135 let issuePercentile = confI(ISSPERCK, "no 4")
136136
137137 let redeemPercentile = confI(REDPERCK, "no 5")
138138
139139 let minIssue = confI(MINISSK, "no 6")
140140
141141 let minRedeem = confI(MINREDK, "no 7")
142142
143143 let minPool = confI(MINPOOLK, "no 8")
144144
145145 let rebalancePercentile = valueOrElse(getInteger(configProvider, ((toString(this) + "_") + REBPERCK)), 0)
146146
147147 let whitelist = confS(WLISTK, "no 9")
148148
149149 func allowed (a) = if ((whitelist == ""))
150150 then true
151151 else isDefined(indexOf(whitelist, toString(a)))
152152
153153
154154 let poolMain = localI(POOLUSDNK, "no")
155155
156156 let poolUp = localI(POOLUPK, "no 10")
157157
158158 let poolDwn = localI(POOLDWNK, "no 11")
159159
160160 let poolToken = localS(POOLK, "no 12")
161161
162162 let poolTokenCirculation = localI(POOLCIRCK, "no 13")
163163
164164 let poolBullExposure = fraction(bullCol, poolUp, bullCirc)
165165
166166 let poolBearExposure = fraction(bearCol, poolDwn, bearCirc)
167167
168168 let poolValue = ((poolMain + poolBullExposure) + poolBearExposure)
169169
170170 let oracle = valueOrErrorMessage(addressFromPublicKey(fromBase58String(valueOrErrorMessage(getString(this, oraclePKKey), "no oraclePKKey"))), "bad oracle address")
171171
172+let closeInterval = confI("closeInterval", "no CI")
173+
172174 let settledPriceIndex = valueOrErrorMessage(getInteger(this, REBIDXK), "no last rebalance price")
173175
174176 let oraclePriceIndex = valueOrErrorMessage(getInteger(oracle, lastPriceIndexKey(assetName)), ((("bad oracle data at " + toString(oracle)) + ": no integer at ") + lastPriceIndexKey(assetName)))
175177
176178 let leverage = valueOrElse(getInteger(this, LEVK), 3)
177179
178180 func heightByIndex (priceIndex) = valueOrErrorMessage(getInteger(oracle, (priceIndexPrefix(assetName) + toString(priceIndex))), ("no data at index " + toString(priceIndex)))
179181
180182
181183 func priceByHeight (priceHeight) = valueOrErrorMessage(getInteger(oracle, (priceHeightPrefix(assetName) + toString(priceHeight))), ("no data for height " + toString(priceHeight)))
182184
183185
184186 func priceByIndex (priceIndex) = priceByHeight(heightByIndex(priceIndex))
185187
186188
187189 let queueSize = valueOrElse(getInteger(this, QSIZEK), 0)
188190
189191 let headPointer = valueOrElse(getString(this, HEADK), "")
190192
191193 let tailPointer = valueOrElse(getString(this, TAILK), "")
192194
193195 let feesAccumulated = valueOrElse(getInteger(this, FEEACCK), 0)
194196
195197 let ISSUE = "ISSUE"
196198
197199 let REDEEM = "REDEEM"
198200
199201 let POOL = "POOL"
200202
201203 let UNPOOL = "UNPOOL"
202204
203205 let feeAddrKey = "feeAddress"
204206
205207 let stakingAddrKey = "stakingAddress"
206208
207209 let daemonPubKeyKey = "daemonPublicKey"
208210
209211 let feeAddress = valueOrErrorMessage(addressFromString(confS(feeAddrKey, "no feeAddress")), "bad feeAddress")
210212
211213 let stakingAddress = confS(stakingAddrKey, "no stakingAddress")
212214
213215 let daemonPublicKey = fromBase58String(confS(daemonPubKeyKey, "no daemonPublicKey"))
214216
215217 let rpdAddress = addressFromString("3PNikM6yp4NqcSU8guxQtmR5onr2D4e8yTJ")
216218
217219 let admins = ["2HHqV8W9DJayV5R6tBD2Sb8srphpoboDi7r1t1aPiumC", "5ZXe82RRASU7qshXM2J9JNYhqJ9GWYjjVq2gwUV5Naz9", "5WRXFSjwcTbNfKcJs8ZqXmSSWYsSVJUtMvMqZj5hH4Nc"]
218220
219221 let opn = valueOrElse(getBoolean(oracle, ("%s%s__isMarketOpened__" + assetName)), true)
220222
221223 func buildNewItem (action,amt,token,priceIndex,invoker,minPayout,maxPayout) = (((((((((((((action + "|") + toString(amt)) + "|") + token) + "|") + toString(priceIndex)) + "|") + invoker) + "|") + toString(minPayout)) + "|") + toString(maxPayout)) + "|")
222224
223225
224226 func diffAbs (a1,a2) = {
225227 let diff = (a1 - a2)
226228 if ((diff > 0))
227229 then diff
228230 else (0 - diff)
229231 }
230232
231233
232234 func userDiffAbs () = diffAbs((bullCol - poolBullExposure), (bearCol - poolBearExposure))
233235
234236
235237 func maxIssue (tokenId) = {
236238 let poolInvestment = if ((poolUp > 0))
237239 then BULL
238240 else BEAR
239241 if ((tokenId != poolInvestment))
240242 then poolMain
241243 else (userDiffAbs() + poolValue)
242244 }
243245
244246
245247 func validatePMFee (i,minPayout) = if ((0 > minPayout))
246248 then throw("negative min payout")
247249 else {
248250 let p = i.payments[1]
249251 let ok = match p.assetId {
250252 case bv: ByteVector =>
251253 if ((toBase58String(bv) == mainToken))
252254 then (p.amount >= minUsdnFee)
253255 else false
254256 case waves: Unit =>
255257 (p.amount >= minWavesFee)
256258 case _ =>
257259 throw("Match error")
258260 }
259261 if (!(ok))
260262 then throw("incorrect pacemaker fee")
261263 else true
262264 }
263265
264266
265-func validateRequestRedeem (inv) = if ((inv.caller == this))
266- then throw("can't do")
267+func enqueue (id,action,amt,token,priceIndex,invoker,minPayout,maxPayout) = if (!(valueOrElse(getBoolean(this, "enableEnqueue"), true)))
268+ then throw("enqueue paused")
267269 else {
268- func errorMessage (got) = throw(((((("bad token att: only BULL(" + BULL) + ") or BEAR(") + BEAR) + ") tokens are accepted, received: ") + got))
269-
270- let assetId = toBase58String(valueOrErrorMessage(value(inv.payments[0]).assetId, "bad token att"))
271- if (if ((assetId != BEAR))
272- then (assetId != BULL)
273- else false)
274- then errorMessage(assetId)
270+ let increaseQueueSize = IE(QSIZEK, (queueSize + 1))
271+ let itm = buildNewItem(action, amt, token, priceIndex, invoker, minPayout, maxPayout)
272+ if ((queueSize == 0))
273+ then [SE(HEADK, id), SE(TAILK, id), SE(id, itm), increaseQueueSize]
275274 else {
276- let attachedAmount = inv.payments[0].amount
277- let col = if ((assetId == BEAR))
278- then bearCol
279- else bullCol
280- let circ = if ((assetId == BEAR))
281- then bearCirc
282- else bullCirc
283- let estimated = fraction(col, attachedAmount, circ)
284- if ((minRedeem > estimated))
285- then throw((((((((((("Attached payment too small. Min redeem amount is " + toString((minRedeem / 1000000))) + " USDN, ") + "attached amount: ") + toString(attachedAmount)) + ", col: ") + toString(col)) + ", circ: ") + toString(circ)) + ", estimated: ") + toString(estimated)))
286- else unit
275+ let prevId = localS(TAILK, "can't get tail pointer")
276+ let prevItm = localS(prevId, "can't resolve pointer")
277+ let updatedPrevItm = (prevItm + id)
278+[SE(prevId, updatedPrevItm), SE(id, itm), SE(TAILK, id), increaseQueueSize]
287279 }
288280 }
289-
290-
291-func enqueue (id,action,amt,token,priceIndex,invoker,minPayout,maxPayout) = {
292- let increaseQueueSize = IE(QSIZEK, (queueSize + 1))
293- let itm = buildNewItem(action, amt, token, priceIndex, invoker, minPayout, maxPayout)
294- if ((queueSize == 0))
295- then [SE(HEADK, id), SE(TAILK, id), SE(id, itm), increaseQueueSize]
296- else {
297- let prevId = localS(TAILK, "can't get tail pointer")
298- let prevItm = localS(prevId, "can't resolve pointer")
299- let updatedPrevItm = (prevItm + id)
300-[SE(prevId, updatedPrevItm), SE(id, itm), SE(TAILK, id), increaseQueueSize]
301- }
302- }
303281
304282
305283 func poolSupport (curBullCol0,curBearCol0,curBullCirc0,curBearCirc0,curPoolMain0,curPoolUp0,curPoolDwn0,steps) = {
306284 func closeUp (c1,c2,a0,a1,c0,pu,pd) = {
307285 let diff = (c1 - c2)
308286 let exp = fraction(c1, pu, a0)
309287 let liquidatedTokens = if ((diff > exp))
310288 then pu
311289 else fraction(diff, a0, c1)
312290 let liquidatedValue = if ((diff > exp))
313291 then exp
314292 else fraction(liquidatedTokens, c1, a0)
315293 $Tuple7((c1 - liquidatedValue), c2, (a0 - liquidatedTokens), a1, (c0 + liquidatedValue), (pu - liquidatedTokens), pd)
316294 }
317295
318296 func closeDwn (c1,c2,a0,a1,c0,pu,pd) = {
319297 let diff = (c2 - c1)
320298 let exp = fraction(c2, pd, a1)
321299 let liquidatedTokens = if ((diff > exp))
322300 then pd
323301 else fraction(diff, a1, c2)
324302 let liquidatedValue = if ((diff > exp))
325303 then exp
326304 else fraction(liquidatedTokens, c2, a1)
327305 $Tuple7(c1, (c2 - liquidatedValue), a0, (a1 - liquidatedTokens), (c0 + liquidatedValue), pu, (pd - liquidatedTokens))
328306 }
329307
330308 func openDwn (c1,c2,a0,a1,c0,pu,pd) = {
331309 let diff = (c1 - c2)
332310 let spentPoolValue = if ((c0 > diff))
333311 then diff
334312 else c0
335313 let acquiredTokens = fraction(spentPoolValue, a1, c2)
336314 $Tuple7(c1, (c2 + spentPoolValue), a0, (a1 + acquiredTokens), (c0 - spentPoolValue), pu, (pd + acquiredTokens))
337315 }
338316
339317 func openUp (c1,c2,a0,a1,c0,pu,pd) = {
340318 let diff = (c2 - c1)
341319 let spentPoolValue = if ((c0 > diff))
342320 then diff
343321 else c0
344322 let acquiredTokens = fraction(spentPoolValue, a0, c1)
345323 $Tuple7((c1 + spentPoolValue), c2, (a0 + acquiredTokens), a1, (c0 - spentPoolValue), (pu + acquiredTokens), pd)
346324 }
347325
348- let $t01030211337 = if ((curBullCol0 > curBearCol0))
326+ let $t0926910304 = if ((curBullCol0 > curBearCol0))
349327 then {
350328 let afterCloseUp = closeUp(curBullCol0, curBearCol0, curBullCirc0, curBearCirc0, curPoolMain0, curPoolUp0, curPoolDwn0)
351- let $t01052810665 = afterCloseUp
352- let a = $t01052810665._1
353- let b = $t01052810665._2
354- let c = $t01052810665._3
355- let d = $t01052810665._4
356- let e = $t01052810665._5
357- let f = $t01052810665._6
358- let g = $t01052810665._7
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
359337 if ((f > 0))
360338 then afterCloseUp
361339 else if ((f == 0))
362340 then openDwn(a, b, c, d, e, f, g)
363341 else throw("poolUp < 0")
364342 }
365343 else {
366344 let afterCloseDwn = closeDwn(curBullCol0, curBearCol0, curBullCirc0, curBearCirc0, curPoolMain0, curPoolUp0, curPoolDwn0)
367- let $t01101611156 = afterCloseDwn
368- let a = $t01101611156._1
369- let b = $t01101611156._2
370- let c = $t01101611156._3
371- let d = $t01101611156._4
372- let e = $t01101611156._5
373- let f = $t01101611156._6
374- let g = $t01101611156._7
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
375353 if ((g > 0))
376354 then afterCloseDwn
377355 else if ((g == 0))
378356 then openUp(a, b, c, d, e, f, g)
379357 else throw("poolDwn < 0")
380358 }
381- let c1 = $t01030211337._1
382- let c2 = $t01030211337._2
383- let a0 = $t01030211337._3
384- let a1 = $t01030211337._4
385- let c0 = $t01030211337._5
386- let pu = $t01030211337._6
387- let pd = $t01030211337._7
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
388366 let charge = fraction(userDiffAbs(), (rebalancePercentile * steps), ((1440 * 100) * 100))
389367 let c1SplitP = if ((pd > 0))
390368 then charge
391369 else 0
392370 let c2SplitP = if ((pu > 0))
393371 then charge
394372 else 0
395373 $Tuple7((c1 - c1SplitP), (c2 - c2SplitP), a0, a1, ((c0 + c1SplitP) + c2SplitP), pu, pd)
396374 }
397375
398376
399377 func poolSup (curBullCol0,curBearCol0,curBullCirc0,curBearCirc0) = {
400- let $t01176211947 = poolSupport(curBullCol0, curBearCol0, curBullCirc0, curBearCirc0, poolMain, poolUp, poolDwn, 0)
401- let bullCol1 = $t01176211947._1
402- let bearCol1 = $t01176211947._2
403- let bullCic1 = $t01176211947._3
404- let bearCirc1 = $t01176211947._4
405- let poolMain1 = $t01176211947._5
406- let poolUp1 = $t01176211947._6
407- let poolDwn1 = $t01176211947._7
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
408386 [IE(BULLCOLK, bullCol1), IE(BULLCIRCK, bullCic1), IE(BEARCOLK, bearCol1), IE(BEARCIRCK, bearCirc1), IE(POOLUSDNK, poolMain1), IE(POOLUPK, poolUp1), IE(POOLDWNK, poolDwn1)]
409387 }
410388
411389
412390 func dequeue () = {
413391 func sp (a,mx) = if ((mx >= a))
414392 then $Tuple2(a, 0)
415393 else $Tuple2(mx, (a - mx))
416394
417395 if ((queueSize == 0))
418396 then throw("nothing to settle")
419397 else {
420398 func collectFee (fees) = IE(FEEACCK, (feesAccumulated + fees))
421399
422400 let decreaseQueueSize = IE(QSIZEK, (queueSize - 1))
423401 let isLastElement = (headPointer == tailPointer)
424402 let overwriteTail = SE(TAILK, "")
425403 let dataStr = localS(headPointer, "bad head pointer(dequeue)")
426404 let data = split(dataStr, "|")
427405 let action = data[0]
428406 let amt = parseIntValue(data[1])
429407 let token = data[2]
430408 let priceIndex = parseIntValue(data[3])
431409 let invoker = addressFromStringValue(data[4])
432410 let minPayout = if ((8 > size(data)))
433411 then 0
434412 else parseIntValue(data[5])
435413 let maxPayout = if ((8 > size(data)))
436414 then MAX
437415 else parseIntValue(data[6])
438416 let next = data[(size(data) - 1)]
439417 func payback (tkn) = [SE(HEADK, next), decreaseQueueSize, ST(invoker, amt, fromBase58String(tkn))]
440418
441419 let items = if ((settledPriceIndex != priceIndex))
442420 then throw(((("corrupt state, settledPriceIndex=" + toString(settledPriceIndex)) + ", request price id=") + toString(priceIndex)))
443421 else if ((action == ISSUE))
444422 then {
445423 let feeSize = fraction(amt, issuePercentile, 10000)
446424 let addedCollateral = (amt - feeSize)
447425 let defaultAddedTokens = if ((token == BULL))
448426 then fraction(bullCirc, addedCollateral, bullCol)
449427 else if ((token == BEAR))
450428 then fraction(bearCirc, addedCollateral, bearCol)
451429 else throw("bad token id")
452- let $t01395914032 = sp(defaultAddedTokens, maxPayout)
453- let addedToCirculation = $t01395914032._1
454- let extraTokens = $t01395914032._2
455- let $t01404914220 = if ((token == BULL))
430+ let $t01292612999 = sp(defaultAddedTokens, maxPayout)
431+ let addedToCirculation = $t01292612999._1
432+ let extraTokens = $t01292612999._2
433+ let $t01301613187 = if ((token == BULL))
456434 then $Tuple4(defaultAddedTokens, addedCollateral, 0, 0)
457435 else $Tuple4(0, 0, defaultAddedTokens, addedCollateral)
458- let plusBulls = $t01404914220._1
459- let plusBullCol = $t01404914220._2
460- let plusBears = $t01404914220._3
461- let plusBearCol = $t01404914220._4
436+ let plusBulls = $t01301613187._1
437+ let plusBullCol = $t01301613187._2
438+ let plusBears = $t01301613187._3
439+ let plusBearCol = $t01301613187._4
462440 if ((minPayout > addedToCirculation))
463441 then payback(mainToken)
464442 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))])
465443 }
466444 else if ((action == REDEEM))
467445 then {
468446 let removedTokens = amt
469447 let estimatedPayout = if ((token == BULL))
470448 then fraction(bullCol, removedTokens, bullCirc)
471449 else if ((token == BEAR))
472450 then fraction(bearCol, removedTokens, bearCirc)
473451 else throw("bad token id")
474452 let feeSize = fraction(estimatedPayout, redeemPercentile, 10000)
475453 let defaultPayout = (estimatedPayout - feeSize)
476- let $t01528715341 = sp(defaultPayout, maxPayout)
477- let userPayout = $t01528715341._1
478- let extra = $t01528715341._2
479- let $t01535815523 = if ((token == BULL))
454+ let $t01425414308 = sp(defaultPayout, maxPayout)
455+ let userPayout = $t01425414308._1
456+ let extra = $t01425414308._2
457+ let $t01432514490 = if ((token == BULL))
480458 then $Tuple4(removedTokens, estimatedPayout, 0, 0)
481459 else $Tuple4(0, 0, removedTokens, estimatedPayout)
482- let minusBulls = $t01535815523._1
483- let minusBullCol = $t01535815523._2
484- let minusBears = $t01535815523._3
485- let minusBearCol = $t01535815523._4
460+ let minusBulls = $t01432514490._1
461+ let minusBullCol = $t01432514490._2
462+ let minusBears = $t01432514490._3
463+ let minusBearCol = $t01432514490._4
486464 if ((minPayout > userPayout))
487465 then payback(token)
488466 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))])
489467 }
490468 else if ((action == POOL))
491469 then {
492470 let issueTokens = fraction(poolTokenCirculation, amt, poolValue)
493471 if ((minPayout > issueTokens))
494472 then payback(mainToken)
495473 else [IE(POOLUSDNK, (poolMain + amt)), IE(POOLCIRCK, (poolTokenCirculation + issueTokens)), SE(HEADK, next), decreaseQueueSize, ST(invoker, issueTokens, fromBase58String(poolToken))]
496474 }
497475 else if ((action == UNPOOL))
498476 then {
499477 func share (a) = fraction(a, amt, poolTokenCirculation)
500478
501479 let unpooledMain = share(poolMain)
502480 let unpooledUp = share(poolUp)
503481 let unpooledDwn = share(poolDwn)
504482 let unpooledUpValue = fraction(unpooledUp, bullCol, bullCirc)
505483 let unpooledDwnValue = fraction(unpooledDwn, bearCol, bearCirc)
506484 let totalUnpooledValue = ((unpooledMain + unpooledUpValue) + unpooledDwnValue)
507485 if ((minPayout > totalUnpooledValue))
508486 then payback(poolToken)
509487 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))]
510488 }
511489 else throw(("bad action: " + action))
512490 if (isLastElement)
513491 then overwriteTail :: items
514492 else items
515493 }
516494 }
517495
518496
519-func rebalance (offset) = if ((offset == 0))
520- then throw("[OK] offset=0")
521- else {
522- func LV (v,p0,p1,m) = {
523- let denom = {
524- let md = (((2 * (if ((p1 > p0))
497+func rebalance (offset) = if (!(valueOrElse(getBoolean(this, "enableRebalance"), true)))
498+ then throw("rebalance paused")
499+ else if ((offset == 0))
500+ then throw("[OK] offset=0")
501+ else {
502+ func LV (v,p0,p1,m) = {
503+ let denom = {
504+ let md = (((2 * (if ((p1 > p0))
505+ then p1
506+ else p0)) * m) / 3037000499)
507+ if ((10 > md))
508+ then 10
509+ else if ((100 > md))
510+ then 100
511+ else 1000
512+ }
513+ let pmax = ((if ((p1 > p0))
525514 then p1
526- else p0)) * m) / 3037000499)
527- if ((10 > md))
528- then 10
529- else if ((100 > md))
530- then 100
531- else 1000
515+ else p0) / denom)
516+ let pmin = ((if ((p0 > p1))
517+ then p1
518+ else p0) / denom)
519+ let a = (pmin * pmin)
520+ let b = ((((m * m) * pmax) * pmax) - (((((2 * m) * m) - m) * pmax) * pmin))
521+ let ma = ((m * m) - m)
522+ fraction(v, ((ma * a) + b), (((ma + 1) * a) + b))
532523 }
533- let pmax = ((if ((p1 > p0))
534- then p1
535- else p0) / denom)
536- let pmin = ((if ((p0 > p1))
537- then p1
538- else p0) / denom)
539- let a = (pmin * pmin)
540- let b = ((((m * m) * pmax) * pmax) - (((((2 * m) * m) - m) * pmax) * pmin))
541- let ma = ((m * m) - m)
542- fraction(v, ((ma * a) + b), (((ma + 1) * a) + b))
524+
525+ let unsettledPriceIndex = (settledPriceIndex + offset)
526+ if (!(opn))
527+ then [IE(REBIDXK, unsettledPriceIndex)]
528+ else {
529+ let settledPrice = priceByIndex(settledPriceIndex)
530+ let nextPrice = priceByIndex(unsettledPriceIndex)
531+ let minVol = if ((bearCol > bullCol))
532+ then bullCol
533+ else bearCol
534+ let redist = LV(minVol, settledPrice, nextPrice, leverage)
535+ let priceUpGoodForBulls = (assetName == "")
536+ let priceGoesUp = (nextPrice > settledPrice)
537+ let bullsEarn = (priceUpGoodForBulls == priceGoesUp)
538+ let newBullCol = if (bullsEarn)
539+ then (bullCol + redist)
540+ else (bullCol - redist)
541+ let newBearCol = if (bullsEarn)
542+ then (bearCol - redist)
543+ 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
552+[IE(BULLCOLK, updBullCol), IE(BEARCOLK, updBearCol), IE(BULLCIRCK, updBullCirc), IE(BEARCIRCK, updBearCirc), IE(POOLUSDNK, updPoolMain), IE(POOLUPK, updPoolUp), IE(POOLDWNK, updPoolDwn), IE(REBIDXK, unsettledPriceIndex)]
553+ }
543554 }
544-
545- let unsettledPriceIndex = (settledPriceIndex + offset)
546- if (!(opn))
547- then [IE(REBIDXK, unsettledPriceIndex)]
548- else {
549- let settledPrice = priceByIndex(settledPriceIndex)
550- let nextPrice = priceByIndex(unsettledPriceIndex)
551- let minVol = if ((bearCol > bullCol))
552- then bullCol
553- else bearCol
554- let redist = LV(minVol, settledPrice, nextPrice, leverage)
555- let priceUpGoodForBulls = (assetName == "")
556- let priceGoesUp = (nextPrice > settledPrice)
557- let bullsEarn = (priceUpGoodForBulls == priceGoesUp)
558- let newBullCol = if (bullsEarn)
559- then (bullCol + redist)
560- else (bullCol - redist)
561- let newBearCol = if (bullsEarn)
562- then (bearCol - redist)
563- else (bearCol + redist)
564- let $t01945219650 = poolSupport(newBullCol, newBearCol, bullCirc, bearCirc, poolMain, poolUp, poolDwn, offset)
565- let updBullCol = $t01945219650._1
566- let updBearCol = $t01945219650._2
567- let updBullCirc = $t01945219650._3
568- let updBearCirc = $t01945219650._4
569- let updPoolMain = $t01945219650._5
570- let updPoolUp = $t01945219650._6
571- let updPoolDwn = $t01945219650._7
572-[IE(BULLCOLK, updBullCol), IE(BEARCOLK, updBearCol), IE(BULLCIRCK, updBullCirc), IE(BEARCIRCK, updBearCirc), IE(POOLUSDNK, updPoolMain), IE(POOLUPK, updPoolUp), IE(POOLDWNK, updPoolDwn), IE(REBIDXK, unsettledPriceIndex)]
573- }
574- }
575555
576556
577557 func calcMax (min,avg) = if ((min > avg))
578558 then throw(((("price too old: minPayout " + toString(min)) + " > avg = ") + toString(avg)))
579559 else ((avg + avg) - min)
580560
581561
582-func requestIssueInternal (inv,tokenId,minPayout) = if (!(opn))
583- then throw("markets closed")
584- else if (if ((tokenId != BULL))
585- then (tokenId != BEAR)
586- else false)
587- then throw("bad token req")
588- else if ((inv.caller == this))
589- then throw("can't do")
590- else if (!(allowed(inv.caller)))
591- then throw("only whitelisted can do")
592- else {
593- let errorMessage = (((("bad token req, only BULL(" + BULL) + ") or BEAR(") + BEAR) + ") allowed")
594- if ((inv.payments[0].assetId != fromBase58String(mainToken)))
595- then throw("bad token att")
596- else {
597- let amt = inv.payments[0].amount
598- let $t02074720925 = if ((tokenId == BULL))
599- then $Tuple2(bullCol, bullCirc)
600- else if ((tokenId == BEAR))
601- then $Tuple2(bearCol, bearCirc)
602- else throw(errorMessage)
603- let col = $t02074720925._1
604- let circ = $t02074720925._2
605- let est = fraction(amt, circ, col)
606- let $t02096721061 = if ((minPayout == 0))
607- then $Tuple2(0, MAX)
608- else $Tuple2(minPayout, calcMax(minPayout, est))
609- let minP = $t02096721061._1
610- let maxP = $t02096721061._2
611- if ((minIssue > amt))
612- then throw((("Attached payment too small. Min required: " + toString((minIssue / 1000000))) + " USDN"))
613- else {
614- let maxAllowed = maxIssue(tokenId)
615- if (if ((whitelist == ""))
616- then (inv.payments[0].amount > maxAllowed)
617- else false)
618- then throw((("trying to issue more than pool can handle. Max attachment allowed = " + toString((maxAllowed / 1000000))) + " USDN"))
619- else enqueue(toBase58String(inv.transactionId), ISSUE, amt, tokenId, (oraclePriceIndex + 1), toString(inv.caller), minP, maxP)
620- }
621- }
622- }
562+@Callable(i)
563+func enableEnqueue (arg) = if ((i.caller != feeAddress))
564+ then throw("only admin can")
565+ else [BooleanEntry("enableEnqueue", arg)]
623566
624567
625-func requestRedeemInternal (inv,minPayout) = {
626- let amt = inv.payments[0].amount
627- let tokenId = toBase58String(valueOrErrorMessage(inv.payments[0].assetId, "bad token att"))
628- if (if ((tokenId != BULL))
629- then (tokenId != BEAR)
630- else false)
631- then throw("bad token req")
632- else {
633- let $t02202322162 = if ((tokenId == BULL))
634- then $Tuple2(bullCol, bullCirc)
635- else if ((tokenId == BEAR))
636- then $Tuple2(bearCol, bearCirc)
637- else throw("bad token req")
638- let col = $t02202322162._1
639- let circ = $t02202322162._2
640- let est = fraction(amt, col, circ)
641- let $t02221022304 = if ((minPayout == 0))
642- then $Tuple2(0, MAX)
643- else $Tuple2(minPayout, calcMax(minPayout, est))
644- let minP = $t02221022304._1
645- let maxP = $t02221022304._2
646- if ((validateRequestRedeem(inv) == unit))
647- then enqueue(toBase58String(inv.transactionId), REDEEM, amt, tokenId, (oraclePriceIndex + 1), toString(inv.caller), minP, maxP)
648- else throw("doesn't happen")
649- }
650- }
651568
569+@Callable(i)
570+func enableRebalance (arg) = if ((i.caller != feeAddress))
571+ then throw("only admin can")
572+ else [BooleanEntry("enableRebalance", arg)]
652573
653-func requestPoolInternal (inv,minPayout) = if (!(allowed(inv.caller)))
654- then throw("only whitelisted can do")
655- else {
656- let errMessage = "USDN required"
657- let pmt = inv.payments[0]
658- if ((pmt.assetId != fromBase58String(mainToken)))
659- then throw(errMessage)
660- else if ((minPool > pmt.amount))
661- then throw(("pool min: " + toString(minPool)))
662- else {
663- let estimate = fraction(poolTokenCirculation, pmt.amount, poolValue)
664- let $t02309723196 = if ((minPayout == 0))
665- then $Tuple2(0, MAX)
666- else $Tuple2(minPayout, calcMax(minPayout, estimate))
667- let minP = $t02309723196._1
668- let maxP = $t02309723196._2
669- enqueue(toBase58String(inv.transactionId), POOL, inv.payments[0].amount, "", (oraclePriceIndex + 1), toString(inv.caller), minP, maxP)
670- }
671- }
672-
673-
674-func requestUnpoolInternal (inv,minPayout) = {
675- let errMessage = (("only pool token allowed(" + poolToken) + ")")
676- let pmt = inv.payments[0]
677- if ((pmt.assetId != fromBase58String(poolToken)))
678- then throw(errMessage)
679- else {
680- let estimate = fraction(poolValue, pmt.amount, poolTokenCirculation)
681- if ((minPool > estimate))
682- then throw(((("unpool at least for" + toString(minPool)) + " ") + mainToken))
683- else {
684- let $t02385323952 = if ((minPayout == 0))
685- then $Tuple2(0, MAX)
686- else $Tuple2(minPayout, calcMax(minPayout, estimate))
687- let minP = $t02385323952._1
688- let maxP = $t02385323952._2
689- enqueue(toBase58String(inv.transactionId), UNPOOL, inv.payments[0].amount, "", (oraclePriceIndex + 1), toString(inv.caller), minP, maxP)
690- }
691- }
692- }
693574
694575
695576 @Callable(i)
696577 func withdrawFee (amount) = if ((amount > feesAccumulated))
697578 then throw(("too much. available: " + toString(feesAccumulated)))
698579 else [IE(FEEACCK, (feesAccumulated - amount)), ST(feeAddress, amount, fromBase58String(mainToken))]
699580
700581
701582
702583 @Callable(inv)
703-func requestRedeem () = requestRedeemInternal(inv, 0)
704-
705-
706-
707-@Callable(inv)
708-func requestRedeemSl (sl) = if (validatePMFee(inv, sl))
709- then requestRedeemInternal(inv, sl)
584+func requestRedeemSl (minPayout) = if (validatePMFee(inv, minPayout))
585+ then {
586+ let amt = inv.payments[0].amount
587+ let tokenId = toBase58String(valueOrErrorMessage(inv.payments[0].assetId, "bad token att"))
588+ if (if ((tokenId != BULL))
589+ then (tokenId != BEAR)
590+ else false)
591+ then throw("bad token req")
592+ else {
593+ let $t02019020329 = if ((tokenId == BULL))
594+ then $Tuple2(bullCol, bullCirc)
595+ else if ((tokenId == BEAR))
596+ then $Tuple2(bearCol, bearCirc)
597+ else throw("bad token req")
598+ let col = $t02019020329._1
599+ let circ = $t02019020329._2
600+ let est = fraction(amt, col, circ)
601+ let $t02037720471 = if ((minPayout == 0))
602+ then $Tuple2(0, MAX)
603+ else $Tuple2(minPayout, calcMax(minPayout, est))
604+ let minP = $t02037720471._1
605+ let maxP = $t02037720471._2
606+ if ((inv.caller == this))
607+ then throw("can't do")
608+ else {
609+ let estimated = fraction(col, amt, circ)
610+ if ((minRedeem > estimated))
611+ then throw((("Attached payment too small. Min redeem amount is " + toString((minRedeem / 1000000))) + " USDN"))
612+ else enqueue(toBase58String(inv.transactionId), REDEEM, amt, tokenId, (oraclePriceIndex + 1), toString(inv.caller), minP, maxP)
613+ }
614+ }
615+ }
710616 else throw()
711617
712618
713619
714620 @Callable(inv)
715-func requestIssue (tokenId) = requestIssueInternal(inv, tokenId, 0)
716-
717-
718-
719-@Callable(inv)
720-func requestIssueSl (tokenId,sl) = if (validatePMFee(inv, sl))
721- then requestIssueInternal(inv, tokenId, sl)
621+func requestIssueSl (tokenId,minPayout) = if (validatePMFee(inv, minPayout))
622+ then if (!(opn))
623+ then throw("markets closed")
624+ else if (if ((tokenId != BULL))
625+ then (tokenId != BEAR)
626+ else false)
627+ then throw("bad token req")
628+ else if (!(allowed(inv.caller)))
629+ then throw("only whitelisted can do")
630+ else if ((inv.payments[0].assetId != fromBase58String(mainToken)))
631+ then throw("bad token att")
632+ else {
633+ let amt = inv.payments[0].amount
634+ let $t02144021621 = if ((tokenId == BULL))
635+ then $Tuple2(bullCol, bullCirc)
636+ else if ((tokenId == BEAR))
637+ then $Tuple2(bearCol, bearCirc)
638+ else throw("bad token req")
639+ let col = $t02144021621._1
640+ let circ = $t02144021621._2
641+ let est = fraction(amt, circ, col)
642+ let $t02166321757 = if ((minPayout == 0))
643+ then $Tuple2(0, MAX)
644+ else $Tuple2(minPayout, calcMax(minPayout, est))
645+ let minP = $t02166321757._1
646+ let maxP = $t02166321757._2
647+ if ((minIssue > amt))
648+ then throw((("Attached payment too small. Min required: " + toString((minIssue / 1000000))) + " USDN"))
649+ else {
650+ let maxAllowed = maxIssue(tokenId)
651+ if (if ((whitelist == ""))
652+ then (inv.payments[0].amount > maxAllowed)
653+ else false)
654+ then throw((("trying to issue more than pool can handle. Max attachment allowed = " + toString((maxAllowed / 1000000))) + " USDN"))
655+ else enqueue(toBase58String(inv.transactionId), ISSUE, amt, tokenId, (oraclePriceIndex + 1), toString(inv.caller), minP, maxP)
656+ }
657+ }
722658 else throw()
723659
724660
725661
726662 @Callable(inv)
727-func requestPool () = requestPoolInternal(inv, 0)
663+func requestPool () = if (!(allowed(inv.caller)))
664+ then throw("only whitelisted can do")
665+ else {
666+ let pmt = inv.payments[0]
667+ if ((pmt.assetId != fromBase58String(mainToken)))
668+ then throw("USDN required")
669+ else if ((minPool > pmt.amount))
670+ then throw(("pool min: " + toString(minPool)))
671+ else {
672+ let estimate = fraction(poolTokenCirculation, pmt.amount, poolValue)
673+ enqueue(toBase58String(inv.transactionId), POOL, inv.payments[0].amount, "", (oraclePriceIndex + 1), toString(inv.caller), 0, MAX)
674+ }
675+ }
728676
729677
730678
731679 @Callable(inv)
732-func requestPoolSl (sl) = if (validatePMFee(inv, sl))
733- then requestPoolInternal(inv, sl)
734- else throw()
735-
736-
737-
738-@Callable(inv)
739-func requestUnpool () = requestUnpoolInternal(inv, 0)
740-
741-
742-
743-@Callable(inv)
744-func requestUnpoolSl (sl) = if (validatePMFee(inv, sl))
745- then requestUnpoolInternal(inv, sl)
746- else throw()
680+func requestUnpool () = {
681+ let pmt = inv.payments[0]
682+ if ((pmt.assetId != fromBase58String(poolToken)))
683+ then throw("bad token att")
684+ else {
685+ let estimate = fraction(poolValue, pmt.amount, poolTokenCirculation)
686+ if ((minPool > estimate))
687+ then throw(((("unpool at least for" + toString(minPool)) + " ") + mainToken))
688+ else enqueue(toBase58String(inv.transactionId), UNPOOL, inv.payments[0].amount, "", (oraclePriceIndex + 1), toString(inv.caller), 0, MAX)
689+ }
690+ }
747691
748692
749693
750694 @Callable(inv)
751695 func settle () = {
752696 let queueEmpty = (headPointer == "")
753697 let canRebalance = (oraclePriceIndex > settledPriceIndex)
754698 if (queueEmpty)
755699 then if (canRebalance)
756700 then rebalance(1)
757701 else throw("[OK] all done, carry on")
758702 else {
759703 let data = split(valueOrErrorMessage(getString(this, headPointer), ("bad head pointer(settle): " + headPointer)), "|")
760704 let queuePriceIndex = parseIntValue(data[3])
761705 if ((queuePriceIndex > settledPriceIndex))
762706 then if (canRebalance)
763707 then rebalance(1)
764708 else throw("[OK] need to wait")
765709 else if ((queuePriceIndex == settledPriceIndex))
766710 then dequeue()
767711 else throw("future price already rebalanced")
768712 }
769713 }
770714
771715
772716
773717 @Callable(inv)
774718 func settle2 () = {
775719 let queueEmpty = (headPointer == "")
776720 let queuePriceIndex = if (queueEmpty)
777721 then MAX
778722 else {
779723 let data = split(localS(headPointer, "settle2: bad head pointer"), "|")
780724 parseIntValue(data[3])
781725 }
782726 let settledPrice = priceByIndex(settledPriceIndex)
783727 func hasDeviation (priceIndex) = {
784728 let p = priceByIndex(priceIndex)
785729 (fraction(diffAbs(settledPrice, p), 1000000, settledPrice) >= maxDeviation)
786730 }
787731
788732 let maxPossibleShift = (min([queuePriceIndex, oraclePriceIndex]) - settledPriceIndex)
789733 func f (acc,shift) = if (if (acc._2)
790734 then true
791735 else (shift > maxPossibleShift))
792736 then acc
793737 else $Tuple2(shift, if ((shift == 7))
794738 then true
795739 else hasDeviation((settledPriceIndex + shift)))
796740
797- let $t02683026929 = {
798- let $list2687426929 = [1, 2, 3, 4, 5, 6, 7]
799- let $size2687426929 = size($list2687426929)
800- let $acc02687426929 = $Tuple2(settledPriceIndex, false)
801- if (($size2687426929 == 0))
802- then $acc02687426929
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
803747 else {
804- let $acc12687426929 = f($acc02687426929, $list2687426929[0])
805- if (($size2687426929 == 1))
806- then $acc12687426929
748+ let $acc12519825253 = f($acc02519825253, $list2519825253[0])
749+ if (($size2519825253 == 1))
750+ then $acc12519825253
807751 else {
808- let $acc22687426929 = f($acc12687426929, $list2687426929[1])
809- if (($size2687426929 == 2))
810- then $acc22687426929
752+ let $acc22519825253 = f($acc12519825253, $list2519825253[1])
753+ if (($size2519825253 == 2))
754+ then $acc22519825253
811755 else {
812- let $acc32687426929 = f($acc22687426929, $list2687426929[2])
813- if (($size2687426929 == 3))
814- then $acc32687426929
756+ let $acc32519825253 = f($acc22519825253, $list2519825253[2])
757+ if (($size2519825253 == 3))
758+ then $acc32519825253
815759 else {
816- let $acc42687426929 = f($acc32687426929, $list2687426929[3])
817- if (($size2687426929 == 4))
818- then $acc42687426929
760+ let $acc42519825253 = f($acc32519825253, $list2519825253[3])
761+ if (($size2519825253 == 4))
762+ then $acc42519825253
819763 else {
820- let $acc52687426929 = f($acc42687426929, $list2687426929[4])
821- if (($size2687426929 == 5))
822- then $acc52687426929
764+ let $acc52519825253 = f($acc42519825253, $list2519825253[4])
765+ if (($size2519825253 == 5))
766+ then $acc52519825253
823767 else {
824- let $acc62687426929 = f($acc52687426929, $list2687426929[5])
825- if (($size2687426929 == 6))
826- then $acc62687426929
768+ let $acc62519825253 = f($acc52519825253, $list2519825253[5])
769+ if (($size2519825253 == 6))
770+ then $acc62519825253
827771 else {
828- let $acc72687426929 = f($acc62687426929, $list2687426929[6])
829- if (($size2687426929 == 7))
830- then $acc72687426929
772+ let $acc72519825253 = f($acc62519825253, $list2519825253[6])
773+ if (($size2519825253 == 7))
774+ then $acc72519825253
831775 else {
832- let $acc82687426929 = f($acc72687426929, $list2687426929[7])
776+ let $acc82519825253 = f($acc72519825253, $list2519825253[7])
833777 throw("List size exceed 7")
834778 }
835779 }
836780 }
837781 }
838782 }
839783 }
840784 }
841785 }
842786 }
843- let okShift = $t02683026929._1
844- let forcedByDeviationOrTimeout = $t02683026929._2
787+ let okShift = $t02515425253._1
788+ let forcedByDeviationOrTimeout = $t02515425253._2
845789 let queueWaits = (oraclePriceIndex >= queuePriceIndex)
846790 if ((settledPriceIndex > queuePriceIndex))
847791 then throw("settle2: future price already settled/rebalanced")
848792 else if ((settledPriceIndex == queuePriceIndex))
849793 then dequeue()
850794 else if (if ((okShift > 0))
851795 then if (forcedByDeviationOrTimeout)
852796 then true
853797 else queueWaits
854798 else false)
855799 then rebalance(okShift)
856800 else throw(("settle2: [OK] all done, carry on. available shift: " + toString(okShift)))
857801 }
858802
859803
860804 @Verifier(tx)
861805 func verify () = {
862806 let adminAction = ((((if (sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(admins[0])))
863807 then 1
864808 else 0) + (if (sigVerify(tx.bodyBytes, tx.proofs[1], fromBase58String(admins[1])))
865809 then 1
866810 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[2], fromBase58String(admins[2])))
867811 then 1
868812 else 0)) > 1)
869813 let stakingAction = match tx {
870814 case tx: InvokeScriptTransaction =>
871815 let signedCorrectly = sigVerify(tx.bodyBytes, tx.proofs[0], daemonPublicKey)
872816 let feesCorrect = if ((tx.feeAssetId == unit))
873817 then ((1000 * 1000) >= tx.fee)
874818 else false
875819 let dappCorrect = (tx.dApp == rpdAddress)
876820 let unlock = (tx.function == "unlockNeutrino")
877821 let lock = if (if ((tx.function == "lockNeutrinoSP"))
878822 then (tx.args[0] == stakingAddress)
879823 else false)
880824 then (wavesBalance(this).available >= ten8)
881825 else false
882826 let funcCorrect = if (lock)
883827 then true
884828 else unlock
885829 if (if (if (signedCorrectly)
886830 then feesCorrect
887831 else false)
888832 then dappCorrect
889833 else false)
890834 then funcCorrect
891835 else false
892836 case _ =>
893837 false
894838 }
895839 if (adminAction)
896840 then true
897841 else stakingAction
898842 }
899843

github/deemru/w8io/786bc32 
174.14 ms