2020.04.24 20:37 [2032320] smart account 3PPtVNdMCSwaLiT9FkTMeLrW9P7Nq9ZNyXJ > SELF 0.00000000 Waves

{ "type": 13, "id": "7HhURDVHcHUshuhc3APLYZooEQY4hin9DzPUgm8nVe5B", "fee": 1400000, "feeAssetId": null, "timestamp": 1587749891256, "version": 1, "sender": "3PPtVNdMCSwaLiT9FkTMeLrW9P7Nq9ZNyXJ", "senderPublicKey": "9GatzuwfKHipUVyuzCmN9reUi5cr2CCuSvUxtwN8PbBh", "proofs": [ "27DmdtHZcCfzjaqQwjzuGmGipqG34usNCUzKNsSwGLmyrDQmXEFbNzPHqwx2UcV1yxCvXRNvAcjCvR3yNXNqFr9A" ], "script": "base64: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IDUAAAAEAAAAAWkBAAAACWdldFByb2ZpdAAAAAAEAAAACmxhc3RVcGRhdGUJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAABHRoaXMCAAAAC2xhc3RfdXBkYXRlAwkAAGcAAAACBQAAAApsYXN0VXBkYXRlBQAAAA1tb250aE9wZW5UaW1lCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACAgAAABpQcm9maXQgbXVzdCBiZSBzZW50IGFmdGVyIAkBAAAACWRyb3BSaWdodAAAAAIJAAGkAAAAAQkAAGQAAAACBQAAAA1tb250aE9wZW5UaW1lBQAAAAVtb250aAAAAAAAAAAAAwIAAAAQIFVuaXggdGltZXN0YW1wLgMJAQAAAAIhPQAAAAIIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQUAAAAQbWFuYWdlclB1YmxpY0tleQkAAAIAAAABAgAAAChPbmx5IHRoZSBhZG1pbmlzdHJhdG9yIGNhbiBzZW5kIHByb2ZpdHMhAwkBAAAACWlzRGVmaW5lZAAAAAEIBQAAAAFpAAAAB3BheW1lbnQJAAACAAAAAQIAAAAzUGxlYXNlIGRvIG5vdCBhdHRhY2ggcGF5bWVudCB3aGVuIHNlbmRpbmcgcHJvZml0Li4uBAAAAA5vbGRCYXNlQmFsYW5jZQkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAEdGhpcwIAAAAMYmFsYW5jZV9iYXNlBAAAAA9vbGRRdW90ZUJhbGFuY2UJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAABHRoaXMCAAAADWJhbGFuY2VfcXVvdGUEAAAAD29sZFRvdGFsQmFsYW5jZQkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAEdGhpcwIAAAANYmFsYW5jZV90b3RhbAQAAAAKc3Rha1Byb2ZpdAkAAGUAAAACBQAAAAxxdW90ZUJhbGFuY2UJAABrAAAAAwUAAAAOb2xkQmFzZUJhbGFuY2UFAAAAD29sZFF1b3RlQmFsYW5jZQUAAAALYmFzZUJhbGFuY2UEAAAACnN0YWtBbW91bnQDCQAAZgAAAAIAAAAAAAAAAAAFAAAACnN0YWtQcm9maXQAAAAAAAAAAAADCQAAZgAAAAIFAAAACnN0YWtQ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ZXJTZXQAAAABBQAAAAl0cmFuc2ZlcnMAAAABaQEAAAAKc2V0QmFsYW5jZQAAAAAEAAAACGlzQWN0aXZlCQEAAAAJb3JCb29sZWFuAAAAAgkABBsAAAACBQAAAAR0aGlzAgAAAAtkYXBwX3N0YXR1cwcEAAAACmxhc3RVcGRhdGUJAQAAAAlvckludGVnZXIAAAACCQAEGgAAAAIFAAAABHRoaXMCAAAAC2xhc3RfdXBkYXRlBQAAAA1sYXN0QmxvY2tUaW1lBAAAAAl0aW1lZnJhbWUJAQAAAAlvckludGVnZXIAAAACCQAEGgAAAAIFAAAAC2hlYWRBZGRyZXNzAgAAAAl0aW1lZnJhbWUFAAAABW1vbnRoBAAAAAxtaW5TdGFydFRpbWUJAABoAAAAAgkAAGQAAAACCQAAaQAAAAIFAAAACmxhc3RVcGRhdGUFAAAACXRpbWVmcmFtZQAAAAAAAAAAAQUAAAAJdGltZWZyYW1lAwMFAAAACGlzQWN0aXZlCQAAZgAAAAIFAAAADW1vbnRoT3BlblRpbWUFAAAACmxhc3RVcGRhdGUHCQAAAgAAAAECAAAAJUZpcnN0IHlvdSBuZWVkIHRvIHdpdGhkcmF3IHJld2FyZHMuLi4DAwUAAAAIaXNBY3RpdmUJAABmAAAAAgUAAAAMbWluU3RhcnRUaW1lBQAAAApsYXN0VXBkYXRlBwkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAiVGhlIGJhbGFuY2Ugc2hvdWxkIGJlIGZpeGVkIGFmdGVyIAkBAAAACWRyb3BSaWdodAAAAAIJAAGkAAAAAQUAAAAMbWluU3RhcnRUaW1lAAAAAAAAAAADAgAAABAgVW5peCB0aW1lc3RhbXAuAwkBAAAAAiE9AAAAAggFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BQAAABBtYW5hZ2VyUHVibGljS2V5CQAAAgAAAAECAAAAL09ubHkgdGhlIGFkbWluaXN0cmF0b3IgY2FuIGFkanVzdCB0aGUgYmFsYW5jZXMhAwkBAAAACWlzRGVmaW5lZAAAAAEIBQAAAAFpAAAAB3BheW1lbnQJAAACAAAAAQIAAAA1UGxlYXNlIGRvIG5vdCBhdHRhY2ggcGF5bWVudCB3aGVuIHNldHRpbmcgYmFsYW5jZXMuLi4EAAAA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AAAAC2Jhc2VBc3NldElkBwcGAwMJAAAAAAAAAggFAAAAAW8AAAARbWF0Y2hlckZlZUFzc2V0SWQFAAAADHF1b3RlQXNzZXRJZAkBAAAAASEAAAABCQEAAAAJaXNEZWZpbmVkAAAAAQgIBQAAAAFvAAAACWFzc2V0UGFpcgAAAAthbW91bnRBc3NldAcJAAAAAAAAAggIBQAAAAFvAAAACWFzc2V0UGFpcgAAAApwcmljZUFzc2V0BQAAAA5iaXRjb2luQXNzZXRJZAcHAwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAXTWFzc1RyYW5zZmVyVHJhbnNhY3Rpb24GCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAE1RyYW5zZmVyVHJhbnNhY3Rpb24EAAAAAXQFAAAAByRtYXRjaDADBQAAAAxyaWdodE1hbmFnZXIJAQAAAAEhAAAAAQkBAAAADGlzRml4ZWRBc3NldAAAAAEIBQAAAAF0AAAAB2Fzc2V0SWQHAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAA9EYXRhVHJhbnNhY3Rpb24EAAAAAWQFAAAAByRtYXRjaDADBQAAAAxyaWdodE1hbmFnZXIFAAAAD3JpZ2h0R3VhcmFudG9ycwcDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAFFNldFNjcmlwdFRyYW5zYWN0aW9uBAAAAAFzBQAAAAckbWF0Y2gwAwUAAAAMcmlnaHRNYW5hZ2VyBQAAAA9yaWdodEd1YXJhbnRvcnMHB2NZ8Bg=", "chainId": 87, "height": 2032320, "spentComplexity": 0 } View: original | compacted Prev: ETVgrozxAQve18vEgAqBKd81VLiorXAzRHPpJkRxQbK Next: none Diff:
OldNewDifferences
55
66 let quoteAssetId = unit
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 $list32013232 = keys
81+ let $size32013232 = size($list32013232)
82+ let $acc032013232 = false
83+ if (($size32013232 == 0))
84+ then $acc032013232
85+ else {
86+ let $acc132013232 = keyVerify($acc032013232, $list32013232[0])
87+ if (($size32013232 == 1))
88+ then $acc132013232
89+ else {
90+ let $acc232013232 = keyVerify($acc132013232, $list32013232[1])
91+ if (($size32013232 == 2))
92+ then $acc232013232
93+ else {
94+ let $acc332013232 = keyVerify($acc232013232, $list32013232[2])
95+ if (($size32013232 == 3))
96+ then $acc332013232
97+ else {
98+ let $acc432013232 = keyVerify($acc332013232, $list32013232[3])
99+ if (($size32013232 == 4))
100+ then $acc432013232
101+ else {
102+ let $acc532013232 = keyVerify($acc432013232, $list32013232[4])
103+ if (($size32013232 == 5))
104+ then $acc532013232
105+ else {
106+ let $acc632013232 = keyVerify($acc532013232, $list32013232[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 $list71157142 = keys
133- let $size71157142 = size($list71157142)
134- let $acc071157142 = false
135- if (($size71157142 == 0))
136- then $acc071157142
137- else {
138- let $acc171157142 = check($acc071157142, $list71157142[0])
139- if (($size71157142 == 1))
140- then $acc171157142
141- else {
142- let $acc271157142 = check($acc171157142, $list71157142[1])
143- if (($size71157142 == 2))
144- then $acc271157142
145- else {
146- let $acc371157142 = check($acc271157142, $list71157142[2])
147- if (($size71157142 == 3))
148- then $acc371157142
149- else {
150- let $acc471157142 = check($acc371157142, $list71157142[3])
151- if (($size71157142 == 4))
152- then $acc471157142
153- else {
154- let $acc571157142 = check($acc471157142, $list71157142[4])
155- if (($size71157142 == 5))
156- then $acc571157142
157- else {
158- let $acc671157142 = check($acc571157142, $list71157142[5])
159- if (($size71157142 == 6))
160- then $acc671157142
161- else {
162- let $acc771157142 = check($acc671157142, $list71157142[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 $list87588785 = keys
206- let $size87588785 = size($list87588785)
207- let $acc087588785 = false
208- if (($size87588785 == 0))
209- then $acc087588785
210- else {
211- let $acc187588785 = check($acc087588785, $list87588785[0])
212- if (($size87588785 == 1))
213- then $acc187588785
214- else {
215- let $acc287588785 = check($acc187588785, $list87588785[1])
216- if (($size87588785 == 2))
217- then $acc287588785
218- else {
219- let $acc387588785 = check($acc287588785, $list87588785[2])
220- if (($size87588785 == 3))
221- then $acc387588785
222- else {
223- let $acc487588785 = check($acc387588785, $list87588785[3])
224- if (($size87588785 == 4))
225- then $acc487588785
226- else {
227- let $acc587588785 = check($acc487588785, $list87588785[4])
228- if (($size87588785 == 5))
229- then $acc587588785
230- else {
231- let $acc687588785 = check($acc587588785, $list87588785[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'EYz8Zvs62D4d7F5ZgXHCWuzuFaZg63FYnfVQrTWQoLSK'
55
66 let quoteAssetId = unit
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 $list32013232 = keys
81+ let $size32013232 = size($list32013232)
82+ let $acc032013232 = false
83+ if (($size32013232 == 0))
84+ then $acc032013232
85+ else {
86+ let $acc132013232 = keyVerify($acc032013232, $list32013232[0])
87+ if (($size32013232 == 1))
88+ then $acc132013232
89+ else {
90+ let $acc232013232 = keyVerify($acc132013232, $list32013232[1])
91+ if (($size32013232 == 2))
92+ then $acc232013232
93+ else {
94+ let $acc332013232 = keyVerify($acc232013232, $list32013232[2])
95+ if (($size32013232 == 3))
96+ then $acc332013232
97+ else {
98+ let $acc432013232 = keyVerify($acc332013232, $list32013232[3])
99+ if (($size32013232 == 4))
100+ then $acc432013232
101+ else {
102+ let $acc532013232 = keyVerify($acc432013232, $list32013232[4])
103+ if (($size32013232 == 5))
104+ then $acc532013232
105+ else {
106+ let $acc632013232 = keyVerify($acc532013232, $list32013232[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 $list71157142 = keys
133- let $size71157142 = size($list71157142)
134- let $acc071157142 = false
135- if (($size71157142 == 0))
136- then $acc071157142
137- else {
138- let $acc171157142 = check($acc071157142, $list71157142[0])
139- if (($size71157142 == 1))
140- then $acc171157142
141- else {
142- let $acc271157142 = check($acc171157142, $list71157142[1])
143- if (($size71157142 == 2))
144- then $acc271157142
145- else {
146- let $acc371157142 = check($acc271157142, $list71157142[2])
147- if (($size71157142 == 3))
148- then $acc371157142
149- else {
150- let $acc471157142 = check($acc371157142, $list71157142[3])
151- if (($size71157142 == 4))
152- then $acc471157142
153- else {
154- let $acc571157142 = check($acc471157142, $list71157142[4])
155- if (($size71157142 == 5))
156- then $acc571157142
157- else {
158- let $acc671157142 = check($acc571157142, $list71157142[5])
159- if (($size71157142 == 6))
160- then $acc671157142
161- else {
162- let $acc771157142 = check($acc671157142, $list71157142[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 $list87588785 = keys
206- let $size87588785 = size($list87588785)
207- let $acc087588785 = false
208- if (($size87588785 == 0))
209- then $acc087588785
210- else {
211- let $acc187588785 = check($acc087588785, $list87588785[0])
212- if (($size87588785 == 1))
213- then $acc187588785
214- else {
215- let $acc287588785 = check($acc187588785, $list87588785[1])
216- if (($size87588785 == 2))
217- then $acc287588785
218- else {
219- let $acc387588785 = check($acc287588785, $list87588785[2])
220- if (($size87588785 == 3))
221- then $acc387588785
222- else {
223- let $acc487588785 = check($acc387588785, $list87588785[3])
224- if (($size87588785 == 4))
225- then $acc487588785
226- else {
227- let $acc587588785 = check($acc487588785, $list87588785[4])
228- if (($size87588785 == 5))
229- then $acc587588785
230- else {
231- let $acc687588785 = check($acc587588785, $list87588785[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/786bc32 
500.90 ms