tx · EEbZ7Ps4jtbkz3vi6ya4xvpCyE7aWk9qosu8zydH39ft

3N3QGoxpTairHzyavoHpRPyTVMyLdX46MwJ:  -0.01400000 Waves

2021.02.02 18:55 [1380751] smart account 3N3QGoxpTairHzyavoHpRPyTVMyLdX46MwJ > SELF 0.00000000 Waves

{ "type": 13, "id": "EEbZ7Ps4jtbkz3vi6ya4xvpCyE7aWk9qosu8zydH39ft", "fee": 1400000, "feeAssetId": null, "timestamp": 1612281447142, "version": 2, "chainId": 84, "sender": "3N3QGoxpTairHzyavoHpRPyTVMyLdX46MwJ", "senderPublicKey": "84ye9pvBU1ixETjmeNbvvD5czb8ZEjsSJuNyFGkYFmwd", "proofs": [ "3iUbjT6mHzeJg62JyPofAjs3NcY2q1GvU45ExuV7ACMkDZ9EUa4noqbRNYRBn7rKRDta88WvQPwcTWZcYQz4rdQ7" ], "script": "base64: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", "height": 1380751, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 6ZGgb1WXermoi8aooaTac7St6pDmY3J2nC5jR9XgbTJA Next: CwJVvzCg4MZ6x5kksHPBJfDiuJddPJmSi1uNrE8hvYwk Full:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let NONE = "none"
55
66 let BANNED = "banned"
77
88 let ACTIVE = "active"
99
1010 let CLOSE = "close"
1111
1212 let OPEN = "open"
1313
1414 let assetKey = "asset"
1515
1616 let keyPriceKey = "key_price"
1717
1818 let ownerKey = "owner"
1919
2020 let actions = [OPEN, CLOSE]
2121
2222 let deviceInitialCounter = 0
2323
2424 let keyDevice = 0
2525
2626 let keyValidUntil = 1
2727
2828 func getNumberByKey (key) = match getInteger(this, key) {
2929 case a: Int =>
3030 a
3131 case _ =>
3232 0
3333 }
3434
3535
3636 func getStrByKey (key) = match getString(this, key) {
3737 case a: String =>
3838 a
3939 case _ =>
4040 NONE
4141 }
4242
4343
4444 func getExtNumberByKey (key) = match getInteger(this, key) {
4545 case a: Int =>
4646 a
4747 case _ =>
4848 0
4949 }
5050
5151
5252 func getExtStrByKey (addr,key) = match getString(addr, key) {
5353 case a: String =>
5454 a
5555 case _ =>
5656 NONE
5757 }
5858
5959
6060 func getAssetId () = fromBase58String(getStrByKey(assetKey))
6161
6262
6363 func userStatusKey (addr) = ("user_" + addr)
6464
6565
6666 func userStatusValue (addr) = match getString(this, userStatusKey(addr)) {
6767 case a: String =>
6868 a
6969 case _ =>
7070 NONE
7171 }
7272
7373
7474 func deviceActionKey (addr) = ("device_" + addr)
7575
7676
7777 func deviceActionCounterKey (addr) = ("device_counter_" + addr)
7878
7979
8080 func deviceActionValue (addr) = getStrByKey(deviceActionKey(addr))
8181
8282
8383 func deviceActionCounterValue (addr) = getNumberByKey(deviceActionCounterKey(addr))
8484
8585
8686 func nftKey (nft) = ("key_" + nft)
8787
8888
8989 func nftValue (nft) = getStrByKey(nftKey(nft))
9090
9191
9292 func deviceNotWhitelistedKey (device,key) = {
9393 let nftId = nftKey(key)
9494 let valInDevice = getExtStrByKey(device, nftId)
9595 if ((valInDevice != NONE))
9696 then false
9797 else true
9898 }
9999
100100
101101 func deviceFromKey (key) = {
102102 let device = split(key.description, "_")[keyDevice]
103103 match addressFromString(device) {
104104 case t: Address =>
105105 t
106106 case _ =>
107107 throw("Not a device key")
108108 }
109109 }
110110
111111
112112 func getAssetInfo (asset) = match assetInfo(asset) {
113113 case t: Asset =>
114114 t
115115 case _ =>
116116 throw("Not a key")
117117 }
118118
119119
120120 func keyTimestampInvalid (key) = {
121121 let timestamp = parseIntValue(split(key.description, "_")[keyValidUntil])
122122 (lastBlock.timestamp > timestamp)
123123 }
124124
125125
126126 func keyPriceFromDevice (device) = match getInteger(device, keyPriceKey) {
127127 case t: Int =>
128128 t
129129 case _ =>
130130 throw("Price not specified in device")
131131 }
132132
133133
134134 func ownerFromDevice (device) = match getString(device, ownerKey) {
135135 case t: String =>
136136 t
137137 case _ =>
138138 throw("Owner not specified in device")
139139 }
140140
141141
142142 func priceIsWrong (i,assetId,price) = if ((1 > size(i.payments)))
143143 then throw("wrong payments count")
144144 else if ((i.payments[0].assetId != assetId))
145145 then throw("wrong asset, supported only xyz")
146146 else if ((i.payments[0].amount != price))
147147 then throw(("wrong payment value, expected " + toString(price)))
148148 else false
149149
150150
151151 func notAllowedDeviceAction (action) = match indexOf(actions, action) {
152152 case a: Int =>
153153 false
154154 case _ =>
155155 true
156156 }
157157
158158
159159 @Callable(i)
160160 func addDevice (deviceAddr) = if ((i.caller != this))
161161 then throw("Not permitted")
162162 else if ((deviceActionValue(deviceAddr) != NONE))
163163 then throw("Device already added")
164164 else [StringEntry(deviceActionKey(deviceAddr), CLOSE), IntegerEntry(deviceActionCounterKey(deviceAddr), deviceInitialCounter)]
165165
166166
167167
168168 @Callable(i)
169169 func addUser (deviceAddr) = if ((i.caller != this))
170170 then throw("Not permitted")
171171 else [StringEntry(userStatusKey(deviceAddr), ACTIVE)]
172172
173173
174174
175175 @Callable(i)
176176 func removeUser (deviceAddr) = if ((i.caller != this))
177177 then throw("Not permitted")
178178 else [DeleteEntry(userStatusKey(deviceAddr))]
179179
180180
181181
182182 @Callable(i)
183183 func requestKey (deviceAddr,duration) = {
184184 let issuedAt = lastBlock.timestamp
185185 let validUntil = (issuedAt + duration)
186186 let deviceOwner = ownerFromDevice(addressFromStringValue(deviceAddr))
187187 let keyPrice = keyPriceFromDevice(addressFromStringValue(deviceAddr))
188188 let assetId = getAssetId()
189189 if ((toBase58String(i.caller.bytes) != deviceOwner))
190190 then throw("Not permitted")
191191 else if ((deviceActionKey(deviceAddr) == NONE))
192192 then throw("No such device")
193193 else if (priceIsWrong(i, assetId, keyPrice))
194194 then throw("wrong price")
195195 else {
196196 let issue = Issue("DeviceKeyGen", ((deviceAddr + "_") + toString(validUntil)), 1, 0, false)
197197 let newAssetId = calculateAssetId(issue)
198198 [issue, ScriptTransfer(i.caller, 1, newAssetId)]
199199 }
200200 }
201201
202202
203203
204204 @Callable(i)
205205 func deviceAction (keyID,action) = {
206206 let hasNoKey = (1 > assetBalance(i.caller, fromBase58String(keyID)))
207207 let keyInfo = getAssetInfo(fromBase58String(keyID))
208208 let device = deviceFromKey(keyInfo)
209209 let deviceStr = toBase58String(device.bytes)
210210 if (hasNoKey)
211211 then throw("Key not owned")
212212 else if ((deviceActionKey(deviceStr) == NONE))
213213 then throw("No such device")
214214 else if (deviceNotWhitelistedKey(device, keyID))
215215 then throw("Key not whitelisted")
216216 else if (notAllowedDeviceAction(action))
217217 then throw("Action is not allowed")
218218 else if (keyTimestampInvalid(keyInfo))
219219 then throw("Key expired")
220220 else [StringEntry(deviceActionKey(deviceStr), action), IntegerEntry(deviceActionCounterKey(deviceStr), (deviceActionCounterValue(deviceStr) + 1))]
221221 }
222222
223223
224224 @Verifier(tx)
225225 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
226226

github/deemru/w8io/03bedc9 
29.31 ms