tx · 7BTwjC3dVxLZwdzPS2MHPox6E2DyivZdEV1EGHVHC7KN

3N8P7QRJShn9xzDkPVvkt1TF7BaL4kvznmv:  -0.01000000 Waves

2020.06.22 20:18 [1055105] smart account 3N8P7QRJShn9xzDkPVvkt1TF7BaL4kvznmv > SELF 0.00000000 Waves

{ "type": 13, "id": "7BTwjC3dVxLZwdzPS2MHPox6E2DyivZdEV1EGHVHC7KN", "fee": 1000000, "feeAssetId": null, "timestamp": 1592846369265, "version": 1, "sender": "3N8P7QRJShn9xzDkPVvkt1TF7BaL4kvznmv", "senderPublicKey": "3x6eppFh1HZYEvhG33bb8PCW98MYgQnn13LqndTmhnru", "proofs": [ "2wyCPFY6GRwR8f92jHS9vdnqvWiZ8GuYqQ3CL83ZFtv5hTYxw65jvzfEbdGBC2uVjV8n1ndU9nGeb6fnbMXEzJfN" ], "script": "base64:AAIDAAAAAAAAACIIARIHCgUICAgICBIHCgUBAQEBBBIDCgEIEgASAwoBCBIAAAAALgAAAAAHQlVMTEtleQIAAAAGQlVMTElkAAAAAAdCRUFSS2V5AgAAAAZCRUFSSWQAAAAADG1haW5Ub2tlbktleQIAAAALbWFpblRva2VuSWQAAAAAEmlzc3VlUGVyY2VudGlsZUtleQIAAAAPaXNzdWVQZXJjZW50aWxlAAAAABNyZWRlZW1QZXJjZW50aWxlS2V5AgAAABByZWRlZW1QZXJjZW50aWxlAAAAAAttaW5Jc3N1ZUtleQIAAAAIbWluSXNzdWUAAAAADG1pblJlZGVlbUtleQIAAAAJbWluUmVkZWVtAAAAABB3aGl0ZWxpc3RPbmx5S2V5AgAAAA13aGl0ZWxpc3RPbmx5AAAAAAtvcmFjbGVQS0tleQIAAAAGb3JhY2xlAAAAABdvcmFjbGVDdXJyZW50UHJpY2VJZEtleQIAAAALbGFzdFByaWNlSWQAAAAAF2xhc3RSZWJhbGFuY2VQcmljZUlkS2V5AgAAABVsYXN0U2V0dGxlbWVudFByaWNlSWQAAAAAEWJ1bGxDb2xsYXRlcmFsS2V5AgAAAA5idWxsQ29sbGF0ZXJhbAAAAAARYmVhckNvbGxhdGVyYWxLZXkCAAAADmJlYXJDb2xsYXRlcmFsAAAAABJidWxsQ2lyY3VsYXRpb25LZXkCAAAAD2J1bGxDaXJjdWxhdGlvbgAAAAASYmVhckNpcmN1bGF0aW9uS2V5AgAAAA9iZWFyQ2lyY3VsYXRpb24AAAAADHdoaXRlbGlzdEtleQIAAAAOaXNzdWVXaGl0ZUxpc3QAAAAACXdoaXRlbGlzdAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAADHdoaXRlbGlzdEtleQIAAAAUbm8gYnVsbENvbGxhdGVyYWxLZXkAAAAAB2J1bGxDb2wJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAABFidWxsQ29sbGF0ZXJhbEtleQIAAAAUbm8gYnVsbENvbGxhdGVyYWxLZXkAAAAAB2JlYXJDb2wJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAABFiZWFyQ29sbGF0ZXJhbEtleQIAAAAUbm8gYmVhckNvbGxhdGVyYWxLZXkAAAAACGJ1bGxDaXJjCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAASYnVsbENpcmN1bGF0aW9uS2V5AgAAABVubyBidWxsQ2lyY3VsYXRpb25LZXkAAAAACGJlYXJDaXJjCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAASYmVhckNpcmN1bGF0aW9uS2V5AgAAABVubyBiZWFyQ2lyY3VsYXRpb25LZXkAAAAABEJVTEwJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAAAdCVUxMS2V5AgAAAApubyBCVUxMS2V5AAAAAARCRUFSCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwUAAAAHQkVBUktleQIAAAAKbm8gQkVBUktleQAAAAAJbWFpblRva2VuCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwUAAAAMbWFpblRva2VuS2V5AgAAAA9ubyBtYWluVG9rZW5LZXkAAAAAD2lzc3VlUGVyY2VudGlsZQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAEmlzc3VlUGVyY2VudGlsZUtleQIAAAAVbm8gaXNzdWVQZXJjZW50aWxlS2V5AAAAABByZWRlZW1QZXJjZW50aWxlCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAATcmVkZWVtUGVyY2VudGlsZUtleQIAAAAWbm8gcmVkZWVtUGVyY2VudGlsZUtleQAAAAAIbWluSXNzdWUJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAAAttaW5Jc3N1ZUtleQIAAAAObm8gbWluSXNzdWVLZXkAAAAACW1pblJlZGVlbQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAADG1pblJlZGVlbUtleQIAAAAPbm8gbWluUmVkZWVtS2V5AAAAAA13aGl0ZWxpc3RPbmx5CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQbAAAAAgUAAAAEdGhpcwUAAAAQd2hpdGVsaXN0T25seUtleQIAAAATbm8gd2hpdGVsaXN0T25seUtleQAAAAAGb3JhY2xlCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAQAAABRhZGRyZXNzRnJvbVB1YmxpY0tleQAAAAEJAAJZAAAAAQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAAC29yYWNsZVBLS2V5AgAAAA5ubyBvcmFjbGVQS0tleQIAAAASYmFkIG9yYWNsZSBhZGRyZXNzAAAAABFyZWJhbGFuY2VkUHJpY2VJZAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAF2xhc3RSZWJhbGFuY2VQcmljZUlkS2V5AgAAABdubyBsYXN0IHJlYmFsYW5jZSBwcmljZQAAAAANb3JhY2xlUHJpY2VJZAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABm9yYWNsZQUAAAAXb3JhY2xlQ3VycmVudFByaWNlSWRLZXkCAAAAD2JhZCBvcmFjbGUgZGF0YQAAAAAOaGVhZFBvaW50ZXJLZXkCAAAAC2hlYWRQb2ludGVyAAAAAA50YWlsUG9pbnRlcktleQIAAAALdGFpbFBvaW50ZXIAAAAADHF1ZXVlU2l6ZUtleQIAAAAJcXVldWVTaXplAAAAAAlxdWV1ZVNpemUEAAAAByRtYXRjaDAJAAQaAAAAAgUAAAAEdGhpcwUAAAAMcXVldWVTaXplS2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAWkFAAAAByRtYXRjaDAFAAAAAWkAAAAAAAAAAAAAAAAAC2hlYWRQb2ludGVyBAAAAAckbWF0Y2gwCQAEHQAAAAIFAAAABHRoaXMFAAAADmhlYWRQb2ludGVyS2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZT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Y2VkUHJpY2VJZD0JAAGkAAAAAQUAAAARcmViYWxhbmNlZFByaWNlSWQCAAAAEywgcmVxdWVzdCBwcmljZSBpZD0JAAGkAAAAAQUAAAAHcHJpY2VJZAMJAABmAAAAAgUAAAAHcHJpY2VJZAUAAAARcmViYWxhbmNlZFByaWNlSWQJAAACAAAAAQIAAAApY2FuJ3QgZGVxdWV1ZSwgdG9vIGVhcmx5LCByZWJhbGFuY2UgZmlyc3QDCQAAAAAAAAIFAAAABmFjdGlvbgUAAAAFSVNTVUUEAAAAB2ZlZVNpemUJAABrAAAAAwUAAAADYW10BQAAAA9pc3N1ZVBlcmNlbnRpbGUAAAAAAAAAJxAEAAAAD2FkZGVkQ29sbGF0ZXJhbAkAAGUAAAACBQAAAANhbXQFAAAAB2ZlZVNpemUDCQAAAAAAAAIFAAAABXRva2VuBQAAAARCVUxMBAAAABJhZGRlZFRvQ2lyY3VsYXRpb24JAABrAAAAAwUAAAAIYnVsbENpcmMFAAAAD2FkZGVkQ29sbGF0ZXJhbAUAAAAHYnVsbENvbAQAAAAFaXRlbXMJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAAEWJ1bGxDb2xsYXRlcmFsS2V5CQAAZAAAAAIFAAAAB2J1bGxDb2wFAAAAD2FkZGVkQ29sbGF0ZXJhbAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAASYnVsbENpcmN1bGF0aW9uS2V5CQAAZAAAAAIFAAAACGJ1bGxDaXJjBQAAABJhZGRlZFRvQ2lyY3VsYXRpb24JAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAADmhlYWRQb2ludGVyS2V5BQAAAARuZXh0CQAETAAAAAIJAQAAAApjb2xsZWN0RmVlAAAAAQUAAAAHZmVlU2l6ZQkABEwAAAACBQAAABFkZWNyZWFzZVF1ZXVlU2l6ZQUAAAADbmlsCQEAAAAMU2NyaXB0UmVzdWx0AAAAAgkBAAAACFdyaXRlU2V0AAAAAQMFAAAADWlzTGFzdEVsZW1lbnQJAARMAAAAAgUAAAANb3ZlcndyaXRlVGFpbAUAAAAFaXRlbXMFAAAABWl0ZW1zCQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAB2ludm9rZXIFAAAAEmFkZGVkVG9DaXJjdWxhdGlvbgkAAlkAAAABBQAAAARCVUxMBQAAAANuaWwDCQAAAAAAAAIFAAAABXRva2VuBQAAAARCRUFSBAAAABJhZGRlZFRvQ2lyY3VsYXRpb24JAABrAAAAAwUAAAAIYmVhckNpcmMFAAAAD2FkZGVkQ29sbGF0ZXJhbAUAAAAHYmVhckNvbAQAAAAFaXRlbXMJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAAEWJlYXJDb2xsYXRlcmFsS2V5CQAAZAAAAAIFAAAAB2JlYXJDb2wFAAAAD2FkZGVkQ29sbGF0ZXJhbAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAASYmVhckNpcmN1bGF0aW9uS2V5CQAAZAAAAAIFAAAACGJlYXJDaXJjBQAAABJhZGRlZFRvQ2lyY3VsYXRpb24JAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAADmhlYWRQb2ludGVyS2V5BQAAAARuZXh0CQAETAAAAAIJAQAAAApjb2xsZWN0RmVlAAAAAQUAAAAHZmVlU2l6ZQkABEwAAAACBQAAABFkZWNyZWFzZVF1ZXVlU2l6ZQUAAAADbmlsCQEAAAAMU2NyaXB0UmVzdWx0AAAAAgkBAAAACFdyaXRlU2V0AAAAAQMFAAAADWlzTGFzdEVsZW1lbnQJAARMAAAAAgUAAAANb3ZlcndyaXRlVGFpbAUAAAAFaXRlbXMFAAAABWl0ZW1zCQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAB2ludm9rZXIFAAAAEmFkZGVkVG9DaXJjdWxhdGlvbgkAAlkAAAABBQAAAARCRUFSBQAAAANuaWwJAAACAAAAAQIAAAAMYmFkIHRva2VuIGlkAwkAAAAAAAACBQAAAAZhY3Rpb24FAAAABlJFREVFTQQAAAANcmVtb3ZlZFRva2VucwUAAAADYW10AwkAAAAAAAACBQAAAAV0b2tlbgUAAAAEQlVMTAQAAAARcmVtb3ZlZENvbGxhdGVyYWwJAABrAAAAAwUAAAAHYnVsbENvbAUAAAANcmVtb3ZlZFRva2VucwUAAAAIYnVsbENpcmMEAAAAB2ZlZVNpemUJAABrAAAAAwUAAAARcmVtb3ZlZENvbGxhdGVyYWwFAAAAEHJlZGVlbVBlcmNlbnRpbGUAAAAAAAAAJxAEAAAABnBheW91dAMJAABmAAAAAgUAAAARcmVtb3ZlZENvbGxhdGVyYWwFAAAAB2ZlZVNpemUJAABlAAAAAgUAAAARcmVtb3ZlZENvbGxhdGVyYWwFAAAAB2ZlZVNpemUAAAAAAAAAAAAEAAAABWl0ZW1zCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAABFidWxsQ29sbGF0ZXJhbEtleQkAAGUAAAACBQAAAAdidWxsQ29sBQAAABFyZW1vdmVkQ29sbGF0ZXJhbAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAASYnVsbENpcmN1bGF0aW9uS2V5CQAAZQAAAAIFAAAACGJ1bGxDaXJjBQAAAA1yZW1vdmVkVG9rZW5zCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAA5oZWFkUG9pbnRlcktleQUAAAAEbmV4dAkABEwAAAACCQEAAAAKY29sbGVjdEZlZQAAAAEFAAAAB2ZlZVNpemUJAARMAAAAAgUAAAARZGVjcmVhc2VRdWV1ZVNpemUFAAAAA25pbAkBAAAADFNjcmlwdFJlc3VsdAAAAAIJAQAAAAhXcml0ZVNldAAAAAEDBQAAAA1pc0xhc3RFbGVtZW50CQAETAAAAAIFAAAADW92ZXJ3cml0ZVRhaWwFAAAABWl0ZW1zBQAAAAVpdGVtcwkBAAAAC1RyYW5zZmVyU2V0AAAAAQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAAdpbnZva2VyBQAAAAZwYXlvdXQJAAJZAAAAAQUAAAAJbWFpblRva2VuBQAAAANuaWwDCQAAAAAAAAIFAAAABXRva2VuBQAAAARCRUFSBAAAABFyZW1vdmVkQ29sbGF0ZXJhbAkAAGsAAAADBQAAAAdiZWFyQ29sBQAAAA1yZW1vdmVkVG9rZW5zBQAAAAhiZWFyQ2lyYwQAAAAHZmVlU2l6ZQkAAGsAAAADBQAAABFyZW1vdmVkQ29sbGF0ZXJhbAUAAAAQcmVkZWVtUGVyY2VudGlsZQAAAAAAAAAnEAQAAAAGcGF5b3V0AwkAAGYAAAAC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c2V0SWQCAAAAGW5ldXRyaW5vIHBheW1lbnQgcmVxdWlyZWQFAAAAC21haW5Ub2tlbklkCQAAAgAAAAECAAAAF3BheW1lbnQgbm90IGluIG5ldXRyaW5vBAAAABN0b3RhbE93bmVkTWFpblRva2VuCAkBAAAABXZhbHVlAAAAAQgFAAAAA2ludgAAAAdwYXltZW50AAAABmFtb3VudAQAAAAFYnVsbHMJAABpAAAAAgUAAAATdG90YWxPd25lZE1haW5Ub2tlbgAAAAAAAAAAAgQAAAAFYmVhcnMJAABlAAAAAgUAAAATdG90YWxPd25lZE1haW5Ub2tlbgUAAAAFYnVsbHMDAwkAAAAAAAACBQAAAAViZWFycwAAAAAAAAAAAAYJAAAAAAAAAgUAAAAFYnVsbHMAAAAAAAAAAAAJAAACAAAAAQIAAAATY2FuJ3QgaW5pdCBiYWxhbmNlcwQAAAAUb3JhY2xlQ3VycmVudFByaWNlSWQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAQAAABRhZGRyZXNzRnJvbVB1YmxpY0tleQAAAAEJAAJZAAAAAQUAAAAIb3JhY2xlUEsCAAAAEmJhZCBvcmFjbGUgYWRkcmVzcwUAAAAXb3JhY2xlQ3VycmVudFByaWNlSWRLZXkCAAAAGmNhbid0IGZpbmQgb3JhY2xlIHByaWNlIGlkCQEAAAAMU2NyaXB0UmVzdWx0AAAAAgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAHQlVMTEtleQUAAAAGYnVsbElkCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAAdCRUFSS2V5BQAAAAZiZWFySWQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAADG1haW5Ub2tlbktleQUAAAALbWFpblRva2VuSWQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAAC29yYWNsZVBLS2V5BQAAAAhvcmFjbGVQSwkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAARYnVsbENvbGxhdGVyYWxLZXkFAAAABWJ1bGxzCQAETAAAAAIJAQAA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", "chainId": 84, "height": 1055105, "spentComplexity": 0 } View: original | compacted Prev: none Next: none Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 3 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let BULLKey = "BULLId"
5+
6+let BEARKey = "BEARId"
7+
8+let mainTokenKey = "mainTokenId"
9+
10+let issuePercentileKey = "issuePercentile"
11+
12+let redeemPercentileKey = "redeemPercentile"
13+
14+let minIssueKey = "minIssue"
15+
16+let minRedeemKey = "minRedeem"
17+
18+let whitelistOnlyKey = "whitelistOnly"
19+
20+let oraclePKKey = "oracle"
21+
22+let oracleCurrentPriceIdKey = "lastPriceId"
23+
24+let lastRebalancePriceIdKey = "lastSettlementPriceId"
25+
26+let bullCollateralKey = "bullCollateral"
27+
28+let bearCollateralKey = "bearCollateral"
29+
30+let bullCirculationKey = "bullCirculation"
31+
32+let bearCirculationKey = "bearCirculation"
33+
34+let whitelistKey = "issueWhiteList"
35+
36+let whitelist = valueOrErrorMessage(getString(this, whitelistKey), "no bullCollateralKey")
37+
38+let bullCol = valueOrErrorMessage(getInteger(this, bullCollateralKey), "no bullCollateralKey")
39+
40+let bearCol = valueOrErrorMessage(getInteger(this, bearCollateralKey), "no bearCollateralKey")
41+
42+let bullCirc = valueOrErrorMessage(getInteger(this, bullCirculationKey), "no bullCirculationKey")
43+
44+let bearCirc = valueOrErrorMessage(getInteger(this, bearCirculationKey), "no bearCirculationKey")
45+
46+let BULL = valueOrErrorMessage(getString(this, BULLKey), "no BULLKey")
47+
48+let BEAR = valueOrErrorMessage(getString(this, BEARKey), "no BEARKey")
49+
50+let mainToken = valueOrErrorMessage(getString(this, mainTokenKey), "no mainTokenKey")
51+
52+let issuePercentile = valueOrErrorMessage(getInteger(this, issuePercentileKey), "no issuePercentileKey")
53+
54+let redeemPercentile = valueOrErrorMessage(getInteger(this, redeemPercentileKey), "no redeemPercentileKey")
55+
56+let minIssue = valueOrErrorMessage(getInteger(this, minIssueKey), "no minIssueKey")
57+
58+let minRedeem = valueOrErrorMessage(getInteger(this, minRedeemKey), "no minRedeemKey")
59+
60+let whitelistOnly = valueOrErrorMessage(getBoolean(this, whitelistOnlyKey), "no whitelistOnlyKey")
61+
62+let oracle = valueOrErrorMessage(addressFromPublicKey(fromBase58String(valueOrErrorMessage(getString(this, oraclePKKey), "no oraclePKKey"))), "bad oracle address")
63+
64+let rebalancedPriceId = valueOrErrorMessage(getInteger(this, lastRebalancePriceIdKey), "no last rebalance price")
65+
66+let oraclePriceId = valueOrErrorMessage(getInteger(oracle, oracleCurrentPriceIdKey), "bad oracle data")
67+
68+let headPointerKey = "headPointer"
69+
70+let tailPointerKey = "tailPointer"
71+
72+let queueSizeKey = "queueSize"
73+
74+let queueSize = match getInteger(this, queueSizeKey) {
75+ case i: Int =>
76+ i
77+ case _ =>
78+ 0
79+}
80+
81+let headPointer = match getString(this, headPointerKey) {
82+ case s: String =>
83+ s
84+ case _ =>
85+ ""
86+}
87+
88+let tailPointer = match getString(this, tailPointerKey) {
89+ case s: String =>
90+ s
91+ case _ =>
92+ ""
93+}
94+
95+let feesAccumulatedKey = "feesAccumulated"
96+
97+let feesAccumulated = match getInteger(this, feesAccumulatedKey) {
98+ case i: Int =>
99+ i
100+ case _ =>
101+ 0
102+}
103+
104+let ISSUE = "ISSUE"
105+
106+let REDEEM = "REDEEM"
107+
108+func buildNewItem (action,amt,token,priceId,invoker) = (((((((((action + "|") + toString(amt)) + "|") + token) + "|") + toString(priceId)) + "|") + invoker) + "|")
109+
110+
111+func enqueue (id,action,amt,token,priceId,invoker) = {
112+ let increaseQueueSize = DataEntry(queueSizeKey, (queueSize + 1))
113+ let itm = buildNewItem(action, amt, token, priceId, invoker)
114+ if ((queueSize == 0))
115+ then WriteSet([DataEntry(headPointerKey, id), DataEntry(tailPointerKey, id), DataEntry(id, itm), increaseQueueSize])
116+ else {
117+ let prevId = valueOrErrorMessage(getString(this, tailPointerKey), "can't get tail pointer")
118+ let prevItm = split(valueOrErrorMessage(getString(this, prevId), "can't resolve pointer"), "|")
119+ let updatedPrevItm = ((((((((((prevItm[0] + "|") + prevItm[1]) + "|") + prevItm[2]) + "|") + prevItm[3]) + "|") + prevItm[4]) + "|") + id)
120+ WriteSet([DataEntry(prevId, updatedPrevItm), DataEntry(id, itm), DataEntry(tailPointerKey, id), increaseQueueSize])
121+ }
122+ }
123+
124+
125+func dequeue () = if ((queueSize == 0))
126+ then throw("nothing to settle")
127+ else {
128+ func collectFee (fees) = DataEntry(feesAccumulatedKey, (feesAccumulated + fees))
129+
130+ let decreaseQueueSize = DataEntry(queueSizeKey, (queueSize - 1))
131+ let isLastElement = (headPointer == tailPointer)
132+ let overwriteTail = DataEntry(tailPointerKey, "")
133+ let data = split(valueOrErrorMessage(getString(this, headPointer), "bad head pointer"), "|")
134+ let action = data[0]
135+ let amt = parseIntValue(data[1])
136+ let token = data[2]
137+ let priceId = parseIntValue(data[3])
138+ let invoker = addressFromStringValue(data[4])
139+ let next = data[5]
140+ if ((rebalancedPriceId > priceId))
141+ then throw(((("corrupt state, rebalancedPriceId=" + toString(rebalancedPriceId)) + ", request price id=") + toString(priceId)))
142+ else if ((priceId > rebalancedPriceId))
143+ then throw("can't dequeue, too early, rebalance first")
144+ else if ((action == ISSUE))
145+ then {
146+ let feeSize = fraction(amt, issuePercentile, 10000)
147+ let addedCollateral = (amt - feeSize)
148+ if ((token == BULL))
149+ then {
150+ let addedToCirculation = fraction(bullCirc, addedCollateral, bullCol)
151+ let items = [DataEntry(bullCollateralKey, (bullCol + addedCollateral)), DataEntry(bullCirculationKey, (bullCirc + addedToCirculation)), DataEntry(headPointerKey, next), collectFee(feeSize), decreaseQueueSize]
152+ ScriptResult(WriteSet(if (isLastElement)
153+ then overwriteTail :: items
154+ else items), TransferSet([ScriptTransfer(invoker, addedToCirculation, fromBase58String(BULL))]))
155+ }
156+ else if ((token == BEAR))
157+ then {
158+ let addedToCirculation = fraction(bearCirc, addedCollateral, bearCol)
159+ let items = [DataEntry(bearCollateralKey, (bearCol + addedCollateral)), DataEntry(bearCirculationKey, (bearCirc + addedToCirculation)), DataEntry(headPointerKey, next), collectFee(feeSize), decreaseQueueSize]
160+ ScriptResult(WriteSet(if (isLastElement)
161+ then overwriteTail :: items
162+ else items), TransferSet([ScriptTransfer(invoker, addedToCirculation, fromBase58String(BEAR))]))
163+ }
164+ else throw("bad token id")
165+ }
166+ else if ((action == REDEEM))
167+ then {
168+ let removedTokens = amt
169+ if ((token == BULL))
170+ then {
171+ let removedCollateral = fraction(bullCol, removedTokens, bullCirc)
172+ let feeSize = fraction(removedCollateral, redeemPercentile, 10000)
173+ let payout = if ((removedCollateral > feeSize))
174+ then (removedCollateral - feeSize)
175+ else 0
176+ let items = [DataEntry(bullCollateralKey, (bullCol - removedCollateral)), DataEntry(bullCirculationKey, (bullCirc - removedTokens)), DataEntry(headPointerKey, next), collectFee(feeSize), decreaseQueueSize]
177+ ScriptResult(WriteSet(if (isLastElement)
178+ then overwriteTail :: items
179+ else items), TransferSet([ScriptTransfer(invoker, payout, fromBase58String(mainToken))]))
180+ }
181+ else if ((token == BEAR))
182+ then {
183+ let removedCollateral = fraction(bearCol, removedTokens, bearCirc)
184+ let feeSize = fraction(removedCollateral, redeemPercentile, 10000)
185+ let payout = if ((removedCollateral > feeSize))
186+ then (removedCollateral - feeSize)
187+ else 0
188+ let items = [DataEntry(bearCollateralKey, (bearCol - removedCollateral)), DataEntry(bearCirculationKey, (bearCirc - removedTokens)), DataEntry(headPointerKey, next), collectFee(feeSize), decreaseQueueSize]
189+ ScriptResult(WriteSet(if (isLastElement)
190+ then overwriteTail :: items
191+ else items), TransferSet([ScriptTransfer(invoker, payout, fromBase58String(mainToken))]))
192+ }
193+ else throw("bad token id")
194+ }
195+ else throw(("bad action: " + action))
196+ }
197+
198+
199+func rebalance () = {
200+ func LV (v,p0,p1) = {
201+ let denom = 100
202+ let pmax = ((if ((p1 > p0))
203+ then p1
204+ else p0) / denom)
205+ let pmin = ((if ((p0 > p1))
206+ then p1
207+ else p0) / denom)
208+ let a = (pmin * pmin)
209+ let b = (((9 * pmax) * pmax) - ((15 * pmax) * pmin))
210+ fraction(v, ((6 * a) + b), ((7 * a) + b))
211+ }
212+
213+ let settledPriceId = valueOrErrorMessage(getInteger(this, lastRebalancePriceIdKey), "inconsistent data")
214+ let unsettledPriceId = (settledPriceId + 1)
215+ let settledPrice = valueOrErrorMessage(getInteger(oracle, toString(settledPriceId)), "bad oracle data for sellted price")
216+ let nextPrice = valueOrErrorMessage(getInteger(oracle, toString(unsettledPriceId)), "no next price")
217+ let minVol = if ((bearCol > bullCol))
218+ then bullCol
219+ else bearCol
220+ let redist = LV(minVol, settledPrice, nextPrice)
221+ if ((nextPrice > settledPrice))
222+ then WriteSet([DataEntry(bullCollateralKey, (bullCol + redist)), DataEntry(bearCollateralKey, (bearCol - redist)), DataEntry(lastRebalancePriceIdKey, unsettledPriceId)])
223+ else if ((settledPrice > nextPrice))
224+ then WriteSet([DataEntry(bullCollateralKey, (bullCol - redist)), DataEntry(bearCollateralKey, (bearCol + redist)), DataEntry(lastRebalancePriceIdKey, unsettledPriceId)])
225+ else WriteSet([DataEntry(lastRebalancePriceIdKey, unsettledPriceId)])
226+ }
227+
228+
229+@Callable(inv)
230+func init (bullId,bearId,mainTokenId,oraclePK,whitelisted) = if (isDefined(getString(this, BULLKey)))
231+ then throw("already initialized")
232+ else if (!(isDefined(inv.payment)))
233+ then throw("neutrino payment required")
234+ else if ((toBase58String(valueOrErrorMessage(value(inv.payment).assetId, "neutrino payment required")) != mainTokenId))
235+ then throw("payment not in neutrino")
236+ else {
237+ let totalOwnedMainToken = value(inv.payment).amount
238+ let bulls = (totalOwnedMainToken / 2)
239+ let bears = (totalOwnedMainToken - bulls)
240+ if (if ((bears == 0))
241+ then true
242+ else (bulls == 0))
243+ then throw("can't init balances")
244+ else {
245+ let oracleCurrentPriceId = valueOrErrorMessage(getInteger(valueOrErrorMessage(addressFromPublicKey(fromBase58String(oraclePK)), "bad oracle address"), oracleCurrentPriceIdKey), "can't find oracle price id")
246+ ScriptResult(WriteSet([DataEntry(BULLKey, bullId), DataEntry(BEARKey, bearId), DataEntry(mainTokenKey, mainTokenId), DataEntry(oraclePKKey, oraclePK), DataEntry(bullCollateralKey, bulls), DataEntry(bearCollateralKey, bears), DataEntry(bullCirculationKey, bulls), DataEntry(bearCirculationKey, bears), DataEntry(lastRebalancePriceIdKey, oracleCurrentPriceId), DataEntry(whitelistKey, whitelisted), DataEntry(issuePercentileKey, 0), DataEntry(redeemPercentileKey, 0), DataEntry(minIssueKey, 0), DataEntry(minRedeemKey, 0), DataEntry(whitelistOnlyKey, true)]), TransferSet([ScriptTransfer(inv.caller, bulls, fromBase58String(bullId)), ScriptTransfer(inv.caller, bears, fromBase58String(bearId))]))
247+ }
248+ }
249+
250+
251+
252+@Callable(i)
253+func setParams (iP,rP,mI,mR,wl) = if ((i.caller != this))
254+ then throw("only self can change whitelist")
255+ else WriteSet([DataEntry(issuePercentileKey, iP), DataEntry(redeemPercentileKey, rP), DataEntry(minIssueKey, mI), DataEntry(minRedeemKey, mR), DataEntry(whitelistOnlyKey, wl)])
256+
257+
258+
259+@Callable(i)
260+func setWhitelist (l) = if ((i.caller != this))
261+ then throw("only self can change whitelist")
262+ else WriteSet([DataEntry(whitelistKey, l)])
263+
264+
265+
266+@Callable(inv)
267+func requestRedeem () = if ((inv.caller == this))
268+ then throw("can't do")
269+ else {
270+ func errorMessage (got) = throw(((((("only BULL(" + BULL) + ") or BEAR(") + BEAR) + ") tokens are accepted, received: ") + got))
271+
272+ if (!(isDefined(inv.payment)))
273+ then errorMessage("no attached payment")
274+ else {
275+ let assetId = toBase58String(valueOrErrorMessage(value(inv.payment).assetId, "waves are not accepted here"))
276+ if (if ((assetId != BEAR))
277+ then (assetId != BULL)
278+ else false)
279+ then errorMessage(assetId)
280+ else {
281+ let col = if ((assetId == BEAR))
282+ then bearCol
283+ else bullCol
284+ let circ = if ((assetId == BEAR))
285+ then bearCirc
286+ else bearCirc
287+ let estimated = fraction(col, value(inv.payment).amount, circ)
288+ if ((minRedeem > estimated))
289+ then throw((("Attached payment too small. Min redeem amount is " + toString((minRedeem / 1000000))) + " USDN"))
290+ else enqueue(toBase58String(inv.transactionId), REDEEM, value(inv.payment).amount, assetId, (oraclePriceId + 1), toString(inv.caller))
291+ }
292+ }
293+ }
294+
295+
296+
297+@Callable(inv)
298+func requestIssue (tokenId) = if ((inv.caller == this))
299+ then throw("can't do")
300+ else if (if (whitelistOnly)
301+ then !(isDefined(indexOf(whitelist, toString(inv.caller))))
302+ else false)
303+ then throw("only whitelisted can do")
304+ else {
305+ let errorMessage = throw((((((("only BULL(" + BULL) + ") or BEAR(") + BEAR) + ") tokens are available in exchange for USDN(") + mainToken) + ")"))
306+ if (if ((tokenId != BULL))
307+ then (tokenId != BEAR)
308+ else false)
309+ then errorMessage
310+ else if (!(isDefined(inv.payment)))
311+ then errorMessage
312+ else if ((value(inv.payment).assetId != fromBase58String(mainToken)))
313+ then errorMessage
314+ else if ((minIssue > value(inv.payment).amount))
315+ then throw((("Attached payment too small. Min required: " + toString((minIssue / 1000000))) + " USDN"))
316+ else enqueue(toBase58String(inv.transactionId), ISSUE, value(inv.payment).amount, tokenId, (oraclePriceId + 1), toString(inv.caller))
317+ }
318+
319+
320+
321+@Callable(inv)
322+func settle () = {
323+ let queueEmpty = (headPointer == "")
324+ let canRebalance = (oraclePriceId > rebalancedPriceId)
325+ if (queueEmpty)
326+ then if (canRebalance)
327+ then rebalance()
328+ else throw("[OK] all done, carry on")
329+ else {
330+ let data = split(valueOrErrorMessage(getString(this, headPointer), "bad head pointer"), "|")
331+ let priceId = parseIntValue(data[3])
332+ if ((priceId > rebalancedPriceId))
333+ then if (canRebalance)
334+ then rebalance()
335+ else throw("[OK] need to wait")
336+ else if ((priceId == rebalancedPriceId))
337+ then dequeue()
338+ else throw("corrupt data, future price id already rebalanced")
339+ }
340+ }
341+
342+

github/deemru/w8io/169f3d6 
33.28 ms