tx · F6UDdSc2s4YE5swmKjvihEDBzeYGcW63AvZG8qpb6zse 3PEBtiSVLrqyYxGd76vXKu8FFWWsD1c5uYG: -0.01400000 Waves 2021.11.17 16:23 [2860087] smart account 3PEBtiSVLrqyYxGd76vXKu8FFWWsD1c5uYG > SELF 0.00000000 Waves
{ "type": 13, "id": "F6UDdSc2s4YE5swmKjvihEDBzeYGcW63AvZG8qpb6zse", "fee": 1400000, "feeAssetId": null, "timestamp": 1637155425365, "version": 2, "chainId": 87, "sender": "3PEBtiSVLrqyYxGd76vXKu8FFWWsD1c5uYG", "senderPublicKey": "GPiVunnvoUZtBzkfVrpRsMBEf3mWdgRrex2zvzCtM6WQ", "proofs": [ "PxpAdWreocLEwsVnUxvMchVpaDiyiD1ir6S8fpENmo98BsnARQdKZJj3E5YH5pcAEv9YpQpMLtExdV4p9WB9sgh" ], "script": "base64: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", "height": 2860087, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 5c12s3kxKjnyMGqGpvLVhNvDMfpXzwkhU2nbrxCa2Yad Next: J9hacNRtGzathpAfCzSpat6yZ2r1FQqoNyFU7hk5iXas Diff:
Old | New | Differences | |
---|---|---|---|
6 | 6 | let breederAddress = base58'3PDVuU45H7Eh5dmtNbnRNRStGwULA7NY6Hb' | |
7 | 7 | ||
8 | 8 | let feeAggregator = base58'3P6AobNbcQ3ZjcRY37mJPKN8PP9Giz8kgeY' | |
9 | + | ||
10 | + | let eggAssetId = base58'C1iWsKGqLwjHUndiQ7iXpdmPum9PeCDFfyXBdJJosDRS' | |
11 | + | ||
12 | + | let kGlobalCounter = "GLOBAL_COUNTER" | |
9 | 13 | ||
10 | 14 | let feePercent = 5 | |
11 | 15 | ||
29 | 33 | } | |
30 | 34 | val | |
31 | 35 | } | |
36 | + | ||
37 | + | ||
38 | + | func tryGetBoolean (key) = match getBoolean(this, key) { | |
39 | + | case b: Boolean => | |
40 | + | b | |
41 | + | case _ => | |
42 | + | false | |
43 | + | } | |
44 | + | ||
45 | + | ||
46 | + | func getGlobalCounter () = tryGetInteger(kGlobalCounter) | |
32 | 47 | ||
33 | 48 | ||
34 | 49 | func getAssetGenotype (assetId) = { | |
55 | 70 | ||
56 | 71 | ||
57 | 72 | func getBidCancelResults (auctionId,bidId) = { | |
73 | + | let isEggSell = tryGetBoolean((("auction_" + auctionId) + "_eggSell")) | |
74 | + | let paymentAssetId = if ((isEggSell == true)) | |
75 | + | then eggAssetId | |
76 | + | else unit | |
58 | 77 | let assetId = getStringValue(this, (("auction_" + auctionId) + "_assetId")) | |
59 | 78 | let bidAuthor = tryGetString((((("auction_" + auctionId) + "_bid_") + bidId) + "_author")) | |
60 | 79 | let bidAmount = tryGetInteger((((("auction_" + auctionId) + "_bid_") + bidId) + "_amount")) | |
61 | - | [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, | |
80 | + | [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)] | |
62 | 81 | } | |
63 | 82 | ||
64 | 83 | ||
65 | 84 | @Callable(i) | |
66 | - | func initAuction (startPrice,instantPrice,description) = { | |
67 | - | let auctionId = toBase58String(i.transactionId) | |
85 | + | func initAuction (startPrice,instantPrice,description,eggSell) = { | |
86 | + | let globalCounter = getGlobalCounter() | |
87 | + | let auctionId = (toBase58String(i.transactionId) + toString(globalCounter)) | |
68 | 88 | let pmt = value(i.payments[0]) | |
69 | 89 | let assetId = value(pmt.assetId) | |
70 | 90 | let asset = getAssetGenotype(assetId) | |
71 | 91 | if ((asset == "")) | |
72 | 92 | then throw("You can only sell an NFT-duck created in incubator or breeder") | |
73 | - | else [StringEntry((("auction_" + auctionId) + "_status"), "open"), 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), IntegerEntry((("auction_" + auctionId) + "_instantPrice"), instantPrice), StringEntry((((("address_" + toString(i.originCaller)) + "_auction_") + auctionId) + "_lockedNFT"), toBase58String(assetId))] | |
93 | + | else [StringEntry((("auction_" + auctionId) + "_status"), "open"), BooleanEntry((("auction_" + auctionId) + "_eggSell"), eggSell), 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), IntegerEntry((("auction_" + auctionId) + "_instantPrice"), instantPrice), StringEntry((((("address_" + toString(i.originCaller)) + "_auction_") + auctionId) + "_lockedNFT"), toBase58String(assetId))] | |
74 | 94 | } | |
75 | 95 | ||
76 | 96 | ||
89 | 109 | ||
90 | 110 | @Callable(i) | |
91 | 111 | func instantBuy (auctionId) = { | |
112 | + | let isEggSell = tryGetBoolean((("auction_" + auctionId) + "_eggSell")) | |
113 | + | let paymentAssetId = if ((isEggSell == true)) | |
114 | + | then eggAssetId | |
115 | + | else unit | |
116 | + | let paymentAssetName = if ((isEggSell == true)) | |
117 | + | then "EGG" | |
118 | + | else "WAVES" | |
92 | 119 | let pmt = value(i.payments[0]) | |
93 | 120 | let amount = pmt.amount | |
94 | 121 | let assetId = tryGetString((("auction_" + auctionId) + "_assetId")) | |
95 | 122 | let bidId = toBase58String(i.transactionId) | |
96 | 123 | let auctionStatus = tryGetString((("auction_" + auctionId) + "_status")) | |
97 | - | if ((pmt.assetId != | |
98 | - | then throw("Auction does only support | |
124 | + | if ((pmt.assetId != paymentAssetId)) | |
125 | + | then throw((("Auction does only support " + paymentAssetName) + " payments.")) | |
99 | 126 | else if ((auctionStatus != "open")) | |
100 | 127 | then throw("Auction is closed. You cannot place a bid.") | |
101 | 128 | else { | |
106 | 133 | let auctionOwner = tryGetString((("auction_" + auctionId) + "_owner")) | |
107 | 134 | let recordPrice = tryGetInteger((assetId + "_recordPrice")) | |
108 | 135 | let newRecordPrice = max([recordPrice, amount]) | |
109 | - | [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 - feePercent), 100), | |
136 | + | [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 - feePercent), 100), paymentAssetId), ScriptTransfer(Address(feeAggregator), fraction(amount, feePercent, 100), paymentAssetId)] | |
110 | 137 | } | |
111 | 138 | } | |
112 | 139 | } | |
115 | 142 | ||
116 | 143 | @Callable(i) | |
117 | 144 | func placeBid (auctionId) = { | |
145 | + | let isEggSell = tryGetBoolean((("auction_" + auctionId) + "_eggSell")) | |
146 | + | let paymentAssetId = if ((isEggSell == true)) | |
147 | + | then eggAssetId | |
148 | + | else unit | |
149 | + | let paymentAssetName = if ((isEggSell == true)) | |
150 | + | then "EGG" | |
151 | + | else "WAVES" | |
118 | 152 | let pmt = value(i.payments[0]) | |
119 | 153 | let amount = pmt.amount | |
120 | 154 | let bidId = toBase58String(i.transactionId) | |
121 | 155 | let assetId = getStringValue(this, (("auction_" + auctionId) + "_assetId")) | |
122 | - | if ((pmt.assetId != | |
123 | - | then throw("Auction does only support | |
156 | + | if ((pmt.assetId != paymentAssetId)) | |
157 | + | then throw((("Auction does only support " + paymentAssetName) + " payments.")) | |
124 | 158 | else { | |
125 | 159 | let minPrice = tryGetInteger((("auction_" + auctionId) + "_startPrice")) | |
126 | 160 | if ((minPrice > amount)) | |
152 | 186 | ||
153 | 187 | @Callable(i) | |
154 | 188 | func acceptBid (auctionId,bidId) = { | |
189 | + | let isEggSell = tryGetBoolean((("auction_" + auctionId) + "_eggSell")) | |
190 | + | let paymentAssetId = if ((isEggSell == true)) | |
191 | + | then eggAssetId | |
192 | + | else unit | |
155 | 193 | let auctionOwner = tryGetString((("auction_" + auctionId) + "_owner")) | |
156 | 194 | let bidAuthor = tryGetString((((("auction_" + auctionId) + "_bid_") + bidId) + "_author")) | |
157 | 195 | let bidAmount = tryGetInteger((((("auction_" + auctionId) + "_bid_") + bidId) + "_amount")) | |
166 | 204 | else { | |
167 | 205 | let recordPrice = tryGetInteger((assetId + "_recordPrice")) | |
168 | 206 | let newRecordPrice = max([recordPrice, bidAmount]) | |
169 | - | [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. | |
207 | + | [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 - feePercent), 100), paymentAssetId), ScriptTransfer(Address(feeAggregator), fraction(bidAmount, feePercent, 100), paymentAssetId), ScriptTransfer(addressFromStringValue(bidAuthor), 1, fromBase58String(assetId))] | |
170 | 208 | } | |
171 | 209 | } | |
172 | 210 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 5 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let incubatorAddress = base58'3PEktVux2RhchSN63DsDo4b4mz4QqzKSeDv' | |
5 | 5 | ||
6 | 6 | let breederAddress = base58'3PDVuU45H7Eh5dmtNbnRNRStGwULA7NY6Hb' | |
7 | 7 | ||
8 | 8 | let feeAggregator = base58'3P6AobNbcQ3ZjcRY37mJPKN8PP9Giz8kgeY' | |
9 | + | ||
10 | + | let eggAssetId = base58'C1iWsKGqLwjHUndiQ7iXpdmPum9PeCDFfyXBdJJosDRS' | |
11 | + | ||
12 | + | let kGlobalCounter = "GLOBAL_COUNTER" | |
9 | 13 | ||
10 | 14 | let feePercent = 5 | |
11 | 15 | ||
12 | 16 | func tryGetInteger (key) = { | |
13 | 17 | let val = match getInteger(this, key) { | |
14 | 18 | case b: Int => | |
15 | 19 | b | |
16 | 20 | case _ => | |
17 | 21 | 0 | |
18 | 22 | } | |
19 | 23 | val | |
20 | 24 | } | |
21 | 25 | ||
22 | 26 | ||
23 | 27 | func tryGetString (key) = { | |
24 | 28 | let val = match getString(this, key) { | |
25 | 29 | case b: String => | |
26 | 30 | b | |
27 | 31 | case _ => | |
28 | 32 | "" | |
29 | 33 | } | |
30 | 34 | val | |
31 | 35 | } | |
36 | + | ||
37 | + | ||
38 | + | func tryGetBoolean (key) = match getBoolean(this, key) { | |
39 | + | case b: Boolean => | |
40 | + | b | |
41 | + | case _ => | |
42 | + | false | |
43 | + | } | |
44 | + | ||
45 | + | ||
46 | + | func getGlobalCounter () = tryGetInteger(kGlobalCounter) | |
32 | 47 | ||
33 | 48 | ||
34 | 49 | func getAssetGenotype (assetId) = { | |
35 | 50 | let asset1 = match getString(Address(incubatorAddress), toBase58String(assetId)) { | |
36 | 51 | case b: String => | |
37 | 52 | b | |
38 | 53 | case _ => | |
39 | 54 | "" | |
40 | 55 | } | |
41 | 56 | if ((asset1 != "")) | |
42 | 57 | then asset1 | |
43 | 58 | else { | |
44 | 59 | let asset2 = match getString(Address(breederAddress), toBase58String(assetId)) { | |
45 | 60 | case c: String => | |
46 | 61 | c | |
47 | 62 | case _ => | |
48 | 63 | "" | |
49 | 64 | } | |
50 | 65 | if ((asset2 != "")) | |
51 | 66 | then asset2 | |
52 | 67 | else "" | |
53 | 68 | } | |
54 | 69 | } | |
55 | 70 | ||
56 | 71 | ||
57 | 72 | func getBidCancelResults (auctionId,bidId) = { | |
73 | + | let isEggSell = tryGetBoolean((("auction_" + auctionId) + "_eggSell")) | |
74 | + | let paymentAssetId = if ((isEggSell == true)) | |
75 | + | then eggAssetId | |
76 | + | else unit | |
58 | 77 | let assetId = getStringValue(this, (("auction_" + auctionId) + "_assetId")) | |
59 | 78 | let bidAuthor = tryGetString((((("auction_" + auctionId) + "_bid_") + bidId) + "_author")) | |
60 | 79 | let bidAmount = tryGetInteger((((("auction_" + auctionId) + "_bid_") + bidId) + "_amount")) | |
61 | - | [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, | |
80 | + | [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)] | |
62 | 81 | } | |
63 | 82 | ||
64 | 83 | ||
65 | 84 | @Callable(i) | |
66 | - | func initAuction (startPrice,instantPrice,description) = { | |
67 | - | let auctionId = toBase58String(i.transactionId) | |
85 | + | func initAuction (startPrice,instantPrice,description,eggSell) = { | |
86 | + | let globalCounter = getGlobalCounter() | |
87 | + | let auctionId = (toBase58String(i.transactionId) + toString(globalCounter)) | |
68 | 88 | let pmt = value(i.payments[0]) | |
69 | 89 | let assetId = value(pmt.assetId) | |
70 | 90 | let asset = getAssetGenotype(assetId) | |
71 | 91 | if ((asset == "")) | |
72 | 92 | then throw("You can only sell an NFT-duck created in incubator or breeder") | |
73 | - | else [StringEntry((("auction_" + auctionId) + "_status"), "open"), 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), IntegerEntry((("auction_" + auctionId) + "_instantPrice"), instantPrice), StringEntry((((("address_" + toString(i.originCaller)) + "_auction_") + auctionId) + "_lockedNFT"), toBase58String(assetId))] | |
93 | + | else [StringEntry((("auction_" + auctionId) + "_status"), "open"), BooleanEntry((("auction_" + auctionId) + "_eggSell"), eggSell), 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), IntegerEntry((("auction_" + auctionId) + "_instantPrice"), instantPrice), StringEntry((((("address_" + toString(i.originCaller)) + "_auction_") + auctionId) + "_lockedNFT"), toBase58String(assetId))] | |
74 | 94 | } | |
75 | 95 | ||
76 | 96 | ||
77 | 97 | ||
78 | 98 | @Callable(i) | |
79 | 99 | func cancelAuction (auctionId) = { | |
80 | 100 | let auctionOwner = tryGetString((("auction_" + auctionId) + "_owner")) | |
81 | 101 | if ((toString(i.originCaller) != auctionOwner)) | |
82 | 102 | then throw("Only allowed to auction owner") | |
83 | 103 | else if ((tryGetString((("auction_" + auctionId) + "_status")) != "open")) | |
84 | 104 | then throw("auction is close") | |
85 | 105 | else [StringEntry((("auction_" + auctionId) + "_status"), "cancelled"), DeleteEntry((((("address_" + auctionOwner) + "_auction_") + auctionId) + "_lockedNFT")), ScriptTransfer(i.originCaller, 1, fromBase58String(getStringValue(this, (("auction_" + auctionId) + "_assetId"))))] | |
86 | 106 | } | |
87 | 107 | ||
88 | 108 | ||
89 | 109 | ||
90 | 110 | @Callable(i) | |
91 | 111 | func instantBuy (auctionId) = { | |
112 | + | let isEggSell = tryGetBoolean((("auction_" + auctionId) + "_eggSell")) | |
113 | + | let paymentAssetId = if ((isEggSell == true)) | |
114 | + | then eggAssetId | |
115 | + | else unit | |
116 | + | let paymentAssetName = if ((isEggSell == true)) | |
117 | + | then "EGG" | |
118 | + | else "WAVES" | |
92 | 119 | let pmt = value(i.payments[0]) | |
93 | 120 | let amount = pmt.amount | |
94 | 121 | let assetId = tryGetString((("auction_" + auctionId) + "_assetId")) | |
95 | 122 | let bidId = toBase58String(i.transactionId) | |
96 | 123 | let auctionStatus = tryGetString((("auction_" + auctionId) + "_status")) | |
97 | - | if ((pmt.assetId != | |
98 | - | then throw("Auction does only support | |
124 | + | if ((pmt.assetId != paymentAssetId)) | |
125 | + | then throw((("Auction does only support " + paymentAssetName) + " payments.")) | |
99 | 126 | else if ((auctionStatus != "open")) | |
100 | 127 | then throw("Auction is closed. You cannot place a bid.") | |
101 | 128 | else { | |
102 | 129 | let instantPrice = tryGetInteger((("auction_" + auctionId) + "_instantPrice")) | |
103 | 130 | if ((instantPrice > amount)) | |
104 | 131 | then throw(("For instant purchase you need to pay at least " + toString(instantPrice))) | |
105 | 132 | else { | |
106 | 133 | let auctionOwner = tryGetString((("auction_" + auctionId) + "_owner")) | |
107 | 134 | let recordPrice = tryGetInteger((assetId + "_recordPrice")) | |
108 | 135 | let newRecordPrice = max([recordPrice, amount]) | |
109 | - | [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 - feePercent), 100), | |
136 | + | [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 - feePercent), 100), paymentAssetId), ScriptTransfer(Address(feeAggregator), fraction(amount, feePercent, 100), paymentAssetId)] | |
110 | 137 | } | |
111 | 138 | } | |
112 | 139 | } | |
113 | 140 | ||
114 | 141 | ||
115 | 142 | ||
116 | 143 | @Callable(i) | |
117 | 144 | func placeBid (auctionId) = { | |
145 | + | let isEggSell = tryGetBoolean((("auction_" + auctionId) + "_eggSell")) | |
146 | + | let paymentAssetId = if ((isEggSell == true)) | |
147 | + | then eggAssetId | |
148 | + | else unit | |
149 | + | let paymentAssetName = if ((isEggSell == true)) | |
150 | + | then "EGG" | |
151 | + | else "WAVES" | |
118 | 152 | let pmt = value(i.payments[0]) | |
119 | 153 | let amount = pmt.amount | |
120 | 154 | let bidId = toBase58String(i.transactionId) | |
121 | 155 | let assetId = getStringValue(this, (("auction_" + auctionId) + "_assetId")) | |
122 | - | if ((pmt.assetId != | |
123 | - | then throw("Auction does only support | |
156 | + | if ((pmt.assetId != paymentAssetId)) | |
157 | + | then throw((("Auction does only support " + paymentAssetName) + " payments.")) | |
124 | 158 | else { | |
125 | 159 | let minPrice = tryGetInteger((("auction_" + auctionId) + "_startPrice")) | |
126 | 160 | if ((minPrice > amount)) | |
127 | 161 | then throw(("The minimal initial price is set as " + toString(minPrice))) | |
128 | 162 | 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")] | |
129 | 163 | } | |
130 | 164 | } | |
131 | 165 | ||
132 | 166 | ||
133 | 167 | ||
134 | 168 | @Callable(i) | |
135 | 169 | func cancelBid (auctionId,bidId) = { | |
136 | 170 | let assetId = getStringValue(this, (("auction_" + auctionId) + "_assetId")) | |
137 | 171 | let bidAuthor = tryGetString((((("auction_" + auctionId) + "_bid_") + bidId) + "_author")) | |
138 | 172 | let bidAmount = tryGetInteger((((("auction_" + auctionId) + "_bid_") + bidId) + "_amount")) | |
139 | 173 | if ((toString(i.originCaller) != bidAuthor)) | |
140 | 174 | then throw("Only allowed to the bid author") | |
141 | 175 | else if ((tryGetString((((("auction_" + auctionId) + "_bid_") + bidId) + "_status")) != "open")) | |
142 | 176 | then throw("bid is not open") | |
143 | 177 | else getBidCancelResults(auctionId, bidId) | |
144 | 178 | } | |
145 | 179 | ||
146 | 180 | ||
147 | 181 | ||
148 | 182 | @Callable(i) | |
149 | 183 | func cancelOutdatedBid (auctionId,bidId) = throw("to be released") | |
150 | 184 | ||
151 | 185 | ||
152 | 186 | ||
153 | 187 | @Callable(i) | |
154 | 188 | func acceptBid (auctionId,bidId) = { | |
189 | + | let isEggSell = tryGetBoolean((("auction_" + auctionId) + "_eggSell")) | |
190 | + | let paymentAssetId = if ((isEggSell == true)) | |
191 | + | then eggAssetId | |
192 | + | else unit | |
155 | 193 | let auctionOwner = tryGetString((("auction_" + auctionId) + "_owner")) | |
156 | 194 | let bidAuthor = tryGetString((((("auction_" + auctionId) + "_bid_") + bidId) + "_author")) | |
157 | 195 | let bidAmount = tryGetInteger((((("auction_" + auctionId) + "_bid_") + bidId) + "_amount")) | |
158 | 196 | let bidStatus = tryGetString((((("auction_" + auctionId) + "_bid_") + bidId) + "_status")) | |
159 | 197 | let assetId = tryGetString((("auction_" + auctionId) + "_assetId")) | |
160 | 198 | if ((toString(i.originCaller) != auctionOwner)) | |
161 | 199 | then throw("Only allowed to auction owner") | |
162 | 200 | else if ((bidStatus != "open")) | |
163 | 201 | then throw("Bid was cancelled and cannot be accepted") | |
164 | 202 | else if ((tryGetString((("auction_" + auctionId) + "_status")) != "open")) | |
165 | 203 | then throw("Auction was closed") | |
166 | 204 | else { | |
167 | 205 | let recordPrice = tryGetInteger((assetId + "_recordPrice")) | |
168 | 206 | let newRecordPrice = max([recordPrice, bidAmount]) | |
169 | - | [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. | |
207 | + | [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 - feePercent), 100), paymentAssetId), ScriptTransfer(Address(feeAggregator), fraction(bidAmount, feePercent, 100), paymentAssetId), ScriptTransfer(addressFromStringValue(bidAuthor), 1, fromBase58String(assetId))] | |
170 | 208 | } | |
171 | 209 | } | |
172 | 210 | ||
173 | 211 | ||
174 | 212 | @Verifier(tx) | |
175 | 213 | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
176 | 214 |
github/deemru/w8io/3ef1775 81.87 ms ◑