tx · 8WHkqnXCh7oV6gWXB3GkWJNRHYo98UsEGHXEo3zVHdmW 3NB2jbJZo5pokBTW3c4aiat3w9LbSLCbGU3: -0.05000000 Waves 2019.11.09 02:00 [756617] smart account 3NB2jbJZo5pokBTW3c4aiat3w9LbSLCbGU3 > SELF 0.00000000 Waves
{ "type": 13, "id": "8WHkqnXCh7oV6gWXB3GkWJNRHYo98UsEGHXEo3zVHdmW", "fee": 5000000, "feeAssetId": null, "timestamp": 1573253822877, "version": 1, "sender": "3NB2jbJZo5pokBTW3c4aiat3w9LbSLCbGU3", "senderPublicKey": "D55uA65TM8azYFSfAKgf5mzRE1Do6r7bNchUFMUw4QFp", "proofs": [ "3U1VxoZLxjqGeeY9X6GHhFr3ARRiuoqo2NGT65x1UZGVrYQdpesUiRxsyTmxqQM2dFtdwrDqatrmJFnfN1aCetFN" ], "script": "base64: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", "chainId": 84, "height": 756617, "spentComplexity": 0 } View: original | compacted Prev: none Next: 8xZ4F1vQCn8JrbBNiwLjHqnHeEbFaa3g4o9czPvehJsr Full:
Old | New | Differences | |
---|---|---|---|
1 | - | # no script | |
1 | + | {-# STDLIB_VERSION 3 #-} | |
2 | + | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | + | {-# CONTENT_TYPE DAPP #-} | |
4 | + | let YEAR = 31556952000 | |
5 | + | ||
6 | + | let MONTH = (YEAR / 12) | |
7 | + | ||
8 | + | let ADMIN = "3NBDgR8hU6W86Sstn3EGid8k9uxkqiJjxT6" | |
9 | + | ||
10 | + | let TOKEN = base58'EJ85vmBXWEtV4yHLPRTxex4q4s9mC8jKUhheyjZxwnPw' | |
11 | + | ||
12 | + | let wEUR = base58'Gtb1WRznfchDnTh37ezoDTJ4wcoKaRsKqKjJjy7nm2zU' | |
13 | + | ||
14 | + | let WVS = 100000000 | |
15 | + | ||
16 | + | let PRICExBASIC = 60 | |
17 | + | ||
18 | + | let PRICExADVANCED = 50 | |
19 | + | ||
20 | + | let BASIC = "basic" | |
21 | + | ||
22 | + | let ADVANCED = "advanced" | |
23 | + | ||
24 | + | let NONE = "none" | |
25 | + | ||
26 | + | func getNumberByKey (key) = match getInteger(this, key) { | |
27 | + | case n: Int => | |
28 | + | n | |
29 | + | case _ => | |
30 | + | 0 | |
31 | + | } | |
32 | + | ||
33 | + | ||
34 | + | func getStrByKey (key) = match getString(this, key) { | |
35 | + | case s: String => | |
36 | + | s | |
37 | + | case _ => | |
38 | + | NONE | |
39 | + | } | |
40 | + | ||
41 | + | ||
42 | + | func getKeySubscriptionEnd (addr) = (("member_" + addr) + "_subscription_end") | |
43 | + | ||
44 | + | ||
45 | + | func getKeyPlan (addr) = (("member_" + addr) + "_plan") | |
46 | + | ||
47 | + | ||
48 | + | func getTransferSet (account) = TransferSet([ScriptTransfer(account, 1, TOKEN)]) | |
49 | + | ||
50 | + | ||
51 | + | func getWriteSet (account,period,plan) = WriteSet([DataEntry(getKeySubscriptionEnd(account), (lastBlock.timestamp + period)), DataEntry(getKeyPlan(account), plan)]) | |
52 | + | ||
53 | + | ||
54 | + | func getResult (address,period,plan,isRenewal) = { | |
55 | + | let account = toBase58String(address.bytes) | |
56 | + | if (isRenewal) | |
57 | + | then getWriteSet(account, period, plan) | |
58 | + | else ScriptResult(getWriteSet(account, period, plan), getTransferSet(address)) | |
59 | + | } | |
60 | + | ||
61 | + | ||
62 | + | @Callable(i) | |
63 | + | func subscribe (plan) = { | |
64 | + | let payment = extract(i.payment) | |
65 | + | if ((payment.assetId != wEUR)) | |
66 | + | then throw("can use only wEUR token at the moment") | |
67 | + | else { | |
68 | + | let account = toBase58String(i.caller.bytes) | |
69 | + | let subscriptionEnd = getNumberByKey(getKeySubscriptionEnd(account)) | |
70 | + | let isRenewal = (subscriptionEnd != 0) | |
71 | + | if ((plan == BASIC)) | |
72 | + | then if ((PRICExBASIC > payment.amount)) | |
73 | + | then throw("unsufficient payment amount for basic plan") | |
74 | + | else getResult(i.caller, YEAR, plan, isRenewal) | |
75 | + | else if ((plan == ADVANCED)) | |
76 | + | then if ((PRICExADVANCED > payment.amount)) | |
77 | + | then throw("unsufficient payment amount for advanced plan") | |
78 | + | else getResult(i.caller, MONTH, plan, isRenewal) | |
79 | + | else throw(("subscription to an unknown plan: " + plan)) | |
80 | + | } | |
81 | + | } | |
82 | + | ||
83 | + | ||
84 | + | ||
85 | + | @Callable(i) | |
86 | + | func subscribeUser (userAddress,plan) = { | |
87 | + | let account = toBase58String(i.caller.bytes) | |
88 | + | let dAppAccount = toBase58String(this.bytes) | |
89 | + | if (if ((account != ADMIN)) | |
90 | + | then (account != dAppAccount) | |
91 | + | else false) | |
92 | + | then throw("only admins can do that") | |
93 | + | else { | |
94 | + | let subscriptionEnd = getNumberByKey(getKeySubscriptionEnd(userAddress)) | |
95 | + | let isRenewal = (subscriptionEnd != 0) | |
96 | + | let period = if ((plan == BASIC)) | |
97 | + | then YEAR | |
98 | + | else if ((plan == ADVANCED)) | |
99 | + | then MONTH | |
100 | + | else throw(("subscription to an unknown plan: " + plan)) | |
101 | + | getResult(addressFromStringValue(userAddress), period, plan, isRenewal) | |
102 | + | } | |
103 | + | } | |
104 | + | ||
105 | + |
github/deemru/w8io/c3f4982 16.66 ms ◑