2021.07.01 16:36 [2659375] smart account 3P3b9ZcfQmAyE9MVoRKE5tfRJSHR4BDXMEo > SELF 0.00000000 Waves

{ "type": 13, "id": "2GFfbsczUrJXYDEUmsTSAcDy4mEmHvDtFdatrwZ3C5Gm", "fee": 1400000, "feeAssetId": null, "timestamp": 1625146342200, "version": 1, "sender": "3P3b9ZcfQmAyE9MVoRKE5tfRJSHR4BDXMEo", "senderPublicKey": "BvoMQVENxUeFiSzGs66VPKRbddcurTqSSuQhBEKHmXiv", "proofs": [ "4iGbLMegT7W4zp9gEwRuS4j7qMqkZEY6D5dcupdqz9JUMuLnxkMVrPbknMfaL7Ev8fqsvZsg1TPAK6MdwVC28xKk", "3zjbt3hSx2Mf7xfDrCVQ5uceKaPzXq6vYE6ehqfFbZrehz4ebpW2PPiRUBhUh5P23NaTSHV7kb3xsQdu3Qjojs1A" ], "script": "base64:AAIEAAAAAAAAAB8IAhIDCgEEEgMKAQESAwoBARIECgIIARIAEgASABIAAAAAbAEAAAACU0UAAAACAAAAAWsAAAABdgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAABawUAAAABdgEAAAACSUUAAAACAAAAAWsAAAABdgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAAWsFAAAAAXYBAAAAAlNUAAAAAwAAAAFhAAAAA2FtdAAAAAF0CQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAAFhBQAAAANhbXQFAAAAAXQAAAAABHRlbjYAAAAAAAAPQkAAAAAABHRlbjgAAAAAAAX14QAAAAAAA01BWAB//////////wAAAAARY29uZmlnUHJvdmlkZXJLZXkCAAAADmNvbmZpZ1Byb3ZpZGVyAAAAAA5jb25maWdQcm92aWRlcgQAAAAHJG1hdGNoMAkABB0AAAACBQAAAAR0aGlzBQAAABFjb25maWdQcm92aWRlcktleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFzBQAAAAckbWF0Y2gwCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABBQAAAAFzBQAAAAR0aGlzAQAAAAZsb2NhbEkAAAACAAAAAWsAAAABZQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAAWsFAAAAAWUBAAAABmxvY2FsUwAAAAIAAAABawAAAAFlCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwUAAAABawUAAAABZQEAAAAFY29uZkkAAAACAAAAAWsAAAABZQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAADmNvbmZpZ1Byb3ZpZGVyBQAAAAFrBQAAAAFlAQAAAAVjb25mUwAAAAIAAAABawAAAAFlCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAOY29uZmlnUHJvdmlkZXIFAAAAAWsFAAAAAWUAAAAABUJVTExLAgAAAAZCVUxMSWQAAAAABUJFQVJLAgAAAAZCRUFSSWQAAAAABVVTRE5LAgAAAAttYWluVG9rZW5JZAAAAAAIQlVMTENPTEsCAAAADmJ1bGxDb2xsYXRlcmFsAAAAAAhCRUFSQ09MSwIAAAAOYmVhckNvbGxhdGVyYWwAAAAACUJVTExDSVJDSwIAAAAPYnVsbENpcmN1bGF0aW9uAAAAAAlCRUFSQ0lSQ0sCAAAAD2JlYXJDaXJjdWxhdGlvbgAAAAAISVNTUEVSQ0sCAAAAD2lzc3VlUGVyY2VudGlsZQAAAAAIUkVEUEVSQ0sCAAAAEHJlZGVlbVBlcmNlbnRpbGUAAAAAB01JTklTU0sCAAAACG1pbklzc3VlAAAAAAdNSU5SRURLAgAAAAltaW5SZWRlZW0AAAAACE1JTlBPT0xLAgAAAAdtaW5Qb29sAAAAAAdGRUVBQ0NLAgAAAA9mZWVzQWNjdW11bGF0ZWQAAAAABldMSVNUSwIAAAAOaXNzdWVXaGl0ZUxpc3QAAAAACFJFQlBFUkNLAgAAABNyZWJhbGFuY2VQZXJjZW50aWxlAAAAAAdSRUJJRFhLAgAAABVsYXN0U2V0dGxlbWVudFByaWNlSWQAAAAABUhFQURLAgAAAAtoZWFkUG9pbnRlcgAAAAAFVEFJTEsCAAAAC3RhaWxQb2ludGVyAAAAAAZRU0laRUsCAAAACXF1ZXVlU2l6ZQAAAAAJUE9PTFVTRE5LAgAAABJwb29sTWFpblRva2VuVmFsdWUAAAAAB1BPT0xVUEsCAAAABnBvb2xVcAAAAAAIUE9PTERXTksCAAAAB3Bvb2xEd24AAAAACVBPT0xDSVJDSwIAAAAUcG9vbFRva2VuQ2lyY3VsYXRpb24AAAAABVBPT0xLAgAAAAlwb29sVG9rZW4AAAAACEFTU05BTUVLAgAAAA1kZWZvQXNzZXROYW1lAAAAAARMRVZLAgAAAAhsZXZlcmFnZQAAAAAJV0FWRVNGRUVLAgAAABF3YXZlc1BhY2VtYWtlckZlZQAAAAAIVVNETkZFRUsCAAAAEHVzZG5QYWNlbWFrZXJGZWUAAAAAC29yYWNsZVBLS2V5AgAAAAZvcmFjbGUAAAAAB3J1bm5pbmcJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQbAAAAAgUAAAAEdGhpcwIAAAADcnVuBgAAAAAMbWF4RGV2aWF0aW9uCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAADmNv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bm8gMTIAAAAAFHBvb2xUb2tlbkNpcmN1bGF0aW9uCQEAAAAGbG9jYWxJAAAAAgUAAAAJUE9PTENJUkNLAgAAAAVubyAxMwAAAAAQcG9vbEJ1bGxFeHBvc3VyZQkAAGsAAAADBQAAAAdidWxsQ29sBQAAAAZwb29sVXAFAAAACGJ1bGxDaXJjAAAAABBwb29sQmVhckV4cG9zdXJlCQAAawAAAAMFAAAAB2JlYXJDb2wFAAAAB3Bvb2xEd24FAAAACGJlYXJDaXJjAAAAAAlwb29sVmFsdWUJAABkAAAAAgkAAGQAAAACBQAAAAhwb29sTWFpbgUAAAAQcG9vbEJ1bGxFeHBvc3VyZQUAAAAQcG9vbEJlYXJFeHBvc3VyZQAAAAAGb3JhY2xlCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAQAAABRhZGRyZXNzRnJvbVB1YmxpY0tleQAAAAEJAAJZAAAAAQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAAC29yYWNsZVBLS2V5AgAAAA5ubyBvcmFjbGVQS0tleQIAAAASYmFkIG9yYWNsZSBhZGRyZXNzAAAAAA1jbG9zZUludGVydmFsCQEAAAAFY29uZkkAAAACAgAAAA1jbG9zZUludGVydmFsAgAAAAVubyBDSQAAAAARc2V0dGxlZFByaWNlSW5kZXgJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAAAdSRUJJRFhLAgAAABdubyBsYXN0IHJlYmFsYW5jZSBwcmljZQAAAAAQb3JhY2xlUHJpY2VJbmRleAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABm9yYWNsZQkBAAAAEWxhc3RQcmljZUluZGV4S2V5AAAAAQUAAAAJYXNzZXROYW1lCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAABNiYWQgb3JhY2xlIGRhdGEgYXQgCQAEJQAAAAEFAAAABm9yYWNsZQIAAAAQOiBubyBpbnRlZ2VyIGF0IAkBAAAAEWxhc3RQcmljZUluZGV4S2V5AAAAAQUAAAAJYXNzZXROYW1lAAAAAAhsZXZlcmFnZQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAAARMRVZLAAAAAAAAAAADAQAAAA1oZWlnaHRCeUluZGV4AAAAAQAAAApwcmljZUluZGV4CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAGb3JhY2xlCQABLAAAAAIJAQAAABBwcmljZUluZGV4UHJlZml4AAAAAQUAAAAJYXNzZXROYW1lCQABpAAAAAEFAAAACnByaWNlSW5kZXgJAAEsAAAAAgIAAAARbm8gZGF0YSBhdCBpbmRleCAJAAGkAAAAAQUAAAAKcHJpY2VJbmRleAEAAAANcHJpY2VCeUhlaWdodAAAAAEAAAALcHJpY2VIZWlnaHQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAZvcmFjbGUJAAEsAAAAAgkBAAAAEXByaWNlSGVpZ2h0UHJlZml4AAAAAQUAAAAJYXNzZXROYW1lCQABpAAAAAEFAAAAC3ByaWNlSGVpZ2h0CQABLAAAAAICAAAAE25vIGRhdGEgZm9yIGhlaWdodCAJAAGkAAAAAQUAAAALcHJpY2VIZWlnaHQBAAAADHByaWNlQnlJbmRleAAAAAEAAAAKcHJpY2VJbmRleAkBAAAADXByaWNlQnlIZWlnaHQAAAABCQEAAAANaGVpZ2h0QnlJbmRleAAAAAEFAAAACnByaWNlSW5kZXgAAAAACXF1ZXVlU2l6ZQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAAAZRU0laRUsAAAAAAAAAAAAAAAAAC2hlYWRQb2ludGVyCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAABUhFQURLAgAAAAAAAAAAC3RhaWxQb2ludGVyCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAABVRBSUxLAgAAAAAAAAAAD2ZlZXNBY2N1bXVsYXRlZAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAAAdGRUVBQ0NLAAAAAAAAAAAAAAAAAAVJU1NVRQIAAAAFSVNTVUUAAAAABlJFREVFTQIAAAAGUkVERUVNAAAAAARQT09MAgAAAARQT09MAAAAAAZVTlBPT0wCAAAABlVOUE9PTAAAAAAKZmVlQWRkcktleQIAAAAKZmVlQWRkcmVzcwAAAAAOc3Rha2luZ0FkZHJLZXkCAAAADnN0YWtpbmdBZGRyZXNzAAAAAA9kYWVtb25QdWJLZXlLZXkCAAAAD2RhZW1vblB1YmxpY0tleQAAAAAKZmVlQWRkcmVzcwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEJgAAAAEJAQAAAAVjb25mUwAAAAIFAAAACmZlZUFkZHJLZXkCAAAADW5vIGZlZUFkZHJlc3MCAAAADmJhZCBmZWVBZGRyZXNzAAAAAA5zdGFraW5nQWRkcmVzcwkBAAAABWNvbmZTAAAAAgUAAAAOc3Rha2luZ0FkZHJLZXkCAAAAEW5vIHN0YWtpbmdBZGRyZXNzAAAAAA9kYWVtb25QdWJsaWNLZXkJAAJZAAAAAQkBAAAABWNvbmZTAAAAAgUAAAAPZGFlbW9uUHViS2V5S2V5AgAAABJubyBkYWVtb25QdWJsaWNLZXkAAAAACnJwZEFkZHJlc3MJAAQmAAAAAQIAAAAjM1BOaWtNNnlwNE5xY1NVOGd1eFF0bVI1b25yMkQ0ZTh5VEoAAAAABmFkbWlucwkABEwAAAACAgAAACwySEhxVjhXOURKYXlWNVI2dEJEMlNiOHNycGhwb2JvRGk3cjF0MWFQaXVtQwkABEwAAAACAgAAACw1WlhlODJSUkFTVTdxc2hYTTJKOUpOWWhxSjlHV1lqalZxMmd3VVY1TmF6OQkABEwAAAACAgAAACw1V1JYRlNqd2NUYk5mS2NKczhacVhtU1NXWXNTVkpVdE12TXFaajVoSDROYwUAAAADbmlsAAAAAANvcG4JAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQbAAAAAgUAAAAGb3JhY2xlCQABLAAAAAICAAAAFiVzJXNfX2lzTWFya2V0T3BlbmVkX18FAAAACWFzc2V0TmFtZQYBAAAADGJ1aWxkTmV3SXRlbQAAAAcAAAAGYWN0aW9uAAAAA2FtdAAAAAV0b2tlbgAAAApwcmljZUluZGV4AAAAB2ludm9rZXIAAAAJbWluUGF5b3V0AAAACW1heFBheW91dAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwA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B2JlYXJDb2wFAAAAB2J1bGxDb2wFAAAAB2J1bGxDb2wFAAAAB2JlYXJDb2wEAAAABnJlZGlzdAkBAAAAAkxWAAAABAUAAAAGbWluVm9sBQAAAAxzZXR0bGVkUHJpY2UFAAAACW5leHRQcmljZQUAAAAIbGV2ZXJhZ2UEAAAAE3ByaWNlVXBHb29kRm9yQnVsbHMJAAAAAAAAAgUAAAAJYXNzZXROYW1lAgAAAAAEAAAAC3ByaWNlR29lc1VwCQAAZgAAAAIFAAAACW5leHRQcmljZQUAAAAMc2V0dGxlZFByaWNlBAAAAAlidWxsc0Vhcm4JAAAAAAAAAgUAAAATcHJpY2VVcEdvb2RGb3JCdWxscwUAAAALcHJpY2VHb2VzVXAEAAAACm5ld0J1bGxDb2wDBQAAAAlidWxsc0Vhcm4JAABkAAAAAgUAAAAHYnVsbENvbAUAAAAGcmVkaXN0CQAAZQAAAAIFAAAAB2J1bGxDb2wFAAAABnJlZGlzdAQAAAAKbmV3QmVhckNvbAMFAAAACWJ1bGxzRWFybgkAAGUAAAACBQAAAAdiZWFyQ29sBQAAAAZyZWRpc3QJAABkAAAAAgUAAAAHYmVhckNvbAUAAAAGcmVkaXN0BAAAAA0kdDAxODQ3OTE4Njc3CQEAAAALcG9vbFN1cHBvcnQAAAAIBQAAAApuZXdCdWxsQ29sBQAAAApuZXdCZWFyQ29sBQAAAAhidWxsQ2lyYwUAAAAIYmVhckNpcmMFAAAACHBvb2xNYWluBQAAAAZwb29sVXAFAAAAB3Bvb2xEd24FAAAABm9mZnNldAQAAAAKdXBkQnVsbENvbAgFAAAADSR0MDE4NDc5MTg2NzcAAAACXzEEAAAACnVwZEJlYXJDb2wIBQAAAA0kdDAxODQ3OTE4Njc3AAAAAl8yBAAAAAt1cGRCdWxsQ2lyYwgFAAAADSR0MDE4NDc5MTg2NzcAAAACXzMEAAAAC3VwZEJlYXJDaXJjCAUAAAANJHQwMTg0NzkxODY3NwAAAAJfNAQAAAALdXBkUG9vbE1haW4IBQAAAA0kdDAxODQ3OTE4Njc3AAAAAl81BAAAAAl1cGRQb29sVXAIBQAAAA0kdDAxODQ3OTE4Njc3AAAAAl82BAAAAAp1cGRQb29sRHduCAUAAAANJHQwMTg0NzkxODY3NwAAAAJfNwkA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cwUAAAALaGVhZFBvaW50ZXIJAAEsAAAAAgIAAAAaYmFkIGhlYWQgcG9pbnRlcihzZXR0bGUpOiAFAAAAC2hlYWRQb2ludGVyAgAAAAF8BAAAAA9xdWV1ZVByaWNlSW5kZXgJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAARkYXRhAAAAAAAAAAADAwkAAGYAAAACBQAAAA9xdWV1ZVByaWNlSW5kZXgFAAAAEXNldHRsZWRQcmljZUluZGV4AwUAAAAMY2FuUmViYWxhbmNlCQEAAAAJcmViYWxhbmNlAAAAAQAAAAAAAAAAAQkAAAIAAAABAgAAABFbT0tdIG5lZWQgdG8gd2FpdAMJAAAAAAAAAgUAAAAPcXVldWVQcmljZUluZGV4BQAAABFzZXR0bGVkUHJpY2VJbmRleAkBAAAAB2RlcXVldWUAAAAACQAAAgAAAAECAAAAH2Z1dHVyZSBwcmljZSBhbHJlYWR5IHJlYmFsYW5jZWQAAAADaW52AQAAAAdzZXR0bGUyAAAAAAQAAAAKcXVldWVFbXB0eQkAAAAAAAACBQAAAAtoZWFkUG9pbnRlcgIAAAAABAAAAA9xdWV1ZVByaWNlSW5kZXgDBQAAAApxdWV1ZUVtcHR5BQAAAANNQVgEAAAABGRhdGEJAAS1AAAAAgkBAAAABmxvY2FsUwAAAAIFAAAAC2hlYWRQb2ludGVyAgAAABlzZXR0bGUyOiBiYWQgaGVhZCBwb2ludGVyAgAAAAF8CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAEZGF0YQAAAAAAAAAAAwQAAAAMc2V0dGxlZFByaWNlCQEAAAAMcHJpY2VCeUluZGV4AAAAAQUAAAARc2V0dGxlZFByaWNlSW5kZXgKAQAAAAxoYXNEZXZpYXRpb24AAAABAAAACnByaWNlSW5kZXgEAAAAAXAJAQAAAAxwcmljZUJ5SW5kZXgAAAABBQAAAApwcmljZUluZGV4CQAAZwAAAAIJAABrAAAAAwkBAAAAB2RpZmZBYnMAAAACBQAAAAxzZXR0bGVkUHJpY2UFAAAAAXAAAAAAAAAPQkAFAAAADHNldHRsZWRQcmljZQUAAAAMbWF4RGV2aWF0aW9uBAAAABBtYXhQb3NzaWJsZVNoaWZ0CQAAZQAAAAIJ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", "chainId": 87, "height": 2659375, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: HUSBR8PUeDkqkkmeKwqtW3U7sbRdJj1LiJQMq6isBWrP Next: Cy9Br4gLV2evuvAXzsAdyyXX79bGmJYwUFsKYWyCQ5L2 Diff:
OldNewDifferences
9595
9696 let oraclePKKey = "oracle"
9797
98+let running = valueOrElse(getBoolean(this, "run"), true)
99+
98100 let maxDeviation = valueOrElse(getInteger(configProvider, (toString(this) + "_deviationPercentile")), 0)
99101
100102 func lastPriceIndexKey (assetId) = if ((assetId == ""))
168170 let poolValue = ((poolMain + poolBullExposure) + poolBearExposure)
169171
170172 let oracle = valueOrErrorMessage(addressFromPublicKey(fromBase58String(valueOrErrorMessage(getString(this, oraclePKKey), "no oraclePKKey"))), "bad oracle address")
173+
174+let closeInterval = confI("closeInterval", "no CI")
171175
172176 let settledPriceIndex = valueOrErrorMessage(getInteger(this, REBIDXK), "no last rebalance price")
173177
262266 }
263267
264268
265-func validateRequestRedeem (inv) = if ((inv.caller == this))
266- then throw("can't do")
269+func enqueue (id,action,amt,token,priceIndex,invoker,minPayout,maxPayout) = if (!(running))
270+ then throw("system paused")
267271 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)
272+ let increaseQueueSize = IE(QSIZEK, (queueSize + 1))
273+ let itm = buildNewItem(action, amt, token, priceIndex, invoker, minPayout, maxPayout)
274+ if ((queueSize == 0))
275+ then [SE(HEADK, id), SE(TAILK, id), SE(id, itm), increaseQueueSize]
275276 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
277+ let prevId = localS(TAILK, "can't get tail pointer")
278+ let prevItm = localS(prevId, "can't resolve pointer")
279+ let updatedPrevItm = (prevItm + id)
280+[SE(prevId, updatedPrevItm), SE(id, itm), SE(TAILK, id), increaseQueueSize]
287281 }
288282 }
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- }
303283
304284
305285 func poolSupport (curBullCol0,curBearCol0,curBullCirc0,curBearCirc0,curPoolMain0,curPoolUp0,curPoolDwn0,steps) = {
345325 $Tuple7((c1 + spentPoolValue), c2, (a0 + acquiredTokens), a1, (c0 - spentPoolValue), (pu + acquiredTokens), pd)
346326 }
347327
348- let $t01030211337 = if ((curBullCol0 > curBearCol0))
328+ let $t0927910314 = if ((curBullCol0 > curBearCol0))
349329 then {
350330 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
331+ let $t095059642 = afterCloseUp
332+ let a = $t095059642._1
333+ let b = $t095059642._2
334+ let c = $t095059642._3
335+ let d = $t095059642._4
336+ let e = $t095059642._5
337+ let f = $t095059642._6
338+ let g = $t095059642._7
359339 if ((f > 0))
360340 then afterCloseUp
361341 else if ((f == 0))
364344 }
365345 else {
366346 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
347+ let $t0999310133 = afterCloseDwn
348+ let a = $t0999310133._1
349+ let b = $t0999310133._2
350+ let c = $t0999310133._3
351+ let d = $t0999310133._4
352+ let e = $t0999310133._5
353+ let f = $t0999310133._6
354+ let g = $t0999310133._7
375355 if ((g > 0))
376356 then afterCloseDwn
377357 else if ((g == 0))
378358 then openUp(a, b, c, d, e, f, g)
379359 else throw("poolDwn < 0")
380360 }
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
361+ let c1 = $t0927910314._1
362+ let c2 = $t0927910314._2
363+ let a0 = $t0927910314._3
364+ let a1 = $t0927910314._4
365+ let c0 = $t0927910314._5
366+ let pu = $t0927910314._6
367+ let pd = $t0927910314._7
388368 let charge = fraction(userDiffAbs(), (rebalancePercentile * steps), ((1440 * 100) * 100))
389369 let c1SplitP = if ((pd > 0))
390370 then charge
397377
398378
399379 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
380+ let $t01073910924 = poolSupport(curBullCol0, curBearCol0, curBullCirc0, curBearCirc0, poolMain, poolUp, poolDwn, 0)
381+ let bullCol1 = $t01073910924._1
382+ let bearCol1 = $t01073910924._2
383+ let bullCic1 = $t01073910924._3
384+ let bearCirc1 = $t01073910924._4
385+ let poolMain1 = $t01073910924._5
386+ let poolUp1 = $t01073910924._6
387+ let poolDwn1 = $t01073910924._7
408388 [IE(BULLCOLK, bullCol1), IE(BULLCIRCK, bullCic1), IE(BEARCOLK, bearCol1), IE(BEARCIRCK, bearCirc1), IE(POOLUSDNK, poolMain1), IE(POOLUPK, poolUp1), IE(POOLDWNK, poolDwn1)]
409389 }
410390
449429 else if ((token == BEAR))
450430 then fraction(bearCirc, addedCollateral, bearCol)
451431 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))
432+ let $t01293613009 = sp(defaultAddedTokens, maxPayout)
433+ let addedToCirculation = $t01293613009._1
434+ let extraTokens = $t01293613009._2
435+ let $t01302613197 = if ((token == BULL))
456436 then $Tuple4(defaultAddedTokens, addedCollateral, 0, 0)
457437 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
438+ let plusBulls = $t01302613197._1
439+ let plusBullCol = $t01302613197._2
440+ let plusBears = $t01302613197._3
441+ let plusBearCol = $t01302613197._4
462442 if ((minPayout > addedToCirculation))
463443 then payback(mainToken)
464444 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))])
473453 else throw("bad token id")
474454 let feeSize = fraction(estimatedPayout, redeemPercentile, 10000)
475455 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))
456+ let $t01426414318 = sp(defaultPayout, maxPayout)
457+ let userPayout = $t01426414318._1
458+ let extra = $t01426414318._2
459+ let $t01433514500 = if ((token == BULL))
480460 then $Tuple4(removedTokens, estimatedPayout, 0, 0)
481461 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
462+ let minusBulls = $t01433514500._1
463+ let minusBullCol = $t01433514500._2
464+ let minusBears = $t01433514500._3
465+ let minusBearCol = $t01433514500._4
486466 if ((minPayout > userPayout))
487467 then payback(token)
488468 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))])
516496 }
517497
518498
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))
499+func rebalance (offset) = if (!(running))
500+ then throw("system paused")
501+ else if ((offset == 0))
502+ then throw("[OK] offset=0")
503+ else {
504+ func LV (v,p0,p1,m) = {
505+ let denom = {
506+ let md = (((2 * (if ((p1 > p0))
507+ then p1
508+ else p0)) * m) / 3037000499)
509+ if ((10 > md))
510+ then 10
511+ else if ((100 > md))
512+ then 100
513+ else 1000
514+ }
515+ let pmax = ((if ((p1 > p0))
525516 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
517+ else p0) / denom)
518+ let pmin = ((if ((p0 > p1))
519+ then p1
520+ else p0) / denom)
521+ let a = (pmin * pmin)
522+ let b = ((((m * m) * pmax) * pmax) - (((((2 * m) * m) - m) * pmax) * pmin))
523+ let ma = ((m * m) - m)
524+ fraction(v, ((ma * a) + b), (((ma + 1) * a) + b))
532525 }
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))
526+
527+ let unsettledPriceIndex = (settledPriceIndex + offset)
528+ if (!(opn))
529+ then [IE(REBIDXK, unsettledPriceIndex)]
530+ else {
531+ let settledPrice = priceByIndex(settledPriceIndex)
532+ let nextPrice = priceByIndex(unsettledPriceIndex)
533+ let minVol = if ((bearCol > bullCol))
534+ then bullCol
535+ else bearCol
536+ let redist = LV(minVol, settledPrice, nextPrice, leverage)
537+ let priceUpGoodForBulls = (assetName == "")
538+ let priceGoesUp = (nextPrice > settledPrice)
539+ let bullsEarn = (priceUpGoodForBulls == priceGoesUp)
540+ let newBullCol = if (bullsEarn)
541+ then (bullCol + redist)
542+ else (bullCol - redist)
543+ let newBearCol = if (bullsEarn)
544+ then (bearCol - redist)
545+ else (bearCol + redist)
546+ let $t01847918677 = poolSupport(newBullCol, newBearCol, bullCirc, bearCirc, poolMain, poolUp, poolDwn, offset)
547+ let updBullCol = $t01847918677._1
548+ let updBearCol = $t01847918677._2
549+ let updBullCirc = $t01847918677._3
550+ let updBearCirc = $t01847918677._4
551+ let updPoolMain = $t01847918677._5
552+ let updPoolUp = $t01847918677._6
553+ let updPoolDwn = $t01847918677._7
554+[IE(BULLCOLK, updBullCol), IE(BEARCOLK, updBearCol), IE(BULLCIRCK, updBullCirc), IE(BEARCIRCK, updBearCirc), IE(POOLUSDNK, updPoolMain), IE(POOLUPK, updPoolUp), IE(POOLDWNK, updPoolDwn), IE(REBIDXK, unsettledPriceIndex)]
555+ }
543556 }
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- }
575557
576558
577559 func calcMax (min,avg) = if ((min > avg))
579561 else ((avg + avg) - min)
580562
581563
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- }
564+@Callable(i)
565+func run (arg) = if ((i.caller != feeAddress))
566+ then throw("only admin can")
567+ else [BooleanEntry("run", arg)]
623568
624-
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- }
651-
652-
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- }
693569
694570
695571 @Callable(i)
700576
701577
702578 @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)
579+func requestRedeemSl (minPayout) = if (validatePMFee(inv, minPayout))
580+ then {
581+ let amt = inv.payments[0].amount
582+ let tokenId = toBase58String(valueOrErrorMessage(inv.payments[0].assetId, "bad token att"))
583+ if (if ((tokenId != BULL))
584+ then (tokenId != BEAR)
585+ else false)
586+ then throw("bad token req")
587+ else {
588+ let $t01996120100 = if ((tokenId == BULL))
589+ then $Tuple2(bullCol, bullCirc)
590+ else if ((tokenId == BEAR))
591+ then $Tuple2(bearCol, bearCirc)
592+ else throw("bad token req")
593+ let col = $t01996120100._1
594+ let circ = $t01996120100._2
595+ let est = fraction(amt, col, circ)
596+ let $t02014820242 = if ((minPayout == 0))
597+ then $Tuple2(0, MAX)
598+ else $Tuple2(minPayout, calcMax(minPayout, est))
599+ let minP = $t02014820242._1
600+ let maxP = $t02014820242._2
601+ if ((inv.caller == this))
602+ then throw("can't do")
603+ else {
604+ let estimated = fraction(col, amt, circ)
605+ if ((minRedeem > estimated))
606+ then throw((("Attached payment too small. Min redeem amount is " + toString((minRedeem / 1000000))) + " USDN"))
607+ else enqueue(toBase58String(inv.transactionId), REDEEM, amt, tokenId, (oraclePriceIndex + 1), toString(inv.caller), minP, maxP)
608+ }
609+ }
610+ }
710611 else throw()
711612
712613
713614
714615 @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)
616+func requestIssueSl (tokenId,minPayout) = if (validatePMFee(inv, minPayout))
617+ then if (!(opn))
618+ then throw("markets closed")
619+ else if (if ((tokenId != BULL))
620+ then (tokenId != BEAR)
621+ else false)
622+ then throw("bad token req")
623+ else if (!(allowed(inv.caller)))
624+ then throw("only whitelisted can do")
625+ else if ((inv.payments[0].assetId != fromBase58String(mainToken)))
626+ then throw("bad token att")
627+ else {
628+ let amt = inv.payments[0].amount
629+ let $t02121121392 = if ((tokenId == BULL))
630+ then $Tuple2(bullCol, bullCirc)
631+ else if ((tokenId == BEAR))
632+ then $Tuple2(bearCol, bearCirc)
633+ else throw("bad token req")
634+ let col = $t02121121392._1
635+ let circ = $t02121121392._2
636+ let est = fraction(amt, circ, col)
637+ let $t02143421528 = if ((minPayout == 0))
638+ then $Tuple2(0, MAX)
639+ else $Tuple2(minPayout, calcMax(minPayout, est))
640+ let minP = $t02143421528._1
641+ let maxP = $t02143421528._2
642+ if ((minIssue > amt))
643+ then throw((("Attached payment too small. Min required: " + toString((minIssue / 1000000))) + " USDN"))
644+ else {
645+ let maxAllowed = maxIssue(tokenId)
646+ if (if ((whitelist == ""))
647+ then (inv.payments[0].amount > maxAllowed)
648+ else false)
649+ then throw((("trying to issue more than pool can handle. Max attachment allowed = " + toString((maxAllowed / 1000000))) + " USDN"))
650+ else enqueue(toBase58String(inv.transactionId), ISSUE, amt, tokenId, (oraclePriceIndex + 1), toString(inv.caller), minP, maxP)
651+ }
652+ }
722653 else throw()
723654
724655
725656
726657 @Callable(inv)
727-func requestPool () = requestPoolInternal(inv, 0)
658+func requestPool () = if (!(allowed(inv.caller)))
659+ then throw("only whitelisted can do")
660+ else {
661+ let pmt = inv.payments[0]
662+ if ((pmt.assetId != fromBase58String(mainToken)))
663+ then throw("USDN required")
664+ else if ((minPool > pmt.amount))
665+ then throw(("pool min: " + toString(minPool)))
666+ else {
667+ let estimate = fraction(poolTokenCirculation, pmt.amount, poolValue)
668+ enqueue(toBase58String(inv.transactionId), POOL, inv.payments[0].amount, "", (oraclePriceIndex + 1), toString(inv.caller), 0, MAX)
669+ }
670+ }
728671
729672
730673
731674 @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()
675+func requestUnpool () = {
676+ let pmt = inv.payments[0]
677+ if ((pmt.assetId != fromBase58String(poolToken)))
678+ then throw("bad token att")
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 enqueue(toBase58String(inv.transactionId), UNPOOL, inv.payments[0].amount, "", (oraclePriceIndex + 1), toString(inv.caller), 0, MAX)
684+ }
685+ }
747686
748687
749688
794733 then true
795734 else hasDeviation((settledPriceIndex + shift)))
796735
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
736+ let $t02492525024 = {
737+ let $list2496925024 = [1, 2, 3, 4, 5, 6, 7]
738+ let $size2496925024 = size($list2496925024)
739+ let $acc02496925024 = $Tuple2(settledPriceIndex, false)
740+ if (($size2496925024 == 0))
741+ then $acc02496925024
803742 else {
804- let $acc12687426929 = f($acc02687426929, $list2687426929[0])
805- if (($size2687426929 == 1))
806- then $acc12687426929
743+ let $acc12496925024 = f($acc02496925024, $list2496925024[0])
744+ if (($size2496925024 == 1))
745+ then $acc12496925024
807746 else {
808- let $acc22687426929 = f($acc12687426929, $list2687426929[1])
809- if (($size2687426929 == 2))
810- then $acc22687426929
747+ let $acc22496925024 = f($acc12496925024, $list2496925024[1])
748+ if (($size2496925024 == 2))
749+ then $acc22496925024
811750 else {
812- let $acc32687426929 = f($acc22687426929, $list2687426929[2])
813- if (($size2687426929 == 3))
814- then $acc32687426929
751+ let $acc32496925024 = f($acc22496925024, $list2496925024[2])
752+ if (($size2496925024 == 3))
753+ then $acc32496925024
815754 else {
816- let $acc42687426929 = f($acc32687426929, $list2687426929[3])
817- if (($size2687426929 == 4))
818- then $acc42687426929
755+ let $acc42496925024 = f($acc32496925024, $list2496925024[3])
756+ if (($size2496925024 == 4))
757+ then $acc42496925024
819758 else {
820- let $acc52687426929 = f($acc42687426929, $list2687426929[4])
821- if (($size2687426929 == 5))
822- then $acc52687426929
759+ let $acc52496925024 = f($acc42496925024, $list2496925024[4])
760+ if (($size2496925024 == 5))
761+ then $acc52496925024
823762 else {
824- let $acc62687426929 = f($acc52687426929, $list2687426929[5])
825- if (($size2687426929 == 6))
826- then $acc62687426929
763+ let $acc62496925024 = f($acc52496925024, $list2496925024[5])
764+ if (($size2496925024 == 6))
765+ then $acc62496925024
827766 else {
828- let $acc72687426929 = f($acc62687426929, $list2687426929[6])
829- if (($size2687426929 == 7))
830- then $acc72687426929
767+ let $acc72496925024 = f($acc62496925024, $list2496925024[6])
768+ if (($size2496925024 == 7))
769+ then $acc72496925024
831770 else {
832- let $acc82687426929 = f($acc72687426929, $list2687426929[7])
771+ let $acc82496925024 = f($acc72496925024, $list2496925024[7])
833772 throw("List size exceed 7")
834773 }
835774 }
840779 }
841780 }
842781 }
843- let okShift = $t02683026929._1
844- let forcedByDeviationOrTimeout = $t02683026929._2
782+ let okShift = $t02492525024._1
783+ let forcedByDeviationOrTimeout = $t02492525024._2
845784 let queueWaits = (oraclePriceIndex >= queuePriceIndex)
846785 if ((settledPriceIndex > queuePriceIndex))
847786 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
98+let running = valueOrElse(getBoolean(this, "run"), true)
99+
98100 let maxDeviation = valueOrElse(getInteger(configProvider, (toString(this) + "_deviationPercentile")), 0)
99101
100102 func lastPriceIndexKey (assetId) = if ((assetId == ""))
101103 then "price_index"
102104 else ("%s%s__idxCurrent__" + assetId)
103105
104106
105107 func priceIndexPrefix (assetId) = if ((assetId == ""))
106108 then "price_index_"
107109 else (("%s%s%d__idx2Height__" + assetId) + "__")
108110
109111
110112 func priceHeightPrefix (assetId) = if ((assetId == ""))
111113 then "price_"
112114 else (("%s%s%d__priceByHeight__" + assetId) + "__")
113115
114116
115117 let minUsdnFee = valueOrElse(getInteger(configProvider, USDNFEEK), 0)
116118
117119 let minWavesFee = valueOrElse(getInteger(configProvider, WAVESFEEK), 0)
118120
119121 let assetName = valueOrElse(getString(this, ASSNAMEK), "")
120122
121123 let bullCol = localI(BULLCOLK, "no 0")
122124
123125 let bearCol = localI(BEARCOLK, "no 1")
124126
125127 let bullCirc = localI(BULLCIRCK, "no 2")
126128
127129 let bearCirc = localI(BEARCIRCK, "no 3")
128130
129131 let BULL = localS(BULLK, "no 14")
130132
131133 let BEAR = localS(BEARK, "no 15")
132134
133135 let mainToken = localS(USDNK, "no 16")
134136
135137 let issuePercentile = confI(ISSPERCK, "no 4")
136138
137139 let redeemPercentile = confI(REDPERCK, "no 5")
138140
139141 let minIssue = confI(MINISSK, "no 6")
140142
141143 let minRedeem = confI(MINREDK, "no 7")
142144
143145 let minPool = confI(MINPOOLK, "no 8")
144146
145147 let rebalancePercentile = valueOrElse(getInteger(configProvider, ((toString(this) + "_") + REBPERCK)), 0)
146148
147149 let whitelist = confS(WLISTK, "no 9")
148150
149151 func allowed (a) = if ((whitelist == ""))
150152 then true
151153 else isDefined(indexOf(whitelist, toString(a)))
152154
153155
154156 let poolMain = localI(POOLUSDNK, "no")
155157
156158 let poolUp = localI(POOLUPK, "no 10")
157159
158160 let poolDwn = localI(POOLDWNK, "no 11")
159161
160162 let poolToken = localS(POOLK, "no 12")
161163
162164 let poolTokenCirculation = localI(POOLCIRCK, "no 13")
163165
164166 let poolBullExposure = fraction(bullCol, poolUp, bullCirc)
165167
166168 let poolBearExposure = fraction(bearCol, poolDwn, bearCirc)
167169
168170 let poolValue = ((poolMain + poolBullExposure) + poolBearExposure)
169171
170172 let oracle = valueOrErrorMessage(addressFromPublicKey(fromBase58String(valueOrErrorMessage(getString(this, oraclePKKey), "no oraclePKKey"))), "bad oracle address")
173+
174+let closeInterval = confI("closeInterval", "no CI")
171175
172176 let settledPriceIndex = valueOrErrorMessage(getInteger(this, REBIDXK), "no last rebalance price")
173177
174178 let oraclePriceIndex = valueOrErrorMessage(getInteger(oracle, lastPriceIndexKey(assetName)), ((("bad oracle data at " + toString(oracle)) + ": no integer at ") + lastPriceIndexKey(assetName)))
175179
176180 let leverage = valueOrElse(getInteger(this, LEVK), 3)
177181
178182 func heightByIndex (priceIndex) = valueOrErrorMessage(getInteger(oracle, (priceIndexPrefix(assetName) + toString(priceIndex))), ("no data at index " + toString(priceIndex)))
179183
180184
181185 func priceByHeight (priceHeight) = valueOrErrorMessage(getInteger(oracle, (priceHeightPrefix(assetName) + toString(priceHeight))), ("no data for height " + toString(priceHeight)))
182186
183187
184188 func priceByIndex (priceIndex) = priceByHeight(heightByIndex(priceIndex))
185189
186190
187191 let queueSize = valueOrElse(getInteger(this, QSIZEK), 0)
188192
189193 let headPointer = valueOrElse(getString(this, HEADK), "")
190194
191195 let tailPointer = valueOrElse(getString(this, TAILK), "")
192196
193197 let feesAccumulated = valueOrElse(getInteger(this, FEEACCK), 0)
194198
195199 let ISSUE = "ISSUE"
196200
197201 let REDEEM = "REDEEM"
198202
199203 let POOL = "POOL"
200204
201205 let UNPOOL = "UNPOOL"
202206
203207 let feeAddrKey = "feeAddress"
204208
205209 let stakingAddrKey = "stakingAddress"
206210
207211 let daemonPubKeyKey = "daemonPublicKey"
208212
209213 let feeAddress = valueOrErrorMessage(addressFromString(confS(feeAddrKey, "no feeAddress")), "bad feeAddress")
210214
211215 let stakingAddress = confS(stakingAddrKey, "no stakingAddress")
212216
213217 let daemonPublicKey = fromBase58String(confS(daemonPubKeyKey, "no daemonPublicKey"))
214218
215219 let rpdAddress = addressFromString("3PNikM6yp4NqcSU8guxQtmR5onr2D4e8yTJ")
216220
217221 let admins = ["2HHqV8W9DJayV5R6tBD2Sb8srphpoboDi7r1t1aPiumC", "5ZXe82RRASU7qshXM2J9JNYhqJ9GWYjjVq2gwUV5Naz9", "5WRXFSjwcTbNfKcJs8ZqXmSSWYsSVJUtMvMqZj5hH4Nc"]
218222
219223 let opn = valueOrElse(getBoolean(oracle, ("%s%s__isMarketOpened__" + assetName)), true)
220224
221225 func buildNewItem (action,amt,token,priceIndex,invoker,minPayout,maxPayout) = (((((((((((((action + "|") + toString(amt)) + "|") + token) + "|") + toString(priceIndex)) + "|") + invoker) + "|") + toString(minPayout)) + "|") + toString(maxPayout)) + "|")
222226
223227
224228 func diffAbs (a1,a2) = {
225229 let diff = (a1 - a2)
226230 if ((diff > 0))
227231 then diff
228232 else (0 - diff)
229233 }
230234
231235
232236 func userDiffAbs () = diffAbs((bullCol - poolBullExposure), (bearCol - poolBearExposure))
233237
234238
235239 func maxIssue (tokenId) = {
236240 let poolInvestment = if ((poolUp > 0))
237241 then BULL
238242 else BEAR
239243 if ((tokenId != poolInvestment))
240244 then poolMain
241245 else (userDiffAbs() + poolValue)
242246 }
243247
244248
245249 func validatePMFee (i,minPayout) = if ((0 > minPayout))
246250 then throw("negative min payout")
247251 else {
248252 let p = i.payments[1]
249253 let ok = match p.assetId {
250254 case bv: ByteVector =>
251255 if ((toBase58String(bv) == mainToken))
252256 then (p.amount >= minUsdnFee)
253257 else false
254258 case waves: Unit =>
255259 (p.amount >= minWavesFee)
256260 case _ =>
257261 throw("Match error")
258262 }
259263 if (!(ok))
260264 then throw("incorrect pacemaker fee")
261265 else true
262266 }
263267
264268
265-func validateRequestRedeem (inv) = if ((inv.caller == this))
266- then throw("can't do")
269+func enqueue (id,action,amt,token,priceIndex,invoker,minPayout,maxPayout) = if (!(running))
270+ then throw("system paused")
267271 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)
272+ let increaseQueueSize = IE(QSIZEK, (queueSize + 1))
273+ let itm = buildNewItem(action, amt, token, priceIndex, invoker, minPayout, maxPayout)
274+ if ((queueSize == 0))
275+ then [SE(HEADK, id), SE(TAILK, id), SE(id, itm), increaseQueueSize]
275276 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
277+ let prevId = localS(TAILK, "can't get tail pointer")
278+ let prevItm = localS(prevId, "can't resolve pointer")
279+ let updatedPrevItm = (prevItm + id)
280+[SE(prevId, updatedPrevItm), SE(id, itm), SE(TAILK, id), increaseQueueSize]
287281 }
288282 }
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- }
303283
304284
305285 func poolSupport (curBullCol0,curBearCol0,curBullCirc0,curBearCirc0,curPoolMain0,curPoolUp0,curPoolDwn0,steps) = {
306286 func closeUp (c1,c2,a0,a1,c0,pu,pd) = {
307287 let diff = (c1 - c2)
308288 let exp = fraction(c1, pu, a0)
309289 let liquidatedTokens = if ((diff > exp))
310290 then pu
311291 else fraction(diff, a0, c1)
312292 let liquidatedValue = if ((diff > exp))
313293 then exp
314294 else fraction(liquidatedTokens, c1, a0)
315295 $Tuple7((c1 - liquidatedValue), c2, (a0 - liquidatedTokens), a1, (c0 + liquidatedValue), (pu - liquidatedTokens), pd)
316296 }
317297
318298 func closeDwn (c1,c2,a0,a1,c0,pu,pd) = {
319299 let diff = (c2 - c1)
320300 let exp = fraction(c2, pd, a1)
321301 let liquidatedTokens = if ((diff > exp))
322302 then pd
323303 else fraction(diff, a1, c2)
324304 let liquidatedValue = if ((diff > exp))
325305 then exp
326306 else fraction(liquidatedTokens, c2, a1)
327307 $Tuple7(c1, (c2 - liquidatedValue), a0, (a1 - liquidatedTokens), (c0 + liquidatedValue), pu, (pd - liquidatedTokens))
328308 }
329309
330310 func openDwn (c1,c2,a0,a1,c0,pu,pd) = {
331311 let diff = (c1 - c2)
332312 let spentPoolValue = if ((c0 > diff))
333313 then diff
334314 else c0
335315 let acquiredTokens = fraction(spentPoolValue, a1, c2)
336316 $Tuple7(c1, (c2 + spentPoolValue), a0, (a1 + acquiredTokens), (c0 - spentPoolValue), pu, (pd + acquiredTokens))
337317 }
338318
339319 func openUp (c1,c2,a0,a1,c0,pu,pd) = {
340320 let diff = (c2 - c1)
341321 let spentPoolValue = if ((c0 > diff))
342322 then diff
343323 else c0
344324 let acquiredTokens = fraction(spentPoolValue, a0, c1)
345325 $Tuple7((c1 + spentPoolValue), c2, (a0 + acquiredTokens), a1, (c0 - spentPoolValue), (pu + acquiredTokens), pd)
346326 }
347327
348- let $t01030211337 = if ((curBullCol0 > curBearCol0))
328+ let $t0927910314 = if ((curBullCol0 > curBearCol0))
349329 then {
350330 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
331+ let $t095059642 = afterCloseUp
332+ let a = $t095059642._1
333+ let b = $t095059642._2
334+ let c = $t095059642._3
335+ let d = $t095059642._4
336+ let e = $t095059642._5
337+ let f = $t095059642._6
338+ let g = $t095059642._7
359339 if ((f > 0))
360340 then afterCloseUp
361341 else if ((f == 0))
362342 then openDwn(a, b, c, d, e, f, g)
363343 else throw("poolUp < 0")
364344 }
365345 else {
366346 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
347+ let $t0999310133 = afterCloseDwn
348+ let a = $t0999310133._1
349+ let b = $t0999310133._2
350+ let c = $t0999310133._3
351+ let d = $t0999310133._4
352+ let e = $t0999310133._5
353+ let f = $t0999310133._6
354+ let g = $t0999310133._7
375355 if ((g > 0))
376356 then afterCloseDwn
377357 else if ((g == 0))
378358 then openUp(a, b, c, d, e, f, g)
379359 else throw("poolDwn < 0")
380360 }
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
361+ let c1 = $t0927910314._1
362+ let c2 = $t0927910314._2
363+ let a0 = $t0927910314._3
364+ let a1 = $t0927910314._4
365+ let c0 = $t0927910314._5
366+ let pu = $t0927910314._6
367+ let pd = $t0927910314._7
388368 let charge = fraction(userDiffAbs(), (rebalancePercentile * steps), ((1440 * 100) * 100))
389369 let c1SplitP = if ((pd > 0))
390370 then charge
391371 else 0
392372 let c2SplitP = if ((pu > 0))
393373 then charge
394374 else 0
395375 $Tuple7((c1 - c1SplitP), (c2 - c2SplitP), a0, a1, ((c0 + c1SplitP) + c2SplitP), pu, pd)
396376 }
397377
398378
399379 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
380+ let $t01073910924 = poolSupport(curBullCol0, curBearCol0, curBullCirc0, curBearCirc0, poolMain, poolUp, poolDwn, 0)
381+ let bullCol1 = $t01073910924._1
382+ let bearCol1 = $t01073910924._2
383+ let bullCic1 = $t01073910924._3
384+ let bearCirc1 = $t01073910924._4
385+ let poolMain1 = $t01073910924._5
386+ let poolUp1 = $t01073910924._6
387+ let poolDwn1 = $t01073910924._7
408388 [IE(BULLCOLK, bullCol1), IE(BULLCIRCK, bullCic1), IE(BEARCOLK, bearCol1), IE(BEARCIRCK, bearCirc1), IE(POOLUSDNK, poolMain1), IE(POOLUPK, poolUp1), IE(POOLDWNK, poolDwn1)]
409389 }
410390
411391
412392 func dequeue () = {
413393 func sp (a,mx) = if ((mx >= a))
414394 then $Tuple2(a, 0)
415395 else $Tuple2(mx, (a - mx))
416396
417397 if ((queueSize == 0))
418398 then throw("nothing to settle")
419399 else {
420400 func collectFee (fees) = IE(FEEACCK, (feesAccumulated + fees))
421401
422402 let decreaseQueueSize = IE(QSIZEK, (queueSize - 1))
423403 let isLastElement = (headPointer == tailPointer)
424404 let overwriteTail = SE(TAILK, "")
425405 let dataStr = localS(headPointer, "bad head pointer(dequeue)")
426406 let data = split(dataStr, "|")
427407 let action = data[0]
428408 let amt = parseIntValue(data[1])
429409 let token = data[2]
430410 let priceIndex = parseIntValue(data[3])
431411 let invoker = addressFromStringValue(data[4])
432412 let minPayout = if ((8 > size(data)))
433413 then 0
434414 else parseIntValue(data[5])
435415 let maxPayout = if ((8 > size(data)))
436416 then MAX
437417 else parseIntValue(data[6])
438418 let next = data[(size(data) - 1)]
439419 func payback (tkn) = [SE(HEADK, next), decreaseQueueSize, ST(invoker, amt, fromBase58String(tkn))]
440420
441421 let items = if ((settledPriceIndex != priceIndex))
442422 then throw(((("corrupt state, settledPriceIndex=" + toString(settledPriceIndex)) + ", request price id=") + toString(priceIndex)))
443423 else if ((action == ISSUE))
444424 then {
445425 let feeSize = fraction(amt, issuePercentile, 10000)
446426 let addedCollateral = (amt - feeSize)
447427 let defaultAddedTokens = if ((token == BULL))
448428 then fraction(bullCirc, addedCollateral, bullCol)
449429 else if ((token == BEAR))
450430 then fraction(bearCirc, addedCollateral, bearCol)
451431 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))
432+ let $t01293613009 = sp(defaultAddedTokens, maxPayout)
433+ let addedToCirculation = $t01293613009._1
434+ let extraTokens = $t01293613009._2
435+ let $t01302613197 = if ((token == BULL))
456436 then $Tuple4(defaultAddedTokens, addedCollateral, 0, 0)
457437 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
438+ let plusBulls = $t01302613197._1
439+ let plusBullCol = $t01302613197._2
440+ let plusBears = $t01302613197._3
441+ let plusBearCol = $t01302613197._4
462442 if ((minPayout > addedToCirculation))
463443 then payback(mainToken)
464444 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))])
465445 }
466446 else if ((action == REDEEM))
467447 then {
468448 let removedTokens = amt
469449 let estimatedPayout = if ((token == BULL))
470450 then fraction(bullCol, removedTokens, bullCirc)
471451 else if ((token == BEAR))
472452 then fraction(bearCol, removedTokens, bearCirc)
473453 else throw("bad token id")
474454 let feeSize = fraction(estimatedPayout, redeemPercentile, 10000)
475455 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))
456+ let $t01426414318 = sp(defaultPayout, maxPayout)
457+ let userPayout = $t01426414318._1
458+ let extra = $t01426414318._2
459+ let $t01433514500 = if ((token == BULL))
480460 then $Tuple4(removedTokens, estimatedPayout, 0, 0)
481461 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
462+ let minusBulls = $t01433514500._1
463+ let minusBullCol = $t01433514500._2
464+ let minusBears = $t01433514500._3
465+ let minusBearCol = $t01433514500._4
486466 if ((minPayout > userPayout))
487467 then payback(token)
488468 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))])
489469 }
490470 else if ((action == POOL))
491471 then {
492472 let issueTokens = fraction(poolTokenCirculation, amt, poolValue)
493473 if ((minPayout > issueTokens))
494474 then payback(mainToken)
495475 else [IE(POOLUSDNK, (poolMain + amt)), IE(POOLCIRCK, (poolTokenCirculation + issueTokens)), SE(HEADK, next), decreaseQueueSize, ST(invoker, issueTokens, fromBase58String(poolToken))]
496476 }
497477 else if ((action == UNPOOL))
498478 then {
499479 func share (a) = fraction(a, amt, poolTokenCirculation)
500480
501481 let unpooledMain = share(poolMain)
502482 let unpooledUp = share(poolUp)
503483 let unpooledDwn = share(poolDwn)
504484 let unpooledUpValue = fraction(unpooledUp, bullCol, bullCirc)
505485 let unpooledDwnValue = fraction(unpooledDwn, bearCol, bearCirc)
506486 let totalUnpooledValue = ((unpooledMain + unpooledUpValue) + unpooledDwnValue)
507487 if ((minPayout > totalUnpooledValue))
508488 then payback(poolToken)
509489 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))]
510490 }
511491 else throw(("bad action: " + action))
512492 if (isLastElement)
513493 then overwriteTail :: items
514494 else items
515495 }
516496 }
517497
518498
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))
499+func rebalance (offset) = if (!(running))
500+ then throw("system paused")
501+ else if ((offset == 0))
502+ then throw("[OK] offset=0")
503+ else {
504+ func LV (v,p0,p1,m) = {
505+ let denom = {
506+ let md = (((2 * (if ((p1 > p0))
507+ then p1
508+ else p0)) * m) / 3037000499)
509+ if ((10 > md))
510+ then 10
511+ else if ((100 > md))
512+ then 100
513+ else 1000
514+ }
515+ let pmax = ((if ((p1 > p0))
525516 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
517+ else p0) / denom)
518+ let pmin = ((if ((p0 > p1))
519+ then p1
520+ else p0) / denom)
521+ let a = (pmin * pmin)
522+ let b = ((((m * m) * pmax) * pmax) - (((((2 * m) * m) - m) * pmax) * pmin))
523+ let ma = ((m * m) - m)
524+ fraction(v, ((ma * a) + b), (((ma + 1) * a) + b))
532525 }
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))
526+
527+ let unsettledPriceIndex = (settledPriceIndex + offset)
528+ if (!(opn))
529+ then [IE(REBIDXK, unsettledPriceIndex)]
530+ else {
531+ let settledPrice = priceByIndex(settledPriceIndex)
532+ let nextPrice = priceByIndex(unsettledPriceIndex)
533+ let minVol = if ((bearCol > bullCol))
534+ then bullCol
535+ else bearCol
536+ let redist = LV(minVol, settledPrice, nextPrice, leverage)
537+ let priceUpGoodForBulls = (assetName == "")
538+ let priceGoesUp = (nextPrice > settledPrice)
539+ let bullsEarn = (priceUpGoodForBulls == priceGoesUp)
540+ let newBullCol = if (bullsEarn)
541+ then (bullCol + redist)
542+ else (bullCol - redist)
543+ let newBearCol = if (bullsEarn)
544+ then (bearCol - redist)
545+ else (bearCol + redist)
546+ let $t01847918677 = poolSupport(newBullCol, newBearCol, bullCirc, bearCirc, poolMain, poolUp, poolDwn, offset)
547+ let updBullCol = $t01847918677._1
548+ let updBearCol = $t01847918677._2
549+ let updBullCirc = $t01847918677._3
550+ let updBearCirc = $t01847918677._4
551+ let updPoolMain = $t01847918677._5
552+ let updPoolUp = $t01847918677._6
553+ let updPoolDwn = $t01847918677._7
554+[IE(BULLCOLK, updBullCol), IE(BEARCOLK, updBearCol), IE(BULLCIRCK, updBullCirc), IE(BEARCIRCK, updBearCirc), IE(POOLUSDNK, updPoolMain), IE(POOLUPK, updPoolUp), IE(POOLDWNK, updPoolDwn), IE(REBIDXK, unsettledPriceIndex)]
555+ }
543556 }
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- }
575557
576558
577559 func calcMax (min,avg) = if ((min > avg))
578560 then throw(((("price too old: minPayout " + toString(min)) + " > avg = ") + toString(avg)))
579561 else ((avg + avg) - min)
580562
581563
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- }
564+@Callable(i)
565+func run (arg) = if ((i.caller != feeAddress))
566+ then throw("only admin can")
567+ else [BooleanEntry("run", arg)]
623568
624-
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- }
651-
652-
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- }
693569
694570
695571 @Callable(i)
696572 func withdrawFee (amount) = if ((amount > feesAccumulated))
697573 then throw(("too much. available: " + toString(feesAccumulated)))
698574 else [IE(FEEACCK, (feesAccumulated - amount)), ST(feeAddress, amount, fromBase58String(mainToken))]
699575
700576
701577
702578 @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)
579+func requestRedeemSl (minPayout) = if (validatePMFee(inv, minPayout))
580+ then {
581+ let amt = inv.payments[0].amount
582+ let tokenId = toBase58String(valueOrErrorMessage(inv.payments[0].assetId, "bad token att"))
583+ if (if ((tokenId != BULL))
584+ then (tokenId != BEAR)
585+ else false)
586+ then throw("bad token req")
587+ else {
588+ let $t01996120100 = if ((tokenId == BULL))
589+ then $Tuple2(bullCol, bullCirc)
590+ else if ((tokenId == BEAR))
591+ then $Tuple2(bearCol, bearCirc)
592+ else throw("bad token req")
593+ let col = $t01996120100._1
594+ let circ = $t01996120100._2
595+ let est = fraction(amt, col, circ)
596+ let $t02014820242 = if ((minPayout == 0))
597+ then $Tuple2(0, MAX)
598+ else $Tuple2(minPayout, calcMax(minPayout, est))
599+ let minP = $t02014820242._1
600+ let maxP = $t02014820242._2
601+ if ((inv.caller == this))
602+ then throw("can't do")
603+ else {
604+ let estimated = fraction(col, amt, circ)
605+ if ((minRedeem > estimated))
606+ then throw((("Attached payment too small. Min redeem amount is " + toString((minRedeem / 1000000))) + " USDN"))
607+ else enqueue(toBase58String(inv.transactionId), REDEEM, amt, tokenId, (oraclePriceIndex + 1), toString(inv.caller), minP, maxP)
608+ }
609+ }
610+ }
710611 else throw()
711612
712613
713614
714615 @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)
616+func requestIssueSl (tokenId,minPayout) = if (validatePMFee(inv, minPayout))
617+ then if (!(opn))
618+ then throw("markets closed")
619+ else if (if ((tokenId != BULL))
620+ then (tokenId != BEAR)
621+ else false)
622+ then throw("bad token req")
623+ else if (!(allowed(inv.caller)))
624+ then throw("only whitelisted can do")
625+ else if ((inv.payments[0].assetId != fromBase58String(mainToken)))
626+ then throw("bad token att")
627+ else {
628+ let amt = inv.payments[0].amount
629+ let $t02121121392 = if ((tokenId == BULL))
630+ then $Tuple2(bullCol, bullCirc)
631+ else if ((tokenId == BEAR))
632+ then $Tuple2(bearCol, bearCirc)
633+ else throw("bad token req")
634+ let col = $t02121121392._1
635+ let circ = $t02121121392._2
636+ let est = fraction(amt, circ, col)
637+ let $t02143421528 = if ((minPayout == 0))
638+ then $Tuple2(0, MAX)
639+ else $Tuple2(minPayout, calcMax(minPayout, est))
640+ let minP = $t02143421528._1
641+ let maxP = $t02143421528._2
642+ if ((minIssue > amt))
643+ then throw((("Attached payment too small. Min required: " + toString((minIssue / 1000000))) + " USDN"))
644+ else {
645+ let maxAllowed = maxIssue(tokenId)
646+ if (if ((whitelist == ""))
647+ then (inv.payments[0].amount > maxAllowed)
648+ else false)
649+ then throw((("trying to issue more than pool can handle. Max attachment allowed = " + toString((maxAllowed / 1000000))) + " USDN"))
650+ else enqueue(toBase58String(inv.transactionId), ISSUE, amt, tokenId, (oraclePriceIndex + 1), toString(inv.caller), minP, maxP)
651+ }
652+ }
722653 else throw()
723654
724655
725656
726657 @Callable(inv)
727-func requestPool () = requestPoolInternal(inv, 0)
658+func requestPool () = if (!(allowed(inv.caller)))
659+ then throw("only whitelisted can do")
660+ else {
661+ let pmt = inv.payments[0]
662+ if ((pmt.assetId != fromBase58String(mainToken)))
663+ then throw("USDN required")
664+ else if ((minPool > pmt.amount))
665+ then throw(("pool min: " + toString(minPool)))
666+ else {
667+ let estimate = fraction(poolTokenCirculation, pmt.amount, poolValue)
668+ enqueue(toBase58String(inv.transactionId), POOL, inv.payments[0].amount, "", (oraclePriceIndex + 1), toString(inv.caller), 0, MAX)
669+ }
670+ }
728671
729672
730673
731674 @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()
675+func requestUnpool () = {
676+ let pmt = inv.payments[0]
677+ if ((pmt.assetId != fromBase58String(poolToken)))
678+ then throw("bad token att")
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 enqueue(toBase58String(inv.transactionId), UNPOOL, inv.payments[0].amount, "", (oraclePriceIndex + 1), toString(inv.caller), 0, MAX)
684+ }
685+ }
747686
748687
749688
750689 @Callable(inv)
751690 func settle () = {
752691 let queueEmpty = (headPointer == "")
753692 let canRebalance = (oraclePriceIndex > settledPriceIndex)
754693 if (queueEmpty)
755694 then if (canRebalance)
756695 then rebalance(1)
757696 else throw("[OK] all done, carry on")
758697 else {
759698 let data = split(valueOrErrorMessage(getString(this, headPointer), ("bad head pointer(settle): " + headPointer)), "|")
760699 let queuePriceIndex = parseIntValue(data[3])
761700 if ((queuePriceIndex > settledPriceIndex))
762701 then if (canRebalance)
763702 then rebalance(1)
764703 else throw("[OK] need to wait")
765704 else if ((queuePriceIndex == settledPriceIndex))
766705 then dequeue()
767706 else throw("future price already rebalanced")
768707 }
769708 }
770709
771710
772711
773712 @Callable(inv)
774713 func settle2 () = {
775714 let queueEmpty = (headPointer == "")
776715 let queuePriceIndex = if (queueEmpty)
777716 then MAX
778717 else {
779718 let data = split(localS(headPointer, "settle2: bad head pointer"), "|")
780719 parseIntValue(data[3])
781720 }
782721 let settledPrice = priceByIndex(settledPriceIndex)
783722 func hasDeviation (priceIndex) = {
784723 let p = priceByIndex(priceIndex)
785724 (fraction(diffAbs(settledPrice, p), 1000000, settledPrice) >= maxDeviation)
786725 }
787726
788727 let maxPossibleShift = (min([queuePriceIndex, oraclePriceIndex]) - settledPriceIndex)
789728 func f (acc,shift) = if (if (acc._2)
790729 then true
791730 else (shift > maxPossibleShift))
792731 then acc
793732 else $Tuple2(shift, if ((shift == 7))
794733 then true
795734 else hasDeviation((settledPriceIndex + shift)))
796735
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
736+ let $t02492525024 = {
737+ let $list2496925024 = [1, 2, 3, 4, 5, 6, 7]
738+ let $size2496925024 = size($list2496925024)
739+ let $acc02496925024 = $Tuple2(settledPriceIndex, false)
740+ if (($size2496925024 == 0))
741+ then $acc02496925024
803742 else {
804- let $acc12687426929 = f($acc02687426929, $list2687426929[0])
805- if (($size2687426929 == 1))
806- then $acc12687426929
743+ let $acc12496925024 = f($acc02496925024, $list2496925024[0])
744+ if (($size2496925024 == 1))
745+ then $acc12496925024
807746 else {
808- let $acc22687426929 = f($acc12687426929, $list2687426929[1])
809- if (($size2687426929 == 2))
810- then $acc22687426929
747+ let $acc22496925024 = f($acc12496925024, $list2496925024[1])
748+ if (($size2496925024 == 2))
749+ then $acc22496925024
811750 else {
812- let $acc32687426929 = f($acc22687426929, $list2687426929[2])
813- if (($size2687426929 == 3))
814- then $acc32687426929
751+ let $acc32496925024 = f($acc22496925024, $list2496925024[2])
752+ if (($size2496925024 == 3))
753+ then $acc32496925024
815754 else {
816- let $acc42687426929 = f($acc32687426929, $list2687426929[3])
817- if (($size2687426929 == 4))
818- then $acc42687426929
755+ let $acc42496925024 = f($acc32496925024, $list2496925024[3])
756+ if (($size2496925024 == 4))
757+ then $acc42496925024
819758 else {
820- let $acc52687426929 = f($acc42687426929, $list2687426929[4])
821- if (($size2687426929 == 5))
822- then $acc52687426929
759+ let $acc52496925024 = f($acc42496925024, $list2496925024[4])
760+ if (($size2496925024 == 5))
761+ then $acc52496925024
823762 else {
824- let $acc62687426929 = f($acc52687426929, $list2687426929[5])
825- if (($size2687426929 == 6))
826- then $acc62687426929
763+ let $acc62496925024 = f($acc52496925024, $list2496925024[5])
764+ if (($size2496925024 == 6))
765+ then $acc62496925024
827766 else {
828- let $acc72687426929 = f($acc62687426929, $list2687426929[6])
829- if (($size2687426929 == 7))
830- then $acc72687426929
767+ let $acc72496925024 = f($acc62496925024, $list2496925024[6])
768+ if (($size2496925024 == 7))
769+ then $acc72496925024
831770 else {
832- let $acc82687426929 = f($acc72687426929, $list2687426929[7])
771+ let $acc82496925024 = f($acc72496925024, $list2496925024[7])
833772 throw("List size exceed 7")
834773 }
835774 }
836775 }
837776 }
838777 }
839778 }
840779 }
841780 }
842781 }
843- let okShift = $t02683026929._1
844- let forcedByDeviationOrTimeout = $t02683026929._2
782+ let okShift = $t02492525024._1
783+ let forcedByDeviationOrTimeout = $t02492525024._2
845784 let queueWaits = (oraclePriceIndex >= queuePriceIndex)
846785 if ((settledPriceIndex > queuePriceIndex))
847786 then throw("settle2: future price already settled/rebalanced")
848787 else if ((settledPriceIndex == queuePriceIndex))
849788 then dequeue()
850789 else if (if ((okShift > 0))
851790 then if (forcedByDeviationOrTimeout)
852791 then true
853792 else queueWaits
854793 else false)
855794 then rebalance(okShift)
856795 else throw(("settle2: [OK] all done, carry on. available shift: " + toString(okShift)))
857796 }
858797
859798
860799 @Verifier(tx)
861800 func verify () = {
862801 let adminAction = ((((if (sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(admins[0])))
863802 then 1
864803 else 0) + (if (sigVerify(tx.bodyBytes, tx.proofs[1], fromBase58String(admins[1])))
865804 then 1
866805 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[2], fromBase58String(admins[2])))
867806 then 1
868807 else 0)) > 1)
869808 let stakingAction = match tx {
870809 case tx: InvokeScriptTransaction =>
871810 let signedCorrectly = sigVerify(tx.bodyBytes, tx.proofs[0], daemonPublicKey)
872811 let feesCorrect = if ((tx.feeAssetId == unit))
873812 then ((1000 * 1000) >= tx.fee)
874813 else false
875814 let dappCorrect = (tx.dApp == rpdAddress)
876815 let unlock = (tx.function == "unlockNeutrino")
877816 let lock = if (if ((tx.function == "lockNeutrinoSP"))
878817 then (tx.args[0] == stakingAddress)
879818 else false)
880819 then (wavesBalance(this).available >= ten8)
881820 else false
882821 let funcCorrect = if (lock)
883822 then true
884823 else unlock
885824 if (if (if (signedCorrectly)
886825 then feesCorrect
887826 else false)
888827 then dappCorrect
889828 else false)
890829 then funcCorrect
891830 else false
892831 case _ =>
893832 false
894833 }
895834 if (adminAction)
896835 then true
897836 else stakingAction
898837 }
899838

github/deemru/w8io/786bc32 
144.89 ms