tx · J5riRfkd9W8cDjN8nL4GXqvAQV6TGAiWiWRyuvoyJVtD 3PA2w9i9GnbKR3HB7XTmwf3DnaFBFcDiP12: -0.01400000 Waves 2020.02.25 06:47 [1945180] smart account 3PA2w9i9GnbKR3HB7XTmwf3DnaFBFcDiP12 > SELF 0.00000000 Waves
{ "type": 13, "id": "J5riRfkd9W8cDjN8nL4GXqvAQV6TGAiWiWRyuvoyJVtD", "fee": 1400000, "feeAssetId": null, "timestamp": 1582600847298, "version": 1, "sender": "3PA2w9i9GnbKR3HB7XTmwf3DnaFBFcDiP12", "senderPublicKey": "5G9pgymdyBYGnWF3oahQXQNPnVaWEthMkeFRUzHjZ7mX", "proofs": [ "23iXhxjQy97F3pjDWfgfRbossKrvwigk6wS7Vmqjbif1Veu35jnSNGDC2QVv3cZHqPYnaANADTYi81tvmfcDtp4X", "5PkUpNNnvHFdzMW3en9Ke6PipCyDVKB54JoAvAis6WUjd5SVsuiWwn4nKW6MxDjggmZK5X5rstzMrzCniv1SxEwN", "4vcvK7ECQ8aBv8FEUjyCT17LoLCFtsUJYrzF2qXW5Ls3fch2PdP8YH1Msb3FF7CRBPY9cJ3Ep1maPnyJErDpMaaL" ], "script": "base64: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AAAAAAAAAwUAAAANJGFjYzMzMjcyMzMyOAQAAAANJGFjYzQzMjcyMzMyOAkBAAAADWpvaW5UaG91c2FuZHMAAAACBQAAAA0kYWNjMzMyNzIzMzI4CQABkQAAAAIFAAAADSRsaXN0MzI3MjMzMjgAAAAAAAAAAAMDCQAAAAAAAAIFAAAADSRzaXplMzI3MjMzMjgAAAAAAAAAAAQFAAAADSRhY2M0MzI3MjMzMjgEAAAADSRhY2M1MzI3MjMzMjgJAQAAAA1qb2luVGhvdXNhbmRzAAAAAgUAAAANJGFjYzQzMjcyMzMyOAkAAZEAAAACBQAAAA0kbGlzdDMyNzIzMzI4AAAAAAAAAAAEAwkAAAAAAAACBQAAAA0kc2l6ZTMyNzIzMzI4AAAAAAAAAAAFBQAAAA0kYWNjNTMyNzIzMzI4BAAAAA0kYWNjNjMyNzIzMzI4CQEAAAANam9pblRob3VzYW5kcwAAAAIFAAAADSRhY2M1MzI3MjMzMjgJAAGRAAAAAgUAAAANJGxpc3QzMjcyMzMyOAAAAAAAAAAABQMJAAAAAAAAAgUAAAANJHNpemUzMjcyMzMyOAAAAAAAAAAABgUAAAANJGFjYzYzMjcyMzMyOAQAAAANJGFjYzczMjcyMzMyOAkBAAAADWpvaW5UaG91c2FuZHMAAAACBQAAAA0kYWNjNjMyNzIzMzI4CQABkQAAAAIFAAAADSRsaXN0MzI3MjMzMjgAAAAAAAAAAAYDCQAAAAAAAAIFAAAADSRzaXplMzI3MjMzMjgAAAAAAAAAAAcFAAAADSRhY2M3MzI3MjMzMjgEAAAADSRhY2M4MzI3MjMzMjgJAQAAAA1qb2luVGhvdXNhbmRzAAAAAgUAAAANJGFjYzczMjcyMzMyOAkAAZEAAAACBQAAAA0kbGlzdDMyNzIzMzI4AAAAAAAAAAAHCQAAAgAAAAECAAAAEkxpc3Qgc2l6ZSBleGNlZWQgNwQAAAACZnMJAQAAAA1kcm9wUmlnaHRaZXJvAAAAAQkBAAAADWRyb3BSaWdodFplcm8AAAABCQEAAAANZHJvcFJpZ2h0WmVybwAAAAEJAQAAAA1kcm9wUmlnaHRaZXJvAAAAAQkBAAAADWRyb3BSaWdodFplcm8AAAABCQEAAAANZHJvcFJpZ2h0WmVybwAAAAEJAQAAAA1kcm9wUmln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", "chainId": 87, "height": 1945180, "spentComplexity": 0 } View: original | compacted Prev: CcXRbcLQXjKzZViGJQ7CfPvJiqnfTGtMWcoY7fY5KSCY Next: none Diff:
Old | New | Differences | |
---|---|---|---|
4 | 4 | let assetName = "RusCoin" | |
5 | 5 | ||
6 | 6 | let decMult = 100000 | |
7 | - | ||
8 | - | let minConf = (960 * 1000) | |
9 | 7 | ||
10 | 8 | let lockPeriod = (2629746 * 1000) | |
11 | 9 | ||
25 | 23 | ||
26 | 24 | let frameCloseTime = (frameOpenTime + lockPeriod) | |
27 | 25 | ||
28 | - | let payoutOpenTime = ( | |
26 | + | let payoutOpenTime = (frameCloseTime - (86400 * 1000)) | |
29 | 27 | ||
30 | 28 | func toFloatString (num,mult) = { | |
31 | 29 | let th = "," | |
57 | 55 | let q1 = (r2 / 1000) | |
58 | 56 | let r1 = (r2 % 1000) | |
59 | 57 | let is = { | |
60 | - | let $ | |
61 | - | let $ | |
62 | - | let $ | |
63 | - | if (($ | |
64 | - | then $ | |
58 | + | let $list32723328 = [q6, q5, q4, q3, q2, q1, r1] | |
59 | + | let $size32723328 = size($list32723328) | |
60 | + | let $acc032723328 = "" | |
61 | + | if (($size32723328 == 0)) | |
62 | + | then $acc032723328 | |
65 | 63 | else { | |
66 | - | let $ | |
67 | - | if (($ | |
68 | - | then $ | |
64 | + | let $acc132723328 = joinThousands($acc032723328, $list32723328[0]) | |
65 | + | if (($size32723328 == 1)) | |
66 | + | then $acc132723328 | |
69 | 67 | else { | |
70 | - | let $ | |
71 | - | if (($ | |
72 | - | then $ | |
68 | + | let $acc232723328 = joinThousands($acc132723328, $list32723328[1]) | |
69 | + | if (($size32723328 == 2)) | |
70 | + | then $acc232723328 | |
73 | 71 | else { | |
74 | - | let $ | |
75 | - | if (($ | |
76 | - | then $ | |
72 | + | let $acc332723328 = joinThousands($acc232723328, $list32723328[2]) | |
73 | + | if (($size32723328 == 3)) | |
74 | + | then $acc332723328 | |
77 | 75 | else { | |
78 | - | let $ | |
79 | - | if (($ | |
80 | - | then $ | |
76 | + | let $acc432723328 = joinThousands($acc332723328, $list32723328[3]) | |
77 | + | if (($size32723328 == 4)) | |
78 | + | then $acc432723328 | |
81 | 79 | else { | |
82 | - | let $ | |
83 | - | if (($ | |
84 | - | then $ | |
80 | + | let $acc532723328 = joinThousands($acc432723328, $list32723328[4]) | |
81 | + | if (($size32723328 == 5)) | |
82 | + | then $acc532723328 | |
85 | 83 | else { | |
86 | - | let $ | |
87 | - | if (($ | |
88 | - | then $ | |
84 | + | let $acc632723328 = joinThousands($acc532723328, $list32723328[5]) | |
85 | + | if (($size32723328 == 6)) | |
86 | + | then $acc632723328 | |
89 | 87 | else { | |
90 | - | let $ | |
91 | - | if (($ | |
92 | - | then $ | |
88 | + | let $acc732723328 = joinThousands($acc632723328, $list32723328[6]) | |
89 | + | if (($size32723328 == 7)) | |
90 | + | then $acc732723328 | |
93 | 91 | else { | |
94 | - | let $ | |
92 | + | let $acc832723328 = joinThousands($acc732723328, $list32723328[7]) | |
95 | 93 | throw("List size exceed 7") | |
96 | 94 | } | |
97 | 95 | } | |
217 | 215 | let newBalance = if (isActive) | |
218 | 216 | then (balance + amount) | |
219 | 217 | else amount | |
220 | - | if (if ((minBalance > newBalance)) | |
221 | - | then true | |
222 | - | else (newBalance > maxBalance)) | |
223 | - | then throw((((((((("The minimum allowable balance is " + toFloatString(minBalance, decMult)) + " ") + assetName) + ", and the maximum is ") + toFloatString(maxBalance, decMult)) + " ") + assetName) + ".")) | |
224 | - | else { | |
225 | - | let startTime = if (if (isOlder) | |
226 | - | then isActive | |
227 | - | else false) | |
228 | - | then frameOpenTime | |
229 | - | else if (if (isOlder) | |
230 | - | then !(isActive) | |
218 | + | if ((minBalance > newBalance)) | |
219 | + | then throw((((("The minimum allowable balance is " + toFloatString(minBalance, decMult)) + " ") + assetName) + ".")) | |
220 | + | else if ((newBalance > maxBalance)) | |
221 | + | then throw((((("The maximum allowable balance is " + toFloatString(maxBalance, decMult)) + " ") + assetName) + ".")) | |
222 | + | else { | |
223 | + | let startTime = if (if (isOlder) | |
224 | + | then isActive | |
231 | 225 | else false) | |
232 | - | then lastBlockTime | |
233 | - | else match getInteger(this, (client + "_starttime")) { | |
234 | - | case x: Int => | |
235 | - | if (isActive) | |
236 | - | then x | |
237 | - | else ((x + lastBlockTime) - updateTime) | |
238 | - | case _ => | |
239 | - | 0 | |
240 | - | } | |
241 | - | let newStartTime = if ((startTime > lastBlockTime)) | |
242 | - | then frameCloseTime | |
243 | - | else { | |
244 | - | let balWeight = (balance / minBalance) | |
245 | - | let sumWeight = (newBalance / minBalance) | |
246 | - | (fraction(startTime, balWeight, sumWeight) + fraction(lastBlockTime, (sumWeight - balWeight), sumWeight)) | |
247 | - | } | |
248 | - | if (isActive) | |
249 | - | then WriteSet([DataEntry((dapp + "_balance"), (sumTotal + amount)), DataEntry((client + "_balance"), newBalance), DataEntry((client + "_starttime"), newStartTime), DataEntry((client + "_updatetime"), lastBlockTime)]) | |
250 | - | else if (isDefined(getString(this, (client + "_address")))) | |
251 | - | then WriteSet([DataEntry((dapp + "_balance"), (sumTotal + amount)), DataEntry((client + "_balance"), newBalance), DataEntry((client + "_starttime"), newStartTime), DataEntry((client + "_status"), true), DataEntry((client + "_updatetime"), lastBlockTime)]) | |
252 | - | else WriteSet([DataEntry((dapp + "_balance"), (sumTotal + amount)), DataEntry((client + "_address"), client), DataEntry((client + "_balance"), newBalance), DataEntry((client + "_starttime"), newStartTime), DataEntry((client + "_status"), true), DataEntry((client + "_updatetime"), lastBlockTime)]) | |
253 | - | } | |
226 | + | then frameOpenTime | |
227 | + | else if (if (isOlder) | |
228 | + | then !(isActive) | |
229 | + | else false) | |
230 | + | then lastBlockTime | |
231 | + | else match getInteger(this, (client + "_starttime")) { | |
232 | + | case x: Int => | |
233 | + | if (isActive) | |
234 | + | then x | |
235 | + | else ((x + lastBlockTime) - updateTime) | |
236 | + | case _ => | |
237 | + | 0 | |
238 | + | } | |
239 | + | let newStartTime = if ((startTime > lastBlockTime)) | |
240 | + | then frameCloseTime | |
241 | + | else { | |
242 | + | let balWeight = (balance / minBalance) | |
243 | + | let sumWeight = (newBalance / minBalance) | |
244 | + | (fraction(startTime, balWeight, sumWeight) + fraction(lastBlockTime, (sumWeight - balWeight), sumWeight)) | |
245 | + | } | |
246 | + | if (isActive) | |
247 | + | then WriteSet([DataEntry((dapp + "_balance"), (sumTotal + amount)), DataEntry((client + "_balance"), newBalance), DataEntry((client + "_starttime"), newStartTime), DataEntry((client + "_updatetime"), lastBlockTime)]) | |
248 | + | else if (isDefined(getString(this, (client + "_address")))) | |
249 | + | then WriteSet([DataEntry((dapp + "_balance"), (sumTotal + amount)), DataEntry((client + "_balance"), newBalance), DataEntry((client + "_starttime"), newStartTime), DataEntry((client + "_status"), true), DataEntry((client + "_updatetime"), lastBlockTime)]) | |
250 | + | else WriteSet([DataEntry((dapp + "_balance"), (sumTotal + amount)), DataEntry((client + "_address"), client), DataEntry((client + "_balance"), newBalance), DataEntry((client + "_starttime"), newStartTime), DataEntry((client + "_status"), true), DataEntry((client + "_updatetime"), lastBlockTime)]) | |
251 | + | } | |
254 | 252 | } | |
255 | 253 | } | |
256 | 254 | ||
300 | 298 | then (expiration > lastBlockTime) | |
301 | 299 | else false) | |
302 | 300 | then throw((("Unable to withdraw coins! The account is locked for up to " + toDateTimeString(expiration)) + ". Please wait...")) | |
303 | - | else if (( | |
304 | - | then throw(" | |
305 | - | else if (( | |
306 | - | then throw( | |
307 | - | else if (( | |
308 | - | then throw(((((((" | |
309 | - | else if (( | |
310 | - | then throw(((((" | |
301 | + | else if ((lastBlockTime >= payoutOpenTime)) | |
302 | + | then throw((("Sending rewards: The account is suspended for the period until " + toDateTimeString(frameCloseTime)) + ". Please wait...")) | |
303 | + | else if ((0 >= amount)) | |
304 | + | then throw("It's impossible to withdraw a negative amount or no balance.") | |
305 | + | else if ((amount > balance)) | |
306 | + | then throw((((((("It's impossible to withdraw more than the balance of " + toString(balance)) + " (") + toFloatString(balance, decMult)) + " ") + assetName) + ").")) | |
307 | + | else if ((minBalance > amount)) | |
308 | + | then throw((((((("The minimum withdrawal amount is " + toString(minBalance)) + " (") + toFloatString(minBalance, decMult)) + " ") + assetName) + ").")) | |
311 | 309 | else { | |
312 | 310 | let startTime = if (isOlder) | |
313 | 311 | then frameOpenTime | |
341 | 339 | then throw("Only an administrator can set and modify minStake!") | |
342 | 340 | else if (isDefined(inv.payment)) | |
343 | 341 | then throw("Please do not attach payment when setting up minStake.") | |
344 | - | else { | |
345 | - | let dapp = toBase58String(this.bytes) | |
346 | - | if (isDefined(getString(this, (dapp + "_address")))) | |
347 | - | then WriteSet([DataEntry((dapp + "_starttime"), RSCx100000), DataEntry((dapp + "_updatetime"), lastBlockTime)]) | |
348 | - | else WriteSet([DataEntry((dapp + "_address"), dapp), DataEntry((dapp + "_balance"), 0), DataEntry((dapp + "_starttime"), RSCx100000), DataEntry((dapp + "_status"), false), DataEntry((dapp + "_updatetime"), lastBlockTime)]) | |
349 | - | } | |
342 | + | else if ((0 > RSCx100000)) | |
343 | + | then throw("Negative values are not allowed. Zero to block all deposits...") | |
344 | + | else { | |
345 | + | let dapp = toBase58String(this.bytes) | |
346 | + | if (isDefined(getString(this, (dapp + "_address")))) | |
347 | + | then WriteSet([DataEntry((dapp + "_starttime"), RSCx100000), DataEntry((dapp + "_updatetime"), lastBlockTime)]) | |
348 | + | else WriteSet([DataEntry((dapp + "_address"), dapp), DataEntry((dapp + "_balance"), 0), DataEntry((dapp + "_starttime"), RSCx100000), DataEntry((dapp + "_status"), false), DataEntry((dapp + "_updatetime"), lastBlockTime)]) | |
349 | + | } | |
350 | 350 | ||
351 | 351 | ||
352 | 352 | ||
375 | 375 | else if ((rewards > effBalance)) | |
376 | 376 | then throw((((("Insufficient effective balance! The required amount is " + toFloatString((rewards - effBalance), decMult)) + " ") + assetName) + ".")) | |
377 | 377 | else { | |
378 | - | let data9 = if (if ((addr9 == "-")) | |
379 | - | then (amount9 == 0) | |
378 | + | let data9 = if (if ((amount9 == 0)) | |
379 | + | then if (if ((addr9 == "")) | |
380 | + | then true | |
381 | + | else (addr9 == "-")) | |
382 | + | then true | |
383 | + | else (addr9 == "n/a") | |
380 | 384 | else false) | |
381 | 385 | then nil | |
382 | 386 | else if (!(getBooleanValue(this, (addr9 + "_status")))) | |
389 | 393 | then throw("Deposit of address #9 will be overfilled!") | |
390 | 394 | else [DataEntry((addr9 + "_balance"), newBalance), DataEntry((addr9 + "_starttime"), frameCloseTime)] | |
391 | 395 | } | |
392 | - | let data8 = if (if ((addr8 == "-")) | |
393 | - | then (amount8 == 0) | |
396 | + | let data8 = if (if ((amount8 == 0)) | |
397 | + | then if (if ((addr8 == "")) | |
398 | + | then true | |
399 | + | else (addr8 == "-")) | |
400 | + | then true | |
401 | + | else (addr8 == "n/a") | |
394 | 402 | else false) | |
395 | 403 | then data9 | |
396 | 404 | else if (!(getBooleanValue(this, (addr8 + "_status")))) | |
403 | 411 | then throw("Deposit of address #8 will be overfilled!") | |
404 | 412 | else [DataEntry((addr8 + "_balance"), newBalance), DataEntry((addr8 + "_starttime"), frameCloseTime)] :: data9 | |
405 | 413 | } | |
406 | - | let data7 = if (if ((addr7 == "-")) | |
407 | - | then (amount7 == 0) | |
414 | + | let data7 = if (if ((amount7 == 0)) | |
415 | + | then if (if ((addr7 == "")) | |
416 | + | then true | |
417 | + | else (addr7 == "-")) | |
418 | + | then true | |
419 | + | else (addr7 == "n/a") | |
408 | 420 | else false) | |
409 | 421 | then data8 | |
410 | 422 | else if (!(getBooleanValue(this, (addr7 + "_status")))) | |
417 | 429 | then throw("Deposit of address #7 will be overfilled!") | |
418 | 430 | else [DataEntry((addr7 + "_balance"), newBalance), DataEntry((addr7 + "_starttime"), frameCloseTime)] :: data8 | |
419 | 431 | } | |
420 | - | let data6 = if (if ((addr6 == "-")) | |
421 | - | then (amount6 == 0) | |
432 | + | let data6 = if (if ((amount6 == 0)) | |
433 | + | then if (if ((addr6 == "")) | |
434 | + | then true | |
435 | + | else (addr6 == "-")) | |
436 | + | then true | |
437 | + | else (addr6 == "n/a") | |
422 | 438 | else false) | |
423 | 439 | then data7 | |
424 | 440 | else if (!(getBooleanValue(this, (addr6 + "_status")))) | |
431 | 447 | then throw("Deposit of address #6 will be overfilled!") | |
432 | 448 | else [DataEntry((addr6 + "_balance"), newBalance), DataEntry((addr6 + "_starttime"), frameCloseTime)] :: data7 | |
433 | 449 | } | |
434 | - | let data5 = if (if ((addr5 == "-")) | |
435 | - | then (amount5 == 0) | |
450 | + | let data5 = if (if ((amount5 == 0)) | |
451 | + | then if (if ((addr5 == "")) | |
452 | + | then true | |
453 | + | else (addr5 == "-")) | |
454 | + | then true | |
455 | + | else (addr5 == "n/a") | |
436 | 456 | else false) | |
437 | 457 | then data6 | |
438 | 458 | else if (!(getBooleanValue(this, (addr5 + "_status")))) | |
445 | 465 | then throw("Deposit of address #5 will be overfilled!") | |
446 | 466 | else [DataEntry((addr5 + "_balance"), newBalance), DataEntry((addr5 + "_starttime"), frameCloseTime)] :: data6 | |
447 | 467 | } | |
448 | - | let data4 = if (if ((addr4 == "-")) | |
449 | - | then (amount4 == 0) | |
468 | + | let data4 = if (if ((amount4 == 0)) | |
469 | + | then if (if ((addr4 == "")) | |
470 | + | then true | |
471 | + | else (addr4 == "-")) | |
472 | + | then true | |
473 | + | else (addr4 == "n/a") | |
450 | 474 | else false) | |
451 | 475 | then data5 | |
452 | 476 | else if (!(getBooleanValue(this, (addr4 + "_status")))) | |
459 | 483 | then throw("Deposit of address #4 will be overfilled!") | |
460 | 484 | else [DataEntry((addr4 + "_balance"), newBalance), DataEntry((addr4 + "_starttime"), frameCloseTime)] :: data5 | |
461 | 485 | } | |
462 | - | let data3 = if (if ((addr3 == "-")) | |
463 | - | then (amount3 == 0) | |
486 | + | let data3 = if (if ((amount3 == 0)) | |
487 | + | then if (if ((addr3 == "")) | |
488 | + | then true | |
489 | + | else (addr3 == "-")) | |
490 | + | then true | |
491 | + | else (addr3 == "n/a") | |
464 | 492 | else false) | |
465 | 493 | then data4 | |
466 | 494 | else if (!(getBooleanValue(this, (addr3 + "_status")))) | |
473 | 501 | then throw("Deposit of address #3 will be overfilled!") | |
474 | 502 | else [DataEntry((addr3 + "_balance"), newBalance), DataEntry((addr3 + "_starttime"), frameCloseTime)] :: data4 | |
475 | 503 | } | |
476 | - | let data2 = if (if ((addr2 == "-")) | |
477 | - | then (amount2 == 0) | |
504 | + | let data2 = if (if ((amount2 == 0)) | |
505 | + | then if (if ((addr2 == "")) | |
506 | + | then true | |
507 | + | else (addr2 == "-")) | |
508 | + | then true | |
509 | + | else (addr2 == "n/a") | |
478 | 510 | else false) | |
479 | 511 | then data3 | |
480 | 512 | else if (!(getBooleanValue(this, (addr2 + "_status")))) | |
487 | 519 | then throw("Deposit of address #2 will be overfilled!") | |
488 | 520 | else [DataEntry((addr2 + "_balance"), newBalance), DataEntry((addr2 + "_starttime"), frameCloseTime)] :: data3 | |
489 | 521 | } | |
490 | - | let data1 = if (if ((addr1 == "-")) | |
491 | - | then (amount1 == 0) | |
522 | + | let data1 = if (if ((amount1 == 0)) | |
523 | + | then if (if ((addr1 == "")) | |
524 | + | then true | |
525 | + | else (addr1 == "-")) | |
526 | + | then true | |
527 | + | else (addr1 == "n/a") | |
492 | 528 | else false) | |
493 | 529 | then data2 | |
494 | 530 | else if (!(getBooleanValue(this, (addr1 + "_status")))) | |
501 | 537 | then throw("Deposit of address #1 will be overfilled!") | |
502 | 538 | else [DataEntry((addr1 + "_balance"), newBalance), DataEntry((addr1 + "_starttime"), frameCloseTime)] :: data2 | |
503 | 539 | } | |
504 | - | let data0 = if (if ((addr0 == "-")) | |
505 | - | then (amount0 == 0) | |
540 | + | let data0 = if (if ((amount0 == 0)) | |
541 | + | then if (if ((addr0 == "")) | |
542 | + | then true | |
543 | + | else (addr0 == "-")) | |
544 | + | then true | |
545 | + | else (addr0 == "n/a") | |
506 | 546 | else false) | |
507 | 547 | then data1 | |
508 | 548 | else if (!(getBooleanValue(this, (addr0 + "_status")))) | |
522 | 562 | ||
523 | 563 | @Verifier(tx) | |
524 | 564 | func verify () = match tx { | |
525 | - | case a: CreateAliasTransaction => | |
526 | - | sigVerify(a.bodyBytes, a.proofs[0], a.senderPublicKey) | |
527 | 565 | case t: TransferTransaction => | |
528 | 566 | if (if ((t.assetId != myAssetId)) | |
529 | 567 | then (t.feeAssetId != myAssetId) | |
530 | 568 | else false) | |
531 | - | then sigVerify( | |
569 | + | then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
532 | 570 | else false | |
533 | 571 | case s: SetScriptTransaction => | |
534 | - | if (sigVerify( | |
535 | - | then sigVerify( | |
572 | + | if (sigVerify(tx.bodyBytes, tx.proofs[2], ownerPubKey)) | |
573 | + | then sigVerify(tx.bodyBytes, tx.proofs[1], managerPubKey) | |
536 | 574 | else false | |
537 | 575 | case _ => | |
538 | 576 | false |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 3 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let assetName = "RusCoin" | |
5 | 5 | ||
6 | 6 | let decMult = 100000 | |
7 | - | ||
8 | - | let minConf = (960 * 1000) | |
9 | 7 | ||
10 | 8 | let lockPeriod = (2629746 * 1000) | |
11 | 9 | ||
12 | 10 | let minBalance = (decMult / 100) | |
13 | 11 | ||
14 | 12 | let maxBalance = (10000 * decMult) | |
15 | 13 | ||
16 | 14 | let myAssetId = base58'EMdiF8uaySswfCdMxc114rSfzUsAKCtK9d8eSx6ruKP4' | |
17 | 15 | ||
18 | 16 | let ownerPubKey = base58'2in4yGNBKfitQbXbsHmL2unWrUnRo7GWyqcZXsmAzhQi' | |
19 | 17 | ||
20 | 18 | let managerPubKey = base58'EaKK5PAFUkgtnF7xcyABUzi8YBQADmUDnPzQBHjCTAKT' | |
21 | 19 | ||
22 | 20 | let lastBlockTime = lastBlock.timestamp | |
23 | 21 | ||
24 | 22 | let frameOpenTime = ((lastBlockTime / lockPeriod) * lockPeriod) | |
25 | 23 | ||
26 | 24 | let frameCloseTime = (frameOpenTime + lockPeriod) | |
27 | 25 | ||
28 | - | let payoutOpenTime = ( | |
26 | + | let payoutOpenTime = (frameCloseTime - (86400 * 1000)) | |
29 | 27 | ||
30 | 28 | func toFloatString (num,mult) = { | |
31 | 29 | let th = "," | |
32 | 30 | let dp = "." | |
33 | 31 | func joinThousands (acc,val) = if (if ((acc == "")) | |
34 | 32 | then (val == 0) | |
35 | 33 | else false) | |
36 | 34 | then "" | |
37 | 35 | else if ((acc == "")) | |
38 | 36 | then toString(val) | |
39 | 37 | else ((acc + th) + drop(toString((val + 1000)), 1)) | |
40 | 38 | ||
41 | 39 | func dropRightZero (str) = if ((drop(str, (size(str) - 1)) != "0")) | |
42 | 40 | then str | |
43 | 41 | else take(str, (size(str) - 1)) | |
44 | 42 | ||
45 | 43 | let ip = (num / mult) | |
46 | 44 | let fp = (num % mult) | |
47 | 45 | let q6 = (ip / (((((1000 * 1000) * 1000) * 1000) * 1000) * 1000)) | |
48 | 46 | let r6 = (ip % (((((1000 * 1000) * 1000) * 1000) * 1000) * 1000)) | |
49 | 47 | let q5 = (r6 / ((((1000 * 1000) * 1000) * 1000) * 1000)) | |
50 | 48 | let r5 = (r6 % ((((1000 * 1000) * 1000) * 1000) * 1000)) | |
51 | 49 | let q4 = (r5 / (((1000 * 1000) * 1000) * 1000)) | |
52 | 50 | let r4 = (r5 % (((1000 * 1000) * 1000) * 1000)) | |
53 | 51 | let q3 = (r4 / ((1000 * 1000) * 1000)) | |
54 | 52 | let r3 = (r4 % ((1000 * 1000) * 1000)) | |
55 | 53 | let q2 = (r3 / (1000 * 1000)) | |
56 | 54 | let r2 = (r3 % (1000 * 1000)) | |
57 | 55 | let q1 = (r2 / 1000) | |
58 | 56 | let r1 = (r2 % 1000) | |
59 | 57 | let is = { | |
60 | - | let $ | |
61 | - | let $ | |
62 | - | let $ | |
63 | - | if (($ | |
64 | - | then $ | |
58 | + | let $list32723328 = [q6, q5, q4, q3, q2, q1, r1] | |
59 | + | let $size32723328 = size($list32723328) | |
60 | + | let $acc032723328 = "" | |
61 | + | if (($size32723328 == 0)) | |
62 | + | then $acc032723328 | |
65 | 63 | else { | |
66 | - | let $ | |
67 | - | if (($ | |
68 | - | then $ | |
64 | + | let $acc132723328 = joinThousands($acc032723328, $list32723328[0]) | |
65 | + | if (($size32723328 == 1)) | |
66 | + | then $acc132723328 | |
69 | 67 | else { | |
70 | - | let $ | |
71 | - | if (($ | |
72 | - | then $ | |
68 | + | let $acc232723328 = joinThousands($acc132723328, $list32723328[1]) | |
69 | + | if (($size32723328 == 2)) | |
70 | + | then $acc232723328 | |
73 | 71 | else { | |
74 | - | let $ | |
75 | - | if (($ | |
76 | - | then $ | |
72 | + | let $acc332723328 = joinThousands($acc232723328, $list32723328[2]) | |
73 | + | if (($size32723328 == 3)) | |
74 | + | then $acc332723328 | |
77 | 75 | else { | |
78 | - | let $ | |
79 | - | if (($ | |
80 | - | then $ | |
76 | + | let $acc432723328 = joinThousands($acc332723328, $list32723328[3]) | |
77 | + | if (($size32723328 == 4)) | |
78 | + | then $acc432723328 | |
81 | 79 | else { | |
82 | - | let $ | |
83 | - | if (($ | |
84 | - | then $ | |
80 | + | let $acc532723328 = joinThousands($acc432723328, $list32723328[4]) | |
81 | + | if (($size32723328 == 5)) | |
82 | + | then $acc532723328 | |
85 | 83 | else { | |
86 | - | let $ | |
87 | - | if (($ | |
88 | - | then $ | |
84 | + | let $acc632723328 = joinThousands($acc532723328, $list32723328[5]) | |
85 | + | if (($size32723328 == 6)) | |
86 | + | then $acc632723328 | |
89 | 87 | else { | |
90 | - | let $ | |
91 | - | if (($ | |
92 | - | then $ | |
88 | + | let $acc732723328 = joinThousands($acc632723328, $list32723328[6]) | |
89 | + | if (($size32723328 == 7)) | |
90 | + | then $acc732723328 | |
93 | 91 | else { | |
94 | - | let $ | |
92 | + | let $acc832723328 = joinThousands($acc732723328, $list32723328[7]) | |
95 | 93 | throw("List size exceed 7") | |
96 | 94 | } | |
97 | 95 | } | |
98 | 96 | } | |
99 | 97 | } | |
100 | 98 | } | |
101 | 99 | } | |
102 | 100 | } | |
103 | 101 | } | |
104 | 102 | } | |
105 | 103 | let fs = dropRightZero(dropRightZero(dropRightZero(dropRightZero(dropRightZero(dropRightZero(dropRightZero(dropRightZero(take(drop(toString((fp + mult)), 1), 8))))))))) | |
106 | 104 | ((if ((is != "")) | |
107 | 105 | then is | |
108 | 106 | else "0") + (if ((fs != "")) | |
109 | 107 | then (dp + fs) | |
110 | 108 | else "")) | |
111 | 109 | } | |
112 | 110 | ||
113 | 111 | ||
114 | 112 | func toDateTimeString (timestamp) = { | |
115 | 113 | let sp = " " | |
116 | 114 | let zz = " UTC" | |
117 | 115 | let norm = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365] | |
118 | 116 | let leap = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366] | |
119 | 117 | if (if ((-12212553600000 > timestamp)) | |
120 | 118 | then true | |
121 | 119 | else (timestamp > 253402300799999)) | |
122 | 120 | then throw("ISO 8601: Only years from 1583 to 9999 are permitted.") | |
123 | 121 | else { | |
124 | 122 | let epoch = (((((1969 * 365) + (1969 / 4)) - (1969 / 100)) + (1969 / 400)) + 366) | |
125 | 123 | let ce = (timestamp + ((epoch * 86400) * 1000)) | |
126 | 124 | let date = { | |
127 | 125 | let yy = ((ce / (31556952 * 1000)) - 1) | |
128 | 126 | let dty = (((((yy * 365) + (yy / 4)) - (yy / 100)) + (yy / 400)) + 366) | |
129 | 127 | let ytd = ((ce / (86400 * 1000)) - dty) | |
130 | 128 | let months = if (if (if ((((yy + 1) % 4) == 0)) | |
131 | 129 | then (((yy + 1) % 100) != 0) | |
132 | 130 | else false) | |
133 | 131 | then true | |
134 | 132 | else (((yy + 1) % 400) == 0)) | |
135 | 133 | then leap | |
136 | 134 | else norm | |
137 | 135 | let mm = if ((ytd >= months[12])) | |
138 | 136 | then throw() | |
139 | 137 | else if ((ytd >= months[11])) | |
140 | 138 | then 11 | |
141 | 139 | else if ((ytd >= months[10])) | |
142 | 140 | then 10 | |
143 | 141 | else if ((ytd >= months[9])) | |
144 | 142 | then 9 | |
145 | 143 | else if ((ytd >= months[8])) | |
146 | 144 | then 8 | |
147 | 145 | else if ((ytd >= months[7])) | |
148 | 146 | then 7 | |
149 | 147 | else if ((ytd >= months[6])) | |
150 | 148 | then 6 | |
151 | 149 | else if ((ytd >= months[5])) | |
152 | 150 | then 5 | |
153 | 151 | else if ((ytd >= months[4])) | |
154 | 152 | then 4 | |
155 | 153 | else if ((ytd >= months[3])) | |
156 | 154 | then 3 | |
157 | 155 | else if ((ytd >= months[2])) | |
158 | 156 | then 2 | |
159 | 157 | else if ((ytd >= months[1])) | |
160 | 158 | then 1 | |
161 | 159 | else if ((ytd >= months[0])) | |
162 | 160 | then 0 | |
163 | 161 | else throw() | |
164 | 162 | let dd = (ytd - months[mm]) | |
165 | 163 | ((((toString((yy + 1)) + "-") + drop(toString((mm + 101)), 1)) + "-") + drop(toString((dd + 101)), 1)) | |
166 | 164 | } | |
167 | 165 | let time = { | |
168 | 166 | let rd = (ce % (86400 * 1000)) | |
169 | 167 | let hh = (rd / (3600 * 1000)) | |
170 | 168 | let rh = (rd % (3600 * 1000)) | |
171 | 169 | let mm = (rh / (60 * 1000)) | |
172 | 170 | let rm = (rh % (60 * 1000)) | |
173 | 171 | let ss = (rm / 1000) | |
174 | 172 | let ms = (rm % 1000) | |
175 | 173 | ((((drop(toString((hh + 100)), 1) + ":") + drop(toString((mm + 100)), 1)) + ":") + drop(toString((ss + 100)), 1)) | |
176 | 174 | } | |
177 | 175 | (((date + sp) + time) + zz) | |
178 | 176 | } | |
179 | 177 | } | |
180 | 178 | ||
181 | 179 | ||
182 | 180 | @Callable(inv) | |
183 | 181 | func deposit () = { | |
184 | 182 | let attPayment = if (isDefined(inv.payment)) | |
185 | 183 | then extract(inv.payment) | |
186 | 184 | else throw((("There is no attached payment " + assetName) + ".")) | |
187 | 185 | if ((attPayment.assetId != myAssetId)) | |
188 | 186 | then throw((("Only " + assetName) + " is allowed to deposit.")) | |
189 | 187 | else { | |
190 | 188 | let dapp = toBase58String(this.bytes) | |
191 | 189 | let sumTotal = getIntegerValue(this, (dapp + "_balance")) | |
192 | 190 | let client = toBase58String(inv.caller.bytes) | |
193 | 191 | let updateTime = match getInteger(this, (client + "_updatetime")) { | |
194 | 192 | case x: Int => | |
195 | 193 | x | |
196 | 194 | case _ => | |
197 | 195 | 0 | |
198 | 196 | } | |
199 | 197 | let isOlder = (frameOpenTime >= updateTime) | |
200 | 198 | let isActive = match getBoolean(this, (client + "_status")) { | |
201 | 199 | case x: Boolean => | |
202 | 200 | x | |
203 | 201 | case _ => | |
204 | 202 | false | |
205 | 203 | } | |
206 | 204 | let balance = if (if (isOlder) | |
207 | 205 | then !(isActive) | |
208 | 206 | else false) | |
209 | 207 | then 0 | |
210 | 208 | else match getInteger(this, (client + "_balance")) { | |
211 | 209 | case x: Int => | |
212 | 210 | x | |
213 | 211 | case _ => | |
214 | 212 | 0 | |
215 | 213 | } | |
216 | 214 | let amount = attPayment.amount | |
217 | 215 | let newBalance = if (isActive) | |
218 | 216 | then (balance + amount) | |
219 | 217 | else amount | |
220 | - | if (if ((minBalance > newBalance)) | |
221 | - | then true | |
222 | - | else (newBalance > maxBalance)) | |
223 | - | then throw((((((((("The minimum allowable balance is " + toFloatString(minBalance, decMult)) + " ") + assetName) + ", and the maximum is ") + toFloatString(maxBalance, decMult)) + " ") + assetName) + ".")) | |
224 | - | else { | |
225 | - | let startTime = if (if (isOlder) | |
226 | - | then isActive | |
227 | - | else false) | |
228 | - | then frameOpenTime | |
229 | - | else if (if (isOlder) | |
230 | - | then !(isActive) | |
218 | + | if ((minBalance > newBalance)) | |
219 | + | then throw((((("The minimum allowable balance is " + toFloatString(minBalance, decMult)) + " ") + assetName) + ".")) | |
220 | + | else if ((newBalance > maxBalance)) | |
221 | + | then throw((((("The maximum allowable balance is " + toFloatString(maxBalance, decMult)) + " ") + assetName) + ".")) | |
222 | + | else { | |
223 | + | let startTime = if (if (isOlder) | |
224 | + | then isActive | |
231 | 225 | else false) | |
232 | - | then lastBlockTime | |
233 | - | else match getInteger(this, (client + "_starttime")) { | |
234 | - | case x: Int => | |
235 | - | if (isActive) | |
236 | - | then x | |
237 | - | else ((x + lastBlockTime) - updateTime) | |
238 | - | case _ => | |
239 | - | 0 | |
240 | - | } | |
241 | - | let newStartTime = if ((startTime > lastBlockTime)) | |
242 | - | then frameCloseTime | |
243 | - | else { | |
244 | - | let balWeight = (balance / minBalance) | |
245 | - | let sumWeight = (newBalance / minBalance) | |
246 | - | (fraction(startTime, balWeight, sumWeight) + fraction(lastBlockTime, (sumWeight - balWeight), sumWeight)) | |
247 | - | } | |
248 | - | if (isActive) | |
249 | - | then WriteSet([DataEntry((dapp + "_balance"), (sumTotal + amount)), DataEntry((client + "_balance"), newBalance), DataEntry((client + "_starttime"), newStartTime), DataEntry((client + "_updatetime"), lastBlockTime)]) | |
250 | - | else if (isDefined(getString(this, (client + "_address")))) | |
251 | - | then WriteSet([DataEntry((dapp + "_balance"), (sumTotal + amount)), DataEntry((client + "_balance"), newBalance), DataEntry((client + "_starttime"), newStartTime), DataEntry((client + "_status"), true), DataEntry((client + "_updatetime"), lastBlockTime)]) | |
252 | - | else WriteSet([DataEntry((dapp + "_balance"), (sumTotal + amount)), DataEntry((client + "_address"), client), DataEntry((client + "_balance"), newBalance), DataEntry((client + "_starttime"), newStartTime), DataEntry((client + "_status"), true), DataEntry((client + "_updatetime"), lastBlockTime)]) | |
253 | - | } | |
226 | + | then frameOpenTime | |
227 | + | else if (if (isOlder) | |
228 | + | then !(isActive) | |
229 | + | else false) | |
230 | + | then lastBlockTime | |
231 | + | else match getInteger(this, (client + "_starttime")) { | |
232 | + | case x: Int => | |
233 | + | if (isActive) | |
234 | + | then x | |
235 | + | else ((x + lastBlockTime) - updateTime) | |
236 | + | case _ => | |
237 | + | 0 | |
238 | + | } | |
239 | + | let newStartTime = if ((startTime > lastBlockTime)) | |
240 | + | then frameCloseTime | |
241 | + | else { | |
242 | + | let balWeight = (balance / minBalance) | |
243 | + | let sumWeight = (newBalance / minBalance) | |
244 | + | (fraction(startTime, balWeight, sumWeight) + fraction(lastBlockTime, (sumWeight - balWeight), sumWeight)) | |
245 | + | } | |
246 | + | if (isActive) | |
247 | + | then WriteSet([DataEntry((dapp + "_balance"), (sumTotal + amount)), DataEntry((client + "_balance"), newBalance), DataEntry((client + "_starttime"), newStartTime), DataEntry((client + "_updatetime"), lastBlockTime)]) | |
248 | + | else if (isDefined(getString(this, (client + "_address")))) | |
249 | + | then WriteSet([DataEntry((dapp + "_balance"), (sumTotal + amount)), DataEntry((client + "_balance"), newBalance), DataEntry((client + "_starttime"), newStartTime), DataEntry((client + "_status"), true), DataEntry((client + "_updatetime"), lastBlockTime)]) | |
250 | + | else WriteSet([DataEntry((dapp + "_balance"), (sumTotal + amount)), DataEntry((client + "_address"), client), DataEntry((client + "_balance"), newBalance), DataEntry((client + "_starttime"), newStartTime), DataEntry((client + "_status"), true), DataEntry((client + "_updatetime"), lastBlockTime)]) | |
251 | + | } | |
254 | 252 | } | |
255 | 253 | } | |
256 | 254 | ||
257 | 255 | ||
258 | 256 | ||
259 | 257 | @Callable(inv) | |
260 | 258 | func withdraw (RSCx100000) = if (isDefined(inv.payment)) | |
261 | 259 | then throw("Please do not attach payment when withdrawing funds.") | |
262 | 260 | else { | |
263 | 261 | let dapp = toBase58String(this.bytes) | |
264 | 262 | let sumTotal = getIntegerValue(this, (dapp + "_balance")) | |
265 | 263 | let minStake = getIntegerValue(this, (dapp + "_starttime")) | |
266 | 264 | let dappTime = getIntegerValue(this, (dapp + "_updatetime")) | |
267 | 265 | let client = toBase58String(inv.caller.bytes) | |
268 | 266 | let updateTime = match getInteger(this, (client + "_updatetime")) { | |
269 | 267 | case x: Int => | |
270 | 268 | x | |
271 | 269 | case _ => | |
272 | 270 | 0 | |
273 | 271 | } | |
274 | 272 | let isOlder = (frameOpenTime >= updateTime) | |
275 | 273 | let isActive = match getBoolean(this, (client + "_status")) { | |
276 | 274 | case x: Boolean => | |
277 | 275 | x | |
278 | 276 | case _ => | |
279 | 277 | false | |
280 | 278 | } | |
281 | 279 | let balance = if (!(isActive)) | |
282 | 280 | then 0 | |
283 | 281 | else match getInteger(this, (client + "_balance")) { | |
284 | 282 | case x: Int => | |
285 | 283 | x | |
286 | 284 | case _ => | |
287 | 285 | 0 | |
288 | 286 | } | |
289 | 287 | let expiration = (updateTime + lockPeriod) | |
290 | 288 | let lastUpdate = if ((dappTime > updateTime)) | |
291 | 289 | then dappTime | |
292 | 290 | else updateTime | |
293 | 291 | let amount = if ((RSCx100000 > 0)) | |
294 | 292 | then RSCx100000 | |
295 | 293 | else balance | |
296 | 294 | let newBalance = (balance - amount) | |
297 | 295 | if (if (if ((minStake >= 0)) | |
298 | 296 | then (balance >= minStake) | |
299 | 297 | else false) | |
300 | 298 | then (expiration > lastBlockTime) | |
301 | 299 | else false) | |
302 | 300 | then throw((("Unable to withdraw coins! The account is locked for up to " + toDateTimeString(expiration)) + ". Please wait...")) | |
303 | - | else if (( | |
304 | - | then throw(" | |
305 | - | else if (( | |
306 | - | then throw( | |
307 | - | else if (( | |
308 | - | then throw(((((((" | |
309 | - | else if (( | |
310 | - | then throw(((((" | |
301 | + | else if ((lastBlockTime >= payoutOpenTime)) | |
302 | + | then throw((("Sending rewards: The account is suspended for the period until " + toDateTimeString(frameCloseTime)) + ". Please wait...")) | |
303 | + | else if ((0 >= amount)) | |
304 | + | then throw("It's impossible to withdraw a negative amount or no balance.") | |
305 | + | else if ((amount > balance)) | |
306 | + | then throw((((((("It's impossible to withdraw more than the balance of " + toString(balance)) + " (") + toFloatString(balance, decMult)) + " ") + assetName) + ").")) | |
307 | + | else if ((minBalance > amount)) | |
308 | + | then throw((((((("The minimum withdrawal amount is " + toString(minBalance)) + " (") + toFloatString(minBalance, decMult)) + " ") + assetName) + ").")) | |
311 | 309 | else { | |
312 | 310 | let startTime = if (isOlder) | |
313 | 311 | then frameOpenTime | |
314 | 312 | else match getInteger(this, (client + "_starttime")) { | |
315 | 313 | case x: Int => | |
316 | 314 | x | |
317 | 315 | case _ => | |
318 | 316 | 0 | |
319 | 317 | } | |
320 | 318 | let newStartTime = if ((startTime > lastBlockTime)) | |
321 | 319 | then frameCloseTime | |
322 | 320 | else if ((minBalance > newBalance)) | |
323 | 321 | then startTime | |
324 | 322 | else { | |
325 | 323 | let balWeight = (balance / minBalance) | |
326 | 324 | let sumWeight = (newBalance / minBalance) | |
327 | 325 | (fraction(startTime, balWeight, sumWeight) + fraction(lastBlockTime, (sumWeight - balWeight), sumWeight)) | |
328 | 326 | } | |
329 | 327 | if ((newBalance >= minBalance)) | |
330 | 328 | then ScriptResult(WriteSet([DataEntry((dapp + "_balance"), (sumTotal - amount)), DataEntry((client + "_balance"), newBalance), DataEntry((client + "_starttime"), newStartTime), DataEntry((client + "_updatetime"), lastBlockTime)]), TransferSet([ScriptTransfer(inv.caller, amount, myAssetId)])) | |
331 | 329 | else ScriptResult(WriteSet([DataEntry((dapp + "_balance"), (sumTotal - balance)), DataEntry((client + "_starttime"), newStartTime), DataEntry((client + "_status"), false), DataEntry((client + "_updatetime"), lastBlockTime)]), TransferSet([ScriptTransfer(inv.caller, balance, myAssetId)])) | |
332 | 330 | } | |
333 | 331 | } | |
334 | 332 | ||
335 | 333 | ||
336 | 334 | ||
337 | 335 | @Callable(inv) | |
338 | 336 | func setMinStake (RSCx100000) = if (if ((inv.callerPublicKey != ownerPubKey)) | |
339 | 337 | then (inv.callerPublicKey != managerPubKey) | |
340 | 338 | else false) | |
341 | 339 | then throw("Only an administrator can set and modify minStake!") | |
342 | 340 | else if (isDefined(inv.payment)) | |
343 | 341 | then throw("Please do not attach payment when setting up minStake.") | |
344 | - | else { | |
345 | - | let dapp = toBase58String(this.bytes) | |
346 | - | if (isDefined(getString(this, (dapp + "_address")))) | |
347 | - | then WriteSet([DataEntry((dapp + "_starttime"), RSCx100000), DataEntry((dapp + "_updatetime"), lastBlockTime)]) | |
348 | - | else WriteSet([DataEntry((dapp + "_address"), dapp), DataEntry((dapp + "_balance"), 0), DataEntry((dapp + "_starttime"), RSCx100000), DataEntry((dapp + "_status"), false), DataEntry((dapp + "_updatetime"), lastBlockTime)]) | |
349 | - | } | |
342 | + | else if ((0 > RSCx100000)) | |
343 | + | then throw("Negative values are not allowed. Zero to block all deposits...") | |
344 | + | else { | |
345 | + | let dapp = toBase58String(this.bytes) | |
346 | + | if (isDefined(getString(this, (dapp + "_address")))) | |
347 | + | then WriteSet([DataEntry((dapp + "_starttime"), RSCx100000), DataEntry((dapp + "_updatetime"), lastBlockTime)]) | |
348 | + | else WriteSet([DataEntry((dapp + "_address"), dapp), DataEntry((dapp + "_balance"), 0), DataEntry((dapp + "_starttime"), RSCx100000), DataEntry((dapp + "_status"), false), DataEntry((dapp + "_updatetime"), lastBlockTime)]) | |
349 | + | } | |
350 | 350 | ||
351 | 351 | ||
352 | 352 | ||
353 | 353 | @Callable(inv) | |
354 | 354 | func sendRewards (addr0,amount0,addr1,amount1,addr2,amount2,addr3,amount3,addr4,amount4,addr5,amount5,addr6,amount6,addr7,amount7,addr8,amount8,addr9,amount9) = if (if ((inv.callerPublicKey != ownerPubKey)) | |
355 | 355 | then (inv.callerPublicKey != managerPubKey) | |
356 | 356 | else false) | |
357 | 357 | then throw("Only administrator can send rewards to customers!") | |
358 | 358 | else if ((payoutOpenTime > lastBlockTime)) | |
359 | 359 | then throw((("The time to send rewards has not yet come! Beginning at " + toDateTimeString(payoutOpenTime)) + ". Please wait...")) | |
360 | 360 | else { | |
361 | 361 | let dapp = toBase58String(this.bytes) | |
362 | 362 | let sumTotal = getIntegerValue(this, (dapp + "_balance")) | |
363 | 363 | let available = (assetBalance(this, myAssetId) - sumTotal) | |
364 | 364 | let rewards = (((((((((amount0 + amount1) + amount2) + amount3) + amount4) + amount5) + amount6) + amount7) + amount8) + amount9) | |
365 | 365 | let effBalance = if (!(isDefined(inv.payment))) | |
366 | 366 | then available | |
367 | 367 | else { | |
368 | 368 | let attPayment = extract(inv.payment) | |
369 | 369 | if ((attPayment.assetId != myAssetId)) | |
370 | 370 | then throw((("Only " + assetName) + " is allowed to deposit.")) | |
371 | 371 | else (available + attPayment.amount) | |
372 | 372 | } | |
373 | 373 | if ((0 >= rewards)) | |
374 | 374 | then throw("Zero or negative rewards are not allowed.") | |
375 | 375 | else if ((rewards > effBalance)) | |
376 | 376 | then throw((((("Insufficient effective balance! The required amount is " + toFloatString((rewards - effBalance), decMult)) + " ") + assetName) + ".")) | |
377 | 377 | else { | |
378 | - | let data9 = if (if ((addr9 == "-")) | |
379 | - | then (amount9 == 0) | |
378 | + | let data9 = if (if ((amount9 == 0)) | |
379 | + | then if (if ((addr9 == "")) | |
380 | + | then true | |
381 | + | else (addr9 == "-")) | |
382 | + | then true | |
383 | + | else (addr9 == "n/a") | |
380 | 384 | else false) | |
381 | 385 | then nil | |
382 | 386 | else if (!(getBooleanValue(this, (addr9 + "_status")))) | |
383 | 387 | then throw("The status of address #9 is inactive!") | |
384 | 388 | else if ((0 >= amount9)) | |
385 | 389 | then throw("Zero or negative amounts are not allowed.") | |
386 | 390 | else { | |
387 | 391 | let newBalance = (getIntegerValue(this, (addr9 + "_balance")) + amount9) | |
388 | 392 | if ((newBalance > maxBalance)) | |
389 | 393 | then throw("Deposit of address #9 will be overfilled!") | |
390 | 394 | else [DataEntry((addr9 + "_balance"), newBalance), DataEntry((addr9 + "_starttime"), frameCloseTime)] | |
391 | 395 | } | |
392 | - | let data8 = if (if ((addr8 == "-")) | |
393 | - | then (amount8 == 0) | |
396 | + | let data8 = if (if ((amount8 == 0)) | |
397 | + | then if (if ((addr8 == "")) | |
398 | + | then true | |
399 | + | else (addr8 == "-")) | |
400 | + | then true | |
401 | + | else (addr8 == "n/a") | |
394 | 402 | else false) | |
395 | 403 | then data9 | |
396 | 404 | else if (!(getBooleanValue(this, (addr8 + "_status")))) | |
397 | 405 | then throw("The status of address #8 is inactive!") | |
398 | 406 | else if ((0 >= amount8)) | |
399 | 407 | then throw("Zero or negative amounts are not allowed.") | |
400 | 408 | else { | |
401 | 409 | let newBalance = (getIntegerValue(this, (addr8 + "_balance")) + amount8) | |
402 | 410 | if ((newBalance > maxBalance)) | |
403 | 411 | then throw("Deposit of address #8 will be overfilled!") | |
404 | 412 | else [DataEntry((addr8 + "_balance"), newBalance), DataEntry((addr8 + "_starttime"), frameCloseTime)] :: data9 | |
405 | 413 | } | |
406 | - | let data7 = if (if ((addr7 == "-")) | |
407 | - | then (amount7 == 0) | |
414 | + | let data7 = if (if ((amount7 == 0)) | |
415 | + | then if (if ((addr7 == "")) | |
416 | + | then true | |
417 | + | else (addr7 == "-")) | |
418 | + | then true | |
419 | + | else (addr7 == "n/a") | |
408 | 420 | else false) | |
409 | 421 | then data8 | |
410 | 422 | else if (!(getBooleanValue(this, (addr7 + "_status")))) | |
411 | 423 | then throw("The status of address #7 is inactive!") | |
412 | 424 | else if ((0 >= amount7)) | |
413 | 425 | then throw("Zero or negative amounts are not allowed.") | |
414 | 426 | else { | |
415 | 427 | let newBalance = (getIntegerValue(this, (addr7 + "_balance")) + amount7) | |
416 | 428 | if ((newBalance > maxBalance)) | |
417 | 429 | then throw("Deposit of address #7 will be overfilled!") | |
418 | 430 | else [DataEntry((addr7 + "_balance"), newBalance), DataEntry((addr7 + "_starttime"), frameCloseTime)] :: data8 | |
419 | 431 | } | |
420 | - | let data6 = if (if ((addr6 == "-")) | |
421 | - | then (amount6 == 0) | |
432 | + | let data6 = if (if ((amount6 == 0)) | |
433 | + | then if (if ((addr6 == "")) | |
434 | + | then true | |
435 | + | else (addr6 == "-")) | |
436 | + | then true | |
437 | + | else (addr6 == "n/a") | |
422 | 438 | else false) | |
423 | 439 | then data7 | |
424 | 440 | else if (!(getBooleanValue(this, (addr6 + "_status")))) | |
425 | 441 | then throw("The status of address #6 is inactive!") | |
426 | 442 | else if ((0 >= amount6)) | |
427 | 443 | then throw("Zero or negative amounts are not allowed.") | |
428 | 444 | else { | |
429 | 445 | let newBalance = (getIntegerValue(this, (addr6 + "_balance")) + amount6) | |
430 | 446 | if ((newBalance > maxBalance)) | |
431 | 447 | then throw("Deposit of address #6 will be overfilled!") | |
432 | 448 | else [DataEntry((addr6 + "_balance"), newBalance), DataEntry((addr6 + "_starttime"), frameCloseTime)] :: data7 | |
433 | 449 | } | |
434 | - | let data5 = if (if ((addr5 == "-")) | |
435 | - | then (amount5 == 0) | |
450 | + | let data5 = if (if ((amount5 == 0)) | |
451 | + | then if (if ((addr5 == "")) | |
452 | + | then true | |
453 | + | else (addr5 == "-")) | |
454 | + | then true | |
455 | + | else (addr5 == "n/a") | |
436 | 456 | else false) | |
437 | 457 | then data6 | |
438 | 458 | else if (!(getBooleanValue(this, (addr5 + "_status")))) | |
439 | 459 | then throw("The status of address #5 is inactive!") | |
440 | 460 | else if ((0 >= amount5)) | |
441 | 461 | then throw("Zero or negative amounts are not allowed.") | |
442 | 462 | else { | |
443 | 463 | let newBalance = (getIntegerValue(this, (addr5 + "_balance")) + amount5) | |
444 | 464 | if ((newBalance > maxBalance)) | |
445 | 465 | then throw("Deposit of address #5 will be overfilled!") | |
446 | 466 | else [DataEntry((addr5 + "_balance"), newBalance), DataEntry((addr5 + "_starttime"), frameCloseTime)] :: data6 | |
447 | 467 | } | |
448 | - | let data4 = if (if ((addr4 == "-")) | |
449 | - | then (amount4 == 0) | |
468 | + | let data4 = if (if ((amount4 == 0)) | |
469 | + | then if (if ((addr4 == "")) | |
470 | + | then true | |
471 | + | else (addr4 == "-")) | |
472 | + | then true | |
473 | + | else (addr4 == "n/a") | |
450 | 474 | else false) | |
451 | 475 | then data5 | |
452 | 476 | else if (!(getBooleanValue(this, (addr4 + "_status")))) | |
453 | 477 | then throw("The status of address #4 is inactive!") | |
454 | 478 | else if ((0 >= amount4)) | |
455 | 479 | then throw("Zero or negative amounts are not allowed.") | |
456 | 480 | else { | |
457 | 481 | let newBalance = (getIntegerValue(this, (addr4 + "_balance")) + amount4) | |
458 | 482 | if ((newBalance > maxBalance)) | |
459 | 483 | then throw("Deposit of address #4 will be overfilled!") | |
460 | 484 | else [DataEntry((addr4 + "_balance"), newBalance), DataEntry((addr4 + "_starttime"), frameCloseTime)] :: data5 | |
461 | 485 | } | |
462 | - | let data3 = if (if ((addr3 == "-")) | |
463 | - | then (amount3 == 0) | |
486 | + | let data3 = if (if ((amount3 == 0)) | |
487 | + | then if (if ((addr3 == "")) | |
488 | + | then true | |
489 | + | else (addr3 == "-")) | |
490 | + | then true | |
491 | + | else (addr3 == "n/a") | |
464 | 492 | else false) | |
465 | 493 | then data4 | |
466 | 494 | else if (!(getBooleanValue(this, (addr3 + "_status")))) | |
467 | 495 | then throw("The status of address #3 is inactive!") | |
468 | 496 | else if ((0 >= amount3)) | |
469 | 497 | then throw("Zero or negative amounts are not allowed.") | |
470 | 498 | else { | |
471 | 499 | let newBalance = (getIntegerValue(this, (addr3 + "_balance")) + amount3) | |
472 | 500 | if ((newBalance > maxBalance)) | |
473 | 501 | then throw("Deposit of address #3 will be overfilled!") | |
474 | 502 | else [DataEntry((addr3 + "_balance"), newBalance), DataEntry((addr3 + "_starttime"), frameCloseTime)] :: data4 | |
475 | 503 | } | |
476 | - | let data2 = if (if ((addr2 == "-")) | |
477 | - | then (amount2 == 0) | |
504 | + | let data2 = if (if ((amount2 == 0)) | |
505 | + | then if (if ((addr2 == "")) | |
506 | + | then true | |
507 | + | else (addr2 == "-")) | |
508 | + | then true | |
509 | + | else (addr2 == "n/a") | |
478 | 510 | else false) | |
479 | 511 | then data3 | |
480 | 512 | else if (!(getBooleanValue(this, (addr2 + "_status")))) | |
481 | 513 | then throw("The status of address #2 is inactive!") | |
482 | 514 | else if ((0 >= amount2)) | |
483 | 515 | then throw("Zero or negative amounts are not allowed.") | |
484 | 516 | else { | |
485 | 517 | let newBalance = (getIntegerValue(this, (addr2 + "_balance")) + amount2) | |
486 | 518 | if ((newBalance > maxBalance)) | |
487 | 519 | then throw("Deposit of address #2 will be overfilled!") | |
488 | 520 | else [DataEntry((addr2 + "_balance"), newBalance), DataEntry((addr2 + "_starttime"), frameCloseTime)] :: data3 | |
489 | 521 | } | |
490 | - | let data1 = if (if ((addr1 == "-")) | |
491 | - | then (amount1 == 0) | |
522 | + | let data1 = if (if ((amount1 == 0)) | |
523 | + | then if (if ((addr1 == "")) | |
524 | + | then true | |
525 | + | else (addr1 == "-")) | |
526 | + | then true | |
527 | + | else (addr1 == "n/a") | |
492 | 528 | else false) | |
493 | 529 | then data2 | |
494 | 530 | else if (!(getBooleanValue(this, (addr1 + "_status")))) | |
495 | 531 | then throw("The status of address #1 is inactive!") | |
496 | 532 | else if ((0 >= amount1)) | |
497 | 533 | then throw("Zero or negative amounts are not allowed.") | |
498 | 534 | else { | |
499 | 535 | let newBalance = (getIntegerValue(this, (addr1 + "_balance")) + amount1) | |
500 | 536 | if ((newBalance > maxBalance)) | |
501 | 537 | then throw("Deposit of address #1 will be overfilled!") | |
502 | 538 | else [DataEntry((addr1 + "_balance"), newBalance), DataEntry((addr1 + "_starttime"), frameCloseTime)] :: data2 | |
503 | 539 | } | |
504 | - | let data0 = if (if ((addr0 == "-")) | |
505 | - | then (amount0 == 0) | |
540 | + | let data0 = if (if ((amount0 == 0)) | |
541 | + | then if (if ((addr0 == "")) | |
542 | + | then true | |
543 | + | else (addr0 == "-")) | |
544 | + | then true | |
545 | + | else (addr0 == "n/a") | |
506 | 546 | else false) | |
507 | 547 | then data1 | |
508 | 548 | else if (!(getBooleanValue(this, (addr0 + "_status")))) | |
509 | 549 | then throw("The status of address #0 is inactive!") | |
510 | 550 | else if ((0 >= amount0)) | |
511 | 551 | then throw("Zero or negative amounts are not allowed.") | |
512 | 552 | else { | |
513 | 553 | let newBalance = (getIntegerValue(this, (addr0 + "_balance")) + amount0) | |
514 | 554 | if ((newBalance > maxBalance)) | |
515 | 555 | then throw("Deposit of address #0 will be overfilled!") | |
516 | 556 | else [DataEntry((addr0 + "_balance"), newBalance), DataEntry((addr0 + "_starttime"), frameCloseTime)] :: data1 | |
517 | 557 | } | |
518 | 558 | WriteSet([DataEntry((dapp + "_balance"), (sumTotal + rewards)), DataEntry((dapp + "_updatetime"), lastBlockTime)] :: data0) | |
519 | 559 | } | |
520 | 560 | } | |
521 | 561 | ||
522 | 562 | ||
523 | 563 | @Verifier(tx) | |
524 | 564 | func verify () = match tx { | |
525 | - | case a: CreateAliasTransaction => | |
526 | - | sigVerify(a.bodyBytes, a.proofs[0], a.senderPublicKey) | |
527 | 565 | case t: TransferTransaction => | |
528 | 566 | if (if ((t.assetId != myAssetId)) | |
529 | 567 | then (t.feeAssetId != myAssetId) | |
530 | 568 | else false) | |
531 | - | then sigVerify( | |
569 | + | then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
532 | 570 | else false | |
533 | 571 | case s: SetScriptTransaction => | |
534 | - | if (sigVerify( | |
535 | - | then sigVerify( | |
572 | + | if (sigVerify(tx.bodyBytes, tx.proofs[2], ownerPubKey)) | |
573 | + | then sigVerify(tx.bodyBytes, tx.proofs[1], managerPubKey) | |
536 | 574 | else false | |
537 | 575 | case _ => | |
538 | 576 | false | |
539 | 577 | } | |
540 | 578 |
github/deemru/w8io/3ef1775 125.45 ms ◑