tx · 6ES8jArPoSGCE91EdbwZfmPDH6D2Uuwbij1P82dzcLny

3PHvU5KXYJUAReeActQpS56TCdF8gupEjdR:  -0.01000000 Waves

2022.03.09 13:49 [3021441] smart account 3PHvU5KXYJUAReeActQpS56TCdF8gupEjdR > SELF 0.00000000 Waves

{ "type": 13, "id": "6ES8jArPoSGCE91EdbwZfmPDH6D2Uuwbij1P82dzcLny", "fee": 1000000, "feeAssetId": null, "timestamp": 1646822842239, "version": 1, "sender": "3PHvU5KXYJUAReeActQpS56TCdF8gupEjdR", "senderPublicKey": "EGGmHBK3xqTV6B19vtf2EhLscX4pB3tBXFKRDH5wdTcz", "proofs": [ "5FQWVt3jbddnxYbMb9XmVoJ54LsAhBWFfeVa2dy5Z5gpVn8tNQxd2qtEeSSM9dV3JwKFn9qrAf8F6NRFs5L4Vxs5" ], "script": "base64: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AgkAASwAAAACCQABLAAAAAIFAAAABHVzZXICAAAAAV8FAAAAA2FpZAIAAAAIX2NsYWltZWQBAAAAFnVzZXJWaXJ0dWFsVG9rZW5zU3RvcmUAAAABAAAABHVzZXIJAAEsAAAAAgUAAAAEdXNlcgIAAAAIX3ZpcnR1YWwBAAAAGHVzZXJEZXBvc2l0ZWRUb2tlbnNTdG9yZQAAAAEAAAAEdXNlcgkAASwAAAACBQAAAAR1c2VyAgAAAAZfdmlyZXMBAAAAGHVzZXJXaXRoZHJhd25Ub2tlbnNTdG9yZQAAAAEAAAAEdXNlcgkAASwAAAACBQAAAAR1c2VyAgAAABBfdmlyZXNfd2l0aGRyYXduAQAAABR1c2VyRW50cnlIZWlnaHRTdG9yZQAAAAEAAAAEdXNlcgkAASwAAAACBQAAAAR1c2VyAgAAAAdfaGVpZ2h0AQAAAA91c2VyRmFjdG9yU3RvcmUAAAABAAAABHVzZXIJAAEsAAAAAgUAAAAEdXNlcgIAAAAHX2ZhY3RvcgEAAAAQdXNlckRpdmlkZW5kc0FkagAAAAIAAAAEdXNlcgAAAANhaWQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQfAAAAAQkBAAAAFXVzZXJEaXZpZGVuZHNBZGpTdG9yZQAAAAIFAAAABHVzZXIFAAAAA2FpZAAAAAAAAAAAAAEAAAAUdXNlckRpdmlkZW5kc0NsYWltZWQAAAACAAAABHVzZXIAAAADYWlkCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHwAAAAEJAQAAABl1c2VyRGl2aWRlbmRzQ2xhaW1lZFN0b3JlAAAAAgUAAAAEdXNlcgUAAAADYWlkAAAAAAAAAAAAAQAAABF1c2VyVmlydHVhbFRva2VucwAAAAEAAAAEdXNlcgkBAAAADXBhcnNlSW50VmFsdWUAAAABCQEAAAALdmFsdWVPckVsc2UAAAACCQAEIgAAAAEJAQAAABZ1c2VyVmlydHVhbFRva2Vuc1N0b3JlAAAAAQUAAAAEdXNlcgIAAAABMAEAAAATdXNlckRlcG9zaXRlZFRva2VucwAAAAEAAAAEdXNlcgkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB8AAAABCQEAAAAYdXNlckRlcG9zaXRlZFRva2Vuc1N0b3JlAAAAAQUAAAAEdXNlcgAAAAAAAAAAAAEAAAATdXNlcldpdGhkcmF3blRva2VucwAAAAEAAAAEdXNlcgkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB8AAAABCQEAAAAYdXNlcldpdGhkcmF3blRva2Vuc1N0b3JlAAAAAQUAAAAEdXNlcgAAAAAAAAAAAAEAAAAPdXNlckVudHJ5SGVpZ2h0AAAAAQAAAAR1c2VyCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHwAAAAEJAQAAABR1c2VyRW50cnlIZWlnaHRTdG9yZQAAAAEFAAAABHVzZXIAAAAAAAAAAAABAAAACnVzZXJGYWN0b3IAAAABAAAABHVzZXIJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQfAAAAAQkBAAAAD3VzZXJGYWN0b3JTdG9yZQAAAAEFAAAABHVzZXIAAAAAAAAAAAEBAAAACnVzZXJHVmlyZXMAAAABAAAABHVzZXIJAQAAAAdmb3JtdWxhAAAAAgkBAAAAAS0AAAABCQAAZQAAAAIFAAAABkhFSUdIVAUAAAANaW5pdGlhbEhlaWdodAkBAAAAEXVzZXJWaXJ0dWFsVG9rZW5zAAAAAQUAAAAEdXNlcgEAAAAadG90YWxWaXJ0dWFsRGl2aWRlbmRzU3RvcmUAAAABAAAAA2FpZAkAASwAAAACBQAAAANhaWQCAAAAFl90b3RhbFZpcnR1YWxEaXZpZGVuZHMBAAAAF3RvdGFsUmVhbERpdmlkZW5kc1N0b3JlAAAAAQAAAANhaWQJAAEsAAAAAgUAAAADYWlkAgAAABNfdG90YWxSZWFsRGl2aWRlbmRzAQAAAB50b3RhbFJlYWxEaXZpZGVuZHNDbGFpbWVkU3RvcmUAAAABAAAAA2FpZAkAASwAAAACBQAAAANhaWQCAAAAGl90b3RhbFJlYWxEaXZpZGVuZHNDbGFpbWVkAAAAABd0b3RhbFZpcnR1YWxUb2tlbnNTdG9yZQIAAAASdG90YWxWaXJ0dWFsVG9rZW5zAAAAABl0b3RhbERlcG9zaXRlZFRva2Vuc1N0b3JlAgAAABR0b3RhbERlcG9zaXRlZFRva2VucwEAAAAbdG90YWxEZXBvc2l0ZWRCeUZhY3RvclN0b3JlAAAAAQAAAAZmYWN0b3IJAAEsAAAAAgIAAAAUdG90YWxEZXBvc2l0ZWRUb2tlbnMJAAGkAAAAAQkBAAAAC2ZhY3RvckNoZWNrAAAAAQUAAAAGZmFjdG9yAQAAABZ0b3RhbERlcG9zaXRlZEJ5RmFjdG9yAAAAAQAAAAZmYWN0b3IJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQfAAAAAQkBAAAAG3RvdGFsRGVwb3NpdGVkQnlGYWN0b3JTdG9yZQAAAAEFAAAABmZhY3RvcgAAAAAAAAAAAAEAAAAVdG90YWxWaXJ0dWFsRGl2aWRlbmRzAAAAAQAAAANhaWQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkBAAAAGnRvdGFsVmlydHVhbERpdmlkZW5kc1N0b3JlAAAAAQUAAAADYWlkAAAAAAAAAAAAAQAAABJ0b3RhbFJlYWxEaXZpZGVuZHMAAAABAAAAA2FpZAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAAXdG90YWxSZWFsRGl2aWRlbmRzU3RvcmUAAAABBQAAAANhaWQAAAAAAAAAAAAAAAAAEnRvdGFsVmlydHVhbFRva2VucwkBAAAADXBhcnNlSW50VmFsdWUAAAABCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAAF3RvdGFsVmlydHVhbFRva2Vuc1N0b3JlAgAAAAEwAAAAABR0b3RhbERlcG9zaXRlZFRva2VucwkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAABl0b3RhbERlcG9zaXRlZFRva2Vuc1N0b3JlAAAAAAAAAAAAAQAAAAx1c2VyT2ZmQ2xpZmYAAAABAAAABHVzZXIEAAAAC2VudHJ5SGVpZ2h0CQEAAAAPdXNlckVudHJ5SGVpZ2h0AAAAAQUAAAAEdXNlcgQAAAAGZmFjdG9yCQEAAAAKdXNlckZhY3RvcgAAAAEFAAAABHVzZXIDCQAAAAAAAAIFAAAABmZhY3RvcgAAAAAAAAAAAQkAAGYAAAACBQAAAAZIRUlHSFQJAABkAAAAAgUAAAALZW50cnlIZWlnaHQJAABoAAAAAgAAAAAAAAAABAUAAAAIaGFsZkxpZmUDCQAAAAAAAAIFAAAABmZhY3RvcgAAAAAAAAAAAgkAAGYAAAACBQAAAAZIRUlHSFQJAABkAAAAAgUAAAALZW50cnlIZWlnaHQJAABoAAAAAgAAAAAAAAAABQUAAAAIaGFsZkxpZmUDCQAAAAAAAAIFAAAABmZhY3RvcgAAAAAAAAAABAkAAGYAAAACBQAAAAZIRUlHSFQJAABkAAAAAgUAAAALZW50cnlIZWlnaHQJAABoAAAAAgAAAAAAAAAABgUAAAAIaGFsZkxpZmUJAAACAAAAAQkAASwAAAACAgAAAAtiYWQgZmFjdG9yOgkAAaQAAAABBQAAAAZmYWN0b3IBAAAADXVzZXJWaXJlc0RhdGEAAAABAAAABHVzZXIEAAAACWRlcG9zaXRlZAkBAAAAE3VzZXJEZXBvc2l0ZWRUb2tlbnMAAAABBQAAAAR1c2VyBAAAAAJnVgkBAAAACnVzZXJHVmlyZXMAAAABBQAAAAR1c2VyBAAAAA5zdXBwb3NlZExvY2tlZAkAAZcAAAABCQAETAAAAAIFAAAACWRlcG9zaXRlZAkABEwAAAACBQAAAAJnVgUAAAADbmlsBAAAAAZsb2NrZWQDCQEAAAAMdXNlck9mZkNsaWZmAAAAAQUAAAAEdXNlcgAAAAAAAAAAAAUAAAAOc3VwcG9zZWRMb2NrZWQEAAAACHVubG9ja2VkCQAAZQAAAAIFAAAACWRlcG9zaXRlZAUAAAAGbG9ja2VkBAAAAAl3aXRoZHJhd24JAQAAABN1c2VyV2l0aGRyYXduVG9rZW5zAAAAAQUAAAAEdXNlcgQAAAAMd2l0aGRyYXdhYmxlCQAAZQAAAAIFAAAACHVubG9ja2VkBQAAAAl3aXRoZHJhd24EAAAACmluUHJvdG9jb2wJAABkAAAAAgUAAAAGbG9ja2VkBQAAAAx3aXRoZHJhd2FibGUJAAUYAAAABgUAAAAJZGVwb3NpdGVkBQAAAAZsb2NrZWQFAAAADHdpdGhkcmF3YWJsZQUAAAAJd2l0aGRyYXduBQAAAAppblByb3RvY29sBQAAAAJnVgEAAAAOdXNlclByb2ZpdERhdGEAAAABAAAABHVzZXIEAAAAC3RvdGFsVG9rZW5zCQABkAAAAAEFAAAAFWRpdmlkZW5kYWJsZVRva2Vuc0FycgQAAAAZdG90YWxEaXZpZGVuZGFibGVSZXNlcnZlcwkAAZAAAAABBQAAABRkaXZpZGVuZGFibGVSZXNlcnZlcwMJAQAAAAIhPQAAAAIFAAAAC3RvdGFsVG9rZW5zBQAAABl0b3RhbERpdmlkZW5kYWJsZVJlc2VydmVzCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAKGluY29uc2lzdGVudCBjb25maWd1cmF0aW9uOiB0b3RhbFRva2Vucz0JAAGkAAAAAQUAAAALdG90YWxUb2tlbnMCAAAAHiwgdG90YWxEaXZpZGVuZGFibGVSZXNlcnZlcyA9IAkAAaQAAAABBQAAABl0b3RhbERpdmlkZW5kYWJsZVJlc2VydmVzBAAAAA12aXJ0dWFsVG9rZW5zCQEAAAARdXNlclZpcnR1YWxUb2tlbnMAAAABBQAAAAR1c2VyBAAAAAl0b2tlbkRhdGEKAQAAAARmb2xkAAAAAgAAAAZ0b3RhbHMAAAAFaW5kZXgDCQAAZwAAAAIFAAAABWluZGV4BQAAAAt0b3RhbFRva2VucwUAAAAGdG90YWxzBAAAAANhaWQJAAGRAAAAAgUAAAAVZGl2aWRlbmRhYmxlVG9rZW5zQXJyBQAAAAVpbmRleAQAAAALJHQwODM3NDg2MjUEAAAAAXIJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABCQABkQAAAAIFAAAAFGRpdmlkZW5kYWJsZVJlc2VydmVzBQAAAAVpbmRleAIAAAAjYmFkIHJlc2VydmUgaW4gZGl2aWRlbmRhYmxlUmVzZXJ2ZXMJAQAAAAhhc0ludFN0cgAAAAEJAAP8AAAABAUAAAABcgIAAAASZ2V0UmVzZXJ2ZURpdnNJbmZvBQAAAANuaWwFAAAAA25pbAQAAAALcmVzZXJ2ZURpdnMIBQAAAAskdDA4Mzc0ODYyNQAAAAJfMQQAAAAOcmVzZXJ2ZUFzc2V0SWQIBQAAAAskdDA4Mzc0ODYyNQAAAAJfMgMJAQAAAAIhPQAAAAIFAAAADnJlc2VydmVBc3NldElkBQAAAANhaWQJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAACtpbmNvbnNpc3RlbnQgY29uZmlndXJhdGlvbjogcmVzZXJ2ZUFzc2V0SWQ9BQAAAA5yZXNlcnZlQXNz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AAAAAAAAAgUAAAAGZmFjdG9yBQAAAAZmYWN0b3IEAAAADWN1cnJlbnRGYWN0b3IJAQAAAAp1c2VyRmFjdG9yAAAAAQUAAAAEdXNlcgMJAABmAAAAAgUAAAANY3VycmVudEZhY3RvcgUAAAAGZmFjdG9yCQAAAgAAAAECAAAAGGNhbid0IGRvd25ncmFkZSBib29zdGluZwQAAAANJHQwMTI3NTUxMjg0MQkBAAAADXVzZXJWaXJlc0RhdGEAAAABBQAAAAR1c2VyBAAAAAlkZXBvc2l0ZWQIBQAAAA0kdDAxMjc1NTEyODQxAAAAAl8xBAAAAAZsb2NrZWQIBQAAAA0kdDAxMjc1NTEyODQxAAAAAl8yBAAAAAx3aXRoZHJhd2FibGUIBQAAAA0kdDAxMjc1NTEyODQxAAAAAl8zBAAAAAl3aXRoZHJhd24IBQAAAA0kdDAxMjc1NTEyODQxAAAAAl80BAAAAAppblByb3RvY29sCAUAAAANJHQwMTI3NTUxMjg0MQAAAAJfNQQAAAACZ1YIBQAAAA0kdDAxMjc1NTEyODQxAAAAAl82BAAAABBvbGRWaXJ0dWFsVG9rZW5zCQEAAAARdXNlclZpcnR1YWxUb2tlbnMAAAABBQAAAAR1c2VyBAAAABBuZXdWaXJ0dWFsVG9rZW5zCQEAAAAHZm9ybXVsYQAAAAIJAABlAAAAAgUAAAAGSEVJR0hUBQAAAA1pbml0aWFsSGVpZ2h0CQAAaAAAAAIFAAAABmZhY3RvcgkAAGQAAAACBQAAAAZ0b2tlbnMFAAAACmluUHJvdG9jb2wEAAAABGRpZmYJAABlAAAAAgUAAAAQbmV3VmlydHVhbFRva2VucwUAAAAQb2xkVmlydHVhbFRva2VucwQAAAAEYmFzZQkABEwAAAACCQEAAAAIY2hhbmdlQnkAAAACBQAAABl0b3RhbERlcG9zaXRlZFRva2Vuc1N0b3JlBQAAAAZ0b2tlbnMJAARMAAAAAgkBAAAAC2NoYW5nZUJ5U3RyAAAAAgUAAAAXdG90YWxWaXJ0dWFsVG9rZW5zU3RvcmUFAAAABGRpZmYJAARMAAAAAgkBAAAAC2NoYW5nZUJ5U3RyAAAAAgkBAAAAFnVzZXJWaXJ0dWFsVG9rZW5zU3RvcmUAAAABBQAAAAR1c2VyBQAAAARkaWZmCQAETAAA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bGUIBQAAAA0kdDAxNTU0ODE1NjI2AAAAAl8zBAAAAAl3aXRoZHJhd24IBQAAAA0kdDAxNTU0ODE1NjI2AAAAAl80BAAAAAZnVmlyZXMIBQAAAA0kdDAxNTU0ODE1NjI2AAAAAl81AwkAAGcAAAACAAAAAAAAAAAABQAAAAx3aXRoZHJhd2FibGUFAAAAA25pbAQAAAAKdXNlclVwZGF0ZQMJAQAAAAx1c2VyT2ZmQ2xpZmYAAAABBQAAAAR1c2VyBAAAAA0kdDAxNTcyNzE1NzgxCQEAAAAOdXNlclByb2ZpdERhdGEAAAABBQAAAAR1c2VyBAAAAA12aXJ0dWFsVG9rZW5zCAUAAAANJHQwMTU3MjcxNTc4MQAAAAJfMQQAAAAKdG9rZW5zRGF0YQgFAAAADSR0MDE1NzI3MTU3ODEAAAACXzIEAAAABGJhc2UJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAAD3VzZXJGYWN0b3JTdG9yZQAAAAEFAAAABHVzZXIJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAAFHVzZXJFbnRyeUhlaWdodFN0b3JlAAAAAQUAAAAEdXNlcgkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAYdXNlcldpdGhkcmF3blRva2Vuc1N0b3JlAAAAAQUAAAAEdXNlcgkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAYdXNlckRlcG9zaXRlZFRva2Vuc1N0b3JlAAAAAQUAAAAEdXNlcgkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAWdXNlclZpcnR1YWxUb2tlbnNTdG9yZQAAAAEFAAAABHVzZXIJAARMAAAAAgkBAAAAC2NoYW5nZUJ5U3RyAAAAAgUAAAAXdG90YWxWaXJ0dWFsVG9rZW5zU3RvcmUJAQAAAAEtAAAAAQUAAAAMd2l0aGRyYXdhYmxlBQAAAANuaWwEAAAACXRva2VuRGF0YQoBAAAABGZvbGQAAAACAAAABXRvdGFsAAAABGl0ZW0EAAAADSR0MDE2MjczMTYyOTgFAAAABGl0ZW0EAAAAA2FpZAgFAAAADSR0MDE2MjczMTYyOTgAAAACXzEEAAAAA2NlZAgFAAAADSR0MDE2Mjcz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", "chainId": 87, "height": 3021441, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 5HCJLyRJZw9X9Vm34DsqEML1EvfLqbC8hsPdg2BwmnP Next: Bs66x4ZsLxWDPpjGyZ22RLhyDuVc4kEiJkmF1e5Gswam Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-func getS (key) = getString(this, key)
5-
6-
7-let oracleStore = "oracleAddress"
8-
9-let maybeOracleAddress = match getS(oracleStore) {
10- case s: String =>
11- addressFromString(s)
12- case _ =>
13- unit
14-}
15-
16-let HEIGHT = height
17-
184 func asInt (value) = match value {
195 case int: Int =>
206 int
4834
4935 let configStore = "config"
5036
51-let configAddress = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, configStore), "no configAddress")), "invalid config address")
37+let configAddress = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, configStore), "exp-dividends: no configAddress")), "invalid config address")
38+
39+let maybeOracleAddress = match getString(configAddress, "oracle_address") {
40+ case s: String =>
41+ addressFromString(s)
42+ case _ =>
43+ unit
44+}
45+
46+let HEIGHT = height
5247
5348 let viresIdStr = valueOrErrorMessage(getString(this, viresAssetIdStore), "vires assetId not found")
5449
124119 else throw("invalid user: only main can do")
125120
126121
127-let dividendableTokens = valueOrErrorMessage(getString(configAddress, "dividendableTokens"), "exp_dividends: no dividendableTokens")
122+let dividendableTokens = valueOrElse(getString(configAddress, "dividendableTokens"), "")
123+
124+let dividendableTokensArr = if ((dividendableTokens == ""))
125+ then nil
126+ else split(dividendableTokens, "|")
128127
129128 let dividendableReservesStr = valueOrElse(getString(configAddress, "dividendableReserves"), "")
130129
253252
254253
255254 func userProfitData (user) = {
256- let tokens = split(dividendableTokens, "|")
257- let totalTokens = size(tokens)
255+ let totalTokens = size(dividendableTokensArr)
258256 let totalDividendableReserves = size(dividendableReserves)
259257 if ((totalTokens != totalDividendableReserves))
260258 then throw(((("inconsistent configuration: totalTokens=" + toString(totalTokens)) + ", totalDividendableReserves = ") + toString(totalDividendableReserves)))
264262 func fold (totals,index) = if ((index >= totalTokens))
265263 then totals
266264 else {
267- let aid = tokens[index]
268- let $t083778628 = {
265+ let aid = dividendableTokensArr[index]
266+ let $t083748625 = {
269267 let r = valueOrErrorMessage(addressFromString(dividendableReserves[index]), "bad reserve in dividendableReserves")
270268 asIntStr(invoke(r, "getReserveDivsInfo", nil, nil))
271269 }
272- let reserveDivs = $t083778628._1
273- let reserveAssetId = $t083778628._2
270+ let reserveDivs = $t083748625._1
271+ let reserveAssetId = $t083748625._2
274272 if ((reserveAssetId != aid))
275273 then throw(((((((("inconsistent configuration: reserveAssetId=" + reserveAssetId) + ", aid=") + aid) + ", dividendableTokens:") + dividendableTokens) + ", dividendableReserves:") + dividendableReservesStr))
276274 else {
341339
342340
343341 func adviseUser (user) = {
344- let $t01056810658 = userViresData(user)
345- let deposited = $t01056810658._1
346- let locked = $t01056810658._2
347- let withdrawable = $t01056810658._3
348- let withdrawn = $t01056810658._4
349- let inProtocol = $t01056810658._5
350- let gVires = $t01056810658._6
351- let $t01066510718 = userProfitData(user)
352- let virtualTokens = $t01066510718._1
353- let tokenData = $t01066510718._2
342+ let $t01056510655 = userViresData(user)
343+ let deposited = $t01056510655._1
344+ let locked = $t01056510655._2
345+ let withdrawable = $t01056510655._3
346+ let withdrawn = $t01056510655._4
347+ let inProtocol = $t01056510655._5
348+ let gVires = $t01056510655._6
349+ let $t01066210715 = userProfitData(user)
350+ let virtualTokens = $t01066210715._1
351+ let tokenData = $t01066210715._2
354352 let power = if ((inProtocol == 0))
355353 then 0
356354 else fraction(10000, gVires, inProtocol)
357355 let base = (((((((((((((((((((" deposited = " + toString(deposited)) + ", virtualTokens = ") + toString(virtualTokens)) + ", locked = ") + toString(locked)) + ", withdrawable = ") + toString(withdrawable)) + ", withdrawn = ") + toString(withdrawn)) + ", inProtocol = ") + toString(inProtocol)) + ", entryHeight = ") + toString(userEntryHeight(user))) + ", factor = ") + toString(userFactor(user))) + ", gVires = ") + toString(gVires)) + ", power = ") + toString(power))
358356 let tokensData = {
359357 func fold (totals,item) = {
360- let $t01145411477 = item
361- let aid = $t01145411477._1
362- let ced = $t01145411477._2
363- let av = $t01145411477._3
358+ let $t01145111474 = item
359+ let aid = $t01145111474._1
360+ let ced = $t01145111474._2
361+ let av = $t01145111474._3
364362 ((((((((totals + ", [ ") + "assetId = ") + aid) + ", claimed = ") + toString(ced)) + ", claimable = ") + toString(av)) + "]")
365363 }
366364
386384 let base = (((((((((((" totalDepositedTokens = " + toString(totalDepositedTokens)) + ", totalDepositedTokens1 = ") + toString(totalDepositedByFactor(1))) + ", totalDepositedTokens2 = ") + toString(totalDepositedByFactor(2))) + ", totalDepositedTokens4 = ") + toString(totalDepositedByFactor(4))) + ", totalVirtualTokens = ") + toString(totalVirtualTokens)) + ", totalGvires = ") + toString(totalGvires))
387385 func fold (total,aid) = ((((total + ", ") + aid) + " = ") + toString(totalRealDividends(aid)))
388386
389- let $l = split(dividendableTokens, "|")
387+ let $l = dividendableTokensArr
390388 let $s = size($l)
391389 let $acc0 = base
392390 func $f0_1 ($a,$i) = if (($i >= $s))
416414 if ((currentFactor > factor))
417415 then throw("can't downgrade boosting")
418416 else {
419- let $t01276612852 = userViresData(user)
420- let deposited = $t01276612852._1
421- let locked = $t01276612852._2
422- let withdrawable = $t01276612852._3
423- let withdrawn = $t01276612852._4
424- let inProtocol = $t01276612852._5
425- let gV = $t01276612852._6
417+ let $t01275512841 = userViresData(user)
418+ let deposited = $t01275512841._1
419+ let locked = $t01275512841._2
420+ let withdrawable = $t01275512841._3
421+ let withdrawn = $t01275512841._4
422+ let inProtocol = $t01275512841._5
423+ let gV = $t01275512841._6
426424 let oldVirtualTokens = userVirtualTokens(user)
427425 let newVirtualTokens = formula((HEIGHT - initialHeight), (factor * (tokens + inProtocol)))
428426 let diff = (newVirtualTokens - oldVirtualTokens)
435433 (total ++ [changeBy(totalVirtualDividendsStore(aid), adj), IntegerEntry(userDividendsAdjStore(user, aid), (userDividendsAdj(user, aid) + adj))])
436434 }
437435
438- let $l = split(dividendableTokens, "|")
436+ let $l = dividendableTokensArr
439437 let $s = size($l)
440438 let $acc0 = nil
441439 func $f0_1 ($a,$i) = if (($i >= $s))
458456 }
459457 else throw("Strict value is not equal to itself.")
460458 }
459+
460+
461+@Callable(i)
462+func totalGvires () = $Tuple2(nil, formula(-((HEIGHT - initialHeight)), totalVirtualTokens))
463+
461464
462465
463466 @Callable(i)
484487
485488
486489 @Callable(i)
487-func init (configAddress,oracleAddr,vires) = [writeConstString(oracleStore, oracleAddr), writeConstString(configStore, configAddress), writeConstString(viresAssetIdStore, vires), writeInt(initialHeightStore, HEIGHT)]
490+func init (configAddress,vires) = [writeConstString(configStore, configAddress), writeConstString(viresAssetIdStore, vires)]
491+
492+
493+
494+@Callable(i)
495+func init2 () = if ((i.caller != this))
496+ then throw("only self can continue")
497+ else [writeInt(initialHeightStore, HEIGHT)]
488498
489499
490500
491501 @Callable(i)
492502 func lockFor (user,factor) = {
493- let checks = mainOnly(i)
503+ let checks = throwIf(if ((toString(i.caller) != user))
504+ then (i.caller != main)
505+ else false, "only main and user directly can do")
494506 if ((checks == checks))
495507 then updateUser(user, viresPayment(i), factor)
496508 else throw("Strict value is not equal to itself.")
500512
501513 @Callable(i)
502514 func withdrawUnlockedFor (user) = {
503- let checks = if (mainOnly(i))
515+ let checks = if (throwIf(if ((toString(i.caller) != user))
516+ then (i.caller != main)
517+ else false, "only main and user directly can do"))
504518 then opAllowed("withdraw_unlocked_vires")
505519 else false
506520 if ((checks == checks))
507521 then {
508522 let addr = addressFromStringValue(user)
509- let $t01527915357 = userViresData(user)
510- let deposited = $t01527915357._1
511- let locked = $t01527915357._2
512- let withdrawable = $t01527915357._3
513- let withdrawn = $t01527915357._4
514- let gVires = $t01527915357._5
523+ let $t01554815626 = userViresData(user)
524+ let deposited = $t01554815626._1
525+ let locked = $t01554815626._2
526+ let withdrawable = $t01554815626._3
527+ let withdrawn = $t01554815626._4
528+ let gVires = $t01554815626._5
515529 if ((0 >= withdrawable))
516530 then nil
517531 else {
518532 let userUpdate = if (userOffCliff(user))
519533 then {
520- let $t01545815512 = userProfitData(user)
521- let virtualTokens = $t01545815512._1
522- let tokensData = $t01545815512._2
534+ let $t01572715781 = userProfitData(user)
535+ let virtualTokens = $t01572715781._1
536+ let tokensData = $t01572715781._2
523537 let base = [DeleteEntry(userFactorStore(user)), DeleteEntry(userEntryHeightStore(user)), DeleteEntry(userWithdrawnTokensStore(user)), DeleteEntry(userDepositedTokensStore(user)), DeleteEntry(userVirtualTokensStore(user)), changeByStr(totalVirtualTokensStore, -(withdrawable))]
524538 let tokenData = {
525539 func fold (total,item) = {
526- let $t01600416029 = item
527- let aid = $t01600416029._1
528- let ced = $t01600416029._2
529- let av = $t01600416029._3
540+ let $t01627316298 = item
541+ let aid = $t01627316298._1
542+ let ced = $t01627316298._2
543+ let av = $t01627316298._3
530544 (total ++ [DeleteEntry(userDividendsClaimedStore(user, aid)), IntegerEntry(userDividendsAdjStore(user, aid), -(av)), IntegerEntry(totalVirtualDividendsStore(aid), fraction(totalVirtualDividends(aid), (totalVirtualTokens - withdrawable), totalVirtualTokens))])
531545 }
532546
579593 if ((checks == checks))
580594 then {
581595 let toAddr = addressFromStringValue(to)
582- let $t01739917452 = userProfitData(from)
583- let virtualTokens = $t01739917452._1
584- let tokensData = $t01739917452._2
596+ let $t01766817721 = userProfitData(from)
597+ let virtualTokens = $t01766817721._1
598+ let tokensData = $t01766817721._2
585599 let relocking = if (relock)
586600 then updateUser(from, 0, userFactor(from))
587601 else nil
588602 let tokenData = {
589603 func fold (total,item) = {
590- let $t01765117676 = item
591- let aid = $t01765117676._1
592- let ced = $t01765117676._2
593- let av = $t01765117676._3
604+ let $t01792017945 = item
605+ let aid = $t01792017945._1
606+ let ced = $t01792017945._2
607+ let av = $t01792017945._3
594608 (total ++ [changeBy(userDividendsClaimedStore(from, aid), av), changeBy(totalRealDividendsClaimedStore(aid), av), ScriptTransfer(toAddr, av, assetId(aid))])
595609 }
596610
637651 }
638652
639653
654+
655+@Callable(i)
656+func userPower (user) = $Tuple2(nil, userGVires(user))
657+
658+
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-func getS (key) = getString(this, key)
5-
6-
7-let oracleStore = "oracleAddress"
8-
9-let maybeOracleAddress = match getS(oracleStore) {
10- case s: String =>
11- addressFromString(s)
12- case _ =>
13- unit
14-}
15-
16-let HEIGHT = height
17-
184 func asInt (value) = match value {
195 case int: Int =>
206 int
217 case _ =>
228 throw("wrong type, expected: Int")
239 }
2410
2511
2612 func asIntStr (value) = match value {
2713 case intStr: (Int, String) =>
2814 intStr
2915 case _ =>
3016 throw("wrong type, expected: (Int, String)")
3117 }
3218
3319
3420 func factorCheck (factor) = if (if (if ((factor != 1))
3521 then (factor != 2)
3622 else false)
3723 then (factor != 4)
3824 else false)
3925 then throw("bad factor")
4026 else factor
4127
4228
4329 let viresAssetIdStore = "viresAssetId"
4430
4531 let initialHeightStore = "initialHeight"
4632
4733 let initialHeight = getIntegerValue(this, initialHeightStore)
4834
4935 let configStore = "config"
5036
51-let configAddress = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, configStore), "no configAddress")), "invalid config address")
37+let configAddress = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, configStore), "exp-dividends: no configAddress")), "invalid config address")
38+
39+let maybeOracleAddress = match getString(configAddress, "oracle_address") {
40+ case s: String =>
41+ addressFromString(s)
42+ case _ =>
43+ unit
44+}
45+
46+let HEIGHT = height
5247
5348 let viresIdStr = valueOrErrorMessage(getString(this, viresAssetIdStore), "vires assetId not found")
5449
5550 let viresAssetId = valueOrErrorMessage(fromBase58String(viresIdStr), "invalid vires assetId")
5651
5752 func assetId (s) = if ((s == "WAVES"))
5853 then unit
5954 else fromBase58String(s)
6055
6156
6257 func assetIdStr (aid) = match aid {
6358 case bv: ByteVector =>
6459 toBase58String(bv)
6560 case u: Unit =>
6661 "WAVES"
6762 case _ =>
6863 throw("Match error")
6964 }
7065
7166
7267 func throwIf (condition,error) = if (condition)
7368 then throw(error)
7469 else true
7570
7671
7772 func writeInt (key,value) = if ((0 > value))
7873 then throw(((("writing negative value " + toString(value)) + " for key ") + key))
7974 else IntegerEntry(key, value)
8075
8176
8277 func writeStrInt (key,value) = if ((0 > value))
8378 then throw(((("writing negative value " + toString(value)) + " for key ") + key))
8479 else StringEntry(key, toString(value))
8580
8681
8782 func writeString (key,value) = StringEntry(key, value)
8883
8984
9085 func writeConstString (key,value) = if (!(isDefined(getString(this, key))))
9186 then StringEntry(key, value)
9287 else throw(("already initialized: " + key))
9388
9489
9590 func changeBy (key,value) = writeInt(key, (valueOrElse(getInteger(this, key), 0) + value))
9691
9792
9893 func changeByStr (key,value) = writeStrInt(key, (parseIntValue(valueOrElse(getString(this, key), "0")) + value))
9994
10095
10196 func viresPayment (i) = if ((size(i.payments) == 0))
10297 then 0
10398 else if ((i.payments[0].assetId != viresAssetId))
10499 then throw("not vires")
105100 else i.payments[0].amount
106101
107102
108103 func opAllowed (op) = match invoke(configAddress, "opAllowed", [viresIdStr, op], nil) {
109104 case b: Boolean =>
110105 if (b)
111106 then true
112107 else throw("not allowed")
113108 case _ =>
114109 throw("opAllowed: unexpected result type")
115110 }
116111
117112
118113 let viresStaker = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "vires_staker"), "no vires_staker in config")), "invalid vires_staker address")
119114
120115 let main = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "main"), "no main")), "invalid main")
121116
122117 func mainOnly (i) = if ((i.caller == main))
123118 then true
124119 else throw("invalid user: only main can do")
125120
126121
127-let dividendableTokens = valueOrErrorMessage(getString(configAddress, "dividendableTokens"), "exp_dividends: no dividendableTokens")
122+let dividendableTokens = valueOrElse(getString(configAddress, "dividendableTokens"), "")
123+
124+let dividendableTokensArr = if ((dividendableTokens == ""))
125+ then nil
126+ else split(dividendableTokens, "|")
128127
129128 let dividendableReservesStr = valueOrElse(getString(configAddress, "dividendableReserves"), "")
130129
131130 let dividendableReserves = match dividendableReservesStr {
132131 case str: String =>
133132 if ((str == ""))
134133 then nil
135134 else split(str, "|")
136135 case _ =>
137136 nil
138137 }
139138
140139 let halfLife = valueOrErrorMessage(getInteger(configAddress, "vires_lock_half_life"), "half life not set")
141140
142141 let lambda = (69314718056 / halfLife)
143142
144143 let LAMBDABASE = 8
145144
146145 let E = 271828183
147146
148147 let EBASE = 8
149148
150149 func formula (x,y0) = fraction(y0, pow(E, EBASE, fraction(lambda, x, 1000), LAMBDABASE, 8, HALFUP), 100000000)
151150
152151
153152 func userDividendsAdjStore (user,aid) = (((user + "_") + aid) + "_adj")
154153
155154
156155 func userDividendsClaimedStore (user,aid) = (((user + "_") + aid) + "_claimed")
157156
158157
159158 func userVirtualTokensStore (user) = (user + "_virtual")
160159
161160
162161 func userDepositedTokensStore (user) = (user + "_vires")
163162
164163
165164 func userWithdrawnTokensStore (user) = (user + "_vires_withdrawn")
166165
167166
168167 func userEntryHeightStore (user) = (user + "_height")
169168
170169
171170 func userFactorStore (user) = (user + "_factor")
172171
173172
174173 func userDividendsAdj (user,aid) = valueOrElse(getInteger(userDividendsAdjStore(user, aid)), 0)
175174
176175
177176 func userDividendsClaimed (user,aid) = valueOrElse(getInteger(userDividendsClaimedStore(user, aid)), 0)
178177
179178
180179 func userVirtualTokens (user) = parseIntValue(valueOrElse(getString(userVirtualTokensStore(user)), "0"))
181180
182181
183182 func userDepositedTokens (user) = valueOrElse(getInteger(userDepositedTokensStore(user)), 0)
184183
185184
186185 func userWithdrawnTokens (user) = valueOrElse(getInteger(userWithdrawnTokensStore(user)), 0)
187186
188187
189188 func userEntryHeight (user) = valueOrElse(getInteger(userEntryHeightStore(user)), 0)
190189
191190
192191 func userFactor (user) = valueOrElse(getInteger(userFactorStore(user)), 1)
193192
194193
195194 func userGVires (user) = formula(-((HEIGHT - initialHeight)), userVirtualTokens(user))
196195
197196
198197 func totalVirtualDividendsStore (aid) = (aid + "_totalVirtualDividends")
199198
200199
201200 func totalRealDividendsStore (aid) = (aid + "_totalRealDividends")
202201
203202
204203 func totalRealDividendsClaimedStore (aid) = (aid + "_totalRealDividendsClaimed")
205204
206205
207206 let totalVirtualTokensStore = "totalVirtualTokens"
208207
209208 let totalDepositedTokensStore = "totalDepositedTokens"
210209
211210 func totalDepositedByFactorStore (factor) = ("totalDepositedTokens" + toString(factorCheck(factor)))
212211
213212
214213 func totalDepositedByFactor (factor) = valueOrElse(getInteger(totalDepositedByFactorStore(factor)), 0)
215214
216215
217216 func totalVirtualDividends (aid) = valueOrElse(getInteger(this, totalVirtualDividendsStore(aid)), 0)
218217
219218
220219 func totalRealDividends (aid) = valueOrElse(getInteger(this, totalRealDividendsStore(aid)), 0)
221220
222221
223222 let totalVirtualTokens = parseIntValue(valueOrElse(getString(this, totalVirtualTokensStore), "0"))
224223
225224 let totalDepositedTokens = valueOrElse(getInteger(this, totalDepositedTokensStore), 0)
226225
227226 func userOffCliff (user) = {
228227 let entryHeight = userEntryHeight(user)
229228 let factor = userFactor(user)
230229 if ((factor == 1))
231230 then (HEIGHT > (entryHeight + (4 * halfLife)))
232231 else if ((factor == 2))
233232 then (HEIGHT > (entryHeight + (5 * halfLife)))
234233 else if ((factor == 4))
235234 then (HEIGHT > (entryHeight + (6 * halfLife)))
236235 else throw(("bad factor:" + toString(factor)))
237236 }
238237
239238
240239 func userViresData (user) = {
241240 let deposited = userDepositedTokens(user)
242241 let gV = userGVires(user)
243242 let supposedLocked = min([deposited, gV])
244243 let locked = if (userOffCliff(user))
245244 then 0
246245 else supposedLocked
247246 let unlocked = (deposited - locked)
248247 let withdrawn = userWithdrawnTokens(user)
249248 let withdrawable = (unlocked - withdrawn)
250249 let inProtocol = (locked + withdrawable)
251250 $Tuple6(deposited, locked, withdrawable, withdrawn, inProtocol, gV)
252251 }
253252
254253
255254 func userProfitData (user) = {
256- let tokens = split(dividendableTokens, "|")
257- let totalTokens = size(tokens)
255+ let totalTokens = size(dividendableTokensArr)
258256 let totalDividendableReserves = size(dividendableReserves)
259257 if ((totalTokens != totalDividendableReserves))
260258 then throw(((("inconsistent configuration: totalTokens=" + toString(totalTokens)) + ", totalDividendableReserves = ") + toString(totalDividendableReserves)))
261259 else {
262260 let virtualTokens = userVirtualTokens(user)
263261 let tokenData = {
264262 func fold (totals,index) = if ((index >= totalTokens))
265263 then totals
266264 else {
267- let aid = tokens[index]
268- let $t083778628 = {
265+ let aid = dividendableTokensArr[index]
266+ let $t083748625 = {
269267 let r = valueOrErrorMessage(addressFromString(dividendableReserves[index]), "bad reserve in dividendableReserves")
270268 asIntStr(invoke(r, "getReserveDivsInfo", nil, nil))
271269 }
272- let reserveDivs = $t083778628._1
273- let reserveAssetId = $t083778628._2
270+ let reserveDivs = $t083748625._1
271+ let reserveAssetId = $t083748625._2
274272 if ((reserveAssetId != aid))
275273 then throw(((((((("inconsistent configuration: reserveAssetId=" + reserveAssetId) + ", aid=") + aid) + ", dividendableTokens:") + dividendableTokens) + ", dividendableReserves:") + dividendableReservesStr))
276274 else {
277275 let userVirtualDivs = if ((totalVirtualTokens == 0))
278276 then 0
279277 else fraction((totalVirtualDividends(aid) + reserveDivs), virtualTokens, totalVirtualTokens)
280278 let adj = userDividendsAdj(user, aid)
281279 let userDivs = (userVirtualDivs - adj)
282280 let userClaimed = userDividendsClaimed(user, aid)
283281 let claimable = max([0, (userDivs - userClaimed)])
284282 if ((0 > claimable))
285283 then throw(("claimable < 0: " + toString(claimable)))
286284 else (totals ++ [$Tuple3(aid, userClaimed, claimable)])
287285 }
288286 }
289287
290288 let $l = [0, 1, 2, 3, 4, 5, 6]
291289 let $s = size($l)
292290 let $acc0 = nil
293291 func $f0_1 ($a,$i) = if (($i >= $s))
294292 then $a
295293 else fold($a, $l[$i])
296294
297295 func $f0_2 ($a,$i) = if (($i >= $s))
298296 then $a
299297 else throw("List size exceeds 7")
300298
301299 $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)
302300 }
303301 $Tuple2(virtualTokens, tokenData)
304302 }
305303 }
306304
307305
308306 func claimFromReservesInternal () = {
309307 let assetIdStore = "assetId"
310308 func fold (output,reserve) = {
311309 let reserveAddress = valueOrErrorMessage(addressFromString(reserve), "adder: bad reserve address")
312310 let assetIdString = valueOrErrorMessage(getString(reserveAddress, assetIdStore), "no assetId in reserve")
313311 let actions = if (!(contains(dividendableTokens, assetIdString)))
314312 then throw("inconsistent configuration: dividendableReserve's asset id is not stored in dividendableTokens")
315313 else {
316314 let amount = asInt(invoke(reserveAddress, "withdrawFromReserve", [-1], nil))
317315 if ((amount == amount))
318316 then if ((0 > amount))
319317 then throw("bad amount")
320318 else if ((amount == 0))
321319 then nil
322320 else [changeBy(totalVirtualDividendsStore(assetIdString), amount), changeBy(totalRealDividendsStore(assetIdString), amount)]
323321 else throw("Strict value is not equal to itself.")
324322 }
325323 (output ++ actions)
326324 }
327325
328326 let $l = dividendableReserves
329327 let $s = size($l)
330328 let $acc0 = nil
331329 func $f0_1 ($a,$i) = if (($i >= $s))
332330 then $a
333331 else fold($a, $l[$i])
334332
335333 func $f0_2 ($a,$i) = if (($i >= $s))
336334 then $a
337335 else throw("List size exceeds 7")
338336
339337 $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)
340338 }
341339
342340
343341 func adviseUser (user) = {
344- let $t01056810658 = userViresData(user)
345- let deposited = $t01056810658._1
346- let locked = $t01056810658._2
347- let withdrawable = $t01056810658._3
348- let withdrawn = $t01056810658._4
349- let inProtocol = $t01056810658._5
350- let gVires = $t01056810658._6
351- let $t01066510718 = userProfitData(user)
352- let virtualTokens = $t01066510718._1
353- let tokenData = $t01066510718._2
342+ let $t01056510655 = userViresData(user)
343+ let deposited = $t01056510655._1
344+ let locked = $t01056510655._2
345+ let withdrawable = $t01056510655._3
346+ let withdrawn = $t01056510655._4
347+ let inProtocol = $t01056510655._5
348+ let gVires = $t01056510655._6
349+ let $t01066210715 = userProfitData(user)
350+ let virtualTokens = $t01066210715._1
351+ let tokenData = $t01066210715._2
354352 let power = if ((inProtocol == 0))
355353 then 0
356354 else fraction(10000, gVires, inProtocol)
357355 let base = (((((((((((((((((((" deposited = " + toString(deposited)) + ", virtualTokens = ") + toString(virtualTokens)) + ", locked = ") + toString(locked)) + ", withdrawable = ") + toString(withdrawable)) + ", withdrawn = ") + toString(withdrawn)) + ", inProtocol = ") + toString(inProtocol)) + ", entryHeight = ") + toString(userEntryHeight(user))) + ", factor = ") + toString(userFactor(user))) + ", gVires = ") + toString(gVires)) + ", power = ") + toString(power))
358356 let tokensData = {
359357 func fold (totals,item) = {
360- let $t01145411477 = item
361- let aid = $t01145411477._1
362- let ced = $t01145411477._2
363- let av = $t01145411477._3
358+ let $t01145111474 = item
359+ let aid = $t01145111474._1
360+ let ced = $t01145111474._2
361+ let av = $t01145111474._3
364362 ((((((((totals + ", [ ") + "assetId = ") + aid) + ", claimed = ") + toString(ced)) + ", claimable = ") + toString(av)) + "]")
365363 }
366364
367365 let $l = tokenData
368366 let $s = size($l)
369367 let $acc0 = ""
370368 func $f0_1 ($a,$i) = if (($i >= $s))
371369 then $a
372370 else fold($a, $l[$i])
373371
374372 func $f0_2 ($a,$i) = if (($i >= $s))
375373 then $a
376374 else throw("List size exceeds 7")
377375
378376 $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)
379377 }
380378 (base + tokensData)
381379 }
382380
383381
384382 func advise () = {
385383 let totalGvires = formula(-((HEIGHT - initialHeight)), totalVirtualTokens)
386384 let base = (((((((((((" totalDepositedTokens = " + toString(totalDepositedTokens)) + ", totalDepositedTokens1 = ") + toString(totalDepositedByFactor(1))) + ", totalDepositedTokens2 = ") + toString(totalDepositedByFactor(2))) + ", totalDepositedTokens4 = ") + toString(totalDepositedByFactor(4))) + ", totalVirtualTokens = ") + toString(totalVirtualTokens)) + ", totalGvires = ") + toString(totalGvires))
387385 func fold (total,aid) = ((((total + ", ") + aid) + " = ") + toString(totalRealDividends(aid)))
388386
389- let $l = split(dividendableTokens, "|")
387+ let $l = dividendableTokensArr
390388 let $s = size($l)
391389 let $acc0 = base
392390 func $f0_1 ($a,$i) = if (($i >= $s))
393391 then $a
394392 else fold($a, $l[$i])
395393
396394 func $f0_2 ($a,$i) = if (($i >= $s))
397395 then $a
398396 else throw("List size exceeds 7")
399397
400398 $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)
401399 }
402400
403401
404402 func updateUser (user,tokens,f) = {
405403 let checks = opAllowed("lock_vires")
406404 if ((checks == checks))
407405 then if (if ((f != 1))
408406 then valueOrElse(getBoolean(configAddress, "allow_boost"), false)
409407 else false)
410408 then throw("boosting not enabled")
411409 else {
412410 let factor = factorCheck(f)
413411 if ((factor == factor))
414412 then {
415413 let currentFactor = userFactor(user)
416414 if ((currentFactor > factor))
417415 then throw("can't downgrade boosting")
418416 else {
419- let $t01276612852 = userViresData(user)
420- let deposited = $t01276612852._1
421- let locked = $t01276612852._2
422- let withdrawable = $t01276612852._3
423- let withdrawn = $t01276612852._4
424- let inProtocol = $t01276612852._5
425- let gV = $t01276612852._6
417+ let $t01275512841 = userViresData(user)
418+ let deposited = $t01275512841._1
419+ let locked = $t01275512841._2
420+ let withdrawable = $t01275512841._3
421+ let withdrawn = $t01275512841._4
422+ let inProtocol = $t01275512841._5
423+ let gV = $t01275512841._6
426424 let oldVirtualTokens = userVirtualTokens(user)
427425 let newVirtualTokens = formula((HEIGHT - initialHeight), (factor * (tokens + inProtocol)))
428426 let diff = (newVirtualTokens - oldVirtualTokens)
429427 let base = [changeBy(totalDepositedTokensStore, tokens), changeByStr(totalVirtualTokensStore, diff), changeByStr(userVirtualTokensStore(user), diff), changeBy(userDepositedTokensStore(user), tokens), IntegerEntry(userEntryHeightStore(user), HEIGHT), IntegerEntry(userFactorStore(user), factor)]
430428 let tokenData = {
431429 func fold (total,aid) = {
432430 let adj = if ((totalVirtualTokens == 0))
433431 then 0
434432 else fraction(diff, totalVirtualDividends(aid), totalVirtualTokens)
435433 (total ++ [changeBy(totalVirtualDividendsStore(aid), adj), IntegerEntry(userDividendsAdjStore(user, aid), (userDividendsAdj(user, aid) + adj))])
436434 }
437435
438- let $l = split(dividendableTokens, "|")
436+ let $l = dividendableTokensArr
439437 let $s = size($l)
440438 let $acc0 = nil
441439 func $f0_1 ($a,$i) = if (($i >= $s))
442440 then $a
443441 else fold($a, $l[$i])
444442
445443 func $f0_2 ($a,$i) = if (($i >= $s))
446444 then $a
447445 else throw("List size exceeds 7")
448446
449447 $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)
450448 }
451449 let monitoring = if ((factor != currentFactor))
452450 then [changeBy(totalDepositedByFactorStore(currentFactor), -(inProtocol)), changeBy(totalDepositedByFactorStore(factor), (tokens + inProtocol))]
453451 else [changeBy(totalDepositedByFactorStore(factor), tokens)]
454452 ((base ++ tokenData) ++ monitoring)
455453 }
456454 }
457455 else throw("Strict value is not equal to itself.")
458456 }
459457 else throw("Strict value is not equal to itself.")
460458 }
459+
460+
461+@Callable(i)
462+func totalGvires () = $Tuple2(nil, formula(-((HEIGHT - initialHeight)), totalVirtualTokens))
463+
461464
462465
463466 @Callable(i)
464467 func shareProfitManually () = {
465468 let checks = opAllowed("share_dividends_manually")
466469 if ((checks == checks))
467470 then {
468471 let paymentAssetId = assetIdStr(i.payments[0].assetId)
469472 if (!(contains(dividendableTokens, paymentAssetId)))
470473 then throw("bad profit token")
471474 else {
472475 let amt = i.payments[0].amount
473476 [changeBy(totalVirtualDividendsStore(paymentAssetId), amt), changeBy(totalRealDividendsStore(paymentAssetId), amt)]
474477 }
475478 }
476479 else throw("Strict value is not equal to itself.")
477480 }
478481
479482
480483
481484 @Callable(i)
482485 func shareProfitFromReserves () = claimFromReservesInternal()
483486
484487
485488
486489 @Callable(i)
487-func init (configAddress,oracleAddr,vires) = [writeConstString(oracleStore, oracleAddr), writeConstString(configStore, configAddress), writeConstString(viresAssetIdStore, vires), writeInt(initialHeightStore, HEIGHT)]
490+func init (configAddress,vires) = [writeConstString(configStore, configAddress), writeConstString(viresAssetIdStore, vires)]
491+
492+
493+
494+@Callable(i)
495+func init2 () = if ((i.caller != this))
496+ then throw("only self can continue")
497+ else [writeInt(initialHeightStore, HEIGHT)]
488498
489499
490500
491501 @Callable(i)
492502 func lockFor (user,factor) = {
493- let checks = mainOnly(i)
503+ let checks = throwIf(if ((toString(i.caller) != user))
504+ then (i.caller != main)
505+ else false, "only main and user directly can do")
494506 if ((checks == checks))
495507 then updateUser(user, viresPayment(i), factor)
496508 else throw("Strict value is not equal to itself.")
497509 }
498510
499511
500512
501513 @Callable(i)
502514 func withdrawUnlockedFor (user) = {
503- let checks = if (mainOnly(i))
515+ let checks = if (throwIf(if ((toString(i.caller) != user))
516+ then (i.caller != main)
517+ else false, "only main and user directly can do"))
504518 then opAllowed("withdraw_unlocked_vires")
505519 else false
506520 if ((checks == checks))
507521 then {
508522 let addr = addressFromStringValue(user)
509- let $t01527915357 = userViresData(user)
510- let deposited = $t01527915357._1
511- let locked = $t01527915357._2
512- let withdrawable = $t01527915357._3
513- let withdrawn = $t01527915357._4
514- let gVires = $t01527915357._5
523+ let $t01554815626 = userViresData(user)
524+ let deposited = $t01554815626._1
525+ let locked = $t01554815626._2
526+ let withdrawable = $t01554815626._3
527+ let withdrawn = $t01554815626._4
528+ let gVires = $t01554815626._5
515529 if ((0 >= withdrawable))
516530 then nil
517531 else {
518532 let userUpdate = if (userOffCliff(user))
519533 then {
520- let $t01545815512 = userProfitData(user)
521- let virtualTokens = $t01545815512._1
522- let tokensData = $t01545815512._2
534+ let $t01572715781 = userProfitData(user)
535+ let virtualTokens = $t01572715781._1
536+ let tokensData = $t01572715781._2
523537 let base = [DeleteEntry(userFactorStore(user)), DeleteEntry(userEntryHeightStore(user)), DeleteEntry(userWithdrawnTokensStore(user)), DeleteEntry(userDepositedTokensStore(user)), DeleteEntry(userVirtualTokensStore(user)), changeByStr(totalVirtualTokensStore, -(withdrawable))]
524538 let tokenData = {
525539 func fold (total,item) = {
526- let $t01600416029 = item
527- let aid = $t01600416029._1
528- let ced = $t01600416029._2
529- let av = $t01600416029._3
540+ let $t01627316298 = item
541+ let aid = $t01627316298._1
542+ let ced = $t01627316298._2
543+ let av = $t01627316298._3
530544 (total ++ [DeleteEntry(userDividendsClaimedStore(user, aid)), IntegerEntry(userDividendsAdjStore(user, aid), -(av)), IntegerEntry(totalVirtualDividendsStore(aid), fraction(totalVirtualDividends(aid), (totalVirtualTokens - withdrawable), totalVirtualTokens))])
531545 }
532546
533547 let $l = tokensData
534548 let $s = size($l)
535549 let $acc0 = nil
536550 func $f0_1 ($a,$i) = if (($i >= $s))
537551 then $a
538552 else fold($a, $l[$i])
539553
540554 func $f0_2 ($a,$i) = if (($i >= $s))
541555 then $a
542556 else throw("List size exceeds 7")
543557
544558 $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)
545559 }
546560 (base ++ tokenData)
547561 }
548562 else [changeBy(userWithdrawnTokensStore(user), withdrawable)]
549563 (userUpdate ++ [changeBy(totalDepositedByFactorStore(userFactor(user)), -(withdrawable)), changeBy(totalDepositedTokensStore, -(withdrawable)), ScriptTransfer(addr, withdrawable, viresAssetId)])
550564 }
551565 }
552566 else throw("Strict value is not equal to itself.")
553567 }
554568
555569
556570
557571 @Callable(i)
558572 func claimProfit (from,to,relock) = {
559573 let validDelegate = if ((from == to))
560574 then true
561575 else match getString(this, ("delegation_claim_" + from)) {
562576 case s: String =>
563577 let data = split(s, "|")
564578 if ((to != data[0]))
565579 then throw(("no delegation rights for " + to))
566580 else if (if (relock)
567581 then (data[1] != "1")
568582 else false)
569583 then throw("attempting to relock while it's not allowed")
570584 else true
571585 case _ =>
572586 throw(("delegation not configured for " + from))
573587 }
574588 let checks = if (if (mainOnly(i))
575589 then opAllowed("claim_dividends")
576590 else false)
577591 then validDelegate
578592 else false
579593 if ((checks == checks))
580594 then {
581595 let toAddr = addressFromStringValue(to)
582- let $t01739917452 = userProfitData(from)
583- let virtualTokens = $t01739917452._1
584- let tokensData = $t01739917452._2
596+ let $t01766817721 = userProfitData(from)
597+ let virtualTokens = $t01766817721._1
598+ let tokensData = $t01766817721._2
585599 let relocking = if (relock)
586600 then updateUser(from, 0, userFactor(from))
587601 else nil
588602 let tokenData = {
589603 func fold (total,item) = {
590- let $t01765117676 = item
591- let aid = $t01765117676._1
592- let ced = $t01765117676._2
593- let av = $t01765117676._3
604+ let $t01792017945 = item
605+ let aid = $t01792017945._1
606+ let ced = $t01792017945._2
607+ let av = $t01792017945._3
594608 (total ++ [changeBy(userDividendsClaimedStore(from, aid), av), changeBy(totalRealDividendsClaimedStore(aid), av), ScriptTransfer(toAddr, av, assetId(aid))])
595609 }
596610
597611 let $l = tokensData
598612 let $s = size($l)
599613 let $acc0 = nil
600614 func $f0_1 ($a,$i) = if (($i >= $s))
601615 then $a
602616 else fold($a, $l[$i])
603617
604618 func $f0_2 ($a,$i) = if (($i >= $s))
605619 then $a
606620 else throw("List size exceeds 7")
607621
608622 $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)
609623 }
610624 (relocking ++ tokenData)
611625 }
612626 else throw("Strict value is not equal to itself.")
613627 }
614628
615629
616630
617631 @Callable(i)
618632 func setClaimDelegation (address,relock) = {
619633 let checks = opAllowed("set_delegation_claim")
620634 if ((checks == checks))
621635 then if (!(isDefined(addressFromString(address))))
622636 then throw("bad address")
623637 else [StringEntry(("delegation_claim_" + toString(i.caller)), ((address + "|") + (if (relock)
624638 then "1"
625639 else "0")))]
626640 else throw("Strict value is not equal to itself.")
627641 }
628642
629643
630644
631645 @Callable(i)
632646 func removeClaimDelegation () = {
633647 let checks = opAllowed("set_delegation_claim")
634648 if ((checks == checks))
635649 then [DeleteEntry(("delegation_claim_" + toString(i.caller)))]
636650 else throw("Strict value is not equal to itself.")
637651 }
638652
639653
654+
655+@Callable(i)
656+func userPower (user) = $Tuple2(nil, userGVires(user))
657+
658+

github/deemru/w8io/3ef1775 
92.93 ms