tx · 45RpUf1vCSNTpZvjdJzy3o3mS8KCJtDFbTF9xzx6PNjk

3NA73oUXjqp7SpudXWV1yMFuKm9awPbqsVz:  -0.01000000 Waves

2022.10.27 18:08 [2290990] smart account 3NA73oUXjqp7SpudXWV1yMFuKm9awPbqsVz > SELF 0.00000000 Waves

{ "type": 13, "id": "45RpUf1vCSNTpZvjdJzy3o3mS8KCJtDFbTF9xzx6PNjk", "fee": 1000000, "feeAssetId": null, "timestamp": 1666883397185, "version": 2, "chainId": 84, "sender": "3NA73oUXjqp7SpudXWV1yMFuKm9awPbqsVz", "senderPublicKey": "2mHW72YTfnxJ1M8WsdUQjgpp3a2SUbt9mbAiePGiuJok", "proofs": [ "4nFvn5DBDkHWRv6BzjYTpmBEpNSNaZEpqP4Dgq87VcSqbAvytMBdt5YUm8uuLa2VwLHtwmUe2a3ZAmvnrY6t4eX5" ], "script": "base64:AAIFAAAAAAAAABYIAhIFCgMICAESBAoCCAISAwoBCBIAAAAADQEAAAAQZ2V0U3RyaW5nT3JUaHJvdwAAAAIAAAAHYWRkcmVzcwAAAANrZXkJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAdhZGRyZXNzBQAAAANrZXkJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAADENhbid0IHJlYWQgJwUAAAADa2V5AgAAAA0nIGF0IGFkZHJlc3MgCQAEJQAAAAEFAAAAB2FkZHJlc3MBAAAAEWdldEludGVnZXJPclRocm93AAAAAgAAAAdhZGRyZXNzAAAAA2tleQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAAB2FkZHJlc3MFAAAAA2tleQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAMQ2FuJ3QgcmVhZCAnBQAAAANrZXkCAAAADScgYXQgYWRkcmVzcyAJAAQlAAAAAQUAAAAHYWRkcmVzcwEAAAATcGFyc2VBZGRyZXNzT3JUaHJvdwAAAAEAAAAMbWF5YmVBZGRyZXNzCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQmAAAAAQUAAAAMbWF5YmVBZGRyZXNzCQABLAAAAAIJAAEsAAAAAgIAAAAaQ2FuJ3QgcGFyc2UgYWRkcmVzcyBmcm9tICcFAAAADG1heWJlQWRkcmVzcwIAAAABJwEAAAAKa2V5X2VudGl0eQAAAAMAAAAEbmFtZQAAAAJwawAAAAhwcm9wZXJ0eQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACBQAAAARuYW1lAgAAAAFfBQAAAAJwawIAAAABXwUAAAAIcHJvcGVydHkBAAAADmtleV9OYW1lX3Rva2VuAAAAAQAAAARuYW1lCQEAAAAKa2V5X2VudGl0eQAAAAMCAAAABE5hbWUFAAAABG5hbWUCAAAABXRva2VuAAAAABFrZXlfbWVlZHVzQWRkcmVzcwIAAAANbWVlZHVzQWRkcmVzcwAAAAAUa2V5X3JlZ2lzdHJhckFkZHJlc3MCAAAAEHJlZ2lzdHJhckFkZHJlc3MAAAAAF2tleV9tZWVkdXNJbml0VGltZXN0YW1wAgAAABNtZWVkdXNJbml0VGltZXN0YW1wAAAAAA1tZWVkdXNBZGRyZXNzCQEAAAAQZ2V0U3RyaW5nT3JUaHJvdwAAAAIFAAAABHRoaXMFAAAAEWtleV9tZWVkdXNBZGRyZXNzAAAAAAZtZWVkdXMJAQAAABNwYXJzZUFkZHJlc3NPclRocm93AAAAAQUAAAANbWVlZHVzQWRkcmVzcwAAAAAQcmVnaXN0cmFyQWRkcmVzcwkBAAAAEGdldFN0cmluZ09yVGhyb3cAAAACBQAAAAR0aGlzBQAAABRrZXlfcmVnaXN0cmFyQWRkcmVzcwAAAAAJcmVnaXN0cmFyCQEAAAATcGFyc2VBZGRyZXNzT3JUaHJvdwAAAAEFAAAAEHJlZ2lzdHJhckFkZHJlc3MAAAAAE21lZWR1c0luaXRUaW1lc3RhbXAJAQAAABFnZXRJbnRlZ2VyT3JUaHJvdwAAAAIFAAAABHRoaXMFAAAAF2tleV9tZWVkdXNJbml0VGltZXN0YW1wAAAABAAAAANpbnYBAAAABGluaXQAAAADAAAADW1lZWR1c0FkZHJlc3MAAAAQcmVnaXN0cmFyQWRkcmVzcwAAABNtZWVkdXNJbml0VGltZXN0YW1wCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAEWtleV9tZWVkdXNBZGRyZXNzBQAAAA1tZWVkdXNBZGRyZXNzCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAFGtleV9yZWdpc3RyYXJBZGRyZXNzBQAAABByZWdpc3RyYXJBZGRyZXNzCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABdrZXlfbWVlZHVzSW5pdFRpbWVzdGFtcAUAAAATbWVlZHVzSW5pdFRpbWVzdGFtcAUAAAADbmlsAAAAA2ludgEAAAAIdHJhbnNmZXIAAAACAAAACmFkZHJlc3NTdHIAAAAFYXNzZXQEAAAAB2FkZHJlc3MJAQAAABNwYXJzZUFkZHJlc3NPclRocm93AAAAAQUAAAAKYWRkcmVzc1N0cgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAAdhZGRyZXNzAAAAAAAAAAABBQAAAAVhc3NldAUAAAADbmlsAAAAA2ludgEAAAAHcmVzZXJ2ZQAAAAEAAAAEbmFtZQQAAAAGY2FsbGVyCAUAAAADaW52AAAABmNhbGxlcgQAAAAJY2FsbGVyU3RyCQAEJQAAAAEFAAAABmNhbGxlcgMJAQAAAAIhPQAAAAIFAAAABHRoaXMFAAAABmNhbGxlcgkAAAIAAAABAgAAABpPbmx5IHNlbGYgY2FsbCBhcmUgYWxsb3dlZAQAAAALcmVzZXJ2YXRpb24JAAP8AAAABAUAAAAJcmVnaXN0cmFyAgAAAAhyZWdpc3RlcgkABEwAAAACBQAAAARuYW1lCQAETAAAAAIFAAAACWNhbGxlclN0cgkABEwAAAACBQAAABNtZWVkdXNJbml0VGltZXN0YW1wBQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAALcmVzZXJ2YXRpb24FAAAAC3Jlc2VydmF0aW9uBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAA2ludgEAAAAIZXhjaGFuZ2UAAAAABAAAAAZjYWxsZXIIBQAAAANpbnYAAAAMb3JpZ2luQ2FsbGVyBAAAAAljYWxsZXJTdHIJAAQlAAAAAQUAAAAGY2FsbGVyBAAAAANwbXQJAAGRAAAAAggFAAAAA2ludgAAAAhwYXltZW50cwAAAAAAAAAAAAQAAAAHYXNzZXRJZAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCAUAAAADcG10AAAAB2Fzc2V0SWQCAAAAFUFzc2V0IGNhbm5vdCBiZSBXQVZFUwQAAAAFYXNzZXQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkAA+wAAAABBQAAAAdhc3NldElkAgAAAA1JbnZhbGlkIGFzc2V0BAAAAAtpc01lZWR1c05GVAMDAwkAAAAAAAACCAUAAAAFYXNzZXQAAAAGaXNzdWVyBQAAAAZtZWVkdXMJAAAAAAAAAggFAAAABWFzc2V0AAAACHF1YW50aXR5AAAAAAAAAAABBwkAAAAAAAACCAUAAAAFYXNzZXQAAAAIZGVjaW1hbHMAAAAAAAAAAAAHCQAAAAAAAAIIBQAAAAVhc3NldAAAAApyZWlzc3VhYmxlBwcDAwkBAAAAAiE9AAAAAggFAAAAA3BtdAAAAAZhbW91bnQAAAAAAAAAAAEGCQEAAAABIQAAAAEFAAAAC2lzTWVlZHVzTkZUCQAAAgAAAAECAAAAIVBheW1lbnQgc2hvdWxkIGNvbnRhaW4gTWVlZHVzIE5GVAQAAAAIdG9rZW5TdHIJAQAAABBnZXRTdHJpbmdPclRocm93AAAAAgUAAAAJcmVnaXN0cmFyCQEAAAAOa2V5X05hbWVfdG9rZW4AAAABCAUAAAAFYXNzZXQAAAAEbmFtZQQAAAAFdG9rZW4JAAGbAAAAAQUAAAAIdG9rZW5TdHIEAAAACHRyYW5zZmVyCQAD/AAAAAQFAAAABHRoaXMCAAAACHRyYW5zZmVyCQAETAAAAAIFAAAACWNhbGxlclN0cgkABEwAAAACBQAAAAdhc3NldElkBQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAAIdHJhbnNmZXIFAAAACHRyYW5zZmVyBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAIGvcIU=", "height": 2290990, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 2YgyqVaqXcwpT21e5y4gP3gJyGUqm2MA8Xg6B8eN2niw Next: H18J33EC1QZhnFNnMm748K2TwS8ujG58A5pEiwrVv7B4 Diff:
OldNewDifferences
1313 func key_entity (name,pk,property) = ((((name + "_") + pk) + "_") + property)
1414
1515
16-func key_Token_name (tokenId) = key_entity("Token", tokenId, "name")
17-
18-
1916 func key_Name_token (name) = key_entity("Name", name, "token")
2017
2118
22-func key_Name_owner (name) = key_entity("Name", name, "owner")
19+let key_meedusAddress = "meedusAddress"
2320
21+let key_registrarAddress = "registrarAddress"
2422
25-func key_Name_resolver (name) = key_entity("Name", name, "resolver")
23+let key_meedusInitTimestamp = "meedusInitTimestamp"
2624
25+let meedusAddress = getStringOrThrow(this, key_meedusAddress)
2726
28-func key_Name_expiresAt (name) = key_entity("Name", name, "expiresAt")
27+let meedus = parseAddressOrThrow(meedusAddress)
2928
29+let registrarAddress = getStringOrThrow(this, key_registrarAddress)
3030
31-func key_Name_createdAt (name) = key_entity("Name", name, "createdAt")
31+let registrar = parseAddressOrThrow(registrarAddress)
3232
33-
34-let key_nameTTL = "nameTTL"
35-
36-let key_controllers = "controllers"
37-
38-func _setOwner (name,owner) = [StringEntry(key_Name_owner(name), owner)]
39-
40-
41-func _getOwner (name) = getString(this, key_Name_owner(name))
42-
43-
44-func _getResolver (name) = getString(this, key_Name_resolver(name))
45-
46-
47-func _getToken (name) = getString(this, key_Name_token(name))
48-
49-
50-func _getCreatedAt (name) = getInteger(this, key_Name_createdAt(name))
51-
52-
53-func _getExpiresAt (name) = getInteger(this, key_Name_expiresAt(name))
54-
55-
56-func _getControllers () = getString(this, key_controllers)
57-
58-
59-let controllers = match _getControllers() {
60- case repr: String =>
61- split(repr, ",")
62- case _ =>
63- nil
64-}
65-
66-let nameTTL = getIntegerOrThrow(this, key_nameTTL)
67-
68-func isRegisteredName (name) = isDefined(getString(this, key_Name_token(name)))
69-
70-
71-func isCreatedName (name) = isDefined(_getCreatedAt(name))
72-
73-
74-func isExpiredName (name) = match _getExpiresAt(name) {
75- case expiresAt: Int =>
76- (lastBlock.timestamp > expiresAt)
77- case _ =>
78- false
79-}
80-
81-
82-func isActiveName (name) = if (if (isRegisteredName(name))
83- then isCreatedName(name)
84- else false)
85- then !(isExpiredName(name))
86- else false
87-
88-
89-func isValidName (name) = {
90- let symbols = "abcdefghijklmnopqrstuvwxyz1234567890-"
91- func validateChars (isValid,char) = if (isValid)
92- then contains(symbols, char)
93- else false
94-
95- if (if (if (if (if ((size(name) > 0))
96- then (63 >= size(name))
97- else false)
98- then (indexOf(name, "--") != 2)
99- else false)
100- then (indexOf(name, "-") != 0)
101- else false)
102- then (lastIndexOf(name, "-") != (size(name) - 1))
103- else false)
104- then {
105- let $l = split(name, "")
106- let $s = size($l)
107- let $acc0 = true
108- func $f0_1 ($a,$i) = if (($i >= $s))
109- then $a
110- else validateChars($a, $l[$i])
111-
112- func $f0_2 ($a,$i) = if (($i >= $s))
113- then $a
114- else throw("List size exceeds 63")
115-
116- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63)
117- }
118- else false
119- }
120-
121-
122-func isAvailableName (name) = if (isValidName(name))
123- then if (!(isRegisteredName(name)))
124- then true
125- else isExpiredName(name)
126- else false
127-
128-
129-func isValidAddress (maybeAddress) = isDefined(addressFromString(maybeAddress))
130-
131-
132-func isAdmin (inv) = (inv.caller == this)
133-
134-
135-func isOwner (inv,name) = (toString(inv.originCaller) == valueOrElse(_getOwner(name), ""))
136-
137-
138-func isController (address) = containsElement(controllers, address)
139-
140-
141-func _splitLastLabel (name) = {
142- let labels = split(name, ".")
143- let lastIndex = (size(labels) - 1)
144- let lastLabel = labels[lastIndex]
145- let restLabels = makeString(removeByIndex(labels, lastIndex), ".")
146- $Tuple2(lastLabel, restLabels)
147- }
148-
149-
150-func _issueNameToken (name) = [Issue(if ((size(name) > 16))
151- then (take(name, 15) + "~")
152- else take(name, 16), (name + ".waves"), 1, 0, false)]
153-
154-
155-func _registerNameWithToken (name,tokenId,createdAt) = [StringEntry(key_Name_token(name), tokenId), StringEntry(key_Token_name(tokenId), name), IntegerEntry(key_Name_createdAt(name), createdAt), IntegerEntry(key_Name_expiresAt(name), (createdAt + nameTTL))]
156-
157-
158-func _restoreNameWithToken (name,tokenId) = [StringEntry(key_Name_token(name), tokenId), StringEntry(key_Token_name(tokenId), name)]
159-
160-
161-func _transferTokenToOwner (tokenId,owner) = [ScriptTransfer(parseAddressOrThrow(owner), 1, fromBase58String(tokenId))]
162-
163-
164-func modifiers (validations) = unit
165-
166-
167-func onlyAdmin (inv) = if (isAdmin(inv))
168- then unit
169- else throw("Permission denied")
170-
171-
172-func onlyController (inv) = if (if (isAdmin(inv))
173- then true
174- else isController(toString(inv.caller)))
175- then unit
176- else throw("Permission denied")
177-
178-
179-func onlyOwner (inv,name) = if (if (isAdmin(inv))
180- then true
181- else isOwner(inv, name))
182- then unit
183- else throw("Permission denied")
184-
33+let meedusInitTimestamp = getIntegerOrThrow(this, key_meedusInitTimestamp)
18534
18635 @Callable(inv)
187-func init (nameTTL) = valueOrElse(modifiers([onlyAdmin(inv), if ((nameTTL > 0))
188- then unit
189- else throw("TTL cannot be negative")]), [IntegerEntry(key_nameTTL, nameTTL)])
36+func init (meedusAddress,registrarAddress,meedusInitTimestamp) = [StringEntry(key_meedusAddress, meedusAddress), StringEntry(key_registrarAddress, registrarAddress), IntegerEntry(key_meedusInitTimestamp, meedusInitTimestamp)]
19037
19138
19239
19340 @Callable(inv)
194-func supportsInterface (interfaceId) = $Tuple2(nil, containsElement(["getOwner", "getResolver", "getNameCreated", "getNameExpires"], interfaceId))
41+func transfer (addressStr,asset) = {
42+ let address = parseAddressOrThrow(addressStr)
43+[ScriptTransfer(address, 1, asset)]
44+ }
19545
19646
19747
19848 @Callable(inv)
199-func addController (address) = valueOrElse(modifiers([onlyAdmin(inv), if (isValidAddress(address))
200- then unit
201- else throw("Controller must be a valid address"), if (!(isController(address)))
202- then unit
203- else throw((("Controller `" + address) + "` is already registered"))]), [StringEntry(key_controllers, makeString((controllers :+ address), ","))])
49+func reserve (name) = {
50+ let caller = inv.caller
51+ let callerStr = toString(caller)
52+ if ((this != caller))
53+ then throw("Only self call are allowed")
54+ else {
55+ let reservation = invoke(registrar, "register", [name, callerStr, meedusInitTimestamp], nil)
56+ if ((reservation == reservation))
57+ then nil
58+ else throw("Strict value is not equal to itself.")
59+ }
60+ }
20461
20562
20663
20764 @Callable(inv)
208-func removeController (address) = valueOrElse(modifiers([onlyAdmin(inv), if (isController(address))
209- then unit
210- else throw((("Controller `" + address) + "` is not registered"))]), {
211- let controllerIndex = value(indexOf(controllers, address))
212-[StringEntry(key_controllers, makeString(removeByIndex(controllers, controllerIndex), ","))]
213- })
214-
215-
216-
217-@Callable(inv)
218-func isValid (name) = $Tuple2(nil, isValidName(name))
219-
220-
221-
222-@Callable(inv)
223-func isAvailable (name) = $Tuple2(nil, isAvailableName(name))
224-
225-
226-
227-@Callable(inv)
228-func getOwner (name) = $Tuple2(nil, _getOwner(_splitLastLabel(name)._1))
229-
230-
231-
232-@Callable(inv)
233-func getResolver (name) = $Tuple2(nil, _getResolver(_splitLastLabel(name)._1))
234-
235-
236-
237-@Callable(inv)
238-func getNameCreated (name) = $Tuple2(nil, _getCreatedAt(_splitLastLabel(name)._1))
239-
240-
241-
242-@Callable(inv)
243-func getNameExpires (name) = $Tuple2(nil, _getExpiresAt(_splitLastLabel(name)._1))
244-
245-
246-
247-@Callable(inv)
248-func register (name,owner,createdAt) = valueOrElse(modifiers([onlyController(inv), if (isAvailableName(name))
249- then unit
250- else throw((("`" + name) + "` cannot be registered")), if (isValidAddress(owner))
251- then unit
252- else throw("Owner must be a valid address"), if ((createdAt > 0))
253- then unit
254- else throw("CreatedAt cannot be negative"), if ((lastBlock.timestamp >= createdAt))
255- then unit
256- else throw("CreatedAt cannot be in the future")]), {
257- let issueNameToken = _issueNameToken(name)
258- let tokenId = calculateAssetId(issueNameToken[0])
259- let tokenStr = toBase58String(tokenId)
260- let registerNameWithToken = _registerNameWithToken(name, tokenStr, createdAt)
261- let transferTokenToOwner = _transferTokenToOwner(tokenStr, owner)
262- let setOwnership = _setOwner(name, owner)
263- (((issueNameToken ++ registerNameWithToken) ++ transferTokenToOwner) ++ setOwnership)
264- })
265-
266-
267-
268-@Callable(inv)
269-func reclaim (name) = valueOrElse(modifiers([if (isActiveName(name))
270- then unit
271- else throw((("`" + name) + "` is not active"))]), {
272- let newOwner = inv.originCaller
273- let newOwnerAddress = toString(newOwner)
274- let tokenStr = valueOrErrorMessage(_getToken(name), (("No token is issued for `" + name) + "`"))
275- let tokenId = fromBase58String(tokenStr)
276- let hasToken = (assetBalance(newOwner, tokenId) == 1)
277- let isTokenOwner = isOwner(inv, name)
278- let isTokenExists = match assetInfo(tokenId) {
279- case token: Asset =>
280- (token.quantity == 1)
281- case _ =>
282- false
65+func exchange () = {
66+ let caller = inv.originCaller
67+ let callerStr = toString(caller)
68+ let pmt = inv.payments[0]
69+ let assetId = valueOrErrorMessage(pmt.assetId, "Asset cannot be WAVES")
70+ let asset = valueOrErrorMessage(assetInfo(assetId), "Invalid asset")
71+ let isMeedusNFT = if (if (if ((asset.issuer == meedus))
72+ then (asset.quantity == 1)
73+ else false)
74+ then (asset.decimals == 0)
75+ else false)
76+ then (asset.reissuable == false)
77+ else false
78+ if (if ((pmt.amount != 1))
79+ then true
80+ else !(isMeedusNFT))
81+ then throw("Payment should contain Meedus NFT")
82+ else {
83+ let tokenStr = getStringOrThrow(registrar, key_Name_token(asset.name))
84+ let token = toBytes(tokenStr)
85+ let transfer = invoke(this, "transfer", [callerStr, assetId], nil)
86+ if ((transfer == transfer))
87+ then nil
88+ else throw("Strict value is not equal to itself.")
89+ }
28390 }
284- if (if (isTokenOwner)
285- then !(isTokenExists)
286- else false)
287- then {
288- let issueNewToken = _issueNameToken(name)
289- let newTokenId = calculateAssetId(issueNewToken[0])
290- let newTokenStr = toBase58String(newTokenId)
291- let restoreNameWithNewToken = _restoreNameWithToken(name, newTokenStr)
292- let transferNewTokenToOwner = _transferTokenToOwner(newTokenStr, newOwnerAddress)
293- ((issueNewToken ++ restoreNameWithNewToken) ++ transferNewTokenToOwner)
294- }
295- else if (if (isTokenOwner)
296- then hasToken
297- else false)
298- then throw("You already own a name token")
299- else if (!(hasToken))
300- then throw("You don't have a name token")
301- else _setOwner(name, newOwnerAddress)
302- })
30391
30492
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func getStringOrThrow (address,key) = valueOrErrorMessage(getString(address, key), ((("Can't read '" + key) + "' at address ") + toString(address)))
55
66
77 func getIntegerOrThrow (address,key) = valueOrErrorMessage(getInteger(address, key), ((("Can't read '" + key) + "' at address ") + toString(address)))
88
99
1010 func parseAddressOrThrow (maybeAddress) = valueOrErrorMessage(addressFromString(maybeAddress), (("Can't parse address from '" + maybeAddress) + "'"))
1111
1212
1313 func key_entity (name,pk,property) = ((((name + "_") + pk) + "_") + property)
1414
1515
16-func key_Token_name (tokenId) = key_entity("Token", tokenId, "name")
17-
18-
1916 func key_Name_token (name) = key_entity("Name", name, "token")
2017
2118
22-func key_Name_owner (name) = key_entity("Name", name, "owner")
19+let key_meedusAddress = "meedusAddress"
2320
21+let key_registrarAddress = "registrarAddress"
2422
25-func key_Name_resolver (name) = key_entity("Name", name, "resolver")
23+let key_meedusInitTimestamp = "meedusInitTimestamp"
2624
25+let meedusAddress = getStringOrThrow(this, key_meedusAddress)
2726
28-func key_Name_expiresAt (name) = key_entity("Name", name, "expiresAt")
27+let meedus = parseAddressOrThrow(meedusAddress)
2928
29+let registrarAddress = getStringOrThrow(this, key_registrarAddress)
3030
31-func key_Name_createdAt (name) = key_entity("Name", name, "createdAt")
31+let registrar = parseAddressOrThrow(registrarAddress)
3232
33-
34-let key_nameTTL = "nameTTL"
35-
36-let key_controllers = "controllers"
37-
38-func _setOwner (name,owner) = [StringEntry(key_Name_owner(name), owner)]
39-
40-
41-func _getOwner (name) = getString(this, key_Name_owner(name))
42-
43-
44-func _getResolver (name) = getString(this, key_Name_resolver(name))
45-
46-
47-func _getToken (name) = getString(this, key_Name_token(name))
48-
49-
50-func _getCreatedAt (name) = getInteger(this, key_Name_createdAt(name))
51-
52-
53-func _getExpiresAt (name) = getInteger(this, key_Name_expiresAt(name))
54-
55-
56-func _getControllers () = getString(this, key_controllers)
57-
58-
59-let controllers = match _getControllers() {
60- case repr: String =>
61- split(repr, ",")
62- case _ =>
63- nil
64-}
65-
66-let nameTTL = getIntegerOrThrow(this, key_nameTTL)
67-
68-func isRegisteredName (name) = isDefined(getString(this, key_Name_token(name)))
69-
70-
71-func isCreatedName (name) = isDefined(_getCreatedAt(name))
72-
73-
74-func isExpiredName (name) = match _getExpiresAt(name) {
75- case expiresAt: Int =>
76- (lastBlock.timestamp > expiresAt)
77- case _ =>
78- false
79-}
80-
81-
82-func isActiveName (name) = if (if (isRegisteredName(name))
83- then isCreatedName(name)
84- else false)
85- then !(isExpiredName(name))
86- else false
87-
88-
89-func isValidName (name) = {
90- let symbols = "abcdefghijklmnopqrstuvwxyz1234567890-"
91- func validateChars (isValid,char) = if (isValid)
92- then contains(symbols, char)
93- else false
94-
95- if (if (if (if (if ((size(name) > 0))
96- then (63 >= size(name))
97- else false)
98- then (indexOf(name, "--") != 2)
99- else false)
100- then (indexOf(name, "-") != 0)
101- else false)
102- then (lastIndexOf(name, "-") != (size(name) - 1))
103- else false)
104- then {
105- let $l = split(name, "")
106- let $s = size($l)
107- let $acc0 = true
108- func $f0_1 ($a,$i) = if (($i >= $s))
109- then $a
110- else validateChars($a, $l[$i])
111-
112- func $f0_2 ($a,$i) = if (($i >= $s))
113- then $a
114- else throw("List size exceeds 63")
115-
116- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63)
117- }
118- else false
119- }
120-
121-
122-func isAvailableName (name) = if (isValidName(name))
123- then if (!(isRegisteredName(name)))
124- then true
125- else isExpiredName(name)
126- else false
127-
128-
129-func isValidAddress (maybeAddress) = isDefined(addressFromString(maybeAddress))
130-
131-
132-func isAdmin (inv) = (inv.caller == this)
133-
134-
135-func isOwner (inv,name) = (toString(inv.originCaller) == valueOrElse(_getOwner(name), ""))
136-
137-
138-func isController (address) = containsElement(controllers, address)
139-
140-
141-func _splitLastLabel (name) = {
142- let labels = split(name, ".")
143- let lastIndex = (size(labels) - 1)
144- let lastLabel = labels[lastIndex]
145- let restLabels = makeString(removeByIndex(labels, lastIndex), ".")
146- $Tuple2(lastLabel, restLabels)
147- }
148-
149-
150-func _issueNameToken (name) = [Issue(if ((size(name) > 16))
151- then (take(name, 15) + "~")
152- else take(name, 16), (name + ".waves"), 1, 0, false)]
153-
154-
155-func _registerNameWithToken (name,tokenId,createdAt) = [StringEntry(key_Name_token(name), tokenId), StringEntry(key_Token_name(tokenId), name), IntegerEntry(key_Name_createdAt(name), createdAt), IntegerEntry(key_Name_expiresAt(name), (createdAt + nameTTL))]
156-
157-
158-func _restoreNameWithToken (name,tokenId) = [StringEntry(key_Name_token(name), tokenId), StringEntry(key_Token_name(tokenId), name)]
159-
160-
161-func _transferTokenToOwner (tokenId,owner) = [ScriptTransfer(parseAddressOrThrow(owner), 1, fromBase58String(tokenId))]
162-
163-
164-func modifiers (validations) = unit
165-
166-
167-func onlyAdmin (inv) = if (isAdmin(inv))
168- then unit
169- else throw("Permission denied")
170-
171-
172-func onlyController (inv) = if (if (isAdmin(inv))
173- then true
174- else isController(toString(inv.caller)))
175- then unit
176- else throw("Permission denied")
177-
178-
179-func onlyOwner (inv,name) = if (if (isAdmin(inv))
180- then true
181- else isOwner(inv, name))
182- then unit
183- else throw("Permission denied")
184-
33+let meedusInitTimestamp = getIntegerOrThrow(this, key_meedusInitTimestamp)
18534
18635 @Callable(inv)
187-func init (nameTTL) = valueOrElse(modifiers([onlyAdmin(inv), if ((nameTTL > 0))
188- then unit
189- else throw("TTL cannot be negative")]), [IntegerEntry(key_nameTTL, nameTTL)])
36+func init (meedusAddress,registrarAddress,meedusInitTimestamp) = [StringEntry(key_meedusAddress, meedusAddress), StringEntry(key_registrarAddress, registrarAddress), IntegerEntry(key_meedusInitTimestamp, meedusInitTimestamp)]
19037
19138
19239
19340 @Callable(inv)
194-func supportsInterface (interfaceId) = $Tuple2(nil, containsElement(["getOwner", "getResolver", "getNameCreated", "getNameExpires"], interfaceId))
41+func transfer (addressStr,asset) = {
42+ let address = parseAddressOrThrow(addressStr)
43+[ScriptTransfer(address, 1, asset)]
44+ }
19545
19646
19747
19848 @Callable(inv)
199-func addController (address) = valueOrElse(modifiers([onlyAdmin(inv), if (isValidAddress(address))
200- then unit
201- else throw("Controller must be a valid address"), if (!(isController(address)))
202- then unit
203- else throw((("Controller `" + address) + "` is already registered"))]), [StringEntry(key_controllers, makeString((controllers :+ address), ","))])
49+func reserve (name) = {
50+ let caller = inv.caller
51+ let callerStr = toString(caller)
52+ if ((this != caller))
53+ then throw("Only self call are allowed")
54+ else {
55+ let reservation = invoke(registrar, "register", [name, callerStr, meedusInitTimestamp], nil)
56+ if ((reservation == reservation))
57+ then nil
58+ else throw("Strict value is not equal to itself.")
59+ }
60+ }
20461
20562
20663
20764 @Callable(inv)
208-func removeController (address) = valueOrElse(modifiers([onlyAdmin(inv), if (isController(address))
209- then unit
210- else throw((("Controller `" + address) + "` is not registered"))]), {
211- let controllerIndex = value(indexOf(controllers, address))
212-[StringEntry(key_controllers, makeString(removeByIndex(controllers, controllerIndex), ","))]
213- })
214-
215-
216-
217-@Callable(inv)
218-func isValid (name) = $Tuple2(nil, isValidName(name))
219-
220-
221-
222-@Callable(inv)
223-func isAvailable (name) = $Tuple2(nil, isAvailableName(name))
224-
225-
226-
227-@Callable(inv)
228-func getOwner (name) = $Tuple2(nil, _getOwner(_splitLastLabel(name)._1))
229-
230-
231-
232-@Callable(inv)
233-func getResolver (name) = $Tuple2(nil, _getResolver(_splitLastLabel(name)._1))
234-
235-
236-
237-@Callable(inv)
238-func getNameCreated (name) = $Tuple2(nil, _getCreatedAt(_splitLastLabel(name)._1))
239-
240-
241-
242-@Callable(inv)
243-func getNameExpires (name) = $Tuple2(nil, _getExpiresAt(_splitLastLabel(name)._1))
244-
245-
246-
247-@Callable(inv)
248-func register (name,owner,createdAt) = valueOrElse(modifiers([onlyController(inv), if (isAvailableName(name))
249- then unit
250- else throw((("`" + name) + "` cannot be registered")), if (isValidAddress(owner))
251- then unit
252- else throw("Owner must be a valid address"), if ((createdAt > 0))
253- then unit
254- else throw("CreatedAt cannot be negative"), if ((lastBlock.timestamp >= createdAt))
255- then unit
256- else throw("CreatedAt cannot be in the future")]), {
257- let issueNameToken = _issueNameToken(name)
258- let tokenId = calculateAssetId(issueNameToken[0])
259- let tokenStr = toBase58String(tokenId)
260- let registerNameWithToken = _registerNameWithToken(name, tokenStr, createdAt)
261- let transferTokenToOwner = _transferTokenToOwner(tokenStr, owner)
262- let setOwnership = _setOwner(name, owner)
263- (((issueNameToken ++ registerNameWithToken) ++ transferTokenToOwner) ++ setOwnership)
264- })
265-
266-
267-
268-@Callable(inv)
269-func reclaim (name) = valueOrElse(modifiers([if (isActiveName(name))
270- then unit
271- else throw((("`" + name) + "` is not active"))]), {
272- let newOwner = inv.originCaller
273- let newOwnerAddress = toString(newOwner)
274- let tokenStr = valueOrErrorMessage(_getToken(name), (("No token is issued for `" + name) + "`"))
275- let tokenId = fromBase58String(tokenStr)
276- let hasToken = (assetBalance(newOwner, tokenId) == 1)
277- let isTokenOwner = isOwner(inv, name)
278- let isTokenExists = match assetInfo(tokenId) {
279- case token: Asset =>
280- (token.quantity == 1)
281- case _ =>
282- false
65+func exchange () = {
66+ let caller = inv.originCaller
67+ let callerStr = toString(caller)
68+ let pmt = inv.payments[0]
69+ let assetId = valueOrErrorMessage(pmt.assetId, "Asset cannot be WAVES")
70+ let asset = valueOrErrorMessage(assetInfo(assetId), "Invalid asset")
71+ let isMeedusNFT = if (if (if ((asset.issuer == meedus))
72+ then (asset.quantity == 1)
73+ else false)
74+ then (asset.decimals == 0)
75+ else false)
76+ then (asset.reissuable == false)
77+ else false
78+ if (if ((pmt.amount != 1))
79+ then true
80+ else !(isMeedusNFT))
81+ then throw("Payment should contain Meedus NFT")
82+ else {
83+ let tokenStr = getStringOrThrow(registrar, key_Name_token(asset.name))
84+ let token = toBytes(tokenStr)
85+ let transfer = invoke(this, "transfer", [callerStr, assetId], nil)
86+ if ((transfer == transfer))
87+ then nil
88+ else throw("Strict value is not equal to itself.")
89+ }
28390 }
284- if (if (isTokenOwner)
285- then !(isTokenExists)
286- else false)
287- then {
288- let issueNewToken = _issueNameToken(name)
289- let newTokenId = calculateAssetId(issueNewToken[0])
290- let newTokenStr = toBase58String(newTokenId)
291- let restoreNameWithNewToken = _restoreNameWithToken(name, newTokenStr)
292- let transferNewTokenToOwner = _transferTokenToOwner(newTokenStr, newOwnerAddress)
293- ((issueNewToken ++ restoreNameWithNewToken) ++ transferNewTokenToOwner)
294- }
295- else if (if (isTokenOwner)
296- then hasToken
297- else false)
298- then throw("You already own a name token")
299- else if (!(hasToken))
300- then throw("You don't have a name token")
301- else _setOwner(name, newOwnerAddress)
302- })
30391
30492

github/deemru/w8io/3ef1775 
81.67 ms