2022.05.24 11:21 [3131013] smart account 3PAZv9tgK1PX7dKR7b4kchq5qdpUS3G5sYT > SELF 0.00000000 Waves

{ "type": 13, "id": "HdSeSSS4E7DyFcgZmEP1vipwbVjPWJqR8XAm8qEeCjsp", "fee": 1000000, "feeAssetId": null, "timestamp": 1653380356925, "version": 1, "sender": "3PAZv9tgK1PX7dKR7b4kchq5qdpUS3G5sYT", "senderPublicKey": "2cFG5wZimjVSeCT8ZCRybx7Mzo5tJF879aw2b31uLRmR", "proofs": [ "VBBGhCzTaUXAmawsvttxnPWb68bUzcXFmqXKNa6BvuRfimc13UvhnXx2Jus1SxwxQP2L8tzbJhfdPcE29McdNhs" ], "script": "base64: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AAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAANY29uZmlnQWRkcmVzcwIAAAAKZWJfcmV3YXJkcwIAAAANbm8gZWJfcmV3YXJkcwAAAAALdmlyZXNNaW50ZXIJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAANY29uZmlnQWRkcmVzcwIAAAAMdmlyZXNfbWludGVyAgAAABRtYWluOiBubyB2aXJlc01pbnRlcgIAAAAKYmFkIG1pbnRlcgAAAAAHbWF5YmV2UwkABB0AAAACBQAAAA1jb25maWdBZGRyZXNzAgAAAAx2aXJlc19zdGFrZXIAAAAAAnZTCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIFAAAAB21heWJldlMCAAAAD25vIHZpcmVzX3N0YWtlcgAAAAACZEMJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAANY29uZmlnQWRkcmVzcwIAAAASZGl2aWRlbmRzX2NvbnRyYWN0AgAAABVubyBkaXZpZGVuZHNfY29udHJhY3QCAAAAB2JhZCBkaXYAAAAAA21WRAQAAAAHJG1hdGNoMAkABB0AAAACBQAAAA1jb25maWdBZGRyZXNzAgAAABF2aXJlc19kaXN0cmlidXRvcgMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFkBQAAAAckbWF0Y2gwCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABBQAAAAFkBQAAAAR1bml0AAAAAAJWRAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACBQAAAANtVkQCAAAACG5vIGRpc3RyAAAAAAdsaW1pdGVyBAAAAAckbWF0Y2gwCQAEHQAAAAIFAAAADWNvbmZpZ0FkZHJlc3MCAAAAB2xpbWl0ZXIDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABZAUAAAAHJG1hdGNoMAkBAAAAEUBleHRy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", "chainId": 87, "height": 3131013, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 254LPcSoVzCsLhAh92zAPBquf55W4MnKKRMZifLagwqX Next: BqiakJKL8mHw7XyCPpd8FQwPShrfEKHY1qgDUNRF3KZC Diff:
OldNewDifferences
5656 let aIdS = "assetId"
5757
5858 let configAddress = addressFromStringValue(getStringValue(this, configStore))
59+
60+let locker = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "lp_locker"), "no lp_locker address in config")), "bad lp_locker address in config")
5961
6062 let reservesStr = valueOrErrorMessage(getString(configAddress, "primary_reserves"), "no reserves registered")
6163
190192 0
191193 }
192194 func fold (totals,r) = {
193- let $t050685114 = totals
194- let totalD = $t050685114._1
195- let totalB = $t050685114._2
196- let numberOfBorrows = $t050685114._3
195+ let $t052465292 = totals
196+ let totalD = $t052465292._1
197+ let totalB = $t052465292._2
198+ let numberOfBorrows = $t052465292._3
197199 let rsr = valueOrErrorMessage(addressFromString(r), "rsr bad address")
198200 let cf = collateralFactor(rsr)
199201 let lt = liquidationThreshold(rsr)
200- let $t052685352 = userBalance(rsr, user)
201- let token = $t052685352._1
202- let asset = $t052685352._2
203- let depositUsd = $t052685352._3
204- let debt = $t052685352._4
205- let debtUsd = $t052685352._5
206- let asCollateral = $t052685352._6
202+ let $t054465530 = userBalance(rsr, user)
203+ let token = $t054465530._1
204+ let asset = $t054465530._2
205+ let depositUsd = $t054465530._3
206+ let debt = $t054465530._4
207+ let debtUsd = $t054465530._5
208+ let asCollateral = $t054465530._6
207209 let totalBorrows = (numberOfBorrows + (if ((debt > 0))
208210 then 1
209211 else 0))
240242
241243
242244 func getUserHealth (account) = {
243- let $t061066157 = asInt3(userPower(account))
244- let bp = $t061066157._1
245- let bpu = $t061066157._2
246- let ignore = $t061066157._3
245+ let $t062846335 = asInt3(userPower(account))
246+ let bp = $t062846335._1
247+ let bpu = $t062846335._2
248+ let ignore = $t062846335._3
247249 ((("bp:" + toString(bp)) + ", bpu:") + toString(bpu))
248250 }
249251
250252
251253 func validateAfter (user,op) = {
252- let $t062686299 = userPower(user)
253- let bp = $t062686299._1
254- let bpu = $t062686299._2
254+ let $t064466477 = userPower(user)
255+ let bp = $t064466477._1
256+ let bpu = $t064466477._2
255257 let accHealth = (((bp - bpu) * factorsBase) / bp)
256258 if (if ((bp == 0))
257259 then (bpu == 0)
357359 (claimedTotal + claimedEb)
358360 }
359361 else throw("Strict value is not equal to itself.")
362+ }
363+
364+
365+func claimAllLpRewardsForUser (user) = {
366+ let rewardReserves = split(valueOrErrorMessage(getString(configAddress, "rewardable_reserves"), "no string"), "|")
367+ func fold (acc,rsr) = {
368+ let aTokenId = valueOrErrorMessage(getString(addressFromStringValue(rsr), aTIdS), "no aTokenId in reserve")
369+ let claimed = asInt(invoke(locker, "claimLpRewardFor", [user, aTokenId, -1], nil))
370+ if ((claimed == claimed))
371+ then (acc + claimed)
372+ else throw("Strict value is not equal to itself.")
373+ }
374+
375+ let claimedTotal = {
376+ let $l = rewardReserves
377+ let $s = size($l)
378+ let $acc0 = 0
379+ func $f0_1 ($a,$i) = if (($i >= $s))
380+ then $a
381+ else fold($a, $l[$i])
382+
383+ func $f0_2 ($a,$i) = if (($i >= $s))
384+ then $a
385+ else throw("List size exceeds 7")
386+
387+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7)
388+ }
389+ claimedTotal
360390 }
361391
362392
501531 @Callable(i)
502532 func repayWithAtoken () = {
503533 let user = toString(i.caller)
504- let checks = ensureNoProtected(user)
505- if ((checks == checks))
534+ let aTokenId = toBase58String(valueOrErrorMessage(i.payments[0].assetId, "bad assetId: waves not allowed"))
535+ let t = reserveBy(aTIdS, aTokenId)
536+ let sh = sR(toString(t))
537+ if ((sh == sh))
506538 then {
507- let aTokenId = toBase58String(valueOrErrorMessage(i.payments[0].assetId, "bad assetId: waves not allowed"))
508- let t = reserveBy(aTIdS, aTokenId)
509- let sh = sR(toString(t))
510- if ((sh == sh))
539+ let amt = asInt(invoke(t, "replenishForRepayWithAtokenFor", [user], i.payments))
540+ if ((amt == amt))
511541 then {
512- let amt = asInt(invoke(t, "replenishForRepayWithAtokenFor", [user], i.payments))
513- if ((amt == amt))
514- then {
515- let c = asInt(invoke(t, "collapseForAmount", [user, amt], nil))
516- if ((c == c))
517- then if ((amt > c))
518- then throw("repaying too much")
519- else {
520- let pRw = uS(toString(t), "borrow", user, -(c), -(c))
521- if ((pRw == pRw))
522- then {
523- let pRw2 = uS(toString(t), "deposit", user, (amt - c), -(c))
524- if ((pRw2 == pRw2))
525- then nil
526- else throw("Strict value is not equal to itself.")
527- }
542+ let c = asInt(invoke(t, "collapseForAmount", [user, amt], nil))
543+ if ((c == c))
544+ then if ((amt > c))
545+ then throw("repaying too much")
546+ else {
547+ let pRw = uS(toString(t), "borrow", user, -(c), -(c))
548+ if ((pRw == pRw))
549+ then {
550+ let pRw2 = uS(toString(t), "deposit", user, (amt - c), -(c))
551+ if ((pRw2 == pRw2))
552+ then nil
528553 else throw("Strict value is not equal to itself.")
529554 }
530- else throw("Strict value is not equal to itself.")
531- }
555+ else throw("Strict value is not equal to itself.")
556+ }
532557 else throw("Strict value is not equal to itself.")
533558 }
534559 else throw("Strict value is not equal to itself.")
770795 let cr = claimAllRewardsForUser(user)
771796 if ((cr == cr))
772797 then {
773- let lA = if (unstakeLegacy)
774- then asInt(invoke(vS, "unstakeAllViresFrom", [user], nil))
775- else 0
776- if ((lA == lA))
777- then lockOrPayout(i.caller, (cr + lA), lock)
798+ let crLp = claimAllLpRewardsForUser(user)
799+ if ((crLp == crLp))
800+ then {
801+ let lA = if (unstakeLegacy)
802+ then asInt(invoke(vS, "unstakeAllViresFrom", [user], nil))
803+ else 0
804+ if ((lA == lA))
805+ then lockOrPayout(i.caller, ((cr + crLp) + lA), lock)
806+ else throw("Strict value is not equal to itself.")
807+ }
778808 else throw("Strict value is not equal to itself.")
779809 }
780810 else throw("Strict value is not equal to itself.")
866896 }
867897
868898
899+
900+@Callable(i)
901+func lockSupply (reserve,period) = {
902+ let rsr = vlR(reserve)
903+ let user = toString(i.caller)
904+ let checks = ensureNoProtected(user)
905+ if ((checks == checks))
906+ then {
907+ let aTokenId = value(assetStrToId(valueOrErrorMessage(getString(rsr, "aTokenId"), "no aTokenId in reserve")))
908+ let migration = if ((size(i.payments) == 0))
909+ then unit
910+ else if ((i.payments[0].assetId == aTokenId))
911+ then unit
912+ else if ((i.payments[0].assetId == assetStrToId(valueOrErrorMessage(getString(rsr, "assetId"), "no assetId in reserve"))))
913+ then {
914+ let sh = sR(reserve)
915+ if ((sh == sh))
916+ then {
917+ let action = invoke(rsr, "depositFor", [user, true], i.payments)
918+ if ((action == action))
919+ then {
920+ let amt = i.payments[0].amount
921+ let pRw = uS(reserve, "deposit", user, amt, amt)
922+ if ((pRw == pRw))
923+ then unit
924+ else throw("Strict value is not equal to itself.")
925+ }
926+ else throw("Strict value is not equal to itself.")
927+ }
928+ else throw("Strict value is not equal to itself.")
929+ }
930+ else throw("bad asset attached")
931+ if ((migration == migration))
932+ then {
933+ let mint = {
934+ let sh = sR(reserve)
935+ if ((sh == sh))
936+ then {
937+ let actual = asInt(invoke(rsr, "mintAtokenForTo", [user, -1, toString(this)], nil))
938+ if ((actual == actual))
939+ then {
940+ let pRw = uS(toString(rsr), "deposit", user, -(actual), 0)
941+ if ((pRw == pRw))
942+ then validateAfter(user, "lock-minting")
943+ else throw("Strict value is not equal to itself.")
944+ }
945+ else throw("Strict value is not equal to itself.")
946+ }
947+ else throw("Strict value is not equal to itself.")
948+ }
949+ if ((mint == mint))
950+ then {
951+ let balance = assetBalance(this, aTokenId)
952+ let r = invoke(locker, "lockLP", [user, period], [AttachedPayment(aTokenId, balance)])
953+ if ((r == r))
954+ then $Tuple2(nil, balance)
955+ else throw("Strict value is not equal to itself.")
956+ }
957+ else throw("Strict value is not equal to itself.")
958+ }
959+ else throw("Strict value is not equal to itself.")
960+ }
961+ else throw("Strict value is not equal to itself.")
962+ }
963+
964+
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let factorsBase = 1000
55
66 func fCi (value,numerator,denominator) = {
77 let cand = fraction(value, numerator, denominator)
88 let D = 3037000499
99 let exact = ((((cand % D) * (denominator % D)) % D) == (((value % D) * (numerator % D)) % D))
1010 if (exact)
1111 then cand
1212 else (cand + 1)
1313 }
1414
1515
1616 func assetStrToId (assetId) = if ((assetId == "WAVES"))
1717 then unit
1818 else fromBase58String(assetId)
1919
2020
2121 func writeConstString (key,value) = if (!(isDefined(getString(this, key))))
2222 then StringEntry(key, value)
2323 else throw(("already initialized: " + key))
2424
2525
2626 func asInt (value) = match value {
2727 case int: Int =>
2828 int
2929 case _ =>
3030 throw("1")
3131 }
3232
3333
3434 func asInt3 (value) = match value {
3535 case x: (Int, Int, Int) =>
3636 x
3737 case t =>
3838 throw("2")
3939 }
4040
4141
4242 func asUserBalanceData (value) = match value {
4343 case x: (Int, Int, Int, Int, Int, Boolean) =>
4444 x
4545 case t =>
4646 throw("3")
4747 }
4848
4949
5050 let configStore = "config"
5151
5252 let reservesStore = "reserves"
5353
5454 let aTIdS = "aTokenId"
5555
5656 let aIdS = "assetId"
5757
5858 let configAddress = addressFromStringValue(getStringValue(this, configStore))
59+
60+let locker = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "lp_locker"), "no lp_locker address in config")), "bad lp_locker address in config")
5961
6062 let reservesStr = valueOrErrorMessage(getString(configAddress, "primary_reserves"), "no reserves registered")
6163
6264 let reserves = split(reservesStr, "|")
6365
6466 let ebR = addressFromStringValue(valueOrErrorMessage(getString(configAddress, "eb_rewards"), "no eb_rewards"))
6567
6668 let viresMinter = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "vires_minter"), "main: no viresMinter")), "bad minter")
6769
6870 let maybevS = getString(configAddress, "vires_staker")
6971
7072 let vS = addressFromStringValue(valueOrErrorMessage(maybevS, "no vires_staker"))
7173
7274 let dC = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "dividends_contract"), "no dividends_contract")), "bad div")
7375
7476 let mVD = match getString(configAddress, "vires_distributor") {
7577 case d: String =>
7678 addressFromStringValue(d)
7779 case _ =>
7880 unit
7981 }
8082
8183 let VD = valueOrErrorMessage(mVD, "no distr")
8284
8385 let limiter = match getString(configAddress, "limiter") {
8486 case d: String =>
8587 addressFromStringValue(d)
8688 case _ =>
8789 unit
8890 }
8991
9092 let maybeViresAssetId = getString(viresMinter, aIdS)
9193
9294 let viresAssetId = valueOrErrorMessage(fromBase58String(valueOrErrorMessage(maybeViresAssetId, "no vires id")), "invalid vires id")
9395
9496 func viresPayment (i) = if ((size(i.payments) == 0))
9597 then 0
9698 else if ((i.payments[0].assetId != viresAssetId))
9799 then throw("not vires")
98100 else i.payments[0].amount
99101
100102
101103 func assetIdOfReserve (rsr) = valueOrErrorMessage(getString(rsr, aIdS), "no assetId in rsr")
102104
103105
104106 func collateralFactor (rsr) = valueOrErrorMessage(getInteger(configAddress, (assetIdOfReserve(rsr) + "_CollateralFactor")), "no 1")
105107
106108
107109 func liquidationThreshold (rsr) = valueOrErrorMessage(getInteger(configAddress, (assetIdOfReserve(rsr) + "_LiquidationThreshold")), "no 2")
108110
109111
110112 let accountHealthThreshold = valueOrErrorMessage(getInteger(configAddress, "account_health_threshold"), "no 4")
111113
112114 let accountHealthOverlap = valueOrErrorMessage(getInteger(configAddress, "account_health_overlap"), "no 5")
113115
114116 let liquidators = valueOrElse(getString(configAddress, "liquidators"), "")
115117
116118 func reserveBy (store,value) = {
117119 func fold (a,r) = match a {
118120 case found: Address =>
119121 found
120122 case _ =>
121123 let rsr = valueOrErrorMessage(addressFromString(r), "rsr bad address")
122124 if ((valueOrErrorMessage(getString(rsr, store), ("rsr has no " + store)) == value))
123125 then rsr
124126 else unit
125127 }
126128
127129 match let $l = reserves
128130 let $s = size($l)
129131 let $acc0 = unit
130132 func $f0_1 ($a,$i) = if (($i >= $s))
131133 then $a
132134 else fold($a, $l[$i])
133135
134136 func $f0_2 ($a,$i) = if (($i >= $s))
135137 then $a
136138 else throw("List size exceeds 7")
137139
138140 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7) {
139141 case found: Address =>
140142 found
141143 case _ =>
142144 throw(("unknown " + store))
143145 }
144146 }
145147
146148
147149 func vlR (r) = if (contains(reservesStr, r))
148150 then valueOrErrorMessage(addressFromString(r), "main: bad rsr")
149151 else throw(("unknown rsr:" + r))
150152
151153
152154 func userBalance (rsr,user) = asUserBalanceData(invoke(rsr, "userBalance", [user], nil))
153155
154156
155157 let maybeProtected = match getString(configAddress, "protected_reserve") {
156158 case pds: String =>
157159 valueOrErrorMessage(addressFromString(pds), "bad protected")
158160 case _ =>
159161 unit
160162 }
161163
162164 let protectedReserve = valueOrErrorMessage(maybeProtected, "no protected rsr")
163165
164166 func ensureNoProtected (user) = {
165167 let has = match maybeProtected {
166168 case pa: Address =>
167169 valueOrElse(getBoolean(pa, ("protected_collateral_" + user)), false)
168170 case _ =>
169171 false
170172 }
171173 if (has)
172174 then throw("disallowed")
173175 else unit
174176 }
175177
176178
177179 func ensureLimit (action,rsr,user,amount) = match limiter {
178180 case l: Address =>
179181 asInt(invoke(l, "validateLimit", [action, toString(rsr), user, amount], nil))
180182 case _ =>
181183 true
182184 }
183185
184186
185187 func userPower (user) = {
186188 let protectedDeposit = match maybeProtected {
187189 case pa: Address =>
188190 asInt(invoke(pa, "borrowPower", [user], nil))
189191 case _ =>
190192 0
191193 }
192194 func fold (totals,r) = {
193- let $t050685114 = totals
194- let totalD = $t050685114._1
195- let totalB = $t050685114._2
196- let numberOfBorrows = $t050685114._3
195+ let $t052465292 = totals
196+ let totalD = $t052465292._1
197+ let totalB = $t052465292._2
198+ let numberOfBorrows = $t052465292._3
197199 let rsr = valueOrErrorMessage(addressFromString(r), "rsr bad address")
198200 let cf = collateralFactor(rsr)
199201 let lt = liquidationThreshold(rsr)
200- let $t052685352 = userBalance(rsr, user)
201- let token = $t052685352._1
202- let asset = $t052685352._2
203- let depositUsd = $t052685352._3
204- let debt = $t052685352._4
205- let debtUsd = $t052685352._5
206- let asCollateral = $t052685352._6
202+ let $t054465530 = userBalance(rsr, user)
203+ let token = $t054465530._1
204+ let asset = $t054465530._2
205+ let depositUsd = $t054465530._3
206+ let debt = $t054465530._4
207+ let debtUsd = $t054465530._5
208+ let asCollateral = $t054465530._6
207209 let totalBorrows = (numberOfBorrows + (if ((debt > 0))
208210 then 1
209211 else 0))
210212 let effectiveDepositUsd = if (asCollateral)
211213 then depositUsd
212214 else 0
213215 let overlapUsd = min([debtUsd, effectiveDepositUsd])
214216 let overlapCharge = fCi(overlapUsd, accountHealthOverlap, factorsBase)
215217 if ((debtUsd > effectiveDepositUsd))
216218 then $Tuple3(totalD, ((totalB + fraction((debtUsd - effectiveDepositUsd), factorsBase, lt)) + overlapCharge), totalBorrows)
217219 else $Tuple3((totalD + fraction((effectiveDepositUsd - debtUsd), cf, factorsBase)), (totalB + overlapCharge), totalBorrows)
218220 }
219221
220222 let r = {
221223 let $l = reserves
222224 let $s = size($l)
223225 let $acc0 = $Tuple3(protectedDeposit, 0, 0)
224226 func $f0_1 ($a,$i) = if (($i >= $s))
225227 then $a
226228 else fold($a, $l[$i])
227229
228230 func $f0_2 ($a,$i) = if (($i >= $s))
229231 then $a
230232 else throw("List size exceeds 7")
231233
232234 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7)
233235 }
234236 if (if ((protectedDeposit > 0))
235237 then (r._3 > 2)
236238 else false)
237239 then throw("can't have more than 2 borrows")
238240 else r
239241 }
240242
241243
242244 func getUserHealth (account) = {
243- let $t061066157 = asInt3(userPower(account))
244- let bp = $t061066157._1
245- let bpu = $t061066157._2
246- let ignore = $t061066157._3
245+ let $t062846335 = asInt3(userPower(account))
246+ let bp = $t062846335._1
247+ let bpu = $t062846335._2
248+ let ignore = $t062846335._3
247249 ((("bp:" + toString(bp)) + ", bpu:") + toString(bpu))
248250 }
249251
250252
251253 func validateAfter (user,op) = {
252- let $t062686299 = userPower(user)
253- let bp = $t062686299._1
254- let bpu = $t062686299._2
254+ let $t064466477 = userPower(user)
255+ let bp = $t064466477._1
256+ let bpu = $t064466477._2
255257 let accHealth = (((bp - bpu) * factorsBase) / bp)
256258 if (if ((bp == 0))
257259 then (bpu == 0)
258260 else false)
259261 then nil
260262 else if (if ((bp == 0))
261263 then (bpu > 0)
262264 else false)
263265 then throw(((op + ": breaching liquidation threshold(bp=0, bpu=") + toString(bpu)))
264266 else if ((accountHealthThreshold > accHealth))
265267 then throw((((((((op + ": breaching liquidation threshold(bp=") + toString(bp)) + ", bpu=") + toString(bpu)) + ", health=") + toString(accHealth)) + ")"))
266268 else nil
267269 }
268270
269271
270272 func uS (rsr,action,user,userChange,streamChange) = match mVD {
271273 case a: Address =>
272274 invoke(a, "onAction", [rsr, action, user, userChange, streamChange], nil)
273275 case _ =>
274276 unit
275277 }
276278
277279
278280 func moveStream (rsr,action,from,string,amt) = match mVD {
279281 case a: Address =>
280282 invoke(a, "move", [rsr, action, from, string, amt], nil)
281283 case _ =>
282284 unit
283285 }
284286
285287
286288 func sR (rsr) = match mVD {
287289 case a: Address =>
288290 invoke(a, "syncHeight", [rsr], nil)
289291 case _ =>
290292 unit
291293 }
292294
293295
294296 func lockOrPayout (recipient,amt,lock) = if (!(lock))
295297 then [ScriptTransfer(recipient, amt, viresAssetId)]
296298 else {
297299 let doLock = invoke(dC, "lockFor", [toString(recipient), 1], [AttachedPayment(viresAssetId, amt)])
298300 if ((doLock == doLock))
299301 then nil
300302 else throw("Strict value is not equal to itself.")
301303 }
302304
303305
304306 func doDeposit (i,rsr,asCol) = {
305307 let user = toString(i.caller)
306308 let checks = ensureNoProtected(user)
307309 if ((checks == checks))
308310 then {
309311 let sh = sR(rsr)
310312 if ((sh == sh))
311313 then {
312314 let action = invoke(vlR(rsr), "depositFor", [user, asCol], i.payments)
313315 if ((action == action))
314316 then {
315317 let amt = i.payments[0].amount
316318 let pRw = uS(rsr, "deposit", user, amt, amt)
317319 if ((pRw == pRw))
318320 then if (!(asCol))
319321 then validateAfter(user, "depositing")
320322 else nil
321323 else throw("Strict value is not equal to itself.")
322324 }
323325 else throw("Strict value is not equal to itself.")
324326 }
325327 else throw("Strict value is not equal to itself.")
326328 }
327329 else throw("Strict value is not equal to itself.")
328330 }
329331
330332
331333 func claimAllRewardsForUser (user) = {
332334 let claimedEb = asInt(invoke(ebR, "claimEbRewardFor", [user, -1], nil))
333335 if ((claimedEb == claimedEb))
334336 then {
335337 let rewardReserves = split(valueOrErrorMessage(getString(configAddress, "rewardable_reserves"), "no string"), "|")
336338 func fold (acc,rsr) = {
337339 let claimed = asInt(invoke(VD, "claimRewardFor", [rsr, user, -1], nil))
338340 if ((claimed == claimed))
339341 then (acc + claimed)
340342 else throw("Strict value is not equal to itself.")
341343 }
342344
343345 let claimedTotal = {
344346 let $l = rewardReserves
345347 let $s = size($l)
346348 let $acc0 = 0
347349 func $f0_1 ($a,$i) = if (($i >= $s))
348350 then $a
349351 else fold($a, $l[$i])
350352
351353 func $f0_2 ($a,$i) = if (($i >= $s))
352354 then $a
353355 else throw("List size exceeds 7")
354356
355357 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7)
356358 }
357359 (claimedTotal + claimedEb)
358360 }
359361 else throw("Strict value is not equal to itself.")
362+ }
363+
364+
365+func claimAllLpRewardsForUser (user) = {
366+ let rewardReserves = split(valueOrErrorMessage(getString(configAddress, "rewardable_reserves"), "no string"), "|")
367+ func fold (acc,rsr) = {
368+ let aTokenId = valueOrErrorMessage(getString(addressFromStringValue(rsr), aTIdS), "no aTokenId in reserve")
369+ let claimed = asInt(invoke(locker, "claimLpRewardFor", [user, aTokenId, -1], nil))
370+ if ((claimed == claimed))
371+ then (acc + claimed)
372+ else throw("Strict value is not equal to itself.")
373+ }
374+
375+ let claimedTotal = {
376+ let $l = rewardReserves
377+ let $s = size($l)
378+ let $acc0 = 0
379+ func $f0_1 ($a,$i) = if (($i >= $s))
380+ then $a
381+ else fold($a, $l[$i])
382+
383+ func $f0_2 ($a,$i) = if (($i >= $s))
384+ then $a
385+ else throw("List size exceeds 7")
386+
387+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7)
388+ }
389+ claimedTotal
360390 }
361391
362392
363393 func moveCollateral (addr,assetStr,rsr,reserveStr) = {
364394 let amt = asInt(invoke(protectedReserve, "withdrawToMain", [addr, assetStr], nil))
365395 if ((amt == amt))
366396 then {
367397 let assetId = if ((assetStr == "WAVES"))
368398 then unit
369399 else fromBase58String(assetStr)
370400 let dep = invoke(rsr, "depositFor", [addr, true], [AttachedPayment(assetId, amt)])
371401 if ((dep == dep))
372402 then {
373403 let prop = uS(reserveStr, "deposit", addr, amt, amt)
374404 if ((prop == prop))
375405 then unit
376406 else throw("Strict value is not equal to itself.")
377407 }
378408 else throw("Strict value is not equal to itself.")
379409 }
380410 else throw("Strict value is not equal to itself.")
381411 }
382412
383413
384414 func spfr () = invoke(dC, "shareProfitFromReserves", nil, nil)
385415
386416
387417 func wdInternal (user,rsr,amt,op) = {
388418 let sh = sR(toString(rsr))
389419 if ((sh == sh))
390420 then {
391421 let withdrawnAmount = asInt(invoke(rsr, op, [user, amt], nil))
392422 if ((withdrawnAmount == withdrawnAmount))
393423 then {
394424 let pRw = uS(toString(rsr), "deposit", user, -(withdrawnAmount), -(withdrawnAmount))
395425 if ((pRw == pRw))
396426 then {
397427 let e = ensureLimit("withdraw", rsr, user, withdrawnAmount)
398428 if ((e == e))
399429 then withdrawnAmount
400430 else throw("Strict value is not equal to itself.")
401431 }
402432 else throw("Strict value is not equal to itself.")
403433 }
404434 else throw("Strict value is not equal to itself.")
405435 }
406436 else throw("Strict value is not equal to itself.")
407437 }
408438
409439
410440 @Callable(i)
411441 func initialize (ca) = [writeConstString(configStore, ca)]
412442
413443
414444
415445 @Callable(i)
416446 func deposit (rsr,asCol) = doDeposit(i, rsr, asCol)
417447
418448
419449
420450 @Callable(i)
421451 func depositRef (rsr,asCol,ref) = doDeposit(i, rsr, asCol)
422452
423453
424454
425455 @Callable(i)
426456 func repay (rsr) = {
427457 let user = toString(i.caller)
428458 let sh = sR(rsr)
429459 if ((sh == sh))
430460 then {
431461 let repaid = asInt(invoke(vlR(rsr), "repayFor", [user], i.payments))
432462 if ((repaid == repaid))
433463 then {
434464 let pRw = uS(rsr, "borrow", user, -(repaid), -(repaid))
435465 if ((pRw == pRw))
436466 then nil
437467 else throw("Strict value is not equal to itself.")
438468 }
439469 else throw("Strict value is not equal to itself.")
440470 }
441471 else throw("Strict value is not equal to itself.")
442472 }
443473
444474
445475
446476 @Callable(i)
447477 func mintAtoken (aTokenId,amt) = {
448478 let user = toString(i.caller)
449479 let t = reserveBy(aTIdS, aTokenId)
450480 let sh = sR(toString(t))
451481 if ((sh == sh))
452482 then {
453483 let actual = asInt(invoke(t, "mintAtokenFor", [user, amt], nil))
454484 if ((actual == actual))
455485 then {
456486 let pRw = uS(toString(t), "deposit", user, -(actual), 0)
457487 if ((pRw == pRw))
458488 then validateAfter(user, "minting")
459489 else throw("Strict value is not equal to itself.")
460490 }
461491 else throw("Strict value is not equal to itself.")
462492 }
463493 else throw("Strict value is not equal to itself.")
464494 }
465495
466496
467497
468498 @Callable(i)
469499 func replenishWithAtoken () = {
470500 let user = toString(i.caller)
471501 let checks = ensureNoProtected(user)
472502 if ((checks == checks))
473503 then {
474504 let aTokenId = toBase58String(valueOrErrorMessage(i.payments[0].assetId, "bad assetId(w)"))
475505 let rsr = reserveBy(aTIdS, aTokenId)
476506 let sh = sR(toString(rsr))
477507 if ((sh == sh))
478508 then {
479509 let amt = asInt(invoke(rsr, "replenishWithAtokenFor", [user], i.payments))
480510 if ((amt == amt))
481511 then {
482512 let pRw = uS(toString(rsr), "deposit", user, amt, 0)
483513 if ((pRw == pRw))
484514 then {
485515 let e = ensureLimit("import", rsr, user, amt)
486516 if ((e == e))
487517 then nil
488518 else throw("Strict value is not equal to itself.")
489519 }
490520 else throw("Strict value is not equal to itself.")
491521 }
492522 else throw("Strict value is not equal to itself.")
493523 }
494524 else throw("Strict value is not equal to itself.")
495525 }
496526 else throw("Strict value is not equal to itself.")
497527 }
498528
499529
500530
501531 @Callable(i)
502532 func repayWithAtoken () = {
503533 let user = toString(i.caller)
504- let checks = ensureNoProtected(user)
505- if ((checks == checks))
534+ let aTokenId = toBase58String(valueOrErrorMessage(i.payments[0].assetId, "bad assetId: waves not allowed"))
535+ let t = reserveBy(aTIdS, aTokenId)
536+ let sh = sR(toString(t))
537+ if ((sh == sh))
506538 then {
507- let aTokenId = toBase58String(valueOrErrorMessage(i.payments[0].assetId, "bad assetId: waves not allowed"))
508- let t = reserveBy(aTIdS, aTokenId)
509- let sh = sR(toString(t))
510- if ((sh == sh))
539+ let amt = asInt(invoke(t, "replenishForRepayWithAtokenFor", [user], i.payments))
540+ if ((amt == amt))
511541 then {
512- let amt = asInt(invoke(t, "replenishForRepayWithAtokenFor", [user], i.payments))
513- if ((amt == amt))
514- then {
515- let c = asInt(invoke(t, "collapseForAmount", [user, amt], nil))
516- if ((c == c))
517- then if ((amt > c))
518- then throw("repaying too much")
519- else {
520- let pRw = uS(toString(t), "borrow", user, -(c), -(c))
521- if ((pRw == pRw))
522- then {
523- let pRw2 = uS(toString(t), "deposit", user, (amt - c), -(c))
524- if ((pRw2 == pRw2))
525- then nil
526- else throw("Strict value is not equal to itself.")
527- }
542+ let c = asInt(invoke(t, "collapseForAmount", [user, amt], nil))
543+ if ((c == c))
544+ then if ((amt > c))
545+ then throw("repaying too much")
546+ else {
547+ let pRw = uS(toString(t), "borrow", user, -(c), -(c))
548+ if ((pRw == pRw))
549+ then {
550+ let pRw2 = uS(toString(t), "deposit", user, (amt - c), -(c))
551+ if ((pRw2 == pRw2))
552+ then nil
528553 else throw("Strict value is not equal to itself.")
529554 }
530- else throw("Strict value is not equal to itself.")
531- }
555+ else throw("Strict value is not equal to itself.")
556+ }
532557 else throw("Strict value is not equal to itself.")
533558 }
534559 else throw("Strict value is not equal to itself.")
535560 }
536561 else throw("Strict value is not equal to itself.")
537562 }
538563
539564
540565
541566 @Callable(i)
542567 func redeemAtokens () = {
543568 let user = toString(i.caller)
544569 let aTokenId = toBase58String(valueOrErrorMessage(i.payments[0].assetId, "bad assetId: WAVES"))
545570 let rsr = reserveBy(aTIdS, aTokenId)
546571 let sh = sR(toString(rsr))
547572 if ((sh == sh))
548573 then {
549574 let amt = asInt(invoke(rsr, "redeemAtokensFor", [user], i.payments))
550575 if ((amt == amt))
551576 then {
552577 let pRw = uS(toString(rsr), "deposit", user, 0, -(amt))
553578 if ((pRw == pRw))
554579 then {
555580 let e = ensureLimit("redeem", rsr, user, amt)
556581 if ((e == e))
557582 then nil
558583 else throw("Strict value is not equal to itself.")
559584 }
560585 else throw("Strict value is not equal to itself.")
561586 }
562587 else throw("Strict value is not equal to itself.")
563588 }
564589 else throw("Strict value is not equal to itself.")
565590 }
566591
567592
568593
569594 @Callable(i)
570595 func withdraw (assetId,amt) = {
571596 let user = toString(i.caller)
572597 let result = asInt(wdInternal(user, reserveBy(aIdS, assetId), amt, "withdrawFor"))
573598 if ((result == result))
574599 then $Tuple2(validateAfter(user, "withdrawing"), result)
575600 else throw("Strict value is not equal to itself.")
576601 }
577602
578603
579604
580605 @Callable(i)
581606 func withdraw2 (rsr,amt) = {
582607 let user = toString(i.caller)
583608 let sh = sR(rsr)
584609 if ((sh == sh))
585610 then {
586611 let rsrAddr = vlR(rsr)
587612 let actual = asInt(invoke(rsrAddr, "withdrawFor", [user, amt], nil))
588613 if ((actual == actual))
589614 then {
590615 let pRw = uS(rsr, "deposit", user, -(actual), -(actual))
591616 if ((pRw == pRw))
592617 then {
593618 let e = ensureLimit("withdraw", rsrAddr, user, actual)
594619 if ((e == e))
595620 then if (contains(liquidators, user))
596621 then nil
597622 else validateAfter(user, "withdrawing2")
598623 else throw("Strict value is not equal to itself.")
599624 }
600625 else throw("Strict value is not equal to itself.")
601626 }
602627 else throw("Strict value is not equal to itself.")
603628 }
604629 else throw("Strict value is not equal to itself.")
605630 }
606631
607632
608633
609634 @Callable(i)
610635 func protectCollateral (rsr) = {
611636 let user = toString(i.caller)
612637 let r = vlR(rsr)
613638 let amt = asInt(wdInternal(user, r, -1, "withdrawToMain"))
614639 if ((amt == amt))
615640 then {
616641 let assetId = assetStrToId(getStringValue(r, aIdS))
617642 let p = invoke(protectedReserve, "supplyFor", [user], [AttachedPayment(assetId, amt)])
618643 if ((p == p))
619644 then $Tuple2(validateAfter(user, "protecting"), amt)
620645 else throw("Strict value is not equal to itself.")
621646 }
622647 else throw("Strict value is not equal to itself.")
623648 }
624649
625650
626651
627652 @Callable(i)
628653 func withdrawProtectedCollateral (assetId,amt) = {
629654 let user = toString(i.caller)
630655 let a = asInt(invoke(valueOrErrorMessage(protectedReserve, "no protectedReserve"), "withdrawFor", [user, assetId, amt], nil))
631656 if ((a == a))
632657 then validateAfter(user, "withdrawing protected")
633658 else throw("Strict value is not equal to itself.")
634659 }
635660
636661
637662
638663 @Callable(i)
639664 func normalizeCollateral (rsr) = {
640665 let addr = toString(i.caller)
641666 let rA = vlR(rsr)
642667 if ((rA == rA))
643668 then {
644669 let sh = sR(rsr)
645670 if ((sh == sh))
646671 then {
647672 let assetIdStr = valueOrErrorMessage(getString(rA, aIdS), ("no assetId in rsv: " + rsr))
648673 let mc = moveCollateral(addr, assetIdStr, rA, rsr)
649674 if ((mc == mc))
650675 then nil
651676 else throw("Strict value is not equal to itself.")
652677 }
653678 else throw("Strict value is not equal to itself.")
654679 }
655680 else throw("Strict value is not equal to itself.")
656681 }
657682
658683
659684
660685 @Callable(i)
661686 func borrow (assetId,amt) = {
662687 let user = toString(i.caller)
663688 let rsr = reserveBy(aIdS, assetId)
664689 let sh = sR(toString(rsr))
665690 if ((sh == sh))
666691 then {
667692 let a = invoke(rsr, "borrowFor", [user, amt], nil)
668693 if ((a == a))
669694 then {
670695 let pRw = uS(toString(rsr), "borrow", user, amt, amt)
671696 if ((pRw == pRw))
672697 then {
673698 let e = ensureLimit("borrow", rsr, user, amt)
674699 if ((e == e))
675700 then validateAfter(user, "borrowing")
676701 else throw("Strict value is not equal to itself.")
677702 }
678703 else throw("Strict value is not equal to itself.")
679704 }
680705 else throw("Strict value is not equal to itself.")
681706 }
682707 else throw("Strict value is not equal to itself.")
683708 }
684709
685710
686711
687712 @Callable(i)
688713 func borrow2 (rsr,amt) = {
689714 let user = toString(i.caller)
690715 let r = vlR(rsr)
691716 let sh = sR(rsr)
692717 if ((sh == sh))
693718 then {
694719 let a = invoke(r, "borrowFor", [user, amt], nil)
695720 if ((a == a))
696721 then {
697722 let pRw = uS(rsr, "borrow", user, amt, amt)
698723 if ((pRw == pRw))
699724 then {
700725 let e = ensureLimit("borrow", r, user, amt)
701726 if ((e == e))
702727 then validateAfter(user, "borrowing")
703728 else throw("Strict value is not equal to itself.")
704729 }
705730 else throw("Strict value is not equal to itself.")
706731 }
707732 else throw("Strict value is not equal to itself.")
708733 }
709734 else throw("Strict value is not equal to itself.")
710735 }
711736
712737
713738
714739 @Callable(i)
715740 func collapse (rsr,amt) = {
716741 let user = toString(i.caller)
717742 let sh = sR(rsr)
718743 if ((sh == sh))
719744 then {
720745 let c = asInt(invoke(vlR(rsr), "collapseForAmount", [user, amt], nil))
721746 if ((c == c))
722747 then {
723748 let pRw = uS(rsr, "borrow", user, -(c), -(c))
724749 if ((pRw == pRw))
725750 then {
726751 let pRw2 = uS(rsr, "deposit", user, -(c), -(c))
727752 if ((pRw2 == pRw2))
728753 then nil
729754 else throw("Strict value is not equal to itself.")
730755 }
731756 else throw("Strict value is not equal to itself.")
732757 }
733758 else throw("Strict value is not equal to itself.")
734759 }
735760 else throw("Strict value is not equal to itself.")
736761 }
737762
738763
739764
740765 @Callable(i)
741766 func claimEbReward2 (amt,lock) = {
742767 let user = toString(i.caller)
743768 let c = asInt(invoke(ebR, "claimEbRewardFor", [user, amt], nil))
744769 if ((c == c))
745770 then lockOrPayout(i.caller, c, lock)
746771 else throw("Strict value is not equal to itself.")
747772 }
748773
749774
750775
751776 @Callable(i)
752777 func claimReward2 (rsr,amt,lock) = {
753778 let v = vlR(rsr)
754779 if ((v == v))
755780 then {
756781 let user = toString(i.caller)
757782 let c = asInt(invoke(VD, "claimRewardFor", [rsr, user, amt], nil))
758783 if ((c == c))
759784 then lockOrPayout(i.caller, c, lock)
760785 else throw("Strict value is not equal to itself.")
761786 }
762787 else throw("Strict value is not equal to itself.")
763788 }
764789
765790
766791
767792 @Callable(i)
768793 func claimAllRewardsAndAllEbAvailable2 (lock,unstakeLegacy) = {
769794 let user = toString(i.caller)
770795 let cr = claimAllRewardsForUser(user)
771796 if ((cr == cr))
772797 then {
773- let lA = if (unstakeLegacy)
774- then asInt(invoke(vS, "unstakeAllViresFrom", [user], nil))
775- else 0
776- if ((lA == lA))
777- then lockOrPayout(i.caller, (cr + lA), lock)
798+ let crLp = claimAllLpRewardsForUser(user)
799+ if ((crLp == crLp))
800+ then {
801+ let lA = if (unstakeLegacy)
802+ then asInt(invoke(vS, "unstakeAllViresFrom", [user], nil))
803+ else 0
804+ if ((lA == lA))
805+ then lockOrPayout(i.caller, ((cr + crLp) + lA), lock)
806+ else throw("Strict value is not equal to itself.")
807+ }
778808 else throw("Strict value is not equal to itself.")
779809 }
780810 else throw("Strict value is not equal to itself.")
781811 }
782812
783813
784814
785815 @Callable(i)
786816 func disableUseAsCollateral (rsr) = {
787817 let user = toString(i.caller)
788818 let d = invoke(vlR(rsr), "disableUseAsCollateralFor", [user], nil)
789819 if ((d == d))
790820 then validateAfter(user, "changing collateral status")
791821 else throw("Strict value is not equal to itself.")
792822 }
793823
794824
795825
796826 @Callable(i)
797827 func lockVires (factor,migrate) = {
798828 let user = toString(i.caller)
799829 let a = spfr()
800830 if ((a == a))
801831 then {
802832 let migrateAmount = if (migrate)
803833 then asInt(invoke(vS, "unstakeAllViresFrom", [user], nil))
804834 else 0
805835 let total = (migrateAmount + viresPayment(i))
806836 let l = invoke(dC, "lockFor", [user, factor], if ((total == 0))
807837 then nil
808838 else [AttachedPayment(viresAssetId, total)])
809839 if ((l == l))
810840 then nil
811841 else throw("Strict value is not equal to itself.")
812842 }
813843 else throw("Strict value is not equal to itself.")
814844 }
815845
816846
817847
818848 @Callable(i)
819849 func withdrawAllPossibleVires () = {
820850 let user = toString(i.caller)
821851 let a = spfr()
822852 if ((a == a))
823853 then {
824854 let stakerViresAmount = asInt(invoke(vS, "unstakeAllViresFrom", [user], nil))
825855 if ((stakerViresAmount == stakerViresAmount))
826856 then {
827857 let u = invoke(dC, "withdrawUnlockedFor", [user], nil)
828858 if ((u == u))
829859 then [ScriptTransfer(i.caller, stakerViresAmount, viresAssetId)]
830860 else throw("Strict value is not equal to itself.")
831861 }
832862 else throw("Strict value is not equal to itself.")
833863 }
834864 else throw("Strict value is not equal to itself.")
835865 }
836866
837867
838868
839869 @Callable(i)
840870 func claimProtocolProfitFrom (from,relock) = {
841871 let user = toString(i.caller)
842872 let a = spfr()
843873 if ((a == a))
844874 then {
845875 let u = invoke(dC, "claimProfit", [from, user, relock], nil)
846876 if ((u == u))
847877 then nil
848878 else throw("Strict value is not equal to itself.")
849879 }
850880 else throw("Strict value is not equal to itself.")
851881 }
852882
853883
854884
855885 @Callable(i)
856886 func withdrawUnlockedVires () = {
857887 let a = spfr()
858888 if ((a == a))
859889 then {
860890 let u = invoke(dC, "withdrawUnlockedFor", [toString(i.caller)], nil)
861891 if ((u == u))
862892 then nil
863893 else throw("Strict value is not equal to itself.")
864894 }
865895 else throw("Strict value is not equal to itself.")
866896 }
867897
868898
899+
900+@Callable(i)
901+func lockSupply (reserve,period) = {
902+ let rsr = vlR(reserve)
903+ let user = toString(i.caller)
904+ let checks = ensureNoProtected(user)
905+ if ((checks == checks))
906+ then {
907+ let aTokenId = value(assetStrToId(valueOrErrorMessage(getString(rsr, "aTokenId"), "no aTokenId in reserve")))
908+ let migration = if ((size(i.payments) == 0))
909+ then unit
910+ else if ((i.payments[0].assetId == aTokenId))
911+ then unit
912+ else if ((i.payments[0].assetId == assetStrToId(valueOrErrorMessage(getString(rsr, "assetId"), "no assetId in reserve"))))
913+ then {
914+ let sh = sR(reserve)
915+ if ((sh == sh))
916+ then {
917+ let action = invoke(rsr, "depositFor", [user, true], i.payments)
918+ if ((action == action))
919+ then {
920+ let amt = i.payments[0].amount
921+ let pRw = uS(reserve, "deposit", user, amt, amt)
922+ if ((pRw == pRw))
923+ then unit
924+ else throw("Strict value is not equal to itself.")
925+ }
926+ else throw("Strict value is not equal to itself.")
927+ }
928+ else throw("Strict value is not equal to itself.")
929+ }
930+ else throw("bad asset attached")
931+ if ((migration == migration))
932+ then {
933+ let mint = {
934+ let sh = sR(reserve)
935+ if ((sh == sh))
936+ then {
937+ let actual = asInt(invoke(rsr, "mintAtokenForTo", [user, -1, toString(this)], nil))
938+ if ((actual == actual))
939+ then {
940+ let pRw = uS(toString(rsr), "deposit", user, -(actual), 0)
941+ if ((pRw == pRw))
942+ then validateAfter(user, "lock-minting")
943+ else throw("Strict value is not equal to itself.")
944+ }
945+ else throw("Strict value is not equal to itself.")
946+ }
947+ else throw("Strict value is not equal to itself.")
948+ }
949+ if ((mint == mint))
950+ then {
951+ let balance = assetBalance(this, aTokenId)
952+ let r = invoke(locker, "lockLP", [user, period], [AttachedPayment(aTokenId, balance)])
953+ if ((r == r))
954+ then $Tuple2(nil, balance)
955+ else throw("Strict value is not equal to itself.")
956+ }
957+ else throw("Strict value is not equal to itself.")
958+ }
959+ else throw("Strict value is not equal to itself.")
960+ }
961+ else throw("Strict value is not equal to itself.")
962+ }
963+
964+

github/deemru/w8io/786bc32 
106.41 ms