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:
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 5 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# 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") | |
17 | 5 | ||
18 | 6 | ||
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 | + | } | |
20 | 27 | ||
21 | 28 | ||
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 | + | } | |
23 | 35 | ||
24 | 36 | ||
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 | + | } | |
26 | 42 | ||
27 | 43 | ||
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 | + | } | |
29 | 48 | ||
30 | 49 | ||
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 | + | } | |
50 | 59 | ||
51 | 60 | ||
52 | 61 | @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") | |
75 | 74 | } | |
75 | + | else throw("Invalid payment") | |
76 | 76 | ||
77 | 77 | ||
78 | 78 | ||
79 | 79 | @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))] | |
106 | 86 | } | |
107 | 87 | ||
108 | 88 | ||
109 | 89 | ||
110 | 90 | @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)] | |
140 | 92 | ||
141 | 93 | ||
142 | 94 | ||
143 | 95 | @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 | + | } | |
156 | 161 | } | |
157 | 162 | ||
158 | 163 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 5 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# 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") | |
17 | 5 | ||
18 | 6 | ||
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 | + | } | |
20 | 27 | ||
21 | 28 | ||
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 | + | } | |
23 | 35 | ||
24 | 36 | ||
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 | + | } | |
26 | 42 | ||
27 | 43 | ||
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 | + | } | |
29 | 48 | ||
30 | 49 | ||
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 | + | } | |
50 | 59 | ||
51 | 60 | ||
52 | 61 | @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") | |
75 | 74 | } | |
75 | + | else throw("Invalid payment") | |
76 | 76 | ||
77 | 77 | ||
78 | 78 | ||
79 | 79 | @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))] | |
106 | 86 | } | |
107 | 87 | ||
108 | 88 | ||
109 | 89 | ||
110 | 90 | @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)] | |
140 | 92 | ||
141 | 93 | ||
142 | 94 | ||
143 | 95 | @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 | + | } | |
156 | 161 | } | |
157 | 162 | ||
158 | 163 | ||
159 | 164 | @Verifier(tx) | |
160 | 165 | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
161 | 166 |
github/deemru/w8io/3ef1775 39.89 ms ◑