tx · Fj5S5vY9nTnFQVwST8XjR95nD918J1SXkcLyxSxfbWuX

3PHbdpaKzz8EiAngGHaFu2hVuNCdsC67qh3:  -0.01000000 Waves

2024.01.17 19:51 [4001565] smart account 3PHbdpaKzz8EiAngGHaFu2hVuNCdsC67qh3 > SELF 0.00000000 Waves

{ "type": 13, "id": "Fj5S5vY9nTnFQVwST8XjR95nD918J1SXkcLyxSxfbWuX", "fee": 1000000, "feeAssetId": null, "timestamp": 1705510387857, "version": 2, "chainId": 87, "sender": "3PHbdpaKzz8EiAngGHaFu2hVuNCdsC67qh3", "senderPublicKey": "4XuPpm7Pz97L5yDuLYiKbCSuXvtGjxCPsUBUUzmgokhP", "proofs": [ "yoNEYhNFFZfCzqafFCTPgLZBwFw1rup3HPwKcsoZTKfV2NmWgQ71WNT5y5FGtwVbtd1W5eebfwaBSy84RhiC8yG" ], "script": "base64:BgIhCAISBwoFCAgICAESCAoGCAgICAEIEgQKAggIEgQKAggICAAGU2NhbGU4AIDC1y8AB1NjYWxlMTYAgICE/qbe4REBDWdldEFzc2V0Qnl0ZXMBCmFzc2V0SWRTdHIDCQAAAgUKYXNzZXRJZFN0cgIFV0FWRVMFBHVuaXQJANkEAQUKYXNzZXRJZFN0cgEWdmVyaWZ5TGlxdWlkYXRvckFjY2VzcwEHYWRkcmVzcwkBAiE9AgkAswkCCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMCEXNldHVwX2xpcXVpZGF0b3JzAgAJAKUIAQUHYWRkcmVzcwUEdW5pdAATTWF4U2hhcmVUb0xpcXVpZGF0ZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzAhlzZXR1cF9tYXhTaGFyZVRvTGlxdWlkYXRlAGQAEExpcXVpZGF0aW9uRGVsYXkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwIWc2V0dXBfbGlxdWlkYXRpb25EZWxheQAKABBMaXF1aWRhdG9yUmV3YXJkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMCFnNldHVwX2xpcXVpZGF0b3JSZXdhcmQACgAHbWFya2V0cwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzAg1zZXR1cF9tYXJrZXRzCQC5CQIJAMwIAgIjM1BIcHVRVVBWVW9SM0FZekZlSnplV0pmWUxzTFRtV3NzVkgFA25pbAIBLAQBaQEQcHJveHlMaXF1aWRhdGVWMgUGbWFya2V0C3VzZXJBZGRyZXNzDmRlYnRBc3NldElkU3RyEnN1cHBsaWVkQXNzZXRJZFN0cgZhbW91bnQDCQAAAgkAswkCBQdtYXJrZXRzBQZtYXJrZXQFBHVuaXQJAAIBAiBnaXZlbiBwb29sIGFkZHJlc3MgaXMgbm90IGEgcG9vbAQDaW52CQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBm1hcmtldAILbGlxdWlkYXRlVjIJAMwIAgcJAMwIAgULdXNlckFkZHJlc3MJAMwIAgUSc3VwcGxpZWRBc3NldElkU3RyBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ1nZXRBc3NldEJ5dGVzAQUOZGVidEFzc2V0SWRTdHIFBmFtb3VudAUDbmlsAwkAAAIFA2ludgUDaW52BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEQcHJveHlMaXF1aWRhdGVWMwYGbWFya2V0C3VzZXJBZGRyZXNzDmRlYnRBc3NldElkU3RyEnN1cHBsaWVkQXNzZXRJZFN0cgZhbW91bnQIcm91dGVTdHIDCQAAAgkAswkCBQdtYXJrZXRzBQZtYXJrZXQFBHVuaXQJAAIBAiRnaXZlbiBtYXJrZXQgYWRkcmVzcyBpcyBub3QgYSBtYXJrZXQDCQEBIQEJARZ2ZXJpZnlMaXF1aWRhdG9yQWNjZXNzAQgFAWkGY2FsbGVyCQACAQIkbm8gcGVybWlzc2lvbiB0byBwZXJmb3JtIGxpcXVpZGF0aW9uBA1tYXJrZXRBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBQZtYXJrZXQEBXNSYXRlCQERQGV4dHJOYXRpdmUoMTA1MCkCBQ1tYXJrZXRBZGRyZXNzCQCsAgIFEnN1cHBsaWVkQXNzZXRJZFN0cgIGX3NSYXRlBAdzQW1vdW50CQERQGV4dHJOYXRpdmUoMTA1MCkCBQ1tYXJrZXRBZGRyZXNzCQCsAgIJAKwCAgULdXNlckFkZHJlc3MCCl9zdXBwbGllZF8FEnN1cHBsaWVkQXNzZXRJZFN0cgQOc3VwcGxpZWRBbW91bnQJAGsDBQdzQW1vdW50BQVzUmF0ZQUHU2NhbGUxNgQWbGFzdExpcUZvck1hcmtldEtleVN0cgkArAICCQCsAgICD2hpc3RvcnlfbWFya2V0XwUGbWFya2V0AhBfbGFzdExpcXVpZGF0aW9uBBVsYXN0TGlxdWlkYXRpb25LZXlTdHIJAKwCAgkArAICAg1oaXN0b3J5X3VzZXJfBQt1c2VyQWRkcmVzcwIQX2xhc3RMaXF1aWRhdGlvbgQPbGFzdExpcXVpZGF0aW9uCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFFWxhc3RMaXF1aWRhdGlvbktleVN0cgAAAwkAZgIFBmFtb3VudAkAawMFE01heFNoYXJlVG9MaXF1aWRhdGUFDnN1cHBsaWVkQW1vdW50AJBOCQACAQImc2hvdWxkIGxpcXVpZGF0ZSBzbWFsbGVyIHBhcnQgcGVyIHRpbWUDCQBmAgkAZAIFD2xhc3RMaXF1aWRhdGlvbgUQTGlxdWlkYXRpb25EZWxheQUGaGVpZ2h0CQACAQIUY2Fubm90IGxpcXVpZGF0ZSB5ZXQEA2ludgkA/AcEBQ1tYXJrZXRBZGRyZXNzAglsaXF1aWRhdGUJAMwIAgcJAMwIAgULdXNlckFkZHJlc3MJAMwIAgUGYW1vdW50CQDMCAIFEnN1cHBsaWVkQXNzZXRJZFN0cgkAzAgCBQ5kZWJ0QXNzZXRJZFN0cgkAzAgCBQhyb3V0ZVN0cgUDbmlsBQNuaWwDCQAAAgUDaW52BQNpbnYEEGxpcXVpZGF0b3JSZXdhcmQJAGsDBQZhbW91bnQFEExpcXVpZGF0b3JSZXdhcmQAkE4EC3N0YXRzS2V5U3RyCQCsAgIJAKwCAgkArAICAgdyZXdhcmRfCQClCAEIBQFpBmNhbGxlcgIBXwUOZGVidEFzc2V0SWRTdHIJAMwIAgkBDEludGVnZXJFbnRyeQIFC3N0YXRzS2V5U3RyCQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQtzdGF0c0tleVN0cgAABRBsaXF1aWRhdG9yUmV3YXJkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRVsYXN0TGlxdWlkYXRpb25LZXlTdHIFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgUWbGFzdExpcUZvck1hcmtldEtleVN0cgUGaGVpZ2h0BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEMcGF5b3V0UmV3YXJkAgphZGRyZXNzU3RyCmFzc2V0SWRTdHIDCQECIT0CCQClCAEIBQFpBmNhbGxlcgIjM1BNY01pTUVzNnc1Nk5SR2Fja3NYdEZHNXpTN2RvRTlmcEwJAAIBAhhubyBhY2Nlc3MgdG8gdGhpcyBtZXRob2QEC3N0YXRzS2V5U3RyCQCsAgIJAKwCAgkArAICAgdyZXdhcmRfBQphZGRyZXNzU3RyAgFfBQphc3NldElkU3RyBA9yZXdhcmRBdmFpbGFibGUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwULc3RhdHNLZXlTdHIAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQphZGRyZXNzU3RyBQ9yZXdhcmRBdmFpbGFibGUJAQ1nZXRBc3NldEJ5dGVzAQUKYXNzZXRJZFN0cgkAzAgCCQEMSW50ZWdlckVudHJ5AgULc3RhdHNLZXlTdHIAAAUDbmlsAWkBDHVwZGF0ZVN0cmluZwIDdmFsA2tleQMDCQECIT0CCQClCAEIBQFpBmNhbGxlcgIjM1BNY01pTUVzNnc1Nk5SR2Fja3NYdEZHNXpTN2RvRTlmcEwJAQIhPQIJAKUIAQgFAWkGY2FsbGVyAiMzUEhiZHBhS3p6OEVpQW5nR0hhRnUyaFZ1TkNkc0M2N3FoMwcJAAIBAhhubyBhY2Nlc3MgdG8gdGhpcyBtZXRob2QJAMwIAgkBC1N0cmluZ0VudHJ5AgUDdmFsBQNrZXkFA25pbABW6XjX", "height": 4001565, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 75e8D9FqYhE1snaFhbDjaxgcW2XsLB2cuBawHZxcoR6J Next: 3ZkMXXWsPvok293PSwTBXH6J4TDJY6NvuAPoHXrPJ294 Diff:
OldNewDifferences
4040 then throw("no permission to perform liquidation")
4141 else {
4242 let marketAddress = addressFromStringValue(market)
43- let rates = {
44- let @ = invoke(marketAddress, "calculateTokenRates", [false], nil)
45- if ($isInstanceOf(@, "String"))
46- then @
47- else throw(($getType(@) + " couldn't be cast to String"))
48- }
49- if ((rates == rates))
50- then {
51- let ratesLi = split(rates, ",")
52- let marketAssets = split(getStringValue(marketAddress, "setup_tokens"), ",")
53- let sAssetNum = valueOrErrorMessage(indexOf(marketAssets, suppliedAssetIdStr), "suppliedAsset not found in market composition")
54- let sRate = parseIntValue(split(ratesLi[sAssetNum], "|")[1])
55- let sAmount = getIntegerValue(marketAddress, ((userAddress + "_supplied_") + suppliedAssetIdStr))
56- let suppliedAmount = fraction(sAmount, sRate, Scale16)
57- let lastLiqForMarketKeyStr = (("history_market_" + market) + "_lastLiquidation")
58- let lastLiquidationKeyStr = (("history_user_" + userAddress) + "_lastLiquidation")
59- let lastLiquidation = valueOrElse(getInteger(this, lastLiquidationKeyStr), 0)
60- if ((amount > fraction(MaxShareToLiquidate, suppliedAmount, 10000)))
61- then throw("should a liquidate smaller part per time")
62- else if (((lastLiquidation + LiquidationDelay) > height))
63- then throw("cannot liquidate yet")
64- else {
65- let inv = invoke(marketAddress, "liquidate", [false, userAddress, amount, suppliedAssetIdStr, debtAssetIdStr, routeStr], nil)
66- if ((inv == inv))
67- then {
68- let liquidatorReward = fraction(amount, LiquidatorReward, 10000)
69- let statsKeyStr = ((("reward_" + toString(i.caller)) + "_") + debtAssetIdStr)
43+ let sRate = getIntegerValue(marketAddress, (suppliedAssetIdStr + "_sRate"))
44+ let sAmount = getIntegerValue(marketAddress, ((userAddress + "_supplied_") + suppliedAssetIdStr))
45+ let suppliedAmount = fraction(sAmount, sRate, Scale16)
46+ let lastLiqForMarketKeyStr = (("history_market_" + market) + "_lastLiquidation")
47+ let lastLiquidationKeyStr = (("history_user_" + userAddress) + "_lastLiquidation")
48+ let lastLiquidation = valueOrElse(getInteger(this, lastLiquidationKeyStr), 0)
49+ if ((amount > fraction(MaxShareToLiquidate, suppliedAmount, 10000)))
50+ then throw("should liquidate smaller part per time")
51+ else if (((lastLiquidation + LiquidationDelay) > height))
52+ then throw("cannot liquidate yet")
53+ else {
54+ let inv = invoke(marketAddress, "liquidate", [false, userAddress, amount, suppliedAssetIdStr, debtAssetIdStr, routeStr], nil)
55+ if ((inv == inv))
56+ then {
57+ let liquidatorReward = fraction(amount, LiquidatorReward, 10000)
58+ let statsKeyStr = ((("reward_" + toString(i.caller)) + "_") + debtAssetIdStr)
7059 [IntegerEntry(statsKeyStr, (valueOrElse(getInteger(this, statsKeyStr), 0) + liquidatorReward)), IntegerEntry(lastLiquidationKeyStr, height), IntegerEntry(lastLiqForMarketKeyStr, height)]
71- }
72- else throw("Strict value is not equal to itself.")
7360 }
74- }
75- else throw("Strict value is not equal to itself.")
61+ else throw("Strict value is not equal to itself.")
62+ }
7663 }
7764
7865
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let Scale8 = 100000000
55
66 let Scale16 = 10000000000000000
77
88 func getAssetBytes (assetIdStr) = if ((assetIdStr == "WAVES"))
99 then unit
1010 else fromBase58String(assetIdStr)
1111
1212
1313 func verifyLiquidatorAccess (address) = (indexOf(valueOrElse(getString(this, "setup_liquidators"), ""), toString(address)) != unit)
1414
1515
1616 let MaxShareToLiquidate = valueOrElse(getInteger(this, "setup_maxShareToLiquidate"), 100)
1717
1818 let LiquidationDelay = valueOrElse(getInteger(this, "setup_liquidationDelay"), 10)
1919
2020 let LiquidatorReward = valueOrElse(getInteger(this, "setup_liquidatorReward"), 10)
2121
2222 let markets = valueOrElse(getString(this, "setup_markets"), makeString(["3PHpuQUPVUoR3AYzFeJzeWJfYLsLTmWssVH"], ","))
2323
2424 @Callable(i)
2525 func proxyLiquidateV2 (market,userAddress,debtAssetIdStr,suppliedAssetIdStr,amount) = if ((indexOf(markets, market) == unit))
2626 then throw("given pool address is not a pool")
2727 else {
2828 let inv = invoke(addressFromStringValue(market), "liquidateV2", [false, userAddress, suppliedAssetIdStr], [AttachedPayment(getAssetBytes(debtAssetIdStr), amount)])
2929 if ((inv == inv))
3030 then nil
3131 else throw("Strict value is not equal to itself.")
3232 }
3333
3434
3535
3636 @Callable(i)
3737 func proxyLiquidateV3 (market,userAddress,debtAssetIdStr,suppliedAssetIdStr,amount,routeStr) = if ((indexOf(markets, market) == unit))
3838 then throw("given market address is not a market")
3939 else if (!(verifyLiquidatorAccess(i.caller)))
4040 then throw("no permission to perform liquidation")
4141 else {
4242 let marketAddress = addressFromStringValue(market)
43- let rates = {
44- let @ = invoke(marketAddress, "calculateTokenRates", [false], nil)
45- if ($isInstanceOf(@, "String"))
46- then @
47- else throw(($getType(@) + " couldn't be cast to String"))
48- }
49- if ((rates == rates))
50- then {
51- let ratesLi = split(rates, ",")
52- let marketAssets = split(getStringValue(marketAddress, "setup_tokens"), ",")
53- let sAssetNum = valueOrErrorMessage(indexOf(marketAssets, suppliedAssetIdStr), "suppliedAsset not found in market composition")
54- let sRate = parseIntValue(split(ratesLi[sAssetNum], "|")[1])
55- let sAmount = getIntegerValue(marketAddress, ((userAddress + "_supplied_") + suppliedAssetIdStr))
56- let suppliedAmount = fraction(sAmount, sRate, Scale16)
57- let lastLiqForMarketKeyStr = (("history_market_" + market) + "_lastLiquidation")
58- let lastLiquidationKeyStr = (("history_user_" + userAddress) + "_lastLiquidation")
59- let lastLiquidation = valueOrElse(getInteger(this, lastLiquidationKeyStr), 0)
60- if ((amount > fraction(MaxShareToLiquidate, suppliedAmount, 10000)))
61- then throw("should a liquidate smaller part per time")
62- else if (((lastLiquidation + LiquidationDelay) > height))
63- then throw("cannot liquidate yet")
64- else {
65- let inv = invoke(marketAddress, "liquidate", [false, userAddress, amount, suppliedAssetIdStr, debtAssetIdStr, routeStr], nil)
66- if ((inv == inv))
67- then {
68- let liquidatorReward = fraction(amount, LiquidatorReward, 10000)
69- let statsKeyStr = ((("reward_" + toString(i.caller)) + "_") + debtAssetIdStr)
43+ let sRate = getIntegerValue(marketAddress, (suppliedAssetIdStr + "_sRate"))
44+ let sAmount = getIntegerValue(marketAddress, ((userAddress + "_supplied_") + suppliedAssetIdStr))
45+ let suppliedAmount = fraction(sAmount, sRate, Scale16)
46+ let lastLiqForMarketKeyStr = (("history_market_" + market) + "_lastLiquidation")
47+ let lastLiquidationKeyStr = (("history_user_" + userAddress) + "_lastLiquidation")
48+ let lastLiquidation = valueOrElse(getInteger(this, lastLiquidationKeyStr), 0)
49+ if ((amount > fraction(MaxShareToLiquidate, suppliedAmount, 10000)))
50+ then throw("should liquidate smaller part per time")
51+ else if (((lastLiquidation + LiquidationDelay) > height))
52+ then throw("cannot liquidate yet")
53+ else {
54+ let inv = invoke(marketAddress, "liquidate", [false, userAddress, amount, suppliedAssetIdStr, debtAssetIdStr, routeStr], nil)
55+ if ((inv == inv))
56+ then {
57+ let liquidatorReward = fraction(amount, LiquidatorReward, 10000)
58+ let statsKeyStr = ((("reward_" + toString(i.caller)) + "_") + debtAssetIdStr)
7059 [IntegerEntry(statsKeyStr, (valueOrElse(getInteger(this, statsKeyStr), 0) + liquidatorReward)), IntegerEntry(lastLiquidationKeyStr, height), IntegerEntry(lastLiqForMarketKeyStr, height)]
71- }
72- else throw("Strict value is not equal to itself.")
7360 }
74- }
75- else throw("Strict value is not equal to itself.")
61+ else throw("Strict value is not equal to itself.")
62+ }
7663 }
7764
7865
7966
8067 @Callable(i)
8168 func payoutReward (addressStr,assetIdStr) = if ((toString(i.caller) != "3PMcMiMEs6w56NRGacksXtFG5zS7doE9fpL"))
8269 then throw("no access to this method")
8370 else {
8471 let statsKeyStr = ((("reward_" + addressStr) + "_") + assetIdStr)
8572 let rewardAvailable = valueOrElse(getInteger(this, statsKeyStr), 0)
8673 [ScriptTransfer(addressFromStringValue(addressStr), rewardAvailable, getAssetBytes(assetIdStr)), IntegerEntry(statsKeyStr, 0)]
8774 }
8875
8976
9077
9178 @Callable(i)
9279 func updateString (val,key) = if (if ((toString(i.caller) != "3PMcMiMEs6w56NRGacksXtFG5zS7doE9fpL"))
9380 then (toString(i.caller) != "3PHbdpaKzz8EiAngGHaFu2hVuNCdsC67qh3")
9481 else false)
9582 then throw("no access to this method")
9683 else [StringEntry(val, key)]
9784
9885

github/deemru/w8io/3ef1775 
41.14 ms