tx · 4k1b1HJ6iEtczu3xScv6w9m9MyvjuDm4UuTESAmHtA3y 3PHUMZkr66B38WxHV1boULaEjjF7giGgVy7: -0.01000000 Waves 2022.12.12 14:47 [3422555] smart account 3PHUMZkr66B38WxHV1boULaEjjF7giGgVy7 > SELF 0.00000000 Waves
{ "type": 13, "id": "4k1b1HJ6iEtczu3xScv6w9m9MyvjuDm4UuTESAmHtA3y", "fee": 1000000, "feeAssetId": null, "timestamp": 1670845612437, "version": 2, "chainId": 87, "sender": "3PHUMZkr66B38WxHV1boULaEjjF7giGgVy7", "senderPublicKey": "8XKsuJqSe6FsspUz3sPvdADeLpP7e1tfiWx5tt6e674g", "proofs": [ "2RCY6JPqTzFcsrK2eD58BRQytc3TDcaDeLKaDcRd1xw32JpzeWXxtAjMktx7BqafsQnPtNe6HgC9SE15M5pQAXr4" ], "script": "base64:BgILCAISAwoBCBIAEgALAAl3ZWFyYWJsZXMJAMwIAgIIQVJULUNBUEUJAMwIAgIHQVJULUhBVAkAzAgCAgpBUlQtWFNDQVJGCQDMCAICDEFSVC1YU1dFQVRFUgUDbmlsAQ9rZXlBcnRlZmFjdER1Y2sCBmR1Y2tJZAh3ZWFyYWJsZQkArAICCQCsAgIFBmR1Y2tJZAIBXwUId2VhcmFibGUBFHRyeUdldFN0cmluZ0V4dGVybmFsAgdhZGRyZXNzA2tleQQHJG1hdGNoMAkAnQgCBQdhZGRyZXNzBQNrZXkDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFhBQckbWF0Y2gwBQFhAgABDHRyeUdldFN0cmluZwEDa2V5CQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCBQR0aGlzBQNrZXkBBWFzSW50AQV2YWx1ZQQHJG1hdGNoMAUFdmFsdWUDCQABAgUHJG1hdGNoMAIDSW50BANpbnQFByRtYXRjaDAFA2ludAkAAgECGXdyb25nIHR5cGUsIGV4cGVjdGVkOiBJbnQBCGFzU3RyaW5nAQV2YWx1ZQQHJG1hdGNoMAUFdmFsdWUDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAZzdHJpbmcFByRtYXRjaDAFBnN0cmluZwkAAgECHHdyb25nIHR5cGUsIGV4cGVjdGVkOiBTdHJpbmcBCWdldE9yYWNsZQAJAQdBZGRyZXNzAQkA2QQBCQEMdHJ5R2V0U3RyaW5nAQIUc3RhdGljX29yYWNsZUFkZHJlc3MBEWdldEJyZWVkZXJBZGRyZXNzAAkBB0FkZHJlc3MBCQDZBAEJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIJAQlnZXRPcmFjbGUAAhVzdGF0aWNfYnJlZWRlckFkZHJlc3MBD2dldEl0ZW1zQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAITc3RhdGljX2l0ZW1zQWRkcmVzcwESdHJ5R2V0Q29zbWV0aWNJdGVtAQRpdGVtBANrZXkJAKwCAgIQZGlyZWN0X2Nvc21ldGljXwUEaXRlbQQHJG1hdGNoMAkAmggCCQEPZ2V0SXRlbXNBZGRyZXNzAAUDa2V5AwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQUEdW5pdAEId2Vhckl0ZW0CD2Fzc2V0SWRXZWFyQWJsZQZkdWNrSWQEDGFydGVmYWN0TmFtZQkBCGFzU3RyaW5nAQkA/AcECQEPZ2V0SXRlbXNBZGRyZXNzAAIUY2hlY2tBcnRlZmFjdERldGFpbHMJAMwIAgUPYXNzZXRJZFdlYXJBYmxlBQNuaWwFA25pbAMJAAACBQxhcnRlZmFjdE5hbWUFDGFydGVmYWN0TmFtZQMDCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCBQl3ZWFyYWJsZXMFDGFydGVmYWN0TmFtZQkBASEBCQEJaXNEZWZpbmVkAQkBEnRyeUdldENvc21ldGljSXRlbQEFDGFydGVmYWN0TmFtZQcJAAIBAhtXUklURDogVW5zdXBwb3J0ZWQgd2VhcmFibGUECmFydGVmYWN0SWQJAQx0cnlHZXRTdHJpbmcBCQEPa2V5QXJ0ZWZhY3REdWNrAgUGZHVja0lkBQxhcnRlZmFjdE5hbWUECWJvb3N0RHVjawMJAAACBQxhcnRlZmFjdE5hbWUCCkFSVC1YU0NBUkYJAPwHBAkBD2dldEl0ZW1zQWRkcmVzcwACD21hbmlwdWxhdGVCb29zdAkAzAgCAEUJAMwIAgUGZHVja0lkBQNuaWwFA25pbAUDbmlsAwkAAAIFCWJvb3N0RHVjawUJYm9vc3REdWNrAwkBAiE9AgUKYXJ0ZWZhY3RJZAIACQACAQkArAICAhpEdWNrIGlzIGFscmVhZHkgd2VhcmluZyBhIAUMYXJ0ZWZhY3ROYW1lCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ9rZXlBcnRlZmFjdER1Y2sCBQZkdWNrSWQFDGFydGVmYWN0TmFtZQUPYXNzZXRJZFdlYXJBYmxlBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DAWkBD2NvbmZpZ3VyZU9yYWNsZQEGb3JhY2xlAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIKYWRtaW4gb25seQkAzAgCCQELU3RyaW5nRW50cnkCAhRzdGF0aWNfb3JhY2xlQWRkcmVzcwUGb3JhY2xlBQNuaWwBaQEOd2Vhckl0ZW1Ub0R1Y2sABAxmaXJzdFBheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQNc2Vjb25kUGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwABBAZkdWNrSWQJANgEAQkBBXZhbHVlAQgFDGZpcnN0UGF5bWVudAdhc3NldElkBA1zZWNvbmRBc3NldElkCQDYBAEJAQV2YWx1ZQEIBQ1zZWNvbmRQYXltZW50B2Fzc2V0SWQDAwkBAiE9AggFDGZpcnN0UGF5bWVudAZhbW91bnQAAQYJAQIhPQIIBQ1zZWNvbmRQYXltZW50BmFtb3VudAABCQACAQIaV1JJVEQ6IE5GVCBpcyBub3QgYXR0YWNoZWQECGNoaWxkcmVuCQEFYXNJbnQBCQD8BwQJARFnZXRCcmVlZGVyQWRkcmVzcwACFnZhbGlkYXRlQW5kR2V0Q2hpbGRyZW4JAMwIAgUGZHVja0lkBQNuaWwFA25pbAMJAAACBQhjaGlsZHJlbgUIY2hpbGRyZW4JAM4IAgkBCHdlYXJJdGVtAgUNc2Vjb25kQXNzZXRJZAUGZHVja0lkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgABCAUMZmlyc3RQYXltZW50B2Fzc2V0SWQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARB3ZWFyWEl0ZW1zVG9EdWNrAAMJAGYCAAIJAJADAQgFAWkIcGF5bWVudHMJAAIBAjFXV1hJVEQ6IFBsZWFzZSBhdHRhY2ggYXQgbGVhc3QgMSBpdGVtIGFuZCAxIGR1Y2shAwkAZgIJAJADAQgFAWkIcGF5bWVudHMABgkAAgECMVdXWElURDogWW91IGNhbiBvbmx5IGF0dGFjaCA1IGl0ZW1zIGFuZCBvbmUgZHVjayEKAQpoYW5kbGVJdGVtAgNhY2MHcGF5bWVudAQFaW5kZXgJAM8IAggFAWkIcGF5bWVudHMFB3BheW1lbnQDCQAAAgUFaW5kZXgAAAQGZHVja0lkCQDYBAEJAQV2YWx1ZQEIBQdwYXltZW50B2Fzc2V0SWQDCQECIT0CCAUHcGF5bWVudAZhbW91bnQAAQkAAgECG1dSSVREOiBEdWNrIGlzIG5vdCBhdHRhY2hlZAQIY2hpbGRyZW4JAQVhc0ludAEJAPwHBAkBEWdldEJyZWVkZXJBZGRyZXNzAAIWdmFsaWRhdGVBbmRHZXRDaGlsZHJlbgkAzAgCBQZkdWNrSWQFA25pbAUDbmlsAwkAAAIFCGNoaWxkcmVuBQhjaGlsZHJlbgkAzggCBQNhY2MJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyAAEIBQdwYXltZW50B2Fzc2V0SWQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAzggCBQNhY2MJAQh3ZWFySXRlbQIJANgEAQkBBXZhbHVlAQgFB3BheW1lbnQHYXNzZXRJZAkA2AQBCQEFdmFsdWUBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQKAAIkbAgFAWkIcGF5bWVudHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCmhhbmRsZUl0ZW0CBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYAdg0PAA==", "height": 3422555, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: ERWW69jcaUNF2UhkgWDJAbcmFGnsG2siJ9GZooqEuk4q Next: 7pNQgskosDBQCVT36U5xcTwfksTZZwa2J6wJdVqQzHRD Diff:
Old | New | Differences | |
---|---|---|---|
1 | - | {-# STDLIB_VERSION | |
1 | + | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | - | ||
4 | + | let wearables = ["ART-CAPE", "ART-HAT", "ART-XSCARF", "ART-XSWEATER"] | |
5 | 5 | ||
6 | - | ||
7 | - | func keyArtefactOwner (artefactName,owner) = (((artefactName + "_") + owner) + "_owner") | |
8 | - | ||
9 | - | ||
10 | - | func keyFeedLimit (owner) = ("limit_" + owner) | |
11 | - | ||
12 | - | ||
13 | - | let stakeable = ["ART-LAKE", "ART-XTREE", "ART-XSOCK", "ART-XMISTL"] | |
14 | - | ||
15 | - | func tryGetString (key) = match getString(this, key) { | |
16 | - | case a: String => | |
17 | - | a | |
18 | - | case _ => | |
19 | - | "" | |
20 | - | } | |
21 | - | ||
22 | - | ||
23 | - | func tryGetInteger (key) = match getInteger(this, key) { | |
24 | - | case a: Int => | |
25 | - | a | |
26 | - | case _ => | |
27 | - | 0 | |
28 | - | } | |
6 | + | func keyArtefactDuck (duckId,wearable) = ((duckId + "_") + wearable) | |
29 | 7 | ||
30 | 8 | ||
31 | 9 | func tryGetStringExternal (address,key) = match getString(address, key) { | |
36 | 14 | } | |
37 | 15 | ||
38 | 16 | ||
39 | - | func | |
17 | + | func tryGetString (key) = tryGetStringExternal(this, key) | |
40 | 18 | ||
41 | 19 | ||
42 | - | func getItemsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_itemsAddress"))) | |
20 | + | func asInt (value) = match value { | |
21 | + | case int: Int => | |
22 | + | int | |
23 | + | case _ => | |
24 | + | throw("wrong type, expected: Int") | |
25 | + | } | |
43 | 26 | ||
44 | 27 | ||
45 | 28 | func asString (value) = match value { | |
50 | 33 | } | |
51 | 34 | ||
52 | 35 | ||
53 | - | func asInt (value) = match value { | |
54 | - | case int: Int => | |
55 | - | int | |
56 | - | case _ => | |
57 | - | throw("wrong type, expected: Int") | |
58 | - | } | |
36 | + | func getOracle () = Address(fromBase58String(tryGetString("static_oracleAddress"))) | |
59 | 37 | ||
60 | 38 | ||
61 | - | func itemIsInCoolDown (artefactName,artefactId) = { | |
62 | - | let unstakeHeightLast = tryGetInteger(keyUnstakeHeight(artefactName, artefactId)) | |
63 | - | let cooldownPeriod = 240 | |
64 | - | if ((height > (unstakeHeightLast + cooldownPeriod))) | |
65 | - | then false | |
66 | - | else true | |
39 | + | func getBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_breederAddress"))) | |
40 | + | ||
41 | + | ||
42 | + | func getItemsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_itemsAddress"))) | |
43 | + | ||
44 | + | ||
45 | + | func tryGetCosmeticItem (item) = { | |
46 | + | let key = ("direct_cosmetic_" + item) | |
47 | + | match getInteger(getItemsAddress(), key) { | |
48 | + | case a: Int => | |
49 | + | a | |
50 | + | case _ => | |
51 | + | unit | |
52 | + | } | |
53 | + | } | |
54 | + | ||
55 | + | ||
56 | + | func wearItem (assetIdWearAble,duckId) = { | |
57 | + | let artefactName = asString(invoke(getItemsAddress(), "checkArtefactDetails", [assetIdWearAble], nil)) | |
58 | + | if ((artefactName == artefactName)) | |
59 | + | then if (if (!(containsElement(wearables, artefactName))) | |
60 | + | then !(isDefined(tryGetCosmeticItem(artefactName))) | |
61 | + | else false) | |
62 | + | then throw("WRITD: Unsupported wearable") | |
63 | + | else { | |
64 | + | let artefactId = tryGetString(keyArtefactDuck(duckId, artefactName)) | |
65 | + | let boostDuck = if ((artefactName == "ART-XSCARF")) | |
66 | + | then invoke(getItemsAddress(), "manipulateBoost", [69, duckId], nil) | |
67 | + | else nil | |
68 | + | if ((boostDuck == boostDuck)) | |
69 | + | then if ((artefactId != "")) | |
70 | + | then throw(("Duck is already wearing a " + artefactName)) | |
71 | + | else [StringEntry(keyArtefactDuck(duckId, artefactName), assetIdWearAble)] | |
72 | + | else throw("Strict value is not equal to itself.") | |
73 | + | } | |
74 | + | else throw("Strict value is not equal to itself.") | |
67 | 75 | } | |
68 | 76 | ||
69 | 77 | ||
75 | 83 | ||
76 | 84 | ||
77 | 85 | @Callable(i) | |
78 | - | func stakeItem () = if (!(if ((size(i.payments) == 1)) | |
79 | - | then (i.payments[0].amount == 1) | |
80 | - | else false)) | |
81 | - | then throw("Invalid payment") | |
82 | - | else { | |
83 | - | let assetId = value(i.payments[0].assetId) | |
84 | - | let artefactName = asString(invoke(getItemsAddress(), "checkArtefactDetails", [toBase58String(assetId)], nil)) | |
85 | - | if ((artefactName == artefactName)) | |
86 | - | then if (!(containsElement(stakeable, artefactName))) | |
87 | - | then throw("You can't stake this artafect") | |
88 | - | else if (itemIsInCoolDown(artefactName, toBase58String(assetId))) | |
89 | - | then throw("Item can't be staked yet, it's in cooldown") | |
90 | - | else { | |
91 | - | let invoker = toString(i.caller) | |
92 | - | let artefactId = tryGetString(keyArtefactOwner(artefactName, invoker)) | |
93 | - | if ((artefactId != "")) | |
94 | - | then throw(("You are already staking " + artefactName)) | |
95 | - | else { | |
96 | - | let boostDuck = if ((artefactName == "ART-LAKE")) | |
97 | - | then invoke(getItemsAddress(), "manipulateBoostAccount", [2, invoker], nil) | |
98 | - | else if ((artefactName == "ART-XTREE")) | |
99 | - | then invoke(getItemsAddress(), "manipulateBoostAccount", [3, invoker], nil) | |
100 | - | else nil | |
101 | - | if ((boostDuck == boostDuck)) | |
102 | - | then [StringEntry(keyArtefactOwner(artefactName, invoker), toBase58String(assetId))] | |
103 | - | else throw("Strict value is not equal to itself.") | |
104 | - | } | |
105 | - | } | |
106 | - | else throw("Strict value is not equal to itself.") | |
107 | - | } | |
86 | + | func wearItemToDuck () = { | |
87 | + | let firstPayment = value(i.payments[0]) | |
88 | + | let secondPayment = value(i.payments[1]) | |
89 | + | let duckId = toBase58String(value(firstPayment.assetId)) | |
90 | + | let secondAssetId = toBase58String(value(secondPayment.assetId)) | |
91 | + | if (if ((firstPayment.amount != 1)) | |
92 | + | then true | |
93 | + | else (secondPayment.amount != 1)) | |
94 | + | then throw("WRITD: NFT is not attached") | |
95 | + | else { | |
96 | + | let children = asInt(invoke(getBreederAddress(), "validateAndGetChildren", [duckId], nil)) | |
97 | + | if ((children == children)) | |
98 | + | then (wearItem(secondAssetId, duckId) ++ [ScriptTransfer(i.caller, 1, firstPayment.assetId)]) | |
99 | + | else throw("Strict value is not equal to itself.") | |
100 | + | } | |
101 | + | } | |
108 | 102 | ||
109 | 103 | ||
110 | 104 | ||
111 | 105 | @Callable(i) | |
112 | - | func unstakeItem (artefactName) = if (!(containsElement(stakeable, artefactName))) | |
113 | - | then throw("This artefact doesn't exist") | |
114 | - | else { | |
115 | - | let invoker = toString(i.caller) | |
116 | - | let artefactId = tryGetString(keyArtefactOwner(artefactName, invoker)) | |
117 | - | if ((artefactId == "ART-XSOCK")) | |
118 | - | then throw("You can not unstake ART-XSOCK anymore") | |
119 | - | else if ((artefactId == "")) | |
120 | - | then throw(("You didnt stake " + artefactName)) | |
121 | - | else { | |
122 | - | let boostDuck = if ((artefactName == "ART-LAKE")) | |
123 | - | then invoke(getItemsAddress(), "manipulateBoostAccount", [-2, invoker], nil) | |
124 | - | else if ((artefactName == "ART-XTREE")) | |
125 | - | then invoke(getItemsAddress(), "manipulateBoostAccount", [-3, invoker], nil) | |
126 | - | else nil | |
127 | - | if ((boostDuck == boostDuck)) | |
128 | - | then [IntegerEntry(keyUnstakeHeight(artefactName, artefactId), height), ScriptTransfer(i.caller, 1, fromBase58String(artefactId)), DeleteEntry(keyArtefactOwner(artefactName, invoker))] | |
129 | - | else throw("Strict value is not equal to itself.") | |
130 | - | } | |
131 | - | } | |
106 | + | func wearXItemsToDuck () = if ((2 > size(i.payments))) | |
107 | + | then throw("WWXITD: Please attach at least 1 item and 1 duck!") | |
108 | + | else if ((size(i.payments) > 6)) | |
109 | + | then throw("WWXITD: You can only attach 5 items and one duck!") | |
110 | + | else { | |
111 | + | func handleItem (acc,payment) = { | |
112 | + | let index = indexOf(i.payments, payment) | |
113 | + | if ((index == 0)) | |
114 | + | then { | |
115 | + | let duckId = toBase58String(value(payment.assetId)) | |
116 | + | if ((payment.amount != 1)) | |
117 | + | then throw("WRITD: Duck is not attached") | |
118 | + | else { | |
119 | + | let children = asInt(invoke(getBreederAddress(), "validateAndGetChildren", [duckId], nil)) | |
120 | + | if ((children == children)) | |
121 | + | then (acc ++ [ScriptTransfer(i.caller, 1, payment.assetId)]) | |
122 | + | else throw("Strict value is not equal to itself.") | |
123 | + | } | |
124 | + | } | |
125 | + | else (acc ++ wearItem(toBase58String(value(payment.assetId)), toBase58String(value(i.payments[0].assetId)))) | |
126 | + | } | |
132 | 127 | ||
128 | + | let $l = i.payments | |
129 | + | let $s = size($l) | |
130 | + | let $acc0 = nil | |
131 | + | func $f0_1 ($a,$i) = if (($i >= $s)) | |
132 | + | then $a | |
133 | + | else handleItem($a, $l[$i]) | |
133 | 134 | ||
135 | + | func $f0_2 ($a,$i) = if (($i >= $s)) | |
136 | + | then $a | |
137 | + | else throw("List size exceeds 6") | |
134 | 138 | ||
135 | - | @Callable(i) | |
136 | - | func oneTimeUseFeed () = if (!(if ((size(i.payments) == 1)) | |
137 | - | then (i.payments[0].amount == 1) | |
138 | - | else false)) | |
139 | - | then throw("Invalid payment") | |
140 | - | else { | |
141 | - | let assetId = value(i.payments[0].assetId) | |
142 | - | let artefactName = asString(invoke(getItemsAddress(), "checkArtefactDetails", [toBase58String(assetId)], nil)) | |
143 | - | if ((artefactName == artefactName)) | |
144 | - | then if ((artefactName != "ART-FEED10")) | |
145 | - | then throw("You can't use this artafect to earn feedlimit!") | |
146 | - | else { | |
147 | - | let invoker = toString(i.caller) | |
148 | - | [IntegerEntry(keyFeedLimit(invoker), (tryGetInteger(keyFeedLimit(invoker)) + 10))] | |
149 | - | } | |
150 | - | else throw("Strict value is not equal to itself.") | |
151 | - | } | |
139 | + | $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6) | |
140 | + | } | |
152 | 141 | ||
153 | - | ||
154 | - | @Verifier(tx) | |
155 | - | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
156 | 142 |
Old | New | Differences | |
---|---|---|---|
1 | - | {-# STDLIB_VERSION | |
1 | + | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | - | ||
4 | + | let wearables = ["ART-CAPE", "ART-HAT", "ART-XSCARF", "ART-XSWEATER"] | |
5 | 5 | ||
6 | - | ||
7 | - | func keyArtefactOwner (artefactName,owner) = (((artefactName + "_") + owner) + "_owner") | |
8 | - | ||
9 | - | ||
10 | - | func keyFeedLimit (owner) = ("limit_" + owner) | |
11 | - | ||
12 | - | ||
13 | - | let stakeable = ["ART-LAKE", "ART-XTREE", "ART-XSOCK", "ART-XMISTL"] | |
14 | - | ||
15 | - | func tryGetString (key) = match getString(this, key) { | |
16 | - | case a: String => | |
17 | - | a | |
18 | - | case _ => | |
19 | - | "" | |
20 | - | } | |
21 | - | ||
22 | - | ||
23 | - | func tryGetInteger (key) = match getInteger(this, key) { | |
24 | - | case a: Int => | |
25 | - | a | |
26 | - | case _ => | |
27 | - | 0 | |
28 | - | } | |
6 | + | func keyArtefactDuck (duckId,wearable) = ((duckId + "_") + wearable) | |
29 | 7 | ||
30 | 8 | ||
31 | 9 | func tryGetStringExternal (address,key) = match getString(address, key) { | |
32 | 10 | case a: String => | |
33 | 11 | a | |
34 | 12 | case _ => | |
35 | 13 | "" | |
36 | 14 | } | |
37 | 15 | ||
38 | 16 | ||
39 | - | func | |
17 | + | func tryGetString (key) = tryGetStringExternal(this, key) | |
40 | 18 | ||
41 | 19 | ||
42 | - | func getItemsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_itemsAddress"))) | |
20 | + | func asInt (value) = match value { | |
21 | + | case int: Int => | |
22 | + | int | |
23 | + | case _ => | |
24 | + | throw("wrong type, expected: Int") | |
25 | + | } | |
43 | 26 | ||
44 | 27 | ||
45 | 28 | func asString (value) = match value { | |
46 | 29 | case string: String => | |
47 | 30 | string | |
48 | 31 | case _ => | |
49 | 32 | throw("wrong type, expected: String") | |
50 | 33 | } | |
51 | 34 | ||
52 | 35 | ||
53 | - | func asInt (value) = match value { | |
54 | - | case int: Int => | |
55 | - | int | |
56 | - | case _ => | |
57 | - | throw("wrong type, expected: Int") | |
58 | - | } | |
36 | + | func getOracle () = Address(fromBase58String(tryGetString("static_oracleAddress"))) | |
59 | 37 | ||
60 | 38 | ||
61 | - | func itemIsInCoolDown (artefactName,artefactId) = { | |
62 | - | let unstakeHeightLast = tryGetInteger(keyUnstakeHeight(artefactName, artefactId)) | |
63 | - | let cooldownPeriod = 240 | |
64 | - | if ((height > (unstakeHeightLast + cooldownPeriod))) | |
65 | - | then false | |
66 | - | else true | |
39 | + | func getBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_breederAddress"))) | |
40 | + | ||
41 | + | ||
42 | + | func getItemsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_itemsAddress"))) | |
43 | + | ||
44 | + | ||
45 | + | func tryGetCosmeticItem (item) = { | |
46 | + | let key = ("direct_cosmetic_" + item) | |
47 | + | match getInteger(getItemsAddress(), key) { | |
48 | + | case a: Int => | |
49 | + | a | |
50 | + | case _ => | |
51 | + | unit | |
52 | + | } | |
53 | + | } | |
54 | + | ||
55 | + | ||
56 | + | func wearItem (assetIdWearAble,duckId) = { | |
57 | + | let artefactName = asString(invoke(getItemsAddress(), "checkArtefactDetails", [assetIdWearAble], nil)) | |
58 | + | if ((artefactName == artefactName)) | |
59 | + | then if (if (!(containsElement(wearables, artefactName))) | |
60 | + | then !(isDefined(tryGetCosmeticItem(artefactName))) | |
61 | + | else false) | |
62 | + | then throw("WRITD: Unsupported wearable") | |
63 | + | else { | |
64 | + | let artefactId = tryGetString(keyArtefactDuck(duckId, artefactName)) | |
65 | + | let boostDuck = if ((artefactName == "ART-XSCARF")) | |
66 | + | then invoke(getItemsAddress(), "manipulateBoost", [69, duckId], nil) | |
67 | + | else nil | |
68 | + | if ((boostDuck == boostDuck)) | |
69 | + | then if ((artefactId != "")) | |
70 | + | then throw(("Duck is already wearing a " + artefactName)) | |
71 | + | else [StringEntry(keyArtefactDuck(duckId, artefactName), assetIdWearAble)] | |
72 | + | else throw("Strict value is not equal to itself.") | |
73 | + | } | |
74 | + | else throw("Strict value is not equal to itself.") | |
67 | 75 | } | |
68 | 76 | ||
69 | 77 | ||
70 | 78 | @Callable(i) | |
71 | 79 | func configureOracle (oracle) = if ((i.caller != this)) | |
72 | 80 | then throw("admin only") | |
73 | 81 | else [StringEntry("static_oracleAddress", oracle)] | |
74 | 82 | ||
75 | 83 | ||
76 | 84 | ||
77 | 85 | @Callable(i) | |
78 | - | func stakeItem () = if (!(if ((size(i.payments) == 1)) | |
79 | - | then (i.payments[0].amount == 1) | |
80 | - | else false)) | |
81 | - | then throw("Invalid payment") | |
82 | - | else { | |
83 | - | let assetId = value(i.payments[0].assetId) | |
84 | - | let artefactName = asString(invoke(getItemsAddress(), "checkArtefactDetails", [toBase58String(assetId)], nil)) | |
85 | - | if ((artefactName == artefactName)) | |
86 | - | then if (!(containsElement(stakeable, artefactName))) | |
87 | - | then throw("You can't stake this artafect") | |
88 | - | else if (itemIsInCoolDown(artefactName, toBase58String(assetId))) | |
89 | - | then throw("Item can't be staked yet, it's in cooldown") | |
90 | - | else { | |
91 | - | let invoker = toString(i.caller) | |
92 | - | let artefactId = tryGetString(keyArtefactOwner(artefactName, invoker)) | |
93 | - | if ((artefactId != "")) | |
94 | - | then throw(("You are already staking " + artefactName)) | |
95 | - | else { | |
96 | - | let boostDuck = if ((artefactName == "ART-LAKE")) | |
97 | - | then invoke(getItemsAddress(), "manipulateBoostAccount", [2, invoker], nil) | |
98 | - | else if ((artefactName == "ART-XTREE")) | |
99 | - | then invoke(getItemsAddress(), "manipulateBoostAccount", [3, invoker], nil) | |
100 | - | else nil | |
101 | - | if ((boostDuck == boostDuck)) | |
102 | - | then [StringEntry(keyArtefactOwner(artefactName, invoker), toBase58String(assetId))] | |
103 | - | else throw("Strict value is not equal to itself.") | |
104 | - | } | |
105 | - | } | |
106 | - | else throw("Strict value is not equal to itself.") | |
107 | - | } | |
86 | + | func wearItemToDuck () = { | |
87 | + | let firstPayment = value(i.payments[0]) | |
88 | + | let secondPayment = value(i.payments[1]) | |
89 | + | let duckId = toBase58String(value(firstPayment.assetId)) | |
90 | + | let secondAssetId = toBase58String(value(secondPayment.assetId)) | |
91 | + | if (if ((firstPayment.amount != 1)) | |
92 | + | then true | |
93 | + | else (secondPayment.amount != 1)) | |
94 | + | then throw("WRITD: NFT is not attached") | |
95 | + | else { | |
96 | + | let children = asInt(invoke(getBreederAddress(), "validateAndGetChildren", [duckId], nil)) | |
97 | + | if ((children == children)) | |
98 | + | then (wearItem(secondAssetId, duckId) ++ [ScriptTransfer(i.caller, 1, firstPayment.assetId)]) | |
99 | + | else throw("Strict value is not equal to itself.") | |
100 | + | } | |
101 | + | } | |
108 | 102 | ||
109 | 103 | ||
110 | 104 | ||
111 | 105 | @Callable(i) | |
112 | - | func unstakeItem (artefactName) = if (!(containsElement(stakeable, artefactName))) | |
113 | - | then throw("This artefact doesn't exist") | |
114 | - | else { | |
115 | - | let invoker = toString(i.caller) | |
116 | - | let artefactId = tryGetString(keyArtefactOwner(artefactName, invoker)) | |
117 | - | if ((artefactId == "ART-XSOCK")) | |
118 | - | then throw("You can not unstake ART-XSOCK anymore") | |
119 | - | else if ((artefactId == "")) | |
120 | - | then throw(("You didnt stake " + artefactName)) | |
121 | - | else { | |
122 | - | let boostDuck = if ((artefactName == "ART-LAKE")) | |
123 | - | then invoke(getItemsAddress(), "manipulateBoostAccount", [-2, invoker], nil) | |
124 | - | else if ((artefactName == "ART-XTREE")) | |
125 | - | then invoke(getItemsAddress(), "manipulateBoostAccount", [-3, invoker], nil) | |
126 | - | else nil | |
127 | - | if ((boostDuck == boostDuck)) | |
128 | - | then [IntegerEntry(keyUnstakeHeight(artefactName, artefactId), height), ScriptTransfer(i.caller, 1, fromBase58String(artefactId)), DeleteEntry(keyArtefactOwner(artefactName, invoker))] | |
129 | - | else throw("Strict value is not equal to itself.") | |
130 | - | } | |
131 | - | } | |
106 | + | func wearXItemsToDuck () = if ((2 > size(i.payments))) | |
107 | + | then throw("WWXITD: Please attach at least 1 item and 1 duck!") | |
108 | + | else if ((size(i.payments) > 6)) | |
109 | + | then throw("WWXITD: You can only attach 5 items and one duck!") | |
110 | + | else { | |
111 | + | func handleItem (acc,payment) = { | |
112 | + | let index = indexOf(i.payments, payment) | |
113 | + | if ((index == 0)) | |
114 | + | then { | |
115 | + | let duckId = toBase58String(value(payment.assetId)) | |
116 | + | if ((payment.amount != 1)) | |
117 | + | then throw("WRITD: Duck is not attached") | |
118 | + | else { | |
119 | + | let children = asInt(invoke(getBreederAddress(), "validateAndGetChildren", [duckId], nil)) | |
120 | + | if ((children == children)) | |
121 | + | then (acc ++ [ScriptTransfer(i.caller, 1, payment.assetId)]) | |
122 | + | else throw("Strict value is not equal to itself.") | |
123 | + | } | |
124 | + | } | |
125 | + | else (acc ++ wearItem(toBase58String(value(payment.assetId)), toBase58String(value(i.payments[0].assetId)))) | |
126 | + | } | |
132 | 127 | ||
128 | + | let $l = i.payments | |
129 | + | let $s = size($l) | |
130 | + | let $acc0 = nil | |
131 | + | func $f0_1 ($a,$i) = if (($i >= $s)) | |
132 | + | then $a | |
133 | + | else handleItem($a, $l[$i]) | |
133 | 134 | ||
135 | + | func $f0_2 ($a,$i) = if (($i >= $s)) | |
136 | + | then $a | |
137 | + | else throw("List size exceeds 6") | |
134 | 138 | ||
135 | - | @Callable(i) | |
136 | - | func oneTimeUseFeed () = if (!(if ((size(i.payments) == 1)) | |
137 | - | then (i.payments[0].amount == 1) | |
138 | - | else false)) | |
139 | - | then throw("Invalid payment") | |
140 | - | else { | |
141 | - | let assetId = value(i.payments[0].assetId) | |
142 | - | let artefactName = asString(invoke(getItemsAddress(), "checkArtefactDetails", [toBase58String(assetId)], nil)) | |
143 | - | if ((artefactName == artefactName)) | |
144 | - | then if ((artefactName != "ART-FEED10")) | |
145 | - | then throw("You can't use this artafect to earn feedlimit!") | |
146 | - | else { | |
147 | - | let invoker = toString(i.caller) | |
148 | - | [IntegerEntry(keyFeedLimit(invoker), (tryGetInteger(keyFeedLimit(invoker)) + 10))] | |
149 | - | } | |
150 | - | else throw("Strict value is not equal to itself.") | |
151 | - | } | |
139 | + | $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6) | |
140 | + | } | |
152 | 141 | ||
153 | - | ||
154 | - | @Verifier(tx) | |
155 | - | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
156 | 142 |
github/deemru/w8io/3ef1775 37.40 ms ◑