tx · Rd2dxg6GJ5gxw9PpWmn53Gr3VMcKuxP1juPx3jGZHJh

3PA2w9i9GnbKR3HB7XTmwf3DnaFBFcDiP12:  -0.01400000 Waves

2020.01.22 06:15 [1895408] smart account 3PA2w9i9GnbKR3HB7XTmwf3DnaFBFcDiP12 > SELF 0.00000000 Waves

{ "type": 13, "id": "Rd2dxg6GJ5gxw9PpWmn53Gr3VMcKuxP1juPx3jGZHJh", "fee": 1400000, "feeAssetId": null, "timestamp": 1579661475070, "version": 1, "sender": "3PA2w9i9GnbKR3HB7XTmwf3DnaFBFcDiP12", "senderPublicKey": "5G9pgymdyBYGnWF3oahQXQNPnVaWEthMkeFRUzHjZ7mX", "proofs": [ "4PeiVo3siFyZ2PgLawiCkzyZ9Vvoe4CQyJUcnxaFnyeVdikcnR3HshpeCBSVVZ84gTrzqFUdJR6mqcpmKdbtChpN", "949e4XqGvhrkWdD9HWQBXQmTPno97wUBn5vcDS2qEceaMNfZ5i7Fp5tsJ73F1CbHPgLqGavMkowuBFnoYQVy598", "2KXu7J6L9ui6k99c3GUibbg8DecJCa2R1N4zmNnj8SQmZ1phzWwd1c3Qpwj4U3YyMSh9GHxHh48DpqLQZPgDTr9b" ], "script": "base64:AAIDAAAAAAAAAA4IARIAEgMKAQESAwoBAQAAAAwAAAAACWFzc2V0TmFtZQIAAAAHUnVzQ29pbgAAAAAHZGVjTXVsdAAAAAAAAAGGoAAAAAAKbG9ja1BlcmlvZAkAAGgAAAACAAAAAAAAKCCoAAAAAAAAAAPoAAAAAAptaW5CYWxhbmNlCQAAaAAAAAIAAAAAAAAAAAEFAAAAB2RlY011bHQAAAAACm1heEJhbGFuY2UJAABoAAAAAgAAAAAAAA9CQAUAAAAHZGVjTXVsdAAAAAAHcHJvdGVjdAUAAAAKbWluQmFsYW5jZQAAAAAJbXlBc3NldElkAQAAACDGcQ47hv7axTPQZZhvofTVQAGfvbf87qkFU76nO/l3FwAAAAALb3duZXJQdWJLZXkBAAAAIBmPdYtQSU3rSuq9j0PlAHRzCaduj+Mn0QqEe7bsOoR3AAAAAA1tYW5hZ2VyUHViS2V5AQAAACDJsM1B9/RlDuG4HIiBzCbhMPVvrk50MxJ3Ud0JPJuMcgAAAAANbGFzdEJsb2NrVGltZQkBAAAAB2V4dHJhY3QAAAABCAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAAAAAAOZnJhbWVTdGFydFRpbWUJAABoAAAAAgkAAGkAAAACBQAAAA1sYXN0QmxvY2tUaW1lBQAAAApsb2NrUGVyaW9kBQAAAApsb2NrUGVyaW9kAQAAAA10b0Zsb2F0U3RyaW5nAAAAAgAAAANudW0AAAAEbXVsdAoBAAAACHNlcGFyYXRlAAAAAgAAAANhY2MAAAADdmFsAwMJAAAAAAAAAgUAAAADYWNjAgAAAAAJAAAAAAAAAgUAAAADdmFsAAAAAAAAAAAABwIAAAAAAwkAAAAAAAACBQAAAANhY2MCAAAAAAkAAaQAAAABBQAAAAN2YWwJAAEsAAAAAgkAASwAAAACBQAAAANhY2MCAAAAASwJAQAAAAl0YWtlUmlnaHQAAAACCQABpAAAAAEJAABkAAAAAgUAAAADdmFsAAAAAAAAAAPoAAAAAAAAAAADBAAAAAJpcAkAAGkAAAACBQAAAANudW0FAAAABG11bHQEAAAAAmZwCQAAagAAAAIFAAAAA251bQUAAAAEbXVsdAQAAAACcTAJAABpAAAAAgUAAAACaXAJAABoAAAAAgkAAGgAAAACCQAAaAAAAAIJAABoAAAAAgkAAGgAAAACAAAAAAAAAAPoAAAAAAAAAAPoAAAAAAAAAAPoAAAAAAAAAAPoAAAAAAAAAAPoAAAAAAAAAAPoBAAAAAJyMAkAAGoAAAACBQAAAAJpcAkAAGgAAAACCQAAaAAAAAIJAABoAAAAAgkAAGgAAAACCQAAaAAAAAIAAAAAAAAAA+gAAAAAAAAAA+gAAAAAAAAAA+gAAAAAAAAAA+gAAAAAAAAAA+gAAAAAAAAAA+gEAAAAAnExCQAAaQAAAAIFAAAAAnIwCQAAaAAAAAIJAABoAAAAAgkAAGgAAAACCQAAaAAAAAIAAAAAAAAAA+gAAAAAAAAAA+gAAAAAAAAAA+gAAAAAAAAAA+gAAAAAAAAAA+gEAAAAAnIxCQAAagAAAAIFAAAAAnIwCQAAaAAAAAIJAABoAAAAAgkAAGgAAAACCQAAaAAAAAIAAAAAAAAAA+gAAAAAAAAAA+gAAAAAAAAAA+gAAAAAAAAAA+gAAAAAAAAAA+gEAAAAAnEyCQAAaQAAAAIFAAAAAnIxCQAAaAAAAAIJAABoAAAAAgkAAGgAAAACAAAAAAAAAAPoAAAAAAAAAAPoAAAAAAAAAAPoAAAAAAAAAAPoBAAAAAJyMgkAAGoAAAACBQAAAAJyMQkAAGgAAAACCQAAaAAAAAIJAABoAAAAAgAAAAAAAAAD6AAAAAAAAAAD6AAAAAAAAAAD6AAAAAAAAAAD6AQAAAACcTMJAABpAAAAAgUAAAACcjIJAABoAAAAAgkAAGgAAAACAAAAAAAAAAPoAAAAAAAAAAPoAAAAAAAAAAPoBAAAAAJyMwkAAGoAAAACBQAAAAJyMgkAAGgAAAACCQAAaAAAAAIAAAAAAAAAA+gAAAAAAAAAA+gAAAAAAAAAA+gEAAAAAnE0CQAAaQAAAAIFAAAAAnIzCQAAaAAAAAIAAAAAAAAAA+gAAAAAAAAAA+gEAAAAAnI0CQAAagAAAAIFAAAAAnIzCQAAaAAAAAIAAAAAAAAAA+gAAAAAAAAAA+gEAAAAAnE1CQAAaQAAAAIFAAAAAnI0AAAAAAAAAAPoBAAAAAJyNQkAAGoAAAACBQAAAAJyNAAAAAAAAAAD6AkAASwAAAACBAAAAA0kbGlzdDMxOTYzMjQ3CQAETAAAAAIFAAAAAnEwCQAETAAAAAIFAAAAAnExCQAETAAAAAIF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", "chainId": 87, "height": 1895408, "spentComplexity": 0 } View: original | compacted Prev: AFkDDS2TKgm6wfCcuCB67Uw4RuCpHyRrXtZn95ReVrxb Next: 2MDRLv41AwXBD583Pg1Xy5xWnWbcxWnrzDXJvRpSkE8v Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let assetName = "RusCoin"
5+
46 let decMult = 100000
57
6-let myAssetName = "RusCoin"
8+let lockPeriod = (2629800 * 1000)
79
8-let minBalance = (100 * decMult)
10+let minBalance = (1 * decMult)
911
10-let minLockTime = (2629800 * 1000)
12+let maxBalance = (1000000 * decMult)
13+
14+let protect = minBalance
1115
1216 let myAssetId = base58'EMdiF8uaySswfCdMxc114rSfzUsAKCtK9d8eSx6ruKP4'
1317
1519
1620 let managerPubKey = base58'EaKK5PAFUkgtnF7xcyABUzi8YBQADmUDnPzQBHjCTAKT'
1721
18-let lastBlockTime = value(lastBlock.timestamp)
22+let lastBlockTime = extract(lastBlock.timestamp)
1923
20-let frameStartTime = ((lastBlockTime / minLockTime) * minLockTime)
24+let frameStartTime = ((lastBlockTime / lockPeriod) * lockPeriod)
2125
22-@Callable(i)
26+func toFloatString (num,mult) = {
27+ func separate (acc,val) = if (if ((acc == ""))
28+ then (val == 0)
29+ else false)
30+ then ""
31+ else if ((acc == ""))
32+ then toString(val)
33+ else ((acc + ",") + takeRight(toString((val + 1000)), 3))
34+
35+ let ip = (num / mult)
36+ let fp = (num % mult)
37+ let q0 = (ip / (((((1000 * 1000) * 1000) * 1000) * 1000) * 1000))
38+ let r0 = (ip % (((((1000 * 1000) * 1000) * 1000) * 1000) * 1000))
39+ let q1 = (r0 / ((((1000 * 1000) * 1000) * 1000) * 1000))
40+ let r1 = (r0 % ((((1000 * 1000) * 1000) * 1000) * 1000))
41+ let q2 = (r1 / (((1000 * 1000) * 1000) * 1000))
42+ let r2 = (r1 % (((1000 * 1000) * 1000) * 1000))
43+ let q3 = (r2 / ((1000 * 1000) * 1000))
44+ let r3 = (r2 % ((1000 * 1000) * 1000))
45+ let q4 = (r3 / (1000 * 1000))
46+ let r4 = (r3 % (1000 * 1000))
47+ let q5 = (r4 / 1000)
48+ let r5 = (r4 % 1000)
49+ ({
50+ let $list31963247 = [q0, q1, q2, q3, q4, q5, r5]
51+ let $size31963247 = size($list31963247)
52+ let $acc031963247 = ""
53+ if (($size31963247 == 0))
54+ then $acc031963247
55+ else {
56+ let $acc131963247 = separate($acc031963247, $list31963247[0])
57+ if (($size31963247 == 1))
58+ then $acc131963247
59+ else {
60+ let $acc231963247 = separate($acc131963247, $list31963247[1])
61+ if (($size31963247 == 2))
62+ then $acc231963247
63+ else {
64+ let $acc331963247 = separate($acc231963247, $list31963247[2])
65+ if (($size31963247 == 3))
66+ then $acc331963247
67+ else {
68+ let $acc431963247 = separate($acc331963247, $list31963247[3])
69+ if (($size31963247 == 4))
70+ then $acc431963247
71+ else {
72+ let $acc531963247 = separate($acc431963247, $list31963247[4])
73+ if (($size31963247 == 5))
74+ then $acc531963247
75+ else {
76+ let $acc631963247 = separate($acc531963247, $list31963247[5])
77+ if (($size31963247 == 6))
78+ then $acc631963247
79+ else {
80+ let $acc731963247 = separate($acc631963247, $list31963247[6])
81+ if (($size31963247 == 7))
82+ then $acc731963247
83+ else {
84+ let $acc831963247 = separate($acc731963247, $list31963247[7])
85+ throw("List size exceed 7")
86+ }
87+ }
88+ }
89+ }
90+ }
91+ }
92+ }
93+ }
94+ } + {
95+ let fs = take(drop((toString((fp + mult)) + "00000000"), 1), 8)
96+ let f0 = if ((takeRight(fs, 1) == "0"))
97+ then dropRight(fs, 1)
98+ else fs
99+ let f1 = if ((takeRight(f0, 1) == "0"))
100+ then dropRight(f0, 1)
101+ else f0
102+ let f2 = if ((takeRight(f1, 1) == "0"))
103+ then dropRight(f1, 1)
104+ else f1
105+ let f3 = if ((takeRight(f2, 1) == "0"))
106+ then dropRight(f2, 1)
107+ else f2
108+ let f4 = if ((takeRight(f3, 1) == "0"))
109+ then dropRight(f3, 1)
110+ else f3
111+ let f5 = if ((takeRight(f4, 1) == "0"))
112+ then dropRight(f4, 1)
113+ else f4
114+ let f6 = if ((takeRight(f5, 1) == "0"))
115+ then dropRight(f5, 1)
116+ else f5
117+ let f7 = if ((takeRight(f6, 1) == "0"))
118+ then dropRight(f6, 1)
119+ else f6
120+ if ((f7 == ""))
121+ then ""
122+ else ("." + f7)
123+ })
124+ }
125+
126+
127+@Callable(inv)
23128 func deposit () = {
24- let p = if (isDefined(i.payment))
25- then extract(i.payment)
26- else throw((("Missing " + myAssetName) + " attached payment!"))
27- if ((p.assetId != myAssetId))
28- then throw((("Only " + myAssetName) + " is allowed to deposit!"))
29- else {
30- let amount = value(p.amount)
31- let client = toBase58String(i.caller.bytes)
32- let isActive = match getBoolean(this, (client + "_status")) {
33- case x: Boolean =>
34- x
35- case _ =>
36- false
37- }
38- let balance = if (!(isActive))
39- then 0
40- else match getInteger(this, (client + "_balance")) {
129+ let attPayment = extract(inv.payment)
130+ if (!(isDefined(attPayment)))
131+ then throw((("There is no attached payment " + assetName) + "."))
132+ else if ((attPayment.assetId != myAssetId))
133+ then throw((("Only " + assetName) + " is allowed to deposit."))
134+ else {
135+ let dapp = toBase58String(this.bytes)
136+ let sumTotal = getIntegerValue(this, (dapp + "_balance"))
137+ let client = toBase58String(inv.caller.bytes)
138+ let isActive = match getBoolean(this, (client + "_status")) {
139+ case x: Boolean =>
140+ x
141+ case _ =>
142+ false
143+ }
144+ let updateTime = match getInteger(this, (client + "_updatetime")) {
41145 case x: Int =>
42146 x
43147 case _ =>
44148 0
45149 }
46- let newBalance = (balance + amount)
47- let newStartTime = if ((minBalance > newBalance))
48- then 0
49- else if ((minBalance > balance))
50- then lastBlockTime
150+ let isOlder = (frameStartTime >= updateTime)
151+ let balance = if (if (!(isActive))
152+ then isOlder
153+ else false)
154+ then 0
155+ else match getInteger(this, (client + "_balance")) {
156+ case x: Int =>
157+ x
158+ case _ =>
159+ 0
160+ }
161+ let amount = extract(attPayment.amount)
162+ let newBalance = if (!(isActive))
163+ then amount
164+ else (balance + amount)
165+ if (if ((minBalance > newBalance))
166+ then true
167+ else (newBalance > maxBalance))
168+ then throw((((((((("The minimum allowable balance is " + toFloatString(minBalance, decMult)) + " ") + assetName) + ", and the maximum is ") + toFloatString(maxBalance, decMult)) + " ") + assetName) + "."))
51169 else {
52- let updateTime = match getInteger(this, (client + "_updatetime")) {
53- case x: Int =>
54- x
55- case _ =>
56- 0
170+ let newStartTime = {
171+ let startTime = if (if (!(isActive))
172+ then isOlder
173+ else false)
174+ then lastBlockTime
175+ else if (if (isActive)
176+ then isOlder
177+ else false)
178+ then frameStartTime
179+ else match getInteger(this, (client + "_starttime")) {
180+ case x: Int =>
181+ if (isActive)
182+ then x
183+ else (x + (lastBlockTime - updateTime))
184+ case _ =>
185+ 0
186+ }
187+ let sumBalance = (newBalance / protect)
188+ (fraction(startTime, (balance / protect), sumBalance) + fraction(lastBlockTime, ((newBalance - balance) / protect), sumBalance))
189+ }
190+ if (isActive)
191+ then WriteSet([DataEntry((dapp + "_balance"), (sumTotal + amount)), DataEntry((client + "_balance"), newBalance), DataEntry((client + "_starttime"), newStartTime), DataEntry((client + "_updatetime"), lastBlockTime)])
192+ else if (isDefined(getString(this, (client + "_address"))))
193+ then WriteSet([DataEntry((dapp + "_balance"), (sumTotal + amount)), DataEntry((client + "_balance"), newBalance), DataEntry((client + "_starttime"), newStartTime), DataEntry((client + "_status"), true), DataEntry((client + "_updatetime"), lastBlockTime)])
194+ 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)])
57195 }
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- }
68- if (isActive)
69- then WriteSet([DataEntry((client + "_balance"), newBalance), DataEntry((client + "_starttime"), newStartTime), DataEntry((client + "_updatetime"), lastBlockTime)])
70- else {
71- let isClient = match getString(this, (client + "_address")) {
72- case x: String =>
73- true
74- case _ =>
75- false
76- }
77- if (isClient)
78- then WriteSet([DataEntry((client + "_balance"), newBalance), DataEntry((client + "_starttime"), newStartTime), DataEntry((client + "_status"), true), DataEntry((client + "_updatetime"), lastBlockTime)])
79- else WriteSet([DataEntry((client + "_address"), client), DataEntry((client + "_balance"), newBalance), DataEntry((client + "_starttime"), newStartTime), DataEntry((client + "_status"), true), DataEntry((client + "_updatetime"), lastBlockTime)])
80- }
81- }
196+ }
82197 }
83198
84199
85200
86-@Callable(i)
87-func withdraw (RSCx100000) = if (isDefined(i.payment))
88- then throw("Don't attach payment when withdrawing!")
201+@Callable(inv)
202+func withdraw (RSCx100000) = if (isDefined(inv.payment))
203+ then throw("Please don't attach payment when withdrawing funds.")
89204 else {
90- let client = toBase58String(i.caller.bytes)
205+ let dapp = toBase58String(this.bytes)
206+ let sumTotal = getIntegerValue(this, (dapp + "_balance"))
207+ let minStake = getIntegerValue(this, (dapp + "_starttime"))
208+ let client = toBase58String(inv.caller.bytes)
91209 let isActive = match getBoolean(this, (client + "_status")) {
92210 case x: Boolean =>
93211 x
94212 case _ =>
95213 false
96214 }
215+ let updateTime = match getInteger(this, (client + "_updatetime")) {
216+ case x: Int =>
217+ x
218+ case _ =>
219+ 0
220+ }
221+ let isOlder = (frameStartTime >= updateTime)
97222 let balance = if (!(isActive))
98223 then 0
99224 else match getInteger(this, (client + "_balance")) {
102227 case _ =>
103228 0
104229 }
105- let lockTime = match getInteger(this, (client + "_updatetime")) {
106- case x: Int =>
107- (x + minLockTime)
108- case _ =>
109- 0
110- }
111- let amount = if ((RSCx100000 == 0))
112- then balance
113- else RSCx100000
114- if (if ((balance >= minBalance))
115- then (lockTime >= lastBlockTime)
230+ let expiration = (updateTime + lockPeriod)
231+ let amount = if ((RSCx100000 != 0))
232+ then RSCx100000
233+ else balance
234+ if (if (if ((minStake >= 0))
235+ then (balance >= minStake)
116236 else false)
117- then throw((("Unable to withdraw coins! Account is locked for up to " + toString((lockTime / 1000))) + " Unix timestamp..."))
237+ then (expiration >= lastBlockTime)
238+ else false)
239+ then throw((("Unable to withdraw coins! The account is locked for up to " + toString((expiration / 1000))) + " Unix timestamp..."))
118240 else if ((0 >= amount))
119- then throw("Unable to withdraw zero or negative amount!")
241+ then throw("It's impossible to withdraw a negative amount or no balance.")
120242 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)]))
124- else {
125- let newBalance = (balance - amount)
126- let newStartTime = if ((minBalance > balance))
127- then 0
128- else (fraction(frameStartTime, balance, newBalance) - fraction(lastBlockTime, amount, newBalance))
129- ScriptResult(WriteSet([DataEntry((client + "_balance"), newBalance), DataEntry((client + "_starttime"), newStartTime), DataEntry((client + "_updatetime"), lastBlockTime)]), TransferSet([ScriptTransfer(i.caller, amount, myAssetId)]))
243+ then throw((((((("It's impossible to withdraw more than the remainder: " + toString(balance)) + " (") + toFloatString(balance, decMult)) + " ") + assetName) + ")."))
244+ else {
245+ let newBalance = (balance - amount)
246+ let newStartTime = {
247+ let startTime = if (isOlder)
248+ then frameStartTime
249+ else match getInteger(this, (client + "_starttime")) {
250+ case x: Int =>
251+ x
252+ case _ =>
253+ 0
254+ }
255+ let sumBalance = (newBalance / protect)
256+ if ((minBalance > newBalance))
257+ then startTime
258+ else (fraction(startTime, (balance / protect), sumBalance) - fraction(lastBlockTime, (amount / protect), sumBalance))
130259 }
260+ if ((newBalance >= minBalance))
261+ 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)]))
262+ 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)]))
263+ }
131264 }
132265
133266
267+
268+@Callable(inv)
269+func setMinStake (RSCx100000) = if (if ((inv.callerPublicKey != ownerPubKey))
270+ then (inv.callerPublicKey != managerPubKey)
271+ else false)
272+ then throw("Only an administrator can set or modify minStake!")
273+ else if (isDefined(inv.payment))
274+ then throw("Please don't attach payment when setting up minStake.")
275+ else {
276+ let dapp = toBase58String(this.bytes)
277+ let adrBalance = assetBalance(this, myAssetId)
278+ if (isDefined(getString(this, (dapp + "_address"))))
279+ then WriteSet([DataEntry((dapp + "_starttime"), RSCx100000), DataEntry((dapp + "_updatetime"), lastBlockTime)])
280+ else WriteSet([DataEntry((dapp + "_address"), dapp), DataEntry((dapp + "_balance"), adrBalance), DataEntry((dapp + "_starttime"), RSCx100000), DataEntry((dapp + "_status"), false), DataEntry((dapp + "_updatetime"), lastBlockTime)])
281+ }
282+
283+
134284 @Verifier(tx)
135-func verify () = if (if (sigVerify(tx.bodyBytes, tx.proofs[2], ownerPubKey))
136- then sigVerify(tx.bodyBytes, tx.proofs[1], managerPubKey)
137- else false)
138- then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
139- else false
285+func verify () = match tx {
286+ case a: CreateAliasTransaction =>
287+ sigVerify(a.bodyBytes, a.proofs[0], a.senderPublicKey)
288+ case t: TransferTransaction =>
289+ if (if (if ((t.assetId != myAssetId))
290+ then (t.feeAssetId != myAssetId)
291+ else false)
292+ then sigVerify(t.bodyBytes, t.proofs[2], ownerPubKey)
293+ else false)
294+ then sigVerify(t.bodyBytes, t.proofs[1], managerPubKey)
295+ else false
296+ case s: SetScriptTransaction =>
297+ if (sigVerify(s.bodyBytes, s.proofs[2], ownerPubKey))
298+ then sigVerify(s.bodyBytes, s.proofs[1], managerPubKey)
299+ else false
300+ case _ =>
301+ false
302+}
140303
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let assetName = "RusCoin"
5+
46 let decMult = 100000
57
6-let myAssetName = "RusCoin"
8+let lockPeriod = (2629800 * 1000)
79
8-let minBalance = (100 * decMult)
10+let minBalance = (1 * decMult)
911
10-let minLockTime = (2629800 * 1000)
12+let maxBalance = (1000000 * decMult)
13+
14+let protect = minBalance
1115
1216 let myAssetId = base58'EMdiF8uaySswfCdMxc114rSfzUsAKCtK9d8eSx6ruKP4'
1317
1418 let ownerPubKey = base58'2in4yGNBKfitQbXbsHmL2unWrUnRo7GWyqcZXsmAzhQi'
1519
1620 let managerPubKey = base58'EaKK5PAFUkgtnF7xcyABUzi8YBQADmUDnPzQBHjCTAKT'
1721
18-let lastBlockTime = value(lastBlock.timestamp)
22+let lastBlockTime = extract(lastBlock.timestamp)
1923
20-let frameStartTime = ((lastBlockTime / minLockTime) * minLockTime)
24+let frameStartTime = ((lastBlockTime / lockPeriod) * lockPeriod)
2125
22-@Callable(i)
26+func toFloatString (num,mult) = {
27+ func separate (acc,val) = if (if ((acc == ""))
28+ then (val == 0)
29+ else false)
30+ then ""
31+ else if ((acc == ""))
32+ then toString(val)
33+ else ((acc + ",") + takeRight(toString((val + 1000)), 3))
34+
35+ let ip = (num / mult)
36+ let fp = (num % mult)
37+ let q0 = (ip / (((((1000 * 1000) * 1000) * 1000) * 1000) * 1000))
38+ let r0 = (ip % (((((1000 * 1000) * 1000) * 1000) * 1000) * 1000))
39+ let q1 = (r0 / ((((1000 * 1000) * 1000) * 1000) * 1000))
40+ let r1 = (r0 % ((((1000 * 1000) * 1000) * 1000) * 1000))
41+ let q2 = (r1 / (((1000 * 1000) * 1000) * 1000))
42+ let r2 = (r1 % (((1000 * 1000) * 1000) * 1000))
43+ let q3 = (r2 / ((1000 * 1000) * 1000))
44+ let r3 = (r2 % ((1000 * 1000) * 1000))
45+ let q4 = (r3 / (1000 * 1000))
46+ let r4 = (r3 % (1000 * 1000))
47+ let q5 = (r4 / 1000)
48+ let r5 = (r4 % 1000)
49+ ({
50+ let $list31963247 = [q0, q1, q2, q3, q4, q5, r5]
51+ let $size31963247 = size($list31963247)
52+ let $acc031963247 = ""
53+ if (($size31963247 == 0))
54+ then $acc031963247
55+ else {
56+ let $acc131963247 = separate($acc031963247, $list31963247[0])
57+ if (($size31963247 == 1))
58+ then $acc131963247
59+ else {
60+ let $acc231963247 = separate($acc131963247, $list31963247[1])
61+ if (($size31963247 == 2))
62+ then $acc231963247
63+ else {
64+ let $acc331963247 = separate($acc231963247, $list31963247[2])
65+ if (($size31963247 == 3))
66+ then $acc331963247
67+ else {
68+ let $acc431963247 = separate($acc331963247, $list31963247[3])
69+ if (($size31963247 == 4))
70+ then $acc431963247
71+ else {
72+ let $acc531963247 = separate($acc431963247, $list31963247[4])
73+ if (($size31963247 == 5))
74+ then $acc531963247
75+ else {
76+ let $acc631963247 = separate($acc531963247, $list31963247[5])
77+ if (($size31963247 == 6))
78+ then $acc631963247
79+ else {
80+ let $acc731963247 = separate($acc631963247, $list31963247[6])
81+ if (($size31963247 == 7))
82+ then $acc731963247
83+ else {
84+ let $acc831963247 = separate($acc731963247, $list31963247[7])
85+ throw("List size exceed 7")
86+ }
87+ }
88+ }
89+ }
90+ }
91+ }
92+ }
93+ }
94+ } + {
95+ let fs = take(drop((toString((fp + mult)) + "00000000"), 1), 8)
96+ let f0 = if ((takeRight(fs, 1) == "0"))
97+ then dropRight(fs, 1)
98+ else fs
99+ let f1 = if ((takeRight(f0, 1) == "0"))
100+ then dropRight(f0, 1)
101+ else f0
102+ let f2 = if ((takeRight(f1, 1) == "0"))
103+ then dropRight(f1, 1)
104+ else f1
105+ let f3 = if ((takeRight(f2, 1) == "0"))
106+ then dropRight(f2, 1)
107+ else f2
108+ let f4 = if ((takeRight(f3, 1) == "0"))
109+ then dropRight(f3, 1)
110+ else f3
111+ let f5 = if ((takeRight(f4, 1) == "0"))
112+ then dropRight(f4, 1)
113+ else f4
114+ let f6 = if ((takeRight(f5, 1) == "0"))
115+ then dropRight(f5, 1)
116+ else f5
117+ let f7 = if ((takeRight(f6, 1) == "0"))
118+ then dropRight(f6, 1)
119+ else f6
120+ if ((f7 == ""))
121+ then ""
122+ else ("." + f7)
123+ })
124+ }
125+
126+
127+@Callable(inv)
23128 func deposit () = {
24- let p = if (isDefined(i.payment))
25- then extract(i.payment)
26- else throw((("Missing " + myAssetName) + " attached payment!"))
27- if ((p.assetId != myAssetId))
28- then throw((("Only " + myAssetName) + " is allowed to deposit!"))
29- else {
30- let amount = value(p.amount)
31- let client = toBase58String(i.caller.bytes)
32- let isActive = match getBoolean(this, (client + "_status")) {
33- case x: Boolean =>
34- x
35- case _ =>
36- false
37- }
38- let balance = if (!(isActive))
39- then 0
40- else match getInteger(this, (client + "_balance")) {
129+ let attPayment = extract(inv.payment)
130+ if (!(isDefined(attPayment)))
131+ then throw((("There is no attached payment " + assetName) + "."))
132+ else if ((attPayment.assetId != myAssetId))
133+ then throw((("Only " + assetName) + " is allowed to deposit."))
134+ else {
135+ let dapp = toBase58String(this.bytes)
136+ let sumTotal = getIntegerValue(this, (dapp + "_balance"))
137+ let client = toBase58String(inv.caller.bytes)
138+ let isActive = match getBoolean(this, (client + "_status")) {
139+ case x: Boolean =>
140+ x
141+ case _ =>
142+ false
143+ }
144+ let updateTime = match getInteger(this, (client + "_updatetime")) {
41145 case x: Int =>
42146 x
43147 case _ =>
44148 0
45149 }
46- let newBalance = (balance + amount)
47- let newStartTime = if ((minBalance > newBalance))
48- then 0
49- else if ((minBalance > balance))
50- then lastBlockTime
150+ let isOlder = (frameStartTime >= updateTime)
151+ let balance = if (if (!(isActive))
152+ then isOlder
153+ else false)
154+ then 0
155+ else match getInteger(this, (client + "_balance")) {
156+ case x: Int =>
157+ x
158+ case _ =>
159+ 0
160+ }
161+ let amount = extract(attPayment.amount)
162+ let newBalance = if (!(isActive))
163+ then amount
164+ else (balance + amount)
165+ if (if ((minBalance > newBalance))
166+ then true
167+ else (newBalance > maxBalance))
168+ then throw((((((((("The minimum allowable balance is " + toFloatString(minBalance, decMult)) + " ") + assetName) + ", and the maximum is ") + toFloatString(maxBalance, decMult)) + " ") + assetName) + "."))
51169 else {
52- let updateTime = match getInteger(this, (client + "_updatetime")) {
53- case x: Int =>
54- x
55- case _ =>
56- 0
170+ let newStartTime = {
171+ let startTime = if (if (!(isActive))
172+ then isOlder
173+ else false)
174+ then lastBlockTime
175+ else if (if (isActive)
176+ then isOlder
177+ else false)
178+ then frameStartTime
179+ else match getInteger(this, (client + "_starttime")) {
180+ case x: Int =>
181+ if (isActive)
182+ then x
183+ else (x + (lastBlockTime - updateTime))
184+ case _ =>
185+ 0
186+ }
187+ let sumBalance = (newBalance / protect)
188+ (fraction(startTime, (balance / protect), sumBalance) + fraction(lastBlockTime, ((newBalance - balance) / protect), sumBalance))
189+ }
190+ if (isActive)
191+ then WriteSet([DataEntry((dapp + "_balance"), (sumTotal + amount)), DataEntry((client + "_balance"), newBalance), DataEntry((client + "_starttime"), newStartTime), DataEntry((client + "_updatetime"), lastBlockTime)])
192+ else if (isDefined(getString(this, (client + "_address"))))
193+ then WriteSet([DataEntry((dapp + "_balance"), (sumTotal + amount)), DataEntry((client + "_balance"), newBalance), DataEntry((client + "_starttime"), newStartTime), DataEntry((client + "_status"), true), DataEntry((client + "_updatetime"), lastBlockTime)])
194+ 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)])
57195 }
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- }
68- if (isActive)
69- then WriteSet([DataEntry((client + "_balance"), newBalance), DataEntry((client + "_starttime"), newStartTime), DataEntry((client + "_updatetime"), lastBlockTime)])
70- else {
71- let isClient = match getString(this, (client + "_address")) {
72- case x: String =>
73- true
74- case _ =>
75- false
76- }
77- if (isClient)
78- then WriteSet([DataEntry((client + "_balance"), newBalance), DataEntry((client + "_starttime"), newStartTime), DataEntry((client + "_status"), true), DataEntry((client + "_updatetime"), lastBlockTime)])
79- else WriteSet([DataEntry((client + "_address"), client), DataEntry((client + "_balance"), newBalance), DataEntry((client + "_starttime"), newStartTime), DataEntry((client + "_status"), true), DataEntry((client + "_updatetime"), lastBlockTime)])
80- }
81- }
196+ }
82197 }
83198
84199
85200
86-@Callable(i)
87-func withdraw (RSCx100000) = if (isDefined(i.payment))
88- then throw("Don't attach payment when withdrawing!")
201+@Callable(inv)
202+func withdraw (RSCx100000) = if (isDefined(inv.payment))
203+ then throw("Please don't attach payment when withdrawing funds.")
89204 else {
90- let client = toBase58String(i.caller.bytes)
205+ let dapp = toBase58String(this.bytes)
206+ let sumTotal = getIntegerValue(this, (dapp + "_balance"))
207+ let minStake = getIntegerValue(this, (dapp + "_starttime"))
208+ let client = toBase58String(inv.caller.bytes)
91209 let isActive = match getBoolean(this, (client + "_status")) {
92210 case x: Boolean =>
93211 x
94212 case _ =>
95213 false
96214 }
215+ let updateTime = match getInteger(this, (client + "_updatetime")) {
216+ case x: Int =>
217+ x
218+ case _ =>
219+ 0
220+ }
221+ let isOlder = (frameStartTime >= updateTime)
97222 let balance = if (!(isActive))
98223 then 0
99224 else match getInteger(this, (client + "_balance")) {
100225 case x: Int =>
101226 x
102227 case _ =>
103228 0
104229 }
105- let lockTime = match getInteger(this, (client + "_updatetime")) {
106- case x: Int =>
107- (x + minLockTime)
108- case _ =>
109- 0
110- }
111- let amount = if ((RSCx100000 == 0))
112- then balance
113- else RSCx100000
114- if (if ((balance >= minBalance))
115- then (lockTime >= lastBlockTime)
230+ let expiration = (updateTime + lockPeriod)
231+ let amount = if ((RSCx100000 != 0))
232+ then RSCx100000
233+ else balance
234+ if (if (if ((minStake >= 0))
235+ then (balance >= minStake)
116236 else false)
117- then throw((("Unable to withdraw coins! Account is locked for up to " + toString((lockTime / 1000))) + " Unix timestamp..."))
237+ then (expiration >= lastBlockTime)
238+ else false)
239+ then throw((("Unable to withdraw coins! The account is locked for up to " + toString((expiration / 1000))) + " Unix timestamp..."))
118240 else if ((0 >= amount))
119- then throw("Unable to withdraw zero or negative amount!")
241+ then throw("It's impossible to withdraw a negative amount or no balance.")
120242 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)]))
124- else {
125- let newBalance = (balance - amount)
126- let newStartTime = if ((minBalance > balance))
127- then 0
128- else (fraction(frameStartTime, balance, newBalance) - fraction(lastBlockTime, amount, newBalance))
129- ScriptResult(WriteSet([DataEntry((client + "_balance"), newBalance), DataEntry((client + "_starttime"), newStartTime), DataEntry((client + "_updatetime"), lastBlockTime)]), TransferSet([ScriptTransfer(i.caller, amount, myAssetId)]))
243+ then throw((((((("It's impossible to withdraw more than the remainder: " + toString(balance)) + " (") + toFloatString(balance, decMult)) + " ") + assetName) + ")."))
244+ else {
245+ let newBalance = (balance - amount)
246+ let newStartTime = {
247+ let startTime = if (isOlder)
248+ then frameStartTime
249+ else match getInteger(this, (client + "_starttime")) {
250+ case x: Int =>
251+ x
252+ case _ =>
253+ 0
254+ }
255+ let sumBalance = (newBalance / protect)
256+ if ((minBalance > newBalance))
257+ then startTime
258+ else (fraction(startTime, (balance / protect), sumBalance) - fraction(lastBlockTime, (amount / protect), sumBalance))
130259 }
260+ if ((newBalance >= minBalance))
261+ 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)]))
262+ 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)]))
263+ }
131264 }
132265
133266
267+
268+@Callable(inv)
269+func setMinStake (RSCx100000) = if (if ((inv.callerPublicKey != ownerPubKey))
270+ then (inv.callerPublicKey != managerPubKey)
271+ else false)
272+ then throw("Only an administrator can set or modify minStake!")
273+ else if (isDefined(inv.payment))
274+ then throw("Please don't attach payment when setting up minStake.")
275+ else {
276+ let dapp = toBase58String(this.bytes)
277+ let adrBalance = assetBalance(this, myAssetId)
278+ if (isDefined(getString(this, (dapp + "_address"))))
279+ then WriteSet([DataEntry((dapp + "_starttime"), RSCx100000), DataEntry((dapp + "_updatetime"), lastBlockTime)])
280+ else WriteSet([DataEntry((dapp + "_address"), dapp), DataEntry((dapp + "_balance"), adrBalance), DataEntry((dapp + "_starttime"), RSCx100000), DataEntry((dapp + "_status"), false), DataEntry((dapp + "_updatetime"), lastBlockTime)])
281+ }
282+
283+
134284 @Verifier(tx)
135-func verify () = if (if (sigVerify(tx.bodyBytes, tx.proofs[2], ownerPubKey))
136- then sigVerify(tx.bodyBytes, tx.proofs[1], managerPubKey)
137- else false)
138- then sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
139- else false
285+func verify () = match tx {
286+ case a: CreateAliasTransaction =>
287+ sigVerify(a.bodyBytes, a.proofs[0], a.senderPublicKey)
288+ case t: TransferTransaction =>
289+ if (if (if ((t.assetId != myAssetId))
290+ then (t.feeAssetId != myAssetId)
291+ else false)
292+ then sigVerify(t.bodyBytes, t.proofs[2], ownerPubKey)
293+ else false)
294+ then sigVerify(t.bodyBytes, t.proofs[1], managerPubKey)
295+ else false
296+ case s: SetScriptTransaction =>
297+ if (sigVerify(s.bodyBytes, s.proofs[2], ownerPubKey))
298+ then sigVerify(s.bodyBytes, s.proofs[1], managerPubKey)
299+ else false
300+ case _ =>
301+ false
302+}
140303

github/deemru/w8io/3ef1775 
72.39 ms