tx · BbQd7W6c98QQ1W8JmjQDPgFKBeLCpY5kqQW4xW69yuKM

3N1Dhq5ZZyoojQisuTLusYjnGisqrxDwGLy:  -0.01000000 Waves

2021.10.07 15:57 [1735842] smart account 3N1Dhq5ZZyoojQisuTLusYjnGisqrxDwGLy > SELF 0.00000000 Waves

{ "type": 13, "id": "BbQd7W6c98QQ1W8JmjQDPgFKBeLCpY5kqQW4xW69yuKM", "fee": 1000000, "feeAssetId": null, "timestamp": 1633611502190, "version": 2, "chainId": 84, "sender": "3N1Dhq5ZZyoojQisuTLusYjnGisqrxDwGLy", "senderPublicKey": "4ogfEQE7KGDWQR7Vd5VThqBebZ47NxrMLmAApR3sFuXW", "proofs": [ "4TkvNH3dVPs5fd9rwBRgu4Dura2cwW4JhHXwDia3Awy2yajCjrq66MKX3s2WnNKnUSGcn6wgTDuZNDNMy5NDUZLa" ], "script": "base64:AAIFAAAAAAAAACsIAhIECgIECBIDCgEEEgcKBQgICAgIEgcKBQgICAgIEgUKAwgICBIDCgEIAAAAIAAAAAAJb3JhY2xlRmVlCQEAAAAFdmFsdWUAAAABCQAEJgAAAAECAAAAIzNNcFpRanpHb2dtaWZjRUtlOG1EZDZyaWJMN254VDlBQ3llAAAAAAZvd25lcnMJAARMAAAAAgkABB0AAAACBQAAAAlvcmFjbGVGZWUCAAAABm93bmVyMQkABEwAAAACCQAEHQAAAAIFAAAACW9yYWNsZUZlZQIAAAAGb3duZXIyBQAAAANuaWwAAAAADmRhcHBSdW5uaW5nS2V5AgAAABRjb25mX2RhcHBfaXNfcnVubmluZwAAAAARbWFpbnRlbmFuY2VNU0dLZXkCAAAAFGNvbmZfbWFpbnRlbmFuY2VfbXNnAAAAABJ3aGl0ZWxpc3RlZG9ubHlLZXkCAAAAFWNvbmZfd2hpdGVsaXN0ZWRfb25seQAAAAALZGFwcFJ1bm5pbmcJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQbAAAAAgUAAAAEdGhpcwUAAAAOZGFwcFJ1bm5pbmdLZXkGAAAAAA5tYWludGVuYW5jZU1TRwkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAABFtYWludGVuYW5jZU1TR0tleQIAAAAAAAAAAA93aGl0ZWxpc3RlZG9ubHkJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQbAAAAAgUAAAAEdGhpcwUAAAASd2hpdGVsaXN0ZWRvbmx5S2V5BgAAAAALdXNlckFsbG93ZWQCAAAAB0FMTE9XRUQAAAAADnVzZXJSZWdpc3RlcmVkAgAAAApSRUdJU1RFUkVEAAAAAAx1c2VyVmVyaWZpZWQCAAAACFZFUklGSUVEAAAAAA11c2VyU3VzcGVuZGVkAgAAAAlTVVNQRU5ERUQAAAAAC3VzZXJSZW1vdmVkAgAAAAdSRU1PVkVEAAAAABJ1c2VyQ2hhbmdlUmVxdWlyZWQCAAAAD0NIQU5HRV9SRVFVSVJFRAAAAAAQdXNlclVucmVnaXN0ZXJlZAIAAAAMVU5SRUdJU1RFUkVEAAAAAAl1c2VyUmVzZXQCAAAABVJFU0VUAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEAAAAD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AAECAAAAEkFscmVhZHkgcmVnaXN0ZXJlZAMDAwkBAAAAASEAAAABBQAAAAppc0FuVXBkYXRlCQAAAAAAAAIFAAAABnN0YXR1cwIAAAAABwUAAAAPd2hpdGVsaXN0ZWRvbmx5BwkAAAIAAAABAgAAACNDYW4ndCByZWdpc3RlciwgZ2V0IGFwcHJvdmVkIGZpcnN0LgMDAwUAAAAKaXNBblVwZGF0ZQkAAAAAAAACBQAAAAZzdGF0dXMCAAAAAAcGAwUAAAAKaXNBblVwZGF0ZQkAAAAAAAACBQAAAAZzdGF0dXMFAAAAC3VzZXJBbGxvd2VkBwkAAAIAAAABAgAAAA5SZWdpc3RlciBmaXJzdAYBAAAAEXZhbGlkYXRlTmV3U3RhdHVzAAAAAwAAAAZzdGF0dXMAAAAHYWRkcmVzcwAAAA1jdXJyZW50U3RhdHVzBAAAAAlhbGxTdGF0dXMJAARMAAAAAgUAAAAMdXNlclZlcmlmaWVkCQAETAAAAAIFAAAADnVzZXJSZWdpc3RlcmVkCQAETAAAAAIFAAAADXVzZXJTdXNwZW5kZWQJAARMAAAAAgUAAAALdXNlclJlbW92ZWQJAARMAAAAAgUAAAALdXNlckFsbG93ZWQJAARMAAAAAgUAAAASdXNlckNoYW5nZVJlcXVpcmVkBQAAAANuaWwEAAAAC3N0YXR1c1RvU2V0AwkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAACWFsbFN0YXR1cwUAAAAGc3RhdHVzBQAAAAZzdGF0dXMDAwkAAAAAAAACBQAAAAZzdGF0dXMFAAAACXVzZXJSZXNldAkAAAAAAAACBQAAAA1jdXJyZW50U3RhdHVzBQAAAAt1c2VyQWxsb3dlZAcCAAAAAAkAAAIAAAABAgAAAA5Vbmtub3duIHN0YXR1cwQAAAAQdXNlcklzUmVnaXN0ZXJlZAkBAAAAD2dldEludGVnZXJCeUtleQAAAAEJAQAAAAtrZXlVc2VyRGF0ZQAAAAEFAAAAB2FkZHJlc3MDAwkAAAAAAAACBQAAABB1c2VySXNSZWdpc3RlcmVkAAAAAAAAAAAACQEAAAACIT0AAAACBQAAAAtzdGF0dXNUb1NldAUAAAALdXNlckFsbG93ZWQHCQAAAgAAAAECAAAAMVlvdSBjYW50IHNldCB0aGlzIHN0YXR1cywgdXNlciBpcyBub3QgcmVnaXN0ZXJlZC4DAwkAAAAAAAACBQAAAA1jdXJyZW50U3RhdHVzBQAAAAt1c2VyQWxsb3dlZAkAAAAAAAACBQAAAAtzdGF0dXNUb1NldAUAAAALdXNlckFsbG93ZWQHCQAAAgAAAAECAAAAFFVzZXIgYWxyZWFkeSBhbGxvd2VkAwMJAAAAAAAAAgUAAAANY3VycmVudFN0YXR1cwUAAAAOdXNlclJlZ2lzdGVyZWQJAAAAAAAAAgUAAAALc3RhdHVzVG9TZXQFAAAAC3VzZXJBbGxvd2VkBwkAAAIAAAABAgAAACFVc2VyIGFscmVhZHkgYWxsb3dlZCAmIHJlZ2lzdGVyZWQDAwkAAAAAAAACBQAAAA1jdXJyZW50U3RhdHVzBQAAAAx1c2VyVmVyaWZpZWQJAAAAAAAAAgUAAAALc3RhdHVzVG9TZXQFAAAAC3VzZXJBbGxvd2VkBwkAAAIAAAABAgAAAB9Vc2VyIGFscmVhZHkgYWxsb3dlZCAmIHZlcmlmaWVkBQAAAAtzdGF0dXNUb1NldAEAAAAIbWFrZUpTT04AAAADAAAABG5hbWUAAAAFdGh1bWIAAAAEZGF0ZQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAPeyJ1c2VyX25hbWUiOiAiBQAAAARuYW1lAgAAABEiLCAidXNlcl90aHVtYiI6IgUAAAAFdGh1bWICAAAADyIsInVzZXJfZGF0ZSI6IgUAAAAEZGF0ZQIAAAACIn0AAAAGAAAABmludm9rZQEAAAAKYXBwUnVubmluZwAAAAIAAAAGaXNMaXZlAAAAB21lc3NhZ2UEAAAABmNhbGxlcgkABCUAAAABCQEAAAAUYWRkcmVzc0Zyb21QdWJsaWNLZXkAAAABCAUAAAAGaW52b2tlAAAAD2NhbGxlclB1YmxpY0tleQQAAAACaWQJAAJYAAAAAQgFAAAABmludm9rZQAAAA10cmFuc2FjdGlvbklkAwkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIJAARNAAAAAgUAAAAGb3duZXJzCQAEJQAAAAEFAAAABHRoaXMFAAAABmNhbGxlcgkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgUAAAAOZGFwcFJ1bm5pbmdLZXkFAAAABmlzTGl2ZQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAABFtYWludGVuYW5jZU1TR0tleQUAAAAHbWVzc2FnZQUAAAADbmlsCQAAAgAAAAECAAAAIllvdSBhcmUgbm90IGFsbG93ZWQgdG8gY2hhbmdlIHRoaXMAAAAGaW52b2tlAQAAABByZWdpc3RyYXRpb25Nb2RlAAAAAQAAAAZXTG9ubHkEAAAABmNhbGxlcgkABCUAAAABCQEAAAAUYWRkcmVzc0Zyb21QdWJsaWNLZXkAAAABCAUAAAAGaW52b2tlAAAAD2NhbGxlclB1YmxpY0tleQQAAAACaWQJAAJYAAAAAQgFAAAABmludm9rZQAAAA10cmFuc2FjdGlvbklkAwkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIJAARNAAAAAgUAAAAGb3duZXJzCQAEJQAAAAEFAAAABHRoaXMFAAAABmNhbGxlcgkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgUAAAASd2hpdGVsaXN0ZWRvbmx5S2V5BQAAAAZXTG9ubHkFAAAAA25pbAkAAAIAAAABAgAAACJZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIGNoYW5nZSB0aGlzAAAABmludm9rZQEAAAAMcmVnaXN0ZXJVc2VyAAAABQAAAARuYW1lAAAAC2Rlc2NyaXB0aW9uAAAABXRodW1iAAAABnNvY2lhbAAAAAZiYW5uZXIDCQEAAAABIQAAAAEFAAAAC2RhcHBSdW5uaW5nCQAAAgAAAAEFAAAADm1haW50ZW5hbmNlTVNHBAAAAAZjYWxsZXIJAAQlAAAAAQkBAAAAFGFkZHJlc3NGcm9tUHVibGljS2V5AAAAAQgFAAAABmludm9rZQAAAA9jYWxsZXJQdWJsaWNLZXkEAAAAAmlkCQACWAAAAAEIBQAAAAZpbnZva2UAAAANdHJhbnNhY3Rpb25JZAQAAAAJdGltZXN0YW1wCAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAMJAQAAAAEhAAAAAQkBAAAADnZhbGlkYXRlQmFubmVyAAAAAQUAAAAGYmFubmVyCQAAAgAAAAECAAAAFUludmFsaWQgYmFubmVyIGltYWdlIQMJAQAAAAEhAAAA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", "height": 1735842, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: cnK6R7pekKNXjiPiWTmVciSKJWVB39n625CTpM3ju3g Next: UsCe5gBo62vn9gJKgELvwBFCa6AqrdSEfEM5YW8iAwe Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let unitTest = false
5-
64 let oracleFee = value(addressFromString("3MpZQjzGogmifcEKe8mDd6ribL7nxT9ACye"))
7-
8-let feeReceiver = "3N65xLq8JcCeaEiR1TJQ7dBqXBvEy6E48Wz"
9-
10-let certDapp = "3MxcXrNbMZKYaSrhcfeMm2hZnBeCu3yRWsw"
11-
12-let userDapp = value(addressFromString("3N9cQgZFPHHVu8wqsn2DkQFehg3h8CNiooA"))
13-
14-let whitelistDapp = value(addressFromString("3N9xZYGpzMFDXvXuctmU6zV8qSzm2ZfF31f"))
15-
16-let USDNAssetId = base58'132maRL3uF35tc2bpRih9D6MYq5DR6H28zkop786dKyu'
175
186 let owners = [getString(oracleFee, "owner1"), getString(oracleFee, "owner2")]
197
20-let USDNFirstSellCut = 150
8+let dappRunningKey = "conf_dapp_is_running"
219
22-let USDNSecondSellCut = 30
10+let maintenanceMSGKey = "conf_maintenance_msg"
2311
24-let originalCreatorCut = 70
12+let whitelistedonlyKey = "conf_whitelisted_only"
2513
26-let dappRunning = valueOrElse(getBoolean(userDapp, "conf_dapp_is_running"), true)
14+let dappRunning = valueOrElse(getBoolean(this, dappRunningKey), true)
2715
28-let maintenanceMSG = valueOrElse(getString(userDapp, "conf_maintenance_msg"), "")
16+let maintenanceMSG = valueOrElse(getString(this, maintenanceMSGKey), "")
17+
18+let whitelistedonly = valueOrElse(getBoolean(this, whitelistedonlyKey), true)
19+
20+let userAllowed = "ALLOWED"
21+
22+let userRegistered = "REGISTERED"
23+
24+let userVerified = "VERIFIED"
2925
3026 let userSuspended = "SUSPENDED"
3127
3228 let userRemoved = "REMOVED"
3329
30+let userChangeRequired = "CHANGE_REQUIRED"
31+
3432 let userUnregistered = "UNREGISTERED"
3533
36-let userAllowed = "ALLOWED"
37-
38-let auctionType1 = "BIDTYPE"
39-
40-let auctionType2 = "TRADITIONAL"
41-
42-func getStringByKeyFromUsers (key) = valueOrElse(getString(userDapp, key), "")
43-
34+let userReset = "RESET"
4435
4536 func getStringByKey (key) = valueOrElse(getString(this, key), "")
4637
4738
48-func getStringByKeyOrError (key,error) = valueOrErrorMessage(getString(this, key), error)
49-
50-
51-func getIntegerByKeyFromOracle (key) = valueOrErrorMessage(getInteger(oracleFee, key), "Integer undefine or 0 in oracle")
39+func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
5240
5341
5442 func getIntegerByKey (key) = valueOrElse(getInteger(this, key), 0)
5543
5644
57-func checkWhitelist (key) = valueOrElse(getInteger(whitelistDapp, key), 0)
45+func keyUserAddr (caller) = ("user_" + caller)
5846
5947
60-func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
48+func keyUserName (caller) = ("user_name_" + caller)
6149
6250
63-func validateHash (hash) = (size(hash) == 64)
51+func keyUserDesc (caller) = ("user_desc_" + caller)
52+
53+
54+func keyUserSocial (caller) = ("user_social_" + caller)
55+
56+
57+func keyUserThumb (caller) = ("user_thumb_" + caller)
58+
59+
60+func keyUserBanner (caller) = ("user_banner_" + caller)
6461
6562
6663 func keyUserStatus (caller) = ("user_status_" + caller)
6764
6865
69-func keyDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
66+func keyUserDate (caller) = ("user_date_" + caller)
7067
7168
72-func keyName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
69+func validateCID (cid) = if (contains(cid, "/"))
70+ then if (if ((63 > size(cid)))
71+ then (size(split(cid, "/")[0]) == 46)
72+ else false)
73+ then (16 > size(split(cid, "/")[1]))
74+ else false
75+ else false
7376
7477
75-func keyDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
78+func validateBanner (cid) = if ((size(cid) == 0))
79+ then true
80+ else if ((size(cid) == 46))
81+ then true
82+ else false
7683
7784
78-func keyDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
79-
80-
81-func keyMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
82-
83-
84-func keyMinPrice (caller,artId) = ((("art_minprice_" + artId) + "_") + caller)
85-
86-
87-func keyHighestBidBidId (artId) = ("art_highestBidBidId_" + artId)
88-
89-
90-func keyBidId (bidId) = ("bid_" + bidId)
91-
92-
93-func keyDuration (caller,artId) = ((("art_duration_" + artId) + "_") + caller)
94-
95-
96-func keyEndHeight (caller,artId) = ((("art_endheight_" + artId) + "_") + caller)
97-
98-
99-func keyAuctionType (caller,artId) = ((("art_auctiontype_" + artId) + "_") + caller)
100-
101-
102-func keyIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
103-
104-
105-func KeyNftIssuer (nftId) = ("nft_issued_" + nftId)
106-
107-
108-func keyOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
109-
110-
111-func keyEntitlement (caller,artId) = ((("art_entitlement_" + artId) + "_") + caller)
112-
113-
114-func keyTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
115-
116-
117-func keyType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
118-
119-
120-func keyPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
121-
122-
123-func keyAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
124-
125-
126-func keyHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
127-
128-
129-func keyOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
130-
131-
132-func keyTxidByHashOwner (sha256Hash,caller) = ("get_txid_by_hash_owner_" + toBase58String(sha256_16Kb(toBytes((sha256Hash + caller)))))
133-
134-
135-let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(USDNAssetId)))
136-
137-func getAmountByBidId (bidId) = valueOrElse(getIntegerByKey(keyBidId(bidId)), 0)
138-
139-
140-func getAmountHighestBidByArtId (artId) = {
141- let bidId = getStringByKey(keyHighestBidBidId(artId))
142- if ((bidId == ""))
143- then 0
144- else getAmountByBidId(bidId)
85+func validUserData (caller,name,description,thumb,isAnUpdate) = {
86+ let validCID = if ((size(thumb) != 0))
87+ then validateCID(thumb)
88+ else true
89+ if (!(validCID))
90+ then throw("CID don't match requirement!")
91+ else if (if ((name == ""))
92+ then true
93+ else (description == ""))
94+ then throw("Name and description cannot be empty")
95+ else if ((size(description) > 600))
96+ then throw("600 Char. max description")
97+ else if ((size(name) > 45))
98+ then throw("45 Char. max name")
99+ else {
100+ let status = getStringByKey(keyUserStatus(caller))
101+ if (if ((status == userSuspended))
102+ then true
103+ else (status == userRemoved))
104+ then throw("Account suspended/ removed.")
105+ else if (if (!(isAnUpdate))
106+ then (status == userRegistered)
107+ else false)
108+ then throw("Already registered")
109+ else if (if (if (!(isAnUpdate))
110+ then (status == "")
111+ else false)
112+ then whitelistedonly
113+ else false)
114+ then throw("Can't register, get approved first.")
115+ else if (if (if (isAnUpdate)
116+ then (status == "")
117+ else false)
118+ then true
119+ else if (isAnUpdate)
120+ then (status == userAllowed)
121+ else false)
122+ then throw("Register first")
123+ else true
124+ }
145125 }
146126
147127
148-func validateString (str,max) = if ((size(str) == 0))
149- then throw("Field cannot be is empty")
150- else if ((size(str) > max))
151- then throw((str + " is too long"))
152- else true
153-
154-
155-func validateUser (caller) = {
156- let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
157- if (if ((userStatus == userUnregistered))
158- then true
159- else (userStatus == userAllowed))
160- then "Register this account first with 'Account' tab"
161- else if ((userStatus == userSuspended))
162- then "Account suspended"
163- else if ((userStatus == userRemoved))
164- then "Account removed"
165- else ""
128+func validateNewStatus (status,address,currentStatus) = {
129+ let allStatus = [userVerified, userRegistered, userSuspended, userRemoved, userAllowed, userChangeRequired]
130+ let statusToSet = if (containsElement(allStatus, status))
131+ then status
132+ else if (if ((status == userReset))
133+ then (currentStatus == userAllowed)
134+ else false)
135+ then ""
136+ else throw("Unknown status")
137+ let userIsRegistered = getIntegerByKey(keyUserDate(address))
138+ if (if ((userIsRegistered == 0))
139+ then (statusToSet != userAllowed)
140+ else false)
141+ then throw("You cant set this status, user is not registered.")
142+ else if (if ((currentStatus == userAllowed))
143+ then (statusToSet == userAllowed)
144+ else false)
145+ then throw("User already allowed")
146+ else if (if ((currentStatus == userRegistered))
147+ then (statusToSet == userAllowed)
148+ else false)
149+ then throw("User already allowed & registered")
150+ else if (if ((currentStatus == userVerified))
151+ then (statusToSet == userAllowed)
152+ else false)
153+ then throw("User already allowed & verified")
154+ else statusToSet
166155 }
167156
168157
169-func validateArtworkData (caller,cidDisplay,name,description,tags) = {
170- let checkUser = validateUser(caller)
171- if ((checkUser != ""))
172- then throw(checkUser)
173- else if ((size(cidDisplay) == 0))
174- then throw("Display CID cannot be empty")
175- else if ((size(cidDisplay) != 46))
176- then throw("This doesn't seem a valid CID!")
177- else if (!(validateString(name, 100)))
178- then throw("100 Char. max name")
179- else if (!(validateString(description, 1000)))
180- then throw("1000 Char. max description")
181- else if ((size(split(tags, ",")) > 5))
182- then throw("5 tags max.")
183- else ""
184- }
158+func makeJSON (name,thumb,date) = (((((("{\"user_name\": \"" + name) + "\", \"user_thumb\":\"") + thumb) + "\",\"user_date\":\"") + date) + "\"}")
185159
186160
187-func isPayment (i) = if ((size(i.payments) == 0))
188- then throw("No payment attached")
189- else {
190- let payment = value(i.payments[0])
191- let amount = value(payment.amount)
192- $Tuple2(payment, amount)
193- }
194-
195-
196-func validatePayment (i) = {
197- let t089829018 = isPayment(i)
198- let payment = t089829018._1
199- let amount = t089829018._2
200- let assetId = if (if (isDefined(payment.assetId))
201- then (payment.assetId == USDNAssetId)
202- else false)
203- then payment.assetId
204- else throw("Only USDN token accepted as transaction fee")
205- if ((amount != currentCertificationPrice))
206- then throw(((("Payment amount should be " + toString(currentCertificationPrice)) + " but is: ") + toString(amount)))
207- else $Tuple2(amount, assetId)
208- }
209-
210-
211-func isArtMinted (addrToUse,artId) = match getInteger(this, keyIssued(addrToUse, artId)) {
212- case b: Int =>
213- if ((b != 0))
214- then true
215- else false
216- case _ =>
217- false
218-}
219-
220-
221-func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
222- let t096119647 = isPayment(i)
223- let payment = t096119647._1
224- let amount = t096119647._2
225- let assetId = if (!(isDefined(payment.assetId)))
226- then throw("Wrong asset id")
227- else if (if ((size(priceAssetId) > 0))
228- then (toBase58String(value(payment.assetId)) == priceAssetId)
229- else false)
230- then payment.assetId
231- else throw("Wrong asset id")
232- if (if ((assetId == unit))
233- then (priceAssetId != "")
234- else false)
235- then throw("Wrong asset id")
236- else if ((artworkPrice != amount))
237- then throw(((("Payment don't match " + toString(artworkPrice)) + " ") + toString(amount)))
238- else $Tuple2(amount, assetId)
239- }
240-
241-
242-func acceptedAssetIds (assetId) = if ((assetId != toBase58String(USDNAssetId)))
243- then throw("Only USDN accepted")
244- else true
245-
246-
247-func validateMinSell (assetId,price) = {
248- let minSellSconex = if (unitTest)
249- then 1
250- else (currentCertificationPrice * 2)
251- if (if (if ((assetId == toBase58String(USDNAssetId)))
252- then (minSellSconex > price)
253- else false)
254- then (price != 0)
255- else false)
256- then throw(("Wrong minimum sell price " + toString(minSellSconex)))
257- else true
258- }
259-
260-
261-func getBidAssetId (assetId) = if ((assetId == "WAVES"))
262- then throw("Only USDN is accepted!")
263- else fromBase58String(assetId)
264-
265-
266-func getPriceAssetIdFromBid (bidDataKey) = {
267- let bidData = getStringByKey((bidDataKey + "_OPEN"))
268- if ((bidData == ""))
269- then throw("Bid not found")
270- else {
271- let bidDataArr = split(bidData, "_")
272- let bidAmount = parseIntValue(bidDataArr[1])
273- let bidAssetId = getBidAssetId(bidDataArr[0])
274- if ((0 >= bidAmount))
275- then throw("Wrong amount")
276- else $Tuple2(bidAmount, bidAssetId)
277- }
278- }
279-
280-
281-func idCallerDate (i) = if (!(dappRunning))
282- then throw(maintenanceMSG)
283- else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
284-
285-
286-func isBidCheck (i,issuer,bidOwner,bidId) = if (if (if ((toBase58String(i.caller.bytes) == issuer))
287- then (bidOwner != "")
288- else false)
289- then (bidId != "")
290- else false)
291- then true
292- else false
293-
294-
295-func getArtData (i,issuer,artId,isBid) = {
296- let callerIsIssuer = (toBase58String(i.caller.bytes) == issuer)
297- let totalNFT = getIntegerByKey("total_nft_issued")
298- let artworkName = getStringByKey(keyName(issuer, artId))
299- if ((artworkName == ""))
300- then throw("Art doesn't exist")
301- else {
302- let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
303- let amountSold = getIntegerByKey(keyIssued(issuer, artId))
304- let artworkPrice = valueOrElse(getIntegerByKey(keyPrice(issuer, artId)), (currentCertificationPrice * 2))
305- let priceAssetId = if (callerIsIssuer)
306- then toBase58String(USDNAssetId)
307- else getStringByKey(keyAssetIdAccepted(issuer, artId))
308- let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
309- if (if (if (!(isBid))
310- then !(callerIsIssuer)
311- else false)
312- then if (if ((0 >= artworkPrice))
313- then true
314- else !(isOnSale))
315- then true
316- else (0 >= maxCanSell)
317- else false)
318- then throw("Art not for sale")
319- else if (if (if (!(isBid))
320- then callerIsIssuer
321- else false)
322- then (0 >= maxCanSell)
323- else false)
324- then throw("Max issuable not set")
325- else $Tuple7(totalNFT, artworkName, amountSold, artworkPrice, priceAssetId, maxCanSell, isOnSale)
326- }
327- }
328-
329-
330-func getBidData (i,caller,issuer,artId,bidOwner,bidId,priceAssetId,artworkPrice,isBid) = {
331- let checkUser = validateUser(issuer)
332- if (if (isBid)
333- then (checkUser != "")
334- else false)
335- then throw(checkUser)
336- else {
337- let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
338- let t01351913648 = if (isBid)
339- then getPriceAssetIdFromBid(bidDataKey)
340- else validatePriceAssetId(i, priceAssetId, artworkPrice)
341- let amount = t01351913648._1
342- let assetId = t01351913648._2
343- $Tuple3(bidDataKey, amount, assetId)
344- }
345- }
346-
347-
348-func getCommissionData (issuer,assetId,amount,amountSold,maxCanSell) = {
349- let isWhitelisted = checkWhitelist(issuer)
350- let cut = if ((isWhitelisted > height))
351- then 0
352- else if ((assetId == USDNAssetId))
353- then USDNFirstSellCut
354- else throw("Only USDN is accepted!")
355- let amountForSconex = fraction(amount, cut, 1000)
356- let amountForCreator = (amount - amountForSconex)
357- if ((amountSold == maxCanSell))
358- then throw("Art sold out")
359- else {
360- let newAmountSold = (amountSold + 1)
361- $Tuple3(amountForSconex, amountForCreator, newAmountSold)
362- }
363- }
364-
365-
366-func getIssueData (issuer,artId,artworkName,newAmountSold,maxCanSell,totalNFT,caller,bidOwner,bidId,i,isOnSale) = {
367- let issueMeta = ((((((((("Creator: " + issuer) + ",ArtID: ") + artId) + ",Artwork name: ") + artworkName) + ",Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
368- let sellStatus = if (if ((newAmountSold == maxCanSell))
369- then true
370- else !(isOnSale))
371- then false
372- else true
373- let receiveNFT = if ((bidOwner != ""))
374- then addressFromStringValue(bidOwner)
375- else i.caller
376- $Tuple3(sellStatus, receiveNFT, issueMeta)
377- }
378-
379-
380-func calculateRarity (mintIndex) = if ((4 > mintIndex))
381- then "SSR"
382- else if ((11 > mintIndex))
383- then "SR"
384- else if ((101 > mintIndex))
385- then "R"
386- else "N"
387-
388-
389-func getBidKeyVal (assetId,bidDataKey,date) = {
390- let assetIdBid = if (!(isDefined(assetId)))
391- then throw("Only USDN is accepted")
392- else toBase58String(value(assetId))
393- let bidData = getStringByKey((bidDataKey + "_OPEN"))
394- let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
395- let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
396- $Tuple3(assetIdBid, bidDelOld, bidUpdate)
397- }
398-
399-
400-func buyMint (i,artId,issuer,bidId,bidOwner,isBid) = {
401- let callerData = idCallerDate(i)
402- let id = callerData._1
403- let caller = callerData._2
404- let date = callerData._3
405- let artData = getArtData(i, issuer, artId, isBid)
406- let totalNFT = artData._1
407- let artworkName = artData._2
408- let amountSold = artData._3
409- let artworkPrice = artData._4
410- let priceAssetId = artData._5
411- let maxCanSell = artData._6
412- let isOnSale = artData._7
413- let bidData = getBidData(i, caller, issuer, artId, bidOwner, bidId, priceAssetId, artworkPrice, isBid)
414- let bidDataKey = bidData._1
415- let amount = bidData._2
416- let assetId = bidData._3
417- let commisionData = getCommissionData(issuer, value(assetId), amount, amountSold, maxCanSell)
418- let amountForSconex = commisionData._1
419- let amountForCreator = commisionData._2
420- let newAmountSold = commisionData._3
421- let issuerData = getIssueData(issuer, artId, artworkName, newAmountSold, maxCanSell, totalNFT, caller, bidOwner, bidId, i, isOnSale)
422- let sellStatus = issuerData._1
423- let receiveNFT = issuerData._2
424- let issueMeta = issuerData._3
425- let idNFTInvoke = invoke(this, "mintNft", [totalNFT, issueMeta, toString(receiveNFT)], nil)
426- if ((idNFTInvoke == idNFTInvoke))
427- then {
428- let idNFT = match idNFTInvoke {
429- case r: String =>
430- r
431- case _ =>
432- throw("Incorrect invoke result")
433- }
434- let bidKeyValue = getBidKeyVal(assetId, bidDataKey, date)
435- let assetIdBid = bidKeyValue._1
436- let bidDelOld = bidKeyValue._2
437- let bidUpdate = bidKeyValue._3
438- let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
439- let rarity = calculateRarity(newAmountSold)
440- let soldValue = if (!(isBid))
441- then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + idNFT)
442- else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + idNFT)
443- let soldData = StringEntry(soldKey, soldValue)
444- let buyRes = [IntegerEntry(keyIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + idNFT), soldKey), StringEntry(("nft_rarity_" + idNFT), rarity), IntegerEntry("total_nft_issued", (totalNFT + 1)), BooleanEntry(keyOnSale(issuer, artId), sellStatus), ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId), ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSconex, assetId), StringEntry(KeyNftIssuer(idNFT), issuer)]
445- let res = invoke(addressFromStringValue(certDapp), "createCert", [toString(receiveNFT), idNFT, issuer], nil)
446- if ((res == res))
447- then if (isBid)
448- then (((buyRes :+ soldData) :+ bidUpdate) :+ bidDelOld)
449- else soldData :: buyRes
450- else throw("Strict value is not equal to itself.")
451- }
452- else throw("Strict value is not equal to itself.")
453- }
454-
455-
456-func setBidNonTraditional (i,artId,issuer) = {
457- let t02770927747 = idCallerDate(i)
458- let id = t02770927747._1
459- let caller = t02770927747._2
460- let date = t02770927747._3
461- let t02775227788 = isPayment(i)
462- let payment = t02775227788._1
463- let amount = t02775227788._2
464- let assetId = if (!(isDefined(payment.assetId)))
465- then throw("Only USDN is accepted!")
466- else toBase58String(value(payment.assetId))
467- let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
468- if (!(acceptedAssetIds(assetId)))
469- then throw("asset not accepted")
470- else if (!(validateMinSell(assetId, amount)))
471- then throw("Wrong min sell")
472- else {
473- let amountSold = getIntegerByKey(keyIssued(issuer, artId))
474- let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
475- if ((0 >= maxCanSell))
476- then throw("No max edition set for this artwork")
477- else if ((amountSold >= maxCanSell))
478- then throw("Sold out, you cannot bid")
479- else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1))]
480- }
481- }
482-
483-
484-func setBidTraditional (i,artId,issuer) = {
485- let endHeight = getIntegerByKey(keyEndHeight(issuer, artId))
486- let highestBid = getAmountHighestBidByArtId(artId)
487- if ((height > endHeight))
488- then throw("This auction is finished already!")
489- else {
490- let callderData = idCallerDate(i)
491- let id = callderData._1
492- let caller = callderData._2
493- let date = callderData._3
494- let isPaymentVar = isPayment(i)
495- let payment = isPaymentVar._1
496- let amount = isPaymentVar._2
497- if ((highestBid >= amount))
498- then throw(("Please place a bid higher than: " + toString(highestBid)))
499- else {
500- let assetId = if (!(isDefined(payment.assetId)))
501- then throw("Only USDN is accepted!")
502- else toBase58String(value(payment.assetId))
503- let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
504- if (!(acceptedAssetIds(assetId)))
505- then throw("asset not accepted")
506- else if (!(validateMinSell(assetId, amount)))
507- then throw("Wrong min sell")
508- else {
509- let amountSold = getIntegerByKey(keyIssued(issuer, artId))
510- let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
511- if ((0 >= maxCanSell))
512- then throw("No max edition set for this artwork")
513- else if ((amountSold >= maxCanSell))
514- then throw("Sold out, you cannot bid")
515- else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1)), StringEntry(keyHighestBidBidId(artId), toBase58String(i.transactionId)), IntegerEntry(keyBidId(toBase58String(i.transactionId)), amount)]
516- }
517- }
518- }
519- }
520-
521-
522-func acceptBidNonTraditional (i,artId,issuer,bidId,bidOwner) = {
523- let caller = toBase58String(i.caller.bytes)
524- if ((caller != issuer))
525- then throw("You cannot do this action")
526- else buyMint(i, artId, issuer, bidId, bidOwner, true)
527- }
528-
529-
530-func restartAuction (artId,issuer) = {
531- let amountSold = getIntegerByKey(keyIssued(issuer, artId))
532- let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
533- let oldEndHeight = getIntegerByKey(keyEndHeight(issuer, artId))
534- let duration = getIntegerByKey(keyDuration(issuer, artId))
535- let endHeight = (duration + height)
536- if ((height > oldEndHeight))
537- then if ((amountSold == maxCanSell))
538- then throw("Can't restart auction, max amount sold")
539- else [IntegerEntry(keyEndHeight(issuer, artId), endHeight), DeleteEntry(keyHighestBidBidId(artId))]
540- else throw("Previous auction isn't completed yet")
541- }
542-
543-
544-func acceptBidTraditional (i,artId,issuer,bidId,bidOwner) = {
545- let endHeight = getIntegerByKey(keyEndHeight(issuer, artId))
546- let highestBidId = getStringByKey(keyHighestBidBidId(artId))
547- if ((height > endHeight))
548- then if ((bidId == highestBidId))
549- then {
550- let buyMintData = buyMint(i, artId, issuer, bidId, bidOwner, true)
551- let restartAuctionData = restartAuction(artId, issuer)
552- (restartAuctionData ++ buyMintData)
553- }
554- else throw("This is not the winning bid!")
555- else throw("This auction is not yet finished!")
556- }
557-
558-
559-func cancelBidImpl (i,artId,issuer,bidId) = {
560- let t02894229094 = idCallerDate(i)
561- let id = t02894229094._1
562- let caller = t02894229094._2
563- let date = t02894229094._3
564- let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
565- let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + bidId)
566- let bidData = getStringByKeyOrError((bidDataKey + "_OPEN"), "Bid not found")
567- let bidDataArr = split(bidData, "_")
568- let assetId = getBidAssetId(bidDataArr[0])
569- let bidStatus = "CANCELED"
570-[DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(caller)), parseIntValue(bidDataArr[1]), assetId)]
571- }
572-
573-
574-func cancelBidImplTraditional (i,artId,issuer,bidId) = {
575- let t02894229094 = idCallerDate(i)
576- let id = t02894229094._1
577- let caller = t02894229094._2
578- let date = t02894229094._3
579- let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
580- let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + bidId)
581- let bidData = getStringByKeyOrError((bidDataKey + "_OPEN"), "Bid not found")
582- let bidDataArr = split(bidData, "_")
583- let assetId = getBidAssetId(bidDataArr[0])
584- let bidStatus = "CANCELED"
585- let bidAmount = parseIntValue(bidDataArr[1])
586- let highestBidId = getStringByKey(keyHighestBidBidId(artId))
587- if ((bidId == highestBidId))
588- then throw("You can't cancel the highest bid!")
589- else [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(caller)), bidAmount, assetId)]
590- }
591-
592-
593-@Callable(i)
594-func mintNft (totalNFT,issueMeta,receiveNFT) = if ((i.caller == this))
595- then {
596- let receiveNFTAddy = Address(fromBase58String(receiveNFT))
597- let issueNFT = Issue(("SCONEX_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
598- let idNFT = calculateAssetId(issueNFT)
599- $Tuple2([issueNFT, ScriptTransfer(receiveNFTAddy, 1, idNFT)], toBase58String(idNFT))
600- }
601- else throw("Only the dApp can mint NFT's")
602-
603-
604-
605-@Callable(i)
606-func addArtwork (sha256Hash,name,description,tags,type,cidDisplay,entitlement) = {
607- let t01774017781 = idCallerDate(i)
608- let artId = t01774017781._1
609- let caller = t01774017781._2
610- let date = t01774017781._3
611- let validateArtwork = validateArtworkData(caller, cidDisplay, name, description, tags)
612- if ((validateArtwork != ""))
613- then throw("Something went wrong!")
614- else {
615- let t01817018212 = validatePayment(i)
616- let amount = t01817018212._1
617- let assetId = t01817018212._2
618- if (!(isDefined(amount)))
619- then throw("Something went wrong")
620- else {
621- let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller))
622- if ((entryExist != ""))
623- then throw("You already added it")
624- else {
625- let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
626- if ((hashExist != ""))
627- then throw("This hash is already registered")
628- else [StringEntry(keyOwnerByHash(sha256Hash), caller), StringEntry(keyTxidByHashOwner(sha256Hash, caller), artId), IntegerEntry(keyDate(caller, artId), date), StringEntry(keyName(caller, artId), name), StringEntry(keyDesc(caller, artId), description), StringEntry(keyDisplayCid(caller, artId), cidDisplay), StringEntry(keyType(caller, artId), type), StringEntry(keyTags(caller, artId), tags), IntegerEntry(keyMaxMint(caller, artId), 0), IntegerEntry(keyIssued(caller, artId), 0), BooleanEntry(keyOnSale(caller, artId), false), StringEntry(keyHashByTxidAddr(caller, artId), sha256Hash), StringEntry(keyEntitlement(caller, artId), entitlement), ScriptTransfer(Address(fromBase58String(feeReceiver)), amount, assetId)]
629- }
630- }
631- }
161+@Callable(invoke)
162+func appRunning (isLive,message) = {
163+ let caller = toString(addressFromPublicKey(invoke.callerPublicKey))
164+ let id = toBase58String(invoke.transactionId)
165+ if (containsElement((owners :+ toString(this)), caller))
166+ then [BooleanEntry(dappRunningKey, isLive), StringEntry(maintenanceMSGKey, message)]
167+ else throw("You are not allowed to change this")
632168 }
633169
634170
635171
636-@Callable(i)
637-func sellArtwork (artId,price,maxMint,assetId,auctionType,minBid,duration) = {
638- let t02571425747 = idCallerDate(i)
639- let id = t02571425747._1
640- let caller = t02571425747._2
641- let artworkName = getStringByKey(keyName(caller, artId))
642- if (!(containsElement([auctionType1, auctionType2], auctionType)))
643- then throw("We don't know this auction type")
644- else if ((artworkName == ""))
645- then throw("This art doesn't match your account")
646- else {
647- let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
648- if (!(acceptedAssetIds(assetId)))
649- then throw("Something went wrong!")
650- else if (!(validateMinSell(assetId, price)))
651- then throw("Something went wrong!")
652- else {
653- let checkUser = validateUser(caller)
654- if ((checkUser != ""))
655- then throw(checkUser)
656- else {
657- let amountSold = getIntegerByKey(keyIssued(caller, artId))
658- let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
659- if ((maxMint > 10))
660- then throw("10 editions max per artwork")
661- else if (if ((amountSold != 0))
662- then (amountSold == maxCanSell)
663- else false)
664- then throw("Max edition reached.")
665- else if (if ((amountSold > 0))
666- then (maxCanSell != maxMint)
667- else false)
668- then throw("Cannot change maximum issuable anymore")
669- else if (if ((bidNbr > 0))
670- then (maxCanSell != maxMint)
671- else false)
672- then throw("Cannot change maximum issuable with active orders")
673- else {
674- let sellStatus = if (if ((price > 0))
675- then (maxMint > 0)
676- else false)
677- then true
678- else false
679- let endHeight = (duration + height)
680-[BooleanEntry(keyOnSale(caller, artId), sellStatus), IntegerEntry(keyPrice(caller, artId), price), IntegerEntry(keyMaxMint(caller, artId), maxMint), IntegerEntry(keyMinPrice(caller, artId), minBid), IntegerEntry(keyDuration(caller, artId), duration), IntegerEntry(keyEndHeight(caller, artId), endHeight), StringEntry(keyAssetIdAccepted(caller, artId), assetId), StringEntry(keyAuctionType(caller, artId), auctionType)]
681- }
682- }
683- }
684- }
172+@Callable(invoke)
173+func registrationMode (WLonly) = {
174+ let caller = toString(addressFromPublicKey(invoke.callerPublicKey))
175+ let id = toBase58String(invoke.transactionId)
176+ if (containsElement((owners :+ toString(this)), caller))
177+ then [BooleanEntry(whitelistedonlyKey, WLonly)]
178+ else throw("You are not allowed to change this")
685179 }
686180
687181
688182
689-@Callable(i)
690-func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "", false)
183+@Callable(invoke)
184+func registerUser (name,description,thumb,social,banner) = if (!(dappRunning))
185+ then throw(maintenanceMSG)
186+ else {
187+ let caller = toString(addressFromPublicKey(invoke.callerPublicKey))
188+ let id = toBase58String(invoke.transactionId)
189+ let timestamp = lastBlock.timestamp
190+ if (!(validateBanner(banner)))
191+ then throw("Invalid banner image!")
192+ else if (!(validUserData(caller, name, description, thumb, false)))
193+ then throw("Something went wrong")
194+ else {
195+ let json = makeJSON(toBase64String(toBytes(name)), toBase64String(toBytes(thumb)), toString(timestamp))
196+[IntegerEntry(keyUserDate(caller), timestamp), StringEntry(keyUserAddr(caller), ((id + "_") + toString(timestamp))), StringEntry(keyUserName(caller), name), StringEntry(keyUserDesc(caller), description), StringEntry(keyUserSocial(caller), social), StringEntry(keyUserThumb(caller), thumb), StringEntry(keyUserBanner(caller), banner), StringEntry(keyUserStatus(caller), userRegistered), DeleteEntry(("ALLOWED_" + caller)), StringEntry(((userRegistered + "_") + caller), json)]
197+ }
198+ }
691199
692200
693201
694-@Callable(i)
695-func deleteEntry (entry) = {
696- let caller = toString(addressFromPublicKey(i.callerPublicKey))
697- if (containsElement(owners, caller))
698- then [DeleteEntry(entry)]
699- else throw("no")
202+@Callable(invoke)
203+func updateUser (name,description,thumb,social,banner) = if (!(dappRunning))
204+ then throw(maintenanceMSG)
205+ else {
206+ let caller = toString(addressFromPublicKey(invoke.callerPublicKey))
207+ let id = toBase58String(invoke.transactionId)
208+ let status = getStringByKey(keyUserStatus(caller))
209+ if (!(validateBanner(banner)))
210+ then throw("Invalid banner image!")
211+ else if (!(validUserData(caller, name, description, thumb, true)))
212+ then throw("Something went wrong")
213+ else {
214+ let date = getIntegerByKey(keyUserDate(caller))
215+ let json = makeJSON(toBase64String(toBytes(name)), toBase64String(toBytes(thumb)), toString(date))
216+[StringEntry(keyUserName(caller), name), StringEntry(keyUserDesc(caller), description), StringEntry(keyUserSocial(caller), social), StringEntry(keyUserBanner(caller), banner), StringEntry(keyUserThumb(caller), thumb), StringEntry(((status + "_") + caller), json)]
217+ }
218+ }
219+
220+
221+
222+@Callable(invoke)
223+func changeUserStatus (address,status,note) = {
224+ let caller = toString(addressFromPublicKey(invoke.callerPublicKey))
225+ let id = toBase58String(invoke.transactionId)
226+ let addr = addressFromString(address)
227+ match addr {
228+ case addr: Address =>
229+ let currentStatus = getStringByKey(keyUserStatus(address))
230+ let statusToSet = validateNewStatus(status, address, currentStatus)
231+ let name = toBase64String(toBytes(getStringByKey(keyUserName(address))))
232+ let thumb = toBase64String(toBytes(getStringByKey(keyUserThumb(address))))
233+ let date = getIntegerByKey(keyUserDate(address))
234+ let json = makeJSON(name, thumb, toString(date))
235+ if (containsElement((owners :+ toString(this)), caller))
236+ then [StringEntry(keyUserStatus(address), statusToSet), DeleteEntry(((currentStatus + "_") + address)), StringEntry(((statusToSet + "_") + address), json), StringEntry(("user_note_" + address), note)]
237+ else throw("Not allowed to change user status")
238+ case _ =>
239+ throw("Seems to be an invalid address!")
240+ }
700241 }
701242
702243
703244
704-@Callable(i)
705-func setBid (artId,issuer) = {
706- let auctionType = getStringByKey(keyAuctionType(issuer, artId))
707- if ((auctionType == auctionType1))
708- then setBidNonTraditional(i, artId, issuer)
709- else if ((auctionType == auctionType2))
710- then setBidTraditional(i, artId, issuer)
711- else throw((("Unknown auction type :" + auctionType) + ", please contact the admins"))
712- }
713-
714-
715-
716-@Callable(i)
717-func acceptBid (artId,issuer,bidId,bidOwner) = {
718- let auctionType = getStringByKey(keyAuctionType(issuer, artId))
719- if ((auctionType == auctionType1))
720- then acceptBidNonTraditional(i, artId, issuer, bidId, bidOwner)
721- else if ((auctionType == auctionType2))
722- then acceptBidTraditional(i, artId, issuer, bidId, bidOwner)
723- else throw((("Unknown auction type :" + auctionType) + ", please contact the admins"))
724- }
725-
726-
727-
728-@Callable(i)
729-func cancelBid (artId,issuer,bidId) = {
730- let auctionType = getStringByKey(keyAuctionType(issuer, artId))
731- if ((auctionType == auctionType1))
732- then cancelBidImpl(i, artId, issuer, bidId)
733- else cancelBidImplTraditional(i, artId, issuer, bidId)
245+@Callable(invoke)
246+func deleteUser (address) = {
247+ let caller = toString(addressFromPublicKey(invoke.callerPublicKey))
248+ let id = toBase58String(invoke.transactionId)
249+ let currentStatus = getStringByKey(keyUserStatus(address))
250+ if (containsElement((owners :+ toString(this)), caller))
251+ then [DeleteEntry(keyUserDate(address)), DeleteEntry(keyUserAddr(address)), DeleteEntry(keyUserName(address)), DeleteEntry(keyUserDesc(address)), DeleteEntry(keyUserSocial(address)), DeleteEntry(keyUserThumb(address)), DeleteEntry(((currentStatus + "_") + address)), StringEntry(keyUserStatus(address), userRemoved)]
252+ else throw("Not allowed")
734253 }
735254
736255

github/deemru/w8io/169f3d6 
90.31 ms