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:
Old | New | Differences | |
---|---|---|---|
40 | 40 | then throw("no permission to perform liquidation") | |
41 | 41 | else { | |
42 | 42 | 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) | |
70 | 59 | [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.") | |
73 | 60 | } | |
74 | - | | |
75 | - | | |
61 | + | else throw("Strict value is not equal to itself.") | |
62 | + | } | |
76 | 63 | } | |
77 | 64 | ||
78 | 65 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let Scale8 = 100000000 | |
5 | 5 | ||
6 | 6 | let Scale16 = 10000000000000000 | |
7 | 7 | ||
8 | 8 | func getAssetBytes (assetIdStr) = if ((assetIdStr == "WAVES")) | |
9 | 9 | then unit | |
10 | 10 | else fromBase58String(assetIdStr) | |
11 | 11 | ||
12 | 12 | ||
13 | 13 | func verifyLiquidatorAccess (address) = (indexOf(valueOrElse(getString(this, "setup_liquidators"), ""), toString(address)) != unit) | |
14 | 14 | ||
15 | 15 | ||
16 | 16 | let MaxShareToLiquidate = valueOrElse(getInteger(this, "setup_maxShareToLiquidate"), 100) | |
17 | 17 | ||
18 | 18 | let LiquidationDelay = valueOrElse(getInteger(this, "setup_liquidationDelay"), 10) | |
19 | 19 | ||
20 | 20 | let LiquidatorReward = valueOrElse(getInteger(this, "setup_liquidatorReward"), 10) | |
21 | 21 | ||
22 | 22 | let markets = valueOrElse(getString(this, "setup_markets"), makeString(["3PHpuQUPVUoR3AYzFeJzeWJfYLsLTmWssVH"], ",")) | |
23 | 23 | ||
24 | 24 | @Callable(i) | |
25 | 25 | func proxyLiquidateV2 (market,userAddress,debtAssetIdStr,suppliedAssetIdStr,amount) = if ((indexOf(markets, market) == unit)) | |
26 | 26 | then throw("given pool address is not a pool") | |
27 | 27 | else { | |
28 | 28 | let inv = invoke(addressFromStringValue(market), "liquidateV2", [false, userAddress, suppliedAssetIdStr], [AttachedPayment(getAssetBytes(debtAssetIdStr), amount)]) | |
29 | 29 | if ((inv == inv)) | |
30 | 30 | then nil | |
31 | 31 | else throw("Strict value is not equal to itself.") | |
32 | 32 | } | |
33 | 33 | ||
34 | 34 | ||
35 | 35 | ||
36 | 36 | @Callable(i) | |
37 | 37 | func proxyLiquidateV3 (market,userAddress,debtAssetIdStr,suppliedAssetIdStr,amount,routeStr) = if ((indexOf(markets, market) == unit)) | |
38 | 38 | then throw("given market address is not a market") | |
39 | 39 | else if (!(verifyLiquidatorAccess(i.caller))) | |
40 | 40 | then throw("no permission to perform liquidation") | |
41 | 41 | else { | |
42 | 42 | 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) | |
70 | 59 | [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.") | |
73 | 60 | } | |
74 | - | | |
75 | - | | |
61 | + | else throw("Strict value is not equal to itself.") | |
62 | + | } | |
76 | 63 | } | |
77 | 64 | ||
78 | 65 | ||
79 | 66 | ||
80 | 67 | @Callable(i) | |
81 | 68 | func payoutReward (addressStr,assetIdStr) = if ((toString(i.caller) != "3PMcMiMEs6w56NRGacksXtFG5zS7doE9fpL")) | |
82 | 69 | then throw("no access to this method") | |
83 | 70 | else { | |
84 | 71 | let statsKeyStr = ((("reward_" + addressStr) + "_") + assetIdStr) | |
85 | 72 | let rewardAvailable = valueOrElse(getInteger(this, statsKeyStr), 0) | |
86 | 73 | [ScriptTransfer(addressFromStringValue(addressStr), rewardAvailable, getAssetBytes(assetIdStr)), IntegerEntry(statsKeyStr, 0)] | |
87 | 74 | } | |
88 | 75 | ||
89 | 76 | ||
90 | 77 | ||
91 | 78 | @Callable(i) | |
92 | 79 | func updateString (val,key) = if (if ((toString(i.caller) != "3PMcMiMEs6w56NRGacksXtFG5zS7doE9fpL")) | |
93 | 80 | then (toString(i.caller) != "3PHbdpaKzz8EiAngGHaFu2hVuNCdsC67qh3") | |
94 | 81 | else false) | |
95 | 82 | then throw("no access to this method") | |
96 | 83 | else [StringEntry(val, key)] | |
97 | 84 | ||
98 | 85 |
github/deemru/w8io/3ef1775 41.14 ms ◑