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