tx · 75e8D9FqYhE1snaFhbDjaxgcW2XsLB2cuBawHZxcoR6J 3PHbdpaKzz8EiAngGHaFu2hVuNCdsC67qh3: -0.01000000 Waves 2024.01.17 19:50 [4001564] smart account 3PHbdpaKzz8EiAngGHaFu2hVuNCdsC67qh3 > SELF 0.00000000 Waves
{ "type": 13, "id": "75e8D9FqYhE1snaFhbDjaxgcW2XsLB2cuBawHZxcoR6J", "fee": 1000000, "feeAssetId": null, "timestamp": 1705510250873, "version": 2, "chainId": 87, "sender": "3PHbdpaKzz8EiAngGHaFu2hVuNCdsC67qh3", "senderPublicKey": "4XuPpm7Pz97L5yDuLYiKbCSuXvtGjxCPsUBUUzmgokhP", "proofs": [ "53Vi4yLcsPc3hxXNh1deqAnHXLVjGz2Gh5cSfC4Ja5yVd5ebnsFRc3Bz49anjDi6XfpdXLb7UfKobpdKBaCwPuUf" ], "script": "base64:BgIhCAISBwoFCAgICAESCAoGCAgICAEIEgQKAggIEgQKAggICAAGU2NhbGU4AIDC1y8AB1NjYWxlMTYAgICE/qbe4REBDWdldEFzc2V0Qnl0ZXMBCmFzc2V0SWRTdHIDCQAAAgUKYXNzZXRJZFN0cgIFV0FWRVMFBHVuaXQJANkEAQUKYXNzZXRJZFN0cgEWdmVyaWZ5TGlxdWlkYXRvckFjY2VzcwEHYWRkcmVzcwkBAiE9AgkAswkCCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMCEXNldHVwX2xpcXVpZGF0b3JzAgAJAKUIAQUHYWRkcmVzcwUEdW5pdAATTWF4U2hhcmVUb0xpcXVpZGF0ZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzAhlzZXR1cF9tYXhTaGFyZVRvTGlxdWlkYXRlAGQAEExpcXVpZGF0aW9uRGVsYXkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwIWc2V0dXBfbGlxdWlkYXRpb25EZWxheQAKABBMaXF1aWRhdG9yUmV3YXJkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMCFnNldHVwX2xpcXVpZGF0b3JSZXdhcmQACgAHbWFya2V0cwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzAg1zZXR1cF9tYXJrZXRzCQC5CQIJAMwIAgIjM1BIcHVRVVBWVW9SM0FZekZlSnplV0pmWUxzTFRtV3NzVkgFA25pbAIBLAQBaQEQcHJveHlMaXF1aWRhdGVWMgUGbWFya2V0C3VzZXJBZGRyZXNzDmRlYnRBc3NldElkU3RyEnN1cHBsaWVkQXNzZXRJZFN0cgZhbW91bnQDCQAAAgkAswkCBQdtYXJrZXRzBQZtYXJrZXQFBHVuaXQJAAIBAiBnaXZlbiBwb29sIGFkZHJlc3MgaXMgbm90IGEgcG9vbAQDaW52CQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBm1hcmtldAILbGlxdWlkYXRlVjIJAMwIAgcJAMwIAgULdXNlckFkZHJlc3MJAMwIAgUSc3VwcGxpZWRBc3NldElkU3RyBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ1nZXRBc3NldEJ5dGVzAQUOZGVidEFzc2V0SWRTdHIFBmFtb3VudAUDbmlsAwkAAAIFA2ludgUDaW52BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEQcHJveHlMaXF1aWRhdGVWMwYGbWFya2V0C3VzZXJBZGRyZXNzDmRlYnRBc3NldElkU3RyEnN1cHBsaWVkQXNzZXRJZFN0cgZhbW91bnQIcm91dGVTdHIDCQAAAgkAswkCBQdtYXJrZXRzBQZtYXJrZXQFBHVuaXQJAAIBAiRnaXZlbiBtYXJrZXQgYWRkcmVzcyBpcyBub3QgYSBtYXJrZXQDCQEBIQEJARZ2ZXJpZnlMaXF1aWRhdG9yQWNjZXNzAQgFAWkGY2FsbGVyCQACAQIkbm8gcGVybWlzc2lvbiB0byBwZXJmb3JtIGxpcXVpZGF0aW9uBA1tYXJrZXRBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBQZtYXJrZXQEBXJhdGVzCgABQAkA/AcEBQ1tYXJrZXRBZGRyZXNzAhNjYWxjdWxhdGVUb2tlblJhdGVzCQDMCAIHBQNuaWwFA25pbAMJAAECBQFAAgZTdHJpbmcFAUAJAAIBCQCsAgIJAAMBBQFAAhsgY291bGRuJ3QgYmUgY2FzdCB0byBTdHJpbmcDCQAAAgUFcmF0ZXMFBXJhdGVzBAdyYXRlc0xpCQC1CQIFBXJhdGVzAgEsBAxtYXJrZXRBc3NldHMJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUNbWFya2V0QWRkcmVzcwIMc2V0dXBfdG9rZW5zAgEsBAlzQXNzZXROdW0JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQxtYXJrZXRBc3NldHMFEnN1cHBsaWVkQXNzZXRJZFN0cgItc3VwcGxpZWRBc3NldCBub3QgZm91bmQgaW4gbWFya2V0IGNvbXBvc2l0aW9uBAVzUmF0ZQkBDXBhcnNlSW50VmFsdWUBCQCRAwIJALUJAgkAkQMCBQdyYXRlc0xpBQlzQXNzZXROdW0CAXwAAQQHc0Ftb3VudAkBEUBleHRyTmF0aXZlKDEwNTApAgUNbWFya2V0QWRkcmVzcwkArAICCQCsAgIFC3VzZXJBZGRyZXNzAgpfc3VwcGxpZWRfBRJzdXBwbGllZEFzc2V0SWRTdHIEDnN1cHBsaWVkQW1vdW50CQBrAwUHc0Ftb3VudAUFc1JhdGUFB1NjYWxlMTYEFmxhc3RMaXFGb3JNYXJrZXRLZXlTdHIJAKwCAgkArAICAg9oaXN0b3J5X21hcmtldF8FBm1hcmtldAIQX2xhc3RMaXF1aWRhdGlvbgQVbGFzdExpcXVpZGF0aW9uS2V5U3RyCQCsAgIJAKwCAgINaGlzdG9yeV91c2VyXwULdXNlckFkZHJlc3MCEF9sYXN0TGlxdWlkYXRpb24ED2xhc3RMaXF1aWRhdGlvbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRVsYXN0TGlxdWlkYXRpb25LZXlTdHIAAAMJAGYCBQZhbW91bnQJAGsDBRNNYXhTaGFyZVRvTGlxdWlkYXRlBQ5zdXBwbGllZEFtb3VudACQTgkAAgECKHNob3VsZCBhIGxpcXVpZGF0ZSBzbWFsbGVyIHBhcnQgcGVyIHRpbWUDCQBmAgkAZAIFD2xhc3RMaXF1aWRhdGlvbgUQTGlxdWlkYXRpb25EZWxheQUGaGVpZ2h0CQACAQIUY2Fubm90IGxpcXVpZGF0ZSB5ZXQEA2ludgkA/AcEBQ1tYXJrZXRBZGRyZXNzAglsaXF1aWRhdGUJAMwIAgcJAMwIAgULdXNlckFkZHJlc3MJAMwIAgUGYW1vdW50CQDMCAIFEnN1cHBsaWVkQXNzZXRJZFN0cgkAzAgCBQ5kZWJ0QXNzZXRJZFN0cgkAzAgCBQhyb3V0ZVN0cgUDbmlsBQNuaWwDCQAAAgUDaW52BQNpbnYEEGxpcXVpZGF0b3JSZXdhcmQJAGsDBQZhbW91bnQFEExpcXVpZGF0b3JSZXdhcmQAkE4EC3N0YXRzS2V5U3RyCQCsAgIJAKwCAgkArAICAgdyZXdhcmRfCQClCAEIBQFpBmNhbGxlcgIBXwUOZGVidEFzc2V0SWRTdHIJAMwIAgkBDEludGVnZXJFbnRyeQIFC3N0YXRzS2V5U3RyCQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQtzdGF0c0tleVN0cgAABRBsaXF1aWRhdG9yUmV3YXJkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRVsYXN0TGlxdWlkYXRpb25LZXlTdHIFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgUWbGFzdExpcUZvck1hcmtldEtleVN0cgUGaGVpZ2h0BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEMcGF5b3V0UmV3YXJkAgphZGRyZXNzU3RyCmFzc2V0SWRTdHIDCQECIT0CCQClCAEIBQFpBmNhbGxlcgIjM1BNY01pTUVzNnc1Nk5SR2Fja3NYdEZHNXpTN2RvRTlmcEwJAAIBAhhubyBhY2Nlc3MgdG8gdGhpcyBtZXRob2QEC3N0YXRzS2V5U3RyCQCsAgIJAKwCAgkArAICAgdyZXdhcmRfBQphZGRyZXNzU3RyAgFfBQphc3NldElkU3RyBA9yZXdhcmRBdmFpbGFibGUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwULc3RhdHNLZXlTdHIAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQphZGRyZXNzU3RyBQ9yZXdhcmRBdmFpbGFibGUJAQ1nZXRBc3NldEJ5dGVzAQUKYXNzZXRJZFN0cgkAzAgCCQEMSW50ZWdlckVudHJ5AgULc3RhdHNLZXlTdHIAAAUDbmlsAWkBDHVwZGF0ZVN0cmluZwIDdmFsA2tleQMDCQECIT0CCQClCAEIBQFpBmNhbGxlcgIjM1BNY01pTUVzNnc1Nk5SR2Fja3NYdEZHNXpTN2RvRTlmcEwJAQIhPQIJAKUIAQgFAWkGY2FsbGVyAiMzUEhiZHBhS3p6OEVpQW5nR0hhRnUyaFZ1TkNkc0M2N3FoMwcJAAIBAhhubyBhY2Nlc3MgdG8gdGhpcyBtZXRob2QJAMwIAgkBC1N0cmluZ0VudHJ5AgUDdmFsBQNrZXkFA25pbADVYOBI", "height": 4001564, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Dc79tZvQoVTPCQSTbf8nGeKXbf4dyYeLYESSZnv3jTyY Next: Fj5S5vY9nTnFQVwST8XjR95nD918J1SXkcLyxSxfbWuX Diff:
Old | New | Differences | |
---|---|---|---|
57 | 57 | let lastLiqForMarketKeyStr = (("history_market_" + market) + "_lastLiquidation") | |
58 | 58 | let lastLiquidationKeyStr = (("history_user_" + userAddress) + "_lastLiquidation") | |
59 | 59 | let lastLiquidation = valueOrElse(getInteger(this, lastLiquidationKeyStr), 0) | |
60 | - | if (( | |
60 | + | if ((amount > fraction(MaxShareToLiquidate, suppliedAmount, 10000))) | |
61 | 61 | then throw("should a liquidate smaller part per time") | |
62 | 62 | else if (((lastLiquidation + LiquidationDelay) > height)) | |
63 | 63 | then throw("cannot liquidate yet") |
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 | 43 | let rates = { | |
44 | 44 | let @ = invoke(marketAddress, "calculateTokenRates", [false], nil) | |
45 | 45 | if ($isInstanceOf(@, "String")) | |
46 | 46 | then @ | |
47 | 47 | else throw(($getType(@) + " couldn't be cast to String")) | |
48 | 48 | } | |
49 | 49 | if ((rates == rates)) | |
50 | 50 | then { | |
51 | 51 | let ratesLi = split(rates, ",") | |
52 | 52 | let marketAssets = split(getStringValue(marketAddress, "setup_tokens"), ",") | |
53 | 53 | let sAssetNum = valueOrErrorMessage(indexOf(marketAssets, suppliedAssetIdStr), "suppliedAsset not found in market composition") | |
54 | 54 | let sRate = parseIntValue(split(ratesLi[sAssetNum], "|")[1]) | |
55 | 55 | let sAmount = getIntegerValue(marketAddress, ((userAddress + "_supplied_") + suppliedAssetIdStr)) | |
56 | 56 | let suppliedAmount = fraction(sAmount, sRate, Scale16) | |
57 | 57 | let lastLiqForMarketKeyStr = (("history_market_" + market) + "_lastLiquidation") | |
58 | 58 | let lastLiquidationKeyStr = (("history_user_" + userAddress) + "_lastLiquidation") | |
59 | 59 | let lastLiquidation = valueOrElse(getInteger(this, lastLiquidationKeyStr), 0) | |
60 | - | if (( | |
60 | + | if ((amount > fraction(MaxShareToLiquidate, suppliedAmount, 10000))) | |
61 | 61 | then throw("should a liquidate smaller part per time") | |
62 | 62 | else if (((lastLiquidation + LiquidationDelay) > height)) | |
63 | 63 | then throw("cannot liquidate yet") | |
64 | 64 | else { | |
65 | 65 | let inv = invoke(marketAddress, "liquidate", [false, userAddress, amount, suppliedAssetIdStr, debtAssetIdStr, routeStr], nil) | |
66 | 66 | if ((inv == inv)) | |
67 | 67 | then { | |
68 | 68 | let liquidatorReward = fraction(amount, LiquidatorReward, 10000) | |
69 | 69 | let statsKeyStr = ((("reward_" + toString(i.caller)) + "_") + debtAssetIdStr) | |
70 | 70 | [IntegerEntry(statsKeyStr, (valueOrElse(getInteger(this, statsKeyStr), 0) + liquidatorReward)), IntegerEntry(lastLiquidationKeyStr, height), IntegerEntry(lastLiqForMarketKeyStr, height)] | |
71 | 71 | } | |
72 | 72 | else throw("Strict value is not equal to itself.") | |
73 | 73 | } | |
74 | 74 | } | |
75 | 75 | else throw("Strict value is not equal to itself.") | |
76 | 76 | } | |
77 | 77 | ||
78 | 78 | ||
79 | 79 | ||
80 | 80 | @Callable(i) | |
81 | 81 | func payoutReward (addressStr,assetIdStr) = if ((toString(i.caller) != "3PMcMiMEs6w56NRGacksXtFG5zS7doE9fpL")) | |
82 | 82 | then throw("no access to this method") | |
83 | 83 | else { | |
84 | 84 | let statsKeyStr = ((("reward_" + addressStr) + "_") + assetIdStr) | |
85 | 85 | let rewardAvailable = valueOrElse(getInteger(this, statsKeyStr), 0) | |
86 | 86 | [ScriptTransfer(addressFromStringValue(addressStr), rewardAvailable, getAssetBytes(assetIdStr)), IntegerEntry(statsKeyStr, 0)] | |
87 | 87 | } | |
88 | 88 | ||
89 | 89 | ||
90 | 90 | ||
91 | 91 | @Callable(i) | |
92 | 92 | func updateString (val,key) = if (if ((toString(i.caller) != "3PMcMiMEs6w56NRGacksXtFG5zS7doE9fpL")) | |
93 | 93 | then (toString(i.caller) != "3PHbdpaKzz8EiAngGHaFu2hVuNCdsC67qh3") | |
94 | 94 | else false) | |
95 | 95 | then throw("no access to this method") | |
96 | 96 | else [StringEntry(val, key)] | |
97 | 97 | ||
98 | 98 |
github/deemru/w8io/0e76f2f 33.56 ms ◑