2022.05.03 14:17 [3100896] smart account 3PJKKT7gsWiPBJj11gkF3Xv7gKt8s2WPdTr > SELF 0.00000000 Waves

{ "type": 13, "id": "6QQqieoQUEHHu6vNAB7ve5CYMXGEEYEAx7gQBmUNPNfu", "fee": 1000000, "feeAssetId": null, "timestamp": 1651576638577, "version": 1, "sender": "3PJKKT7gsWiPBJj11gkF3Xv7gKt8s2WPdTr", "senderPublicKey": "FAqqjX7JqvqLh2QGTR3ziyCnSsWSoj9gVo4uPahtmhKr", "proofs": [ "2yzAJ1AP6Nzn83Zzx6Q6Y8ZXy28g3xxZfXqks4GtxJLyuxtRmeHfgn6Q6AoQT43QdJQDAuegvKi5Qqiei82ZjsMD" ], "script": "base64:AAIFAAAAAAAAACIIAhIDCgEIEgASAwoBCBIAEgMKAQgSBQoDCAgBEgQKAggIAAAAKAEAAAAHdGhyb3dJZgAAAAIAAAAJY29uZGl0aW9uAAAABWVycm9yAwUAAAAJY29uZGl0aW9uCQAAAgAAAAEFAAAABWVycm9yBgEAAAAId3JpdGVJbnQAAAACAAAAA2tleQAAAAV2YWx1ZQMJAABmAAAAAgAAAAAAAAAAAAUAAAAFdmFsdWUJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAXd3JpdGluZyBuZWdhdGl2ZSB2YWx1ZSAJAAGkAAAAAQUAAAAFdmFsdWUCAAAACSBmb3Iga2V5IAUAAAADa2V5CQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAADa2V5BQAAAAV2YWx1ZQEAAAAIY2hhbmdlQnkAAAACAAAAA2tleQAAAAV2YWx1ZQkBAAAACHdyaXRlSW50AAAAAgUAAAADa2V5CQAAZAAAAAIJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAADa2V5AAAAAAAAAAAABQAAAAV2YWx1ZQEAAAAMZnJhY3Rpb25DZWlsAAAAAwAAAAV2YWx1ZQAAAAludW1lcmF0b3IAAAALZGVub21pbmF0b3IEAAAABGNhbmQJAABrAAAAAwUAAAAFdmFsdWUFAAAACW51bWVyYXRvcgUAAAALZGVub21pbmF0b3IEAAAAAUQAAAAAALUE8zMEAAAABWV4YWN0CQAAAAAAAAIJAABqAAAAAgkAAGgAAAACCQAAagAAAAIFAAAABGNhbmQFAAAAAUQJAABqAAAAAgUAAAALZGVub21pbmF0b3IFAAAAAUQFAAAAAUQJAABqAAAAAgkAAGgAAAACCQAAagAAAAIFAAAABXZhbHVlBQAAAAFECQAAagAAAAIFAAAACW51bWVyYXRvcgUAAAABRAUAAAABRAMFAAAABWV4YWN0BQAAAARjYW5kCQAAZAAAAAIFAAAABGNhbmQAAAAAAAAAAAEBAAAAEHdyaXRlQ29uc3RTdHJpbmcAAAACAAAAA2tleQAAAAV2YWx1ZQMJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEJAAQdAAAAAgUAAAAEdGhpcwUAAAADa2V5CQEAAAALU3RyaW5nRW50cnkAAAACBQAAAANrZXkFAAAABXZhbHVlCQAAAgAAAAEJAAEsAAAAAgIAAAAVYWxyZWFkeSBpbml0aWFsaXplZDogBQAAAANrZXkAAAAAEmNvbmZpZ0FkZHJlc3NTdG9yZQIAAAANY29uZmlnQWRkcmVzcwAAAAALb3JhY2xlU3RvcmUCAAAADm9yYWNsZV9hZGRyZXNzAQAAABJyZXNlcnZlRmFjdG9yU3RvcmUAAAABAAAAB2Fzc2V0SWQJAAEsAAAAAgUAAAAHYXNzZXRJZAIAAAAOX1Jlc2VydmVGYWN0b3IAAAAACW1haW5TdG9yZQIAAAAEbWFpbgAAAAANY29uZmlnQWRkcmVzcwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEJgAAAAEJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAABJjb25maWdBZGRyZXNzU3RvcmUCAAAAI3Byb3RlY3RlZC1yZXNlcnZlOiBubyBjb25maWdBZGRyZXNzAgAAABZpbnZhbGlkIGNvbmZpZyBhZGRyZXNzAQAAAA1yZXNlcnZlRmFjdG9yAAAAAQAAAAdhc3NldElkCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAANY29uZmlnQWRkcmVzcwkBAAAAEnJlc2VydmVGYWN0b3JTdG9yZQAAAAEFAAAAB2Fzc2V0SWQCAAAAEG5vIHJlc2VydmVGYWN0b3IBAAAACmdldEJhbGFuY2UAAAACAAAADmFkZHJlc3NPckFsaWFzAAAAB2Fzc2V0SWQEAAAAByRtYXRjaDAFAAAAB2Fzc2V0SWQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAACkJ5dGVWZWN0b3IEAAAAAmJ2BQAAAAckbWF0Y2gwCQAD8AAAAAIFAAAADmFkZHJlc3NPckFsaWFzBQAAAAJidgMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAEVW5pdAQAAAABdQUAAAAHJG1hdGNoMAgJAAPvAAAAAQUAAAAOYWRkcmVzc09yQWxpYXMAAAAJYXZhaWxhYmxlCQAAAgAAAAECAAAAC01hdGNoIGVycm9yAQAAAAlvcEFsbG93ZWQAAAACAAAAB2Fzc2V0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cwUAAAAHYXNzZXRJZAYJAAACAAAAAQIAAAA7cHJvdGVjdGVkLXJlc2VydmU6IGNhbid0IGhhdmUgbW9yZSB0aGFuIG9uZSBhc3NldCBwcm90ZWN0ZWQJAAACAAAAAQIAAAAgcHJvdGVjdGVkLXJlc2VydmU6Y2xlYW4gdXAgZmlyc3QEAAAAByRtYXRjaDAFAAAADnByb3RlY3RlZEFzc2V0AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAXMFAAAAByRtYXRjaDAJAAACAAAAAQIAAAAjcHJvdGVjdGVkLXJlc2VydmU6IG1pc2NvbmZpZ3VyYXRpb24GBAAAABBjb25zaXN0ZW5jeUNoZWNrCQEAAAAHdGhyb3dJZgAAAAIJAQAAAAEhAAAAAQUAAAALY29uc2lzdGVuY3kCAAAADWluY29uc2lzdGVuY3kDCQAAAAAAAAIFAAAAEGNvbnNpc3RlbmN5Q2hlY2sFAAAAEGNvbnNpc3RlbmN5Q2hlY2sEAAAACW5ld1NoYXJlcwkBAAAADmFtb3VudFRvU2hhcmVzAAAAAwUAAAAHYXNzZXRJZAUAAAAGYW1vdW50BwQAAAAHc3Rha2luZwkBAAAADXN0YWtpbmdBY3Rpb24AAAACBQAAAAdhc3NldElkAAAAAAAAAAAAAwkAAAAAAAACBQAAAAdzdGFraW5nBQAAAAdzdGFraW5nCQAETAAAAAIJAQAAAAhjaGFuZ2VCeQAAAAIJAQAAABF0b3RhbERlcG9zaXRTdG9yZQAAAAEFAAAAB2Fzc2V0SWQFAAAABmFtb3VudAkABEwAAAACCQEAAAAIY2hhbmdlQnkAAAACCQEAAAAQdG90YWxTaGFyZXNTdG9yZQAAAAEFAAAAB2Fzc2V0SWQFAAAACW5ld1NoYXJlcwkABEwAAAACCQEAAAAIY2hhbmdlQnkAAAACCQEAAAAPdXNlclNoYXJlc1N0b3JlAAAAAgUAAAAHYXNzZXRJZAUAAAAEdXNlcgUAAAAJbmV3U2hhcmVzCQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACCQEAAAARaGFzUHJvdGVjdGVkU3RvcmUAAAABBQAAAAR1c2VyBgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAATcHJvdGVjdGVkQXNz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", "chainId": 87, "height": 3100896, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Gu2H3W8GtE6sdWn3pjU2amDcZBEMFG3EeRXEEP7MsBUh Next: 78oUYDvNdm54Cbj5hnbpa5NYHMJmaeNaRzeY2pkghKa8 Diff:
OldNewDifferences
6363 }
6464
6565
66-func mainOnly (i) = if ((i.caller != valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, mainStore), "no main in config")), "invalid main address")))
67- then throw("only main can do")
68- else true
66+func mainOnly (i) = if (contains(getStringValue(configAddress, "main"), toString(i.caller)))
67+ then true
68+ else throw("only main can do")
6969
7070
7171 let maybeOracleAddress = match getString(configAddress, oracleStore) {
191191 func assetToUsd (assetId,amount) = fraction(amount, oraclePrice(assetId), pow10(assetDecimals(assetId)))
192192
193193 func fold (acc,data) = (acc + {
194- let $t051195144 = data
195- let assetId = $t051195144._1
196- let amt = $t051195144._2
194+ let $t050335058 = data
195+ let assetId = $t050335058._1
196+ let amt = $t050335058._2
197197 fraction(assetToUsd(assetId, amt), collateralFactor(assetId), factorsBase)
198198 })
199199
303303 if ((checks == checks))
304304 then {
305305 let realShares = userShares(assetId, from)
306- let $t075217805 = if ((amount == -1))
306+ let $t074357719 = if ((amount == -1))
307307 then {
308308 let realAmount = sharesToAmount(assetId, realShares)
309309 $Tuple2(realShares, realAmount)
311311 else if ((0 >= amount))
312312 then throw("protected-reserve: non-positive amount")
313313 else $Tuple2(amountToShares(assetId, amount, true), amount)
314- let wdShares = $t075217805._1
315- let wdAmount = $t075217805._2
314+ let wdShares = $t074357719._1
315+ let wdAmount = $t074357719._2
316316 let maybeCleanUp = if ((realShares == wdShares))
317317 then [BooleanEntry(hasProtectedStore(from), false), DeleteEntry(protectedAssetStore(from))]
318318 else nil
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func throwIf (condition,error) = if (condition)
55 then throw(error)
66 else true
77
88
99 func writeInt (key,value) = if ((0 > value))
1010 then throw(((("writing negative value " + toString(value)) + " for key ") + key))
1111 else IntegerEntry(key, value)
1212
1313
1414 func changeBy (key,value) = writeInt(key, (valueOrElse(getInteger(this, key), 0) + value))
1515
1616
1717 func fractionCeil (value,numerator,denominator) = {
1818 let cand = fraction(value, numerator, denominator)
1919 let D = 3037000499
2020 let exact = ((((cand % D) * (denominator % D)) % D) == (((value % D) * (numerator % D)) % D))
2121 if (exact)
2222 then cand
2323 else (cand + 1)
2424 }
2525
2626
2727 func writeConstString (key,value) = if (!(isDefined(getString(this, key))))
2828 then StringEntry(key, value)
2929 else throw(("already initialized: " + key))
3030
3131
3232 let configAddressStore = "configAddress"
3333
3434 let oracleStore = "oracle_address"
3535
3636 func reserveFactorStore (assetId) = (assetId + "_ReserveFactor")
3737
3838
3939 let mainStore = "main"
4040
4141 let configAddress = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, configAddressStore), "protected-reserve: no configAddress")), "invalid config address")
4242
4343 func reserveFactor (assetId) = valueOrErrorMessage(getInteger(configAddress, reserveFactorStore(assetId)), "no reserveFactor")
4444
4545
4646 func getBalance (addressOrAlias,assetId) = match assetId {
4747 case bv: ByteVector =>
4848 assetBalance(addressOrAlias, bv)
4949 case u: Unit =>
5050 wavesBalance(addressOrAlias).available
5151 case _ =>
5252 throw("Match error")
5353 }
5454
5555
5656 func opAllowed (assetId,op) = match invoke(configAddress, "opAllowed", [assetId, op], nil) {
5757 case b: Boolean =>
5858 if (b)
5959 then true
6060 else throw("not allowed")
6161 case _ =>
6262 throw("opAllowed: unexpected result type")
6363 }
6464
6565
66-func mainOnly (i) = if ((i.caller != valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, mainStore), "no main in config")), "invalid main address")))
67- then throw("only main can do")
68- else true
66+func mainOnly (i) = if (contains(getStringValue(configAddress, "main"), toString(i.caller)))
67+ then true
68+ else throw("only main can do")
6969
7070
7171 let maybeOracleAddress = match getString(configAddress, oracleStore) {
7272 case s: String =>
7373 addressFromString(s)
7474 case _ =>
7575 unit
7676 }
7777
7878 func oraclePrice (assetId) = match invoke(valueOrErrorMessage(maybeOracleAddress, "no oracle"), "price", [assetId], nil) {
7979 case i: Int =>
8080 i
8181 case _ =>
8282 throw("bad oracle data")
8383 }
8484
8585
8686 let HEIGHT = height
8787
8888 let assets = valueOrElse(getString(configAddress, "protected_reserve_assets"), "")
8989
9090 let assetsArray = if ((assets == ""))
9191 then nil
9292 else split(assets, "|")
9393
9494 func totalDepositStore (assetId) = ("totalSupply_" + assetId)
9595
9696
9797 func totalSharesStore (assetId) = ("totalShares_" + assetId)
9898
9999
100100 func userSharesStore (assetId,user) = ((("userShares_" + assetId) + "_") + user)
101101
102102
103103 func hasProtectedStore (user) = ("protected_collateral_" + user)
104104
105105
106106 func protectedAssetStore (user) = ("protected_asset_" + user)
107107
108108
109109 func totalDeposit (assetId) = valueOrElse(getInteger(totalDepositStore(assetId)), 0)
110110
111111
112112 func totalShares (assetId) = valueOrElse(getInteger(totalSharesStore(assetId)), 0)
113113
114114
115115 func userShares (assetId,user) = valueOrElse(getInteger(userSharesStore(assetId, user)), 0)
116116
117117
118118 func userDeposit (assetId,user) = {
119119 let ts = totalShares(assetId)
120120 let td = totalDeposit(assetId)
121121 let us = userShares(assetId, user)
122122 if ((ts == 0))
123123 then 0
124124 else fraction(td, us, ts)
125125 }
126126
127127
128128 func hasRegularDeposit (user) = {
129129 let reserves = split(valueOrErrorMessage(getString(configAddress, "primary_reserves"), "protected: no reserves found in main"), "|")
130130 func asUserBalanceData (value) = match value {
131131 case x: (Int, Int, Int, Int, Int, Boolean) =>
132132 x
133133 case t =>
134134 throw("wrong type, expected: Int5&Boolean")
135135 }
136136
137137 func fold (acc,reserve) = {
138138 let ubd = asUserBalanceData(invoke(addressFromStringValue(reserve), "userBalance", [user], nil))
139139 if ((ubd._1 > 0))
140140 then throw("can't have protected when regular exists")
141141 else false
142142 }
143143
144144 let $l = reserves
145145 let $s = size($l)
146146 let $acc0 = false
147147 func $f0_1 ($a,$i) = if (($i >= $s))
148148 then $a
149149 else fold($a, $l[$i])
150150
151151 func $f0_2 ($a,$i) = if (($i >= $s))
152152 then $a
153153 else throw("List size exceeds 7")
154154
155155 $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)
156156 }
157157
158158
159159 func userState (user) = {
160160 func fold (acc,assetId) = (acc ++ [$Tuple2(assetId, userDeposit(assetId, user))])
161161
162162 let $l = assetsArray
163163 let $s = size($l)
164164 let $acc0 = nil
165165 func $f0_1 ($a,$i) = if (($i >= $s))
166166 then $a
167167 else fold($a, $l[$i])
168168
169169 func $f0_2 ($a,$i) = if (($i >= $s))
170170 then $a
171171 else throw("List size exceeds 7")
172172
173173 $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)
174174 }
175175
176176
177177 func bp (user) = {
178178 let factorsBase = 1000
179179 func collateralFactor (assetId) = valueOrErrorMessage(getInteger(configAddress, (assetId + "_CollateralFactor")), "no CollateralFactor in config")
180180
181181 func pow10 (n) = if ((n == 6))
182182 then 1000000
183183 else if ((n == 8))
184184 then 100000000
185185 else throw(("bad decimals: " + toString(n)))
186186
187187 func assetDecimals (assetId) = if ((assetId == "WAVES"))
188188 then 8
189189 else valueOrErrorMessage(assetInfo(fromBase58String(assetId)), "bad asset").decimals
190190
191191 func assetToUsd (assetId,amount) = fraction(amount, oraclePrice(assetId), pow10(assetDecimals(assetId)))
192192
193193 func fold (acc,data) = (acc + {
194- let $t051195144 = data
195- let assetId = $t051195144._1
196- let amt = $t051195144._2
194+ let $t050335058 = data
195+ let assetId = $t050335058._1
196+ let amt = $t050335058._2
197197 fraction(assetToUsd(assetId, amt), collateralFactor(assetId), factorsBase)
198198 })
199199
200200 let $l = userState(user)
201201 let $s = size($l)
202202 let $acc0 = 0
203203 func $f0_1 ($a,$i) = if (($i >= $s))
204204 then $a
205205 else fold($a, $l[$i])
206206
207207 func $f0_2 ($a,$i) = if (($i >= $s))
208208 then $a
209209 else throw("List size exceeds 7")
210210
211211 $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)
212212 }
213213
214214
215215 func adviseUser (user) = {
216216 let borrowPower = bp(user)
217217 (("borrowPower = " + toString(borrowPower)) + {
218218 func fold (acc,pair) = ((((acc + ", ") + pair._1) + " = ") + toString(pair._2))
219219
220220 let $l = userState(user)
221221 let $s = size($l)
222222 let $acc0 = ""
223223 func $f0_1 ($a,$i) = if (($i >= $s))
224224 then $a
225225 else fold($a, $l[$i])
226226
227227 func $f0_2 ($a,$i) = if (($i >= $s))
228228 then $a
229229 else throw("List size exceeds 7")
230230
231231 $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)
232232 })
233233 }
234234
235235
236236 func sharesToAmount (assetId,shares) = {
237237 let ts = totalShares(assetId)
238238 let td = totalDeposit(assetId)
239239 if (if ((ts == 0))
240240 then true
241241 else (td == 0))
242242 then shares
243243 else fraction(shares, td, ts)
244244 }
245245
246246
247247 func amountToShares (assetId,amt,ceil) = {
248248 let ts = totalShares(assetId)
249249 let td = totalDeposit(assetId)
250250 if (if ((ts == 0))
251251 then true
252252 else (td == 0))
253253 then amt
254254 else if (ceil)
255255 then fractionCeil(amt, ts, td)
256256 else fraction(amt, ts, td)
257257 }
258258
259259
260260 func validateAssetId (assetId) = throwIf(!(contains(assets, assetId)), "assetId not permitted")
261261
262262
263263 func assetIdStr (aid) = match aid {
264264 case bv: ByteVector =>
265265 toBase58String(bv)
266266 case u: Unit =>
267267 "WAVES"
268268 case _ =>
269269 throw("Match error")
270270 }
271271
272272
273273 func assetStrToId (assetId) = if ((assetId == "WAVES"))
274274 then unit
275275 else fromBase58String(assetId)
276276
277277
278278 func stakingAction (assetId,keepAtBalance) = {
279279 let actualBalance = if ((assetId == "WAVES"))
280280 then wavesBalance(this).available
281281 else assetBalance(this, fromBase58String(assetId))
282282 if ((actualBalance == keepAtBalance))
283283 then unit
284284 else {
285285 let stakingEnabled = valueOrElse(getBoolean(configAddress, ("protected_staking_enabled_" + assetId)), false)
286286 if (!(stakingEnabled))
287287 then unit
288288 else {
289289 let stakingAddress = {
290290 let addr = valueOrErrorMessage(getString(configAddress, ("protected_staking_config_" + assetId)), ("no staking address for " + assetId))
291291 valueOrErrorMessage(addressFromString(addr), ((("protectedReserve: bad staking address for " + assetId) + ": ") + addr))
292292 }
293293 if ((actualBalance > keepAtBalance))
294294 then invoke(stakingAddress, "put", nil, [AttachedPayment(assetStrToId(assetId), (actualBalance - keepAtBalance))])
295295 else invoke(stakingAddress, "get", [(keepAtBalance - actualBalance)], nil)
296296 }
297297 }
298298 }
299299
300300
301301 func withdrawInternal (from,to,assetId,amount) = {
302302 let checks = validateAssetId(assetId)
303303 if ((checks == checks))
304304 then {
305305 let realShares = userShares(assetId, from)
306- let $t075217805 = if ((amount == -1))
306+ let $t074357719 = if ((amount == -1))
307307 then {
308308 let realAmount = sharesToAmount(assetId, realShares)
309309 $Tuple2(realShares, realAmount)
310310 }
311311 else if ((0 >= amount))
312312 then throw("protected-reserve: non-positive amount")
313313 else $Tuple2(amountToShares(assetId, amount, true), amount)
314- let wdShares = $t075217805._1
315- let wdAmount = $t075217805._2
314+ let wdShares = $t074357719._1
315+ let wdAmount = $t074357719._2
316316 let maybeCleanUp = if ((realShares == wdShares))
317317 then [BooleanEntry(hasProtectedStore(from), false), DeleteEntry(protectedAssetStore(from))]
318318 else nil
319319 let staking = stakingAction(assetId, wdAmount)
320320 if ((staking == staking))
321321 then $Tuple2((maybeCleanUp ++ [changeBy(totalDepositStore(assetId), -(wdAmount)), changeBy(totalSharesStore(assetId), -(wdShares)), changeBy(userSharesStore(assetId, from), -(wdShares)), ScriptTransfer(addressFromStringValue(to), wdAmount, assetStrToId(assetId))]), wdAmount)
322322 else throw("Strict value is not equal to itself.")
323323 }
324324 else throw("Strict value is not equal to itself.")
325325 }
326326
327327
328328 func supplyInternal (user,i) = if (hasRegularDeposit(user))
329329 then throw("protected-reserve: can't have protected when regular exists")
330330 else if ((size(i.payments) != 1))
331331 then throw("protected-reserve: single payment required")
332332 else {
333333 let assetId = assetIdStr(i.payments[0].assetId)
334334 let amount = i.payments[0].amount
335335 if ((amount == 0))
336336 then nil
337337 else {
338338 let checks = if (validateAssetId(assetId))
339339 then opAllowed(assetId, "supply_protected_collateral")
340340 else false
341341 if ((checks == checks))
342342 then {
343343 let protectedFlag = valueOrElse(getBoolean(this, hasProtectedStore(user)), false)
344344 let protectedAsset = getString(this, protectedAssetStore(user))
345345 let consistency = if (protectedFlag)
346346 then match protectedAsset {
347347 case s: String =>
348348 if ((s == assetId))
349349 then true
350350 else throw("protected-reserve: can't have more than one asset protected")
351351 case _ =>
352352 throw("protected-reserve:clean up first")
353353 }
354354 else match protectedAsset {
355355 case s: String =>
356356 throw("protected-reserve: misconfiguration")
357357 case _ =>
358358 true
359359 }
360360 let consistencyCheck = throwIf(!(consistency), "inconsistency")
361361 if ((consistencyCheck == consistencyCheck))
362362 then {
363363 let newShares = amountToShares(assetId, amount, false)
364364 let staking = stakingAction(assetId, 0)
365365 if ((staking == staking))
366366 then [changeBy(totalDepositStore(assetId), amount), changeBy(totalSharesStore(assetId), newShares), changeBy(userSharesStore(assetId, user), newShares), BooleanEntry(hasProtectedStore(user), true), StringEntry(protectedAssetStore(user), assetId)]
367367 else throw("Strict value is not equal to itself.")
368368 }
369369 else throw("Strict value is not equal to itself.")
370370 }
371371 else throw("Strict value is not equal to itself.")
372372 }
373373 }
374374
375375
376376 @Callable(i)
377377 func initialize (configAddress) = [writeConstString(configAddressStore, configAddress)]
378378
379379
380380
381381 @Callable(i)
382382 func addInterest () = {
383383 let assetId = assetIdStr(i.payments[0].assetId)
384384 let checks = validateAssetId(assetId)
385385 if ((checks == checks))
386386 then {
387387 let staking = stakingAction(assetId, 0)
388388 if ((staking == staking))
389389 then {
390390 let amount = i.payments[0].amount
391391 [changeBy(totalDepositStore(assetId), amount)]
392392 }
393393 else throw("Strict value is not equal to itself.")
394394 }
395395 else throw("Strict value is not equal to itself.")
396396 }
397397
398398
399399
400400 @Callable(i)
401401 func borrowPower (user) = $Tuple2(nil, bp(user))
402402
403403
404404
405405 @Callable(i)
406406 func supply () = supplyInternal(toString(i.caller), i)
407407
408408
409409
410410 @Callable(i)
411411 func supplyFor (user) = {
412412 let checks = mainOnly(i)
413413 if ((checks == checks))
414414 then supplyInternal(user, i)
415415 else throw("Strict value is not equal to itself.")
416416 }
417417
418418
419419
420420 @Callable(i)
421421 func withdrawFor (user,assetId,amount) = {
422422 let checks = if (mainOnly(i))
423423 then opAllowed(assetId, "withdraw_protected_collateral")
424424 else false
425425 if ((checks == checks))
426426 then withdrawInternal(user, user, assetId, amount)
427427 else throw("Strict value is not equal to itself.")
428428 }
429429
430430
431431
432432 @Callable(i)
433433 func withdrawToMain (user,assetId) = {
434434 let checks = if (mainOnly(i))
435435 then opAllowed(assetId, "collapse_protected_collateral")
436436 else false
437437 if ((checks == checks))
438438 then withdrawInternal(user, toString(i.caller), assetId, -1)
439439 else throw("Strict value is not equal to itself.")
440440 }
441441
442442

github/deemru/w8io/786bc32 
61.75 ms