tx · BGdn1CTMD15hT3Y29evbW5xkEPDxVzjM3eA62Sct1rmy 3N3tDUvYTUkPj99XK6ahYY1seKQssSPSUxa: -0.04000000 Waves 2022.05.21 19:04 [2061653] smart account 3N3tDUvYTUkPj99XK6ahYY1seKQssSPSUxa > SELF 0.00000000 Waves
{ "type": 13, "id": "BGdn1CTMD15hT3Y29evbW5xkEPDxVzjM3eA62Sct1rmy", "fee": 4000000, "feeAssetId": null, "timestamp": 1653149016867, "version": 2, "chainId": 84, "sender": "3N3tDUvYTUkPj99XK6ahYY1seKQssSPSUxa", "senderPublicKey": "uabndDFnsGq9PjWSXCTHbtJ6qRyJrTnAiV1p3iLLEBf", "proofs": [ "Vq3JUWnj3fSn8GMr7cEvC7Cao8Fi3p65FStS2S8xJchmAW2VyZyBZSDxhzqfrKJp2rKtGUoWQK6QZYn3hYsQgVW" ], "script": "base64:AAIFAAAAAAAAAA4IAhIECgIIARIECgIIAQAAABkAAAAAC2ZhY3RvcnNCYXNlAAAAAAAAAAPoAQAAABFhc1VzZXJCYWxhbmNlRGF0YQAAAAEAAAAFdmFsdWUEAAAAByRtYXRjaDAFAAAABXZhbHVlAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAACIoSW50LCBJbnQsIEludCwgSW50LCBJbnQsIEJvb2xlYW4pBAAAAAF4BQAAAAckbWF0Y2gwBQAAAAF4BAAAAAF0BQAAAAckbWF0Y2gwCQAAAgAAAAECAAAAFWV4cGVjdGVkIGludDUmYm9vbGVhbgAAAAAKYWRtaW5TdG9yZQIAAAAFYWRtaW4AAAAAC2NvbmZpZ1N0b3JlAgAAAAZjb25maWcAAAAADXJlc2VydmVzU3RvcmUCAAAACHJlc2VydmVzAAAAAA1hVG9rZW5JZFN0b3JlAgAAAAhhVG9rZW5JZAAAAAAMYXNzZXRJZFN0b3JlAgAAAAdhc3NldElkAAAAAAVhZG1pbgkBAAAAEUBleHRyTmF0aXZlKDEwNjIpAAAAAQkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgUAAAAEdGhpcwUAAAAKYWRtaW5TdG9yZQAAAAAGY29uZmlnCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACBQAAAAR0aGlzBQAAAAtjb25maWdTdG9yZQAAAAALcmVzZXJ2ZXNTdHIJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAAA1yZXNlcnZlc1N0b3JlAgAAABZubyByZXNlcnZlcyByZWdpc3RlcmVkAAAAAAhyZXNlcnZlcwkABLUAAAACBQAAAAtyZXNlcnZlc1N0cgIAAAABfAEAAAAQYXNzZXRJZE9mUmVzZXJ2ZQAAAAEAAAAHcmVzZXJ2ZQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAAB3Jlc2VydmUFAAAADGFzc2V0SWRTdG9yZQIAAAAVbm8gYXNzZXRJZCBpbiByZXNlcnZlAQAAABBjb2xsYXRlcmFsRmFjdG9yAAAAAQAAAAdyZXNlcnZlCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAGY29uZmlnCQABLAAAAAIJAQAAABBhc3NldElkT2ZSZXNlcnZlAAAAAQUAAAAHcmVzZXJ2ZQIAAAARX0NvbGxhdGVyYWxGYWN0b3ICAAAAHW5vIENvbGxhdGVyYWxGYWN0b3IgaW4gY29uZmlnAQAAABRsaXF1aWRhdGlvblRocmVzaG9sZAAAAAEAAAAHcmVzZXJ2ZQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABmNvbmZpZwkAASwAAAACCQEAAAAQYXNzZXRJZE9mUmVzZXJ2ZQAAAAEFAAAAB3Jlc2VydmUCAAAAFV9MaXF1aWRhdGlvblRocmVzaG9sZAIAAAAhbm8gTGlxdWlkYXRpb25UaHJlc2hvbGQgaW4gY29uZmlnAQAAABJsaXF1aWRhdGlvblBlbmFsdHkAAAABAAAAB2Fzc2V0SWQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAZjb25maWcJAAEsAAAAAgUAAAAHYXNzZXRJZAIAAAATX0xpcXVpZGF0aW9uUGVuYWx0eQIAAAAfbm8gTGlxdWlkYXRpb25QZW5hbHR5IGluIGNvbmZpZwAAAAAWYWNjb3VudEhlYWx0aFRocmVzaG9sZAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABmNvbmZpZwIAAAAYYWNjb3VudF9oZWFsdGhfdGhyZXNob2xkAgAAABtubyBhY2NvdW50X2hlYWx0aF90aHJlc2hvbGQAAAAAFGFjY291bnRIZWFsdGhPdmVybGFwCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAGY29uZmlnAgAAABZhY2NvdW50X2hlYWx0aF9vdmVybGFwAgAAABlubyBhY2NvdW50X2hlYWx0aF9vdmVybGFwAAAAAA9jb2xsYXBzZVBlbmFsdHkJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAZjb25maWcCAAAAEGNvbGxhcHNlX3BlbmFsdHkCAAAAE25vIGNvbGxhcHNlX3BlbmFsdHkAAAAAC2xpcXVpZGF0b3JzCQEAAAALdmFs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YXRlcmFsRmFjdG9yAAAAAQUAAAAHcmVzZXJ2ZQQAAAACbHQJAQAAABRsaXF1aWRhdGlvblRocmVzaG9sZAAAAAEFAAAAB3Jlc2VydmUEAAAACyR0MDMwMzAzMTE4CQEAAAALdXNlckJhbGFuY2UAAAACBQAAAAdyZXNlcnZlBQAAAAR1c2VyBAAAAAV0b2tlbggFAAAACyR0MDMwMzAzMTE4AAAAAl8xBAAAAAVhc3NldAgFAAAACyR0MDMwMzAzMTE4AAAAAl8yBAAAAApkZXBvc2l0VXNkCAUAAAALJHQwMzAzMDMxMTgAAAACXzMEAAAABGRlYnQIBQAAAAskdDAzMDMwMzExOAAAAAJfNAQAAAAHZGVidFVzZAgFAAAACyR0MDMwMzAzMTE4AAAAAl81BAAAAAxhc0NvbGxhdGVyYWwIBQAAAAskdDAzMDMwMzExOAAAAAJfNgQAAAATZWZmZWN0aXZlRGVwb3NpdFVzZAMFAAAADGFzQ29sbGF0ZXJhbAUAAAAKZGVwb3NpdFVzZAAAAAAAAAAAAAQAAAAKb3ZlcmxhcFVzZAkAAZcAAAABCQAETAAAAAIFAAAAB2RlYnRVc2QJAARMAAAAAgUAAAATZWZmZWN0aXZlRGVwb3NpdFVzZAUAAAADbmlsBAAAAA1vdmVybGFwQ2hhcmdlCQEAAAAMZnJhY3Rpb25DZWlsAAAAAwUAAAAKb3ZlcmxhcFVzZAUAAAAUYWNjb3VudEhlYWx0aE92ZXJsYXAFAAAAC2ZhY3RvcnNCYXNlAwkAAGYAAAACBQAAAAdkZWJ0VXNkBQAAABNlZmZlY3RpdmVEZXBvc2l0VXNkCQAFFAAAAAIFAAAABnRvdGFsRAkAAGQAAAACCQAAZAAAAAIFAAAABnRvdGFsQgkAAGsAAAADCQAAZQAAAAIFAAAAB2RlYnRVc2QFAAAAE2VmZmVjdGl2ZURlcG9zaXRVc2QFAAAAC2ZhY3RvcnNCYXNlBQAAAAJsdAUAAAANb3ZlcmxhcENoYXJnZQkABRQAAAACCQAAZAAAAAIFAAAABnRvdGFsRAkAAGsAAAADCQAAZQAAAAIFAAAAE2VmZmVjdGl2ZURlcG9zaXRVc2QFAAAAB2RlYnRVc2QFAAAAAmNmBQAAAAtmYWN0b3JzQmFzZQkAAGQAAAACBQAAAAZ0b3RhbEIFAAAA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", "height": 2061653, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 4XFU74NbrQpJFf5axJkXTB5kgjaGitFBsk9RBaU9Ko9h Next: AQAh3Mj5gYC5vcLENxLAbSMYkcsqM5kj3UMGJMm3kJUG Full:
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 5 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | + | let factorsBase = 1000 | |
5 | + | ||
6 | + | func asUserBalanceData (value) = match value { | |
7 | + | case x: (Int, Int, Int, Int, Int, Boolean) => | |
8 | + | x | |
9 | + | case t => | |
10 | + | throw("expected int5&boolean") | |
11 | + | } | |
12 | + | ||
13 | + | ||
14 | + | let adminStore = "admin" | |
15 | + | ||
16 | + | let configStore = "config" | |
17 | + | ||
18 | + | let reservesStore = "reserves" | |
19 | + | ||
20 | + | let aTokenIdStore = "aTokenId" | |
21 | + | ||
22 | + | let assetIdStore = "assetId" | |
23 | + | ||
24 | + | let admin = addressFromStringValue(getStringValue(this, adminStore)) | |
25 | + | ||
26 | + | let config = addressFromStringValue(getStringValue(this, configStore)) | |
27 | + | ||
28 | + | let reservesStr = valueOrErrorMessage(getString(this, reservesStore), "no reserves registered") | |
29 | + | ||
30 | + | let reserves = split(reservesStr, "|") | |
31 | + | ||
32 | + | func assetIdOfReserve (reserve) = valueOrErrorMessage(getString(reserve, assetIdStore), "no assetId in reserve") | |
33 | + | ||
34 | + | ||
35 | + | func collateralFactor (reserve) = valueOrErrorMessage(getInteger(config, (assetIdOfReserve(reserve) + "_CollateralFactor")), "no CollateralFactor in config") | |
36 | + | ||
37 | + | ||
38 | + | func liquidationThreshold (reserve) = valueOrErrorMessage(getInteger(config, (assetIdOfReserve(reserve) + "_LiquidationThreshold")), "no LiquidationThreshold in config") | |
39 | + | ||
40 | + | ||
41 | + | func liquidationPenalty (assetId) = valueOrErrorMessage(getInteger(config, (assetId + "_LiquidationPenalty")), "no LiquidationPenalty in config") | |
42 | + | ||
43 | + | ||
44 | + | let accountHealthThreshold = valueOrErrorMessage(getInteger(config, "account_health_threshold"), "no account_health_threshold") | |
45 | + | ||
46 | + | let accountHealthOverlap = valueOrErrorMessage(getInteger(config, "account_health_overlap"), "no account_health_overlap") | |
47 | + | ||
48 | + | let collapsePenalty = valueOrErrorMessage(getInteger(config, "collapse_penalty"), "no collapse_penalty") | |
49 | + | ||
50 | + | let liquidators = valueOrElse(getString(config, "liquidators"), "") | |
51 | + | ||
52 | + | func validateReserve (r) = if (contains(reservesStr, r)) | |
53 | + | then true | |
54 | + | else throw(("unknown reserve:" + r)) | |
55 | + | ||
56 | + | ||
57 | + | func userBalance (reserve,user) = asUserBalanceData(invoke(reserve, "userBalance", [user], nil)) | |
58 | + | ||
59 | + | ||
60 | + | func findReserveBy (store,value) = { | |
61 | + | func fold (a,r) = match a { | |
62 | + | case found: Address => | |
63 | + | found | |
64 | + | case _ => | |
65 | + | let reserve = valueOrErrorMessage(addressFromString(r), "reserve bad address") | |
66 | + | if ((valueOrErrorMessage(getString(reserve, store), ("reserve has no " + store)) == value)) | |
67 | + | then reserve | |
68 | + | else unit | |
69 | + | } | |
70 | + | ||
71 | + | match let $l = reserves | |
72 | + | let $s = size($l) | |
73 | + | let $acc0 = unit | |
74 | + | func $f0_1 ($a,$i) = if (($i >= $s)) | |
75 | + | then $a | |
76 | + | else fold($a, $l[$i]) | |
77 | + | ||
78 | + | func $f0_2 ($a,$i) = if (($i >= $s)) | |
79 | + | then $a | |
80 | + | else throw("List size exceeds 6") | |
81 | + | ||
82 | + | $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6) { | |
83 | + | case found: Address => | |
84 | + | found | |
85 | + | case _ => | |
86 | + | throw(("unknown " + store)) | |
87 | + | } | |
88 | + | } | |
89 | + | ||
90 | + | ||
91 | + | func fractionCeil (value,numerator,denominator) = { | |
92 | + | let cand = fraction(value, numerator, denominator) | |
93 | + | let D = 3037000499 | |
94 | + | let exact = ((((cand % D) * (denominator % D)) % D) == (((value % D) * (numerator % D)) % D)) | |
95 | + | if (exact) | |
96 | + | then cand | |
97 | + | else (cand + 1) | |
98 | + | } | |
99 | + | ||
100 | + | ||
101 | + | func userPower (user) = { | |
102 | + | func fold (totals,r) = { | |
103 | + | let $t028302859 = totals | |
104 | + | let totalD = $t028302859._1 | |
105 | + | let totalB = $t028302859._2 | |
106 | + | let reserve = valueOrErrorMessage(addressFromString(r), "reserve bad address") | |
107 | + | let cf = collateralFactor(reserve) | |
108 | + | let lt = liquidationThreshold(reserve) | |
109 | + | let $t030303118 = userBalance(reserve, user) | |
110 | + | let token = $t030303118._1 | |
111 | + | let asset = $t030303118._2 | |
112 | + | let depositUsd = $t030303118._3 | |
113 | + | let debt = $t030303118._4 | |
114 | + | let debtUsd = $t030303118._5 | |
115 | + | let asCollateral = $t030303118._6 | |
116 | + | let effectiveDepositUsd = if (asCollateral) | |
117 | + | then depositUsd | |
118 | + | else 0 | |
119 | + | let overlapUsd = min([debtUsd, effectiveDepositUsd]) | |
120 | + | let overlapCharge = fractionCeil(overlapUsd, accountHealthOverlap, factorsBase) | |
121 | + | if ((debtUsd > effectiveDepositUsd)) | |
122 | + | then $Tuple2(totalD, ((totalB + fraction((debtUsd - effectiveDepositUsd), factorsBase, lt)) + overlapCharge)) | |
123 | + | else $Tuple2((totalD + fraction((effectiveDepositUsd - debtUsd), cf, factorsBase)), (totalB + overlapCharge)) | |
124 | + | } | |
125 | + | ||
126 | + | let $l = reserves | |
127 | + | let $s = size($l) | |
128 | + | let $acc0 = $Tuple2(0, 0) | |
129 | + | func $f0_1 ($a,$i) = if (($i >= $s)) | |
130 | + | then $a | |
131 | + | else fold($a, $l[$i]) | |
132 | + | ||
133 | + | func $f0_2 ($a,$i) = if (($i >= $s)) | |
134 | + | then $a | |
135 | + | else throw("List size exceeds 6") | |
136 | + | ||
137 | + | $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6) | |
138 | + | } | |
139 | + | ||
140 | + | ||
141 | + | func validateAfter (user,op) = { | |
142 | + | let $t036723703 = userPower(user) | |
143 | + | let bp = $t036723703._1 | |
144 | + | let bpu = $t036723703._2 | |
145 | + | let accHealth = (((bp - bpu) * factorsBase) / bp) | |
146 | + | if (if ((bp == 0)) | |
147 | + | then (bpu == 0) | |
148 | + | else false) | |
149 | + | then nil | |
150 | + | else if (if ((bp == 0)) | |
151 | + | then (bpu > 0) | |
152 | + | else false) | |
153 | + | then throw(((op + " too much: breaching liquidation threshold(bp=0, bpu=") + toString(bpu))) | |
154 | + | else if ((accountHealthThreshold > accHealth)) | |
155 | + | then throw((((((((op + " too much: breaching liquidation threshold(bp=") + toString(bp)) + ", bpu=") + toString(bpu)) + ", health=") + toString(accHealth)) + ")")) | |
156 | + | else nil | |
157 | + | } | |
4 | 158 | ||
5 | 159 | ||
6 | 160 | @Callable(i) | |
7 | - | func call () = { | |
8 | - | let asset = Issue("Asset", "", 1, 0, true, unit, 0) | |
9 | - | let assetId = calculateAssetId(asset) | |
10 | - | [BinaryEntry("bin", base58''), BooleanEntry("bool", true), IntegerEntry("int", 1), StringEntry("str", ""), DeleteEntry("str"), asset, Reissue(assetId, 1, false), Burn(assetId, 1), ScriptTransfer(i.caller, 1, assetId)] | |
161 | + | func withdraw (assetId,amount) = { | |
162 | + | let user = toString(i.caller) | |
163 | + | let targetContract = findReserveBy(assetIdStore, assetId) | |
164 | + | let doWithdraw = invoke(targetContract, "withdrawFor", [user, amount], nil) | |
165 | + | if ((doWithdraw == doWithdraw)) | |
166 | + | then validateAfter(user, "withdrawing") | |
167 | + | else throw("Strict value is not equal to itself.") | |
11 | 168 | } | |
12 | 169 | ||
13 | 170 | ||
14 | - | @Verifier(tx) | |
15 | - | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
171 | + | ||
172 | + | @Callable(i) | |
173 | + | func withdraw2 (reserve,amount) = { | |
174 | + | let v = validateReserve(reserve) | |
175 | + | if ((v == v)) | |
176 | + | then { | |
177 | + | let user = toString(i.caller) | |
178 | + | let targetContract = addressFromStringValue(reserve) | |
179 | + | let doWithdraw = invoke(targetContract, "withdrawFor", [user, amount], nil) | |
180 | + | if ((doWithdraw == doWithdraw)) | |
181 | + | then validateAfter(user, "withdrawing2") | |
182 | + | else throw("Strict value is not equal to itself.") | |
183 | + | } | |
184 | + | else throw("Strict value is not equal to itself.") | |
185 | + | } | |
186 | + | ||
16 | 187 |
github/deemru/w8io/873ac7e 44.43 ms ◑![]()