tx · 6MSZ5K7oA84jrWRR1rU2wmxWrR1JtvP6KFB5PofzVfFK

3MstgGUbpZXoVkvJwJC3cxrnTeyVdNzF7VW:  -0.01400000 Waves

2019.10.24 01:42 [733355] smart account 3MstgGUbpZXoVkvJwJC3cxrnTeyVdNzF7VW > SELF 0.00000000 Waves

{ "type": 13, "id": "6MSZ5K7oA84jrWRR1rU2wmxWrR1JtvP6KFB5PofzVfFK", "fee": 1400000, "feeAssetId": null, "timestamp": 1571870618598, "version": 1, "sender": "3MstgGUbpZXoVkvJwJC3cxrnTeyVdNzF7VW", "senderPublicKey": "13YevTfaVEoXJ5hu2kSjqnp2j2E8RV3NHHFM6giCFssY", "proofs": [ "2ftHzGCos3Jn4Rsb4zvLwmH685pSeMJE6oTV5T54jNhypVD6Q32FNSe64mp7rHKxAnDkGVk2RVumXa8QhuJaYYtR" ], "script": "base64:AAIDAAAAAAAAABUIARIAEgUKAwgBCBIDCgEIEgMKAQEAAAAOAAAAAAVPV05FUgEAAAAgAKbz5MdxP05qBtYSxXJqn4C6YVMLl9rDunp3cgoCCTsBAAAADmdldE51bWJlckJ5S2V5AAAAAQAAAANrZXkEAAAABm51bWJlcgQAAAAHJG1hdGNoMAkABBoAAAACBQAAAAR0aGlzBQAAAANrZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQAAAAAAAAAAAAUAAAAGbnVtYmVyAAAAAAROT05FAgAAAARub25lAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEAAAADa2V5BAAAAAZzdHJpbmcEAAAAByRtYXRjaDAJAAQdAAAAAgUAAAAEdGhpcwUAAAADa2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWEFAAAABE5PTkUFAAAABnN0cmluZwEAAAAKZ2V0SXRlbUtleQAAAAIAAAAIc3VwcGxpZXIAAAAFdGl0bGUEAAAABml0ZW1JZAkAASwAAAACBQAAAAhzdXBwbGllcgUAAAAFdGl0bGUJAAEsAAAAAgIAAAAFaXRlbV8JAAJYAAAAAQkAAZsAAAABBQAAAAZpdGVtSWQBAAAAD2dldEl0ZW1Pd25lcktleQAAAAEAAAAEaXRlbQkAASwAAAACBQAAAARpdGVtAgAAAAZfb3duZXIBAAAAEWdldEl0ZW1Pd25lclZhbHVlAAAAAQAAAARpdGVtCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAAPZ2V0SXRlbU93bmVyS2V5AAAAAQUAAAAEaXRlbQEAAAAPZ2V0SXRlbVByaWNlS2V5AAAAAQAAAARpdGVtCQABLAAAAAIFAAAABGl0ZW0CAAAABl9wcmljZQEAAAARZ2V0SXRlbVByaWNlVmFsdWUAAAABAAAABGl0ZW0JAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAAA9nZXRJdGVtUHJpY2VLZXkAAAABBQAAAARpdGVtAQAAAA5nZXRJdGVtRGF0YUtleQAAAAEAAAAEaXRlbQkAASwAAAACBQAAAARpdGVtAgAAAAVfZGF0YQEAAAAQZ2V0SXRlbURhdGFWYWx1ZQAAAAEAAAAEaXRlbQkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAADmdldEl0ZW1EYXRhS2V5AAAAAQUAAAAEaXRlbQEAAAAUZ2V0QWNjb3VudEJhbGFuY2VLZXkAAAABAAAAB2FjY291bnQJAAEsAAAAAgkAASwAAAACAgAAAAhhY2NvdW50XwUAAAAHYWNjb3VudAIAAAAIX2JhbGFuY2UBAAAAFmdldEFjY291bnRCYWxhbmNlVmFsdWUAAAABAAAAB2FjY291bnQJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABRnZXRBY2NvdW50QmFsYW5jZUtleQAAAAEFAAAAB2FjY291bnQBAAAAE2dldFB1cmNoYXNlUHJpY2VLZXkAAAACAAAABGl0ZW0AAAAIY3VzdG9tZXIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAJcHVyY2hhc2VfBQAAAARpdGVtAgAAAApfY3VzdG9tZXJfBQAAAAhjdXN0b21lcgIAAAAGX3ByaWNlAAAABAAAAANpbnYBAAAAB2RlcG9zaXQAAAAABAAAAAdwYXltZW50CQEAAAAHZXh0cmFjdAAAAAEIBQAAAANpbnYAAAAHcGF5bWVudAMJAQAAAAlpc0RlZmluZWQAAAABCAUAAAAHcGF5bWVudAAAAAdhc3NldElkCQAAAgAAAAECAAAAJHlvdSBjYW4gb25seSB1c2UgV0FWRVMgYXQgdGhlIG1vbWVudAQAAAAOYWNjb3VudEFkZHJlc3MJAAJYAAAAAQgIBQAAAANpbnYAAAAGY2FsbGVyAAAABWJ5dGVzBAAAAA1jdXJyZW50QW1vdW50CQEAAAAWZ2V0QWNjb3VudEJhbGFuY2VWYWx1ZQAAAAEFAAAADmFjY291bnRBZGRyZXNzBAAAAAluZXdBbW91bnQJAABkAAAAAgUAAAANY3VycmVudEFtb3VudAgFAAAAB3BheW1lbnQAAAAGYW1vdW50CQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAA5hY2NvdW50QWRkcmVzcwUAAAAJbmV3QW1vdW50BQAAAANuaWwAAAADaW52AQAAAAdhZGRJdGVtAAAAAwAAAAV0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", "chainId": 84, "height": 733355, "spentComplexity": 0 } View: original | compacted Prev: E6RWCirKWgu6RT8uCR2TSjrbNmHQHd52gRQ3EpCftdcA Next: none Diff:
OldNewDifferences
1717 }
1818
1919
20-func g (c) = {
21- let h = {
20+let g = "none"
21+
22+func h (c) = {
23+ let i = {
2224 let e = getString(this, c)
2325 if ($isInstanceOf(e, "String"))
2426 then {
2527 let f = e
2628 f
2729 }
28- else "none"
30+ else g
2931 }
30- h
32+ i
3133 }
3234
3335
34-func i (j) = (j + "_price")
36+func j (k,l) = {
37+ let m = (k + l)
38+ ("item_" + toBase58String(toBytes(m)))
39+ }
3540
3641
37-func k (j) = b(i(j))
42+func n (o) = (o + "_owner")
3843
3944
40-func l (m,j) = (((j + "_") + m) + "count")
45+func p (o) = h(n(o))
4146
4247
43-func n (m,j) = b(l(m, j))
48+func q (o) = (o + "_price")
4449
4550
46-func o (p,q) = ("item_" + toBase58String(toBytes((p + q))))
51+func r (o) = b(q(o))
4752
4853
49-func r (j) = (j + "_data")
54+func s (o) = (o + "_data")
5055
5156
52-func s (j) = (j + "_owner")
57+func t (o) = h(s(o))
5358
5459
55-func t (j) = g(s(j))
56-
57-
58-func u (v) = (v + "_balance")
60+func u (v) = (("account_" + v) + "_balance")
5961
6062
6163 func w (v) = b(u(v))
6264
6365
64-@Callable(x)
66+func x (o,y) = (((("purchase_" + o) + "_customer_") + y) + "_price")
67+
68+
69+@Callable(z)
6570 func deposit () = {
66- let y = extract(x.payment)
67- if (isDefined(y.assetId))
68- then throw("you can use WAVES only at the moment")
71+ let A = extract(z.payment)
72+ if (isDefined(A.assetId))
73+ then throw("you can only use WAVES at the moment")
6974 else {
70- let z = toBase58String(x.caller.bytes)
71- let A = {
72- let e = getInteger(this, ("wl_sts" + z))
73- if ($isInstanceOf(e, "Int"))
74- then {
75- let f = e
76- f
77- }
78- else 0
79- }
80- let B = {
81- let e = getString(this, ("wls_sts" + z))
82- if ($isInstanceOf(e, "String"))
83- then {
84- let f = e
85- f
86- }
87- else throw("user has not waitlisted")
88- }
89- let C = (A + y.amount)
90- WriteSet([DataEntry(z, C)])
75+ let B = toBase58String(z.caller.bytes)
76+ let C = w(B)
77+ let D = (C + A.amount)
78+ WriteSet([DataEntry(B, D)])
9179 }
9280 }
9381
9482
9583
96-@Callable(x)
97-func addItem (q,D,E) = {
98- let F = toBase58String(x.caller.bytes)
99- let j = o(F, q)
100- if ((0 >= D))
84+@Callable(z)
85+func addItem (l,E,F) = {
86+ let G = toBase58String(z.caller.bytes)
87+ let o = j(G, l)
88+ if ((0 >= E))
10189 then throw("purchase amount cannot be less that item price")
102- else if (("none" != t(j)))
90+ else if ((g != p(o)))
10391 then throw("an item is alreadt exist")
104- else WriteSet([DataEntry(s(j), F), DataEntry(i(j), D), DataEntry(r(j), E)])
92+ else WriteSet([DataEntry(n(o), G), DataEntry(q(o), E), DataEntry(s(o), F)])
10593 }
10694
10795
10896
109-@Callable(x)
110-func purchase () = {
111- let y = extract(x.payment)
112- if (isDefined(y.assetId))
113- then throw("you can use WAVES only at the moment")
97+@Callable(z)
98+func purchase (o) = {
99+ let A = extract(z.payment)
100+ if (isDefined(A.assetId))
101+ then throw("you can only use WAVES at the moment")
114102 else {
115- let G = toBase58String(x.caller.bytes)
116- let D = {
117- let e = getInteger(this, "item_A_coupon_price")
118- if ($isInstanceOf(e, "Int"))
119- then {
120- let f = e
121- f
122- }
123- else 0
124- }
125- if ((D > y.amount))
103+ let H = toBase58String(z.caller.bytes)
104+ let E = r(o)
105+ if ((E > A.amount))
126106 then throw("purchase amount cannot be less that item price")
127- else if ((y.amount > D))
107+ else if ((A.amount > E))
128108 then throw("purchase amount cannot be higher that item price")
129- else WriteSet([DataEntry(("status:purchase_item_A_customer_" + G), "confirmed"), DataEntry(("price:purchase_item_A_customer" + G), D)])
109+ else WriteSet([DataEntry(x(o, H), E)])
130110 }
131111 }
132112
133113
134114
135-@Callable(H)
115+@Callable(z)
136116 func withdraw (I) = {
137- let z = toBase58String(H.caller.bytes)
138- let A = b(z)
139- let C = (A - I)
117+ let B = toBase58String(z.caller.bytes)
118+ let C = w(B)
119+ let D = (C - I)
140120 if ((0 > I))
141- then throw("can't withdraw negative amount")
142- else if ((0 > C))
121+ then throw("cannot withdraw negative amount")
122+ else if ((0 > D))
143123 then throw("not enough balance")
144- else ScriptResult(WriteSet([DataEntry(z, C)]), TransferSet([ScriptTransfer(H.caller, I, unit)]))
124+ else ScriptResult(WriteSet([DataEntry(u(B), D)]), TransferSet([ScriptTransfer(z.caller, I, unit)]))
145125 }
146126
147127
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let a = base58'13YevTfaVEoXJ5hu2kSjqnp2j2E8RV3NHHFM6giCFssY'
55
66 func b (c) = {
77 let d = {
88 let e = getInteger(this, c)
99 if ($isInstanceOf(e, "Int"))
1010 then {
1111 let f = e
1212 f
1313 }
1414 else 0
1515 }
1616 d
1717 }
1818
1919
20-func g (c) = {
21- let h = {
20+let g = "none"
21+
22+func h (c) = {
23+ let i = {
2224 let e = getString(this, c)
2325 if ($isInstanceOf(e, "String"))
2426 then {
2527 let f = e
2628 f
2729 }
28- else "none"
30+ else g
2931 }
30- h
32+ i
3133 }
3234
3335
34-func i (j) = (j + "_price")
36+func j (k,l) = {
37+ let m = (k + l)
38+ ("item_" + toBase58String(toBytes(m)))
39+ }
3540
3641
37-func k (j) = b(i(j))
42+func n (o) = (o + "_owner")
3843
3944
40-func l (m,j) = (((j + "_") + m) + "count")
45+func p (o) = h(n(o))
4146
4247
43-func n (m,j) = b(l(m, j))
48+func q (o) = (o + "_price")
4449
4550
46-func o (p,q) = ("item_" + toBase58String(toBytes((p + q))))
51+func r (o) = b(q(o))
4752
4853
49-func r (j) = (j + "_data")
54+func s (o) = (o + "_data")
5055
5156
52-func s (j) = (j + "_owner")
57+func t (o) = h(s(o))
5358
5459
55-func t (j) = g(s(j))
56-
57-
58-func u (v) = (v + "_balance")
60+func u (v) = (("account_" + v) + "_balance")
5961
6062
6163 func w (v) = b(u(v))
6264
6365
64-@Callable(x)
66+func x (o,y) = (((("purchase_" + o) + "_customer_") + y) + "_price")
67+
68+
69+@Callable(z)
6570 func deposit () = {
66- let y = extract(x.payment)
67- if (isDefined(y.assetId))
68- then throw("you can use WAVES only at the moment")
71+ let A = extract(z.payment)
72+ if (isDefined(A.assetId))
73+ then throw("you can only use WAVES at the moment")
6974 else {
70- let z = toBase58String(x.caller.bytes)
71- let A = {
72- let e = getInteger(this, ("wl_sts" + z))
73- if ($isInstanceOf(e, "Int"))
74- then {
75- let f = e
76- f
77- }
78- else 0
79- }
80- let B = {
81- let e = getString(this, ("wls_sts" + z))
82- if ($isInstanceOf(e, "String"))
83- then {
84- let f = e
85- f
86- }
87- else throw("user has not waitlisted")
88- }
89- let C = (A + y.amount)
90- WriteSet([DataEntry(z, C)])
75+ let B = toBase58String(z.caller.bytes)
76+ let C = w(B)
77+ let D = (C + A.amount)
78+ WriteSet([DataEntry(B, D)])
9179 }
9280 }
9381
9482
9583
96-@Callable(x)
97-func addItem (q,D,E) = {
98- let F = toBase58String(x.caller.bytes)
99- let j = o(F, q)
100- if ((0 >= D))
84+@Callable(z)
85+func addItem (l,E,F) = {
86+ let G = toBase58String(z.caller.bytes)
87+ let o = j(G, l)
88+ if ((0 >= E))
10189 then throw("purchase amount cannot be less that item price")
102- else if (("none" != t(j)))
90+ else if ((g != p(o)))
10391 then throw("an item is alreadt exist")
104- else WriteSet([DataEntry(s(j), F), DataEntry(i(j), D), DataEntry(r(j), E)])
92+ else WriteSet([DataEntry(n(o), G), DataEntry(q(o), E), DataEntry(s(o), F)])
10593 }
10694
10795
10896
109-@Callable(x)
110-func purchase () = {
111- let y = extract(x.payment)
112- if (isDefined(y.assetId))
113- then throw("you can use WAVES only at the moment")
97+@Callable(z)
98+func purchase (o) = {
99+ let A = extract(z.payment)
100+ if (isDefined(A.assetId))
101+ then throw("you can only use WAVES at the moment")
114102 else {
115- let G = toBase58String(x.caller.bytes)
116- let D = {
117- let e = getInteger(this, "item_A_coupon_price")
118- if ($isInstanceOf(e, "Int"))
119- then {
120- let f = e
121- f
122- }
123- else 0
124- }
125- if ((D > y.amount))
103+ let H = toBase58String(z.caller.bytes)
104+ let E = r(o)
105+ if ((E > A.amount))
126106 then throw("purchase amount cannot be less that item price")
127- else if ((y.amount > D))
107+ else if ((A.amount > E))
128108 then throw("purchase amount cannot be higher that item price")
129- else WriteSet([DataEntry(("status:purchase_item_A_customer_" + G), "confirmed"), DataEntry(("price:purchase_item_A_customer" + G), D)])
109+ else WriteSet([DataEntry(x(o, H), E)])
130110 }
131111 }
132112
133113
134114
135-@Callable(H)
115+@Callable(z)
136116 func withdraw (I) = {
137- let z = toBase58String(H.caller.bytes)
138- let A = b(z)
139- let C = (A - I)
117+ let B = toBase58String(z.caller.bytes)
118+ let C = w(B)
119+ let D = (C - I)
140120 if ((0 > I))
141- then throw("can't withdraw negative amount")
142- else if ((0 > C))
121+ then throw("cannot withdraw negative amount")
122+ else if ((0 > D))
143123 then throw("not enough balance")
144- else ScriptResult(WriteSet([DataEntry(z, C)]), TransferSet([ScriptTransfer(H.caller, I, unit)]))
124+ else ScriptResult(WriteSet([DataEntry(u(B), D)]), TransferSet([ScriptTransfer(z.caller, I, unit)]))
145125 }
146126
147127
148128 @Verifier(J)
149129 func K () = {
150130 let e = J
151131 if ($isInstanceOf(e, "SetScriptTransaction"))
152132 then {
153133 let f = e
154134 sigVerify(J.bodyBytes, J.proofs[0], a)
155135 }
156136 else if ($isInstanceOf(e, "DataTransaction"))
157137 then {
158138 let L = e
159139 true
160140 }
161141 else false
162142 }
163143

github/deemru/w8io/c3f4982 
57.00 ms