tx · ERWW69jcaUNF2UhkgWDJAbcmFGnsG2siJ9GZooqEuk4q

3PHUMZkr66B38WxHV1boULaEjjF7giGgVy7:  -0.01000000 Waves

2022.12.09 17:16 [3418363] smart account 3PHUMZkr66B38WxHV1boULaEjjF7giGgVy7 > SELF 0.00000000 Waves

{ "type": 13, "id": "ERWW69jcaUNF2UhkgWDJAbcmFGnsG2siJ9GZooqEuk4q", "fee": 1000000, "feeAssetId": null, "timestamp": 1670595415702, "version": 2, "chainId": 87, "sender": "3PHUMZkr66B38WxHV1boULaEjjF7giGgVy7", "senderPublicKey": "8XKsuJqSe6FsspUz3sPvdADeLpP7e1tfiWx5tt6e674g", "proofs": [ "3bYmHRgigqzQXnETsASGowjH1FTnJHZcpZCyj6hvPXfqG2eNVg5P7E2ZXhPy89stfffZGfmZtpDT666JaixCf23i" ], "script": "base64:AAIFAAAAAAAAABAIAhIDCgEIEgASAwoBCBIAAAAADAEAAAAQa2V5VW5zdGFrZUhlaWdodAAAAAIAAAAMYXJ0ZWZhY3ROYW1lAAAACmFydGVmYWN0SWQJAAEsAAAAAgkAASwAAAACCQABLAAAAAIFAAAADGFydGVmYWN0TmFtZQIAAAABXwUAAAAKYXJ0ZWZhY3RJZAIAAAAPX3Vuc3Rha2VfaGVpZ2h0AQAAABBrZXlBcnRlZmFjdE93bmVyAAAAAgAAAAxhcnRlZmFjdE5hbWUAAAAFb3duZXIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIFAAAADGFydGVmYWN0TmFtZQIAAAABXwUAAAAFb3duZXICAAAABl9vd25lcgEAAAAMa2V5RmVlZExpbWl0AAAAAQAAAAVvd25lcgkAASwAAAACAgAAAAZsaW1pdF8FAAAABW93bmVyAAAAAAlzdGFrZWFibGUJAARMAAAAAgIAAAAIQVJULUxBS0UJAARMAAAAAgIAAAAJQVJULVhUUkVFCQAETAAAAAICAAAACUFSVC1YU09DSwkABEwAAAACAgAAAApBUlQtWE1JU1RMBQAAAANuaWwBAAAADHRyeUdldFN0cmluZwAAAAEAAAADa2V5BAAAAAckbWF0Y2gwCQAEHQAAAAIFAAAABHRoaXMFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAgAAAAABAAAADXRyeUdldEludGVnZXIAAAABAAAAA2tleQQAAAAHJG1hdGNoMAkABBoAAAACBQAAAAR0aGlzBQAAAANrZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQAAAAAAAAAAAAEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACAAAAB2FkZHJlc3MAAAADa2V5BAAAAAckbWF0Y2gwCQAEHQAAAAIFAAAAB2FkZHJlc3MFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAgAAAAABAAAACWdldE9yYWNsZQAAAAAJAQAAAAdBZGRyZXNzAAAAAQkAAlkAAAABCQEAAAAMdHJ5R2V0U3RyaW5nAAAAAQIAAAAUc3RhdGljX29yYWNsZUFkZHJlc3MBAAAAD2dldEl0ZW1zQWRkcmVzcwAAAAAJAQAAAAdBZGRyZXNzAAAAAQkAAlkAAAABCQEAAAAUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwAAAACCQEAAAAJZ2V0T3JhY2xlAAAAAAIAAAATc3RhdGljX2l0ZW1zQWRkcmVzcwEAAAAIYXNTdHJpbmcAAAABAAAABXZhbHVlBAAAAAckbWF0Y2gwBQAAAAV2YWx1ZQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAZzdHJpbmcFAAAAByRtYXRjaDAFAAAABnN0cmluZwkAAAIAAAABAgAAABx3cm9uZyB0eXBlLCBleHBlY3RlZDogU3RyaW5nAQAAAAVhc0ludAAAAAEAAAAFdmFsdWUEAAAAByRtYXRjaDAFAAAABXZhbHVlAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAA2ludAUAAAAHJG1hdGNoMAUAAAADaW50CQAAAgAAAAECAAAAGXdyb25nIHR5cGUsIGV4cGVjdGVkOiBJbnQBAAAAEGl0ZW1Jc0luQ29vbERvd24AAAACAAAADGFydGVmYWN0TmFtZQAAAAphcnRlZmFjdElkBAAAABF1bnN0YWtlSGVpZ2h0TGFzdAkBAAAADXRyeUdldEludGVnZXIAAAABCQEAAAAQa2V5VW5zdGFrZUhlaWdodAAAAAIFAAAADGFydGVmYWN0TmFtZQUAAAAKYXJ0ZWZhY3RJZAQAAAAOY29vbGRvd25QZXJpb2QAAAAAAAAAAPADCQAAZgAAAAIFAAAABmhlaWdodAkAAGQAAAACBQAAABF1bnN0YWtlSGVpZ2h0TGFzdAUAAAAOY29vbGRvd25QZXJpb2QHBgAAAAQAAAABaQEAAAAPY29uZmlndXJlT3JhY2xlAAAAAQAAAAZvcmFjbGUDCQEAAAACIT0AAAACCAUAAAABaQAAAAZjYWxsZXIFAAAABHRoaXMJAAACAAAAAQIAAAAKYWRtaW4gb25seQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACAgAAABRzdGF0aWNfb3JhY2xlQWRkcmVzcwUAAAAGb3JhY2xlBQAAAANuaWwA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", "height": 3418363, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3oD5VvQAopHjXgM6YdTFxpj7iNz67tVRiGkvsHDW1jUX Next: 4k1b1HJ6iEtczu3xScv6w9m9MyvjuDm4UuTESAmHtA3y Diff:
OldNewDifferences
1-{-# STDLIB_VERSION 6 #-}
1+{-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let wearables = ["ART-CAPE", "ART-HAT", "ART-XSCARF", "ART-XSWEATER"]
4+func keyUnstakeHeight (artefactName,artefactId) = (((artefactName + "_") + artefactId) + "_unstake_height")
55
6-func keyArtefactDuck (duckId,wearable) = ((duckId + "_") + wearable)
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+}
729
830
931 func tryGetStringExternal (address,key) = match getString(address, key) {
1436 }
1537
1638
17-func tryGetString (key) = tryGetStringExternal(this, key)
39+func getOracle () = Address(fromBase58String(tryGetString("static_oracleAddress")))
40+
41+
42+func getItemsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_itemsAddress")))
43+
44+
45+func asString (value) = match value {
46+ case string: String =>
47+ string
48+ case _ =>
49+ throw("wrong type, expected: String")
50+}
1851
1952
2053 func asInt (value) = match value {
2558 }
2659
2760
28-func asString (value) = match value {
29- case string: String =>
30- string
31- case _ =>
32- throw("wrong type, expected: String")
33-}
34-
35-
36-func getOracle () = Address(fromBase58String(tryGetString("static_oracleAddress")))
37-
38-
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.")
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
7567 }
7668
7769
8375
8476
8577 @Callable(i)
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- }
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+ }
102108
103109
104110
105111 @Callable(i)
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- }
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+ }
127132
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])
134133
135- func $f0_2 ($a,$i) = if (($i >= $s))
136- then $a
137- else throw("List size exceeds 6")
138134
139- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
140- }
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+ }
141152
153+
154+@Verifier(tx)
155+func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
142156
Full:
OldNewDifferences
1-{-# STDLIB_VERSION 6 #-}
1+{-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let wearables = ["ART-CAPE", "ART-HAT", "ART-XSCARF", "ART-XSWEATER"]
4+func keyUnstakeHeight (artefactName,artefactId) = (((artefactName + "_") + artefactId) + "_unstake_height")
55
6-func keyArtefactDuck (duckId,wearable) = ((duckId + "_") + wearable)
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+}
729
830
931 func tryGetStringExternal (address,key) = match getString(address, key) {
1032 case a: String =>
1133 a
1234 case _ =>
1335 ""
1436 }
1537
1638
17-func tryGetString (key) = tryGetStringExternal(this, key)
39+func getOracle () = Address(fromBase58String(tryGetString("static_oracleAddress")))
40+
41+
42+func getItemsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_itemsAddress")))
43+
44+
45+func asString (value) = match value {
46+ case string: String =>
47+ string
48+ case _ =>
49+ throw("wrong type, expected: String")
50+}
1851
1952
2053 func asInt (value) = match value {
2154 case int: Int =>
2255 int
2356 case _ =>
2457 throw("wrong type, expected: Int")
2558 }
2659
2760
28-func asString (value) = match value {
29- case string: String =>
30- string
31- case _ =>
32- throw("wrong type, expected: String")
33-}
34-
35-
36-func getOracle () = Address(fromBase58String(tryGetString("static_oracleAddress")))
37-
38-
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.")
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
7567 }
7668
7769
7870 @Callable(i)
7971 func configureOracle (oracle) = if ((i.caller != this))
8072 then throw("admin only")
8173 else [StringEntry("static_oracleAddress", oracle)]
8274
8375
8476
8577 @Callable(i)
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- }
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+ }
102108
103109
104110
105111 @Callable(i)
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- }
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+ }
127132
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])
134133
135- func $f0_2 ($a,$i) = if (($i >= $s))
136- then $a
137- else throw("List size exceeds 6")
138134
139- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
140- }
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+ }
141152
153+
154+@Verifier(tx)
155+func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
142156

github/deemru/w8io/3ef1775 
29.37 ms