tx · 5rvrrpchmgBiJaosSuzmK4QTPhawn9DtP6oXNjCzBtUo

3PJ6iR5X1PT2rZcNmbqByKuh7k8mtj5wVGw:  -0.01000000 Waves

2022.05.03 13:43 [3100860] smart account 3PJ6iR5X1PT2rZcNmbqByKuh7k8mtj5wVGw > SELF 0.00000000 Waves

{ "type": 13, "id": "5rvrrpchmgBiJaosSuzmK4QTPhawn9DtP6oXNjCzBtUo", "fee": 1000000, "feeAssetId": null, "timestamp": 1651574563255, "version": 1, "sender": "3PJ6iR5X1PT2rZcNmbqByKuh7k8mtj5wVGw", "senderPublicKey": "6pk8htkepkqL8WkHrnvRr2tu1r3NC7hfLTJEtiQDbiKF", "proofs": [ "5oC8vDwgCPE5UQ8s2b1HJBT3oxAFUU9jN3DerqtqLMkeND4HSi27zfhCo1m67yEtuWnjLVVgZ4Dj4xVzP4dF1GZE" ], "script": "base64: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dGVyYWxGYWN0b3ICAAAABG5vIDEBAAAAFGxpcXVpZGF0aW9uVGhyZXNob2xkAAAAAQAAAANyc3IJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA1jb25maWdBZGRyZXNzCQABLAAAAAIJAQAAABBhc3NldElkT2ZSZXNlcnZlAAAAAQUAAAADcnNyAgAAABVfTGlxdWlkYXRpb25UaHJlc2hvbGQCAAAABG5vIDIBAAAAEmxpcXVpZGF0aW9uUGVuYWx0eQAAAAEAAAAHYXNzZXRJZAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAADWNvbmZpZ0FkZHJlc3MJAAEsAAAAAgUAAAAHYXNzZXRJZAIAAAATX0xpcXVpZGF0aW9uUGVuYWx0eQIAAAAEbm8gMwAAAAAWYWNjb3VudEhlYWx0aFRocmVzaG9sZAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAADWNvbmZpZ0FkZHJlc3MCAAAAGGFjY291bnRfaGVhbHRoX3RocmVzaG9sZAIAAAAEbm8gNAAAAAAUYWNjb3VudEhlYWx0aE92ZXJsYXAJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA1jb25maWdBZGRyZXNzAgAAABZhY2NvdW50X2hlYWx0aF9vdmVybGFwAgAAAARubyA1AAAAAA9jb2xsYXBzZVBlbmFsdHkJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA1jb25maWdBZGRyZXNzAgAAABBjb2xsYXBzZV9wZW5hbHR5AgAAAARubyA2AAAAAAtsaXF1aWRhdG9ycwkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAA1jb25maWdBZGRyZXNzAgAAAAtsaXF1aWRhdG9ycwIAAAAAAQAAAAN2bFIAAAABAAAAAXIDCQEAAAAIY29udGFpbnMAAAACBQAAAAtyZXNlcnZlc1N0cgUAAAABcgkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEJgAAAAEFAAAAAXICAAAADW1haW46IGJhZCByc3IJAAACAAAAAQkAASwAAAACAgAAAAx1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AAskdDA2Nzg1Njg3NQAAAAJfMwQAAAAJdXNlckFzc2V0CAUAAAALJHQwNjc4NTY4NzUAAAACXzIEAAAABmlnbm9yZQgFAAAACyR0MDY3ODU2ODc1AAAAAl8xAwkAAGcAAAACBQAAAAl1c2VyQXNzZXQFAAAACHVzZXJEZWJ0CQAAAgAAAAECAAAADnBvc2l0aXZlIHNhbGRvAwkAAGcAAAACAAAAAAAAAAAABQAAABNsaXF1aWRhdGVEZWJ0QW1vdW50CQAAAgAAAAECAAAABTw9IDA+BAAAAAZmYWN0b3IJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAANY29uZmlnQWRkcmVzcwkAASwAAAACBQAAAA9jb2xsYXRlcmFsQXNzZXQCAAAAGl9MaXF1aWRhdGlvbkZyYWN0aW9uRmFjdG9yAAAAAAAAAAACAwkAAGYAAAACCQAAaAAAAAIFAAAAE2xpcXVpZGF0ZURlYnRBbW91bnQFAAAABmZhY3RvcgkAAGUAAAACBQAAAAh1c2VyRGVidAUAAAAJdXNlckFzc2V0CQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAIm1vcmUgdGhhbiAxL2ZhY3RvciBvZiBzYWxkbzogZGVidD0JAAGkAAAAAQUAAAAIdXNlckRlYnQCAAAAGCwgbGlxdWlkYXRlRGVidEFtb3VudCA9IAkAAaQAAAABBQAAABNsaXF1aWRhdGVEZWJ0QW1vdW50BAAAAA1jb2xsYXRlcmFsVXNkCQAAawAAAAMFAAAAE2xpcXVpZGF0ZURlYnRBbW91bnQFAAAAC3VzZXJEZWJ0VXNkBQAAAAh1c2VyRGVidAQAAAANcGVuYWx0aXplZFVzZAkAAGsAAAADBQAAAA1jb2xsYXRlcmFsVXNkCQAAZAAAAAIFAAAAC2ZhY3RvcnNCYXNlCQEAAAASbGlxdWlkYXRpb25QZW5hbHR5AAAAAQUAAAALYm9ycm93QXNzZXQFAAAAC2ZhY3RvcnNCYXNlBAAAAAJtYwMFAAAADWZyb21Qcm90ZWN0ZWQJAQAAAA5tb3ZlQ29sbGF0ZXJhbAAAAAQFAAAACGJvcnJvd2VyBQAAAA9jb2xsYXRlcmFsQXNzZXQFAAAAAmNyBQAAABFjb2xsYXRlcmFsUmVzZXJ2ZQUAAAAEdW5pdAMJAAAAAAAAAgUAAAACbWMFAAAAAm1jBAAAABV0cmFuc2ZlcnJlZENvbGxhdGVyYWwJAQAAAAVhc0ludAAAAAEJAAP8AAAABAUAAAACY3ICAAAAEnRyYW5zZmVyQVRva2Vuc0ZvcgkABEwAAAACBQAAAAhib3Jyb3dlcgkABEwAAAACBQAAAApsaXF1aWRhdG9yCQAETAAAAAIFAAAADXBlbmFsdGl6ZWRVc2QFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAABV0cmFuc2ZlcnJlZENvbGxhdGVyYWwFAAAAFXRyYW5zZmVycmVkQ29sbGF0ZXJhbAQAAAAEcFJ3MQkBAAAACm1vdmVTdHJlYW0AAAAFBQAAABFjb2xsYXRlcmFsUmVzZXJ2ZQIAAAAHZGVwb3NpdAUAAAAIYm9ycm93ZXIFAAAACmxpcXVpZGF0b3IFAAAAFXRyYW5zZmVycmVkQ29sbGF0ZXJhbAMJAAAAAAAAAgUAAAAEcFJ3MQUAAAAEcFJ3MQQAAAAPdHJhbnNmZXJyZWREZWJ0CQEAAAAFYXNJbnQAAAABCQAD/AAAAAQFAAAAAmJyAgAAAA90cmFuc2ZlckRlYnRGb3IJAARMAAAAAgUAAAAIYm9ycm93ZXIJAARMAAAAAgUAAAAKbGlxdWlkYXRvcgkABEwAAAACBQAAABNsaXF1aWRhdGVEZWJ0QW1vdW50BQAAAANuaWwFAAAAA25pbAMJAAAAAAAAAgUAAAAPdHJhbnNmZXJyZWREZWJ0BQAAAA90cmFuc2ZlcnJlZERlYnQEAAAABHBSdzIJAQAAAAptb3ZlU3RyZWFtAAAABQUAAAANYm9ycm93UmVzZXJ2ZQIAAAAGYm9ycm93BQAAAAhib3Jyb3dlcgUAAAAKbGlxdWlkYXRvcgUAAAAPdHJhbnNmZXJyZWREZWJ0AwkAAAAAAAACBQAAAARwUncyBQAAAARwUncyBAAAABVsaXF1aWRhdG9ySGVhbHRoQ2hlY2sDCQEAAAAIY29udGFpbnMAAAACBQAAAAtsaXF1aWRhdG9ycwUAAAAKbGlxdWlkYXRvcgUAAAADbmlsCQEAAAANdmFsaWRhdGVBZnRlcgAAAAIFAAAACmxpcXVpZGF0b3ICAAAAEXRyYW5zZmVycmluZyBkZWJ0AwkAAAAAAAACBQAA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", "chainId": 87, "height": 3100860, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: 5XQNDLNYbo4HDxWxUjiizA8MFAYsVuquAF2GSBejHdjU Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 5 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let factorsBase = 1000
5+
6+func fCi (value,numerator,denominator) = {
7+ let cand = fraction(value, numerator, denominator)
8+ let D = 3037000499
9+ let exact = ((((cand % D) * (denominator % D)) % D) == (((value % D) * (numerator % D)) % D))
10+ if (exact)
11+ then cand
12+ else (cand + 1)
13+ }
14+
15+
16+func writeConstString (key,value) = if (!(isDefined(getString(this, key))))
17+ then StringEntry(key, value)
18+ else throw(("already initialized: " + key))
19+
20+
21+func asInt (value) = match value {
22+ case int: Int =>
23+ int
24+ case _ =>
25+ throw("1")
26+}
27+
28+
29+func asInt3 (value) = match value {
30+ case x: (Int, Int, Int) =>
31+ x
32+ case t =>
33+ throw("2")
34+}
35+
36+
37+func asUserBalanceData (value) = match value {
38+ case x: (Int, Int, Int, Int, Int, Boolean) =>
39+ x
40+ case t =>
41+ throw("3")
42+}
43+
44+
45+let configStore = "config"
46+
47+let reservesStore = "reserves"
48+
49+let aTIdS = "aTokenId"
50+
51+let aIdS = "assetId"
52+
53+let configAddress = addressFromStringValue(getStringValue(this, configStore))
54+
55+let reservesStr = valueOrErrorMessage(getString(configAddress, "primary_reserves"), "no reserves registered")
56+
57+let reserves = split(reservesStr, "|")
58+
59+let mVD = match getString(configAddress, "vires_distributor") {
60+ case d: String =>
61+ addressFromStringValue(d)
62+ case _ =>
63+ unit
64+}
65+
66+func assetIdOfReserve (rsr) = valueOrErrorMessage(getString(rsr, aIdS), "no assetId in reserve")
67+
68+
69+func collateralFactor (rsr) = valueOrErrorMessage(getInteger(configAddress, (assetIdOfReserve(rsr) + "_CollateralFactor")), "no 1")
70+
71+
72+func liquidationThreshold (rsr) = valueOrErrorMessage(getInteger(configAddress, (assetIdOfReserve(rsr) + "_LiquidationThreshold")), "no 2")
73+
74+
75+func liquidationPenalty (assetId) = valueOrErrorMessage(getInteger(configAddress, (assetId + "_LiquidationPenalty")), "no 3")
76+
77+
78+let accountHealthThreshold = valueOrErrorMessage(getInteger(configAddress, "account_health_threshold"), "no 4")
79+
80+let accountHealthOverlap = valueOrErrorMessage(getInteger(configAddress, "account_health_overlap"), "no 5")
81+
82+let collapsePenalty = valueOrErrorMessage(getInteger(configAddress, "collapse_penalty"), "no 6")
83+
84+let liquidators = valueOrElse(getString(configAddress, "liquidators"), "")
85+
86+func vlR (r) = if (contains(reservesStr, r))
87+ then valueOrErrorMessage(addressFromString(r), "main: bad rsr")
88+ else throw(("unknown rsr:" + r))
89+
90+
91+func userBalance (rsr,user) = asUserBalanceData(invoke(rsr, "userBalance", [user], nil))
92+
93+
94+let maybeProtected = match getString(configAddress, "protected_reserve") {
95+ case pds: String =>
96+ valueOrErrorMessage(addressFromString(pds), "bad protected")
97+ case _ =>
98+ unit
99+}
100+
101+func userPower (user) = {
102+ let protectedDeposit = match maybeProtected {
103+ case pa: Address =>
104+ asInt(invoke(pa, "borrowPower", [user], nil))
105+ case _ =>
106+ 0
107+ }
108+ func fold (totals,r) = {
109+ let $t029312977 = totals
110+ let totalD = $t029312977._1
111+ let totalB = $t029312977._2
112+ let numberOfBorrows = $t029312977._3
113+ let rsr = valueOrErrorMessage(addressFromString(r), "rsr bad address")
114+ let cf = collateralFactor(rsr)
115+ let lt = liquidationThreshold(rsr)
116+ let $t031313215 = userBalance(rsr, user)
117+ let token = $t031313215._1
118+ let asset = $t031313215._2
119+ let depositUsd = $t031313215._3
120+ let debt = $t031313215._4
121+ let debtUsd = $t031313215._5
122+ let asCollateral = $t031313215._6
123+ let totalBorrows = (numberOfBorrows + (if ((debt > 0))
124+ then 1
125+ else 0))
126+ let effectiveDepositUsd = if (asCollateral)
127+ then depositUsd
128+ else 0
129+ let overlapUsd = min([debtUsd, effectiveDepositUsd])
130+ let overlapCharge = fCi(overlapUsd, accountHealthOverlap, factorsBase)
131+ if ((debtUsd > effectiveDepositUsd))
132+ then $Tuple3(totalD, ((totalB + fraction((debtUsd - effectiveDepositUsd), factorsBase, lt)) + overlapCharge), totalBorrows)
133+ else $Tuple3((totalD + fraction((effectiveDepositUsd - debtUsd), cf, factorsBase)), (totalB + overlapCharge), totalBorrows)
134+ }
135+
136+ let r = {
137+ let $l = reserves
138+ let $s = size($l)
139+ let $acc0 = $Tuple3(protectedDeposit, 0, 0)
140+ func $f0_1 ($a,$i) = if (($i >= $s))
141+ then $a
142+ else fold($a, $l[$i])
143+
144+ func $f0_2 ($a,$i) = if (($i >= $s))
145+ then $a
146+ else throw("List size exceeds 7")
147+
148+ $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)
149+ }
150+ if (if ((protectedDeposit > 0))
151+ then (r._3 > 2)
152+ else false)
153+ then throw("can't have more than 2 borrows")
154+ else r
155+ }
156+
157+
158+func getUserHealth (account) = {
159+ let $t039694020 = asInt3(userPower(account))
160+ let bp = $t039694020._1
161+ let bpu = $t039694020._2
162+ let ignore = $t039694020._3
163+ ((("bp:" + toString(bp)) + ", bpu:") + toString(bpu))
164+ }
165+
166+
167+func validateAfter (user,op) = {
168+ let $t041314162 = userPower(user)
169+ let bp = $t041314162._1
170+ let bpu = $t041314162._2
171+ let accHealth = (((bp - bpu) * factorsBase) / bp)
172+ if (if ((bp == 0))
173+ then (bpu == 0)
174+ else false)
175+ then nil
176+ else if (if ((bp == 0))
177+ then (bpu > 0)
178+ else false)
179+ then throw(((op + ": breaching liquidation threshold(bp=0, bpu=") + toString(bpu)))
180+ else if ((accountHealthThreshold > accHealth))
181+ then throw((((((((op + ": breaching liquidation threshold(bp=") + toString(bp)) + ", bpu=") + toString(bpu)) + ", health=") + toString(accHealth)) + ")"))
182+ else nil
183+ }
184+
185+
186+func updateStream (rsr,action,user,userChange,streamChange) = match mVD {
187+ case a: Address =>
188+ invoke(a, "onAction", [rsr, action, user, userChange, streamChange], nil)
189+ case _ =>
190+ unit
191+}
192+
193+
194+func moveStream (rsr,action,from,string,amt) = match mVD {
195+ case a: Address =>
196+ invoke(a, "move", [rsr, action, from, string, amt], nil)
197+ case _ =>
198+ unit
199+}
200+
201+
202+func syncRewards (rsr) = match mVD {
203+ case a: Address =>
204+ invoke(a, "syncHeight", [rsr], nil)
205+ case _ =>
206+ unit
207+}
208+
209+
210+func moveCollateral (addr,assetStr,rsr,reserveStr) = {
211+ let protectedReserve = valueOrErrorMessage(maybeProtected, "no protected rsr")
212+ let amt = asInt(invoke(protectedReserve, "withdrawToMain", [addr, assetStr], nil))
213+ if ((amt == amt))
214+ then {
215+ let assetId = if ((assetStr == "WAVES"))
216+ then unit
217+ else fromBase58String(assetStr)
218+ let dep = invoke(rsr, "depositFor", [addr, true], [AttachedPayment(assetId, amt)])
219+ if ((dep == dep))
220+ then {
221+ let prop = updateStream(reserveStr, "deposit", addr, amt, amt)
222+ if ((prop == prop))
223+ then unit
224+ else throw("Strict value is not equal to itself.")
225+ }
226+ else throw("Strict value is not equal to itself.")
227+ }
228+ else throw("Strict value is not equal to itself.")
229+ }
230+
231+
232+func transferDebtInternal (liquidator,borrowReserve,collateralReserve,borrower,liquidateDebtAmount,fromProtected) = {
233+ let sh1 = syncRewards(borrowReserve)
234+ if ((sh1 == sh1))
235+ then {
236+ let sh2 = syncRewards(collateralReserve)
237+ if ((sh2 == sh2))
238+ then if ((0 >= liquidateDebtAmount))
239+ then throw("non-positive amount")
240+ else if ((collateralReserve == borrowReserve))
241+ then throw("cr = br")
242+ else if ((liquidator == borrower))
243+ then throw("self")
244+ else {
245+ let $t062806315 = userPower(borrower)
246+ let bp = $t062806315._1
247+ let bpu = $t062806315._2
248+ if ((bp > bpu))
249+ then throw((" healthy user: u=" + borrower))
250+ else {
251+ let br = vlR(borrowReserve)
252+ let cr = vlR(collateralReserve)
253+ let borrowAsset = valueOrErrorMessage(getString(br, aIdS), "no assetId in br")
254+ let collateralAsset = valueOrErrorMessage(getString(cr, aIdS), "no assetId in cr")
255+ let isCollateral = valueOrElse(getBoolean(cr, (borrower + "_useAsCollateral")), false)
256+ if ((isCollateral == isCollateral))
257+ then if (if (!(fromProtected))
258+ then !(isCollateral)
259+ else false)
260+ then throw("deposit not used as collateral")
261+ else {
262+ let $t067856875 = userBalance(br, borrower)
263+ if (($t067856875 == $t067856875))
264+ then {
265+ let userDebtUsd = $t067856875._5
266+ let userDebt = $t067856875._4
267+ let userAssetUsd = $t067856875._3
268+ let userAsset = $t067856875._2
269+ let ignore = $t067856875._1
270+ if ((userAsset >= userDebt))
271+ then throw("positive saldo")
272+ else if ((0 >= liquidateDebtAmount))
273+ then throw("<= 0>")
274+ else {
275+ let factor = valueOrElse(getInteger(configAddress, (collateralAsset + "_LiquidationFractionFactor")), 2)
276+ if (((liquidateDebtAmount * factor) > (userDebt - userAsset)))
277+ then throw(((("more than 1/factor of saldo: debt=" + toString(userDebt)) + ", liquidateDebtAmount = ") + toString(liquidateDebtAmount)))
278+ else {
279+ let collateralUsd = fraction(liquidateDebtAmount, userDebtUsd, userDebt)
280+ let penaltizedUsd = fraction(collateralUsd, (factorsBase + liquidationPenalty(borrowAsset)), factorsBase)
281+ let mc = if (fromProtected)
282+ then moveCollateral(borrower, collateralAsset, cr, collateralReserve)
283+ else unit
284+ if ((mc == mc))
285+ then {
286+ let transferredCollateral = asInt(invoke(cr, "transferATokensFor", [borrower, liquidator, penaltizedUsd], nil))
287+ if ((transferredCollateral == transferredCollateral))
288+ then {
289+ let pRw1 = moveStream(collateralReserve, "deposit", borrower, liquidator, transferredCollateral)
290+ if ((pRw1 == pRw1))
291+ then {
292+ let transferredDebt = asInt(invoke(br, "transferDebtFor", [borrower, liquidator, liquidateDebtAmount], nil))
293+ if ((transferredDebt == transferredDebt))
294+ then {
295+ let pRw2 = moveStream(borrowReserve, "borrow", borrower, liquidator, transferredDebt)
296+ if ((pRw2 == pRw2))
297+ then {
298+ let liquidatorHealthCheck = if (contains(liquidators, liquidator))
299+ then nil
300+ else validateAfter(liquidator, "transferring debt")
301+ if ((liquidatorHealthCheck == liquidatorHealthCheck))
302+ then $Tuple2(liquidatorHealthCheck, transferredCollateral)
303+ else throw("Strict value is not equal to itself.")
304+ }
305+ else throw("Strict value is not equal to itself.")
306+ }
307+ else throw("Strict value is not equal to itself.")
308+ }
309+ else throw("Strict value is not equal to itself.")
310+ }
311+ else throw("Strict value is not equal to itself.")
312+ }
313+ else throw("Strict value is not equal to itself.")
314+ }
315+ }
316+ }
317+ else throw("Strict value is not equal to itself.")
318+ }
319+ else throw("Strict value is not equal to itself.")
320+ }
321+ }
322+ else throw("Strict value is not equal to itself.")
323+ }
324+ else throw("Strict value is not equal to itself.")
325+ }
326+
327+
328+func forceCollapseInternal (liquidator,rsr,borrower,fromProtected) = {
329+ let reserveAddress = vlR(rsr)
330+ if ((reserveAddress == reserveAddress))
331+ then {
332+ let sh = syncRewards(rsr)
333+ if ((sh == sh))
334+ then if ((liquidator == borrower))
335+ then throw("can't collapse self in this function")
336+ else {
337+ let $t085238558 = userPower(borrower)
338+ let bp = $t085238558._1
339+ let bpu = $t085238558._2
340+ if ((bp > bpu))
341+ then throw(("can't force collapse healthy user " + borrower))
342+ else {
343+ let asset = valueOrErrorMessage(getString(reserveAddress, aIdS), ("no assetId field in rsr " + rsr))
344+ let mc = if (fromProtected)
345+ then moveCollateral(borrower, asset, reserveAddress, rsr)
346+ else unit
347+ if ((mc == mc))
348+ then {
349+ let $t088608968 = userBalance(reserveAddress, borrower)
350+ if (($t088608968 == $t088608968))
351+ then {
352+ let userDebtUsd = $t088608968._5
353+ let userDebt = $t088608968._4
354+ let userAssetUsd = $t088608968._3
355+ let borrowerDeposit = $t088608968._2
356+ let ignore = $t088608968._1
357+ let penaltizedUsd = fraction(min([userAssetUsd, userDebtUsd]), collapsePenalty, factorsBase)
358+ let transferredAssets = asInt(invoke(reserveAddress, "transferATokensFor", [borrower, liquidator, penaltizedUsd], nil))
359+ if ((transferredAssets == transferredAssets))
360+ then {
361+ let pRw1 = moveStream(rsr, "deposit", borrower, liquidator, transferredAssets)
362+ if ((pRw1 == pRw1))
363+ then {
364+ let collapsed = asInt(invoke(reserveAddress, "collapseFor", [borrower], nil))
365+ if ((collapsed == collapsed))
366+ then {
367+ let pRw2 = updateStream(rsr, "borrow", borrower, -(collapsed), -(collapsed))
368+ if ((pRw2 == pRw2))
369+ then {
370+ let pRw3 = updateStream(rsr, "deposit", borrower, -(collapsed), -(collapsed))
371+ if ((pRw3 == pRw3))
372+ then nil
373+ else throw("Strict value is not equal to itself.")
374+ }
375+ else throw("Strict value is not equal to itself.")
376+ }
377+ else throw("Strict value is not equal to itself.")
378+ }
379+ else throw("Strict value is not equal to itself.")
380+ }
381+ else throw("Strict value is not equal to itself.")
382+ }
383+ else throw("Strict value is not equal to itself.")
384+ }
385+ else throw("Strict value is not equal to itself.")
386+ }
387+ }
388+ else throw("Strict value is not equal to itself.")
389+ }
390+ else throw("Strict value is not equal to itself.")
391+ }
392+
393+
394+@Callable(i)
395+func initialize (ca) = [writeConstString(configStore, ca)]
396+
397+
398+
399+@Callable(i)
400+func transferDebt (br,cr,b,la) = transferDebtInternal(toString(i.caller), br, cr, b, la, false)
401+
402+
403+
404+@Callable(i)
405+func transferDebt2 (br,cr,b,la) = transferDebtInternal(toString(i.caller), br, cr, b, la, true)
406+
407+
408+
409+@Callable(i)
410+func forceCollapse (r,b) = forceCollapseInternal(toString(i.caller), r, b, false)
411+
412+
413+
414+@Callable(i)
415+func forceCollapse2 (r,b) = forceCollapseInternal(toString(i.caller), r, b, true)
416+
417+

github/deemru/w8io/873ac7e 
51.14 ms