tx · 5YoaXDCGYBNWtys5G3by3DAqBKCx9AB85jgKJz8tVo1o

3PNbBGH1omxP5yMewxvDcuLrb4RAKgKt1uD:  -0.01100000 Waves

2023.04.29 18:54 [3621643] smart account 3PNbBGH1omxP5yMewxvDcuLrb4RAKgKt1uD > SELF 0.00000000 Waves

{ "type": 13, "id": "5YoaXDCGYBNWtys5G3by3DAqBKCx9AB85jgKJz8tVo1o", "fee": 1100000, "feeAssetId": null, "timestamp": 1682783640482, "version": 2, "chainId": 87, "sender": "3PNbBGH1omxP5yMewxvDcuLrb4RAKgKt1uD", "senderPublicKey": "2LSzvnP35jSjvLYXs8xfXuNbz3J5vtLhvHoXgSxSV1QV", "proofs": [ "2CoFuHteCCczshJY9JCZDMxAahC3qroYDbL97kVrvRNP4d2RN2psPMjzH3ZtZ57bWP2f5hcnsHFu3s6udpdc6Um7" ], "script": "base64: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ZW50AAAAB2Fzc2V0SWQJAAACAAAAAQIAAAAZV0NBUDogUGxlYXNlIGF0dGFjaCB3YXZlcwQAAAAJZmVlQW1vdW50CQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACCQEAAAAJZ2V0T3JhY2xlAAAAAAkBAAAAEnN0YXRpY0tleV9leHRyYUZlZQAAAAADCQEAAAACIT0AAAACCAUAAAAHcGF5bWVudAAAAAZhbW91bnQFAAAACWZlZUFtb3VudAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAcV0NBUDogUGxlYXNlIGF0dGFjaCBleGFjdGx5IAkAAaQAAAABBQAAAAlmZWVBbW91bnQCAAAAEyBhbW91bnQgb2Ygd2F2ZWxldHMJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAEGdldEZlZUFnZ3JlZ2F0b3IAAAAABQAAAAlmZWVBbW91bnQFAAAABHVuaXQFAAAAA25pbAEAAAAQaXRlbUlzSW5Db29sRG93bgAAAAIAAAAMYXJ0ZWZhY3ROYW1lAAAACmFydGVmYWN0SWQEAAAAEXVuc3Rha2VIZWlnaHRMYXN0CQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAQAAABBrZXlVbnN0YWtlSGVpZ2h0AAAAAgUAAAAMYXJ0ZWZhY3ROYW1lBQAAAAphcnRlZmFjdElkBAAAAA5jb29sZG93blBlcmlvZAAAAAAAAAAA8AMJAABmAAAAAgUAAAAGaGVpZ2h0CQAAZAAAAAIFAAAAEXVuc3Rha2VIZWlnaHRMYXN0BQAAAA5jb29sZG93blBlcmlvZAcGAAAABAAAAAFpAQAAAA9jb25maWd1cmVPcmFjbGUAAAABAAAABm9yYWNsZQMJAQAAAAIhPQAAAAIIBQAAAAFpAAAABmNhbGxlcgUAAAAEdGhpcwkAAAIAAAABAgAAAAphZG1pbiBvbmx5CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABdzdGF0aWNLZXlfb3JhY2xlQWRkcmVzcwAAAAAFAAAABm9yYWNsZQUAAAADbmlsAAAAAWkBAAAACXN0YWtlSXRlbQAAAAAEAAAADHZhbGlkUGF5bWVudAkBAAAAFmNoZWNrQWRkaXRpb25hbFBheW1lbnQAAAABCQAB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", "height": 3621643, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GEWEUarmHLYpCXKtibTbnKuPE47KWqCz9kdfXrGVx4hm Next: 6Gtp4p3XEUfz6UQU4JZwoFE649XzgnjtUVa4Bh1BHUSm Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+func staticKey_oracleAddress () = "static_oracleAddress"
5+
6+
7+func staticKey_itemsAddress () = "static_itemsAddress"
8+
9+
10+func staticKey_extraFee () = "static_extraFee"
11+
12+
13+func staticKey_feeAggregator () = "static_feeAggregator"
14+
15+
416 func keyUnstakeHeight (artefactName,artefactId) = (((artefactName + "_") + artefactId) + "_unstake_height")
517
618
3648 }
3749
3850
39-func getOracle () = Address(fromBase58String(tryGetString("static_oracleAddress")))
51+func getOracle () = Address(fromBase58String(tryGetString(staticKey_oracleAddress())))
4052
4153
42-func getItemsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_itemsAddress")))
54+func getItemsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_itemsAddress())))
55+
56+
57+func getFeeAggregator () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_feeAggregator())))
4358
4459
4560 func asString (value) = match value {
5873 }
5974
6075
76+func checkAdditionalPayment (payment) = if (isDefined(payment.assetId))
77+ then throw("WCAP: Please attach waves")
78+ else {
79+ let feeAmount = getIntegerValue(getOracle(), staticKey_extraFee())
80+ if ((payment.amount != feeAmount))
81+ then throw((("WCAP: Please attach exactly " + toString(feeAmount)) + " amount of wavelets"))
82+ else [ScriptTransfer(getFeeAggregator(), feeAmount, unit)]
83+ }
84+
85+
6186 func itemIsInCoolDown (artefactName,artefactId) = {
6287 let unstakeHeightLast = tryGetInteger(keyUnstakeHeight(artefactName, artefactId))
6388 let cooldownPeriod = 240
7095 @Callable(i)
7196 func configureOracle (oracle) = if ((i.caller != this))
7297 then throw("admin only")
73- else [StringEntry("static_oracleAddress", oracle)]
98+ else [StringEntry(staticKey_oracleAddress(), oracle)]
7499
75100
76101
77102 @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- }
103+func stakeItem () = {
104+ let validPayment = checkAdditionalPayment(i.payments[1])
105+ if (!(if ((size(i.payments) == 2))
106+ then (i.payments[0].amount == 1)
107+ else false))
108+ then throw("Invalid payment")
109+ else {
110+ let assetId = value(i.payments[0].assetId)
111+ let artefactName = asString(invoke(getItemsAddress(), "checkArtefactDetails", [toBase58String(assetId)], nil))
112+ if ((artefactName == artefactName))
113+ then if (!(containsElement(stakeable, artefactName)))
114+ then throw("You can't stake this artafect")
115+ else if (itemIsInCoolDown(artefactName, toBase58String(assetId)))
116+ then throw("Item can't be staked yet, it's in cooldown")
117+ else {
118+ let invoker = toString(i.caller)
119+ let artefactId = tryGetString(keyArtefactOwner(artefactName, invoker))
120+ if ((artefactId != ""))
121+ then throw(("You are already staking " + artefactName))
122+ else {
123+ let boostDuck = if ((artefactName == "ART-LAKE"))
124+ then invoke(getItemsAddress(), "manipulateBoostAccount", [2, invoker], nil)
125+ else if ((artefactName == "ART-XTREE"))
126+ then invoke(getItemsAddress(), "manipulateBoostAccount", [3, invoker], nil)
127+ else nil
128+ if ((boostDuck == boostDuck))
129+ then ([StringEntry(keyArtefactOwner(artefactName, invoker), toBase58String(assetId))] ++ validPayment)
130+ else throw("Strict value is not equal to itself.")
131+ }
132+ }
133+ else throw("Strict value is not equal to itself.")
134+ }
135+ }
108136
109137
110138
111139 @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- }
140+func unstakeItem (artefactName) = {
141+ let validPayment = checkAdditionalPayment(i.payments[0])
142+ if (!(containsElement(stakeable, artefactName)))
143+ then throw("This artefact doesn't exist")
144+ else {
145+ let invoker = toString(i.caller)
146+ let artefactId = tryGetString(keyArtefactOwner(artefactName, invoker))
147+ if ((artefactId == "ART-XSOCK"))
148+ then throw("You can not unstake ART-XSOCK anymore")
149+ else if ((artefactId == ""))
150+ then throw(("You didnt stake " + artefactName))
151+ else {
152+ let boostDuck = if ((artefactName == "ART-LAKE"))
153+ then invoke(getItemsAddress(), "manipulateBoostAccount", [-2, invoker], nil)
154+ else if ((artefactName == "ART-XTREE"))
155+ then invoke(getItemsAddress(), "manipulateBoostAccount", [-3, invoker], nil)
156+ else nil
157+ if ((boostDuck == boostDuck))
158+ then ([IntegerEntry(keyUnstakeHeight(artefactName, artefactId), height), ScriptTransfer(i.caller, 1, fromBase58String(artefactId)), DeleteEntry(keyArtefactOwner(artefactName, invoker))] ++ validPayment)
159+ else throw("Strict value is not equal to itself.")
160+ }
161+ }
162+ }
132163
133164
134165
135166 @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)), Burn(assetId, 1)]
149- }
150- else throw("Strict value is not equal to itself.")
151- }
167+func oneTimeUseFeed () = {
168+ let validPayment = checkAdditionalPayment(i.payments[1])
169+ if (!(if ((size(i.payments) == 2))
170+ then (i.payments[0].amount == 1)
171+ else false))
172+ then throw("Invalid payment")
173+ else {
174+ let assetId = value(i.payments[0].assetId)
175+ let artefactName = asString(invoke(getItemsAddress(), "checkArtefactDetails", [toBase58String(assetId)], nil))
176+ if ((artefactName == artefactName))
177+ then if ((artefactName != "ART-FEED10"))
178+ then throw("You can't use this artafect to earn feedlimit!")
179+ else {
180+ let invoker = toString(i.caller)
181+ ([IntegerEntry(keyFeedLimit(invoker), (tryGetInteger(keyFeedLimit(invoker)) + 10)), Burn(assetId, 1)] ++ validPayment)
182+ }
183+ else throw("Strict value is not equal to itself.")
184+ }
185+ }
152186
153187
154188 @Verifier(tx)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+func staticKey_oracleAddress () = "static_oracleAddress"
5+
6+
7+func staticKey_itemsAddress () = "static_itemsAddress"
8+
9+
10+func staticKey_extraFee () = "static_extraFee"
11+
12+
13+func staticKey_feeAggregator () = "static_feeAggregator"
14+
15+
416 func keyUnstakeHeight (artefactName,artefactId) = (((artefactName + "_") + artefactId) + "_unstake_height")
517
618
719 func keyArtefactOwner (artefactName,owner) = (((artefactName + "_") + owner) + "_owner")
820
921
1022 func keyFeedLimit (owner) = ("limit_" + owner)
1123
1224
1325 let stakeable = ["ART-LAKE", "ART-XTREE", "ART-XSOCK", "ART-XMISTL"]
1426
1527 func tryGetString (key) = match getString(this, key) {
1628 case a: String =>
1729 a
1830 case _ =>
1931 ""
2032 }
2133
2234
2335 func tryGetInteger (key) = match getInteger(this, key) {
2436 case a: Int =>
2537 a
2638 case _ =>
2739 0
2840 }
2941
3042
3143 func tryGetStringExternal (address,key) = match getString(address, key) {
3244 case a: String =>
3345 a
3446 case _ =>
3547 ""
3648 }
3749
3850
39-func getOracle () = Address(fromBase58String(tryGetString("static_oracleAddress")))
51+func getOracle () = Address(fromBase58String(tryGetString(staticKey_oracleAddress())))
4052
4153
42-func getItemsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_itemsAddress")))
54+func getItemsAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_itemsAddress())))
55+
56+
57+func getFeeAggregator () = Address(fromBase58String(tryGetStringExternal(getOracle(), staticKey_feeAggregator())))
4358
4459
4560 func asString (value) = match value {
4661 case string: String =>
4762 string
4863 case _ =>
4964 throw("wrong type, expected: String")
5065 }
5166
5267
5368 func asInt (value) = match value {
5469 case int: Int =>
5570 int
5671 case _ =>
5772 throw("wrong type, expected: Int")
5873 }
5974
6075
76+func checkAdditionalPayment (payment) = if (isDefined(payment.assetId))
77+ then throw("WCAP: Please attach waves")
78+ else {
79+ let feeAmount = getIntegerValue(getOracle(), staticKey_extraFee())
80+ if ((payment.amount != feeAmount))
81+ then throw((("WCAP: Please attach exactly " + toString(feeAmount)) + " amount of wavelets"))
82+ else [ScriptTransfer(getFeeAggregator(), feeAmount, unit)]
83+ }
84+
85+
6186 func itemIsInCoolDown (artefactName,artefactId) = {
6287 let unstakeHeightLast = tryGetInteger(keyUnstakeHeight(artefactName, artefactId))
6388 let cooldownPeriod = 240
6489 if ((height > (unstakeHeightLast + cooldownPeriod)))
6590 then false
6691 else true
6792 }
6893
6994
7095 @Callable(i)
7196 func configureOracle (oracle) = if ((i.caller != this))
7297 then throw("admin only")
73- else [StringEntry("static_oracleAddress", oracle)]
98+ else [StringEntry(staticKey_oracleAddress(), oracle)]
7499
75100
76101
77102 @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- }
103+func stakeItem () = {
104+ let validPayment = checkAdditionalPayment(i.payments[1])
105+ if (!(if ((size(i.payments) == 2))
106+ then (i.payments[0].amount == 1)
107+ else false))
108+ then throw("Invalid payment")
109+ else {
110+ let assetId = value(i.payments[0].assetId)
111+ let artefactName = asString(invoke(getItemsAddress(), "checkArtefactDetails", [toBase58String(assetId)], nil))
112+ if ((artefactName == artefactName))
113+ then if (!(containsElement(stakeable, artefactName)))
114+ then throw("You can't stake this artafect")
115+ else if (itemIsInCoolDown(artefactName, toBase58String(assetId)))
116+ then throw("Item can't be staked yet, it's in cooldown")
117+ else {
118+ let invoker = toString(i.caller)
119+ let artefactId = tryGetString(keyArtefactOwner(artefactName, invoker))
120+ if ((artefactId != ""))
121+ then throw(("You are already staking " + artefactName))
122+ else {
123+ let boostDuck = if ((artefactName == "ART-LAKE"))
124+ then invoke(getItemsAddress(), "manipulateBoostAccount", [2, invoker], nil)
125+ else if ((artefactName == "ART-XTREE"))
126+ then invoke(getItemsAddress(), "manipulateBoostAccount", [3, invoker], nil)
127+ else nil
128+ if ((boostDuck == boostDuck))
129+ then ([StringEntry(keyArtefactOwner(artefactName, invoker), toBase58String(assetId))] ++ validPayment)
130+ else throw("Strict value is not equal to itself.")
131+ }
132+ }
133+ else throw("Strict value is not equal to itself.")
134+ }
135+ }
108136
109137
110138
111139 @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- }
140+func unstakeItem (artefactName) = {
141+ let validPayment = checkAdditionalPayment(i.payments[0])
142+ if (!(containsElement(stakeable, artefactName)))
143+ then throw("This artefact doesn't exist")
144+ else {
145+ let invoker = toString(i.caller)
146+ let artefactId = tryGetString(keyArtefactOwner(artefactName, invoker))
147+ if ((artefactId == "ART-XSOCK"))
148+ then throw("You can not unstake ART-XSOCK anymore")
149+ else if ((artefactId == ""))
150+ then throw(("You didnt stake " + artefactName))
151+ else {
152+ let boostDuck = if ((artefactName == "ART-LAKE"))
153+ then invoke(getItemsAddress(), "manipulateBoostAccount", [-2, invoker], nil)
154+ else if ((artefactName == "ART-XTREE"))
155+ then invoke(getItemsAddress(), "manipulateBoostAccount", [-3, invoker], nil)
156+ else nil
157+ if ((boostDuck == boostDuck))
158+ then ([IntegerEntry(keyUnstakeHeight(artefactName, artefactId), height), ScriptTransfer(i.caller, 1, fromBase58String(artefactId)), DeleteEntry(keyArtefactOwner(artefactName, invoker))] ++ validPayment)
159+ else throw("Strict value is not equal to itself.")
160+ }
161+ }
162+ }
132163
133164
134165
135166 @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)), Burn(assetId, 1)]
149- }
150- else throw("Strict value is not equal to itself.")
151- }
167+func oneTimeUseFeed () = {
168+ let validPayment = checkAdditionalPayment(i.payments[1])
169+ if (!(if ((size(i.payments) == 2))
170+ then (i.payments[0].amount == 1)
171+ else false))
172+ then throw("Invalid payment")
173+ else {
174+ let assetId = value(i.payments[0].assetId)
175+ let artefactName = asString(invoke(getItemsAddress(), "checkArtefactDetails", [toBase58String(assetId)], nil))
176+ if ((artefactName == artefactName))
177+ then if ((artefactName != "ART-FEED10"))
178+ then throw("You can't use this artafect to earn feedlimit!")
179+ else {
180+ let invoker = toString(i.caller)
181+ ([IntegerEntry(keyFeedLimit(invoker), (tryGetInteger(keyFeedLimit(invoker)) + 10)), Burn(assetId, 1)] ++ validPayment)
182+ }
183+ else throw("Strict value is not equal to itself.")
184+ }
185+ }
152186
153187
154188 @Verifier(tx)
155189 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
156190

github/deemru/w8io/6500d08 
37.55 ms