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