tx · HHcTxudBk7GEKRfPBv7geDFVoourmSDPFXT6iKSgfYu4

3PHbdpaKzz8EiAngGHaFu2hVuNCdsC67qh3:  -0.01000000 Waves

2024.01.17 19:39 [4001554] smart account 3PHbdpaKzz8EiAngGHaFu2hVuNCdsC67qh3 > SELF 0.00000000 Waves

{ "type": 13, "id": "HHcTxudBk7GEKRfPBv7geDFVoourmSDPFXT6iKSgfYu4", "fee": 1000000, "feeAssetId": null, "timestamp": 1705509598595, "version": 2, "chainId": 87, "sender": "3PHbdpaKzz8EiAngGHaFu2hVuNCdsC67qh3", "senderPublicKey": "4XuPpm7Pz97L5yDuLYiKbCSuXvtGjxCPsUBUUzmgokhP", "proofs": [ "39vTYtT2V9Pz4PnDn2ozv5zQvkvUGVS7ZEnJvJ2U7eeYQUGZUK8ib9QrVyB4YVe9Acn6h46akjmTLBp6ykMhBNFK" ], "script": "base64:BgIhCAISBwoFCAgICAESCAoGCAgICAEIEgQKAggIEgQKAggICAAGU2NhbGU4AIDC1y8AB1NjYWxlMTYAgICE/qbe4REBDWdldEFzc2V0Qnl0ZXMBCmFzc2V0SWRTdHIDCQAAAgUKYXNzZXRJZFN0cgIFV0FWRVMFBHVuaXQJANkEAQUKYXNzZXRJZFN0cgEWdmVyaWZ5TGlxdWlkYXRvckFjY2VzcwEHYWRkcmVzcwkBAiE9AgkAswkCCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMCEXNldHVwX2xpcXVpZGF0b3JzAgAJAKUIAQUHYWRkcmVzcwUEdW5pdAATTWF4U2hhcmVUb0xpcXVpZGF0ZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzAhlzZXR1cF9tYXhTaGFyZVRvTGlxdWlkYXRlAGQAEExpcXVpZGF0aW9uRGVsYXkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwIWc2V0dXBfbGlxdWlkYXRpb25EZWxheQAKABBMaXF1aWRhdG9yUmV3YXJkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMCFnNldHVwX2xpcXVpZGF0b3JSZXdhcmQACgAHbWFya2V0cwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzAg1zZXR1cF9tYXJrZXRzCQC5CQIJAMwIAgIjM1BIcHVRVVBWVW9SM0FZekZlSnplV0pmWUxzTFRtV3NzVkgFA25pbAIBLAQBaQEQcHJveHlMaXF1aWRhdGVWMgUGbWFya2V0C3VzZXJBZGRyZXNzDmRlYnRBc3NldElkU3RyEnN1cHBsaWVkQXNzZXRJZFN0cgZhbW91bnQDCQAAAgkAswkCBQdtYXJrZXRzBQZtYXJrZXQFBHVuaXQJAAIBAiBnaXZlbiBwb29sIGFkZHJlc3MgaXMgbm90IGEgcG9vbAQDaW52CQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBm1hcmtldAILbGlxdWlkYXRlVjIJAMwIAgcJAMwIAgULdXNlckFkZHJlc3MJAMwIAgUSc3VwcGxpZWRBc3NldElkU3RyBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ1nZXRBc3NldEJ5dGVzAQUOZGVidEFzc2V0SWRTdHIFBmFtb3VudAUDbmlsAwkAAAIFA2ludgUDaW52BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEQcHJveHlMaXF1aWRhdGVWMwYGbWFya2V0C3VzZXJBZGRyZXNzDmRlYnRBc3NldElkU3RyEnN1cHBsaWVkQXNzZXRJZFN0cgZhbW91bnQIcm91dGVTdHIDCQAAAgkAswkCBQdtYXJrZXRzBQZtYXJrZXQFBHVuaXQJAAIBAiRnaXZlbiBtYXJrZXQgYWRkcmVzcyBpcyBub3QgYSBtYXJrZXQDCQEBIQEJARZ2ZXJpZnlMaXF1aWRhdG9yQWNjZXNzAQgFAWkGY2FsbGVyCQACAQIkbm8gcGVybWlzc2lvbiB0byBwZXJmb3JtIGxpcXVpZGF0aW9uBA1tYXJrZXRBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBQZtYXJrZXQEBXJhdGVzCgABQAkA/AcEBQ1tYXJrZXRBZGRyZXNzAhNjYWxjdWxhdGVUb2tlblJhdGVzCQDMCAIHBQNuaWwFA25pbAMJAAECBQFAAhooTGlzdFsoSW50LCBJbnQpXSwgU3RyaW5nKQUBQAkAAgEJAKwCAgkAAwEFAUACLyBjb3VsZG4ndCBiZSBjYXN0IHRvIChMaXN0WyhJbnQsIEludCldLCBTdHJpbmcpAwkAAAIFBXJhdGVzBQVyYXRlcwQMbWFya2V0QXNzZXRzCQC1CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFDW1hcmtldEFkZHJlc3MCDHNldHVwX3Rva2VucwIBLAQJc0Fzc2V0TnVtCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUMbWFya2V0QXNzZXRzBRJzdXBwbGllZEFzc2V0SWRTdHICLXN1cHBsaWVkQXNzZXQgbm90IGZvdW5kIGluIG1hcmtldCBjb21wb3NpdGlvbgQFc1JhdGUICQCRAwIIBQVyYXRlcwJfMQUJc0Fzc2V0TnVtAl8xBAdzQW1vdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCBQ1tYXJrZXRBZGRyZXNzCQCsAgIJAKwCAgULdXNlckFkZHJlc3MCCl9ib3Jyb3dlZF8FDmRlYnRBc3NldElkU3RyBA5zdXBwbGllZEFtb3VudAkAawMFB3NBbW91bnQFBXNSYXRlBQdTY2FsZTE2BBZsYXN0TGlxRm9yTWFya2V0S2V5U3RyCQCsAgIJAKwCAgIPaGlzdG9yeV9tYXJrZXRfBQZtYXJrZXQCEF9sYXN0TGlxdWlkYXRpb24EFWxhc3RMaXF1aWRhdGlvbktleVN0cgkArAICCQCsAgICDWhpc3RvcnlfdXNlcl8FC3VzZXJBZGRyZXNzAhBfbGFzdExpcXVpZGF0aW9uBA9sYXN0TGlxdWlkYXRpb24JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUVbGFzdExpcXVpZGF0aW9uS2V5U3RyAAADCQBmAgkAawMFBmFtb3VudAUOc3VwcGxpZWRBbW91bnQAkE4FE01heFNoYXJlVG9MaXF1aWRhdGUJAAIBAihzaG91bGQgYSBsaXF1aWRhdGUgc21hbGxlciBwYXJ0IHBlciB0aW1lAwkAZgIJAGQCBQ9sYXN0TGlxdWlkYXRpb24FEExpcXVpZGF0aW9uRGVsYXkFBmhlaWdodAkAAgECFGNhbm5vdCBsaXF1aWRhdGUgeWV0BANpbnYJAPwHBAUNbWFya2V0QWRkcmVzcwIJbGlxdWlkYXRlCQDMCAIHCQDMCAIFC3VzZXJBZGRyZXNzCQDMCAIFBmFtb3VudAkAzAgCBRJzdXBwbGllZEFzc2V0SWRTdHIJAMwIAgUOZGVidEFzc2V0SWRTdHIJAMwIAgUIcm91dGVTdHIFA25pbAUDbmlsAwkAAAIFA2ludgUDaW52BBBsaXF1aWRhdG9yUmV3YXJkCQBrAwUGYW1vdW50BRBMaXF1aWRhdG9yUmV3YXJkAJBOBAtzdGF0c0tleVN0cgkArAICCQCsAgIJAKwCAgIHcmV3YXJkXwkApQgBCAUBaQZjYWxsZXICAV8FDmRlYnRBc3NldElkU3RyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQtzdGF0c0tleVN0cgkAZAIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwULc3RhdHNLZXlTdHIAAAUQbGlxdWlkYXRvclJld2FyZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUVbGFzdExpcXVpZGF0aW9uS2V5U3RyBQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIFFmxhc3RMaXFGb3JNYXJrZXRLZXlTdHIFBmhlaWdodAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDHBheW91dFJld2FyZAIKYWRkcmVzc1N0cgphc3NldElkU3RyAwkBAiE9AgkApQgBCAUBaQZjYWxsZXICIzNQTWNNaU1FczZ3NTZOUkdhY2tzWHRGRzV6Uzdkb0U5ZnBMCQACAQIYbm8gYWNjZXNzIHRvIHRoaXMgbWV0aG9kBAtzdGF0c0tleVN0cgkArAICCQCsAgIJAKwCAgIHcmV3YXJkXwUKYWRkcmVzc1N0cgIBXwUKYXNzZXRJZFN0cgQPcmV3YXJkQXZhaWxhYmxlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFC3N0YXRzS2V5U3RyAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUKYWRkcmVzc1N0cgUPcmV3YXJkQXZhaWxhYmxlCQENZ2V0QXNzZXRCeXRlcwEFCmFzc2V0SWRTdHIJAMwIAgkBDEludGVnZXJFbnRyeQIFC3N0YXRzS2V5U3RyAAAFA25pbAFpAQx1cGRhdGVTdHJpbmcCA3ZhbANrZXkDAwkBAiE9AgkApQgBCAUBaQZjYWxsZXICIzNQTWNNaU1FczZ3NTZOUkdhY2tzWHRGRzV6Uzdkb0U5ZnBMCQECIT0CCQClCAEIBQFpBmNhbGxlcgIjM1BIYmRwYUt6ejhFaUFuZ0dIYUZ1MmhWdU5DZHNDNjdxaDMHCQACAQIYbm8gYWNjZXNzIHRvIHRoaXMgbWV0aG9kCQDMCAIJAQtTdHJpbmdFbnRyeQIFA3ZhbAUDa2V5BQNuaWwAMa3oHQ==", "height": 4001554, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 2RRT8mW4StiE7T5HCD6Hq18d6x5cLUab5B4oZn8Dyehp Next: C21SaMpMkH62bUkMZghkQhpRwFtDjJ9ym7yA1cs1UrKQ Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let pools = ["3P4uA5etnZi4AmBabKinq2bMiWU8KcnHZdH"]
4+let Scale8 = 100000000
5+
6+let Scale16 = 10000000000000000
57
68 func getAssetBytes (assetIdStr) = if ((assetIdStr == "WAVES"))
79 then unit
810 else fromBase58String(assetIdStr)
911
1012
13+func verifyLiquidatorAccess (address) = (indexOf(valueOrElse(getString(this, "setup_liquidators"), ""), toString(address)) != unit)
14+
15+
16+let MaxShareToLiquidate = valueOrElse(getInteger(this, "setup_maxShareToLiquidate"), 100)
17+
18+let LiquidationDelay = valueOrElse(getInteger(this, "setup_liquidationDelay"), 10)
19+
20+let LiquidatorReward = valueOrElse(getInteger(this, "setup_liquidatorReward"), 10)
21+
22+let markets = valueOrElse(getString(this, "setup_markets"), makeString(["3PHpuQUPVUoR3AYzFeJzeWJfYLsLTmWssVH"], ","))
23+
1124 @Callable(i)
12-func proxyLiquidateV2 (pool,userAddress,debtAssetIdStr,suppliedAssetIdStr,amount) = if ((indexOf(pools, pool) == unit))
25+func proxyLiquidateV2 (market,userAddress,debtAssetIdStr,suppliedAssetIdStr,amount) = if ((indexOf(markets, market) == unit))
1326 then throw("given pool address is not a pool")
1427 else {
15- let inv = invoke(addressFromStringValue(pool), "liquidateV2", [false, userAddress, suppliedAssetIdStr], [AttachedPayment(getAssetBytes(debtAssetIdStr), amount)])
28+ let inv = invoke(addressFromStringValue(market), "liquidateV2", [false, userAddress, suppliedAssetIdStr], [AttachedPayment(getAssetBytes(debtAssetIdStr), amount)])
1629 if ((inv == inv))
1730 then nil
1831 else throw("Strict value is not equal to itself.")
1932 }
2033
2134
35+
36+@Callable(i)
37+func proxyLiquidateV3 (market,userAddress,debtAssetIdStr,suppliedAssetIdStr,amount,routeStr) = if ((indexOf(markets, market) == unit))
38+ then throw("given market address is not a market")
39+ else if (!(verifyLiquidatorAccess(i.caller)))
40+ then throw("no permission to perform liquidation")
41+ else {
42+ let marketAddress = addressFromStringValue(market)
43+ let rates = {
44+ let @ = invoke(marketAddress, "calculateTokenRates", [false], nil)
45+ if ($isInstanceOf(@, "(List[(Int, Int)], String)"))
46+ then @
47+ else throw(($getType(@) + " couldn't be cast to (List[(Int, Int)], String)"))
48+ }
49+ if ((rates == rates))
50+ then {
51+ let marketAssets = split(getStringValue(marketAddress, "setup_tokens"), ",")
52+ let sAssetNum = valueOrErrorMessage(indexOf(marketAssets, suppliedAssetIdStr), "suppliedAsset not found in market composition")
53+ let sRate = rates._1[sAssetNum]._1
54+ let sAmount = getIntegerValue(marketAddress, ((userAddress + "_borrowed_") + debtAssetIdStr))
55+ let suppliedAmount = fraction(sAmount, sRate, Scale16)
56+ let lastLiqForMarketKeyStr = (("history_market_" + market) + "_lastLiquidation")
57+ let lastLiquidationKeyStr = (("history_user_" + userAddress) + "_lastLiquidation")
58+ let lastLiquidation = valueOrElse(getInteger(this, lastLiquidationKeyStr), 0)
59+ if ((fraction(amount, suppliedAmount, 10000) > MaxShareToLiquidate))
60+ then throw("should a liquidate smaller part per time")
61+ else if (((lastLiquidation + LiquidationDelay) > height))
62+ then throw("cannot liquidate yet")
63+ else {
64+ let inv = invoke(marketAddress, "liquidate", [false, userAddress, amount, suppliedAssetIdStr, debtAssetIdStr, routeStr], nil)
65+ if ((inv == inv))
66+ then {
67+ let liquidatorReward = fraction(amount, LiquidatorReward, 10000)
68+ let statsKeyStr = ((("reward_" + toString(i.caller)) + "_") + debtAssetIdStr)
69+[IntegerEntry(statsKeyStr, (valueOrElse(getInteger(this, statsKeyStr), 0) + liquidatorReward)), IntegerEntry(lastLiquidationKeyStr, height), IntegerEntry(lastLiqForMarketKeyStr, height)]
70+ }
71+ else throw("Strict value is not equal to itself.")
72+ }
73+ }
74+ else throw("Strict value is not equal to itself.")
75+ }
76+
77+
78+
79+@Callable(i)
80+func payoutReward (addressStr,assetIdStr) = if ((toString(i.caller) != "3PMcMiMEs6w56NRGacksXtFG5zS7doE9fpL"))
81+ then throw("no access to this method")
82+ else {
83+ let statsKeyStr = ((("reward_" + addressStr) + "_") + assetIdStr)
84+ let rewardAvailable = valueOrElse(getInteger(this, statsKeyStr), 0)
85+[ScriptTransfer(addressFromStringValue(addressStr), rewardAvailable, getAssetBytes(assetIdStr)), IntegerEntry(statsKeyStr, 0)]
86+ }
87+
88+
89+
90+@Callable(i)
91+func updateString (val,key) = if (if ((toString(i.caller) != "3PMcMiMEs6w56NRGacksXtFG5zS7doE9fpL"))
92+ then (toString(i.caller) != "3PHbdpaKzz8EiAngGHaFu2hVuNCdsC67qh3")
93+ else false)
94+ then throw("no access to this method")
95+ else [StringEntry(val, key)]
96+
97+

github/deemru/w8io/873ac7e 
36.95 ms