tx · 4d5f7c2sSBSbq9LAwRoqoZzYHQCZBBFcLADPcMwQs813

3MyRsssByY6ZDZxzXEFK7sgFYbtXAxajmJp:  -0.01000000 Waves

2021.10.06 12:18 [1734174] smart account 3MyRsssByY6ZDZxzXEFK7sgFYbtXAxajmJp > SELF 0.00000000 Waves

{ "type": 13, "id": "4d5f7c2sSBSbq9LAwRoqoZzYHQCZBBFcLADPcMwQs813", "fee": 1000000, "feeAssetId": null, "timestamp": 1633511931585, "version": 2, "chainId": 84, "sender": "3MyRsssByY6ZDZxzXEFK7sgFYbtXAxajmJp", "senderPublicKey": "7mNS5bKoVK7u5db7PvrcUj25wxK6NvkMjqkMHjBKcpVb", "proofs": [ "4FfJ3stvXYqsbYZZYEdyenY4n6k2noVbfjjUr8Tyu9wM6Ur9dzuwDF8TrejdFLdKs9qf2FRUbX9aVt9LdRaoAA2a" ], "script": "base64:AAIFAAAAAAAAAD8IAhIFCgMBCAgSCQoHCAgICAgICBIJCgcIAQEICAEBEgQKAggIEgMKAQgSBAoCCAgSBgoECAgICBIFCgMICAgAAABQAAAAAAh1bml0VGVzdAcAAAAACW9yYWNsZUZlZQkBAAAABXZhbHVlAAAAAQkABCYAAAABAgAAACMzTXBaUWp6R29nbWlmY0VLZThtRGQ2cmliTDdueFQ5QUN5ZQAAAAALZmVlUmVjZWl2ZXICAAAAIzNONjV4THE4SmNDZWFFaVIxVEpRN2RCcVhCdkV5NkU0OFd6AAAAAAhjZXJ0RGFwcAIAAAAjM014Y1hyTmJNWktZYVNyaGNmZU1tMmhabkJlQ3UzeVJXc3cAAAAACHVzZXJEYXBwCQEAAAAFdmFsdWUAAAABCQAEJgAAAAECAAAAIzNOOWNRZ1pGUEhIVnU4d3FzbjJEa1FGZWhnM2g4Q05pb29BAAAAAA13aGl0ZWxpc3REYXBwCQEAAAAFdmFsdWUAAAABCQAEJgAAAAECAAAAIzNOOXhaWUdwek1GRFh2WHVjdG1VNnpWOHFTem0yWmZGMzFmAAAAAAtVU0ROQXNzZXRJZAEAAAAgAIUpTOkTLqoXmGxvzdEleYQFDyLlDcuqJGsbsu9ZirwAAAAABm93bmVycwkABEwAAAACCQAEHQAAAAIFAAAACW9yYWNsZUZlZQIAAAAGb3duZXIxCQAETAAAAAIJAAQdAAAAAgUAAAAJb3JhY2xlRmVlAgAAAAZvd25lcjIFAAAAA25pbAAAAAAQVVNETkZpcnN0U2VsbEN1dAAAAAAAAAAAlgAAAAARVVNETlNlY29uZFNlbGxDdXQAAAAAAAAAAB4AAAAAEm9yaWdpbmFsQ3JlYXRvckN1dAAAAAAAAAAARgAAAAALZGFwcFJ1bm5pbmcJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQbAAAAAgUAAAAIdXNlckRhcHACAAAAFGNvbmZfZGFwcF9pc19ydW5uaW5nBgAAAAAObWFpbnRlbmFuY2VNU0cJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQdAAAAAgUAAAAIdXNlckRhcHACAAAAFGNvbmZfbWFpbnRlbmFuY2VfbXNnAgAAAAAAAAAADXVzZXJTdXNwZW5kZWQCAAAACVNVU1BFTkRFRAAAAAALdXNlclJl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X3ByaWNlXwUAAAAFYXJ0SWQCAAAAAV8FAAAABmNhbGxlcgEAAAASa2V5QXNzZXRJZEFjY2VwdGVkAAAAAgAAAAZjYWxsZXIAAAAFYXJ0SWQJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAEmFydF9hc3NldEFjY2VwdGVkXwUAAAAFYXJ0SWQCAAAAAV8FAAAABmNhbGxlcgEAAAARa2V5SGFzaEJ5VHhpZEFkZHIAAAACAAAABmNhbGxlcgAAAAR0eGlkCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAABNnZXRfaGFzaGJ5dHhpZGFkZHJfBQAAAAR0eGlkAgAAAAFfBQAAAAZjYWxsZXIBAAAADmtleU93bmVyQnlIYXNoAAAAAQAAAApzaGEyNTZIYXNoCQABLAAAAAICAAAAEmdldF9vd25lcl9ieV9oYXNoXwUAAAAKc2hhMjU2SGFzaAEAAAASa2V5VHhpZEJ5SGFzaE93bmVyAAAAAgAAAApzaGEyNTZIYXNoAAAABmNhbGxlcgkAASwAAAACAgAAABdnZXRfdHhpZF9ieV9oYXNoX293bmVyXwkAAlgAAAABCQALVAAAAAEJAAGbAAAAAQkAASwAAAACBQAAAApzaGEyNTZIYXNoBQAAAAZjYWxsZXIAAAAAGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UJAQAAABlnZXRJbnRlZ2VyQnlLZXlGcm9tT3JhY2xlAAAAAQkAASwAAAACAgAAABJjZXJ0aWZpY2F0aW9uX2ZlZV8JAAJYAAAAAQUAAAALVVNETkFzc2V0SWQBAAAAEGdldEFtb3VudEJ5QmlkSWQAAAABAAAABWJpZElkCQEAAAALdmFsdWVPckVsc2UAAAACCQEAAAAPZ2V0SW50ZWdlckJ5S2V5AAAAAQkBAAAACGtleUJpZElkAAAAAQUAAAAFYmlkSWQAAAAAAAAAAAABAAAAGmdldEFtb3VudEhpZ2hlc3RCaWRCeUFydElkAAAAAQAAAAVhcnRJZAQAAAAFYmlkSWQJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAABJrZXlIaWdoZXN0QmlkQmlkSWQAAAABBQAAAAVhcnRJZAMJAAAAAAAAAgUAAAAFYmlkSWQCAAAAAAAAAAAAAAAAAAkBAAAAEGdldEFtb3Vu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AAUZAAAABwUAAAAIdG90YWxORlQFAAAAC2FydHdvcmtOYW1lBQAAAAphbW91bnRTb2xkBQAAAAxhcnR3b3JrUHJpY2UFAAAADHByaWNlQXNzZXRJZAUAAAAKbWF4Q2FuU2VsbAUAAAAIaXNPblNhbGUBAAAACmdldEJpZERhdGEAAAAJAAAAAWkAAAAGY2FsbGVyAAAABmlzc3VlcgAAAAVhcnRJZAAAAAhiaWRPd25lcgAAAAViaWRJZAAAAAxwcmljZUFzc2V0SWQAAAAMYXJ0d29ya1ByaWNlAAAABWlzQmlkBAAAAAljaGVja1VzZXIJAQAAAAx2YWxpZGF0ZVVzZXIAAAABBQAAAAZpc3N1ZXIDAwUAAAAFaXNCaWQJAQAAAAIhPQAAAAIFAAAACWNoZWNrVXNlcgIAAAAABwkAAAIAAAABBQAAAAljaGVja1VzZXIEAAAACmJpZERhdGFLZXkJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAEYmlkXwUAAAAFYXJ0SWQCAAAAAV8FAAAABmlzc3VlcgIAAAABXwUAAAAIYmlkT3duZXICAAAAAV8FAAAABWJpZElkBAAAAAx0MDEzNTE5MTM2NDgDBQAAAAVpc0JpZAkBAAAAFmdldFByaWNlQXNzZXRJZEZyb21CaWQAAAABBQAAAApiaWREYXRhS2V5CQEAAAAUdmFsaWRhdGVQcmljZUFzc2V0SWQAAAADBQAAAAFpBQAAAAxwcmljZUFzc2V0SWQFAAAADGFydHdvcmtQcmljZQQAAAAGYW1vdW50CAUAAAAMdDAxMzUxOTEzNjQ4AAAAAl8xBAAAAAdhc3NldElkCAUAAAAMdDAxMzUxOTEzNjQ4AAAAAl8yCQAFFQAAAAMFAAAACmJpZERhdGFLZXkFAAAABmFtb3VudAUAAAAHYXNzZXRJZAEAAAARZ2V0Q29tbWlzc2lvbkRhdGEAAAAFAAAABmlzc3VlcgAAAAdhc3NldElkAAAABmFtb3VudAAAAAphbW91bnRTb2xkAAAACm1heENhblNlbGwEAAAADWlzV2hpdGVsaXN0ZWQJAQAAAA5jaGVja1doaXRlbGlzdAAAAAEFAAAABmlzc3VlcgQAAAADY3V0AwkAAGYAAAAC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ckRhdGUAAAABBQAAAAFpBAAAAAJpZAgFAAAACmNhbGxlckRhdGEAAAACXzEEAAAABmNhbGxlcggFAAAACmNhbGxlckRhdGEAAAACXzIEAAAABGRhdGUIBQAAAApjYWxsZXJEYXRhAAAAAl8zBAAAAAdhcnREYXRhCQEAAAAKZ2V0QXJ0RGF0YQAAAAQFAAAAAWkFAAAABmlzc3VlcgUAAAAFYXJ0SWQFAAAABWlzQmlkBAAAAAh0b3RhbE5GVAgFAAAAB2FydERhdGEAAAACXzEEAAAAC2FydHdvcmtOYW1lCAUAAAAHYXJ0RGF0YQAAAAJfMgQAAAAKYW1vdW50U29sZAgFAAAAB2FydERhdGEAAAACXzMEAAAADGFydHdvcmtQcmljZQgFAAAAB2FydERhdGEAAAACXzQEAAAADHByaWNlQXNzZXRJZAgFAAAAB2FydERhdGEAAAACXzUEAAAACm1heENhblNlbGwIBQAAAAdhcnREYXRhAAAAAl82BAAAAAhpc09uU2FsZQgFAAAAB2FydERhdGEAAAACXzcEAAAAB2JpZERhdGEJAQAAAApnZXRCaWREYXRhAAAACQUAAAABaQUAAAAGY2FsbGVyBQAAAAZpc3N1ZXIFAAAABWFydElkBQAAAAhiaWRPd25lcgUAAAAFYmlkSWQFAAAADHByaWNlQXNzZXRJZAUAAAAMYXJ0d29ya1ByaWNlBQAAAAVpc0JpZAQAAAAKYmlkRGF0YUtleQgFAAAAB2JpZERhdGEAAAACXzEEAAAABmFtb3VudAgFAAAAB2JpZERhdGEAAAACXzIEAAAAB2Fzc2V0SWQIBQAAAAdiaWREYXRhAAAAAl8zBAAAAA1jb21taXNpb25EYXRhCQEAAAARZ2V0Q29tbWlzc2lvbkRhdGEAAAAFBQAAAAZpc3N1ZXIJAQAAAAV2YWx1ZQAAAAEFAAAAB2Fzc2V0SWQFAAAABmFtb3VudAUAAAAKYW1vdW50U29sZAUAAAAKbWF4Q2FuU2VsbAQAAAAPYW1vdW50Rm9yU2NvbmV4CAUAAAANY29tbWlzaW9uRGF0YQAAAAJfMQQAAAAQYW1vdW50Rm9yQ3JlYXRvcggFAAAADWNvbW1pc2lvbkRhdGEAAAACXzIEAAAADW5ld0Ftb3VudFNvbGQIBQAAAA1jb21taXNpb25EYXRh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bnRlZ2VyQnlLZXkAAAABCQEAAAAKa2V5TWF4TWludAAAAAIFAAAABmlzc3VlcgUAAAAFYXJ0SWQEAAAADG9sZEVuZEhlaWdodAkBAAAAD2dldEludGVnZXJCeUtleQAAAAEJAQAAAAxrZXlFbmRIZWlnaHQAAAACBQAAAAZpc3N1ZXIFAAAABWFydElkBAAAAAhkdXJhdGlvbgkBAAAAD2dldEludGVnZXJCeUtleQAAAAEJAQAAAAtrZXlEdXJhdGlvbgAAAAIFAAAABmlzc3VlcgUAAAAFYXJ0SWQEAAAACWVuZEhlaWdodAkAAGQAAAACBQAAAAhkdXJhdGlvbgUAAAAGaGVpZ2h0AwkAAGYAAAACBQAAAAZoZWlnaHQFAAAADG9sZEVuZEhlaWdodAMJAAAAAAAAAgUAAAAKYW1vdW50U29sZAUAAAAKbWF4Q2FuU2VsbAkAAAIAAAABAgAAACZDYW4ndCByZXN0YXJ0IGF1Y3Rpb24sIG1heCBhbW91bnQgc29sZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAADGtleUVuZEhlaWdodAAAAAIFAAAABmlzc3VlcgUAAAAFYXJ0SWQFAAAACWVuZEhlaWdodAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAASa2V5SGlnaGVzdEJpZEJpZElkAAAAAQUAAAAFYXJ0SWQFAAAAA25pbAkAAAIAAAABAgAAACRQcmV2aW91cyBhdWN0aW9uIGlzbid0IGNvbXBsZXRlZCB5ZXQBAAAAFGFjY2VwdEJpZFRyYWRpdGlvbmFsAAAABQAAAAFpAAAABWFydElkAAAABmlzc3VlcgAAAAViaWRJZAAAAAhiaWRPd25lcgQAAAAJZW5kSGVpZ2h0CQEAAAAPZ2V0SW50ZWdlckJ5S2V5AAAAAQkBAAAADGtleUVuZEhlaWdodAAAAAIFAAAABmlzc3VlcgUAAAAFYXJ0SWQEAAAADGhpZ2hlc3RCaWRJZAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAEmtleUhpZ2hlc3RCaWRCaWRJZAAAAAEFAAAABWFydElkAwkAAGYAAAACBQAAAAZoZWlnaHQFAAAACWVuZEhlaWdodAMJAAAAAAAAAgUAAAAFYmlkSWQFAAAADGhp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AQAAABFzZXRCaWRUcmFkaXRpb25hbAAAAAMFAAAAAWkFAAAABWFydElkBQAAAAZpc3N1ZXIJAAACAAAAAQkAASwAAAACCQABLAAAAAICAAAAFlVua25vd24gYXVjdGlvbiB0eXBlIDoFAAAAC2F1Y3Rpb25UeXBlAgAAABssIHBsZWFzZSBjb250YWN0IHRoZSBhZG1pbnMAAAABaQEAAAAJYWNjZXB0QmlkAAAABAAAAAVhcnRJZAAAAAZpc3N1ZXIAAAAFYmlkSWQAAAAIYmlkT3duZXIEAAAAC2F1Y3Rpb25UeXBlCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAAOa2V5QXVjdGlvblR5cGUAAAACBQAAAAZpc3N1ZXIFAAAABWFydElkAwkAAAAAAAACBQAAAAthdWN0aW9uVHlwZQUAAAAMYXVjdGlvblR5cGUxCQEAAAAXYWNjZXB0QmlkTm9uVHJhZGl0aW9uYWwAAAAFBQAAAAFpBQAAAAVhcnRJZAUAAAAGaXNzdWVyBQAAAAViaWRJZAUAAAAIYmlkT3duZXIDCQAAAAAAAAIFAAAAC2F1Y3Rpb25UeXBlBQAAAAxhdWN0aW9uVHlwZTIJAQAAABRhY2NlcHRCaWRUcmFkaXRpb25hbAAAAAUFAAAAAWkFAAAABWFydElkBQAAAAZpc3N1ZXIFAAAABWJpZElkBQAAAAhiaWRPd25lcgkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAWVW5rbm93biBhdWN0aW9uIHR5cGUgOgUAAAALYXVjdGlvblR5cGUCAAAAGywgcGxlYXNlIGNvbnRhY3QgdGhlIGFkbWlucwAAAAFpAQAAAAljYW5jZWxCaWQAAAADAAAABWFydElkAAAABmlzc3VlcgAAAAViaWRJZAQAAAALYXVjdGlvblR5cGUJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAAA5rZXlBdWN0aW9uVHlwZQAAAAIFAAAABmlzc3VlcgUAAAAFYXJ0SWQDCQAAAAAAAAIFAAAAC2F1Y3Rpb25UeXBlBQAAAAxhdWN0aW9uVHlwZTEJAQAAAA1jYW5jZWxCaWRJbXBsAAAABAUAAAABaQUAAAAFYXJ0SWQFAAAABmlzc3VlcgUAAAAFYmlkSWQJAQAAABhjYW5jZWxCaWRJbXBsVHJhZGl0aW9uYWwAAAAEBQAAAAFpBQAAAAVhcnRJZAUAAAAGaXNzdWVyBQAAAAViaWRJZAAAAAAPVw8g", "height": 1734174, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: BTWWj5ACCiSgaVYEYa2NnMrWD4jxqBHnKo9SeHinVfeL Next: 2mFEyMVbvC1WJvi4f5V7USxJcULDZZAK6DjDFFtacPUY Diff:
OldNewDifferences
77
88 let feeReceiver = "3N65xLq8JcCeaEiR1TJQ7dBqXBvEy6E48Wz"
99
10+let certDapp = "3MxcXrNbMZKYaSrhcfeMm2hZnBeCu3yRWsw"
11+
1012 let userDapp = value(addressFromString("3N9cQgZFPHHVu8wqsn2DkQFehg3h8CNiooA"))
1113
1214 let whitelistDapp = value(addressFromString("3N9xZYGpzMFDXvXuctmU6zV8qSzm2ZfF31f"))
1315
14-let sconexAssetId = base58'DZ8ALmuLeSZ2ocsYLAcL9MiXBFDbMNQG9LtitREyU5ZC'
16+let USDNAssetId = base58'132maRL3uF35tc2bpRih9D6MYq5DR6H28zkop786dKyu'
1517
16-let owner = "3N1Dhq5ZZyoojQisuTLusYjnGisqrxDwGLy"
18+let owners = [getString(oracleFee, "owner1"), getString(oracleFee, "owner2")]
1719
18-let sconexFirstSellCut = 150
20+let USDNFirstSellCut = 150
21+
22+let USDNSecondSellCut = 30
23+
24+let originalCreatorCut = 70
1925
2026 let dappRunning = valueOrElse(getBoolean(userDapp, "conf_dapp_is_running"), true)
2127
3339
3440 let auctionType2 = "TRADITIONAL"
3541
42+func getStringByKeyFromUsers (key) = valueOrElse(getString(userDapp, key), "")
43+
44+
3645 func getStringByKey (key) = valueOrElse(getString(this, key), "")
46+
47+
48+func getStringByKeyOrError (key,error) = valueOrErrorMessage(getString(this, key), error)
3749
3850
3951 func getIntegerByKeyFromOracle (key) = valueOrErrorMessage(getInteger(oracleFee, key), "Integer undefine or 0 in oracle")
4658
4759
4860 func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
61+
62+
63+func validateHash (hash) = (size(hash) == 64)
4964
5065
5166 func keyUserStatus (caller) = ("user_status_" + caller)
117132 func keyTxidByHashOwner (sha256Hash,caller) = ("get_txid_by_hash_owner_" + toBase58String(sha256_16Kb(toBytes((sha256Hash + caller)))))
118133
119134
120-let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(sconexAssetId)))
135+let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(USDNAssetId)))
121136
122137 func getAmountByBidId (bidId) = valueOrElse(getIntegerByKey(keyBidId(bidId)), 0)
123138
124139
125140 func getAmountHighestBidByArtId (artId) = {
126- let bidId = valueOrElse(getStringByKey(keyHighestBidBidId(artId)), "")
141+ let bidId = getStringByKey(keyHighestBidBidId(artId))
127142 if ((bidId == ""))
128143 then 0
129144 else getAmountByBidId(bidId)
157172 then throw(checkUser)
158173 else if ((size(cidDisplay) == 0))
159174 then throw("Display CID cannot be empty")
160- else if (!(validateString(name, 100)))
161- then throw("100 Char. max name")
162- else if (!(validateString(description, 1000)))
163- then throw("1000 Char. max description")
164- else if ((size(split(tags, ",")) > 5))
165- then throw("5 tags max.")
166- else ""
175+ else if ((size(cidDisplay) != 46))
176+ then throw("This doesn't seem a valid CID!")
177+ else if (!(validateString(name, 100)))
178+ then throw("100 Char. max name")
179+ else if (!(validateString(description, 1000)))
180+ then throw("1000 Char. max description")
181+ else if ((size(split(tags, ",")) > 5))
182+ then throw("5 tags max.")
183+ else ""
167184 }
168185
169186
181198 let payment = t089829018._1
182199 let amount = t089829018._2
183200 let assetId = if (if (isDefined(payment.assetId))
184- then (payment.assetId == sconexAssetId)
201+ then (payment.assetId == USDNAssetId)
185202 else false)
186203 then payment.assetId
187- else throw("Only Sconex token accepted as transaction fee")
204+ else throw("Only USDN token accepted as transaction fee")
188205 if ((amount != currentCertificationPrice))
189- then throw(("Payment amount should be " + toString(currentCertificationPrice)))
206+ then throw(((("Payment amount should be " + toString(currentCertificationPrice)) + " but is: ") + toString(amount)))
190207 else $Tuple2(amount, assetId)
191208 }
209+
210+
211+func isArtMinted (addrToUse,artId) = match getInteger(this, keyIssued(addrToUse, artId)) {
212+ case b: Int =>
213+ if ((b != 0))
214+ then true
215+ else false
216+ case _ =>
217+ false
218+}
192219
193220
194221 func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
212239 }
213240
214241
215-func acceptedAssetIds (assetId) = if ((assetId != toBase58String(sconexAssetId)))
216- then throw("Only Sconex accepted")
242+func acceptedAssetIds (assetId) = if ((assetId != toBase58String(USDNAssetId)))
243+ then throw("Only USDN accepted")
217244 else true
218245
219246
221248 let minSellSconex = if (unitTest)
222249 then 1
223250 else (currentCertificationPrice * 2)
224- if (if (if ((assetId == toBase58String(sconexAssetId)))
251+ if (if (if ((assetId == toBase58String(USDNAssetId)))
225252 then (minSellSconex > price)
226253 else false)
227254 then (price != 0)
232259
233260
234261 func getBidAssetId (assetId) = if ((assetId == "WAVES"))
235- then throw("Only sconex is accepted!")
262+ then throw("Only USDN is accepted!")
236263 else fromBase58String(assetId)
237264
238265
256283 else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
257284
258285
286+func isBidCheck (i,issuer,bidOwner,bidId) = if (if (if ((toBase58String(i.caller.bytes) == issuer))
287+ then (bidOwner != "")
288+ else false)
289+ then (bidId != "")
290+ else false)
291+ then true
292+ else false
293+
294+
259295 func getArtData (i,issuer,artId,isBid) = {
260296 let callerIsIssuer = (toBase58String(i.caller.bytes) == issuer)
261297 let totalNFT = getIntegerByKey("total_nft_issued")
267303 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
268304 let artworkPrice = valueOrElse(getIntegerByKey(keyPrice(issuer, artId)), (currentCertificationPrice * 2))
269305 let priceAssetId = if (callerIsIssuer)
270- then toBase58String(sconexAssetId)
306+ then toBase58String(USDNAssetId)
271307 else getStringByKey(keyAssetIdAccepted(issuer, artId))
272308 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
273309 if (if (if (!(isBid))
313349 let isWhitelisted = checkWhitelist(issuer)
314350 let cut = if ((isWhitelisted > height))
315351 then 0
316- else if ((assetId == sconexAssetId))
317- then sconexFirstSellCut
318- else throw("Only Sconex is accepted!")
352+ else if ((assetId == USDNAssetId))
353+ then USDNFirstSellCut
354+ else throw("Only USDN is accepted!")
319355 let amountForSconex = fraction(amount, cut, 1000)
320356 let amountForCreator = (amount - amountForSconex)
321357 if ((amountSold == maxCanSell))
329365
330366 func getIssueData (issuer,artId,artworkName,newAmountSold,maxCanSell,totalNFT,caller,bidOwner,bidId,i,isOnSale) = {
331367 let issueMeta = ((((((((("Creator: " + issuer) + ",ArtID: ") + artId) + ",Artwork name: ") + artworkName) + ",Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
332- let issueNFT = Issue(("SCONEX_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
333- let idNFT = calculateAssetId(issueNFT)
334368 let sellStatus = if (if ((newAmountSold == maxCanSell))
335369 then true
336370 else !(isOnSale))
339373 let receiveNFT = if ((bidOwner != ""))
340374 then addressFromStringValue(bidOwner)
341375 else i.caller
342- $Tuple4(issueNFT, idNFT, sellStatus, receiveNFT)
376+ $Tuple3(sellStatus, receiveNFT, issueMeta)
343377 }
378+
379+
380+func calculateRarity (mintIndex) = if ((4 > mintIndex))
381+ then "SSR"
382+ else if ((11 > mintIndex))
383+ then "SR"
384+ else if ((101 > mintIndex))
385+ then "R"
386+ else "N"
344387
345388
346389 func getBidKeyVal (assetId,bidDataKey,date) = {
347390 let assetIdBid = if (!(isDefined(assetId)))
348- then throw("Only sconex is accepted")
391+ then throw("Only USDN is accepted")
349392 else toBase58String(value(assetId))
350393 let bidData = getStringByKey((bidDataKey + "_OPEN"))
351394 let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
376419 let amountForCreator = commisionData._2
377420 let newAmountSold = commisionData._3
378421 let issuerData = getIssueData(issuer, artId, artworkName, newAmountSold, maxCanSell, totalNFT, caller, bidOwner, bidId, i, isOnSale)
379- let issueNFT = issuerData._1
380- let idNFT = issuerData._2
381- let sellStatus = issuerData._3
382- let receiveNFT = issuerData._4
383- let bidKeyValue = getBidKeyVal(assetId, bidDataKey, date)
384- let assetIdBid = bidKeyValue._1
385- let bidDelOld = bidKeyValue._2
386- let bidUpdate = bidKeyValue._3
387- let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
388- let soldValue = if (!(isBid))
389- then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
390- else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
391- let soldData = StringEntry(soldKey, soldValue)
392- 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)]
393- if (isBid)
394- then (((buyRes :+ soldData) :+ bidUpdate) :+ bidDelOld)
395- else soldData :: buyRes
422+ let sellStatus = issuerData._1
423+ let receiveNFT = issuerData._2
424+ let issueMeta = issuerData._3
425+ let idNFTInvoke = invoke(this, "mintNft", [totalNFT, issueMeta, toString(receiveNFT)], nil)
426+ if ((idNFTInvoke == idNFTInvoke))
427+ then {
428+ let idNFT = match idNFTInvoke {
429+ case r: String =>
430+ r
431+ case _ =>
432+ throw("Incorrect invoke result")
433+ }
434+ let bidKeyValue = getBidKeyVal(assetId, bidDataKey, date)
435+ let assetIdBid = bidKeyValue._1
436+ let bidDelOld = bidKeyValue._2
437+ let bidUpdate = bidKeyValue._3
438+ let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
439+ let rarity = calculateRarity(newAmountSold)
440+ let soldValue = if (!(isBid))
441+ then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + idNFT)
442+ else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + idNFT)
443+ let soldData = StringEntry(soldKey, soldValue)
444+ let buyRes = [IntegerEntry(keyIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + idNFT), soldKey), StringEntry(("nft_rarity_" + idNFT), rarity), IntegerEntry("total_nft_issued", (totalNFT + 1)), BooleanEntry(keyOnSale(issuer, artId), sellStatus), ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId), ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSconex, assetId), StringEntry(KeyNftIssuer(idNFT), issuer)]
445+ let res = invoke(addressFromStringValue(certDapp), "createCert", [toString(receiveNFT), idNFT, issuer], nil)
446+ if ((res == res))
447+ then if (isBid)
448+ then (((buyRes :+ soldData) :+ bidUpdate) :+ bidDelOld)
449+ else soldData :: buyRes
450+ else throw("Strict value is not equal to itself.")
451+ }
452+ else throw("Strict value is not equal to itself.")
396453 }
397454
398455
405462 let payment = t02775227788._1
406463 let amount = t02775227788._2
407464 let assetId = if (!(isDefined(payment.assetId)))
408- then throw("Only sconex is accepted!")
465+ then throw("Only USDN is accepted!")
409466 else toBase58String(value(payment.assetId))
410467 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
411468 if (!(acceptedAssetIds(assetId)))
438495 let payment = isPaymentVar._1
439496 let amount = isPaymentVar._2
440497 if ((highestBid >= amount))
441- then throw(("Please place a bid higher then: " + toString(highestBid)))
498+ then throw(("Please place a bid higher than: " + toString(highestBid)))
442499 else {
443500 let assetId = if (!(isDefined(payment.assetId)))
444- then throw("Only sconex is accepted!")
501+ then throw("Only USDN is accepted!")
445502 else toBase58String(value(payment.assetId))
446503 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
447504 if (!(acceptedAssetIds(assetId)))
506563 let date = t02894229094._3
507564 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
508565 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + bidId)
509- let bidData = getStringByKey((bidDataKey + "_OPEN"))
510- if ((bidData == ""))
511- then throw("Bid not found")
512- else {
513- let bidDataArr = split(bidData, "_")
514- let assetId = getBidAssetId(bidDataArr[0])
515- let bidStatus = "CANCELED"
566+ let bidData = getStringByKeyOrError((bidDataKey + "_OPEN"), "Bid not found")
567+ let bidDataArr = split(bidData, "_")
568+ let assetId = getBidAssetId(bidDataArr[0])
569+ let bidStatus = "CANCELED"
516570 [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(caller)), parseIntValue(bidDataArr[1]), assetId)]
517- }
518571 }
519572
520573
525578 let date = t02894229094._3
526579 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
527580 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + bidId)
528- let bidData = getStringByKey((bidDataKey + "_OPEN"))
529- if ((bidData == ""))
530- then throw("Bid not found")
531- else {
532- let bidDataArr = split(bidData, "_")
533- let assetId = getBidAssetId(bidDataArr[0])
534- let bidStatus = "CANCELED"
535- let bidAmount = parseIntValue(bidDataArr[1])
536- let highestBidId = getStringByKey(keyHighestBidBidId(artId))
537- if ((bidId == highestBidId))
538- then throw("You can't cancel the highest bid!")
539- else [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(caller)), bidAmount, assetId)]
540- }
581+ let bidData = getStringByKeyOrError((bidDataKey + "_OPEN"), "Bid not found")
582+ let bidDataArr = split(bidData, "_")
583+ let assetId = getBidAssetId(bidDataArr[0])
584+ let bidStatus = "CANCELED"
585+ let bidAmount = parseIntValue(bidDataArr[1])
586+ let highestBidId = getStringByKey(keyHighestBidBidId(artId))
587+ if ((bidId == highestBidId))
588+ then throw("You can't cancel the highest bid!")
589+ else [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(caller)), bidAmount, assetId)]
541590 }
591+
592+
593+@Callable(i)
594+func mintNft (totalNFT,issueMeta,receiveNFT) = if ((i.caller == this))
595+ then {
596+ let receiveNFTAddy = Address(fromBase58String(receiveNFT))
597+ let issueNFT = Issue(("SCONEX_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
598+ let idNFT = calculateAssetId(issueNFT)
599+ $Tuple2([issueNFT, ScriptTransfer(receiveNFTAddy, 1, idNFT)], toBase58String(idNFT))
600+ }
601+ else throw("Only the dApp can mint NFT's")
602+
542603
543604
544605 @Callable(i)
563624 else {
564625 let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
565626 if ((hashExist != ""))
566- then throw("Hash already registered")
627+ then throw("This hash is already registered")
567628 else [StringEntry(keyOwnerByHash(sha256Hash), caller), StringEntry(keyTxidByHashOwner(sha256Hash, caller), artId), IntegerEntry(keyDate(caller, artId), date), StringEntry(keyName(caller, artId), name), StringEntry(keyDesc(caller, artId), description), StringEntry(keyDisplayCid(caller, artId), cidDisplay), StringEntry(keyType(caller, artId), type), StringEntry(keyTags(caller, artId), tags), IntegerEntry(keyMaxMint(caller, artId), 0), IntegerEntry(keyIssued(caller, artId), 0), BooleanEntry(keyOnSale(caller, artId), false), StringEntry(keyHashByTxidAddr(caller, artId), sha256Hash), StringEntry(keyEntitlement(caller, artId), entitlement), ScriptTransfer(Address(fromBase58String(feeReceiver)), amount, assetId)]
568629 }
569630 }
579640 let caller = t02571425747._2
580641 let artworkName = getStringByKey(keyName(caller, artId))
581642 if (!(containsElement([auctionType1, auctionType2], auctionType)))
582- then throw("We dont know this auction type")
643+ then throw("We don't know this auction type")
583644 else if ((artworkName == ""))
584645 then throw("This art doesn't match your account")
585646 else {
595656 else {
596657 let amountSold = getIntegerByKey(keyIssued(caller, artId))
597658 let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
598- if ((maxMint > 10))
599- then throw("10 editions max per artwork")
659+ if ((maxMint > 101))
660+ then throw("101 editions max per artwork")
600661 else if (if ((amountSold != 0))
601662 then (amountSold == maxCanSell)
602663 else false)
633694 @Callable(i)
634695 func deleteEntry (entry) = {
635696 let caller = toString(addressFromPublicKey(i.callerPublicKey))
636- if ((caller == owner))
697+ if (containsElement(owners, caller))
637698 then [DeleteEntry(entry)]
638699 else throw("no")
639700 }
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
10+let certDapp = "3MxcXrNbMZKYaSrhcfeMm2hZnBeCu3yRWsw"
11+
1012 let userDapp = value(addressFromString("3N9cQgZFPHHVu8wqsn2DkQFehg3h8CNiooA"))
1113
1214 let whitelistDapp = value(addressFromString("3N9xZYGpzMFDXvXuctmU6zV8qSzm2ZfF31f"))
1315
14-let sconexAssetId = base58'DZ8ALmuLeSZ2ocsYLAcL9MiXBFDbMNQG9LtitREyU5ZC'
16+let USDNAssetId = base58'132maRL3uF35tc2bpRih9D6MYq5DR6H28zkop786dKyu'
1517
16-let owner = "3N1Dhq5ZZyoojQisuTLusYjnGisqrxDwGLy"
18+let owners = [getString(oracleFee, "owner1"), getString(oracleFee, "owner2")]
1719
18-let sconexFirstSellCut = 150
20+let USDNFirstSellCut = 150
21+
22+let USDNSecondSellCut = 30
23+
24+let originalCreatorCut = 70
1925
2026 let dappRunning = valueOrElse(getBoolean(userDapp, "conf_dapp_is_running"), true)
2127
2228 let maintenanceMSG = valueOrElse(getString(userDapp, "conf_maintenance_msg"), "")
2329
2430 let userSuspended = "SUSPENDED"
2531
2632 let userRemoved = "REMOVED"
2733
2834 let userUnregistered = "UNREGISTERED"
2935
3036 let userAllowed = "ALLOWED"
3137
3238 let auctionType1 = "BIDTYPE"
3339
3440 let auctionType2 = "TRADITIONAL"
3541
42+func getStringByKeyFromUsers (key) = valueOrElse(getString(userDapp, key), "")
43+
44+
3645 func getStringByKey (key) = valueOrElse(getString(this, key), "")
46+
47+
48+func getStringByKeyOrError (key,error) = valueOrErrorMessage(getString(this, key), error)
3749
3850
3951 func getIntegerByKeyFromOracle (key) = valueOrErrorMessage(getInteger(oracleFee, key), "Integer undefine or 0 in oracle")
4052
4153
4254 func getIntegerByKey (key) = valueOrElse(getInteger(this, key), 0)
4355
4456
4557 func checkWhitelist (key) = valueOrElse(getInteger(whitelistDapp, key), 0)
4658
4759
4860 func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
61+
62+
63+func validateHash (hash) = (size(hash) == 64)
4964
5065
5166 func keyUserStatus (caller) = ("user_status_" + caller)
5267
5368
5469 func keyDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
5570
5671
5772 func keyName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
5873
5974
6075 func keyDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
6176
6277
6378 func keyDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
6479
6580
6681 func keyMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
6782
6883
6984 func keyMinPrice (caller,artId) = ((("art_minprice_" + artId) + "_") + caller)
7085
7186
7287 func keyHighestBidBidId (artId) = ("art_highestBidBidId_" + artId)
7388
7489
7590 func keyBidId (bidId) = ("bid_" + bidId)
7691
7792
7893 func keyDuration (caller,artId) = ((("art_duration_" + artId) + "_") + caller)
7994
8095
8196 func keyEndHeight (caller,artId) = ((("art_endheight_" + artId) + "_") + caller)
8297
8398
8499 func keyAuctionType (caller,artId) = ((("art_auctiontype_" + artId) + "_") + caller)
85100
86101
87102 func keyIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
88103
89104
90105 func KeyNftIssuer (nftId) = ("nft_issued_" + nftId)
91106
92107
93108 func keyOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
94109
95110
96111 func keyEntitlement (caller,artId) = ((("art_entitlement_" + artId) + "_") + caller)
97112
98113
99114 func keyTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
100115
101116
102117 func keyType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
103118
104119
105120 func keyPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
106121
107122
108123 func keyAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
109124
110125
111126 func keyHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
112127
113128
114129 func keyOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
115130
116131
117132 func keyTxidByHashOwner (sha256Hash,caller) = ("get_txid_by_hash_owner_" + toBase58String(sha256_16Kb(toBytes((sha256Hash + caller)))))
118133
119134
120-let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(sconexAssetId)))
135+let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(USDNAssetId)))
121136
122137 func getAmountByBidId (bidId) = valueOrElse(getIntegerByKey(keyBidId(bidId)), 0)
123138
124139
125140 func getAmountHighestBidByArtId (artId) = {
126- let bidId = valueOrElse(getStringByKey(keyHighestBidBidId(artId)), "")
141+ let bidId = getStringByKey(keyHighestBidBidId(artId))
127142 if ((bidId == ""))
128143 then 0
129144 else getAmountByBidId(bidId)
130145 }
131146
132147
133148 func validateString (str,max) = if ((size(str) == 0))
134149 then throw("Field cannot be is empty")
135150 else if ((size(str) > max))
136151 then throw((str + " is too long"))
137152 else true
138153
139154
140155 func validateUser (caller) = {
141156 let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
142157 if (if ((userStatus == userUnregistered))
143158 then true
144159 else (userStatus == userAllowed))
145160 then "Register this account first with 'Account' tab"
146161 else if ((userStatus == userSuspended))
147162 then "Account suspended"
148163 else if ((userStatus == userRemoved))
149164 then "Account removed"
150165 else ""
151166 }
152167
153168
154169 func validateArtworkData (caller,cidDisplay,name,description,tags) = {
155170 let checkUser = validateUser(caller)
156171 if ((checkUser != ""))
157172 then throw(checkUser)
158173 else if ((size(cidDisplay) == 0))
159174 then throw("Display CID cannot be empty")
160- else if (!(validateString(name, 100)))
161- then throw("100 Char. max name")
162- else if (!(validateString(description, 1000)))
163- then throw("1000 Char. max description")
164- else if ((size(split(tags, ",")) > 5))
165- then throw("5 tags max.")
166- else ""
175+ else if ((size(cidDisplay) != 46))
176+ then throw("This doesn't seem a valid CID!")
177+ else if (!(validateString(name, 100)))
178+ then throw("100 Char. max name")
179+ else if (!(validateString(description, 1000)))
180+ then throw("1000 Char. max description")
181+ else if ((size(split(tags, ",")) > 5))
182+ then throw("5 tags max.")
183+ else ""
167184 }
168185
169186
170187 func isPayment (i) = if ((size(i.payments) == 0))
171188 then throw("No payment attached")
172189 else {
173190 let payment = value(i.payments[0])
174191 let amount = value(payment.amount)
175192 $Tuple2(payment, amount)
176193 }
177194
178195
179196 func validatePayment (i) = {
180197 let t089829018 = isPayment(i)
181198 let payment = t089829018._1
182199 let amount = t089829018._2
183200 let assetId = if (if (isDefined(payment.assetId))
184- then (payment.assetId == sconexAssetId)
201+ then (payment.assetId == USDNAssetId)
185202 else false)
186203 then payment.assetId
187- else throw("Only Sconex token accepted as transaction fee")
204+ else throw("Only USDN token accepted as transaction fee")
188205 if ((amount != currentCertificationPrice))
189- then throw(("Payment amount should be " + toString(currentCertificationPrice)))
206+ then throw(((("Payment amount should be " + toString(currentCertificationPrice)) + " but is: ") + toString(amount)))
190207 else $Tuple2(amount, assetId)
191208 }
209+
210+
211+func isArtMinted (addrToUse,artId) = match getInteger(this, keyIssued(addrToUse, artId)) {
212+ case b: Int =>
213+ if ((b != 0))
214+ then true
215+ else false
216+ case _ =>
217+ false
218+}
192219
193220
194221 func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
195222 let t096119647 = isPayment(i)
196223 let payment = t096119647._1
197224 let amount = t096119647._2
198225 let assetId = if (!(isDefined(payment.assetId)))
199226 then throw("Wrong asset id")
200227 else if (if ((size(priceAssetId) > 0))
201228 then (toBase58String(value(payment.assetId)) == priceAssetId)
202229 else false)
203230 then payment.assetId
204231 else throw("Wrong asset id")
205232 if (if ((assetId == unit))
206233 then (priceAssetId != "")
207234 else false)
208235 then throw("Wrong asset id")
209236 else if ((artworkPrice != amount))
210237 then throw(((("Payment don't match " + toString(artworkPrice)) + " ") + toString(amount)))
211238 else $Tuple2(amount, assetId)
212239 }
213240
214241
215-func acceptedAssetIds (assetId) = if ((assetId != toBase58String(sconexAssetId)))
216- then throw("Only Sconex accepted")
242+func acceptedAssetIds (assetId) = if ((assetId != toBase58String(USDNAssetId)))
243+ then throw("Only USDN accepted")
217244 else true
218245
219246
220247 func validateMinSell (assetId,price) = {
221248 let minSellSconex = if (unitTest)
222249 then 1
223250 else (currentCertificationPrice * 2)
224- if (if (if ((assetId == toBase58String(sconexAssetId)))
251+ if (if (if ((assetId == toBase58String(USDNAssetId)))
225252 then (minSellSconex > price)
226253 else false)
227254 then (price != 0)
228255 else false)
229256 then throw(("Wrong minimum sell price " + toString(minSellSconex)))
230257 else true
231258 }
232259
233260
234261 func getBidAssetId (assetId) = if ((assetId == "WAVES"))
235- then throw("Only sconex is accepted!")
262+ then throw("Only USDN is accepted!")
236263 else fromBase58String(assetId)
237264
238265
239266 func getPriceAssetIdFromBid (bidDataKey) = {
240267 let bidData = getStringByKey((bidDataKey + "_OPEN"))
241268 if ((bidData == ""))
242269 then throw("Bid not found")
243270 else {
244271 let bidDataArr = split(bidData, "_")
245272 let bidAmount = parseIntValue(bidDataArr[1])
246273 let bidAssetId = getBidAssetId(bidDataArr[0])
247274 if ((0 >= bidAmount))
248275 then throw("Wrong amount")
249276 else $Tuple2(bidAmount, bidAssetId)
250277 }
251278 }
252279
253280
254281 func idCallerDate (i) = if (!(dappRunning))
255282 then throw(maintenanceMSG)
256283 else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
257284
258285
286+func isBidCheck (i,issuer,bidOwner,bidId) = if (if (if ((toBase58String(i.caller.bytes) == issuer))
287+ then (bidOwner != "")
288+ else false)
289+ then (bidId != "")
290+ else false)
291+ then true
292+ else false
293+
294+
259295 func getArtData (i,issuer,artId,isBid) = {
260296 let callerIsIssuer = (toBase58String(i.caller.bytes) == issuer)
261297 let totalNFT = getIntegerByKey("total_nft_issued")
262298 let artworkName = getStringByKey(keyName(issuer, artId))
263299 if ((artworkName == ""))
264300 then throw("Art doesn't exist")
265301 else {
266302 let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
267303 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
268304 let artworkPrice = valueOrElse(getIntegerByKey(keyPrice(issuer, artId)), (currentCertificationPrice * 2))
269305 let priceAssetId = if (callerIsIssuer)
270- then toBase58String(sconexAssetId)
306+ then toBase58String(USDNAssetId)
271307 else getStringByKey(keyAssetIdAccepted(issuer, artId))
272308 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
273309 if (if (if (!(isBid))
274310 then !(callerIsIssuer)
275311 else false)
276312 then if (if ((0 >= artworkPrice))
277313 then true
278314 else !(isOnSale))
279315 then true
280316 else (0 >= maxCanSell)
281317 else false)
282318 then throw("Art not for sale")
283319 else if (if (if (!(isBid))
284320 then callerIsIssuer
285321 else false)
286322 then (0 >= maxCanSell)
287323 else false)
288324 then throw("Max issuable not set")
289325 else $Tuple7(totalNFT, artworkName, amountSold, artworkPrice, priceAssetId, maxCanSell, isOnSale)
290326 }
291327 }
292328
293329
294330 func getBidData (i,caller,issuer,artId,bidOwner,bidId,priceAssetId,artworkPrice,isBid) = {
295331 let checkUser = validateUser(issuer)
296332 if (if (isBid)
297333 then (checkUser != "")
298334 else false)
299335 then throw(checkUser)
300336 else {
301337 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
302338 let t01351913648 = if (isBid)
303339 then getPriceAssetIdFromBid(bidDataKey)
304340 else validatePriceAssetId(i, priceAssetId, artworkPrice)
305341 let amount = t01351913648._1
306342 let assetId = t01351913648._2
307343 $Tuple3(bidDataKey, amount, assetId)
308344 }
309345 }
310346
311347
312348 func getCommissionData (issuer,assetId,amount,amountSold,maxCanSell) = {
313349 let isWhitelisted = checkWhitelist(issuer)
314350 let cut = if ((isWhitelisted > height))
315351 then 0
316- else if ((assetId == sconexAssetId))
317- then sconexFirstSellCut
318- else throw("Only Sconex is accepted!")
352+ else if ((assetId == USDNAssetId))
353+ then USDNFirstSellCut
354+ else throw("Only USDN is accepted!")
319355 let amountForSconex = fraction(amount, cut, 1000)
320356 let amountForCreator = (amount - amountForSconex)
321357 if ((amountSold == maxCanSell))
322358 then throw("Art sold out")
323359 else {
324360 let newAmountSold = (amountSold + 1)
325361 $Tuple3(amountForSconex, amountForCreator, newAmountSold)
326362 }
327363 }
328364
329365
330366 func getIssueData (issuer,artId,artworkName,newAmountSold,maxCanSell,totalNFT,caller,bidOwner,bidId,i,isOnSale) = {
331367 let issueMeta = ((((((((("Creator: " + issuer) + ",ArtID: ") + artId) + ",Artwork name: ") + artworkName) + ",Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
332- let issueNFT = Issue(("SCONEX_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
333- let idNFT = calculateAssetId(issueNFT)
334368 let sellStatus = if (if ((newAmountSold == maxCanSell))
335369 then true
336370 else !(isOnSale))
337371 then false
338372 else true
339373 let receiveNFT = if ((bidOwner != ""))
340374 then addressFromStringValue(bidOwner)
341375 else i.caller
342- $Tuple4(issueNFT, idNFT, sellStatus, receiveNFT)
376+ $Tuple3(sellStatus, receiveNFT, issueMeta)
343377 }
378+
379+
380+func calculateRarity (mintIndex) = if ((4 > mintIndex))
381+ then "SSR"
382+ else if ((11 > mintIndex))
383+ then "SR"
384+ else if ((101 > mintIndex))
385+ then "R"
386+ else "N"
344387
345388
346389 func getBidKeyVal (assetId,bidDataKey,date) = {
347390 let assetIdBid = if (!(isDefined(assetId)))
348- then throw("Only sconex is accepted")
391+ then throw("Only USDN is accepted")
349392 else toBase58String(value(assetId))
350393 let bidData = getStringByKey((bidDataKey + "_OPEN"))
351394 let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
352395 let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
353396 $Tuple3(assetIdBid, bidDelOld, bidUpdate)
354397 }
355398
356399
357400 func buyMint (i,artId,issuer,bidId,bidOwner,isBid) = {
358401 let callerData = idCallerDate(i)
359402 let id = callerData._1
360403 let caller = callerData._2
361404 let date = callerData._3
362405 let artData = getArtData(i, issuer, artId, isBid)
363406 let totalNFT = artData._1
364407 let artworkName = artData._2
365408 let amountSold = artData._3
366409 let artworkPrice = artData._4
367410 let priceAssetId = artData._5
368411 let maxCanSell = artData._6
369412 let isOnSale = artData._7
370413 let bidData = getBidData(i, caller, issuer, artId, bidOwner, bidId, priceAssetId, artworkPrice, isBid)
371414 let bidDataKey = bidData._1
372415 let amount = bidData._2
373416 let assetId = bidData._3
374417 let commisionData = getCommissionData(issuer, value(assetId), amount, amountSold, maxCanSell)
375418 let amountForSconex = commisionData._1
376419 let amountForCreator = commisionData._2
377420 let newAmountSold = commisionData._3
378421 let issuerData = getIssueData(issuer, artId, artworkName, newAmountSold, maxCanSell, totalNFT, caller, bidOwner, bidId, i, isOnSale)
379- let issueNFT = issuerData._1
380- let idNFT = issuerData._2
381- let sellStatus = issuerData._3
382- let receiveNFT = issuerData._4
383- let bidKeyValue = getBidKeyVal(assetId, bidDataKey, date)
384- let assetIdBid = bidKeyValue._1
385- let bidDelOld = bidKeyValue._2
386- let bidUpdate = bidKeyValue._3
387- let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
388- let soldValue = if (!(isBid))
389- then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
390- else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
391- let soldData = StringEntry(soldKey, soldValue)
392- 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)]
393- if (isBid)
394- then (((buyRes :+ soldData) :+ bidUpdate) :+ bidDelOld)
395- else soldData :: buyRes
422+ let sellStatus = issuerData._1
423+ let receiveNFT = issuerData._2
424+ let issueMeta = issuerData._3
425+ let idNFTInvoke = invoke(this, "mintNft", [totalNFT, issueMeta, toString(receiveNFT)], nil)
426+ if ((idNFTInvoke == idNFTInvoke))
427+ then {
428+ let idNFT = match idNFTInvoke {
429+ case r: String =>
430+ r
431+ case _ =>
432+ throw("Incorrect invoke result")
433+ }
434+ let bidKeyValue = getBidKeyVal(assetId, bidDataKey, date)
435+ let assetIdBid = bidKeyValue._1
436+ let bidDelOld = bidKeyValue._2
437+ let bidUpdate = bidKeyValue._3
438+ let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
439+ let rarity = calculateRarity(newAmountSold)
440+ let soldValue = if (!(isBid))
441+ then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + idNFT)
442+ else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + idNFT)
443+ let soldData = StringEntry(soldKey, soldValue)
444+ let buyRes = [IntegerEntry(keyIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + idNFT), soldKey), StringEntry(("nft_rarity_" + idNFT), rarity), IntegerEntry("total_nft_issued", (totalNFT + 1)), BooleanEntry(keyOnSale(issuer, artId), sellStatus), ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId), ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSconex, assetId), StringEntry(KeyNftIssuer(idNFT), issuer)]
445+ let res = invoke(addressFromStringValue(certDapp), "createCert", [toString(receiveNFT), idNFT, issuer], nil)
446+ if ((res == res))
447+ then if (isBid)
448+ then (((buyRes :+ soldData) :+ bidUpdate) :+ bidDelOld)
449+ else soldData :: buyRes
450+ else throw("Strict value is not equal to itself.")
451+ }
452+ else throw("Strict value is not equal to itself.")
396453 }
397454
398455
399456 func setBidNonTraditional (i,artId,issuer) = {
400457 let t02770927747 = idCallerDate(i)
401458 let id = t02770927747._1
402459 let caller = t02770927747._2
403460 let date = t02770927747._3
404461 let t02775227788 = isPayment(i)
405462 let payment = t02775227788._1
406463 let amount = t02775227788._2
407464 let assetId = if (!(isDefined(payment.assetId)))
408- then throw("Only sconex is accepted!")
465+ then throw("Only USDN is accepted!")
409466 else toBase58String(value(payment.assetId))
410467 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
411468 if (!(acceptedAssetIds(assetId)))
412469 then throw("asset not accepted")
413470 else if (!(validateMinSell(assetId, amount)))
414471 then throw("Wrong min sell")
415472 else {
416473 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
417474 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
418475 if ((0 >= maxCanSell))
419476 then throw("No max edition set for this artwork")
420477 else if ((amountSold >= maxCanSell))
421478 then throw("Sold out, you cannot bid")
422479 else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1))]
423480 }
424481 }
425482
426483
427484 func setBidTraditional (i,artId,issuer) = {
428485 let endHeight = getIntegerByKey(keyEndHeight(issuer, artId))
429486 let highestBid = getAmountHighestBidByArtId(artId)
430487 if ((height > endHeight))
431488 then throw("This auction is finished already!")
432489 else {
433490 let callderData = idCallerDate(i)
434491 let id = callderData._1
435492 let caller = callderData._2
436493 let date = callderData._3
437494 let isPaymentVar = isPayment(i)
438495 let payment = isPaymentVar._1
439496 let amount = isPaymentVar._2
440497 if ((highestBid >= amount))
441- then throw(("Please place a bid higher then: " + toString(highestBid)))
498+ then throw(("Please place a bid higher than: " + toString(highestBid)))
442499 else {
443500 let assetId = if (!(isDefined(payment.assetId)))
444- then throw("Only sconex is accepted!")
501+ then throw("Only USDN is accepted!")
445502 else toBase58String(value(payment.assetId))
446503 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
447504 if (!(acceptedAssetIds(assetId)))
448505 then throw("asset not accepted")
449506 else if (!(validateMinSell(assetId, amount)))
450507 then throw("Wrong min sell")
451508 else {
452509 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
453510 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
454511 if ((0 >= maxCanSell))
455512 then throw("No max edition set for this artwork")
456513 else if ((amountSold >= maxCanSell))
457514 then throw("Sold out, you cannot bid")
458515 else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1)), StringEntry(keyHighestBidBidId(artId), toBase58String(i.transactionId)), IntegerEntry(keyBidId(toBase58String(i.transactionId)), amount)]
459516 }
460517 }
461518 }
462519 }
463520
464521
465522 func acceptBidNonTraditional (i,artId,issuer,bidId,bidOwner) = {
466523 let caller = toBase58String(i.caller.bytes)
467524 if ((caller != issuer))
468525 then throw("You cannot do this action")
469526 else buyMint(i, artId, issuer, bidId, bidOwner, true)
470527 }
471528
472529
473530 func restartAuction (artId,issuer) = {
474531 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
475532 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
476533 let oldEndHeight = getIntegerByKey(keyEndHeight(issuer, artId))
477534 let duration = getIntegerByKey(keyDuration(issuer, artId))
478535 let endHeight = (duration + height)
479536 if ((height > oldEndHeight))
480537 then if ((amountSold == maxCanSell))
481538 then throw("Can't restart auction, max amount sold")
482539 else [IntegerEntry(keyEndHeight(issuer, artId), endHeight), DeleteEntry(keyHighestBidBidId(artId))]
483540 else throw("Previous auction isn't completed yet")
484541 }
485542
486543
487544 func acceptBidTraditional (i,artId,issuer,bidId,bidOwner) = {
488545 let endHeight = getIntegerByKey(keyEndHeight(issuer, artId))
489546 let highestBidId = getStringByKey(keyHighestBidBidId(artId))
490547 if ((height > endHeight))
491548 then if ((bidId == highestBidId))
492549 then {
493550 let buyMintData = buyMint(i, artId, issuer, bidId, bidOwner, true)
494551 let restartAuctionData = restartAuction(artId, issuer)
495552 (restartAuctionData ++ buyMintData)
496553 }
497554 else throw("This is not the winning bid!")
498555 else throw("This auction is not yet finished!")
499556 }
500557
501558
502559 func cancelBidImpl (i,artId,issuer,bidId) = {
503560 let t02894229094 = idCallerDate(i)
504561 let id = t02894229094._1
505562 let caller = t02894229094._2
506563 let date = t02894229094._3
507564 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
508565 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + bidId)
509- let bidData = getStringByKey((bidDataKey + "_OPEN"))
510- if ((bidData == ""))
511- then throw("Bid not found")
512- else {
513- let bidDataArr = split(bidData, "_")
514- let assetId = getBidAssetId(bidDataArr[0])
515- let bidStatus = "CANCELED"
566+ let bidData = getStringByKeyOrError((bidDataKey + "_OPEN"), "Bid not found")
567+ let bidDataArr = split(bidData, "_")
568+ let assetId = getBidAssetId(bidDataArr[0])
569+ let bidStatus = "CANCELED"
516570 [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(caller)), parseIntValue(bidDataArr[1]), assetId)]
517- }
518571 }
519572
520573
521574 func cancelBidImplTraditional (i,artId,issuer,bidId) = {
522575 let t02894229094 = idCallerDate(i)
523576 let id = t02894229094._1
524577 let caller = t02894229094._2
525578 let date = t02894229094._3
526579 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
527580 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + bidId)
528- let bidData = getStringByKey((bidDataKey + "_OPEN"))
529- if ((bidData == ""))
530- then throw("Bid not found")
531- else {
532- let bidDataArr = split(bidData, "_")
533- let assetId = getBidAssetId(bidDataArr[0])
534- let bidStatus = "CANCELED"
535- let bidAmount = parseIntValue(bidDataArr[1])
536- let highestBidId = getStringByKey(keyHighestBidBidId(artId))
537- if ((bidId == highestBidId))
538- then throw("You can't cancel the highest bid!")
539- else [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(caller)), bidAmount, assetId)]
540- }
581+ let bidData = getStringByKeyOrError((bidDataKey + "_OPEN"), "Bid not found")
582+ let bidDataArr = split(bidData, "_")
583+ let assetId = getBidAssetId(bidDataArr[0])
584+ let bidStatus = "CANCELED"
585+ let bidAmount = parseIntValue(bidDataArr[1])
586+ let highestBidId = getStringByKey(keyHighestBidBidId(artId))
587+ if ((bidId == highestBidId))
588+ then throw("You can't cancel the highest bid!")
589+ else [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(caller)), bidAmount, assetId)]
541590 }
591+
592+
593+@Callable(i)
594+func mintNft (totalNFT,issueMeta,receiveNFT) = if ((i.caller == this))
595+ then {
596+ let receiveNFTAddy = Address(fromBase58String(receiveNFT))
597+ let issueNFT = Issue(("SCONEX_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
598+ let idNFT = calculateAssetId(issueNFT)
599+ $Tuple2([issueNFT, ScriptTransfer(receiveNFTAddy, 1, idNFT)], toBase58String(idNFT))
600+ }
601+ else throw("Only the dApp can mint NFT's")
602+
542603
543604
544605 @Callable(i)
545606 func addArtwork (sha256Hash,name,description,tags,type,cidDisplay,entitlement) = {
546607 let t01774017781 = idCallerDate(i)
547608 let artId = t01774017781._1
548609 let caller = t01774017781._2
549610 let date = t01774017781._3
550611 let validateArtwork = validateArtworkData(caller, cidDisplay, name, description, tags)
551612 if ((validateArtwork != ""))
552613 then throw("Something went wrong!")
553614 else {
554615 let t01817018212 = validatePayment(i)
555616 let amount = t01817018212._1
556617 let assetId = t01817018212._2
557618 if (!(isDefined(amount)))
558619 then throw("Something went wrong")
559620 else {
560621 let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller))
561622 if ((entryExist != ""))
562623 then throw("You already added it")
563624 else {
564625 let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
565626 if ((hashExist != ""))
566- then throw("Hash already registered")
627+ then throw("This hash is already registered")
567628 else [StringEntry(keyOwnerByHash(sha256Hash), caller), StringEntry(keyTxidByHashOwner(sha256Hash, caller), artId), IntegerEntry(keyDate(caller, artId), date), StringEntry(keyName(caller, artId), name), StringEntry(keyDesc(caller, artId), description), StringEntry(keyDisplayCid(caller, artId), cidDisplay), StringEntry(keyType(caller, artId), type), StringEntry(keyTags(caller, artId), tags), IntegerEntry(keyMaxMint(caller, artId), 0), IntegerEntry(keyIssued(caller, artId), 0), BooleanEntry(keyOnSale(caller, artId), false), StringEntry(keyHashByTxidAddr(caller, artId), sha256Hash), StringEntry(keyEntitlement(caller, artId), entitlement), ScriptTransfer(Address(fromBase58String(feeReceiver)), amount, assetId)]
568629 }
569630 }
570631 }
571632 }
572633
573634
574635
575636 @Callable(i)
576637 func sellArtwork (artId,price,maxMint,assetId,auctionType,minBid,duration) = {
577638 let t02571425747 = idCallerDate(i)
578639 let id = t02571425747._1
579640 let caller = t02571425747._2
580641 let artworkName = getStringByKey(keyName(caller, artId))
581642 if (!(containsElement([auctionType1, auctionType2], auctionType)))
582- then throw("We dont know this auction type")
643+ then throw("We don't know this auction type")
583644 else if ((artworkName == ""))
584645 then throw("This art doesn't match your account")
585646 else {
586647 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
587648 if (!(acceptedAssetIds(assetId)))
588649 then throw("Something went wrong!")
589650 else if (!(validateMinSell(assetId, price)))
590651 then throw("Something went wrong!")
591652 else {
592653 let checkUser = validateUser(caller)
593654 if ((checkUser != ""))
594655 then throw(checkUser)
595656 else {
596657 let amountSold = getIntegerByKey(keyIssued(caller, artId))
597658 let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
598- if ((maxMint > 10))
599- then throw("10 editions max per artwork")
659+ if ((maxMint > 101))
660+ then throw("101 editions max per artwork")
600661 else if (if ((amountSold != 0))
601662 then (amountSold == maxCanSell)
602663 else false)
603664 then throw("Max edition reached.")
604665 else if (if ((amountSold > 0))
605666 then (maxCanSell != maxMint)
606667 else false)
607668 then throw("Cannot change maximum issuable anymore")
608669 else if (if ((bidNbr > 0))
609670 then (maxCanSell != maxMint)
610671 else false)
611672 then throw("Cannot change maximum issuable with active orders")
612673 else {
613674 let sellStatus = if (if ((price > 0))
614675 then (maxMint > 0)
615676 else false)
616677 then true
617678 else false
618679 let endHeight = (duration + height)
619680 [BooleanEntry(keyOnSale(caller, artId), sellStatus), IntegerEntry(keyPrice(caller, artId), price), IntegerEntry(keyMaxMint(caller, artId), maxMint), IntegerEntry(keyMinPrice(caller, artId), minBid), IntegerEntry(keyDuration(caller, artId), duration), IntegerEntry(keyEndHeight(caller, artId), endHeight), StringEntry(keyAssetIdAccepted(caller, artId), assetId), StringEntry(keyAuctionType(caller, artId), auctionType)]
620681 }
621682 }
622683 }
623684 }
624685 }
625686
626687
627688
628689 @Callable(i)
629690 func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "", false)
630691
631692
632693
633694 @Callable(i)
634695 func deleteEntry (entry) = {
635696 let caller = toString(addressFromPublicKey(i.callerPublicKey))
636- if ((caller == owner))
697+ if (containsElement(owners, caller))
637698 then [DeleteEntry(entry)]
638699 else throw("no")
639700 }
640701
641702
642703
643704 @Callable(i)
644705 func setBid (artId,issuer) = {
645706 let auctionType = getStringByKey(keyAuctionType(issuer, artId))
646707 if ((auctionType == auctionType1))
647708 then setBidNonTraditional(i, artId, issuer)
648709 else if ((auctionType == auctionType2))
649710 then setBidTraditional(i, artId, issuer)
650711 else throw((("Unknown auction type :" + auctionType) + ", please contact the admins"))
651712 }
652713
653714
654715
655716 @Callable(i)
656717 func acceptBid (artId,issuer,bidId,bidOwner) = {
657718 let auctionType = getStringByKey(keyAuctionType(issuer, artId))
658719 if ((auctionType == auctionType1))
659720 then acceptBidNonTraditional(i, artId, issuer, bidId, bidOwner)
660721 else if ((auctionType == auctionType2))
661722 then acceptBidTraditional(i, artId, issuer, bidId, bidOwner)
662723 else throw((("Unknown auction type :" + auctionType) + ", please contact the admins"))
663724 }
664725
665726
666727
667728 @Callable(i)
668729 func cancelBid (artId,issuer,bidId) = {
669730 let auctionType = getStringByKey(keyAuctionType(issuer, artId))
670731 if ((auctionType == auctionType1))
671732 then cancelBidImpl(i, artId, issuer, bidId)
672733 else cancelBidImplTraditional(i, artId, issuer, bidId)
673734 }
674735
675736

github/deemru/w8io/026f985 
99.40 ms