tx · DNcrzR2jfxShwvZnwrRXMvsvsYqeGUH3owszfVi5HcN7

3PPpppPpSCRStzVGeZTPsZb5h467qbyqadm:  -0.01400000 Waves

2019.10.17 12:25 [1753988] smart account 3PPpppPpSCRStzVGeZTPsZb5h467qbyqadm > SELF 0.00000000 Waves

{ "type": 13, "id": "DNcrzR2jfxShwvZnwrRXMvsvsYqeGUH3owszfVi5HcN7", "fee": 1400000, "feeAssetId": null, "timestamp": 1571304322130, "version": 1, "sender": "3PPpppPpSCRStzVGeZTPsZb5h467qbyqadm", "senderPublicKey": "9h8XTnBfjfoV5MWJVDUMkaLNMZbWpUqrTz1wjaAejUez", "proofs": [ "r6t46Zvz37v6Ph5Xm6xkF5aMbJZ959p4nPLbZg9HCtVdmEb36xbdkYtNsNzPHQdKyAnCVNhFZfoQV8sMoQUx3cf" ], "script": "base64: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", "chainId": 87, "height": 1753988, "spentComplexity": 0 } View: original | compacted Prev: 4se9jS3yRz5YkVqs8GzYoAebzjYt7pRxR8Xso2PL4Esn Next: FvLcM1tS3Ax2eZkT8HjwxD2hAd9Gq2nACcHqkmEc6fd2 Diff:
OldNewDifferences
33 {-# CONTENT_TYPE DAPP #-}
44 let uTokenId = base58'GHh7EMnVnUBCYNJMktuLPVr3P2oCqBCb4c87fBCZ5CzY'
55
6-let admin = addressFromStringValue("3P96VpN2dBS1111111ydADa5a6AD1Un9iUv")
6+let admin = addressFromPublicKey(base58'GfQfmZD32YEkaMEgDUB7iesZaJf7NysjxxSheA8PzSYV')
77
88 let shutdownFlag = match getBoolean(this, "shutdown_flag") {
99 case bool: Boolean =>
276276
277277
278278 @Callable(i)
279-func takeSell (orderId,sig) = if (shutdownFlag)
279+func takeSell (id,sig) = if (shutdownFlag)
280280 then throw(shutdownMessage)
281281 else {
282+ let orderId = ("order_" + id)
282283 let payment = valueOrErrorMessage(i.payment, "Where is payment?")
283284 let priceAssetAmount = payment.amount
284285 if ((0 >= priceAssetAmount))
341342
342343
343344 @Callable(i)
344-func takeBuy (orderId,sig) = if (shutdownFlag)
345+func takeBuy (id,sig) = if (shutdownFlag)
345346 then throw(shutdownMessage)
346347 else {
348+ let orderId = ("order_" + id)
347349 let payment = valueOrErrorMessage(i.payment, "where is payment?")
348350 let amount = payment.amount
349351 if ((0 >= amount))
406408
407409
408410 @Callable(i)
409-func returnSell (orderId) = {
411+func returnSell (id) = {
412+ let orderId = ("order_" + id)
410413 let data = valueOrErrorMessage(getString(this, orderId), "Invalid order id")
411414 let parts = split(data, "_")
412415 let orderType = parts[0]
425428 else if (if ((orderOwner != i.caller))
426429 then !(shutdownFlag)
427430 else false)
428- then throw("return should be called by order owner")
431+ then throw("Return should be called by order owner")
429432 else {
430433 let returnAmount = (orderAmount - orderSpent)
431434 if ((0 >= returnAmount))
432- then throw("nothing to return")
435+ then throw("Nothing to return")
433436 else {
434437 let newData = (dropRight(data, size(parts[8])) + toString(orderAmount))
435438 ScriptResult(WriteSet([DataEntry(orderId, newData)]), TransferSet([ScriptTransfer(orderOwner, returnAmount, if ((orderAmountAsset == "WAVES"))
442445
443446
444447 @Callable(i)
445-func returnBuy (orderId) = {
448+func returnBuy (id) = {
449+ let orderId = ("order_" + id)
446450 let data = valueOrErrorMessage(getString(this, orderId), "Invalid order id")
447451 let parts = split(data, "_")
448452 let orderType = parts[0]
465469 else {
466470 let returnAmount = (orderPriceAssetAmount - orderSpent)
467471 if ((0 >= returnAmount))
468- then throw("nothing to return")
472+ then throw("Nothing to return")
469473 else {
470474 let newData = (dropRight(data, size(parts[8])) + toString(orderPriceAssetAmount))
471475 ScriptResult(WriteSet([DataEntry(orderId, newData)]), TransferSet([ScriptTransfer(orderOwner, returnAmount, if ((orderPriceAsset == "WAVES"))
511515
512516
513517 @Callable(i)
514-func doShutdown (msg) = if ((i.caller != admin))
518+func shutdown (msg) = if ((i.caller != admin))
515519 then throw("You should be an admin")
516520 else WriteSet([DataEntry("shutdown_flag", true), DataEntry("shutdown_message", msg)])
517521
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let uTokenId = base58'GHh7EMnVnUBCYNJMktuLPVr3P2oCqBCb4c87fBCZ5CzY'
55
6-let admin = addressFromStringValue("3P96VpN2dBS1111111ydADa5a6AD1Un9iUv")
6+let admin = addressFromPublicKey(base58'GfQfmZD32YEkaMEgDUB7iesZaJf7NysjxxSheA8PzSYV')
77
88 let shutdownFlag = match getBoolean(this, "shutdown_flag") {
99 case bool: Boolean =>
1010 bool
1111 case _: Unit =>
1212 false
1313 case _ =>
1414 throw()
1515 }
1616
1717 let shutdownMessage = match getString(this, "shutdown_message") {
1818 case str: String =>
1919 str
2020 case _: Unit =>
2121 "Forbidden"
2222 case _ =>
2323 throw()
2424 }
2525
2626 let reserve = match getInteger(this, "reserve") {
2727 case int: Int =>
2828 int
2929 case _: Unit =>
3030 0
3131 case _ =>
3232 throw()
3333 }
3434
3535 let balance = match getInteger(this, "balance") {
3636 case int: Int =>
3737 int
3838 case _: Unit =>
3939 0
4040 case _ =>
4141 throw()
4242 }
4343
4444 func checkStatus (address) = {
4545 let statusUnlimited = match getBoolean(this, (address + "_unlimited")) {
4646 case bool: Boolean =>
4747 bool
4848 case _: Unit =>
4949 false
5050 case _ =>
5151 throw()
5252 }
5353 let statusTime = match getInteger(this, (address + "_time")) {
5454 case int: Int =>
5555 int
5656 case _: Unit =>
5757 0
5858 case _ =>
5959 throw()
6060 }
6161 if (statusUnlimited)
6262 then true
6363 else (statusTime > lastBlock.timestamp)
6464 }
6565
6666
6767 @Callable(i)
6868 func addAsset (assetId) = if (shutdownFlag)
6969 then throw(shutdownMessage)
7070 else {
7171 let addingPrice = (100 * 100000000)
7272 let addingPriceStr = "100"
7373 let payment = valueOrErrorMessage(i.payment, "Where is payment?")
7474 if (if (isDefined(payment.assetId))
7575 then (payment.assetId != uTokenId)
7676 else false)
7777 then throw("OTCu or WAVES only")
7878 else if ((payment.amount != addingPrice))
7979 then throw((("You have to pay " + addingPriceStr) + " OTCu or WAVES"))
8080 else if (!(isDefined(assetInfo(fromBase58String(assetId)))))
8181 then throw("There is no asset with specified id")
8282 else {
8383 let assets = match getString(this, "assets") {
8484 case str: String =>
8585 str
8686 case _: Unit =>
8787 ""
8888 case _ =>
8989 throw()
9090 }
9191 if (isDefined(indexOf(assets, assetId)))
9292 then throw("Asset is already available")
9393 else {
9494 let list0 = [DataEntry("assets", ((assets + assetId) + ","))]
9595 let list1 = if ((payment.assetId == uTokenId))
9696 then DataEntry("reserve", (reserve + payment.amount)) :: list0
9797 else if (!(isDefined(payment.assetId)))
9898 then DataEntry("balance", (balance + payment.amount)) :: list0
9999 else list0
100100 WriteSet(list1)
101101 }
102102 }
103103 }
104104
105105
106106
107107 @Callable(i)
108108 func pro () = if (shutdownFlag)
109109 then throw(shutdownMessage)
110110 else {
111111 let address = toBase58String(i.caller.bytes)
112112 let unlimitedPrice = (50 * 100000000)
113113 let unlimitedPriceStr = "50"
114114 let monthPrice = (10 * 100000000)
115115 let monthPriceStr = "10"
116116 let payment = valueOrErrorMessage(i.payment, "Where is payment?")
117117 if (if (isDefined(payment.assetId))
118118 then (payment.assetId != uTokenId)
119119 else false)
120120 then throw("OTCu or WAVES only")
121121 else if (if ((payment.amount != unlimitedPrice))
122122 then (payment.amount != monthPrice)
123123 else false)
124124 then throw("Invalid payment")
125125 else {
126126 let unlimited = (payment.amount == unlimitedPrice)
127127 let currentUnlimited = match getBoolean(this, (address + "_unlimited")) {
128128 case bool: Boolean =>
129129 bool
130130 case _: Unit =>
131131 false
132132 case _ =>
133133 throw()
134134 }
135135 let currentTime = match getInteger(this, (address + "_time")) {
136136 case int: Int =>
137137 int
138138 case _: Unit =>
139139 lastBlock.timestamp
140140 case _ =>
141141 throw()
142142 }
143143 if (currentUnlimited)
144144 then throw("You have unlimited PRO status already. What do you want?")
145145 else {
146146 let month = 2629743000
147147 let list0 = [DataEntry((address + "_unlimited"), unlimited), DataEntry((address + "_time"), if (unlimited)
148148 then 0
149149 else (currentTime + month))]
150150 let list1 = if ((payment.assetId == uTokenId))
151151 then DataEntry("reserve", (reserve + payment.amount)) :: list0
152152 else if (!(isDefined(payment.assetId)))
153153 then DataEntry("balance", (balance + payment.amount)) :: list0
154154 else list0
155155 WriteSet(list1)
156156 }
157157 }
158158 }
159159
160160
161161
162162 @Callable(i)
163163 func buyUtilityToken () = if (shutdownFlag)
164164 then throw(shutdownMessage)
165165 else {
166166 let payment = valueOrErrorMessage(i.payment, "Where is payment?")
167167 if (isDefined(payment.assetId))
168168 then throw("WAVES only")
169169 else if ((payment.amount > reserve))
170170 then throw("Not enougth asset in dApp")
171171 else ScriptResult(WriteSet([DataEntry("reserve", (reserve - payment.amount)), DataEntry("balance", (balance + payment.amount))]), TransferSet([ScriptTransfer(i.caller, payment.amount, uTokenId)]))
172172 }
173173
174174
175175
176176 @Callable(i)
177177 func makeSell (priceAsset,priceAssetAmount,all,password) = if (shutdownFlag)
178178 then throw(shutdownMessage)
179179 else if (if ((priceAsset != "WAVES"))
180180 then !(isDefined(assetInfo(fromBase58String(priceAsset))))
181181 else false)
182182 then throw("There is no asset with specified id")
183183 else if ((0 >= priceAssetAmount))
184184 then throw("Amount of price asset must be positive")
185185 else {
186186 let payment = valueOrErrorMessage(i.payment, "Where is payment?")
187187 if ((0 >= payment.amount))
188188 then throw("Amount must be positive")
189189 else {
190190 let amountAsset = match payment.assetId {
191191 case p: ByteVector =>
192192 toBase58String(p)
193193 case _ =>
194194 "WAVES"
195195 }
196196 if ((amountAsset == priceAsset))
197197 then throw("Invalid pair")
198198 else {
199199 let assets = valueOrErrorMessage(getString(this, "assets"), "There are not available assets")
200200 if (if (!(isDefined(indexOf(assets, priceAsset))))
201201 then true
202202 else !(isDefined(indexOf(assets, amountAsset))))
203203 then throw("Asset are not available for trading")
204204 else {
205205 let address = toBase58String(i.caller.bytes)
206206 if (if (!(checkStatus(address)))
207207 then if (all)
208208 then true
209209 else (password != "")
210210 else false)
211211 then throw("You must have pro status to use these features")
212212 else {
213213 let orderId = ("order_" + toBase58String(i.transactionId))
214214 let passwordValid = fromBase58String(password)
215215 let data = (((((((((((((((("sell" + "_") + toString(payment.amount)) + "_") + amountAsset) + "_") + toString(priceAssetAmount)) + "_") + priceAsset) + "_") + address) + "_") + toString(all)) + "_") + password) + "_") + toString(0))
216216 WriteSet([DataEntry(orderId, data)])
217217 }
218218 }
219219 }
220220 }
221221 }
222222
223223
224224
225225 @Callable(i)
226226 func makeBuy (amountAsset,amount,all,password) = if (shutdownFlag)
227227 then throw(shutdownMessage)
228228 else if (if ((amountAsset != "WAVES"))
229229 then !(isDefined(assetInfo(fromBase58String(amountAsset))))
230230 else false)
231231 then throw("There is no asset with specified id")
232232 else if ((0 >= amount))
233233 then throw("Amount must be positive")
234234 else {
235235 let payment = valueOrErrorMessage(i.payment, "where is payment?")
236236 let priceAssetAmount = payment.amount
237237 if ((0 >= priceAssetAmount))
238238 then throw("amount must be positive")
239239 else {
240240 let priceAsset = match payment.assetId {
241241 case p: ByteVector =>
242242 toBase58String(p)
243243 case _ =>
244244 "WAVES"
245245 }
246246 if ((amountAsset == priceAsset))
247247 then throw("Invalid pair")
248248 else {
249249 let assets = valueOrErrorMessage(getString(this, "assets"), "There are not available assets")
250250 if (if (!(isDefined(indexOf(assets, priceAsset))))
251251 then true
252252 else !(isDefined(indexOf(assets, amountAsset))))
253253 then throw("Asset are not available for trading")
254254 else {
255255 let address = toBase58String(i.caller.bytes)
256256 if (if (!(checkStatus(address)))
257257 then if (all)
258258 then true
259259 else (password != "")
260260 else false)
261261 then throw("You must have pro status to use these features")
262262 else {
263263 let orderId = ("order_" + toBase58String(i.transactionId))
264264 if ((amount == 0))
265265 then throw("invalid buy amount")
266266 else {
267267 let data = (((((((((((((((("buy" + "_") + toString(amount)) + "_") + amountAsset) + "_") + toString(priceAssetAmount)) + "_") + priceAsset) + "_") + address) + "_") + toString(all)) + "_") + password) + "_") + toString(0))
268268 WriteSet([DataEntry(orderId, data)])
269269 }
270270 }
271271 }
272272 }
273273 }
274274 }
275275
276276
277277
278278 @Callable(i)
279-func takeSell (orderId,sig) = if (shutdownFlag)
279+func takeSell (id,sig) = if (shutdownFlag)
280280 then throw(shutdownMessage)
281281 else {
282+ let orderId = ("order_" + id)
282283 let payment = valueOrErrorMessage(i.payment, "Where is payment?")
283284 let priceAssetAmount = payment.amount
284285 if ((0 >= priceAssetAmount))
285286 then throw("Amount must be positive")
286287 else {
287288 let priceAsset = match payment.assetId {
288289 case p: ByteVector =>
289290 toBase58String(p)
290291 case _ =>
291292 "WAVES"
292293 }
293294 let data = valueOrErrorMessage(getString(this, orderId), "Invalid order id")
294295 let parts = split(data, "_")
295296 let orderType = parts[0]
296297 let orderAmount = parseIntValue(parts[1])
297298 let orderAmountAsset = parts[2]
298299 let orderPriceAssetAmount = parseIntValue(parts[3])
299300 let orderPriceAsset = parts[4]
300301 let orderOwner = value(addressFromString(parts[5]))
301302 let orderAll = if ((parts[6] == "true"))
302303 then true
303304 else false
304305 let orderPassword = parts[7]
305306 let orderSpent = parseIntValue(parts[8])
306307 if ((orderType != "sell"))
307308 then throw("Invalid order type")
308309 else if ((orderPriceAsset != priceAsset))
309310 then throw(("Payment asset must be " + orderPriceAsset))
310311 else {
311312 let valid = if ((orderPassword != ""))
312313 then sigVerify(i.callerPublicKey, fromBase58String(sig), fromBase58String(orderPassword))
313314 else true
314315 if (!(valid))
315316 then throw("The order is private")
316317 else {
317318 let amount = ((priceAssetAmount * orderAmount) / orderPriceAssetAmount)
318319 if ((amount == 0))
319320 then throw("Invalid amount")
320321 else if (if (orderAll)
321322 then (orderAmount > amount)
322323 else false)
323324 then throw("You must take all or none")
324325 else if ((amount > (orderAmount - orderSpent)))
325326 then throw("Not enougth asset in order")
326327 else {
327328 let newData = (dropRight(data, size(parts[8])) + toString((orderSpent + amount)))
328329 let toCaller = ScriptTransfer(i.caller, amount, if ((orderAmountAsset == "WAVES"))
329330 then unit
330331 else fromBase58String(orderAmountAsset))
331332 let toOwner = ScriptTransfer(orderOwner, priceAssetAmount, if ((orderPriceAsset == "WAVES"))
332333 then unit
333334 else fromBase58String(orderPriceAsset))
334335 ScriptResult(WriteSet([DataEntry(orderId, newData)]), TransferSet([toCaller, toOwner]))
335336 }
336337 }
337338 }
338339 }
339340 }
340341
341342
342343
343344 @Callable(i)
344-func takeBuy (orderId,sig) = if (shutdownFlag)
345+func takeBuy (id,sig) = if (shutdownFlag)
345346 then throw(shutdownMessage)
346347 else {
348+ let orderId = ("order_" + id)
347349 let payment = valueOrErrorMessage(i.payment, "where is payment?")
348350 let amount = payment.amount
349351 if ((0 >= amount))
350352 then throw("amount must be positive")
351353 else {
352354 let amountAsset = match payment.assetId {
353355 case p: ByteVector =>
354356 toBase58String(p)
355357 case _ =>
356358 "WAVES"
357359 }
358360 let data = valueOrErrorMessage(getString(this, orderId), "Invalid order id")
359361 let parts = split(data, "_")
360362 let orderType = parts[0]
361363 let orderAmount = parseIntValue(parts[1])
362364 let orderAmountAsset = parts[2]
363365 let orderPriceAssetAmount = parseIntValue(parts[3])
364366 let orderPriceAsset = parts[4]
365367 let orderOwner = value(addressFromString(parts[5]))
366368 let orderAll = if ((parts[6] == "true"))
367369 then true
368370 else false
369371 let orderPassword = parts[7]
370372 let orderSpent = parseIntValue(parts[8])
371373 if ((orderType != "buy"))
372374 then throw("Invalid order type")
373375 else if ((orderAmountAsset != amountAsset))
374376 then throw(("payment asset must be " + orderAmountAsset))
375377 else {
376378 let valid = if ((orderPassword != ""))
377379 then sigVerify(i.callerPublicKey, fromBase58String(sig), fromBase58String(orderPassword))
378380 else true
379381 if (!(valid))
380382 then throw("The order is private")
381383 else {
382384 let priceAssetAmount = ((amount * orderPriceAssetAmount) / orderAmount)
383385 if ((priceAssetAmount == 0))
384386 then throw("Invalid amount")
385387 else if (if (orderAll)
386388 then (orderPriceAssetAmount > priceAssetAmount)
387389 else false)
388390 then throw("You must take all or none")
389391 else if ((priceAssetAmount > (orderPriceAssetAmount - orderSpent)))
390392 then throw("not enougth asset in order")
391393 else {
392394 let newData = (dropRight(data, size(parts[8])) + toString((orderSpent + priceAssetAmount)))
393395 let toCaller = ScriptTransfer(i.caller, priceAssetAmount, if ((orderPriceAsset == "WAVES"))
394396 then unit
395397 else fromBase58String(orderPriceAsset))
396398 let toOwner = ScriptTransfer(orderOwner, amount, if ((orderAmountAsset == "WAVES"))
397399 then unit
398400 else fromBase58String(orderAmountAsset))
399401 ScriptResult(WriteSet([DataEntry(orderId, newData)]), TransferSet([toCaller, toOwner]))
400402 }
401403 }
402404 }
403405 }
404406 }
405407
406408
407409
408410 @Callable(i)
409-func returnSell (orderId) = {
411+func returnSell (id) = {
412+ let orderId = ("order_" + id)
410413 let data = valueOrErrorMessage(getString(this, orderId), "Invalid order id")
411414 let parts = split(data, "_")
412415 let orderType = parts[0]
413416 let orderAmount = parseIntValue(parts[1])
414417 let orderAmountAsset = parts[2]
415418 let orderPriceAssetAmount = parseIntValue(parts[3])
416419 let orderPriceAsset = parts[4]
417420 let orderOwner = value(addressFromString(parts[5]))
418421 let orderAll = if ((parts[6] == "true"))
419422 then true
420423 else false
421424 let orderPassword = parts[7]
422425 let orderSpent = parseIntValue(parts[8])
423426 if ((orderType != "sell"))
424427 then throw("Invalid order type")
425428 else if (if ((orderOwner != i.caller))
426429 then !(shutdownFlag)
427430 else false)
428- then throw("return should be called by order owner")
431+ then throw("Return should be called by order owner")
429432 else {
430433 let returnAmount = (orderAmount - orderSpent)
431434 if ((0 >= returnAmount))
432- then throw("nothing to return")
435+ then throw("Nothing to return")
433436 else {
434437 let newData = (dropRight(data, size(parts[8])) + toString(orderAmount))
435438 ScriptResult(WriteSet([DataEntry(orderId, newData)]), TransferSet([ScriptTransfer(orderOwner, returnAmount, if ((orderAmountAsset == "WAVES"))
436439 then unit
437440 else fromBase58String(orderAmountAsset))]))
438441 }
439442 }
440443 }
441444
442445
443446
444447 @Callable(i)
445-func returnBuy (orderId) = {
448+func returnBuy (id) = {
449+ let orderId = ("order_" + id)
446450 let data = valueOrErrorMessage(getString(this, orderId), "Invalid order id")
447451 let parts = split(data, "_")
448452 let orderType = parts[0]
449453 let orderAmount = parseIntValue(parts[1])
450454 let orderAmountAsset = parts[2]
451455 let orderPriceAssetAmount = parseIntValue(parts[3])
452456 let orderPriceAsset = parts[4]
453457 let orderOwner = value(addressFromString(parts[5]))
454458 let orderAll = if ((parts[6] == "true"))
455459 then true
456460 else false
457461 let orderPassword = parts[7]
458462 let orderSpent = parseIntValue(parts[8])
459463 if ((orderType != "buy"))
460464 then throw("Invalid order type")
461465 else if (if ((orderOwner != i.caller))
462466 then !(shutdownFlag)
463467 else false)
464468 then throw("Return should be called by order owner")
465469 else {
466470 let returnAmount = (orderPriceAssetAmount - orderSpent)
467471 if ((0 >= returnAmount))
468- then throw("nothing to return")
472+ then throw("Nothing to return")
469473 else {
470474 let newData = (dropRight(data, size(parts[8])) + toString(orderPriceAssetAmount))
471475 ScriptResult(WriteSet([DataEntry(orderId, newData)]), TransferSet([ScriptTransfer(orderOwner, returnAmount, if ((orderPriceAsset == "WAVES"))
472476 then unit
473477 else fromBase58String(orderPriceAsset))]))
474478 }
475479 }
476480 }
477481
478482
479483
480484 @Callable(i)
481485 func withdraw (mode) = if ((i.caller != admin))
482486 then throw("You should be an admin")
483487 else if (if (if ((mode != "balance"))
484488 then (mode != "reserve")
485489 else false)
486490 then (mode != "all")
487491 else false)
488492 then throw("Specify the mode: balance, reserve or all")
489493 else {
490494 let balanceEntry = DataEntry("balance", 0)
491495 let balanceTransfer = ScriptTransfer(admin, balance, unit)
492496 let reserveEntry = DataEntry("reserve", 0)
493497 let reserveTransfer = ScriptTransfer(admin, reserve, unit)
494498 let writeSet = if ((mode == "balance"))
495499 then [balanceEntry]
496500 else if ((mode == "reserve"))
497501 then [reserveEntry]
498502 else if ((mode == "all"))
499503 then [balanceEntry, reserveEntry]
500504 else nil
501505 let transferSet = if ((mode == "balance"))
502506 then [balanceTransfer]
503507 else if ((mode == "reserve"))
504508 then [reserveTransfer]
505509 else if ((mode == "all"))
506510 then [balanceTransfer, reserveTransfer]
507511 else nil
508512 ScriptResult(WriteSet(writeSet), TransferSet(transferSet))
509513 }
510514
511515
512516
513517 @Callable(i)
514-func doShutdown (msg) = if ((i.caller != admin))
518+func shutdown (msg) = if ((i.caller != admin))
515519 then throw("You should be an admin")
516520 else WriteSet([DataEntry("shutdown_flag", true), DataEntry("shutdown_message", msg)])
517521
518522

github/deemru/w8io/3ef1775 
81.14 ms