tx · FPNyWDtMjhMPeaHNdnPSofMBnmHm1b2ypMWj66Rw4uNC

3PEC2AE4TZHMA1VY3LH58KDRiEz4AsjEuLD:  -0.01400000 Waves

2020.04.12 11:47 [2014171] smart account 3PEC2AE4TZHMA1VY3LH58KDRiEz4AsjEuLD > SELF 0.00000000 Waves

{ "type": 13, "id": "FPNyWDtMjhMPeaHNdnPSofMBnmHm1b2ypMWj66Rw4uNC", "fee": 1400000, "feeAssetId": null, "timestamp": 1586681295935, "version": 1, "sender": "3PEC2AE4TZHMA1VY3LH58KDRiEz4AsjEuLD", "senderPublicKey": "GLR6v1VhULJAHZet6wxFjTEsJgU7iZwojtRmUJwSJv54", "proofs": [ "3eoLwG4H1H33noGGCqXTWRrkjeRBHugJR8CMxD1K1APmvTha5dwqa8MsVzi2EpByskABaVTGKEvSUPC9B2PUs97G" ], "script": "base64:AAIDAAAAAAAAAA4IARIDCgEBEgMKAQESAAAAAA8AAAAAC2Jhc2VBc3NldElkAQAAACAxg4RvRZ/dtx1aHhf9QX5E2DfZB5PX5OV7imckX+PA+QAAAAAMcXVvdGVBc3NldElkAQAAACBs+mr/xe2qjAt/tSqT0qIML4KC23R6BIxT+/0TH3Og/wAAAAALZGFwcEFkZHJlc3MJAQAAAAdBZGRyZXNzAAAAAQEAAAAaAVfm1yaCIl2DmAgLom02TIzPRwwtghd4sesAAAAAC3N0YWtBZGRyZXNzCQEAAAAHQWRkcmVzcwAAAAEBAAAAGgFXzTi+qm9a74YX22N5jiH6tf2Q80JcsflrAAAAAAtleGl0QWRkcmVzcwkBAAAAB0FkZHJlc3MAAAABAQAAABoBV9n4P/BnswfXDEUJBRYKbUckkqF74BlowwAAAAAPdHJhZGVyUHVibGljS2V5AQAAACBEwlhidjGp/jWoer2nyBDdLPPIJWyjaOzZd8HkMgUUbwAAAAAQbWFuYWdlclB1YmxpY0tleQEAAAAgS53y+AOIQ8/pLBo7EKwjM2ko7Q297rl6htzyzkY7ljsAAAAAE2d1YXJhbnRvclB1YmxpY0tleXMFAAAAA25pbAAAAAAFbW9udGgJAABoAAAAAgAAAAAAACggcgAAAAAAAAAD6AAAAAAIdGltZW91dDMJAABpAAAAAgUAAAAFbW9udGgAAAAAAAAAAAoAAAAACXRpbWVvdXQxMAkAAGkAAAACBQAAAAVtb250aAAAAAAAAAAAAwAAAAANbGFzdEJsb2NrVGltZQgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAAAAAADW1vbnRoT3BlblRpbWUJAABoAAAAAgkAAGkAAAACBQAAAA1sYXN0QmxvY2tUaW1lBQAAAAVtb250aAUAAAAFbW9udGgAAAAAC2Jhc2VCYWxhbmNlCQAD6wAAAAIFAAAABHRoaXMFAAAAC2Jhc2VBc3NldElkAAAAAAxxdW90ZUJhbGFuY2UJAAPrAAAAAgUAAAAEdGhpcwUAAAAMcXVvdGVBc3NldElkAAAAAwAAAAFpAQAAAAtzZXRCYWxhbmNlcwAAAAEAAAAGYW1vdW50AwkBAAAAAiE9AAAAAggFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BQAAABBtYW5hZ2VyUHVibGljS2V5CQAAAgAAAAECAAAAL09ubHkgdGhlIGFkbWluaXN0cmF0b3IgY2FuIGFkanVzdCB0aGUgYmFsYW5jZXMhAwkBAAAACWlzRGVmaW5lZAAAAAEIBQAAAAFpAAAAB3BheW1lbnQJAAACAAAAAQIAAAA1UGxlYXNlIGRvIG5vdCBhdHRhY2ggcGF5bWVudCB3aGVuIHNldHRpbmcgYmFsYW5jZXMuLi4DCQAAZwAAAAIFAAAADWxhc3RCbG9ja1RpbWUJAABkAAAAAgUAAAANbW9udGhPcGVuVGltZQUAAAAJdGltZW91dDEwCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACAgAAACJUaGUgYmFsYW5jZSBzaG91bGQgYmUgZml4ZWQgYWZ0ZXIgCQABpAAAAAEJAABpAAAAAgkAAGQAAAACBQAAAA1tb250aE9wZW5UaW1lBQAAAAVtb250aAAAAAAAAAAD6AIAAAAQIFVuaXggdGltZXN0YW1wLgMJAABmAAAAAgAAAAAAAAAAAAUAAAAGYW1vdW50CQAAAgAAAAECAAAAIk5lZ2F0aXZlIGFtb3VudCBhcmUgbm90IGFsbG93ZWQuLi4EAAAAD29sZFRvdGFsQmFsYW5jZQQAAAAHJG1hdGNoMAkABBoAAAACBQAAAAR0aGlzAgAAAA1iYWxhbmNlX3RvdGFsAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAXgFAAAAByRtYXRjaDAFAAAAAXgAAAAAAAAAAAAEAAAAA2RzMAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgIAAAAMYmFsYW5jZV9iYXNlBQAAAAtiYXNlQmFsYW5jZQUAAAADbmlsBAAAAANkczEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAICAAAADWJhbGFuY2VfcXVvdGUFAAAADHF1b3RlQmFsYW5jZQUAAAADZHMwBAAAAANkczIDCQAAAAAAAAIFAAAABmFtb3VudAAAAAAAAAAAAAUAAAADZHMxCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACAgAAAA1iYWxhbmNlX3RvdGFsBQAAAAZhbW91bnQFAAAAA2RzMQQAAAADZHMzCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACAgAAAAtsYXN0X3VwZGF0ZQUAAAANbGFzdEJsb2NrVGltZQUAAAADZHMyBAAAAAdyZWNvcmRzBQAAAANkczMDAwkAAAAAAAACBQAAAAZhbW91bnQAAAAAAAAAAAAJAAAAAAAAAgUAAAAPb2xkVG90YWxCYWxhbmNlAAAAAAAAAAAABwkAAAIAAAABAgAAACVaZXJvIHRvdGFsIGJhbGFuY2UgYXJlIG5vdCBhbGxvd2VkLi4uCQEAAAAIV3JpdGVTZXQAAAABBQAAAAdyZWNvcmRzAAAAAWkBAAAAC3NlbmRSZXdhcmRzAAAAAQAAAAZhbW91bnQDCQEAAAACIT0AAAACCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkFAAAAEG1hbmFnZXJQdWJsaWNLZXkJAAACAAAAAQIAAAAkT25seSBhZG1pbmlzdHJhdG9yIGNhbiBzZW5kIHJld2FyZHMhAwkBAAAACWlzRGVmaW5lZAAAAAEIBQAAAAFpAAAAB3BheW1lbnQJAAACAAAAAQIAAAA0UGxlYXNlIGRvIG5vdCBhdHRhY2ggcGF5bWVudCB3aGVuIHNlbmRpbmcgcmV3YXJkcy4uLgMJAABnAAAAAgUAAAANbGFzdEJsb2NrVGltZQkAAGQAAAACBQAAAA1tb250aE9wZW5UaW1lBQAAAAh0aW1lb3V0MwkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAbUmV3YXJkcyBtdXN0IGJlIHNlbnQgYWZ0ZXIgCQABpAAAAAEJAABpAAAAAgkAAGQAAAACBQAAAA1tb250aE9wZW5UaW1lBQAAAAVtb250aAAAAAAAAAAD6AIAAAAQIFVuaXggdGltZXN0YW1wLgMJAABmAAAAAgAAAAAAAAAAAAUAAAAGYW1vdW50CQAAAgAAAAECAAAAIk5lZ2F0aXZlIGFtb3VudCBhcmUgbm90IGFsbG93ZWQuLi4EAAAADm9sZEJhc2VCYWxhbmNlCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAAR0aGlzAgAAAAxiYWxhbmNlX2Jhc2UEAAAAD29sZFF1b3RlQmFsYW5jZQkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAEdGhpcwIAAAANYmFsYW5jZV9xdW90ZQQAAAAPb2xkVG90YWxCYWxhbmNlCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAAR0aGlzAgAAAA1iYWxhbmNlX3RvdGFsBAAAAApzdGFrUHJvZml0CQAAZQAAAAIFAAAADHF1b3RlQmFsYW5jZQkAAGsAAAADBQAAAA9vbGRRdW90ZUJhbGFuY2UFAAAADm9sZEJhc2VCYWxhbmNlBQAAAAtiYXNlQmFsYW5jZQQAAAAKc3Rha0Ftb3VudAMJAABmAAAAAgAAAAAAAAAAAAUAAAAKc3Rha1Byb2ZpdAAAAAAAAAAAAAMJAABmAAAAAgUAAAAKc3Rha1Byb2ZpdAUAAAAMcXVvdGVCYWxhbmNlBQAAAAxxdW90ZUJhbGFuY2UFAAAACnN0YWtQcm9maXQEAAAACm5ld0JhbGFuY2UJAABlAAAAAgUAAAAMcXVvdGVCYWxhbmNlBQAAAApzdGFrQW1vdW50BAAAAApsb25nUHJvZml0CQAAZQAAAAIJAABkAAAAAgUAAAAMcXVvdGVCYWxhbmNlBQAAAApuZXdCYWxhbmNlBQAAAA9vbGRUb3RhbEJhbGFuY2UEAAAACmxvbmdBbW91bnQDCQAAZgAAAAIAAAAAAAAAAAAFAAAACmxvbmdQcm9maXQAAAAAAAAAAAADCQAAZgAAAAIFAAAACmxvbmdQcm9maXQFAAAACm5ld0JhbGFuY2UFAAAACm5ld0JhbGFuY2UFAAAACmxvbmdQcm9maXQEAAAACnJlc3RBbW91bnQDCQAAZgAAAAIFAAAACmxvbmdBbW91bnQFAAAABmFtb3VudAAAAAAAAAAAAAMJAABmAAAAAgUAAAAGYW1vdW50BQAAAApuZXdCYWxhbmNlCQAAZQAAAAIFAAAACm5ld0JhbGFuY2UFAAAACmxvbmdBbW91bnQJAABlAAAAAgUAAAAGYW1vdW50BQAAAApsb25nQW1vdW50BAAAAApkYXBwQW1vdW50CQAAZAAAAAIFAAAACmxvbmdBbW91bnQFAAAACnJlc3RBbW91bnQEAAAAA2RzMAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgIAAAAMYmFsYW5jZV9iYXNlBQAAAAtiYXNlQmFsYW5jZQUAAAADbmlsBAAAAANkczEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAICAAAADWJhbGFuY2VfcXVvdGUJAABlAAAAAgUA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", "chainId": 87, "height": 2014171, "spentComplexity": 0 } View: original | compacted Prev: 4Rmw6KgUfEStCbmmojwR66pg6pdv65reNCNP7EpNALRC Next: 3PMqX47dTEmyeVmmVvsxj8bUnqpX9NHi2PE7qbPHeqCm Diff:
OldNewDifferences
55
66 let quoteAssetId = base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS'
77
8-let dappPublicKey = base58'2TxTux7YwCDmz45WeFjTfDpBg7t9hBir8SqeD9m86yen'
8+let dappAddress = Address(base58'3PNyTtHEnQkVUhRy6YuTa2bGLHL2ccaqjBG')
99
10-let payoutPublicKey = base58'CmtjCeZ9NqoQScT4HoWGn8vNQ8hK7kDKQfukQbjChQq1'
10+let stakAddress = Address(base58'3PLe1EGXcx2yNrNH7KvtmKW2B9uKvxm148A')
1111
12-let mmBotPublicKey = base58'5dQbzkYkh2UWtcR1cDwxZVzkduK1SVEeVa1TyLmD6eVU'
12+let exitAddress = Address(base58'3PMoQkZyawdWbm6a8o75tzDHQRNCvXFgSN6')
13+
14+let traderPublicKey = base58'5dQbzkYkh2UWtcR1cDwxZVzkduK1SVEeVa1TyLmD6eVU'
1315
1416 let managerPublicKey = base58'66BGZcJJ9yAWcHKZZeiuA71wAvC5GWTmdQWArjt1g6jC'
1517
1719
1820 let month = (2629746 * 1000)
1921
20-let quarter = (month * 3)
22+let timeout3 = (month / 10)
2123
22-let timeout = (month / 10)
24+let timeout10 = (month / 3)
2325
2426 let lastBlockTime = lastBlock.timestamp
2527
2628 let monthOpenTime = ((lastBlockTime / month) * month)
2729
28-let quarterOpenTime = ((lastBlockTime / quarter) * quarter)
30+let baseBalance = assetBalance(this, baseAssetId)
31+
32+let quoteBalance = assetBalance(this, quoteAssetId)
2933
3034 @Callable(i)
31-func setBalances (total) = if ((i.callerPublicKey != managerPublicKey))
35+func setBalances (amount) = if ((i.callerPublicKey != managerPublicKey))
3236 then throw("Only the administrator can adjust the balances!")
3337 else if (isDefined(i.payment))
34- then throw("Please do not attach payment when setting balances.")
35- else if ((0 > total))
36- then throw("Negative total balance are not allowed...")
37- else {
38- let baseBalance = assetBalance(this, baseAssetId)
39- let quoteBalance = assetBalance(this, quoteAssetId)
40- let totalBalance = match getInteger(this, "balance_total") {
41- case x: Int =>
42- x
43- case _ =>
44- 0
45- }
46- if ((total > 0))
47- then WriteSet([DataEntry("balance_base", baseBalance), DataEntry("balance_quote", quoteBalance), DataEntry("balance_total", total), DataEntry("last_update", lastBlockTime)])
48- else if ((totalBalance > 0))
49- then WriteSet([DataEntry("balance_base", baseBalance), DataEntry("balance_quote", quoteBalance), DataEntry("last_update", lastBlockTime)])
50- else throw("Zero total balance are not allowed...")
51- }
38+ then throw("Please do not attach payment when setting balances...")
39+ else if ((lastBlockTime >= (monthOpenTime + timeout10)))
40+ then throw((("The balance should be fixed after " + toString(((monthOpenTime + month) / 1000))) + " Unix timestamp."))
41+ else if ((0 > amount))
42+ then throw("Negative amount are not allowed...")
43+ else {
44+ let oldTotalBalance = match getInteger(this, "balance_total") {
45+ case x: Int =>
46+ x
47+ case _ =>
48+ 0
49+ }
50+ let ds0 = [DataEntry("balance_base", baseBalance)]
51+ let ds1 = DataEntry("balance_quote", quoteBalance) :: ds0
52+ let ds2 = if ((amount == 0))
53+ then ds1
54+ else DataEntry("balance_total", amount) :: ds1
55+ let ds3 = DataEntry("last_update", lastBlockTime) :: ds2
56+ let records = ds3
57+ if (if ((amount == 0))
58+ then (oldTotalBalance == 0)
59+ else false)
60+ then throw("Zero total balance are not allowed...")
61+ else WriteSet(records)
62+ }
5263
5364
5465
5566 @Callable(i)
56-func sendRewards () = {
57- let lastUpdate = getIntegerValue(this, "last_update")
58- let nextMonth = (((lastUpdate / month) + 1) * month)
59- if ((i.callerPublicKey != managerPublicKey))
60- then throw("Only administrator can send rewards!")
61- else if (isDefined(i.payment))
62- then throw("Please do not attach payment when sending rewards.")
63- else if (if ((nextMonth > lastBlockTime))
64- then true
65- else (lastBlockTime >= (monthOpenTime + timeout)))
66- then throw((("Rewards must be sent after " + toString(((monthOpenTime + month) / 1000))) + "."))
67+func sendRewards (amount) = if ((i.callerPublicKey != managerPublicKey))
68+ then throw("Only administrator can send rewards!")
69+ else if (isDefined(i.payment))
70+ then throw("Please do not attach payment when sending rewards...")
71+ else if ((lastBlockTime >= (monthOpenTime + timeout3)))
72+ then throw((("Rewards must be sent after " + toString(((monthOpenTime + month) / 1000))) + " Unix timestamp."))
73+ else if ((0 > amount))
74+ then throw("Negative amount are not allowed...")
6775 else {
68- let recipient = addressFromPublicKey(payoutPublicKey)
69- let baseBalance = assetBalance(this, baseAssetId)
70- let quoteBalance = assetBalance(this, quoteAssetId)
7176 let oldBaseBalance = getIntegerValue(this, "balance_base")
7277 let oldQuoteBalance = getIntegerValue(this, "balance_quote")
7378 let oldTotalBalance = getIntegerValue(this, "balance_total")
74- let mmProfit = (quoteBalance - fraction(oldQuoteBalance, oldBaseBalance, baseBalance))
75- let netProfit = (((2 * quoteBalance) - mmProfit) - oldTotalBalance)
76- let amount = if (((quarterOpenTime + timeout) > lastBlockTime))
77- then (mmProfit + (if ((netProfit > 0))
78- then netProfit
79- else 0))
80- else fraction(mmProfit, 8, 10)
81- if (if ((amount > 0))
82- then (quoteBalance >= amount)
83- else false)
84- then ScriptResult(WriteSet([DataEntry("balance_base", baseBalance), DataEntry("balance_quote", (quoteBalance - amount)), DataEntry("last_update", lastBlockTime)]), TransferSet([ScriptTransfer(recipient, amount, quoteAssetId)]))
85- else if ((amount > quoteBalance))
86- then throw("Insufficient funds on the balance of quotes...")
87- else throw("Zero or negative rewards are not allowed...")
79+ let stakProfit = (quoteBalance - fraction(oldQuoteBalance, oldBaseBalance, baseBalance))
80+ let stakAmount = if ((0 > stakProfit))
81+ then 0
82+ else if ((stakProfit > quoteBalance))
83+ then quoteBalance
84+ else stakProfit
85+ let newBalance = (quoteBalance - stakAmount)
86+ let longProfit = ((quoteBalance + newBalance) - oldTotalBalance)
87+ let longAmount = if ((0 > longProfit))
88+ then 0
89+ else if ((longProfit > newBalance))
90+ then newBalance
91+ else longProfit
92+ let restAmount = if ((longAmount > amount))
93+ then 0
94+ else if ((amount > newBalance))
95+ then (newBalance - longAmount)
96+ else (amount - longAmount)
97+ let dappAmount = (longAmount + restAmount)
98+ let ds0 = [DataEntry("balance_base", baseBalance)]
99+ let ds1 = DataEntry("balance_quote", (newBalance - dappAmount)) :: ds0
100+ let ds2 = if ((restAmount == 0))
101+ then ds1
102+ else DataEntry("balance_total", (oldTotalBalance - restAmount)) :: ds1
103+ let ds3 = DataEntry("last_update", lastBlockTime) :: ds2
104+ let records = ds3
105+ let ts0 = if ((stakAmount == 0))
106+ then nil
107+ else [ScriptTransfer(stakAddress, stakAmount, quoteAssetId)]
108+ let ts1 = if ((dappAmount == 0))
109+ then ts0
110+ else ScriptTransfer(dappAddress, dappAmount, quoteAssetId) :: ts0
111+ let transfers = ts1
112+ if ((size(transfers) == 0))
113+ then throw("Unable to withdraw funds this month!")
114+ else ScriptResult(WriteSet(records), TransferSet(transfers))
88115 }
89- }
90116
91117
92118
93119 @Callable(i)
94120 func emergencyExit () = {
121+ func isValid (pub,keys) = {
122+ func check (acc,key) = if (acc)
123+ then true
124+ else (pub == key)
125+
126+ let $list69947021 = keys
127+ let $size69947021 = size($list69947021)
128+ let $acc069947021 = false
129+ if (($size69947021 == 0))
130+ then $acc069947021
131+ else {
132+ let $acc169947021 = check($acc069947021, $list69947021[0])
133+ if (($size69947021 == 1))
134+ then $acc169947021
135+ else {
136+ let $acc269947021 = check($acc169947021, $list69947021[1])
137+ if (($size69947021 == 2))
138+ then $acc269947021
139+ else {
140+ let $acc369947021 = check($acc269947021, $list69947021[2])
141+ if (($size69947021 == 3))
142+ then $acc369947021
143+ else {
144+ let $acc469947021 = check($acc369947021, $list69947021[3])
145+ if (($size69947021 == 4))
146+ then $acc469947021
147+ else {
148+ let $acc569947021 = check($acc469947021, $list69947021[4])
149+ if (($size69947021 == 5))
150+ then $acc569947021
151+ else {
152+ let $acc669947021 = check($acc569947021, $list69947021[5])
153+ if (($size69947021 == 6))
154+ then $acc669947021
155+ else {
156+ let $acc769947021 = check($acc669947021, $list69947021[6])
157+ throw("List size exceed 6")
158+ }
159+ }
160+ }
161+ }
162+ }
163+ }
164+ }
165+ }
166+
95167 let lastUpdate = getIntegerValue(this, "last_update")
96- let emergencyTime = ((((lastUpdate / month) + 1) * month) + timeout)
97- if (isDefined(i.payment))
98- then throw("Please do not attach payment in an emergency.")
99- else if (if ((emergencyTime > lastBlockTime))
100- then (i.callerPublicKey != managerPublicKey)
101- else false)
102- then throw((("Time for emergencies will be after " + toString((emergencyTime / 1000))) + "."))
103- else {
104- let recipient = addressFromPublicKey(dappPublicKey)
105- let baseBalance = assetBalance(this, baseAssetId)
106- let quoteBalance = assetBalance(this, quoteAssetId)
107- let st0 = if ((baseBalance == 0))
108- then nil
109- else [ScriptTransfer(recipient, baseBalance, baseAssetId)]
110- let st1 = if ((quoteBalance == 0))
111- then st0
112- else ScriptTransfer(recipient, quoteBalance, quoteAssetId) :: st0
113- let scriptTransfers = st1
114- if ((size(scriptTransfers) > 0))
115- then ScriptResult(WriteSet([DataEntry("last_update", lastBlockTime)]), TransferSet(scriptTransfers))
116- else throw("There is nothing on the balances!")
117- }
168+ let emergencyTime = ((((lastUpdate / month) + 1) * month) + timeout3)
169+ if (!(isValid(i.callerPublicKey, managerPublicKey :: guarantorPublicKeys)))
170+ then throw("Only an administrator or guarantor can trigger an emergency exit!")
171+ else if (isDefined(i.payment))
172+ then throw("Please do not attach payment in an emergency exit...")
173+ else if (if ((i.callerPublicKey != managerPublicKey))
174+ then (emergencyTime > lastBlockTime)
175+ else false)
176+ then throw((("Time for emergencies will be after " + toString((emergencyTime / 1000))) + " Unix timestamp."))
177+ else {
178+ let ds0 = [DataEntry("last_update", lastBlockTime)]
179+ let records = ds0
180+ let ts0 = if ((baseBalance == 0))
181+ then nil
182+ else [ScriptTransfer(exitAddress, baseBalance, baseAssetId)]
183+ let ts1 = if ((quoteBalance == 0))
184+ then ts0
185+ else ScriptTransfer(exitAddress, quoteBalance, quoteAssetId) :: ts0
186+ let transfers = ts1
187+ if ((size(transfers) == 0))
188+ then throw("There is nothing on the balances!")
189+ else ScriptResult(WriteSet(records), TransferSet(transfers))
190+ }
118191 }
119192
120193
121194 @Verifier(tx)
122195 func verify () = {
123196 func isValid (sig,keys) = {
124- func check (acc,pub) = if (acc)
197+ func check (acc,key) = if (acc)
125198 then true
126- else sigVerify(tx.bodyBytes, sig, pub)
199+ else sigVerify(tx.bodyBytes, sig, key)
127200
128- let $list78427869 = keys
129- let $size78427869 = size($list78427869)
130- let $acc078427869 = false
131- if (($size78427869 == 0))
132- then $acc078427869
201+ let $list87708797 = keys
202+ let $size87708797 = size($list87708797)
203+ let $acc087708797 = false
204+ if (($size87708797 == 0))
205+ then $acc087708797
133206 else {
134- let $acc178427869 = check($acc078427869, $list78427869[0])
135- if (($size78427869 == 1))
136- then $acc178427869
207+ let $acc187708797 = check($acc087708797, $list87708797[0])
208+ if (($size87708797 == 1))
209+ then $acc187708797
137210 else {
138- let $acc278427869 = check($acc178427869, $list78427869[1])
139- if (($size78427869 == 2))
140- then $acc278427869
211+ let $acc287708797 = check($acc187708797, $list87708797[1])
212+ if (($size87708797 == 2))
213+ then $acc287708797
141214 else {
142- let $acc378427869 = check($acc278427869, $list78427869[2])
143- if (($size78427869 == 3))
144- then $acc378427869
215+ let $acc387708797 = check($acc287708797, $list87708797[2])
216+ if (($size87708797 == 3))
217+ then $acc387708797
145218 else {
146- let $acc478427869 = check($acc378427869, $list78427869[3])
147- if (($size78427869 == 4))
148- then $acc478427869
219+ let $acc487708797 = check($acc387708797, $list87708797[3])
220+ if (($size87708797 == 4))
221+ then $acc487708797
149222 else {
150- let $acc578427869 = check($acc478427869, $list78427869[4])
151- if (($size78427869 == 5))
152- then $acc578427869
223+ let $acc587708797 = check($acc487708797, $list87708797[4])
224+ if (($size87708797 == 5))
225+ then $acc587708797
153226 else {
154- let $acc678427869 = check($acc578427869, $list78427869[5])
227+ let $acc687708797 = check($acc587708797, $list87708797[5])
155228 throw("List size exceed 5")
156229 }
157230 }
161234 }
162235 }
163236
164- let rightManager = if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
165- then true
166- else sigVerify(tx.bodyBytes, tx.proofs[0], mmBotPublicKey)
237+ let rightTrader = sigVerify(tx.bodyBytes, tx.proofs[0], traderPublicKey)
238+ let rightManager = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
167239 let rightGuarantors = ((((if (isValid(tx.proofs[1], guarantorPublicKeys))
168240 then 1
169241 else 0) + (if (isValid(tx.proofs[2], guarantorPublicKeys))
173245 else 0)) >= ((size(guarantorPublicKeys) + 1) / 2))
174246 match tx {
175247 case o: Order =>
176- if (rightManager)
248+ if (if (rightTrader)
249+ then true
250+ else rightManager)
177251 then if (if (if ((o.matcherFeeAssetId == quoteAssetId))
178252 then if (if ((o.assetPair.amountAsset == baseAssetId))
179253 then (o.assetPair.priceAsset == quoteAssetId)
200274 else false
201275 else false
202276 else false
203- case t: TransferTransaction =>
204- if (if (rightManager)
205- then ((quarterOpenTime + timeout) > lastBlockTime)
206- else false)
207- then (addressFromRecipient(t.recipient) == addressFromPublicKey(dappPublicKey))
208- else false
209- case s: SetScriptTransaction =>
277+ case s: SetScriptTransaction|DataTransaction =>
210278 if (rightManager)
211279 then rightGuarantors
212280 else false
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let baseAssetId = base58'4LHHvYGNKJUg5hj65aGD5vgScvCBmLpdRFtjokvCjSL8'
55
66 let quoteAssetId = base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS'
77
8-let dappPublicKey = base58'2TxTux7YwCDmz45WeFjTfDpBg7t9hBir8SqeD9m86yen'
8+let dappAddress = Address(base58'3PNyTtHEnQkVUhRy6YuTa2bGLHL2ccaqjBG')
99
10-let payoutPublicKey = base58'CmtjCeZ9NqoQScT4HoWGn8vNQ8hK7kDKQfukQbjChQq1'
10+let stakAddress = Address(base58'3PLe1EGXcx2yNrNH7KvtmKW2B9uKvxm148A')
1111
12-let mmBotPublicKey = base58'5dQbzkYkh2UWtcR1cDwxZVzkduK1SVEeVa1TyLmD6eVU'
12+let exitAddress = Address(base58'3PMoQkZyawdWbm6a8o75tzDHQRNCvXFgSN6')
13+
14+let traderPublicKey = base58'5dQbzkYkh2UWtcR1cDwxZVzkduK1SVEeVa1TyLmD6eVU'
1315
1416 let managerPublicKey = base58'66BGZcJJ9yAWcHKZZeiuA71wAvC5GWTmdQWArjt1g6jC'
1517
1618 let guarantorPublicKeys = nil
1719
1820 let month = (2629746 * 1000)
1921
20-let quarter = (month * 3)
22+let timeout3 = (month / 10)
2123
22-let timeout = (month / 10)
24+let timeout10 = (month / 3)
2325
2426 let lastBlockTime = lastBlock.timestamp
2527
2628 let monthOpenTime = ((lastBlockTime / month) * month)
2729
28-let quarterOpenTime = ((lastBlockTime / quarter) * quarter)
30+let baseBalance = assetBalance(this, baseAssetId)
31+
32+let quoteBalance = assetBalance(this, quoteAssetId)
2933
3034 @Callable(i)
31-func setBalances (total) = if ((i.callerPublicKey != managerPublicKey))
35+func setBalances (amount) = if ((i.callerPublicKey != managerPublicKey))
3236 then throw("Only the administrator can adjust the balances!")
3337 else if (isDefined(i.payment))
34- then throw("Please do not attach payment when setting balances.")
35- else if ((0 > total))
36- then throw("Negative total balance are not allowed...")
37- else {
38- let baseBalance = assetBalance(this, baseAssetId)
39- let quoteBalance = assetBalance(this, quoteAssetId)
40- let totalBalance = match getInteger(this, "balance_total") {
41- case x: Int =>
42- x
43- case _ =>
44- 0
45- }
46- if ((total > 0))
47- then WriteSet([DataEntry("balance_base", baseBalance), DataEntry("balance_quote", quoteBalance), DataEntry("balance_total", total), DataEntry("last_update", lastBlockTime)])
48- else if ((totalBalance > 0))
49- then WriteSet([DataEntry("balance_base", baseBalance), DataEntry("balance_quote", quoteBalance), DataEntry("last_update", lastBlockTime)])
50- else throw("Zero total balance are not allowed...")
51- }
38+ then throw("Please do not attach payment when setting balances...")
39+ else if ((lastBlockTime >= (monthOpenTime + timeout10)))
40+ then throw((("The balance should be fixed after " + toString(((monthOpenTime + month) / 1000))) + " Unix timestamp."))
41+ else if ((0 > amount))
42+ then throw("Negative amount are not allowed...")
43+ else {
44+ let oldTotalBalance = match getInteger(this, "balance_total") {
45+ case x: Int =>
46+ x
47+ case _ =>
48+ 0
49+ }
50+ let ds0 = [DataEntry("balance_base", baseBalance)]
51+ let ds1 = DataEntry("balance_quote", quoteBalance) :: ds0
52+ let ds2 = if ((amount == 0))
53+ then ds1
54+ else DataEntry("balance_total", amount) :: ds1
55+ let ds3 = DataEntry("last_update", lastBlockTime) :: ds2
56+ let records = ds3
57+ if (if ((amount == 0))
58+ then (oldTotalBalance == 0)
59+ else false)
60+ then throw("Zero total balance are not allowed...")
61+ else WriteSet(records)
62+ }
5263
5364
5465
5566 @Callable(i)
56-func sendRewards () = {
57- let lastUpdate = getIntegerValue(this, "last_update")
58- let nextMonth = (((lastUpdate / month) + 1) * month)
59- if ((i.callerPublicKey != managerPublicKey))
60- then throw("Only administrator can send rewards!")
61- else if (isDefined(i.payment))
62- then throw("Please do not attach payment when sending rewards.")
63- else if (if ((nextMonth > lastBlockTime))
64- then true
65- else (lastBlockTime >= (monthOpenTime + timeout)))
66- then throw((("Rewards must be sent after " + toString(((monthOpenTime + month) / 1000))) + "."))
67+func sendRewards (amount) = if ((i.callerPublicKey != managerPublicKey))
68+ then throw("Only administrator can send rewards!")
69+ else if (isDefined(i.payment))
70+ then throw("Please do not attach payment when sending rewards...")
71+ else if ((lastBlockTime >= (monthOpenTime + timeout3)))
72+ then throw((("Rewards must be sent after " + toString(((monthOpenTime + month) / 1000))) + " Unix timestamp."))
73+ else if ((0 > amount))
74+ then throw("Negative amount are not allowed...")
6775 else {
68- let recipient = addressFromPublicKey(payoutPublicKey)
69- let baseBalance = assetBalance(this, baseAssetId)
70- let quoteBalance = assetBalance(this, quoteAssetId)
7176 let oldBaseBalance = getIntegerValue(this, "balance_base")
7277 let oldQuoteBalance = getIntegerValue(this, "balance_quote")
7378 let oldTotalBalance = getIntegerValue(this, "balance_total")
74- let mmProfit = (quoteBalance - fraction(oldQuoteBalance, oldBaseBalance, baseBalance))
75- let netProfit = (((2 * quoteBalance) - mmProfit) - oldTotalBalance)
76- let amount = if (((quarterOpenTime + timeout) > lastBlockTime))
77- then (mmProfit + (if ((netProfit > 0))
78- then netProfit
79- else 0))
80- else fraction(mmProfit, 8, 10)
81- if (if ((amount > 0))
82- then (quoteBalance >= amount)
83- else false)
84- then ScriptResult(WriteSet([DataEntry("balance_base", baseBalance), DataEntry("balance_quote", (quoteBalance - amount)), DataEntry("last_update", lastBlockTime)]), TransferSet([ScriptTransfer(recipient, amount, quoteAssetId)]))
85- else if ((amount > quoteBalance))
86- then throw("Insufficient funds on the balance of quotes...")
87- else throw("Zero or negative rewards are not allowed...")
79+ let stakProfit = (quoteBalance - fraction(oldQuoteBalance, oldBaseBalance, baseBalance))
80+ let stakAmount = if ((0 > stakProfit))
81+ then 0
82+ else if ((stakProfit > quoteBalance))
83+ then quoteBalance
84+ else stakProfit
85+ let newBalance = (quoteBalance - stakAmount)
86+ let longProfit = ((quoteBalance + newBalance) - oldTotalBalance)
87+ let longAmount = if ((0 > longProfit))
88+ then 0
89+ else if ((longProfit > newBalance))
90+ then newBalance
91+ else longProfit
92+ let restAmount = if ((longAmount > amount))
93+ then 0
94+ else if ((amount > newBalance))
95+ then (newBalance - longAmount)
96+ else (amount - longAmount)
97+ let dappAmount = (longAmount + restAmount)
98+ let ds0 = [DataEntry("balance_base", baseBalance)]
99+ let ds1 = DataEntry("balance_quote", (newBalance - dappAmount)) :: ds0
100+ let ds2 = if ((restAmount == 0))
101+ then ds1
102+ else DataEntry("balance_total", (oldTotalBalance - restAmount)) :: ds1
103+ let ds3 = DataEntry("last_update", lastBlockTime) :: ds2
104+ let records = ds3
105+ let ts0 = if ((stakAmount == 0))
106+ then nil
107+ else [ScriptTransfer(stakAddress, stakAmount, quoteAssetId)]
108+ let ts1 = if ((dappAmount == 0))
109+ then ts0
110+ else ScriptTransfer(dappAddress, dappAmount, quoteAssetId) :: ts0
111+ let transfers = ts1
112+ if ((size(transfers) == 0))
113+ then throw("Unable to withdraw funds this month!")
114+ else ScriptResult(WriteSet(records), TransferSet(transfers))
88115 }
89- }
90116
91117
92118
93119 @Callable(i)
94120 func emergencyExit () = {
121+ func isValid (pub,keys) = {
122+ func check (acc,key) = if (acc)
123+ then true
124+ else (pub == key)
125+
126+ let $list69947021 = keys
127+ let $size69947021 = size($list69947021)
128+ let $acc069947021 = false
129+ if (($size69947021 == 0))
130+ then $acc069947021
131+ else {
132+ let $acc169947021 = check($acc069947021, $list69947021[0])
133+ if (($size69947021 == 1))
134+ then $acc169947021
135+ else {
136+ let $acc269947021 = check($acc169947021, $list69947021[1])
137+ if (($size69947021 == 2))
138+ then $acc269947021
139+ else {
140+ let $acc369947021 = check($acc269947021, $list69947021[2])
141+ if (($size69947021 == 3))
142+ then $acc369947021
143+ else {
144+ let $acc469947021 = check($acc369947021, $list69947021[3])
145+ if (($size69947021 == 4))
146+ then $acc469947021
147+ else {
148+ let $acc569947021 = check($acc469947021, $list69947021[4])
149+ if (($size69947021 == 5))
150+ then $acc569947021
151+ else {
152+ let $acc669947021 = check($acc569947021, $list69947021[5])
153+ if (($size69947021 == 6))
154+ then $acc669947021
155+ else {
156+ let $acc769947021 = check($acc669947021, $list69947021[6])
157+ throw("List size exceed 6")
158+ }
159+ }
160+ }
161+ }
162+ }
163+ }
164+ }
165+ }
166+
95167 let lastUpdate = getIntegerValue(this, "last_update")
96- let emergencyTime = ((((lastUpdate / month) + 1) * month) + timeout)
97- if (isDefined(i.payment))
98- then throw("Please do not attach payment in an emergency.")
99- else if (if ((emergencyTime > lastBlockTime))
100- then (i.callerPublicKey != managerPublicKey)
101- else false)
102- then throw((("Time for emergencies will be after " + toString((emergencyTime / 1000))) + "."))
103- else {
104- let recipient = addressFromPublicKey(dappPublicKey)
105- let baseBalance = assetBalance(this, baseAssetId)
106- let quoteBalance = assetBalance(this, quoteAssetId)
107- let st0 = if ((baseBalance == 0))
108- then nil
109- else [ScriptTransfer(recipient, baseBalance, baseAssetId)]
110- let st1 = if ((quoteBalance == 0))
111- then st0
112- else ScriptTransfer(recipient, quoteBalance, quoteAssetId) :: st0
113- let scriptTransfers = st1
114- if ((size(scriptTransfers) > 0))
115- then ScriptResult(WriteSet([DataEntry("last_update", lastBlockTime)]), TransferSet(scriptTransfers))
116- else throw("There is nothing on the balances!")
117- }
168+ let emergencyTime = ((((lastUpdate / month) + 1) * month) + timeout3)
169+ if (!(isValid(i.callerPublicKey, managerPublicKey :: guarantorPublicKeys)))
170+ then throw("Only an administrator or guarantor can trigger an emergency exit!")
171+ else if (isDefined(i.payment))
172+ then throw("Please do not attach payment in an emergency exit...")
173+ else if (if ((i.callerPublicKey != managerPublicKey))
174+ then (emergencyTime > lastBlockTime)
175+ else false)
176+ then throw((("Time for emergencies will be after " + toString((emergencyTime / 1000))) + " Unix timestamp."))
177+ else {
178+ let ds0 = [DataEntry("last_update", lastBlockTime)]
179+ let records = ds0
180+ let ts0 = if ((baseBalance == 0))
181+ then nil
182+ else [ScriptTransfer(exitAddress, baseBalance, baseAssetId)]
183+ let ts1 = if ((quoteBalance == 0))
184+ then ts0
185+ else ScriptTransfer(exitAddress, quoteBalance, quoteAssetId) :: ts0
186+ let transfers = ts1
187+ if ((size(transfers) == 0))
188+ then throw("There is nothing on the balances!")
189+ else ScriptResult(WriteSet(records), TransferSet(transfers))
190+ }
118191 }
119192
120193
121194 @Verifier(tx)
122195 func verify () = {
123196 func isValid (sig,keys) = {
124- func check (acc,pub) = if (acc)
197+ func check (acc,key) = if (acc)
125198 then true
126- else sigVerify(tx.bodyBytes, sig, pub)
199+ else sigVerify(tx.bodyBytes, sig, key)
127200
128- let $list78427869 = keys
129- let $size78427869 = size($list78427869)
130- let $acc078427869 = false
131- if (($size78427869 == 0))
132- then $acc078427869
201+ let $list87708797 = keys
202+ let $size87708797 = size($list87708797)
203+ let $acc087708797 = false
204+ if (($size87708797 == 0))
205+ then $acc087708797
133206 else {
134- let $acc178427869 = check($acc078427869, $list78427869[0])
135- if (($size78427869 == 1))
136- then $acc178427869
207+ let $acc187708797 = check($acc087708797, $list87708797[0])
208+ if (($size87708797 == 1))
209+ then $acc187708797
137210 else {
138- let $acc278427869 = check($acc178427869, $list78427869[1])
139- if (($size78427869 == 2))
140- then $acc278427869
211+ let $acc287708797 = check($acc187708797, $list87708797[1])
212+ if (($size87708797 == 2))
213+ then $acc287708797
141214 else {
142- let $acc378427869 = check($acc278427869, $list78427869[2])
143- if (($size78427869 == 3))
144- then $acc378427869
215+ let $acc387708797 = check($acc287708797, $list87708797[2])
216+ if (($size87708797 == 3))
217+ then $acc387708797
145218 else {
146- let $acc478427869 = check($acc378427869, $list78427869[3])
147- if (($size78427869 == 4))
148- then $acc478427869
219+ let $acc487708797 = check($acc387708797, $list87708797[3])
220+ if (($size87708797 == 4))
221+ then $acc487708797
149222 else {
150- let $acc578427869 = check($acc478427869, $list78427869[4])
151- if (($size78427869 == 5))
152- then $acc578427869
223+ let $acc587708797 = check($acc487708797, $list87708797[4])
224+ if (($size87708797 == 5))
225+ then $acc587708797
153226 else {
154- let $acc678427869 = check($acc578427869, $list78427869[5])
227+ let $acc687708797 = check($acc587708797, $list87708797[5])
155228 throw("List size exceed 5")
156229 }
157230 }
158231 }
159232 }
160233 }
161234 }
162235 }
163236
164- let rightManager = if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
165- then true
166- else sigVerify(tx.bodyBytes, tx.proofs[0], mmBotPublicKey)
237+ let rightTrader = sigVerify(tx.bodyBytes, tx.proofs[0], traderPublicKey)
238+ let rightManager = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
167239 let rightGuarantors = ((((if (isValid(tx.proofs[1], guarantorPublicKeys))
168240 then 1
169241 else 0) + (if (isValid(tx.proofs[2], guarantorPublicKeys))
170242 then 1
171243 else 0)) + (if (isValid(tx.proofs[3], guarantorPublicKeys))
172244 then 1
173245 else 0)) >= ((size(guarantorPublicKeys) + 1) / 2))
174246 match tx {
175247 case o: Order =>
176- if (rightManager)
248+ if (if (rightTrader)
249+ then true
250+ else rightManager)
177251 then if (if (if ((o.matcherFeeAssetId == quoteAssetId))
178252 then if (if ((o.assetPair.amountAsset == baseAssetId))
179253 then (o.assetPair.priceAsset == quoteAssetId)
180254 else false)
181255 then true
182256 else if ((o.assetPair.amountAsset == quoteAssetId))
183257 then (o.assetPair.priceAsset == baseAssetId)
184258 else false
185259 else false)
186260 then true
187261 else if (if ((o.orderType == Buy))
188262 then (o.matcherFeeAssetId == quoteAssetId)
189263 else false)
190264 then (o.assetPair.amountAsset == quoteAssetId)
191265 else false)
192266 then true
193267 else if ((o.orderType == Sell))
194268 then if (if (!(isDefined(o.matcherFeeAssetId)))
195269 then !(isDefined(o.assetPair.priceAsset))
196270 else false)
197271 then true
198272 else if ((o.matcherFeeAssetId == quoteAssetId))
199273 then (o.assetPair.priceAsset == quoteAssetId)
200274 else false
201275 else false
202276 else false
203- case t: TransferTransaction =>
204- if (if (rightManager)
205- then ((quarterOpenTime + timeout) > lastBlockTime)
206- else false)
207- then (addressFromRecipient(t.recipient) == addressFromPublicKey(dappPublicKey))
208- else false
209- case s: SetScriptTransaction =>
277+ case s: SetScriptTransaction|DataTransaction =>
210278 if (rightManager)
211279 then rightGuarantors
212280 else false
213281 case _ =>
214282 false
215283 }
216284 }
217285

github/deemru/w8io/6500d08 
93.13 ms