tx · AC1j841B1X44f7w9dWxYbqa9L2fCEaSVReSDARicWhBp

3N7ij1HPTo3bcBwiYfCsuCt5U7sCjQBzMeE:  -0.01400000 Waves

2022.02.15 07:06 [1924244] smart account 3N7ij1HPTo3bcBwiYfCsuCt5U7sCjQBzMeE > SELF 0.00000000 Waves

{ "type": 13, "id": "AC1j841B1X44f7w9dWxYbqa9L2fCEaSVReSDARicWhBp", "fee": 1400000, "feeAssetId": null, "timestamp": 1644898102292, "version": 2, "chainId": 84, "sender": "3N7ij1HPTo3bcBwiYfCsuCt5U7sCjQBzMeE", "senderPublicKey": "3ZxAuR7FsjxRSrwEhhuPgsGzjVHz92tTGdVNwHpeWuVm", "proofs": [ "FVuXFXzR1Vij3RL29koTuYL8GuyCoDrZoMjT6srhJZzizTfU48VFVL8G7qydo2amXA3f41PDoumZ5NvHegVfieD" ], "script": "base64:AAIFAAAAAAAAAFQIAhIOCgwICAgICAgICAgICAgSDQoLCAgICAgICAgICAgSBgoECAgICBIECgIICBIHCgUIAQEIARIECgIICBIECgIICBIGCgQICAgIEgYKBAgICAgAAABHAAAAAAh1bml0VGVzdAYAAAAACW9yYWNsZUZlZQkBAAAABXZhbHVlAAAAAQkABCYAAAABAgAAACMzTjJzNVJ0YUhQQmVuQ3N4MkVDY29GUmJZSHgzbm9aaFhXMQAAAAAIc2lnbkRhcHAJAQAAAAV2YWx1ZQAAAAEJAAQmAAAAAQIAAAAjM05DMjhoU2l2cm1zVFVYYVlEMXg2TDM2Mko0WnBVbm9UZEIAAAAAC2ZlZVJlY2VpdmVyAgAAACMzTjFFNnRYZGRSb1ZhUmZROWRRM3ZnNUxhVzJmc2Q4SEt1YgAAAAAIdXNlckRhcHADBQAAAAh1bml0VGVzdAkBAAAABXZhbHVlAAAAAQkABCYAAAABAgAAACMzTXQ0UkdNRXlqU1dZQW9jVFBxZDU1d2RIUVFCM1BVMlVDbQkBAAAABXZhbHVlAAAAAQkABCYAAAABAgAAACMzTjh4WGFZakUyN0FhNzlkNWhIcmhIdTlIYUZvVEJtaERFagAAAAANd2hpdGVsaXN0RGFwcAkBAAAABXZhbHVlAAAAAQkABCYAAAABAgAAACMzTjZCYVYxZENCNHpnNDNnb05OSGFDdHZSMTNCY3lKNUdzcQAAAAALc2lnbkFzc2V0SWQBAAAAIOilarzKd0LycGEyNUpPRYO5uR7lmWcXw3Hq2QuhBK3rAAAAAAt1c2RuQXNzZXRJZAEAAAAgD/IcEqzkxDya7EYaqyWosOy6BytGzG2IcvC14pJJAbQAAAAADHdhdmVzQXNzZXRJZAEAAAAAAAAAAAVjaHJpcwIAAAAjM01zRzZqUE5DclZKVXRZQjdYSkJ4Uzd1dFdzWEFmNG45VnAAAAAABGpvZXACAAAAIzNNem00Vkx3c045dVp3YlRNelBqM1h1eFY2a0VmQVI4VUROAAAAAAdzaWduQ3V0AAAAAAAAAAAHAAAAAAt1c2RuV2F2ZUN1dAAAAAAAAAAACgAAAAAOZGVmYXVsdExpY2VuY2UCAAAAR2JhZnliZWlmdXlvNHBxdTU0aXNtcWd0YjZlNGg2a2t2Z3g3emc0dTN6aWJoMnI3eTZtYjY0aTdienphL2xpY2VuY2UucGRmAAAAABJkZWZhdWx0SGFzaExpY2VuY2UCAAAAQGE4Nzc1OGMzNTRlMzBhOWU3OGZiODRmYTNhMDAxMGE1MDkwYWIyMGRmMGJlMTFhZDQ1YjU3MjBjYzE4N2U2MzkAAAAAC2RhcHBSdW5uaW5nCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGwAAAAIFAAAACHVzZXJEYXBwAgAAABRjb25mX2RhcHBfaXNfcnVubmluZwYAAAAADm1haW50ZW5hbmNlTVNHCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAACHVzZXJEYXBwAgAAABRjb25mX21haW50ZW5hbmNlX21zZwIAAAAAAAAAAA11c2VyU3VzcGVuZGVkAgAAAAlTVVNQRU5ERUQAAAAAC3VzZXJSZW1vdmVkAgAAAAdSRU1PVkVEAAAAABB1c2VyVW5yZWdpc3RlcmVkAgAAAAxVTlJFR0lTVEVSRUQAAAAAC3VzZXJBbGxvd2VkAgAAAAdBTExPV0VEAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEAAAADa2V5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAAA2tleQIAAAAAAQAAABlnZXRJbnRlZ2VyQnlLZXlGcm9tT3JhY2xlAAAAAQAAAANrZXkJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAlvcmFjbGVGZWUFAAAAA2tleQIAAAAfSW50ZWdlciB1bmRlZmluZSBvciAwIGluIG9yYWNsZQEAAAAPZ2V0SW50ZWdlckJ5S2V5AAAAAQAAAANrZXkJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAADa2V5AAAAAAAAAAAAAQAAAA5jaGVja1doaXRlbGlzdAAAAAEAAAADa2V5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAADXdoaXRlbGlzdERhcHAFAAAAA2tleQAAAAAAAAAAAAEAAAAPZ2V0Qm9vbGVhbkJ5S2V5AAAAAQAAAANrZXkJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQbAAAAAgUAAAAEdGhpcwUAAAADa2V5BwAAAAAZY3Vy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AAAAEGFtb3VudEZvckNyZWF0b3IFAAAAB2Fzc2V0SWQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAB0FkZHJlc3MAAAABCQACWQAAAAEFAAAAC2ZlZVJlY2VpdmVyBQAAAA1hbW91bnRGb3JTaWduBQAAAAdhc3NldElkCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAACnJlY2VpdmVORlQAAAAAAAAAAAEFAAAABWlkTkZUBQAAAANuaWwDBQAAAAVpc0JpZAkABEwAAAACBQAAAAhzb2xkRGF0YQkABEwAAAACBQAAAAliaWRVcGRhdGUJAARMAAAAAgUAAAAJYmlkRGVsT2xkBQAAAAZidXlSZXMJAARMAAAAAgUAAAAIc29sZERhdGEFAAAABmJ1eVJlcwAAAAkAAAABaQEAAAAKYWRkQXJ0d29yawAAAAwAAAAKc2hhMjU2SGFzaAAAAAZzaWduSUQAAAAEbmFtZQAAAAtkZXNjcmlwdGlvbgAAAAR0YWdzAAAABHR5cGUAAAAKY2lkRGlzcGxheQAAAAxzaGEyNTZFeHBvcnQAAAAJY2lkRXhwb3J0AAAADXNoYTI1NkxpY2VuY2UAAAAKY2lkTGljZW5jZQAAAAdjcmF3bGVyBAAAAA0kdDAxNjY3ODE2NzE5CQEAAAAMaWRDYWxsZXJEYXRlAAAAAQUAAAABaQQAAAAFYXJ0SWQIBQAAAA0kdDAxNjY3ODE2NzE5AAAAAl8xBAAAAAZjYWxsZXIIBQAAAA0kdDAxNjY3ODE2NzE5AAAAAl8yBAAAAARkYXRlCAUAAAANJHQwMTY2NzgxNjcxOQAAAAJfMwMJAQAAAAEhAAAAAQkBAAAADHZhbGlkYXRlSGFzaAAAAAEFAAAACnNoYTI1Nkhhc2gJAAACAAAAAQIAAAAkSGFzaCBzaG91bGQgYmUgNjQgY2hhcmFjdGVycyBtYXhpbXVtBAAAAA0kdDAxNjgyMDE2ODg5CQEAAAAKc2V0TEljZW5jZQAAAAIFAAAACmNpZExpY2VuY2UFAAAADXNoYTI1NkxpY2VuY2UEAAAACmxpY2VuY2VDSUQIBQAAAA0kdDAxNjgyMDE2ODg5AAAAAl8xBAAAAAtsaWNlbmNlSGFzaAgFAAAADSR0MDE2ODIwMTY4ODkAAAACXzIEAAAAD3ZhbGlkYXRlQXJ0d29yawkBAAAAE3ZhbGlkYXRlQXJ0d29ya0RhdGEAAAAJBQAAAAZjYWxsZXIFAAAACmNpZERpc3BsYXkFAAAACWNpZEV4cG9ydAUAAAAKbGljZW5jZUNJRAUAAAAMc2hhMjU2RXhwb3J0BQAAAAtsaWNlbmNlSGFzaAUAAAAEbmFtZQUAAAALZGVzY3JpcHRpb24FAAAABHRhZ3MDCQEAAAACIT0AAAACBQAAAA92YWxpZGF0ZUFydHdvcmsCAAAAAAkAAAIAAAABAgAAABVTb21ldGhpbmcgd2VudCB3cm9uZyEEAAAADSR0MDE3MTA4MTcxNTAJAQAAAA92YWxpZGF0ZVBheW1lbnQAAAABBQAAAAFpBAAAAAZhbW91bnQIBQAAAA0kdDAxNzEwODE3MTUwAAAAAl8xBAAAAAdhc3NldElkCAUAAAANJHQwMTcxMDgxNzE1MAAAAAJfMgMJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEFAAAABmFtb3VudAkAAAIAAAABAgAAABRTb21ldGhpbmcgd2VudCB3cm9uZwQAAAAKZW50cnlFeGlzdAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAEmtleVR4aWRCeUhhc2hPd25lcgAAAAIFAAAACnNoYTI1Nkhhc2gFAAAABmNhbGxlcgMJAQAAAAIhPQAAAAIFAAAACmVudHJ5RXhpc3QCAAAAAAkAAAIAAAABAgAAABRZb3UgYWxyZWFkeSBhZGRlZCBpdAQAAAAJaGFzaEV4aXN0CQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAAOa2V5T3duZXJCeUhhc2gAAAABBQAAAApzaGEyNTZIYXNoAwkBAAAAAiE9AAAAAgUAAAAJaGFzaEV4aXN0AgAAAAAJAAACAAAAAQIAAAAXSGFzaCBhbHJlYWR5IHJlZ2lzdGVyZWQEAAAAD2lzU2lnbkNlcnRpZmllZAkBAAAAFGNoZWNrU2lnbkNlcnRpZmljYXRlAAAAAwUAAAAGc2lnbklEBQAAAAZjYWxsZXIFAAAACnNoYTI1Nkhhc2gDCQEAAAABIQAAAAEFAAAAD2lzU2lnbkNlcnRpZmllZAkAAAIAAAABAgAAACxTaWduIENlcnRpZmljYXRlIG5vdCBmb3VuZCBmb3IgdGhpcyBhZGRyZXNzLgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAOa2V5T3duZXJCeUhhc2gAAAABBQAAAApzaGEyNTZIYXNoBQAAAAZjYWxsZXIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEmtleVR4aWRCeUhhc2hPd25lcgAAAAIFAAAACnNoYTI1Nkhhc2gFAAAABmNhbGxlcgUAAAAFYXJ0SWQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAAdrZXlEYXRlAAAAAgUAAAAGY2FsbGVyBQAAAAVhcnRJZAUAAAAEZGF0ZQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAHa2V5TmFtZQAAAAIFAAAABmNhbGxlcgUAAAAFYXJ0SWQFAAAABG5hbWUJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAB2tleURlc2MAAAACBQAAAAZjYWxsZXIFAAAABWFydElkBQAAAAtkZXNjcmlwdGlvbgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAANa2V5RGlzcGxheUNpZAAAAAIFAAAABmNhbGxlcgUAAAAFYXJ0SWQFAAAACmNpZERpc3BsYXkJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAADGtleUV4cG9ydENpZAAAAAIFAAAABmNhbGxlcgUAAAAFYXJ0SWQFAAAACWNpZEV4cG9ydAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAANa2V5RXhwb3J0SGFzaAAAAAIFAAAABmNhbGxlcgUAAAAFYXJ0SWQFAAAADHNoYTI1NkV4cG9ydAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAOa2V5TGljZW5jZUhhc2gAAAACBQAAAAZjYWxsZXIFAAAABWFydElkBQAAAAtsaWNlbmNlSGFzaAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAANa2V5TGljZW5jZUNpZAAAAAIFAAAABmNhbGxlcgUAAAAFYXJ0SWQFAAAACmxpY2VuY2VDSUQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAB2tleVR5cGUAAAACBQAAAAZjYWxsZXIFAAAABWFydElkBQAAAAR0eXBlCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAdrZXlUYWdzAAAAAgUAAAAGY2FsbGVyBQAAAAVhcnRJZAUAAAAEdGFncwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAACmtleU1heE1pbnQAAAACBQAAAAZjYWxsZXIFAAAABWFydElkAAAAAAAAAAAACQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAlrZXlTaWduSUQAAAACBQAAAAZjYWxsZXIFAAAABWFydElkBQAAAAZzaWduSUQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAAlrZXlJc3N1ZWQAAAACBQAAAAZjYWxsZXIFAAAABWFydElkAAAAAAAAAAAACQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACCQEAAAAJa2V5T25TYWxlAAAAAgUAAAAGY2FsbGVyBQAAAAVhcnRJZAcJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAADWtleWlkQnlTaWduaWQAAAACBQAAAAZjYWxsZXIFAAAABnNpZ25JRAUAAAAFYXJ0SWQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEWtleUhhc2hCeVR4aWRBZGRyAAAAAgUAAAAGY2FsbGVyBQAAAAVhcnRJZAUAAAAKc2hhMjU2SGFzaAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAKa2V5Q3Jhd2xlcgAAAAIFAAAABmNhbGxlcgUAAAAFYXJ0SWQFAAAAB2NyYXdsZXIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAB0FkZHJlc3MAAAABCQACWQAAAAEFAAAAC2ZlZVJlY2VpdmVyBQAAAAZhbW91bnQFAAAAB2Fzc2V0SWQFAAAAA25pbAAAAAFpAQAAAA11cGRhdGVBcnR3b3JrAAAACwAAAAR0eGlkAAAABG5hbWUAAAALZGVzY3JpcHRpb24AAAAEdGFncwAAAAR0eXBlAAAACmNpZERpc3BsYXkAAAAMc2hhMjU2RXhwb3J0AAAACWNpZEV4cG9ydAAAAA1zaGEyNTZMaWNlbmNlAAAACmNpZExpY2VuY2UAAAAHY3Jhd2xlcgMJAQAAAAEhAAAAAQUAAAALZGFwcFJ1bm5pbmcJAAACAAAAAQUAAAAObWFpbnRlbmFuY2VNU0cEAAAABmNhbGxlcgkAAlgAAAABCAgFAAAAAWkAAAAGY2FsbGVyAAAABWJ5dGVzBAAAAA0kdDAxOTg4MjE5OTUxCQEAAAAKc2V0TEljZW5jZQAAAAIFAAAACmNpZExpY2VuY2UFAAAADXNoYTI1NkxpY2VuY2UEAAAACmxpY2VuY2VDSUQIBQAAAA0kdDAxOTg4MjE5OTUxAAAAAl8xBAAAAAtsaWNlbmNlSGFzaAgFAAAADSR0MDE5ODgyMTk5NTEAAAACXzIEAAAAD3ZhbGlkYXRlQXJ0d29yawkBAAAAE3ZhbGlkYXRlQXJ0d29ya0RhdGEAAAAJBQAAAAZjYWxsZXIFAAAACmNpZERpc3BsYXkFAAAACWNpZEV4cG9ydAUAAAAKbGljZW5jZUNJRAUAAAAMc2hhMjU2RXhwb3J0BQAAAAtsaWNlbmNlSGFzaAUAAAAEbmFtZQUAAAALZGVzY3JpcHRpb24FAAAABHRhZ3MDCQEAAAACIT0AAAACBQAAAA92YWxpZGF0ZUFydHdvcmsCAAAAAAkAAAIAAAABAgAAABVTb21ldGhpbmcgd2VudCB3cm9uZyEEAAAACmVudHJ5RXhpc3QJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAAAdrZXlOYW1lAAAAAgUAAAAGY2FsbGVyBQAAAAR0eGlkAwkAAAAAAAACBQAAAAplbnRyeUV4aXN0AgAAAAAJAAACAAAAAQIAAAAPRW50cnkgbm90IGZvdW5kBAAAAARmbGFnCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAAHa2V5RmxhZwAAAAIFAAAABmNhbGxlcgUAAAAEdHhpZAMJAAAAAAAAAgUAAAAEZmxhZwIAAAAHSUxMRUdBTAkAAAIAAAABAgAAAB1DYW5ub3QgdXBkYXRlIElMTEVHQUwgYXJ0d29yawMJAQAAAAEhAAAAAQkBAAAAC2lzQXJ0TWludGVkAAAAAgUAAAAGY2FsbGVyBQAAAAR0eGlkCQAETAAAAAIJAQAAAAtTdHJp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", "height": 1924244, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: D61eXfqXWb6k71vZeuJioEKm6rKmgjEzZ2b3FuZQP9Fo Next: none Diff:
OldNewDifferences
1-{-# STDLIB_VERSION 4 #-}
1+{-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let unitTest = true
129129 func keyType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
130130
131131
132+func keyNote (caller,artId) = ((("art_note_" + artId) + "_") + caller)
133+
134+
135+func keyCrawler (caller,artId) = ((("art_crawler_cid_" + artId) + "_") + caller)
136+
137+
132138 func keyPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
139+
140+
141+func keyEndSale (caller,artId) = ((("art_endsale_" + artId) + "_") + caller)
133142
134143
135144 func keyAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
230239
231240
232241 func validatePayment (i) = {
233- let $t090289064 = isPayment(i)
234- let payment = $t090289064._1
235- let amount = $t090289064._2
242+ let $t091969232 = isPayment(i)
243+ let payment = $t091969232._1
244+ let amount = $t091969232._2
236245 let assetId = if (if (isDefined(payment.assetId))
237246 then (payment.assetId == signAssetId)
238247 else false)
255264
256265
257266 func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
258- let $t096579693 = isPayment(i)
259- let payment = $t096579693._1
260- let amount = $t096579693._2
267+ let $t098259861 = isPayment(i)
268+ let payment = $t098259861._1
269+ let amount = $t098259861._2
261270 let assetId = if (!(isDefined(payment.assetId)))
262271 then unit
263272 else if (if ((size(priceAssetId) > 0))
343352 else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
344353
345354
346-func isBidCheck (i,issuer,bidOwner,bidId) = if (if (if ((toBase58String(i.caller.bytes) == issuer))
347- then (bidOwner != "")
348- else false)
349- then (bidId != "")
350- else false)
351- then true
352- else false
353-
354-
355-func getArtData (i,issuer,artId,isBid) = {
356- let callerIsIssuer = (toBase58String(i.caller.bytes) == issuer)
357- let totalNFT = getIntegerByKey("total_nft_issued")
358- let signID = getStringByKey(keySignID(issuer, artId))
359- let artworkName = getStringByKey(keyName(issuer, artId))
360- if ((artworkName == ""))
361- then throw("Art doesn't exist")
355+func buyMint (i,artId,issuer,bidId,bidOwner) = {
356+ let $t01208612143 = idCallerDate(i)
357+ let id = $t01208612143._1
358+ let caller = $t01208612143._2
359+ let date = $t01208612143._3
360+ let isBid = if (if (if ((toBase58String(i.caller.bytes) == issuer))
361+ then (bidOwner != "")
362+ else false)
363+ then (bidId != "")
364+ else false)
365+ then true
366+ else false
367+ let blockEnd = getIntegerByKey(keyEndSale(caller, artId))
368+ if (if (if ((blockEnd != 0))
369+ then (height >= blockEnd)
370+ else false)
371+ then !(isBid)
372+ else false)
373+ then throw("Sale ended.")
362374 else {
363- let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
364- let amountSold = getIntegerByKey(keyIssued(issuer, artId))
365- let artworkPrice = if (callerIsIssuer)
366- then (currentCertificationPrice * 2)
367- else getIntegerByKey(keyPrice(issuer, artId))
368- let priceAssetId = if (callerIsIssuer)
369- then toBase58String(signAssetId)
370- else getStringByKey(keyAssetIdAccepted(issuer, artId))
371- let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
372- if (if (if (!(isBid))
373- then !(callerIsIssuer)
374- else false)
375- then if (if ((0 >= artworkPrice))
376- then true
377- else !(isOnSale))
378- then true
379- else (0 >= maxCanSell)
380- else false)
381- then throw("Art not for sale")
382- else if (if (if (!(isBid))
383- then callerIsIssuer
384- else false)
385- then (0 >= maxCanSell)
386- else false)
387- then throw("Max issuable not set")
388- else $Tuple8(totalNFT, signID, artworkName, amountSold, artworkPrice, priceAssetId, maxCanSell, isOnSale)
375+ let callerIsIssuer = (toBase58String(i.caller.bytes) == issuer)
376+ let totalNFT = getIntegerByKey("total_nft_issued")
377+ let signID = getStringByKey(keySignID(issuer, artId))
378+ let artworkName = getStringByKey(keyName(issuer, artId))
379+ if ((artworkName == ""))
380+ then throw("Art doesn't exist")
381+ else {
382+ let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
383+ let amountSold = getIntegerByKey(keyIssued(issuer, artId))
384+ let artworkPrice = if (callerIsIssuer)
385+ then (currentCertificationPrice * 2)
386+ else getIntegerByKey(keyPrice(issuer, artId))
387+ let priceAssetId = if (callerIsIssuer)
388+ then toBase58String(signAssetId)
389+ else getStringByKey(keyAssetIdAccepted(issuer, artId))
390+ let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
391+ if (if (if (!(isBid))
392+ then !(callerIsIssuer)
393+ else false)
394+ then if (if ((0 >= artworkPrice))
395+ then true
396+ else !(isOnSale))
397+ then true
398+ else (0 >= maxCanSell)
399+ else false)
400+ then throw("Art not for sale")
401+ else if (if (if (!(isBid))
402+ then callerIsIssuer
403+ else false)
404+ then (0 >= maxCanSell)
405+ else false)
406+ then throw("Max issuable not set")
407+ else {
408+ let checkUser = validateUser(issuer)
409+ if (if (isBid)
410+ then (checkUser != "")
411+ else false)
412+ then throw(checkUser)
413+ else {
414+ let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
415+ let $t01389414050 = if (isBid)
416+ then getPriceAssetIdFromBid(bidDataKey)
417+ else validatePriceAssetId(i, priceAssetId, artworkPrice)
418+ let amount = $t01389414050._1
419+ let assetId = $t01389414050._2
420+ let isWhitelisted = checkWhitelist(issuer)
421+ let cut = if ((isWhitelisted > height))
422+ then 0
423+ else if ((assetId == signAssetId))
424+ then signCut
425+ else usdnWaveCut
426+ let amountForSign = fraction(amount, cut, 100)
427+ let amountForCreator = (amount - amountForSign)
428+ if ((amountSold == maxCanSell))
429+ then throw("Art sold out")
430+ else {
431+ let newAmountSold = (amountSold + 1)
432+ let issueMeta = ((((((((((("Creator: " + issuer) + ",
433+ ArtID: ") + artId) + ",
434+ SignID: ") + signID) + ",
435+ Artwork name: ") + artworkName) + ",
436+ Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
437+ let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
438+ let idNFT = calculateAssetId(issueNFT)
439+ let sellStatus = if (if ((newAmountSold == maxCanSell))
440+ then true
441+ else !(isOnSale))
442+ then false
443+ else true
444+ let receiveNFT = if (if (if ((caller == issuer))
445+ then (bidOwner != "")
446+ else false)
447+ then (bidId != "")
448+ else false)
449+ then addressFromStringValue(bidOwner)
450+ else i.caller
451+ let assetIdBid = if (!(isDefined(assetId)))
452+ then "WAVES"
453+ else toBase58String(value(assetId))
454+ let bidData = getStringByKey((bidDataKey + "_OPEN"))
455+ let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
456+ let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
457+ let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
458+ let soldValue = if (!(isBid))
459+ then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
460+ else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
461+ let soldData = StringEntry(soldKey, soldValue)
462+ let buyRes = [IntegerEntry(keyIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + toBase58String(idNFT)), soldKey), IntegerEntry("total_nft_issued", (totalNFT + 1)), IntegerEntry(keyEndSale(issuer, artId), 0), BooleanEntry(keyOnSale(issuer, artId), sellStatus), issueNFT, ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId), ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId), ScriptTransfer(receiveNFT, 1, idNFT)]
463+ if (isBid)
464+ then [soldData, bidUpdate, bidDelOld] :: buyRes
465+ else soldData :: buyRes
466+ }
467+ }
468+ }
469+ }
389470 }
390471 }
391472
392473
393-func getBidData (i,caller,issuer,artId,bidOwner,bidId,priceAssetId,artworkPrice,isBid) = {
394- let checkUser = validateUser(issuer)
395- if (if (isBid)
396- then (checkUser != "")
397- else false)
398- then throw(checkUser)
399- else {
400- let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
401- let $t01356513694 = if (isBid)
402- then getPriceAssetIdFromBid(bidDataKey)
403- else validatePriceAssetId(i, priceAssetId, artworkPrice)
404- let amount = $t01356513694._1
405- let assetId = $t01356513694._2
406- $Tuple3(bidDataKey, amount, assetId)
407- }
408- }
409-
410-
411-func getCommissionData (issuer,assetId,amount,amountSold,maxCanSell) = {
412- let isWhitelisted = checkWhitelist(issuer)
413- let cut = if ((isWhitelisted > height))
414- then 0
415- else if ((assetId == signAssetId))
416- then signCut
417- else usdnWaveCut
418- let amountForSign = fraction(amount, cut, 100)
419- let amountForCreator = (amount - amountForSign)
420- if ((amountSold == maxCanSell))
421- then throw("Art sold out")
422- else {
423- let newAmountSold = (amountSold + 1)
424- $Tuple3(amountForSign, amountForCreator, newAmountSold)
425- }
426- }
427-
428-
429-func getIssueData (issuer,artId,signID,artworkName,newAmountSold,maxCanSell,totalNFT,caller,bidOwner,bidId,i,isOnSale) = {
430- let issueMeta = ((((((((((("Creator: " + issuer) + ",
431- ArtID: ") + artId) + ",
432- SignID: ") + signID) + ",
433- Artwork name: ") + artworkName) + ",
434- Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
435- let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
436- let idNFT = calculateAssetId(issueNFT)
437- let sellStatus = if (if ((newAmountSold == maxCanSell))
438- then true
439- else !(isOnSale))
440- then false
441- else true
442- let receiveNFT = if (if (if ((caller == issuer))
443- then (bidOwner != "")
444- else false)
445- then (bidId != "")
446- else false)
447- then addressFromStringValue(bidOwner)
448- else i.caller
449- $Tuple4(issueNFT, idNFT, sellStatus, receiveNFT)
450- }
451-
452-
453-func getBidKeyVal (assetId,bidDataKey,date) = {
454- let assetIdBid = if (!(isDefined(assetId)))
455- then "WAVES"
456- else toBase58String(value(assetId))
457- let bidData = getStringByKey((bidDataKey + "_OPEN"))
458- let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
459- let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
460- $Tuple3(assetIdBid, bidDelOld, bidUpdate)
461- }
462-
463-
464-func buyMint (i,artId,issuer,bidId,bidOwner) = {
465- let $t01556215612 = idCallerDate(i)
466- let id = $t01556215612._1
467- let caller = $t01556215612._2
468- let date = $t01556215612._3
469- let isBid = isBidCheck(i, issuer, bidOwner, bidId)
470- let $t01569215843 = getArtData(i, issuer, artId, isBid)
471- let totalNFT = $t01569215843._1
472- let signID = $t01569215843._2
473- let artworkName = $t01569215843._3
474- let amountSold = $t01569215843._4
475- let artworkPrice = $t01569215843._5
476- let priceAssetId = $t01569215843._6
477- let maxCanSell = $t01569215843._7
478- let isOnSale = $t01569215843._8
479- let $t01584815994 = getBidData(i, caller, issuer, artId, bidOwner, bidId, priceAssetId, artworkPrice, isBid)
480- let bidDataKey = $t01584815994._1
481- let amount = $t01584815994._2
482- let assetId = $t01584815994._3
483- let $t01599916141 = getCommissionData(issuer, assetId, amount, amountSold, maxCanSell)
484- let amountForSign = $t01599916141._1
485- let amountForCreator = $t01599916141._2
486- let newAmountSold = $t01599916141._3
487- let $t01614616336 = getIssueData(issuer, artId, signID, artworkName, newAmountSold, maxCanSell, totalNFT, caller, bidOwner, bidId, i, isOnSale)
488- let issueNFT = $t01614616336._1
489- let idNFT = $t01614616336._2
490- let sellStatus = $t01614616336._3
491- let receiveNFT = $t01614616336._4
492- let $t01634116440 = getBidKeyVal(assetId, bidDataKey, date)
493- let assetIdBid = $t01634116440._1
494- let bidDelOld = $t01634116440._2
495- let bidUpdate = $t01634116440._3
496- let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
497- let soldValue = if (!(isBid))
498- then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
499- else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
500- let soldData = StringEntry(soldKey, soldValue)
501- 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)), amountForSign, assetId), ScriptTransfer(receiveNFT, 1, idNFT)]
502- if (isBid)
503- then [soldData, bidUpdate, bidDelOld] :: buyRes
504- else soldData :: buyRes
505- }
506-
507-
508474 @Callable(i)
509-func addArtwork (sha256Hash,signID,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = {
510- let $t01778617827 = idCallerDate(i)
511- let artId = $t01778617827._1
512- let caller = $t01778617827._2
513- let date = $t01778617827._3
475+func addArtwork (sha256Hash,signID,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler) = {
476+ let $t01667816719 = idCallerDate(i)
477+ let artId = $t01667816719._1
478+ let caller = $t01667816719._2
479+ let date = $t01667816719._3
514480 if (!(validateHash(sha256Hash)))
515481 then throw("Hash should be 64 characters maximum")
516482 else {
517- let $t01792817997 = setLIcence(cidLicence, sha256Licence)
518- let licenceCID = $t01792817997._1
519- let licenceHash = $t01792817997._2
483+ let $t01682016889 = setLIcence(cidLicence, sha256Licence)
484+ let licenceCID = $t01682016889._1
485+ let licenceHash = $t01682016889._2
520486 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags)
521487 if ((validateArtwork != ""))
522488 then throw("Something went wrong!")
523489 else {
524- let $t01821618258 = validatePayment(i)
525- let amount = $t01821618258._1
526- let assetId = $t01821618258._2
490+ let $t01710817150 = validatePayment(i)
491+ let amount = $t01710817150._1
492+ let assetId = $t01710817150._2
527493 if (!(isDefined(amount)))
528494 then throw("Something went wrong")
529495 else {
538504 let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
539505 if (!(isSignCertified))
540506 then throw("Sign Certificate not found for this address.")
541- 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(keyExportCid(caller, artId), cidExport), StringEntry(keyExportHash(caller, artId), sha256Export), StringEntry(keyLicenceHash(caller, artId), licenceHash), StringEntry(keyLicenceCid(caller, artId), licenceCID), StringEntry(keyType(caller, artId), type), StringEntry(keyTags(caller, artId), tags), IntegerEntry(keyMaxMint(caller, artId), 0), StringEntry(keySignID(caller, artId), signID), IntegerEntry(keyIssued(caller, artId), 0), BooleanEntry(keyOnSale(caller, artId), false), StringEntry(keyidBySignid(caller, signID), artId), StringEntry(keyHashByTxidAddr(caller, artId), sha256Hash), ScriptTransfer(Address(fromBase58String(feeReceiver)), amount, assetId)]
507+ 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(keyExportCid(caller, artId), cidExport), StringEntry(keyExportHash(caller, artId), sha256Export), StringEntry(keyLicenceHash(caller, artId), licenceHash), StringEntry(keyLicenceCid(caller, artId), licenceCID), StringEntry(keyType(caller, artId), type), StringEntry(keyTags(caller, artId), tags), IntegerEntry(keyMaxMint(caller, artId), 0), StringEntry(keySignID(caller, artId), signID), IntegerEntry(keyIssued(caller, artId), 0), BooleanEntry(keyOnSale(caller, artId), false), StringEntry(keyidBySignid(caller, signID), artId), StringEntry(keyHashByTxidAddr(caller, artId), sha256Hash), StringEntry(keyCrawler(caller, artId), crawler), ScriptTransfer(Address(fromBase58String(feeReceiver)), amount, assetId)]
542508 }
543509 }
544510 }
549515
550516
551517 @Callable(i)
552-func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = if (!(dappRunning))
518+func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler) = if (!(dappRunning))
553519 then throw(maintenanceMSG)
554520 else {
555521 let caller = toBase58String(i.caller.bytes)
556- let $t02089820967 = setLIcence(cidLicence, sha256Licence)
557- let licenceCID = $t02089820967._1
558- let licenceHash = $t02089820967._2
522+ let $t01988219951 = setLIcence(cidLicence, sha256Licence)
523+ let licenceCID = $t01988219951._1
524+ let licenceHash = $t01988219951._2
559525 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags)
560526 if ((validateArtwork != ""))
561527 then throw("Something went wrong!")
568534 if ((flag == "ILLEGAL"))
569535 then throw("Cannot update ILLEGAL artwork")
570536 else if (!(isArtMinted(caller, txid)))
571- then [StringEntry(keyName(caller, txid), name), StringEntry(keyDesc(caller, txid), description), StringEntry(keyDisplayCid(caller, txid), cidDisplay), StringEntry(keyExportCid(caller, txid), cidExport), StringEntry(keyExportHash(caller, txid), sha256Export), StringEntry(keyLicenceCid(caller, txid), licenceCID), StringEntry(keyLicenceHash(caller, txid), licenceHash), StringEntry(keyTags(caller, txid), tags), StringEntry(keyType(caller, txid), type)]
537+ then [StringEntry(keyName(caller, txid), name), StringEntry(keyDesc(caller, txid), description), StringEntry(keyDisplayCid(caller, txid), cidDisplay), StringEntry(keyExportCid(caller, txid), cidExport), StringEntry(keyExportHash(caller, txid), sha256Export), StringEntry(keyLicenceCid(caller, txid), licenceCID), StringEntry(keyLicenceHash(caller, txid), licenceHash), StringEntry(keyTags(caller, txid), tags), StringEntry(keyType(caller, txid), type), StringEntry(keyCrawler(caller, txid), crawler)]
572538 else throw("Already minted")
573539 }
574540 }
577543
578544
579545 @Callable(i)
580-func flagArtwork (artId,addr,flag) = {
581- let $t02230922342 = idCallerDate(i)
582- let id = $t02230922342._1
583- let caller = $t02230922342._2
584- if (containsElement([chris, joep, toString(this)], caller))
585- then if ((flag == "CONSENT"))
586- then [StringEntry(keyFlag(addr, artId), flag)]
587- else if ((flag == ""))
588- then [StringEntry(keyFlag(addr, artId), flag)]
589- else if ((flag == "CHANGE_REQUIRED"))
590- then [StringEntry(keyFlag(addr, artId), flag)]
591- else if ((flag == "SUSPENDED"))
592- then [StringEntry(keyFlag(addr, artId), flag)]
593- else if (if ((flag == "ILLEGAL"))
594- then containsElement([chris, toString(this)], caller)
595- else false)
596- then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyName(addr, artId), "ILLEGAL CONTENT"), StringEntry(keyDesc(addr, artId), "ILLEGAL CONTENT"), StringEntry(keyDisplayCid(addr, artId), ""), StringEntry(keyExportCid(addr, artId), ""), StringEntry(keyLicenceCid(addr, artId), "")]
597- else throw(("Unknow status " + flag))
546+func flagArtwork (artId,addr,flag,note) = {
547+ let $t02137621409 = idCallerDate(i)
548+ let id = $t02137621409._1
549+ let caller = $t02137621409._2
550+ if (containsElement([chris, toString(this)], caller))
551+ then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
552+ then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
553+ else throw(("Unknow status " + flag))
598554 else throw("You are not allowed")
599555 }
600556
602558
603559 @Callable(i)
604560 func deleteArtwork (artId,addr) = {
605- let $t02347523508 = idCallerDate(i)
606- let id = $t02347523508._1
607- let caller = $t02347523508._2
561+ let $t02184521878 = idCallerDate(i)
562+ let id = $t02184521878._1
563+ let caller = $t02184521878._2
608564 let addrToUse = if (containsElement([chris, joep, toString(this)], caller))
609565 then addr
610566 else caller
620576 if ((signID == ""))
621577 then throw("No SIGN ID matching")
622578 else {
623- let dataToDelete = [DeleteEntry(keyDate(addrToUse, artId)), DeleteEntry(keyName(addrToUse, artId)), DeleteEntry(keyDesc(addrToUse, artId)), DeleteEntry(keyDisplayCid(addrToUse, artId)), DeleteEntry(keyExportCid(addrToUse, artId)), DeleteEntry(keyExportHash(addrToUse, artId)), DeleteEntry(keyLicenceHash(addrToUse, artId)), DeleteEntry(keyLicenceCid(addrToUse, artId)), DeleteEntry(keyType(addrToUse, artId)), DeleteEntry(keyTags(addrToUse, artId)), DeleteEntry(keyMaxMint(addrToUse, artId)), DeleteEntry(keySignID(addrToUse, artId)), DeleteEntry(keyIssued(addrToUse, artId)), DeleteEntry(keyOnSale(addrToUse, artId)), DeleteEntry(keyFlag(addr, artId)), DeleteEntry(keyPrice(addr, artId)), DeleteEntry(keyAssetIdAccepted(addr, artId)), DeleteEntry(keyOwnerByHash(sha256Hash)), DeleteEntry(keyidBySignid(addrToUse, signID)), DeleteEntry(keyTxidByHashOwner(sha256Hash, addrToUse))]
579+ let dataToDelete = [DeleteEntry(keyDate(addrToUse, artId)), DeleteEntry(keyName(addrToUse, artId)), DeleteEntry(keyDesc(addrToUse, artId)), DeleteEntry(keyDisplayCid(addrToUse, artId)), DeleteEntry(keyExportCid(addrToUse, artId)), DeleteEntry(keyExportHash(addrToUse, artId)), DeleteEntry(keyLicenceHash(addrToUse, artId)), DeleteEntry(keyLicenceCid(addrToUse, artId)), DeleteEntry(keyType(addrToUse, artId)), DeleteEntry(keyTags(addrToUse, artId)), DeleteEntry(keyMaxMint(addrToUse, artId)), DeleteEntry(keySignID(addrToUse, artId)), DeleteEntry(keyIssued(addrToUse, artId)), DeleteEntry(keyOnSale(addrToUse, artId)), DeleteEntry(keyFlag(addrToUse, artId)), DeleteEntry(keyPrice(addrToUse, artId)), DeleteEntry(keyAssetIdAccepted(addrToUse, artId)), DeleteEntry(keyOwnerByHash(sha256Hash)), DeleteEntry(keyidBySignid(addrToUse, signID)), DeleteEntry(keyTxidByHashOwner(sha256Hash, addrToUse)), DeleteEntry(keyEndSale(addrToUse, artId)), DeleteEntry(keyNote(addrToUse, artId)), DeleteEntry(keyCrawler(addrToUse, artId))]
624580 if (!(isArtMinted(addrToUse, artId)))
625581 then if (!(dappRunning))
626582 then throw(maintenanceMSG)
636592
637593
638594 @Callable(i)
639-func sellArtwork (artId,price,maxMint,assetId) = {
640- let $t02587425907 = idCallerDate(i)
641- let id = $t02587425907._1
642- let caller = $t02587425907._2
595+func sellArtwork (artId,price,maxMint,assetId,blockEnd) = {
596+ let $t02465124684 = idCallerDate(i)
597+ let id = $t02465124684._1
598+ let caller = $t02465124684._2
643599 let artworkName = getStringByKey(keyName(caller, artId))
644600 if ((artworkName == ""))
645601 then throw("This art doesn't match your account")
646602 else {
647- let exportCID = getStringByKey(keyExportCid(caller, artId))
648- if ((size(split(exportCID, "/")[0]) != 59))
649- then throw("You cannot sell art with no export file")
603+ let flag = getStringByKey(keyFlag(caller, artId))
604+ if (containsElement(["CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
605+ then throw("Flagged artwork")
650606 else {
651607 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
652- if (!(acceptedAssetIds(assetId)))
653- then throw("Something went wrong!")
654- else if (!(validateMinSell(assetId, price)))
655- then throw("Something went wrong!")
608+ if ((0 > blockEnd))
609+ then throw("Negative end")
610+ else if (if ((blockEnd > 0))
611+ then if ((maxMint != 1))
612+ then true
613+ else (price != 0)
614+ else false)
615+ then throw("Timed offer only allowed for unique edition and offer only")
656616 else {
657- let checkUser = validateUser(caller)
658- if ((checkUser != ""))
659- then throw(checkUser)
660- else {
661- let amountSold = getIntegerByKey(keyIssued(caller, artId))
662- let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
663- if ((maxMint > 10))
664- then throw("10 editions max per artwork")
665- else if (if ((amountSold != 0))
666- then (amountSold == maxCanSell)
667- else false)
668- then throw("Max edition reached.")
669- else if (if ((amountSold > 0))
670- then (maxCanSell != maxMint)
671- else false)
672- then throw("Cannot change maximum issuable anymore")
673- else if (if ((bidNbr > 0))
674- then (maxCanSell != maxMint)
675- else false)
676- then throw("Cannot change maximum issuable with active orders")
677- else {
678- let sellStatus = if (if ((price > 0))
679- then (maxMint > 0)
617+ let baseHeight = if ((blockEnd == 0))
618+ then 0
619+ else height
620+ if (!(acceptedAssetIds(assetId)))
621+ then throw("Something went wrong!")
622+ else if (!(validateMinSell(assetId, price)))
623+ then throw("Something went wrong!")
624+ else {
625+ let checkUser = validateUser(caller)
626+ if ((checkUser != ""))
627+ then throw(checkUser)
628+ else {
629+ let amountSold = getIntegerByKey(keyIssued(caller, artId))
630+ let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
631+ if ((maxMint > 100))
632+ then throw("100 editions max per artwork")
633+ else if (if ((amountSold != 0))
634+ then (amountSold == maxCanSell)
635+ else false)
636+ then throw("Max edition reached.")
637+ else if (if ((amountSold > 0))
638+ then (maxCanSell != maxMint)
680639 else false)
681- then true
682- else false
683-[BooleanEntry(keyOnSale(caller, artId), sellStatus), IntegerEntry(keyPrice(caller, artId), price), IntegerEntry(keyMaxMint(caller, artId), maxMint), StringEntry(keyAssetIdAccepted(caller, artId), assetId)]
684- }
685- }
640+ then throw("Cannot change maximum issuable anymore")
641+ else if (if ((bidNbr > 0))
642+ then (maxCanSell != maxMint)
643+ else false)
644+ then throw("Cannot change maximum issuable with active orders")
645+ else {
646+ let sellStatus = if (if ((price > 0))
647+ then (maxMint > 0)
648+ else false)
649+ then true
650+ else false
651+[BooleanEntry(keyOnSale(caller, artId), sellStatus), IntegerEntry(keyPrice(caller, artId), price), IntegerEntry(keyMaxMint(caller, artId), maxMint), StringEntry(keyAssetIdAccepted(caller, artId), assetId), IntegerEntry(keyEndSale(caller, artId), (baseHeight + blockEnd))]
652+ }
653+ }
654+ }
686655 }
687656 }
688657 }
697666
698667 @Callable(i)
699668 func setBid (artId,issuer) = {
700- let $t02786927907 = idCallerDate(i)
701- let id = $t02786927907._1
702- let caller = $t02786927907._2
703- let date = $t02786927907._3
704- let $t02791227948 = isPayment(i)
705- let payment = $t02791227948._1
706- let amount = $t02791227948._2
669+ let $t02694126979 = idCallerDate(i)
670+ let id = $t02694126979._1
671+ let caller = $t02694126979._2
672+ let date = $t02694126979._3
673+ let $t02698427020 = isPayment(i)
674+ let payment = $t02698427020._1
675+ let amount = $t02698427020._2
707676 let assetId = if (!(isDefined(payment.assetId)))
708677 then "WAVES"
709678 else toBase58String(value(payment.assetId))
710- let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
711- if (!(acceptedAssetIds(assetId)))
712- then throw("asset not accepted")
713- else if (!(validateMinSell(assetId, amount)))
714- then throw("Wrong min sell")
715- else {
716- let amountSold = getIntegerByKey(keyIssued(issuer, artId))
717- let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
718- if ((0 >= maxCanSell))
719- then throw("No max edition set for this artwork")
720- else if ((amountSold >= maxCanSell))
721- then throw("Sold out, you cannot bid")
722- else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1))]
723- }
679+ let blockEnd = getIntegerByKey(keyEndSale(issuer, artId))
680+ if (if ((blockEnd != 0))
681+ then (height >= blockEnd)
682+ else false)
683+ then throw("Sale ended.")
684+ else {
685+ let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
686+ if (!(acceptedAssetIds(assetId)))
687+ then throw("asset not accepted")
688+ else if (!(validateMinSell(assetId, amount)))
689+ then throw("Wrong min sell")
690+ else {
691+ let amountSold = getIntegerByKey(keyIssued(issuer, artId))
692+ let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
693+ if ((0 >= maxCanSell))
694+ then throw("No max edition set for this artwork")
695+ else if ((amountSold >= maxCanSell))
696+ then throw("Sold out, you cannot bid")
697+ else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1))]
698+ }
699+ }
724700 }
725701
726702
736712
737713
738714 @Callable(i)
739-func cancelBid (artId,issuer,bidId) = {
740- let $t02910229254 = idCallerDate(i)
741- let id = $t02910229254._1
742- let caller = $t02910229254._2
743- let date = $t02910229254._3
744- let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
745- let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + bidId)
746- let bidData = getStringByKey((bidDataKey + "_OPEN"))
747- if ((bidData == ""))
748- then throw("Bid not found")
715+func cancelBid (artId,issuer,bidId,bidOwner) = {
716+ let $t02844728506 = idCallerDate(i)
717+ let id = $t02844728506._1
718+ let caller = $t02844728506._2
719+ let date = $t02844728506._3
720+ if (if ((caller != bidOwner))
721+ then (caller != issuer)
722+ else false)
723+ then throw("You cannot do this action")
749724 else {
750- let bidDataArr = split(bidData, "_")
751- let assetId = getBidAssetId(bidDataArr[0])
752- let bidStatus = "CANCELED"
753-[DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(caller)), parseIntValue(bidDataArr[1]), assetId)]
725+ let returnMoneyTo = if ((caller == issuer))
726+ then bidOwner
727+ else caller
728+ let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
729+ let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
730+ let bidData = getStringByKey((bidDataKey + "_OPEN"))
731+ if ((bidData == ""))
732+ then throw("Bid not found")
733+ else {
734+ let bidDataArr = split(bidData, "_")
735+ let assetId = getBidAssetId(bidDataArr[0])
736+ let bidStatus = "CANCELED"
737+[DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(returnMoneyTo)), parseIntValue(bidDataArr[1]), assetId)]
738+ }
754739 }
755- }
756-
757-
758-
759-@Callable(i)
760-func deleteEntry (entry) = {
761- let caller = toString(addressFromPublicKey(i.callerPublicKey))
762- if ((caller == chris))
763- then [DeleteEntry(entry)]
764- else throw("no")
765740 }
766741
767742
Full:
OldNewDifferences
1-{-# STDLIB_VERSION 4 #-}
1+{-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let unitTest = true
55
66 let oracleFee = value(addressFromString("3N2s5RtaHPBenCsx2ECcoFRbYHx3noZhXW1"))
77
88 let signDapp = value(addressFromString("3NC28hSivrmsTUXaYD1x6L362J4ZpUnoTdB"))
99
1010 let feeReceiver = "3N1E6tXddRoVaRfQ9dQ3vg5LaW2fsd8HKub"
1111
1212 let userDapp = if (unitTest)
1313 then value(addressFromString("3Mt4RGMEyjSWYAocTPqd55wdHQQB3PU2UCm"))
1414 else value(addressFromString("3N8xXaYjE27Aa79d5hHrhHu9HaFoTBmhDEj"))
1515
1616 let whitelistDapp = value(addressFromString("3N6BaV1dCB4zg43goNNHaCtvR13BcyJ5Gsq"))
1717
1818 let signAssetId = base58'Gf9t8FA4H3ssoZPCwrg3KwUFCci8zuUFP9ssRsUY3s6a'
1919
2020 let usdnAssetId = base58'25FEqEjRkqK6yCkiT7Lz6SAYz7gUFCtxfCChnrVFD5AT'
2121
2222 let wavesAssetId = base58''
2323
2424 let chris = "3MsG6jPNCrVJUtYB7XJBxS7utWsXAf4n9Vp"
2525
2626 let joep = "3Mzm4VLwsN9uZwbTMzPj3XuxV6kEfAR8UDN"
2727
2828 let signCut = 7
2929
3030 let usdnWaveCut = 10
3131
3232 let defaultLicence = "bafybeifuyo4pqu54ismqgtb6e4h6kkvgx7zg4u3zibh2r7y6mb64i7bzza/licence.pdf"
3333
3434 let defaultHashLicence = "a87758c354e30a9e78fb84fa3a0010a5090ab20df0be11ad45b5720cc187e639"
3535
3636 let dappRunning = valueOrElse(getBoolean(userDapp, "conf_dapp_is_running"), true)
3737
3838 let maintenanceMSG = valueOrElse(getString(userDapp, "conf_maintenance_msg"), "")
3939
4040 let userSuspended = "SUSPENDED"
4141
4242 let userRemoved = "REMOVED"
4343
4444 let userUnregistered = "UNREGISTERED"
4545
4646 let userAllowed = "ALLOWED"
4747
4848 func getStringByKey (key) = valueOrElse(getString(this, key), "")
4949
5050
5151 func getIntegerByKeyFromOracle (key) = valueOrErrorMessage(getInteger(oracleFee, key), "Integer undefine or 0 in oracle")
5252
5353
5454 func getIntegerByKey (key) = valueOrElse(getInteger(this, key), 0)
5555
5656
5757 func checkWhitelist (key) = valueOrElse(getInteger(whitelistDapp, key), 0)
5858
5959
6060 func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
6161
6262
6363 let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId)))
6464
6565 func checkSignCertificate (signID,Owner,sha256Hash) = match getString(signDapp, ((("data_fc_" + signID) + "_") + Owner)) {
6666 case a: String =>
6767 if (contains(a, sha256Hash))
6868 then true
6969 else false
7070 case _ =>
7171 false
7272 }
7373
7474
7575 func validateCID (cid) = if (contains(cid, "/"))
7676 then if (if ((76 > size(cid)))
7777 then (size(split(cid, "/")[0]) == 59)
7878 else false)
7979 then (16 > size(split(cid, "/")[1]))
8080 else false
8181 else false
8282
8383
8484 func validateHash (hash) = (size(hash) == 64)
8585
8686
8787 func keyUserStatus (caller) = ("user_status_" + caller)
8888
8989
9090 func keyDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
9191
9292
9393 func keyName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
9494
9595
9696 func keyDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
9797
9898
9999 func keyDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
100100
101101
102102 func keyExportHash (caller,artId) = ((("art_export_hash_" + artId) + "_") + caller)
103103
104104
105105 func keyExportCid (caller,artId) = ((("art_export_cid_" + artId) + "_") + caller)
106106
107107
108108 func keyMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
109109
110110
111111 func keySignID (caller,artId) = ((("art_signid_" + artId) + "_") + caller)
112112
113113
114114 func keyIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
115115
116116
117117 func keyOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
118118
119119
120120 func keyLicenceHash (caller,artId) = ((("art_licence_hash_" + artId) + "_") + caller)
121121
122122
123123 func keyLicenceCid (caller,artId) = ((("art_licence_cid_" + artId) + "_") + caller)
124124
125125
126126 func keyTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
127127
128128
129129 func keyType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
130130
131131
132+func keyNote (caller,artId) = ((("art_note_" + artId) + "_") + caller)
133+
134+
135+func keyCrawler (caller,artId) = ((("art_crawler_cid_" + artId) + "_") + caller)
136+
137+
132138 func keyPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
139+
140+
141+func keyEndSale (caller,artId) = ((("art_endsale_" + artId) + "_") + caller)
133142
134143
135144 func keyAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
136145
137146
138147 func keyFlag (caller,artId) = ((("art_flag_" + artId) + "_") + caller)
139148
140149
141150 func keyHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
142151
143152
144153 func keyOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
145154
146155
147156 func keyidBySignid (caller,signId) = ((("get_artidbysignid_" + signId) + "_") + caller)
148157
149158
150159 func keyTxidByHashOwner (sha256Hash,caller) = ("get_txid_by_hash_owner_" + toBase58String(sha256_16Kb(toBytes((sha256Hash + caller)))))
151160
152161
153162 func validateAllCID (cidDisplay,cidExport,cidLicence) = if (!(validateCID(cidDisplay)))
154163 then throw("Wrong Display CID")
155164 else if (!(validateCID(cidExport)))
156165 then throw("Wrong Export CID")
157166 else if (if ((cidLicence != ""))
158167 then !(validateCID(cidLicence))
159168 else false)
160169 then throw("Wrong Licence CID")
161170 else true
162171
163172
164173 func validateAllHash (sha256Export,sha256Licence) = if (!(validateHash(sha256Export)))
165174 then throw("Export Hash 64 char. max")
166175 else if (!(validateHash(sha256Licence)))
167176 then throw("Licence Hash 64 char. max")
168177 else true
169178
170179
171180 func validateString (str,max) = if ((size(str) == 0))
172181 then throw("Field cannot be is empty")
173182 else if ((size(str) > max))
174183 then throw((str + " is too long"))
175184 else true
176185
177186
178187 func validateUser (caller) = {
179188 let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
180189 if (if ((userStatus == userUnregistered))
181190 then true
182191 else (userStatus == userAllowed))
183192 then "Register this account first with \"Account\" tab"
184193 else if ((userStatus == userSuspended))
185194 then "Account suspended"
186195 else if ((userStatus == userRemoved))
187196 then "Account removed"
188197 else ""
189198 }
190199
191200
192201 func setLIcence (cidLicence,sha256Licence) = {
193202 let cid = if ((size(cidLicence) == 0))
194203 then defaultLicence
195204 else cidLicence
196205 let hash = if ((size(sha256Licence) == 0))
197206 then defaultHashLicence
198207 else sha256Licence
199208 $Tuple2(cid, hash)
200209 }
201210
202211
203212 func validateArtworkData (caller,cidDisplay,cidExport,licenceCID,sha256Export,licenceHash,name,description,tags) = {
204213 let checkUser = validateUser(caller)
205214 if ((checkUser != ""))
206215 then throw(checkUser)
207216 else if ((size(cidDisplay) == 0))
208217 then throw("Display CID cannot be empty")
209218 else if (!(validateAllCID(cidDisplay, cidExport, licenceCID)))
210219 then throw("Problem with CID")
211220 else if (!(validateAllHash(sha256Export, licenceHash)))
212221 then throw("Problem with Hashes")
213222 else if (!(validateString(name, 100)))
214223 then throw("100 Char. max name")
215224 else if (!(validateString(description, 1000)))
216225 then throw("1000 Char. max description")
217226 else if ((size(split(tags, ",")) > 5))
218227 then throw("5 tags max.")
219228 else ""
220229 }
221230
222231
223232 func isPayment (i) = if ((size(i.payments) == 0))
224233 then throw("No payment attached")
225234 else {
226235 let payment = value(i.payments[0])
227236 let amount = value(payment.amount)
228237 $Tuple2(payment, amount)
229238 }
230239
231240
232241 func validatePayment (i) = {
233- let $t090289064 = isPayment(i)
234- let payment = $t090289064._1
235- let amount = $t090289064._2
242+ let $t091969232 = isPayment(i)
243+ let payment = $t091969232._1
244+ let amount = $t091969232._2
236245 let assetId = if (if (isDefined(payment.assetId))
237246 then (payment.assetId == signAssetId)
238247 else false)
239248 then payment.assetId
240249 else throw("Only SIGN token accepted as transaction fee")
241250 if ((amount != currentCertificationPrice))
242251 then throw(("Payment amount should be " + toString(currentCertificationPrice)))
243252 else $Tuple2(amount, assetId)
244253 }
245254
246255
247256 func isArtMinted (addrToUse,artId) = match getInteger(this, keyIssued(addrToUse, artId)) {
248257 case b: Int =>
249258 if ((b != 0))
250259 then true
251260 else false
252261 case _ =>
253262 false
254263 }
255264
256265
257266 func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
258- let $t096579693 = isPayment(i)
259- let payment = $t096579693._1
260- let amount = $t096579693._2
267+ let $t098259861 = isPayment(i)
268+ let payment = $t098259861._1
269+ let amount = $t098259861._2
261270 let assetId = if (!(isDefined(payment.assetId)))
262271 then unit
263272 else if (if ((size(priceAssetId) > 0))
264273 then (toBase58String(value(payment.assetId)) == priceAssetId)
265274 else false)
266275 then payment.assetId
267276 else throw("Wrong asset id")
268277 if (if ((assetId == unit))
269278 then (priceAssetId != "")
270279 else false)
271280 then throw("Wrong asset id")
272281 else if ((artworkPrice != amount))
273282 then throw("Payment don't match")
274283 else $Tuple2(amount, assetId)
275284 }
276285
277286
278287 func acceptedAssetIds (assetId) = if (if (if (if ((assetId != toBase58String(signAssetId)))
279288 then (assetId != toBase58String(wavesAssetId))
280289 else false)
281290 then (assetId != "WAVES")
282291 else false)
283292 then (assetId != toBase58String(usdnAssetId))
284293 else false)
285294 then throw("Only SIGN, USDN or WAVES accepted")
286295 else true
287296
288297
289298 func validateMinSell (assetId,price) = {
290299 let minSellWaves = if (unitTest)
291300 then 10
292301 else getIntegerByKeyFromOracle("waves_min_sell")
293302 let minSellUsdn = 1000000
294303 let minSellSign = if (unitTest)
295304 then 1
296305 else (currentCertificationPrice * 2)
297306 if (if (if (if (if ((assetId == toBase58String(usdnAssetId)))
298307 then (minSellUsdn > price)
299308 else false)
300309 then (price != 0)
301310 else false)
302311 then true
303312 else if (if ((assetId == toBase58String(signAssetId)))
304313 then (minSellSign > price)
305314 else false)
306315 then (price != 0)
307316 else false)
308317 then true
309318 else if (if (if ((assetId == toBase58String(wavesAssetId)))
310319 then true
311320 else (assetId == "WAVES"))
312321 then (minSellWaves > price)
313322 else false)
314323 then (price != 0)
315324 else false)
316325 then throw("Wrong minimum sell price")
317326 else true
318327 }
319328
320329
321330 func getBidAssetId (assetId) = if ((assetId == "WAVES"))
322331 then unit
323332 else fromBase58String(assetId)
324333
325334
326335 func getPriceAssetIdFromBid (bidDataKey) = {
327336 let bidData = getStringByKey((bidDataKey + "_OPEN"))
328337 if ((bidData == ""))
329338 then throw("Bid not found")
330339 else {
331340 let bidDataArr = split(bidData, "_")
332341 let bidAmount = parseIntValue(bidDataArr[1])
333342 let bidAssetId = getBidAssetId(bidDataArr[0])
334343 if ((0 >= bidAmount))
335344 then throw("Wrong amount")
336345 else $Tuple2(bidAmount, bidAssetId)
337346 }
338347 }
339348
340349
341350 func idCallerDate (i) = if (!(dappRunning))
342351 then throw(maintenanceMSG)
343352 else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
344353
345354
346-func isBidCheck (i,issuer,bidOwner,bidId) = if (if (if ((toBase58String(i.caller.bytes) == issuer))
347- then (bidOwner != "")
348- else false)
349- then (bidId != "")
350- else false)
351- then true
352- else false
353-
354-
355-func getArtData (i,issuer,artId,isBid) = {
356- let callerIsIssuer = (toBase58String(i.caller.bytes) == issuer)
357- let totalNFT = getIntegerByKey("total_nft_issued")
358- let signID = getStringByKey(keySignID(issuer, artId))
359- let artworkName = getStringByKey(keyName(issuer, artId))
360- if ((artworkName == ""))
361- then throw("Art doesn't exist")
355+func buyMint (i,artId,issuer,bidId,bidOwner) = {
356+ let $t01208612143 = idCallerDate(i)
357+ let id = $t01208612143._1
358+ let caller = $t01208612143._2
359+ let date = $t01208612143._3
360+ let isBid = if (if (if ((toBase58String(i.caller.bytes) == issuer))
361+ then (bidOwner != "")
362+ else false)
363+ then (bidId != "")
364+ else false)
365+ then true
366+ else false
367+ let blockEnd = getIntegerByKey(keyEndSale(caller, artId))
368+ if (if (if ((blockEnd != 0))
369+ then (height >= blockEnd)
370+ else false)
371+ then !(isBid)
372+ else false)
373+ then throw("Sale ended.")
362374 else {
363- let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
364- let amountSold = getIntegerByKey(keyIssued(issuer, artId))
365- let artworkPrice = if (callerIsIssuer)
366- then (currentCertificationPrice * 2)
367- else getIntegerByKey(keyPrice(issuer, artId))
368- let priceAssetId = if (callerIsIssuer)
369- then toBase58String(signAssetId)
370- else getStringByKey(keyAssetIdAccepted(issuer, artId))
371- let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
372- if (if (if (!(isBid))
373- then !(callerIsIssuer)
374- else false)
375- then if (if ((0 >= artworkPrice))
376- then true
377- else !(isOnSale))
378- then true
379- else (0 >= maxCanSell)
380- else false)
381- then throw("Art not for sale")
382- else if (if (if (!(isBid))
383- then callerIsIssuer
384- else false)
385- then (0 >= maxCanSell)
386- else false)
387- then throw("Max issuable not set")
388- else $Tuple8(totalNFT, signID, artworkName, amountSold, artworkPrice, priceAssetId, maxCanSell, isOnSale)
375+ let callerIsIssuer = (toBase58String(i.caller.bytes) == issuer)
376+ let totalNFT = getIntegerByKey("total_nft_issued")
377+ let signID = getStringByKey(keySignID(issuer, artId))
378+ let artworkName = getStringByKey(keyName(issuer, artId))
379+ if ((artworkName == ""))
380+ then throw("Art doesn't exist")
381+ else {
382+ let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
383+ let amountSold = getIntegerByKey(keyIssued(issuer, artId))
384+ let artworkPrice = if (callerIsIssuer)
385+ then (currentCertificationPrice * 2)
386+ else getIntegerByKey(keyPrice(issuer, artId))
387+ let priceAssetId = if (callerIsIssuer)
388+ then toBase58String(signAssetId)
389+ else getStringByKey(keyAssetIdAccepted(issuer, artId))
390+ let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
391+ if (if (if (!(isBid))
392+ then !(callerIsIssuer)
393+ else false)
394+ then if (if ((0 >= artworkPrice))
395+ then true
396+ else !(isOnSale))
397+ then true
398+ else (0 >= maxCanSell)
399+ else false)
400+ then throw("Art not for sale")
401+ else if (if (if (!(isBid))
402+ then callerIsIssuer
403+ else false)
404+ then (0 >= maxCanSell)
405+ else false)
406+ then throw("Max issuable not set")
407+ else {
408+ let checkUser = validateUser(issuer)
409+ if (if (isBid)
410+ then (checkUser != "")
411+ else false)
412+ then throw(checkUser)
413+ else {
414+ let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
415+ let $t01389414050 = if (isBid)
416+ then getPriceAssetIdFromBid(bidDataKey)
417+ else validatePriceAssetId(i, priceAssetId, artworkPrice)
418+ let amount = $t01389414050._1
419+ let assetId = $t01389414050._2
420+ let isWhitelisted = checkWhitelist(issuer)
421+ let cut = if ((isWhitelisted > height))
422+ then 0
423+ else if ((assetId == signAssetId))
424+ then signCut
425+ else usdnWaveCut
426+ let amountForSign = fraction(amount, cut, 100)
427+ let amountForCreator = (amount - amountForSign)
428+ if ((amountSold == maxCanSell))
429+ then throw("Art sold out")
430+ else {
431+ let newAmountSold = (amountSold + 1)
432+ let issueMeta = ((((((((((("Creator: " + issuer) + ",
433+ ArtID: ") + artId) + ",
434+ SignID: ") + signID) + ",
435+ Artwork name: ") + artworkName) + ",
436+ Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
437+ let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
438+ let idNFT = calculateAssetId(issueNFT)
439+ let sellStatus = if (if ((newAmountSold == maxCanSell))
440+ then true
441+ else !(isOnSale))
442+ then false
443+ else true
444+ let receiveNFT = if (if (if ((caller == issuer))
445+ then (bidOwner != "")
446+ else false)
447+ then (bidId != "")
448+ else false)
449+ then addressFromStringValue(bidOwner)
450+ else i.caller
451+ let assetIdBid = if (!(isDefined(assetId)))
452+ then "WAVES"
453+ else toBase58String(value(assetId))
454+ let bidData = getStringByKey((bidDataKey + "_OPEN"))
455+ let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
456+ let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
457+ let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
458+ let soldValue = if (!(isBid))
459+ then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
460+ else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
461+ let soldData = StringEntry(soldKey, soldValue)
462+ let buyRes = [IntegerEntry(keyIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + toBase58String(idNFT)), soldKey), IntegerEntry("total_nft_issued", (totalNFT + 1)), IntegerEntry(keyEndSale(issuer, artId), 0), BooleanEntry(keyOnSale(issuer, artId), sellStatus), issueNFT, ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId), ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId), ScriptTransfer(receiveNFT, 1, idNFT)]
463+ if (isBid)
464+ then [soldData, bidUpdate, bidDelOld] :: buyRes
465+ else soldData :: buyRes
466+ }
467+ }
468+ }
469+ }
389470 }
390471 }
391472
392473
393-func getBidData (i,caller,issuer,artId,bidOwner,bidId,priceAssetId,artworkPrice,isBid) = {
394- let checkUser = validateUser(issuer)
395- if (if (isBid)
396- then (checkUser != "")
397- else false)
398- then throw(checkUser)
399- else {
400- let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
401- let $t01356513694 = if (isBid)
402- then getPriceAssetIdFromBid(bidDataKey)
403- else validatePriceAssetId(i, priceAssetId, artworkPrice)
404- let amount = $t01356513694._1
405- let assetId = $t01356513694._2
406- $Tuple3(bidDataKey, amount, assetId)
407- }
408- }
409-
410-
411-func getCommissionData (issuer,assetId,amount,amountSold,maxCanSell) = {
412- let isWhitelisted = checkWhitelist(issuer)
413- let cut = if ((isWhitelisted > height))
414- then 0
415- else if ((assetId == signAssetId))
416- then signCut
417- else usdnWaveCut
418- let amountForSign = fraction(amount, cut, 100)
419- let amountForCreator = (amount - amountForSign)
420- if ((amountSold == maxCanSell))
421- then throw("Art sold out")
422- else {
423- let newAmountSold = (amountSold + 1)
424- $Tuple3(amountForSign, amountForCreator, newAmountSold)
425- }
426- }
427-
428-
429-func getIssueData (issuer,artId,signID,artworkName,newAmountSold,maxCanSell,totalNFT,caller,bidOwner,bidId,i,isOnSale) = {
430- let issueMeta = ((((((((((("Creator: " + issuer) + ",
431- ArtID: ") + artId) + ",
432- SignID: ") + signID) + ",
433- Artwork name: ") + artworkName) + ",
434- Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
435- let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
436- let idNFT = calculateAssetId(issueNFT)
437- let sellStatus = if (if ((newAmountSold == maxCanSell))
438- then true
439- else !(isOnSale))
440- then false
441- else true
442- let receiveNFT = if (if (if ((caller == issuer))
443- then (bidOwner != "")
444- else false)
445- then (bidId != "")
446- else false)
447- then addressFromStringValue(bidOwner)
448- else i.caller
449- $Tuple4(issueNFT, idNFT, sellStatus, receiveNFT)
450- }
451-
452-
453-func getBidKeyVal (assetId,bidDataKey,date) = {
454- let assetIdBid = if (!(isDefined(assetId)))
455- then "WAVES"
456- else toBase58String(value(assetId))
457- let bidData = getStringByKey((bidDataKey + "_OPEN"))
458- let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
459- let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
460- $Tuple3(assetIdBid, bidDelOld, bidUpdate)
461- }
462-
463-
464-func buyMint (i,artId,issuer,bidId,bidOwner) = {
465- let $t01556215612 = idCallerDate(i)
466- let id = $t01556215612._1
467- let caller = $t01556215612._2
468- let date = $t01556215612._3
469- let isBid = isBidCheck(i, issuer, bidOwner, bidId)
470- let $t01569215843 = getArtData(i, issuer, artId, isBid)
471- let totalNFT = $t01569215843._1
472- let signID = $t01569215843._2
473- let artworkName = $t01569215843._3
474- let amountSold = $t01569215843._4
475- let artworkPrice = $t01569215843._5
476- let priceAssetId = $t01569215843._6
477- let maxCanSell = $t01569215843._7
478- let isOnSale = $t01569215843._8
479- let $t01584815994 = getBidData(i, caller, issuer, artId, bidOwner, bidId, priceAssetId, artworkPrice, isBid)
480- let bidDataKey = $t01584815994._1
481- let amount = $t01584815994._2
482- let assetId = $t01584815994._3
483- let $t01599916141 = getCommissionData(issuer, assetId, amount, amountSold, maxCanSell)
484- let amountForSign = $t01599916141._1
485- let amountForCreator = $t01599916141._2
486- let newAmountSold = $t01599916141._3
487- let $t01614616336 = getIssueData(issuer, artId, signID, artworkName, newAmountSold, maxCanSell, totalNFT, caller, bidOwner, bidId, i, isOnSale)
488- let issueNFT = $t01614616336._1
489- let idNFT = $t01614616336._2
490- let sellStatus = $t01614616336._3
491- let receiveNFT = $t01614616336._4
492- let $t01634116440 = getBidKeyVal(assetId, bidDataKey, date)
493- let assetIdBid = $t01634116440._1
494- let bidDelOld = $t01634116440._2
495- let bidUpdate = $t01634116440._3
496- let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
497- let soldValue = if (!(isBid))
498- then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
499- else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
500- let soldData = StringEntry(soldKey, soldValue)
501- 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)), amountForSign, assetId), ScriptTransfer(receiveNFT, 1, idNFT)]
502- if (isBid)
503- then [soldData, bidUpdate, bidDelOld] :: buyRes
504- else soldData :: buyRes
505- }
506-
507-
508474 @Callable(i)
509-func addArtwork (sha256Hash,signID,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = {
510- let $t01778617827 = idCallerDate(i)
511- let artId = $t01778617827._1
512- let caller = $t01778617827._2
513- let date = $t01778617827._3
475+func addArtwork (sha256Hash,signID,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler) = {
476+ let $t01667816719 = idCallerDate(i)
477+ let artId = $t01667816719._1
478+ let caller = $t01667816719._2
479+ let date = $t01667816719._3
514480 if (!(validateHash(sha256Hash)))
515481 then throw("Hash should be 64 characters maximum")
516482 else {
517- let $t01792817997 = setLIcence(cidLicence, sha256Licence)
518- let licenceCID = $t01792817997._1
519- let licenceHash = $t01792817997._2
483+ let $t01682016889 = setLIcence(cidLicence, sha256Licence)
484+ let licenceCID = $t01682016889._1
485+ let licenceHash = $t01682016889._2
520486 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags)
521487 if ((validateArtwork != ""))
522488 then throw("Something went wrong!")
523489 else {
524- let $t01821618258 = validatePayment(i)
525- let amount = $t01821618258._1
526- let assetId = $t01821618258._2
490+ let $t01710817150 = validatePayment(i)
491+ let amount = $t01710817150._1
492+ let assetId = $t01710817150._2
527493 if (!(isDefined(amount)))
528494 then throw("Something went wrong")
529495 else {
530496 let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller))
531497 if ((entryExist != ""))
532498 then throw("You already added it")
533499 else {
534500 let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
535501 if ((hashExist != ""))
536502 then throw("Hash already registered")
537503 else {
538504 let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
539505 if (!(isSignCertified))
540506 then throw("Sign Certificate not found for this address.")
541- 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(keyExportCid(caller, artId), cidExport), StringEntry(keyExportHash(caller, artId), sha256Export), StringEntry(keyLicenceHash(caller, artId), licenceHash), StringEntry(keyLicenceCid(caller, artId), licenceCID), StringEntry(keyType(caller, artId), type), StringEntry(keyTags(caller, artId), tags), IntegerEntry(keyMaxMint(caller, artId), 0), StringEntry(keySignID(caller, artId), signID), IntegerEntry(keyIssued(caller, artId), 0), BooleanEntry(keyOnSale(caller, artId), false), StringEntry(keyidBySignid(caller, signID), artId), StringEntry(keyHashByTxidAddr(caller, artId), sha256Hash), ScriptTransfer(Address(fromBase58String(feeReceiver)), amount, assetId)]
507+ 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(keyExportCid(caller, artId), cidExport), StringEntry(keyExportHash(caller, artId), sha256Export), StringEntry(keyLicenceHash(caller, artId), licenceHash), StringEntry(keyLicenceCid(caller, artId), licenceCID), StringEntry(keyType(caller, artId), type), StringEntry(keyTags(caller, artId), tags), IntegerEntry(keyMaxMint(caller, artId), 0), StringEntry(keySignID(caller, artId), signID), IntegerEntry(keyIssued(caller, artId), 0), BooleanEntry(keyOnSale(caller, artId), false), StringEntry(keyidBySignid(caller, signID), artId), StringEntry(keyHashByTxidAddr(caller, artId), sha256Hash), StringEntry(keyCrawler(caller, artId), crawler), ScriptTransfer(Address(fromBase58String(feeReceiver)), amount, assetId)]
542508 }
543509 }
544510 }
545511 }
546512 }
547513 }
548514
549515
550516
551517 @Callable(i)
552-func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = if (!(dappRunning))
518+func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler) = if (!(dappRunning))
553519 then throw(maintenanceMSG)
554520 else {
555521 let caller = toBase58String(i.caller.bytes)
556- let $t02089820967 = setLIcence(cidLicence, sha256Licence)
557- let licenceCID = $t02089820967._1
558- let licenceHash = $t02089820967._2
522+ let $t01988219951 = setLIcence(cidLicence, sha256Licence)
523+ let licenceCID = $t01988219951._1
524+ let licenceHash = $t01988219951._2
559525 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags)
560526 if ((validateArtwork != ""))
561527 then throw("Something went wrong!")
562528 else {
563529 let entryExist = getStringByKey(keyName(caller, txid))
564530 if ((entryExist == ""))
565531 then throw("Entry not found")
566532 else {
567533 let flag = getStringByKey(keyFlag(caller, txid))
568534 if ((flag == "ILLEGAL"))
569535 then throw("Cannot update ILLEGAL artwork")
570536 else if (!(isArtMinted(caller, txid)))
571- then [StringEntry(keyName(caller, txid), name), StringEntry(keyDesc(caller, txid), description), StringEntry(keyDisplayCid(caller, txid), cidDisplay), StringEntry(keyExportCid(caller, txid), cidExport), StringEntry(keyExportHash(caller, txid), sha256Export), StringEntry(keyLicenceCid(caller, txid), licenceCID), StringEntry(keyLicenceHash(caller, txid), licenceHash), StringEntry(keyTags(caller, txid), tags), StringEntry(keyType(caller, txid), type)]
537+ then [StringEntry(keyName(caller, txid), name), StringEntry(keyDesc(caller, txid), description), StringEntry(keyDisplayCid(caller, txid), cidDisplay), StringEntry(keyExportCid(caller, txid), cidExport), StringEntry(keyExportHash(caller, txid), sha256Export), StringEntry(keyLicenceCid(caller, txid), licenceCID), StringEntry(keyLicenceHash(caller, txid), licenceHash), StringEntry(keyTags(caller, txid), tags), StringEntry(keyType(caller, txid), type), StringEntry(keyCrawler(caller, txid), crawler)]
572538 else throw("Already minted")
573539 }
574540 }
575541 }
576542
577543
578544
579545 @Callable(i)
580-func flagArtwork (artId,addr,flag) = {
581- let $t02230922342 = idCallerDate(i)
582- let id = $t02230922342._1
583- let caller = $t02230922342._2
584- if (containsElement([chris, joep, toString(this)], caller))
585- then if ((flag == "CONSENT"))
586- then [StringEntry(keyFlag(addr, artId), flag)]
587- else if ((flag == ""))
588- then [StringEntry(keyFlag(addr, artId), flag)]
589- else if ((flag == "CHANGE_REQUIRED"))
590- then [StringEntry(keyFlag(addr, artId), flag)]
591- else if ((flag == "SUSPENDED"))
592- then [StringEntry(keyFlag(addr, artId), flag)]
593- else if (if ((flag == "ILLEGAL"))
594- then containsElement([chris, toString(this)], caller)
595- else false)
596- then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyName(addr, artId), "ILLEGAL CONTENT"), StringEntry(keyDesc(addr, artId), "ILLEGAL CONTENT"), StringEntry(keyDisplayCid(addr, artId), ""), StringEntry(keyExportCid(addr, artId), ""), StringEntry(keyLicenceCid(addr, artId), "")]
597- else throw(("Unknow status " + flag))
546+func flagArtwork (artId,addr,flag,note) = {
547+ let $t02137621409 = idCallerDate(i)
548+ let id = $t02137621409._1
549+ let caller = $t02137621409._2
550+ if (containsElement([chris, toString(this)], caller))
551+ then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
552+ then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
553+ else throw(("Unknow status " + flag))
598554 else throw("You are not allowed")
599555 }
600556
601557
602558
603559 @Callable(i)
604560 func deleteArtwork (artId,addr) = {
605- let $t02347523508 = idCallerDate(i)
606- let id = $t02347523508._1
607- let caller = $t02347523508._2
561+ let $t02184521878 = idCallerDate(i)
562+ let id = $t02184521878._1
563+ let caller = $t02184521878._2
608564 let addrToUse = if (containsElement([chris, joep, toString(this)], caller))
609565 then addr
610566 else caller
611567 let entryExist = valueOrErrorMessage(getStringByKey(keyName(addrToUse, artId)), "No art matching for this address")
612568 if ((entryExist == ""))
613569 then throw("No art matching for this address")
614570 else {
615571 let sha256Hash = getStringByKey(keyHashByTxidAddr(addrToUse, artId))
616572 if ((sha256Hash == ""))
617573 then throw("No art hash matching for this address")
618574 else {
619575 let signID = getStringByKey(keySignID(addrToUse, artId))
620576 if ((signID == ""))
621577 then throw("No SIGN ID matching")
622578 else {
623- let dataToDelete = [DeleteEntry(keyDate(addrToUse, artId)), DeleteEntry(keyName(addrToUse, artId)), DeleteEntry(keyDesc(addrToUse, artId)), DeleteEntry(keyDisplayCid(addrToUse, artId)), DeleteEntry(keyExportCid(addrToUse, artId)), DeleteEntry(keyExportHash(addrToUse, artId)), DeleteEntry(keyLicenceHash(addrToUse, artId)), DeleteEntry(keyLicenceCid(addrToUse, artId)), DeleteEntry(keyType(addrToUse, artId)), DeleteEntry(keyTags(addrToUse, artId)), DeleteEntry(keyMaxMint(addrToUse, artId)), DeleteEntry(keySignID(addrToUse, artId)), DeleteEntry(keyIssued(addrToUse, artId)), DeleteEntry(keyOnSale(addrToUse, artId)), DeleteEntry(keyFlag(addr, artId)), DeleteEntry(keyPrice(addr, artId)), DeleteEntry(keyAssetIdAccepted(addr, artId)), DeleteEntry(keyOwnerByHash(sha256Hash)), DeleteEntry(keyidBySignid(addrToUse, signID)), DeleteEntry(keyTxidByHashOwner(sha256Hash, addrToUse))]
579+ let dataToDelete = [DeleteEntry(keyDate(addrToUse, artId)), DeleteEntry(keyName(addrToUse, artId)), DeleteEntry(keyDesc(addrToUse, artId)), DeleteEntry(keyDisplayCid(addrToUse, artId)), DeleteEntry(keyExportCid(addrToUse, artId)), DeleteEntry(keyExportHash(addrToUse, artId)), DeleteEntry(keyLicenceHash(addrToUse, artId)), DeleteEntry(keyLicenceCid(addrToUse, artId)), DeleteEntry(keyType(addrToUse, artId)), DeleteEntry(keyTags(addrToUse, artId)), DeleteEntry(keyMaxMint(addrToUse, artId)), DeleteEntry(keySignID(addrToUse, artId)), DeleteEntry(keyIssued(addrToUse, artId)), DeleteEntry(keyOnSale(addrToUse, artId)), DeleteEntry(keyFlag(addrToUse, artId)), DeleteEntry(keyPrice(addrToUse, artId)), DeleteEntry(keyAssetIdAccepted(addrToUse, artId)), DeleteEntry(keyOwnerByHash(sha256Hash)), DeleteEntry(keyidBySignid(addrToUse, signID)), DeleteEntry(keyTxidByHashOwner(sha256Hash, addrToUse)), DeleteEntry(keyEndSale(addrToUse, artId)), DeleteEntry(keyNote(addrToUse, artId)), DeleteEntry(keyCrawler(addrToUse, artId))]
624580 if (!(isArtMinted(addrToUse, artId)))
625581 then if (!(dappRunning))
626582 then throw(maintenanceMSG)
627583 else dataToDelete
628584 else if (containsElement([chris, toString(this)], caller))
629585 then dataToDelete
630586 else throw("Art already minted, you cannot delete it")
631587 }
632588 }
633589 }
634590 }
635591
636592
637593
638594 @Callable(i)
639-func sellArtwork (artId,price,maxMint,assetId) = {
640- let $t02587425907 = idCallerDate(i)
641- let id = $t02587425907._1
642- let caller = $t02587425907._2
595+func sellArtwork (artId,price,maxMint,assetId,blockEnd) = {
596+ let $t02465124684 = idCallerDate(i)
597+ let id = $t02465124684._1
598+ let caller = $t02465124684._2
643599 let artworkName = getStringByKey(keyName(caller, artId))
644600 if ((artworkName == ""))
645601 then throw("This art doesn't match your account")
646602 else {
647- let exportCID = getStringByKey(keyExportCid(caller, artId))
648- if ((size(split(exportCID, "/")[0]) != 59))
649- then throw("You cannot sell art with no export file")
603+ let flag = getStringByKey(keyFlag(caller, artId))
604+ if (containsElement(["CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
605+ then throw("Flagged artwork")
650606 else {
651607 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
652- if (!(acceptedAssetIds(assetId)))
653- then throw("Something went wrong!")
654- else if (!(validateMinSell(assetId, price)))
655- then throw("Something went wrong!")
608+ if ((0 > blockEnd))
609+ then throw("Negative end")
610+ else if (if ((blockEnd > 0))
611+ then if ((maxMint != 1))
612+ then true
613+ else (price != 0)
614+ else false)
615+ then throw("Timed offer only allowed for unique edition and offer only")
656616 else {
657- let checkUser = validateUser(caller)
658- if ((checkUser != ""))
659- then throw(checkUser)
660- else {
661- let amountSold = getIntegerByKey(keyIssued(caller, artId))
662- let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
663- if ((maxMint > 10))
664- then throw("10 editions max per artwork")
665- else if (if ((amountSold != 0))
666- then (amountSold == maxCanSell)
667- else false)
668- then throw("Max edition reached.")
669- else if (if ((amountSold > 0))
670- then (maxCanSell != maxMint)
671- else false)
672- then throw("Cannot change maximum issuable anymore")
673- else if (if ((bidNbr > 0))
674- then (maxCanSell != maxMint)
675- else false)
676- then throw("Cannot change maximum issuable with active orders")
677- else {
678- let sellStatus = if (if ((price > 0))
679- then (maxMint > 0)
617+ let baseHeight = if ((blockEnd == 0))
618+ then 0
619+ else height
620+ if (!(acceptedAssetIds(assetId)))
621+ then throw("Something went wrong!")
622+ else if (!(validateMinSell(assetId, price)))
623+ then throw("Something went wrong!")
624+ else {
625+ let checkUser = validateUser(caller)
626+ if ((checkUser != ""))
627+ then throw(checkUser)
628+ else {
629+ let amountSold = getIntegerByKey(keyIssued(caller, artId))
630+ let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
631+ if ((maxMint > 100))
632+ then throw("100 editions max per artwork")
633+ else if (if ((amountSold != 0))
634+ then (amountSold == maxCanSell)
635+ else false)
636+ then throw("Max edition reached.")
637+ else if (if ((amountSold > 0))
638+ then (maxCanSell != maxMint)
680639 else false)
681- then true
682- else false
683-[BooleanEntry(keyOnSale(caller, artId), sellStatus), IntegerEntry(keyPrice(caller, artId), price), IntegerEntry(keyMaxMint(caller, artId), maxMint), StringEntry(keyAssetIdAccepted(caller, artId), assetId)]
684- }
685- }
640+ then throw("Cannot change maximum issuable anymore")
641+ else if (if ((bidNbr > 0))
642+ then (maxCanSell != maxMint)
643+ else false)
644+ then throw("Cannot change maximum issuable with active orders")
645+ else {
646+ let sellStatus = if (if ((price > 0))
647+ then (maxMint > 0)
648+ else false)
649+ then true
650+ else false
651+[BooleanEntry(keyOnSale(caller, artId), sellStatus), IntegerEntry(keyPrice(caller, artId), price), IntegerEntry(keyMaxMint(caller, artId), maxMint), StringEntry(keyAssetIdAccepted(caller, artId), assetId), IntegerEntry(keyEndSale(caller, artId), (baseHeight + blockEnd))]
652+ }
653+ }
654+ }
686655 }
687656 }
688657 }
689658 }
690659
691660
692661
693662 @Callable(i)
694663 func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "")
695664
696665
697666
698667 @Callable(i)
699668 func setBid (artId,issuer) = {
700- let $t02786927907 = idCallerDate(i)
701- let id = $t02786927907._1
702- let caller = $t02786927907._2
703- let date = $t02786927907._3
704- let $t02791227948 = isPayment(i)
705- let payment = $t02791227948._1
706- let amount = $t02791227948._2
669+ let $t02694126979 = idCallerDate(i)
670+ let id = $t02694126979._1
671+ let caller = $t02694126979._2
672+ let date = $t02694126979._3
673+ let $t02698427020 = isPayment(i)
674+ let payment = $t02698427020._1
675+ let amount = $t02698427020._2
707676 let assetId = if (!(isDefined(payment.assetId)))
708677 then "WAVES"
709678 else toBase58String(value(payment.assetId))
710- let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
711- if (!(acceptedAssetIds(assetId)))
712- then throw("asset not accepted")
713- else if (!(validateMinSell(assetId, amount)))
714- then throw("Wrong min sell")
715- else {
716- let amountSold = getIntegerByKey(keyIssued(issuer, artId))
717- let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
718- if ((0 >= maxCanSell))
719- then throw("No max edition set for this artwork")
720- else if ((amountSold >= maxCanSell))
721- then throw("Sold out, you cannot bid")
722- else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1))]
723- }
679+ let blockEnd = getIntegerByKey(keyEndSale(issuer, artId))
680+ if (if ((blockEnd != 0))
681+ then (height >= blockEnd)
682+ else false)
683+ then throw("Sale ended.")
684+ else {
685+ let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
686+ if (!(acceptedAssetIds(assetId)))
687+ then throw("asset not accepted")
688+ else if (!(validateMinSell(assetId, amount)))
689+ then throw("Wrong min sell")
690+ else {
691+ let amountSold = getIntegerByKey(keyIssued(issuer, artId))
692+ let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
693+ if ((0 >= maxCanSell))
694+ then throw("No max edition set for this artwork")
695+ else if ((amountSold >= maxCanSell))
696+ then throw("Sold out, you cannot bid")
697+ else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1))]
698+ }
699+ }
724700 }
725701
726702
727703
728704 @Callable(i)
729705 func acceptBid (artId,issuer,bidId,bidOwner) = {
730706 let caller = toBase58String(i.caller.bytes)
731707 if ((caller != issuer))
732708 then throw("You cannot do this action")
733709 else buyMint(i, artId, issuer, bidId, bidOwner)
734710 }
735711
736712
737713
738714 @Callable(i)
739-func cancelBid (artId,issuer,bidId) = {
740- let $t02910229254 = idCallerDate(i)
741- let id = $t02910229254._1
742- let caller = $t02910229254._2
743- let date = $t02910229254._3
744- let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
745- let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + bidId)
746- let bidData = getStringByKey((bidDataKey + "_OPEN"))
747- if ((bidData == ""))
748- then throw("Bid not found")
715+func cancelBid (artId,issuer,bidId,bidOwner) = {
716+ let $t02844728506 = idCallerDate(i)
717+ let id = $t02844728506._1
718+ let caller = $t02844728506._2
719+ let date = $t02844728506._3
720+ if (if ((caller != bidOwner))
721+ then (caller != issuer)
722+ else false)
723+ then throw("You cannot do this action")
749724 else {
750- let bidDataArr = split(bidData, "_")
751- let assetId = getBidAssetId(bidDataArr[0])
752- let bidStatus = "CANCELED"
753-[DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(caller)), parseIntValue(bidDataArr[1]), assetId)]
725+ let returnMoneyTo = if ((caller == issuer))
726+ then bidOwner
727+ else caller
728+ let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
729+ let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
730+ let bidData = getStringByKey((bidDataKey + "_OPEN"))
731+ if ((bidData == ""))
732+ then throw("Bid not found")
733+ else {
734+ let bidDataArr = split(bidData, "_")
735+ let assetId = getBidAssetId(bidDataArr[0])
736+ let bidStatus = "CANCELED"
737+[DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(returnMoneyTo)), parseIntValue(bidDataArr[1]), assetId)]
738+ }
754739 }
755- }
756-
757-
758-
759-@Callable(i)
760-func deleteEntry (entry) = {
761- let caller = toString(addressFromPublicKey(i.callerPublicKey))
762- if ((caller == chris))
763- then [DeleteEntry(entry)]
764- else throw("no")
765740 }
766741
767742

github/deemru/w8io/169f3d6 
114.76 ms