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:
Old | New | Differences | |
---|---|---|---|
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 ◑