2021.03.16 19:56 [2505171] smart account 3P9ZegsKUtsEpdRPNVrMH7nHEEqY5MrmjDp > SELF 0.00000000 Waves

{ "type": 13, "id": "FME1ftFJS9X58ARtT2mSb19qHiAZf6Y7HYhDKVbNxNbc", "fee": 1400000, "feeAssetId": null, "timestamp": 1615912598713, "version": 1, "sender": "3P9ZegsKUtsEpdRPNVrMH7nHEEqY5MrmjDp", "senderPublicKey": "7ziFsWp9eo6kUB6ovqQzJfjgQarifNfpCGNW9DZi8YhN", "proofs": [ "3Ur65Sta7EXzwKmSdJVZwX2dhCSkDdNntKwUNLvshVNxu8p4cp8MretyU4jFmH9sN5zSFeyUrcdEdGPkRdN8Gnpg", "jJLHo2P2ZGidQuDq9kxUjMfex47swe6hQgsLDq9LdTzcW76H8Wxe5E4RiLCNfZUhHkSgFP3YcSuRg1A1TqrGZmc" ], "script": "base64:AAIEAAAAAAAAADgIAhINCgsICAgICAgICAgBARIDCgEBEgASAwoBARIDCgEIEgQKAggBEgASAwoBARIAEgMKAQESAAAAAG0BAAAAAlNFAAAAAgAAAAFrAAAAAXYJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAAWsFAAAAAXYBAAAAAklFAAAAAgAAAAFrAAAAAXYJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAFrBQAAAAF2AQAAAAJTVAAAAAMAAAABYQAAAANhbXQAAAABdAkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAABYQUAAAADYW10BQAAAAF0AAAAAAR0ZW42AAAAAAAAD0JAAAAAAAR0ZW44AAAAAAAF9eEAAAAAAANNQVgAf/////////8AAAAAEWNvbmZpZ1Byb3ZpZGVyS2V5AgAAAA5jb25maWdQcm92aWRlcgAAAAAOY29uZmlnUHJvdmlkZXIEAAAAByRtYXRjaDAJAAQdAAAAAgUAAAAEdGhpcwUAAAARY29uZmlnUHJvdmlkZXJLZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABcwUAAAAHJG1hdGNoMAkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQUAAAABcwUAAAAEdGhpcwEAAAAGbG9jYWxJAAAAAgAAAAFrAAAAAWUJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAAAFrBQAAAAFlAQAAAAZsb2NhbFMAAAACAAAAAWsAAAABZQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAAAWsFAAAAAWUBAAAABWNvbmZJAAAAAgAAAAFrAAAAAWUJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA5jb25maWdQcm92aWRlcgUAAAABawUAAAABZQEAAAAFY29uZlMAAAACAAAAAWsAAAABZQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAADmNvbmZpZ1Byb3ZpZGVyBQAAAAFrBQAAAAFlAAAAAAVCVUxMSwIAAAAGQlVMTElkAAAAAAVCRUFSSwIAAAAGQkVBUklkAAAAAAVVU0ROSwIAAAALbWFpblRva2VuSWQAAAAACEJVTExDT0xLAgAAAA5idWxsQ29sbGF0ZXJhbAAAAAAIQkVBUkNPTEsCAAAADmJlYXJDb2xsYXRlcmFsAAAAAAlCVUxMQ0lSQ0sCAAAAD2J1bGxDaXJjdWxhdGlvbgAAAAAJQkVBUkNJUkNLAgAAAA9iZWFyQ2lyY3VsYXRpb24AAAAACElTU1BFUkNLAgAAAA9pc3N1ZVBlcmNlbnRpbGUAAAAACFJFRFBFUkNLAgAAABByZWRlZW1QZXJjZW50aWxlAAAAAAdNSU5JU1NLAgAAAAhtaW5Jc3N1ZQAAAAAHTUlOUkVESwIAAAAJbWluUmVkZWVtAAAAAAhNSU5QT09MSwIAAAAHbWluUG9vbAAAAAAHRkVFQUNDSwIAAAAPZmVlc0FjY3VtdWxhdGVkAAAAAAZXTElTVEsCAAAADmlzc3VlV2hpdGVMaXN0AAAAAAhSRUJQRVJDSwIAAAATcmViYWxhbmNlUGVyY2VudGlsZQAAAAAHUkVCSURYSwIAAAAVbGFzdFNldHRsZW1lbnRQcmljZUlkAAAAAAVIRUFESwIAAAALaGVhZFBvaW50ZXIAAAAABVRBSUxLAgAAAAt0YWlsUG9pbnRlcgAAAAAGUVNJWkVLAgAAAAlxdWV1ZVNpemUAAAAACVBPT0xVU0ROSwIAAAAScG9vbE1haW5Ub2tlblZhbHVlAAAAAAdQT09MVVBLAgAAAAZwb29sVXAAAAAACFBPT0xEV05LAgAAAAdwb29sRHduAAAAAAlQT09MQ0lSQ0sCAAAAFHBvb2xUb2tlbkNpcmN1bGF0aW9uAAAAAAVQT09MSwIAAAAJcG9vbFRva2VuAAAAAAhBU1NOQU1FSwIAAAANZGVmb0Fzc2V0TmFtZQAAAAAETEVWSwIAAAAIbGV2ZXJhZ2UAAAAACVdBVkVTRkVFSwIAAAARd2F2ZXNQYWNlbWFrZXJGZWUAAAAACFVTRE5GRUVLAgAAABB1c2RuUGFjZW1ha2VyRmVlAAAAAAtvcmFjbGVQS0tleQIAAAAGb3JhY2xlAQAAABFsYXN0UHJpY2VJbmRleEtleQAAAAEAAAAHYXNzZXRJZAMJAAAAAAAAAgUAAAAHYXNzZXRJZAIAAAAAAgAAAAtwcmljZV9pbmRleAkAASwAAAAC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AGsAAAADBQAAAAdiZWFyQ29sBQAAAAdwb29sRHduBQAAAAhiZWFyQ2lyYwAAAAAJcG9vbFZhbHVlCQAAZAAAAAIJAABkAAAAAgUAAAAIcG9vbE1haW4FAAAAEHBvb2xCdWxsRXhwb3N1cmUFAAAAEHBvb2xCZWFyRXhwb3N1cmUAAAAABm9yYWNsZQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQEAAAAUYWRkcmVzc0Zyb21QdWJsaWNLZXkAAAABCQACWQAAAAEJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAAAtvcmFjbGVQS0tleQIAAAAObm8gb3JhY2xlUEtLZXkCAAAAEmJhZCBvcmFjbGUgYWRkcmVzcwAAAAAUcmViYWxhbmNlZFByaWNlSW5kZXgJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAAAdSRUJJRFhLAgAAABdubyBsYXN0IHJlYmFsYW5jZSBwcmljZQAAAAAQb3JhY2xlUHJpY2VJbmRleAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABm9yYWNsZQkBAAAAEWxhc3RQcmljZUluZGV4S2V5AAAAAQUAAAAJYXNzZXROYW1lCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAABNiYWQgb3JhY2xlIGRhdGEgYXQgCQAEJQAAAAEFAAAABm9yYWNsZQIAAAAQOiBubyBpbnRlZ2VyIGF0IAkBAAAAEWxhc3RQcmljZUluZGV4S2V5AAAAAQUAAAAJYXNzZXROYW1lAAAAAAhsZXZlcmFnZQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAAARMRVZLAAAAAAAAAAADAQAAAA1oZWlnaHRCeUluZGV4AAAAAgAAAAlhc3NldE5hbWUAAAAKcHJpY2VJbmRleAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABm9yYWNsZQkAASwAAAACCQEAAAAQcHJpY2VJbmRleFByZWZpeAAAAAEFAAAACWFzc2V0TmFtZQkAAaQAAAABBQAAAApwcmljZUluZGV4CQABLAAAAAICAAAAEW5vIGRhdGEgYXQgaW5kZXggCQABpAAAAAEFAAAACnByaWNlSW5kZXgBAAAADXByaWNlQnlIZWlnaHQAAAACAAAACWFzc2V0TmFtZQAAAAtwcmljZUhlaWdodAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABm9yYWNsZQkAASwAAAACCQEAAAARcHJpY2VIZWlnaHRQcmVmaXgAAAABBQAAAAlhc3NldE5hbWUJAAGkAAAAAQUAAAALcHJpY2VIZWlnaHQJAAEsAAAAAgIAAAATbm8gZGF0YSBmb3IgaGVpZ2h0IAkAAaQAAAABBQAAAAtwcmljZUhlaWdodAEAAAAMcHJpY2VCeUluZGV4AAAAAgAAAAlhc3NldE5hbWUAAAAKcHJpY2VJbmRleAkBAAAADXByaWNlQnlIZWlnaHQAAAACBQAAAAlhc3NldE5hbWUJAQAAAA1oZWlnaHRCeUluZGV4AAAAAgUAAAAJYXNzZXROYW1lBQAAAApwcmljZUluZGV4AAAAAAlxdWV1ZVNpemUJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAAGUVNJWkVLAAAAAAAAAAAAAAAAAAtoZWFkUG9pbnRlcgkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAAAVIRUFESwIAAAAAAAAAAAt0YWlsUG9pbnRlcgkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAAAVUQUlMSwIAAAAAAAAAAA9mZWVzQWNjdW11bGF0ZWQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAAHRkVFQUNDSwAAAAAAAAAAAAAAAAAFSVNTVUUCAAAABUlTU1VFAAAAAAZSRURFRU0CAAAABlJFREVFTQAAAAAEUE9PTAIAAAAEUE9PTAAAAAAGVU5QT09MAgAAAAZVTlBPT0wAAAAACmZlZUFkZHJLZXkCAAAACmZlZUFkZHJlc3MAAAAADnN0YWtpbmdBZGRyS2V5AgAAAA5zdGFraW5nQWRkcmVzcwAAAAAPZGFlbW9uUHViS2V5S2V5AgAAAA9kYWVtb25QdWJsaWNLZXkAAAAACmZlZUFkZHJlc3MJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABCQEAAAAFY29uZlMAAAACBQAAAApmZWVBZGRyS2V5AgAAAA1ubyBmZWVBZGRyZXNzAgAAAA5iYWQgZmVlQWRkcmVzcwAAAAAOc3Rha2luZ0FkZHJlc3MJAQAAAAVjb25mUwAAAAIFAAAADnN0YWtpbmdBZGRyS2V5AgAAABFubyBzdGFraW5nQWRkcmVzcwAAAAAPZGFlbW9uUHVibGljS2V5CQACWQAAAAEJAQAAAAVjb25mUwAAAAIFAAAAD2RhZW1vblB1YktleUtleQIAAAASbm8gZGFlbW9uUHVibGljS2V5AAAAAApycGRBZGRyZXNzCQAEJgAAAAECAAAAIzNQTmlrTTZ5cDROcWNTVThndXhRdG1SNW9ucjJENGU4eVRKAAAAAAZhZG1pbnMJAARMAAAAAgIAAAAsMkhIcVY4VzlESmF5VjVSNnRCRDJTYjhzcnBocG9ib0RpN3IxdDFhUGl1bUMJAARMAAAAAgIAAAAsNVpYZTgyUlJBU1U3cXNoWE0ySjlKTllocUo5R1dZampWcTJnd1VWNU5hejkJAARMAAAAAgIAAAAsNVdSWEZTandjVGJOZktjSnM4WnFYbVNTV1lzU1ZKVXRNdk1xWmo1aEg0TmMFAAAAA25pbAAAAAADb3BuCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGwAAAAIFAAAABm9yYWNsZQkAASwAAAACAgAAABYlcyVzX19pc01hcmtldE9wZW5lZF9fBQAAAAlhc3NldE5hbWUGAQAAAAxidWlsZE5ld0l0ZW0AAAAHAAAABmFjdGlvbgAAAANhbXQAAAAFdG9rZW4AAAAKcHJpY2VJbmRleAAAAAdpbnZva2VyAAAACW1pblBheW91dAAAAAltYXhQYXlvdXQJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgUAAAAGYWN0aW9uAgAAAAF8CQABpAAAAAEFAAAAA2FtdAIAAAABfAUAAAAFdG9rZW4CAAAAAXwJAAGkAAAAAQUAAAAKcHJpY2VJ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bmRleD0JAAGkAAAAAQUAAAAUcmViYWxhbmNlZFByaWNlSW5kZXgCAAAAEywgcmVxdWVzdCBwcmljZSBpZD0JAAGkAAAAAQUAAAAKcHJpY2VJbmRleAMJAABmAAAAAgUAAAAKcHJpY2VJbmRleAUAAAAUcmViYWxhbmNlZFByaWNlSW5kZXgJAAACAAAAAQIAAAApY2FuJ3QgZGVxdWV1ZSwgdG9vIGVhcmx5LCByZWJhbGFuY2UgZmlyc3QDCQAAAAAAAAIFAAAABmFjdGlvbgUAAAAFSVNTVUUEAAAAB2ZlZVNpemUJAABrAAAAAwUAAAADYW10BQAAAA9pc3N1ZVBlcmNlbnRpbGUAAAAAAAAAJxAEAAAAD2FkZGVkQ29sbGF0ZXJhbAkAAGUAAAACBQAAAANhbXQFAAAAB2ZlZVNpemUEAAAAEmRlZmF1bHRBZGRlZFRva2VucwMJAAAAAAAAAgUAAAAFdG9rZW4FAAAABEJVTEwJAABrAAAAAwUAAAAIYnVsbENpcmMFAAAAD2FkZGVkQ29sbGF0ZXJhbAUAAAAHYnVsbENvbAMJAAAAAAAAAgUAAAAFdG9rZW4FAAAABEJFQVIJAABrAAAAAwUAAAAIYmVhckNpcmMFAAAAD2FkZGVkQ29sbGF0ZXJhbAUAAAAHYmVhckNvbAkAAAIAAAABAgAAAAxiYWQgdG9rZW4gaWQEAAAADSR0MDE0MjcwMTQzNDMJAQAAAAJzcAAAAAIFAAAAEmRlZmF1bHRBZGRlZFRva2VucwUAAAAJbWF4UGF5b3V0BAAAABJhZGRlZFRvQ2lyY3VsYXRpb24IBQAAAA0kdDAxNDI3MDE0MzQzAAAAAl8xBAAAAAtleHRyYVRva2VucwgFAAAADSR0MDE0MjcwMTQzNDMAAAACXzIEAAAADSR0MDE0MzYwMTQ1MzEDCQAAAAAAAAIFAAAABXRva2VuBQAAAARCVUxMCQAFFgAAAAQFAAAAEmRlZmF1bHRBZGRlZFRva2VucwUAAAAPYWRkZWRDb2xsYXRlcmFsAAAAAAAAAAAAAAAAAAAAAAAACQAFFgAAAAQAAAAAAAAAAAAAAAAAAAAAAAAFAAAAEmRlZmF1bHRBZGRlZFRva2VucwUAAAAPYWRkZWRDb2xsYXRlcmFsBAAAAAlwbHVzQnVsbHMIBQAAAA0kdDAxNDM2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AAFhBQAAAAFiBAAAABFzZXR0bGVkUHJpY2VJbmRleAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAB1JFQklEWEsCAAAAEWluY29uc2lzdGVudCBkYXRhBAAAABN1bnNldHRsZWRQcmljZUluZGV4CQAAZAAAAAIFAAAAEXNldHRsZWRQcmljZUluZGV4AAAAAAAAAAABAwkBAAAAASEAAAABBQAAAANvcG4JAARMAAAAAgkBAAAAAklFAAAAAgUAAAAHUkVCSURYSwUAAAATdW5zZXR0bGVkUHJpY2VJbmRleAUAAAADbmlsBAAAAAxzZXR0bGVkUHJpY2UJAQAAAAxwcmljZUJ5SW5kZXgAAAACBQAAAAlhc3NldE5hbWUFAAAAEXNldHRsZWRQcmljZUluZGV4BAAAAAluZXh0UHJpY2UJAQAAAAxwcmljZUJ5SW5kZXgAAAACBQAAAAlhc3NldE5hbWUFAAAAE3Vuc2V0dGxlZFByaWNlSW5kZXgEAAAABm1pblZvbAMJAABmAAAAAgUAAAAHYmVhckNvbAUAAAAHYnVsbENvbAUAAAAHYnVsbENvbAUAAAAHYmVhckNvbAQAAAAGcmVkaXN0CQEAAAACTFYAAAAEBQAAAAZtaW5Wb2wFAAAADHNldHRsZWRQcmljZQUAAAAJbmV4dFByaWNlBQAAAAhsZXZlcmFnZQQAAAATcHJpY2VVcEdvb2RGb3JCdWxscwkAAAAAAAACBQAAAAlhc3NldE5hbWUCAAAAAAQAAAALcHJpY2VHb2VzVXAJAABmAAAAAgUAAAAJbmV4dFByaWNlBQAAAAxzZXR0bGVkUHJpY2UEAAAACWJ1bGxzRWFybgkAAAAAAAACBQAAABNwcmljZVVwR29vZEZvckJ1bGxzBQAAAAtwcmljZUdvZXNVcAQAAAAKbmV3QnVsbENvbAMFAAAACWJ1bGxzRWFybgkAAGQAAAACBQAAAAdidWxsQ29sBQAAAAZyZWRpc3QJAABlAAAAAgUAAAAHYnVsbENvbAUAAAAGcmVkaXN0BAAAAApuZXdCZWFyQ29sAwUAAAAJYnVsbHNFYXJuCQAAZQAAAAIFAAAAB2JlYXJDb2wFAAAABnJlZGlzdAkAAGQAAAACBQAAAAdiZWFyQ29sBQAAAAZy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YWRtaW5BY3Rpb24JAABmAAAAAgkAAGQAAAACCQAAZAAAAAIDCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAkAAlkAAAABCQABkQAAAAIFAAAABmFkbWlucwAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAMJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAABCQACWQAAAAEJAAGRAAAAAgUAAAAGYWRtaW5zAAAAAAAAAAABAAAAAAAAAAABAAAAAAAAAAAAAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAIJAAJZAAAAAQkAAZEAAAACBQAAAAZhZG1pbnMAAAAAAAAAAAIAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAEEAAAADXN0YWtpbmdBY3Rpb24EAAAAByRtYXRjaDAFAAAAAnR4AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABdJbnZva2VTY3JpcHRUcmFuc2FjdGlvbgQAAAACdHgFAAAAByRtYXRjaDAEAAAAD3NpZ25lZENvcnJlY3RseQkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAFAAAAD2RhZW1vblB1YmxpY0tleQQAAAALZmVlc0NvcnJlY3QDCQAAAAAAAAIIBQAAAAJ0eAAAAApmZWVBc3NldElkBQAAAAR1bml0CQAAZwAAAAIJAABoAAAAAgAAAAAAAAAD6AAAAAAAAAAD6AgFAAAAAnR4AAAAA2ZlZQcEAAAAC2RhcHBDb3JyZWN0CQAAAAAAAAIIBQAAAAJ0eAAAAARkQXBwBQAAAApycGRBZGRyZXNzBAAAAAZ1bmxvY2sJAAAAAAAAAggFAAAAAnR4AAAACGZ1bmN0aW9uAgAAAA51bmxvY2tOZXV0cmlubwQAAAAEbG9jawMDCQAAAAAAAAIIBQAAAAJ0eAAAAAhmdW5jdGlvbgIAAAAObG9ja05ldXRyaW5vU1AJAAAAAAAAAgkAAZEAAAACCAUAAAACdHgAAAAEYXJncwAAAAAAAAAAAAUAAAAOc3Rha2luZ0FkZHJlc3MHCQAAZwAAAAIICQAD7wAAAAEFAAAABHRoaXMAAAAJYXZhaWxhYmxlBQAAAAR0ZW44BwQAAAALZnVuY0NvcnJlY3QDBQAAAARsb2NrBgUAAAAGdW5sb2NrAwMDBQAAAA9zaWduZWRDb3JyZWN0bHkFAAAAC2ZlZXNDb3JyZWN0BwUAAAALZGFwcENvcnJlY3QHBQAAAAtmdW5jQ29ycmVjdAcHAwMFAAAAB2luaXRpYWwGBQAAAAthZG1pbkFjdGlvbgYFAAAADXN0YWtpbmdBY3Rpb24fOtDY", "chainId": 87, "height": 2505171, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 5i1hDiMHv7QhuYsVhcggdNTP3dd8P66tbbnySD1yyLsj Next: 78rdPnjXLm4fYKaXMQYyoQYZPnbQ56XtR1Svvg9BCZQP Diff:
OldNewDifferences
88
99
1010 func ST (a,amt,t) = ScriptTransfer(a, amt, t)
11-
12-
13-func debug (k,v) = SE(("__dbg__" + k), v)
1411
1512
1613 let ten6 = 1000000
217214
218215 let admins = ["2HHqV8W9DJayV5R6tBD2Sb8srphpoboDi7r1t1aPiumC", "5ZXe82RRASU7qshXM2J9JNYhqJ9GWYjjVq2gwUV5Naz9", "5WRXFSjwcTbNfKcJs8ZqXmSSWYsSVJUtMvMqZj5hH4Nc"]
219216
217+let opn = valueOrElse(getBoolean(oracle, ("%s%s__isMarketOpened__" + assetName)), true)
218+
220219 func buildNewItem (action,amt,token,priceIndex,invoker,minPayout,maxPayout) = (((((((((((((action + "|") + toString(amt)) + "|") + token) + "|") + toString(priceIndex)) + "|") + invoker) + "|") + toString(minPayout)) + "|") + toString(maxPayout)) + "|")
221220
222221
223222 func userDiffAbs () = {
224- let $t057975886 = $Tuple2((bullCol - poolBullExposure), (bearCol - poolBearExposure))
225- let userBullCol = $t057975886._1
226- let userBearCol = $t057975886._2
223+ let $t058835972 = $Tuple2((bullCol - poolBullExposure), (bearCol - poolBearExposure))
224+ let userBullCol = $t058835972._1
225+ let userBearCol = $t058835972._2
227226 let diff = (userBullCol - userBearCol)
228227 if ((diff > 0))
229228 then diff
344343 $Tuple7((c1 + spentPoolValue), c2, (a0 + acquiredTokens), a1, (c0 - spentPoolValue), (pu + acquiredTokens), pd)
345344 }
346345
347- let $t01025511290 = if ((curBullCol0 > curBearCol0))
346+ let $t01034111376 = if ((curBullCol0 > curBearCol0))
348347 then {
349348 let afterCloseUp = closeUp(curBullCol0, curBearCol0, curBullCirc0, curBearCirc0, curPoolMain0, curPoolUp0, curPoolDwn0)
350- let $t01048110618 = afterCloseUp
351- let a = $t01048110618._1
352- let b = $t01048110618._2
353- let c = $t01048110618._3
354- let d = $t01048110618._4
355- let e = $t01048110618._5
356- let f = $t01048110618._6
357- let g = $t01048110618._7
349+ let $t01056710704 = afterCloseUp
350+ let a = $t01056710704._1
351+ let b = $t01056710704._2
352+ let c = $t01056710704._3
353+ let d = $t01056710704._4
354+ let e = $t01056710704._5
355+ let f = $t01056710704._6
356+ let g = $t01056710704._7
358357 if ((f > 0))
359358 then afterCloseUp
360359 else if ((f == 0))
363362 }
364363 else {
365364 let afterCloseDwn = closeDwn(curBullCol0, curBearCol0, curBullCirc0, curBearCirc0, curPoolMain0, curPoolUp0, curPoolDwn0)
366- let $t01096911109 = afterCloseDwn
367- let a = $t01096911109._1
368- let b = $t01096911109._2
369- let c = $t01096911109._3
370- let d = $t01096911109._4
371- let e = $t01096911109._5
372- let f = $t01096911109._6
373- let g = $t01096911109._7
365+ let $t01105511195 = afterCloseDwn
366+ let a = $t01105511195._1
367+ let b = $t01105511195._2
368+ let c = $t01105511195._3
369+ let d = $t01105511195._4
370+ let e = $t01105511195._5
371+ let f = $t01105511195._6
372+ let g = $t01105511195._7
374373 if ((g > 0))
375374 then afterCloseDwn
376375 else if ((g == 0))
377376 then openUp(a, b, c, d, e, f, g)
378377 else throw("poolDwn < 0")
379378 }
380- let c1 = $t01025511290._1
381- let c2 = $t01025511290._2
382- let a0 = $t01025511290._3
383- let a1 = $t01025511290._4
384- let c0 = $t01025511290._5
385- let pu = $t01025511290._6
386- let pd = $t01025511290._7
379+ let c1 = $t01034111376._1
380+ let c2 = $t01034111376._2
381+ let a0 = $t01034111376._3
382+ let a1 = $t01034111376._4
383+ let c0 = $t01034111376._5
384+ let pu = $t01034111376._6
385+ let pd = $t01034111376._7
387386 let charge = fraction(userDiffAbs(), rebalancePercentile, ((1440 * 100) * 100))
388387 let percentileActivated = (height >= valueOrElse(getInteger(configProvider, "percentileActivationHeight"), 10000000))
389388 let c1SplitP = if (if (percentileActivated)
401400
402401
403402 func poolSup (curBullCol0,curBearCol0,curBullCirc0,curBearCirc0) = {
404- let $t01187112053 = poolSupport(curBullCol0, curBearCol0, curBullCirc0, curBearCirc0, poolMain, poolUp, poolDwn)
405- let bullCol1 = $t01187112053._1
406- let bearCol1 = $t01187112053._2
407- let bullCic1 = $t01187112053._3
408- let bearCirc1 = $t01187112053._4
409- let poolMain1 = $t01187112053._5
410- let poolUp1 = $t01187112053._6
411- let poolDwn1 = $t01187112053._7
403+ let $t01195712139 = poolSupport(curBullCol0, curBearCol0, curBullCirc0, curBearCirc0, poolMain, poolUp, poolDwn)
404+ let bullCol1 = $t01195712139._1
405+ let bearCol1 = $t01195712139._2
406+ let bullCic1 = $t01195712139._3
407+ let bearCirc1 = $t01195712139._4
408+ let poolMain1 = $t01195712139._5
409+ let poolUp1 = $t01195712139._6
410+ let poolDwn1 = $t01195712139._7
412411 [IE(BULLCOLK, bullCol1), IE(BULLCIRCK, bullCic1), IE(BEARCOLK, bearCol1), IE(BEARCIRCK, bearCirc1), IE(POOLUSDNK, poolMain1), IE(POOLUPK, poolUp1), IE(POOLDWNK, poolDwn1)]
413412 }
414413
450449 then {
451450 let feeSize = fraction(amt, issuePercentile, 10000)
452451 let addedCollateral = (amt - feeSize)
453- let a = if ((token == BULL))
452+ let defaultAddedTokens = if ((token == BULL))
454453 then fraction(bullCirc, addedCollateral, bullCol)
455454 else if ((token == BEAR))
456455 then fraction(bearCirc, addedCollateral, bearCol)
457456 else throw("bad token id")
458- let $t01416714223 = sp(a, maxPayout)
459- let addedToCirculation = $t01416714223._1
460- let extraTokens = $t01416714223._2
461- let $t01424014411 = if ((token == BULL))
462- then $Tuple4(addedToCirculation, addedCollateral, 0, 0)
463- else $Tuple4(0, 0, addedToCirculation, addedCollateral)
464- let plusBulls = $t01424014411._1
465- let plusBullCol = $t01424014411._2
466- let plusBears = $t01424014411._3
467- let plusBearCol = $t01424014411._4
457+ let $t01427014343 = sp(defaultAddedTokens, maxPayout)
458+ let addedToCirculation = $t01427014343._1
459+ let extraTokens = $t01427014343._2
460+ let $t01436014531 = if ((token == BULL))
461+ then $Tuple4(defaultAddedTokens, addedCollateral, 0, 0)
462+ else $Tuple4(0, 0, defaultAddedTokens, addedCollateral)
463+ let plusBulls = $t01436014531._1
464+ let plusBullCol = $t01436014531._2
465+ let plusBears = $t01436014531._3
466+ let plusBearCol = $t01436014531._4
468467 if ((minPayout > addedToCirculation))
469468 then payback(mainToken)
470469 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))])
472471 else if ((action == REDEEM))
473472 then {
474473 let removedTokens = amt
475- let calcPo = if ((token == BULL))
474+ let estimatedPayout = if ((token == BULL))
476475 then fraction(bullCol, removedTokens, bullCirc)
477476 else if ((token == BEAR))
478477 then fraction(bearCol, removedTokens, bearCirc)
479478 else throw("bad token id")
480- let $t01532615375 = sp(calcPo, maxPayout)
481- let payoutCapped = $t01532615375._1
482- let extra = $t01532615375._2
483- let feeSize = fraction(payoutCapped, redeemPercentile, 10000)
484- let payout = if ((payoutCapped > feeSize))
485- then (payoutCapped - feeSize)
486- else 0
487- let $t01556115720 = if ((token == BULL))
488- then $Tuple4(removedTokens, payoutCapped, 0, 0)
489- else $Tuple4(0, 0, removedTokens, payoutCapped)
490- let minusBulls = $t01556115720._1
491- let minusBullCol = $t01556115720._2
492- let minusBears = $t01556115720._3
493- let minusBearCol = $t01556115720._4
494- if ((minPayout > payout))
479+ let feeSize = fraction(estimatedPayout, redeemPercentile, 10000)
480+ let defaultPayout = (estimatedPayout - feeSize)
481+ let $t01559815652 = sp(defaultPayout, maxPayout)
482+ let userPayout = $t01559815652._1
483+ let extra = $t01559815652._2
484+ let $t01566915834 = if ((token == BULL))
485+ then $Tuple4(removedTokens, estimatedPayout, 0, 0)
486+ else $Tuple4(0, 0, removedTokens, estimatedPayout)
487+ let minusBulls = $t01566915834._1
488+ let minusBullCol = $t01566915834._2
489+ let minusBears = $t01566915834._3
490+ let minusBearCol = $t01566915834._4
491+ if ((minPayout > userPayout))
495492 then payback(token)
496- else (poolSup((bullCol - minusBullCol), (bearCol - minusBearCol), (bullCirc - minusBulls), (bearCirc - minusBears)) ++ [SE(HEADK, next), collectFee(feeSize), decreaseQueueSize, ST(invoker, payout, fromBase58String(mainToken)), ST(feeAddress, extra, fromBase58String(mainToken))])
493+ 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))])
497494 }
498495 else if ((action == POOL))
499496 then {
550547
551548 let settledPriceIndex = valueOrErrorMessage(getInteger(this, REBIDXK), "inconsistent data")
552549 let unsettledPriceIndex = (settledPriceIndex + 1)
553- let settledPrice = priceByIndex(assetName, settledPriceIndex)
554- let nextPrice = priceByIndex(assetName, unsettledPriceIndex)
555- let minVol = if ((bearCol > bullCol))
556- then bullCol
557- else bearCol
558- let redist = LV(minVol, settledPrice, nextPrice, leverage)
559- let priceUpGoodForBulls = (assetName == "")
560- let priceGoesUp = (nextPrice > settledPrice)
561- let bullsEarn = (priceUpGoodForBulls == priceGoesUp)
562- let newBullCol = if (bullsEarn)
563- then (bullCol + redist)
564- else (bullCol - redist)
565- let newBearCol = if (bullsEarn)
566- then (bearCol - redist)
567- else (bearCol + redist)
568- let $t01960819794 = poolSupport(newBullCol, newBearCol, bullCirc, bearCirc, poolMain, poolUp, poolDwn)
569- let updBullCol = $t01960819794._1
570- let updBearCol = $t01960819794._2
571- let updBullCirc = $t01960819794._3
572- let updBearCirc = $t01960819794._4
573- let updPoolMain = $t01960819794._5
574- let updPoolUp = $t01960819794._6
575- let updPoolDwn = $t01960819794._7
550+ if (!(opn))
551+ then [IE(REBIDXK, unsettledPriceIndex)]
552+ else {
553+ let settledPrice = priceByIndex(assetName, settledPriceIndex)
554+ let nextPrice = priceByIndex(assetName, unsettledPriceIndex)
555+ let minVol = if ((bearCol > bullCol))
556+ then bullCol
557+ else bearCol
558+ let redist = LV(minVol, settledPrice, nextPrice, leverage)
559+ let priceUpGoodForBulls = (assetName == "")
560+ let priceGoesUp = (nextPrice > settledPrice)
561+ let bullsEarn = (priceUpGoodForBulls == priceGoesUp)
562+ let newBullCol = if (bullsEarn)
563+ then (bullCol + redist)
564+ else (bullCol - redist)
565+ let newBearCol = if (bullsEarn)
566+ then (bearCol - redist)
567+ else (bearCol + redist)
568+ let $t01982820018 = poolSupport(newBullCol, newBearCol, bullCirc, bearCirc, poolMain, poolUp, poolDwn)
569+ let updBullCol = $t01982820018._1
570+ let updBearCol = $t01982820018._2
571+ let updBullCirc = $t01982820018._3
572+ let updBearCirc = $t01982820018._4
573+ let updPoolMain = $t01982820018._5
574+ let updPoolUp = $t01982820018._6
575+ let updPoolDwn = $t01982820018._7
576576 [IE(BULLCOLK, updBullCol), IE(BEARCOLK, updBearCol), IE(BULLCIRCK, updBullCirc), IE(BEARCIRCK, updBearCirc), IE(POOLUSDNK, updPoolMain), IE(POOLUPK, updPoolUp), IE(POOLDWNK, updPoolDwn), IE(REBIDXK, unsettledPriceIndex)]
577+ }
577578 }
578579
579580
582583 else ((avg + avg) - min)
583584
584585
585-func requestIssueInternal (inv,tokenId,minPayout) = if (if ((tokenId != BULL))
586- then (tokenId != BEAR)
587- else false)
588- then throw("bad token req")
589- else if ((inv.caller == this))
590- then throw("can't do")
591- else if (!(allowed(inv.caller)))
592- then throw("only whitelisted can do")
593- else {
594- let errorMessage = (((("bad token req, only BULL(" + BULL) + ") or BEAR(") + BEAR) + ") allowed")
595- if ((inv.payments[0].assetId != fromBase58String(mainToken)))
596- then throw("bad token att")
597- else {
598- let amt = inv.payments[0].amount
599- let $t02080020978 = if ((tokenId == BULL))
600- then $Tuple2(bullCol, bullCirc)
601- else if ((tokenId == BEAR))
602- then $Tuple2(bearCol, bearCirc)
603- else throw(errorMessage)
604- let col = $t02080020978._1
605- let circ = $t02080020978._2
606- let est = fraction(amt, circ, col)
607- let $t02102021114 = if ((minPayout == 0))
608- then $Tuple2(0, MAX)
609- else $Tuple2(minPayout, calcMax(minPayout, est))
610- let minP = $t02102021114._1
611- let maxP = $t02102021114._2
612- if ((minIssue > amt))
613- then throw((("Attached payment too small. Min required: " + toString((minIssue / 1000000))) + " USDN"))
614- else {
615- let maxAllowed = maxIssue(tokenId)
616- if (if ((whitelist == ""))
617- then (inv.payments[0].amount > maxAllowed)
618- else false)
619- then throw((("trying to issue more than pool can handle. Max attachment allowed = " + toString((maxAllowed / 1000000))) + " USDN"))
620- else (enqueue(toBase58String(inv.transactionId), ISSUE, amt, tokenId, (oraclePriceIndex + 1), toString(inv.caller), minP, maxP) ++ [debug("requested", tokenId), debug("bull", BULL), debug("bear", BEAR)])
621- }
622- }
623- }
586+func requestIssueInternal (inv,tokenId,minPayout) = if (!(opn))
587+ then throw("markets closed")
588+ else if (if ((tokenId != BULL))
589+ then (tokenId != BEAR)
590+ else false)
591+ then throw("bad token req")
592+ else if ((inv.caller == this))
593+ then throw("can't do")
594+ else if (!(allowed(inv.caller)))
595+ then throw("only whitelisted can do")
596+ else {
597+ let errorMessage = (((("bad token req, only BULL(" + BULL) + ") or BEAR(") + BEAR) + ") allowed")
598+ if ((inv.payments[0].assetId != fromBase58String(mainToken)))
599+ then throw("bad token att")
600+ else {
601+ let amt = inv.payments[0].amount
602+ let $t02110921287 = if ((tokenId == BULL))
603+ then $Tuple2(bullCol, bullCirc)
604+ else if ((tokenId == BEAR))
605+ then $Tuple2(bearCol, bearCirc)
606+ else throw(errorMessage)
607+ let col = $t02110921287._1
608+ let circ = $t02110921287._2
609+ let est = fraction(amt, circ, col)
610+ let $t02132921423 = if ((minPayout == 0))
611+ then $Tuple2(0, MAX)
612+ else $Tuple2(minPayout, calcMax(minPayout, est))
613+ let minP = $t02132921423._1
614+ let maxP = $t02132921423._2
615+ if ((minIssue > amt))
616+ then throw((("Attached payment too small. Min required: " + toString((minIssue / 1000000))) + " USDN"))
617+ else {
618+ let maxAllowed = maxIssue(tokenId)
619+ if (if ((whitelist == ""))
620+ then (inv.payments[0].amount > maxAllowed)
621+ else false)
622+ then throw((("trying to issue more than pool can handle. Max attachment allowed = " + toString((maxAllowed / 1000000))) + " USDN"))
623+ else enqueue(toBase58String(inv.transactionId), ISSUE, amt, tokenId, (oraclePriceIndex + 1), toString(inv.caller), minP, maxP)
624+ }
625+ }
626+ }
624627
625628
626629 func requestRedeemInternal (inv,minPayout) = {
631634 else false)
632635 then throw("bad token req")
633636 else {
634- let $t02215122290 = if ((tokenId == BULL))
637+ let $t02238522524 = if ((tokenId == BULL))
635638 then $Tuple2(bullCol, bullCirc)
636639 else if ((tokenId == BEAR))
637640 then $Tuple2(bearCol, bearCirc)
638641 else throw("bad token req")
639- let col = $t02215122290._1
640- let circ = $t02215122290._2
642+ let col = $t02238522524._1
643+ let circ = $t02238522524._2
641644 let est = fraction(amt, col, circ)
642- let $t02233822432 = if ((minPayout == 0))
645+ let $t02257222666 = if ((minPayout == 0))
643646 then $Tuple2(0, MAX)
644647 else $Tuple2(minPayout, calcMax(minPayout, est))
645- let minP = $t02233822432._1
646- let maxP = $t02233822432._2
648+ let minP = $t02257222666._1
649+ let maxP = $t02257222666._2
647650 if ((validateRequestRedeem(inv) == unit))
648651 then enqueue(toBase58String(inv.transactionId), REDEEM, amt, tokenId, (oraclePriceIndex + 1), toString(inv.caller), minP, maxP)
649652 else throw("doesn't happen")
654657 func requestPoolInternal (inv,minPayout) = if (!(allowed(inv.caller)))
655658 then throw("only whitelisted can do")
656659 else {
657- let errMessage = (("main token must be attached(" + mainToken) + ")")
660+ let errMessage = "USDN required"
658661 let pmt = inv.payments[0]
659662 if ((pmt.assetId != fromBase58String(mainToken)))
660663 then throw(errMessage)
661664 else if ((minPool > pmt.amount))
662- then throw(((("pool at least " + toString(minPool)) + " ") + mainToken))
665+ then throw(("pool min: " + toString(minPool)))
663666 else {
664667 let estimate = fraction(poolTokenCirculation, pmt.amount, poolValue)
665- let $t02328023379 = if ((minPayout == 0))
668+ let $t02345923558 = if ((minPayout == 0))
666669 then $Tuple2(0, MAX)
667670 else $Tuple2(minPayout, calcMax(minPayout, estimate))
668- let minP = $t02328023379._1
669- let maxP = $t02328023379._2
671+ let minP = $t02345923558._1
672+ let maxP = $t02345923558._2
670673 enqueue(toBase58String(inv.transactionId), POOL, inv.payments[0].amount, "", (oraclePriceIndex + 1), toString(inv.caller), minP, maxP)
671674 }
672675 }
682685 if ((minPool > estimate))
683686 then throw(((("unpool at least for" + toString(minPool)) + " ") + mainToken))
684687 else {
685- let $t02403624135 = if ((minPayout == 0))
688+ let $t02421524314 = if ((minPayout == 0))
686689 then $Tuple2(0, MAX)
687690 else $Tuple2(minPayout, calcMax(minPayout, estimate))
688- let minP = $t02403624135._1
689- let maxP = $t02403624135._2
691+ let minP = $t02421524314._1
692+ let maxP = $t02421524314._2
690693 enqueue(toBase58String(inv.transactionId), UNPOOL, inv.payments[0].amount, "", (oraclePriceIndex + 1), toString(inv.caller), minP, maxP)
691694 }
692695 }
708711 else (pools == 0))
709712 then throw("can't init balances")
710713 else {
711- let oracleCurrentPriceIndex = valueOrErrorMessage(getInteger(valueOrErrorMessage(addressFromPublicKey(fromBase58String(oraclePK)), "bad oracle address"), lastPriceIndexKey(defoAssetName)), "can't find last oracle price index")
714+ let oracleCurrentPriceIndex = valueOrErrorMessage(getInteger(valueOrErrorMessage(addressFromPublicKey(fromBase58String(oraclePK)), "bad oracle address"), lastPriceIndexKey(defoAssetName)), "no last price index")
712715 let bull = Issue(nameup, descUp, ((100 * ten6) * ten6), 6, true)
713716 let bear = Issue(namedwn, descDwn, ((100 * ten6) * ten6), 6, true)
714717 let pool = Issue(poolName, poolDesc, ((100 * ten6) * ten6), 6, true)
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)
11-
12-
13-func debug (k,v) = SE(("__dbg__" + k), v)
1411
1512
1613 let ten6 = 1000000
1714
1815 let ten8 = 100000000
1916
2017 let MAX = 9223372036854775807
2118
2219 let configProviderKey = "configProvider"
2320
2421 let configProvider = match getString(this, configProviderKey) {
2522 case s: String =>
2623 addressFromStringValue(s)
2724 case _ =>
2825 this
2926 }
3027
3128 func localI (k,e) = valueOrErrorMessage(getInteger(this, k), e)
3229
3330
3431 func localS (k,e) = valueOrErrorMessage(getString(this, k), e)
3532
3633
3734 func confI (k,e) = valueOrErrorMessage(getInteger(configProvider, k), e)
3835
3936
4037 func confS (k,e) = valueOrErrorMessage(getString(configProvider, k), e)
4138
4239
4340 let BULLK = "BULLId"
4441
4542 let BEARK = "BEARId"
4643
4744 let USDNK = "mainTokenId"
4845
4946 let BULLCOLK = "bullCollateral"
5047
5148 let BEARCOLK = "bearCollateral"
5249
5350 let BULLCIRCK = "bullCirculation"
5451
5552 let BEARCIRCK = "bearCirculation"
5653
5754 let ISSPERCK = "issuePercentile"
5855
5956 let REDPERCK = "redeemPercentile"
6057
6158 let MINISSK = "minIssue"
6259
6360 let MINREDK = "minRedeem"
6461
6562 let MINPOOLK = "minPool"
6663
6764 let FEEACCK = "feesAccumulated"
6865
6966 let WLISTK = "issueWhiteList"
7067
7168 let REBPERCK = "rebalancePercentile"
7269
7370 let REBIDXK = "lastSettlementPriceId"
7471
7572 let HEADK = "headPointer"
7673
7774 let TAILK = "tailPointer"
7875
7976 let QSIZEK = "queueSize"
8077
8178 let POOLUSDNK = "poolMainTokenValue"
8279
8380 let POOLUPK = "poolUp"
8481
8582 let POOLDWNK = "poolDwn"
8683
8784 let POOLCIRCK = "poolTokenCirculation"
8885
8986 let POOLK = "poolToken"
9087
9188 let ASSNAMEK = "defoAssetName"
9289
9390 let LEVK = "leverage"
9491
9592 let WAVESFEEK = "wavesPacemakerFee"
9693
9794 let USDNFEEK = "usdnPacemakerFee"
9895
9996 let oraclePKKey = "oracle"
10097
10198 func lastPriceIndexKey (assetId) = if ((assetId == ""))
10299 then "price_index"
103100 else ("%s%s__idxCurrent__" + assetId)
104101
105102
106103 func priceIndexPrefix (assetId) = if ((assetId == ""))
107104 then "price_index_"
108105 else (("%s%s%d__idx2Height__" + assetId) + "__")
109106
110107
111108 func priceHeightPrefix (assetId) = if ((assetId == ""))
112109 then "price_"
113110 else (("%s%s%d__priceByHeight__" + assetId) + "__")
114111
115112
116113 let minUsdnFee = valueOrElse(getInteger(configProvider, USDNFEEK), 0)
117114
118115 let minWavesFee = valueOrElse(getInteger(configProvider, WAVESFEEK), 0)
119116
120117 let assetName = valueOrElse(getString(this, ASSNAMEK), "")
121118
122119 let bullCol = localI(BULLCOLK, "no 0")
123120
124121 let bearCol = localI(BEARCOLK, "no 1")
125122
126123 let bullCirc = localI(BULLCIRCK, "no 2")
127124
128125 let bearCirc = localI(BEARCIRCK, "no 3")
129126
130127 let BULL = localS(BULLK, "no 14")
131128
132129 let BEAR = localS(BEARK, "no 15")
133130
134131 let mainToken = localS(USDNK, "no 16")
135132
136133 let issuePercentile = confI(ISSPERCK, "no 4")
137134
138135 let redeemPercentile = confI(REDPERCK, "no 5")
139136
140137 let minIssue = confI(MINISSK, "no 6")
141138
142139 let minRedeem = confI(MINREDK, "no 7")
143140
144141 let minPool = confI(MINPOOLK, "no 8")
145142
146143 let rebalancePercentile = valueOrElse(getInteger(configProvider, ((toString(this) + "_") + REBPERCK)), 0)
147144
148145 let whitelist = confS(WLISTK, "no 9")
149146
150147 func allowed (a) = if ((whitelist == ""))
151148 then true
152149 else isDefined(indexOf(whitelist, toString(a)))
153150
154151
155152 let poolMain = localI(POOLUSDNK, "no")
156153
157154 let poolUp = localI(POOLUPK, "no 10")
158155
159156 let poolDwn = localI(POOLDWNK, "no 11")
160157
161158 let poolToken = localS(POOLK, "no 12")
162159
163160 let poolTokenCirculation = localI(POOLCIRCK, "no 13")
164161
165162 let poolBullExposure = fraction(bullCol, poolUp, bullCirc)
166163
167164 let poolBearExposure = fraction(bearCol, poolDwn, bearCirc)
168165
169166 let poolValue = ((poolMain + poolBullExposure) + poolBearExposure)
170167
171168 let oracle = valueOrErrorMessage(addressFromPublicKey(fromBase58String(valueOrErrorMessage(getString(this, oraclePKKey), "no oraclePKKey"))), "bad oracle address")
172169
173170 let rebalancedPriceIndex = valueOrErrorMessage(getInteger(this, REBIDXK), "no last rebalance price")
174171
175172 let oraclePriceIndex = valueOrErrorMessage(getInteger(oracle, lastPriceIndexKey(assetName)), ((("bad oracle data at " + toString(oracle)) + ": no integer at ") + lastPriceIndexKey(assetName)))
176173
177174 let leverage = valueOrElse(getInteger(this, LEVK), 3)
178175
179176 func heightByIndex (assetName,priceIndex) = valueOrErrorMessage(getInteger(oracle, (priceIndexPrefix(assetName) + toString(priceIndex))), ("no data at index " + toString(priceIndex)))
180177
181178
182179 func priceByHeight (assetName,priceHeight) = valueOrErrorMessage(getInteger(oracle, (priceHeightPrefix(assetName) + toString(priceHeight))), ("no data for height " + toString(priceHeight)))
183180
184181
185182 func priceByIndex (assetName,priceIndex) = priceByHeight(assetName, heightByIndex(assetName, priceIndex))
186183
187184
188185 let queueSize = valueOrElse(getInteger(this, QSIZEK), 0)
189186
190187 let headPointer = valueOrElse(getString(this, HEADK), "")
191188
192189 let tailPointer = valueOrElse(getString(this, TAILK), "")
193190
194191 let feesAccumulated = valueOrElse(getInteger(this, FEEACCK), 0)
195192
196193 let ISSUE = "ISSUE"
197194
198195 let REDEEM = "REDEEM"
199196
200197 let POOL = "POOL"
201198
202199 let UNPOOL = "UNPOOL"
203200
204201 let feeAddrKey = "feeAddress"
205202
206203 let stakingAddrKey = "stakingAddress"
207204
208205 let daemonPubKeyKey = "daemonPublicKey"
209206
210207 let feeAddress = valueOrErrorMessage(addressFromString(confS(feeAddrKey, "no feeAddress")), "bad feeAddress")
211208
212209 let stakingAddress = confS(stakingAddrKey, "no stakingAddress")
213210
214211 let daemonPublicKey = fromBase58String(confS(daemonPubKeyKey, "no daemonPublicKey"))
215212
216213 let rpdAddress = addressFromString("3PNikM6yp4NqcSU8guxQtmR5onr2D4e8yTJ")
217214
218215 let admins = ["2HHqV8W9DJayV5R6tBD2Sb8srphpoboDi7r1t1aPiumC", "5ZXe82RRASU7qshXM2J9JNYhqJ9GWYjjVq2gwUV5Naz9", "5WRXFSjwcTbNfKcJs8ZqXmSSWYsSVJUtMvMqZj5hH4Nc"]
219216
217+let opn = valueOrElse(getBoolean(oracle, ("%s%s__isMarketOpened__" + assetName)), true)
218+
220219 func buildNewItem (action,amt,token,priceIndex,invoker,minPayout,maxPayout) = (((((((((((((action + "|") + toString(amt)) + "|") + token) + "|") + toString(priceIndex)) + "|") + invoker) + "|") + toString(minPayout)) + "|") + toString(maxPayout)) + "|")
221220
222221
223222 func userDiffAbs () = {
224- let $t057975886 = $Tuple2((bullCol - poolBullExposure), (bearCol - poolBearExposure))
225- let userBullCol = $t057975886._1
226- let userBearCol = $t057975886._2
223+ let $t058835972 = $Tuple2((bullCol - poolBullExposure), (bearCol - poolBearExposure))
224+ let userBullCol = $t058835972._1
225+ let userBearCol = $t058835972._2
227226 let diff = (userBullCol - userBearCol)
228227 if ((diff > 0))
229228 then diff
230229 else (0 - diff)
231230 }
232231
233232
234233 func maxIssue (tokenId) = {
235234 let poolInvestment = if ((poolUp > 0))
236235 then BULL
237236 else BEAR
238237 if ((tokenId != poolInvestment))
239238 then poolMain
240239 else (userDiffAbs() + poolValue)
241240 }
242241
243242
244243 func validatePMFee (i,minPayout) = if ((0 > minPayout))
245244 then throw("negative min payout")
246245 else {
247246 let p = i.payments[1]
248247 let ok = match p.assetId {
249248 case bv: ByteVector =>
250249 if ((toBase58String(bv) == mainToken))
251250 then (p.amount >= minUsdnFee)
252251 else false
253252 case waves: Unit =>
254253 (p.amount >= minWavesFee)
255254 case _ =>
256255 throw("Match error")
257256 }
258257 if (!(ok))
259258 then throw("incorrect pacemaker fee")
260259 else true
261260 }
262261
263262
264263 func validateRequestRedeem (inv) = if ((inv.caller == this))
265264 then throw("can't do")
266265 else {
267266 func errorMessage (got) = throw(((((("bad token att: only BULL(" + BULL) + ") or BEAR(") + BEAR) + ") tokens are accepted, received: ") + got))
268267
269268 let assetId = toBase58String(valueOrErrorMessage(value(inv.payments[0]).assetId, "bad token att"))
270269 if (if ((assetId != BEAR))
271270 then (assetId != BULL)
272271 else false)
273272 then errorMessage(assetId)
274273 else {
275274 let attachedAmount = inv.payments[0].amount
276275 let col = if ((assetId == BEAR))
277276 then bearCol
278277 else bullCol
279278 let circ = if ((assetId == BEAR))
280279 then bearCirc
281280 else bullCirc
282281 let estimated = fraction(col, attachedAmount, circ)
283282 if ((minRedeem > estimated))
284283 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)))
285284 else unit
286285 }
287286 }
288287
289288
290289 func enqueue (id,action,amt,token,priceIndex,invoker,minPayout,maxPayout) = {
291290 let increaseQueueSize = IE(QSIZEK, (queueSize + 1))
292291 let itm = buildNewItem(action, amt, token, priceIndex, invoker, minPayout, maxPayout)
293292 if ((queueSize == 0))
294293 then [SE(HEADK, id), SE(TAILK, id), SE(id, itm), increaseQueueSize]
295294 else {
296295 let prevId = localS(TAILK, "can't get tail pointer")
297296 let prevItm = localS(prevId, "can't resolve pointer")
298297 let updatedPrevItm = (prevItm + id)
299298 [SE(prevId, updatedPrevItm), SE(id, itm), SE(TAILK, id), increaseQueueSize]
300299 }
301300 }
302301
303302
304303 func poolSupport (curBullCol0,curBearCol0,curBullCirc0,curBearCirc0,curPoolMain0,curPoolUp0,curPoolDwn0) = {
305304 func closeUp (c1,c2,a0,a1,c0,pu,pd) = {
306305 let diff = (c1 - c2)
307306 let exp = fraction(c1, pu, a0)
308307 let liquidatedTokens = if ((diff > exp))
309308 then pu
310309 else fraction(diff, a0, c1)
311310 let liquidatedValue = if ((diff > exp))
312311 then exp
313312 else fraction(liquidatedTokens, c1, a0)
314313 $Tuple7((c1 - liquidatedValue), c2, (a0 - liquidatedTokens), a1, (c0 + liquidatedValue), (pu - liquidatedTokens), pd)
315314 }
316315
317316 func closeDwn (c1,c2,a0,a1,c0,pu,pd) = {
318317 let diff = (c2 - c1)
319318 let exp = fraction(c2, pd, a1)
320319 let liquidatedTokens = if ((diff > exp))
321320 then pd
322321 else fraction(diff, a1, c2)
323322 let liquidatedValue = if ((diff > exp))
324323 then exp
325324 else fraction(liquidatedTokens, c2, a1)
326325 $Tuple7(c1, (c2 - liquidatedValue), a0, (a1 - liquidatedTokens), (c0 + liquidatedValue), pu, (pd - liquidatedTokens))
327326 }
328327
329328 func openDwn (c1,c2,a0,a1,c0,pu,pd) = {
330329 let diff = (c1 - c2)
331330 let spentPoolValue = if ((c0 > diff))
332331 then diff
333332 else c0
334333 let acquiredTokens = fraction(spentPoolValue, a1, c2)
335334 $Tuple7(c1, (c2 + spentPoolValue), a0, (a1 + acquiredTokens), (c0 - spentPoolValue), pu, (pd + acquiredTokens))
336335 }
337336
338337 func openUp (c1,c2,a0,a1,c0,pu,pd) = {
339338 let diff = (c2 - c1)
340339 let spentPoolValue = if ((c0 > diff))
341340 then diff
342341 else c0
343342 let acquiredTokens = fraction(spentPoolValue, a0, c1)
344343 $Tuple7((c1 + spentPoolValue), c2, (a0 + acquiredTokens), a1, (c0 - spentPoolValue), (pu + acquiredTokens), pd)
345344 }
346345
347- let $t01025511290 = if ((curBullCol0 > curBearCol0))
346+ let $t01034111376 = if ((curBullCol0 > curBearCol0))
348347 then {
349348 let afterCloseUp = closeUp(curBullCol0, curBearCol0, curBullCirc0, curBearCirc0, curPoolMain0, curPoolUp0, curPoolDwn0)
350- let $t01048110618 = afterCloseUp
351- let a = $t01048110618._1
352- let b = $t01048110618._2
353- let c = $t01048110618._3
354- let d = $t01048110618._4
355- let e = $t01048110618._5
356- let f = $t01048110618._6
357- let g = $t01048110618._7
349+ let $t01056710704 = afterCloseUp
350+ let a = $t01056710704._1
351+ let b = $t01056710704._2
352+ let c = $t01056710704._3
353+ let d = $t01056710704._4
354+ let e = $t01056710704._5
355+ let f = $t01056710704._6
356+ let g = $t01056710704._7
358357 if ((f > 0))
359358 then afterCloseUp
360359 else if ((f == 0))
361360 then openDwn(a, b, c, d, e, f, g)
362361 else throw("poolUp < 0")
363362 }
364363 else {
365364 let afterCloseDwn = closeDwn(curBullCol0, curBearCol0, curBullCirc0, curBearCirc0, curPoolMain0, curPoolUp0, curPoolDwn0)
366- let $t01096911109 = afterCloseDwn
367- let a = $t01096911109._1
368- let b = $t01096911109._2
369- let c = $t01096911109._3
370- let d = $t01096911109._4
371- let e = $t01096911109._5
372- let f = $t01096911109._6
373- let g = $t01096911109._7
365+ let $t01105511195 = afterCloseDwn
366+ let a = $t01105511195._1
367+ let b = $t01105511195._2
368+ let c = $t01105511195._3
369+ let d = $t01105511195._4
370+ let e = $t01105511195._5
371+ let f = $t01105511195._6
372+ let g = $t01105511195._7
374373 if ((g > 0))
375374 then afterCloseDwn
376375 else if ((g == 0))
377376 then openUp(a, b, c, d, e, f, g)
378377 else throw("poolDwn < 0")
379378 }
380- let c1 = $t01025511290._1
381- let c2 = $t01025511290._2
382- let a0 = $t01025511290._3
383- let a1 = $t01025511290._4
384- let c0 = $t01025511290._5
385- let pu = $t01025511290._6
386- let pd = $t01025511290._7
379+ let c1 = $t01034111376._1
380+ let c2 = $t01034111376._2
381+ let a0 = $t01034111376._3
382+ let a1 = $t01034111376._4
383+ let c0 = $t01034111376._5
384+ let pu = $t01034111376._6
385+ let pd = $t01034111376._7
387386 let charge = fraction(userDiffAbs(), rebalancePercentile, ((1440 * 100) * 100))
388387 let percentileActivated = (height >= valueOrElse(getInteger(configProvider, "percentileActivationHeight"), 10000000))
389388 let c1SplitP = if (if (percentileActivated)
390389 then (pd > 0)
391390 else false)
392391 then charge
393392 else 0
394393 let c2SplitP = if (if (percentileActivated)
395394 then (pu > 0)
396395 else false)
397396 then charge
398397 else 0
399398 $Tuple7((c1 - c1SplitP), (c2 - c2SplitP), a0, a1, ((c0 + c1SplitP) + c2SplitP), pu, pd)
400399 }
401400
402401
403402 func poolSup (curBullCol0,curBearCol0,curBullCirc0,curBearCirc0) = {
404- let $t01187112053 = poolSupport(curBullCol0, curBearCol0, curBullCirc0, curBearCirc0, poolMain, poolUp, poolDwn)
405- let bullCol1 = $t01187112053._1
406- let bearCol1 = $t01187112053._2
407- let bullCic1 = $t01187112053._3
408- let bearCirc1 = $t01187112053._4
409- let poolMain1 = $t01187112053._5
410- let poolUp1 = $t01187112053._6
411- let poolDwn1 = $t01187112053._7
403+ let $t01195712139 = poolSupport(curBullCol0, curBearCol0, curBullCirc0, curBearCirc0, poolMain, poolUp, poolDwn)
404+ let bullCol1 = $t01195712139._1
405+ let bearCol1 = $t01195712139._2
406+ let bullCic1 = $t01195712139._3
407+ let bearCirc1 = $t01195712139._4
408+ let poolMain1 = $t01195712139._5
409+ let poolUp1 = $t01195712139._6
410+ let poolDwn1 = $t01195712139._7
412411 [IE(BULLCOLK, bullCol1), IE(BULLCIRCK, bullCic1), IE(BEARCOLK, bearCol1), IE(BEARCIRCK, bearCirc1), IE(POOLUSDNK, poolMain1), IE(POOLUPK, poolUp1), IE(POOLDWNK, poolDwn1)]
413412 }
414413
415414
416415 func dequeue () = {
417416 func sp (a,mx) = if ((mx >= a))
418417 then $Tuple2(a, 0)
419418 else $Tuple2(mx, (a - mx))
420419
421420 if ((queueSize == 0))
422421 then throw("nothing to settle")
423422 else {
424423 func collectFee (fees) = IE(FEEACCK, (feesAccumulated + fees))
425424
426425 let decreaseQueueSize = IE(QSIZEK, (queueSize - 1))
427426 let isLastElement = (headPointer == tailPointer)
428427 let overwriteTail = SE(TAILK, "")
429428 let dataStr = localS(headPointer, "bad head pointer(dequeue)")
430429 let data = split(dataStr, "|")
431430 let action = data[0]
432431 let amt = parseIntValue(data[1])
433432 let token = data[2]
434433 let priceIndex = parseIntValue(data[3])
435434 let invoker = addressFromStringValue(data[4])
436435 let minPayout = if ((8 > size(data)))
437436 then 0
438437 else parseIntValue(data[5])
439438 let maxPayout = if ((8 > size(data)))
440439 then MAX
441440 else parseIntValue(data[6])
442441 let next = data[(size(data) - 1)]
443442 func payback (tkn) = [SE(HEADK, next), decreaseQueueSize, ST(invoker, amt, fromBase58String(tkn))]
444443
445444 let items = if ((rebalancedPriceIndex > priceIndex))
446445 then throw(((("corrupt state, rebalancedPriceIndex=" + toString(rebalancedPriceIndex)) + ", request price id=") + toString(priceIndex)))
447446 else if ((priceIndex > rebalancedPriceIndex))
448447 then throw("can't dequeue, too early, rebalance first")
449448 else if ((action == ISSUE))
450449 then {
451450 let feeSize = fraction(amt, issuePercentile, 10000)
452451 let addedCollateral = (amt - feeSize)
453- let a = if ((token == BULL))
452+ let defaultAddedTokens = if ((token == BULL))
454453 then fraction(bullCirc, addedCollateral, bullCol)
455454 else if ((token == BEAR))
456455 then fraction(bearCirc, addedCollateral, bearCol)
457456 else throw("bad token id")
458- let $t01416714223 = sp(a, maxPayout)
459- let addedToCirculation = $t01416714223._1
460- let extraTokens = $t01416714223._2
461- let $t01424014411 = if ((token == BULL))
462- then $Tuple4(addedToCirculation, addedCollateral, 0, 0)
463- else $Tuple4(0, 0, addedToCirculation, addedCollateral)
464- let plusBulls = $t01424014411._1
465- let plusBullCol = $t01424014411._2
466- let plusBears = $t01424014411._3
467- let plusBearCol = $t01424014411._4
457+ let $t01427014343 = sp(defaultAddedTokens, maxPayout)
458+ let addedToCirculation = $t01427014343._1
459+ let extraTokens = $t01427014343._2
460+ let $t01436014531 = if ((token == BULL))
461+ then $Tuple4(defaultAddedTokens, addedCollateral, 0, 0)
462+ else $Tuple4(0, 0, defaultAddedTokens, addedCollateral)
463+ let plusBulls = $t01436014531._1
464+ let plusBullCol = $t01436014531._2
465+ let plusBears = $t01436014531._3
466+ let plusBearCol = $t01436014531._4
468467 if ((minPayout > addedToCirculation))
469468 then payback(mainToken)
470469 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))])
471470 }
472471 else if ((action == REDEEM))
473472 then {
474473 let removedTokens = amt
475- let calcPo = if ((token == BULL))
474+ let estimatedPayout = if ((token == BULL))
476475 then fraction(bullCol, removedTokens, bullCirc)
477476 else if ((token == BEAR))
478477 then fraction(bearCol, removedTokens, bearCirc)
479478 else throw("bad token id")
480- let $t01532615375 = sp(calcPo, maxPayout)
481- let payoutCapped = $t01532615375._1
482- let extra = $t01532615375._2
483- let feeSize = fraction(payoutCapped, redeemPercentile, 10000)
484- let payout = if ((payoutCapped > feeSize))
485- then (payoutCapped - feeSize)
486- else 0
487- let $t01556115720 = if ((token == BULL))
488- then $Tuple4(removedTokens, payoutCapped, 0, 0)
489- else $Tuple4(0, 0, removedTokens, payoutCapped)
490- let minusBulls = $t01556115720._1
491- let minusBullCol = $t01556115720._2
492- let minusBears = $t01556115720._3
493- let minusBearCol = $t01556115720._4
494- if ((minPayout > payout))
479+ let feeSize = fraction(estimatedPayout, redeemPercentile, 10000)
480+ let defaultPayout = (estimatedPayout - feeSize)
481+ let $t01559815652 = sp(defaultPayout, maxPayout)
482+ let userPayout = $t01559815652._1
483+ let extra = $t01559815652._2
484+ let $t01566915834 = if ((token == BULL))
485+ then $Tuple4(removedTokens, estimatedPayout, 0, 0)
486+ else $Tuple4(0, 0, removedTokens, estimatedPayout)
487+ let minusBulls = $t01566915834._1
488+ let minusBullCol = $t01566915834._2
489+ let minusBears = $t01566915834._3
490+ let minusBearCol = $t01566915834._4
491+ if ((minPayout > userPayout))
495492 then payback(token)
496- else (poolSup((bullCol - minusBullCol), (bearCol - minusBearCol), (bullCirc - minusBulls), (bearCirc - minusBears)) ++ [SE(HEADK, next), collectFee(feeSize), decreaseQueueSize, ST(invoker, payout, fromBase58String(mainToken)), ST(feeAddress, extra, fromBase58String(mainToken))])
493+ 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))])
497494 }
498495 else if ((action == POOL))
499496 then {
500497 let issueTokens = fraction(poolTokenCirculation, amt, poolValue)
501498 if ((minPayout > issueTokens))
502499 then payback(mainToken)
503500 else [IE(POOLUSDNK, (poolMain + amt)), IE(POOLCIRCK, (poolTokenCirculation + issueTokens)), SE(HEADK, next), decreaseQueueSize, ST(invoker, issueTokens, fromBase58String(poolToken))]
504501 }
505502 else if ((action == UNPOOL))
506503 then {
507504 func share (a) = fraction(a, amt, poolTokenCirculation)
508505
509506 let unpooledMain = share(poolMain)
510507 let unpooledUp = share(poolUp)
511508 let unpooledDwn = share(poolDwn)
512509 let unpooledUpValue = fraction(unpooledUp, bullCol, bullCirc)
513510 let unpooledDwnValue = fraction(unpooledDwn, bearCol, bearCirc)
514511 let totalUnpooledValue = ((unpooledMain + unpooledUpValue) + unpooledDwnValue)
515512 if ((minPayout > totalUnpooledValue))
516513 then payback(poolToken)
517514 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))]
518515 }
519516 else throw(("bad action: " + action))
520517 if (isLastElement)
521518 then overwriteTail :: items
522519 else items
523520 }
524521 }
525522
526523
527524 func rebalance () = {
528525 func LV (v,p0,p1,m) = {
529526 let denom = {
530527 let md = (((2 * (if ((p1 > p0))
531528 then p1
532529 else p0)) * m) / 3037000499)
533530 if ((10 > md))
534531 then 10
535532 else if ((100 > md))
536533 then 100
537534 else 1000
538535 }
539536 let pmax = ((if ((p1 > p0))
540537 then p1
541538 else p0) / denom)
542539 let pmin = ((if ((p0 > p1))
543540 then p1
544541 else p0) / denom)
545542 let a = (pmin * pmin)
546543 let b = ((((m * m) * pmax) * pmax) - (((((2 * m) * m) - m) * pmax) * pmin))
547544 let ma = ((m * m) - m)
548545 fraction(v, ((ma * a) + b), (((ma + 1) * a) + b))
549546 }
550547
551548 let settledPriceIndex = valueOrErrorMessage(getInteger(this, REBIDXK), "inconsistent data")
552549 let unsettledPriceIndex = (settledPriceIndex + 1)
553- let settledPrice = priceByIndex(assetName, settledPriceIndex)
554- let nextPrice = priceByIndex(assetName, unsettledPriceIndex)
555- let minVol = if ((bearCol > bullCol))
556- then bullCol
557- else bearCol
558- let redist = LV(minVol, settledPrice, nextPrice, leverage)
559- let priceUpGoodForBulls = (assetName == "")
560- let priceGoesUp = (nextPrice > settledPrice)
561- let bullsEarn = (priceUpGoodForBulls == priceGoesUp)
562- let newBullCol = if (bullsEarn)
563- then (bullCol + redist)
564- else (bullCol - redist)
565- let newBearCol = if (bullsEarn)
566- then (bearCol - redist)
567- else (bearCol + redist)
568- let $t01960819794 = poolSupport(newBullCol, newBearCol, bullCirc, bearCirc, poolMain, poolUp, poolDwn)
569- let updBullCol = $t01960819794._1
570- let updBearCol = $t01960819794._2
571- let updBullCirc = $t01960819794._3
572- let updBearCirc = $t01960819794._4
573- let updPoolMain = $t01960819794._5
574- let updPoolUp = $t01960819794._6
575- let updPoolDwn = $t01960819794._7
550+ if (!(opn))
551+ then [IE(REBIDXK, unsettledPriceIndex)]
552+ else {
553+ let settledPrice = priceByIndex(assetName, settledPriceIndex)
554+ let nextPrice = priceByIndex(assetName, unsettledPriceIndex)
555+ let minVol = if ((bearCol > bullCol))
556+ then bullCol
557+ else bearCol
558+ let redist = LV(minVol, settledPrice, nextPrice, leverage)
559+ let priceUpGoodForBulls = (assetName == "")
560+ let priceGoesUp = (nextPrice > settledPrice)
561+ let bullsEarn = (priceUpGoodForBulls == priceGoesUp)
562+ let newBullCol = if (bullsEarn)
563+ then (bullCol + redist)
564+ else (bullCol - redist)
565+ let newBearCol = if (bullsEarn)
566+ then (bearCol - redist)
567+ else (bearCol + redist)
568+ let $t01982820018 = poolSupport(newBullCol, newBearCol, bullCirc, bearCirc, poolMain, poolUp, poolDwn)
569+ let updBullCol = $t01982820018._1
570+ let updBearCol = $t01982820018._2
571+ let updBullCirc = $t01982820018._3
572+ let updBearCirc = $t01982820018._4
573+ let updPoolMain = $t01982820018._5
574+ let updPoolUp = $t01982820018._6
575+ let updPoolDwn = $t01982820018._7
576576 [IE(BULLCOLK, updBullCol), IE(BEARCOLK, updBearCol), IE(BULLCIRCK, updBullCirc), IE(BEARCIRCK, updBearCirc), IE(POOLUSDNK, updPoolMain), IE(POOLUPK, updPoolUp), IE(POOLDWNK, updPoolDwn), IE(REBIDXK, unsettledPriceIndex)]
577+ }
577578 }
578579
579580
580581 func calcMax (min,avg) = if ((min > avg))
581582 then throw(((("price too old: minPayout " + toString(min)) + " > avg = ") + toString(avg)))
582583 else ((avg + avg) - min)
583584
584585
585-func requestIssueInternal (inv,tokenId,minPayout) = if (if ((tokenId != BULL))
586- then (tokenId != BEAR)
587- else false)
588- then throw("bad token req")
589- else if ((inv.caller == this))
590- then throw("can't do")
591- else if (!(allowed(inv.caller)))
592- then throw("only whitelisted can do")
593- else {
594- let errorMessage = (((("bad token req, only BULL(" + BULL) + ") or BEAR(") + BEAR) + ") allowed")
595- if ((inv.payments[0].assetId != fromBase58String(mainToken)))
596- then throw("bad token att")
597- else {
598- let amt = inv.payments[0].amount
599- let $t02080020978 = if ((tokenId == BULL))
600- then $Tuple2(bullCol, bullCirc)
601- else if ((tokenId == BEAR))
602- then $Tuple2(bearCol, bearCirc)
603- else throw(errorMessage)
604- let col = $t02080020978._1
605- let circ = $t02080020978._2
606- let est = fraction(amt, circ, col)
607- let $t02102021114 = if ((minPayout == 0))
608- then $Tuple2(0, MAX)
609- else $Tuple2(minPayout, calcMax(minPayout, est))
610- let minP = $t02102021114._1
611- let maxP = $t02102021114._2
612- if ((minIssue > amt))
613- then throw((("Attached payment too small. Min required: " + toString((minIssue / 1000000))) + " USDN"))
614- else {
615- let maxAllowed = maxIssue(tokenId)
616- if (if ((whitelist == ""))
617- then (inv.payments[0].amount > maxAllowed)
618- else false)
619- then throw((("trying to issue more than pool can handle. Max attachment allowed = " + toString((maxAllowed / 1000000))) + " USDN"))
620- else (enqueue(toBase58String(inv.transactionId), ISSUE, amt, tokenId, (oraclePriceIndex + 1), toString(inv.caller), minP, maxP) ++ [debug("requested", tokenId), debug("bull", BULL), debug("bear", BEAR)])
621- }
622- }
623- }
586+func requestIssueInternal (inv,tokenId,minPayout) = if (!(opn))
587+ then throw("markets closed")
588+ else if (if ((tokenId != BULL))
589+ then (tokenId != BEAR)
590+ else false)
591+ then throw("bad token req")
592+ else if ((inv.caller == this))
593+ then throw("can't do")
594+ else if (!(allowed(inv.caller)))
595+ then throw("only whitelisted can do")
596+ else {
597+ let errorMessage = (((("bad token req, only BULL(" + BULL) + ") or BEAR(") + BEAR) + ") allowed")
598+ if ((inv.payments[0].assetId != fromBase58String(mainToken)))
599+ then throw("bad token att")
600+ else {
601+ let amt = inv.payments[0].amount
602+ let $t02110921287 = if ((tokenId == BULL))
603+ then $Tuple2(bullCol, bullCirc)
604+ else if ((tokenId == BEAR))
605+ then $Tuple2(bearCol, bearCirc)
606+ else throw(errorMessage)
607+ let col = $t02110921287._1
608+ let circ = $t02110921287._2
609+ let est = fraction(amt, circ, col)
610+ let $t02132921423 = if ((minPayout == 0))
611+ then $Tuple2(0, MAX)
612+ else $Tuple2(minPayout, calcMax(minPayout, est))
613+ let minP = $t02132921423._1
614+ let maxP = $t02132921423._2
615+ if ((minIssue > amt))
616+ then throw((("Attached payment too small. Min required: " + toString((minIssue / 1000000))) + " USDN"))
617+ else {
618+ let maxAllowed = maxIssue(tokenId)
619+ if (if ((whitelist == ""))
620+ then (inv.payments[0].amount > maxAllowed)
621+ else false)
622+ then throw((("trying to issue more than pool can handle. Max attachment allowed = " + toString((maxAllowed / 1000000))) + " USDN"))
623+ else enqueue(toBase58String(inv.transactionId), ISSUE, amt, tokenId, (oraclePriceIndex + 1), toString(inv.caller), minP, maxP)
624+ }
625+ }
626+ }
624627
625628
626629 func requestRedeemInternal (inv,minPayout) = {
627630 let amt = inv.payments[0].amount
628631 let tokenId = toBase58String(valueOrErrorMessage(inv.payments[0].assetId, "bad token att"))
629632 if (if ((tokenId != BULL))
630633 then (tokenId != BEAR)
631634 else false)
632635 then throw("bad token req")
633636 else {
634- let $t02215122290 = if ((tokenId == BULL))
637+ let $t02238522524 = if ((tokenId == BULL))
635638 then $Tuple2(bullCol, bullCirc)
636639 else if ((tokenId == BEAR))
637640 then $Tuple2(bearCol, bearCirc)
638641 else throw("bad token req")
639- let col = $t02215122290._1
640- let circ = $t02215122290._2
642+ let col = $t02238522524._1
643+ let circ = $t02238522524._2
641644 let est = fraction(amt, col, circ)
642- let $t02233822432 = if ((minPayout == 0))
645+ let $t02257222666 = if ((minPayout == 0))
643646 then $Tuple2(0, MAX)
644647 else $Tuple2(minPayout, calcMax(minPayout, est))
645- let minP = $t02233822432._1
646- let maxP = $t02233822432._2
648+ let minP = $t02257222666._1
649+ let maxP = $t02257222666._2
647650 if ((validateRequestRedeem(inv) == unit))
648651 then enqueue(toBase58String(inv.transactionId), REDEEM, amt, tokenId, (oraclePriceIndex + 1), toString(inv.caller), minP, maxP)
649652 else throw("doesn't happen")
650653 }
651654 }
652655
653656
654657 func requestPoolInternal (inv,minPayout) = if (!(allowed(inv.caller)))
655658 then throw("only whitelisted can do")
656659 else {
657- let errMessage = (("main token must be attached(" + mainToken) + ")")
660+ let errMessage = "USDN required"
658661 let pmt = inv.payments[0]
659662 if ((pmt.assetId != fromBase58String(mainToken)))
660663 then throw(errMessage)
661664 else if ((minPool > pmt.amount))
662- then throw(((("pool at least " + toString(minPool)) + " ") + mainToken))
665+ then throw(("pool min: " + toString(minPool)))
663666 else {
664667 let estimate = fraction(poolTokenCirculation, pmt.amount, poolValue)
665- let $t02328023379 = if ((minPayout == 0))
668+ let $t02345923558 = if ((minPayout == 0))
666669 then $Tuple2(0, MAX)
667670 else $Tuple2(minPayout, calcMax(minPayout, estimate))
668- let minP = $t02328023379._1
669- let maxP = $t02328023379._2
671+ let minP = $t02345923558._1
672+ let maxP = $t02345923558._2
670673 enqueue(toBase58String(inv.transactionId), POOL, inv.payments[0].amount, "", (oraclePriceIndex + 1), toString(inv.caller), minP, maxP)
671674 }
672675 }
673676
674677
675678 func requestUnpoolInternal (inv,minPayout) = {
676679 let errMessage = (("only pool token allowed(" + poolToken) + ")")
677680 let pmt = inv.payments[0]
678681 if ((pmt.assetId != fromBase58String(poolToken)))
679682 then throw(errMessage)
680683 else {
681684 let estimate = fraction(poolValue, pmt.amount, poolTokenCirculation)
682685 if ((minPool > estimate))
683686 then throw(((("unpool at least for" + toString(minPool)) + " ") + mainToken))
684687 else {
685- let $t02403624135 = if ((minPayout == 0))
688+ let $t02421524314 = if ((minPayout == 0))
686689 then $Tuple2(0, MAX)
687690 else $Tuple2(minPayout, calcMax(minPayout, estimate))
688- let minP = $t02403624135._1
689- let maxP = $t02403624135._2
691+ let minP = $t02421524314._1
692+ let maxP = $t02421524314._2
690693 enqueue(toBase58String(inv.transactionId), UNPOOL, inv.payments[0].amount, "", (oraclePriceIndex + 1), toString(inv.caller), minP, maxP)
691694 }
692695 }
693696 }
694697
695698
696699 @Callable(inv)
697700 func init (config,oraclePK,nameup,namedwn,descUp,descDwn,poolName,poolDesc,defoAssetName,denom,lev) = if (isDefined(getString(this, BULLK)))
698701 then throw("already initialized")
699702 else {
700703 let totalOwnedMainToken = inv.payments[0].amount
701704 let bulls = (totalOwnedMainToken / 3)
702705 let bears = bulls
703706 let pools = ((totalOwnedMainToken - bulls) - bears)
704707 if (if (if ((bears == 0))
705708 then true
706709 else (bulls == 0))
707710 then true
708711 else (pools == 0))
709712 then throw("can't init balances")
710713 else {
711- let oracleCurrentPriceIndex = valueOrErrorMessage(getInteger(valueOrErrorMessage(addressFromPublicKey(fromBase58String(oraclePK)), "bad oracle address"), lastPriceIndexKey(defoAssetName)), "can't find last oracle price index")
714+ let oracleCurrentPriceIndex = valueOrErrorMessage(getInteger(valueOrErrorMessage(addressFromPublicKey(fromBase58String(oraclePK)), "bad oracle address"), lastPriceIndexKey(defoAssetName)), "no last price index")
712715 let bull = Issue(nameup, descUp, ((100 * ten6) * ten6), 6, true)
713716 let bear = Issue(namedwn, descDwn, ((100 * ten6) * ten6), 6, true)
714717 let pool = Issue(poolName, poolDesc, ((100 * ten6) * ten6), 6, true)
715718 let buid = calculateAssetId(bull)
716719 let beid = calculateAssetId(bear)
717720 let poid = calculateAssetId(pool)
718721 [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), ST(inv.caller, (bulls / denom), buid), ST(inv.caller, (bears / denom), beid), ST(inv.caller, (pools / denom), poid)]
719722 }
720723 }
721724
722725
723726
724727 @Callable(i)
725728 func withdrawFee (amount) = if ((amount > feesAccumulated))
726729 then throw(("too much. available: " + toString(feesAccumulated)))
727730 else [IE(FEEACCK, (feesAccumulated - amount)), ST(feeAddress, amount, fromBase58String(mainToken))]
728731
729732
730733
731734 @Callable(inv)
732735 func requestRedeem () = requestRedeemInternal(inv, 0)
733736
734737
735738
736739 @Callable(inv)
737740 func requestRedeemSl (sl) = if (validatePMFee(inv, sl))
738741 then requestRedeemInternal(inv, sl)
739742 else throw()
740743
741744
742745
743746 @Callable(inv)
744747 func requestIssue (tokenId) = requestIssueInternal(inv, tokenId, 0)
745748
746749
747750
748751 @Callable(inv)
749752 func requestIssueSl (tokenId,sl) = if (validatePMFee(inv, sl))
750753 then requestIssueInternal(inv, tokenId, sl)
751754 else throw()
752755
753756
754757
755758 @Callable(inv)
756759 func requestPool () = requestPoolInternal(inv, 0)
757760
758761
759762
760763 @Callable(inv)
761764 func requestPoolSl (sl) = if (validatePMFee(inv, sl))
762765 then requestPoolInternal(inv, sl)
763766 else throw()
764767
765768
766769
767770 @Callable(inv)
768771 func requestUnpool () = requestUnpoolInternal(inv, 0)
769772
770773
771774
772775 @Callable(inv)
773776 func requestUnpoolSl (sl) = if (validatePMFee(inv, sl))
774777 then requestUnpoolInternal(inv, sl)
775778 else throw()
776779
777780
778781
779782 @Callable(inv)
780783 func settle () = {
781784 let queueEmpty = (headPointer == "")
782785 let canRebalance = (oraclePriceIndex > rebalancedPriceIndex)
783786 if (queueEmpty)
784787 then if (canRebalance)
785788 then rebalance()
786789 else throw("[OK] all done, carry on")
787790 else {
788791 let data = split(valueOrErrorMessage(getString(this, headPointer), ("bad head pointer(settle): " + headPointer)), "|")
789792 let priceIndex = parseIntValue(data[3])
790793 if ((priceIndex > rebalancedPriceIndex))
791794 then if (canRebalance)
792795 then rebalance()
793796 else throw("[OK] need to wait")
794797 else if ((priceIndex == rebalancedPriceIndex))
795798 then dequeue()
796799 else throw("future price already rebalanced")
797800 }
798801 }
799802
800803
801804 @Verifier(tx)
802805 func verify () = {
803806 let initial = if (!(isDefined(getString(this, BULLK))))
804807 then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
805808 else false
806809 let adminAction = ((((if (sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(admins[0])))
807810 then 1
808811 else 0) + (if (sigVerify(tx.bodyBytes, tx.proofs[1], fromBase58String(admins[1])))
809812 then 1
810813 else 0)) + (if (sigVerify(tx.bodyBytes, tx.proofs[2], fromBase58String(admins[2])))
811814 then 1
812815 else 0)) > 1)
813816 let stakingAction = match tx {
814817 case tx: InvokeScriptTransaction =>
815818 let signedCorrectly = sigVerify(tx.bodyBytes, tx.proofs[0], daemonPublicKey)
816819 let feesCorrect = if ((tx.feeAssetId == unit))
817820 then ((1000 * 1000) >= tx.fee)
818821 else false
819822 let dappCorrect = (tx.dApp == rpdAddress)
820823 let unlock = (tx.function == "unlockNeutrino")
821824 let lock = if (if ((tx.function == "lockNeutrinoSP"))
822825 then (tx.args[0] == stakingAddress)
823826 else false)
824827 then (wavesBalance(this).available >= ten8)
825828 else false
826829 let funcCorrect = if (lock)
827830 then true
828831 else unlock
829832 if (if (if (signedCorrectly)
830833 then feesCorrect
831834 else false)
832835 then dappCorrect
833836 else false)
834837 then funcCorrect
835838 else false
836839 case _ =>
837840 false
838841 }
839842 if (if (initial)
840843 then true
841844 else adminAction)
842845 then true
843846 else stakingAction
844847 }
845848

github/deemru/w8io/786bc32 
378.53 ms