2021.06.30 15:57 [2657886] smart account 3PAZv9tgK1PX7dKR7b4kchq5qdpUS3G5sYT > SELF 0.00000000 Waves

{ "type": 13, "id": "96dSPzjSby4qZvcHNF5rDWG6o9dnykA54LDMuSfxXKFs", "fee": 1000000, "feeAssetId": null, "timestamp": 1625057831024, "version": 1, "sender": "3PAZv9tgK1PX7dKR7b4kchq5qdpUS3G5sYT", "senderPublicKey": "2cFG5wZimjVSeCT8ZCRybx7Mzo5tJF879aw2b31uLRmR", "proofs": [ "532M91cLqCvKRpPaBAVVkCmf3tEzwsaAvqaxRHvgRmWKpKiRLyqWSz829EUsHLtgn5EGDm3hZ9i3Re168KJKPrge" ], "script": "base64:AAIFAAAAAAAAAEMIAhIDCgEIEgMKAQgSBAoCCAQSBAoCCAESBAoCCAESBAoCCAESBAoCCAESBAoCCAESAwoBCBIGCgQICAgBEgQKAggIAAAAGgAAAAALZmFjdG9yc0Jhc2UAAAAAAAAAA+gBAAAADGZyYWN0aW9uQ2VpbAAAAAMAAAAFdmFsdWUAAAAJbnVtZXJhdG9yAAAAC2Rlbm9taW5hdG9yBAAAAARjYW5kCQAAawAAAAMFAAAABXZhbHVlBQAAAAludW1lcmF0b3IFAAAAC2Rlbm9taW5hdG9yBAAAAAFEAAAAAAC1BPMzBAAAAAVleGFjdAkAAAAAAAACCQAAagAAAAIJAABoAAAAAgkAAGoAAAACBQAAAARjYW5kBQAAAAFECQAAagAAAAIFAAAAC2Rlbm9taW5hdG9yBQAAAAFEBQAAAAFECQAAagAAAAIJAABoAAAAAgkAAGoAAAACBQAAAAV2YWx1ZQUAAAABRAkAAGoAAAACBQAAAAludW1lcmF0b3IFAAAAAUQFAAAAAUQDBQAAAAVleGFjdAUAAAAEY2FuZAkAAGQAAAACBQAAAARjYW5kAAAAAAAAAAABAQAAABB3cml0ZUNvbnN0U3RyaW5nAAAAAgAAAANrZXkAAAAFdmFsdWUDCQEAAAABIQAAAAEJAQAAAAlpc0RlZmluZWQAAAABCQAEHQAAAAIFAAAABHRoaXMFAAAAA2tleQkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAADa2V5BQAAAAV2YWx1ZQkAAAIAAAABCQABLAAAAAICAAAAFWFscmVhZHkgaW5pdGlhbGl6ZWQ6IAUAAAADa2V5AQAAAAVhc0ludAAAAAEAAAAFdmFsdWUEAAAAByRtYXRjaDAFAAAABXZhbHVlAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAA2ludAUAAAAHJG1hdGNoMAUAAAADaW50CQAAAgAAAAECAAAAGXdyb25nIHR5cGUsIGV4cGVjdGVkOiBJbnQBAAAABmFzSW50MgAAAAEAAAAFdmFsdWUEAAAAByRtYXRjaDAFAAAABXZhbHVlAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAooSW50LCBJbnQpBAAAAAF4BQAAAAckbWF0Y2gwBQAAAAF4BAAAAAF0BQAAAAckbWF0Y2gwCQAAAgAAAAECAAAADWdvdCBzb21ldGhpbmcBAAAAEWFzVXNlckJhbGFuY2VEYXRhAAAAAQAAAAV2YWx1ZQQAAAAHJG1hdGNoMAUAAAAFdmFsdWUDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAIihJbnQsIEludCwgSW50LCBJbnQsIEludCwgQm9vbGVhbikEAAAAAXgFAAAAByRtYXRjaDAFAAAAAXgEAAAAAXQFAAAAByRtYXRjaDAJAAACAAAAAQIAAAAVZXhwZWN0ZWQgaW50NSZib29sZWFuAAAAAAphZG1pblN0b3JlAgAAAAVhZG1pbgAAAAALY29uZmlnU3RvcmUCAAAABmNvbmZpZwAAAAANcmVzZXJ2ZXNTdG9yZQIAAAAIcmVzZXJ2ZXMAAAAADWFUb2tlbklkU3RvcmUCAAAACGFUb2tlbklkAAAAAAxhc3NldElkU3RvcmUCAAAAB2Fzc2V0SWQAAAAABWFkbWluCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACBQAAAAR0aGlzBQAAAAphZG1pblN0b3JlAAAAAAZjb25maWcJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIFAAAABHRoaXMFAAAAC2NvbmZpZ1N0b3JlAAAAAAhyZXNlcnZlcwkABLUAAAACCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwUAAAANcmVzZXJ2ZXNTdG9yZQIAAAAWbm8gcmVzZXJ2ZXMgcmVnaXN0ZXJlZAIAAAABfAEAAAAQYXNzZXRJZE9mUmVzZXJ2ZQAAAAEAAAAHcmVzZXJ2ZQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAAB3Jlc2VydmUFAAAADGFzc2V0SWRTdG9yZQIAAAAVbm8gYXNzZXRJZCBpbiByZXNlcnZlAQAAABBjb2xsYXRlcmFsRmFjdG9yAAAAAQAAAAdyZXNlcnZlCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAGY29uZmlnCQABLAAAAAIJAQAAABBhc3NldElkT2ZSZXNlcnZlAAAAAQUAAAAHcmVzZXJ2ZQIAAAARX0NvbGxhdGVyYWxGYWN0b3ICAAAAHW5vIENvbGxhdGVyYWxGYWN0b3IgaW4gY29uZmlnAQAAABRsaXF1aWRhdGlvblRocmVzaG9sZAAAAAEAAAAHcmVzZXJ2ZQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABmNvbmZpZwkAASwAAAACCQEAAAAQYXNzZXRJZE9mUmVzZXJ2ZQAAAAEFAAAAB3Jlc2VydmUCAAAAFV9MaXF1aWRhdGlvblRocmVzaG9sZAIAAAAhbm8gTGlxdWlkYXRpb25UaHJlc2hvbGQgaW4gY29uZmlnAQAAABJsaXF1aWRhdGlvblBlbmFsdHkAAAABAAAAB2Fzc2V0SWQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAZjb25maWcJAAEsAAAAAgUAAAAHYXNzZXRJZAIAAAATX0xpcXVpZGF0aW9uUGVuYWx0eQIAAAAfbm8gTGlxdWlkYXRpb25QZW5hbHR5IGluIGNvbmZpZwAAAAAWYWNjb3VudEhlYWx0aFRocmVzaG9sZAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABmNvbmZpZwIAAAAYYWNjb3VudF9oZWFsdGhfdGhyZXNob2xkAgAAABtubyBhY2NvdW50X2hlYWx0aF90aHJlc2hvbGQAAAAAFGFjY291bnRIZWFsdGhPdmVybGFwCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAGY29uZmlnAgAAABZhY2NvdW50X2hlYWx0aF9vdmVybGFwAgAAABlubyBhY2NvdW50X2hlYWx0aF9vdmVybGFwAAAAAA9jb2xsYXBzZVBlbmFsdHkJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAZjb25maWcCAAAAEGNvbGxhcHNlX3BlbmFsdHkCAAAAE25vIGNvbGxhcHNlX3BlbmFsdHkBAAAADWZpbmRSZXNlcnZlQnkAAAACAAAABXN0b3JlAAAABXZhbHVlCgEAAAAEZm9sZAAAAAIAAAABYQAAAAFyBAAAAAckbWF0Y2gwBQAAAAFhAwkA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b2xkAAAAAQUAAAAHcmVzZXJ2ZQQAAAALJHQwMzIwMTMyODkJAQAAAAt1c2VyQmFsYW5jZQAAAAIFAAAAB3Jlc2VydmUFAAAABHVzZXIEAAAABXRva2VuCAUAAAALJHQwMzIwMTMyODkAAAACXzEEAAAABWFzc2V0CAUAAAALJHQwMzIwMTMyODkAAAACXzIEAAAACmRlcG9zaXRVc2QIBQAAAAskdDAzMjAxMzI4OQAAAAJfMwQAAAAEZGVidAgFAAAACyR0MDMyMDEzMjg5AAAAAl80BAAAAAdkZWJ0VXNkCAUAAAALJHQwMzIwMTMyODkAAAACXzUEAAAADGFzQ29sbGF0ZXJhbAgFAAAACyR0MDMyMDEzMjg5AAAAAl82BAAAABNlZmZlY3RpdmVEZXBvc2l0VXNkAwUAAAAMYXNDb2xsYXRlcmFsBQAAAApkZXBvc2l0VXNkAAAAAAAAAAAABAAAAApvdmVybGFwVXNkCQABlwAAAAEJAARMAAAAAgUAAAAHZGVidFVzZAkABEwAAAACBQAAABNlZmZlY3RpdmVEZXBvc2l0VXNkBQAAAANuaWwEAAAADW92ZXJsYXBDaGFyZ2UJAQAAAAxmcmFjdGlvbkNlaWwAAAADBQAAAApvdmVybGFwVXNkBQAAABRhY2NvdW50SGVhbHRoT3ZlcmxhcAUAAAALZmFjdG9yc0Jhc2UDCQAAZgAAAAIFAAAAB2RlYnRVc2QFAAAAE2VmZmVjdGl2ZURlcG9zaXRVc2QJAAUUAAAAAgUAAAAGdG90YWxECQAAZAAAAAIJAABkAAAAAgUAAAAGdG90YWxCCQAAawAAAAMJAABlAAAAAgUAAAAHZGVidFVzZAUAAAATZWZmZWN0aXZlRGVwb3NpdFVzZAUAAAALZmFjdG9yc0Jhc2UFAAAAAmx0BQAAAA1vdmVybGFwQ2hhcmdlCQAFFAAAAAIJAABkAAAAAgUAAAAGdG90YWxECQAAawAAAAMJAABlAAAAAgUAAAATZWZmZWN0aXZlRGVwb3NpdFVzZAUAAAAHZGVidFVzZAUAAAACY2YFAAAAC2ZhY3RvcnNCYXNlCQAAZAAAAAIFAAAABnRvdGFsQgUAAAANb3ZlcmxhcENoYXJnZQQAAAANJGxpc3QzNzU2Mzc4NgUAAAAIcmVzZXJ2ZXMEAAAADSRzaXplMzc1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b3Jyb3cJAQAAAA12YWxpZGF0ZUFmdGVyAAAAAgUAAAAEdXNlcgIAAAAKYm9ycm93aW5nMgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAWZGlzYWJsZVVzZUFzQ29sbGF0ZXJhbAAAAAEAAAAHcmVzZXJ2ZQQAAAAEdXNlcgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAAD2RvU2V0Q29sbGF0ZXJhbAkAA/wAAAAECQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQmAAAAAQUAAAAHcmVzZXJ2ZQIAAAALYmFkIHJlc2VydmUCAAAAGWRpc2FibGVVc2VBc0NvbGxhdGVyYWxGb3IJAARMAAAAAgUAAAAEdXNlcgUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAAD2RvU2V0Q29sbGF0ZXJhbAUAAAAPZG9TZXRDb2xsYXRlcmFsCQEAAAANdmFsaWRhdGVBZnRlcgAAAAIFAAAABHVzZXICAAAAGmNoYW5naW5nIGNvbGxhdGVyYWwgc3RhdHVzCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAAAx0cmFuc2ZlckRlYnQAAAAEAAAADWJvcnJvd1Jlc2VydmUAAAARY29sbGF0ZXJhbFJlc2VydmUAAAAIYm9ycm93ZXIAAAATbGlxdWlkYXRlRGVidEFtb3VudAMJAABnAAAAAgAAAAAAAAAAAAUAAAATbGlxdWlkYXRlRGVidEFtb3VudAkAAAIAAAABAgAAACNjYW4ndCBsaXF1aWRhdGUgbm9uLXBvc2l0aXZlIGFtb3VudAMJAAAAAAAAAgUAAAARY29sbGF0ZXJhbFJlc2VydmUFAAAADWJvcnJvd1Jlc2VydmUJAAACAAAAAQIAAAAmY29sbGF0ZXJhbFJlc2VydmUgZXF1YWxzIGJvcnJvd1Jlc2VydmUEAAAACmxpcXVpZGF0b3IJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyAwkAAAAAAAACBQAAAApsaXF1aWRhdG9yBQAAAAhib3Jyb3dlcgkAAAIAAAABAgAAABRjYW4ndCBsaXF1aWRhdGUgc2VsZgQA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", "chainId": 87, "height": 2657886, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: 4kZXUgnATnSPp1qXraveFNR7djW6D4PFLn9BCP4kZrvM Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 5 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let factorsBase = 1000
5+
6+func fractionCeil (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("wrong type, expected: Int")
26+}
27+
28+
29+func asInt2 (value) = match value {
30+ case x: (Int, Int) =>
31+ x
32+ case t =>
33+ throw("got something")
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("expected int5&boolean")
42+}
43+
44+
45+let adminStore = "admin"
46+
47+let configStore = "config"
48+
49+let reservesStore = "reserves"
50+
51+let aTokenIdStore = "aTokenId"
52+
53+let assetIdStore = "assetId"
54+
55+let admin = addressFromStringValue(getStringValue(this, adminStore))
56+
57+let config = addressFromStringValue(getStringValue(this, configStore))
58+
59+let reserves = split(valueOrErrorMessage(getString(this, reservesStore), "no reserves registered"), "|")
60+
61+func assetIdOfReserve (reserve) = valueOrErrorMessage(getString(reserve, assetIdStore), "no assetId in reserve")
62+
63+
64+func collateralFactor (reserve) = valueOrErrorMessage(getInteger(config, (assetIdOfReserve(reserve) + "_CollateralFactor")), "no CollateralFactor in config")
65+
66+
67+func liquidationThreshold (reserve) = valueOrErrorMessage(getInteger(config, (assetIdOfReserve(reserve) + "_LiquidationThreshold")), "no LiquidationThreshold in config")
68+
69+
70+func liquidationPenalty (assetId) = valueOrErrorMessage(getInteger(config, (assetId + "_LiquidationPenalty")), "no LiquidationPenalty in config")
71+
72+
73+let accountHealthThreshold = valueOrErrorMessage(getInteger(config, "account_health_threshold"), "no account_health_threshold")
74+
75+let accountHealthOverlap = valueOrErrorMessage(getInteger(config, "account_health_overlap"), "no account_health_overlap")
76+
77+let collapsePenalty = valueOrErrorMessage(getInteger(config, "collapse_penalty"), "no collapse_penalty")
78+
79+func findReserveBy (store,value) = {
80+ func fold (a,r) = match a {
81+ case found: Address =>
82+ found
83+ case _ =>
84+ let reserve = valueOrErrorMessage(addressFromString(r), "reserve bad address")
85+ if ((valueOrErrorMessage(getString(reserve, store), ("reserve has no " + store)) == value))
86+ then reserve
87+ else unit
88+ }
89+
90+ match let $list26812710 = reserves
91+ let $size26812710 = size($list26812710)
92+ let $acc026812710 = unit
93+ if (($size26812710 == 0))
94+ then $acc026812710
95+ else {
96+ let $acc126812710 = fold($acc026812710, $list26812710[0])
97+ if (($size26812710 == 1))
98+ then $acc126812710
99+ else {
100+ let $acc226812710 = fold($acc126812710, $list26812710[1])
101+ if (($size26812710 == 2))
102+ then $acc226812710
103+ else {
104+ let $acc326812710 = fold($acc226812710, $list26812710[2])
105+ if (($size26812710 == 3))
106+ then $acc326812710
107+ else {
108+ let $acc426812710 = fold($acc326812710, $list26812710[3])
109+ if (($size26812710 == 4))
110+ then $acc426812710
111+ else {
112+ let $acc526812710 = fold($acc426812710, $list26812710[4])
113+ if (($size26812710 == 5))
114+ then $acc526812710
115+ else {
116+ let $acc626812710 = fold($acc526812710, $list26812710[5])
117+ throw("List size exceed 5")
118+ }
119+ }
120+ }
121+ }
122+ }
123+ } {
124+ case found: Address =>
125+ found
126+ case _ =>
127+ throw(("unknown " + store))
128+ }
129+ }
130+
131+
132+func userBalance (reserve,user) = asUserBalanceData(invoke(reserve, "userBalance", [user], nil))
133+
134+
135+func userPower (user) = {
136+ func fold (totals,r) = {
137+ let $t030013030 = totals
138+ let totalD = $t030013030._1
139+ let totalB = $t030013030._2
140+ let reserve = valueOrErrorMessage(addressFromString(r), "reserve bad address")
141+ let cf = collateralFactor(reserve)
142+ let lt = liquidationThreshold(reserve)
143+ let $t032013289 = userBalance(reserve, user)
144+ let token = $t032013289._1
145+ let asset = $t032013289._2
146+ let depositUsd = $t032013289._3
147+ let debt = $t032013289._4
148+ let debtUsd = $t032013289._5
149+ let asCollateral = $t032013289._6
150+ let effectiveDepositUsd = if (asCollateral)
151+ then depositUsd
152+ else 0
153+ let overlapUsd = min([debtUsd, effectiveDepositUsd])
154+ let overlapCharge = fractionCeil(overlapUsd, accountHealthOverlap, factorsBase)
155+ if ((debtUsd > effectiveDepositUsd))
156+ then $Tuple2(totalD, ((totalB + fraction((debtUsd - effectiveDepositUsd), factorsBase, lt)) + overlapCharge))
157+ else $Tuple2((totalD + fraction((effectiveDepositUsd - debtUsd), cf, factorsBase)), (totalB + overlapCharge))
158+ }
159+
160+ let $list37563786 = reserves
161+ let $size37563786 = size($list37563786)
162+ let $acc037563786 = $Tuple2(0, 0)
163+ if (($size37563786 == 0))
164+ then $acc037563786
165+ else {
166+ let $acc137563786 = fold($acc037563786, $list37563786[0])
167+ if (($size37563786 == 1))
168+ then $acc137563786
169+ else {
170+ let $acc237563786 = fold($acc137563786, $list37563786[1])
171+ if (($size37563786 == 2))
172+ then $acc237563786
173+ else {
174+ let $acc337563786 = fold($acc237563786, $list37563786[2])
175+ if (($size37563786 == 3))
176+ then $acc337563786
177+ else {
178+ let $acc437563786 = fold($acc337563786, $list37563786[3])
179+ if (($size37563786 == 4))
180+ then $acc437563786
181+ else {
182+ let $acc537563786 = fold($acc437563786, $list37563786[4])
183+ if (($size37563786 == 5))
184+ then $acc537563786
185+ else {
186+ let $acc637563786 = fold($acc537563786, $list37563786[5])
187+ throw("List size exceed 5")
188+ }
189+ }
190+ }
191+ }
192+ }
193+ }
194+ }
195+
196+
197+func getUserHealth (account) = {
198+ let $t038343877 = asInt2(userPower(account))
199+ let bp = $t038343877._1
200+ let bpu = $t038343877._2
201+ ((("bp:" + toString(bp)) + ", bpu:") + toString(bpu))
202+ }
203+
204+
205+func validateAfter (user,op) = {
206+ let $t039874018 = userPower(user)
207+ let bp = $t039874018._1
208+ let bpu = $t039874018._2
209+ let accHealth = (((bp - bpu) * factorsBase) / bp)
210+ if (if ((bp == 0))
211+ then (bpu == 0)
212+ else false)
213+ then nil
214+ else if (if ((bp == 0))
215+ then (bpu > 0)
216+ else false)
217+ then throw(((op + " too much: breaching liquidation threshold(bp=0, bpu=") + toString(bpu)))
218+ else if ((accountHealthThreshold > accHealth))
219+ then throw((((((((op + " too much: breaching liquidation threshold(bp=") + toString(bp)) + ", bpu=") + toString(bpu)) + ", health=") + toString(accHealth)) + ")"))
220+ else nil
221+ }
222+
223+
224+@Callable(i)
225+func initialize (configAddress) = [writeConstString(adminStore, toString(i.caller)), writeConstString(configStore, configAddress)]
226+
227+
228+
229+@Callable(i)
230+func registerReserves (addresses) = if ((i.caller != admin))
231+ then throw("only admin can do")
232+ else [StringEntry(reservesStore, addresses)]
233+
234+
235+
236+@Callable(i)
237+func deposit (reserve,useAsCollateral) = {
238+ let user = toString(i.caller)
239+ let doDeposit = invoke(addressFromStringValue(reserve), "depositFor", [user, useAsCollateral], i.payments)
240+ if ((doDeposit == doDeposit))
241+ then if (!(useAsCollateral))
242+ then validateAfter(user, "depositing")
243+ else nil
244+ else throw("Strict value is not equal to itself.")
245+ }
246+
247+
248+
249+@Callable(i)
250+func mintAtoken (aTokenId,amount) = {
251+ let user = toString(i.caller)
252+ let targetContract = findReserveBy(aTokenIdStore, aTokenId)
253+ let doMint = invoke(targetContract, "mintAtokenFor", [user, amount], nil)
254+ if ((doMint == doMint))
255+ then validateAfter(user, "minting")
256+ else throw("Strict value is not equal to itself.")
257+ }
258+
259+
260+
261+@Callable(i)
262+func withdraw (assetId,amount) = {
263+ let user = toString(i.caller)
264+ let targetContract = findReserveBy(assetIdStore, assetId)
265+ let doWithdraw = invoke(targetContract, "withdrawFor", [user, amount], nil)
266+ if ((doWithdraw == doWithdraw))
267+ then validateAfter(user, "withdrawing")
268+ else throw("Strict value is not equal to itself.")
269+ }
270+
271+
272+
273+@Callable(i)
274+func withdraw2 (reserve,amount) = {
275+ let user = toString(i.caller)
276+ let targetContract = addressFromStringValue(reserve)
277+ let doWithdraw = invoke(targetContract, "withdrawFor", [user, amount], nil)
278+ if ((doWithdraw == doWithdraw))
279+ then validateAfter(user, "withdrawing2")
280+ else throw("Strict value is not equal to itself.")
281+ }
282+
283+
284+
285+@Callable(i)
286+func borrow (assetId,amount) = {
287+ let user = toString(i.caller)
288+ let targetContract = findReserveBy(assetIdStore, assetId)
289+ let doBorrow = invoke(targetContract, "borrowFor", [user, amount], nil)
290+ if ((doBorrow == doBorrow))
291+ then validateAfter(user, "borrowing")
292+ else throw("Strict value is not equal to itself.")
293+ }
294+
295+
296+
297+@Callable(i)
298+func borrow2 (reserve,amount) = {
299+ let user = toString(i.caller)
300+ let targetContract = valueOrErrorMessage(addressFromString(reserve), "bad reserve address")
301+ let doBorrow = invoke(targetContract, "borrowFor", [user, amount], nil)
302+ if ((doBorrow == doBorrow))
303+ then validateAfter(user, "borrowing2")
304+ else throw("Strict value is not equal to itself.")
305+ }
306+
307+
308+
309+@Callable(i)
310+func disableUseAsCollateral (reserve) = {
311+ let user = toString(i.caller)
312+ let doSetCollateral = invoke(valueOrErrorMessage(addressFromString(reserve), "bad reserve"), "disableUseAsCollateralFor", [user], nil)
313+ if ((doSetCollateral == doSetCollateral))
314+ then validateAfter(user, "changing collateral status")
315+ else throw("Strict value is not equal to itself.")
316+ }
317+
318+
319+
320+@Callable(i)
321+func transferDebt (borrowReserve,collateralReserve,borrower,liquidateDebtAmount) = if ((0 >= liquidateDebtAmount))
322+ then throw("can't liquidate non-positive amount")
323+ else if ((collateralReserve == borrowReserve))
324+ then throw("collateralReserve equals borrowReserve")
325+ else {
326+ let liquidator = toString(i.caller)
327+ if ((liquidator == borrower))
328+ then throw("can't liquidate self")
329+ else {
330+ let $t073157350 = userPower(borrower)
331+ let bp = $t073157350._1
332+ let bpu = $t073157350._2
333+ if ((bp > bpu))
334+ then throw(((((("can't liquidate healthy user: u=" + borrower) + ", bp=") + toString(bp)) + ", bpu=") + toString(bpu)))
335+ else {
336+ let br = addressFromStringValue(borrowReserve)
337+ let cr = addressFromStringValue(collateralReserve)
338+ let borrowAsset = valueOrErrorMessage(getString(br, "assetId"), ("no assetId field in borrowReserve " + borrowReserve))
339+ let isCollateral = valueOrElse(getBoolean(cr, (borrower + "_useAsCollateral")), false)
340+ if ((isCollateral == isCollateral))
341+ then if (!(isCollateral))
342+ then throw("can't liquidate deposit not used as collateral")
343+ else {
344+ let $t078827972 = userBalance(br, borrower)
345+ if (($t078827972 == $t078827972))
346+ then {
347+ let userDebtUsd = $t078827972._5
348+ let userDebt = $t078827972._4
349+ let userAssetUsd = $t078827972._3
350+ let userAsset = $t078827972._2
351+ let ignore = $t078827972._1
352+ if ((userAsset >= userDebt))
353+ then throw("can't liquidate debt of asset of positive saldo")
354+ else if ((0 >= liquidateDebtAmount))
355+ then throw("can't liquidate zero or negative amount")
356+ else if (((liquidateDebtAmount * 2) > (userDebt - userAsset)))
357+ then throw(((((("can't liquidate more than half of saldo: debt=" + toString(userDebt)) + ", deposit=") + toString(userAsset)) + ", liquidateDebtAmount = ") + toString(liquidateDebtAmount)))
358+ else {
359+ let collateralUsd = fraction(liquidateDebtAmount, userDebtUsd, userDebt)
360+ let penaltizedUsd = fraction(collateralUsd, (factorsBase + liquidationPenalty(borrowAsset)), factorsBase)
361+ let transferCollateral = asInt(invoke(cr, "transferATokensFor", [borrower, liquidator, penaltizedUsd], nil))
362+ if ((transferCollateral == transferCollateral))
363+ then {
364+ let transferDebt = invoke(br, "transferDebtFor", [borrower, liquidator, liquidateDebtAmount], nil)
365+ if ((transferDebt == transferDebt))
366+ then $Tuple2(validateAfter(liquidator, "transferring debt"), transferCollateral)
367+ else throw("Strict value is not equal to itself.")
368+ }
369+ else throw("Strict value is not equal to itself.")
370+ }
371+ }
372+ else throw("Strict value is not equal to itself.")
373+ }
374+ else throw("Strict value is not equal to itself.")
375+ }
376+ }
377+ }
378+
379+
380+
381+@Callable(i)
382+func forceCollapse (reserve,borrower) = {
383+ let liquidator = toString(i.caller)
384+ if ((liquidator == borrower))
385+ then throw("can't collapse self in this function")
386+ else {
387+ let $t091299164 = userPower(borrower)
388+ let bp = $t091299164._1
389+ let bpu = $t091299164._2
390+ if ((bp > bpu))
391+ then throw(((((("can't force collapse healthy user: u=" + borrower) + ", bp=") + toString(bp)) + ", bpu=") + toString(bpu)))
392+ else {
393+ let reserveAddress = addressFromStringValue(reserve)
394+ let $t093679469 = userBalance(reserveAddress, borrower)
395+ if (($t093679469 == $t093679469))
396+ then {
397+ let userDebtUsd = $t093679469._5
398+ let userDebt = $t093679469._4
399+ let userAssetUsd = $t093679469._3
400+ let userAsset = $t093679469._2
401+ let ignore = $t093679469._1
402+ let penaltizedUsd = fraction(min([userAssetUsd, userDebtUsd]), collapsePenalty, factorsBase)
403+ let bonus = invoke(reserveAddress, "transferATokensFor", [borrower, liquidator, penaltizedUsd], nil)
404+ if ((bonus == bonus))
405+ then {
406+ let collapse = invoke(reserveAddress, "collapseFor", [borrower], nil)
407+ if ((collapse == collapse))
408+ then nil
409+ else throw("Strict value is not equal to itself.")
410+ }
411+ else throw("Strict value is not equal to itself.")
412+ }
413+ else throw("Strict value is not equal to itself.")
414+ }
415+ }
416+ }
417+
418+

github/deemru/w8io/786bc32 
36.44 ms