tx · HQKJNcgRN3YhsZ2sAG5HFQ6LGi9FbojNaB2yCrm51qis

3MvCgypmBZFTRqL5HuRwCgS7maC7Fkv7pZY:  -0.01000000 Waves

2022.10.20 18:40 [2280924] smart account 3MvCgypmBZFTRqL5HuRwCgS7maC7Fkv7pZY > SELF 0.00000000 Waves

{ "type": 13, "id": "HQKJNcgRN3YhsZ2sAG5HFQ6LGi9FbojNaB2yCrm51qis", "fee": 1000000, "feeAssetId": null, "timestamp": 1666280452325, "version": 2, "chainId": 84, "sender": "3MvCgypmBZFTRqL5HuRwCgS7maC7Fkv7pZY", "senderPublicKey": "BqGSAiYghM27RZ2Axx3bmTudq9koHT4575AeK31Wx2Pp", "proofs": [ "iHYKkeoCyjKPQLaS8DtkkmYFYP6yiRU5NPJXcUydicoQQqEwahYXLpKw3H8b7GPgTLcGi1GtoEKoqdCiTdiTrcG" ], "script": "base64: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dHJhbnQJAQAAAAV2YWx1ZQAAAAEFAAAAD21heWJlUmVnaXN0cmFudAQAAAAOcGFyZW50UmVzb2x2ZXIJAQAAAAxfZ2V0UmVzb2x2ZXIAAAABBQAAAAlsYXN0TGFiZWwEAAAADXBhcmVudENyZWF0ZWQJAQAAAA1fZ2V0Q3JlYXRlZEF0AAAAAQUAAAAJbGFzdExhYmVsBAAAAAVvd25lcgQAAAAHJG1hdGNoMAkBAAAAF19jYWxsU3VwcG9ydGVkSW50ZXJmYWNlAAAAAwUAAAAKcmVnaXN0cmFudAIAAAAFb3duZXIFAAAACnJlc3RMYWJlbHMDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAAFb3duZXIFAAAAByRtYXRjaDADCQEAAAAOaXNWYWxpZEFkZHJlc3MAAAABBQAAAAVvd25lcgUAAAAFb3duZXIFAAAABHVuaXQFAAAABHVuaXQEAAAACHJlc29sdmVyBAAAAAckbWF0Y2gwCQEAAAAXX2NhbGxTdXBwb3J0ZWRJbnRlcmZhY2UAAAADBQAAAApyZWdpc3RyYW50AgAAAAhyZXNvbHZlcgUAAAAKcmVzdExhYmVscwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAhyZXNvbHZlcgUAAAAHJG1hdGNoMAMJAQAAAA5pc1ZhbGlkQWRkcmVzcwAAAAEFAAAACHJlc29sdmVyBQAAAAhyZXNvbHZlcgUAAAAEdW5pdAUAAAAEdW5pdAQAAAALbmFtZUNyZWF0ZWQEAAAAByRtYXRjaDAJAQAAABdfY2FsbFN1cHBvcnRlZEludGVyZmFjZQAAAAMFAAAACnJlZ2lzdHJhbnQCAAAAC25hbWVDcmVhdGVkBQAAAApyZXN0TGFiZWxzAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAC25hbWVDcmVhdGVkBQAAAAckbWF0Y2gwAwMJAABmAAAAAgUAAAALbmFtZUNyZWF0ZWQAAAAAAAAAAAAJAABmAAAAAggFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAFAAAAC25hbWVDcmVhdGVkBwUAAAALbmFtZUNyZWF0ZWQFAAAABHVuaXQFAAAABHVuaXQEAAAAC25hbWVFeHBpcmVzBAAAAAckbWF0Y2gwCQEAAAAXX2NhbGxTdXBwb3J0ZWRJbnRlcmZhY2UAAAADBQAAAApyZWdpc3RyYW50AgAAAAtuYW1lRXhwaXJlcwUAAAAKcmVzdExhYmVscwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAtuYW1lRXhwaXJlcwUAAAAHJG1hdGNoMAMJAABmAAAAAgUAAAALbmFtZUV4cGlyZXMAAAAAAAAAAAAFAAAAC25hbWVFeHBpcmVzBQAAAAR1bml0BQAAAAR1bml0BAAAAAppc1Jvb3ROYW1lAwkAAGYAAAACCQABMQAAAAEFAAAACWxhc3RMYWJlbAAAAAAAAAAAAAkAAAAAAAACCQABMQAAAAEFAAAACnJlc3RMYWJlbHMAAAAAAAAAAAAHAwMFAAAACmlzUm9vdE5hbWUGCQEAAAABIQAAAAEJAQAAAAlpc0RlZmluZWQAAAABBQAAAA9tYXliZVJlZ2lzdHJhbnQJAAUUAAAAAgUAAAADbmlsCQAFFgAAAAQFAAAAEXJlZ2lzdHJhbnRBZGRyZXNzBQAAAA5wYXJlbnRSZXNvbHZlcgUAAAANcGFyZW50Q3JlYXRlZAUAAAAEdW5pdAkABRQAAAACBQAAAANuaWwJAAUWAAAABAUAAAAFb3duZXIFAAAACHJlc29sdmVyBQAAAAtuYW1lQ3JlYXRlZAUAAAALbmFtZUV4cGlyZXMAAAAANe78uw==", "height": 2280924, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8CfJRrbiFPx4hyb9GUP2pQy9asF8vnZ8SPUwgPVP3gD9 Next: HJs69bGWLZoxDjkYVFWb8CtmkRXR3TQnB3348YFQSrXm 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")
16+func key_Name_owner (node) = key_entity("Name", node, "owner")
1717
1818
19-func key_Name_token (name) = key_entity("Name", name, "token")
19+func key_Name_resolver (node) = key_entity("Name", node, "resolver")
2020
2121
22-func key_Name_owner (name) = key_entity("Name", name, "owner")
22+func key_Name_createdAt (node) = key_entity("Name", node, "createdAt")
2323
2424
25-func key_Name_resolver (name) = key_entity("Name", name, "resolver")
25+func _getOwner (node) = getString(this, key_Name_owner(node))
2626
2727
28-func key_Name_expiresAt (name) = key_entity("Name", name, "expiresAt")
28+func _setOwner (node,owner) = [StringEntry(key_Name_owner(node), owner)]
2929
3030
31-func key_Name_createdAt (name) = key_entity("Name", name, "createdAt")
31+func _getResolver (node) = getString(this, key_Name_resolver(node))
3232
3333
34-let key_nameTTL = "nameTTL"
35-
36-let key_controllers = "controllers"
37-
38-func _setOwner (name,owner) = [StringEntry(key_Name_owner(name), owner)]
34+func _setResolver (node,resolver) = [StringEntry(key_Name_resolver(node), resolver)]
3935
4036
41-func _getOwner (name) = getString(this, key_Name_owner(name))
37+func _getCreatedAt (node) = getInteger(this, key_Name_createdAt(node))
4238
4339
44-func _setResolver (name,resolver) = [StringEntry(key_Name_resolver(name), resolver)]
45-
46-
47-func _getResolver (name) = getString(this, key_Name_resolver(name))
48-
49-
50-func _getToken (name) = getString(this, key_Name_token(name))
51-
52-
53-func _getCreatedAt (name) = getInteger(this, key_Name_createdAt(name))
54-
55-
56-func _getExpiresAt (name) = getInteger(this, key_Name_expiresAt(name))
57-
58-
59-func _getControllers () = getString(this, key_controllers)
60-
61-
62-let controllers = match _getControllers() {
63- case repr: String =>
64- split(repr, ",")
65- case _ =>
66- nil
67-}
68-
69-let nameTTL = getIntegerOrThrow(this, key_nameTTL)
70-
71-func isRegisteredName (name) = isDefined(getString(this, key_Name_token(name)))
72-
73-
74-func isCreatedName (name) = isDefined(_getCreatedAt(name))
75-
76-
77-func isExpiredName (name) = match _getExpiresAt(name) {
78- case expiresAt: Int =>
79- (lastBlock.timestamp > expiresAt)
80- case _ =>
81- false
82-}
83-
84-
85-func isActiveName (name) = if (if (isRegisteredName(name))
86- then isCreatedName(name)
87- else false)
88- then !(isExpiredName(name))
89- else false
90-
91-
92-func isValidName (name) = {
93- let symbols = "abcdefghijklmnopqrstuvwxyz1234567890-"
94- func validateChars (isValid,char) = if (isValid)
95- then contains(symbols, char)
96- else false
97-
98- if (if (if (if (if ((size(name) > 0))
99- then (63 >= size(name))
100- else false)
101- then (indexOf(name, "--") != 2)
102- else false)
103- then (indexOf(name, "-") != 0)
104- else false)
105- then (lastIndexOf(name, "-") != (size(name) - 1))
106- else false)
107- then {
108- let $l = split(name, "")
109- let $s = size($l)
110- let $acc0 = true
111- func $f0_1 ($a,$i) = if (($i >= $s))
112- then $a
113- else validateChars($a, $l[$i])
114-
115- func $f0_2 ($a,$i) = if (($i >= $s))
116- then $a
117- else throw("List size exceeds 63")
118-
119- $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)
120- }
121- else false
122- }
123-
124-
125-func isAvailableName (name) = if (isValidName(name))
126- then if (!(isRegisteredName(name)))
127- then true
128- else isExpiredName(name)
129- else false
130-
131-
132-func isValidAddress (maybeAddress) = isDefined(addressFromString(maybeAddress))
40+func _setCreatedAt (node,createdAt) = [IntegerEntry(key_Name_createdAt(node), createdAt)]
13341
13442
13543 func isAdmin (inv) = (inv.caller == this)
13644
13745
138-func isOwner (inv,name) = (toString(inv.caller) == valueOrElse(_getOwner(name), ""))
46+func isOwner (inv,node) = (toString(inv.caller) == valueOrElse(_getOwner(node), ""))
13947
14048
141-func isController (address) = containsElement(controllers, address)
49+func isValidAddress (maybeAddress) = isDefined(addressFromString(maybeAddress))
14250
14351
14452 func _splitLastLabel (name) = {
15058 }
15159
15260
153-func _issueNameToken (name) = [Issue(if ((size(name) > 16))
154- then (take(name, 15) + "~")
155- else take(name, 16), (name + ".waves"), 1, 0, false)]
156-
157-
158-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))]
159-
160-
161-func _restoreNameWithToken (name,tokenId) = [StringEntry(key_Name_token(name), tokenId), StringEntry(key_Token_name(tokenId), name)]
162-
163-
164-func _transferTokenToOwner (tokenId,owner) = [ScriptTransfer(parseAddressOrThrow(owner), 1, fromBase58String(tokenId))]
61+func _callSupportedInterface (registrant,interfaceId,restLabels) = match invoke(registrant, "supportsInterface", [interfaceId], nil) {
62+ case supportsInterface: Boolean =>
63+ if (!(supportsInterface))
64+ then unit
65+ else match invoke(value(registrant), interfaceId, [restLabels], nil) {
66+ case maybeString: String =>
67+ maybeString
68+ case maybeInt: Int =>
69+ maybeInt
70+ case _ =>
71+ unit
72+ }
73+ case _ =>
74+ unit
75+}
16576
16677
16778 func modifiers (validations) = unit
17283 else throw("Permission denied")
17384
17485
175-func onlyController (inv) = if (if (isAdmin(inv))
86+func onlyOwner (inv,node) = if (if (isAdmin(inv))
17687 then true
177- else isController(toString(inv.caller)))
178- then unit
179- else throw("Permission denied")
180-
181-
182-func onlyOwner (inv,name) = if (if (isAdmin(inv))
183- then true
184- else isOwner(inv, name))
88+ else isOwner(inv, node))
18589 then unit
18690 else throw("Permission denied")
18791
18892
18993 @Callable(inv)
190-func init (nameTTL) = valueOrElse(modifiers([onlyAdmin(inv), if ((nameTTL > 0))
94+func setOwner (node,owner) = valueOrElse(modifiers([onlyOwner(inv, node), if (isValidAddress(owner))
19195 then unit
192- else throw("TTL cannot be negative")]), [IntegerEntry(key_nameTTL, nameTTL)])
96+ else throw("Owner must be a valid address")]), _setOwner(node, owner))
19397
19498
19599
196100 @Callable(inv)
197-func supportsInterface (interfaceId) = $Tuple2(nil, containsElement(["owner", "resolver", "nameCreated", "nameExpires"], interfaceId))
101+func owner (node) = $Tuple2(nil, _getOwner(node))
198102
199103
200104
201105 @Callable(inv)
202-func addController (address) = valueOrElse(modifiers([onlyAdmin(inv), if (isValidAddress(address))
203- then unit
204- else throw("Controller must be a valid address"), if (!(isController(address)))
205- then unit
206- else throw((("Controller `" + address) + "` is already registered"))]), [StringEntry(key_controllers, makeString((controllers :+ address), ","))])
106+func resolver (node) = $Tuple2(nil, _getResolver(node))
207107
208108
209109
210110 @Callable(inv)
211-func removeController (address) = valueOrElse(modifiers([onlyAdmin(inv), if (isController(address))
111+func setResolver (node,resolver) = valueOrElse(modifiers([onlyOwner(inv, node), if (isValidAddress(resolver))
212112 then unit
213- else throw((("Controller `" + address) + "` is not registered"))]), {
214- let controllerIndex = value(indexOf(controllers, address))
215-[StringEntry(key_controllers, makeString(removeByIndex(controllers, controllerIndex), ","))]
216- })
113+ else throw("Resolver must be a valid contract address")]), _setResolver(node, resolver))
217114
218115
219116
220117 @Callable(inv)
221-func validate (name) = $Tuple2(nil, isValidName(name))
118+func nameCreated (node) = $Tuple2(nil, _getCreatedAt(node))
222119
223120
224121
225122 @Callable(inv)
226-func available (name) = $Tuple2(nil, isAvailableName(name))
123+func setRecord (node,owner,resolver) = valueOrElse(modifiers([onlyAdmin(inv)]), ((_setOwner(node, owner) ++ _setResolver(node, resolver)) ++ _setCreatedAt(node, lastBlock.timestamp)))
227124
228125
229126
230127 @Callable(inv)
231-func owner (name) = $Tuple2(nil, _getOwner(_splitLastLabel(name)._1))
232-
233-
234-
235-@Callable(inv)
236-func resolver (name) = $Tuple2(nil, _getResolver(_splitLastLabel(name)._1))
237-
238-
239-
240-@Callable(inv)
241-func setResolver (name,resolver) = valueOrElse(modifiers([if (isActiveName(name))
128+func whoIs (name) = valueOrElse(modifiers([if ((size(name) > 0))
242129 then unit
243- else throw("Name expired or not registered"), onlyOwner(inv, name), if (isValidAddress(resolver))
244- then unit
245- else throw("Resolver must be a valid contract address")]), $Tuple2(nil, _setResolver(name, resolver)))
246-
247-
248-
249-@Callable(inv)
250-func nameCreated (name) = $Tuple2(nil, _getCreatedAt(_splitLastLabel(name)._1))
251-
252-
253-
254-@Callable(inv)
255-func nameExpires (name) = $Tuple2(nil, _getExpiresAt(_splitLastLabel(name)._1))
256-
257-
258-
259-@Callable(inv)
260-func register (name,owner,createdAt) = valueOrElse(modifiers([onlyController(inv), if (isAvailableName(name))
261- then unit
262- else throw((("`" + name) + "` cannot be registered")), if (isValidAddress(owner))
263- then unit
264- else throw("Owner must be a valid address"), if ((createdAt > 0))
265- then unit
266- else throw("CreatedAt cannot be negative"), if ((lastBlock.timestamp >= createdAt))
267- then unit
268- else throw("CreatedAt cannot be in the future")]), {
269- let issueNameToken = _issueNameToken(name)
270- let tokenId = calculateAssetId(issueNameToken[0])
271- let tokenStr = toBase58String(tokenId)
272- let registerNameWithToken = _registerNameWithToken(name, tokenStr, createdAt)
273- let transferTokenToOwner = _transferTokenToOwner(tokenStr, owner)
274- let setOwnership = _setOwner(name, owner)
275- (((issueNameToken ++ registerNameWithToken) ++ transferTokenToOwner) ++ setOwnership)
276- })
277-
278-
279-
280-@Callable(inv)
281-func reclaim (name) = valueOrElse(modifiers([if (isActiveName(name))
282- then unit
283- else throw((("`" + name) + "` is not active"))]), {
284- let newOwner = inv.caller
285- let newOwnerAddress = toString(newOwner)
286- let tokenStr = valueOrErrorMessage(_getToken(name), (("No token is issued for `" + name) + "`"))
287- let tokenId = fromBase58String(tokenStr)
288- let hasToken = (assetBalance(newOwner, tokenId) == 1)
289- let isTokenOwner = isOwner(inv, name)
290- let isTokenExists = match assetInfo(tokenId) {
291- case token: Asset =>
292- (token.quantity == 1)
130+ else throw("Name cannot be empty")]), {
131+ let $t043014352 = _splitLastLabel(name)
132+ let lastLabel = $t043014352._1
133+ let restLabels = $t043014352._2
134+ let registrantAddress = _getOwner(lastLabel)
135+ let maybeRegistrant = match registrantAddress {
136+ case owner: String =>
137+ addressFromString(owner)
293138 case _ =>
294- false
139+ unit
295140 }
296- if (if (isTokenOwner)
297- then !(isTokenExists)
298- else false)
299- then {
300- let issueNewToken = _issueNameToken(name)
301- let newTokenId = calculateAssetId(issueNewToken[0])
302- let newTokenStr = toBase58String(newTokenId)
303- let restoreNameWithNewToken = _restoreNameWithToken(name, newTokenStr)
304- let transferNewTokenToOwner = _transferTokenToOwner(newTokenStr, newOwnerAddress)
305- ((issueNewToken ++ restoreNameWithNewToken) ++ transferNewTokenToOwner)
306- }
307- else if (if (isTokenOwner)
308- then hasToken
309- else false)
310- then throw("You already own a name token")
311- else if (!(hasToken))
312- then throw("You don't have a name token")
313- else _setOwner(name, newOwnerAddress)
141+ let registrant = value(maybeRegistrant)
142+ let parentResolver = _getResolver(lastLabel)
143+ let parentCreated = _getCreatedAt(lastLabel)
144+ let owner = match _callSupportedInterface(registrant, "owner", restLabels) {
145+ case owner: String =>
146+ if (isValidAddress(owner))
147+ then owner
148+ else unit
149+ case _ =>
150+ unit
151+ }
152+ let resolver = match _callSupportedInterface(registrant, "resolver", restLabels) {
153+ case resolver: String =>
154+ if (isValidAddress(resolver))
155+ then resolver
156+ else unit
157+ case _ =>
158+ unit
159+ }
160+ let nameCreated = match _callSupportedInterface(registrant, "nameCreated", restLabels) {
161+ case nameCreated: Int =>
162+ if (if ((nameCreated > 0))
163+ then (lastBlock.timestamp > nameCreated)
164+ else false)
165+ then nameCreated
166+ else unit
167+ case _ =>
168+ unit
169+ }
170+ let nameExpires = match _callSupportedInterface(registrant, "nameExpires", restLabels) {
171+ case nameExpires: Int =>
172+ if ((nameExpires > 0))
173+ then nameExpires
174+ else unit
175+ case _ =>
176+ unit
177+ }
178+ let isRootName = if ((size(lastLabel) > 0))
179+ then (size(restLabels) == 0)
180+ else false
181+ if (if (isRootName)
182+ then true
183+ else !(isDefined(maybeRegistrant)))
184+ then $Tuple2(nil, $Tuple4(registrantAddress, parentResolver, parentCreated, unit))
185+ else $Tuple2(nil, $Tuple4(owner, resolver, nameCreated, nameExpires))
314186 })
315187
316188
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")
16+func key_Name_owner (node) = key_entity("Name", node, "owner")
1717
1818
19-func key_Name_token (name) = key_entity("Name", name, "token")
19+func key_Name_resolver (node) = key_entity("Name", node, "resolver")
2020
2121
22-func key_Name_owner (name) = key_entity("Name", name, "owner")
22+func key_Name_createdAt (node) = key_entity("Name", node, "createdAt")
2323
2424
25-func key_Name_resolver (name) = key_entity("Name", name, "resolver")
25+func _getOwner (node) = getString(this, key_Name_owner(node))
2626
2727
28-func key_Name_expiresAt (name) = key_entity("Name", name, "expiresAt")
28+func _setOwner (node,owner) = [StringEntry(key_Name_owner(node), owner)]
2929
3030
31-func key_Name_createdAt (name) = key_entity("Name", name, "createdAt")
31+func _getResolver (node) = getString(this, key_Name_resolver(node))
3232
3333
34-let key_nameTTL = "nameTTL"
35-
36-let key_controllers = "controllers"
37-
38-func _setOwner (name,owner) = [StringEntry(key_Name_owner(name), owner)]
34+func _setResolver (node,resolver) = [StringEntry(key_Name_resolver(node), resolver)]
3935
4036
41-func _getOwner (name) = getString(this, key_Name_owner(name))
37+func _getCreatedAt (node) = getInteger(this, key_Name_createdAt(node))
4238
4339
44-func _setResolver (name,resolver) = [StringEntry(key_Name_resolver(name), resolver)]
45-
46-
47-func _getResolver (name) = getString(this, key_Name_resolver(name))
48-
49-
50-func _getToken (name) = getString(this, key_Name_token(name))
51-
52-
53-func _getCreatedAt (name) = getInteger(this, key_Name_createdAt(name))
54-
55-
56-func _getExpiresAt (name) = getInteger(this, key_Name_expiresAt(name))
57-
58-
59-func _getControllers () = getString(this, key_controllers)
60-
61-
62-let controllers = match _getControllers() {
63- case repr: String =>
64- split(repr, ",")
65- case _ =>
66- nil
67-}
68-
69-let nameTTL = getIntegerOrThrow(this, key_nameTTL)
70-
71-func isRegisteredName (name) = isDefined(getString(this, key_Name_token(name)))
72-
73-
74-func isCreatedName (name) = isDefined(_getCreatedAt(name))
75-
76-
77-func isExpiredName (name) = match _getExpiresAt(name) {
78- case expiresAt: Int =>
79- (lastBlock.timestamp > expiresAt)
80- case _ =>
81- false
82-}
83-
84-
85-func isActiveName (name) = if (if (isRegisteredName(name))
86- then isCreatedName(name)
87- else false)
88- then !(isExpiredName(name))
89- else false
90-
91-
92-func isValidName (name) = {
93- let symbols = "abcdefghijklmnopqrstuvwxyz1234567890-"
94- func validateChars (isValid,char) = if (isValid)
95- then contains(symbols, char)
96- else false
97-
98- if (if (if (if (if ((size(name) > 0))
99- then (63 >= size(name))
100- else false)
101- then (indexOf(name, "--") != 2)
102- else false)
103- then (indexOf(name, "-") != 0)
104- else false)
105- then (lastIndexOf(name, "-") != (size(name) - 1))
106- else false)
107- then {
108- let $l = split(name, "")
109- let $s = size($l)
110- let $acc0 = true
111- func $f0_1 ($a,$i) = if (($i >= $s))
112- then $a
113- else validateChars($a, $l[$i])
114-
115- func $f0_2 ($a,$i) = if (($i >= $s))
116- then $a
117- else throw("List size exceeds 63")
118-
119- $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)
120- }
121- else false
122- }
123-
124-
125-func isAvailableName (name) = if (isValidName(name))
126- then if (!(isRegisteredName(name)))
127- then true
128- else isExpiredName(name)
129- else false
130-
131-
132-func isValidAddress (maybeAddress) = isDefined(addressFromString(maybeAddress))
40+func _setCreatedAt (node,createdAt) = [IntegerEntry(key_Name_createdAt(node), createdAt)]
13341
13442
13543 func isAdmin (inv) = (inv.caller == this)
13644
13745
138-func isOwner (inv,name) = (toString(inv.caller) == valueOrElse(_getOwner(name), ""))
46+func isOwner (inv,node) = (toString(inv.caller) == valueOrElse(_getOwner(node), ""))
13947
14048
141-func isController (address) = containsElement(controllers, address)
49+func isValidAddress (maybeAddress) = isDefined(addressFromString(maybeAddress))
14250
14351
14452 func _splitLastLabel (name) = {
14553 let labels = split(name, ".")
14654 let lastIndex = (size(labels) - 1)
14755 let lastLabel = labels[lastIndex]
14856 let restLabels = makeString(removeByIndex(labels, lastIndex), ".")
14957 $Tuple2(lastLabel, restLabels)
15058 }
15159
15260
153-func _issueNameToken (name) = [Issue(if ((size(name) > 16))
154- then (take(name, 15) + "~")
155- else take(name, 16), (name + ".waves"), 1, 0, false)]
156-
157-
158-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))]
159-
160-
161-func _restoreNameWithToken (name,tokenId) = [StringEntry(key_Name_token(name), tokenId), StringEntry(key_Token_name(tokenId), name)]
162-
163-
164-func _transferTokenToOwner (tokenId,owner) = [ScriptTransfer(parseAddressOrThrow(owner), 1, fromBase58String(tokenId))]
61+func _callSupportedInterface (registrant,interfaceId,restLabels) = match invoke(registrant, "supportsInterface", [interfaceId], nil) {
62+ case supportsInterface: Boolean =>
63+ if (!(supportsInterface))
64+ then unit
65+ else match invoke(value(registrant), interfaceId, [restLabels], nil) {
66+ case maybeString: String =>
67+ maybeString
68+ case maybeInt: Int =>
69+ maybeInt
70+ case _ =>
71+ unit
72+ }
73+ case _ =>
74+ unit
75+}
16576
16677
16778 func modifiers (validations) = unit
16879
16980
17081 func onlyAdmin (inv) = if (isAdmin(inv))
17182 then unit
17283 else throw("Permission denied")
17384
17485
175-func onlyController (inv) = if (if (isAdmin(inv))
86+func onlyOwner (inv,node) = if (if (isAdmin(inv))
17687 then true
177- else isController(toString(inv.caller)))
178- then unit
179- else throw("Permission denied")
180-
181-
182-func onlyOwner (inv,name) = if (if (isAdmin(inv))
183- then true
184- else isOwner(inv, name))
88+ else isOwner(inv, node))
18589 then unit
18690 else throw("Permission denied")
18791
18892
18993 @Callable(inv)
190-func init (nameTTL) = valueOrElse(modifiers([onlyAdmin(inv), if ((nameTTL > 0))
94+func setOwner (node,owner) = valueOrElse(modifiers([onlyOwner(inv, node), if (isValidAddress(owner))
19195 then unit
192- else throw("TTL cannot be negative")]), [IntegerEntry(key_nameTTL, nameTTL)])
96+ else throw("Owner must be a valid address")]), _setOwner(node, owner))
19397
19498
19599
196100 @Callable(inv)
197-func supportsInterface (interfaceId) = $Tuple2(nil, containsElement(["owner", "resolver", "nameCreated", "nameExpires"], interfaceId))
101+func owner (node) = $Tuple2(nil, _getOwner(node))
198102
199103
200104
201105 @Callable(inv)
202-func addController (address) = valueOrElse(modifiers([onlyAdmin(inv), if (isValidAddress(address))
203- then unit
204- else throw("Controller must be a valid address"), if (!(isController(address)))
205- then unit
206- else throw((("Controller `" + address) + "` is already registered"))]), [StringEntry(key_controllers, makeString((controllers :+ address), ","))])
106+func resolver (node) = $Tuple2(nil, _getResolver(node))
207107
208108
209109
210110 @Callable(inv)
211-func removeController (address) = valueOrElse(modifiers([onlyAdmin(inv), if (isController(address))
111+func setResolver (node,resolver) = valueOrElse(modifiers([onlyOwner(inv, node), if (isValidAddress(resolver))
212112 then unit
213- else throw((("Controller `" + address) + "` is not registered"))]), {
214- let controllerIndex = value(indexOf(controllers, address))
215-[StringEntry(key_controllers, makeString(removeByIndex(controllers, controllerIndex), ","))]
216- })
113+ else throw("Resolver must be a valid contract address")]), _setResolver(node, resolver))
217114
218115
219116
220117 @Callable(inv)
221-func validate (name) = $Tuple2(nil, isValidName(name))
118+func nameCreated (node) = $Tuple2(nil, _getCreatedAt(node))
222119
223120
224121
225122 @Callable(inv)
226-func available (name) = $Tuple2(nil, isAvailableName(name))
123+func setRecord (node,owner,resolver) = valueOrElse(modifiers([onlyAdmin(inv)]), ((_setOwner(node, owner) ++ _setResolver(node, resolver)) ++ _setCreatedAt(node, lastBlock.timestamp)))
227124
228125
229126
230127 @Callable(inv)
231-func owner (name) = $Tuple2(nil, _getOwner(_splitLastLabel(name)._1))
232-
233-
234-
235-@Callable(inv)
236-func resolver (name) = $Tuple2(nil, _getResolver(_splitLastLabel(name)._1))
237-
238-
239-
240-@Callable(inv)
241-func setResolver (name,resolver) = valueOrElse(modifiers([if (isActiveName(name))
128+func whoIs (name) = valueOrElse(modifiers([if ((size(name) > 0))
242129 then unit
243- else throw("Name expired or not registered"), onlyOwner(inv, name), if (isValidAddress(resolver))
244- then unit
245- else throw("Resolver must be a valid contract address")]), $Tuple2(nil, _setResolver(name, resolver)))
246-
247-
248-
249-@Callable(inv)
250-func nameCreated (name) = $Tuple2(nil, _getCreatedAt(_splitLastLabel(name)._1))
251-
252-
253-
254-@Callable(inv)
255-func nameExpires (name) = $Tuple2(nil, _getExpiresAt(_splitLastLabel(name)._1))
256-
257-
258-
259-@Callable(inv)
260-func register (name,owner,createdAt) = valueOrElse(modifiers([onlyController(inv), if (isAvailableName(name))
261- then unit
262- else throw((("`" + name) + "` cannot be registered")), if (isValidAddress(owner))
263- then unit
264- else throw("Owner must be a valid address"), if ((createdAt > 0))
265- then unit
266- else throw("CreatedAt cannot be negative"), if ((lastBlock.timestamp >= createdAt))
267- then unit
268- else throw("CreatedAt cannot be in the future")]), {
269- let issueNameToken = _issueNameToken(name)
270- let tokenId = calculateAssetId(issueNameToken[0])
271- let tokenStr = toBase58String(tokenId)
272- let registerNameWithToken = _registerNameWithToken(name, tokenStr, createdAt)
273- let transferTokenToOwner = _transferTokenToOwner(tokenStr, owner)
274- let setOwnership = _setOwner(name, owner)
275- (((issueNameToken ++ registerNameWithToken) ++ transferTokenToOwner) ++ setOwnership)
276- })
277-
278-
279-
280-@Callable(inv)
281-func reclaim (name) = valueOrElse(modifiers([if (isActiveName(name))
282- then unit
283- else throw((("`" + name) + "` is not active"))]), {
284- let newOwner = inv.caller
285- let newOwnerAddress = toString(newOwner)
286- let tokenStr = valueOrErrorMessage(_getToken(name), (("No token is issued for `" + name) + "`"))
287- let tokenId = fromBase58String(tokenStr)
288- let hasToken = (assetBalance(newOwner, tokenId) == 1)
289- let isTokenOwner = isOwner(inv, name)
290- let isTokenExists = match assetInfo(tokenId) {
291- case token: Asset =>
292- (token.quantity == 1)
130+ else throw("Name cannot be empty")]), {
131+ let $t043014352 = _splitLastLabel(name)
132+ let lastLabel = $t043014352._1
133+ let restLabels = $t043014352._2
134+ let registrantAddress = _getOwner(lastLabel)
135+ let maybeRegistrant = match registrantAddress {
136+ case owner: String =>
137+ addressFromString(owner)
293138 case _ =>
294- false
139+ unit
295140 }
296- if (if (isTokenOwner)
297- then !(isTokenExists)
298- else false)
299- then {
300- let issueNewToken = _issueNameToken(name)
301- let newTokenId = calculateAssetId(issueNewToken[0])
302- let newTokenStr = toBase58String(newTokenId)
303- let restoreNameWithNewToken = _restoreNameWithToken(name, newTokenStr)
304- let transferNewTokenToOwner = _transferTokenToOwner(newTokenStr, newOwnerAddress)
305- ((issueNewToken ++ restoreNameWithNewToken) ++ transferNewTokenToOwner)
306- }
307- else if (if (isTokenOwner)
308- then hasToken
309- else false)
310- then throw("You already own a name token")
311- else if (!(hasToken))
312- then throw("You don't have a name token")
313- else _setOwner(name, newOwnerAddress)
141+ let registrant = value(maybeRegistrant)
142+ let parentResolver = _getResolver(lastLabel)
143+ let parentCreated = _getCreatedAt(lastLabel)
144+ let owner = match _callSupportedInterface(registrant, "owner", restLabels) {
145+ case owner: String =>
146+ if (isValidAddress(owner))
147+ then owner
148+ else unit
149+ case _ =>
150+ unit
151+ }
152+ let resolver = match _callSupportedInterface(registrant, "resolver", restLabels) {
153+ case resolver: String =>
154+ if (isValidAddress(resolver))
155+ then resolver
156+ else unit
157+ case _ =>
158+ unit
159+ }
160+ let nameCreated = match _callSupportedInterface(registrant, "nameCreated", restLabels) {
161+ case nameCreated: Int =>
162+ if (if ((nameCreated > 0))
163+ then (lastBlock.timestamp > nameCreated)
164+ else false)
165+ then nameCreated
166+ else unit
167+ case _ =>
168+ unit
169+ }
170+ let nameExpires = match _callSupportedInterface(registrant, "nameExpires", restLabels) {
171+ case nameExpires: Int =>
172+ if ((nameExpires > 0))
173+ then nameExpires
174+ else unit
175+ case _ =>
176+ unit
177+ }
178+ let isRootName = if ((size(lastLabel) > 0))
179+ then (size(restLabels) == 0)
180+ else false
181+ if (if (isRootName)
182+ then true
183+ else !(isDefined(maybeRegistrant)))
184+ then $Tuple2(nil, $Tuple4(registrantAddress, parentResolver, parentCreated, unit))
185+ else $Tuple2(nil, $Tuple4(owner, resolver, nameCreated, nameExpires))
314186 })
315187
316188

github/deemru/w8io/026f985 
70.85 ms