tx · 3sn8MR2euuMyAJgeDsq8eACSML42mmqfGpHroFojrxSU

3P5sWCrmDJzbHFWU8rQqkJ9LZ46SeByaSJi:  -0.01400000 Waves

2020.11.23 14:07 [2341701] smart account 3P5sWCrmDJzbHFWU8rQqkJ9LZ46SeByaSJi > SELF 0.00000000 Waves

{ "type": 13, "id": "3sn8MR2euuMyAJgeDsq8eACSML42mmqfGpHroFojrxSU", "fee": 1400000, "feeAssetId": null, "timestamp": 1606129563894, "version": 1, "sender": "3P5sWCrmDJzbHFWU8rQqkJ9LZ46SeByaSJi", "senderPublicKey": "73hwsXA1FUh4WArEp9yXsnXK2HszQ4t2QgpmWf3TEsdE", "proofs": [ "5KMxCCcFq8qF68sA2evgWaAPrd4HLETqCZYP2Sf3M6JB5YAEypuFWsnxn2Uj1Y46AxkmcksRPSsJGo4J5hgxdn2D", "59GKZNTMXBrT4AHLWiavqKFKqfGPnnDZHpkYJ6dYRZrDxW4VNFYi9G5keejdjsnyRNCfCqexUzr95wZngLsB6qyj" ], "script": "base64:AAIEAAAAAAAAADgIAhINCgsICAgICAgICAgBARIDCgEBEgASAwoBARIDCgEIEgQKAggBEgASAwoBARIAEgMKAQESAAAAAGwBAAAAAlNFAAAAAgAAAAFrAAAAAXYJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAAWsFAAAAAXYBAAAAAklFAAAAAgAAAAFrAAAAAXYJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAFrBQAAAAF2AQAAAAVkZWJ1ZwAAAAIAAAABawAAAAF2CQEAAAACU0UAAAACCQABLAAAAAICAAAAB19fZGJnX18FAAAAAWsFAAAAAXYAAAAABHRlbjYAAAAAAAAPQkAAAAAABHRlbjgAAAAAAAX14QAAAAAAA01BWAB//////////wAAAAARY29uZmlnUHJvdmlkZXJLZXkCAAAADmNvbmZpZ1Byb3ZpZGVyAAAAAA5jb25maWdQcm92aWRlcgQAAAAHJG1hdGNoMAkABB0AAAACBQAAAAR0aGlzBQAAABFjb25maWdQcm92aWRlcktleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFzBQAAAAckbWF0Y2gwCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABBQAAAAFzBQAAAAR0aGlzAQAAAAZsb2NhbEkAAAACAAAAAWsAAAABZQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAAWsFAAAAAWUBAAAABmxvY2FsUwAAAAIAAAABawAAAAFlCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwUAAAABawUAAAABZQEAAAAFY29uZkkAAAACAAAAAWsAAAABZQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAADmNvbmZpZ1Byb3ZpZGVyBQAAAAFrBQAAAAFlAQAAAAVjb25mUwAAAAIAAAABawAAAAFlCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAOY29uZmlnUHJvdmlkZXIFAAAAAWsFAAAAAWUAAAAABUJVTExLAgAAAAZCVUxMSWQAAAAABUJFQVJLAgAAAAZCRUFSSWQAAAAABVVTRE5LAgAAAAttYWluVG9rZW5JZAAAAAAIQlVMTENPTEsCAAAADmJ1bGxDb2xsYXRlcmFsAAAAAAhCRUFSQ09MSwIAAAAOYmVhckNvbGxhdGVyYWwAAAAACUJVTExDSVJDSwIAAAAPYnVsbENpcmN1bGF0aW9uAAAAAAlCRUFSQ0lSQ0sCAAAAD2JlYXJDaXJjdWxhdGlvbgAAAAAISVNTUEVSQ0sCAAAAD2lzc3VlUGVyY2VudGlsZQAAAAAIUkVEUEVSQ0sCAAAAEHJlZGVlbVBlcmNlbnRpbGUAAAAAB01JTklTU0sCAAAACG1pbklzc3VlAAAAAAdNSU5SRURLAgAAAAltaW5SZWRlZW0AAAAACE1JTlBPT0xLAgAAAAdtaW5Qb29sAAAAAAdGRUVBQ0NLAgAAAA9mZWVzQWNjdW11bGF0ZWQAAAAABldMSVNUSwIAAAAOaXNzdWVXaGl0ZUxpc3QAAAAACFJFQlBFUkNLAgAAABNyZWJhbGFuY2VQZXJjZW50aWxlAAAAAAdSRUJJRFhLAgAAABVsYXN0U2V0dGxlbWVudFByaWNlSWQAAAAABUhFQURLAgAAAAtoZWFkUG9pbnRlcgAAAAAFVEFJTEsCAAAAC3RhaWxQb2ludGVyAAAAAAZRU0laRUsCAAAACXF1ZXVlU2l6ZQAAAAAJUE9PTFVTRE5LAgAAABJwb29sTWFpblRva2VuVmFsdWUAAAAAB1BPT0xVUEsCAAAABnBvb2xVcAAAAAAIUE9PTERXTksCAAAAB3Bvb2xEd24AAAAACVBPT0xDSVJDSwIAAAAUcG9vbFRva2VuQ2lyY3VsYXRpb24AAAAABVBPT0xLAgAAAAlwb29sVG9rZW4AAAAACEFTU05BTUVLAgAAAA1kZWZvQXNzZXROYW1lAAAAAARMRVZLAgAAAAhsZXZlcmFnZQAAAAAJV0FWRVNGRUVLAgAAABF3YXZlc1BhY2VtYWtlckZlZQAAAAAIVVNETkZFRUsCAAAAEHVzZG5QYWNlbWFrZXJGZWUAAAAAC29yYWNsZVBLS2V5AgAAAAZvcmFjbGUBAAAAEWxhc3RQcmljZUluZGV4S2V5AAAAAQAAAAdhc3NldElkAwkAAAAAAAACBQAAAAdhc3NldElkAgAAAAACAAAAC3ByaWNlX2luZGV4CQABLAAAAAICAAAA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bER3bgUAAAAIYmVhckNpcmMAAAAACXBvb2xWYWx1ZQkAAGQAAAACCQAAZAAAAAIFAAAACHBvb2xNYWluBQAAABBwb29sQnVsbEV4cG9zdXJlBQAAABBwb29sQmVhckV4cG9zdXJlAAAAAAZvcmFjbGUJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkBAAAAFGFkZHJlc3NGcm9tUHVibGljS2V5AAAAAQkAAlkAAAABCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwUAAAALb3JhY2xlUEtLZXkCAAAADm5vIG9yYWNsZVBLS2V5AgAAABJiYWQgb3JhY2xlIGFkZHJlc3MAAAAAFHJlYmFsYW5jZWRQcmljZUluZGV4CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAAHUkVCSURYSwIAAAAXbm8gbGFzdCByZWJhbGFuY2UgcHJpY2UAAAAAEG9yYWNsZVByaWNlSW5kZXgJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAZvcmFjbGUJAQAAABFsYXN0UHJpY2VJbmRleEtleQAAAAEFAAAACWFzc2V0TmFtZQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAATYmFkIG9yYWNsZSBkYXRhIGF0IAkABCUAAAABBQAAAAZvcmFjbGUCAAAAEDogbm8gaW50ZWdlciBhdCAJAQAAABFsYXN0UHJpY2VJbmRleEtleQAAAAEFAAAACWFzc2V0TmFtZQAAAAAIbGV2ZXJhZ2UJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAAETEVWSwAAAAAAAAAAAwEAAAANaGVpZ2h0QnlJbmRleAAAAAIAAAAJYXNzZXROYW1lAAAACnByaWNlSW5kZXgJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAZvcmFjbGUJAAEsAAAAAgkBAAAAEHByaWNlSW5kZXhQcmVmaXgAAAABBQAAAAlhc3NldE5hbWUJAAGkAAAAAQUAAAAKcHJpY2VJbmRleAkAASwAAAACAgAAABxubyBkYXRhIGZvciBoZWlnaHQgYXQgaW5kZXggCQABpAAAAAEFAAAACnByaWNlSW5kZXgBAAAADXByaWNlQnlIZWlnaHQAAAACAAAACWFzc2V0TmFtZQAAAAtwcmljZUhlaWdodAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABm9yYWNsZQkAASwAAAACCQEAAAARcHJpY2VIZWlnaHRQcmVmaXgAAAABBQAAAAlhc3NldE5hbWUJAAGkAAAAAQUAAAALcHJpY2VIZWlnaHQJAAEsAAAAAgIAAAATbm8gZGF0YSBmb3IgaGVpZ2h0IAkAAaQAAAABBQAAAAtwcmljZUhlaWdodAEAAAAMcHJpY2VCeUluZGV4AAAAAgAAAAlhc3NldE5hbWUAAAAKcHJpY2VJbmRleAkBAAAADXByaWNlQnlIZWlnaHQAAAACBQAAAAlhc3NldE5hbWUJAQAAAA1oZWlnaHRCeUluZGV4AAAAAgUAAAAJYXNzZXROYW1lBQAAAApwcmljZUluZGV4AAAAAAlxdWV1ZVNpemUJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAAGUVNJWkVLAAAAAAAAAAAAAAAAAAtoZWFkUG9pbnRlcgkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAAAVIRUFESwIAAAAAAAAAAAt0YWlsUG9pbnRlcgkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAAAVUQUlMSwIAAAAAAAAAAA9mZWVzQWNjdW11bGF0ZWQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAAHRkVFQUNDSwAAAAAAAAAAAAAAAAAFSVNTVUUCAAAABUlTU1VFAAAAAAZSRURFRU0CAAAABlJFREVFTQAAAAAEUE9PTAIAAAAEUE9PTAAAAAAGVU5QT09MAgAAAAZVTlBPT0wAAAAACmZlZUFkZHJLZXkCAAAACmZlZUFkZHJlc3MAAAAADnN0YWtpbmdBZGRyS2V5AgAAAA5zdGFraW5nQWRkcmVzcwAAAAAPZGFlbW9uUHViS2V5S2V5AgAAAA9kYWVtb25QdWJsaWNLZXkAAAAACmZlZUFkZHJlc3MJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABCQEAAAAFY29uZlMAAAACBQAAAApmZWVBZGRyS2V5AgAAAA1ubyBmZWVBZGRyZXNzAgAAAA5iYWQgZmVlQWRkcmVzcwAAAAAOc3Rha2luZ0FkZHJlc3MJAQAAAAVjb25mUwAAAAIFAAAADnN0YWtpbmdBZGRyS2V5AgAAABFubyBzdGFraW5nQWRkcmVzcwAAAAAPZGFlbW9uUHVibGljS2V5CQACWQAAAAEJAQAAAAVjb25mUwAAAAIFAAAAD2RhZW1vblB1YktleUtleQIAAAASbm8gZGFlbW9uUHVibGljS2V5AAAAAApycGRBZGRyZXNzCQAEJgAAAAECAAAAIzNQTmlrTTZ5cDROcWNTVThndXhRdG1SNW9ucjJENGU4eVRKAAAAABBwdWJLZXlBZG1pbnNMaXN0CQAETAAAAAICAAAALDJISHFWOFc5REpheVY1UjZ0QkQyU2I4c3JwaHBvYm9EaTdyMXQxYVBpdW1DCQAETAAAAAICAAAALDVaWGU4MlJSQVNVN3FzaFhNMko5Sk5ZaHFKOUdXWWpqVnEyZ3dVVjVOYXo5CQAETAAAAAICAAAALDVXUlhGU2p3Y1RiTmZLY0pzOFpxWG1TU1dZc1NWSlV0TXZNcVpqNWhINE5jBQAAAANuaWwBAAAADGJ1aWxkTmV3SXRlbQAAAAcAAAAGYWN0aW9uAAAAA2FtdAAAAAV0b2tlbgAAAApwcmljZUluZGV4AAAAB2ludm9rZXIAAAAJbWluUGF5b3V0AAAACW1heFBheW91dAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACBQAAAAZhY3Rpb24CAAAAAXwJAAGkAAAAAQUAAAADYW10AgAAAAF8BQAAAAV0b2tlbgIAAAABfAkAAaQAAAABBQAAAApwcmljZUluZGV4AgAAAAF8BQAAAAdpbnZva2VyAgAAAAF8CQABpAAAAAEFAAAACW1pblBheW91dAIAAAABfAkAAaQAAAABBQAAAAltYXhQYXlvdXQCAAAAAXwBAAAAC3VzZXJEaWZmQWJzAAAA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AAAAAAAAAQQAAAAMc2V0dGxlZFByaWNlCQEAAAAMcHJpY2VCeUluZGV4AAAAAgUAAAAJYXNzZXROYW1lBQAAABFzZXR0bGVkUHJpY2VJbmRleAQAAAAJbmV4dFByaWNlCQEAAAAMcHJpY2VCeUluZGV4AAAAAgUAAAAJYXNzZXROYW1lBQAAABN1bnNldHRsZWRQcmljZUluZGV4BAAAAAZtaW5Wb2wDCQAAZgAAAAIFAAAAB2JlYXJDb2wFAAAAB2J1bGxDb2wFAAAAB2J1bGxDb2wFAAAAB2JlYXJDb2wEAAAABnJlZGlzdAkBAAAAAkxWAAAABAUAAAAGbWluVm9sBQAAAAxzZXR0bGVkUHJpY2UFAAAACW5leHRQcmljZQUAAAAIbGV2ZXJhZ2UEAAAAE3ByaWNlVXBHb29kRm9yQnVsbHMDCQAAZgAAAAIFAAAACW5leHRQcmljZQUAAAAMc2V0dGxlZFByaWNlCQAAAAAAAAIFAAAACWFzc2V0TmFtZQIAAAAABwQAAAAKbmV3QnVsbENvbAMFAAAAE3ByaWNlVXBHb29kRm9yQnVsbHMJAABkAAAAAgUAAAAHYnVsbENvbAUAAAAGcmVkaXN0CQAAZQAAAAIFAAAAB2J1bGxDb2wFAAAABnJlZGlzdAQAAAAKbmV3QmVhckNvbAMFAAAAE3ByaWNlVXBHb29kRm9yQnVsbHMJAABlAAAAAgUAAAAHYmVhckNvbAUAAAAGcmVkaXN0CQAAZAAAAAIFAAAAB2JlYXJDb2wFAAAABnJlZGlzdAQAAAANJHQwMTk0NTMxOTYzOQkBAAAAC3Bvb2xTdXBwb3J0AAAABwUAAAAKbmV3QnVsbENvbAUAAAAKbmV3QmVhckNvbAUAAAAIYnVsbENpcmMFAAAACGJlYXJDaXJjBQAAAAhwb29sTWFpbgUAAAAGcG9vbFVwBQAAAAdwb29sRHduBAAAAAp1cGRCdWxsQ29sCAUAAAANJHQwMTk0NTMxOTYzOQAAAAJfMQQAAAAKdXBkQmVhckNvbAgFAAAADSR0MDE5NDUzMTk2MzkAAAACXzIEAAAAC3VwZEJ1bGxDaXJjCAUAAAANJHQwMTk0NTMxOTYzOQAAAAJfMwQAAAALdXBkQmVhckNpcmMIBQAAAA0kdDAxOTQ1MzE5NjM5AAAAAl80BAAAAAt1cGRQ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CQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAkAAlkAAAABCQABkQAAAAIFAAAAEHB1YktleUFkbWluc0xpc3QAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAADCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAQkAAlkAAAABCQABkQAAAAIFAAAAEHB1YktleUFkbWluc0xpc3QAAAAAAAAAAAEAAAAAAAAAAAEAAAAAAAAAAAADCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAgkAAlkAAAABCQABkQAAAAIFAAAAEHB1YktleUFkbWluc0xpc3QAAAAAAAAAAAIAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAEEAAAADXN0YWtpbmdBY3Rpb24EAAAAByRtYXRjaDAFAAAAAnR4AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABdJbnZva2VTY3JpcHRUcmFuc2FjdGlvbgQAAAACdHgFAAAAByRtYXRjaDAEAAAAD3NpZ25lZENvcnJlY3RseQkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAFAAAAD2RhZW1vblB1YmxpY0tleQQAAAALZmVlc0NvcnJlY3QDCQAAAAAAAAIIBQAAAAJ0eAAAAApmZWVBc3NldElkBQAAAAR1bml0CQAAZwAAAAIJAABoAAAAAgAAAAAAAAAD6AAAAAAAAAAD6AgFAAAAAnR4AAAAA2ZlZQcEAAAAC2RhcHBDb3JyZWN0CQAAAAAAAAIIBQAAAAJ0eAAAAARkQXBwBQAAAApycGRBZGRyZXNzBAAAAAZ1bmxvY2sJAAAAAAAAAggFAAAAAnR4AAAACGZ1bmN0aW9uAgAAAA51bmxvY2tOZXV0cmlubwQAAAAEbG9jawMDCQAAAAAAAAIIBQAAAAJ0eAAAAAhmdW5jdGlvbgIAAAAObG9ja05ldXRyaW5vU1AJAAAAAAAAAgkAAZEAAAACCAUAAAACdHgAAAAEYXJncwAAAAAAAAAAAAUAAAAOc3Rha2luZ0FkZHJlc3MHCQAAZwAAAAIICQAD7wAAAAEFAAAABHRoaXMAAAAJYXZhaWxhYmxlBQAAAAR0ZW44BwQAAAALZnVuY0NvcnJlY3QDBQAAAARsb2NrBgUAAAAGdW5sb2NrAwMDBQAAAA9zaWduZWRDb3JyZWN0bHkFAAAAC2ZlZXNDb3JyZWN0BwUAAAALZGFwcENvcnJlY3QHBQAAAAtmdW5jQ29ycmVjdAcHAwMFAAAAB2luaXRpYWwGBQAAAAthZG1pbkFjdGlvbgYFAAAADXN0YWtpbmdBY3Rpb27RMnx4", "chainId": 87, "height": 2341701, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: HFbCnkkADfoAHVwWvKSo27WCVEYyf1zbCwWekEi7cwAc Next: HN22Czd6dtfoFSgEq4EKmzcGe42SiSxN7KdaN1GwEL2X Diff:
OldNewDifferences
140140
141141 let minPool = confI(MINPOOLK, "no 8")
142142
143-let rebalancePercentile = valueOrElse(getInteger(configProvider, REBPERCK), 0)
143+let rebalancePercentile = valueOrElse(getInteger(configProvider, ((toString(this) + "_") + REBPERCK)), 0)
144144
145145 let whitelist = confS(WLISTK, "no 9")
146146
218218
219219
220220 func userDiffAbs () = {
221- let $t056935782 = $Tuple2((bullCol - poolBullExposure), (bearCol - poolBearExposure))
222- let userBullCol = $t056935782._1
223- let userBearCol = $t056935782._2
221+ let $t057175806 = $Tuple2((bullCol - poolBullExposure), (bearCol - poolBearExposure))
222+ let userBullCol = $t057175806._1
223+ let userBearCol = $t057175806._2
224224 let diff = (userBullCol - userBearCol)
225225 if ((diff > 0))
226226 then diff
341341 $Tuple7((c1 + spentPoolValue), c2, (a0 + acquiredTokens), a1, (c0 - spentPoolValue), (pu + acquiredTokens), pd)
342342 }
343343
344- let $t01019111226 = if ((curBullCol0 > curBearCol0))
344+ let $t01021511250 = if ((curBullCol0 > curBearCol0))
345345 then {
346346 let afterCloseUp = closeUp(curBullCol0, curBearCol0, curBullCirc0, curBearCirc0, curPoolMain0, curPoolUp0, curPoolDwn0)
347- let $t01041710554 = afterCloseUp
348- let a = $t01041710554._1
349- let b = $t01041710554._2
350- let c = $t01041710554._3
351- let d = $t01041710554._4
352- let e = $t01041710554._5
353- let f = $t01041710554._6
354- let g = $t01041710554._7
347+ let $t01044110578 = afterCloseUp
348+ let a = $t01044110578._1
349+ let b = $t01044110578._2
350+ let c = $t01044110578._3
351+ let d = $t01044110578._4
352+ let e = $t01044110578._5
353+ let f = $t01044110578._6
354+ let g = $t01044110578._7
355355 if ((f > 0))
356356 then afterCloseUp
357357 else if ((f == 0))
360360 }
361361 else {
362362 let afterCloseDwn = closeDwn(curBullCol0, curBearCol0, curBullCirc0, curBearCirc0, curPoolMain0, curPoolUp0, curPoolDwn0)
363- let $t01090511045 = afterCloseDwn
364- let a = $t01090511045._1
365- let b = $t01090511045._2
366- let c = $t01090511045._3
367- let d = $t01090511045._4
368- let e = $t01090511045._5
369- let f = $t01090511045._6
370- let g = $t01090511045._7
363+ let $t01092911069 = afterCloseDwn
364+ let a = $t01092911069._1
365+ let b = $t01092911069._2
366+ let c = $t01092911069._3
367+ let d = $t01092911069._4
368+ let e = $t01092911069._5
369+ let f = $t01092911069._6
370+ let g = $t01092911069._7
371371 if ((g > 0))
372372 then afterCloseDwn
373373 else if ((g == 0))
374374 then openUp(a, b, c, d, e, f, g)
375375 else throw("poolDwn < 0")
376376 }
377- let c1 = $t01019111226._1
378- let c2 = $t01019111226._2
379- let a0 = $t01019111226._3
380- let a1 = $t01019111226._4
381- let c0 = $t01019111226._5
382- let pu = $t01019111226._6
383- let pd = $t01019111226._7
377+ let c1 = $t01021511250._1
378+ let c2 = $t01021511250._2
379+ let a0 = $t01021511250._3
380+ let a1 = $t01021511250._4
381+ let c0 = $t01021511250._5
382+ let pu = $t01021511250._6
383+ let pd = $t01021511250._7
384384 let charge = fraction(userDiffAbs(), rebalancePercentile, ((1440 * 100) * 100))
385385 let percentileActivated = (height >= valueOrElse(getInteger(configProvider, "percentileActivationHeight"), 10000000))
386386 let c1SplitP = if (if (percentileActivated)
398398
399399
400400 func poolSup (curBullCol0,curBearCol0,curBullCirc0,curBearCirc0) = {
401- let $t01180711989 = poolSupport(curBullCol0, curBearCol0, curBullCirc0, curBearCirc0, poolMain, poolUp, poolDwn)
402- let bullCol1 = $t01180711989._1
403- let bearCol1 = $t01180711989._2
404- let bullCic1 = $t01180711989._3
405- let bearCirc1 = $t01180711989._4
406- let poolMain1 = $t01180711989._5
407- let poolUp1 = $t01180711989._6
408- let poolDwn1 = $t01180711989._7
401+ let $t01183112013 = poolSupport(curBullCol0, curBearCol0, curBullCirc0, curBearCirc0, poolMain, poolUp, poolDwn)
402+ let bullCol1 = $t01183112013._1
403+ let bearCol1 = $t01183112013._2
404+ let bullCic1 = $t01183112013._3
405+ let bearCirc1 = $t01183112013._4
406+ let poolMain1 = $t01183112013._5
407+ let poolUp1 = $t01183112013._6
408+ let poolDwn1 = $t01183112013._7
409409 [IE(BULLCOLK, bullCol1), IE(BULLCIRCK, bullCic1), IE(BEARCOLK, bearCol1), IE(BEARCIRCK, bearCirc1), IE(POOLUSDNK, poolMain1), IE(POOLUPK, poolUp1), IE(POOLDWNK, poolDwn1)]
410410 }
411411
452452 else if ((token == BEAR))
453453 then fraction(bearCirc, addedCollateral, bearCol)
454454 else throw("bad token id")
455- let $t01411514171 = sp(a, maxPayout)
456- let addedToCirculation = $t01411514171._1
457- let extraTokens = $t01411514171._2
458- let $t01418814359 = if ((token == BULL))
455+ let $t01413914195 = sp(a, maxPayout)
456+ let addedToCirculation = $t01413914195._1
457+ let extraTokens = $t01413914195._2
458+ let $t01421214383 = if ((token == BULL))
459459 then $Tuple4(addedToCirculation, addedCollateral, 0, 0)
460460 else $Tuple4(0, 0, addedToCirculation, addedCollateral)
461- let plusBulls = $t01418814359._1
462- let plusBullCol = $t01418814359._2
463- let plusBears = $t01418814359._3
464- let plusBearCol = $t01418814359._4
461+ let plusBulls = $t01421214383._1
462+ let plusBullCol = $t01421214383._2
463+ let plusBears = $t01421214383._3
464+ let plusBearCol = $t01421214383._4
465465 if ((minPayout > addedToCirculation))
466466 then payback(mainToken)
467467 else (poolSup((bullCol + plusBullCol), (bearCol + plusBearCol), (bullCirc + plusBulls), (bearCirc + plusBears)) ++ [SE(HEADK, next), collectFee(feeSize), decreaseQueueSize, ScriptTransfer(invoker, addedToCirculation, fromBase58String(token)), ScriptTransfer(feeAddress, extraTokens, fromBase58String(token))])
474474 else if ((token == BEAR))
475475 then fraction(bearCol, removedTokens, bearCirc)
476476 else throw("bad token id")
477- let $t01529815347 = sp(calcPo, maxPayout)
478- let payoutCapped = $t01529815347._1
479- let extra = $t01529815347._2
477+ let $t01532215371 = sp(calcPo, maxPayout)
478+ let payoutCapped = $t01532215371._1
479+ let extra = $t01532215371._2
480480 let feeSize = fraction(payoutCapped, redeemPercentile, 10000)
481481 let payout = if ((payoutCapped > feeSize))
482482 then (payoutCapped - feeSize)
483483 else 0
484- let $t01553315692 = if ((token == BULL))
484+ let $t01555715716 = if ((token == BULL))
485485 then $Tuple4(removedTokens, payoutCapped, 0, 0)
486486 else $Tuple4(0, 0, removedTokens, payoutCapped)
487- let minusBulls = $t01553315692._1
488- let minusBullCol = $t01553315692._2
489- let minusBears = $t01553315692._3
490- let minusBearCol = $t01553315692._4
487+ let minusBulls = $t01555715716._1
488+ let minusBullCol = $t01555715716._2
489+ let minusBears = $t01555715716._3
490+ let minusBearCol = $t01555715716._4
491491 if ((minPayout > payout))
492492 then payback(token)
493493 else (poolSup((bullCol - minusBullCol), (bearCol - minusBearCol), (bullCirc - minusBulls), (bearCirc - minusBears)) ++ [SE(HEADK, next), collectFee(feeSize), decreaseQueueSize, ScriptTransfer(invoker, payout, fromBase58String(mainToken)), ScriptTransfer(feeAddress, extra, fromBase58String(mainToken))])
553553 let newBearCol = if (priceUpGoodForBulls)
554554 then (bearCol - redist)
555555 else (bearCol + redist)
556- let $t01942919615 = poolSupport(newBullCol, newBearCol, bullCirc, bearCirc, poolMain, poolUp, poolDwn)
557- let updBullCol = $t01942919615._1
558- let updBearCol = $t01942919615._2
559- let updBullCirc = $t01942919615._3
560- let updBearCirc = $t01942919615._4
561- let updPoolMain = $t01942919615._5
562- let updPoolUp = $t01942919615._6
563- let updPoolDwn = $t01942919615._7
556+ let $t01945319639 = poolSupport(newBullCol, newBearCol, bullCirc, bearCirc, poolMain, poolUp, poolDwn)
557+ let updBullCol = $t01945319639._1
558+ let updBearCol = $t01945319639._2
559+ let updBullCirc = $t01945319639._3
560+ let updBearCirc = $t01945319639._4
561+ let updPoolMain = $t01945319639._5
562+ let updPoolUp = $t01945319639._6
563+ let updPoolDwn = $t01945319639._7
564564 [IE(BULLCOLK, updBullCol), IE(BEARCOLK, updBearCol), IE(BULLCIRCK, updBullCirc), IE(BEARCIRCK, updBearCirc), IE(POOLUSDNK, updPoolMain), IE(POOLUPK, updPoolUp), IE(POOLDWNK, updPoolDwn), IE(REBIDXK, unsettledPriceIndex)]
565565 }
566566
584584 then throw("bad token att")
585585 else {
586586 let amt = inv.payments[0].amount
587- let $t02062120799 = if ((tokenId == BULL))
587+ let $t02064520823 = if ((tokenId == BULL))
588588 then $Tuple2(bullCol, bullCirc)
589589 else if ((tokenId == BEAR))
590590 then $Tuple2(bearCol, bearCirc)
591591 else throw(errorMessage)
592- let col = $t02062120799._1
593- let circ = $t02062120799._2
592+ let col = $t02064520823._1
593+ let circ = $t02064520823._2
594594 let est = fraction(amt, circ, col)
595- let $t02084120935 = if ((minPayout == 0))
595+ let $t02086520959 = if ((minPayout == 0))
596596 then $Tuple2(0, MAX)
597597 else $Tuple2(minPayout, calcMax(minPayout, est))
598- let minP = $t02084120935._1
599- let maxP = $t02084120935._2
598+ let minP = $t02086520959._1
599+ let maxP = $t02086520959._2
600600 if ((minIssue > amt))
601601 then throw((("Attached payment too small. Min required: " + toString((minIssue / 1000000))) + " USDN"))
602602 else {
619619 else false)
620620 then throw("bad token req")
621621 else {
622- let $t02197222111 = if ((tokenId == BULL))
622+ let $t02199622135 = if ((tokenId == BULL))
623623 then $Tuple2(bullCol, bullCirc)
624624 else if ((tokenId == BEAR))
625625 then $Tuple2(bearCol, bearCirc)
626626 else throw("bad token req")
627- let col = $t02197222111._1
628- let circ = $t02197222111._2
627+ let col = $t02199622135._1
628+ let circ = $t02199622135._2
629629 let est = fraction(amt, col, circ)
630- let $t02215922253 = if ((minPayout == 0))
630+ let $t02218322277 = if ((minPayout == 0))
631631 then $Tuple2(0, MAX)
632632 else $Tuple2(minPayout, calcMax(minPayout, est))
633- let minP = $t02215922253._1
634- let maxP = $t02215922253._2
633+ let minP = $t02218322277._1
634+ let maxP = $t02218322277._2
635635 if ((validateRequestRedeem(inv) == unit))
636636 then enqueue(toBase58String(inv.transactionId), REDEEM, amt, tokenId, (oraclePriceIndex + 1), toString(inv.caller), minP, maxP)
637637 else throw("doesn't happen")
650650 then throw(((("pool at least " + toString(minPool)) + " ") + mainToken))
651651 else {
652652 let estimate = fraction(poolTokenCirculation, pmt.amount, poolValue)
653- let $t02310123200 = if ((minPayout == 0))
653+ let $t02312523224 = if ((minPayout == 0))
654654 then $Tuple2(0, MAX)
655655 else $Tuple2(minPayout, calcMax(minPayout, estimate))
656- let minP = $t02310123200._1
657- let maxP = $t02310123200._2
656+ let minP = $t02312523224._1
657+ let maxP = $t02312523224._2
658658 enqueue(toBase58String(inv.transactionId), POOL, inv.payments[0].amount, "", (oraclePriceIndex + 1), toString(inv.caller), minP, maxP)
659659 }
660660 }
670670 if ((minPool > estimate))
671671 then throw(((("unpool at least for" + toString(minPool)) + " ") + mainToken))
672672 else {
673- let $t02385723956 = if ((minPayout == 0))
673+ let $t02388123980 = if ((minPayout == 0))
674674 then $Tuple2(0, MAX)
675675 else $Tuple2(minPayout, calcMax(minPayout, estimate))
676- let minP = $t02385723956._1
677- let maxP = $t02385723956._2
676+ let minP = $t02388123980._1
677+ let maxP = $t02388123980._2
678678 enqueue(toBase58String(inv.transactionId), UNPOOL, inv.payments[0].amount, "", (oraclePriceIndex + 1), toString(inv.caller), minP, maxP)
679679 }
680680 }
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 debug (k,v) = SE(("__dbg__" + k), v)
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 func lastPriceIndexKey (assetId) = if ((assetId == ""))
9999 then "price_index"
100100 else ("%s%s__idxCurrent__" + assetId)
101101
102102
103103 func priceIndexPrefix (assetId) = if ((assetId == ""))
104104 then "price_index_"
105105 else (("%s%s%d__idx2Height__" + assetId) + "__")
106106
107107
108108 func priceHeightPrefix (assetId) = if ((assetId == ""))
109109 then "price_"
110110 else (("%s%s%d__priceByHeight__" + assetId) + "__")
111111
112112
113113 let minUsdnFee = valueOrElse(getInteger(configProvider, USDNFEEK), 0)
114114
115115 let minWavesFee = valueOrElse(getInteger(configProvider, WAVESFEEK), 0)
116116
117117 let assetName = localS(ASSNAMEK, "")
118118
119119 let bullCol = localI(BULLCOLK, "no 0")
120120
121121 let bearCol = localI(BEARCOLK, "no 1")
122122
123123 let bullCirc = localI(BULLCIRCK, "no 2")
124124
125125 let bearCirc = localI(BEARCIRCK, "no 3")
126126
127127 let BULL = localS(BULLK, "no 14")
128128
129129 let BEAR = localS(BEARK, "no 15")
130130
131131 let mainToken = localS(USDNK, "no 16")
132132
133133 let issuePercentile = confI(ISSPERCK, "no 4")
134134
135135 let redeemPercentile = confI(REDPERCK, "no 5")
136136
137137 let minIssue = confI(MINISSK, "no 6")
138138
139139 let minRedeem = confI(MINREDK, "no 7")
140140
141141 let minPool = confI(MINPOOLK, "no 8")
142142
143-let rebalancePercentile = valueOrElse(getInteger(configProvider, REBPERCK), 0)
143+let rebalancePercentile = valueOrElse(getInteger(configProvider, ((toString(this) + "_") + REBPERCK)), 0)
144144
145145 let whitelist = confS(WLISTK, "no 9")
146146
147147 func allowed (a) = if ((whitelist == ""))
148148 then true
149149 else isDefined(indexOf(whitelist, toString(a)))
150150
151151
152152 let poolMain = localI(POOLUSDNK, "no")
153153
154154 let poolUp = localI(POOLUPK, "no 10")
155155
156156 let poolDwn = localI(POOLDWNK, "no 11")
157157
158158 let poolToken = localS(POOLK, "no 12")
159159
160160 let poolTokenCirculation = localI(POOLCIRCK, "no 13")
161161
162162 let poolBullExposure = fraction(bullCol, poolUp, bullCirc)
163163
164164 let poolBearExposure = fraction(bearCol, poolDwn, bearCirc)
165165
166166 let poolValue = ((poolMain + poolBullExposure) + poolBearExposure)
167167
168168 let oracle = valueOrErrorMessage(addressFromPublicKey(fromBase58String(valueOrErrorMessage(getString(this, oraclePKKey), "no oraclePKKey"))), "bad oracle address")
169169
170170 let rebalancedPriceIndex = valueOrErrorMessage(getInteger(this, REBIDXK), "no last rebalance price")
171171
172172 let oraclePriceIndex = valueOrErrorMessage(getInteger(oracle, lastPriceIndexKey(assetName)), ((("bad oracle data at " + toString(oracle)) + ": no integer at ") + lastPriceIndexKey(assetName)))
173173
174174 let leverage = valueOrElse(getInteger(this, LEVK), 3)
175175
176176 func heightByIndex (assetName,priceIndex) = valueOrErrorMessage(getInteger(oracle, (priceIndexPrefix(assetName) + toString(priceIndex))), ("no data for height at index " + toString(priceIndex)))
177177
178178
179179 func priceByHeight (assetName,priceHeight) = valueOrErrorMessage(getInteger(oracle, (priceHeightPrefix(assetName) + toString(priceHeight))), ("no data for height " + toString(priceHeight)))
180180
181181
182182 func priceByIndex (assetName,priceIndex) = priceByHeight(assetName, heightByIndex(assetName, priceIndex))
183183
184184
185185 let queueSize = valueOrElse(getInteger(this, QSIZEK), 0)
186186
187187 let headPointer = valueOrElse(getString(this, HEADK), "")
188188
189189 let tailPointer = valueOrElse(getString(this, TAILK), "")
190190
191191 let feesAccumulated = valueOrElse(getInteger(this, FEEACCK), 0)
192192
193193 let ISSUE = "ISSUE"
194194
195195 let REDEEM = "REDEEM"
196196
197197 let POOL = "POOL"
198198
199199 let UNPOOL = "UNPOOL"
200200
201201 let feeAddrKey = "feeAddress"
202202
203203 let stakingAddrKey = "stakingAddress"
204204
205205 let daemonPubKeyKey = "daemonPublicKey"
206206
207207 let feeAddress = valueOrErrorMessage(addressFromString(confS(feeAddrKey, "no feeAddress")), "bad feeAddress")
208208
209209 let stakingAddress = confS(stakingAddrKey, "no stakingAddress")
210210
211211 let daemonPublicKey = fromBase58String(confS(daemonPubKeyKey, "no daemonPublicKey"))
212212
213213 let rpdAddress = addressFromString("3PNikM6yp4NqcSU8guxQtmR5onr2D4e8yTJ")
214214
215215 let pubKeyAdminsList = ["2HHqV8W9DJayV5R6tBD2Sb8srphpoboDi7r1t1aPiumC", "5ZXe82RRASU7qshXM2J9JNYhqJ9GWYjjVq2gwUV5Naz9", "5WRXFSjwcTbNfKcJs8ZqXmSSWYsSVJUtMvMqZj5hH4Nc"]
216216
217217 func buildNewItem (action,amt,token,priceIndex,invoker,minPayout,maxPayout) = (((((((((((((action + "|") + toString(amt)) + "|") + token) + "|") + toString(priceIndex)) + "|") + invoker) + "|") + toString(minPayout)) + "|") + toString(maxPayout)) + "|")
218218
219219
220220 func userDiffAbs () = {
221- let $t056935782 = $Tuple2((bullCol - poolBullExposure), (bearCol - poolBearExposure))
222- let userBullCol = $t056935782._1
223- let userBearCol = $t056935782._2
221+ let $t057175806 = $Tuple2((bullCol - poolBullExposure), (bearCol - poolBearExposure))
222+ let userBullCol = $t057175806._1
223+ let userBearCol = $t057175806._2
224224 let diff = (userBullCol - userBearCol)
225225 if ((diff > 0))
226226 then diff
227227 else (0 - diff)
228228 }
229229
230230
231231 func maxIssue (tokenId) = {
232232 let poolInvestment = if ((poolUp > 0))
233233 then BULL
234234 else BEAR
235235 if ((tokenId != poolInvestment))
236236 then poolMain
237237 else (userDiffAbs() + poolValue)
238238 }
239239
240240
241241 func validatePMFee (i,minPayout) = if ((0 > minPayout))
242242 then throw("negative min payout")
243243 else {
244244 let p = i.payments[1]
245245 let ok = match p.assetId {
246246 case bv: ByteVector =>
247247 if ((toBase58String(bv) == mainToken))
248248 then (p.amount >= minUsdnFee)
249249 else false
250250 case waves: Unit =>
251251 (p.amount >= minWavesFee)
252252 case _ =>
253253 throw("Match error")
254254 }
255255 if (!(ok))
256256 then throw("incorrect pacemaker fee")
257257 else true
258258 }
259259
260260
261261 func validateRequestRedeem (inv) = if ((inv.caller == this))
262262 then throw("can't do")
263263 else {
264264 func errorMessage (got) = throw(((((("bad token att: only BULL(" + BULL) + ") or BEAR(") + BEAR) + ") tokens are accepted, received: ") + got))
265265
266266 let assetId = toBase58String(valueOrErrorMessage(value(inv.payments[0]).assetId, "bad token att"))
267267 if (if ((assetId != BEAR))
268268 then (assetId != BULL)
269269 else false)
270270 then errorMessage(assetId)
271271 else {
272272 let attachedAmount = inv.payments[0].amount
273273 let col = if ((assetId == BEAR))
274274 then bearCol
275275 else bullCol
276276 let circ = if ((assetId == BEAR))
277277 then bearCirc
278278 else bullCirc
279279 let estimated = fraction(col, attachedAmount, circ)
280280 if ((minRedeem > estimated))
281281 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)))
282282 else unit
283283 }
284284 }
285285
286286
287287 func enqueue (id,action,amt,token,priceIndex,invoker,minPayout,maxPayout) = {
288288 let increaseQueueSize = IE(QSIZEK, (queueSize + 1))
289289 let itm = buildNewItem(action, amt, token, priceIndex, invoker, minPayout, maxPayout)
290290 if ((queueSize == 0))
291291 then [SE(HEADK, id), SE(TAILK, id), SE(id, itm), increaseQueueSize]
292292 else {
293293 let prevId = localS(TAILK, "can't get tail pointer")
294294 let prevItm = localS(prevId, "can't resolve pointer")
295295 let updatedPrevItm = (prevItm + id)
296296 [SE(prevId, updatedPrevItm), SE(id, itm), SE(TAILK, id), increaseQueueSize]
297297 }
298298 }
299299
300300
301301 func poolSupport (curBullCol0,curBearCol0,curBullCirc0,curBearCirc0,curPoolMain0,curPoolUp0,curPoolDwn0) = {
302302 func closeUp (c1,c2,a0,a1,c0,pu,pd) = {
303303 let diff = (c1 - c2)
304304 let exposure = fraction(c1, pu, a0)
305305 let liquidatedTokens = if ((diff > exposure))
306306 then pu
307307 else fraction(diff, a0, c1)
308308 let liquidatedValue = if ((diff > exposure))
309309 then exposure
310310 else fraction(liquidatedTokens, c1, a0)
311311 $Tuple7((c1 - liquidatedValue), c2, (a0 - liquidatedTokens), a1, (c0 + liquidatedValue), (pu - liquidatedTokens), pd)
312312 }
313313
314314 func closeDwn (c1,c2,a0,a1,c0,pu,pd) = {
315315 let diff = (c2 - c1)
316316 let exposure = fraction(c2, pd, a1)
317317 let liquidatedTokens = if ((diff > exposure))
318318 then pd
319319 else fraction(diff, a1, c2)
320320 let liquidatedValue = if ((diff > exposure))
321321 then exposure
322322 else fraction(liquidatedTokens, c2, a1)
323323 $Tuple7(c1, (c2 - liquidatedValue), a0, (a1 - liquidatedTokens), (c0 + liquidatedValue), pu, (pd - liquidatedTokens))
324324 }
325325
326326 func openDwn (c1,c2,a0,a1,c0,pu,pd) = {
327327 let diff = (c1 - c2)
328328 let spentPoolValue = if ((c0 > diff))
329329 then diff
330330 else c0
331331 let acquiredTokens = fraction(spentPoolValue, a1, c2)
332332 $Tuple7(c1, (c2 + spentPoolValue), a0, (a1 + acquiredTokens), (c0 - spentPoolValue), pu, (pd + acquiredTokens))
333333 }
334334
335335 func openUp (c1,c2,a0,a1,c0,pu,pd) = {
336336 let diff = (c2 - c1)
337337 let spentPoolValue = if ((c0 > diff))
338338 then diff
339339 else c0
340340 let acquiredTokens = fraction(spentPoolValue, a0, c1)
341341 $Tuple7((c1 + spentPoolValue), c2, (a0 + acquiredTokens), a1, (c0 - spentPoolValue), (pu + acquiredTokens), pd)
342342 }
343343
344- let $t01019111226 = if ((curBullCol0 > curBearCol0))
344+ let $t01021511250 = if ((curBullCol0 > curBearCol0))
345345 then {
346346 let afterCloseUp = closeUp(curBullCol0, curBearCol0, curBullCirc0, curBearCirc0, curPoolMain0, curPoolUp0, curPoolDwn0)
347- let $t01041710554 = afterCloseUp
348- let a = $t01041710554._1
349- let b = $t01041710554._2
350- let c = $t01041710554._3
351- let d = $t01041710554._4
352- let e = $t01041710554._5
353- let f = $t01041710554._6
354- let g = $t01041710554._7
347+ let $t01044110578 = afterCloseUp
348+ let a = $t01044110578._1
349+ let b = $t01044110578._2
350+ let c = $t01044110578._3
351+ let d = $t01044110578._4
352+ let e = $t01044110578._5
353+ let f = $t01044110578._6
354+ let g = $t01044110578._7
355355 if ((f > 0))
356356 then afterCloseUp
357357 else if ((f == 0))
358358 then openDwn(a, b, c, d, e, f, g)
359359 else throw("poolUp < 0")
360360 }
361361 else {
362362 let afterCloseDwn = closeDwn(curBullCol0, curBearCol0, curBullCirc0, curBearCirc0, curPoolMain0, curPoolUp0, curPoolDwn0)
363- let $t01090511045 = afterCloseDwn
364- let a = $t01090511045._1
365- let b = $t01090511045._2
366- let c = $t01090511045._3
367- let d = $t01090511045._4
368- let e = $t01090511045._5
369- let f = $t01090511045._6
370- let g = $t01090511045._7
363+ let $t01092911069 = afterCloseDwn
364+ let a = $t01092911069._1
365+ let b = $t01092911069._2
366+ let c = $t01092911069._3
367+ let d = $t01092911069._4
368+ let e = $t01092911069._5
369+ let f = $t01092911069._6
370+ let g = $t01092911069._7
371371 if ((g > 0))
372372 then afterCloseDwn
373373 else if ((g == 0))
374374 then openUp(a, b, c, d, e, f, g)
375375 else throw("poolDwn < 0")
376376 }
377- let c1 = $t01019111226._1
378- let c2 = $t01019111226._2
379- let a0 = $t01019111226._3
380- let a1 = $t01019111226._4
381- let c0 = $t01019111226._5
382- let pu = $t01019111226._6
383- let pd = $t01019111226._7
377+ let c1 = $t01021511250._1
378+ let c2 = $t01021511250._2
379+ let a0 = $t01021511250._3
380+ let a1 = $t01021511250._4
381+ let c0 = $t01021511250._5
382+ let pu = $t01021511250._6
383+ let pd = $t01021511250._7
384384 let charge = fraction(userDiffAbs(), rebalancePercentile, ((1440 * 100) * 100))
385385 let percentileActivated = (height >= valueOrElse(getInteger(configProvider, "percentileActivationHeight"), 10000000))
386386 let c1SplitP = if (if (percentileActivated)
387387 then (pd > 0)
388388 else false)
389389 then charge
390390 else 0
391391 let c2SplitP = if (if (percentileActivated)
392392 then (pu > 0)
393393 else false)
394394 then charge
395395 else 0
396396 $Tuple7((c1 - c1SplitP), (c2 - c2SplitP), a0, a1, ((c0 + c1SplitP) + c2SplitP), pu, pd)
397397 }
398398
399399
400400 func poolSup (curBullCol0,curBearCol0,curBullCirc0,curBearCirc0) = {
401- let $t01180711989 = poolSupport(curBullCol0, curBearCol0, curBullCirc0, curBearCirc0, poolMain, poolUp, poolDwn)
402- let bullCol1 = $t01180711989._1
403- let bearCol1 = $t01180711989._2
404- let bullCic1 = $t01180711989._3
405- let bearCirc1 = $t01180711989._4
406- let poolMain1 = $t01180711989._5
407- let poolUp1 = $t01180711989._6
408- let poolDwn1 = $t01180711989._7
401+ let $t01183112013 = poolSupport(curBullCol0, curBearCol0, curBullCirc0, curBearCirc0, poolMain, poolUp, poolDwn)
402+ let bullCol1 = $t01183112013._1
403+ let bearCol1 = $t01183112013._2
404+ let bullCic1 = $t01183112013._3
405+ let bearCirc1 = $t01183112013._4
406+ let poolMain1 = $t01183112013._5
407+ let poolUp1 = $t01183112013._6
408+ let poolDwn1 = $t01183112013._7
409409 [IE(BULLCOLK, bullCol1), IE(BULLCIRCK, bullCic1), IE(BEARCOLK, bearCol1), IE(BEARCIRCK, bearCirc1), IE(POOLUSDNK, poolMain1), IE(POOLUPK, poolUp1), IE(POOLDWNK, poolDwn1)]
410410 }
411411
412412
413413 func dequeue () = {
414414 func sp (a,mx) = if ((mx >= a))
415415 then $Tuple2(a, 0)
416416 else $Tuple2(mx, (a - mx))
417417
418418 if ((queueSize == 0))
419419 then throw("nothing to settle")
420420 else {
421421 func collectFee (fees) = IE(FEEACCK, (feesAccumulated + fees))
422422
423423 let decreaseQueueSize = IE(QSIZEK, (queueSize - 1))
424424 let isLastElement = (headPointer == tailPointer)
425425 let overwriteTail = SE(TAILK, "")
426426 let dataStr = localS(headPointer, "bad head pointer(dequeue)")
427427 let data = split(dataStr, "|")
428428 let action = data[0]
429429 let amt = parseIntValue(data[1])
430430 let token = data[2]
431431 let priceIndex = parseIntValue(data[3])
432432 let invoker = addressFromStringValue(data[4])
433433 let minPayout = if ((8 > size(data)))
434434 then 0
435435 else parseIntValue(data[5])
436436 let maxPayout = if ((8 > size(data)))
437437 then MAX
438438 else parseIntValue(data[6])
439439 let next = data[(size(data) - 1)]
440440 func payback (tkn) = [SE(HEADK, next), decreaseQueueSize, ScriptTransfer(invoker, amt, fromBase58String(tkn))]
441441
442442 let items = if ((rebalancedPriceIndex > priceIndex))
443443 then throw(((("corrupt state, rebalancedPriceIndex=" + toString(rebalancedPriceIndex)) + ", request price id=") + toString(priceIndex)))
444444 else if ((priceIndex > rebalancedPriceIndex))
445445 then throw("can't dequeue, too early, rebalance first")
446446 else if ((action == ISSUE))
447447 then {
448448 let feeSize = fraction(amt, issuePercentile, 10000)
449449 let addedCollateral = (amt - feeSize)
450450 let a = if ((token == BULL))
451451 then fraction(bullCirc, addedCollateral, bullCol)
452452 else if ((token == BEAR))
453453 then fraction(bearCirc, addedCollateral, bearCol)
454454 else throw("bad token id")
455- let $t01411514171 = sp(a, maxPayout)
456- let addedToCirculation = $t01411514171._1
457- let extraTokens = $t01411514171._2
458- let $t01418814359 = if ((token == BULL))
455+ let $t01413914195 = sp(a, maxPayout)
456+ let addedToCirculation = $t01413914195._1
457+ let extraTokens = $t01413914195._2
458+ let $t01421214383 = if ((token == BULL))
459459 then $Tuple4(addedToCirculation, addedCollateral, 0, 0)
460460 else $Tuple4(0, 0, addedToCirculation, addedCollateral)
461- let plusBulls = $t01418814359._1
462- let plusBullCol = $t01418814359._2
463- let plusBears = $t01418814359._3
464- let plusBearCol = $t01418814359._4
461+ let plusBulls = $t01421214383._1
462+ let plusBullCol = $t01421214383._2
463+ let plusBears = $t01421214383._3
464+ let plusBearCol = $t01421214383._4
465465 if ((minPayout > addedToCirculation))
466466 then payback(mainToken)
467467 else (poolSup((bullCol + plusBullCol), (bearCol + plusBearCol), (bullCirc + plusBulls), (bearCirc + plusBears)) ++ [SE(HEADK, next), collectFee(feeSize), decreaseQueueSize, ScriptTransfer(invoker, addedToCirculation, fromBase58String(token)), ScriptTransfer(feeAddress, extraTokens, fromBase58String(token))])
468468 }
469469 else if ((action == REDEEM))
470470 then {
471471 let removedTokens = amt
472472 let calcPo = if ((token == BULL))
473473 then fraction(bullCol, removedTokens, bullCirc)
474474 else if ((token == BEAR))
475475 then fraction(bearCol, removedTokens, bearCirc)
476476 else throw("bad token id")
477- let $t01529815347 = sp(calcPo, maxPayout)
478- let payoutCapped = $t01529815347._1
479- let extra = $t01529815347._2
477+ let $t01532215371 = sp(calcPo, maxPayout)
478+ let payoutCapped = $t01532215371._1
479+ let extra = $t01532215371._2
480480 let feeSize = fraction(payoutCapped, redeemPercentile, 10000)
481481 let payout = if ((payoutCapped > feeSize))
482482 then (payoutCapped - feeSize)
483483 else 0
484- let $t01553315692 = if ((token == BULL))
484+ let $t01555715716 = if ((token == BULL))
485485 then $Tuple4(removedTokens, payoutCapped, 0, 0)
486486 else $Tuple4(0, 0, removedTokens, payoutCapped)
487- let minusBulls = $t01553315692._1
488- let minusBullCol = $t01553315692._2
489- let minusBears = $t01553315692._3
490- let minusBearCol = $t01553315692._4
487+ let minusBulls = $t01555715716._1
488+ let minusBullCol = $t01555715716._2
489+ let minusBears = $t01555715716._3
490+ let minusBearCol = $t01555715716._4
491491 if ((minPayout > payout))
492492 then payback(token)
493493 else (poolSup((bullCol - minusBullCol), (bearCol - minusBearCol), (bullCirc - minusBulls), (bearCirc - minusBears)) ++ [SE(HEADK, next), collectFee(feeSize), decreaseQueueSize, ScriptTransfer(invoker, payout, fromBase58String(mainToken)), ScriptTransfer(feeAddress, extra, fromBase58String(mainToken))])
494494 }
495495 else if ((action == POOL))
496496 then {
497497 let issueTokens = fraction(poolTokenCirculation, amt, poolValue)
498498 if ((minPayout > issueTokens))
499499 then payback(mainToken)
500500 else [IE(POOLUSDNK, (poolMain + amt)), IE(POOLCIRCK, (poolTokenCirculation + issueTokens)), SE(HEADK, next), decreaseQueueSize, ScriptTransfer(invoker, issueTokens, fromBase58String(poolToken))]
501501 }
502502 else if ((action == UNPOOL))
503503 then {
504504 func share (a) = fraction(a, amt, poolTokenCirculation)
505505
506506 let unpooledMain = share(poolMain)
507507 let unpooledUp = share(poolUp)
508508 let unpooledDwn = share(poolDwn)
509509 let unpooledUpValue = fraction(unpooledUp, bullCol, bullCirc)
510510 let unpooledDwnValue = fraction(unpooledDwn, bearCol, bearCirc)
511511 let totalUnpooledValue = ((unpooledMain + unpooledUpValue) + unpooledDwnValue)
512512 if ((minPayout > totalUnpooledValue))
513513 then payback(poolToken)
514514 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, ScriptTransfer(invoker, totalUnpooledValue, fromBase58String(mainToken))]
515515 }
516516 else throw(("bad action: " + action))
517517 if (isLastElement)
518518 then overwriteTail :: items
519519 else items
520520 }
521521 }
522522
523523
524524 func rebalance () = {
525525 func LV (v,p0,p1,m) = {
526526 let denom = 100
527527 let pmax = ((if ((p1 > p0))
528528 then p1
529529 else p0) / denom)
530530 let pmin = ((if ((p0 > p1))
531531 then p1
532532 else p0) / denom)
533533 let a = (pmin * pmin)
534534 let b = ((((m * m) * pmax) * pmax) - (((((2 * m) * m) - m) * pmax) * pmin))
535535 let ma = ((m * m) - m)
536536 fraction(v, ((ma * a) + b), (((ma + 1) * a) + b))
537537 }
538538
539539 let settledPriceIndex = valueOrErrorMessage(getInteger(this, REBIDXK), "inconsistent data")
540540 let unsettledPriceIndex = (settledPriceIndex + 1)
541541 let settledPrice = priceByIndex(assetName, settledPriceIndex)
542542 let nextPrice = priceByIndex(assetName, unsettledPriceIndex)
543543 let minVol = if ((bearCol > bullCol))
544544 then bullCol
545545 else bearCol
546546 let redist = LV(minVol, settledPrice, nextPrice, leverage)
547547 let priceUpGoodForBulls = if ((nextPrice > settledPrice))
548548 then (assetName == "")
549549 else false
550550 let newBullCol = if (priceUpGoodForBulls)
551551 then (bullCol + redist)
552552 else (bullCol - redist)
553553 let newBearCol = if (priceUpGoodForBulls)
554554 then (bearCol - redist)
555555 else (bearCol + redist)
556- let $t01942919615 = poolSupport(newBullCol, newBearCol, bullCirc, bearCirc, poolMain, poolUp, poolDwn)
557- let updBullCol = $t01942919615._1
558- let updBearCol = $t01942919615._2
559- let updBullCirc = $t01942919615._3
560- let updBearCirc = $t01942919615._4
561- let updPoolMain = $t01942919615._5
562- let updPoolUp = $t01942919615._6
563- let updPoolDwn = $t01942919615._7
556+ let $t01945319639 = poolSupport(newBullCol, newBearCol, bullCirc, bearCirc, poolMain, poolUp, poolDwn)
557+ let updBullCol = $t01945319639._1
558+ let updBearCol = $t01945319639._2
559+ let updBullCirc = $t01945319639._3
560+ let updBearCirc = $t01945319639._4
561+ let updPoolMain = $t01945319639._5
562+ let updPoolUp = $t01945319639._6
563+ let updPoolDwn = $t01945319639._7
564564 [IE(BULLCOLK, updBullCol), IE(BEARCOLK, updBearCol), IE(BULLCIRCK, updBullCirc), IE(BEARCIRCK, updBearCirc), IE(POOLUSDNK, updPoolMain), IE(POOLUPK, updPoolUp), IE(POOLDWNK, updPoolDwn), IE(REBIDXK, unsettledPriceIndex)]
565565 }
566566
567567
568568 func calcMax (min,avg) = if ((min > avg))
569569 then throw(((("price too old: minPayout " + toString(min)) + " > avg = ") + toString(avg)))
570570 else ((avg + avg) - min)
571571
572572
573573 func requestIssueInternal (inv,tokenId,minPayout) = if (if ((tokenId != BULL))
574574 then (tokenId != BEAR)
575575 else false)
576576 then throw("bad token req")
577577 else if ((inv.caller == this))
578578 then throw("can't do")
579579 else if (!(allowed(inv.caller)))
580580 then throw("only whitelisted can do")
581581 else {
582582 let errorMessage = (((("bad token req, only BULL(" + BULL) + ") or BEAR(") + BEAR) + ") allowed")
583583 if ((inv.payments[0].assetId != fromBase58String(mainToken)))
584584 then throw("bad token att")
585585 else {
586586 let amt = inv.payments[0].amount
587- let $t02062120799 = if ((tokenId == BULL))
587+ let $t02064520823 = if ((tokenId == BULL))
588588 then $Tuple2(bullCol, bullCirc)
589589 else if ((tokenId == BEAR))
590590 then $Tuple2(bearCol, bearCirc)
591591 else throw(errorMessage)
592- let col = $t02062120799._1
593- let circ = $t02062120799._2
592+ let col = $t02064520823._1
593+ let circ = $t02064520823._2
594594 let est = fraction(amt, circ, col)
595- let $t02084120935 = if ((minPayout == 0))
595+ let $t02086520959 = if ((minPayout == 0))
596596 then $Tuple2(0, MAX)
597597 else $Tuple2(minPayout, calcMax(minPayout, est))
598- let minP = $t02084120935._1
599- let maxP = $t02084120935._2
598+ let minP = $t02086520959._1
599+ let maxP = $t02086520959._2
600600 if ((minIssue > amt))
601601 then throw((("Attached payment too small. Min required: " + toString((minIssue / 1000000))) + " USDN"))
602602 else {
603603 let maxAllowed = maxIssue(tokenId)
604604 if (if ((whitelist == ""))
605605 then (inv.payments[0].amount > maxAllowed)
606606 else false)
607607 then throw((("trying to issue more than pool can handle. Max attachment allowed = " + toString((maxAllowed / 1000000))) + " USDN"))
608608 else (enqueue(toBase58String(inv.transactionId), ISSUE, amt, tokenId, (oraclePriceIndex + 1), toString(inv.caller), minP, maxP) ++ [debug("requested", tokenId), debug("bull", BULL), debug("bear", BEAR)])
609609 }
610610 }
611611 }
612612
613613
614614 func requestRedeemInternal (inv,minPayout) = {
615615 let amt = inv.payments[0].amount
616616 let tokenId = toBase58String(valueOrErrorMessage(inv.payments[0].assetId, "bad token att"))
617617 if (if ((tokenId != BULL))
618618 then (tokenId != BEAR)
619619 else false)
620620 then throw("bad token req")
621621 else {
622- let $t02197222111 = if ((tokenId == BULL))
622+ let $t02199622135 = if ((tokenId == BULL))
623623 then $Tuple2(bullCol, bullCirc)
624624 else if ((tokenId == BEAR))
625625 then $Tuple2(bearCol, bearCirc)
626626 else throw("bad token req")
627- let col = $t02197222111._1
628- let circ = $t02197222111._2
627+ let col = $t02199622135._1
628+ let circ = $t02199622135._2
629629 let est = fraction(amt, col, circ)
630- let $t02215922253 = if ((minPayout == 0))
630+ let $t02218322277 = if ((minPayout == 0))
631631 then $Tuple2(0, MAX)
632632 else $Tuple2(minPayout, calcMax(minPayout, est))
633- let minP = $t02215922253._1
634- let maxP = $t02215922253._2
633+ let minP = $t02218322277._1
634+ let maxP = $t02218322277._2
635635 if ((validateRequestRedeem(inv) == unit))
636636 then enqueue(toBase58String(inv.transactionId), REDEEM, amt, tokenId, (oraclePriceIndex + 1), toString(inv.caller), minP, maxP)
637637 else throw("doesn't happen")
638638 }
639639 }
640640
641641
642642 func requestPoolInternal (inv,minPayout) = if (!(allowed(inv.caller)))
643643 then throw("only whitelisted can do")
644644 else {
645645 let errMessage = (("main token must be attached(" + mainToken) + ")")
646646 let pmt = inv.payments[0]
647647 if ((pmt.assetId != fromBase58String(mainToken)))
648648 then throw(errMessage)
649649 else if ((minPool > pmt.amount))
650650 then throw(((("pool at least " + toString(minPool)) + " ") + mainToken))
651651 else {
652652 let estimate = fraction(poolTokenCirculation, pmt.amount, poolValue)
653- let $t02310123200 = if ((minPayout == 0))
653+ let $t02312523224 = if ((minPayout == 0))
654654 then $Tuple2(0, MAX)
655655 else $Tuple2(minPayout, calcMax(minPayout, estimate))
656- let minP = $t02310123200._1
657- let maxP = $t02310123200._2
656+ let minP = $t02312523224._1
657+ let maxP = $t02312523224._2
658658 enqueue(toBase58String(inv.transactionId), POOL, inv.payments[0].amount, "", (oraclePriceIndex + 1), toString(inv.caller), minP, maxP)
659659 }
660660 }
661661
662662
663663 func requestUnpoolInternal (inv,minPayout) = {
664664 let errMessage = (("only pool token allowed(" + poolToken) + ")")
665665 let pmt = inv.payments[0]
666666 if ((pmt.assetId != fromBase58String(poolToken)))
667667 then throw(errMessage)
668668 else {
669669 let estimate = fraction(poolValue, pmt.amount, poolTokenCirculation)
670670 if ((minPool > estimate))
671671 then throw(((("unpool at least for" + toString(minPool)) + " ") + mainToken))
672672 else {
673- let $t02385723956 = if ((minPayout == 0))
673+ let $t02388123980 = if ((minPayout == 0))
674674 then $Tuple2(0, MAX)
675675 else $Tuple2(minPayout, calcMax(minPayout, estimate))
676- let minP = $t02385723956._1
677- let maxP = $t02385723956._2
676+ let minP = $t02388123980._1
677+ let maxP = $t02388123980._2
678678 enqueue(toBase58String(inv.transactionId), UNPOOL, inv.payments[0].amount, "", (oraclePriceIndex + 1), toString(inv.caller), minP, maxP)
679679 }
680680 }
681681 }
682682
683683
684684 @Callable(inv)
685685 func init (config,oraclePK,nameup,namedwn,descUp,descDwn,poolName,poolDesc,defoAssetName,denom,lev) = if (isDefined(getString(this, BULLK)))
686686 then throw("already initialized")
687687 else {
688688 let totalOwnedMainToken = inv.payments[0].amount
689689 let bulls = (totalOwnedMainToken / 3)
690690 let bears = bulls
691691 let pools = ((totalOwnedMainToken - bulls) - bears)
692692 if (if (if ((bears == 0))
693693 then true
694694 else (bulls == 0))
695695 then true
696696 else (pools == 0))
697697 then throw("can't init balances")
698698 else {
699699 let oracleCurrentPriceIndex = valueOrErrorMessage(getInteger(valueOrErrorMessage(addressFromPublicKey(fromBase58String(oraclePK)), "bad oracle address"), lastPriceIndexKey(defoAssetName)), "can't find last oracle price index")
700700 let bull = Issue(nameup, descUp, ((100 * ten6) * ten6), 6, true)
701701 let bear = Issue(namedwn, descDwn, ((100 * ten6) * ten6), 6, true)
702702 let pool = Issue(poolName, poolDesc, ((100 * ten6) * ten6), 6, true)
703703 let buid = calculateAssetId(bull)
704704 let beid = calculateAssetId(bear)
705705 let poid = calculateAssetId(pool)
706706 [bull, bear, pool, SE(BULLK, toBase58String(buid)), SE(BEARK, toBase58String(beid)), SE(USDNK, toBase58String(value(inv.payments[0].assetId))), SE(POOLK, toBase58String(poid)), SE(ASSNAMEK, defoAssetName), SE(oraclePKKey, oraclePK), IE(REBIDXK, oracleCurrentPriceIndex), IE(BULLCOLK, bulls), IE(BEARCOLK, bears), IE(BULLCIRCK, (bulls / denom)), IE(BEARCIRCK, (bears / denom)), IE(POOLCIRCK, (pools / denom)), IE(POOLDWNK, 0), IE(POOLUPK, 0), IE(POOLUSDNK, pools), SE(configProviderKey, config), IE(LEVK, lev), ScriptTransfer(inv.caller, (bulls / denom), buid), ScriptTransfer(inv.caller, (bears / denom), beid), ScriptTransfer(inv.caller, (pools / denom), poid)]
707707 }
708708 }
709709
710710
711711
712712 @Callable(i)
713713 func withdrawFee (amount) = if ((amount > feesAccumulated))
714714 then throw(("too much. available: " + toString(feesAccumulated)))
715715 else [IE(FEEACCK, (feesAccumulated - amount)), ScriptTransfer(feeAddress, amount, fromBase58String(mainToken))]
716716
717717
718718
719719 @Callable(inv)
720720 func requestRedeem () = requestRedeemInternal(inv, 0)
721721
722722
723723
724724 @Callable(inv)
725725 func requestRedeemSl (sl) = if (validatePMFee(inv, sl))
726726 then requestRedeemInternal(inv, sl)
727727 else throw()
728728
729729
730730
731731 @Callable(inv)
732732 func requestIssue (tokenId) = requestIssueInternal(inv, tokenId, 0)
733733
734734
735735
736736 @Callable(inv)
737737 func requestIssueSl (tokenId,sl) = if (validatePMFee(inv, sl))
738738 then requestIssueInternal(inv, tokenId, sl)
739739 else throw()
740740
741741
742742
743743 @Callable(inv)
744744 func requestPool () = requestPoolInternal(inv, 0)
745745
746746
747747
748748 @Callable(inv)
749749 func requestPoolSl (sl) = if (validatePMFee(inv, sl))
750750 then requestPoolInternal(inv, sl)
751751 else throw()
752752
753753
754754
755755 @Callable(inv)
756756 func requestUnpool () = requestUnpoolInternal(inv, 0)
757757
758758
759759
760760 @Callable(inv)
761761 func requestUnpoolSl (sl) = if (validatePMFee(inv, sl))
762762 then requestUnpoolInternal(inv, sl)
763763 else throw()
764764
765765
766766
767767 @Callable(inv)
768768 func settle () = {
769769 let queueEmpty = (headPointer == "")
770770 let canRebalance = (oraclePriceIndex > rebalancedPriceIndex)
771771 if (queueEmpty)
772772 then if (canRebalance)
773773 then rebalance()
774774 else throw("[OK] all done, carry on")
775775 else {
776776 let data = split(valueOrErrorMessage(getString(this, headPointer), ("bad head pointer(settle): " + headPointer)), "|")
777777 let priceIndex = parseIntValue(data[3])
778778 if ((priceIndex > rebalancedPriceIndex))
779779 then if (canRebalance)
780780 then rebalance()
781781 else throw("[OK] need to wait")
782782 else if ((priceIndex == rebalancedPriceIndex))
783783 then dequeue()
784784 else throw("corrupt data, future price id already rebalanced")
785785 }
786786 }
787787
788788
789789 @Verifier(tx)
790790 func verify () = {
791791 let initial = if (!(isDefined(getString(this, BULLK))))
792792 then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
793793 else false
794794 let adminAction = ((((if (sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(pubKeyAdminsList[0])))
795795 then 1
796796 else 0) + (if (sigVerify(tx.bodyBytes, tx.proofs[1], fromBase58String(pubKeyAdminsList[1])))
797797 then 1
798798 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[2], fromBase58String(pubKeyAdminsList[2])))
799799 then 1
800800 else 0)) > 1)
801801 let stakingAction = match tx {
802802 case tx: InvokeScriptTransaction =>
803803 let signedCorrectly = sigVerify(tx.bodyBytes, tx.proofs[0], daemonPublicKey)
804804 let feesCorrect = if ((tx.feeAssetId == unit))
805805 then ((1000 * 1000) >= tx.fee)
806806 else false
807807 let dappCorrect = (tx.dApp == rpdAddress)
808808 let unlock = (tx.function == "unlockNeutrino")
809809 let lock = if (if ((tx.function == "lockNeutrinoSP"))
810810 then (tx.args[0] == stakingAddress)
811811 else false)
812812 then (wavesBalance(this).available >= ten8)
813813 else false
814814 let funcCorrect = if (lock)
815815 then true
816816 else unlock
817817 if (if (if (signedCorrectly)
818818 then feesCorrect
819819 else false)
820820 then dappCorrect
821821 else false)
822822 then funcCorrect
823823 else false
824824 case _ =>
825825 false
826826 }
827827 if (if (initial)
828828 then true
829829 else adminAction)
830830 then true
831831 else stakingAction
832832 }
833833

github/deemru/w8io/3ef1775 
131.36 ms