tx · 9SbjChvPUCB6HgqX5RQSif41osVnR6C5T7DCk1KH9wyF

3MrWNTqFcHBqb58Za1A5crQrMV5KJ5DYhtA:  -0.01000000 Waves

2021.08.15 15:28 [1659467] smart account 3MrWNTqFcHBqb58Za1A5crQrMV5KJ5DYhtA > SELF 0.00000000 Waves

{ "type": 13, "id": "9SbjChvPUCB6HgqX5RQSif41osVnR6C5T7DCk1KH9wyF", "fee": 1000000, "feeAssetId": null, "timestamp": 1629030496494, "version": 2, "chainId": 84, "sender": "3MrWNTqFcHBqb58Za1A5crQrMV5KJ5DYhtA", "senderPublicKey": "9abKuN1XmLjjire2feZH26PmcEWhEXxiHToWSmii3Gn2", "proofs": [ "2KpVdBjGCPcGhsnMJMEk1m1126JGsLzK3aobFCGWoGBfPexiC2AdWMndHwJ5992T4YrdBwixB6bqoPLXbpoAozyQ" ], "script": "base64:AAIFAAAAAAAAC1oIAhIICgYICAgICAgSCQoHCAEBCAgBARIECgIICBIDCgEIEgQKAggIEgYKBAgICAgSBQoDCAgIGg4KAmExEgh1bml0VGVzdBoPCgJhMhIJb3JhY2xlRmVlGhEKAmEzEgtmZWVSZWNlaXZlchoOCgJhNBIIdXNlckRhcHAaEwoCYTUSDXdoaXRlbGlzdERhcHAaEwoCYTYSDXNjb25leEFzc2V0SWQaCwoCYTcSBW93bmVyGhgKAmE4EhJzY29uZXhGaXJzdFNlbGxDdXQaEQoCYTkSC2RhcHBSdW5uaW5nGhQKAmIxEg5tYWludGVuYW5jZU1TRxoTCgJiMhINdXNlclN1c3BlbmRlZBoRCgJiMxILdXNlclJlbW92ZWQaFgoCYjQSEHVzZXJVbnJlZ2lzdGVyZWQaEQoCYjUSC3VzZXJBbGxvd2VkGhIKAmI2EgxhdWN0aW9uVHlwZTEaEgoCYjcSDGF1Y3Rpb25UeXBlMhoUCgJiOBIOZ2V0U3RyaW5nQnlLZXkaCQoCYjkSA2tleRofCgJjMRIZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZRoVCgJjMhIPZ2V0SW50ZWdlckJ5S2V5GhQKAmMzEg5jaGVja1doaXRlbGlzdBoVCgJjNBIPZ2V0Qm9vbGVhbkJ5S2V5GhMKAmM1Eg1rZXlVc2VyU3RhdHVzGgwKAmM2EgZjYWxsZXIaDQoCYzcSB2tleURhdGUaCwoCYzgSBWFydElkGg0KAmM5EgdrZXlOYW1lGg0KAmQxEgdrZXlEZXNjGhMKAmQyEg1rZXlEaXNwbGF5Q2lkGhAKAmQzEgprZXlNYXhNaW50GhEKAmQ0EgtrZXlNaW5QcmljZRoTCgJkNRINa2V5SGlnaGVzdEJpZBoRCgJkNhILa2V5RHVyYXRpb24aFAoCZDcSDmtleUF1Y3Rpb25UeXBlGg8KAmQ4EglrZXlJc3N1ZWQaEgoCZDkSDEtleU5mdElzc3VlchoLCgJlMRIFbmZ0SWQaDwoCZTISCWtleU9uU2FsZRoNCgJlMxIHa2V5VGFncxoNCgJlNBIHa2V5VHlwZRoOCgJlNRIIa2V5UHJpY2UaGAoCZTYSEmtleUFzc2V0SWRBY2NlcHRlZBoXCgJlNxIRa2V5SGFzaEJ5VHhpZEFkZHIaCgoCZTgSBHR4aWQaFAoCZTkSDmtleU93bmVyQnlIYXNoGhAKAmYxEgpzaGEyNTZIYXNoGhgKAmYyEhJrZXlUeGlkQnlIYXNoT3duZXIaHwoCZjMSGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UaFAoCZjQSDnZhbGlkYXRlU3RyaW5nGgkKAmY1EgNzdHIaCQoCZjYSA21heBoSCgJmNxIMdmFsaWRhdGVVc2VyGhAKAmY4Egp1c2VyU3RhdHVzGhkKAmY5EhN2YWxpZGF0ZUFydHdvcmtEYXRhGhAKAmcxEgpjaWREaXNwbGF5GgoKAmcyEgRuYW1lGhEKAmczEgtkZXNjcmlwdGlvbhoKCgJnNBIEdGFncxoPCgJnNRIJY2hlY2tVc2VyGg8KAmc2Eglpc1BheW1lbnQaBwoCZzcSAWkaDQoCZzgSB3BheW1lbnQaDAoCZzkSBmFtb3VudBoVCgJoMRIPdmFsaWRhdGVQYXltZW50GhAKAmgyEgp0MDg5ODI5MDE4Gg0KAmgzEgdhc3NldElkGhoKAmg0EhR2YWxpZGF0ZVByaWNlQXNzZXRJZBoSCgJoNRIMcHJpY2VBc3NldElkGhIKAmg2EgxhcnR3b3JrUHJpY2UaEAoCaDcSCnQwOTYxMTk2NDcaFgoCaDgSEGFjY2VwdGVkQXNzZXRJZHMaFQoCaDkSD3ZhbGlkYXRlTWluU2VsbBoLCgJpMRIFcHJpY2UaEwoCaTISDW1pblNlbGxTY29uZXgaEwoCaTMSDWdldEJpZEFzc2V0SWQaHAoCaTQSFmdldFByaWNlQXNzZXRJZEZyb21CaWQaEAoCaTUSCmJpZERhdGFLZXkaDQoCaTYSB2JpZERhdGEaEAoCaTcSCmJpZERhdGFBcnIaDwoCaTgSCWJpZEFtb3VudBoQCgJpORIKYmlkQXNzZXRJZBoSCgJqMRIMaWRDYWxsZXJEYXRlGhAKAmoyEgppc0JpZENoZWNrGgwKAmozEgZpc3N1ZXIaDgoCajQSCGJpZE93bmVyGgsKAmo1EgViaWRJZBoQCgJqNhIKZ2V0QXJ0RGF0YRoLCgJqNxIFaXNCaWQaFAoCajgSDmNhbGxlcklzSXNzdWVyGg4KAmo5Egh0b3RhbE5GVBoRCgJrMRILYXJ0d29ya05hbWUaDgoCazISCGlzT25TYWxlGhAKAmszEgphbW91bnRTb2xkGhAKAms0EgptYXhDYW5TZWxsGhAKAms1EgpnZXRCaWREYXRhGhIKAms2Egx0MDEzNTE5MTM2NDgaFwoCazcSEWdldENvbW1pc3Npb25EYXRhGhMKAms4Eg1pc1doaXRlbGlzdGVkGgkKAms5EgNjdXQaFQoCbDESD2Ftb3VudEZvclNjb25leBoWCgJsMhIQYW1vdW50Rm9yQ3JlYXRvchoTCgJsMxINbmV3QW1vdW50U29sZBoSCgJsNBIMZ2V0SXNzdWVEYXRhGg8KAmw1Eglpc3N1ZU1ldGEaDgoCbDYSCGlzc3VlTkZUGgsKAmw3EgVpZE5GVBoQCgJsOBIKc2VsbFN0YXR1cxoQCgJsORIKcmVjZWl2ZU5GVBoSCgJtMRIMZ2V0QmlkS2V5VmFsGgoKAm0yEgRkYXRlGhAKAm0zEgphc3NldElkQmlkGg8KAm00EgliaWREZWxPbGQaDwoCbTUSCWJpZFVwZGF0ZRoNCgJtNhIHYnV5TWludBoSCgJtNxIMdDAxNTUxNjE1NTY2GggKAm04EgJpZBoSCgJtORIMdDAxNTY0NjE1Nzk3GhIKAm4xEgx0MDE1ODAyMTU5NDgaEgoCbjISDHQwMTU5NTMxNjA5NRoSCgJuMxIMdDAxNjEwMDE2MjkwGhIKAm40Egx0MDE2Mjk1MTYzOTQaDQoCbjUSB3NvbGRLZXkaDwoCbjYSCXNvbGRWYWx1ZRoOCgJuNxIIc29sZERhdGEaDAoCbjgSBmJ1eVJlcxoaCgJuORIUc2V0QmlkTm9uVHJhZGl0aW9uYWwaEgoCbzESDHQwMjc3MDkyNzc0NxoSCgJvMhIMdDAyNzc1MjI3Nzg4GgwKAm8zEgZiaWROYnIaFwoCbzQSEXNldEJpZFRyYWRpdGlvbmFsGg8KAm81EgllbmRIZWlnaHQaEAoCbzYSCmhpZ2hlc3RCaWQaEQoCbzcSC2NhbGxkZXJEYXRhGhIKAm84Egxpc1BheW1lbnRWYXIaHQoCbzkSF2FjY2VwdEJpZE5vblRyYWRpdGlvbmFsGhoKAnAxEhRhY2NlcHRCaWRUcmFkaXRpb25hbBoTCgJwMhINY2FuY2VsQmlkSW1wbBoSCgJwMxIMdDAyODk0MjI5MDk0Gg8KAnA0EgliaWRTdGF0dXMaHgoCcDUSGGNhbmNlbEJpZEltcGxU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", "height": 1659467, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: EC1fhSk3mUDbMgxXWXeuW7CQk6xJcGb2iEtzxaRVaA85 Next: 67r4NxeJgDL3UoZjHcPMo7QdKr1LhuKzWGSpLR7pDUZS Diff:
OldNewDifferences
510510 let bidAmount = parseIntValue(bidDataArr[1])
511511 let highestBid = getIntegerByKey(keyHighestBid(artId))
512512 if ((bidAmount != highestBid))
513- then throw(("You can't cancel the highest bid! " + toString(bidAmount)))
514- else [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(caller)), bidAmount, assetId)]
513+ then throw(((toString(bidAmount) + " blabla ") + toString(highestBid)))
514+ else throw(((toString(bidAmount) + " blabla ") + toString(highestBid)))
515515 }
516516 }
517517
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let unitTest = false
55
66 let oracleFee = value(addressFromString("3MpZQjzGogmifcEKe8mDd6ribL7nxT9ACye"))
77
88 let feeReceiver = "3N65xLq8JcCeaEiR1TJQ7dBqXBvEy6E48Wz"
99
1010 let userDapp = value(addressFromString("3N9cQgZFPHHVu8wqsn2DkQFehg3h8CNiooA"))
1111
1212 let whitelistDapp = value(addressFromString("3N9xZYGpzMFDXvXuctmU6zV8qSzm2ZfF31f"))
1313
1414 let sconexAssetId = base58'DZ8ALmuLeSZ2ocsYLAcL9MiXBFDbMNQG9LtitREyU5ZC'
1515
1616 let owner = "3N1Dhq5ZZyoojQisuTLusYjnGisqrxDwGLy"
1717
1818 let sconexFirstSellCut = 150
1919
2020 let dappRunning = valueOrElse(getBoolean(userDapp, "conf_dapp_is_running"), true)
2121
2222 let maintenanceMSG = valueOrElse(getString(userDapp, "conf_maintenance_msg"), "")
2323
2424 let userSuspended = "SUSPENDED"
2525
2626 let userRemoved = "REMOVED"
2727
2828 let userUnregistered = "UNREGISTERED"
2929
3030 let userAllowed = "ALLOWED"
3131
3232 let auctionType1 = "BIDTYPE"
3333
3434 let auctionType2 = "TRADITIONAL"
3535
3636 func getStringByKey (key) = valueOrElse(getString(this, key), "")
3737
3838
3939 func getIntegerByKeyFromOracle (key) = valueOrErrorMessage(getInteger(oracleFee, key), "Integer undefine or 0 in oracle")
4040
4141
4242 func getIntegerByKey (key) = valueOrElse(getInteger(this, key), 0)
4343
4444
4545 func checkWhitelist (key) = valueOrElse(getInteger(whitelistDapp, key), 0)
4646
4747
4848 func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
4949
5050
5151 func keyUserStatus (caller) = ("user_status_" + caller)
5252
5353
5454 func keyDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
5555
5656
5757 func keyName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
5858
5959
6060 func keyDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
6161
6262
6363 func keyDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
6464
6565
6666 func keyMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
6767
6868
6969 func keyMinPrice (caller,artId) = ((("art_minprice_" + artId) + "_") + caller)
7070
7171
7272 func keyHighestBid (artId) = ("art_highestBid_" + artId)
7373
7474
7575 func keyDuration (caller,artId) = ((("art_duration_" + artId) + "_") + caller)
7676
7777
7878 func keyAuctionType (caller,artId) = ((("art_auctiontype_" + artId) + "_") + caller)
7979
8080
8181 func keyIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
8282
8383
8484 func KeyNftIssuer (nftId) = ("nft_issued_" + nftId)
8585
8686
8787 func keyOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
8888
8989
9090 func keyTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
9191
9292
9393 func keyType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
9494
9595
9696 func keyPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
9797
9898
9999 func keyAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
100100
101101
102102 func keyHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
103103
104104
105105 func keyOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
106106
107107
108108 func keyTxidByHashOwner (sha256Hash,caller) = ("get_txid_by_hash_owner_" + toBase58String(sha256_16Kb(toBytes((sha256Hash + caller)))))
109109
110110
111111 let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(sconexAssetId)))
112112
113113 func validateString (str,max) = if ((size(str) == 0))
114114 then throw("Field cannot be is empty")
115115 else if ((size(str) > max))
116116 then throw((str + " is too long"))
117117 else true
118118
119119
120120 func validateUser (caller) = {
121121 let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
122122 if (if ((userStatus == userUnregistered))
123123 then true
124124 else (userStatus == userAllowed))
125125 then "Register this account first with 'Account' tab"
126126 else if ((userStatus == userSuspended))
127127 then "Account suspended"
128128 else if ((userStatus == userRemoved))
129129 then "Account removed"
130130 else ""
131131 }
132132
133133
134134 func validateArtworkData (caller,cidDisplay,name,description,tags) = {
135135 let checkUser = validateUser(caller)
136136 if ((checkUser != ""))
137137 then throw(checkUser)
138138 else if ((size(cidDisplay) == 0))
139139 then throw("Display CID cannot be empty")
140140 else if (!(validateString(name, 100)))
141141 then throw("100 Char. max name")
142142 else if (!(validateString(description, 1000)))
143143 then throw("1000 Char. max description")
144144 else if ((size(split(tags, ",")) > 5))
145145 then throw("5 tags max.")
146146 else ""
147147 }
148148
149149
150150 func isPayment (i) = if ((size(i.payments) == 0))
151151 then throw("No payment attached")
152152 else {
153153 let payment = value(i.payments[0])
154154 let amount = value(payment.amount)
155155 $Tuple2(payment, amount)
156156 }
157157
158158
159159 func validatePayment (i) = {
160160 let t089829018 = isPayment(i)
161161 let payment = t089829018._1
162162 let amount = t089829018._2
163163 let assetId = if (if (isDefined(payment.assetId))
164164 then (payment.assetId == sconexAssetId)
165165 else false)
166166 then payment.assetId
167167 else throw("Only Sconex token accepted as transaction fee")
168168 if ((amount != currentCertificationPrice))
169169 then throw(("Payment amount should be " + toString(currentCertificationPrice)))
170170 else $Tuple2(amount, assetId)
171171 }
172172
173173
174174 func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
175175 let t096119647 = isPayment(i)
176176 let payment = t096119647._1
177177 let amount = t096119647._2
178178 let assetId = if (!(isDefined(payment.assetId)))
179179 then throw("Wrong asset id")
180180 else if (if ((size(priceAssetId) > 0))
181181 then (toBase58String(value(payment.assetId)) == priceAssetId)
182182 else false)
183183 then payment.assetId
184184 else throw("Wrong asset id")
185185 if (if ((assetId == unit))
186186 then (priceAssetId != "")
187187 else false)
188188 then throw("Wrong asset id")
189189 else if ((artworkPrice != amount))
190190 then throw("Payment don't match")
191191 else $Tuple2(amount, assetId)
192192 }
193193
194194
195195 func acceptedAssetIds (assetId) = if ((assetId != toBase58String(sconexAssetId)))
196196 then throw("Only Sconex accepted")
197197 else true
198198
199199
200200 func validateMinSell (assetId,price) = {
201201 let minSellSconex = if (unitTest)
202202 then 1
203203 else (currentCertificationPrice * 2)
204204 if (if (if ((assetId == toBase58String(sconexAssetId)))
205205 then (minSellSconex > price)
206206 else false)
207207 then (price != 0)
208208 else false)
209209 then throw(("Wrong minimum sell price " + toString(minSellSconex)))
210210 else true
211211 }
212212
213213
214214 func getBidAssetId (assetId) = if ((assetId == "WAVES"))
215215 then throw("Only sconex is accepted!")
216216 else fromBase58String(assetId)
217217
218218
219219 func getPriceAssetIdFromBid (bidDataKey) = {
220220 let bidData = getStringByKey((bidDataKey + "_OPEN"))
221221 if ((bidData == ""))
222222 then throw("Bid not found")
223223 else {
224224 let bidDataArr = split(bidData, "_")
225225 let bidAmount = parseIntValue(bidDataArr[1])
226226 let bidAssetId = getBidAssetId(bidDataArr[0])
227227 if ((0 >= bidAmount))
228228 then throw("Wrong amount")
229229 else $Tuple2(bidAmount, bidAssetId)
230230 }
231231 }
232232
233233
234234 func idCallerDate (i) = if (!(dappRunning))
235235 then throw(maintenanceMSG)
236236 else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
237237
238238
239239 func isBidCheck (i,issuer,bidOwner,bidId) = if (if (if ((toBase58String(i.caller.bytes) == issuer))
240240 then (bidOwner != "")
241241 else false)
242242 then (bidId != "")
243243 else false)
244244 then true
245245 else false
246246
247247
248248 func getArtData (i,issuer,artId,isBid) = {
249249 let callerIsIssuer = (toBase58String(i.caller.bytes) == issuer)
250250 let totalNFT = getIntegerByKey("total_nft_issued")
251251 let artworkName = getStringByKey(keyName(issuer, artId))
252252 if ((artworkName == ""))
253253 then throw("Art doesn't exist")
254254 else {
255255 let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
256256 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
257257 let artworkPrice = if (callerIsIssuer)
258258 then (currentCertificationPrice * 2)
259259 else getIntegerByKey(keyPrice(issuer, artId))
260260 let priceAssetId = if (callerIsIssuer)
261261 then toBase58String(sconexAssetId)
262262 else getStringByKey(keyAssetIdAccepted(issuer, artId))
263263 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
264264 if (if (if (!(isBid))
265265 then !(callerIsIssuer)
266266 else false)
267267 then if (if ((0 >= artworkPrice))
268268 then true
269269 else !(isOnSale))
270270 then true
271271 else (0 >= maxCanSell)
272272 else false)
273273 then throw("Art not for sale")
274274 else if (if (if (!(isBid))
275275 then callerIsIssuer
276276 else false)
277277 then (0 >= maxCanSell)
278278 else false)
279279 then throw("Max issuable not set")
280280 else $Tuple7(totalNFT, artworkName, amountSold, artworkPrice, priceAssetId, maxCanSell, isOnSale)
281281 }
282282 }
283283
284284
285285 func getBidData (i,caller,issuer,artId,bidOwner,bidId,priceAssetId,artworkPrice,isBid) = {
286286 let checkUser = validateUser(issuer)
287287 if (if (isBid)
288288 then (checkUser != "")
289289 else false)
290290 then throw(checkUser)
291291 else {
292292 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
293293 let t01351913648 = if (isBid)
294294 then getPriceAssetIdFromBid(bidDataKey)
295295 else validatePriceAssetId(i, priceAssetId, artworkPrice)
296296 let amount = t01351913648._1
297297 let assetId = t01351913648._2
298298 $Tuple3(bidDataKey, amount, assetId)
299299 }
300300 }
301301
302302
303303 func getCommissionData (issuer,assetId,amount,amountSold,maxCanSell) = {
304304 let isWhitelisted = checkWhitelist(issuer)
305305 let cut = if ((isWhitelisted > height))
306306 then 0
307307 else if ((assetId == sconexAssetId))
308308 then sconexFirstSellCut
309309 else throw("Only Sconex is accepted!")
310310 let amountForSconex = fraction(amount, cut, 1000)
311311 let amountForCreator = (amount - amountForSconex)
312312 if ((amountSold == maxCanSell))
313313 then throw("Art sold out")
314314 else {
315315 let newAmountSold = (amountSold + 1)
316316 $Tuple3(amountForSconex, amountForCreator, newAmountSold)
317317 }
318318 }
319319
320320
321321 func getIssueData (issuer,artId,artworkName,newAmountSold,maxCanSell,totalNFT,caller,bidOwner,bidId,i,isOnSale) = {
322322 let issueMeta = ((((((((("Creator: " + issuer) + ",ArtID: ") + artId) + ",Artwork name: ") + artworkName) + ",Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
323323 let issueNFT = Issue(("SCONEX_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
324324 let idNFT = calculateAssetId(issueNFT)
325325 let sellStatus = if (if ((newAmountSold == maxCanSell))
326326 then true
327327 else !(isOnSale))
328328 then false
329329 else true
330330 let receiveNFT = if (if (if ((caller == issuer))
331331 then (bidOwner != "")
332332 else false)
333333 then (bidId != "")
334334 else false)
335335 then addressFromStringValue(bidOwner)
336336 else i.caller
337337 $Tuple4(issueNFT, idNFT, sellStatus, receiveNFT)
338338 }
339339
340340
341341 func getBidKeyVal (assetId,bidDataKey,date) = {
342342 let assetIdBid = if (!(isDefined(assetId)))
343343 then throw("Only sconex is accepted")
344344 else toBase58String(value(assetId))
345345 let bidData = getStringByKey((bidDataKey + "_OPEN"))
346346 let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
347347 let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
348348 $Tuple3(assetIdBid, bidDelOld, bidUpdate)
349349 }
350350
351351
352352 func buyMint (i,artId,issuer,bidId,bidOwner) = {
353353 let t01551615566 = idCallerDate(i)
354354 let id = t01551615566._1
355355 let caller = t01551615566._2
356356 let date = t01551615566._3
357357 let isBid = isBidCheck(i, issuer, bidOwner, bidId)
358358 let t01564615797 = getArtData(i, issuer, artId, isBid)
359359 let totalNFT = t01564615797._1
360360 let artworkName = t01564615797._2
361361 let amountSold = t01564615797._3
362362 let artworkPrice = t01564615797._4
363363 let priceAssetId = t01564615797._5
364364 let maxCanSell = t01564615797._6
365365 let isOnSale = t01564615797._7
366366 let t01580215948 = getBidData(i, caller, issuer, artId, bidOwner, bidId, priceAssetId, artworkPrice, isBid)
367367 let bidDataKey = t01580215948._1
368368 let amount = t01580215948._2
369369 let assetId = t01580215948._3
370370 let t01595316095 = getCommissionData(issuer, value(assetId), amount, amountSold, maxCanSell)
371371 let amountForSconex = t01595316095._1
372372 let amountForCreator = t01595316095._2
373373 let newAmountSold = t01595316095._3
374374 let t01610016290 = getIssueData(issuer, artId, artworkName, newAmountSold, maxCanSell, totalNFT, caller, bidOwner, bidId, i, isOnSale)
375375 let issueNFT = t01610016290._1
376376 let idNFT = t01610016290._2
377377 let sellStatus = t01610016290._3
378378 let receiveNFT = t01610016290._4
379379 let t01629516394 = getBidKeyVal(assetId, bidDataKey, date)
380380 let assetIdBid = t01629516394._1
381381 let bidDelOld = t01629516394._2
382382 let bidUpdate = t01629516394._3
383383 let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
384384 let soldValue = if (!(isBid))
385385 then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
386386 else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
387387 let soldData = StringEntry(soldKey, soldValue)
388388 let buyRes = [IntegerEntry(keyIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + toBase58String(idNFT)), soldKey), IntegerEntry("total_nft_issued", (totalNFT + 1)), BooleanEntry(keyOnSale(issuer, artId), sellStatus), issueNFT, ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId), ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSconex, assetId), ScriptTransfer(receiveNFT, 1, idNFT), StringEntry(KeyNftIssuer(toBase58String(idNFT)), issuer)]
389389 if (isBid)
390390 then (((buyRes :+ soldData) :+ bidUpdate) :+ bidDelOld)
391391 else soldData :: buyRes
392392 }
393393
394394
395395 func setBidNonTraditional (i,artId,issuer) = {
396396 let t02770927747 = idCallerDate(i)
397397 let id = t02770927747._1
398398 let caller = t02770927747._2
399399 let date = t02770927747._3
400400 let t02775227788 = isPayment(i)
401401 let payment = t02775227788._1
402402 let amount = t02775227788._2
403403 let assetId = if (!(isDefined(payment.assetId)))
404404 then throw("Only sconex is accepted!")
405405 else toBase58String(value(payment.assetId))
406406 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
407407 if (!(acceptedAssetIds(assetId)))
408408 then throw("asset not accepted")
409409 else if (!(validateMinSell(assetId, amount)))
410410 then throw("Wrong min sell")
411411 else {
412412 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
413413 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
414414 if ((0 >= maxCanSell))
415415 then throw("No max edition set for this artwork")
416416 else if ((amountSold >= maxCanSell))
417417 then throw("Sold out, you cannot bid")
418418 else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1))]
419419 }
420420 }
421421
422422
423423 func setBidTraditional (i,artId,issuer) = {
424424 let endHeight = getIntegerByKey(keyDuration(issuer, artId))
425425 let highestBid = getIntegerByKey(keyHighestBid(artId))
426426 if ((height > endHeight))
427427 then throw("This auction is finished already!")
428428 else {
429429 let callderData = idCallerDate(i)
430430 let id = callderData._1
431431 let caller = callderData._2
432432 let date = callderData._3
433433 let isPaymentVar = isPayment(i)
434434 let payment = isPaymentVar._1
435435 let amount = isPaymentVar._2
436436 if ((highestBid >= amount))
437437 then throw(("Please place a bid higher then: " + toString(highestBid)))
438438 else {
439439 let assetId = if (!(isDefined(payment.assetId)))
440440 then throw("Only sconex is accepted!")
441441 else toBase58String(value(payment.assetId))
442442 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
443443 if (!(acceptedAssetIds(assetId)))
444444 then throw("asset not accepted")
445445 else if (!(validateMinSell(assetId, amount)))
446446 then throw("Wrong min sell")
447447 else {
448448 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
449449 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
450450 if ((0 >= maxCanSell))
451451 then throw("No max edition set for this artwork")
452452 else if ((amountSold >= maxCanSell))
453453 then throw("Sold out, you cannot bid")
454454 else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1)), IntegerEntry(keyHighestBid(artId), amount)]
455455 }
456456 }
457457 }
458458 }
459459
460460
461461 func acceptBidNonTraditional (i,artId,issuer,bidId,bidOwner) = {
462462 let caller = toBase58String(i.caller.bytes)
463463 if ((caller != issuer))
464464 then throw("You cannot do this action")
465465 else buyMint(i, artId, issuer, bidId, bidOwner)
466466 }
467467
468468
469469 func acceptBidTraditional (i,artId,issuer,bidId,bidOwner) = {
470470 let caller = toBase58String(i.caller.bytes)
471471 if ((caller != issuer))
472472 then throw("You cannot do this action")
473473 else buyMint(i, artId, issuer, bidId, bidOwner)
474474 }
475475
476476
477477 func cancelBidImpl (i,artId,issuer,bidId) = {
478478 let t02894229094 = idCallerDate(i)
479479 let id = t02894229094._1
480480 let caller = t02894229094._2
481481 let date = t02894229094._3
482482 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
483483 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + bidId)
484484 let bidData = getStringByKey((bidDataKey + "_OPEN"))
485485 if ((bidData == ""))
486486 then throw("Bid not found")
487487 else {
488488 let bidDataArr = split(bidData, "_")
489489 let assetId = getBidAssetId(bidDataArr[0])
490490 let bidStatus = "CANCELED"
491491 [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(caller)), parseIntValue(bidDataArr[1]), assetId)]
492492 }
493493 }
494494
495495
496496 func cancelBidImplTraditional (i,artId,issuer,bidId) = {
497497 let t02894229094 = idCallerDate(i)
498498 let id = t02894229094._1
499499 let caller = t02894229094._2
500500 let date = t02894229094._3
501501 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
502502 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + bidId)
503503 let bidData = getStringByKey((bidDataKey + "_OPEN"))
504504 if ((bidData == ""))
505505 then throw("Bid not found")
506506 else {
507507 let bidDataArr = split(bidData, "_")
508508 let assetId = getBidAssetId(bidDataArr[0])
509509 let bidStatus = "CANCELED"
510510 let bidAmount = parseIntValue(bidDataArr[1])
511511 let highestBid = getIntegerByKey(keyHighestBid(artId))
512512 if ((bidAmount != highestBid))
513- then throw(("You can't cancel the highest bid! " + toString(bidAmount)))
514- else [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(caller)), bidAmount, assetId)]
513+ then throw(((toString(bidAmount) + " blabla ") + toString(highestBid)))
514+ else throw(((toString(bidAmount) + " blabla ") + toString(highestBid)))
515515 }
516516 }
517517
518518
519519 @Callable(i)
520520 func addArtwork (sha256Hash,name,description,tags,type,cidDisplay) = {
521521 let t01774017781 = idCallerDate(i)
522522 let artId = t01774017781._1
523523 let caller = t01774017781._2
524524 let date = t01774017781._3
525525 let validateArtwork = validateArtworkData(caller, cidDisplay, name, description, tags)
526526 if ((validateArtwork != ""))
527527 then throw("Something went wrong!")
528528 else {
529529 let t01817018212 = validatePayment(i)
530530 let amount = t01817018212._1
531531 let assetId = t01817018212._2
532532 if (!(isDefined(amount)))
533533 then throw("Something went wrong")
534534 else {
535535 let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller))
536536 if ((entryExist != ""))
537537 then throw("You already added it")
538538 else {
539539 let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
540540 if ((hashExist != ""))
541541 then throw("Hash already registered")
542542 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), ScriptTransfer(Address(fromBase58String(feeReceiver)), amount, assetId)]
543543 }
544544 }
545545 }
546546 }
547547
548548
549549
550550 @Callable(i)
551551 func sellArtwork (artId,price,maxMint,assetId,auctionType,minBid,duration) = {
552552 let t02571425747 = idCallerDate(i)
553553 let id = t02571425747._1
554554 let caller = t02571425747._2
555555 let artworkName = getStringByKey(keyName(caller, artId))
556556 if (!(containsElement([auctionType1, auctionType2], auctionType)))
557557 then throw("We dont know this auction type")
558558 else if ((artworkName == ""))
559559 then throw("This art doesn't match your account")
560560 else {
561561 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
562562 if (!(acceptedAssetIds(assetId)))
563563 then throw("Something went wrong!")
564564 else if (!(validateMinSell(assetId, price)))
565565 then throw("Something went wrong!")
566566 else {
567567 let checkUser = validateUser(caller)
568568 if ((checkUser != ""))
569569 then throw(checkUser)
570570 else {
571571 let amountSold = getIntegerByKey(keyIssued(caller, artId))
572572 let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
573573 if ((maxMint > 10))
574574 then throw("10 editions max per artwork")
575575 else if (if ((amountSold != 0))
576576 then (amountSold == maxCanSell)
577577 else false)
578578 then throw("Max edition reached.")
579579 else if (if ((amountSold > 0))
580580 then (maxCanSell != maxMint)
581581 else false)
582582 then throw("Cannot change maximum issuable anymore")
583583 else if (if ((bidNbr > 0))
584584 then (maxCanSell != maxMint)
585585 else false)
586586 then throw("Cannot change maximum issuable with active orders")
587587 else {
588588 let sellStatus = if (if ((price > 0))
589589 then (maxMint > 0)
590590 else false)
591591 then true
592592 else false
593593 let endHeight = (duration + height)
594594 [BooleanEntry(keyOnSale(caller, artId), sellStatus), IntegerEntry(keyPrice(caller, artId), price), IntegerEntry(keyMaxMint(caller, artId), maxMint), IntegerEntry(keyMinPrice(caller, artId), minBid), IntegerEntry(keyDuration(caller, artId), endHeight), StringEntry(keyAssetIdAccepted(caller, artId), assetId), StringEntry(keyAuctionType(caller, artId), auctionType), IntegerEntry(keyHighestBid(artId), 0)]
595595 }
596596 }
597597 }
598598 }
599599 }
600600
601601
602602
603603 @Callable(i)
604604 func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "")
605605
606606
607607
608608 @Callable(i)
609609 func deleteEntry (entry) = {
610610 let caller = toString(addressFromPublicKey(i.callerPublicKey))
611611 if ((caller == owner))
612612 then [DeleteEntry(entry)]
613613 else throw("no")
614614 }
615615
616616
617617
618618 @Callable(i)
619619 func setBid (artId,issuer) = {
620620 let auctionType = getStringByKey(keyAuctionType(issuer, artId))
621621 if ((auctionType == auctionType1))
622622 then setBidNonTraditional(i, artId, issuer)
623623 else if ((auctionType == auctionType2))
624624 then setBidTraditional(i, artId, issuer)
625625 else throw((("Unknown auction type :" + auctionType) + ", please contact the admins"))
626626 }
627627
628628
629629
630630 @Callable(i)
631631 func acceptBid (artId,issuer,bidId,bidOwner) = {
632632 let auctionType = getStringByKey(keyAuctionType(issuer, artId))
633633 if ((auctionType == auctionType1))
634634 then acceptBidNonTraditional(i, artId, issuer, bidId, bidOwner)
635635 else if ((auctionType == auctionType2))
636636 then acceptBidTraditional(i, artId, issuer, bidId, bidOwner)
637637 else throw((("Unknown auction type :" + auctionType) + ", please contact the admins"))
638638 }
639639
640640
641641
642642 @Callable(i)
643643 func cancelBid (artId,issuer,bidId) = {
644644 let auctionType = getStringByKey(keyAuctionType(issuer, artId))
645645 if ((auctionType == auctionType1))
646646 then cancelBidImpl(i, artId, issuer, bidId)
647647 else cancelBidImplTraditional(i, artId, issuer, bidId)
648648 }
649649
650650

github/deemru/w8io/026f985 
83.87 ms