tx · 5iYwtoenjWwd5HFvmnoHVBQggoGTxvwe5FY7V4yP3uTp

3PQ5smtcz4F9F3rhbj3PX6GBgM4YtPkeHCg:  -0.01400000 Waves

2023.10.27 21:12 [3883217] smart account 3PQ5smtcz4F9F3rhbj3PX6GBgM4YtPkeHCg > SELF 0.00000000 Waves

{ "type": 13, "id": "5iYwtoenjWwd5HFvmnoHVBQggoGTxvwe5FY7V4yP3uTp", "fee": 1400000, "feeAssetId": null, "timestamp": 1698430366812, "version": 2, "chainId": 87, "sender": "3PQ5smtcz4F9F3rhbj3PX6GBgM4YtPkeHCg", "senderPublicKey": "FR8teTy3vHXM8K3qgseLD8fgBc5Rw5ge9NBZQFYYUJYL", "proofs": [ "5hWtbDqRySfxKQAH3FtneSuh2vwf12ESMw97w2QoMTWCV83fCR5BhbqiC72T43YbaCFM1LpVo8iCtSxGKmfnd6cx" ], "script": "base64:AAIFAAAAAAAAABcIAhIDCgEIEg4KDAgBAQgIBAQIAQEBCAAAACgBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgAAAAdhZGRyZXNzAAAAA2tleQQAAAAHJG1hdGNoMAkABB0AAAACBQAAAAdhZGRyZXNzBQAAAANrZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQIAAAAAAQAAAAx0cnlHZXRTdHJpbmcAAAABAAAAA2tleQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgUAAAAEdGhpcwUAAAADa2V5AQAAAAlnZXRPcmFjbGUAAAAACQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQkBAAAADHRyeUdldFN0cmluZwAAAAECAAAAFHN0YXRpY19vcmFjbGVBZGRyZXNzAQAAABJnZXRDZk1hc3RlckFkZHJlc3MAAAAACQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAACAAAAFnN0YXRpY19jZk1hc3RlckFkZHJlc3MBAAAAEGdldEJhY2tlbmRQdWJLZXkAAAAACQACWQAAAAEJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIJAQAAAAlnZXRPcmFjbGUAAAAAAgAAABRzdGF0aWNfYmFja2VuZFB1YktleQEAAAAKZ2V0TWF4RGlmZgAAAAAJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIJAQAAAAlnZXRPcmFjbGUAAAAAAgAAABNzdGF0aWNfbWF4UHJveHlEaWZmAQAAABlnZXRUdXJ0bGVJbmN1YmF0b3JBZGRyZXNzAAAAAAkBAAAAB0FkZHJlc3MAAAABCQACWQAAAAEJAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIJAQAAAAlnZXRPcmFjbGUAAAAAAgAAAB1zdGF0aWNfdHVydGxlSW5jdWJhdG9yQWRkcmVzcwEAAAAXZ2V0VHVydGxlQnJlZWRlckFkZHJlc3MAAAAACQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAACAAAAG3N0YXRpY190dXJ0bGVCcmVlZGVyQWRkcmVzcwEAAAAPZ2V0SXRlbXNBZGRyZXNzAAAAAAkBAAAAB0FkZHJlc3MAAAABCQACWQAAAAEJAQAAABR0cnlHZXRTdHJpbmdFeHRlcm5hbAAAAAIJAQAAAAlnZXRPcmFjbGUAAAAAAgAAABNzdGF0aWNfaXRlbXNBZGRyZXNzAAAAAA9rVG90YWxMaXF1aWRpdHkCAAAAD3RvdGFsX2xpcXVpZGl0eQAAAAAMa0luaXRpYWxpemVkAgAAAAtJTklUSUFMSVpFRAAAAAATa0xpcXVpZGl0eVRocmVzaG9sZAIAAAATTElRVUlESVRZX1RIUkVTSE9MRAAAAAARa1RvdGFsU2hhcmVUb2tlbnMCAAAAEnRvdGFsX3NoYXJlX3Rva2VucwAAAAANa1NoYXJlQXNzZXRJZAIAAAAOU0hBUkVfQVNTRVRfSUQAAAAADmtJbmN1YmF0b3JEYXBwAgAAAA5JTkNVQkFUT1JfREFQUAAAAAAMa0JyZWVkZXJEYXBwAgAAAAxCUkVFREVSX0RBUFAAAAAADGtGYXJtaW5nRGFwcAIAAAAMRkFSTUlOR19EQVBQAAAAABBrTWFya2V0UHJveHlEYXBwAgAAABZNQVJLRVRQTEFDRV9QUk9YWV9EQVBQAAAAAAxrQXVjdGlvbkRhcHACAAAADEFVQ1RJT05fREFQUAAAAAAHa0xvY2tlZAIAAAAGTE9DS0VEAAAAABNrVG90YWxGYXJtaW5nUmV3YXJkAgAAABR0b3RhbF9mYXJtaW5nX3Jld2FyZAAAAAAQa0Nlb0NvbGxlY3RlZEZlZQIAAAARY2VvX2NvbGxlY3RlZF9mZWUAAAAAF2tDZW9Db2xsZWN0ZWRGZWVPdmVyYWxsAgAAAA9jZW9fZmVlX292ZXJhbGwAAAAACGtUb0Rpc3RyAgAAAA10b19kaXN0cmlidXRlAQAAAAZnZXRJbnQAAAABAAAAA2tleQQAAAAHJG1hdGNoMAkABBoAAAACBQAAAAR0aGlzBQAAAANrZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABYgUAAAAHJG1hdGNoMAUAAAABYgAAAAAAAAAAAAEAAAAVdHJ5R2V0Qm9vbGVhbkV4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", "height": 3883217, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: BBtiet6tsUDJd7EuKiktKuermXruXECpm24uft3ePV8v Next: 4C1tZudMfRYjqsYRv1Lqqs5JWyXZoGeTqaqoQTimpikb Diff:
OldNewDifferences
2222
2323
2424 func getMaxDiff () = getIntegerValue(getOracle(), "static_maxProxyDiff")
25+
26+
27+func getTurtleIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_turtleIncubatorAddress")))
28+
29+
30+func getTurtleBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_turtleBreederAddress")))
31+
32+
33+func getItemsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_itemsAddress")))
2534
2635
2736 let kTotalLiquidity = "total_liquidity"
6271 }
6372
6473
65-func getBool (key) = match getBoolean(this, key) {
74+func tryGetBooleanExternal (address,key) = match getBoolean(address, key) {
6675 case b: Boolean =>
6776 b
6877 case _ =>
69- unit
78+ false
7079 }
80+
81+
82+func getBool (key) = tryGetBooleanExternal(this, key)
7183
7284
7385 func getBoolA (a,key) = match getBoolean(a, key) {
7890 }
7991
8092
81-func getIntA (address,key) = match getInteger(address, key) {
93+func tryGetIntegerExternal (address,key) = match getInteger(address, key) {
8294 case b: Int =>
8395 b
8496 case _ =>
138150 }
139151
140152
153+func getTurtleAssetFarmingPower (assetId) = {
154+ let breederAddress = getTurtleBreederAddress()
155+ let incubatorAddress = getTurtleIncubatorAddress()
156+ if (if ((value(assetInfo(assetId)).issuer == breederAddress))
157+ then true
158+ else (value(assetInfo(assetId)).issuer == incubatorAddress))
159+ then true
160+ else throw("MGTFP: _20")
161+ }
162+
163+
141164 func getDuckMarketPrice (nftId) = {
142165 let rarity = getAssetFarmingPower(nftId)
143166 let breederAddress = addressFromStringValue(tryGetStringExternal(getCfMasterAddress(), kBreederDapp))
144- let sterile = getIntA(breederAddress, (("asset_" + toBase58String(nftId)) + "_children"))
167+ let sterile = tryGetIntegerExternal(breederAddress, (("asset_" + toBase58String(nftId)) + "_children"))
145168 let canBreedText = if ((sterile > 0))
146169 then "0"
147170 else "1"
168191
169192 func getBidAmount (auctionId,bidId) = {
170193 let marketAddr = getAuctionAddr()
171- getIntA(addressFromStringValue(marketAddr), (((("auction_" + auctionId) + "_bid_") + bidId) + "_amount"))
194+ tryGetIntegerExternal(addressFromStringValue(marketAddr), (((("auction_" + auctionId) + "_bid_") + bidId) + "_amount"))
172195 }
173196
174197
175-func checkDataGetPrice (ach,breed,gen,price,rarity,ts,signature,duckId) = {
176- let isDuck = (rarity != "")
177- let text = if (!(isDuck))
178- then makeString([gen, toString(price), toString(ts)], ";")
179- else makeString([rarity, breed, ach, gen, toString(price), toString(ts)], ";")
180- let MSINHOUR = 3600000
181- if (!(sigVerify_8Kb(toBytes(text), fromBase58String(signature), getBackendPubKey())))
182- then throw(((((("MCACS: Invalid proof from backend key" + toBase58String(getBackendPubKey())) + " ") + text) + " ") + toString(isDuck)))
183- else {
184- let currentTs = lastBlock.timestamp
185- if ((currentTs > (ts + MSINHOUR)))
186- then throw("MCACS: Outdated signature!")
187- else if (isDuck)
188- then {
189- let duckRarity = getAssetFarmingPower(fromBase58String(duckId))
190- let diff = (duckRarity - parseIntValue(split(rarity, ".")[0]))
191- if (if ((-5 > diff))
192- then true
193- else (diff > 5))
194- then throw(((((("MCACS: It seems not the correct price info was passed! " + toString(duckRarity)) + " ") + rarity) + " ") + toString(diff)))
198+func checkDataGetPrice (ach,breed,gen,price,rarity,ts,signature,duckId) = if ((price == 0))
199+ then throw("MCACS: No price calculated, so action not allowed! Please contact admin!")
200+ else {
201+ let isDuck = if ((rarity != "0"))
202+ then (gen != "")
203+ else false
204+ let isTurtle = (rarity != "0")
205+ let text = if (isDuck)
206+ then makeString([rarity, breed, ach, gen, toString(price), toString(ts)], ";")
207+ else if (isTurtle)
208+ then makeString([rarity, breed, toString(price), toString(ts)], ";")
209+ else makeString([gen, toString(price), toString(ts)], ";")
210+ let MSINHOUR = 3600000
211+ if (!(sigVerify_8Kb(toBytes(text), fromBase58String(signature), getBackendPubKey())))
212+ then throw(((((("MCACS: Invalid proof from backend key" + toBase58String(getBackendPubKey())) + " ") + text) + " ") + toString(isDuck)))
213+ else {
214+ let currentTs = lastBlock.timestamp
215+ if ((currentTs > (ts + MSINHOUR)))
216+ then throw("MCACS: Outdated signature!")
217+ else if (isDuck)
218+ then {
219+ let duckRarity = getAssetFarmingPower(fromBase58String(duckId))
220+ let diff = (duckRarity - parseIntValue(split(rarity, ".")[0]))
221+ if (if ((-5 > diff))
222+ then true
223+ else (diff > 5))
224+ then throw(((((("MCACS: It seems not the correct price info was passed! " + toString(duckRarity)) + " ") + rarity) + " ") + toString(diff)))
225+ else price
226+ }
227+ else if (isTurtle)
228+ then if ((getTurtleAssetFarmingPower(fromBase58String(duckId)) == true))
229+ then price
230+ else throw("MCACS: This does not seem a turtle!")
195231 else price
196- }
197- else price
198- }
199- }
232+ }
233+ }
200234
201235
202236 @Callable(i)
214248 else if ((function == "initAuction"))
215249 then {
216250 let asset = value(i.payments[0])
217- let duckMarketPrice = checkDataGetPrice(ach, breed, gen, price, rarity, ts, signature, toBase58String(value(asset.assetId)))
251+ let duckMarketPrice = checkDataGetPrice(toString(ach), toString(breed), gen, price, toString(rarity), ts, signature, toBase58String(value(asset.assetId)))
218252 let maxPriceDiff = fraction(duckMarketPrice, getMaxDiff(), 100)
219253 let initialPrice = int1
220254 let buyoutPrice = int2
236270 let auctionId = str1
237271 let duckAssetId = getDuckIdByAuctionId(auctionId)
238272 let bidAmount = value(value(i.payments[0]).amount)
239- let duckMarketPrice = checkDataGetPrice(ach, breed, gen, price, rarity, ts, signature, duckAssetId)
273+ let duckMarketPrice = checkDataGetPrice(toString(ach), toString(breed), gen, price, toString(rarity), ts, signature, duckAssetId)
240274 let maxPriceDiff = fraction(duckMarketPrice, getMaxDiff(), 100)
241- if ((bidAmount > (duckMarketPrice + maxPriceDiff)))
242- then throw(((((((("Price is too high, avg price: " + toString(duckMarketPrice)) + ", max. price: ") + toString((duckMarketPrice + maxPriceDiff))) + ", your bid: ") + toString(bidAmount)) + " diff: ") + toString(maxPriceDiff)))
275+ if ((bidAmount > duckMarketPrice))
276+ then throw(((((("Price is too high, avg price: " + toString(duckMarketPrice)) + ", max. price: ") + toString(duckMarketPrice)) + ", your bid: ") + toString(bidAmount)))
243277 else if ((size(i.payments) != 1))
244278 then throw("_103")
245279 else {
250284 }
251285 }
252286 else if ((function == "acceptBid"))
253- then {
254- let auctionId = str1
255- let bidId = str2
256- let duckAssetId = getDuckIdByAuctionId(auctionId)
257- let bidAmount = getBidAmount(auctionId, bidId)
258- let duckMarketPrice = checkDataGetPrice(ach, breed, gen, price, rarity, ts, signature, duckAssetId)
259- let maxPriceDiff = fraction(duckMarketPrice, getMaxDiff(), 100)
260- if (((duckMarketPrice - maxPriceDiff) > bidAmount))
261- then throw(((((("Price is too low, avg price: " + toString(duckMarketPrice)) + ", min. price: ") + toString((duckMarketPrice - maxPriceDiff))) + ", your bid: ") + toString(bidAmount)))
262- else {
263- let acceptBid = invoke(auctionDappAddress, "acceptBid", [auctionId, bidId], nil)
264- if ((acceptBid == acceptBid))
265- then [StringEntry(("tx_" + toBase58String(i.transactionId)), auctionId)]
266- else throw("Strict value is not equal to itself.")
267- }
268- }
287+ then if (true)
288+ then throw("MCACS: Accepting bids is disabled for Collective Farms!")
289+ else {
290+ let auctionId = str1
291+ let bidId = str2
292+ let duckAssetId = getDuckIdByAuctionId(auctionId)
293+ let bidAmount = getBidAmount(auctionId, bidId)
294+ let duckMarketPrice = checkDataGetPrice(toString(ach), toString(breed), gen, price, toString(rarity), ts, signature, duckAssetId)
295+ let maxPriceDiff = fraction(duckMarketPrice, getMaxDiff(), 100)
296+ if ((duckMarketPrice > bidAmount))
297+ then throw(((((("Price is too low, avg price: " + toString(duckMarketPrice)) + ", min. price: ") + toString(duckMarketPrice)) + ", your bid: ") + toString(bidAmount)))
298+ else {
299+ let acceptBid = invoke(auctionDappAddress, "acceptBid", [auctionId, bidId], nil)
300+ if ((acceptBid == acceptBid))
301+ then [StringEntry(("tx_" + toBase58String(i.transactionId)), auctionId)]
302+ else throw("Strict value is not equal to itself.")
303+ }
304+ }
269305 else if ((function == "instantBuy"))
270306 then {
271307 let auctionId = str1
272308 let duckAssetId = getDuckIdByAuctionId(auctionId)
273309 let bidAmount = value(value(i.payments[0]).amount)
274- let duckMarketPrice = checkDataGetPrice(ach, breed, gen, price, rarity, ts, signature, duckAssetId)
275- let maxPriceDiff = fraction(duckMarketPrice, 15, 100)
310+ let duckMarketPrice = checkDataGetPrice(toString(ach), toString(breed), gen, price, toString(rarity), ts, signature, duckAssetId)
311+ let maxPriceDiff = if (tryGetBooleanExternal(getItemsAddress(), (("direct_cosmetic_" + gen) + "_sale")))
312+ then tryGetIntegerExternal(getItemsAddress(), ("direct_cosmetic_" + gen))
313+ else (duckMarketPrice + fraction(duckMarketPrice, 15, 100))
276314 if ((bidAmount > (duckMarketPrice + maxPriceDiff)))
277315 then throw(((((("Price is too high, avg price: " + toString(duckMarketPrice)) + ", max. price: ") + toString((duckMarketPrice + maxPriceDiff))) + ", your bid: ") + toString(bidAmount)))
278316 else if ((size(i.payments) != 1))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func tryGetStringExternal (address,key) = match getString(address, key) {
55 case a: String =>
66 a
77 case _ =>
88 ""
99 }
1010
1111
1212 func tryGetString (key) = tryGetStringExternal(this, key)
1313
1414
1515 func getOracle () = Address(fromBase58String(tryGetString("static_oracleAddress")))
1616
1717
1818 func getCfMasterAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_cfMasterAddress")))
1919
2020
2121 func getBackendPubKey () = fromBase58String(getStringValue(getOracle(), "static_backendPubKey"))
2222
2323
2424 func getMaxDiff () = getIntegerValue(getOracle(), "static_maxProxyDiff")
25+
26+
27+func getTurtleIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_turtleIncubatorAddress")))
28+
29+
30+func getTurtleBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_turtleBreederAddress")))
31+
32+
33+func getItemsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_itemsAddress")))
2534
2635
2736 let kTotalLiquidity = "total_liquidity"
2837
2938 let kInitialized = "INITIALIZED"
3039
3140 let kLiquidityThreshold = "LIQUIDITY_THRESHOLD"
3241
3342 let kTotalShareTokens = "total_share_tokens"
3443
3544 let kShareAssetId = "SHARE_ASSET_ID"
3645
3746 let kIncubatorDapp = "INCUBATOR_DAPP"
3847
3948 let kBreederDapp = "BREEDER_DAPP"
4049
4150 let kFarmingDapp = "FARMING_DAPP"
4251
4352 let kMarketProxyDapp = "MARKETPLACE_PROXY_DAPP"
4453
4554 let kAuctionDapp = "AUCTION_DAPP"
4655
4756 let kLocked = "LOCKED"
4857
4958 let kTotalFarmingReward = "total_farming_reward"
5059
5160 let kCeoCollectedFee = "ceo_collected_fee"
5261
5362 let kCeoCollectedFeeOverall = "ceo_fee_overall"
5463
5564 let kToDistr = "to_distribute"
5665
5766 func getInt (key) = match getInteger(this, key) {
5867 case b: Int =>
5968 b
6069 case _ =>
6170 0
6271 }
6372
6473
65-func getBool (key) = match getBoolean(this, key) {
74+func tryGetBooleanExternal (address,key) = match getBoolean(address, key) {
6675 case b: Boolean =>
6776 b
6877 case _ =>
69- unit
78+ false
7079 }
80+
81+
82+func getBool (key) = tryGetBooleanExternal(this, key)
7183
7284
7385 func getBoolA (a,key) = match getBoolean(a, key) {
7486 case b: Boolean =>
7587 b
7688 case _ =>
7789 unit
7890 }
7991
8092
81-func getIntA (address,key) = match getInteger(address, key) {
93+func tryGetIntegerExternal (address,key) = match getInteger(address, key) {
8294 case b: Int =>
8395 b
8496 case _ =>
8597 0
8698 }
8799
88100
89101 func getAuctionAddr () = tryGetStringExternal(getCfMasterAddress(), kAuctionDapp)
90102
91103
92104 func amountOrClear (amount) = if (contains(amount, "0"))
93105 then ""
94106 else amount
95107
96108
97109 func getAssetOrigin (generation) = {
98110 let incubatorAddress = tryGetStringExternal(getCfMasterAddress(), kIncubatorDapp)
99111 let breederAddress = tryGetStringExternal(getCfMasterAddress(), kBreederDapp)
100112 if ((generation == "G"))
101113 then fromBase58String(incubatorAddress)
102114 else fromBase58String(breederAddress)
103115 }
104116
105117
106118 func getAssetRarity (geno,generation) = {
107119 let quantity = getIntegerValue(Address(getAssetOrigin(generation)), (("stats_" + geno) + "_quantity"))
108120 let power = pow((10000 / quantity), 4, 5, 1, 2, FLOOR)
109121 if ((power > 0))
110122 then power
111123 else 2
112124 }
113125
114126
115127 func asString (value) = match value {
116128 case string: String =>
117129 string
118130 case _ =>
119131 throw("wrong type, expected: String")
120132 }
121133
122134
123135 func getAssetFarmingPower (assetId) = {
124136 let breederAddress = fromBase58String(tryGetStringExternal(getCfMasterAddress(), kBreederDapp))
125137 let incubatorAddress = fromBase58String(tryGetStringExternal(getCfMasterAddress(), kIncubatorDapp))
126138 if (if ((value(assetInfo(assetId)).issuer == Address(breederAddress)))
127139 then true
128140 else (value(assetInfo(assetId)).issuer == Address(incubatorAddress)))
129141 then {
130142 let assetName = value(assetInfo(assetId)).name
131143 let generation = take(takeRight(assetName, 2), 1)
132144 let farmGen = asString(invoke(Address(breederAddress), "getGenFromName", [assetName], nil))
133145 if ((farmGen == farmGen))
134146 then getAssetRarity(farmGen, generation)
135147 else throw("Strict value is not equal to itself.")
136148 }
137149 else throw("MGAFP: _20")
138150 }
139151
140152
153+func getTurtleAssetFarmingPower (assetId) = {
154+ let breederAddress = getTurtleBreederAddress()
155+ let incubatorAddress = getTurtleIncubatorAddress()
156+ if (if ((value(assetInfo(assetId)).issuer == breederAddress))
157+ then true
158+ else (value(assetInfo(assetId)).issuer == incubatorAddress))
159+ then true
160+ else throw("MGTFP: _20")
161+ }
162+
163+
141164 func getDuckMarketPrice (nftId) = {
142165 let rarity = getAssetFarmingPower(nftId)
143166 let breederAddress = addressFromStringValue(tryGetStringExternal(getCfMasterAddress(), kBreederDapp))
144- let sterile = getIntA(breederAddress, (("asset_" + toBase58String(nftId)) + "_children"))
167+ let sterile = tryGetIntegerExternal(breederAddress, (("asset_" + toBase58String(nftId)) + "_children"))
145168 let canBreedText = if ((sterile > 0))
146169 then "0"
147170 else "1"
148171 let val = getInteger(getCfMasterAddress(), ((("r-" + toString(rarity)) + "-b-") + canBreedText))
149172 match val {
150173 case price: Int =>
151174 let minPrice = if ((sterile > 0))
152175 then (200000000 * rarity)
153176 else 18000000000
154177 if ((minPrice > price))
155178 then minPrice
156179 else price
157180 case _ =>
158181 throw((((("There is no price for such duck: " + "r-") + toString(rarity)) + "-b-") + canBreedText))
159182 }
160183 }
161184
162185
163186 func getDuckIdByAuctionId (auctionId) = {
164187 let marketAddr = getAuctionAddr()
165188 tryGetStringExternal(addressFromStringValue(marketAddr), (("auction_" + auctionId) + "_assetId"))
166189 }
167190
168191
169192 func getBidAmount (auctionId,bidId) = {
170193 let marketAddr = getAuctionAddr()
171- getIntA(addressFromStringValue(marketAddr), (((("auction_" + auctionId) + "_bid_") + bidId) + "_amount"))
194+ tryGetIntegerExternal(addressFromStringValue(marketAddr), (((("auction_" + auctionId) + "_bid_") + bidId) + "_amount"))
172195 }
173196
174197
175-func checkDataGetPrice (ach,breed,gen,price,rarity,ts,signature,duckId) = {
176- let isDuck = (rarity != "")
177- let text = if (!(isDuck))
178- then makeString([gen, toString(price), toString(ts)], ";")
179- else makeString([rarity, breed, ach, gen, toString(price), toString(ts)], ";")
180- let MSINHOUR = 3600000
181- if (!(sigVerify_8Kb(toBytes(text), fromBase58String(signature), getBackendPubKey())))
182- then throw(((((("MCACS: Invalid proof from backend key" + toBase58String(getBackendPubKey())) + " ") + text) + " ") + toString(isDuck)))
183- else {
184- let currentTs = lastBlock.timestamp
185- if ((currentTs > (ts + MSINHOUR)))
186- then throw("MCACS: Outdated signature!")
187- else if (isDuck)
188- then {
189- let duckRarity = getAssetFarmingPower(fromBase58String(duckId))
190- let diff = (duckRarity - parseIntValue(split(rarity, ".")[0]))
191- if (if ((-5 > diff))
192- then true
193- else (diff > 5))
194- then throw(((((("MCACS: It seems not the correct price info was passed! " + toString(duckRarity)) + " ") + rarity) + " ") + toString(diff)))
198+func checkDataGetPrice (ach,breed,gen,price,rarity,ts,signature,duckId) = if ((price == 0))
199+ then throw("MCACS: No price calculated, so action not allowed! Please contact admin!")
200+ else {
201+ let isDuck = if ((rarity != "0"))
202+ then (gen != "")
203+ else false
204+ let isTurtle = (rarity != "0")
205+ let text = if (isDuck)
206+ then makeString([rarity, breed, ach, gen, toString(price), toString(ts)], ";")
207+ else if (isTurtle)
208+ then makeString([rarity, breed, toString(price), toString(ts)], ";")
209+ else makeString([gen, toString(price), toString(ts)], ";")
210+ let MSINHOUR = 3600000
211+ if (!(sigVerify_8Kb(toBytes(text), fromBase58String(signature), getBackendPubKey())))
212+ then throw(((((("MCACS: Invalid proof from backend key" + toBase58String(getBackendPubKey())) + " ") + text) + " ") + toString(isDuck)))
213+ else {
214+ let currentTs = lastBlock.timestamp
215+ if ((currentTs > (ts + MSINHOUR)))
216+ then throw("MCACS: Outdated signature!")
217+ else if (isDuck)
218+ then {
219+ let duckRarity = getAssetFarmingPower(fromBase58String(duckId))
220+ let diff = (duckRarity - parseIntValue(split(rarity, ".")[0]))
221+ if (if ((-5 > diff))
222+ then true
223+ else (diff > 5))
224+ then throw(((((("MCACS: It seems not the correct price info was passed! " + toString(duckRarity)) + " ") + rarity) + " ") + toString(diff)))
225+ else price
226+ }
227+ else if (isTurtle)
228+ then if ((getTurtleAssetFarmingPower(fromBase58String(duckId)) == true))
229+ then price
230+ else throw("MCACS: This does not seem a turtle!")
195231 else price
196- }
197- else price
198- }
199- }
232+ }
233+ }
200234
201235
202236 @Callable(i)
203237 func configureOracle (oracle) = if ((i.caller != this))
204238 then throw("BCO: admin only")
205239 else [StringEntry("static_oracleAddress", oracle)]
206240
207241
208242
209243 @Callable(i)
210244 func callMarketplaceProxy (function,int1,int2,str1,str2,ach,breed,gen,price,rarity,ts,signature) = {
211245 let auctionDappAddress = addressFromStringValue(getAuctionAddr())
212246 if ((getBoolA(getCfMasterAddress(), ("farm_" + toString(i.caller))) != true))
213247 then throw("_301=")
214248 else if ((function == "initAuction"))
215249 then {
216250 let asset = value(i.payments[0])
217- let duckMarketPrice = checkDataGetPrice(ach, breed, gen, price, rarity, ts, signature, toBase58String(value(asset.assetId)))
251+ let duckMarketPrice = checkDataGetPrice(toString(ach), toString(breed), gen, price, toString(rarity), ts, signature, toBase58String(value(asset.assetId)))
218252 let maxPriceDiff = fraction(duckMarketPrice, getMaxDiff(), 100)
219253 let initialPrice = int1
220254 let buyoutPrice = int2
221255 if (if (((duckMarketPrice - maxPriceDiff) > initialPrice))
222256 then true
223257 else (initialPrice > buyoutPrice))
224258 then throw(((((("Price is too low, avg price: " + toString(duckMarketPrice)) + ", min. price: ") + toString((duckMarketPrice - maxPriceDiff))) + ", your bid: ") + toString(initialPrice)))
225259 else if ((value(asset.amount) != 1))
226260 then throw("_103")
227261 else {
228262 let initAuction = invoke(auctionDappAddress, "initAuction", [initialPrice, buyoutPrice, str1, str2], [AttachedPayment(value(asset.assetId), 1)])
229263 if ((initAuction == initAuction))
230264 then [StringEntry(("tx_" + toBase58String(i.transactionId)), toBase58String(value(asset.assetId)))]
231265 else throw("Strict value is not equal to itself.")
232266 }
233267 }
234268 else if ((function == "placeBid"))
235269 then {
236270 let auctionId = str1
237271 let duckAssetId = getDuckIdByAuctionId(auctionId)
238272 let bidAmount = value(value(i.payments[0]).amount)
239- let duckMarketPrice = checkDataGetPrice(ach, breed, gen, price, rarity, ts, signature, duckAssetId)
273+ let duckMarketPrice = checkDataGetPrice(toString(ach), toString(breed), gen, price, toString(rarity), ts, signature, duckAssetId)
240274 let maxPriceDiff = fraction(duckMarketPrice, getMaxDiff(), 100)
241- if ((bidAmount > (duckMarketPrice + maxPriceDiff)))
242- then throw(((((((("Price is too high, avg price: " + toString(duckMarketPrice)) + ", max. price: ") + toString((duckMarketPrice + maxPriceDiff))) + ", your bid: ") + toString(bidAmount)) + " diff: ") + toString(maxPriceDiff)))
275+ if ((bidAmount > duckMarketPrice))
276+ then throw(((((("Price is too high, avg price: " + toString(duckMarketPrice)) + ", max. price: ") + toString(duckMarketPrice)) + ", your bid: ") + toString(bidAmount)))
243277 else if ((size(i.payments) != 1))
244278 then throw("_103")
245279 else {
246280 let placeBid = invoke(auctionDappAddress, "placeBid", [auctionId], [AttachedPayment(value(i.payments[0]).assetId, bidAmount)])
247281 if ((placeBid == placeBid))
248282 then [StringEntry(("tx_" + toBase58String(i.transactionId)), auctionId)]
249283 else throw("Strict value is not equal to itself.")
250284 }
251285 }
252286 else if ((function == "acceptBid"))
253- then {
254- let auctionId = str1
255- let bidId = str2
256- let duckAssetId = getDuckIdByAuctionId(auctionId)
257- let bidAmount = getBidAmount(auctionId, bidId)
258- let duckMarketPrice = checkDataGetPrice(ach, breed, gen, price, rarity, ts, signature, duckAssetId)
259- let maxPriceDiff = fraction(duckMarketPrice, getMaxDiff(), 100)
260- if (((duckMarketPrice - maxPriceDiff) > bidAmount))
261- then throw(((((("Price is too low, avg price: " + toString(duckMarketPrice)) + ", min. price: ") + toString((duckMarketPrice - maxPriceDiff))) + ", your bid: ") + toString(bidAmount)))
262- else {
263- let acceptBid = invoke(auctionDappAddress, "acceptBid", [auctionId, bidId], nil)
264- if ((acceptBid == acceptBid))
265- then [StringEntry(("tx_" + toBase58String(i.transactionId)), auctionId)]
266- else throw("Strict value is not equal to itself.")
267- }
268- }
287+ then if (true)
288+ then throw("MCACS: Accepting bids is disabled for Collective Farms!")
289+ else {
290+ let auctionId = str1
291+ let bidId = str2
292+ let duckAssetId = getDuckIdByAuctionId(auctionId)
293+ let bidAmount = getBidAmount(auctionId, bidId)
294+ let duckMarketPrice = checkDataGetPrice(toString(ach), toString(breed), gen, price, toString(rarity), ts, signature, duckAssetId)
295+ let maxPriceDiff = fraction(duckMarketPrice, getMaxDiff(), 100)
296+ if ((duckMarketPrice > bidAmount))
297+ then throw(((((("Price is too low, avg price: " + toString(duckMarketPrice)) + ", min. price: ") + toString(duckMarketPrice)) + ", your bid: ") + toString(bidAmount)))
298+ else {
299+ let acceptBid = invoke(auctionDappAddress, "acceptBid", [auctionId, bidId], nil)
300+ if ((acceptBid == acceptBid))
301+ then [StringEntry(("tx_" + toBase58String(i.transactionId)), auctionId)]
302+ else throw("Strict value is not equal to itself.")
303+ }
304+ }
269305 else if ((function == "instantBuy"))
270306 then {
271307 let auctionId = str1
272308 let duckAssetId = getDuckIdByAuctionId(auctionId)
273309 let bidAmount = value(value(i.payments[0]).amount)
274- let duckMarketPrice = checkDataGetPrice(ach, breed, gen, price, rarity, ts, signature, duckAssetId)
275- let maxPriceDiff = fraction(duckMarketPrice, 15, 100)
310+ let duckMarketPrice = checkDataGetPrice(toString(ach), toString(breed), gen, price, toString(rarity), ts, signature, duckAssetId)
311+ let maxPriceDiff = if (tryGetBooleanExternal(getItemsAddress(), (("direct_cosmetic_" + gen) + "_sale")))
312+ then tryGetIntegerExternal(getItemsAddress(), ("direct_cosmetic_" + gen))
313+ else (duckMarketPrice + fraction(duckMarketPrice, 15, 100))
276314 if ((bidAmount > (duckMarketPrice + maxPriceDiff)))
277315 then throw(((((("Price is too high, avg price: " + toString(duckMarketPrice)) + ", max. price: ") + toString((duckMarketPrice + maxPriceDiff))) + ", your bid: ") + toString(bidAmount)))
278316 else if ((size(i.payments) != 1))
279317 then throw("_103")
280318 else {
281319 let instantBuy = invoke(auctionDappAddress, "instantBuy", [auctionId], [AttachedPayment(value(i.payments[0]).assetId, bidAmount)])
282320 if ((instantBuy == instantBuy))
283321 then [StringEntry(("tx_" + toBase58String(i.transactionId)), auctionId)]
284322 else throw("Strict value is not equal to itself.")
285323 }
286324 }
287325 else if ((function == "cancelBid"))
288326 then {
289327 let auctionId = str1
290328 let bidId = str2
291329 let acceptBid = invoke(auctionDappAddress, "cancelBid", [auctionId, bidId], nil)
292330 if ((acceptBid == acceptBid))
293331 then [StringEntry(("tx_" + toBase58String(i.transactionId)), auctionId)]
294332 else throw("Strict value is not equal to itself.")
295333 }
296334 else if ((function == "cancelAuction"))
297335 then {
298336 let auctionId = str1
299337 let acceptBid = invoke(auctionDappAddress, "cancelAuction", [auctionId], nil)
300338 if ((acceptBid == acceptBid))
301339 then [StringEntry(("tx_" + toBase58String(i.transactionId)), auctionId)]
302340 else throw("Strict value is not equal to itself.")
303341 }
304342 else throw("_13")
305343 }
306344
307345

github/deemru/w8io/3ef1775 
53.99 ms