tx · ANyHc8xwGEctgFDEeYU3A9aGu7nvkgyDX6WYkvMZp8ta 3P7WDKNEKa5aPGaFrMDve4z76hrnhosUoN7: -0.00400000 Waves 2023.04.21 11:54 [3609670] smart account 3P7WDKNEKa5aPGaFrMDve4z76hrnhosUoN7 > SELF 0.00000000 Waves
{ "type": 13, "id": "ANyHc8xwGEctgFDEeYU3A9aGu7nvkgyDX6WYkvMZp8ta", "fee": 400000, "feeAssetId": null, "timestamp": 1682067303594, "version": 1, "sender": "3P7WDKNEKa5aPGaFrMDve4z76hrnhosUoN7", "senderPublicKey": "6MAcrVJEiVWAgL2mNuXDNnYbP3m1TyYH9Q7cnMkMGV1b", "proofs": [ "gY1hvSCRoPsq4MmkepvngQ1vRcfg247TuU8citf6vNBYWi5QrAkwSCB9DvhNPQ19Fn1GDAFyYBi2KbmdocGC3dC" ], "script": "base64:BgICCAIJAQVhc0ludAEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACA0ludAQDaW50BQckbWF0Y2gwBQNpbnQJAAIBAhl3cm9uZyB0eXBlLCBleHBlY3RlZDogSW50AQhhc1N0cmluZwEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAUBcwkAAgECHHdyb25nIHR5cGUsIGV4cGVjdGVkOiBTdHJpbmcABFVTRE4CLERHMnhGa1BkRHdLVW9Ca3pHQWhRdExwU0d6ZlhMaUNZUEV6ZUtIMkFkMjRwAARFVVJOAixEVWsyWVR4aFJvQXFNSkx1czRHMmIzZlI4aE1IVmg2ZWl5Rng1cjI5VlI2dAAMd2F2ZXNMZWFzaW5nCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMCDHdhdmVzTGVhc2luZwAoARdnZXRJbnRlcmVzdFJlc2VydmVSYXRpbwIKY29uZmlnQWRkcgdhc3NldElkCgEOZ2V0RGlzdHJpYnV0b3IBB2Fzc2V0SWQDCQAAAgUHYXNzZXRJZAIFV0FWRVMCIzNQOUxLODJEbndodmh5aExYbVVTQkdYeXc2U2R6eWNERXJFAwkAAAIFB2Fzc2V0SWQFBFVTRE4CIzNQQ2NteUt4UGJOdXI3elFQZ2FmOXVjemI4UVl0RTcxam91AwkAAAIFB2Fzc2V0SWQFBEVVUk4CIzNQTFZHWUZkQm53Q0JRUW53OG9FZks2V1ZRUGVUcTYyUGhTBQR1bml0BAckbWF0Y2gwCQEOZ2V0RGlzdHJpYnV0b3IBBQdhc3NldElkAwkAAQIFByRtYXRjaDACBlN0cmluZwQBZAUHJG1hdGNoMAkArAICAhgsIGludGVyZXN0UmVzZXJ2ZVJhdGlvOiAJAJEDAgkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFCmNvbmZpZ0FkZHIJAKwCAgIKYWRkZXJfY2ZnXwUBZAIFMHxuaWwCAXwAAAIAAQ5nZXRSZXNlcnZlSW5mbwMNY29uZmlnQWRkcmVzcwdyZXNlcnZlBm9yYWNsZQQLcmVzZXJ2ZUFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFB3Jlc2VydmUEDGFzc2V0SWRTdG9yZQIHYXNzZXRJZAQNYVRva2VuSWRTdG9yZQIIYVRva2VuSWQEB2Fzc2V0SWQJARFAZXh0ck5hdGl2ZSgxMDUzKQIFC3Jlc2VydmVBZGRyBQxhc3NldElkU3RvcmUDCQAAAgUHYXNzZXRJZAUHYXNzZXRJZAQIYVRva2VuSWQJARFAZXh0ck5hdGl2ZSgxMDUzKQIFC3Jlc2VydmVBZGRyBQ1hVG9rZW5JZFN0b3JlAwkAAAIFCGFUb2tlbklkBQhhVG9rZW5JZAQFcHJpY2UJAQVhc0ludAEJAPwHBAUGb3JhY2xlAgVwcmljZQkAzAgCBQdhc3NldElkBQNuaWwFA25pbAMJAAACBQVwcmljZQUFcHJpY2UEBGRhdGEJAQhhc1N0cmluZwEJAPwHBAULcmVzZXJ2ZUFkZHICBmFkdmlzZQUDbmlsBQNuaWwDCQAAAgUEZGF0YQUEZGF0YQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICB3ByaWNlOiAJAKQDAQUFcHJpY2UCCywgYXNzZXRJZDogBQdhc3NldElkAgwsIGFUb2tlbklkOiAFCGFUb2tlbklkCQEXZ2V0SW50ZXJlc3RSZXNlcnZlUmF0aW8CBQ1jb25maWdBZGRyZXNzBQdhc3NldElkAgIsIAUEZGF0YQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEGYWR2aXNlAQRtYWluBAttYWluQWRkcmVzcwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEFBG1haW4CCGJhZCBtYWluBApjb25maWdBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgULbWFpbkFkZHJlc3MCBmNvbmZpZwIeZXZhbC5hZHZpc2U6IG5vIGNvbmZpZyBpbiBtYWluBAZvcmFjbGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUKY29uZmlnQWRkcgIOb3JhY2xlX2FkZHJlc3MCE25vIG9yYWNsZSBpbiBjb25maWcCEmJhZCBvcmFjbGUgYWRkcmVzcwQIcmVzZXJ2ZXMJALwJAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFCmNvbmZpZ0FkZHICEHByaW1hcnlfcmVzZXJ2ZXMCGWV2YWw6IG5vIHByaW1hcnkgcmVzZXJ2ZXMCAXwEB2dlbmVyYWwJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCGhlaWdodDogCQCkAwEFBmhlaWdodAIaLCBhY2NvdW50SGVhbHRoVGhyZXNob2xkOiAJAKQDAQkBEUBleHRyTmF0aXZlKDEwNTApAgUKY29uZmlnQWRkcgIYYWNjb3VudF9oZWFsdGhfdGhyZXNob2xkAhgsIGFjY291bnRIZWFsdGhPdmVybGFwOiAJAKQDAQkBEUBleHRyTmF0aXZlKDEwNTApAgUKY29uZmlnQWRkcgIWYWNjb3VudF9oZWFsdGhfb3ZlcmxhcAITLCBjb2xsYXBzZVBlbmFsdHk6IAkApAMBCQERQGV4dHJOYXRpdmUoMTA1MCkCBQpjb25maWdBZGRyAhBjb2xsYXBzZV9wZW5hbHR5AhAsIHdhdmVzTGVhc2luZzogCQCkAwEFDHdhdmVzTGVhc2luZwQLcmVzZXJ2ZURhdGEKAQRmb2xkAgZ0b3RhbHMHcmVzZXJ2ZQkArAICCQCsAgIJAKwCAgUGdG90YWxzAgQsIFsgCQEOZ2V0UmVzZXJ2ZUluZm8DBQpjb25maWdBZGRyBQdyZXNlcnZlBQZvcmFjbGUCAyBdIAoAAiRsBQhyZXNlcnZlcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzACAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEEZm9sZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMjAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUCQCsAgIFB2dlbmVyYWwFC3Jlc2VydmVEYXRhAQphZHZpc2VVc2VyAgRtYWluBHVzZXIEC21haW5BZGRyZXNzCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQUEbWFpbgIIYmFkIG1haW4ECHJlc2VydmVzCQC8CQIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFC21haW5BZGRyZXNzAgZjb25maWcCImV2YWwuYWR2aXNlVXNlcjogbm8gY29uZmlnIGluIG1haW4CI2V2YWwuYWR2aXNlVXNlcjogYmFkIGNvbmZpZyBpbiBtYWluAhBwcmltYXJ5X3Jlc2VydmVzAhlldmFsOiBubyBwcmltYXJ5IHJlc2VydmVzAgF8BAdnZW5lcmFsCQCsAgIJAKwCAgkArAICAghoZWlnaHQ6IAkApAMBBQZoZWlnaHQCCCwgdXNlcjogBQR1c2VyCgEEZm9sZAIGdG90YWxzB3Jlc2VydmUECHVzZXJJbmZvCQEIYXNTdHJpbmcBCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFB3Jlc2VydmUCCmFkdmlzZVVzZXIJAMwIAgUEdXNlcgUDbmlsBQNuaWwDCQAAAgUIdXNlckluZm8FCHVzZXJJbmZvCQCsAgIJAKwCAgkArAICBQZ0b3RhbHMCBCwgWyAFCHVzZXJJbmZvAgMgXSAJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4KAAIkbAUIcmVzZXJ2ZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQdnZW5lcmFsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRmb2xkAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAAIaTcrY=", "chainId": 87, "height": 3609670, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: none Full:
Old | New | Differences | |
---|---|---|---|
1 | - | # no script | |
1 | + | {-# STDLIB_VERSION 6 #-} | |
2 | + | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | + | {-# CONTENT_TYPE DAPP #-} | |
4 | + | func asInt (value) = match value { | |
5 | + | case int: Int => | |
6 | + | int | |
7 | + | case _ => | |
8 | + | throw("wrong type, expected: Int") | |
9 | + | } | |
10 | + | ||
11 | + | ||
12 | + | func asString (value) = match value { | |
13 | + | case s: String => | |
14 | + | s | |
15 | + | case _ => | |
16 | + | throw("wrong type, expected: String") | |
17 | + | } | |
18 | + | ||
19 | + | ||
20 | + | let USDN = "DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p" | |
21 | + | ||
22 | + | let EURN = "DUk2YTxhRoAqMJLus4G2b3fR8hMHVh6eiyFx5r29VR6t" | |
23 | + | ||
24 | + | let wavesLeasing = valueOrElse(getInteger(this, "wavesLeasing"), 40) | |
25 | + | ||
26 | + | func getInterestReserveRatio (configAddr,assetId) = { | |
27 | + | func getDistributor (assetId) = if ((assetId == "WAVES")) | |
28 | + | then "3P9LK82DnwhvhyhLXmUSBGXyw6SdzycDErE" | |
29 | + | else if ((assetId == USDN)) | |
30 | + | then "3PCcmyKxPbNur7zQPgaf9uczb8QYtE71jou" | |
31 | + | else if ((assetId == EURN)) | |
32 | + | then "3PLVGYFdBnwCBQQnw8oEfK6WVQPeTq62PhS" | |
33 | + | else unit | |
34 | + | ||
35 | + | match getDistributor(assetId) { | |
36 | + | case d: String => | |
37 | + | (", interestReserveRatio: " + split(valueOrElse(getString(configAddr, ("adder_cfg_" + d)), "0|nil"), "|")[0]) | |
38 | + | case _ => | |
39 | + | "" | |
40 | + | } | |
41 | + | } | |
42 | + | ||
43 | + | ||
44 | + | func getReserveInfo (configAddress,reserve,oracle) = { | |
45 | + | let reserveAddr = addressFromStringValue(reserve) | |
46 | + | let assetIdStore = "assetId" | |
47 | + | let aTokenIdStore = "aTokenId" | |
48 | + | let assetId = getStringValue(reserveAddr, assetIdStore) | |
49 | + | if ((assetId == assetId)) | |
50 | + | then { | |
51 | + | let aTokenId = getStringValue(reserveAddr, aTokenIdStore) | |
52 | + | if ((aTokenId == aTokenId)) | |
53 | + | then { | |
54 | + | let price = asInt(invoke(oracle, "price", [assetId], nil)) | |
55 | + | if ((price == price)) | |
56 | + | then { | |
57 | + | let data = asString(invoke(reserveAddr, "advise", nil, nil)) | |
58 | + | if ((data == data)) | |
59 | + | then (((((((("price: " + toString(price)) + ", assetId: ") + assetId) + ", aTokenId: ") + aTokenId) + getInterestReserveRatio(configAddress, assetId)) + ", ") + data) | |
60 | + | else throw("Strict value is not equal to itself.") | |
61 | + | } | |
62 | + | else throw("Strict value is not equal to itself.") | |
63 | + | } | |
64 | + | else throw("Strict value is not equal to itself.") | |
65 | + | } | |
66 | + | else throw("Strict value is not equal to itself.") | |
67 | + | } | |
68 | + | ||
69 | + | ||
70 | + | func advise (main) = { | |
71 | + | let mainAddress = valueOrErrorMessage(addressFromString(main), "bad main") | |
72 | + | let configAddr = addressFromStringValue(valueOrErrorMessage(getString(mainAddress, "config"), "eval.advise: no config in main")) | |
73 | + | let oracle = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddr, "oracle_address"), "no oracle in config")), "bad oracle address") | |
74 | + | let reserves = split_4C(valueOrErrorMessage(getString(configAddr, "primary_reserves"), "eval: no primary reserves"), "|") | |
75 | + | let general = ((((((((("height: " + toString(height)) + ", accountHealthThreshold: ") + toString(getIntegerValue(configAddr, "account_health_threshold"))) + ", accountHealthOverlap: ") + toString(getIntegerValue(configAddr, "account_health_overlap"))) + ", collapsePenalty: ") + toString(getIntegerValue(configAddr, "collapse_penalty"))) + ", wavesLeasing: ") + toString(wavesLeasing)) | |
76 | + | let reserveData = { | |
77 | + | func fold (totals,reserve) = (((totals + ", [ ") + getReserveInfo(configAddr, reserve, oracle)) + " ] ") | |
78 | + | ||
79 | + | let $l = reserves | |
80 | + | let $s = size($l) | |
81 | + | let $acc0 = "" | |
82 | + | func $f0_1 ($a,$i) = if (($i >= $s)) | |
83 | + | then $a | |
84 | + | else fold($a, $l[$i]) | |
85 | + | ||
86 | + | func $f0_2 ($a,$i) = if (($i >= $s)) | |
87 | + | then $a | |
88 | + | else throw("List size exceeds 20") | |
89 | + | ||
90 | + | $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20) | |
91 | + | } | |
92 | + | (general + reserveData) | |
93 | + | } | |
94 | + | ||
95 | + | ||
96 | + | func adviseUser (main,user) = { | |
97 | + | let mainAddress = valueOrErrorMessage(addressFromString(main), "bad main") | |
98 | + | let reserves = split_4C(valueOrErrorMessage(getString(valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(mainAddress, "config"), "eval.adviseUser: no config in main")), "eval.adviseUser: bad config in main"), "primary_reserves"), "eval: no primary reserves"), "|") | |
99 | + | let general = ((("height: " + toString(height)) + ", user: ") + user) | |
100 | + | func fold (totals,reserve) = { | |
101 | + | let userInfo = asString(invoke(addressFromStringValue(reserve), "adviseUser", [user], nil)) | |
102 | + | if ((userInfo == userInfo)) | |
103 | + | then (((totals + ", [ ") + userInfo) + " ] ") | |
104 | + | else throw("Strict value is not equal to itself.") | |
105 | + | } | |
106 | + | ||
107 | + | let $l = reserves | |
108 | + | let $s = size($l) | |
109 | + | let $acc0 = general | |
110 | + | func $f0_1 ($a,$i) = if (($i >= $s)) | |
111 | + | then $a | |
112 | + | else fold($a, $l[$i]) | |
113 | + | ||
114 | + | func $f0_2 ($a,$i) = if (($i >= $s)) | |
115 | + | then $a | |
116 | + | else throw("List size exceeds 20") | |
117 | + | ||
118 | + | $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20) | |
119 | + | } | |
120 | + | ||
121 | + | ||
122 | + |
github/deemru/w8io/3ef1775 24.09 ms ◑