2022.04.12 12:07 [3070477] smart account 3PAi1ePLQrYrY3jj9omBtT6isMkZsapbmks > SELF 0.00000000 Waves
{ "type": 13, "id": "CnCTkGviczb5Weanzq6vMXhAiuyRyYFFcKzQJtxVejKn", "fee": 1400000, "feeAssetId": null, "timestamp": 1649754462753, "version": 2, "chainId": 87, "sender": "3PAi1ePLQrYrY3jj9omBtT6isMkZsapbmks", "senderPublicKey": "XrNmTusDFaLSz3wAjmdfcyC5h6uYyVbpdh18758UpFv", "proofs": [ "4FzBd33yrkLaQ7dM9vzXL3JKFAGDWAH4r9hgecnLMHwmwzvxz22hAy4b8NAgAW4deNuB91PgbUcY3jEypEnrwGoc" ], "script": "base64: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AAJZAAAAAQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAACAAAAFXN0YXRpY19icmVlZGVyQWRkcmVzcwEAAAANZ2V0RWdnQXNzZXRJZAAAAAAJAAJZAAAAAQkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAACAAAAEXN0YXRpY19lZ2dBc3NldElkAQAAABNnZXRUcnVzdGVkQ29udHJhY3RzAAAAAAkBAAAAFHRyeUdldFN0cmluZ0V4dGVybmFsAAAAAgkBAAAACWdldE9yYWNsZQAAAAACAAAAF3N0YXRpY190cnVzdGVkQ29udHJhY3RzAQAAAAhhc1N0cmluZwAAAAEAAAAFdmFsdWUEAAAAByRtYXRjaDAFAAAABXZhbHVlAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAABnN0cmluZwUAAAAHJG1hdGNoMAUAAAAGc3RyaW5nCQAAAgAAAAECAAAAHHdyb25nIHR5cGUsIGV4cGVjdGVkOiBTdHJpbmcBAAAABWFzSW50AAAAAQAAAAV2YWx1ZQQAAAAHJG1hdGNoMAUAAAAFdmFsdWUDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAADaW50BQAAAAckbWF0Y2gwBQAAAANpbnQJAAACAAAAAQIAAAAZd3JvbmcgdHlwZSwgZXhwZWN0ZWQ6IEludAEAAAAObWFuaXB1bGF0ZU5hbWUAAAADAAAACWFzc2V0TmFtZQAAAAhwb3NpdGlvbgAAAARjaGFyCQABLAAAAAIJAAEsAAAAAgkAAS8AAAACBQAAAAlhc3NldE5hbWUJAABlAAAAAgUAAAAIcG9zaXRpb24AAAAAAAAAAAEFAAAABGNoYXIJAQAAAAl0YWtlUmlnaHQAAAACBQAAAAlhc3NldE5hbWUJAABlAAAAAgAAAAAAAAAAEAUAAAAIcG9zaXRpb24BAAAAEGl0ZW1Jc0luQ29vbERvd24AAAACAAAADGFydGVmYWN0TmFtZQAAAAphcnRlZmFjdElkBAAAABF1bnN0YWtlSGVpZ2h0TGFzdAkBAAAADXRyeUdldEludGVnZXIAAAABCQEAAAAQa2V5VW5zdGFrZUhlaWdodAAAAAIFAAAADGFydGVmYWN0TmFtZQUAAAAKYXJ0ZWZhY3RJZAQAAAAOY29vbGRvd25QZXJpb2QAAAAAAAAAAPADCQAAZgAAAAIFAAAABmhlaWdodAkAAGQAAAACBQAAABF1bnN0YWtlSGVpZ2h0TGFzdAUAAAAOY29vbGRvd25QZXJpb2QHBgAAABEAAAABaQEAAAAPbWFuaXB1bGF0ZUJvb3N0AAAAAgAAAAVib29zdAAAAAZkdWNrSWQEAAAAEGFsbG93ZWRDb250cmFjdHMJAQAAABNnZXRUcnVzdGVkQ29udHJhY3RzAAAAAAQAAAAUYWxsb3dlZENvbnRyYWN0c0xpc3QJAAS1AAAAAgUAAAAQYWxsb3dlZENvbnRyYWN0cwIAAAABOwQAAAAKZGFwcFRvQ2FsbAkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIDCQAAAAAAAAIJAARPAAAAAgUAAAAUYWxsb3dlZENvbnRyYWN0c0xpc3QFAAAACmRhcHBUb0NhbGwFAAAABHVuaXQJAAACAAAAAQIAAAAvVGhpcyBzbWFydCBjb250cmFjdCBjYW4ndCBtYW5pcHVsYXRlIHRoZSBib29zdCEEAAAAA2tleQkBAAAAFGtleUV4dGVybmFsQm9vc3REdWNrAAAAAQUAAAAGZHVja0lkBAAAAAthY3RpdmVCb29zdAkBAAAADXRyeUdldEludGVnZXIAAAABBQAAAANrZXkEAAAACG5ld0Jvb3N0CQAAZAAAAAIFAAAAC2FjdGl2ZUJvb3N0BQAAAAVib29zdAMJAABmAAAAAgAAAAAAAAAAAAUAAAAIbmV3Qm9vc3QJAAACAAAAAQIAAAA7U29tZXRoaW5nIHdlbnQgd3Jvbmcgd2l0aCBib29zdCwgcGxlYXNlIGNvbnRhY3QgdGhlIGFkbWlucyEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAA2tleQUAAAAIbmV3Qm9vc3QFAAAAA25pbAAAAAFpAQAAABRjaGVja0FydGVmYWN0RGV0YWlscwAAAAEAAAAHYXNzZXRJZAQAAAAFYXNzZXQJAQAAAAV2YWx1ZQAAAAEJAAPsAAAAAQkAAlkAAAABBQAAAAdhc3NldElkBAAAAAlhc3NldE5hbWUJAQAAAAV2YWx1ZQAAAAEIBQAA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AAIIBQAAAAxmaXJzdFBheW1lbnQAAAAGYW1vdW50AAAAAAAAAAABCQAAAgAAAAECAAAAE05GVCBpcyBub3QgYXR0YWNoZWQEAAAACGFydGVmYWN0CQEAAAAIYXNTdHJpbmcAAAABCQAD/AAAAAQFAAAABHRoaXMCAAAAFGNoZWNrQXJ0ZWZhY3REZXRhaWxzCQAETAAAAAIFAAAADGZpcnN0QXNzZXRJZAUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAACGFydGVmYWN0BQAAAAhhcnRlZmFjdAMJAQAAAAIhPQAAAAIFAAAACGFydGVmYWN0AgAAAAxBUlQtRlJFRUdFTkUJAAACAAAAAQIAAAAqWW91IG5lZWQgdG8gYXR0YWNoIGEgQVJULUZSRUVHRU5FIGFydGVmYWN0BAAAAAR0eElkCQACWQAAAAEFAAAAB3R4SWRTdHIEAAAAD2ZpbmlzaEhlaWdodEtleQkBAAAAGWdldFByb2Nlc3NGaW5pc2hIZWlnaHRLZXkAAAACCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgUAAAAEdHhJZAQAAAATcHJvY2Vzc0ZpbmlzaEhlaWdodAkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgkBAAAAEWdldEJyZWVkZXJBZGRyZXNzAAAAAAUAAAAPZmluaXNoSGVpZ2h0S2V5BAAAAAxzZWxlY3RlZEdlbmUJAQAAAA5nZXRSYW5kb21HZW5lcwAAAAIFAAAABHR4SWQFAAAAE3Byb2Nlc3NGaW5pc2hIZWlnaHQEAAAADnJhbmRvbVBvc2l0aW9uCQEAAAAPZ2V0UmFuZG9tTnVtYmVyAAAABAAAAAAAAAAABwUAAAAEdHhJZAUAAAATcHJvY2Vzc0ZpbmlzaEhlaWdodAAAAAAAAAAAAwQAAAAPZHVja0dlbmVzU3RyaW5nCQEAAAAIYXNTdHJpbmcAAAABCQAD/AAAAAQJAQAAABFnZXRCcmVlZGVyQWRkcmVzcwAAAAACAAAADGdlbmVyYXRlRHVjawkABEwAAAACBQAAAAd0eElkU3RyCQAETAAAAAIFAAAAE3Byb2Nlc3NGaW5pc2hIZWlnaHQJAARMAAAAAgAAAAAAAAAAAAkABEwAAAACAAAAAAAAAAAACQAETAAAAAIFAAAADHNlbGVjdGVk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bnRhaW5zRWxlbWVudAAAAAIFAAAADGFsbFN0YWtlYWJsZQUAAAAMYXJ0ZWZhY3ROYW1lAwMJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAABFzdGFrZWFibGVXaXRoTG9jawUAAAAMYXJ0ZWZhY3ROYW1lCQEAAAAQaXRlbUlzSW5Db29sRG93bgAAAAIFAAAADGFydGVmYWN0TmFtZQkAAlgAAAABBQAAAAdhc3NldElkBwkAAAIAAAABAgAAACpJdGVtIGNhbid0IGJlIHN0YWtlZCB5ZXQsIGl0J3MgaW4gY29vbGRvd24EAAAAB2ludm9rZXIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAAphcnRlZmFjdElkCQEAAAAMdHJ5R2V0U3RyaW5nAAAAAQkBAAAAEGtleUFydGVmYWN0T3duZXIAAAACBQAAAAxhcnRlZmFjdE5hbWUFAAAAB2ludm9rZXIDCQAAAAAAAAIFAAAACmFydGVmYWN0SWQCAAAAAAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAQa2V5QXJ0ZWZhY3RPd25lcgAAAAIFAAAADGFydGVmYWN0TmFtZQUAAAAHaW52b2tlcgkAAlgAAAABBQAAAAdhc3NldElkBQAAAANuaWwJAAACAAAAAQkAASwAAAACAgAAABhZb3UgYXJlIGFscmVhZHkgc3Rha2luZyAFAAAADGFydGVmYWN0TmFtZQkAAAIAAAABAgAAAB1Zb3UgY2FuJ3Qgc3Rha2UgdGhpcyBhcnRhZmVjdAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAPSW52YWxpZCBwYXltZW50AAAAAWkBAAAAC3Vuc3Rha2VJdGVtAAAAAQAAAAxhcnRlZmFjdE5hbWUDCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAALYWxsQXJ0ZWZhY3QFAAAADGFydGVmYWN0TmFtZQQAAAAHaW52b2tlcgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAACmFydGVmYWN0SWQJAQAAAAx0cnlHZXRTdHJpbmcAAAABCQEAAAAQa2V5QXJ0ZWZhY3RPd25lcgAAAAIFAAAADGFydGVmYWN0TmFtZQUAAAAHaW52b2tlcgMJAAAAAAAAAgUAAAAKYXJ0ZWZhY3RJZAIAAAAACQAAAgAAAAEJAAEsAAAAAgIAAAAQWW91IGRpZG50IHN0YWtlIAUAAAAMYXJ0ZWZhY3ROYW1lCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAQa2V5VW5zdGFrZUhlaWdodAAAAAIFAAAADGFydGVmYWN0TmFtZQUAAAAKYXJ0ZWZhY3RJZAUAAAAGaGVpZ2h0CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgAAAAAAAAAAAQkAAlkAAAABBQAAAAphcnRlZmFjdElkCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAABBrZXlBcnRlZmFjdE93bmVyAAAAAgUAAAAMYXJ0ZWZhY3ROYW1lBQAAAAdpbnZva2VyBQAAAANuaWwJAAACAAAAAQIAAAAbVGhpcyBhcnRlZmFjdCBkb2Vzbid0IGV4aXN0AAAAAWkBAAAAB3ByZUluaXQAAAAACQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACAgAAABxzdGF0aWNfQVJULUxBS0VfZmFybWluZ1Nsb3RzAAAAAAAAAADICQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACAgAAABxzdGF0aWNfQVJULUxBS0VfZmFybWluZ0Jvb3N0AAAAAAAAAAACCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACAgAAAB1zdGF0aWNfQVJULUhPVVNFX2Zhcm1pbmdTbG90cwAAAAAAAAAABAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgIAAAAdc3RhdGljX0FSVC1IT1VTRV9mYXJtaW5nQm9vc3QAAAAAAAAAAB4JAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAICAAAAIHN0YXRpY19BUlQtQklHSE9VU0VfZmFybWluZ1Nsb3RzAAAAAAAAAAAKCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACAgAAACBzdGF0aWNfQVJULUJJR0hPVVNFX2Zhcm1pbmdCb29zdAAAAAAAAAAADwUAAAADbmlsAAAAAWkBAAAADWlzc3VlQXJ0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", "height": 3070477, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: FL6sTL6RDrXbxKQqKTYAdDbkfMZcozAJtotxjvus8qjk Next: 51R3mwNe34jWJfGMxCXo2Yd96bNZ2oJJRhestEeASh5R Diff:
Old | New | Differences | |
---|---|---|---|
8 | 8 | ||
9 | 9 | ||
10 | 10 | func keyArtefactDuck (artefactName,duckId) = (((artefactName + "_") + duckId) + "_duck") | |
11 | + | ||
12 | + | ||
13 | + | func keyExternalBoostDuck (duckId) = (duckId + "_duck_external_boost") | |
11 | 14 | ||
12 | 15 | ||
13 | 16 | func getProcessFinishHeightKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_fh") | |
68 | 71 | } | |
69 | 72 | ||
70 | 73 | ||
71 | - | func checkArtefactDetails (assetId) = { | |
72 | - | let asset = value(assetInfo(assetId)) | |
73 | - | let assetName = value(asset.name) | |
74 | - | if (if (containsElement(allArtefact, assetName)) | |
75 | - | then (asset.issuer == this) | |
76 | - | else false) | |
77 | - | then assetName | |
78 | - | else throw("Invalid artefact") | |
79 | - | } | |
80 | - | ||
81 | - | ||
82 | 74 | func tryGetStringExternal (address,key) = match getString(address, key) { | |
83 | 75 | case a: String => | |
84 | 76 | a | |
94 | 86 | ||
95 | 87 | ||
96 | 88 | func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), "static_eggAssetId")) | |
89 | + | ||
90 | + | ||
91 | + | func getTrustedContracts () = tryGetStringExternal(getOracle(), "static_trustedContracts") | |
97 | 92 | ||
98 | 93 | ||
99 | 94 | func asString (value) = match value { | |
125 | 120 | ||
126 | 121 | ||
127 | 122 | @Callable(i) | |
123 | + | func manipulateBoost (boost,duckId) = { | |
124 | + | let allowedContracts = getTrustedContracts() | |
125 | + | let allowedContractsList = split(allowedContracts, ";") | |
126 | + | let dappToCall = toString(i.caller) | |
127 | + | if ((indexOf(allowedContractsList, dappToCall) == unit)) | |
128 | + | then throw("This smart contract can't manipulate the boost!") | |
129 | + | else { | |
130 | + | let key = keyExternalBoostDuck(duckId) | |
131 | + | let activeBoost = tryGetInteger(key) | |
132 | + | let newBoost = (activeBoost + boost) | |
133 | + | if ((0 > newBoost)) | |
134 | + | then throw("Something went wrong with boost, please contact the admins!") | |
135 | + | else [IntegerEntry(key, newBoost)] | |
136 | + | } | |
137 | + | } | |
138 | + | ||
139 | + | ||
140 | + | ||
141 | + | @Callable(i) | |
142 | + | func checkArtefactDetails (assetId) = { | |
143 | + | let asset = value(assetInfo(fromBase58String(assetId))) | |
144 | + | let assetName = value(asset.name) | |
145 | + | if (if (containsElement(allArtefact, assetName)) | |
146 | + | then (asset.issuer == this) | |
147 | + | else false) | |
148 | + | then $Tuple2(nil, assetName) | |
149 | + | else throw("Invalid artefact") | |
150 | + | } | |
151 | + | ||
152 | + | ||
153 | + | ||
154 | + | @Callable(i) | |
128 | 155 | func configureOracle (oracle) = if ((i.caller != this)) | |
129 | 156 | then throw("admin only") | |
130 | 157 | else [StringEntry("static_oracleAddress", oracle)] | |
142 | 169 | let scarfBoost = if ((tryGetString(keyArtefactDuck("ART-XSCARF", duckId)) != "")) | |
143 | 170 | then 69 | |
144 | 171 | else 0 | |
145 | - | let totalBoost = ((lakeBoost + xmasTreeBoost) + scarfBoost) | |
172 | + | let externalBoost = tryGetInteger(keyExternalBoostDuck(duckId)) | |
173 | + | let totalBoost = (((lakeBoost + xmasTreeBoost) + scarfBoost) + externalBoost) | |
146 | 174 | $Tuple2([IntegerEntry((duckId + "_last_boost"), totalBoost)], totalBoost) | |
147 | 175 | } | |
148 | 176 | ||
155 | 183 | if ((firstPayment.amount != 1)) | |
156 | 184 | then throw("NFT is not attached") | |
157 | 185 | else { | |
158 | - | let artefact = checkArtefactDetails(value(firstPayment.assetId)) | |
159 | - | if ((artefact != "ART-FIXGENE")) | |
160 | - | then throw("You need to attach a ART-FIXGENE artefact") | |
161 | - | else { | |
162 | - | let txId = fromBase58String(txIdStr) | |
163 | - | let finishHeightKey = getProcessFinishHeightKey(toString(i.caller), txId) | |
164 | - | let processFinishHeight = getIntegerValue(getBreederAddress(), finishHeightKey) | |
165 | - | let duckGenesString = asString(invoke(getBreederAddress(), "generateDuck", [txIdStr, processFinishHeight, parentFixedGene, positionFixedGene, "", 0], nil)) | |
166 | - | if ((duckGenesString == duckGenesString)) | |
167 | - | then { | |
168 | - | let call = invoke(getBreederAddress(), "finishDuckHatchingItems", [txIdStr, duckGenesString], nil) | |
169 | - | if ((call == call)) | |
170 | - | then [Burn(value(firstPayment.assetId), 1)] | |
171 | - | else throw("Strict value is not equal to itself.") | |
172 | - | } | |
173 | - | else throw("Strict value is not equal to itself.") | |
174 | - | } | |
186 | + | let artefact = asString(invoke(this, "checkArtefactDetails", [firstAssetId], nil)) | |
187 | + | if ((artefact == artefact)) | |
188 | + | then if ((artefact != "ART-FIXGENE")) | |
189 | + | then throw("You need to attach a ART-FIXGENE artefact") | |
190 | + | else { | |
191 | + | let txId = fromBase58String(txIdStr) | |
192 | + | let finishHeightKey = getProcessFinishHeightKey(toString(i.caller), txId) | |
193 | + | let processFinishHeight = getIntegerValue(getBreederAddress(), finishHeightKey) | |
194 | + | let duckGenesString = asString(invoke(getBreederAddress(), "generateDuck", [txIdStr, processFinishHeight, parentFixedGene, positionFixedGene, "", 0], nil)) | |
195 | + | if ((duckGenesString == duckGenesString)) | |
196 | + | then { | |
197 | + | let call = invoke(getBreederAddress(), "finishDuckHatchingItems", [txIdStr, duckGenesString], nil) | |
198 | + | if ((call == call)) | |
199 | + | then [Burn(value(firstPayment.assetId), 1)] | |
200 | + | else throw("Strict value is not equal to itself.") | |
201 | + | } | |
202 | + | else throw("Strict value is not equal to itself.") | |
203 | + | } | |
204 | + | else throw("Strict value is not equal to itself.") | |
175 | 205 | } | |
176 | 206 | } | |
177 | 207 | ||
184 | 214 | if ((firstPayment.amount != 1)) | |
185 | 215 | then throw("NFT is not attached") | |
186 | 216 | else { | |
187 | - | let artefact = checkArtefactDetails(value(firstPayment.assetId)) | |
188 | - | if ((artefact != "ART-FREEGENE")) | |
189 | - | then throw("You need to attach a ART-FREEGENE artefact") | |
190 | - | else { | |
191 | - | let txId = fromBase58String(txIdStr) | |
192 | - | let finishHeightKey = getProcessFinishHeightKey(toString(i.caller), txId) | |
193 | - | let processFinishHeight = getIntegerValue(getBreederAddress(), finishHeightKey) | |
194 | - | let selectedGene = getRandomGenes(txId, processFinishHeight) | |
195 | - | let randomPosition = getRandomNumber(7, txId, processFinishHeight, 3) | |
196 | - | let duckGenesString = asString(invoke(getBreederAddress(), "generateDuck", [txIdStr, processFinishHeight, 0, 0, selectedGene, randomPosition], nil)) | |
197 | - | if ((duckGenesString == duckGenesString)) | |
198 | - | then { | |
199 | - | let call = invoke(getBreederAddress(), "finishDuckHatchingItems", [txIdStr, duckGenesString], nil) | |
200 | - | if ((call == call)) | |
201 | - | then [Burn(value(firstPayment.assetId), 1)] | |
202 | - | else throw("Strict value is not equal to itself.") | |
203 | - | } | |
204 | - | else throw("Strict value is not equal to itself.") | |
205 | - | } | |
217 | + | let artefact = asString(invoke(this, "checkArtefactDetails", [firstAssetId], nil)) | |
218 | + | if ((artefact == artefact)) | |
219 | + | then if ((artefact != "ART-FREEGENE")) | |
220 | + | then throw("You need to attach a ART-FREEGENE artefact") | |
221 | + | else { | |
222 | + | let txId = fromBase58String(txIdStr) | |
223 | + | let finishHeightKey = getProcessFinishHeightKey(toString(i.caller), txId) | |
224 | + | let processFinishHeight = getIntegerValue(getBreederAddress(), finishHeightKey) | |
225 | + | let selectedGene = getRandomGenes(txId, processFinishHeight) | |
226 | + | let randomPosition = getRandomNumber(7, txId, processFinishHeight, 3) | |
227 | + | let duckGenesString = asString(invoke(getBreederAddress(), "generateDuck", [txIdStr, processFinishHeight, 0, 0, selectedGene, randomPosition], nil)) | |
228 | + | if ((duckGenesString == duckGenesString)) | |
229 | + | then { | |
230 | + | let call = invoke(getBreederAddress(), "finishDuckHatchingItems", [txIdStr, duckGenesString], nil) | |
231 | + | if ((call == call)) | |
232 | + | then [Burn(value(firstPayment.assetId), 1)] | |
233 | + | else throw("Strict value is not equal to itself.") | |
234 | + | } | |
235 | + | else throw("Strict value is not equal to itself.") | |
236 | + | } | |
237 | + | else throw("Strict value is not equal to itself.") | |
206 | 238 | } | |
207 | 239 | } | |
208 | 240 | ||
220 | 252 | else (secondPayment.amount != 1)) | |
221 | 253 | then throw("NFT is not attached") | |
222 | 254 | else { | |
223 | - | let artefact = checkArtefactDetails(value(secondPayment.assetId)) | |
224 | - | if ((artefact != "ART-MIRROR")) | |
225 | - | then throw("You need to attach a ART-MIRROR artefact") | |
226 | - | else { | |
227 | - | let nftInfo = value(assetInfo(value(firstPayment.assetId))) | |
228 | - | let asset1Gen = split(nftInfo.name, "") | |
229 | - | if (if ((asset1Gen[14] == "G")) | |
230 | - | then true | |
231 | - | else (asset1Gen[14] == "J")) | |
232 | - | then throw("You can't mirror this duck") | |
233 | - | else { | |
234 | - | let duckGen = nftInfo.name | |
235 | - | let call = invoke(getBreederAddress(), "createDuckSpecialGenes", [i.caller.bytes, duckGen, children], nil) | |
236 | - | if ((call == call)) | |
237 | - | then [ScriptTransfer(i.caller, 1, firstPayment.assetId), Burn(value(secondPayment.assetId), 1)] | |
238 | - | else throw("Strict value is not equal to itself.") | |
239 | - | } | |
240 | - | } | |
255 | + | let artefact = asString(invoke(this, "checkArtefactDetails", [toBase58String(value(secondPayment.assetId))], nil)) | |
256 | + | if ((artefact == artefact)) | |
257 | + | then if ((artefact != "ART-MIRROR")) | |
258 | + | then throw("You need to attach a ART-MIRROR artefact") | |
259 | + | else { | |
260 | + | let nftInfo = value(assetInfo(value(firstPayment.assetId))) | |
261 | + | let asset1Gen = split(nftInfo.name, "") | |
262 | + | if (if ((asset1Gen[14] == "G")) | |
263 | + | then true | |
264 | + | else (asset1Gen[14] == "J")) | |
265 | + | then throw("You can't mirror this duck") | |
266 | + | else { | |
267 | + | let duckGen = nftInfo.name | |
268 | + | let call = invoke(getBreederAddress(), "createDuckSpecialGenes", [i.caller.bytes, duckGen, children], nil) | |
269 | + | if ((call == call)) | |
270 | + | then [ScriptTransfer(i.caller, 1, firstPayment.assetId), Burn(value(secondPayment.assetId), 1)] | |
271 | + | else throw("Strict value is not equal to itself.") | |
272 | + | } | |
273 | + | } | |
274 | + | else throw("Strict value is not equal to itself.") | |
241 | 275 | } | |
242 | 276 | else throw("Strict value is not equal to itself.") | |
243 | 277 | } | |
258 | 292 | let children = asInt(invoke(getBreederAddress(), "validateAndGetChildren", [duckId], nil)) | |
259 | 293 | if ((children == children)) | |
260 | 294 | then { | |
261 | - | let artefactName = checkArtefactDetails(value(secondPayment.assetId)) | |
262 | - | if ((artefactName != "ART-XSCARF")) | |
263 | - | then throw("You need to attach a ART-XSCARF artefact") | |
264 | - | else { | |
265 | - | let artefactId = tryGetString(keyArtefactDuck(artefactName, duckId)) | |
266 | - | if ((artefactId == "")) | |
267 | - | then [StringEntry(keyArtefactDuck(artefactName, duckId), secondAssetId), ScriptTransfer(i.caller, 1, firstPayment.assetId)] | |
268 | - | else throw(("Duck is already wearing a " + artefactName)) | |
269 | - | } | |
295 | + | let artefactName = asString(invoke(this, "checkArtefactDetails", [secondAssetId], nil)) | |
296 | + | if ((artefactName == artefactName)) | |
297 | + | then if ((artefactName != "ART-XSCARF")) | |
298 | + | then throw("You need to attach a ART-XSCARF artefact") | |
299 | + | else { | |
300 | + | let artefactId = tryGetString(keyArtefactDuck(artefactName, duckId)) | |
301 | + | if ((artefactId == "")) | |
302 | + | then [StringEntry(keyArtefactDuck(artefactName, duckId), secondAssetId), ScriptTransfer(i.caller, 1, firstPayment.assetId)] | |
303 | + | else throw(("Duck is already wearing a " + artefactName)) | |
304 | + | } | |
305 | + | else throw("Strict value is not equal to itself.") | |
270 | 306 | } | |
271 | 307 | else throw("Strict value is not equal to itself.") | |
272 | 308 | } | |
289 | 325 | then if ((children == 0)) | |
290 | 326 | then throw("You can only pick a sterile NFT-duck") | |
291 | 327 | else { | |
292 | - | let artefact = checkArtefactDetails(value(secondPayment.assetId)) | |
293 | - | if (if ((artefact != "ART-XHAT")) | |
294 | - | then (artefact != "ART-POMP") | |
295 | - | else false) | |
296 | - | then throw("You need to attach a ART-XHAT or ART-POMP artefact") | |
297 | - | else { | |
298 | - | let nftInfo = value(assetInfo(value(firstPayment.assetId))) | |
299 | - | let asset1Gen = split(nftInfo.name, "") | |
300 | - | if (if ((asset1Gen[14] == "G")) | |
301 | - | then true | |
302 | - | else (asset1Gen[14] == "J")) | |
303 | - | then throw("You can't mirror this duck") | |
304 | - | else if (if ((asset1Gen[5] == "S")) | |
328 | + | let artefact = asString(invoke(this, "checkArtefactDetails", [toBase58String(value(secondPayment.assetId))], nil)) | |
329 | + | if ((artefact == artefact)) | |
330 | + | then if (if ((artefact != "ART-XHAT")) | |
331 | + | then (artefact != "ART-POMP") | |
332 | + | else false) | |
333 | + | then throw("You need to attach a ART-XHAT or ART-POMP artefact") | |
334 | + | else { | |
335 | + | let nftInfo = value(assetInfo(value(firstPayment.assetId))) | |
336 | + | let asset1Gen = split(nftInfo.name, "") | |
337 | + | if (if ((asset1Gen[14] == "G")) | |
305 | 338 | then true | |
306 | - | else (asset1Gen[5] == "T")) | |
307 | - | then throw("you already attached a artefact") | |
308 | - | else { | |
309 | - | let char = if ((artefact == "ART-XHAT")) | |
310 | - | then "T" | |
311 | - | else if ((artefact == "ART-POMP")) | |
312 | - | then "S" | |
313 | - | else throw("No char defined") | |
314 | - | let oldDuckGen = nftInfo.name | |
315 | - | let oldFarmGen = asString(invoke(getBreederAddress(), "getGenFromName", [oldDuckGen], nil)) | |
316 | - | if ((oldFarmGen == oldFarmGen)) | |
317 | - | then { | |
318 | - | let duckGen = manipulateName(oldDuckGen, 6, char) | |
319 | - | let call = invoke(getBreederAddress(), "createDuckSpecialGenes", [i.caller.bytes, duckGen, children], nil) | |
320 | - | if ((call == call)) | |
321 | - | then { | |
322 | - | let callReduce = invoke(getBreederAddress(), "reduceRarity", [firstAssetId, oldFarmGen], nil) | |
323 | - | if ((callReduce == callReduce)) | |
324 | - | then [Burn(value(firstPayment.assetId), 1), Burn(value(secondPayment.assetId), 1)] | |
325 | - | else throw("Strict value is not equal to itself.") | |
326 | - | } | |
327 | - | else throw("Strict value is not equal to itself.") | |
328 | - | } | |
329 | - | else throw("Strict value is not equal to itself.") | |
330 | - | } | |
331 | - | } | |
339 | + | else (asset1Gen[14] == "J")) | |
340 | + | then throw("You can't mirror this duck") | |
341 | + | else if (if ((asset1Gen[5] == "S")) | |
342 | + | then true | |
343 | + | else (asset1Gen[5] == "T")) | |
344 | + | then throw("you already attached a artefact") | |
345 | + | else { | |
346 | + | let char = if ((artefact == "ART-XHAT")) | |
347 | + | then "T" | |
348 | + | else if ((artefact == "ART-POMP")) | |
349 | + | then "S" | |
350 | + | else throw("No char defined") | |
351 | + | let oldDuckGen = nftInfo.name | |
352 | + | let oldFarmGen = asString(invoke(getBreederAddress(), "getGenFromName", [oldDuckGen], nil)) | |
353 | + | if ((oldFarmGen == oldFarmGen)) | |
354 | + | then { | |
355 | + | let duckGen = manipulateName(oldDuckGen, 6, char) | |
356 | + | let call = invoke(getBreederAddress(), "createDuckSpecialGenes", [i.caller.bytes, duckGen, children], nil) | |
357 | + | if ((call == call)) | |
358 | + | then { | |
359 | + | let callReduce = invoke(getBreederAddress(), "reduceRarity", [firstAssetId, oldFarmGen], nil) | |
360 | + | if ((callReduce == callReduce)) | |
361 | + | then [Burn(value(firstPayment.assetId), 1), Burn(value(secondPayment.assetId), 1)] | |
362 | + | else throw("Strict value is not equal to itself.") | |
363 | + | } | |
364 | + | else throw("Strict value is not equal to itself.") | |
365 | + | } | |
366 | + | else throw("Strict value is not equal to itself.") | |
367 | + | } | |
368 | + | } | |
369 | + | else throw("Strict value is not equal to itself.") | |
332 | 370 | } | |
333 | 371 | else throw("Strict value is not equal to itself.") | |
334 | 372 | } | |
342 | 380 | else false) | |
343 | 381 | then { | |
344 | 382 | let assetId = value(i.payments[0].assetId) | |
345 | - | let artefactName = checkArtefactDetails(assetId) | |
346 | - | if (containsElement(allStakeable, artefactName)) | |
347 | - | then if (if (containsElement(stakeableWithLock, artefactName)) | |
348 | - | then itemIsInCoolDown(artefactName, toBase58String(assetId)) | |
349 | - | else false) | |
350 | - | then throw("Item can't be staked yet, it's in cooldown") | |
351 | - | else { | |
352 | - | let invoker = toString(i.caller) | |
353 | - | let artefactId = tryGetString(keyArtefactOwner(artefactName, invoker)) | |
354 | - | if ((artefactId == "")) | |
355 | - | then [StringEntry(keyArtefactOwner(artefactName, invoker), toBase58String(assetId))] | |
356 | - | else throw(("You are already staking " + artefactName)) | |
357 | - | } | |
358 | - | else throw("You can't stake this artafect") | |
383 | + | let artefactName = asString(invoke(this, "checkArtefactDetails", [toBase58String(assetId)], nil)) | |
384 | + | if ((artefactName == artefactName)) | |
385 | + | then if (containsElement(allStakeable, artefactName)) | |
386 | + | then if (if (containsElement(stakeableWithLock, artefactName)) | |
387 | + | then itemIsInCoolDown(artefactName, toBase58String(assetId)) | |
388 | + | else false) | |
389 | + | then throw("Item can't be staked yet, it's in cooldown") | |
390 | + | else { | |
391 | + | let invoker = toString(i.caller) | |
392 | + | let artefactId = tryGetString(keyArtefactOwner(artefactName, invoker)) | |
393 | + | if ((artefactId == "")) | |
394 | + | then [StringEntry(keyArtefactOwner(artefactName, invoker), toBase58String(assetId))] | |
395 | + | else throw(("You are already staking " + artefactName)) | |
396 | + | } | |
397 | + | else throw("You can't stake this artafect") | |
398 | + | else throw("Strict value is not equal to itself.") | |
359 | 399 | } | |
360 | 400 | else throw("Invalid payment") | |
361 | 401 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 5 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | func keyArtefactOwner (artefactName,owner) = (((artefactName + "_") + owner) + "_owner") | |
5 | 5 | ||
6 | 6 | ||
7 | 7 | func keyUnstakeHeight (artefactName,artefactId) = (((artefactName + "_") + artefactId) + "_unstake_height") | |
8 | 8 | ||
9 | 9 | ||
10 | 10 | func keyArtefactDuck (artefactName,duckId) = (((artefactName + "_") + duckId) + "_duck") | |
11 | + | ||
12 | + | ||
13 | + | func keyExternalBoostDuck (duckId) = (duckId + "_duck_external_boost") | |
11 | 14 | ||
12 | 15 | ||
13 | 16 | func getProcessFinishHeightKey (address,txId) = (((address + "_") + toBase58String(txId)) + "_fh") | |
14 | 17 | ||
15 | 18 | ||
16 | 19 | let devAddress = base58'3P44yqcpfhPF2iC1nptm2ZJCTaN7VYhz9og' | |
17 | 20 | ||
18 | 21 | let eggsNeeded = (3 * 100000000) | |
19 | 22 | ||
20 | 23 | let artefactsLimit = (301 + 600) | |
21 | 24 | ||
22 | 25 | let freeGenes = ["A", "B", "C", "D", "E"] | |
23 | 26 | ||
24 | 27 | let oldArtefacts = ["ART-LAKE", "ART-HOUSE", "ART-BIGHOUSE", "ART-FIXGENE", "ART-FREEGENE", "ART-MIRROR", "ART-POMP", "ART-CAPE", "ART-HAT", "ART-CUSTOMDUCK"] | |
25 | 28 | ||
26 | 29 | let artefacts = ["ART-XMISTL", "ART-XHAT", "ART-XSCARF", "ART-XSWEATER", "ART-XSOCK", "ART-XTREE"] | |
27 | 30 | ||
28 | 31 | let stakeableWithLock = ["ART-LAKE", "ART-XTREE"] | |
29 | 32 | ||
30 | 33 | let stakeableWithoutLock = ["ART-XMISTL"] | |
31 | 34 | ||
32 | 35 | let allStakeable = (stakeableWithoutLock ++ stakeableWithLock) | |
33 | 36 | ||
34 | 37 | let allArtefact = (artefacts ++ oldArtefacts) | |
35 | 38 | ||
36 | 39 | func tryGetString (key) = match getString(this, key) { | |
37 | 40 | case a: String => | |
38 | 41 | a | |
39 | 42 | case _ => | |
40 | 43 | "" | |
41 | 44 | } | |
42 | 45 | ||
43 | 46 | ||
44 | 47 | func tryGetInteger (key) = match getInteger(this, key) { | |
45 | 48 | case a: Int => | |
46 | 49 | a | |
47 | 50 | case _ => | |
48 | 51 | 0 | |
49 | 52 | } | |
50 | 53 | ||
51 | 54 | ||
52 | 55 | func getRandomNumber (variants,txId,finishHeight,offset) = { | |
53 | 56 | let randomSeedBlock = value(blockInfoByHeight((finishHeight - 1))) | |
54 | 57 | let randomHash = sha256(((base58'items' + txId) + value(randomSeedBlock.vrf))) | |
55 | 58 | (toInt(randomHash, offset) % variants) | |
56 | 59 | } | |
57 | 60 | ||
58 | 61 | ||
59 | 62 | func getRandomArtefact (boxId,h) = { | |
60 | 63 | let randomNumber = getRandomNumber(6, boxId, h, 1) | |
61 | 64 | artefacts[randomNumber] | |
62 | 65 | } | |
63 | 66 | ||
64 | 67 | ||
65 | 68 | func getRandomGenes (txId,h) = { | |
66 | 69 | let randomNumber = getRandomNumber(6, txId, h, 2) | |
67 | 70 | freeGenes[randomNumber] | |
68 | 71 | } | |
69 | 72 | ||
70 | 73 | ||
71 | - | func checkArtefactDetails (assetId) = { | |
72 | - | let asset = value(assetInfo(assetId)) | |
73 | - | let assetName = value(asset.name) | |
74 | - | if (if (containsElement(allArtefact, assetName)) | |
75 | - | then (asset.issuer == this) | |
76 | - | else false) | |
77 | - | then assetName | |
78 | - | else throw("Invalid artefact") | |
79 | - | } | |
80 | - | ||
81 | - | ||
82 | 74 | func tryGetStringExternal (address,key) = match getString(address, key) { | |
83 | 75 | case a: String => | |
84 | 76 | a | |
85 | 77 | case _ => | |
86 | 78 | "" | |
87 | 79 | } | |
88 | 80 | ||
89 | 81 | ||
90 | 82 | func getOracle () = Address(fromBase58String(tryGetString("static_oracleAddress"))) | |
91 | 83 | ||
92 | 84 | ||
93 | 85 | func getBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_breederAddress"))) | |
94 | 86 | ||
95 | 87 | ||
96 | 88 | func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), "static_eggAssetId")) | |
89 | + | ||
90 | + | ||
91 | + | func getTrustedContracts () = tryGetStringExternal(getOracle(), "static_trustedContracts") | |
97 | 92 | ||
98 | 93 | ||
99 | 94 | func asString (value) = match value { | |
100 | 95 | case string: String => | |
101 | 96 | string | |
102 | 97 | case _ => | |
103 | 98 | throw("wrong type, expected: String") | |
104 | 99 | } | |
105 | 100 | ||
106 | 101 | ||
107 | 102 | func asInt (value) = match value { | |
108 | 103 | case int: Int => | |
109 | 104 | int | |
110 | 105 | case _ => | |
111 | 106 | throw("wrong type, expected: Int") | |
112 | 107 | } | |
113 | 108 | ||
114 | 109 | ||
115 | 110 | func manipulateName (assetName,position,char) = ((take(assetName, (position - 1)) + char) + takeRight(assetName, (16 - position))) | |
116 | 111 | ||
117 | 112 | ||
118 | 113 | func itemIsInCoolDown (artefactName,artefactId) = { | |
119 | 114 | let unstakeHeightLast = tryGetInteger(keyUnstakeHeight(artefactName, artefactId)) | |
120 | 115 | let cooldownPeriod = 240 | |
121 | 116 | if ((height > (unstakeHeightLast + cooldownPeriod))) | |
122 | 117 | then false | |
123 | 118 | else true | |
124 | 119 | } | |
125 | 120 | ||
126 | 121 | ||
127 | 122 | @Callable(i) | |
123 | + | func manipulateBoost (boost,duckId) = { | |
124 | + | let allowedContracts = getTrustedContracts() | |
125 | + | let allowedContractsList = split(allowedContracts, ";") | |
126 | + | let dappToCall = toString(i.caller) | |
127 | + | if ((indexOf(allowedContractsList, dappToCall) == unit)) | |
128 | + | then throw("This smart contract can't manipulate the boost!") | |
129 | + | else { | |
130 | + | let key = keyExternalBoostDuck(duckId) | |
131 | + | let activeBoost = tryGetInteger(key) | |
132 | + | let newBoost = (activeBoost + boost) | |
133 | + | if ((0 > newBoost)) | |
134 | + | then throw("Something went wrong with boost, please contact the admins!") | |
135 | + | else [IntegerEntry(key, newBoost)] | |
136 | + | } | |
137 | + | } | |
138 | + | ||
139 | + | ||
140 | + | ||
141 | + | @Callable(i) | |
142 | + | func checkArtefactDetails (assetId) = { | |
143 | + | let asset = value(assetInfo(fromBase58String(assetId))) | |
144 | + | let assetName = value(asset.name) | |
145 | + | if (if (containsElement(allArtefact, assetName)) | |
146 | + | then (asset.issuer == this) | |
147 | + | else false) | |
148 | + | then $Tuple2(nil, assetName) | |
149 | + | else throw("Invalid artefact") | |
150 | + | } | |
151 | + | ||
152 | + | ||
153 | + | ||
154 | + | @Callable(i) | |
128 | 155 | func configureOracle (oracle) = if ((i.caller != this)) | |
129 | 156 | then throw("admin only") | |
130 | 157 | else [StringEntry("static_oracleAddress", oracle)] | |
131 | 158 | ||
132 | 159 | ||
133 | 160 | ||
134 | 161 | @Callable(i) | |
135 | 162 | func calculateFarmingPowerBoost (duckId,address) = { | |
136 | 163 | let lakeBoost = if ((tryGetString(keyArtefactOwner("ART-LAKE", address)) != "")) | |
137 | 164 | then 2 | |
138 | 165 | else 0 | |
139 | 166 | let xmasTreeBoost = if ((tryGetString(keyArtefactOwner("ART-XTREE", address)) != "")) | |
140 | 167 | then 3 | |
141 | 168 | else 0 | |
142 | 169 | let scarfBoost = if ((tryGetString(keyArtefactDuck("ART-XSCARF", duckId)) != "")) | |
143 | 170 | then 69 | |
144 | 171 | else 0 | |
145 | - | let totalBoost = ((lakeBoost + xmasTreeBoost) + scarfBoost) | |
172 | + | let externalBoost = tryGetInteger(keyExternalBoostDuck(duckId)) | |
173 | + | let totalBoost = (((lakeBoost + xmasTreeBoost) + scarfBoost) + externalBoost) | |
146 | 174 | $Tuple2([IntegerEntry((duckId + "_last_boost"), totalBoost)], totalBoost) | |
147 | 175 | } | |
148 | 176 | ||
149 | 177 | ||
150 | 178 | ||
151 | 179 | @Callable(i) | |
152 | 180 | func fixedGene (txIdStr,parentFixedGene,positionFixedGene) = { | |
153 | 181 | let firstPayment = value(i.payments[0]) | |
154 | 182 | let firstAssetId = toBase58String(value(firstPayment.assetId)) | |
155 | 183 | if ((firstPayment.amount != 1)) | |
156 | 184 | then throw("NFT is not attached") | |
157 | 185 | else { | |
158 | - | let artefact = checkArtefactDetails(value(firstPayment.assetId)) | |
159 | - | if ((artefact != "ART-FIXGENE")) | |
160 | - | then throw("You need to attach a ART-FIXGENE artefact") | |
161 | - | else { | |
162 | - | let txId = fromBase58String(txIdStr) | |
163 | - | let finishHeightKey = getProcessFinishHeightKey(toString(i.caller), txId) | |
164 | - | let processFinishHeight = getIntegerValue(getBreederAddress(), finishHeightKey) | |
165 | - | let duckGenesString = asString(invoke(getBreederAddress(), "generateDuck", [txIdStr, processFinishHeight, parentFixedGene, positionFixedGene, "", 0], nil)) | |
166 | - | if ((duckGenesString == duckGenesString)) | |
167 | - | then { | |
168 | - | let call = invoke(getBreederAddress(), "finishDuckHatchingItems", [txIdStr, duckGenesString], nil) | |
169 | - | if ((call == call)) | |
170 | - | then [Burn(value(firstPayment.assetId), 1)] | |
171 | - | else throw("Strict value is not equal to itself.") | |
172 | - | } | |
173 | - | else throw("Strict value is not equal to itself.") | |
174 | - | } | |
186 | + | let artefact = asString(invoke(this, "checkArtefactDetails", [firstAssetId], nil)) | |
187 | + | if ((artefact == artefact)) | |
188 | + | then if ((artefact != "ART-FIXGENE")) | |
189 | + | then throw("You need to attach a ART-FIXGENE artefact") | |
190 | + | else { | |
191 | + | let txId = fromBase58String(txIdStr) | |
192 | + | let finishHeightKey = getProcessFinishHeightKey(toString(i.caller), txId) | |
193 | + | let processFinishHeight = getIntegerValue(getBreederAddress(), finishHeightKey) | |
194 | + | let duckGenesString = asString(invoke(getBreederAddress(), "generateDuck", [txIdStr, processFinishHeight, parentFixedGene, positionFixedGene, "", 0], nil)) | |
195 | + | if ((duckGenesString == duckGenesString)) | |
196 | + | then { | |
197 | + | let call = invoke(getBreederAddress(), "finishDuckHatchingItems", [txIdStr, duckGenesString], nil) | |
198 | + | if ((call == call)) | |
199 | + | then [Burn(value(firstPayment.assetId), 1)] | |
200 | + | else throw("Strict value is not equal to itself.") | |
201 | + | } | |
202 | + | else throw("Strict value is not equal to itself.") | |
203 | + | } | |
204 | + | else throw("Strict value is not equal to itself.") | |
175 | 205 | } | |
176 | 206 | } | |
177 | 207 | ||
178 | 208 | ||
179 | 209 | ||
180 | 210 | @Callable(i) | |
181 | 211 | func freeGene (txIdStr) = { | |
182 | 212 | let firstPayment = value(i.payments[0]) | |
183 | 213 | let firstAssetId = toBase58String(value(firstPayment.assetId)) | |
184 | 214 | if ((firstPayment.amount != 1)) | |
185 | 215 | then throw("NFT is not attached") | |
186 | 216 | else { | |
187 | - | let artefact = checkArtefactDetails(value(firstPayment.assetId)) | |
188 | - | if ((artefact != "ART-FREEGENE")) | |
189 | - | then throw("You need to attach a ART-FREEGENE artefact") | |
190 | - | else { | |
191 | - | let txId = fromBase58String(txIdStr) | |
192 | - | let finishHeightKey = getProcessFinishHeightKey(toString(i.caller), txId) | |
193 | - | let processFinishHeight = getIntegerValue(getBreederAddress(), finishHeightKey) | |
194 | - | let selectedGene = getRandomGenes(txId, processFinishHeight) | |
195 | - | let randomPosition = getRandomNumber(7, txId, processFinishHeight, 3) | |
196 | - | let duckGenesString = asString(invoke(getBreederAddress(), "generateDuck", [txIdStr, processFinishHeight, 0, 0, selectedGene, randomPosition], nil)) | |
197 | - | if ((duckGenesString == duckGenesString)) | |
198 | - | then { | |
199 | - | let call = invoke(getBreederAddress(), "finishDuckHatchingItems", [txIdStr, duckGenesString], nil) | |
200 | - | if ((call == call)) | |
201 | - | then [Burn(value(firstPayment.assetId), 1)] | |
202 | - | else throw("Strict value is not equal to itself.") | |
203 | - | } | |
204 | - | else throw("Strict value is not equal to itself.") | |
205 | - | } | |
217 | + | let artefact = asString(invoke(this, "checkArtefactDetails", [firstAssetId], nil)) | |
218 | + | if ((artefact == artefact)) | |
219 | + | then if ((artefact != "ART-FREEGENE")) | |
220 | + | then throw("You need to attach a ART-FREEGENE artefact") | |
221 | + | else { | |
222 | + | let txId = fromBase58String(txIdStr) | |
223 | + | let finishHeightKey = getProcessFinishHeightKey(toString(i.caller), txId) | |
224 | + | let processFinishHeight = getIntegerValue(getBreederAddress(), finishHeightKey) | |
225 | + | let selectedGene = getRandomGenes(txId, processFinishHeight) | |
226 | + | let randomPosition = getRandomNumber(7, txId, processFinishHeight, 3) | |
227 | + | let duckGenesString = asString(invoke(getBreederAddress(), "generateDuck", [txIdStr, processFinishHeight, 0, 0, selectedGene, randomPosition], nil)) | |
228 | + | if ((duckGenesString == duckGenesString)) | |
229 | + | then { | |
230 | + | let call = invoke(getBreederAddress(), "finishDuckHatchingItems", [txIdStr, duckGenesString], nil) | |
231 | + | if ((call == call)) | |
232 | + | then [Burn(value(firstPayment.assetId), 1)] | |
233 | + | else throw("Strict value is not equal to itself.") | |
234 | + | } | |
235 | + | else throw("Strict value is not equal to itself.") | |
236 | + | } | |
237 | + | else throw("Strict value is not equal to itself.") | |
206 | 238 | } | |
207 | 239 | } | |
208 | 240 | ||
209 | 241 | ||
210 | 242 | ||
211 | 243 | @Callable(i) | |
212 | 244 | func copyDuck () = { | |
213 | 245 | let firstPayment = value(i.payments[0]) | |
214 | 246 | let secondPayment = value(i.payments[1]) | |
215 | 247 | let firstAssetId = toBase58String(value(firstPayment.assetId)) | |
216 | 248 | let children = asInt(invoke(getBreederAddress(), "validateAndGetChildren", [firstAssetId], nil)) | |
217 | 249 | if ((children == children)) | |
218 | 250 | then if (if ((firstPayment.amount != 1)) | |
219 | 251 | then true | |
220 | 252 | else (secondPayment.amount != 1)) | |
221 | 253 | then throw("NFT is not attached") | |
222 | 254 | else { | |
223 | - | let artefact = checkArtefactDetails(value(secondPayment.assetId)) | |
224 | - | if ((artefact != "ART-MIRROR")) | |
225 | - | then throw("You need to attach a ART-MIRROR artefact") | |
226 | - | else { | |
227 | - | let nftInfo = value(assetInfo(value(firstPayment.assetId))) | |
228 | - | let asset1Gen = split(nftInfo.name, "") | |
229 | - | if (if ((asset1Gen[14] == "G")) | |
230 | - | then true | |
231 | - | else (asset1Gen[14] == "J")) | |
232 | - | then throw("You can't mirror this duck") | |
233 | - | else { | |
234 | - | let duckGen = nftInfo.name | |
235 | - | let call = invoke(getBreederAddress(), "createDuckSpecialGenes", [i.caller.bytes, duckGen, children], nil) | |
236 | - | if ((call == call)) | |
237 | - | then [ScriptTransfer(i.caller, 1, firstPayment.assetId), Burn(value(secondPayment.assetId), 1)] | |
238 | - | else throw("Strict value is not equal to itself.") | |
239 | - | } | |
240 | - | } | |
255 | + | let artefact = asString(invoke(this, "checkArtefactDetails", [toBase58String(value(secondPayment.assetId))], nil)) | |
256 | + | if ((artefact == artefact)) | |
257 | + | then if ((artefact != "ART-MIRROR")) | |
258 | + | then throw("You need to attach a ART-MIRROR artefact") | |
259 | + | else { | |
260 | + | let nftInfo = value(assetInfo(value(firstPayment.assetId))) | |
261 | + | let asset1Gen = split(nftInfo.name, "") | |
262 | + | if (if ((asset1Gen[14] == "G")) | |
263 | + | then true | |
264 | + | else (asset1Gen[14] == "J")) | |
265 | + | then throw("You can't mirror this duck") | |
266 | + | else { | |
267 | + | let duckGen = nftInfo.name | |
268 | + | let call = invoke(getBreederAddress(), "createDuckSpecialGenes", [i.caller.bytes, duckGen, children], nil) | |
269 | + | if ((call == call)) | |
270 | + | then [ScriptTransfer(i.caller, 1, firstPayment.assetId), Burn(value(secondPayment.assetId), 1)] | |
271 | + | else throw("Strict value is not equal to itself.") | |
272 | + | } | |
273 | + | } | |
274 | + | else throw("Strict value is not equal to itself.") | |
241 | 275 | } | |
242 | 276 | else throw("Strict value is not equal to itself.") | |
243 | 277 | } | |
244 | 278 | ||
245 | 279 | ||
246 | 280 | ||
247 | 281 | @Callable(i) | |
248 | 282 | func wearItemToDuck () = { | |
249 | 283 | let firstPayment = value(i.payments[0]) | |
250 | 284 | let secondPayment = value(i.payments[1]) | |
251 | 285 | let duckId = toBase58String(value(firstPayment.assetId)) | |
252 | 286 | let secondAssetId = toBase58String(value(secondPayment.assetId)) | |
253 | 287 | if (if ((firstPayment.amount != 1)) | |
254 | 288 | then true | |
255 | 289 | else (secondPayment.amount != 1)) | |
256 | 290 | then throw("NFT is not attached") | |
257 | 291 | else { | |
258 | 292 | let children = asInt(invoke(getBreederAddress(), "validateAndGetChildren", [duckId], nil)) | |
259 | 293 | if ((children == children)) | |
260 | 294 | then { | |
261 | - | let artefactName = checkArtefactDetails(value(secondPayment.assetId)) | |
262 | - | if ((artefactName != "ART-XSCARF")) | |
263 | - | then throw("You need to attach a ART-XSCARF artefact") | |
264 | - | else { | |
265 | - | let artefactId = tryGetString(keyArtefactDuck(artefactName, duckId)) | |
266 | - | if ((artefactId == "")) | |
267 | - | then [StringEntry(keyArtefactDuck(artefactName, duckId), secondAssetId), ScriptTransfer(i.caller, 1, firstPayment.assetId)] | |
268 | - | else throw(("Duck is already wearing a " + artefactName)) | |
269 | - | } | |
295 | + | let artefactName = asString(invoke(this, "checkArtefactDetails", [secondAssetId], nil)) | |
296 | + | if ((artefactName == artefactName)) | |
297 | + | then if ((artefactName != "ART-XSCARF")) | |
298 | + | then throw("You need to attach a ART-XSCARF artefact") | |
299 | + | else { | |
300 | + | let artefactId = tryGetString(keyArtefactDuck(artefactName, duckId)) | |
301 | + | if ((artefactId == "")) | |
302 | + | then [StringEntry(keyArtefactDuck(artefactName, duckId), secondAssetId), ScriptTransfer(i.caller, 1, firstPayment.assetId)] | |
303 | + | else throw(("Duck is already wearing a " + artefactName)) | |
304 | + | } | |
305 | + | else throw("Strict value is not equal to itself.") | |
270 | 306 | } | |
271 | 307 | else throw("Strict value is not equal to itself.") | |
272 | 308 | } | |
273 | 309 | } | |
274 | 310 | ||
275 | 311 | ||
276 | 312 | ||
277 | 313 | @Callable(i) | |
278 | 314 | func addArteFactToDuck () = { | |
279 | 315 | let firstPayment = value(i.payments[0]) | |
280 | 316 | let secondPayment = value(i.payments[1]) | |
281 | 317 | let firstAssetId = toBase58String(value(firstPayment.assetId)) | |
282 | 318 | if (if ((firstPayment.amount != 1)) | |
283 | 319 | then true | |
284 | 320 | else (secondPayment.amount != 1)) | |
285 | 321 | then throw("NFT is not attached") | |
286 | 322 | else { | |
287 | 323 | let children = asInt(invoke(getBreederAddress(), "validateAndGetChildren", [firstAssetId], nil)) | |
288 | 324 | if ((children == children)) | |
289 | 325 | then if ((children == 0)) | |
290 | 326 | then throw("You can only pick a sterile NFT-duck") | |
291 | 327 | else { | |
292 | - | let artefact = checkArtefactDetails(value(secondPayment.assetId)) | |
293 | - | if (if ((artefact != "ART-XHAT")) | |
294 | - | then (artefact != "ART-POMP") | |
295 | - | else false) | |
296 | - | then throw("You need to attach a ART-XHAT or ART-POMP artefact") | |
297 | - | else { | |
298 | - | let nftInfo = value(assetInfo(value(firstPayment.assetId))) | |
299 | - | let asset1Gen = split(nftInfo.name, "") | |
300 | - | if (if ((asset1Gen[14] == "G")) | |
301 | - | then true | |
302 | - | else (asset1Gen[14] == "J")) | |
303 | - | then throw("You can't mirror this duck") | |
304 | - | else if (if ((asset1Gen[5] == "S")) | |
328 | + | let artefact = asString(invoke(this, "checkArtefactDetails", [toBase58String(value(secondPayment.assetId))], nil)) | |
329 | + | if ((artefact == artefact)) | |
330 | + | then if (if ((artefact != "ART-XHAT")) | |
331 | + | then (artefact != "ART-POMP") | |
332 | + | else false) | |
333 | + | then throw("You need to attach a ART-XHAT or ART-POMP artefact") | |
334 | + | else { | |
335 | + | let nftInfo = value(assetInfo(value(firstPayment.assetId))) | |
336 | + | let asset1Gen = split(nftInfo.name, "") | |
337 | + | if (if ((asset1Gen[14] == "G")) | |
305 | 338 | then true | |
306 | - | else (asset1Gen[5] == "T")) | |
307 | - | then throw("you already attached a artefact") | |
308 | - | else { | |
309 | - | let char = if ((artefact == "ART-XHAT")) | |
310 | - | then "T" | |
311 | - | else if ((artefact == "ART-POMP")) | |
312 | - | then "S" | |
313 | - | else throw("No char defined") | |
314 | - | let oldDuckGen = nftInfo.name | |
315 | - | let oldFarmGen = asString(invoke(getBreederAddress(), "getGenFromName", [oldDuckGen], nil)) | |
316 | - | if ((oldFarmGen == oldFarmGen)) | |
317 | - | then { | |
318 | - | let duckGen = manipulateName(oldDuckGen, 6, char) | |
319 | - | let call = invoke(getBreederAddress(), "createDuckSpecialGenes", [i.caller.bytes, duckGen, children], nil) | |
320 | - | if ((call == call)) | |
321 | - | then { | |
322 | - | let callReduce = invoke(getBreederAddress(), "reduceRarity", [firstAssetId, oldFarmGen], nil) | |
323 | - | if ((callReduce == callReduce)) | |
324 | - | then [Burn(value(firstPayment.assetId), 1), Burn(value(secondPayment.assetId), 1)] | |
325 | - | else throw("Strict value is not equal to itself.") | |
326 | - | } | |
327 | - | else throw("Strict value is not equal to itself.") | |
328 | - | } | |
329 | - | else throw("Strict value is not equal to itself.") | |
330 | - | } | |
331 | - | } | |
339 | + | else (asset1Gen[14] == "J")) | |
340 | + | then throw("You can't mirror this duck") | |
341 | + | else if (if ((asset1Gen[5] == "S")) | |
342 | + | then true | |
343 | + | else (asset1Gen[5] == "T")) | |
344 | + | then throw("you already attached a artefact") | |
345 | + | else { | |
346 | + | let char = if ((artefact == "ART-XHAT")) | |
347 | + | then "T" | |
348 | + | else if ((artefact == "ART-POMP")) | |
349 | + | then "S" | |
350 | + | else throw("No char defined") | |
351 | + | let oldDuckGen = nftInfo.name | |
352 | + | let oldFarmGen = asString(invoke(getBreederAddress(), "getGenFromName", [oldDuckGen], nil)) | |
353 | + | if ((oldFarmGen == oldFarmGen)) | |
354 | + | then { | |
355 | + | let duckGen = manipulateName(oldDuckGen, 6, char) | |
356 | + | let call = invoke(getBreederAddress(), "createDuckSpecialGenes", [i.caller.bytes, duckGen, children], nil) | |
357 | + | if ((call == call)) | |
358 | + | then { | |
359 | + | let callReduce = invoke(getBreederAddress(), "reduceRarity", [firstAssetId, oldFarmGen], nil) | |
360 | + | if ((callReduce == callReduce)) | |
361 | + | then [Burn(value(firstPayment.assetId), 1), Burn(value(secondPayment.assetId), 1)] | |
362 | + | else throw("Strict value is not equal to itself.") | |
363 | + | } | |
364 | + | else throw("Strict value is not equal to itself.") | |
365 | + | } | |
366 | + | else throw("Strict value is not equal to itself.") | |
367 | + | } | |
368 | + | } | |
369 | + | else throw("Strict value is not equal to itself.") | |
332 | 370 | } | |
333 | 371 | else throw("Strict value is not equal to itself.") | |
334 | 372 | } | |
335 | 373 | } | |
336 | 374 | ||
337 | 375 | ||
338 | 376 | ||
339 | 377 | @Callable(i) | |
340 | 378 | func stakeItem () = if (if ((size(i.payments) == 1)) | |
341 | 379 | then (i.payments[0].amount == 1) | |
342 | 380 | else false) | |
343 | 381 | then { | |
344 | 382 | let assetId = value(i.payments[0].assetId) | |
345 | - | let artefactName = checkArtefactDetails(assetId) | |
346 | - | if (containsElement(allStakeable, artefactName)) | |
347 | - | then if (if (containsElement(stakeableWithLock, artefactName)) | |
348 | - | then itemIsInCoolDown(artefactName, toBase58String(assetId)) | |
349 | - | else false) | |
350 | - | then throw("Item can't be staked yet, it's in cooldown") | |
351 | - | else { | |
352 | - | let invoker = toString(i.caller) | |
353 | - | let artefactId = tryGetString(keyArtefactOwner(artefactName, invoker)) | |
354 | - | if ((artefactId == "")) | |
355 | - | then [StringEntry(keyArtefactOwner(artefactName, invoker), toBase58String(assetId))] | |
356 | - | else throw(("You are already staking " + artefactName)) | |
357 | - | } | |
358 | - | else throw("You can't stake this artafect") | |
383 | + | let artefactName = asString(invoke(this, "checkArtefactDetails", [toBase58String(assetId)], nil)) | |
384 | + | if ((artefactName == artefactName)) | |
385 | + | then if (containsElement(allStakeable, artefactName)) | |
386 | + | then if (if (containsElement(stakeableWithLock, artefactName)) | |
387 | + | then itemIsInCoolDown(artefactName, toBase58String(assetId)) | |
388 | + | else false) | |
389 | + | then throw("Item can't be staked yet, it's in cooldown") | |
390 | + | else { | |
391 | + | let invoker = toString(i.caller) | |
392 | + | let artefactId = tryGetString(keyArtefactOwner(artefactName, invoker)) | |
393 | + | if ((artefactId == "")) | |
394 | + | then [StringEntry(keyArtefactOwner(artefactName, invoker), toBase58String(assetId))] | |
395 | + | else throw(("You are already staking " + artefactName)) | |
396 | + | } | |
397 | + | else throw("You can't stake this artafect") | |
398 | + | else throw("Strict value is not equal to itself.") | |
359 | 399 | } | |
360 | 400 | else throw("Invalid payment") | |
361 | 401 | ||
362 | 402 | ||
363 | 403 | ||
364 | 404 | @Callable(i) | |
365 | 405 | func unstakeItem (artefactName) = if (containsElement(allArtefact, artefactName)) | |
366 | 406 | then { | |
367 | 407 | let invoker = toString(i.caller) | |
368 | 408 | let artefactId = tryGetString(keyArtefactOwner(artefactName, invoker)) | |
369 | 409 | if ((artefactId == "")) | |
370 | 410 | then throw(("You didnt stake " + artefactName)) | |
371 | 411 | else [IntegerEntry(keyUnstakeHeight(artefactName, artefactId), height), ScriptTransfer(i.caller, 1, fromBase58String(artefactId)), DeleteEntry(keyArtefactOwner(artefactName, invoker))] | |
372 | 412 | } | |
373 | 413 | else throw("This artefact doesn't exist") | |
374 | 414 | ||
375 | 415 | ||
376 | 416 | ||
377 | 417 | @Callable(i) | |
378 | 418 | 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)] | |
379 | 419 | ||
380 | 420 | ||
381 | 421 | ||
382 | 422 | @Callable(i) | |
383 | 423 | func issueArtefact (type,receiver) = if ((i.caller == this)) | |
384 | 424 | then { | |
385 | 425 | let txIdStr = toBase58String(i.transactionId) | |
386 | 426 | let address = Address(fromBase58String(receiver)) | |
387 | 427 | let artefact = Issue(type, "NFT artefact of Waves Ducks game. Drop #2.", 1, 0, false, unit, 0) | |
388 | 428 | let artefactId = calculateAssetId(artefact) | |
389 | 429 | [artefact, StringEntry((("artefact_" + toBase58String(artefactId)) + "_type"), type), ScriptTransfer(address, 1, artefactId)] | |
390 | 430 | } | |
391 | 431 | else throw("admin only") | |
392 | 432 | ||
393 | 433 | ||
394 | 434 | ||
395 | 435 | @Callable(i) | |
396 | 436 | func setLock (n) = if ((i.caller == this)) | |
397 | 437 | then [IntegerEntry("global_locked", n)] | |
398 | 438 | else throw("admin only") | |
399 | 439 | ||
400 | 440 | ||
401 | 441 | ||
402 | 442 | @Callable(i) | |
403 | 443 | func buyArtefact () = if ((lastBlock.timestamp > 1639742400000)) | |
404 | 444 | then throw("There are no active sales now... ") | |
405 | 445 | else if ((tryGetInteger("global_locked") > 0)) | |
406 | 446 | then throw("contract is temporarily locked") | |
407 | 447 | else if ((tryGetInteger("global_artAmount") >= artefactsLimit)) | |
408 | 448 | then throw("SOLDOUT!!! Hurray!") | |
409 | 449 | else if (if ((1639605600000 > lastBlock.timestamp)) | |
410 | 450 | then (i.caller != Address(devAddress)) | |
411 | 451 | else false) | |
412 | 452 | then throw("Too early...") | |
413 | 453 | else { | |
414 | 454 | let firstPayment = value(i.payments[0]) | |
415 | 455 | if ((firstPayment.assetId != getEggAssetId())) | |
416 | 456 | then throw(("You can attach only EGG tokens with the following asset id: " + toBase58String(getEggAssetId()))) | |
417 | 457 | else if ((eggsNeeded > firstPayment.amount)) | |
418 | 458 | then throw(("To hatch a duck you currently need the following amount of EGGlets: " + toString(eggsNeeded))) | |
419 | 459 | 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))] | |
420 | 460 | } | |
421 | 461 | ||
422 | 462 | ||
423 | 463 | ||
424 | 464 | @Callable(i) | |
425 | 465 | func setGlobalArtAmount (newAmount) = if (if ((i.caller == this)) | |
426 | 466 | then true | |
427 | 467 | else (i.caller == Address(devAddress))) | |
428 | 468 | then [IntegerEntry("global_artAmount", newAmount)] | |
429 | 469 | else throw("Permission denied") | |
430 | 470 | ||
431 | 471 | ||
432 | 472 | ||
433 | 473 | @Callable(i) | |
434 | 474 | func claimArtefact (boxIdStr) = { | |
435 | 475 | let txId = fromBase58String(boxIdStr) | |
436 | 476 | let statusKey = (((toString(i.caller) + "_") + boxIdStr) + "_status") | |
437 | 477 | let heightKey = (((toString(i.caller) + "_") + boxIdStr) + "_finishHeight") | |
438 | 478 | if ((getStringValue(statusKey) != "started")) | |
439 | 479 | then throw("claimed already") | |
440 | 480 | else if ((getIntegerValue(heightKey) > height)) | |
441 | 481 | then throw("you cannot claim yet") | |
442 | 482 | else { | |
443 | 483 | let artType = getRandomArtefact(txId, getIntegerValue(heightKey)) | |
444 | 484 | let asset = Issue(artType, "Artefact of Waves Ducks metaverse.", 1, 0, false, unit, getIntegerValue(heightKey)) | |
445 | 485 | let assetId = calculateAssetId(asset) | |
446 | 486 | [StringEntry(statusKey, artType), StringEntry((((toString(i.caller) + "_") + boxIdStr) + "_artefactId"), toBase58String(assetId)), StringEntry((toBase58String(assetId) + "_type"), artType), asset, ScriptTransfer(i.caller, 1, assetId)] | |
447 | 487 | } | |
448 | 488 | } | |
449 | 489 | ||
450 | 490 | ||
451 | 491 | @Verifier(tx) | |
452 | 492 | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
453 | 493 |
github/deemru/w8io/786bc32 77.29 ms ◑