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:
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | - | let pools = ["3P4uA5etnZi4AmBabKinq2bMiWU8KcnHZdH"] | |
4 | + | let Scale8 = 100000000 | |
5 | + | ||
6 | + | let Scale16 = 10000000000000000 | |
5 | 7 | ||
6 | 8 | func getAssetBytes (assetIdStr) = if ((assetIdStr == "WAVES")) | |
7 | 9 | then unit | |
8 | 10 | else fromBase58String(assetIdStr) | |
9 | 11 | ||
10 | 12 | ||
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 | + | ||
11 | 24 | @Callable(i) | |
12 | - | func proxyLiquidateV2 ( | |
25 | + | func proxyLiquidateV2 (market,userAddress,debtAssetIdStr,suppliedAssetIdStr,amount) = if ((indexOf(markets, market) == unit)) | |
13 | 26 | then throw("given pool address is not a pool") | |
14 | 27 | else { | |
15 | - | let inv = invoke(addressFromStringValue( | |
28 | + | let inv = invoke(addressFromStringValue(market), "liquidateV2", [false, userAddress, suppliedAssetIdStr], [AttachedPayment(getAssetBytes(debtAssetIdStr), amount)]) | |
16 | 29 | if ((inv == inv)) | |
17 | 30 | then nil | |
18 | 31 | else throw("Strict value is not equal to itself.") | |
19 | 32 | } | |
20 | 33 | ||
21 | 34 | ||
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 ◑