tx · C8dpn7oViiV5H4tdNKJTodjkHqV6P9vnRPzDnLC8yPso

3Ms3vFkrTaXvYNw9Vna8vgTmHzEhWCBkBmT:  -0.04000000 Waves

2021.11.08 17:54 [1782184] smart account 3Ms3vFkrTaXvYNw9Vna8vgTmHzEhWCBkBmT > SELF 0.00000000 Waves

{ "type": 13, "id": "C8dpn7oViiV5H4tdNKJTodjkHqV6P9vnRPzDnLC8yPso", "fee": 4000000, "feeAssetId": null, "timestamp": 1636383378516, "version": 2, "chainId": 84, "sender": "3Ms3vFkrTaXvYNw9Vna8vgTmHzEhWCBkBmT", "senderPublicKey": "4cDpBfmEAxfhEbF9jxuT8xqJa14SqZgPfZ9Tov6ka4Qj", "proofs": [ "2NdW7yxXxo4XJAGqNoaRHjkkxipdw7WAsWU6J2bmuUTk54wDctXViHfGzDAT1jm9GWyyY9GoBNNZU2k6B5wpR6Qr" ], "script": "base64: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", "height": 1782184, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 7CRSpNdrVArCphbyvYoeoeY8ivKXeMksTozD6WJ2Efo9 Next: 3SkTQsZXYxXvXokrHp7VKWk8RuXwTE54FZ6xoEUjWgaT Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let ADMIN = "3N8FWN9orV8D8px6xrYqTjWHHu2Qd3Jx4bV"
4+let ORACLE = "3Ms3vFkrTaXvYNw9Vna8vgTmHzEhWCBkBmT"
55
6-let DAPP = "3Mza5Ao6wJgpw1JG3jxRY1xigD44zgfhdK6"
7-
8-let VERIFIED = "verified"
9-
10-let BLOCKED = "blocked"
11-
12-func getAdressStatusKey (address) = (address + "_status")
6+func getOracleAddress () = Address(fromBase58String(ORACLE))
137
148
15-func getAddressAdminKey (address) = (address + "_admin")
16-
17-
18-func isStatusValid (status) = match status {
19- case t: String =>
20- if ((t == BLOCKED))
21- then true
22- else (t == VERIFIED)
23- case _ =>
24- false
25-}
26-
27-
28-func isAdmin (address) = if ((address == ADMIN))
29- then true
30- else match getBoolean(this, getAddressAdminKey(address)) {
31- case t: Boolean =>
32- t
33- case _ =>
34- false
35- }
36-
37-
38-func getAddresVerifiedStatus (address) = match getString(getAdressStatusKey(address)) {
39- case s: String =>
40- s
41- case _ =>
42- VERIFIED
43-}
9+func getStatusFromOracle (address) = getString(getOracleAddress(), (address + "_status"))
4410
4511
4612 @Callable(i)
47-func addAdmin (address) = {
48- let account = toBase58String(i.caller.bytes)
49- if (!(isAdmin(account)))
50- then throw("No Access")
51- else [BooleanEntry(getAddressAdminKey(address), true)]
13+func deposit () = {
14+ let pmt = if ((size(i.payments) == 1))
15+ then i.payments[0]
16+ else throw("Attached payment is required")
17+ let currentKey = toBase58String(i.caller.bytes)
18+ if (isDefined(pmt.assetId))
19+ then throw("works with waves only")
20+ else if ((getStatusFromOracle(currentKey) != "verified"))
21+ then throw("No Access")
22+ else {
23+ let currentAmount = match getInteger(this, currentKey) {
24+ case a: Int =>
25+ a
26+ case _ =>
27+ 0
28+ }
29+ let newAmount = (currentAmount + pmt.amount)
30+ $Tuple2([IntegerEntry(currentKey, newAmount)], unit)
31+ }
5232 }
5333
5434
5535
5636 @Callable(i)
57-func removeAdmin (address) = {
58- let account = toBase58String(i.caller.bytes)
59- if (!(isAdmin(account)))
60- then throw("No Access")
61- else if (!(isAdmin(address)))
62- then throw("Not found admin")
63- else [BooleanEntry(getAddressAdminKey(address), false)]
37+func withdraw (amount) = {
38+ let currentKey = toBase58String(i.caller.bytes)
39+ let currentAmount = match getInteger(this, currentKey) {
40+ case a: Int =>
41+ a
42+ case _ =>
43+ 0
44+ }
45+ let newAmount = (currentAmount - amount)
46+ if ((0 >= amount))
47+ then throw("Amount must be greater than 0")
48+ else if ((0 > newAmount))
49+ then throw("Not enough balance")
50+ else $Tuple2([IntegerEntry(currentKey, newAmount), ScriptTransfer(i.caller, amount, unit)], unit)
6451 }
6552
6653
6754
6855 @Callable(i)
69-func setStatus (address,status) = {
70- let account = toBase58String(i.caller.bytes)
71- if (!(isAdmin(account)))
56+func transfer (amount,recipient) = {
57+ let currentKey = toBase58String(i.caller.bytes)
58+ let currentAmount = match getInteger(this, currentKey) {
59+ case a: Int =>
60+ a
61+ case _ =>
62+ 0
63+ }
64+ let newAmount = (currentAmount - amount)
65+ if ((getStatusFromOracle(currentKey) != "verified"))
7266 then throw("No Access")
73- else if (!(isStatusValid(status)))
74- then throw("Invalid status")
75- else [StringEntry(getAdressStatusKey(address), status)]
67+ else if ((0 >= amount))
68+ then throw("Amount must be greater than 0")
69+ else if ((0 > newAmount))
70+ then throw("Not enough balance")
71+ else {
72+ let recKey = toBase58String(Address(fromBase58String(recipient)).bytes)
73+ let recAmount = match getInteger(this, recKey) {
74+ case a: Int =>
75+ a
76+ case _ =>
77+ 0
78+ }
79+ $Tuple2([IntegerEntry(currentKey, newAmount), IntegerEntry(recKey, (recAmount + amount))], unit)
80+ }
7681 }
7782
7883
7984 @Verifier(tx)
80-func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
85+func verify () = {
86+ let smartPK = base58'Gud7Z17wiZEMZiHRbn48k2D9H13jmLEDZZ8b7NCfjRJL'
87+ let secondPK = base58'CwvKLDcXt3Wd2MEyEemVKawiD7gaCV68wh2GcnJRHFqB'
88+ let smart = sigVerify(tx.bodyBytes, tx.proofs[0], smartPK)
89+ let second = sigVerify(tx.bodyBytes, tx.proofs[0], secondPK)
90+ match tx {
91+ case t: SetScriptTransaction =>
92+ true
93+ case t: DataTransaction =>
94+ true
95+ case t: InvokeScriptTransaction =>
96+ true
97+ case t: TransferTransaction =>
98+ if (smart)
99+ then true
100+ else second
101+ case _ =>
102+ false
103+ }
104+ }
81105

github/deemru/w8io/873ac7e 
42.75 ms