tx · APbzzM5VjNWLiMHwvRkmAECYLHYTchpUGXQNjnCiz9kK 3Mz6zqqBMkE7DWq2qYjoc75jqXr4rADunfv: -0.01400000 Waves 2021.03.23 19:26 [1450628] smart account 3Mz6zqqBMkE7DWq2qYjoc75jqXr4rADunfv > SELF 0.00000000 Waves
{ "type": 13, "id": "APbzzM5VjNWLiMHwvRkmAECYLHYTchpUGXQNjnCiz9kK", "fee": 1400000, "feeAssetId": null, "timestamp": 1616516760604, "version": 2, "chainId": 84, "sender": "3Mz6zqqBMkE7DWq2qYjoc75jqXr4rADunfv", "senderPublicKey": "2vP8gqLvBxSiqzeDLEs1FTiL4V79GvhVT64PXEtTewFH", "proofs": [ "5jhKAM3bkRDhDhGDApFP4M89pMdShGDWkG5u6UqHC57yudidHMm1bedoUkSHikASnzmk37dMq2qXNjiFbWfAUQP5" ], "script": "base64:AAIEAAAAAAAAAAsIAhIAEgASAwoBCAAAAAsAAAAAEmtXYWl0aW5nRGVwb3NpdFF0eQIAAAATd2FpdGluZ19kZXBvc2l0X3F0eQAAAAARa0xhc3RSZXF1ZXN0QmxvY2sCAAAAEmxhc3RfcmVxdWVzdF9ibG9jawAAAAAMa1VzZXJCYWxhbmNlAgAAAAx1c2VyX2JhbGFuY2UAAAAAF2tVc2VyV2l0aGRyYXdXYWl0aW5nUXR5AgAAABl1c2VyX3dpdGhkcmF3X3dhaXRpbmdfcXR5AQAAAA5nZXROdW1iZXJCeUtleQAAAAEAAAADa2V5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAA2tleQAAAAAAAAAAAAEAAAARZ2V0V2FpdGluZ0Rwc3RRdHkAAAAACQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABBQAAABJrV2FpdGluZ0RlcG9zaXRRdHkBAAAAE2dldExhc3RSZXF1ZXN0QmxvY2sAAAAACQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABBQAAABFrTGFzdFJlcXVlc3RCbG9jawEAAAAPY0tleVVzZXJCYWxhbmNlAAAAAQAAAAR1c2VyCQABLAAAAAIFAAAABHVzZXIFAAAADGtVc2VyQmFsYW5jZQEAAAAOZ2V0VXNlckJhbGFuY2UAAAABAAAABHVzZXIJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAAA9jS2V5VXNlckJhbGFuY2UAAAABBQAAAAR1c2VyAQAAABZjS2V5VXNlcld0aGRXYWl0aW5nUXR5AAAAAQAAAAR1c2VyCQABLAAAAAIFAAAABHVzZXIFAAAAF2tVc2VyV2l0aGRyYXdXYWl0aW5nUXR5AQAAABVnZXRVc2VyV3RoZFdhaXRpbmdRdHkAAAABAAAABHVzZXIJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABZjS2V5VXNlcld0aGRXYWl0aW5nUXR5AAAAAQUAAAAEdXNlcgAAAAMAAAABaQEAAAAHZGVwb3NpdAAAAAAEAAAAA3BtdAkBAAAABXZhbHVlAAAAAQkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAMJAQAAAAlpc0RlZmluZWQAAAABCAUAAAADcG10AAAA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", "height": 1450628, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: C6Ttapb2W6oaahnsFCio5QJ88TCJx8rFuspobGXYePQf Next: none Diff:
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 4 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | - | let | |
4 | + | let kWaitingDepositQty = "waiting_deposit_qty" | |
5 | 5 | ||
6 | - | func getNumberByKey (key) = { | |
7 | - | let num = match getInteger(this, key) { | |
8 | - | case a: Int => | |
9 | - | a | |
10 | - | case _ => | |
11 | - | 0 | |
12 | - | } | |
13 | - | num | |
14 | - | } | |
6 | + | let kLastRequestBlock = "last_request_block" | |
7 | + | ||
8 | + | let kUserBalance = "user_balance" | |
9 | + | ||
10 | + | let kUserWithdrawWaitingQty = "user_withdraw_waiting_qty" | |
11 | + | ||
12 | + | func getNumberByKey (key) = valueOrElse(getInteger(this, key), 0) | |
15 | 13 | ||
16 | 14 | ||
17 | - | func getStrByKey (key) = { | |
18 | - | let str = match getString(this, key) { | |
19 | - | case a: String => | |
20 | - | a | |
21 | - | case _ => | |
22 | - | NONE | |
23 | - | } | |
24 | - | str | |
25 | - | } | |
15 | + | func getWaitingDpstQty () = getNumberByKey(kWaitingDepositQty) | |
26 | 16 | ||
27 | 17 | ||
28 | - | func | |
18 | + | func getLastRequestBlock () = getNumberByKey(kLastRequestBlock) | |
29 | 19 | ||
30 | 20 | ||
31 | - | func | |
21 | + | func cKeyUserBalance (user) = (user + kUserBalance) | |
32 | 22 | ||
33 | 23 | ||
34 | - | func | |
24 | + | func getUserBalance (user) = getNumberByKey(cKeyUserBalance(user)) | |
35 | 25 | ||
36 | 26 | ||
37 | - | func | |
27 | + | func cKeyUserWthdWaitingQty (user) = (user + kUserWithdrawWaitingQty) | |
38 | 28 | ||
39 | 29 | ||
40 | - | func getKeyItem (supplier,title) = ("item_" + toBase58String(sha256(toBytes((supplier + title))))) | |
41 | - | ||
42 | - | ||
43 | - | func getKeyItemData (item) = (item + "_data") | |
44 | - | ||
45 | - | ||
46 | - | func getKeyItemSupplier (item) = (item + "_owner") | |
47 | - | ||
48 | - | ||
49 | - | func getValueItemSupplier (item) = getStrByKey(getKeyItemSupplier(item)) | |
50 | - | ||
51 | - | ||
52 | - | func getKeyBalanceSupplierAccount (account) = (account + "_balance") | |
53 | - | ||
54 | - | ||
55 | - | func getValueBalanceSupplier (account) = getNumberByKey(getKeyBalanceSupplierAccount(account)) | |
30 | + | func getUserWthdWaitingQty (user) = getNumberByKey(cKeyUserWthdWaitingQty(user)) | |
56 | 31 | ||
57 | 32 | ||
58 | 33 | @Callable(i) | |
59 | - | func addItem (title,price,data) = { | |
60 | - | let supplierAddress = toBase58String(i.caller.bytes) | |
61 | - | let item = getKeyItem(supplierAddress, title) | |
62 | - | if ((0 >= price)) | |
63 | - | then throw("Price set too low") | |
64 | - | else if ((getValueItemSupplier(item) != NONE)) | |
65 | - | then throw("Already exist !") | |
66 | - | else [StringEntry(getKeyItemSupplier(item), supplierAddress), IntegerEntry(getKeyItemPrice(item), price), StringEntry(getKeyItemData(item), data)] | |
67 | - | } | |
68 | - | ||
69 | - | ||
70 | - | ||
71 | - | @Callable(i) | |
72 | - | func purchase (item) = { | |
34 | + | func deposit () = { | |
73 | 35 | let pmt = value(i.payments[0]) | |
74 | 36 | if (isDefined(pmt.assetId)) | |
75 | - | then throw("Only Waves can be used at the moment") | |
76 | - | else { | |
77 | - | let userAddress = toBase58String(i.caller.bytes) | |
78 | - | let price = getValueItemPrice(item) | |
79 | - | let supplierAddress = getValueItemSupplier(item) | |
80 | - | if ((price > pmt.amount)) | |
81 | - | then throw("Can't validate payment, too low amount") | |
82 | - | else if ((supplierAddress == NONE)) | |
83 | - | then throw("Supplier does not exist") | |
84 | - | else [IntegerEntry(getKeyUserItemCounter(userAddress, item), (getValueUserItemCounter(userAddress, item) + 1)), IntegerEntry(getKeyBalanceSupplierAccount(supplierAddress), (getValueBalanceSupplier(supplierAddress) + pmt.amount))] | |
85 | - | } | |
37 | + | then throw("Error: only Waves can be used at the moment") | |
38 | + | else if ((0 >= pmt.amount)) | |
39 | + | then throw("Error: deposit amount is negative or zero.") | |
40 | + | else { | |
41 | + | let adr = toBase58String(i.caller.bytes) | |
42 | + | [IntegerEntry(cKeyUserBalance(adr), (getUserBalance(adr) + pmt.amount))] | |
43 | + | } | |
86 | 44 | } | |
87 | 45 | ||
88 | 46 | ||
90 | 48 | @Callable(i) | |
91 | 49 | func withdraw () = { | |
92 | 50 | let adr = toBase58String(i.caller.bytes) | |
93 | - | let curBalance = | |
51 | + | let curBalance = getUserBalance(adr) | |
94 | 52 | if ((0 >= curBalance)) | |
95 | - | then throw("No balance for the moment") | |
96 | - | else [IntegerEntry(getKeyBalanceSupplierAccount(adr), 0), ScriptTransfer(addressFromStringValue(adr), curBalance, unit)] | |
53 | + | then throw("Error: No balance for the moment") | |
54 | + | else if (((wavesBalance(this).available - 2) >= curBalance)) | |
55 | + | then [IntegerEntry(cKeyUserBalance(adr), 0), ScriptTransfer(addressFromStringValue(adr), curBalance, unit)] | |
56 | + | else [IntegerEntry(cKeyUserBalance(adr), 0), IntegerEntry(cKeyUserWthdWaitingQty(adr), (getUserWthdWaitingQty(adr) + curBalance))] | |
97 | 57 | } | |
98 | 58 | ||
59 | + | ||
60 | + | ||
61 | + | @Callable(i) | |
62 | + | func sendToUserWaiting (user) = { | |
63 | + | let adr = user | |
64 | + | let curWaiting = getUserWthdWaitingQty(adr) | |
65 | + | if ((0 >= curWaiting)) | |
66 | + | then throw("Error: No amount currently in wait for withdraw") | |
67 | + | else if ((curWaiting > (wavesBalance(this).available - 2))) | |
68 | + | then throw("Error: Dapp is withdrawing your funds, please wait a bit!") | |
69 | + | else [IntegerEntry(cKeyUserWthdWaitingQty(adr), 0), ScriptTransfer(addressFromStringValue(adr), curWaiting, unit)] | |
70 | + | } | |
71 | + | ||
72 | + | ||
73 | + | @Verifier(tx) | |
74 | + | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
99 | 75 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 4 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | - | let | |
4 | + | let kWaitingDepositQty = "waiting_deposit_qty" | |
5 | 5 | ||
6 | - | func getNumberByKey (key) = { | |
7 | - | let num = match getInteger(this, key) { | |
8 | - | case a: Int => | |
9 | - | a | |
10 | - | case _ => | |
11 | - | 0 | |
12 | - | } | |
13 | - | num | |
14 | - | } | |
6 | + | let kLastRequestBlock = "last_request_block" | |
7 | + | ||
8 | + | let kUserBalance = "user_balance" | |
9 | + | ||
10 | + | let kUserWithdrawWaitingQty = "user_withdraw_waiting_qty" | |
11 | + | ||
12 | + | func getNumberByKey (key) = valueOrElse(getInteger(this, key), 0) | |
15 | 13 | ||
16 | 14 | ||
17 | - | func getStrByKey (key) = { | |
18 | - | let str = match getString(this, key) { | |
19 | - | case a: String => | |
20 | - | a | |
21 | - | case _ => | |
22 | - | NONE | |
23 | - | } | |
24 | - | str | |
25 | - | } | |
15 | + | func getWaitingDpstQty () = getNumberByKey(kWaitingDepositQty) | |
26 | 16 | ||
27 | 17 | ||
28 | - | func | |
18 | + | func getLastRequestBlock () = getNumberByKey(kLastRequestBlock) | |
29 | 19 | ||
30 | 20 | ||
31 | - | func | |
21 | + | func cKeyUserBalance (user) = (user + kUserBalance) | |
32 | 22 | ||
33 | 23 | ||
34 | - | func | |
24 | + | func getUserBalance (user) = getNumberByKey(cKeyUserBalance(user)) | |
35 | 25 | ||
36 | 26 | ||
37 | - | func | |
27 | + | func cKeyUserWthdWaitingQty (user) = (user + kUserWithdrawWaitingQty) | |
38 | 28 | ||
39 | 29 | ||
40 | - | func getKeyItem (supplier,title) = ("item_" + toBase58String(sha256(toBytes((supplier + title))))) | |
41 | - | ||
42 | - | ||
43 | - | func getKeyItemData (item) = (item + "_data") | |
44 | - | ||
45 | - | ||
46 | - | func getKeyItemSupplier (item) = (item + "_owner") | |
47 | - | ||
48 | - | ||
49 | - | func getValueItemSupplier (item) = getStrByKey(getKeyItemSupplier(item)) | |
50 | - | ||
51 | - | ||
52 | - | func getKeyBalanceSupplierAccount (account) = (account + "_balance") | |
53 | - | ||
54 | - | ||
55 | - | func getValueBalanceSupplier (account) = getNumberByKey(getKeyBalanceSupplierAccount(account)) | |
30 | + | func getUserWthdWaitingQty (user) = getNumberByKey(cKeyUserWthdWaitingQty(user)) | |
56 | 31 | ||
57 | 32 | ||
58 | 33 | @Callable(i) | |
59 | - | func addItem (title,price,data) = { | |
60 | - | let supplierAddress = toBase58String(i.caller.bytes) | |
61 | - | let item = getKeyItem(supplierAddress, title) | |
62 | - | if ((0 >= price)) | |
63 | - | then throw("Price set too low") | |
64 | - | else if ((getValueItemSupplier(item) != NONE)) | |
65 | - | then throw("Already exist !") | |
66 | - | else [StringEntry(getKeyItemSupplier(item), supplierAddress), IntegerEntry(getKeyItemPrice(item), price), StringEntry(getKeyItemData(item), data)] | |
67 | - | } | |
68 | - | ||
69 | - | ||
70 | - | ||
71 | - | @Callable(i) | |
72 | - | func purchase (item) = { | |
34 | + | func deposit () = { | |
73 | 35 | let pmt = value(i.payments[0]) | |
74 | 36 | if (isDefined(pmt.assetId)) | |
75 | - | then throw("Only Waves can be used at the moment") | |
76 | - | else { | |
77 | - | let userAddress = toBase58String(i.caller.bytes) | |
78 | - | let price = getValueItemPrice(item) | |
79 | - | let supplierAddress = getValueItemSupplier(item) | |
80 | - | if ((price > pmt.amount)) | |
81 | - | then throw("Can't validate payment, too low amount") | |
82 | - | else if ((supplierAddress == NONE)) | |
83 | - | then throw("Supplier does not exist") | |
84 | - | else [IntegerEntry(getKeyUserItemCounter(userAddress, item), (getValueUserItemCounter(userAddress, item) + 1)), IntegerEntry(getKeyBalanceSupplierAccount(supplierAddress), (getValueBalanceSupplier(supplierAddress) + pmt.amount))] | |
85 | - | } | |
37 | + | then throw("Error: only Waves can be used at the moment") | |
38 | + | else if ((0 >= pmt.amount)) | |
39 | + | then throw("Error: deposit amount is negative or zero.") | |
40 | + | else { | |
41 | + | let adr = toBase58String(i.caller.bytes) | |
42 | + | [IntegerEntry(cKeyUserBalance(adr), (getUserBalance(adr) + pmt.amount))] | |
43 | + | } | |
86 | 44 | } | |
87 | 45 | ||
88 | 46 | ||
89 | 47 | ||
90 | 48 | @Callable(i) | |
91 | 49 | func withdraw () = { | |
92 | 50 | let adr = toBase58String(i.caller.bytes) | |
93 | - | let curBalance = | |
51 | + | let curBalance = getUserBalance(adr) | |
94 | 52 | if ((0 >= curBalance)) | |
95 | - | then throw("No balance for the moment") | |
96 | - | else [IntegerEntry(getKeyBalanceSupplierAccount(adr), 0), ScriptTransfer(addressFromStringValue(adr), curBalance, unit)] | |
53 | + | then throw("Error: No balance for the moment") | |
54 | + | else if (((wavesBalance(this).available - 2) >= curBalance)) | |
55 | + | then [IntegerEntry(cKeyUserBalance(adr), 0), ScriptTransfer(addressFromStringValue(adr), curBalance, unit)] | |
56 | + | else [IntegerEntry(cKeyUserBalance(adr), 0), IntegerEntry(cKeyUserWthdWaitingQty(adr), (getUserWthdWaitingQty(adr) + curBalance))] | |
97 | 57 | } | |
98 | 58 | ||
59 | + | ||
60 | + | ||
61 | + | @Callable(i) | |
62 | + | func sendToUserWaiting (user) = { | |
63 | + | let adr = user | |
64 | + | let curWaiting = getUserWthdWaitingQty(adr) | |
65 | + | if ((0 >= curWaiting)) | |
66 | + | then throw("Error: No amount currently in wait for withdraw") | |
67 | + | else if ((curWaiting > (wavesBalance(this).available - 2))) | |
68 | + | then throw("Error: Dapp is withdrawing your funds, please wait a bit!") | |
69 | + | else [IntegerEntry(cKeyUserWthdWaitingQty(adr), 0), ScriptTransfer(addressFromStringValue(adr), curWaiting, unit)] | |
70 | + | } | |
71 | + | ||
72 | + | ||
73 | + | @Verifier(tx) | |
74 | + | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
99 | 75 |
github/deemru/w8io/c3f4982 46.06 ms ◑