tx · DyCbjGcAJwMHyz1FMLjUHGm493mA17Rw6QWrtYYNKF33

3N4boZRUJ2LxY5jLyp6hmxGktqnawQidu6H:  -0.10000000 Waves

2022.11.07 14:40 [2306677] smart account 3N4boZRUJ2LxY5jLyp6hmxGktqnawQidu6H > SELF 0.00000000 Waves

{ "type": 13, "id": "DyCbjGcAJwMHyz1FMLjUHGm493mA17Rw6QWrtYYNKF33", "fee": 10000000, "feeAssetId": null, "timestamp": 1667821231135, "version": 2, "chainId": 84, "sender": "3N4boZRUJ2LxY5jLyp6hmxGktqnawQidu6H", "senderPublicKey": "BDeCphaaC4MZvfmbJqQZ78EvuEBZTJ1VEW7fbxue8BUu", "proofs": [ "nDskrcNERSoQtwsFRf6h5tRUTYyE1DM5mZkuxgv4uXT3hFVWJQ7LgtX4C6uJfNzkhjnzhKTabE6fqpJwotS8H8p" ], "script": "base64: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ABhjYWxjUHJpY2VBdEN1cnJlbnRNb21lbnQAAAACAAAAB2Fzc2V0SWQAAAAGbW9tZW50BAAAAAdkZXRhaWxzCQEAAAAKZ2V0QXVjdGlvbgAAAAEFAAAAB2Fzc2V0SWQEAAAACyR0MDI4MTcyOTIxCQEAAAAOcGFyc2VBc0F1Y3Rpb24AAAABBQAAAAdkZXRhaWxzBAAAAAZzZWxsZXIIBQAAAAskdDAyODE3MjkyMQAAAAJfMQQAAAAPc3RhcnRQcmljZVZhbHVlCAUAAAALJHQwMjgxNzI5MjEAAAACXzIEAAAADWVuZFByaWNlVmFsdWUIBQAAAAskdDAyODE3MjkyMQAAAAJfMwQAAAAQc3RhcnRQZXJpb2RWYWx1ZQgFAAAACyR0MDI4MTcyOTIxAAAAAl80BAAAAA5lbmRQZXJpb2RWYWx1ZQgFAAAACyR0MDI4MTcyOTIxAAAAAl81AwkAAGcAAAACBQAAAAZtb21lbnQFAAAADmVuZFBlcmlvZFZhbHVlCQAFFAAAAAIFAAAABnNlbGxlcgUAAAANZW5kUHJpY2VWYWx1ZQQAAAAKZGVsdGFQcmljZQkAAGUAAAACBQAAAA9zdGFydFByaWNlVmFsdWUFAAAADWVuZFByaWNlVmFsdWUEAAAABnBlcmlvZAkAAGUAAAACBQAAAA5lbmRQZXJpb2RWYWx1ZQUAAAAQc3RhcnRQZXJpb2RWYWx1ZQQAAAAHc3BlbmRlZAkAAGUAAAACBQAAAAZtb21lbnQFAAAAEHN0YXJ0UGVyaW9kVmFsdWUJAAUUAAAAAgUAAAAGc2VsbGVyCQAAZQAAAAIFAAAAD3N0YXJ0UHJpY2VWYWx1ZQkAAGsAAAADBQAAAAdzcGVuZGVkBQAAAApkZWx0YVByaWNlBQAAAAZwZXJpb2QBAAAABWlzTmZ0AAAAAQAAAAdhc3NldElkBAAAAAckbWF0Y2gwCQAD7AAAAAEFAAAAB2Fzc2V0SWQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABUFzc2V0BAAAAAV0b2tlbgUAAAAHJG1hdGNoMAMDCQAAAAAAAAIIBQAAAAV0b2tlbgAAAAhkZWNpbWFscwAAAAAAAAAAAAkAAAAAAAACCAUAAAAFdG9rZW4AAAAIcXVhbnRpdHkAAAAAAAAAAAEHCQAAAAAAAAIIBQAAAAV0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BQAAAAxwYXltZW50QXNzZXQFAAAADXBheW1lbnRBbW91bnQFAAAACnByaWNlVmFsdWUEAAAACyR0MDY0NTk2NTYxCQEAAAAScmVzdWx0RnVuZHNBbW91bnRzAAAAAwkBAAAADGlzVHJ1c3RlZE5mdAAAAAEFAAAAB2Fzc2V0SWQFAAAADXBheW1lbnRBbW91bnQFAAAACnByaWNlVmFsdWUEAAAADHNlbGxlckFtb3VudAgFAAAACyR0MDY0NTk2NTYxAAAAAl8xBAAAAAtidXllckFtb3VudAgFAAAACyR0MDY0NTk2NTYxAAAAAl8yBAAAAAp1cGRhdGVkUmVzCQAETgAAAAIFAAAAB2Jhc2VSZXMJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAGc2VsbGVyBQAAAAxzZWxsZXJBbW91bnQFAAAABHVuaXQFAAAAA25pbAMJAABmAAAAAgUAAAALYnV5ZXJBbW91bnQAAAAAAAAAAAAJAAROAAAAAgUAAAAKdXBkYXRlZFJlcwkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAAC2J1eWVyQW1vdW50BQAAAAR1bml0BQAAAANuaWwFAAAACnVwZGF0ZWRSZXMEAAAACyR0MDY3Nzg2ODQ3CQEAAAAYY2FsY1ByaWNlQXRDdXJyZW50TW9tZW50AAAAAgUAAAAHYXNzZXRJZAUAAAAGaGVpZ2h0BAAAAAZzZWxsZXIIBQAAAAskdDA2Nzc4Njg0NwAAAAJfMQQAAAALYWN0dWFsUHJpY2UIBQAAAAskdDA2Nzc4Njg0NwAAAAJfMgkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkBAAAAEWlzQ29ycmVjdFBheW1lbnRzAAAAAwUAAAAMcGF5bWVudEFzc2V0BQAAAA1wYXltZW50QW1vdW50BQAAAAthY3R1YWxQcmljZQQAAAALJHQwNjkzMzcwMzYJAQAAABJyZXN1bHRGdW5kc0Ftb3VudHMAAAADCQEAAAAMaXNUcnVzdGVkTmZ0AAAAAQUAAAAHYXNzZXRJZAUAAAANcGF5bWVudEFtb3VudAUAAAALYWN0dWFsUHJpY2UEAAAADHNlbGxlckFtb3VudAgFAAAACyR0MDY5MzM3MDM2AAAA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", "height": 2306677, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: WVSsHH5VQvfZETML6aBa5gDiJDBszKbZpuq5TqUqkGt Next: 9wuEB5QZmcXQ8SjdzgfbM9CzXd9dhyYq1TAbJodqZ3TR Diff:
OldNewDifferences
1-{-# STDLIB_VERSION 6 #-}
1+{-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let separator = "_"
55
6-let kBuy = "buy"
6+let kAuction = "auction"
77
88 let kSell = "sell"
99
10+let kTrusted = "trusted"
11+
1012 let kPrice = "price"
13+
14+func getSlotKey (prefix,nftId) = ((prefix + separator) + toBase58String(nftId))
15+
16+
17+func getPriceKey (nftId) = ((kPrice + separator) + toBase58String(nftId))
18+
19+
20+func getSellKey (nftId) = ((kSell + separator) + toBase58String(nftId))
21+
22+
23+func getAuctionKey (nftId) = ((kAuction + separator) + toBase58String(nftId))
24+
25+
26+func getTrustedKey (issuer) = ((kTrusted + separator) + toString(issuer))
27+
28+
29+func addToList (accum,nextValue) = (accum ++ [nextValue])
30+
31+
32+func joinString (params) = {
33+ let length = size(params)
34+ if ((length == 0))
35+ then throw("Empty params")
36+ else if ((length == 1))
37+ then makeString({
38+ let $l = params
39+ let $s = size($l)
40+ let $acc0 = nil
41+ func $f0_1 ($a,$i) = if (($i >= $s))
42+ then $a
43+ else addToList($a, $l[$i])
44+
45+ func $f0_2 ($a,$i) = if (($i >= $s))
46+ then $a
47+ else throw("List size exceeds 1")
48+
49+ $f0_2($f0_1($acc0, 0), 1)
50+ }, separator)
51+ else if ((length == 2))
52+ then makeString({
53+ let $l = params
54+ let $s = size($l)
55+ let $acc0 = nil
56+ func $f0_1 ($a,$i) = if (($i >= $s))
57+ then $a
58+ else addToList($a, $l[$i])
59+
60+ func $f0_2 ($a,$i) = if (($i >= $s))
61+ then $a
62+ else throw("List size exceeds 2")
63+
64+ $f0_2($f0_1($f0_1($acc0, 0), 1), 2)
65+ }, separator)
66+ else if ((length == 3))
67+ then makeString({
68+ let $l = params
69+ let $s = size($l)
70+ let $acc0 = nil
71+ func $f0_1 ($a,$i) = if (($i >= $s))
72+ then $a
73+ else addToList($a, $l[$i])
74+
75+ func $f0_2 ($a,$i) = if (($i >= $s))
76+ then $a
77+ else throw("List size exceeds 3")
78+
79+ $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
80+ }, separator)
81+ else if ((length == 4))
82+ then makeString({
83+ let $l = params
84+ let $s = size($l)
85+ let $acc0 = nil
86+ func $f0_1 ($a,$i) = if (($i >= $s))
87+ then $a
88+ else addToList($a, $l[$i])
89+
90+ func $f0_2 ($a,$i) = if (($i >= $s))
91+ then $a
92+ else throw("List size exceeds 4")
93+
94+ $f0_2($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4)
95+ }, separator)
96+ else if ((length == 5))
97+ then makeString({
98+ let $l = params
99+ let $s = size($l)
100+ let $acc0 = nil
101+ func $f0_1 ($a,$i) = if (($i >= $s))
102+ then $a
103+ else addToList($a, $l[$i])
104+
105+ func $f0_2 ($a,$i) = if (($i >= $s))
106+ then $a
107+ else throw("List size exceeds 5")
108+
109+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
110+ }, separator)
111+ else throw("Max number of parameters exceeded")
112+ }
113+
114+
115+func parseAsAuction (details) = {
116+ let res = split(details, separator)
117+ $Tuple5(addressFromStringValue(res[0]), parseIntValue(res[1]), parseIntValue(res[2]), parseIntValue(res[3]), parseIntValue(res[4]))
118+ }
119+
120+
121+func parseAsSell (details) = {
122+ let res = split(details, separator)
123+ $Tuple2(addressFromStringValue(res[0]), parseIntValue(res[1]))
124+ }
125+
126+
127+func joinStruct (params) = match params {
128+ case auction: (Address, Int, Int, Int, Int) =>
129+ joinString([toString(auction._1), toString(auction._2), toString(auction._3), toString(auction._4), toString(auction._5)])
130+ case sell: (Address, Int) =>
131+ joinString([toString(sell._1), toString(sell._2)])
132+ case _ =>
133+ throw("Wrong params tupple")
134+}
135+
136+
137+func setAuction (seller,nftId,startPrice,endPrice,start,end) = StringEntry(getAuctionKey(nftId), joinStruct($Tuple5(seller, startPrice, endPrice, start, end)))
138+
139+
140+func setSell (nftId,celler,price) = StringEntry(getSellKey(nftId), joinStruct($Tuple2(celler, price)))
141+
142+
143+func getAuction (nftId) = value(getString(this, getAuctionKey(nftId)))
144+
145+
146+func getSell (nftId) = value(getString(this, getSellKey(nftId)))
147+
148+
149+func calcPriceAtCurrentMoment (assetId,moment) = {
150+ let details = getAuction(assetId)
151+ let $t028172921 = parseAsAuction(details)
152+ let seller = $t028172921._1
153+ let startPriceValue = $t028172921._2
154+ let endPriceValue = $t028172921._3
155+ let startPeriodValue = $t028172921._4
156+ let endPeriodValue = $t028172921._5
157+ if ((moment >= endPeriodValue))
158+ then $Tuple2(seller, endPriceValue)
159+ else {
160+ let deltaPrice = (startPriceValue - endPriceValue)
161+ let period = (endPeriodValue - startPeriodValue)
162+ let spended = (moment - startPeriodValue)
163+ $Tuple2(seller, (startPriceValue - fraction(spended, deltaPrice, period)))
164+ }
165+ }
166+
11167
12168 func isNft (assetId) = match assetInfo(assetId) {
13169 case token: Asset =>
21177 }
22178
23179
180+func isTrustedNft (assetId) = {
181+ let issuer = value(assetInfo(assetId)).issuer
182+ valueOrElse(getBoolean(this, getTrustedKey(issuer)), false)
183+ }
184+
185+
186+func isSellExist (assetId) = isDefined(getString(this, getSellKey(assetId)))
187+
188+
189+func isAuctionExist (assetId) = isDefined(getString(this, getAuctionKey(assetId)))
190+
191+
192+func isCorrectSellPrice (price) = (price > 0)
193+
194+
195+func isCorrectAuctionPeriod (start,end) = (end > start)
196+
197+
198+func isCorrectAuctionPrices (startPrice,endPrice) = (startPrice > endPrice)
199+
200+
201+func isAdmin (caller) = (caller == this)
202+
203+
204+func isValidCaller (caller,seller) = if ((caller == this))
205+ then true
206+ else (caller == seller)
207+
208+
209+func isAuctionEnded (now,end) = (now > end)
210+
211+
212+func isEnoughFunds (payment,currentMomentPrice) = (payment >= currentMomentPrice)
213+
214+
215+func isWawes (assetId) = (assetId == unit)
216+
217+
218+func isCorrectNft (nftId) = if (!(isNft(nftId)))
219+ then throw("Token is not Nft")
220+ else if (isSellExist(nftId))
221+ then throw("Sell already exists")
222+ else if (isAuctionExist(nftId))
223+ then throw("Auction already exists")
224+ else unit
225+
226+
227+func isCorrectPayments (paymentAsset,paymentAmount,price) = if (!(isWawes(paymentAsset)))
228+ then throw("Payment must be at WAVES")
229+ else if (!(isEnoughFunds(paymentAmount, price)))
230+ then throw("Not enough funds")
231+ else unit
232+
233+
234+func calcFee () = 0
235+
236+
237+func calcTrustedFee () = 0
238+
239+
240+func resultFundsAmounts (isTrusted,paymentAmount,actualPrice) = if (isTrusted)
241+ then $Tuple2((actualPrice - calcTrustedFee()), (paymentAmount - actualPrice))
242+ else $Tuple2((actualPrice - calcFee()), (paymentAmount - actualPrice))
243+
244+
245+func getSlot (nftId) = if (isSellExist(nftId))
246+ then $Tuple2(kSell, getSell(nftId))
247+ else if (isAuctionExist(nftId))
248+ then $Tuple2(kAuction, getAuction(nftId))
249+ else throw("Slot doesn`t exist")
250+
251+
24252 @Callable(i)
25-func issueNft (name,meta,price) = {
26- let newToken = Issue(name, meta, 1, 0, false)
27- let issueId = calculateAssetId(newToken)
28-[newToken, StringEntry(((kPrice + separator) + toBase58String(issueId)), toString(price))]
253+func addSell (price) = {
254+ let nftId = value(i.payments[0].assetId)
255+ valueOrElse(isCorrectNft(nftId), if (!(isCorrectSellPrice(price)))
256+ then throw("Price must be > 0")
257+ else [setSell(nftId, i.caller, price)])
29258 }
30259
31260
32261
33262 @Callable(i)
34-func buyNFT (nftID) = {
35- let assetId = fromBase58String(nftID)
36- let amount = value(i.payments[0].amount)
37- let price = valueOrErrorMessage(getString(((kPrice + separator) + nftID)), "There is no price for this nft")
38- if ((i.payments[0].assetId != unit))
39- then throw("pay in waves")
40- else if ((parseIntValue(price) > amount))
41- then throw("Invalid payment")
42- else [ScriptTransfer(i.caller, 1, assetId), StringEntry(((toString(i.caller) + separator) + kBuy), ((nftID + separator) + toString(amount)))]
263+func addAuction (startPrice,endPrice,start,end) = {
264+ let nftId = value(i.payments[0].assetId)
265+ valueOrElse(isCorrectNft(nftId), if (!(isCorrectAuctionPeriod(start, end)))
266+ then throw("Period is not correct")
267+ else if (!(isCorrectAuctionPrices(startPrice, endPrice)))
268+ then throw("Start price must be > endPrice")
269+ else [setAuction(i.caller, nftId, startPrice, endPrice, start, end)])
43270 }
44271
45272
46273
47274 @Callable(i)
48-func sellNFT () = {
49- let $t011731258 = $Tuple2(value(i.payments[0].assetId), value(i.payments[0].amount))
50- let token0 = $t011731258._1
51- let amount0 = $t011731258._2
52- let price = getStringValue(((kPrice + separator) + valueOrErrorMessage(toBase58String(token0), "There is no price for this nft")))
53- if (!(isNft(token0)))
54- then throw("Token is not NFT")
55- else [ScriptTransfer(i.caller, parseIntValue(price), unit), StringEntry(((toString(i.caller) + separator) + kSell), ((toBase58String(token0) + separator) + toString(amount0)))]
275+func buyFromSlot (nftId) = {
276+ let $t060146103 = $Tuple2(i.payments[0].assetId, value(i.payments[0].amount))
277+ let paymentAsset = $t060146103._1
278+ let paymentAmount = $t060146103._2
279+ let assetId = fromBase58String(nftId)
280+ let $t061476185 = getSlot(assetId)
281+ let type = $t061476185._1
282+ let details = $t061476185._2
283+ let baseRes = [ScriptTransfer(i.caller, 1, assetId), DeleteEntry(getSlotKey(type, assetId))]
284+ if ((type == kSell))
285+ then {
286+ let $t063276374 = parseAsSell(details)
287+ let seller = $t063276374._1
288+ let priceValue = $t063276374._2
289+ valueOrElse(isCorrectPayments(paymentAsset, paymentAmount, priceValue), {
290+ let $t064596561 = resultFundsAmounts(isTrustedNft(assetId), paymentAmount, priceValue)
291+ let sellerAmount = $t064596561._1
292+ let buyerAmount = $t064596561._2
293+ let updatedRes = (baseRes ++ [ScriptTransfer(seller, sellerAmount, unit)])
294+ if ((buyerAmount > 0))
295+ then (updatedRes ++ [ScriptTransfer(i.caller, buyerAmount, unit)])
296+ else updatedRes
297+ })
298+ }
299+ else {
300+ let $t067786847 = calcPriceAtCurrentMoment(assetId, height)
301+ let seller = $t067786847._1
302+ let actualPrice = $t067786847._2
303+ valueOrElse(isCorrectPayments(paymentAsset, paymentAmount, actualPrice), {
304+ let $t069337036 = resultFundsAmounts(isTrustedNft(assetId), paymentAmount, actualPrice)
305+ let sellerAmount = $t069337036._1
306+ let buyerAmount = $t069337036._2
307+ let updatedRes = (baseRes ++ [ScriptTransfer(seller, sellerAmount, unit)])
308+ if ((buyerAmount > 0))
309+ then (updatedRes ++ [ScriptTransfer(i.caller, buyerAmount, unit)])
310+ else updatedRes
311+ })
312+ }
313+ }
314+
315+
316+
317+@Callable(i)
318+func declineSlot (nftId) = {
319+ let assetId = fromBase58String(nftId)
320+ let $t073377375 = getSlot(assetId)
321+ let type = $t073377375._1
322+ let details = $t073377375._2
323+ let baseRes = [DeleteEntry(getSlotKey(type, assetId))]
324+ if ((type == kSell))
325+ then {
326+ let $t074677514 = parseAsSell(details)
327+ let seller = $t074677514._1
328+ let priceValue = $t074677514._2
329+ if (!(isValidCaller(i.caller, seller)))
330+ then throw("Invalid caller")
331+ else (baseRes ++ [ScriptTransfer(seller, 1, assetId)])
332+ }
333+ else {
334+ let $t076597763 = parseAsAuction(details)
335+ let seller = $t076597763._1
336+ let startPriceValue = $t076597763._2
337+ let endPriceValue = $t076597763._3
338+ let startPeriodValue = $t076597763._4
339+ let endPeriodValue = $t076597763._5
340+ if (!(isValidCaller(i.caller, seller)))
341+ then throw("Invalid caller")
342+ else if (!(isAuctionEnded(height, endPeriodValue)))
343+ then throw("Wait for end of auction")
344+ else (baseRes ++ [ScriptTransfer(seller, 1, assetId)])
345+ }
346+ }
347+
348+
349+
350+@Callable(i)
351+func setTrustedIssuer (trustedAddr) = if (!(isAdmin(i.caller)))
352+ then throw("Only admin")
353+ else [BooleanEntry(getTrustedKey(addressFromStringValue(trustedAddr)), true)]
354+
355+
356+
357+@Callable(i)
358+func getPriceAtCurrentMoment (nftId,moment) = {
359+ let assetId = fromBase58String(nftId)
360+ let $t083048367 = calcPriceAtCurrentMoment(assetId, moment)
361+ let seller = $t083048367._1
362+ let price = $t083048367._2
363+[IntegerEntry(getPriceKey(assetId), price)]
56364 }
57365
58366
Full:
OldNewDifferences
1-{-# STDLIB_VERSION 6 #-}
1+{-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let separator = "_"
55
6-let kBuy = "buy"
6+let kAuction = "auction"
77
88 let kSell = "sell"
99
10+let kTrusted = "trusted"
11+
1012 let kPrice = "price"
13+
14+func getSlotKey (prefix,nftId) = ((prefix + separator) + toBase58String(nftId))
15+
16+
17+func getPriceKey (nftId) = ((kPrice + separator) + toBase58String(nftId))
18+
19+
20+func getSellKey (nftId) = ((kSell + separator) + toBase58String(nftId))
21+
22+
23+func getAuctionKey (nftId) = ((kAuction + separator) + toBase58String(nftId))
24+
25+
26+func getTrustedKey (issuer) = ((kTrusted + separator) + toString(issuer))
27+
28+
29+func addToList (accum,nextValue) = (accum ++ [nextValue])
30+
31+
32+func joinString (params) = {
33+ let length = size(params)
34+ if ((length == 0))
35+ then throw("Empty params")
36+ else if ((length == 1))
37+ then makeString({
38+ let $l = params
39+ let $s = size($l)
40+ let $acc0 = nil
41+ func $f0_1 ($a,$i) = if (($i >= $s))
42+ then $a
43+ else addToList($a, $l[$i])
44+
45+ func $f0_2 ($a,$i) = if (($i >= $s))
46+ then $a
47+ else throw("List size exceeds 1")
48+
49+ $f0_2($f0_1($acc0, 0), 1)
50+ }, separator)
51+ else if ((length == 2))
52+ then makeString({
53+ let $l = params
54+ let $s = size($l)
55+ let $acc0 = nil
56+ func $f0_1 ($a,$i) = if (($i >= $s))
57+ then $a
58+ else addToList($a, $l[$i])
59+
60+ func $f0_2 ($a,$i) = if (($i >= $s))
61+ then $a
62+ else throw("List size exceeds 2")
63+
64+ $f0_2($f0_1($f0_1($acc0, 0), 1), 2)
65+ }, separator)
66+ else if ((length == 3))
67+ then makeString({
68+ let $l = params
69+ let $s = size($l)
70+ let $acc0 = nil
71+ func $f0_1 ($a,$i) = if (($i >= $s))
72+ then $a
73+ else addToList($a, $l[$i])
74+
75+ func $f0_2 ($a,$i) = if (($i >= $s))
76+ then $a
77+ else throw("List size exceeds 3")
78+
79+ $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
80+ }, separator)
81+ else if ((length == 4))
82+ then makeString({
83+ let $l = params
84+ let $s = size($l)
85+ let $acc0 = nil
86+ func $f0_1 ($a,$i) = if (($i >= $s))
87+ then $a
88+ else addToList($a, $l[$i])
89+
90+ func $f0_2 ($a,$i) = if (($i >= $s))
91+ then $a
92+ else throw("List size exceeds 4")
93+
94+ $f0_2($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4)
95+ }, separator)
96+ else if ((length == 5))
97+ then makeString({
98+ let $l = params
99+ let $s = size($l)
100+ let $acc0 = nil
101+ func $f0_1 ($a,$i) = if (($i >= $s))
102+ then $a
103+ else addToList($a, $l[$i])
104+
105+ func $f0_2 ($a,$i) = if (($i >= $s))
106+ then $a
107+ else throw("List size exceeds 5")
108+
109+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
110+ }, separator)
111+ else throw("Max number of parameters exceeded")
112+ }
113+
114+
115+func parseAsAuction (details) = {
116+ let res = split(details, separator)
117+ $Tuple5(addressFromStringValue(res[0]), parseIntValue(res[1]), parseIntValue(res[2]), parseIntValue(res[3]), parseIntValue(res[4]))
118+ }
119+
120+
121+func parseAsSell (details) = {
122+ let res = split(details, separator)
123+ $Tuple2(addressFromStringValue(res[0]), parseIntValue(res[1]))
124+ }
125+
126+
127+func joinStruct (params) = match params {
128+ case auction: (Address, Int, Int, Int, Int) =>
129+ joinString([toString(auction._1), toString(auction._2), toString(auction._3), toString(auction._4), toString(auction._5)])
130+ case sell: (Address, Int) =>
131+ joinString([toString(sell._1), toString(sell._2)])
132+ case _ =>
133+ throw("Wrong params tupple")
134+}
135+
136+
137+func setAuction (seller,nftId,startPrice,endPrice,start,end) = StringEntry(getAuctionKey(nftId), joinStruct($Tuple5(seller, startPrice, endPrice, start, end)))
138+
139+
140+func setSell (nftId,celler,price) = StringEntry(getSellKey(nftId), joinStruct($Tuple2(celler, price)))
141+
142+
143+func getAuction (nftId) = value(getString(this, getAuctionKey(nftId)))
144+
145+
146+func getSell (nftId) = value(getString(this, getSellKey(nftId)))
147+
148+
149+func calcPriceAtCurrentMoment (assetId,moment) = {
150+ let details = getAuction(assetId)
151+ let $t028172921 = parseAsAuction(details)
152+ let seller = $t028172921._1
153+ let startPriceValue = $t028172921._2
154+ let endPriceValue = $t028172921._3
155+ let startPeriodValue = $t028172921._4
156+ let endPeriodValue = $t028172921._5
157+ if ((moment >= endPeriodValue))
158+ then $Tuple2(seller, endPriceValue)
159+ else {
160+ let deltaPrice = (startPriceValue - endPriceValue)
161+ let period = (endPeriodValue - startPeriodValue)
162+ let spended = (moment - startPeriodValue)
163+ $Tuple2(seller, (startPriceValue - fraction(spended, deltaPrice, period)))
164+ }
165+ }
166+
11167
12168 func isNft (assetId) = match assetInfo(assetId) {
13169 case token: Asset =>
14170 if (if ((token.decimals == 0))
15171 then (token.quantity == 1)
16172 else false)
17173 then (token.reissuable == false)
18174 else false
19175 case _ =>
20176 false
21177 }
22178
23179
180+func isTrustedNft (assetId) = {
181+ let issuer = value(assetInfo(assetId)).issuer
182+ valueOrElse(getBoolean(this, getTrustedKey(issuer)), false)
183+ }
184+
185+
186+func isSellExist (assetId) = isDefined(getString(this, getSellKey(assetId)))
187+
188+
189+func isAuctionExist (assetId) = isDefined(getString(this, getAuctionKey(assetId)))
190+
191+
192+func isCorrectSellPrice (price) = (price > 0)
193+
194+
195+func isCorrectAuctionPeriod (start,end) = (end > start)
196+
197+
198+func isCorrectAuctionPrices (startPrice,endPrice) = (startPrice > endPrice)
199+
200+
201+func isAdmin (caller) = (caller == this)
202+
203+
204+func isValidCaller (caller,seller) = if ((caller == this))
205+ then true
206+ else (caller == seller)
207+
208+
209+func isAuctionEnded (now,end) = (now > end)
210+
211+
212+func isEnoughFunds (payment,currentMomentPrice) = (payment >= currentMomentPrice)
213+
214+
215+func isWawes (assetId) = (assetId == unit)
216+
217+
218+func isCorrectNft (nftId) = if (!(isNft(nftId)))
219+ then throw("Token is not Nft")
220+ else if (isSellExist(nftId))
221+ then throw("Sell already exists")
222+ else if (isAuctionExist(nftId))
223+ then throw("Auction already exists")
224+ else unit
225+
226+
227+func isCorrectPayments (paymentAsset,paymentAmount,price) = if (!(isWawes(paymentAsset)))
228+ then throw("Payment must be at WAVES")
229+ else if (!(isEnoughFunds(paymentAmount, price)))
230+ then throw("Not enough funds")
231+ else unit
232+
233+
234+func calcFee () = 0
235+
236+
237+func calcTrustedFee () = 0
238+
239+
240+func resultFundsAmounts (isTrusted,paymentAmount,actualPrice) = if (isTrusted)
241+ then $Tuple2((actualPrice - calcTrustedFee()), (paymentAmount - actualPrice))
242+ else $Tuple2((actualPrice - calcFee()), (paymentAmount - actualPrice))
243+
244+
245+func getSlot (nftId) = if (isSellExist(nftId))
246+ then $Tuple2(kSell, getSell(nftId))
247+ else if (isAuctionExist(nftId))
248+ then $Tuple2(kAuction, getAuction(nftId))
249+ else throw("Slot doesn`t exist")
250+
251+
24252 @Callable(i)
25-func issueNft (name,meta,price) = {
26- let newToken = Issue(name, meta, 1, 0, false)
27- let issueId = calculateAssetId(newToken)
28-[newToken, StringEntry(((kPrice + separator) + toBase58String(issueId)), toString(price))]
253+func addSell (price) = {
254+ let nftId = value(i.payments[0].assetId)
255+ valueOrElse(isCorrectNft(nftId), if (!(isCorrectSellPrice(price)))
256+ then throw("Price must be > 0")
257+ else [setSell(nftId, i.caller, price)])
29258 }
30259
31260
32261
33262 @Callable(i)
34-func buyNFT (nftID) = {
35- let assetId = fromBase58String(nftID)
36- let amount = value(i.payments[0].amount)
37- let price = valueOrErrorMessage(getString(((kPrice + separator) + nftID)), "There is no price for this nft")
38- if ((i.payments[0].assetId != unit))
39- then throw("pay in waves")
40- else if ((parseIntValue(price) > amount))
41- then throw("Invalid payment")
42- else [ScriptTransfer(i.caller, 1, assetId), StringEntry(((toString(i.caller) + separator) + kBuy), ((nftID + separator) + toString(amount)))]
263+func addAuction (startPrice,endPrice,start,end) = {
264+ let nftId = value(i.payments[0].assetId)
265+ valueOrElse(isCorrectNft(nftId), if (!(isCorrectAuctionPeriod(start, end)))
266+ then throw("Period is not correct")
267+ else if (!(isCorrectAuctionPrices(startPrice, endPrice)))
268+ then throw("Start price must be > endPrice")
269+ else [setAuction(i.caller, nftId, startPrice, endPrice, start, end)])
43270 }
44271
45272
46273
47274 @Callable(i)
48-func sellNFT () = {
49- let $t011731258 = $Tuple2(value(i.payments[0].assetId), value(i.payments[0].amount))
50- let token0 = $t011731258._1
51- let amount0 = $t011731258._2
52- let price = getStringValue(((kPrice + separator) + valueOrErrorMessage(toBase58String(token0), "There is no price for this nft")))
53- if (!(isNft(token0)))
54- then throw("Token is not NFT")
55- else [ScriptTransfer(i.caller, parseIntValue(price), unit), StringEntry(((toString(i.caller) + separator) + kSell), ((toBase58String(token0) + separator) + toString(amount0)))]
275+func buyFromSlot (nftId) = {
276+ let $t060146103 = $Tuple2(i.payments[0].assetId, value(i.payments[0].amount))
277+ let paymentAsset = $t060146103._1
278+ let paymentAmount = $t060146103._2
279+ let assetId = fromBase58String(nftId)
280+ let $t061476185 = getSlot(assetId)
281+ let type = $t061476185._1
282+ let details = $t061476185._2
283+ let baseRes = [ScriptTransfer(i.caller, 1, assetId), DeleteEntry(getSlotKey(type, assetId))]
284+ if ((type == kSell))
285+ then {
286+ let $t063276374 = parseAsSell(details)
287+ let seller = $t063276374._1
288+ let priceValue = $t063276374._2
289+ valueOrElse(isCorrectPayments(paymentAsset, paymentAmount, priceValue), {
290+ let $t064596561 = resultFundsAmounts(isTrustedNft(assetId), paymentAmount, priceValue)
291+ let sellerAmount = $t064596561._1
292+ let buyerAmount = $t064596561._2
293+ let updatedRes = (baseRes ++ [ScriptTransfer(seller, sellerAmount, unit)])
294+ if ((buyerAmount > 0))
295+ then (updatedRes ++ [ScriptTransfer(i.caller, buyerAmount, unit)])
296+ else updatedRes
297+ })
298+ }
299+ else {
300+ let $t067786847 = calcPriceAtCurrentMoment(assetId, height)
301+ let seller = $t067786847._1
302+ let actualPrice = $t067786847._2
303+ valueOrElse(isCorrectPayments(paymentAsset, paymentAmount, actualPrice), {
304+ let $t069337036 = resultFundsAmounts(isTrustedNft(assetId), paymentAmount, actualPrice)
305+ let sellerAmount = $t069337036._1
306+ let buyerAmount = $t069337036._2
307+ let updatedRes = (baseRes ++ [ScriptTransfer(seller, sellerAmount, unit)])
308+ if ((buyerAmount > 0))
309+ then (updatedRes ++ [ScriptTransfer(i.caller, buyerAmount, unit)])
310+ else updatedRes
311+ })
312+ }
313+ }
314+
315+
316+
317+@Callable(i)
318+func declineSlot (nftId) = {
319+ let assetId = fromBase58String(nftId)
320+ let $t073377375 = getSlot(assetId)
321+ let type = $t073377375._1
322+ let details = $t073377375._2
323+ let baseRes = [DeleteEntry(getSlotKey(type, assetId))]
324+ if ((type == kSell))
325+ then {
326+ let $t074677514 = parseAsSell(details)
327+ let seller = $t074677514._1
328+ let priceValue = $t074677514._2
329+ if (!(isValidCaller(i.caller, seller)))
330+ then throw("Invalid caller")
331+ else (baseRes ++ [ScriptTransfer(seller, 1, assetId)])
332+ }
333+ else {
334+ let $t076597763 = parseAsAuction(details)
335+ let seller = $t076597763._1
336+ let startPriceValue = $t076597763._2
337+ let endPriceValue = $t076597763._3
338+ let startPeriodValue = $t076597763._4
339+ let endPeriodValue = $t076597763._5
340+ if (!(isValidCaller(i.caller, seller)))
341+ then throw("Invalid caller")
342+ else if (!(isAuctionEnded(height, endPeriodValue)))
343+ then throw("Wait for end of auction")
344+ else (baseRes ++ [ScriptTransfer(seller, 1, assetId)])
345+ }
346+ }
347+
348+
349+
350+@Callable(i)
351+func setTrustedIssuer (trustedAddr) = if (!(isAdmin(i.caller)))
352+ then throw("Only admin")
353+ else [BooleanEntry(getTrustedKey(addressFromStringValue(trustedAddr)), true)]
354+
355+
356+
357+@Callable(i)
358+func getPriceAtCurrentMoment (nftId,moment) = {
359+ let assetId = fromBase58String(nftId)
360+ let $t083048367 = calcPriceAtCurrentMoment(assetId, moment)
361+ let seller = $t083048367._1
362+ let price = $t083048367._2
363+[IntegerEntry(getPriceKey(assetId), price)]
56364 }
57365
58366

github/deemru/w8io/169f3d6 
45.61 ms