tx · FTEkwSbc8XAmWnCF4EFZgraG1amBjypGcxDuTJRiAdgE

3MtVYGt1cJJB8g21cvSzJScK3hxUi9JHdcN:  -0.01400000 Waves

2021.12.23 14:12 [1846830] smart account 3MtVYGt1cJJB8g21cvSzJScK3hxUi9JHdcN > SELF 0.00000000 Waves

{ "type": 13, "id": "FTEkwSbc8XAmWnCF4EFZgraG1amBjypGcxDuTJRiAdgE", "fee": 1400000, "feeAssetId": null, "timestamp": 1640258034803, "version": 2, "chainId": 84, "sender": "3MtVYGt1cJJB8g21cvSzJScK3hxUi9JHdcN", "senderPublicKey": "65qdY9G3EVQgF1GhvrT6rw2zPmUsFirt9Kjm5q5fdJvu", "proofs": [ "83vXrtCMj8eMegVRvrw6siL7A1gTJequotHHvHdzc6AzLdPPayEBPGLt9HPRBP8hJKK9ujByXEbU7e9ZF4HAY7G" ], "script": "base64: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", "height": 1846830, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: EneWmzuMyo8bPo935j7KBhNwm1sHMbCptMKdnJqiyDh Next: Eq3cjaSrZ8dGipmGjKWAqPCdp6zhKHeXvBrG9sSecYWt Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let NFTIssuerAddress = base58'3N992tjd7EWM6dSHrdVjjjuJrLD4koNztZ9'
4+let incubatorAddress = base58'3PEktVux2RhchSN63DsDo4b4mz4QqzKSeDv'
55
6-let eggAssetId = base58'2cf6jyVG19oHU79R8iHfqFEesjstr3e7nSYEUhb2WagB'
6+let breederAddress = base58'3PDVuU45H7Eh5dmtNbnRNRStGwULA7NY6Hb'
77
8-let ownerAddress = base58'3MpADDQFqadaCADNH9JDMQAGw9WEaMcymVU'
8+let artefactsAddress = base58'3P5E9xamcWoymiqLx8ZdmR7o4fJSRMGp1WR'
9+
10+let feeAggregator = base58'3P6AobNbcQ3ZjcRY37mJPKN8PP9Giz8kgeY'
11+
12+let eggAssetId = base58'C1iWsKGqLwjHUndiQ7iXpdmPum9PeCDFfyXBdJJosDRS'
13+
14+let kGlobalCounter = "GLOBAL_COUNTER"
915
1016 let feePercent = 5
1117
4147 }
4248
4349
50+func getGlobalCounter () = tryGetInteger(kGlobalCounter)
51+
52+
53+func getAssetGenotype (assetId) = if ((value(assetInfo(assetId)).issuer == Address(artefactsAddress)))
54+ then "ART"
55+ else {
56+ let asset1 = match getString(Address(incubatorAddress), toBase58String(assetId)) {
57+ case b: String =>
58+ b
59+ case _ =>
60+ ""
61+ }
62+ if ((asset1 != ""))
63+ then asset1
64+ else {
65+ let asset2 = match getString(Address(breederAddress), toBase58String(assetId)) {
66+ case c: String =>
67+ c
68+ case _ =>
69+ ""
70+ }
71+ if ((asset2 != ""))
72+ then asset2
73+ else ""
74+ }
75+ }
76+
77+
4478 func getBidCancelResults (auctionId,bidId) = {
4579 let isEggSell = tryGetBoolean((("auction_" + auctionId) + "_eggSell"))
4680 let paymentAssetId = if ((isEggSell == true))
5387 }
5488
5589
56-func getAssetGenotype (assetId) = if ((value(assetInfo(assetId)).issuer == Address(NFTIssuerAddress)))
57- then "ART"
58- else ""
59-
60-
6190 @Callable(i)
6291 func initAuction (startPrice,instantPrice,description,eggSell) = {
63- let auctionId = toBase58String(i.transactionId)
92+ let globalCounter = getGlobalCounter()
93+ let auctionId = (toBase58String(i.transactionId) + toString(globalCounter))
6494 let pmt = value(i.payments[0])
6595 let assetId = value(pmt.assetId)
6696 let asset = getAssetGenotype(assetId)
6797 if ((asset == ""))
6898 then throw("You can only sell an NFT-duck created in incubator or breeder")
69- else [StringEntry((("auction_" + auctionId) + "_status"), "open"), BooleanEntry((("auction_" + auctionId) + "_eggSell"), (eggSell == "true")), StringEntry((("auction_" + toBase58String(assetId)) + "_last"), auctionId), StringEntry((("auction_" + auctionId) + "_assetGen"), asset), StringEntry((("auction_" + auctionId) + "_assetId"), toBase58String(assetId)), IntegerEntry((("auction_" + auctionId) + "_startedAt"), lastBlock.timestamp), StringEntry((("auction_" + auctionId) + "_owner"), toString(i.originCaller)), StringEntry((("auction_" + auctionId) + "_description"), description), IntegerEntry((("auction_" + auctionId) + "_startPrice"), startPrice), BooleanEntry((("auction_" + auctionId) + "_isArtefact"), (value(assetInfo(assetId)).issuer == Address(NFTIssuerAddress))), IntegerEntry((("auction_" + auctionId) + "_instantPrice"), instantPrice), StringEntry((((("address_" + toString(i.originCaller)) + "_auction_") + auctionId) + "_lockedNFT"), toBase58String(assetId))]
99+ else [StringEntry((("auction_" + auctionId) + "_status"), "open"), BooleanEntry((("auction_" + auctionId) + "_eggSell"), (eggSell == "true")), IntegerEntry(kGlobalCounter, (globalCounter + 1)), StringEntry((("auction_" + toBase58String(assetId)) + "_last"), auctionId), StringEntry((("auction_" + auctionId) + "_assetGen"), asset), StringEntry((("auction_" + auctionId) + "_assetId"), toBase58String(assetId)), IntegerEntry((("auction_" + auctionId) + "_startedAt"), lastBlock.timestamp), StringEntry((("auction_" + auctionId) + "_owner"), toString(i.originCaller)), StringEntry((("auction_" + auctionId) + "_description"), description), IntegerEntry((("auction_" + auctionId) + "_startPrice"), startPrice), BooleanEntry((("auction_" + auctionId) + "_isArtefact"), (value(assetInfo(assetId)).issuer == Address(artefactsAddress))), IntegerEntry((("auction_" + auctionId) + "_instantPrice"), instantPrice), StringEntry((((("address_" + toString(i.originCaller)) + "_auction_") + auctionId) + "_lockedNFT"), toBase58String(assetId))]
100+ }
101+
102+
103+
104+@Callable(i)
105+func cancelAuction (auctionId) = {
106+ let auctionOwner = tryGetString((("auction_" + auctionId) + "_owner"))
107+ if ((toString(i.originCaller) != auctionOwner))
108+ then throw("Only allowed to auction owner")
109+ else if ((tryGetString((("auction_" + auctionId) + "_status")) != "open"))
110+ then throw("auction is close")
111+ else [StringEntry((("auction_" + auctionId) + "_status"), "cancelled"), DeleteEntry((((("address_" + auctionOwner) + "_auction_") + auctionId) + "_lockedNFT")), ScriptTransfer(i.originCaller, 1, fromBase58String(getStringValue(this, (("auction_" + auctionId) + "_assetId"))))]
112+ }
113+
114+
115+
116+@Callable(i)
117+func instantBuy (auctionId) = {
118+ let isEggSell = tryGetBoolean((("auction_" + auctionId) + "_eggSell"))
119+ let paymentAssetId = if ((isEggSell == true))
120+ then eggAssetId
121+ else unit
122+ let paymentAssetName = if ((isEggSell == true))
123+ then "EGG"
124+ else "WAVES"
125+ let pmt = value(i.payments[0])
126+ let amount = pmt.amount
127+ let assetId = tryGetString((("auction_" + auctionId) + "_assetId"))
128+ let bidId = toBase58String(i.transactionId)
129+ let auctionStatus = tryGetString((("auction_" + auctionId) + "_status"))
130+ let finalFee = if ((tryGetBoolean((("auction_" + auctionId) + "_isArtefact")) == true))
131+ then artefactsFeePercent
132+ else feePercent
133+ if ((pmt.assetId != paymentAssetId))
134+ then throw((("Auction does only support " + paymentAssetName) + " payments."))
135+ else if ((auctionStatus != "open"))
136+ then throw("Auction is closed. You cannot place a bid.")
137+ else {
138+ let instantPrice = tryGetInteger((("auction_" + auctionId) + "_instantPrice"))
139+ if ((instantPrice > amount))
140+ then throw(("For instant purchase you need to pay at least " + toString(instantPrice)))
141+ else {
142+ let auctionOwner = tryGetString((("auction_" + auctionId) + "_owner"))
143+ let recordPrice = tryGetInteger((assetId + "_recordPrice"))
144+ let newRecordPrice = max([recordPrice, amount])
145+[StringEntry((("auction_" + auctionId) + "_status"), "finished"), IntegerEntry((("auction_" + auctionId) + "_finalPrice"), amount), IntegerEntry((assetId + "_recordPrice"), newRecordPrice), StringEntry((((("assetId_" + assetId) + "_bid_") + bidId) + "_data"), (((((("{\"auctionId\": \"" + auctionId) + "\", \"author\": \"") + toString(i.originCaller)) + "\", \"amount\": \"") + toString(amount)) + "\", \"status\": \"finished\"}")), DeleteEntry((((("address_" + auctionOwner) + "_auction_") + auctionId) + "_lockedNFT")), ScriptTransfer(i.originCaller, 1, fromBase58String(getStringValue(this, (("auction_" + auctionId) + "_assetId")))), ScriptTransfer(addressFromStringValue(auctionOwner), fraction(amount, (100 - finalFee), 100), paymentAssetId), ScriptTransfer(Address(feeAggregator), fraction(amount, finalFee, 100), paymentAssetId)]
146+ }
147+ }
70148 }
71149
72150
86164 let assetId = getStringValue(this, (("auction_" + auctionId) + "_assetId"))
87165 if ((pmt.assetId != paymentAssetId))
88166 then throw((("Auction does only support " + paymentAssetName) + " payments."))
89- else {
90- let minPrice = tryGetInteger((("auction_" + auctionId) + "_startPrice"))
91- if ((minPrice > amount))
92- then throw(("The minimal initial price is set as " + toString(minPrice)))
93- else [StringEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_author"), toString(i.originCaller)), StringEntry((((("assetId_" + assetId) + "_bid_") + bidId) + "_data"), (((((("{\"auctionId\": \"" + auctionId) + "\", \"author\": \"") + toString(i.originCaller)) + "\", \"amount\": \"") + toString(amount)) + "\", \"status\": \"open\"}")), IntegerEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_amount"), amount), StringEntry(((((("address_" + toString(i.originCaller)) + "_auction_") + auctionId) + "_bid_") + bidId), assetId), StringEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_status"), "open")]
94- }
167+ else if ((tryGetString((("auction_" + auctionId) + "_status")) != "open"))
168+ then throw("Auction was closed")
169+ else {
170+ let minPrice = tryGetInteger((("auction_" + auctionId) + "_startPrice"))
171+ if ((minPrice > amount))
172+ then throw(("The minimal initial price is set as " + toString(minPrice)))
173+ else [StringEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_author"), toString(i.originCaller)), StringEntry((((("assetId_" + assetId) + "_bid_") + bidId) + "_data"), (((((("{\"auctionId\": \"" + auctionId) + "\", \"author\": \"") + toString(i.originCaller)) + "\", \"amount\": \"") + toString(amount)) + "\", \"status\": \"open\"}")), IntegerEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_amount"), amount), StringEntry(((((("address_" + toString(i.originCaller)) + "_auction_") + auctionId) + "_bid_") + bidId), assetId), StringEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_status"), "open")]
174+ }
95175 }
176+
177+
178+
179+@Callable(i)
180+func cancelBid (auctionId,bidId) = {
181+ let assetId = getStringValue(this, (("auction_" + auctionId) + "_assetId"))
182+ let bidAuthor = tryGetString((((("auction_" + auctionId) + "_bid_") + bidId) + "_author"))
183+ let bidAmount = tryGetInteger((((("auction_" + auctionId) + "_bid_") + bidId) + "_amount"))
184+ if ((toString(i.originCaller) != bidAuthor))
185+ then throw("Only allowed to the bid author")
186+ else if ((tryGetString((((("auction_" + auctionId) + "_bid_") + bidId) + "_status")) != "open"))
187+ then throw("bid is not open")
188+ else getBidCancelResults(auctionId, bidId)
189+ }
190+
191+
192+
193+@Callable(i)
194+func cancelOutdatedBid (auctionId,bidId) = throw("to be released")
96195
97196
98197
119218 else {
120219 let recordPrice = tryGetInteger((assetId + "_recordPrice"))
121220 let newRecordPrice = max([recordPrice, bidAmount])
122-[StringEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_status"), "finished"), StringEntry((("auction_" + auctionId) + "_status"), "finished"), StringEntry((((("assetId_" + assetId) + "_bid_") + bidId) + "_data"), (((((("{\"auctionId\": \"" + auctionId) + "\", \"author\": \"") + toString(i.originCaller)) + "\", \"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")), ScriptTransfer(i.caller, fraction(bidAmount, (100 - finalFee), 100), paymentAssetId), ScriptTransfer(Address(ownerAddress), fraction(bidAmount, finalFee, 100), paymentAssetId), ScriptTransfer(addressFromStringValue(bidAuthor), 1, fromBase58String(assetId))]
221+[StringEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_status"), "finished"), StringEntry((("auction_" + auctionId) + "_status"), "finished"), StringEntry((((("assetId_" + assetId) + "_bid_") + bidId) + "_data"), (((((("{\"auctionId\": \"" + auctionId) + "\", \"author\": \"") + toString(i.originCaller)) + "\", \"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")), ScriptTransfer(i.caller, fraction(bidAmount, (100 - finalFee), 100), paymentAssetId), ScriptTransfer(Address(feeAggregator), fraction(bidAmount, finalFee, 100), paymentAssetId), ScriptTransfer(addressFromStringValue(bidAuthor), 1, fromBase58String(assetId))]
123222 }
124- }
125-
126-
127-
128-@Callable(i)
129-func cancelBid (auctionId,bidId) = {
130- let assetId = getStringValue(this, (("auction_" + auctionId) + "_assetId"))
131- let bidAuthor = tryGetString((((("auction_" + auctionId) + "_bid_") + bidId) + "_author"))
132- let bidAmount = tryGetInteger((((("auction_" + auctionId) + "_bid_") + bidId) + "_amount"))
133- if ((toString(i.originCaller) != bidAuthor))
134- then throw("Only allowed to the bid author")
135- else if ((tryGetString((((("auction_" + auctionId) + "_bid_") + bidId) + "_status")) != "open"))
136- then throw("bid is not open")
137- else getBidCancelResults(auctionId, bidId)
138- }
139-
140-
141-
142-@Callable(i)
143-func cancelAuction (auctionId) = {
144- let auctionOwner = tryGetString((("auction_" + auctionId) + "_owner"))
145- if ((toString(i.originCaller) != auctionOwner))
146- then throw("Only allowed to auction owner")
147- else if ((tryGetString((("auction_" + auctionId) + "_status")) != "open"))
148- then throw("auction is close")
149- else [StringEntry((("auction_" + auctionId) + "_status"), "cancelled"), DeleteEntry((((("address_" + auctionOwner) + "_auction_") + auctionId) + "_lockedNFT")), ScriptTransfer(i.originCaller, 1, fromBase58String(getStringValue(this, (("auction_" + auctionId) + "_assetId"))))]
150223 }
151224
152225
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let NFTIssuerAddress = base58'3N992tjd7EWM6dSHrdVjjjuJrLD4koNztZ9'
4+let incubatorAddress = base58'3PEktVux2RhchSN63DsDo4b4mz4QqzKSeDv'
55
6-let eggAssetId = base58'2cf6jyVG19oHU79R8iHfqFEesjstr3e7nSYEUhb2WagB'
6+let breederAddress = base58'3PDVuU45H7Eh5dmtNbnRNRStGwULA7NY6Hb'
77
8-let ownerAddress = base58'3MpADDQFqadaCADNH9JDMQAGw9WEaMcymVU'
8+let artefactsAddress = base58'3P5E9xamcWoymiqLx8ZdmR7o4fJSRMGp1WR'
9+
10+let feeAggregator = base58'3P6AobNbcQ3ZjcRY37mJPKN8PP9Giz8kgeY'
11+
12+let eggAssetId = base58'C1iWsKGqLwjHUndiQ7iXpdmPum9PeCDFfyXBdJJosDRS'
13+
14+let kGlobalCounter = "GLOBAL_COUNTER"
915
1016 let feePercent = 5
1117
1218 let artefactsFeePercent = 20
1319
1420 func tryGetInteger (key) = {
1521 let val = match getInteger(this, key) {
1622 case b: Int =>
1723 b
1824 case _ =>
1925 0
2026 }
2127 val
2228 }
2329
2430
2531 func tryGetString (key) = {
2632 let val = match getString(this, key) {
2733 case b: String =>
2834 b
2935 case _ =>
3036 ""
3137 }
3238 val
3339 }
3440
3541
3642 func tryGetBoolean (key) = match getBoolean(this, key) {
3743 case b: Boolean =>
3844 b
3945 case _ =>
4046 false
4147 }
4248
4349
50+func getGlobalCounter () = tryGetInteger(kGlobalCounter)
51+
52+
53+func getAssetGenotype (assetId) = if ((value(assetInfo(assetId)).issuer == Address(artefactsAddress)))
54+ then "ART"
55+ else {
56+ let asset1 = match getString(Address(incubatorAddress), toBase58String(assetId)) {
57+ case b: String =>
58+ b
59+ case _ =>
60+ ""
61+ }
62+ if ((asset1 != ""))
63+ then asset1
64+ else {
65+ let asset2 = match getString(Address(breederAddress), toBase58String(assetId)) {
66+ case c: String =>
67+ c
68+ case _ =>
69+ ""
70+ }
71+ if ((asset2 != ""))
72+ then asset2
73+ else ""
74+ }
75+ }
76+
77+
4478 func getBidCancelResults (auctionId,bidId) = {
4579 let isEggSell = tryGetBoolean((("auction_" + auctionId) + "_eggSell"))
4680 let paymentAssetId = if ((isEggSell == true))
4781 then eggAssetId
4882 else unit
4983 let assetId = getStringValue(this, (("auction_" + auctionId) + "_assetId"))
5084 let bidAuthor = tryGetString((((("auction_" + auctionId) + "_bid_") + bidId) + "_author"))
5185 let bidAmount = tryGetInteger((((("auction_" + auctionId) + "_bid_") + bidId) + "_amount"))
5286 [StringEntry((((("assetId_" + assetId) + "_bid_") + bidId) + "_data"), (((((("{\"auctionId\": \"" + auctionId) + "\", \"author\": \"") + bidAuthor) + "\", \"amount\": \"") + toString(bidAmount)) + "\", \"status\": \"cancelled\"}")), StringEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_status"), "cancelled"), DeleteEntry(((((("address_" + bidAuthor) + "_auction_") + auctionId) + "_bid_") + bidId)), ScriptTransfer(Address(fromBase58String(bidAuthor)), bidAmount, paymentAssetId)]
5387 }
5488
5589
56-func getAssetGenotype (assetId) = if ((value(assetInfo(assetId)).issuer == Address(NFTIssuerAddress)))
57- then "ART"
58- else ""
59-
60-
6190 @Callable(i)
6291 func initAuction (startPrice,instantPrice,description,eggSell) = {
63- let auctionId = toBase58String(i.transactionId)
92+ let globalCounter = getGlobalCounter()
93+ let auctionId = (toBase58String(i.transactionId) + toString(globalCounter))
6494 let pmt = value(i.payments[0])
6595 let assetId = value(pmt.assetId)
6696 let asset = getAssetGenotype(assetId)
6797 if ((asset == ""))
6898 then throw("You can only sell an NFT-duck created in incubator or breeder")
69- else [StringEntry((("auction_" + auctionId) + "_status"), "open"), BooleanEntry((("auction_" + auctionId) + "_eggSell"), (eggSell == "true")), StringEntry((("auction_" + toBase58String(assetId)) + "_last"), auctionId), StringEntry((("auction_" + auctionId) + "_assetGen"), asset), StringEntry((("auction_" + auctionId) + "_assetId"), toBase58String(assetId)), IntegerEntry((("auction_" + auctionId) + "_startedAt"), lastBlock.timestamp), StringEntry((("auction_" + auctionId) + "_owner"), toString(i.originCaller)), StringEntry((("auction_" + auctionId) + "_description"), description), IntegerEntry((("auction_" + auctionId) + "_startPrice"), startPrice), BooleanEntry((("auction_" + auctionId) + "_isArtefact"), (value(assetInfo(assetId)).issuer == Address(NFTIssuerAddress))), IntegerEntry((("auction_" + auctionId) + "_instantPrice"), instantPrice), StringEntry((((("address_" + toString(i.originCaller)) + "_auction_") + auctionId) + "_lockedNFT"), toBase58String(assetId))]
99+ else [StringEntry((("auction_" + auctionId) + "_status"), "open"), BooleanEntry((("auction_" + auctionId) + "_eggSell"), (eggSell == "true")), IntegerEntry(kGlobalCounter, (globalCounter + 1)), StringEntry((("auction_" + toBase58String(assetId)) + "_last"), auctionId), StringEntry((("auction_" + auctionId) + "_assetGen"), asset), StringEntry((("auction_" + auctionId) + "_assetId"), toBase58String(assetId)), IntegerEntry((("auction_" + auctionId) + "_startedAt"), lastBlock.timestamp), StringEntry((("auction_" + auctionId) + "_owner"), toString(i.originCaller)), StringEntry((("auction_" + auctionId) + "_description"), description), IntegerEntry((("auction_" + auctionId) + "_startPrice"), startPrice), BooleanEntry((("auction_" + auctionId) + "_isArtefact"), (value(assetInfo(assetId)).issuer == Address(artefactsAddress))), IntegerEntry((("auction_" + auctionId) + "_instantPrice"), instantPrice), StringEntry((((("address_" + toString(i.originCaller)) + "_auction_") + auctionId) + "_lockedNFT"), toBase58String(assetId))]
100+ }
101+
102+
103+
104+@Callable(i)
105+func cancelAuction (auctionId) = {
106+ let auctionOwner = tryGetString((("auction_" + auctionId) + "_owner"))
107+ if ((toString(i.originCaller) != auctionOwner))
108+ then throw("Only allowed to auction owner")
109+ else if ((tryGetString((("auction_" + auctionId) + "_status")) != "open"))
110+ then throw("auction is close")
111+ else [StringEntry((("auction_" + auctionId) + "_status"), "cancelled"), DeleteEntry((((("address_" + auctionOwner) + "_auction_") + auctionId) + "_lockedNFT")), ScriptTransfer(i.originCaller, 1, fromBase58String(getStringValue(this, (("auction_" + auctionId) + "_assetId"))))]
112+ }
113+
114+
115+
116+@Callable(i)
117+func instantBuy (auctionId) = {
118+ let isEggSell = tryGetBoolean((("auction_" + auctionId) + "_eggSell"))
119+ let paymentAssetId = if ((isEggSell == true))
120+ then eggAssetId
121+ else unit
122+ let paymentAssetName = if ((isEggSell == true))
123+ then "EGG"
124+ else "WAVES"
125+ let pmt = value(i.payments[0])
126+ let amount = pmt.amount
127+ let assetId = tryGetString((("auction_" + auctionId) + "_assetId"))
128+ let bidId = toBase58String(i.transactionId)
129+ let auctionStatus = tryGetString((("auction_" + auctionId) + "_status"))
130+ let finalFee = if ((tryGetBoolean((("auction_" + auctionId) + "_isArtefact")) == true))
131+ then artefactsFeePercent
132+ else feePercent
133+ if ((pmt.assetId != paymentAssetId))
134+ then throw((("Auction does only support " + paymentAssetName) + " payments."))
135+ else if ((auctionStatus != "open"))
136+ then throw("Auction is closed. You cannot place a bid.")
137+ else {
138+ let instantPrice = tryGetInteger((("auction_" + auctionId) + "_instantPrice"))
139+ if ((instantPrice > amount))
140+ then throw(("For instant purchase you need to pay at least " + toString(instantPrice)))
141+ else {
142+ let auctionOwner = tryGetString((("auction_" + auctionId) + "_owner"))
143+ let recordPrice = tryGetInteger((assetId + "_recordPrice"))
144+ let newRecordPrice = max([recordPrice, amount])
145+[StringEntry((("auction_" + auctionId) + "_status"), "finished"), IntegerEntry((("auction_" + auctionId) + "_finalPrice"), amount), IntegerEntry((assetId + "_recordPrice"), newRecordPrice), StringEntry((((("assetId_" + assetId) + "_bid_") + bidId) + "_data"), (((((("{\"auctionId\": \"" + auctionId) + "\", \"author\": \"") + toString(i.originCaller)) + "\", \"amount\": \"") + toString(amount)) + "\", \"status\": \"finished\"}")), DeleteEntry((((("address_" + auctionOwner) + "_auction_") + auctionId) + "_lockedNFT")), ScriptTransfer(i.originCaller, 1, fromBase58String(getStringValue(this, (("auction_" + auctionId) + "_assetId")))), ScriptTransfer(addressFromStringValue(auctionOwner), fraction(amount, (100 - finalFee), 100), paymentAssetId), ScriptTransfer(Address(feeAggregator), fraction(amount, finalFee, 100), paymentAssetId)]
146+ }
147+ }
70148 }
71149
72150
73151
74152 @Callable(i)
75153 func placeBid (auctionId) = {
76154 let isEggSell = tryGetBoolean((("auction_" + auctionId) + "_eggSell"))
77155 let paymentAssetId = if ((isEggSell == true))
78156 then eggAssetId
79157 else unit
80158 let paymentAssetName = if ((isEggSell == true))
81159 then "EGG"
82160 else "WAVES"
83161 let pmt = value(i.payments[0])
84162 let amount = pmt.amount
85163 let bidId = toBase58String(i.transactionId)
86164 let assetId = getStringValue(this, (("auction_" + auctionId) + "_assetId"))
87165 if ((pmt.assetId != paymentAssetId))
88166 then throw((("Auction does only support " + paymentAssetName) + " payments."))
89- else {
90- let minPrice = tryGetInteger((("auction_" + auctionId) + "_startPrice"))
91- if ((minPrice > amount))
92- then throw(("The minimal initial price is set as " + toString(minPrice)))
93- else [StringEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_author"), toString(i.originCaller)), StringEntry((((("assetId_" + assetId) + "_bid_") + bidId) + "_data"), (((((("{\"auctionId\": \"" + auctionId) + "\", \"author\": \"") + toString(i.originCaller)) + "\", \"amount\": \"") + toString(amount)) + "\", \"status\": \"open\"}")), IntegerEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_amount"), amount), StringEntry(((((("address_" + toString(i.originCaller)) + "_auction_") + auctionId) + "_bid_") + bidId), assetId), StringEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_status"), "open")]
94- }
167+ else if ((tryGetString((("auction_" + auctionId) + "_status")) != "open"))
168+ then throw("Auction was closed")
169+ else {
170+ let minPrice = tryGetInteger((("auction_" + auctionId) + "_startPrice"))
171+ if ((minPrice > amount))
172+ then throw(("The minimal initial price is set as " + toString(minPrice)))
173+ else [StringEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_author"), toString(i.originCaller)), StringEntry((((("assetId_" + assetId) + "_bid_") + bidId) + "_data"), (((((("{\"auctionId\": \"" + auctionId) + "\", \"author\": \"") + toString(i.originCaller)) + "\", \"amount\": \"") + toString(amount)) + "\", \"status\": \"open\"}")), IntegerEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_amount"), amount), StringEntry(((((("address_" + toString(i.originCaller)) + "_auction_") + auctionId) + "_bid_") + bidId), assetId), StringEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_status"), "open")]
174+ }
95175 }
176+
177+
178+
179+@Callable(i)
180+func cancelBid (auctionId,bidId) = {
181+ let assetId = getStringValue(this, (("auction_" + auctionId) + "_assetId"))
182+ let bidAuthor = tryGetString((((("auction_" + auctionId) + "_bid_") + bidId) + "_author"))
183+ let bidAmount = tryGetInteger((((("auction_" + auctionId) + "_bid_") + bidId) + "_amount"))
184+ if ((toString(i.originCaller) != bidAuthor))
185+ then throw("Only allowed to the bid author")
186+ else if ((tryGetString((((("auction_" + auctionId) + "_bid_") + bidId) + "_status")) != "open"))
187+ then throw("bid is not open")
188+ else getBidCancelResults(auctionId, bidId)
189+ }
190+
191+
192+
193+@Callable(i)
194+func cancelOutdatedBid (auctionId,bidId) = throw("to be released")
96195
97196
98197
99198 @Callable(i)
100199 func acceptBid (auctionId,bidId) = {
101200 let isEggSell = tryGetBoolean((("auction_" + auctionId) + "_eggSell"))
102201 let paymentAssetId = if ((isEggSell == true))
103202 then eggAssetId
104203 else unit
105204 let auctionOwner = tryGetString((("auction_" + auctionId) + "_owner"))
106205 let bidAuthor = tryGetString((((("auction_" + auctionId) + "_bid_") + bidId) + "_author"))
107206 let bidAmount = tryGetInteger((((("auction_" + auctionId) + "_bid_") + bidId) + "_amount"))
108207 let bidStatus = tryGetString((((("auction_" + auctionId) + "_bid_") + bidId) + "_status"))
109208 let assetId = tryGetString((("auction_" + auctionId) + "_assetId"))
110209 let finalFee = if ((tryGetBoolean((("auction_" + auctionId) + "_isArtefact")) == true))
111210 then artefactsFeePercent
112211 else feePercent
113212 if ((toString(i.originCaller) != auctionOwner))
114213 then throw("Only allowed to auction owner")
115214 else if ((bidStatus != "open"))
116215 then throw("Bid was cancelled and cannot be accepted")
117216 else if ((tryGetString((("auction_" + auctionId) + "_status")) != "open"))
118217 then throw("Auction was closed")
119218 else {
120219 let recordPrice = tryGetInteger((assetId + "_recordPrice"))
121220 let newRecordPrice = max([recordPrice, bidAmount])
122-[StringEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_status"), "finished"), StringEntry((("auction_" + auctionId) + "_status"), "finished"), StringEntry((((("assetId_" + assetId) + "_bid_") + bidId) + "_data"), (((((("{\"auctionId\": \"" + auctionId) + "\", \"author\": \"") + toString(i.originCaller)) + "\", \"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")), ScriptTransfer(i.caller, fraction(bidAmount, (100 - finalFee), 100), paymentAssetId), ScriptTransfer(Address(ownerAddress), fraction(bidAmount, finalFee, 100), paymentAssetId), ScriptTransfer(addressFromStringValue(bidAuthor), 1, fromBase58String(assetId))]
221+[StringEntry((((("auction_" + auctionId) + "_bid_") + bidId) + "_status"), "finished"), StringEntry((("auction_" + auctionId) + "_status"), "finished"), StringEntry((((("assetId_" + assetId) + "_bid_") + bidId) + "_data"), (((((("{\"auctionId\": \"" + auctionId) + "\", \"author\": \"") + toString(i.originCaller)) + "\", \"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")), ScriptTransfer(i.caller, fraction(bidAmount, (100 - finalFee), 100), paymentAssetId), ScriptTransfer(Address(feeAggregator), fraction(bidAmount, finalFee, 100), paymentAssetId), ScriptTransfer(addressFromStringValue(bidAuthor), 1, fromBase58String(assetId))]
123222 }
124- }
125-
126-
127-
128-@Callable(i)
129-func cancelBid (auctionId,bidId) = {
130- let assetId = getStringValue(this, (("auction_" + auctionId) + "_assetId"))
131- let bidAuthor = tryGetString((((("auction_" + auctionId) + "_bid_") + bidId) + "_author"))
132- let bidAmount = tryGetInteger((((("auction_" + auctionId) + "_bid_") + bidId) + "_amount"))
133- if ((toString(i.originCaller) != bidAuthor))
134- then throw("Only allowed to the bid author")
135- else if ((tryGetString((((("auction_" + auctionId) + "_bid_") + bidId) + "_status")) != "open"))
136- then throw("bid is not open")
137- else getBidCancelResults(auctionId, bidId)
138- }
139-
140-
141-
142-@Callable(i)
143-func cancelAuction (auctionId) = {
144- let auctionOwner = tryGetString((("auction_" + auctionId) + "_owner"))
145- if ((toString(i.originCaller) != auctionOwner))
146- then throw("Only allowed to auction owner")
147- else if ((tryGetString((("auction_" + auctionId) + "_status")) != "open"))
148- then throw("auction is close")
149- else [StringEntry((("auction_" + auctionId) + "_status"), "cancelled"), DeleteEntry((((("address_" + auctionOwner) + "_auction_") + auctionId) + "_lockedNFT")), ScriptTransfer(i.originCaller, 1, fromBase58String(getStringValue(this, (("auction_" + auctionId) + "_assetId"))))]
150223 }
151224
152225
153226 @Verifier(tx)
154227 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
155228

github/deemru/w8io/03bedc9 
54.68 ms