tx · CnEhR9yWK7WTPT9rQbVzWDLGUyYa8BqPVp3bop4PkATf

3PMLRAox7yN29FiwW22FTHNNSFSAUPQK88g:  -0.01400000 Waves

2020.04.12 11:08 [2014139] smart account 3PMLRAox7yN29FiwW22FTHNNSFSAUPQK88g > SELF 0.00000000 Waves

{ "type": 13, "id": "CnEhR9yWK7WTPT9rQbVzWDLGUyYa8BqPVp3bop4PkATf", "fee": 1400000, "feeAssetId": null, "timestamp": 1586678915981, "version": 1, "sender": "3PMLRAox7yN29FiwW22FTHNNSFSAUPQK88g", "senderPublicKey": "BCAZqmRV9yjrT1DGHmwNthA168zcQHh5rcJ8ooA7TVJG", "proofs": [ "2TG18k8QfG1CKqFiWJ3rAvyuZqCDEUgA74zPdmujhVwX6iKt9d5svATwe2e7FRtP8wg8fEEddQv5uZRUxQx9eGeZ" ], "script": "base64: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dHJOYXRpdmUoMTA1MCkAAAACBQAAAAR0aGlzAgAAAA1iYWxhbmNlX3RvdGFsBAAAAApzdGFrUHJvZml0CQAAZQAAAAIFAAAADHF1b3RlQmFsYW5jZQkAAGsAAAADBQAAAA9vbGRRdW90ZUJhbGFuY2UFAAAADm9sZEJhc2VCYWxhbmNlBQAAAAtiYXNlQmFsYW5jZQQAAAAKc3Rha0Ftb3VudAMJAABmAAAAAgAAAAAAAAAAAAUAAAAKc3Rha1Byb2ZpdAAAAAAAAAAAAAMJAABmAAAAAgUAAAAKc3Rha1Byb2ZpdAUAAAAMcXVvdGVCYWxhbmNlBQAAAAxxdW90ZUJhbGFuY2UFAAAACnN0YWtQcm9maXQEAAAACm5ld0JhbGFuY2UJAABlAAAAAgUAAAAMcXVvdGVCYWxhbmNlBQAAAApzdGFrQW1vdW50BAAAAApsb25nUHJvZml0CQAAZQAAAAIJAABkAAAAAgUAAAAMcXVvdGVCYWxhbmNlBQAAAApuZXdCYWxhbmNlBQAAAA9vbGRUb3RhbEJhbGFuY2UEAAAACmxvbmdBbW91bnQDCQAAZgAAAAIAAAAAAAAAAAAFAAAACmxvbmdQcm9maXQAAAAAAAAAAAADCQAAZgAAAAIFAAAACmxvbmdQcm9maXQFAAAACm5ld0JhbGFuY2UFAAAACm5ld0JhbGFuY2UFAAAACmxvbmdQcm9maXQEAAAACnJlc3RBbW91bnQDCQAAZgAAAAIFAAAACmxvbmdBbW91bnQFAAAABmFtb3VudAAAAAAAAAAAAAMJAABmAAAAAgUAAAAGYW1vdW50BQAAAApuZXdCYWxhbmNlCQAAZQAAAAIFAAAACm5ld0JhbGFuY2UFAAAACmxvbmdBbW91bnQJAABlAAAAAgUAAAAGYW1vdW50BQAAAApsb25nQW1vdW50BAAAAApkYXBwQW1vdW50CQAAZAAAAAIFAAAACmxvbmdBbW91bnQFAAAACnJlc3RBbW91bnQEAAAAA2RzMAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgIAAAAMYmFsYW5jZV9iYXNlBQAAAAtiYXNlQmFsYW5jZQUAAAADbmlsBAAAAANkczEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAICAAAADWJhbGFuY2VfcXVvdGUJAABlAAAAAgUA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", "chainId": 87, "height": 2014139, "spentComplexity": 0 } View: original | compacted Prev: C7nY11qxp6VCapHLWDLSWsKXjwmK5yeuA3DwzGM3tq1y Next: EQbT3y8iTaMqygrZFv3HcAUcU2wHSs8aemDZYYP73Gr2 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 $list69747001 = keys
127+ let $size69747001 = size($list69747001)
128+ let $acc069747001 = false
129+ if (($size69747001 == 0))
130+ then $acc069747001
131+ else {
132+ let $acc169747001 = check($acc069747001, $list69747001[0])
133+ if (($size69747001 == 1))
134+ then $acc169747001
135+ else {
136+ let $acc269747001 = check($acc169747001, $list69747001[1])
137+ if (($size69747001 == 2))
138+ then $acc269747001
139+ else {
140+ let $acc369747001 = check($acc269747001, $list69747001[2])
141+ if (($size69747001 == 3))
142+ then $acc369747001
143+ else {
144+ let $acc469747001 = check($acc369747001, $list69747001[3])
145+ if (($size69747001 == 4))
146+ then $acc469747001
147+ else {
148+ let $acc569747001 = check($acc469747001, $list69747001[4])
149+ if (($size69747001 == 5))
150+ then $acc569747001
151+ else {
152+ let $acc669747001 = check($acc569747001, $list69747001[5])
153+ if (($size69747001 == 6))
154+ then $acc669747001
155+ else {
156+ let $acc769747001 = check($acc669747001, $list69747001[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 $list78307857 = keys
129- let $size78307857 = size($list78307857)
130- let $acc078307857 = false
131- if (($size78307857 == 0))
132- then $acc078307857
201+ let $list87508777 = keys
202+ let $size87508777 = size($list87508777)
203+ let $acc087508777 = false
204+ if (($size87508777 == 0))
205+ then $acc087508777
133206 else {
134- let $acc178307857 = check($acc078307857, $list78307857[0])
135- if (($size78307857 == 1))
136- then $acc178307857
207+ let $acc187508777 = check($acc087508777, $list87508777[0])
208+ if (($size87508777 == 1))
209+ then $acc187508777
137210 else {
138- let $acc278307857 = check($acc178307857, $list78307857[1])
139- if (($size78307857 == 2))
140- then $acc278307857
211+ let $acc287508777 = check($acc187508777, $list87508777[1])
212+ if (($size87508777 == 2))
213+ then $acc287508777
141214 else {
142- let $acc378307857 = check($acc278307857, $list78307857[2])
143- if (($size78307857 == 3))
144- then $acc378307857
215+ let $acc387508777 = check($acc287508777, $list87508777[2])
216+ if (($size87508777 == 3))
217+ then $acc387508777
145218 else {
146- let $acc478307857 = check($acc378307857, $list78307857[3])
147- if (($size78307857 == 4))
148- then $acc478307857
219+ let $acc487508777 = check($acc387508777, $list87508777[3])
220+ if (($size87508777 == 4))
221+ then $acc487508777
149222 else {
150- let $acc578307857 = check($acc478307857, $list78307857[4])
151- if (($size78307857 == 5))
152- then $acc578307857
223+ let $acc587508777 = check($acc487508777, $list87508777[4])
224+ if (($size87508777 == 5))
225+ then $acc587508777
153226 else {
154- let $acc678307857 = check($acc578307857, $list78307857[5])
227+ let $acc687508777 = check($acc587508777, $list87508777[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'B3uGHFRpSUuGEDWjqB9LWWxafQj8VTvpMucEyoxzws5H'
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 $list69747001 = keys
127+ let $size69747001 = size($list69747001)
128+ let $acc069747001 = false
129+ if (($size69747001 == 0))
130+ then $acc069747001
131+ else {
132+ let $acc169747001 = check($acc069747001, $list69747001[0])
133+ if (($size69747001 == 1))
134+ then $acc169747001
135+ else {
136+ let $acc269747001 = check($acc169747001, $list69747001[1])
137+ if (($size69747001 == 2))
138+ then $acc269747001
139+ else {
140+ let $acc369747001 = check($acc269747001, $list69747001[2])
141+ if (($size69747001 == 3))
142+ then $acc369747001
143+ else {
144+ let $acc469747001 = check($acc369747001, $list69747001[3])
145+ if (($size69747001 == 4))
146+ then $acc469747001
147+ else {
148+ let $acc569747001 = check($acc469747001, $list69747001[4])
149+ if (($size69747001 == 5))
150+ then $acc569747001
151+ else {
152+ let $acc669747001 = check($acc569747001, $list69747001[5])
153+ if (($size69747001 == 6))
154+ then $acc669747001
155+ else {
156+ let $acc769747001 = check($acc669747001, $list69747001[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 $list78307857 = keys
129- let $size78307857 = size($list78307857)
130- let $acc078307857 = false
131- if (($size78307857 == 0))
132- then $acc078307857
201+ let $list87508777 = keys
202+ let $size87508777 = size($list87508777)
203+ let $acc087508777 = false
204+ if (($size87508777 == 0))
205+ then $acc087508777
133206 else {
134- let $acc178307857 = check($acc078307857, $list78307857[0])
135- if (($size78307857 == 1))
136- then $acc178307857
207+ let $acc187508777 = check($acc087508777, $list87508777[0])
208+ if (($size87508777 == 1))
209+ then $acc187508777
137210 else {
138- let $acc278307857 = check($acc178307857, $list78307857[1])
139- if (($size78307857 == 2))
140- then $acc278307857
211+ let $acc287508777 = check($acc187508777, $list87508777[1])
212+ if (($size87508777 == 2))
213+ then $acc287508777
141214 else {
142- let $acc378307857 = check($acc278307857, $list78307857[2])
143- if (($size78307857 == 3))
144- then $acc378307857
215+ let $acc387508777 = check($acc287508777, $list87508777[2])
216+ if (($size87508777 == 3))
217+ then $acc387508777
145218 else {
146- let $acc478307857 = check($acc378307857, $list78307857[3])
147- if (($size78307857 == 4))
148- then $acc478307857
219+ let $acc487508777 = check($acc387508777, $list87508777[3])
220+ if (($size87508777 == 4))
221+ then $acc487508777
149222 else {
150- let $acc578307857 = check($acc478307857, $list78307857[4])
151- if (($size78307857 == 5))
152- then $acc578307857
223+ let $acc587508777 = check($acc487508777, $list87508777[4])
224+ if (($size87508777 == 5))
225+ then $acc587508777
153226 else {
154- let $acc678307857 = check($acc578307857, $list78307857[5])
227+ let $acc687508777 = check($acc587508777, $list87508777[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/3ef1775 
80.43 ms