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:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# 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+ }
4158
5159
6160 @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.")
11168 }
12169
13170
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+
16187

github/deemru/w8io/873ac7e 
44.43 ms