tx · EPNravkr39Lm4qAFKbUYahZFdkQpyAmPbPneW9Hzhjww

3PAi1ePLQrYrY3jj9omBtT6isMkZsapbmks:  -0.01400000 Waves

2022.03.04 23:20 [3014810] smart account 3PAi1ePLQrYrY3jj9omBtT6isMkZsapbmks > SELF 0.00000000 Waves

{ "type": 13, "id": "EPNravkr39Lm4qAFKbUYahZFdkQpyAmPbPneW9Hzhjww", "fee": 1400000, "feeAssetId": null, "timestamp": 1646425292047, "version": 2, "chainId": 87, "sender": "3PAi1ePLQrYrY3jj9omBtT6isMkZsapbmks", "senderPublicKey": "XrNmTusDFaLSz3wAjmdfcyC5h6uYyVbpdh18758UpFv", "proofs": [ "2ZkwVLVx8b7jhBGfGCtrfA3h3ZqjhC5t9W3AFc82a3tL5N3odxypytnS8ezDymegtBehY3ajrnBFKjRQd4e6kULE" ], "script": "base64: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", "height": 3014810, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3HvEa2UPwj48GiLkf1Lut7vVFoGjfTokxCBzPiSpEbN2 Next: BYg832W2Z4G2iAsxpCDvhwbb3RG6w8y8Av1eePVWySY8 Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let breederContract = base58'3PDVuU45H7Eh5dmtNbnRNRStGwULA7NY6Hb'
5-
6-let incubatorContract = base58'3PEktVux2RhchSN63DsDo4b4mz4QqzKSeDv'
7-
8-let eggAssetId = base58'C1iWsKGqLwjHUndiQ7iXpdmPum9PeCDFfyXBdJJosDRS'
9-
10-let MANTLENAME = "mantle"
11-
12-let STATUSFREE = "FREE"
13-
14-let STATUSOCCUPIED = "OCCUPIED"
15-
16-func keyDuckLock (callerAddress,duckId) = (((("address_" + callerAddress) + "_duck_") + duckId) + "_status")
4+func keyArtefactOwner (artefact,owner) = (((artefact + "_") + owner) + "_owner")
175
186
19-func keyInvestor (callerAddress) = (("address_" + callerAddress) + "_amount")
7+let eggsAssetId = base58'C1iWsKGqLwjHUndiQ7iXpdmPum9PeCDFfyXBdJJosDRS'
8+
9+let devAddress = base58'3P44yqcpfhPF2iC1nptm2ZJCTaN7VYhz9og'
10+
11+let eggsNeeded = (3 * 100000000)
12+
13+let artefactsLimit = (301 + 600)
14+
15+let oldArtefacts = ["ART-LAKE", "ART-HOUSE", "ART-BIGHOUSE", "ART-FIXGENE", "ART-FREEGENE", "ART-MIRROR", "ART-POMP", "ART-CAPE", "ART-HAT", "ART-CUSTOMDUCK"]
16+
17+let artefacts = ["ART-XMISTL", "ART-XHAT", "ART-XSCARF", "ART-XSWEATER", "ART-XSOCK", "ART-XTREE"]
18+
19+let allArtefact = (artefacts ++ oldArtefacts)
20+
21+func tryGetString (key) = match getString(this, key) {
22+ case a: String =>
23+ a
24+ case _ =>
25+ ""
26+}
2027
2128
22-func keyArtefactInvested (type,artefactId) = (((("artefact_" + type) + "_artefactId_") + artefactId) + "_invested")
29+func tryGetInteger (key) = match getInteger(this, key) {
30+ case a: Int =>
31+ a
32+ case _ =>
33+ 0
34+}
2335
2436
25-func keyOnlyArtefactLevel (artefactId) = (("artefactId_" + toBase58String(artefactId)) + "_level")
37+func getRandomNumber (variants,txId,finishHeight,offset) = {
38+ let randomSeedBlock = value(blockInfoByHeight((finishHeight - 1)))
39+ let randomHash = sha256((txId + value(randomSeedBlock.vrf)))
40+ (toInt(randomHash, (offset * 8)) % variants)
41+ }
2642
2743
28-func keyArtefactIdByDuckAndType (type,duckId) = (((("artefact_ " + type) + "_duck_") + toBase58String(duckId)) + "_artefactId")
44+func getRandomArtefact (boxId,h) = {
45+ let randomNumber = getRandomNumber(6, boxId, h, 0)
46+artefacts[randomNumber]
47+ }
2948
3049
31-func keyArtefactOwner (type,artefactId) = (((("artefact_ " + type) + "_artefactId_") + toBase58String(artefactId)) + "_owner")
32-
33-
34-func keyArtefactOwnerAndStatus (type,owner,artefactId) = (((((("address_" + owner) + "_artefact_") + type) + "_artefactId_") + toBase58String(artefactId)) + "_status")
35-
36-
37-func keyArtefactStatus (type,artefactId) = (((("artefact_ " + type) + "_artefactId_") + toBase58String(artefactId)) + "_status")
38-
39-
40-func keyArtefactType (artefactId) = (("artefactId_" + toBase58String(artefactId)) + "_type")
41-
42-
43-func keyArtefactLevel (type,owner,artefactId) = (((((("address_" + owner) + "_artefact_") + type) + "_artefactId_") + toBase58String(artefactId)) + "_level")
44-
45-
46-func keyPutOnArtefact (type,owner,duckId,artefactId) = (((((((("address_" + owner) + "_duck_") + duckId) + "_artefact_") + type) + "_artefactId_") + toBase58String(artefactId)) + "_status")
47-
48-
49-func keyArtefactExists (type,artefactId) = ((("artefact_" + type) + "_artefactId_") + toBase58String(artefactId))
50+func checkArtefactDetails (assetId) = {
51+ let asset = value(assetInfo(assetId))
52+ let assetName = value(asset.name)
53+ if (if (containsElement(allArtefact, assetName))
54+ then (asset.issuer == this)
55+ else false)
56+ then assetName
57+ else throw("Invalid artefact")
58+ }
5059
5160
5261 @Callable(i)
53-func buyArtefact (type) = if ((type != MANTLENAME))
54- then throw("You can buy only mantles now")
55- else {
56- let MANTLEPRICE = 1000000
57- let firstPayment = value(i.payments[0])
58- if ((firstPayment.assetId != eggAssetId))
59- then throw(("You can attach only EGG tokens with the following asset id: " + toBase58String(eggAssetId)))
60- else if ((firstPayment.amount != MANTLEPRICE))
61- then throw(("To buy a mantle you currently need the following amount of EGGlets: " + toString(MANTLEPRICE)))
62- else {
63- let issueMantleNFT = Issue("DUCK-MANTLE-0", "[Artefact] Mantle NFT for Jeduck", 1, 0, false)
64- let mantleNftId = calculateAssetId(issueMantleNFT)
65- let kMantleLevel = keyArtefactLevel(MANTLENAME, toString(i.caller), mantleNftId)
66- let kMantleExists = keyArtefactExists(MANTLENAME, mantleNftId)
67- let kMantleOwner = keyArtefactOwner(MANTLENAME, mantleNftId)
68- let kMantleStatus = keyArtefactStatus(MANTLENAME, mantleNftId)
69- let kArtefactType = keyArtefactType(mantleNftId)
70- let kMantleInvested = keyArtefactInvested(MANTLENAME, toBase58String(mantleNftId))
71- let kArtefactOwnerAndStatus = keyArtefactOwnerAndStatus(MANTLENAME, toString(i.caller), mantleNftId)
72- let kOnlyArtefactLevel = keyOnlyArtefactLevel(mantleNftId)
73-[IntegerEntry(kMantleLevel, 1), IntegerEntry(kMantleInvested, MANTLEPRICE), BooleanEntry(kMantleExists, true), StringEntry(kMantleOwner, toString(i.caller)), StringEntry(kMantleStatus, STATUSFREE), StringEntry(kArtefactType, MANTLENAME), StringEntry(kArtefactOwnerAndStatus, STATUSFREE), IntegerEntry(kOnlyArtefactLevel, 1)]
74- }
62+func stakeItem () = if ((size(i.payments) == 1))
63+ then {
64+ let artefactName = checkArtefactDetails(value(i.payments[0].assetId))
65+ if ((artefactName == "ART-XMISTL"))
66+ then {
67+ let invoker = toBase58String(i.caller.bytes)
68+ let artefactId = tryGetString(keyArtefactOwner(artefactName, invoker))
69+ if ((artefactId == ""))
70+ then [StringEntry(keyArtefactOwner(artefactName, invoker), toBase58String(value(i.payments[0].assetId)))]
71+ else throw(("You are already staking " + artefactName))
72+ }
73+ else throw("You can't stake this artafect")
7574 }
75+ else throw("Invalid payment")
7676
7777
7878
7979 @Callable(i)
80-func upgradeMantle (artefactId) = {
81- let upgradePointPrice = 1000000
82- let firstPayment = value(i.payments[0])
83- if ((firstPayment.assetId != eggAssetId))
84- then throw(("You can attach only EGG tokens with the following asset id: " + toBase58String(eggAssetId)))
85- else if ((upgradePointPrice > firstPayment.amount))
86- then throw(("Minimal payment for upgrading mantle is: " + toString(upgradePointPrice)))
87- else {
88- let kMantleExists = keyArtefactExists(MANTLENAME, fromBase58String(artefactId))
89- let kMantleOwner = keyArtefactOwner(MANTLENAME, fromBase58String(artefactId))
90- let mantleExists = getBooleanValue(kMantleExists)
91- let mantleOwner = getStringValue(kMantleOwner)
92- if (!(mantleExists))
93- then throw("Mantle with such an ID does not exist")
94- else if ((mantleOwner != toString(i.originCaller)))
95- then throw("You're not an owner of the mantle")
96- else {
97- let kMantleInvested = keyArtefactInvested(MANTLENAME, artefactId)
98- let mantleAlreadyInvested = getIntegerValue(kMantleInvested)
99- let kMantleLevel = keyArtefactLevel(MANTLENAME, toString(i.originCaller), fromBase58String(artefactId))
100- let kOnlyArtefactLevel = keyOnlyArtefactLevel(fromBase58String(artefactId))
101- let totalInvested = (mantleAlreadyInvested + firstPayment.amount)
102- let newLevel = (((10 * pow(totalInvested, 8, 6, 1, 8, HALFUP)) + 100000000) / 100000000)
103-[IntegerEntry(kMantleLevel, newLevel), IntegerEntry(kMantleInvested, totalInvested), IntegerEntry(kOnlyArtefactLevel, newLevel)]
104- }
105- }
80+func unstakeItem (artefactName) = {
81+ let invoker = toBase58String(i.caller.bytes)
82+ let artefactId = tryGetString(keyArtefactOwner(artefactName, invoker))
83+ if ((artefactId == ""))
84+ then throw(("You didnt stake " + artefactName))
85+ else [ScriptTransfer(i.caller, 1, fromBase58String(artefactId)), DeleteEntry(keyArtefactOwner(artefactName, invoker))]
10686 }
10787
10888
10989
11090 @Callable(i)
111-func putOnArtefact (artefactId) = {
112- let firstPayment = value(i.payments[0])
113- let attachedAssetInfo = value(assetInfo(value(firstPayment.assetId)))
114- if (if ((attachedAssetInfo.issuer.bytes != incubatorContract))
115- then (attachedAssetInfo.issuer.bytes != breederContract)
116- else false)
117- then throw("You can attach only DUCKs issued by incubator or breeder ")
118- else {
119- let kMantleExists = keyArtefactExists(MANTLENAME, fromBase58String(artefactId))
120- let kMantleOwner = keyArtefactOwner(MANTLENAME, fromBase58String(artefactId))
121- let kMantleStatus = keyArtefactStatus(MANTLENAME, fromBase58String(artefactId))
122- let kArtefactOwnerAndStatus = keyArtefactOwnerAndStatus(MANTLENAME, toString(i.originCaller), fromBase58String(artefactId))
123- let kDuckLock = keyDuckLock(toString(i.originCaller), toBase58String(value(firstPayment.assetId)))
124- let mantleExists = getBooleanValue(kMantleExists)
125- let mantleOwner = getStringValue(kMantleOwner)
126- let mantleStatus = getStringValue(kMantleStatus)
127- let kArtefactIdByType = keyArtefactIdByDuckAndType(MANTLENAME, value(firstPayment.assetId))
128- if (!(mantleExists))
129- then throw("Mantle with such an ID does not exist")
130- else if ((mantleOwner != toString(i.originCaller)))
131- then throw("You're not an owner of the mantle")
132- else if ((mantleStatus != STATUSFREE))
133- then throw("Mantle is already used!")
134- else {
135- let kPutOnArtefact = keyPutOnArtefact(MANTLENAME, toString(i.originCaller), toBase58String(value(firstPayment.assetId)), fromBase58String(artefactId))
136-[BooleanEntry(kPutOnArtefact, true), StringEntry(kMantleStatus, STATUSOCCUPIED), StringEntry(kArtefactOwnerAndStatus, STATUSOCCUPIED), BooleanEntry(kDuckLock, true), StringEntry(kArtefactIdByType, artefactId)]
137- }
138- }
139- }
91+func preInit () = [IntegerEntry("static_ART-LAKE_farmingSlots", 200), IntegerEntry("static_ART-LAKE_farmingBoost", 2), IntegerEntry("static_ART-HOUSE_farmingSlots", 4), IntegerEntry("static_ART-HOUSE_farmingBoost", 30), IntegerEntry("static_ART-BIGHOUSE_farmingSlots", 10), IntegerEntry("static_ART-BIGHOUSE_farmingBoost", 15)]
14092
14193
14294
14395 @Callable(i)
144-func takeOffArtefact (duckId,artefactType) = {
145- let kArtefactIdByTypeAndDuck = keyArtefactIdByDuckAndType(artefactType, fromBase58String(duckId))
146- let artefactId = getStringValue(kArtefactIdByTypeAndDuck)
147- let kArtefactType = keyArtefactType(fromBase58String(artefactId))
148- let kPutOnArtefact = keyPutOnArtefact(artefactType, toString(i.originCaller), duckId, fromBase58String(artefactId))
149- let kPutOnArtefactStatus = getBooleanValue(kPutOnArtefact)
150- let kArtefactOwnerAndStatus = keyArtefactOwnerAndStatus(artefactType, toString(i.originCaller), fromBase58String(artefactId))
151- let kDuckLock = keyDuckLock(toString(i.originCaller), duckId)
152- let kMantleStatus = keyArtefactStatus(artefactType, fromBase58String(artefactId))
153- if ((kPutOnArtefactStatus != true))
154- then throw("There is no duck with such parameteres")
155- else [DeleteEntry(kPutOnArtefact), DeleteEntry(kArtefactIdByTypeAndDuck), DeleteEntry(kDuckLock), StringEntry(kMantleStatus, STATUSFREE), StringEntry(kArtefactOwnerAndStatus, STATUSFREE), ScriptTransfer(i.originCaller, 1, fromBase58String(duckId))]
96+func issueArtefact (type,receiver) = if ((i.caller == this))
97+ then {
98+ let txIdStr = toBase58String(i.transactionId)
99+ let address = Address(fromBase58String(receiver))
100+ let artefact = Issue(type, "NFT artefact of Waves Ducks game. Drop #2.", 1, 0, false, unit, 0)
101+ let artefactId = calculateAssetId(artefact)
102+[artefact, StringEntry((("artefact_" + toBase58String(artefactId)) + "_type"), type), ScriptTransfer(address, 1, artefactId)]
103+ }
104+ else throw("admin only")
105+
106+
107+
108+@Callable(i)
109+func setLock (n) = if ((i.caller == this))
110+ then [IntegerEntry("global_locked", n)]
111+ else throw("admin only")
112+
113+
114+
115+@Callable(i)
116+func buyArtefact () = if ((lastBlock.timestamp > 1639742400000))
117+ then throw("There are no active sales now... ")
118+ else if ((tryGetInteger("global_locked") > 0))
119+ then throw("contract is temporarily locked")
120+ else if ((tryGetInteger("global_artAmount") >= artefactsLimit))
121+ then throw("SOLDOUT!!! Hurray!")
122+ else if (if ((1639605600000 > lastBlock.timestamp))
123+ then (i.caller != Address(devAddress))
124+ else false)
125+ then throw("Too early...")
126+ else {
127+ let firstPayment = value(i.payments[0])
128+ if ((firstPayment.assetId != eggsAssetId))
129+ then throw(("You can attach only EGG tokens with the following asset id: " + toBase58String(eggsAssetId)))
130+ else if ((eggsNeeded > firstPayment.amount))
131+ then throw(("To hatch a duck you currently need the following amount of EGGlets: " + toString(eggsNeeded)))
132+ else [StringEntry((((toString(i.caller) + "_") + toBase58String(i.transactionId)) + "_status"), "started"), IntegerEntry((((toString(i.caller) + "_") + toBase58String(i.transactionId)) + "_finishHeight"), (height + 2)), IntegerEntry("global_artAmount", (tryGetInteger("global_artAmount") + 1))]
133+ }
134+
135+
136+
137+@Callable(i)
138+func setGlobalArtAmount (newAmount) = if (if ((i.caller == this))
139+ then true
140+ else (i.caller == Address(devAddress)))
141+ then [IntegerEntry("global_artAmount", newAmount)]
142+ else throw("Permission denied")
143+
144+
145+
146+@Callable(i)
147+func claimArtefact (boxIdStr) = {
148+ let txId = fromBase58String(boxIdStr)
149+ let statusKey = (((toString(i.caller) + "_") + boxIdStr) + "_status")
150+ let heightKey = (((toString(i.caller) + "_") + boxIdStr) + "_finishHeight")
151+ if ((getStringValue(statusKey) != "started"))
152+ then throw("claimed already")
153+ else if ((getIntegerValue(heightKey) > height))
154+ then throw("you cannot claim yet")
155+ else {
156+ let artType = getRandomArtefact(txId, getIntegerValue(heightKey))
157+ let asset = Issue(artType, "Artefact of Waves Ducks metaverse.", 1, 0, false, unit, getIntegerValue(heightKey))
158+ let assetId = calculateAssetId(asset)
159+[StringEntry(statusKey, artType), StringEntry((((toString(i.caller) + "_") + boxIdStr) + "_artefactId"), toBase58String(assetId)), StringEntry((toBase58String(assetId) + "_type"), artType), asset, ScriptTransfer(i.caller, 1, assetId)]
160+ }
156161 }
157162
158163
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let breederContract = base58'3PDVuU45H7Eh5dmtNbnRNRStGwULA7NY6Hb'
5-
6-let incubatorContract = base58'3PEktVux2RhchSN63DsDo4b4mz4QqzKSeDv'
7-
8-let eggAssetId = base58'C1iWsKGqLwjHUndiQ7iXpdmPum9PeCDFfyXBdJJosDRS'
9-
10-let MANTLENAME = "mantle"
11-
12-let STATUSFREE = "FREE"
13-
14-let STATUSOCCUPIED = "OCCUPIED"
15-
16-func keyDuckLock (callerAddress,duckId) = (((("address_" + callerAddress) + "_duck_") + duckId) + "_status")
4+func keyArtefactOwner (artefact,owner) = (((artefact + "_") + owner) + "_owner")
175
186
19-func keyInvestor (callerAddress) = (("address_" + callerAddress) + "_amount")
7+let eggsAssetId = base58'C1iWsKGqLwjHUndiQ7iXpdmPum9PeCDFfyXBdJJosDRS'
8+
9+let devAddress = base58'3P44yqcpfhPF2iC1nptm2ZJCTaN7VYhz9og'
10+
11+let eggsNeeded = (3 * 100000000)
12+
13+let artefactsLimit = (301 + 600)
14+
15+let oldArtefacts = ["ART-LAKE", "ART-HOUSE", "ART-BIGHOUSE", "ART-FIXGENE", "ART-FREEGENE", "ART-MIRROR", "ART-POMP", "ART-CAPE", "ART-HAT", "ART-CUSTOMDUCK"]
16+
17+let artefacts = ["ART-XMISTL", "ART-XHAT", "ART-XSCARF", "ART-XSWEATER", "ART-XSOCK", "ART-XTREE"]
18+
19+let allArtefact = (artefacts ++ oldArtefacts)
20+
21+func tryGetString (key) = match getString(this, key) {
22+ case a: String =>
23+ a
24+ case _ =>
25+ ""
26+}
2027
2128
22-func keyArtefactInvested (type,artefactId) = (((("artefact_" + type) + "_artefactId_") + artefactId) + "_invested")
29+func tryGetInteger (key) = match getInteger(this, key) {
30+ case a: Int =>
31+ a
32+ case _ =>
33+ 0
34+}
2335
2436
25-func keyOnlyArtefactLevel (artefactId) = (("artefactId_" + toBase58String(artefactId)) + "_level")
37+func getRandomNumber (variants,txId,finishHeight,offset) = {
38+ let randomSeedBlock = value(blockInfoByHeight((finishHeight - 1)))
39+ let randomHash = sha256((txId + value(randomSeedBlock.vrf)))
40+ (toInt(randomHash, (offset * 8)) % variants)
41+ }
2642
2743
28-func keyArtefactIdByDuckAndType (type,duckId) = (((("artefact_ " + type) + "_duck_") + toBase58String(duckId)) + "_artefactId")
44+func getRandomArtefact (boxId,h) = {
45+ let randomNumber = getRandomNumber(6, boxId, h, 0)
46+artefacts[randomNumber]
47+ }
2948
3049
31-func keyArtefactOwner (type,artefactId) = (((("artefact_ " + type) + "_artefactId_") + toBase58String(artefactId)) + "_owner")
32-
33-
34-func keyArtefactOwnerAndStatus (type,owner,artefactId) = (((((("address_" + owner) + "_artefact_") + type) + "_artefactId_") + toBase58String(artefactId)) + "_status")
35-
36-
37-func keyArtefactStatus (type,artefactId) = (((("artefact_ " + type) + "_artefactId_") + toBase58String(artefactId)) + "_status")
38-
39-
40-func keyArtefactType (artefactId) = (("artefactId_" + toBase58String(artefactId)) + "_type")
41-
42-
43-func keyArtefactLevel (type,owner,artefactId) = (((((("address_" + owner) + "_artefact_") + type) + "_artefactId_") + toBase58String(artefactId)) + "_level")
44-
45-
46-func keyPutOnArtefact (type,owner,duckId,artefactId) = (((((((("address_" + owner) + "_duck_") + duckId) + "_artefact_") + type) + "_artefactId_") + toBase58String(artefactId)) + "_status")
47-
48-
49-func keyArtefactExists (type,artefactId) = ((("artefact_" + type) + "_artefactId_") + toBase58String(artefactId))
50+func checkArtefactDetails (assetId) = {
51+ let asset = value(assetInfo(assetId))
52+ let assetName = value(asset.name)
53+ if (if (containsElement(allArtefact, assetName))
54+ then (asset.issuer == this)
55+ else false)
56+ then assetName
57+ else throw("Invalid artefact")
58+ }
5059
5160
5261 @Callable(i)
53-func buyArtefact (type) = if ((type != MANTLENAME))
54- then throw("You can buy only mantles now")
55- else {
56- let MANTLEPRICE = 1000000
57- let firstPayment = value(i.payments[0])
58- if ((firstPayment.assetId != eggAssetId))
59- then throw(("You can attach only EGG tokens with the following asset id: " + toBase58String(eggAssetId)))
60- else if ((firstPayment.amount != MANTLEPRICE))
61- then throw(("To buy a mantle you currently need the following amount of EGGlets: " + toString(MANTLEPRICE)))
62- else {
63- let issueMantleNFT = Issue("DUCK-MANTLE-0", "[Artefact] Mantle NFT for Jeduck", 1, 0, false)
64- let mantleNftId = calculateAssetId(issueMantleNFT)
65- let kMantleLevel = keyArtefactLevel(MANTLENAME, toString(i.caller), mantleNftId)
66- let kMantleExists = keyArtefactExists(MANTLENAME, mantleNftId)
67- let kMantleOwner = keyArtefactOwner(MANTLENAME, mantleNftId)
68- let kMantleStatus = keyArtefactStatus(MANTLENAME, mantleNftId)
69- let kArtefactType = keyArtefactType(mantleNftId)
70- let kMantleInvested = keyArtefactInvested(MANTLENAME, toBase58String(mantleNftId))
71- let kArtefactOwnerAndStatus = keyArtefactOwnerAndStatus(MANTLENAME, toString(i.caller), mantleNftId)
72- let kOnlyArtefactLevel = keyOnlyArtefactLevel(mantleNftId)
73-[IntegerEntry(kMantleLevel, 1), IntegerEntry(kMantleInvested, MANTLEPRICE), BooleanEntry(kMantleExists, true), StringEntry(kMantleOwner, toString(i.caller)), StringEntry(kMantleStatus, STATUSFREE), StringEntry(kArtefactType, MANTLENAME), StringEntry(kArtefactOwnerAndStatus, STATUSFREE), IntegerEntry(kOnlyArtefactLevel, 1)]
74- }
62+func stakeItem () = if ((size(i.payments) == 1))
63+ then {
64+ let artefactName = checkArtefactDetails(value(i.payments[0].assetId))
65+ if ((artefactName == "ART-XMISTL"))
66+ then {
67+ let invoker = toBase58String(i.caller.bytes)
68+ let artefactId = tryGetString(keyArtefactOwner(artefactName, invoker))
69+ if ((artefactId == ""))
70+ then [StringEntry(keyArtefactOwner(artefactName, invoker), toBase58String(value(i.payments[0].assetId)))]
71+ else throw(("You are already staking " + artefactName))
72+ }
73+ else throw("You can't stake this artafect")
7574 }
75+ else throw("Invalid payment")
7676
7777
7878
7979 @Callable(i)
80-func upgradeMantle (artefactId) = {
81- let upgradePointPrice = 1000000
82- let firstPayment = value(i.payments[0])
83- if ((firstPayment.assetId != eggAssetId))
84- then throw(("You can attach only EGG tokens with the following asset id: " + toBase58String(eggAssetId)))
85- else if ((upgradePointPrice > firstPayment.amount))
86- then throw(("Minimal payment for upgrading mantle is: " + toString(upgradePointPrice)))
87- else {
88- let kMantleExists = keyArtefactExists(MANTLENAME, fromBase58String(artefactId))
89- let kMantleOwner = keyArtefactOwner(MANTLENAME, fromBase58String(artefactId))
90- let mantleExists = getBooleanValue(kMantleExists)
91- let mantleOwner = getStringValue(kMantleOwner)
92- if (!(mantleExists))
93- then throw("Mantle with such an ID does not exist")
94- else if ((mantleOwner != toString(i.originCaller)))
95- then throw("You're not an owner of the mantle")
96- else {
97- let kMantleInvested = keyArtefactInvested(MANTLENAME, artefactId)
98- let mantleAlreadyInvested = getIntegerValue(kMantleInvested)
99- let kMantleLevel = keyArtefactLevel(MANTLENAME, toString(i.originCaller), fromBase58String(artefactId))
100- let kOnlyArtefactLevel = keyOnlyArtefactLevel(fromBase58String(artefactId))
101- let totalInvested = (mantleAlreadyInvested + firstPayment.amount)
102- let newLevel = (((10 * pow(totalInvested, 8, 6, 1, 8, HALFUP)) + 100000000) / 100000000)
103-[IntegerEntry(kMantleLevel, newLevel), IntegerEntry(kMantleInvested, totalInvested), IntegerEntry(kOnlyArtefactLevel, newLevel)]
104- }
105- }
80+func unstakeItem (artefactName) = {
81+ let invoker = toBase58String(i.caller.bytes)
82+ let artefactId = tryGetString(keyArtefactOwner(artefactName, invoker))
83+ if ((artefactId == ""))
84+ then throw(("You didnt stake " + artefactName))
85+ else [ScriptTransfer(i.caller, 1, fromBase58String(artefactId)), DeleteEntry(keyArtefactOwner(artefactName, invoker))]
10686 }
10787
10888
10989
11090 @Callable(i)
111-func putOnArtefact (artefactId) = {
112- let firstPayment = value(i.payments[0])
113- let attachedAssetInfo = value(assetInfo(value(firstPayment.assetId)))
114- if (if ((attachedAssetInfo.issuer.bytes != incubatorContract))
115- then (attachedAssetInfo.issuer.bytes != breederContract)
116- else false)
117- then throw("You can attach only DUCKs issued by incubator or breeder ")
118- else {
119- let kMantleExists = keyArtefactExists(MANTLENAME, fromBase58String(artefactId))
120- let kMantleOwner = keyArtefactOwner(MANTLENAME, fromBase58String(artefactId))
121- let kMantleStatus = keyArtefactStatus(MANTLENAME, fromBase58String(artefactId))
122- let kArtefactOwnerAndStatus = keyArtefactOwnerAndStatus(MANTLENAME, toString(i.originCaller), fromBase58String(artefactId))
123- let kDuckLock = keyDuckLock(toString(i.originCaller), toBase58String(value(firstPayment.assetId)))
124- let mantleExists = getBooleanValue(kMantleExists)
125- let mantleOwner = getStringValue(kMantleOwner)
126- let mantleStatus = getStringValue(kMantleStatus)
127- let kArtefactIdByType = keyArtefactIdByDuckAndType(MANTLENAME, value(firstPayment.assetId))
128- if (!(mantleExists))
129- then throw("Mantle with such an ID does not exist")
130- else if ((mantleOwner != toString(i.originCaller)))
131- then throw("You're not an owner of the mantle")
132- else if ((mantleStatus != STATUSFREE))
133- then throw("Mantle is already used!")
134- else {
135- let kPutOnArtefact = keyPutOnArtefact(MANTLENAME, toString(i.originCaller), toBase58String(value(firstPayment.assetId)), fromBase58String(artefactId))
136-[BooleanEntry(kPutOnArtefact, true), StringEntry(kMantleStatus, STATUSOCCUPIED), StringEntry(kArtefactOwnerAndStatus, STATUSOCCUPIED), BooleanEntry(kDuckLock, true), StringEntry(kArtefactIdByType, artefactId)]
137- }
138- }
139- }
91+func preInit () = [IntegerEntry("static_ART-LAKE_farmingSlots", 200), IntegerEntry("static_ART-LAKE_farmingBoost", 2), IntegerEntry("static_ART-HOUSE_farmingSlots", 4), IntegerEntry("static_ART-HOUSE_farmingBoost", 30), IntegerEntry("static_ART-BIGHOUSE_farmingSlots", 10), IntegerEntry("static_ART-BIGHOUSE_farmingBoost", 15)]
14092
14193
14294
14395 @Callable(i)
144-func takeOffArtefact (duckId,artefactType) = {
145- let kArtefactIdByTypeAndDuck = keyArtefactIdByDuckAndType(artefactType, fromBase58String(duckId))
146- let artefactId = getStringValue(kArtefactIdByTypeAndDuck)
147- let kArtefactType = keyArtefactType(fromBase58String(artefactId))
148- let kPutOnArtefact = keyPutOnArtefact(artefactType, toString(i.originCaller), duckId, fromBase58String(artefactId))
149- let kPutOnArtefactStatus = getBooleanValue(kPutOnArtefact)
150- let kArtefactOwnerAndStatus = keyArtefactOwnerAndStatus(artefactType, toString(i.originCaller), fromBase58String(artefactId))
151- let kDuckLock = keyDuckLock(toString(i.originCaller), duckId)
152- let kMantleStatus = keyArtefactStatus(artefactType, fromBase58String(artefactId))
153- if ((kPutOnArtefactStatus != true))
154- then throw("There is no duck with such parameteres")
155- else [DeleteEntry(kPutOnArtefact), DeleteEntry(kArtefactIdByTypeAndDuck), DeleteEntry(kDuckLock), StringEntry(kMantleStatus, STATUSFREE), StringEntry(kArtefactOwnerAndStatus, STATUSFREE), ScriptTransfer(i.originCaller, 1, fromBase58String(duckId))]
96+func issueArtefact (type,receiver) = if ((i.caller == this))
97+ then {
98+ let txIdStr = toBase58String(i.transactionId)
99+ let address = Address(fromBase58String(receiver))
100+ let artefact = Issue(type, "NFT artefact of Waves Ducks game. Drop #2.", 1, 0, false, unit, 0)
101+ let artefactId = calculateAssetId(artefact)
102+[artefact, StringEntry((("artefact_" + toBase58String(artefactId)) + "_type"), type), ScriptTransfer(address, 1, artefactId)]
103+ }
104+ else throw("admin only")
105+
106+
107+
108+@Callable(i)
109+func setLock (n) = if ((i.caller == this))
110+ then [IntegerEntry("global_locked", n)]
111+ else throw("admin only")
112+
113+
114+
115+@Callable(i)
116+func buyArtefact () = if ((lastBlock.timestamp > 1639742400000))
117+ then throw("There are no active sales now... ")
118+ else if ((tryGetInteger("global_locked") > 0))
119+ then throw("contract is temporarily locked")
120+ else if ((tryGetInteger("global_artAmount") >= artefactsLimit))
121+ then throw("SOLDOUT!!! Hurray!")
122+ else if (if ((1639605600000 > lastBlock.timestamp))
123+ then (i.caller != Address(devAddress))
124+ else false)
125+ then throw("Too early...")
126+ else {
127+ let firstPayment = value(i.payments[0])
128+ if ((firstPayment.assetId != eggsAssetId))
129+ then throw(("You can attach only EGG tokens with the following asset id: " + toBase58String(eggsAssetId)))
130+ else if ((eggsNeeded > firstPayment.amount))
131+ then throw(("To hatch a duck you currently need the following amount of EGGlets: " + toString(eggsNeeded)))
132+ else [StringEntry((((toString(i.caller) + "_") + toBase58String(i.transactionId)) + "_status"), "started"), IntegerEntry((((toString(i.caller) + "_") + toBase58String(i.transactionId)) + "_finishHeight"), (height + 2)), IntegerEntry("global_artAmount", (tryGetInteger("global_artAmount") + 1))]
133+ }
134+
135+
136+
137+@Callable(i)
138+func setGlobalArtAmount (newAmount) = if (if ((i.caller == this))
139+ then true
140+ else (i.caller == Address(devAddress)))
141+ then [IntegerEntry("global_artAmount", newAmount)]
142+ else throw("Permission denied")
143+
144+
145+
146+@Callable(i)
147+func claimArtefact (boxIdStr) = {
148+ let txId = fromBase58String(boxIdStr)
149+ let statusKey = (((toString(i.caller) + "_") + boxIdStr) + "_status")
150+ let heightKey = (((toString(i.caller) + "_") + boxIdStr) + "_finishHeight")
151+ if ((getStringValue(statusKey) != "started"))
152+ then throw("claimed already")
153+ else if ((getIntegerValue(heightKey) > height))
154+ then throw("you cannot claim yet")
155+ else {
156+ let artType = getRandomArtefact(txId, getIntegerValue(heightKey))
157+ let asset = Issue(artType, "Artefact of Waves Ducks metaverse.", 1, 0, false, unit, getIntegerValue(heightKey))
158+ let assetId = calculateAssetId(asset)
159+[StringEntry(statusKey, artType), StringEntry((((toString(i.caller) + "_") + boxIdStr) + "_artefactId"), toBase58String(assetId)), StringEntry((toBase58String(assetId) + "_type"), artType), asset, ScriptTransfer(i.caller, 1, assetId)]
160+ }
156161 }
157162
158163
159164 @Verifier(tx)
160165 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
161166

github/deemru/w8io/3ef1775 
39.89 ms