2022.01.27 20:33 [2962690] smart account 3PJKKT7gsWiPBJj11gkF3Xv7gKt8s2WPdTr > SELF 0.00000000 Waves

{ "type": 13, "id": "5Eavzk8oCagrUAguJsQJghsZTdgEGRkkHHnrSg9khy43", "fee": 1000000, "feeAssetId": null, "timestamp": 1643304795740, "version": 1, "sender": "3PJKKT7gsWiPBJj11gkF3Xv7gKt8s2WPdTr", "senderPublicKey": "FAqqjX7JqvqLh2QGTR3ziyCnSsWSoj9gVo4uPahtmhKr", "proofs": [ "2Q2PyrvDWooNkfLbm6PuGWrH3D4t39kdExZdQpoE1b1xHztXajRRFGAvXaVw75SKzZdGa52dqgXXrgQLjgph4U1V" ], "script": "base64:AAIFAAAAAAAAACgIAhIECgIICBIAEgMKAQgSABIDCgEIEgUKAwgIARIECgIICBIDCgEIAAAAKwEAAAAEZ2V0SQAAAAEAAAADa2V5CQAEGgAAAAIFAAAABHRoaXMFAAAAA2tleQEAAAAEZ2V0UwAAAAEAAAADa2V5CQAEHQAAAAIFAAAABHRoaXMFAAAAA2tleQEAAAAFZ2V0U1YAAAABAAAAA2tleQkBAAAABXZhbHVlAAAAAQkABB0AAAACBQAAAAR0aGlzBQAAAANrZXkBAAAAB3Rocm93SWYAAAACAAAACWNvbmRpdGlvbgAAAAVlcnJvcgMFAAAACWNvbmRpdGlvbgkAAAIAAAABBQAAAAVlcnJvcgYBAAAACHdyaXRlSW50AAAAAgAAAANrZXkAAAAFdmFsdWUDCQAAZgAAAAIAAAAAAAAAAAAFAAAABXZhbHVlCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAF3dyaXRpbmcgbmVnYXRpdmUgdmFsdWUgCQABpAAAAAEFAAAABXZhbHVlAgAAAAkgZm9yIGtleSAFAAAAA2tleQkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAA2tleQUAAAAFdmFsdWUBAAAACGNoYW5nZUJ5AAAAAgAAAANrZXkAAAAFdmFsdWUJAQAAAAh3cml0ZUludAAAAAIFAAAAA2tleQkAAGQAAAACCQEAAAALdmFsdWVPckVsc2UAAAACCQEAAAAEZ2V0SQAAAAEFAAAAA2tleQAAAAAAAAAAAAUAAAAFdmFsdWUBAAAADGZyYWN0aW9uQ2VpbAAAAAMAAAAFdmFsdWUAAAAJbnVtZXJhdG9yAAAAC2Rlbm9taW5hdG9yBAAAAARjYW5kCQAAawAAAAMFAAAABXZhbHVlBQAAAAludW1lcmF0b3IFAAAAC2Rlbm9taW5hdG9yBAAAAAFEAAAAAAC1BPMzBAAAAAVleGFjdAkAAAAAAAACCQAAagAAAAIJAABoAAAAAgkAAGoAAAACBQAAAARjYW5kBQAAAAFECQAAagAAAAIFAAAAC2Rlbm9taW5hdG9yBQAAAAFEBQAAAAFECQAAagAAAAIJAABoAAAAAgkAAGoAAAACBQAAAAV2YWx1ZQUAAAABRAkAAGoAAAACBQAAAAludW1lcmF0b3IFAAAAAUQFAAAAAUQDBQAAAAVleGFjdAUAAAAEY2FuZAkAAGQAAAACBQAAAARjYW5kAAAAAAAAAAABAQAAABB3cml0ZUNvbnN0U3RyaW5nAAAAAgAAAANrZXkAAAAFdmFsdWUDCQEAAAABIQAAAAEJAQAAAAlpc0RlZmluZWQAAAABCQAEHQAAAAIFAAAABHRoaXMFAAAAA2tleQkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAADa2V5BQAAAAV2YWx1ZQkAAAIAAAABCQABLAAAAAICAAAAFWFscmVhZHkgaW5pdGlhbGl6ZWQ6IAUAAAADa2V5AAAAABJjb25maWdBZGRyZXNzU3RvcmUCAAAADWNvbmZpZ0FkZHJlc3MAAAAAC29yYWNsZVN0b3JlAgAAAA1vcmFjbGVBZGRyZXNzAQAAABJyZXNlcnZlRmFjdG9yU3RvcmUAAAABAAAAB2Fzc2V0SWQJAAEsAAAAAgUAAAAHYXNzZXRJZAIAAAAOX1Jlc2VydmVGYWN0b3IAAAAACW1haW5TdG9yZQIAAAAEbWFpbgAAAAANY29uZmlnQWRkcmVzcwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEJgAAAAEJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkBAAAABGdldFMAAAABBQAAABJjb25maWdBZGRyZXNzU3RvcmUCAAAAEG5vIGNvbmZpZ0FkZHJlc3MCAAAAFmludmFsaWQgY29uZmlnIGFkZHJlc3MBAAAADXJlc2VydmVGYWN0b3IAAAABAAAAB2Fzc2V0SWQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA1jb25maWdBZGRyZXNzCQEAAAAScmVzZXJ2ZUZhY3RvclN0b3JlAAAAAQUAAAAHYXNzZXRJZAIAAAAQbm8gcmVzZXJ2ZUZhY3RvcgEAAAAKZ2V0QmFsYW5jZQAAAAIAAAAOYWRkcmVzc09yQWxpYXMAAAAHYXNzZXRJZAQAAAAHJG1hdGNoMAUAAAAHYXNzZXRJZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAKQnl0ZVZlY3RvcgQAAAACYnYFAAAAByRtYXRjaDAJAAPwAAAAAgUAAAAOYWRkcmVzc09yQWxpYXMFAAAAAmJ2AwkAAAEAAAAC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c2UAAAACCQAEGwAAAAIFAAAABHRoaXMJAQAAABFoYXNQcm90ZWN0ZWRTdG9yZQAAAAEFAAAABHVzZXIHBAAAAA5wcm90ZWN0ZWRBc3NldAkABB0AAAACBQAAAAR0aGlzCQEAAAATcHJvdGVjdGVkQXNzZXRTdG9yZQAAAAEFAAAABHVzZXIEAAAAC2NvbnNpc3RlbmN5AwUAAAANcHJvdGVjdGVkRmxhZwQAAAAHJG1hdGNoMAUAAAAOcHJvdGVjdGVkQXNzZXQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABcwUAAAAHJG1hdGNoMAMJAAAAAAAAAgUAAAABcwUAAAAHYXNzZXRJZAYJAAACAAAAAQIAAAA7cHJvdGVjdGVkLXJlc2VydmU6IGNhbid0IGhhdmUgbW9yZSB0aGFuIG9uZSBhc3NldCBwcm90ZWN0ZWQJAAACAAAAAQIAAAAgcHJvdGVjdGVkLXJlc2VydmU6Y2xlYW4gdXAgZmlyc3QEAAAAByRtYXRjaDAFAAAADnByb3RlY3RlZEFzc2V0AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAXMFAAAAByRtYXRjaDAJAAACAAAAAQIAAAAjcHJvdGVjdGVkLXJlc2VydmU6IG1pc2NvbmZpZ3VyYXRpb24GBAAAABBjb25zaXN0ZW5jeUNoZWNrCQEAAAAHdGhyb3dJZgAAAAIJAQAAAAEhAAAAAQUAAAALY29uc2lzdGVuY3kCAAAADWluY29uc2lzdGVuY3kDCQAAAAAAAAIFAAAAEGNvbnNpc3RlbmN5Q2hlY2sFAAAAEGNvbnNpc3RlbmN5Q2hlY2sEAAAACW5ld1NoYXJlcwkBAAAADmFtb3VudFRvU2hhcmVzAAAAAwUAAAAHYXNzZXRJZAUAAAAGYW1vdW50BwQAAAAHc3Rha2luZwkBAAAADXN0YWtpbmdBY3Rpb24AAAACBQAAAAdhc3NldElkAAAAAAAAAAAAAwkAAAAAAAACBQAAAAdzdGFraW5nBQAAAAdzdGFraW5nCQAETAAAAAIJAQAAAAhjaGFuZ2VCeQAAAAIJAQAAABF0b3RhbERlcG9zaXRTdG9yZQAAAAEFAAAAB2Fzc2V0SWQFAAAABmFtb3VudAkABEwAAAACCQEAAAAIY2hhbmdlQnkAAAACCQEAAAAQdG90YWxTaGFyZXNTdG9yZQAAAAEFAAAAB2Fzc2V0SWQFAAAACW5ld1NoYXJlcwkABEwAAAACCQEAAAAIY2hhbmdlQnkAAAACCQEAAAAPdXNlclNoYXJlc1N0b3JlAAAAAgUAAAAHYXNzZXRJZAUAAAAEdXNlcgUAAAAJbmV3U2hhcmVzCQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACCQEAAAARaGFzUHJvdGVjdGVkU3RvcmUAAAABBQAAAAR1c2VyBgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAATcHJvdGVjdGVkQXNzZXRTdG9yZQAAAAEFAAAABHVzZXIFAAAAB2Fzc2V0SWQFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAgAAAABaQEAAAAKaW5pdGlhbGl6ZQAAAAIAAAANY29uZmlnQWRkcmVzcwAAAApvcmFjbGVBZGRyCQAETAAAAAIJAQAAABB3cml0ZUNvbnN0U3RyaW5nAAAAAgUAAAASY29uZmlnQWRkcmVzc1N0b3JlBQAAAA1jb25maWdBZGRyZXNzCQAETAAAAAIJAQAAABB3cml0ZUNvbnN0U3RyaW5nAAAAAgUAAAALb3JhY2xlU3RvcmUFAAAACm9yYWNsZUFkZHIFAAAAA25pbAAAAAFpAQAAAAthZGRJbnRlcmVzdAAAAAAEAAAAB2Fzc2V0SWQJAQAAAAphc3NldElkU3RyAAAAAQgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAHYXNzZXRJZAQAAAAGY2hlY2tzCQEAAAAPdmFsaWRhdGVBc3NldElkAAAAAQUAAAAHYXNzZXRJZAMJAAAAAAAAAgUAAAAGY2hlY2tzBQAAAAZjaGVja3MEAAAAB3N0YWtpbmcJAQAAAA1zdGFraW5nQWN0aW9uAAAAAgUAAAAHYXNzZXRJZAAAAAAAAAAAAAMJ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", "chainId": 87, "height": 2962690, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: HFdJT3jqfASFZDyAXU274My3wwRnwpq3TRH2kcCzvMTw Next: Gu2H3W8GtE6sdWn3pjU2amDcZBEMFG3EeRXEEP7MsBUh Diff:
OldNewDifferences
112112 func hasProtectedStore (user) = ("protected_collateral_" + user)
113113
114114
115+func protectedAssetStore (user) = ("protected_asset_" + user)
116+
117+
115118 func totalDeposit (assetId) = valueOrElse(getInteger(totalDepositStore(assetId)), 0)
116119
117120
197200 func assetToUsd (assetId,amount) = fraction(amount, oraclePrice(assetId), pow10(assetDecimals(assetId)))
198201
199202 func fold (acc,data) = (acc + {
200- let $t051795204 = data
201- let assetId = $t051795204._1
202- let amt = $t051795204._2
203+ let $t052925317 = data
204+ let assetId = $t052925317._1
205+ let amt = $t052925317._2
203206 fraction(assetToUsd(assetId, amt), collateralFactor(assetId), factorsBase)
204207 })
205208
308311 let checks = validateAssetId(assetId)
309312 if ((checks == checks))
310313 then {
311- let $t075357867 = if ((amount == -1))
314+ let realShares = userShares(assetId, from)
315+ let $t076947978 = if ((amount == -1))
312316 then {
313- let realShares = userShares(assetId, from)
314317 let realAmount = sharesToAmount(assetId, realShares)
315318 $Tuple2(realShares, realAmount)
316319 }
317320 else if ((0 >= amount))
318321 then throw("protected-reserve: non-positive amount")
319322 else $Tuple2(amountToShares(assetId, amount, true), amount)
320- let wdShares = $t075357867._1
321- let wdAmount = $t075357867._2
323+ let wdShares = $t076947978._1
324+ let wdAmount = $t076947978._2
325+ let maybeCleanUp = if ((realShares == wdShares))
326+ then [BooleanEntry(hasProtectedStore(from), false), DeleteEntry(protectedAssetStore(from))]
327+ else nil
322328 let staking = stakingAction(assetId, wdAmount)
323329 if ((staking == staking))
324- then $Tuple2([changeBy(totalDepositStore(assetId), -(wdAmount)), changeBy(totalSharesStore(assetId), -(wdShares)), changeBy(userSharesStore(assetId, from), -(wdShares)), ScriptTransfer(addressFromStringValue(to), wdAmount, assetStrToId(assetId))], wdAmount)
330+ then $Tuple2((maybeCleanUp ++ [changeBy(totalDepositStore(assetId), -(wdAmount)), changeBy(totalSharesStore(assetId), -(wdShares)), changeBy(userSharesStore(assetId, from), -(wdShares)), ScriptTransfer(addressFromStringValue(to), wdAmount, assetStrToId(assetId))]), wdAmount)
325331 else throw("Strict value is not equal to itself.")
326332 }
327333 else throw("Strict value is not equal to itself.")
329335
330336
331337 func supplyInternal (user,i) = if (hasRegularDeposit(user))
332- then throw("protected-reserve: can't have protected and regular deposits at the same time")
338+ then throw("protected-reserve: can't have protected when regular exists")
333339 else if ((size(i.payments) != 1))
334340 then throw("protected-reserve: single payment required")
335341 else {
343349 else false
344350 if ((checks == checks))
345351 then {
346- let newShares = amountToShares(assetId, amount, false)
347- let staking = stakingAction(assetId, 0)
348- if ((staking == staking))
349- then [changeBy(totalDepositStore(assetId), amount), changeBy(totalSharesStore(assetId), newShares), changeBy(userSharesStore(assetId, user), newShares), BooleanEntry(hasProtectedStore(user), true)]
352+ let protectedFlag = valueOrElse(getBoolean(this, hasProtectedStore(user)), false)
353+ let protectedAsset = getString(this, protectedAssetStore(user))
354+ let consistency = if (protectedFlag)
355+ then match protectedAsset {
356+ case s: String =>
357+ if ((s == assetId))
358+ then true
359+ else throw("protected-reserve: can't have more than one asset protected")
360+ case _ =>
361+ throw("protected-reserve:clean up first")
362+ }
363+ else match protectedAsset {
364+ case s: String =>
365+ throw("protected-reserve: misconfiguration")
366+ case _ =>
367+ true
368+ }
369+ let consistencyCheck = throwIf(!(consistency), "inconsistency")
370+ if ((consistencyCheck == consistencyCheck))
371+ then {
372+ let newShares = amountToShares(assetId, amount, false)
373+ let staking = stakingAction(assetId, 0)
374+ if ((staking == staking))
375+ then [changeBy(totalDepositStore(assetId), amount), changeBy(totalSharesStore(assetId), newShares), changeBy(userSharesStore(assetId, user), newShares), BooleanEntry(hasProtectedStore(user), true), StringEntry(protectedAssetStore(user), assetId)]
376+ else throw("Strict value is not equal to itself.")
377+ }
350378 else throw("Strict value is not equal to itself.")
351379 }
352380 else throw("Strict value is not equal to itself.")
421449 }
422450
423451
452+
453+@Callable(i)
454+func cleanUpUser (user) = {
455+ func fold (firstNonZero,assetId) = if (isDefined(firstNonZero))
456+ then firstNonZero
457+ else if ((userShares(assetId, user) > 0))
458+ then assetId
459+ else unit
460+
461+ let nonZero = {
462+ let $l = assetsArray
463+ let $s = size($l)
464+ let $acc0 = unit
465+ func $f0_1 ($a,$i) = if (($i >= $s))
466+ then $a
467+ else fold($a, $l[$i])
468+
469+ func $f0_2 ($a,$i) = if (($i >= $s))
470+ then $a
471+ else throw("List size exceeds 7")
472+
473+ $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)
474+ }
475+ match nonZero {
476+ case s: String =>
477+[StringEntry(protectedAssetStore(user), s), BooleanEntry(hasProtectedStore(user), true)]
478+ case _ =>
479+[DeleteEntry(protectedAssetStore(user)), BooleanEntry(hasProtectedStore(user), false)]
480+ }
481+ }
482+
483+
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func getI (key) = getInteger(this, key)
55
66
77 func getS (key) = getString(this, key)
88
99
1010 func getSV (key) = value(getString(this, key))
1111
1212
1313 func throwIf (condition,error) = if (condition)
1414 then throw(error)
1515 else true
1616
1717
1818 func writeInt (key,value) = if ((0 > value))
1919 then throw(((("writing negative value " + toString(value)) + " for key ") + key))
2020 else IntegerEntry(key, value)
2121
2222
2323 func changeBy (key,value) = writeInt(key, (valueOrElse(getI(key), 0) + value))
2424
2525
2626 func fractionCeil (value,numerator,denominator) = {
2727 let cand = fraction(value, numerator, denominator)
2828 let D = 3037000499
2929 let exact = ((((cand % D) * (denominator % D)) % D) == (((value % D) * (numerator % D)) % D))
3030 if (exact)
3131 then cand
3232 else (cand + 1)
3333 }
3434
3535
3636 func writeConstString (key,value) = if (!(isDefined(getString(this, key))))
3737 then StringEntry(key, value)
3838 else throw(("already initialized: " + key))
3939
4040
4141 let configAddressStore = "configAddress"
4242
4343 let oracleStore = "oracleAddress"
4444
4545 func reserveFactorStore (assetId) = (assetId + "_ReserveFactor")
4646
4747
4848 let mainStore = "main"
4949
5050 let configAddress = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getS(configAddressStore), "no configAddress")), "invalid config address")
5151
5252 func reserveFactor (assetId) = valueOrErrorMessage(getInteger(configAddress, reserveFactorStore(assetId)), "no reserveFactor")
5353
5454
5555 func getBalance (addressOrAlias,assetId) = match assetId {
5656 case bv: ByteVector =>
5757 assetBalance(addressOrAlias, bv)
5858 case u: Unit =>
5959 wavesBalance(addressOrAlias).available
6060 case _ =>
6161 throw("Match error")
6262 }
6363
6464
6565 func opAllowed (assetId,op) = match invoke(configAddress, "opAllowed", [assetId, op], nil) {
6666 case b: Boolean =>
6767 if (b)
6868 then true
6969 else throw("not allowed")
7070 case _ =>
7171 throw("opAllowed: unexpected result type")
7272 }
7373
7474
7575 func mainOnly (i) = if ((i.caller != valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, mainStore), "no main in config")), "invalid main address")))
7676 then throw("only main can do")
7777 else true
7878
7979
8080 let maybeOracleAddress = match getS(oracleStore) {
8181 case s: String =>
8282 addressFromString(s)
8383 case _ =>
8484 unit
8585 }
8686
8787 func oraclePrice (assetId) = match invoke(valueOrErrorMessage(maybeOracleAddress, "no oracle"), "price", [assetId], nil) {
8888 case i: Int =>
8989 i
9090 case _ =>
9191 throw("bad oracle data")
9292 }
9393
9494
9595 let HEIGHT = height
9696
9797 let assets = valueOrElse(getString(configAddress, "protected_reserve_assets"), "")
9898
9999 let assetsArray = if ((assets == ""))
100100 then nil
101101 else split(assets, "|")
102102
103103 func totalDepositStore (assetId) = ("totalSupply_" + assetId)
104104
105105
106106 func totalSharesStore (assetId) = ("totalShares_" + assetId)
107107
108108
109109 func userSharesStore (assetId,user) = ((("userShares_" + assetId) + "_") + user)
110110
111111
112112 func hasProtectedStore (user) = ("protected_collateral_" + user)
113113
114114
115+func protectedAssetStore (user) = ("protected_asset_" + user)
116+
117+
115118 func totalDeposit (assetId) = valueOrElse(getInteger(totalDepositStore(assetId)), 0)
116119
117120
118121 func totalShares (assetId) = valueOrElse(getInteger(totalSharesStore(assetId)), 0)
119122
120123
121124 func userShares (assetId,user) = valueOrElse(getInteger(userSharesStore(assetId, user)), 0)
122125
123126
124127 func userDeposit (assetId,user) = {
125128 let ts = totalShares(assetId)
126129 let td = totalDeposit(assetId)
127130 let us = userShares(assetId, user)
128131 if ((ts == 0))
129132 then 0
130133 else fraction(td, us, ts)
131134 }
132135
133136
134137 func hasRegularDeposit (user) = {
135138 let reserves = split(valueOrErrorMessage(getString(addressFromStringValue(getStringValue(configAddress, mainStore)), "reserves"), "protected: no reserves found in main"), "|")
136139 func asUserBalanceData (value) = match value {
137140 case x: (Int, Int, Int, Int, Int, Boolean) =>
138141 x
139142 case t =>
140143 throw("wrong type, expected: Int5&Boolean")
141144 }
142145
143146 func fold (acc,reserve) = {
144147 let ubd = asUserBalanceData(invoke(addressFromStringValue(reserve), "userBalance", [user], nil))
145148 if ((ubd._1 > 0))
146149 then throw("can't have protected when regular exists")
147150 else false
148151 }
149152
150153 let $l = reserves
151154 let $s = size($l)
152155 let $acc0 = false
153156 func $f0_1 ($a,$i) = if (($i >= $s))
154157 then $a
155158 else fold($a, $l[$i])
156159
157160 func $f0_2 ($a,$i) = if (($i >= $s))
158161 then $a
159162 else throw("List size exceeds 7")
160163
161164 $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)
162165 }
163166
164167
165168 func userState (user) = {
166169 func fold (acc,assetId) = (acc ++ [$Tuple2(assetId, userDeposit(assetId, user))])
167170
168171 let $l = assetsArray
169172 let $s = size($l)
170173 let $acc0 = nil
171174 func $f0_1 ($a,$i) = if (($i >= $s))
172175 then $a
173176 else fold($a, $l[$i])
174177
175178 func $f0_2 ($a,$i) = if (($i >= $s))
176179 then $a
177180 else throw("List size exceeds 7")
178181
179182 $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)
180183 }
181184
182185
183186 func bp (user) = {
184187 let factorsBase = 1000
185188 func collateralFactor (assetId) = valueOrErrorMessage(getInteger(configAddress, (assetId + "_CollateralFactor")), "no CollateralFactor in config")
186189
187190 func pow10 (n) = if ((n == 6))
188191 then 1000000
189192 else if ((n == 8))
190193 then 100000000
191194 else throw(("bad decimals: " + toString(n)))
192195
193196 func assetDecimals (assetId) = if ((assetId == "WAVES"))
194197 then 8
195198 else valueOrErrorMessage(assetInfo(fromBase58String(assetId)), "bad asset").decimals
196199
197200 func assetToUsd (assetId,amount) = fraction(amount, oraclePrice(assetId), pow10(assetDecimals(assetId)))
198201
199202 func fold (acc,data) = (acc + {
200- let $t051795204 = data
201- let assetId = $t051795204._1
202- let amt = $t051795204._2
203+ let $t052925317 = data
204+ let assetId = $t052925317._1
205+ let amt = $t052925317._2
203206 fraction(assetToUsd(assetId, amt), collateralFactor(assetId), factorsBase)
204207 })
205208
206209 let $l = userState(user)
207210 let $s = size($l)
208211 let $acc0 = 0
209212 func $f0_1 ($a,$i) = if (($i >= $s))
210213 then $a
211214 else fold($a, $l[$i])
212215
213216 func $f0_2 ($a,$i) = if (($i >= $s))
214217 then $a
215218 else throw("List size exceeds 7")
216219
217220 $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)
218221 }
219222
220223
221224 func adviseUser (user) = {
222225 let borrowPower = bp(user)
223226 (("borrowPower = " + toString(borrowPower)) + {
224227 func fold (acc,pair) = ((((acc + ", ") + pair._1) + " = ") + toString(pair._2))
225228
226229 let $l = userState(user)
227230 let $s = size($l)
228231 let $acc0 = ""
229232 func $f0_1 ($a,$i) = if (($i >= $s))
230233 then $a
231234 else fold($a, $l[$i])
232235
233236 func $f0_2 ($a,$i) = if (($i >= $s))
234237 then $a
235238 else throw("List size exceeds 7")
236239
237240 $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)
238241 })
239242 }
240243
241244
242245 func sharesToAmount (assetId,shares) = {
243246 let ts = totalShares(assetId)
244247 let td = totalDeposit(assetId)
245248 if (if ((ts == 0))
246249 then true
247250 else (td == 0))
248251 then shares
249252 else fraction(shares, td, ts)
250253 }
251254
252255
253256 func amountToShares (assetId,amt,ceil) = {
254257 let ts = totalShares(assetId)
255258 let td = totalDeposit(assetId)
256259 if (if ((ts == 0))
257260 then true
258261 else (td == 0))
259262 then amt
260263 else if (ceil)
261264 then fractionCeil(amt, ts, td)
262265 else fraction(amt, ts, td)
263266 }
264267
265268
266269 func validateAssetId (assetId) = throwIf(!(contains(assets, assetId)), "assetId not permitted")
267270
268271
269272 func assetIdStr (aid) = match aid {
270273 case bv: ByteVector =>
271274 toBase58String(bv)
272275 case u: Unit =>
273276 "WAVES"
274277 case _ =>
275278 throw("Match error")
276279 }
277280
278281
279282 func assetStrToId (assetId) = if ((assetId == "WAVES"))
280283 then unit
281284 else fromBase58String(assetId)
282285
283286
284287 func stakingAction (assetId,keepAtBalance) = {
285288 let actualBalance = if ((assetId == "WAVES"))
286289 then wavesBalance(this).available
287290 else assetBalance(this, fromBase58String(assetId))
288291 if ((actualBalance == keepAtBalance))
289292 then unit
290293 else {
291294 let stakingEnabled = valueOrElse(getBoolean(configAddress, ("protected_staking_enabled_" + assetId)), false)
292295 if (!(stakingEnabled))
293296 then unit
294297 else {
295298 let stakingAddress = {
296299 let addr = valueOrErrorMessage(getString(configAddress, ("protected_staking_config_" + assetId)), ("no staking address for " + assetId))
297300 valueOrErrorMessage(addressFromString(addr), ((("protectedReserve: bad staking address for " + assetId) + ": ") + addr))
298301 }
299302 if ((actualBalance > keepAtBalance))
300303 then invoke(stakingAddress, "put", nil, [AttachedPayment(assetStrToId(assetId), (actualBalance - keepAtBalance))])
301304 else invoke(stakingAddress, "get", [(keepAtBalance - actualBalance)], nil)
302305 }
303306 }
304307 }
305308
306309
307310 func withdrawInternal (from,to,assetId,amount) = {
308311 let checks = validateAssetId(assetId)
309312 if ((checks == checks))
310313 then {
311- let $t075357867 = if ((amount == -1))
314+ let realShares = userShares(assetId, from)
315+ let $t076947978 = if ((amount == -1))
312316 then {
313- let realShares = userShares(assetId, from)
314317 let realAmount = sharesToAmount(assetId, realShares)
315318 $Tuple2(realShares, realAmount)
316319 }
317320 else if ((0 >= amount))
318321 then throw("protected-reserve: non-positive amount")
319322 else $Tuple2(amountToShares(assetId, amount, true), amount)
320- let wdShares = $t075357867._1
321- let wdAmount = $t075357867._2
323+ let wdShares = $t076947978._1
324+ let wdAmount = $t076947978._2
325+ let maybeCleanUp = if ((realShares == wdShares))
326+ then [BooleanEntry(hasProtectedStore(from), false), DeleteEntry(protectedAssetStore(from))]
327+ else nil
322328 let staking = stakingAction(assetId, wdAmount)
323329 if ((staking == staking))
324- then $Tuple2([changeBy(totalDepositStore(assetId), -(wdAmount)), changeBy(totalSharesStore(assetId), -(wdShares)), changeBy(userSharesStore(assetId, from), -(wdShares)), ScriptTransfer(addressFromStringValue(to), wdAmount, assetStrToId(assetId))], wdAmount)
330+ then $Tuple2((maybeCleanUp ++ [changeBy(totalDepositStore(assetId), -(wdAmount)), changeBy(totalSharesStore(assetId), -(wdShares)), changeBy(userSharesStore(assetId, from), -(wdShares)), ScriptTransfer(addressFromStringValue(to), wdAmount, assetStrToId(assetId))]), wdAmount)
325331 else throw("Strict value is not equal to itself.")
326332 }
327333 else throw("Strict value is not equal to itself.")
328334 }
329335
330336
331337 func supplyInternal (user,i) = if (hasRegularDeposit(user))
332- then throw("protected-reserve: can't have protected and regular deposits at the same time")
338+ then throw("protected-reserve: can't have protected when regular exists")
333339 else if ((size(i.payments) != 1))
334340 then throw("protected-reserve: single payment required")
335341 else {
336342 let assetId = assetIdStr(i.payments[0].assetId)
337343 let amount = i.payments[0].amount
338344 if ((amount == 0))
339345 then nil
340346 else {
341347 let checks = if (validateAssetId(assetId))
342348 then opAllowed(assetId, "supply_protected_collateral")
343349 else false
344350 if ((checks == checks))
345351 then {
346- let newShares = amountToShares(assetId, amount, false)
347- let staking = stakingAction(assetId, 0)
348- if ((staking == staking))
349- then [changeBy(totalDepositStore(assetId), amount), changeBy(totalSharesStore(assetId), newShares), changeBy(userSharesStore(assetId, user), newShares), BooleanEntry(hasProtectedStore(user), true)]
352+ let protectedFlag = valueOrElse(getBoolean(this, hasProtectedStore(user)), false)
353+ let protectedAsset = getString(this, protectedAssetStore(user))
354+ let consistency = if (protectedFlag)
355+ then match protectedAsset {
356+ case s: String =>
357+ if ((s == assetId))
358+ then true
359+ else throw("protected-reserve: can't have more than one asset protected")
360+ case _ =>
361+ throw("protected-reserve:clean up first")
362+ }
363+ else match protectedAsset {
364+ case s: String =>
365+ throw("protected-reserve: misconfiguration")
366+ case _ =>
367+ true
368+ }
369+ let consistencyCheck = throwIf(!(consistency), "inconsistency")
370+ if ((consistencyCheck == consistencyCheck))
371+ then {
372+ let newShares = amountToShares(assetId, amount, false)
373+ let staking = stakingAction(assetId, 0)
374+ if ((staking == staking))
375+ then [changeBy(totalDepositStore(assetId), amount), changeBy(totalSharesStore(assetId), newShares), changeBy(userSharesStore(assetId, user), newShares), BooleanEntry(hasProtectedStore(user), true), StringEntry(protectedAssetStore(user), assetId)]
376+ else throw("Strict value is not equal to itself.")
377+ }
350378 else throw("Strict value is not equal to itself.")
351379 }
352380 else throw("Strict value is not equal to itself.")
353381 }
354382 }
355383
356384
357385 @Callable(i)
358386 func initialize (configAddress,oracleAddr) = [writeConstString(configAddressStore, configAddress), writeConstString(oracleStore, oracleAddr)]
359387
360388
361389
362390 @Callable(i)
363391 func addInterest () = {
364392 let assetId = assetIdStr(i.payments[0].assetId)
365393 let checks = validateAssetId(assetId)
366394 if ((checks == checks))
367395 then {
368396 let staking = stakingAction(assetId, 0)
369397 if ((staking == staking))
370398 then {
371399 let amount = i.payments[0].amount
372400 [changeBy(totalDepositStore(assetId), amount)]
373401 }
374402 else throw("Strict value is not equal to itself.")
375403 }
376404 else throw("Strict value is not equal to itself.")
377405 }
378406
379407
380408
381409 @Callable(i)
382410 func borrowPower (user) = $Tuple2(nil, bp(user))
383411
384412
385413
386414 @Callable(i)
387415 func supply () = supplyInternal(toString(i.caller), i)
388416
389417
390418
391419 @Callable(i)
392420 func supplyFor (user) = {
393421 let checks = mainOnly(i)
394422 if ((checks == checks))
395423 then supplyInternal(user, i)
396424 else throw("Strict value is not equal to itself.")
397425 }
398426
399427
400428
401429 @Callable(i)
402430 func withdrawFor (user,assetId,amount) = {
403431 let checks = if (mainOnly(i))
404432 then opAllowed(assetId, "withdraw_protected_collateral")
405433 else false
406434 if ((checks == checks))
407435 then withdrawInternal(user, user, assetId, amount)
408436 else throw("Strict value is not equal to itself.")
409437 }
410438
411439
412440
413441 @Callable(i)
414442 func withdrawToMain (user,assetId) = {
415443 let checks = if (mainOnly(i))
416444 then opAllowed(assetId, "collapse_protected_collateral")
417445 else false
418446 if ((checks == checks))
419447 then withdrawInternal(user, toString(i.caller), assetId, -1)
420448 else throw("Strict value is not equal to itself.")
421449 }
422450
423451
452+
453+@Callable(i)
454+func cleanUpUser (user) = {
455+ func fold (firstNonZero,assetId) = if (isDefined(firstNonZero))
456+ then firstNonZero
457+ else if ((userShares(assetId, user) > 0))
458+ then assetId
459+ else unit
460+
461+ let nonZero = {
462+ let $l = assetsArray
463+ let $s = size($l)
464+ let $acc0 = unit
465+ func $f0_1 ($a,$i) = if (($i >= $s))
466+ then $a
467+ else fold($a, $l[$i])
468+
469+ func $f0_2 ($a,$i) = if (($i >= $s))
470+ then $a
471+ else throw("List size exceeds 7")
472+
473+ $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)
474+ }
475+ match nonZero {
476+ case s: String =>
477+[StringEntry(protectedAssetStore(user), s), BooleanEntry(hasProtectedStore(user), true)]
478+ case _ =>
479+[DeleteEntry(protectedAssetStore(user)), BooleanEntry(hasProtectedStore(user), false)]
480+ }
481+ }
482+
483+

github/deemru/w8io/786bc32 
61.96 ms