tx · 91ivNTLcvqBS2ELjbCvs5y5FwoavZiFvDC4VFMBPUrHs

3PB78esDgZEwDPG8zTrcv7VEBvzSd84Pzp9:  -0.01400000 Waves

2020.04.24 20:00 [2032283] smart account 3PB78esDgZEwDPG8zTrcv7VEBvzSd84Pzp9 > SELF 0.00000000 Waves

{ "type": 13, "id": "91ivNTLcvqBS2ELjbCvs5y5FwoavZiFvDC4VFMBPUrHs", "fee": 1400000, "feeAssetId": null, "timestamp": 1587747798128, "version": 1, "sender": "3PB78esDgZEwDPG8zTrcv7VEBvzSd84Pzp9", "senderPublicKey": "6CkaEA8CPAoVRkUbUWp6SCbWJv28yoVGSL812PfGS65k", "proofs": [ "2UHxVmWwDbiWHS9dNtvNyzt3QKw93gR1Y9muRxXXnBto4STDXET84XHjiWSeiVkoB2M8UanbymYZkqzHnx3jCg8Q" ], "script": "base64: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AAACAAAAAQIAAAASTGlzdCBzaXplIGV4Y2VlZCA1AAAABAAAAAFpAQAAAAlnZXRQcm9maXQAAAAABAAAAApsYXN0VXBkYXRlCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAAR0aGlzAgAAAAtsYXN0X3VwZGF0ZQMJAABnAAAAAgUAAAAKbGFzdFVwZGF0ZQUAAAANbW9udGhPcGVuVGltZQkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAaUHJvZml0IG11c3QgYmUgc2VudCBhZnRlciAJAQAAAAlkcm9wUmlnaHQAAAACCQABpAAAAAEJAABkAAAAAgUAAAANbW9udGhPcGVuVGltZQUAAAAFbW9udGgAAAAAAAAAAAMCAAAAECBVbml4IHRpbWVzdGFtcC4DCQEAAAACIT0AAAACCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkFAAAAEG1hbmFnZXJQdWJsaWNLZXkJAAACAAAAAQIAAAAoT25seSB0aGUgYWRtaW5pc3RyYXRvciBjYW4gc2VuZCBwcm9maXRzIQMJAQAAAAlpc0RlZmluZWQAAAABCAUAAAABaQAAAAdwYXltZW50CQAAAgAAAAECAAAAM1BsZWFzZSBkbyBub3QgYXR0YWNoIHBheW1lbnQgd2hlbiBzZW5kaW5nIHByb2ZpdC4uLgQAAAAOb2xkQmFzZUJhbGFuY2UJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAABHRoaXMCAAAADGJhbGFuY2VfYmFzZQQAAAAPb2xkUXVvdGVCYWxhbmNlCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAAR0aGlzAgAAAA1iYWxhbmNlX3F1b3RlBAAAAA9vbGRUb3RhbEJhbGFuY2UJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAABHRoaXMCAAAADWJhbGFuY2VfdG90YWwEAAAACnN0YWtQcm9maXQJAABlAAAAAgUAAAAMcXVvdGVCYWxhbmNlCQAAawAAAAMFAAAADm9sZEJhc2VCYWxhbmNlBQAAAA9vbGRRdW90ZUJhbGFuY2UFAAAAC2Jhc2VCYWxhbmNlBAAAAApzdGFrQW1vdW50AwkAAGYAAAACAAAAAAAAAAAABQAAAApzdGFrUHJvZml0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AAAACWFzc2V0UGFpcgAAAApwcmljZUFzc2V0BQAAAAtiYXNlQXNzZXRJZAcHBgMDCQAAAAAAAAIIBQAAAAFvAAAAEW1hdGNoZXJGZWVBc3NldElkBQAAAAxxdW90ZUFzc2V0SWQJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEICAUAAAABbwAAAAlhc3NldFBhaXIAAAALYW1vdW50QXNzZXQHCQAAAAAAAAIICAUAAAABbwAAAAlhc3NldFBhaXIAAAAKcHJpY2VBc3NldAUAAAAOYml0Y29pbkFzc2V0SWQHBwMDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAF01hc3NUcmFuc2ZlclRyYW5zYWN0aW9uBgkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABNUcmFuc2ZlclRyYW5zYWN0aW9uBAAAAAF0BQAAAAckbWF0Y2gwAwUAAAAMcmlnaHRNYW5hZ2VyCQEAAAABIQAAAAEJAQAAAAxpc0ZpeGVkQXNzZXQAAAABCAUAAAABdAAAAAdhc3NldElkBwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAPRGF0YVRyYW5zYWN0aW9uBAAAAAFkBQAAAAckbWF0Y2gwAwUAAAAMcmlnaHRNYW5hZ2VyBQAAAA9yaWdodEd1YXJhbnRvcnMHAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABRTZXRTY3JpcHRUcmFuc2FjdGlvbgQAAAABcwUAAAAHJG1hdGNoMAMFAAAADHJpZ2h0TWFuYWdlcgUAAAAPcmlnaHRHdWFyYW50b3JzBwceAZ4m", "chainId": 87, "height": 2032283, "spentComplexity": 0 } View: original | compacted Prev: fBoEX6wmRyA9Q5gaqiPatAaqbZuRWYcVWa9sXJGX7rq Next: none Diff:
OldNewDifferences
55
66 let quoteAssetId = base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS'
77
8-let dappAddress = Address(base58'3PNyTtHEnQkVUhRy6YuTa2bGLHL2ccaqjBG')
8+let bitcoinAssetId = base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS'
99
10-let stakAddress = Address(base58'3PLe1EGXcx2yNrNH7KvtmKW2B9uKvxm148A')
11-
12-let exitAddress = Address(base58'3PMoQkZyawdWbm6a8o75tzDHQRNCvXFgSN6')
10+let franklinAssetId = base58'9SjLgBBKXt95VKYNv8xnC2GWQBRsJLowcgCrTLGFMW8z'
1311
1412 let traderPublicKey = base58'5dQbzkYkh2UWtcR1cDwxZVzkduK1SVEeVa1TyLmD6eVU'
1513
1715
1816 let guarantorPublicKeys = nil
1917
18+let headAddress = addressFromPublicKey(managerPublicKey)
19+
20+let depoAddress = Address(base58'3PEZVpdtoaftCfSULafq7aBcwtyAvaWmgmd')
21+
22+let stakAddress = Address(base58'3PLe1EGXcx2yNrNH7KvtmKW2B9uKvxm148A')
23+
24+let holdAddress = Address(base58'3PNyTtHEnQkVUhRy6YuTa2bGLHL2ccaqjBG')
25+
26+let exitAddress = Address(base58'3PMoQkZyawdWbm6a8o75tzDHQRNCvXFgSN6')
27+
28+let minBalance = (1000 * 1000)
29+
30+let baseBalance = assetBalance(this, baseAssetId)
31+
32+let quoteBalance = assetBalance(this, quoteAssetId)
33+
2034 let month = (2629746 * 1000)
2135
22-let timeout3 = (month / 10)
23-
24-let timeout10 = (month / 3)
36+let timeout = (month / 10)
2537
2638 let lastBlockTime = lastBlock.timestamp
2739
2840 let monthOpenTime = ((lastBlockTime / month) * month)
2941
30-let baseBalance = assetBalance(this, baseAssetId)
42+func orInteger (val,opt) = match val {
43+ case x: Int =>
44+ x
45+ case _ =>
46+ opt
47+}
3148
32-let quoteBalance = assetBalance(this, quoteAssetId)
49+
50+func orBoolean (val,opt) = match val {
51+ case x: Boolean =>
52+ x
53+ case _ =>
54+ opt
55+}
56+
57+
58+func isValidAsset (assetId) = match assetInfo(assetId) {
59+ case a: Asset =>
60+ !(a.scripted)
61+ case _ =>
62+ false
63+}
64+
65+
66+func isFixedAsset (assetId) = if (if (if (!(isDefined(assetId)))
67+ then true
68+ else (assetId == bitcoinAssetId))
69+ then true
70+ else (assetId == baseAssetId))
71+ then true
72+ else (assetId == quoteAssetId)
73+
74+
75+func isValidProof (msg,sig,keys) = {
76+ func keyVerify (acc,key) = if (acc)
77+ then true
78+ else sigVerify(msg, sig, key)
79+
80+ let $list32513282 = keys
81+ let $size32513282 = size($list32513282)
82+ let $acc032513282 = false
83+ if (($size32513282 == 0))
84+ then $acc032513282
85+ else {
86+ let $acc132513282 = keyVerify($acc032513282, $list32513282[0])
87+ if (($size32513282 == 1))
88+ then $acc132513282
89+ else {
90+ let $acc232513282 = keyVerify($acc132513282, $list32513282[1])
91+ if (($size32513282 == 2))
92+ then $acc232513282
93+ else {
94+ let $acc332513282 = keyVerify($acc232513282, $list32513282[2])
95+ if (($size32513282 == 3))
96+ then $acc332513282
97+ else {
98+ let $acc432513282 = keyVerify($acc332513282, $list32513282[3])
99+ if (($size32513282 == 4))
100+ then $acc432513282
101+ else {
102+ let $acc532513282 = keyVerify($acc432513282, $list32513282[4])
103+ if (($size32513282 == 5))
104+ then $acc532513282
105+ else {
106+ let $acc632513282 = keyVerify($acc532513282, $list32513282[5])
107+ throw("List size exceed 5")
108+ }
109+ }
110+ }
111+ }
112+ }
113+ }
114+ }
115+
33116
34117 @Callable(i)
35-func setBalances (amount) = if ((i.callerPublicKey != managerPublicKey))
36- then throw("Only the administrator can adjust the balances!")
37- else if (isDefined(i.payment))
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...")
118+func getProfit () = {
119+ let lastUpdate = getIntegerValue(this, "last_update")
120+ if ((lastUpdate >= monthOpenTime))
121+ then throw((("Profit must be sent after " + dropRight(toString((monthOpenTime + month)), 3)) + " Unix timestamp."))
122+ else if ((i.callerPublicKey != managerPublicKey))
123+ then throw("Only the administrator can send profits!")
124+ else if (isDefined(i.payment))
125+ then throw("Please do not attach payment when sending profit...")
43126 else {
44- let oldTotalBalance = match getInteger(this, "balance_total") {
45- case x: Int =>
46- x
47- case _ =>
48- 0
127+ let oldBaseBalance = getIntegerValue(this, "balance_base")
128+ let oldQuoteBalance = getIntegerValue(this, "balance_quote")
129+ let oldTotalBalance = getIntegerValue(this, "balance_total")
130+ let stakProfit = (quoteBalance - fraction(oldBaseBalance, oldQuoteBalance, baseBalance))
131+ let stakAmount = if ((0 > stakProfit))
132+ then 0
133+ else if ((stakProfit > (quoteBalance / 2)))
134+ then (quoteBalance / 2)
135+ else stakProfit
136+ let stakFee = fraction(stakAmount, 20, 100)
137+ let netQuoteBalance = (quoteBalance - stakAmount)
138+ let holdProfit = ((quoteBalance + netQuoteBalance) - oldTotalBalance)
139+ let holdAmount = if ((0 > holdProfit))
140+ then 0
141+ else if ((holdProfit > (netQuoteBalance / 2)))
142+ then (netQuoteBalance / 2)
143+ else holdProfit
144+ let holdFee = fraction(holdAmount, 20, 100)
145+ let baseAmount = ((fraction(holdAmount, baseBalance, netQuoteBalance) + 1) / 2)
146+ let quoteAmount = (holdAmount - fraction(baseAmount, netQuoteBalance, baseBalance))
147+ let ds0 = if (((baseBalance - baseAmount) == oldBaseBalance))
148+ then nil
149+ else [DataEntry("balance_base", (baseBalance - baseAmount))]
150+ let ds1 = if (((netQuoteBalance - quoteAmount) == oldQuoteBalance))
151+ then ds0
152+ else DataEntry("balance_quote", (netQuoteBalance - quoteAmount)) :: ds0
153+ let ds2 = DataEntry("dapp_status", false) :: ds1
154+ let ds3 = DataEntry("last_update", lastBlockTime) :: ds2
155+ let data = ds3
156+ let ts0 = if (((stakFee + holdFee) == 0))
157+ then nil
158+ else [ScriptTransfer(headAddress, (stakFee + holdFee), quoteAssetId)]
159+ let ts1 = if ((stakAmount == 0))
160+ then ts0
161+ else ScriptTransfer(stakAddress, (stakAmount - stakFee), quoteAssetId) :: ts0
162+ let ts2 = if ((holdAmount == 0))
163+ then ts1
164+ else ScriptTransfer(holdAddress, (holdAmount - holdFee), quoteAssetId) :: ts1
165+ let transfers = ts2
166+ ScriptResult(WriteSet(data), TransferSet(transfers))
49167 }
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- }
168+ }
63169
64170
65171
66172 @Callable(i)
67-func sendRewards (amount) = if ((i.callerPublicKey != managerPublicKey))
68- then throw("Only administrator can send rewards!")
173+func setBalance () = {
174+ let isActive = orBoolean(getBoolean(this, "dapp_status"), false)
175+ let lastUpdate = orInteger(getInteger(this, "last_update"), lastBlockTime)
176+ let timeframe = orInteger(getInteger(headAddress, "timeframe"), month)
177+ let minStartTime = (((lastUpdate / timeframe) + 1) * timeframe)
178+ if (if (isActive)
179+ then (monthOpenTime > lastUpdate)
180+ else false)
181+ then throw("First you need to withdraw rewards...")
182+ else if (if (isActive)
183+ then (minStartTime > lastUpdate)
184+ else false)
185+ then throw((("The balance should be fixed after " + dropRight(toString(minStartTime), 3)) + " Unix timestamp."))
186+ else if ((i.callerPublicKey != managerPublicKey))
187+ then throw("Only the administrator can adjust the balances!")
188+ else if (isDefined(i.payment))
189+ then throw("Please do not attach payment when setting balances...")
190+ else {
191+ let oldBaseBalance = orInteger(getInteger(this, "balance_base"), 0)
192+ let oldQuoteBalance = orInteger(getInteger(this, "balance_quote"), 0)
193+ let oldTotalBalance = orInteger(getInteger(this, "balance_total"), 0)
194+ let quoteString = if (isDefined(quoteAssetId))
195+ then "_btc"
196+ else "_waves"
197+ let totalBalance = getIntegerValue(depoAddress, (toString(this) + quoteString))
198+ let deposit = if ((oldTotalBalance == 0))
199+ then 0
200+ else (totalBalance - oldTotalBalance)
201+ let baseAmount = if ((oldBaseBalance == 0))
202+ then baseBalance
203+ else ((fraction(deposit, oldBaseBalance, oldQuoteBalance) + 1) / 2)
204+ let quoteAmount = if ((oldQuoteBalance == 0))
205+ then quoteBalance
206+ else (deposit - fraction(baseAmount, oldQuoteBalance, oldBaseBalance))
207+ let ds0 = if ((baseAmount == 0))
208+ then nil
209+ else [DataEntry("balance_base", (oldBaseBalance + baseAmount))]
210+ let ds1 = if ((quoteAmount == 0))
211+ then ds0
212+ else DataEntry("balance_quote", (oldQuoteBalance + quoteAmount)) :: ds0
213+ let ds2 = if ((totalBalance == oldTotalBalance))
214+ then ds1
215+ else DataEntry("balance_total", totalBalance) :: ds1
216+ let ds3 = DataEntry("dapp_status", true) :: ds2
217+ let ds4 = DataEntry("last_update", lastBlockTime) :: ds3
218+ let data = ds4
219+ WriteSet(data)
220+ }
221+ }
222+
223+
224+
225+@Callable(i)
226+func getDonations (id0,id1,id2,id3,id4,id5,id6,id7,id8,id9) = if ((i.callerPublicKey != managerPublicKey))
227+ then throw("Only the administrator can send donations!")
69228 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...")
75- else {
76- let feeAddress = addressFromPublicKey(managerPublicKey)
77- let oldBaseBalance = getIntegerValue(this, "balance_base")
78- let oldQuoteBalance = getIntegerValue(this, "balance_quote")
79- let oldTotalBalance = getIntegerValue(this, "balance_total")
80- let stakProfit = (quoteBalance - fraction(oldQuoteBalance, oldBaseBalance, baseBalance))
81- let stakAmount = if ((0 > stakProfit))
82- then 0
83- else if ((stakProfit > quoteBalance))
84- then quoteBalance
85- else stakProfit
86- let stakFee = fraction(stakAmount, 20, 100)
87- let newBalance = (quoteBalance - stakAmount)
88- let longProfit = ((quoteBalance + newBalance) - oldTotalBalance)
89- let longAmount = if ((0 > longProfit))
90- then 0
91- else if ((longProfit > newBalance))
92- then newBalance
93- else longProfit
94- let longFee = fraction(longAmount, 20, 100)
95- let restAmount = if ((longAmount > amount))
96- then 0
97- else if ((amount > newBalance))
98- then (newBalance - longAmount)
99- else (amount - longAmount)
100- let dappAmount = (longAmount + restAmount)
101- let ds0 = [DataEntry("balance_base", baseBalance)]
102- let ds1 = DataEntry("balance_quote", (newBalance - dappAmount)) :: ds0
103- let ds2 = if ((restAmount == 0))
104- then ds1
105- else DataEntry("balance_total", (oldTotalBalance - restAmount)) :: ds1
106- let ds3 = DataEntry("last_update", lastBlockTime) :: ds2
107- let records = ds3
108- let ts0 = if (((stakFee + longFee) == 0))
109- then nil
110- else [ScriptTransfer(feeAddress, (stakFee + longFee), quoteAssetId)]
111- let ts1 = if ((stakAmount == 0))
112- then ts0
113- else ScriptTransfer(stakAddress, (stakAmount - stakFee), quoteAssetId) :: ts0
114- let ts2 = if ((dappAmount == 0))
115- then ts1
116- else ScriptTransfer(dappAddress, (dappAmount - longFee), quoteAssetId) :: ts1
117- let transfers = ts2
118- if ((size(transfers) == 0))
119- then throw("Unable to withdraw funds this month!")
120- else ScriptResult(WriteSet(records), TransferSet(transfers))
121- }
229+ then throw("Please do not attach payment when sending donations...")
230+ else {
231+ let ts0 = if (if (!(isValidAsset(id0)))
232+ then true
233+ else isFixedAsset(id0))
234+ then nil
235+ else [ScriptTransfer(headAddress, assetBalance(this, id0), id0)]
236+ let ts1 = if (if (!(isValidAsset(id1)))
237+ then true
238+ else isFixedAsset(id1))
239+ then ts0
240+ else ScriptTransfer(headAddress, assetBalance(this, id1), id1) :: ts0
241+ let ts2 = if (if (!(isValidAsset(id2)))
242+ then true
243+ else isFixedAsset(id2))
244+ then ts1
245+ else ScriptTransfer(headAddress, assetBalance(this, id2), id2) :: ts1
246+ let ts3 = if (if (!(isValidAsset(id3)))
247+ then true
248+ else isFixedAsset(id3))
249+ then ts2
250+ else ScriptTransfer(headAddress, assetBalance(this, id3), id3) :: ts2
251+ let ts4 = if (if (!(isValidAsset(id4)))
252+ then true
253+ else isFixedAsset(id4))
254+ then ts3
255+ else ScriptTransfer(headAddress, assetBalance(this, id4), id4) :: ts3
256+ let ts5 = if (if (!(isValidAsset(id5)))
257+ then true
258+ else isFixedAsset(id5))
259+ then ts4
260+ else ScriptTransfer(headAddress, assetBalance(this, id5), id5) :: ts4
261+ let ts6 = if (if (!(isValidAsset(id6)))
262+ then true
263+ else isFixedAsset(id6))
264+ then ts5
265+ else ScriptTransfer(headAddress, assetBalance(this, id6), id6) :: ts5
266+ let ts7 = if (if (!(isValidAsset(id7)))
267+ then true
268+ else isFixedAsset(id7))
269+ then ts6
270+ else ScriptTransfer(headAddress, assetBalance(this, id7), id7) :: ts6
271+ let ts8 = if (if (!(isValidAsset(id8)))
272+ then true
273+ else isFixedAsset(id8))
274+ then ts7
275+ else ScriptTransfer(headAddress, assetBalance(this, id8), id8) :: ts7
276+ let ts9 = if (if (!(isValidAsset(id9)))
277+ then true
278+ else isFixedAsset(id9))
279+ then ts8
280+ else ScriptTransfer(headAddress, assetBalance(this, id9), id9) :: ts8
281+ let transfers = ts9
282+ if ((size(transfers) == 0))
283+ then throw("There are no valid asset identifiers!")
284+ else TransferSet(transfers)
285+ }
122286
123287
124288
125289 @Callable(i)
126290 func emergencyExit () = {
127- func isValid (pub,keys) = {
128- func check (acc,key) = if (acc)
129- then true
130- else (pub == key)
131-
132- let $list71657192 = keys
133- let $size71657192 = size($list71657192)
134- let $acc071657192 = false
135- if (($size71657192 == 0))
136- then $acc071657192
137- else {
138- let $acc171657192 = check($acc071657192, $list71657192[0])
139- if (($size71657192 == 1))
140- then $acc171657192
141- else {
142- let $acc271657192 = check($acc171657192, $list71657192[1])
143- if (($size71657192 == 2))
144- then $acc271657192
145- else {
146- let $acc371657192 = check($acc271657192, $list71657192[2])
147- if (($size71657192 == 3))
148- then $acc371657192
149- else {
150- let $acc471657192 = check($acc371657192, $list71657192[3])
151- if (($size71657192 == 4))
152- then $acc471657192
153- else {
154- let $acc571657192 = check($acc471657192, $list71657192[4])
155- if (($size71657192 == 5))
156- then $acc571657192
157- else {
158- let $acc671657192 = check($acc571657192, $list71657192[5])
159- if (($size71657192 == 6))
160- then $acc671657192
161- else {
162- let $acc771657192 = check($acc671657192, $list71657192[6])
163- throw("List size exceed 6")
164- }
165- }
166- }
167- }
168- }
169- }
170- }
171- }
172-
173291 let lastUpdate = getIntegerValue(this, "last_update")
174- let emergencyTime = ((((lastUpdate / month) + 1) * month) + timeout3)
175- if (!(isValid(i.callerPublicKey, managerPublicKey :: guarantorPublicKeys)))
176- then throw("Only an administrator or guarantor can trigger an emergency exit!")
177- else if (isDefined(i.payment))
178- then throw("Please do not attach payment in an emergency exit...")
179- else if (if ((i.callerPublicKey != managerPublicKey))
180- then (emergencyTime > lastBlockTime)
181- else false)
182- then throw((("Time for emergencies will be after " + toString((emergencyTime / 1000))) + " Unix timestamp."))
292+ let minStartTime = ((((lastUpdate / month) + 1) * month) + timeout)
293+ let callerBalance = assetBalance(i.caller, franklinAssetId)
294+ if (if ((i.callerPublicKey != managerPublicKey))
295+ then (minStartTime > lastBlockTime)
296+ else false)
297+ then throw((("Time for emergencies will be after " + dropRight(toString(minStartTime), 3)) + " Unix timestamp."))
298+ else if (if ((i.callerPublicKey != managerPublicKey))
299+ then ((100 * minBalance) > callerBalance)
300+ else false)
301+ then throw("With only 1 Franklin on your balance, you can trigger an emergency exit!")
302+ else if (isDefined(i.payment))
303+ then throw("Please do not attach payment in an emergency exit...")
183304 else {
305+ let ds0 = [DataEntry("balance_total", 0)]
306+ let ds1 = DataEntry("dapp_status", false) :: ds0
307+ let ds2 = DataEntry("last_update", lastBlockTime) :: ds1
308+ let data = ds2
184309 let ts0 = if ((baseBalance == 0))
185310 then nil
186311 else [ScriptTransfer(exitAddress, baseBalance, baseAssetId)]
189314 else ScriptTransfer(exitAddress, quoteBalance, quoteAssetId) :: ts0
190315 let transfers = ts1
191316 if ((size(transfers) == 0))
192- then throw("There is nothing on the balances!")
193- else TransferSet(transfers)
317+ then throw("There is nothing else on both balances!")
318+ else ScriptResult(WriteSet(data), TransferSet(transfers))
194319 }
195320 }
196321
197322
198323 @Verifier(tx)
199324 func verify () = {
200- func isValid (sig,keys) = {
201- func check (acc,key) = if (acc)
202- then true
203- else sigVerify(tx.bodyBytes, sig, key)
204-
205- let $list88088835 = keys
206- let $size88088835 = size($list88088835)
207- let $acc088088835 = false
208- if (($size88088835 == 0))
209- then $acc088088835
210- else {
211- let $acc188088835 = check($acc088088835, $list88088835[0])
212- if (($size88088835 == 1))
213- then $acc188088835
214- else {
215- let $acc288088835 = check($acc188088835, $list88088835[1])
216- if (($size88088835 == 2))
217- then $acc288088835
218- else {
219- let $acc388088835 = check($acc288088835, $list88088835[2])
220- if (($size88088835 == 3))
221- then $acc388088835
222- else {
223- let $acc488088835 = check($acc388088835, $list88088835[3])
224- if (($size88088835 == 4))
225- then $acc488088835
226- else {
227- let $acc588088835 = check($acc488088835, $list88088835[4])
228- if (($size88088835 == 5))
229- then $acc588088835
230- else {
231- let $acc688088835 = check($acc588088835, $list88088835[5])
232- throw("List size exceed 5")
233- }
234- }
235- }
236- }
237- }
238- }
239- }
240-
241325 let rightTrader = sigVerify(tx.bodyBytes, tx.proofs[0], traderPublicKey)
242326 let rightManager = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
243- let rightGuarantors = ((((if (isValid(tx.proofs[1], guarantorPublicKeys))
327+ let rightGuarantors = ((((if (isValidProof(tx.bodyBytes, tx.proofs[1], guarantorPublicKeys))
244328 then 1
245- else 0) + (if (isValid(tx.proofs[2], guarantorPublicKeys))
329+ else 0) + (if (isValidProof(tx.bodyBytes, tx.proofs[2], guarantorPublicKeys))
246330 then 1
247- else 0)) + (if (isValid(tx.proofs[3], guarantorPublicKeys))
331+ else 0)) + (if (isValidProof(tx.bodyBytes, tx.proofs[3], guarantorPublicKeys))
248332 then 1
249333 else 0)) >= ((size(guarantorPublicKeys) + 1) / 2))
250334 match tx {
252336 if (if (rightTrader)
253337 then true
254338 else rightManager)
255- then if (if (if ((o.matcherFeeAssetId == quoteAssetId))
339+ then if (if ((o.matcherFeeAssetId == quoteAssetId))
256340 then if (if ((o.assetPair.amountAsset == baseAssetId))
257341 then (o.assetPair.priceAsset == quoteAssetId)
258342 else false)
262346 else false
263347 else false)
264348 then true
265- else if (if ((o.orderType == Buy))
266- then (o.matcherFeeAssetId == quoteAssetId)
349+ else if (if ((o.matcherFeeAssetId == quoteAssetId))
350+ then !(isDefined(o.assetPair.amountAsset))
267351 else false)
268- then (o.assetPair.amountAsset == quoteAssetId)
269- else false)
270- then true
271- else if ((o.orderType == Sell))
272- then if (if (!(isDefined(o.matcherFeeAssetId)))
273- then !(isDefined(o.assetPair.priceAsset))
274- else false)
275- then true
276- else if ((o.matcherFeeAssetId == quoteAssetId))
277- then (o.assetPair.priceAsset == quoteAssetId)
278- else false
352+ then (o.assetPair.priceAsset == bitcoinAssetId)
279353 else false
280354 else false
281- case s: SetScriptTransaction|DataTransaction =>
355+ case t: MassTransferTransaction|TransferTransaction =>
356+ if (rightManager)
357+ then !(isFixedAsset(t.assetId))
358+ else false
359+ case d: DataTransaction =>
360+ if (rightManager)
361+ then rightGuarantors
362+ else false
363+ case s: SetScriptTransaction =>
282364 if (rightManager)
283365 then rightGuarantors
284366 else false
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let baseAssetId = base58'HZk1mbfuJpmxU1Fs4AX5MWLVYtctsNcg6e2C6VKqK8zk'
55
66 let quoteAssetId = base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS'
77
8-let dappAddress = Address(base58'3PNyTtHEnQkVUhRy6YuTa2bGLHL2ccaqjBG')
8+let bitcoinAssetId = base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS'
99
10-let stakAddress = Address(base58'3PLe1EGXcx2yNrNH7KvtmKW2B9uKvxm148A')
11-
12-let exitAddress = Address(base58'3PMoQkZyawdWbm6a8o75tzDHQRNCvXFgSN6')
10+let franklinAssetId = base58'9SjLgBBKXt95VKYNv8xnC2GWQBRsJLowcgCrTLGFMW8z'
1311
1412 let traderPublicKey = base58'5dQbzkYkh2UWtcR1cDwxZVzkduK1SVEeVa1TyLmD6eVU'
1513
1614 let managerPublicKey = base58'66BGZcJJ9yAWcHKZZeiuA71wAvC5GWTmdQWArjt1g6jC'
1715
1816 let guarantorPublicKeys = nil
1917
18+let headAddress = addressFromPublicKey(managerPublicKey)
19+
20+let depoAddress = Address(base58'3PEZVpdtoaftCfSULafq7aBcwtyAvaWmgmd')
21+
22+let stakAddress = Address(base58'3PLe1EGXcx2yNrNH7KvtmKW2B9uKvxm148A')
23+
24+let holdAddress = Address(base58'3PNyTtHEnQkVUhRy6YuTa2bGLHL2ccaqjBG')
25+
26+let exitAddress = Address(base58'3PMoQkZyawdWbm6a8o75tzDHQRNCvXFgSN6')
27+
28+let minBalance = (1000 * 1000)
29+
30+let baseBalance = assetBalance(this, baseAssetId)
31+
32+let quoteBalance = assetBalance(this, quoteAssetId)
33+
2034 let month = (2629746 * 1000)
2135
22-let timeout3 = (month / 10)
23-
24-let timeout10 = (month / 3)
36+let timeout = (month / 10)
2537
2638 let lastBlockTime = lastBlock.timestamp
2739
2840 let monthOpenTime = ((lastBlockTime / month) * month)
2941
30-let baseBalance = assetBalance(this, baseAssetId)
42+func orInteger (val,opt) = match val {
43+ case x: Int =>
44+ x
45+ case _ =>
46+ opt
47+}
3148
32-let quoteBalance = assetBalance(this, quoteAssetId)
49+
50+func orBoolean (val,opt) = match val {
51+ case x: Boolean =>
52+ x
53+ case _ =>
54+ opt
55+}
56+
57+
58+func isValidAsset (assetId) = match assetInfo(assetId) {
59+ case a: Asset =>
60+ !(a.scripted)
61+ case _ =>
62+ false
63+}
64+
65+
66+func isFixedAsset (assetId) = if (if (if (!(isDefined(assetId)))
67+ then true
68+ else (assetId == bitcoinAssetId))
69+ then true
70+ else (assetId == baseAssetId))
71+ then true
72+ else (assetId == quoteAssetId)
73+
74+
75+func isValidProof (msg,sig,keys) = {
76+ func keyVerify (acc,key) = if (acc)
77+ then true
78+ else sigVerify(msg, sig, key)
79+
80+ let $list32513282 = keys
81+ let $size32513282 = size($list32513282)
82+ let $acc032513282 = false
83+ if (($size32513282 == 0))
84+ then $acc032513282
85+ else {
86+ let $acc132513282 = keyVerify($acc032513282, $list32513282[0])
87+ if (($size32513282 == 1))
88+ then $acc132513282
89+ else {
90+ let $acc232513282 = keyVerify($acc132513282, $list32513282[1])
91+ if (($size32513282 == 2))
92+ then $acc232513282
93+ else {
94+ let $acc332513282 = keyVerify($acc232513282, $list32513282[2])
95+ if (($size32513282 == 3))
96+ then $acc332513282
97+ else {
98+ let $acc432513282 = keyVerify($acc332513282, $list32513282[3])
99+ if (($size32513282 == 4))
100+ then $acc432513282
101+ else {
102+ let $acc532513282 = keyVerify($acc432513282, $list32513282[4])
103+ if (($size32513282 == 5))
104+ then $acc532513282
105+ else {
106+ let $acc632513282 = keyVerify($acc532513282, $list32513282[5])
107+ throw("List size exceed 5")
108+ }
109+ }
110+ }
111+ }
112+ }
113+ }
114+ }
115+
33116
34117 @Callable(i)
35-func setBalances (amount) = if ((i.callerPublicKey != managerPublicKey))
36- then throw("Only the administrator can adjust the balances!")
37- else if (isDefined(i.payment))
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...")
118+func getProfit () = {
119+ let lastUpdate = getIntegerValue(this, "last_update")
120+ if ((lastUpdate >= monthOpenTime))
121+ then throw((("Profit must be sent after " + dropRight(toString((monthOpenTime + month)), 3)) + " Unix timestamp."))
122+ else if ((i.callerPublicKey != managerPublicKey))
123+ then throw("Only the administrator can send profits!")
124+ else if (isDefined(i.payment))
125+ then throw("Please do not attach payment when sending profit...")
43126 else {
44- let oldTotalBalance = match getInteger(this, "balance_total") {
45- case x: Int =>
46- x
47- case _ =>
48- 0
127+ let oldBaseBalance = getIntegerValue(this, "balance_base")
128+ let oldQuoteBalance = getIntegerValue(this, "balance_quote")
129+ let oldTotalBalance = getIntegerValue(this, "balance_total")
130+ let stakProfit = (quoteBalance - fraction(oldBaseBalance, oldQuoteBalance, baseBalance))
131+ let stakAmount = if ((0 > stakProfit))
132+ then 0
133+ else if ((stakProfit > (quoteBalance / 2)))
134+ then (quoteBalance / 2)
135+ else stakProfit
136+ let stakFee = fraction(stakAmount, 20, 100)
137+ let netQuoteBalance = (quoteBalance - stakAmount)
138+ let holdProfit = ((quoteBalance + netQuoteBalance) - oldTotalBalance)
139+ let holdAmount = if ((0 > holdProfit))
140+ then 0
141+ else if ((holdProfit > (netQuoteBalance / 2)))
142+ then (netQuoteBalance / 2)
143+ else holdProfit
144+ let holdFee = fraction(holdAmount, 20, 100)
145+ let baseAmount = ((fraction(holdAmount, baseBalance, netQuoteBalance) + 1) / 2)
146+ let quoteAmount = (holdAmount - fraction(baseAmount, netQuoteBalance, baseBalance))
147+ let ds0 = if (((baseBalance - baseAmount) == oldBaseBalance))
148+ then nil
149+ else [DataEntry("balance_base", (baseBalance - baseAmount))]
150+ let ds1 = if (((netQuoteBalance - quoteAmount) == oldQuoteBalance))
151+ then ds0
152+ else DataEntry("balance_quote", (netQuoteBalance - quoteAmount)) :: ds0
153+ let ds2 = DataEntry("dapp_status", false) :: ds1
154+ let ds3 = DataEntry("last_update", lastBlockTime) :: ds2
155+ let data = ds3
156+ let ts0 = if (((stakFee + holdFee) == 0))
157+ then nil
158+ else [ScriptTransfer(headAddress, (stakFee + holdFee), quoteAssetId)]
159+ let ts1 = if ((stakAmount == 0))
160+ then ts0
161+ else ScriptTransfer(stakAddress, (stakAmount - stakFee), quoteAssetId) :: ts0
162+ let ts2 = if ((holdAmount == 0))
163+ then ts1
164+ else ScriptTransfer(holdAddress, (holdAmount - holdFee), quoteAssetId) :: ts1
165+ let transfers = ts2
166+ ScriptResult(WriteSet(data), TransferSet(transfers))
49167 }
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- }
168+ }
63169
64170
65171
66172 @Callable(i)
67-func sendRewards (amount) = if ((i.callerPublicKey != managerPublicKey))
68- then throw("Only administrator can send rewards!")
173+func setBalance () = {
174+ let isActive = orBoolean(getBoolean(this, "dapp_status"), false)
175+ let lastUpdate = orInteger(getInteger(this, "last_update"), lastBlockTime)
176+ let timeframe = orInteger(getInteger(headAddress, "timeframe"), month)
177+ let minStartTime = (((lastUpdate / timeframe) + 1) * timeframe)
178+ if (if (isActive)
179+ then (monthOpenTime > lastUpdate)
180+ else false)
181+ then throw("First you need to withdraw rewards...")
182+ else if (if (isActive)
183+ then (minStartTime > lastUpdate)
184+ else false)
185+ then throw((("The balance should be fixed after " + dropRight(toString(minStartTime), 3)) + " Unix timestamp."))
186+ else if ((i.callerPublicKey != managerPublicKey))
187+ then throw("Only the administrator can adjust the balances!")
188+ else if (isDefined(i.payment))
189+ then throw("Please do not attach payment when setting balances...")
190+ else {
191+ let oldBaseBalance = orInteger(getInteger(this, "balance_base"), 0)
192+ let oldQuoteBalance = orInteger(getInteger(this, "balance_quote"), 0)
193+ let oldTotalBalance = orInteger(getInteger(this, "balance_total"), 0)
194+ let quoteString = if (isDefined(quoteAssetId))
195+ then "_btc"
196+ else "_waves"
197+ let totalBalance = getIntegerValue(depoAddress, (toString(this) + quoteString))
198+ let deposit = if ((oldTotalBalance == 0))
199+ then 0
200+ else (totalBalance - oldTotalBalance)
201+ let baseAmount = if ((oldBaseBalance == 0))
202+ then baseBalance
203+ else ((fraction(deposit, oldBaseBalance, oldQuoteBalance) + 1) / 2)
204+ let quoteAmount = if ((oldQuoteBalance == 0))
205+ then quoteBalance
206+ else (deposit - fraction(baseAmount, oldQuoteBalance, oldBaseBalance))
207+ let ds0 = if ((baseAmount == 0))
208+ then nil
209+ else [DataEntry("balance_base", (oldBaseBalance + baseAmount))]
210+ let ds1 = if ((quoteAmount == 0))
211+ then ds0
212+ else DataEntry("balance_quote", (oldQuoteBalance + quoteAmount)) :: ds0
213+ let ds2 = if ((totalBalance == oldTotalBalance))
214+ then ds1
215+ else DataEntry("balance_total", totalBalance) :: ds1
216+ let ds3 = DataEntry("dapp_status", true) :: ds2
217+ let ds4 = DataEntry("last_update", lastBlockTime) :: ds3
218+ let data = ds4
219+ WriteSet(data)
220+ }
221+ }
222+
223+
224+
225+@Callable(i)
226+func getDonations (id0,id1,id2,id3,id4,id5,id6,id7,id8,id9) = if ((i.callerPublicKey != managerPublicKey))
227+ then throw("Only the administrator can send donations!")
69228 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...")
75- else {
76- let feeAddress = addressFromPublicKey(managerPublicKey)
77- let oldBaseBalance = getIntegerValue(this, "balance_base")
78- let oldQuoteBalance = getIntegerValue(this, "balance_quote")
79- let oldTotalBalance = getIntegerValue(this, "balance_total")
80- let stakProfit = (quoteBalance - fraction(oldQuoteBalance, oldBaseBalance, baseBalance))
81- let stakAmount = if ((0 > stakProfit))
82- then 0
83- else if ((stakProfit > quoteBalance))
84- then quoteBalance
85- else stakProfit
86- let stakFee = fraction(stakAmount, 20, 100)
87- let newBalance = (quoteBalance - stakAmount)
88- let longProfit = ((quoteBalance + newBalance) - oldTotalBalance)
89- let longAmount = if ((0 > longProfit))
90- then 0
91- else if ((longProfit > newBalance))
92- then newBalance
93- else longProfit
94- let longFee = fraction(longAmount, 20, 100)
95- let restAmount = if ((longAmount > amount))
96- then 0
97- else if ((amount > newBalance))
98- then (newBalance - longAmount)
99- else (amount - longAmount)
100- let dappAmount = (longAmount + restAmount)
101- let ds0 = [DataEntry("balance_base", baseBalance)]
102- let ds1 = DataEntry("balance_quote", (newBalance - dappAmount)) :: ds0
103- let ds2 = if ((restAmount == 0))
104- then ds1
105- else DataEntry("balance_total", (oldTotalBalance - restAmount)) :: ds1
106- let ds3 = DataEntry("last_update", lastBlockTime) :: ds2
107- let records = ds3
108- let ts0 = if (((stakFee + longFee) == 0))
109- then nil
110- else [ScriptTransfer(feeAddress, (stakFee + longFee), quoteAssetId)]
111- let ts1 = if ((stakAmount == 0))
112- then ts0
113- else ScriptTransfer(stakAddress, (stakAmount - stakFee), quoteAssetId) :: ts0
114- let ts2 = if ((dappAmount == 0))
115- then ts1
116- else ScriptTransfer(dappAddress, (dappAmount - longFee), quoteAssetId) :: ts1
117- let transfers = ts2
118- if ((size(transfers) == 0))
119- then throw("Unable to withdraw funds this month!")
120- else ScriptResult(WriteSet(records), TransferSet(transfers))
121- }
229+ then throw("Please do not attach payment when sending donations...")
230+ else {
231+ let ts0 = if (if (!(isValidAsset(id0)))
232+ then true
233+ else isFixedAsset(id0))
234+ then nil
235+ else [ScriptTransfer(headAddress, assetBalance(this, id0), id0)]
236+ let ts1 = if (if (!(isValidAsset(id1)))
237+ then true
238+ else isFixedAsset(id1))
239+ then ts0
240+ else ScriptTransfer(headAddress, assetBalance(this, id1), id1) :: ts0
241+ let ts2 = if (if (!(isValidAsset(id2)))
242+ then true
243+ else isFixedAsset(id2))
244+ then ts1
245+ else ScriptTransfer(headAddress, assetBalance(this, id2), id2) :: ts1
246+ let ts3 = if (if (!(isValidAsset(id3)))
247+ then true
248+ else isFixedAsset(id3))
249+ then ts2
250+ else ScriptTransfer(headAddress, assetBalance(this, id3), id3) :: ts2
251+ let ts4 = if (if (!(isValidAsset(id4)))
252+ then true
253+ else isFixedAsset(id4))
254+ then ts3
255+ else ScriptTransfer(headAddress, assetBalance(this, id4), id4) :: ts3
256+ let ts5 = if (if (!(isValidAsset(id5)))
257+ then true
258+ else isFixedAsset(id5))
259+ then ts4
260+ else ScriptTransfer(headAddress, assetBalance(this, id5), id5) :: ts4
261+ let ts6 = if (if (!(isValidAsset(id6)))
262+ then true
263+ else isFixedAsset(id6))
264+ then ts5
265+ else ScriptTransfer(headAddress, assetBalance(this, id6), id6) :: ts5
266+ let ts7 = if (if (!(isValidAsset(id7)))
267+ then true
268+ else isFixedAsset(id7))
269+ then ts6
270+ else ScriptTransfer(headAddress, assetBalance(this, id7), id7) :: ts6
271+ let ts8 = if (if (!(isValidAsset(id8)))
272+ then true
273+ else isFixedAsset(id8))
274+ then ts7
275+ else ScriptTransfer(headAddress, assetBalance(this, id8), id8) :: ts7
276+ let ts9 = if (if (!(isValidAsset(id9)))
277+ then true
278+ else isFixedAsset(id9))
279+ then ts8
280+ else ScriptTransfer(headAddress, assetBalance(this, id9), id9) :: ts8
281+ let transfers = ts9
282+ if ((size(transfers) == 0))
283+ then throw("There are no valid asset identifiers!")
284+ else TransferSet(transfers)
285+ }
122286
123287
124288
125289 @Callable(i)
126290 func emergencyExit () = {
127- func isValid (pub,keys) = {
128- func check (acc,key) = if (acc)
129- then true
130- else (pub == key)
131-
132- let $list71657192 = keys
133- let $size71657192 = size($list71657192)
134- let $acc071657192 = false
135- if (($size71657192 == 0))
136- then $acc071657192
137- else {
138- let $acc171657192 = check($acc071657192, $list71657192[0])
139- if (($size71657192 == 1))
140- then $acc171657192
141- else {
142- let $acc271657192 = check($acc171657192, $list71657192[1])
143- if (($size71657192 == 2))
144- then $acc271657192
145- else {
146- let $acc371657192 = check($acc271657192, $list71657192[2])
147- if (($size71657192 == 3))
148- then $acc371657192
149- else {
150- let $acc471657192 = check($acc371657192, $list71657192[3])
151- if (($size71657192 == 4))
152- then $acc471657192
153- else {
154- let $acc571657192 = check($acc471657192, $list71657192[4])
155- if (($size71657192 == 5))
156- then $acc571657192
157- else {
158- let $acc671657192 = check($acc571657192, $list71657192[5])
159- if (($size71657192 == 6))
160- then $acc671657192
161- else {
162- let $acc771657192 = check($acc671657192, $list71657192[6])
163- throw("List size exceed 6")
164- }
165- }
166- }
167- }
168- }
169- }
170- }
171- }
172-
173291 let lastUpdate = getIntegerValue(this, "last_update")
174- let emergencyTime = ((((lastUpdate / month) + 1) * month) + timeout3)
175- if (!(isValid(i.callerPublicKey, managerPublicKey :: guarantorPublicKeys)))
176- then throw("Only an administrator or guarantor can trigger an emergency exit!")
177- else if (isDefined(i.payment))
178- then throw("Please do not attach payment in an emergency exit...")
179- else if (if ((i.callerPublicKey != managerPublicKey))
180- then (emergencyTime > lastBlockTime)
181- else false)
182- then throw((("Time for emergencies will be after " + toString((emergencyTime / 1000))) + " Unix timestamp."))
292+ let minStartTime = ((((lastUpdate / month) + 1) * month) + timeout)
293+ let callerBalance = assetBalance(i.caller, franklinAssetId)
294+ if (if ((i.callerPublicKey != managerPublicKey))
295+ then (minStartTime > lastBlockTime)
296+ else false)
297+ then throw((("Time for emergencies will be after " + dropRight(toString(minStartTime), 3)) + " Unix timestamp."))
298+ else if (if ((i.callerPublicKey != managerPublicKey))
299+ then ((100 * minBalance) > callerBalance)
300+ else false)
301+ then throw("With only 1 Franklin on your balance, you can trigger an emergency exit!")
302+ else if (isDefined(i.payment))
303+ then throw("Please do not attach payment in an emergency exit...")
183304 else {
305+ let ds0 = [DataEntry("balance_total", 0)]
306+ let ds1 = DataEntry("dapp_status", false) :: ds0
307+ let ds2 = DataEntry("last_update", lastBlockTime) :: ds1
308+ let data = ds2
184309 let ts0 = if ((baseBalance == 0))
185310 then nil
186311 else [ScriptTransfer(exitAddress, baseBalance, baseAssetId)]
187312 let ts1 = if ((quoteBalance == 0))
188313 then ts0
189314 else ScriptTransfer(exitAddress, quoteBalance, quoteAssetId) :: ts0
190315 let transfers = ts1
191316 if ((size(transfers) == 0))
192- then throw("There is nothing on the balances!")
193- else TransferSet(transfers)
317+ then throw("There is nothing else on both balances!")
318+ else ScriptResult(WriteSet(data), TransferSet(transfers))
194319 }
195320 }
196321
197322
198323 @Verifier(tx)
199324 func verify () = {
200- func isValid (sig,keys) = {
201- func check (acc,key) = if (acc)
202- then true
203- else sigVerify(tx.bodyBytes, sig, key)
204-
205- let $list88088835 = keys
206- let $size88088835 = size($list88088835)
207- let $acc088088835 = false
208- if (($size88088835 == 0))
209- then $acc088088835
210- else {
211- let $acc188088835 = check($acc088088835, $list88088835[0])
212- if (($size88088835 == 1))
213- then $acc188088835
214- else {
215- let $acc288088835 = check($acc188088835, $list88088835[1])
216- if (($size88088835 == 2))
217- then $acc288088835
218- else {
219- let $acc388088835 = check($acc288088835, $list88088835[2])
220- if (($size88088835 == 3))
221- then $acc388088835
222- else {
223- let $acc488088835 = check($acc388088835, $list88088835[3])
224- if (($size88088835 == 4))
225- then $acc488088835
226- else {
227- let $acc588088835 = check($acc488088835, $list88088835[4])
228- if (($size88088835 == 5))
229- then $acc588088835
230- else {
231- let $acc688088835 = check($acc588088835, $list88088835[5])
232- throw("List size exceed 5")
233- }
234- }
235- }
236- }
237- }
238- }
239- }
240-
241325 let rightTrader = sigVerify(tx.bodyBytes, tx.proofs[0], traderPublicKey)
242326 let rightManager = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
243- let rightGuarantors = ((((if (isValid(tx.proofs[1], guarantorPublicKeys))
327+ let rightGuarantors = ((((if (isValidProof(tx.bodyBytes, tx.proofs[1], guarantorPublicKeys))
244328 then 1
245- else 0) + (if (isValid(tx.proofs[2], guarantorPublicKeys))
329+ else 0) + (if (isValidProof(tx.bodyBytes, tx.proofs[2], guarantorPublicKeys))
246330 then 1
247- else 0)) + (if (isValid(tx.proofs[3], guarantorPublicKeys))
331+ else 0)) + (if (isValidProof(tx.bodyBytes, tx.proofs[3], guarantorPublicKeys))
248332 then 1
249333 else 0)) >= ((size(guarantorPublicKeys) + 1) / 2))
250334 match tx {
251335 case o: Order =>
252336 if (if (rightTrader)
253337 then true
254338 else rightManager)
255- then if (if (if ((o.matcherFeeAssetId == quoteAssetId))
339+ then if (if ((o.matcherFeeAssetId == quoteAssetId))
256340 then if (if ((o.assetPair.amountAsset == baseAssetId))
257341 then (o.assetPair.priceAsset == quoteAssetId)
258342 else false)
259343 then true
260344 else if ((o.assetPair.amountAsset == quoteAssetId))
261345 then (o.assetPair.priceAsset == baseAssetId)
262346 else false
263347 else false)
264348 then true
265- else if (if ((o.orderType == Buy))
266- then (o.matcherFeeAssetId == quoteAssetId)
349+ else if (if ((o.matcherFeeAssetId == quoteAssetId))
350+ then !(isDefined(o.assetPair.amountAsset))
267351 else false)
268- then (o.assetPair.amountAsset == quoteAssetId)
269- else false)
270- then true
271- else if ((o.orderType == Sell))
272- then if (if (!(isDefined(o.matcherFeeAssetId)))
273- then !(isDefined(o.assetPair.priceAsset))
274- else false)
275- then true
276- else if ((o.matcherFeeAssetId == quoteAssetId))
277- then (o.assetPair.priceAsset == quoteAssetId)
278- else false
352+ then (o.assetPair.priceAsset == bitcoinAssetId)
279353 else false
280354 else false
281- case s: SetScriptTransaction|DataTransaction =>
355+ case t: MassTransferTransaction|TransferTransaction =>
356+ if (rightManager)
357+ then !(isFixedAsset(t.assetId))
358+ else false
359+ case d: DataTransaction =>
360+ if (rightManager)
361+ then rightGuarantors
362+ else false
363+ case s: SetScriptTransaction =>
282364 if (rightManager)
283365 then rightGuarantors
284366 else false
285367 case _ =>
286368 false
287369 }
288370 }
289371

github/deemru/w8io/3ef1775 
66.25 ms