tx · 5vDU1fKEyfTPbcXytTxyv571sdZ4KfWujdLvHXzQVNs3

3MyafuLWBUqVEv5VcaJJPBVJvTwTxNh4tPX:  -0.01400000 Waves

2022.05.15 18:31 [2052974] smart account 3MyafuLWBUqVEv5VcaJJPBVJvTwTxNh4tPX > SELF 0.00000000 Waves

{ "type": 13, "id": "5vDU1fKEyfTPbcXytTxyv571sdZ4KfWujdLvHXzQVNs3", "fee": 1400000, "feeAssetId": null, "timestamp": 1652628719505, "version": 2, "chainId": 84, "sender": "3MyafuLWBUqVEv5VcaJJPBVJvTwTxNh4tPX", "senderPublicKey": "4cHkGAqfd5S8yGnVB6eHDYTeE5ciLkQ7PuGAXFzjf7z5", "proofs": [ "5Cy7p3FKeQ1zFHYCQ6APbhSP8ToG8mjfqaKShbrs8cUYCXaDPq335635EarCS67WfP4buW3cUQYbB4TZ54FoRfzh" ], "script": "base64:AAIFAAAAAAAAAC4IAhIDCgEIEgQKAggIEgQKAgEIEgMKAQgSAwoBCBIDCgEIEgQKAggIEgQKAggIAAAAHQAAAAATTkZUSXNzdWVyZmVlUGVyY2VudAAAAAAAAAAAAwAAAAANc2NvbmV4RGFwcEtleQIAAAAKc2NvbmV4RGFwcAAAAAAJb3JhY2xlS2V5AgAAAAlvcmFjbGVLZXkBAAAABmdldFN0cgAAAAEAAAADa2V5BAAAAAckbWF0Y2gwCQAEHQAAAAIFAAAABHRoaXMFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFiBQAAAAckbWF0Y2gwBQAAAAFiAgAAAAAAAAAABm9yYWNsZQkBAAAABmdldFN0cgAAAAEFAAAACW9yYWNsZUtleQAAAAAJb3JhY2xlRmVlCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQmAAAAAQUAAAAGb3JhY2xlAgAAACtDb2xsZWN0aW9ucyBkYXBwIGRvZXNudCBoYXZlIG9yYWNsZSBkZWZpbmVkAAAAAApzY29uZXhEYXBwCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACBQAAAAlvcmFjbGVGZWUFAAAADXNjb25leERhcHBLZXkAAAAACXN0YWtlRGFwcAkABCYAAAABCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAJb3JhY2xlRmVlAgAAAAlzdGFrZURhcHACAAAAFHNjb25leERhcHAgbm90IGZvdW5kAAAAAA9jb2xsZWN0aW9uc0RhcHAJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAlvcmFjbGVGZWUCAAAAD2NvbGxlY3Rpb25zRGFwcAIAAAAYY29sbGVjdGlvbkRhcHAgbm90IGZvdW5kAAAAAAtmZWVSZWNlaXZlcgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAACW9yYWNsZUZlZQIAAAALZmVlUmVjZWl2ZXICAAAAFWZlZVJlY2VpdmVyIG5vdCBmb3VuZAAAAAAIY2VydERhcHAJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAlvcmFjbGVGZWUCAAAACGNlcnREYXBwAgAAABJjZXJ0RGFwcCBub3QgZm91bmQAAAAAB2ZlZURhcHAJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAlvcmFjbGVGZWUCAAAAB2ZlZURhcHACAAAAEWZlZURhcHAgbm90IGZvdW5kAQAAABlnZXRJbnRlZ2VyQnlLZXlGcm9tT3JhY2xlAAAAAQAAAANrZXkJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAlvcmFjbGVGZWUFAAAAA2tleQIAAAAfSW50ZWdlciB1bmRlZmluZSBvciAwIGluIG9yYWNsZQAAAAALVVNETkFzc2V0SWQJAAJZAAAAAQkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgUAAAAJb3JhY2xlRmVlAgAAAAtVU0ROQXNzZXRJZAAAAAAMbWluVVNETlByaWNlCQEAAAAZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZQAAAAEJAAEsAAAAAgIAAAAEbWluXwkAAlgAAAABBQAAAAtVU0ROQXNzZXRJZAAAAAAIdXNlckRhcHAJAQAAAAV2YWx1ZQAAAAEJAAQmAAAAAQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAACW9yYWNsZUZlZQIAAAAIdXNlckRhcHACAAAAEnVzZXJkYXBwIG5vdCBmb3VuZAAAAAAMYXVjdGlvblR5cGUxAgAAAAdCSURUWVBFAAAAAAxhdWN0aW9uVHlwZTICAAAAC1RSQURJVElPTkFMAAAAAAxhdWN0aW9uVHlwZTMCAAAABkRJUkVDVAEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABAAAAA2tleQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAAANrZXkCAAAAAAEAAAAOa2V5QXVjdGlvblR5cGUAAAABAAAACWF1Y3Rpb25JZAkAASwAAAACCQABLAAAAAICAAAACGF1Y3Rpb25fBQAAAAlhdWN0aW9uSWQCAAAAC19hY3Rpb25UeXBlAQAAAA5nZXRTdHJmcm9tTWFpbgAAAAEAAAADa2V5BAAAAAckbWF0Y2gwCQAEHQAAAAIJAQAAABFAZXh0ck5h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Fk9ubHkgVVNETiBpcyBhY2NlcHRlZCEJAAJYAAAAAQkBAAAABXZhbHVlAAAAAQgFAAAAA3BtdAAAAAdhc3NldElkAwkBAAAAASEAAAABCQEAAAAQYWNjZXB0ZWRBc3NldElkcwAAAAEFAAAAClBheUFzc2V0SWQJAAACAAAAAQIAAAAnQXVjdGlvbiBkb2VzIG9ubHkgc3VwcG9ydCBVU0ROIHBheW1lbnRzBAAAAAhtaW5QcmljZQkBAAAADXRyeUdldEludGVnZXIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAIYXVjdGlvbl8FAAAACWF1Y3Rpb25JZAIAAAALX3N0YXJ0UHJpY2UDCQAAZgAAAAIFAAAACG1pblByaWNlBQAAAAZhbW91bnQJAAACAAAAAQkAASwAAAACAgAAACRUaGUgbWluaW1hbCBpbml0aWFsIHByaWNlIGlzIHNldCBhcyAJAAGkAAAAAQUAAAAIbWluUHJpY2UEAAAAC2F1Y3Rpb25UeXBlCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAAOa2V5QXVjdGlvblR5cGUAAAABBQAAAAlhdWN0aW9uSWQDCQEAAAACIT0AAAACBQAAAAthdWN0aW9uVHlwZQUAAAAMYXVjdGlvblR5cGUxCQAAAgAAAAECAAAAFk5vdCBhIEJpZFR5cGUgYXVjdGlvbiEEAAAAH3ZhbGlkYXRlQW5kUHJvY2Vzc1BheW1lbnRJbnZva2UJAAP8AAAABAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACBQAAAAlzdGFrZURhcHACAAAADnRoaXMgbm90IGZvdW5kAgAAABl2YWxpZGF0ZUFuZFByb2Nlc3NQYXltZW50BQAAAANuaWwJAARMAAAAAgkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQUAAAADbmlsAwkAAAAAAAACBQAAAB92YWxpZGF0ZUFuZFByb2Nlc3NQYXltZW50SW52b2tlBQAAAB92YWxpZGF0ZUFuZFByb2Nlc3NQYXltZW50SW52b2tlCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAIYXVjdGlvbl8FAAAACWF1Y3Rpb25J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", "height": 2052974, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: CiaCqjWMLMbmVDCs9rQcL57v9TuzQjXp4PZV2GBQ6TMc Next: 3ks5SBRZ4nmcPD9bzmKaQArjJcicDAf8bnYPXsjsdHnL Diff:
OldNewDifferences
2020 let oracleFee = valueOrErrorMessage(addressFromString(oracle), "Collections dapp doesnt have oracle defined")
2121
2222 let sconexDapp = getStringValue(oracleFee, sconexDappKey)
23+
24+let stakeDapp = addressFromString(valueOrErrorMessage(getString(oracleFee, "stakeDapp"), "sconexDapp not found"))
2325
2426 let collectionsDapp = valueOrErrorMessage(getString(oracleFee, "collectionsDapp"), "collectionDapp not found")
2527
133135
134136
135137 @Callable(i)
136-func transferNft (nftID,receiveNFT) = if ((i.caller == this))
137- then [ScriptTransfer(addressFromStringValue(receiveNFT), 1, fromBase58String(nftID))]
138- else throw("Only the dApp can transfer NFT's")
138+func transferNft (nftID,receiveNFT) = if ((i.caller != this))
139+ then throw("Only the dApp can transfer NFT's")
140+ else [ScriptTransfer(addressFromStringValue(receiveNFT), 1, fromBase58String(nftID))]
139141
140142
141143
144146 let auctionId = toBase58String(i.transactionId)
145147 if ((size(i.payments) == 0))
146148 then throw("No payment attached")
147- else if ((size(i.payments) >= 2))
149+ else if ((size(i.payments) >= 3))
148150 then throw("Too many payments attached")
149151 else if ((i.payments[0].amount != 1))
150152 then throw("No nft attached to the payment")
151153 else {
152154 let pmt = value(i.payments[0])
153155 let assetId = value(pmt.assetId)
154- let minSellSconex = minUSDNPrice
155- if ((minSellSconex > startPrice))
156- then throw(("Wrong minimum sell price " + toString(minSellSconex)))
156+ if ((minUSDNPrice > startPrice))
157+ then throw(("Wrong minimum sell price " + toString(minUSDNPrice)))
157158 else {
158159 let asset = getNFTIssuer(assetId)
159160 if ((asset == ""))
160161 then throw("You can only sell an NFT created on SCONE Marketplace")
161162 else if (!(containsElement([auctionType1, auctionType3], auctionType)))
162163 then throw("We don't know this auction type")
163- else [StringEntry((("auction_" + auctionId) + "_status"), "open"), StringEntry((("auction_" + toBase58String(assetId)) + "_last"), auctionId), StringEntry((("auction_" + auctionId) + "_assetName"), asset), StringEntry((("auction_" + auctionId) + "_assetId"), toBase58String(assetId)), IntegerEntry((("auction_" + auctionId) + "_startedAt"), lastBlock.timestamp), StringEntry((("auction_" + auctionId) + "_owner"), toString(i.caller)), IntegerEntry((("auction_" + auctionId) + "_startPrice"), startPrice), StringEntry(keyAuctionType(auctionId), auctionType), StringEntry((((("address_" + toString(i.caller)) + "_auction_") + auctionId) + "_lockedNFT"), toBase58String(assetId))]
164+ else {
165+ let validateAndProcessPaymentInvoke = invoke(valueOrErrorMessage(stakeDapp, "this not found"), "validateAndProcessPayment", nil, [i.payments[1]])
166+ if ((validateAndProcessPaymentInvoke == validateAndProcessPaymentInvoke))
167+ then [StringEntry((("auction_" + auctionId) + "_status"), "open"), StringEntry((("auction_" + toBase58String(assetId)) + "_last"), auctionId), StringEntry((("auction_" + auctionId) + "_assetName"), asset), StringEntry((("auction_" + auctionId) + "_assetId"), toBase58String(assetId)), IntegerEntry((("auction_" + auctionId) + "_startedAt"), lastBlock.timestamp), StringEntry((("auction_" + auctionId) + "_owner"), toString(i.caller)), IntegerEntry((("auction_" + auctionId) + "_startPrice"), startPrice), StringEntry(keyAuctionType(auctionId), auctionType), StringEntry((((("address_" + toString(i.caller)) + "_auction_") + auctionId) + "_lockedNFT"), toBase58String(assetId))]
168+ else throw("Strict value is not equal to itself.")
169+ }
164170 }
165171 }
166172 }
174180 then throw("Only allowed to auction owner")
175181 else if ((tryGetString((("auction_" + auctionId) + "_status")) != "open"))
176182 then throw("auction is close")
177- else [StringEntry((("auction_" + auctionId) + "_status"), "cancelled"), DeleteEntry((((("address_" + auctionOwner) + "_auction_") + auctionId) + "_lockedNFT")), ScriptTransfer(i.caller, 1, fromBase58String(getStringValue(this, (("auction_" + auctionId) + "_assetId"))))]
183+ else {
184+ let validateAndProcessPaymentInvoke = invoke(valueOrErrorMessage(stakeDapp, "this not found"), "validateAndProcessPayment", nil, [i.payments[0]])
185+ if ((validateAndProcessPaymentInvoke == validateAndProcessPaymentInvoke))
186+ then [StringEntry((("auction_" + auctionId) + "_status"), "cancelled"), DeleteEntry((((("address_" + auctionOwner) + "_auction_") + auctionId) + "_lockedNFT")), ScriptTransfer(i.caller, 1, fromBase58String(getStringValue(this, (("auction_" + auctionId) + "_assetId"))))]
187+ else throw("Strict value is not equal to itself.")
188+ }
178189 }
179190
180191
196207 then throw(("The minimal initial price is set as " + toString(minPrice)))
197208 else {
198209 let auctionType = getStringByKey(keyAuctionType(auctionId))
199- if ((auctionType == auctionType1))
200- then [StringEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_author"), toString(i.caller)), StringEntry((((("assetId_" + assetId) + "_bid_") + bidId) + "_data"), (((((("{\"auctionId\": \"" + auctionId) + "\", \"author\": \"") + toString(i.caller)) + "\", \"amount\": \"") + toString(amount)) + "\", \"status\": \"open\"}")), IntegerEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_amount"), amount), StringEntry(((((("address_" + toString(i.caller)) + "_auction_") + auctionId) + "_bid_") + bidId), assetId), StringEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_status"), "open")]
201- else throw("Not a BidType auction!")
210+ if ((auctionType != auctionType1))
211+ then throw("Not a BidType auction!")
212+ else {
213+ let validateAndProcessPaymentInvoke = invoke(valueOrErrorMessage(stakeDapp, "this not found"), "validateAndProcessPayment", nil, [i.payments[1]])
214+ if ((validateAndProcessPaymentInvoke == validateAndProcessPaymentInvoke))
215+ then [StringEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_author"), toString(i.caller)), StringEntry((((("assetId_" + assetId) + "_bid_") + bidId) + "_data"), (((((("{\"auctionId\": \"" + auctionId) + "\", \"author\": \"") + toString(i.caller)) + "\", \"amount\": \"") + toString(amount)) + "\", \"status\": \"open\"}")), IntegerEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_amount"), amount), StringEntry(((((("address_" + toString(i.caller)) + "_auction_") + auctionId) + "_bid_") + bidId), assetId), StringEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_status"), "open")]
216+ else throw("Strict value is not equal to itself.")
217+ }
202218 }
203219 }
204220 }
225241 then throw(("The exact price is set as " + toString(minPrice)))
226242 else {
227243 let auctionType = getStringByKey(keyAuctionType(auctionId))
228- if ((auctionType == auctionType3))
229- then {
244+ if ((auctionType != auctionType3))
245+ then throw("Not a directBuy auction!")
246+ else {
230247 let recordPrice = tryGetInteger((assetId + "_recordPrice"))
231248 let newRecordPrice = max([recordPrice, bidAmount])
232249 let ArtistAddress = getNFTArtist(assetId)
240257 let buyRes = [StringEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_author"), toString(i.caller)), StringEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_status"), "finished"), StringEntry((("auction_" + auctionId) + "_status"), "finished"), StringEntry((((("assetId_" + assetId) + "_bid_") + bidId) + "_data"), (((((("{\"auctionId\": \"" + auctionId) + "\", \"author\": \"") + toString(i.caller)) + "\", \"amount\": \"") + toString(bidAmount)) + "\", \"status\": \"finished\"}")), IntegerEntry((("auction_" + auctionId) + "_finalPrice"), bidAmount), IntegerEntry((assetId + "_recordPrice"), newRecordPrice), DeleteEntry((((("address_" + auctionOwner) + "_auction_") + auctionId) + "_lockedNFT"))]
241258 let res = invoke(addressFromStringValue(certDapp), "createCert", [bidAuthor, assetId, ArtistAddress], nil)
242259 if ((res == res))
243- then buyRes
260+ then {
261+ let validateAndProcessPaymentInvoke = invoke(valueOrErrorMessage(stakeDapp, "this not found"), "validateAndProcessPayment", nil, [i.payments[1]])
262+ if ((validateAndProcessPaymentInvoke == validateAndProcessPaymentInvoke))
263+ then buyRes
264+ else throw("Strict value is not equal to itself.")
265+ }
244266 else throw("Strict value is not equal to itself.")
245267 }
246268 else throw("Strict value is not equal to itself.")
247269 }
248270 else throw("Strict value is not equal to itself.")
249271 }
250- else throw("Not a directBuy auction!")
251272 }
252273 }
253274 }
265286 then throw("Only allowed to the bid author or admin")
266287 else if ((tryGetString((((("auction_" + auctionId) + "_bid_") + bidId) + "_status")) != "open"))
267288 then throw("bid is not open")
268- else [StringEntry((((("assetId_" + assetId) + "_bid_") + bidId) + "_data"), (((((("{\"auctionId\": \"" + auctionId) + "\", \"author\": \"") + toString(i.caller)) + "\", \"amount\": \"") + toString(bidAmount)) + "\", \"status\": \"cancelled\"}")), StringEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_status"), "cancelled"), DeleteEntry(((((("address_" + bidAuthor) + "_auction_") + auctionId) + "_bid_") + bidId)), ScriptTransfer(Address(fromBase58String(bidAuthor)), bidAmount, USDNAssetId)]
289+ else {
290+ let validateAndProcessPaymentInvoke = invoke(valueOrErrorMessage(stakeDapp, "this not found"), "validateAndProcessPayment", nil, [i.payments[0]])
291+ if ((validateAndProcessPaymentInvoke == validateAndProcessPaymentInvoke))
292+ then [StringEntry((((("assetId_" + assetId) + "_bid_") + bidId) + "_data"), (((((("{\"auctionId\": \"" + auctionId) + "\", \"author\": \"") + toString(i.caller)) + "\", \"amount\": \"") + toString(bidAmount)) + "\", \"status\": \"cancelled\"}")), StringEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_status"), "cancelled"), DeleteEntry(((((("address_" + bidAuthor) + "_auction_") + auctionId) + "_bid_") + bidId)), ScriptTransfer(Address(fromBase58String(bidAuthor)), bidAmount, USDNAssetId)]
293+ else throw("Strict value is not equal to itself.")
294+ }
269295 }
270296
271297
295321 let buyRes = [StringEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_status"), "finished"), StringEntry((("auction_" + auctionId) + "_status"), "finished"), StringEntry((((("assetId_" + assetId) + "_bid_") + bidId) + "_data"), (((((("{\"auctionId\": \"" + auctionId) + "\", \"author\": \"") + toString(i.caller)) + "\", \"amount\": \"") + toString(bidAmount)) + "\", \"status\": \"finished\"}")), IntegerEntry((("auction_" + auctionId) + "_finalPrice"), bidAmount), IntegerEntry((assetId + "_recordPrice"), newRecordPrice), DeleteEntry(((((("address_" + bidAuthor) + "_auction_") + auctionId) + "_bid_") + bidId)), DeleteEntry((((("address_" + auctionOwner) + "_auction_") + auctionId) + "_lockedNFT"))]
296322 let res = invoke(addressFromStringValue(certDapp), "createCert", [bidAuthor, assetId, ArtistAddress], nil)
297323 if ((res == res))
298- then buyRes
324+ then {
325+ let validateAndProcessPaymentInvoke = invoke(valueOrErrorMessage(stakeDapp, "this not found"), "validateAndProcessPayment", nil, [i.payments[0]])
326+ if ((validateAndProcessPaymentInvoke == validateAndProcessPaymentInvoke))
327+ then buyRes
328+ else throw("Strict value is not equal to itself.")
329+ }
299330 else throw("Strict value is not equal to itself.")
300331 }
301332 else throw("Strict value is not equal to itself.")
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let NFTIssuerfeePercent = 3
55
66 let sconexDappKey = "sconexDapp"
77
88 let oracleKey = "oracleKey"
99
1010 func getStr (key) = match getString(this, key) {
1111 case b: String =>
1212 b
1313 case _ =>
1414 ""
1515 }
1616
1717
1818 let oracle = getStr(oracleKey)
1919
2020 let oracleFee = valueOrErrorMessage(addressFromString(oracle), "Collections dapp doesnt have oracle defined")
2121
2222 let sconexDapp = getStringValue(oracleFee, sconexDappKey)
23+
24+let stakeDapp = addressFromString(valueOrErrorMessage(getString(oracleFee, "stakeDapp"), "sconexDapp not found"))
2325
2426 let collectionsDapp = valueOrErrorMessage(getString(oracleFee, "collectionsDapp"), "collectionDapp not found")
2527
2628 let feeReceiver = valueOrErrorMessage(getString(oracleFee, "feeReceiver"), "feeReceiver not found")
2729
2830 let certDapp = valueOrErrorMessage(getString(oracleFee, "certDapp"), "certDapp not found")
2931
3032 let feeDapp = valueOrErrorMessage(getString(oracleFee, "feeDapp"), "feeDapp not found")
3133
3234 func getIntegerByKeyFromOracle (key) = valueOrErrorMessage(getInteger(oracleFee, key), "Integer undefine or 0 in oracle")
3335
3436
3537 let USDNAssetId = fromBase58String(getStringValue(oracleFee, "USDNAssetId"))
3638
3739 let minUSDNPrice = getIntegerByKeyFromOracle(("min_" + toBase58String(USDNAssetId)))
3840
3941 let userDapp = value(addressFromString(valueOrErrorMessage(getString(oracleFee, "userDapp"), "userdapp not found")))
4042
4143 let auctionType1 = "BIDTYPE"
4244
4345 let auctionType2 = "TRADITIONAL"
4446
4547 let auctionType3 = "DIRECT"
4648
4749 func getStringByKey (key) = valueOrElse(getString(this, key), "")
4850
4951
5052 func keyAuctionType (auctionId) = (("auction_" + auctionId) + "_actionType")
5153
5254
5355 func getStrfromMain (key) = match getString(addressFromStringValue(sconexDapp), key) {
5456 case b: String =>
5557 b
5658 case _ =>
5759 ""
5860 }
5961
6062
6163 func getIntfromMain (key) = match getInteger(addressFromStringValue(sconexDapp), key) {
6264 case b: Int =>
6365 b
6466 case _ =>
6567 0
6668 }
6769
6870
6971 func tryGetInteger (key) = {
7072 let val = match getInteger(this, key) {
7173 case b: Int =>
7274 b
7375 case _ =>
7476 0
7577 }
7678 val
7779 }
7880
7981
8082 func tryGetString (key) = {
8183 let val = match getString(this, key) {
8284 case b: String =>
8385 b
8486 case _ =>
8587 ""
8688 }
8789 val
8890 }
8991
9092
9193 func getNFTIssuer (assetId) = {
9294 let myassetinfo = value(assetInfo(assetId))
9395 if ((myassetinfo.issuer == addressFromStringValue(sconexDapp)))
9496 then "true"
9597 else ""
9698 }
9799
98100
99101 func getNFTArtist (assetId) = {
100102 let ArtistAddress = match getString(addressFromStringValue(sconexDapp), ("nft_issued_" + assetId)) {
101103 case b: String =>
102104 b
103105 case _ =>
104106 ""
105107 }
106108 ArtistAddress
107109 }
108110
109111
110112 func getArtId (assetId) = {
111113 let ArtistAddress = match getString(addressFromStringValue(sconexDapp), ("nft_artId_" + assetId)) {
112114 case b: String =>
113115 b
114116 case _ =>
115117 ""
116118 }
117119 ArtistAddress
118120 }
119121
120122
121123 func acceptedAssetIds (assetId) = if ((assetId != toBase58String(USDNAssetId)))
122124 then throw("Only USDN accepted")
123125 else true
124126
125127
126128 @Callable(i)
127129 func initDapp (dappKey) = if ((i.caller != this))
128130 then throw("You cannot do this action")
129131 else if ((oracle != ""))
130132 then throw("oracle already set, you can't override!")
131133 else [StringEntry(oracleKey, dappKey)]
132134
133135
134136
135137 @Callable(i)
136-func transferNft (nftID,receiveNFT) = if ((i.caller == this))
137- then [ScriptTransfer(addressFromStringValue(receiveNFT), 1, fromBase58String(nftID))]
138- else throw("Only the dApp can transfer NFT's")
138+func transferNft (nftID,receiveNFT) = if ((i.caller != this))
139+ then throw("Only the dApp can transfer NFT's")
140+ else [ScriptTransfer(addressFromStringValue(receiveNFT), 1, fromBase58String(nftID))]
139141
140142
141143
142144 @Callable(i)
143145 func initAuction (startPrice,auctionType) = {
144146 let auctionId = toBase58String(i.transactionId)
145147 if ((size(i.payments) == 0))
146148 then throw("No payment attached")
147- else if ((size(i.payments) >= 2))
149+ else if ((size(i.payments) >= 3))
148150 then throw("Too many payments attached")
149151 else if ((i.payments[0].amount != 1))
150152 then throw("No nft attached to the payment")
151153 else {
152154 let pmt = value(i.payments[0])
153155 let assetId = value(pmt.assetId)
154- let minSellSconex = minUSDNPrice
155- if ((minSellSconex > startPrice))
156- then throw(("Wrong minimum sell price " + toString(minSellSconex)))
156+ if ((minUSDNPrice > startPrice))
157+ then throw(("Wrong minimum sell price " + toString(minUSDNPrice)))
157158 else {
158159 let asset = getNFTIssuer(assetId)
159160 if ((asset == ""))
160161 then throw("You can only sell an NFT created on SCONE Marketplace")
161162 else if (!(containsElement([auctionType1, auctionType3], auctionType)))
162163 then throw("We don't know this auction type")
163- else [StringEntry((("auction_" + auctionId) + "_status"), "open"), StringEntry((("auction_" + toBase58String(assetId)) + "_last"), auctionId), StringEntry((("auction_" + auctionId) + "_assetName"), asset), StringEntry((("auction_" + auctionId) + "_assetId"), toBase58String(assetId)), IntegerEntry((("auction_" + auctionId) + "_startedAt"), lastBlock.timestamp), StringEntry((("auction_" + auctionId) + "_owner"), toString(i.caller)), IntegerEntry((("auction_" + auctionId) + "_startPrice"), startPrice), StringEntry(keyAuctionType(auctionId), auctionType), StringEntry((((("address_" + toString(i.caller)) + "_auction_") + auctionId) + "_lockedNFT"), toBase58String(assetId))]
164+ else {
165+ let validateAndProcessPaymentInvoke = invoke(valueOrErrorMessage(stakeDapp, "this not found"), "validateAndProcessPayment", nil, [i.payments[1]])
166+ if ((validateAndProcessPaymentInvoke == validateAndProcessPaymentInvoke))
167+ then [StringEntry((("auction_" + auctionId) + "_status"), "open"), StringEntry((("auction_" + toBase58String(assetId)) + "_last"), auctionId), StringEntry((("auction_" + auctionId) + "_assetName"), asset), StringEntry((("auction_" + auctionId) + "_assetId"), toBase58String(assetId)), IntegerEntry((("auction_" + auctionId) + "_startedAt"), lastBlock.timestamp), StringEntry((("auction_" + auctionId) + "_owner"), toString(i.caller)), IntegerEntry((("auction_" + auctionId) + "_startPrice"), startPrice), StringEntry(keyAuctionType(auctionId), auctionType), StringEntry((((("address_" + toString(i.caller)) + "_auction_") + auctionId) + "_lockedNFT"), toBase58String(assetId))]
168+ else throw("Strict value is not equal to itself.")
169+ }
164170 }
165171 }
166172 }
167173
168174
169175
170176 @Callable(i)
171177 func cancelAuction (auctionId) = {
172178 let auctionOwner = tryGetString((("auction_" + auctionId) + "_owner"))
173179 if ((toString(i.caller) != auctionOwner))
174180 then throw("Only allowed to auction owner")
175181 else if ((tryGetString((("auction_" + auctionId) + "_status")) != "open"))
176182 then throw("auction is close")
177- else [StringEntry((("auction_" + auctionId) + "_status"), "cancelled"), DeleteEntry((((("address_" + auctionOwner) + "_auction_") + auctionId) + "_lockedNFT")), ScriptTransfer(i.caller, 1, fromBase58String(getStringValue(this, (("auction_" + auctionId) + "_assetId"))))]
183+ else {
184+ let validateAndProcessPaymentInvoke = invoke(valueOrErrorMessage(stakeDapp, "this not found"), "validateAndProcessPayment", nil, [i.payments[0]])
185+ if ((validateAndProcessPaymentInvoke == validateAndProcessPaymentInvoke))
186+ then [StringEntry((("auction_" + auctionId) + "_status"), "cancelled"), DeleteEntry((((("address_" + auctionOwner) + "_auction_") + auctionId) + "_lockedNFT")), ScriptTransfer(i.caller, 1, fromBase58String(getStringValue(this, (("auction_" + auctionId) + "_assetId"))))]
187+ else throw("Strict value is not equal to itself.")
188+ }
178189 }
179190
180191
181192
182193 @Callable(i)
183194 func placeBid (auctionId) = {
184195 let pmt = value(i.payments[0])
185196 let amount = pmt.amount
186197 let bidId = toBase58String(i.transactionId)
187198 let assetId = getStringValue(this, (("auction_" + auctionId) + "_assetId"))
188199 let PayAssetId = if (!(isDefined(pmt.assetId)))
189200 then throw("Only USDN is accepted!")
190201 else toBase58String(value(pmt.assetId))
191202 if (!(acceptedAssetIds(PayAssetId)))
192203 then throw("Auction does only support USDN payments")
193204 else {
194205 let minPrice = tryGetInteger((("auction_" + auctionId) + "_startPrice"))
195206 if ((minPrice > amount))
196207 then throw(("The minimal initial price is set as " + toString(minPrice)))
197208 else {
198209 let auctionType = getStringByKey(keyAuctionType(auctionId))
199- if ((auctionType == auctionType1))
200- then [StringEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_author"), toString(i.caller)), StringEntry((((("assetId_" + assetId) + "_bid_") + bidId) + "_data"), (((((("{\"auctionId\": \"" + auctionId) + "\", \"author\": \"") + toString(i.caller)) + "\", \"amount\": \"") + toString(amount)) + "\", \"status\": \"open\"}")), IntegerEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_amount"), amount), StringEntry(((((("address_" + toString(i.caller)) + "_auction_") + auctionId) + "_bid_") + bidId), assetId), StringEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_status"), "open")]
201- else throw("Not a BidType auction!")
210+ if ((auctionType != auctionType1))
211+ then throw("Not a BidType auction!")
212+ else {
213+ let validateAndProcessPaymentInvoke = invoke(valueOrErrorMessage(stakeDapp, "this not found"), "validateAndProcessPayment", nil, [i.payments[1]])
214+ if ((validateAndProcessPaymentInvoke == validateAndProcessPaymentInvoke))
215+ then [StringEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_author"), toString(i.caller)), StringEntry((((("assetId_" + assetId) + "_bid_") + bidId) + "_data"), (((((("{\"auctionId\": \"" + auctionId) + "\", \"author\": \"") + toString(i.caller)) + "\", \"amount\": \"") + toString(amount)) + "\", \"status\": \"open\"}")), IntegerEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_amount"), amount), StringEntry(((((("address_" + toString(i.caller)) + "_auction_") + auctionId) + "_bid_") + bidId), assetId), StringEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_status"), "open")]
216+ else throw("Strict value is not equal to itself.")
217+ }
202218 }
203219 }
204220 }
205221
206222
207223
208224 @Callable(i)
209225 func directBuy (auctionId) = {
210226 let pmt = value(i.payments[0])
211227 let amount = pmt.amount
212228 let bidId = toBase58String(i.transactionId)
213229 let assetId = getStringValue(this, (("auction_" + auctionId) + "_assetId"))
214230 let auctionOwner = tryGetString((("auction_" + auctionId) + "_owner"))
215231 let bidAmount = amount
216232 let bidAuthor = toString(i.caller)
217233 let PayAssetId = if (!(isDefined(pmt.assetId)))
218234 then throw("Only USDN is accepted!")
219235 else toBase58String(value(pmt.assetId))
220236 if (!(acceptedAssetIds(PayAssetId)))
221237 then throw("Auction does only support USDN payments")
222238 else {
223239 let minPrice = tryGetInteger((("auction_" + auctionId) + "_startPrice"))
224240 if ((minPrice != amount))
225241 then throw(("The exact price is set as " + toString(minPrice)))
226242 else {
227243 let auctionType = getStringByKey(keyAuctionType(auctionId))
228- if ((auctionType == auctionType3))
229- then {
244+ if ((auctionType != auctionType3))
245+ then throw("Not a directBuy auction!")
246+ else {
230247 let recordPrice = tryGetInteger((assetId + "_recordPrice"))
231248 let newRecordPrice = max([recordPrice, bidAmount])
232249 let ArtistAddress = getNFTArtist(assetId)
233250 let artId = getArtId(assetId)
234251 let transferres = invoke(this, "transferNft", [assetId, bidAuthor], nil)
235252 if ((transferres == transferres))
236253 then {
237254 let invokeTeamFeeSplit = invoke(valueOrErrorMessage(addressFromString(feeDapp), (feeDapp + " not found")), "payFeeResell", [artId, auctionOwner], [AttachedPayment(USDNAssetId, amount)])
238255 if ((invokeTeamFeeSplit == invokeTeamFeeSplit))
239256 then {
240257 let buyRes = [StringEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_author"), toString(i.caller)), StringEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_status"), "finished"), StringEntry((("auction_" + auctionId) + "_status"), "finished"), StringEntry((((("assetId_" + assetId) + "_bid_") + bidId) + "_data"), (((((("{\"auctionId\": \"" + auctionId) + "\", \"author\": \"") + toString(i.caller)) + "\", \"amount\": \"") + toString(bidAmount)) + "\", \"status\": \"finished\"}")), IntegerEntry((("auction_" + auctionId) + "_finalPrice"), bidAmount), IntegerEntry((assetId + "_recordPrice"), newRecordPrice), DeleteEntry((((("address_" + auctionOwner) + "_auction_") + auctionId) + "_lockedNFT"))]
241258 let res = invoke(addressFromStringValue(certDapp), "createCert", [bidAuthor, assetId, ArtistAddress], nil)
242259 if ((res == res))
243- then buyRes
260+ then {
261+ let validateAndProcessPaymentInvoke = invoke(valueOrErrorMessage(stakeDapp, "this not found"), "validateAndProcessPayment", nil, [i.payments[1]])
262+ if ((validateAndProcessPaymentInvoke == validateAndProcessPaymentInvoke))
263+ then buyRes
264+ else throw("Strict value is not equal to itself.")
265+ }
244266 else throw("Strict value is not equal to itself.")
245267 }
246268 else throw("Strict value is not equal to itself.")
247269 }
248270 else throw("Strict value is not equal to itself.")
249271 }
250- else throw("Not a directBuy auction!")
251272 }
252273 }
253274 }
254275
255276
256277
257278 @Callable(i)
258279 func cancelBid (auctionId,bidId) = {
259280 let assetId = getStringValue(this, (("auction_" + auctionId) + "_assetId"))
260281 let bidAuthor = tryGetString((((("auction_" + auctionId) + "_bid_") + bidId) + "_author"))
261282 let bidAmount = tryGetInteger((((("auction_" + auctionId) + "_bid_") + bidId) + "_amount"))
262283 if (if ((toString(i.caller) != bidAuthor))
263284 then (i.caller != this)
264285 else false)
265286 then throw("Only allowed to the bid author or admin")
266287 else if ((tryGetString((((("auction_" + auctionId) + "_bid_") + bidId) + "_status")) != "open"))
267288 then throw("bid is not open")
268- else [StringEntry((((("assetId_" + assetId) + "_bid_") + bidId) + "_data"), (((((("{\"auctionId\": \"" + auctionId) + "\", \"author\": \"") + toString(i.caller)) + "\", \"amount\": \"") + toString(bidAmount)) + "\", \"status\": \"cancelled\"}")), StringEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_status"), "cancelled"), DeleteEntry(((((("address_" + bidAuthor) + "_auction_") + auctionId) + "_bid_") + bidId)), ScriptTransfer(Address(fromBase58String(bidAuthor)), bidAmount, USDNAssetId)]
289+ else {
290+ let validateAndProcessPaymentInvoke = invoke(valueOrErrorMessage(stakeDapp, "this not found"), "validateAndProcessPayment", nil, [i.payments[0]])
291+ if ((validateAndProcessPaymentInvoke == validateAndProcessPaymentInvoke))
292+ then [StringEntry((((("assetId_" + assetId) + "_bid_") + bidId) + "_data"), (((((("{\"auctionId\": \"" + auctionId) + "\", \"author\": \"") + toString(i.caller)) + "\", \"amount\": \"") + toString(bidAmount)) + "\", \"status\": \"cancelled\"}")), StringEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_status"), "cancelled"), DeleteEntry(((((("address_" + bidAuthor) + "_auction_") + auctionId) + "_bid_") + bidId)), ScriptTransfer(Address(fromBase58String(bidAuthor)), bidAmount, USDNAssetId)]
293+ else throw("Strict value is not equal to itself.")
294+ }
269295 }
270296
271297
272298
273299 @Callable(i)
274300 func acceptBid (auctionId,bidId) = {
275301 let auctionOwner = tryGetString((("auction_" + auctionId) + "_owner"))
276302 let bidAuthor = tryGetString((((("auction_" + auctionId) + "_bid_") + bidId) + "_author"))
277303 let bidAmount = tryGetInteger((((("auction_" + auctionId) + "_bid_") + bidId) + "_amount"))
278304 let bidStatus = tryGetString((((("auction_" + auctionId) + "_bid_") + bidId) + "_status"))
279305 let assetId = tryGetString((("auction_" + auctionId) + "_assetId"))
280306 if ((toString(i.caller) != auctionOwner))
281307 then throw("Only allowed to auction owner")
282308 else if ((bidStatus != "open"))
283309 then throw("Bid was cancelled and cannot be accepted")
284310 else {
285311 let recordPrice = tryGetInteger((assetId + "_recordPrice"))
286312 let newRecordPrice = max([recordPrice, bidAmount])
287313 let ArtistAddress = getNFTArtist(assetId)
288314 let artId = getArtId(assetId)
289315 let invokeTeamFeeSplit = invoke(valueOrErrorMessage(addressFromString(feeDapp), (feeDapp + " not found")), "payFeeResell", [artId, auctionOwner], [AttachedPayment(USDNAssetId, bidAmount)])
290316 if ((invokeTeamFeeSplit == invokeTeamFeeSplit))
291317 then {
292318 let transferres = invoke(this, "transferNft", [assetId, bidAuthor], nil)
293319 if ((transferres == transferres))
294320 then {
295321 let buyRes = [StringEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_status"), "finished"), StringEntry((("auction_" + auctionId) + "_status"), "finished"), StringEntry((((("assetId_" + assetId) + "_bid_") + bidId) + "_data"), (((((("{\"auctionId\": \"" + auctionId) + "\", \"author\": \"") + toString(i.caller)) + "\", \"amount\": \"") + toString(bidAmount)) + "\", \"status\": \"finished\"}")), IntegerEntry((("auction_" + auctionId) + "_finalPrice"), bidAmount), IntegerEntry((assetId + "_recordPrice"), newRecordPrice), DeleteEntry(((((("address_" + bidAuthor) + "_auction_") + auctionId) + "_bid_") + bidId)), DeleteEntry((((("address_" + auctionOwner) + "_auction_") + auctionId) + "_lockedNFT"))]
296322 let res = invoke(addressFromStringValue(certDapp), "createCert", [bidAuthor, assetId, ArtistAddress], nil)
297323 if ((res == res))
298- then buyRes
324+ then {
325+ let validateAndProcessPaymentInvoke = invoke(valueOrErrorMessage(stakeDapp, "this not found"), "validateAndProcessPayment", nil, [i.payments[0]])
326+ if ((validateAndProcessPaymentInvoke == validateAndProcessPaymentInvoke))
327+ then buyRes
328+ else throw("Strict value is not equal to itself.")
329+ }
299330 else throw("Strict value is not equal to itself.")
300331 }
301332 else throw("Strict value is not equal to itself.")
302333 }
303334 else throw("Strict value is not equal to itself.")
304335 }
305336 }
306337
307338
308339 @Verifier(tx)
309340 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
310341

github/deemru/w8io/026f985 
67.47 ms