tx · AFkDDS2TKgm6wfCcuCB67Uw4RuCpHyRrXtZn95ReVrxb 3PA2w9i9GnbKR3HB7XTmwf3DnaFBFcDiP12: -0.01400000 Waves 2020.01.16 16:57 [1887252] smart account 3PA2w9i9GnbKR3HB7XTmwf3DnaFBFcDiP12 > SELF 0.00000000 Waves
{ "type": 13, "id": "AFkDDS2TKgm6wfCcuCB67Uw4RuCpHyRrXtZn95ReVrxb", "fee": 1400000, "feeAssetId": null, "timestamp": 1579182519549, "version": 1, "sender": "3PA2w9i9GnbKR3HB7XTmwf3DnaFBFcDiP12", "senderPublicKey": "5G9pgymdyBYGnWF3oahQXQNPnVaWEthMkeFRUzHjZ7mX", "proofs": [ "2KQkCNavuhes2zW2C1QHvDx51tmqc1UMw1Q7hAbTb3EG4ThMqEn1zhkjD9tJta35ghqt8pDFEnYPq6scFEKPpBbu", "4n4A3ft5QnZhj87GB6Y12GQ2gRHSrhZvZkxuErWEbg6tLaMhrDvmyFzxdtaP68joYBkCiUtkbFTEvpHxykqbfxsp", "exiKXbiKRZVpLpdUBYDbP9oxyzmq4m85eCpztSSz4FhDWos8DHLsJjxoE62B5xVBis1ZBJGFqLoHYQTEL13qiuS" ], "script": "base64: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", "chainId": 87, "height": 1887252, "spentComplexity": 0 } View: original | compacted Prev: 4Ugfn4vPfGJ8hp9zhRdV7DBkAd7DGHcV4rPhpMhTf4aH Next: Rd2dxg6GJ5gxw9PpWmn53Gr3VMcKuxP1juPx3jGZHJh Diff:
Old | New | Differences | |
---|---|---|---|
7 | 7 | ||
8 | 8 | let minBalance = (100 * decMult) | |
9 | 9 | ||
10 | - | let minLockTime = ( | |
10 | + | let minLockTime = (2629800 * 1000) | |
11 | 11 | ||
12 | 12 | let myAssetId = base58'EMdiF8uaySswfCdMxc114rSfzUsAKCtK9d8eSx6ruKP4' | |
13 | 13 | ||
16 | 16 | let managerPubKey = base58'EaKK5PAFUkgtnF7xcyABUzi8YBQADmUDnPzQBHjCTAKT' | |
17 | 17 | ||
18 | 18 | let lastBlockTime = value(lastBlock.timestamp) | |
19 | + | ||
20 | + | let frameStartTime = ((lastBlockTime / minLockTime) * minLockTime) | |
19 | 21 | ||
20 | 22 | @Callable(i) | |
21 | 23 | func deposit () = { | |
41 | 43 | case _ => | |
42 | 44 | 0 | |
43 | 45 | } | |
44 | - | let startTime = if (!(isActive)) | |
46 | + | let newBalance = (balance + amount) | |
47 | + | let newStartTime = if ((minBalance > newBalance)) | |
45 | 48 | then 0 | |
46 | - | else match getInteger(this, (client + "_starttime")) { | |
47 | - | case x: Int => | |
48 | - | x | |
49 | - | case _ => | |
50 | - | 0 | |
51 | - | } | |
52 | - | let newBalance = (balance + amount) | |
53 | - | let newStartTime = (fraction(startTime, balance, newBalance) + fraction(lastBlockTime, amount, newBalance)) | |
49 | + | else if ((minBalance > balance)) | |
50 | + | then lastBlockTime | |
51 | + | else { | |
52 | + | let updateTime = match getInteger(this, (client + "_updatetime")) { | |
53 | + | case x: Int => | |
54 | + | x | |
55 | + | case _ => | |
56 | + | 0 | |
57 | + | } | |
58 | + | let startTime = if ((frameStartTime > updateTime)) | |
59 | + | then frameStartTime | |
60 | + | else match getInteger(this, (client + "_starttime")) { | |
61 | + | case x: Int => | |
62 | + | x | |
63 | + | case _ => | |
64 | + | 0 | |
65 | + | } | |
66 | + | (fraction(startTime, balance, newBalance) + fraction(lastBlockTime, amount, newBalance)) | |
67 | + | } | |
54 | 68 | if (isActive) | |
55 | 69 | then WriteSet([DataEntry((client + "_balance"), newBalance), DataEntry((client + "_starttime"), newStartTime), DataEntry((client + "_updatetime"), lastBlockTime)]) | |
56 | 70 | else { | |
80 | 94 | case _ => | |
81 | 95 | false | |
82 | 96 | } | |
83 | - | let balance = match getInteger(this, (client + "_balance")) { | |
97 | + | let balance = if (!(isActive)) | |
98 | + | then 0 | |
99 | + | else match getInteger(this, (client + "_balance")) { | |
100 | + | case x: Int => | |
101 | + | x | |
102 | + | case _ => | |
103 | + | 0 | |
104 | + | } | |
105 | + | let lockTime = match getInteger(this, (client + "_updatetime")) { | |
84 | 106 | case x: Int => | |
85 | - | x | |
107 | + | (x + minLockTime) | |
86 | 108 | case _ => | |
87 | 109 | 0 | |
88 | 110 | } | |
89 | - | let updateTime = match getInteger(this, (client + "_updatetime")) { | |
90 | - | case x: Int => | |
91 | - | x | |
92 | - | case _ => | |
93 | - | 0 | |
94 | - | } | |
95 | - | let lockTime = (updateTime + minLockTime) | |
96 | - | let actBalance = if (!(isActive)) | |
97 | - | then 0 | |
98 | - | else balance | |
99 | 111 | let amount = if ((RSCx100000 == 0)) | |
100 | - | then | |
112 | + | then balance | |
101 | 113 | else RSCx100000 | |
102 | - | if (if (( | |
103 | - | then ( | |
114 | + | if (if ((balance >= minBalance)) | |
115 | + | then (lockTime >= lastBlockTime) | |
104 | 116 | else false) | |
105 | 117 | then throw((("Unable to withdraw coins! Account is locked for up to " + toString((lockTime / 1000))) + " Unix timestamp...")) | |
106 | 118 | else if ((0 >= amount)) | |
107 | 119 | then throw("Unable to withdraw zero or negative amount!") | |
108 | - | else if ((amount > | |
109 | - | then throw(((((("Unable to withdraw more than on the balance: " + toString( | |
110 | - | else if (( | |
111 | - | then ScriptResult(WriteSet([DataEntry((client + "_status"), false), DataEntry((client + "_updatetime"), lastBlockTime)]), TransferSet([ScriptTransfer(i.caller, amount, myAssetId)])) | |
120 | + | else if ((amount > balance)) | |
121 | + | then throw((((((("Unable to withdraw more than on the balance: " + toString(balance)) + " / 10^") + toString((size(toString(decMult)) - 1))) + " ") + myAssetName) + ".")) | |
122 | + | else if ((balance == amount)) | |
123 | + | then ScriptResult(WriteSet([DataEntry((client + "_starttime"), frameStartTime), DataEntry((client + "_status"), false), DataEntry((client + "_updatetime"), lastBlockTime)]), TransferSet([ScriptTransfer(i.caller, amount, myAssetId)])) | |
112 | 124 | else { | |
113 | - | let startTime = match getInteger(this, (client + "_starttime")) { | |
114 | - | case x: Int => | |
115 | - | x | |
116 | - | case _ => | |
117 | - | 0 | |
118 | - | } | |
119 | 125 | let newBalance = (balance - amount) | |
120 | - | let newStartTime = (fraction(startTime, balance, newBalance) - fraction(lastBlockTime, amount, newBalance)) | |
126 | + | let newStartTime = if ((minBalance > balance)) | |
127 | + | then 0 | |
128 | + | else (fraction(frameStartTime, balance, newBalance) - fraction(lastBlockTime, amount, newBalance)) | |
121 | 129 | ScriptResult(WriteSet([DataEntry((client + "_balance"), newBalance), DataEntry((client + "_starttime"), newStartTime), DataEntry((client + "_updatetime"), lastBlockTime)]), TransferSet([ScriptTransfer(i.caller, amount, myAssetId)])) | |
122 | 130 | } | |
123 | 131 | } |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 3 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let decMult = 100000 | |
5 | 5 | ||
6 | 6 | let myAssetName = "RusCoin" | |
7 | 7 | ||
8 | 8 | let minBalance = (100 * decMult) | |
9 | 9 | ||
10 | - | let minLockTime = ( | |
10 | + | let minLockTime = (2629800 * 1000) | |
11 | 11 | ||
12 | 12 | let myAssetId = base58'EMdiF8uaySswfCdMxc114rSfzUsAKCtK9d8eSx6ruKP4' | |
13 | 13 | ||
14 | 14 | let ownerPubKey = base58'2in4yGNBKfitQbXbsHmL2unWrUnRo7GWyqcZXsmAzhQi' | |
15 | 15 | ||
16 | 16 | let managerPubKey = base58'EaKK5PAFUkgtnF7xcyABUzi8YBQADmUDnPzQBHjCTAKT' | |
17 | 17 | ||
18 | 18 | let lastBlockTime = value(lastBlock.timestamp) | |
19 | + | ||
20 | + | let frameStartTime = ((lastBlockTime / minLockTime) * minLockTime) | |
19 | 21 | ||
20 | 22 | @Callable(i) | |
21 | 23 | func deposit () = { | |
22 | 24 | let p = if (isDefined(i.payment)) | |
23 | 25 | then extract(i.payment) | |
24 | 26 | else throw((("Missing " + myAssetName) + " attached payment!")) | |
25 | 27 | if ((p.assetId != myAssetId)) | |
26 | 28 | then throw((("Only " + myAssetName) + " is allowed to deposit!")) | |
27 | 29 | else { | |
28 | 30 | let amount = value(p.amount) | |
29 | 31 | let client = toBase58String(i.caller.bytes) | |
30 | 32 | let isActive = match getBoolean(this, (client + "_status")) { | |
31 | 33 | case x: Boolean => | |
32 | 34 | x | |
33 | 35 | case _ => | |
34 | 36 | false | |
35 | 37 | } | |
36 | 38 | let balance = if (!(isActive)) | |
37 | 39 | then 0 | |
38 | 40 | else match getInteger(this, (client + "_balance")) { | |
39 | 41 | case x: Int => | |
40 | 42 | x | |
41 | 43 | case _ => | |
42 | 44 | 0 | |
43 | 45 | } | |
44 | - | let startTime = if (!(isActive)) | |
46 | + | let newBalance = (balance + amount) | |
47 | + | let newStartTime = if ((minBalance > newBalance)) | |
45 | 48 | then 0 | |
46 | - | else match getInteger(this, (client + "_starttime")) { | |
47 | - | case x: Int => | |
48 | - | x | |
49 | - | case _ => | |
50 | - | 0 | |
51 | - | } | |
52 | - | let newBalance = (balance + amount) | |
53 | - | let newStartTime = (fraction(startTime, balance, newBalance) + fraction(lastBlockTime, amount, newBalance)) | |
49 | + | else if ((minBalance > balance)) | |
50 | + | then lastBlockTime | |
51 | + | else { | |
52 | + | let updateTime = match getInteger(this, (client + "_updatetime")) { | |
53 | + | case x: Int => | |
54 | + | x | |
55 | + | case _ => | |
56 | + | 0 | |
57 | + | } | |
58 | + | let startTime = if ((frameStartTime > updateTime)) | |
59 | + | then frameStartTime | |
60 | + | else match getInteger(this, (client + "_starttime")) { | |
61 | + | case x: Int => | |
62 | + | x | |
63 | + | case _ => | |
64 | + | 0 | |
65 | + | } | |
66 | + | (fraction(startTime, balance, newBalance) + fraction(lastBlockTime, amount, newBalance)) | |
67 | + | } | |
54 | 68 | if (isActive) | |
55 | 69 | then WriteSet([DataEntry((client + "_balance"), newBalance), DataEntry((client + "_starttime"), newStartTime), DataEntry((client + "_updatetime"), lastBlockTime)]) | |
56 | 70 | else { | |
57 | 71 | let isClient = match getString(this, (client + "_address")) { | |
58 | 72 | case x: String => | |
59 | 73 | true | |
60 | 74 | case _ => | |
61 | 75 | false | |
62 | 76 | } | |
63 | 77 | if (isClient) | |
64 | 78 | then WriteSet([DataEntry((client + "_balance"), newBalance), DataEntry((client + "_starttime"), newStartTime), DataEntry((client + "_status"), true), DataEntry((client + "_updatetime"), lastBlockTime)]) | |
65 | 79 | else WriteSet([DataEntry((client + "_address"), client), DataEntry((client + "_balance"), newBalance), DataEntry((client + "_starttime"), newStartTime), DataEntry((client + "_status"), true), DataEntry((client + "_updatetime"), lastBlockTime)]) | |
66 | 80 | } | |
67 | 81 | } | |
68 | 82 | } | |
69 | 83 | ||
70 | 84 | ||
71 | 85 | ||
72 | 86 | @Callable(i) | |
73 | 87 | func withdraw (RSCx100000) = if (isDefined(i.payment)) | |
74 | 88 | then throw("Don't attach payment when withdrawing!") | |
75 | 89 | else { | |
76 | 90 | let client = toBase58String(i.caller.bytes) | |
77 | 91 | let isActive = match getBoolean(this, (client + "_status")) { | |
78 | 92 | case x: Boolean => | |
79 | 93 | x | |
80 | 94 | case _ => | |
81 | 95 | false | |
82 | 96 | } | |
83 | - | let balance = match getInteger(this, (client + "_balance")) { | |
97 | + | let balance = if (!(isActive)) | |
98 | + | then 0 | |
99 | + | else match getInteger(this, (client + "_balance")) { | |
100 | + | case x: Int => | |
101 | + | x | |
102 | + | case _ => | |
103 | + | 0 | |
104 | + | } | |
105 | + | let lockTime = match getInteger(this, (client + "_updatetime")) { | |
84 | 106 | case x: Int => | |
85 | - | x | |
107 | + | (x + minLockTime) | |
86 | 108 | case _ => | |
87 | 109 | 0 | |
88 | 110 | } | |
89 | - | let updateTime = match getInteger(this, (client + "_updatetime")) { | |
90 | - | case x: Int => | |
91 | - | x | |
92 | - | case _ => | |
93 | - | 0 | |
94 | - | } | |
95 | - | let lockTime = (updateTime + minLockTime) | |
96 | - | let actBalance = if (!(isActive)) | |
97 | - | then 0 | |
98 | - | else balance | |
99 | 111 | let amount = if ((RSCx100000 == 0)) | |
100 | - | then | |
112 | + | then balance | |
101 | 113 | else RSCx100000 | |
102 | - | if (if (( | |
103 | - | then ( | |
114 | + | if (if ((balance >= minBalance)) | |
115 | + | then (lockTime >= lastBlockTime) | |
104 | 116 | else false) | |
105 | 117 | then throw((("Unable to withdraw coins! Account is locked for up to " + toString((lockTime / 1000))) + " Unix timestamp...")) | |
106 | 118 | else if ((0 >= amount)) | |
107 | 119 | then throw("Unable to withdraw zero or negative amount!") | |
108 | - | else if ((amount > | |
109 | - | then throw(((((("Unable to withdraw more than on the balance: " + toString( | |
110 | - | else if (( | |
111 | - | then ScriptResult(WriteSet([DataEntry((client + "_status"), false), DataEntry((client + "_updatetime"), lastBlockTime)]), TransferSet([ScriptTransfer(i.caller, amount, myAssetId)])) | |
120 | + | else if ((amount > balance)) | |
121 | + | then throw((((((("Unable to withdraw more than on the balance: " + toString(balance)) + " / 10^") + toString((size(toString(decMult)) - 1))) + " ") + myAssetName) + ".")) | |
122 | + | else if ((balance == amount)) | |
123 | + | then ScriptResult(WriteSet([DataEntry((client + "_starttime"), frameStartTime), DataEntry((client + "_status"), false), DataEntry((client + "_updatetime"), lastBlockTime)]), TransferSet([ScriptTransfer(i.caller, amount, myAssetId)])) | |
112 | 124 | else { | |
113 | - | let startTime = match getInteger(this, (client + "_starttime")) { | |
114 | - | case x: Int => | |
115 | - | x | |
116 | - | case _ => | |
117 | - | 0 | |
118 | - | } | |
119 | 125 | let newBalance = (balance - amount) | |
120 | - | let newStartTime = (fraction(startTime, balance, newBalance) - fraction(lastBlockTime, amount, newBalance)) | |
126 | + | let newStartTime = if ((minBalance > balance)) | |
127 | + | then 0 | |
128 | + | else (fraction(frameStartTime, balance, newBalance) - fraction(lastBlockTime, amount, newBalance)) | |
121 | 129 | ScriptResult(WriteSet([DataEntry((client + "_balance"), newBalance), DataEntry((client + "_starttime"), newStartTime), DataEntry((client + "_updatetime"), lastBlockTime)]), TransferSet([ScriptTransfer(i.caller, amount, myAssetId)])) | |
122 | 130 | } | |
123 | 131 | } | |
124 | 132 | ||
125 | 133 | ||
126 | 134 | @Verifier(tx) | |
127 | 135 | func verify () = if (if (sigVerify(tx.bodyBytes, tx.proofs[2], ownerPubKey)) | |
128 | 136 | then sigVerify(tx.bodyBytes, tx.proofs[1], managerPubKey) | |
129 | 137 | else false) | |
130 | 138 | then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
131 | 139 | else false | |
132 | 140 |
github/deemru/w8io/3ef1775 75.65 ms ◑