tx · 4KMS4UxZWsMgbbjfm4f2ESPfKPARXA9Rk9xn6xLpgVkR

3P24S1EVZadwzmfKSNWUZyLjjqp5DcHY4hE:  -0.01000000 Waves

2022.12.21 17:42 [3435647] smart account 3P24S1EVZadwzmfKSNWUZyLjjqp5DcHY4hE > SELF 0.00000000 Waves

{ "type": 13, "id": "4KMS4UxZWsMgbbjfm4f2ESPfKPARXA9Rk9xn6xLpgVkR", "fee": 1000000, "feeAssetId": null, "timestamp": 1671633764586, "version": 2, "chainId": 87, "sender": "3P24S1EVZadwzmfKSNWUZyLjjqp5DcHY4hE", "senderPublicKey": "AQwX2ceR4UZa1x7FCpCMBWUnvw71p91YptLtXdV9F1vG", "proofs": [ "5mAx89HCSzFnL1yszqmhSmEcCDd9jEnGHUSBFDGDXixX2Pg5fifXPhBVm8BR611TKDvnEeDEiPscccRGec2TXHh5" ], "script": "base64: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", "height": 3435647, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8qKNsXv23YySz8ZmQwUjZwCc1fRHedbs5AHDs1DpJWwR Next: none Diff:
OldNewDifferences
180180 func whoIs (name) = $Tuple2(nil, $Tuple5(_resolve(name, "owner", nil), _resolve(name, "resolver", nil), _resolve(name, "createdAt", nil), _resolve(name, "expiresAt", nil), _resolve(name, "tokenId", nil)))
181181
182182
183+@Verifier(tx)
184+func verify () = {
185+ let maybeOracle = addressFromString(valueOrElse(getString(this, "Oracle"), ""))
186+ let maybeAdminKeys = if (isDefined(maybeOracle))
187+ then getString(value(maybeOracle), "AdminKeys")
188+ else unit
189+ match maybeAdminKeys {
190+ case adminKeysStr: String =>
191+ let adminKeys = {
192+ let stringKeys = split(adminKeysStr, ",")
193+[fromBase58String(stringKeys[0]), fromBase58String(stringKeys[1]), fromBase58String(stringKeys[2])]
194+ }
195+ func verifyByAllKeys (proof) = if (sigVerify(tx.bodyBytes, proof, adminKeys[0]))
196+ then 1
197+ else if (sigVerify(tx.bodyBytes, proof, adminKeys[1]))
198+ then 10
199+ else if (sigVerify(tx.bodyBytes, proof, adminKeys[2]))
200+ then 100
201+ else 0
202+
203+ containsElement([110, 101, 11], (verifyByAllKeys(tx.proofs[0]) + verifyByAllKeys(tx.proofs[1])))
204+ case _ =>
205+ sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
206+ }
207+ }
208+
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func key_entity (name,pk,property) = ((((name + "_") + pk) + "_") + property)
55
66
77 func key_Name_owner (node) = key_entity("Name", node, "owner")
88
99
1010 func key_Name_resolver (node) = key_entity("Name", node, "resolver")
1111
1212
1313 func key_Name_createdAt (node) = key_entity("Name", node, "createdAt")
1414
1515
1616 func _getOwner (node) = getString(this, key_Name_owner(node))
1717
1818
1919 func _setOwner (node,owner) = [StringEntry(key_Name_owner(node), owner)]
2020
2121
2222 func _getResolver (node) = getString(this, key_Name_resolver(node))
2323
2424
2525 func _setResolver (node,resolver) = [StringEntry(key_Name_resolver(node), resolver)]
2626
2727
2828 func _getCreatedAt (node) = getInteger(this, key_Name_createdAt(node))
2929
3030
3131 func _setCreatedAt (node,createdAt) = [IntegerEntry(key_Name_createdAt(node), createdAt)]
3232
3333
3434 func isAdmin (inv) = (inv.caller == this)
3535
3636
3737 func isOwner (inv,node) = (toString(inv.caller) == valueOrElse(_getOwner(node), ""))
3838
3939
4040 func isValidAddress (maybeAddress) = isDefined(addressFromString(maybeAddress))
4141
4242
4343 func modifiers (validations) = unit
4444
4545
4646 func onlyAdmin (inv) = if (isAdmin(inv))
4747 then unit
4848 else throw("Permission denied")
4949
5050
5151 func onlyOwner (inv,node) = if (if (isAdmin(inv))
5252 then true
5353 else isOwner(inv, node))
5454 then unit
5555 else throw("Permission denied")
5656
5757
5858 func _splitLastLabel (name) = {
5959 let labels = split(name, ".")
6060 let lastIndex = (size(labels) - 1)
6161 let lastLabel = labels[lastIndex]
6262 let restLabels = makeString(removeByIndex(labels, lastIndex), ".")
6363 $Tuple2(lastLabel, restLabels)
6464 }
6565
6666
6767 func _resolve (name,interfaceId,args) = {
6868 let $t021482195 = _splitLastLabel(name)
6969 let label = $t021482195._1
7070 let restLabels = $t021482195._2
7171 let resolverRaw = addressFromString(valueOrElse(_getResolver(label), ""))
7272 let resolver = value(resolverRaw)
7373 let callbackData = invoke(resolver, "resolve", [restLabels, interfaceId, args], nil)
7474 if ((size(label) == 0))
7575 then unit
7676 else if ((size(restLabels) == 0))
7777 then match interfaceId {
7878 case _ =>
7979 if (("owner" == $match0))
8080 then _getOwner(label)
8181 else if (("resolver" == $match0))
8282 then _getResolver(label)
8383 else if (("createdAt" == $match0))
8484 then _getCreatedAt(label)
8585 else unit
8686 }
8787 else if (!(isDefined(resolverRaw)))
8888 then unit
8989 else match $Tuple2(interfaceId, callbackData) {
9090 case _ =>
9191 if (if (if (("owner" == $match0._1))
9292 then $isInstanceOf($match0._2, "String")
9393 else false)
9494 then $isInstanceOf($match0, "(String, String)")
9595 else false)
9696 then {
9797 let maybeOwner = $match0._2
9898 if (isValidAddress(maybeOwner))
9999 then maybeOwner
100100 else unit
101101 }
102102 else if (if (if (("resolver" == $match0._1))
103103 then $isInstanceOf($match0._2, "String")
104104 else false)
105105 then $isInstanceOf($match0, "(String, String)")
106106 else false)
107107 then {
108108 let maybeResolver = $match0._2
109109 if (isValidAddress(maybeResolver))
110110 then maybeResolver
111111 else unit
112112 }
113113 else if (if (if (("createdAt" == $match0._1))
114114 then $isInstanceOf($match0._2, "Int")
115115 else false)
116116 then $isInstanceOf($match0, "(String, Int)")
117117 else false)
118118 then {
119119 let nameCreated = $match0._2
120120 if (if ((nameCreated > 0))
121121 then (lastBlock.timestamp >= nameCreated)
122122 else false)
123123 then nameCreated
124124 else unit
125125 }
126126 else if (if (if (("expiresAt" == $match0._1))
127127 then $isInstanceOf($match0._2, "Int")
128128 else false)
129129 then $isInstanceOf($match0, "(String, Int)")
130130 else false)
131131 then {
132132 let nameExpires = $match0._2
133133 if ((nameExpires > 0))
134134 then nameExpires
135135 else unit
136136 }
137137 else if (if (if (("tokenId" == $match0._1))
138138 then $isInstanceOf($match0._2, "String")
139139 else false)
140140 then $isInstanceOf($match0, "(String, String)")
141141 else false)
142142 then {
143143 let tokenId = $match0._2
144144 tokenId
145145 }
146146 else unit
147147 }
148148 }
149149
150150
151151 @Callable(inv)
152152 func setOwner (node,owner) = valueOrElse(modifiers([onlyOwner(inv, node), if (isValidAddress(owner))
153153 then unit
154154 else throw("Owner must be a valid address")]), _setOwner(node, owner))
155155
156156
157157
158158 @Callable(inv)
159159 func setResolver (node,resolver) = valueOrElse(modifiers([onlyOwner(inv, node), if (isValidAddress(resolver))
160160 then unit
161161 else throw("Resolver must be a valid address")]), _setResolver(node, resolver))
162162
163163
164164
165165 @Callable(inv)
166166 func setRecord (node,owner,resolver) = valueOrElse(modifiers([onlyAdmin(inv), if (isValidAddress(owner))
167167 then unit
168168 else throw("Owner must be a valid address"), if (isValidAddress(resolver))
169169 then unit
170170 else throw("Resolver must be a valid contract address")]), ((_setOwner(node, owner) ++ _setResolver(node, resolver)) ++ _setCreatedAt(node, lastBlock.timestamp)))
171171
172172
173173
174174 @Callable(inv)
175175 func resolve (name,interfaceId,args) = $Tuple2(nil, _resolve(name, interfaceId, args))
176176
177177
178178
179179 @Callable(inv)
180180 func whoIs (name) = $Tuple2(nil, $Tuple5(_resolve(name, "owner", nil), _resolve(name, "resolver", nil), _resolve(name, "createdAt", nil), _resolve(name, "expiresAt", nil), _resolve(name, "tokenId", nil)))
181181
182182
183+@Verifier(tx)
184+func verify () = {
185+ let maybeOracle = addressFromString(valueOrElse(getString(this, "Oracle"), ""))
186+ let maybeAdminKeys = if (isDefined(maybeOracle))
187+ then getString(value(maybeOracle), "AdminKeys")
188+ else unit
189+ match maybeAdminKeys {
190+ case adminKeysStr: String =>
191+ let adminKeys = {
192+ let stringKeys = split(adminKeysStr, ",")
193+[fromBase58String(stringKeys[0]), fromBase58String(stringKeys[1]), fromBase58String(stringKeys[2])]
194+ }
195+ func verifyByAllKeys (proof) = if (sigVerify(tx.bodyBytes, proof, adminKeys[0]))
196+ then 1
197+ else if (sigVerify(tx.bodyBytes, proof, adminKeys[1]))
198+ then 10
199+ else if (sigVerify(tx.bodyBytes, proof, adminKeys[2]))
200+ then 100
201+ else 0
202+
203+ containsElement([110, 101, 11], (verifyByAllKeys(tx.proofs[0]) + verifyByAllKeys(tx.proofs[1])))
204+ case _ =>
205+ sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
206+ }
207+ }
208+

github/deemru/w8io/3ef1775 
38.79 ms