tx · 9Gq7wffDneikUcXQp374y2voaYE7y2aXbTCS9xLQwv2

3N5BB6iE58rujeTEkymeLNcdsYF4f6iKoxr:  -0.01400000 Waves

2022.04.14 15:14 [2008225] smart account 3N5BB6iE58rujeTEkymeLNcdsYF4f6iKoxr > SELF 0.00000000 Waves

{ "type": 13, "id": "9Gq7wffDneikUcXQp374y2voaYE7y2aXbTCS9xLQwv2", "fee": 1400000, "feeAssetId": null, "timestamp": 1649938437154, "version": 2, "chainId": 84, "sender": "3N5BB6iE58rujeTEkymeLNcdsYF4f6iKoxr", "senderPublicKey": "EtZZHS4uqNXY5WPneZ8jY2aA95peXwthJVLzAMxMp379", "proofs": [ "3ozdNQCwQcmQESiZWR1tZwSdKcZ9WN8uHrEuXiPPahfu3zpneRgPJ7Kjv6wZBtudCscKsJRfcqkdRUvX8MUPY43E" ], "script": "base64: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cmlmaWVkBQAAAA5zdGF0dXNWZXJpZmllZAUAAAAQc3RhdHVzVW52ZXJpZmllZAEAAAAPYWRkTGFiZWxBY3Rpb25zAAAAAwAAAAdhc3NldElkAAAABWxhYmVsAAAADHRocm93T25FcnJvcgQAAAAGbGFiZWxzCQEAAAAJZ2V0TGFiZWxzAAAAAAQAAAALYXNzZXRMYWJlbHMJAQAAAA5nZXRBc3NldExhYmVscwAAAAEFAAAAB2Fzc2V0SWQEAAAACmNoZWNrTGFiZWwDCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAAGbGFiZWxzBQAAAAVsYWJlbAYJAAACAAAAAQIAAAATTGFiZWwgZG9lc24ndCBleGlzdAMJAAAAAAAAAgUAAAAKY2hlY2tMYWJlbAUAAAAKY2hlY2tMYWJlbAQAAAAObmV3QXNzZXRMYWJlbHMDCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAALYXNzZXRMYWJlbHMFAAAABWxhYmVsAwUAAAAMdGhyb3dPbkVycm9yCQAAAgAAAAECAAAAHExhYmVsIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQFAAAAC2Fzc2V0TGFiZWxzCQAETQAAAAIFAAAAC2Fzc2V0TGFiZWxzBQAAAAVsYWJlbAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAOa2V5QXNzZXRMYWJlbHMAAAABBQAAAAdhc3NldElkCQAEuQAAAAIFAAAADm5ld0Fzc2V0TGFiZWxzBQAAAANTRVAFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAAAAEmRlbGV0ZUxhYmVsQWN0aW9ucwAAAAMAAAAHYXNzZXRJZAAAAAVsYWJlbAAAAAx0aHJvd09uRXJyb3IEAAAAC2Fzc2V0TGFiZWxzCQEAAAAOZ2V0QXNzZXRMYWJlbHMAAAABBQAAAAdhc3NldElkBAAAAA5uZXdBc3NldExhYmVscwMJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAAthc3NldExhYmVscwUAAAAFbGFiZWwJAARRAAAAAgUAAAALYXNzZXRMYWJlbHMJAQAAAAV2YWx1ZQAAAAEJAARPAAAAAgUAAAALYXNzZXRMYWJlbHMFAAAABWxhYmVsAwUAAAAMdGhyb3dPbkVycm9yCQAAAgAAAAECAAAAEkxhYmVsIHdhc24ndCBhZGRlZAUAAAALYXNzZXRMYWJlbHMJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAADmtleUFzc2V0TGFiZWxzAAAAAQUAAAAHYXNzZXRJZAkABLkAAAACBQAAAA5uZXdBc3NldExhYmVscwUAAAADU0VQBQAAAANuaWwBAAAAEnNldFZlcmlmaWVkQWN0aW9ucwAAAAIAAAAHYXNzZXRJZAAAAAh2ZXJpZmllZAQAAAAdbGFiZWxDb21tdW5pdHlWZXJpZmllZEFjdGlvbnMDBQAAAAh2ZXJpZmllZAkBAAAAD2FkZExhYmVsQWN0aW9ucwAAAAMFAAAAB2Fzc2V0SWQFAAAAFmxhYmVsQ29tbXVuaXR5VmVyaWZpZWQHCQEAAAASZGVsZXRlTGFiZWxBY3Rpb25zAAAAAwUAAAAHYXNzZXRJZAUAAAAWbGFiZWxDb21tdW5pdHlWZXJpZmllZAcJAAROAAAAAgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAACWtleVN0YXR1cwAAAAEFAAAAB2Fzc2V0SWQJAQAAABB2ZXJpZmllZFRvU3RhdHVzAAAAAQUAAAAIdmVyaWZpZWQFAAAAA25pbAUAAAAdbGFiZWxDb21tdW5pdHlWZXJpZmllZEFjdGlvbnMAAAARAAAAAWkBAAAAC2NvbnN0cnVjdG9yAAAAAgAAABF1c2VyUG9vbHNDb250cmFjdAAAAAZsYWJlbHMEAAAAC2NoZWNrQ2FsbGVyCQEAAAALbXVzdE1hbmFnZXIAAAABBQAAAAFpAwkAAAAAAAACBQAAAAtjaGVja0NhbGxlcgUAAAALY2hlY2tDYWxsZXIEAAAADWNoZWNrc0FkZHJlc3MJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABBQAAABF1c2VyUG9vbHNDb250cmFjdAIAAAAPSW52YWxpZCBhZGRyZXNzAwkAAAAAAAACBQAAAA1jaGVja3NBZGRyZXNzBQAAAA1jaGVja3NBZGRyZXNzCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABRrZXlVc2VyUG9vbHNDb250cmFjdAAAAAAFAAAAEXVzZXJQb29sc0NvbnRyYWN0CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAlrZXlMYWJlbHMAAAAACQAEuQAAAAIJAAROAAAAAgUAAAANZGVmYXVsdExhYmVscwUAAAAGbGFiZWxzBQAAAANTRVAFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAADWFkZEFzc2V0c0xpbmsAAAADAAAAC2Ftb3VudEFzc2V0AAAACnByaWNlQXNzZXQAAAAHbHBBc3NldAQAAAALY2hlY2tDYWxsZXIJAQAAAAltdXN0QWRtaW4AAAABBQAAAAFpAwkAAAAAAAACBQAAAAtjaGVja0NhbGxlcgUAAAALY2hlY2tDYWxsZXIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAIGtleUFtb3VudEFuZFByaWNlQXNzZXRzVG9McEFzc2V0AAAAAgUAAAALYW1vdW50QXNzZXQFAAAACnByaWNlQXNzZXQFAAAAB2xwQXNzZXQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAIGtleUxwQXNzZXRUb0Ftb3VudEFuZFByaWNlQXNzZXRzAAAAAQUAAAAHbHBBc3NldAkABLkAAAACCQAETAAAAAIFAAAAC2Ftb3VudEFzc2V0CQAETAAAAAIFAAAACnByaWNlQXNzZXQFAAAAA25pbAUAAAADU0VQBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAAGGluY3JlYXNlQXNzZXRQb29sc051bWJlcgAAAAEAAAAHYXNzZXRJZAQAAAALY2hlY2tDYWxsZXIJAQAAAAltdXN0QWRtaW4AAAABBQAAAAFpAwkAAAAAAAACBQAAAAtjaGVja0NhbGxlcgUAAAALY2hlY2tDYWxsZXIEAAAAE2Fzc2V0UG9vbHNOdW1iZXJLZXkJAQAAABNrZXlBc3NldFBvb2xzTnVtYmVy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AAFpAQAAAAx1cGRhdGVUaWNrZXIAAAACAAAAB2Fzc2V0SWQAAAAGdGlja2VyBAAAAAtjaGVja0NhbGxlcgkBAAAACW11c3RBZG1pbgAAAAEFAAAAAWkDCQAAAAAAAAIFAAAAC2NoZWNrQ2FsbGVyBQAAAAtjaGVja0NhbGxlcgQAAAALY2hlY2tUaWNrZXIEAAAAE2xpbmtlZEFzc2V0SWRPclVuaXQJAAQiAAAAAQkBAAAAEmtleVRpY2tlclRvQXNzZXRJZAAAAAEFAAAABnRpY2tlcgQAAAANdGlja2VySXNWYWxpZAMJAQAAAAIhPQAAAAIFAAAABnRpY2tlcgIAAAAAAwkAAAAAAAACBQAAABNsaW5rZWRBc3NldElkT3JVbml0BQAAAAR1bml0BgkAAAAAAAACCQEAAAAFdmFsdWUAAAABBQAAABNsaW5rZWRBc3NldElkT3JVbml0BQAAAAdhc3NldElkBwMFAAAADXRpY2tlcklzVmFsaWQGCQAAAgAAAAECAAAADkludmFsaWQgdGlja2VyAwkAAAAAAAACBQAAAAtjaGVja1RpY2tlcgUAAAALY2hlY2tUaWNrZXIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEmtleUFzc2V0SWRUb1RpY2tlcgAAAAEFAAAAB2Fzc2V0SWQFAAAABnRpY2tlcgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAASa2V5VGlja2VyVG9Bc3NldElkAAAAAQUAAAAGdGlja2VyBQAAAAdhc3NldElkBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAAAxkZWxldGVUaWNrZXIAAAABAAAAB2Fzc2V0SWQEAAAAC2NoZWNrQ2FsbGVyCQEAAAAJbXVzdEFkbWluAAAAAQUAAAABaQMJAAAAAAAAAgUAAAALY2hlY2tDYWxsZXIFAAAAC2NoZWNrQ2FsbGVyBAAAAAZ0aWNrZXIJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCIAAAABCQEAAAASa2V5QXNzZXRJ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bmFnZXIAAAABBQAAAAFpAwkAAAAAAAACBQAAAAtjaGVja0NhbGxlcgUAAAALY2hlY2tDYWxsZXIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAD2tleUFkbWluUHViS2V5cwAAAAAJAAS5AAAAAgUAAAAMYWRtaW5QdWJLZXlzBQAAAANTRVAFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAKc2V0TWFuYWdlcgAAAAEAAAAXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkEAAAAC2NoZWNrQ2FsbGVyCQEAAAALbXVzdE1hbmFnZXIAAAABBQAAAAFpAwkAAAAAAAACBQAAAAtjaGVja0NhbGxlcgUAAAALY2hlY2tDYWxsZXIEAAAAFWNoZWNrTWFuYWdlclB1YmxpY0tleQkAAlkAAAABBQAAABdwZW5kaW5nTWFuYWdlclB1YmxpY0tleQMJAAAAAAAAAgUAAAAVY2hlY2tNYW5hZ2VyUHVibGljS2V5BQAAABVjaGVja01hbmFnZXJQdWJsaWNLZXkJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAGmtleVBlbmRpbmdNYW5hZ2VyUHVibGljS2V5AAAAAAUAAAAXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAADmNvbmZpcm1NYW5hZ2VyAAAAAAQAAAACcG0JAQAAAB1wZW5kaW5nTWFuYWdlclB1YmxpY0tleU9yVW5pdAAAAAAEAAAABWhhc1BNAwkBAAAACWlzRGVmaW5lZAAAAAEFAAAAAnBtBgkAAAIAAAABAgAAABJObyBwZW5kaW5nIG1hbmFnZXIDCQAAAAAAAAIFAAAABWhhc1BNBQAAAAVoYXNQTQQAAAAHY2hlY2tQTQMJAAAAAAAAAggFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5CQEAAAAFdmFsdWUAAAABBQAAAAJwbQYJAAACAAAAAQIAAAAbWW91IGFyZSBub3QgcGVuZGluZyBtYW5hZ2VyAwkAAAAAAAACBQAAAAdjaGVja1BNBQAAAAdjaGVja1BNCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABNrZXlNYW5hZ2VyUHVibGljS2V5AAAAAAkAAlgAAAABCQEAAAAFdmFsdWUAAAABBQAAAAJwbQkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkAAAAABQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAABJpc1ZlcmlmaWVkUkVBRE9OTFkAAAABAAAAB2Fzc2V0SWQJAAUUAAAAAgUAAAADbmlsCQEAAAAKaXNWZXJpZmllZAAAAAEFAAAAB2Fzc2V0SWQAAAABAAAAAnR4AQAAAAZ2ZXJpZnkAAAAABAAAAA90YXJnZXRQdWJsaWNLZXkEAAAAByRtYXRjaDAJAQAAABZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAAAAAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAKQnl0ZVZlY3RvcgQAAAACcGsFAAAAByRtYXRjaDAFAAAAAnBrAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAARVbml0CAUAAAACdHgAAAAPc2VuZGVyUHVibGljS2V5CQAAAgAAAAECAAAAC01hdGNoIGVycm9yCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAUAAAAPdGFyZ2V0UHVibGljS2V5j9TkMA==", "height": 2008225, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: EkMZZLkUaGoDBV6t3FsxRLdybhLoWFGopBezN1P96oCQ Next: 3Be7trJ81xMmtaH8h9b8qGmFjWrtXeF8wQ7ahigW29yt Diff:
OldNewDifferences
44 let SEP = "__"
55
66 let EMPTY = ""
7+
8+let statusVerified = 2
9+
10+let statusUnverified = 0
11+
12+let labelCommunityVerified = "COMMUNITY_VERIFIED"
13+
14+let labelPoolsLp = "POOLS_LP"
15+
16+let defaultLabels = [labelCommunityVerified, labelPoolsLp]
717
818 func throwPD () = throw("Permission denied")
919
5666 func keyLabels () = makeString(["%s", "labels"], SEP)
5767
5868
59-func getLabels () = split(valueOrElse(getString(keyLabels()), ""), SEP)
69+func isVerified (assetId) = (valueOrElse(getInteger(keyStatus(assetId)), statusUnverified) == statusVerified)
6070
6171
62-func getAssetLabels (assetId) = split(valueOrElse(getString(keyAssetLabels(assetId)), ""), SEP)
72+func getLabels () = match getString(keyLabels()) {
73+ case s: String =>
74+ if ((size(s) == 0))
75+ then nil
76+ else split(s, SEP)
77+ case _ =>
78+ nil
79+}
80+
81+
82+func getAssetLabels (assetId) = match getString(keyAssetLabels(assetId)) {
83+ case s: String =>
84+ if ((size(s) == 0))
85+ then nil
86+ else split(s, SEP)
87+ case _ =>
88+ nil
89+}
6390
6491
6592 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
113140
114141
115142 func verifiedToStatus (verified) = if (verified)
116- then 2
117- else 0
143+ then statusVerified
144+ else statusUnverified
145+
146+
147+func addLabelActions (assetId,label,throwOnError) = {
148+ let labels = getLabels()
149+ let assetLabels = getAssetLabels(assetId)
150+ let checkLabel = if (containsElement(labels, label))
151+ then true
152+ else throw("Label doesn't exist")
153+ if ((checkLabel == checkLabel))
154+ then {
155+ let newAssetLabels = if (containsElement(assetLabels, label))
156+ then if (throwOnError)
157+ then throw("Label has already been added")
158+ else assetLabels
159+ else (assetLabels :+ label)
160+[StringEntry(keyAssetLabels(assetId), makeString(newAssetLabels, SEP))]
161+ }
162+ else throw("Strict value is not equal to itself.")
163+ }
164+
165+
166+func deleteLabelActions (assetId,label,throwOnError) = {
167+ let assetLabels = getAssetLabels(assetId)
168+ let newAssetLabels = if (containsElement(assetLabels, label))
169+ then removeByIndex(assetLabels, value(indexOf(assetLabels, label)))
170+ else if (throwOnError)
171+ then throw("Label wasn't added")
172+ else assetLabels
173+[StringEntry(keyAssetLabels(assetId), makeString(newAssetLabels, SEP))]
174+ }
175+
176+
177+func setVerifiedActions (assetId,verified) = {
178+ let labelCommunityVerifiedActions = if (verified)
179+ then addLabelActions(assetId, labelCommunityVerified, false)
180+ else deleteLabelActions(assetId, labelCommunityVerified, false)
181+ ([IntegerEntry(keyStatus(assetId), verifiedToStatus(verified))] ++ labelCommunityVerifiedActions)
182+ }
118183
119184
120185 @Callable(i)
121-func constructor (userPoolsContract) = {
186+func constructor (userPoolsContract,labels) = {
122187 let checkCaller = mustManager(i)
123188 if ((checkCaller == checkCaller))
124189 then {
125- let checksAddress = addressFromStringValue(userPoolsContract)
190+ let checksAddress = valueOrErrorMessage(addressFromString(userPoolsContract), "Invalid address")
126191 if ((checksAddress == checksAddress))
127- then [StringEntry(keyUserPoolsContract(), userPoolsContract)]
192+ then [StringEntry(keyUserPoolsContract(), userPoolsContract), StringEntry(keyLabels(), makeString((defaultLabels ++ labels), SEP))]
128193 else throw("Strict value is not equal to itself.")
129194 }
130195 else throw("Strict value is not equal to itself.")
196261
197262 @Callable(i)
198263 func addLabel (assetId,label) = {
199- let labels = getLabels()
200- let assetLabels = getAssetLabels(assetId)
201264 let checkCaller = mustAdmin(i)
202265 if ((checkCaller == checkCaller))
203- then {
204- let checkLabel = [if (!(containsElement(assetLabels, label)))
205- then true
206- else "Label has already been added", if (containsElement(labels, label))
207- then true
208- else throw("Label doesn't exist")]
209- if ((checkLabel == checkLabel))
210- then [StringEntry(keyAssetLabels(assetId), makeString((assetLabels :+ label), SEP))]
211- else throw("Strict value is not equal to itself.")
212- }
266+ then addLabelActions(assetId, label, true)
213267 else throw("Strict value is not equal to itself.")
214268 }
215269
217271
218272 @Callable(i)
219273 func deleteLabel (assetId,label) = {
220- let assetLabels = getAssetLabels(assetId)
221274 let checkCaller = mustAdmin(i)
222275 if ((checkCaller == checkCaller))
223- then {
224- let checkLabel = if (containsElement(assetLabels, label))
225- then true
226- else throw("Label wasn't added")
227- if ((checkLabel == checkLabel))
228- then [StringEntry(keyAssetLabels(assetId), makeString(removeByIndex(assetLabels, value(indexOf(assetLabels, label))), SEP))]
229- else throw("Strict value is not equal to itself.")
230- }
276+ then deleteLabelActions(assetId, label, true)
231277 else throw("Strict value is not equal to itself.")
232278 }
233279
285331 let setLogoActions = if ((logo == ""))
286332 then nil
287333 else [StringEntry(keyLogo(assetId), logo)]
288- $Tuple2(([BooleanEntry(keyCreated(assetId), true), StringEntry(keyTicker(assetId), ticker), IntegerEntry(keyStatus(assetId), verifiedToStatus(verified))] ++ setLogoActions), isCreatedNow)
334+ $Tuple2((([BooleanEntry(keyCreated(assetId), true), StringEntry(keyTicker(assetId), ticker)] ++ setLogoActions) ++ setVerifiedActions(assetId, verified)), isCreatedNow)
289335 }
290336 else throw("Strict value is not equal to itself.")
291337 }
328374 if ((checks == checks))
329375 then {
330376 let priceAssets = match invoke(addressFromStringValue(getStringValue(keyUserPoolsContract())), "priceAssetsREADONLY", nil, nil) {
331- case a: List[Any] =>
332- let checkPriceAssetsSize = if ((size(a) > 0))
377+ case assets: List[Any] =>
378+ let checkPriceAssetsSize = if ((size(assets) > 0))
333379 then true
334380 else throw("Invalid price assets")
335381 if ((checkPriceAssetsSize == checkPriceAssetsSize))
336- then a
382+ then assets
337383 else throw("Strict value is not equal to itself.")
338384 case _ =>
339385 throw("Incorrect invoke result")
348394 let lpAssetIdOrUnit = getString(keyAmountAndPriceAssetsToLpAsset(assetId, priceAssetId))
349395 let action = if ((lpAssetIdOrUnit == unit))
350396 then nil
351- else IntegerEntry(keyStatus(value(lpAssetIdOrUnit)), verifiedToStatus(verified))
352- (acc :+ action)
397+ else setVerifiedActions(value(lpAssetIdOrUnit), verified)
398+ (acc ++ action)
353399 }
354400
355- let lpTokensActions = {
401+ let tokensActions = {
356402 let $l = priceAssets
357403 let $s = size($l)
358- let $acc0 = nil
404+ let $acc0 = setVerifiedActions(assetId, verified)
359405 func $f0_1 ($a,$i) = if (($i >= $s))
360406 then $a
361407 else cb($a, $l[$i])
366412
367413 $f0_2($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)
368414 }
369- ([IntegerEntry(keyStatus(assetId), verifiedToStatus(verified))] ++ lpTokensActions)
415+ $Tuple2(tokensActions, unit)
370416 }
371417 else throw("Strict value is not equal to itself.")
372418 }
417463 }
418464
419465
466+
467+@Callable(i)
468+func isVerifiedREADONLY (assetId) = $Tuple2(nil, isVerified(assetId))
469+
470+
420471 @Verifier(tx)
421472 func verify () = {
422473 let targetPublicKey = match managerPublicKeyOrUnit() {
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let EMPTY = ""
7+
8+let statusVerified = 2
9+
10+let statusUnverified = 0
11+
12+let labelCommunityVerified = "COMMUNITY_VERIFIED"
13+
14+let labelPoolsLp = "POOLS_LP"
15+
16+let defaultLabels = [labelCommunityVerified, labelPoolsLp]
717
818 func throwPD () = throw("Permission denied")
919
1020
1121 func throwNoAsset () = throw("Asset doesn't exists")
1222
1323
1424 func keyManagerPublicKey () = "%s__managerPublicKey"
1525
1626
1727 func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
1828
1929
2030 func keyAdminPubKeys () = "%s__adminPubKeys"
2131
2232
2333 func keyUserPoolsContract () = "%s__userPoolsContract"
2434
2535
2636 func keyCreated (assetId) = (("created_<" + assetId) + ">")
2737
2838
2939 func keyLogo (assetId) = (("logo_<" + assetId) + ">")
3040
3141
3242 func keyTicker (assetId) = (("ticker_<" + assetId) + ">")
3343
3444
3545 func keyStatus (assetId) = (("status_<" + assetId) + ">")
3646
3747
3848 func keyAssetPoolsNumber (assetId) = makeString(["%s%s", "pools", assetId], SEP)
3949
4050
4151 func keyTickerToAssetId (ticker) = makeString(["%s%s", "ticker2assetId", ticker], SEP)
4252
4353
4454 func keyAssetIdToTicker (assetId) = makeString(["%s%s", "assetId2ticker", assetId], SEP)
4555
4656
4757 func keyAmountAndPriceAssetsToLpAsset (amountAsset,priceAsset) = makeString(["%s%s%s", "amountAndPriceAssetsToLpAsset", amountAsset, priceAsset], SEP)
4858
4959
5060 func keyLpAssetToAmountAndPriceAssets (lpAsset) = makeString(["%s%s", "lpAssetToAmountAndPriceAssets", lpAsset], SEP)
5161
5262
5363 func keyAssetLabels (assetId) = makeString(["%s%s", "labels", assetId], SEP)
5464
5565
5666 func keyLabels () = makeString(["%s", "labels"], SEP)
5767
5868
59-func getLabels () = split(valueOrElse(getString(keyLabels()), ""), SEP)
69+func isVerified (assetId) = (valueOrElse(getInteger(keyStatus(assetId)), statusUnverified) == statusVerified)
6070
6171
62-func getAssetLabels (assetId) = split(valueOrElse(getString(keyAssetLabels(assetId)), ""), SEP)
72+func getLabels () = match getString(keyLabels()) {
73+ case s: String =>
74+ if ((size(s) == 0))
75+ then nil
76+ else split(s, SEP)
77+ case _ =>
78+ nil
79+}
80+
81+
82+func getAssetLabels (assetId) = match getString(keyAssetLabels(assetId)) {
83+ case s: String =>
84+ if ((size(s) == 0))
85+ then nil
86+ else split(s, SEP)
87+ case _ =>
88+ nil
89+}
6390
6491
6592 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
6693 case s: String =>
6794 fromBase58String(s)
6895 case _: Unit =>
6996 unit
7097 case _ =>
7198 throw("Match error")
7299 }
73100
74101
75102 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
76103 case s: String =>
77104 fromBase58String(s)
78105 case _: Unit =>
79106 unit
80107 case _ =>
81108 throw("Match error")
82109 }
83110
84111
85112 func mustManager (i) = match managerPublicKeyOrUnit() {
86113 case pk: ByteVector =>
87114 if ((i.callerPublicKey == pk))
88115 then true
89116 else throwPD()
90117 case _: Unit =>
91118 if ((i.caller == this))
92119 then true
93120 else throwPD()
94121 case _ =>
95122 throw("Match error")
96123 }
97124
98125
99126 func mustAdmin (i) = {
100127 let adminPKs = split(valueOrElse(getString(keyAdminPubKeys()), EMPTY), SEP)
101128 if (containsElement(adminPKs, toBase58String(i.callerPublicKey)))
102129 then true
103130 else {
104131 let isManager = mustManager(i)
105132 if ((isManager == isManager))
106133 then true
107134 else throw("Strict value is not equal to itself.")
108135 }
109136 }
110137
111138
112139 func isCreated (assetId) = valueOrElse(getBoolean(keyCreated(assetId)), false)
113140
114141
115142 func verifiedToStatus (verified) = if (verified)
116- then 2
117- else 0
143+ then statusVerified
144+ else statusUnverified
145+
146+
147+func addLabelActions (assetId,label,throwOnError) = {
148+ let labels = getLabels()
149+ let assetLabels = getAssetLabels(assetId)
150+ let checkLabel = if (containsElement(labels, label))
151+ then true
152+ else throw("Label doesn't exist")
153+ if ((checkLabel == checkLabel))
154+ then {
155+ let newAssetLabels = if (containsElement(assetLabels, label))
156+ then if (throwOnError)
157+ then throw("Label has already been added")
158+ else assetLabels
159+ else (assetLabels :+ label)
160+[StringEntry(keyAssetLabels(assetId), makeString(newAssetLabels, SEP))]
161+ }
162+ else throw("Strict value is not equal to itself.")
163+ }
164+
165+
166+func deleteLabelActions (assetId,label,throwOnError) = {
167+ let assetLabels = getAssetLabels(assetId)
168+ let newAssetLabels = if (containsElement(assetLabels, label))
169+ then removeByIndex(assetLabels, value(indexOf(assetLabels, label)))
170+ else if (throwOnError)
171+ then throw("Label wasn't added")
172+ else assetLabels
173+[StringEntry(keyAssetLabels(assetId), makeString(newAssetLabels, SEP))]
174+ }
175+
176+
177+func setVerifiedActions (assetId,verified) = {
178+ let labelCommunityVerifiedActions = if (verified)
179+ then addLabelActions(assetId, labelCommunityVerified, false)
180+ else deleteLabelActions(assetId, labelCommunityVerified, false)
181+ ([IntegerEntry(keyStatus(assetId), verifiedToStatus(verified))] ++ labelCommunityVerifiedActions)
182+ }
118183
119184
120185 @Callable(i)
121-func constructor (userPoolsContract) = {
186+func constructor (userPoolsContract,labels) = {
122187 let checkCaller = mustManager(i)
123188 if ((checkCaller == checkCaller))
124189 then {
125- let checksAddress = addressFromStringValue(userPoolsContract)
190+ let checksAddress = valueOrErrorMessage(addressFromString(userPoolsContract), "Invalid address")
126191 if ((checksAddress == checksAddress))
127- then [StringEntry(keyUserPoolsContract(), userPoolsContract)]
192+ then [StringEntry(keyUserPoolsContract(), userPoolsContract), StringEntry(keyLabels(), makeString((defaultLabels ++ labels), SEP))]
128193 else throw("Strict value is not equal to itself.")
129194 }
130195 else throw("Strict value is not equal to itself.")
131196 }
132197
133198
134199
135200 @Callable(i)
136201 func addAssetsLink (amountAsset,priceAsset,lpAsset) = {
137202 let checkCaller = mustAdmin(i)
138203 if ((checkCaller == checkCaller))
139204 then [StringEntry(keyAmountAndPriceAssetsToLpAsset(amountAsset, priceAsset), lpAsset), StringEntry(keyLpAssetToAmountAndPriceAssets(lpAsset), makeString([amountAsset, priceAsset], SEP))]
140205 else throw("Strict value is not equal to itself.")
141206 }
142207
143208
144209
145210 @Callable(i)
146211 func increaseAssetPoolsNumber (assetId) = {
147212 let checkCaller = mustAdmin(i)
148213 if ((checkCaller == checkCaller))
149214 then {
150215 let assetPoolsNumberKey = keyAssetPoolsNumber(assetId)
151216 let assetPoolsNumber = valueOrElse(getInteger(assetPoolsNumberKey), 0)
152217 [IntegerEntry(assetPoolsNumberKey, (assetPoolsNumber + 1))]
153218 }
154219 else throw("Strict value is not equal to itself.")
155220 }
156221
157222
158223
159224 @Callable(i)
160225 func createLabel (label) = {
161226 let labels = getLabels()
162227 let checkCaller = mustManager(i)
163228 if ((checkCaller == checkCaller))
164229 then {
165230 let checkLabel = [if (!(contains(label, SEP)))
166231 then true
167232 else throw("Invalid label name"), if (!(containsElement(labels, label)))
168233 then true
169234 else throw("Label exists")]
170235 if ((checkLabel == checkLabel))
171236 then [StringEntry(keyLabels(), makeString((labels :+ label), SEP))]
172237 else throw("Strict value is not equal to itself.")
173238 }
174239 else throw("Strict value is not equal to itself.")
175240 }
176241
177242
178243
179244 @Callable(i)
180245 func dropLabel (label) = {
181246 let labels = getLabels()
182247 let checkCaller = mustManager(i)
183248 if ((checkCaller == checkCaller))
184249 then {
185250 let checkLabel = if (containsElement(labels, label))
186251 then true
187252 else throw("Label doesn't exist")
188253 if ((checkLabel == checkLabel))
189254 then [StringEntry(keyLabels(), makeString(removeByIndex(labels, value(indexOf(labels, label))), SEP))]
190255 else throw("Strict value is not equal to itself.")
191256 }
192257 else throw("Strict value is not equal to itself.")
193258 }
194259
195260
196261
197262 @Callable(i)
198263 func addLabel (assetId,label) = {
199- let labels = getLabels()
200- let assetLabels = getAssetLabels(assetId)
201264 let checkCaller = mustAdmin(i)
202265 if ((checkCaller == checkCaller))
203- then {
204- let checkLabel = [if (!(containsElement(assetLabels, label)))
205- then true
206- else "Label has already been added", if (containsElement(labels, label))
207- then true
208- else throw("Label doesn't exist")]
209- if ((checkLabel == checkLabel))
210- then [StringEntry(keyAssetLabels(assetId), makeString((assetLabels :+ label), SEP))]
211- else throw("Strict value is not equal to itself.")
212- }
266+ then addLabelActions(assetId, label, true)
213267 else throw("Strict value is not equal to itself.")
214268 }
215269
216270
217271
218272 @Callable(i)
219273 func deleteLabel (assetId,label) = {
220- let assetLabels = getAssetLabels(assetId)
221274 let checkCaller = mustAdmin(i)
222275 if ((checkCaller == checkCaller))
223- then {
224- let checkLabel = if (containsElement(assetLabels, label))
225- then true
226- else throw("Label wasn't added")
227- if ((checkLabel == checkLabel))
228- then [StringEntry(keyAssetLabels(assetId), makeString(removeByIndex(assetLabels, value(indexOf(assetLabels, label))), SEP))]
229- else throw("Strict value is not equal to itself.")
230- }
276+ then deleteLabelActions(assetId, label, true)
231277 else throw("Strict value is not equal to itself.")
232278 }
233279
234280
235281
236282 @Callable(i)
237283 func updateTicker (assetId,ticker) = {
238284 let checkCaller = mustAdmin(i)
239285 if ((checkCaller == checkCaller))
240286 then {
241287 let checkTicker = {
242288 let linkedAssetIdOrUnit = getString(keyTickerToAssetId(ticker))
243289 let tickerIsValid = if ((ticker != ""))
244290 then if ((linkedAssetIdOrUnit == unit))
245291 then true
246292 else (value(linkedAssetIdOrUnit) == assetId)
247293 else false
248294 if (tickerIsValid)
249295 then true
250296 else throw("Invalid ticker")
251297 }
252298 if ((checkTicker == checkTicker))
253299 then [StringEntry(keyAssetIdToTicker(assetId), ticker), StringEntry(keyTickerToAssetId(ticker), assetId)]
254300 else throw("Strict value is not equal to itself.")
255301 }
256302 else throw("Strict value is not equal to itself.")
257303 }
258304
259305
260306
261307 @Callable(i)
262308 func deleteTicker (assetId) = {
263309 let checkCaller = mustAdmin(i)
264310 if ((checkCaller == checkCaller))
265311 then {
266312 let ticker = valueOrErrorMessage(getString(keyAssetIdToTicker(assetId)), "Invalid asset")
267313 [DeleteEntry(keyAssetIdToTicker(assetId)), DeleteEntry(keyTickerToAssetId(ticker))]
268314 }
269315 else throw("Strict value is not equal to itself.")
270316 }
271317
272318
273319
274320 @Callable(i)
275321 func createOrUpdate (assetId,ticker,logo,verified) = {
276322 let checkCaller = mustAdmin(i)
277323 if ((checkCaller == checkCaller))
278324 then {
279325 let checkAssetId = valueOrErrorMessage(assetInfo(fromBase58String(assetId)), "Invalid asset ID")
280326 if ((checkAssetId == checkAssetId))
281327 then {
282328 let isCreatedNow = !(isCreated(assetId))
283329 if ((isCreatedNow == isCreatedNow))
284330 then {
285331 let setLogoActions = if ((logo == ""))
286332 then nil
287333 else [StringEntry(keyLogo(assetId), logo)]
288- $Tuple2(([BooleanEntry(keyCreated(assetId), true), StringEntry(keyTicker(assetId), ticker), IntegerEntry(keyStatus(assetId), verifiedToStatus(verified))] ++ setLogoActions), isCreatedNow)
334+ $Tuple2((([BooleanEntry(keyCreated(assetId), true), StringEntry(keyTicker(assetId), ticker)] ++ setLogoActions) ++ setVerifiedActions(assetId, verified)), isCreatedNow)
289335 }
290336 else throw("Strict value is not equal to itself.")
291337 }
292338 else throw("Strict value is not equal to itself.")
293339 }
294340 else throw("Strict value is not equal to itself.")
295341 }
296342
297343
298344
299345 @Callable(i)
300346 func setTicker (assetId,ticker) = {
301347 let checks = [mustAdmin(i), if (isCreated(assetId))
302348 then true
303349 else throwNoAsset()]
304350 if ((checks == checks))
305351 then [StringEntry(keyTicker(assetId), ticker)]
306352 else throw("Strict value is not equal to itself.")
307353 }
308354
309355
310356
311357 @Callable(i)
312358 func setLogo (assetId,logo) = {
313359 let checks = [mustAdmin(i), if (isCreated(assetId))
314360 then true
315361 else throwNoAsset()]
316362 if ((checks == checks))
317363 then [StringEntry(keyLogo(assetId), logo)]
318364 else throw("Strict value is not equal to itself.")
319365 }
320366
321367
322368
323369 @Callable(i)
324370 func setVerified (assetId,verified) = {
325371 let checks = [mustAdmin(i), if (isCreated(assetId))
326372 then true
327373 else throwNoAsset()]
328374 if ((checks == checks))
329375 then {
330376 let priceAssets = match invoke(addressFromStringValue(getStringValue(keyUserPoolsContract())), "priceAssetsREADONLY", nil, nil) {
331- case a: List[Any] =>
332- let checkPriceAssetsSize = if ((size(a) > 0))
377+ case assets: List[Any] =>
378+ let checkPriceAssetsSize = if ((size(assets) > 0))
333379 then true
334380 else throw("Invalid price assets")
335381 if ((checkPriceAssetsSize == checkPriceAssetsSize))
336- then a
382+ then assets
337383 else throw("Strict value is not equal to itself.")
338384 case _ =>
339385 throw("Incorrect invoke result")
340386 }
341387 func cb (acc,item) = {
342388 let priceAssetId = match item {
343389 case s: String =>
344390 s
345391 case _ =>
346392 throw("Invalid price asset")
347393 }
348394 let lpAssetIdOrUnit = getString(keyAmountAndPriceAssetsToLpAsset(assetId, priceAssetId))
349395 let action = if ((lpAssetIdOrUnit == unit))
350396 then nil
351- else IntegerEntry(keyStatus(value(lpAssetIdOrUnit)), verifiedToStatus(verified))
352- (acc :+ action)
397+ else setVerifiedActions(value(lpAssetIdOrUnit), verified)
398+ (acc ++ action)
353399 }
354400
355- let lpTokensActions = {
401+ let tokensActions = {
356402 let $l = priceAssets
357403 let $s = size($l)
358- let $acc0 = nil
404+ let $acc0 = setVerifiedActions(assetId, verified)
359405 func $f0_1 ($a,$i) = if (($i >= $s))
360406 then $a
361407 else cb($a, $l[$i])
362408
363409 func $f0_2 ($a,$i) = if (($i >= $s))
364410 then $a
365411 else throw("List size exceeds 10")
366412
367413 $f0_2($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)
368414 }
369- ([IntegerEntry(keyStatus(assetId), verifiedToStatus(verified))] ++ lpTokensActions)
415+ $Tuple2(tokensActions, unit)
370416 }
371417 else throw("Strict value is not equal to itself.")
372418 }
373419
374420
375421
376422 @Callable(i)
377423 func setAdmins (adminPubKeys) = {
378424 let checkCaller = mustManager(i)
379425 if ((checkCaller == checkCaller))
380426 then [StringEntry(keyAdminPubKeys(), makeString(adminPubKeys, SEP))]
381427 else throw("Strict value is not equal to itself.")
382428 }
383429
384430
385431
386432 @Callable(i)
387433 func setManager (pendingManagerPublicKey) = {
388434 let checkCaller = mustManager(i)
389435 if ((checkCaller == checkCaller))
390436 then {
391437 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
392438 if ((checkManagerPublicKey == checkManagerPublicKey))
393439 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
394440 else throw("Strict value is not equal to itself.")
395441 }
396442 else throw("Strict value is not equal to itself.")
397443 }
398444
399445
400446
401447 @Callable(i)
402448 func confirmManager () = {
403449 let pm = pendingManagerPublicKeyOrUnit()
404450 let hasPM = if (isDefined(pm))
405451 then true
406452 else throw("No pending manager")
407453 if ((hasPM == hasPM))
408454 then {
409455 let checkPM = if ((i.callerPublicKey == value(pm)))
410456 then true
411457 else throw("You are not pending manager")
412458 if ((checkPM == checkPM))
413459 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
414460 else throw("Strict value is not equal to itself.")
415461 }
416462 else throw("Strict value is not equal to itself.")
417463 }
418464
419465
466+
467+@Callable(i)
468+func isVerifiedREADONLY (assetId) = $Tuple2(nil, isVerified(assetId))
469+
470+
420471 @Verifier(tx)
421472 func verify () = {
422473 let targetPublicKey = match managerPublicKeyOrUnit() {
423474 case pk: ByteVector =>
424475 pk
425476 case _: Unit =>
426477 tx.senderPublicKey
427478 case _ =>
428479 throw("Match error")
429480 }
430481 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
431482 }
432483

github/deemru/w8io/873ac7e 
56.64 ms