tx · DZPmtE6cH18nti7LYb6BM8VGvLRQbrSTZynamHXep1kH

3PHbdpaKzz8EiAngGHaFu2hVuNCdsC67qh3:  -0.02600000 Waves

2024.02.08 13:17 [4032922] smart account 3PHbdpaKzz8EiAngGHaFu2hVuNCdsC67qh3 > SELF 0.00000000 Waves

{ "type": 13, "id": "DZPmtE6cH18nti7LYb6BM8VGvLRQbrSTZynamHXep1kH", "fee": 2600000, "feeAssetId": null, "timestamp": 1707387431548, "version": 2, "chainId": 87, "sender": "3PHbdpaKzz8EiAngGHaFu2hVuNCdsC67qh3", "senderPublicKey": "4XuPpm7Pz97L5yDuLYiKbCSuXvtGjxCPsUBUUzmgokhP", "proofs": [ "43D12iLTzP9FVPwEypUbBABjPxqaHFEoy9XACSjESPFnZVXmPUjhPfHwvB7C6twpYGxwrai2UPfpoLVp17yS1PBQ" ], "script": "base64:BgIuCAISBwoFCAgICAESCAoGCAgICAEIEgQKAggIEgQKAggIEgQKAggBEgUKAwQICAwAB1ZFUlNJT04CC1BMTGlxLTEuMC4yAAZTY2FsZTgAgMLXLwAHU2NhbGUxNgCAgIT+pt7hEQENZ2V0QXNzZXRCeXRlcwEKYXNzZXRJZFN0cgMJAAACBQphc3NldElkU3RyAgVXQVZFUwUEdW5pdAkA2QQBBQphc3NldElkU3RyARZ2ZXJpZnlMaXF1aWRhdG9yQWNjZXNzAQdhZGRyZXNzCQECIT0CCQCzCQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwIRc2V0dXBfbGlxdWlkYXRvcnMCAAkApQgBBQdhZGRyZXNzBQR1bml0ABNNYXhTaGFyZVRvTGlxdWlkYXRlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMCGXNldHVwX21heFNoYXJlVG9MaXF1aWRhdGUAZAAQTGlxdWlkYXRpb25EZWxheQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzAhZzZXR1cF9saXF1aWRhdGlvbkRlbGF5AAoAEExpcXVpZGF0b3JSZXdhcmQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwIWc2V0dXBfbGlxdWlkYXRvclJld2FyZAAKABFCYWREZWJ0TGlxQWxsb3dlZAkAZgIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwIXc2V0dXBfYmFkRGVidExpcUFsbG93ZWQAAAAAAA1PcmFjbGVBZGRyZXNzCQELdmFsdWVPckVsc2UCCQCmCAEJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwIUc2V0dXBfYWRkcmVzc19vcmFjbGUCAAkBB0FkZHJlc3MBARoBV0lm0MvzivVXeq38IW9xxVuJiCvQgbOxfwAHbWFya2V0cwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzAg1zZXR1cF9tYXJrZXRzCQC5CQIJAMwIAgIjM1BIcHVRVVBWVW9SM0FZekZlSnplV0pmWUxzTFRtV3NzVkgFA25pbAIBLAEWZ2V0VXNlckJhbGFuY2VJTlRFUk5BTAMGbWFya2V0B2FkZHJlc3MNbWludXNCb3Jyb3dlZAoBDHRyeUdldFN0cmluZwEDa2V5BAckbWF0Y2gwCQCdCAIFBm1hcmtldAUDa2V5AwkAAQIFByRtYXRjaDACBlN0cmluZwQBYgUHJG1hdGNoMAUBYgIACgENdHJ5R2V0SW50ZWdlcgEDa2V5BAckbWF0Y2gwCQCaCAIFBm1hcmtldAUDa2V5AwkAAQIFByRtYXRjaDACA0ludAQBYgUHJG1hdGNoMAUBYgAACgENZ2V0VG9rZW5QcmljZQEKYXNzZXRJZFN0cgMDAwkAAAIFCmFzc2V0SWRTdHICLEFQNENiNXhMWUdINlppZ0hyZUNaSG9YcFFUV0RrUHNHMkJIcWZEVXg2dGFKBgkAAAIFCmFzc2V0SWRTdHICLDl3YzNMWE5BNFRFQnNYeUt0b0xFOW1yYkREN1dNSFh2WHJDalp2YWJMQXNpBgkAAAIFCmFzc2V0SWRTdHICLEhHZ2FiVHFVUzhXdFZGVUp6Zm1yVERNZ0VjY0p1WkxCUGhGZ1FGeHZuc29XCQCUCgIAwIQ9AMCEPQQFcHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFDU9yYWNsZUFkZHJlc3MJAKwCAgUKYXNzZXRJZFN0cgIHX3R3YXA1QgkAlAoCBQVwcmljZQUFcHJpY2UKAQ5jYWxjQXNzZXRTY2FsZQEKYXNzZXRJZFN0cgQIZGVjaW1hbHMDCQAAAgUKYXNzZXRJZFN0cgIFV0FWRVMACAgJAQV2YWx1ZQEJAOwHAQkA2QQBBQphc3NldElkU3RyCGRlY2ltYWxzCQBsBgAKAAAFCGRlY2ltYWxzAAAAAAUERE9XTgQGYXNzZXRzCQC1CQIJAQx0cnlHZXRTdHJpbmcBAgxzZXR1cF90b2tlbnMCASwEBGx0dnMJALUJAgkBDHRyeUdldFN0cmluZwECCnNldHVwX2x0dnMCASwEA2x0cwkAtQkCCQEMdHJ5R2V0U3RyaW5nAQIJc2V0dXBfbHRzAgEsCgEBZgIFYWNjdW0EbmV4dAMJAGcCBQRuZXh0CQCQAwEFBmFzc2V0cwUFYWNjdW0EDHVzZXJTdXBwbGllZAkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgUHYWRkcmVzcwIKX3N1cHBsaWVkXwkAkQMCBQZhc3NldHMFBG5leHQEDHVzZXJCb3Jyb3dlZAkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgUHYWRkcmVzcwIKX2JvcnJvd2VkXwkAkQMCBQZhc3NldHMFBG5leHQEE25lZWRUb2tlbkFjY291bnRpbmcDAwkBAiE9AgUMdXNlckJvcnJvd2VkAAAGCQECIT0CBQx1c2VyU3VwcGxpZWQAAAYHAwUTbmVlZFRva2VuQWNjb3VudGluZwQKYXNzZXRTY2FsZQkBDmNhbGNBc3NldFNjYWxlAQkAkQMCBQZhc3NldHMFBG5leHQECmFzc2V0UHJpY2UJAQ1nZXRUb2tlblByaWNlAQkAkQMCBQZhc3NldHMFBG5leHQJAGUCCQBkAgUFYWNjdW0JAGsDCQBrAwUMdXNlclN1cHBsaWVkCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkAkQMCBQZhc3NldHMFBG5leHQCBl9zUmF0ZQUHU2NhbGUxNggFCmFzc2V0UHJpY2UCXzEFCmFzc2V0U2NhbGUDBQ1taW51c0JvcnJvd2VkCQBrAwkAawMFDHVzZXJCb3Jyb3dlZAkBDXRyeUdldEludGVnZXIBCQCsAgIJAJEDAgUGYXNzZXRzBQRuZXh0AgZfYlJhdGUFB1NjYWxlMTYIBQphc3NldFByaWNlAl8xBQphc3NldFNjYWxlAAAFBWFjY3VtBAZyZXN1bHQKAAIkbAkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQkAzAgCAAYJAMwIAgAHCQDMCAIACAkAzAgCAAkJAMwIAgAKCQDMCAIACwUDbmlsCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQFmAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAUGcmVzdWx0BgFpARBwcm94eUxpcXVpZGF0ZVYyBQZtYXJrZXQLdXNlckFkZHJlc3MOZGVidEFzc2V0SWRTdHISc3VwcGxpZWRBc3NldElkU3RyBmFtb3VudAMJAAACCQCzCQIFB21hcmtldHMFBm1hcmtldAUEdW5pdAkAAgECIGdpdmVuIHBvb2wgYWRkcmVzcyBpcyBub3QgYSBwb29sAwkBASEBCQEWdmVyaWZ5TGlxdWlkYXRvckFjY2VzcwEIBQFpBmNhbGxlcgkAAgECJG5vIHBlcm1pc3Npb24gdG8gcGVyZm9ybSBsaXF1aWRhdGlvbgQDaW52CQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBm1hcmtldAILbGlxdWlkYXRlVjIJAMwIAgcJAMwIAgULdXNlckFkZHJlc3MJAMwIAgUSc3VwcGxpZWRBc3NldElkU3RyBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQ1nZXRBc3NldEJ5dGVzAQUOZGVidEFzc2V0SWRTdHIFBmFtb3VudAUDbmlsAwkAAAIFA2ludgUDaW52BBJ1c2VyQm9ycm93ZWRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgkBEUBleHRyTmF0aXZlKDEwNjIpAQUGbWFya2V0CQCsAgIJAKwCAgULdXNlckFkZHJlc3MCCl9ib3Jyb3dlZF8FDmRlYnRBc3NldElkU3RyAAADCQBmAgAABRJ1c2VyQm9ycm93ZWRBbW91bnQJAAIBAi90cmFuc2FjdGlvbiBsZWFkcyB0byBhIG5lZ2F0aXZlIGJvcnJvd2VkIGFtb3VudAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEHByb3h5TGlxdWlkYXRlVjMGBm1hcmtldAt1c2VyQWRkcmVzcw5kZWJ0QXNzZXRJZFN0chJzdXBwbGllZEFzc2V0SWRTdHIGYW1vdW50CHJvdXRlU3RyAwkAAAIJALMJAgUHbWFya2V0cwUGbWFya2V0BQR1bml0CQACAQIkZ2l2ZW4gbWFya2V0IGFkZHJlc3MgaXMgbm90IGEgbWFya2V0AwkBASEBCQEWdmVyaWZ5TGlxdWlkYXRvckFjY2VzcwEIBQFpBmNhbGxlcgkAAgECJG5vIHBlcm1pc3Npb24gdG8gcGVyZm9ybSBsaXF1aWRhdGlvbgQNbWFya2V0QWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQUGbWFya2V0BAVzUmF0ZQkBEUBleHRyTmF0aXZlKDEwNTApAgUNbWFya2V0QWRkcmVzcwkArAICBRJzdXBwbGllZEFzc2V0SWRTdHICBl9zUmF0ZQQHc0Ftb3VudAkBEUBleHRyTmF0aXZlKDEwNTApAgUNbWFya2V0QWRkcmVzcwkArAICCQCsAgIFC3VzZXJBZGRyZXNzAgpfc3VwcGxpZWRfBRJzdXBwbGllZEFzc2V0SWRTdHIEDnN1cHBsaWVkQW1vdW50CQBrAwUHc0Ftb3VudAUFc1JhdGUFB1NjYWxlMTYEFmxhc3RMaXFGb3JNYXJrZXRLZXlTdHIJAKwCAgkArAICAg9oaXN0b3J5X21hcmtldF8FBm1hcmtldAIQX2xhc3RMaXF1aWRhdGlvbgQVbGFzdExpcXVpZGF0aW9uS2V5U3RyCQCsAgIJAKwCAgINaGlzdG9yeV91c2VyXwULdXNlckFkZHJlc3MCEF9sYXN0TGlxdWlkYXRpb24ED2xhc3RMaXF1aWRhdGlvbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRVsYXN0TGlxdWlkYXRpb25LZXlTdHIAAAMJAGYCBQZhbW91bnQJAGsDBRNNYXhTaGFyZVRvTGlxdWlkYXRlBQ5zdXBwbGllZEFtb3VudACQTgkAAgECJnNob3VsZCBsaXF1aWRhdGUgc21hbGxlciBwYXJ0IHBlciB0aW1lAwkAZgIJAGQCBQ9sYXN0TGlxdWlkYXRpb24FEExpcXVpZGF0aW9uRGVsYXkFBmhlaWdodAkAAgECFGNhbm5vdCBsaXF1aWRhdGUgeWV0BANpbnYJAPwHBAUNbWFya2V0QWRkcmVzcwIJbGlxdWlkYXRlCQDMCAIHCQDMCAIFC3VzZXJBZGRyZXNzCQDMCAIFBmFtb3VudAkAzAgCBRJzdXBwbGllZEFzc2V0SWRTdHIJAMwIAgUOZGVidEFzc2V0SWRTdHIJAMwIAgUIcm91dGVTdHIFA25pbAUDbmlsAwkAAAIFA2ludgUDaW52BBJ1c2VyQm9ycm93ZWRBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUNbWFya2V0QWRkcmVzcwkArAICCQCsAgIFC3VzZXJBZGRyZXNzAgpfYm9ycm93ZWRfBQ5kZWJ0QXNzZXRJZFN0cgAABA51c2VyVXNkQmFsYW5jZQkBFmdldFVzZXJCYWxhbmNlSU5URVJOQUwDBQ1tYXJrZXRBZGRyZXNzBQt1c2VyQWRkcmVzcwYDCQBmAgAABRJ1c2VyQm9ycm93ZWRBbW91bnQJAAIBAi90cmFuc2FjdGlvbiBsZWFkcyB0byBhIG5lZ2F0aXZlIGJvcnJvd2VkIGFtb3VudAMDCQEBIQEFEUJhZERlYnRMaXFBbGxvd2VkCQBnAgAABQ51c2VyVXNkQmFsYW5jZQcJAAIBAh90cmFuc2FjdGlvbiBsZWFkcyB0byBhIGJhZCBkZWJ0BBBsaXF1aWRhdG9yUmV3YXJkCQBrAwUGYW1vdW50BRBMaXF1aWRhdG9yUmV3YXJkAJBOBAtzdGF0c0tleVN0cgkArAICCQCsAgIJAKwCAgIHcmV3YXJkXwkApQgBCAUBaQZjYWxsZXICAV8FEnN1cHBsaWVkQXNzZXRJZFN0cgkAzAgCCQEMSW50ZWdlckVudHJ5AgULc3RhdHNLZXlTdHIJAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFC3N0YXRzS2V5U3RyAAAFEGxpcXVpZGF0b3JSZXdhcmQJAMwIAgkBDEludGVnZXJFbnRyeQIFFWxhc3RMaXF1aWRhdGlvbktleVN0cgUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRZsYXN0TGlxRm9yTWFya2V0S2V5U3RyBQZoZWlnaHQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQxwYXlvdXRSZXdhcmQCCmFkZHJlc3NTdHIKYXNzZXRJZFN0cgMJAQIhPQIJAKUIAQgFAWkGY2FsbGVyAiMzUE1jTWlNRXM2dzU2TlJHYWNrc1h0Rkc1elM3ZG9FOWZwTAkAAgECGG5vIGFjY2VzcyB0byB0aGlzIG1ldGhvZAQLc3RhdHNLZXlTdHIJAKwCAgkArAICCQCsAgICB3Jld2FyZF8FCmFkZHJlc3NTdHICAV8FCmFzc2V0SWRTdHIED3Jld2FyZEF2YWlsYWJsZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQtzdGF0c0tleVN0cgAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCmFkZHJlc3NTdHIFD3Jld2FyZEF2YWlsYWJsZQkBDWdldEFzc2V0Qnl0ZXMBBQphc3NldElkU3RyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQtzdGF0c0tleVN0cgAABQNuaWwBaQEMdXBkYXRlU3RyaW5nAgNrZXkDdmFsAwMJAQIhPQIJAKUIAQgFAWkGY2FsbGVyAiMzUE1jTWlNRXM2dzU2TlJHYWNrc1h0Rkc1elM3ZG9FOWZwTAkBAiE9AgkApQgBCAUBaQZjYWxsZXICIzNQSGJkcGFLeno4RWlBbmdHSGFGdTJoVnVOQ2RzQzY3cWgzBwkAAgECGG5vIGFjY2VzcyB0byB0aGlzIG1ldGhvZAkAzAgCCQELU3RyaW5nRW50cnkCBQNrZXkFA3ZhbAUDbmlsAWkBDXVwZGF0ZUludGVnZXICA2tleQN2YWwDAwkBAiE9AgkApQgBCAUBaQZjYWxsZXICIzNQTWNNaU1FczZ3NTZOUkdhY2tzWHRGRzV6Uzdkb0U5ZnBMCQECIT0CCQClCAEIBQFpBmNhbGxlcgIjM1BIYmRwYUt6ejhFaUFuZ0dIYUZ1MmhWdU5DZHNDNjdxaDMHCQACAQIYbm8gYWNjZXNzIHRvIHRoaXMgbWV0aG9kCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQNrZXkFA3ZhbAUDbmlsAWkBFmdldFVzZXJCYWxhbmNlUkVBRE9OTFkDBWRlYnVnCW1hcmtldFN0cgdhZGRyZXNzBANyZXMJARZnZXRVc2VyQmFsYW5jZUlOVEVSTkFMAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUJbWFya2V0U3RyBQdhZGRyZXNzBgMJAAACBQVkZWJ1ZwYJAAIBCQCkAwEFA3JlcwkAlAoCBQNuaWwFA3JlcwBwhriW", "height": 4032922, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: tJfYezoWRQHALRdTQT13jZTRZwirE2SgxdFSXsKPgoR Next: none Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let VERSION = "PLLiq-1.0.1"
4+let VERSION = "PLLiq-1.0.2"
55
66 let Scale8 = 100000000
77
2525
2626 let OracleAddress = valueOrElse(addressFromString(valueOrElse(getString(this, "setup_address_oracle"), "")), Address(base58'3P8d1E1BLKoD52y3bQJ1bDTd2TD1gpaLn9t'))
2727
28-let markets = valueOrElse(getString(this, "setup_markets"), makeString(["3P4uA5etnZi4AmBabKinq2bMiWU8KcnHZdH", "3PHpuQUPVUoR3AYzFeJzeWJfYLsLTmWssVH"], ","))
28+let markets = valueOrElse(getString(this, "setup_markets"), makeString(["3PHpuQUPVUoR3AYzFeJzeWJfYLsLTmWssVH"], ","))
2929
3030 func getUserBalanceINTERNAL (market,address,minusBorrowed) = {
3131 func tryGetString (key) = match getString(market, key) {
105105 @Callable(i)
106106 func proxyLiquidateV2 (market,userAddress,debtAssetIdStr,suppliedAssetIdStr,amount) = if ((indexOf(markets, market) == unit))
107107 then throw("given pool address is not a pool")
108- else {
109- let inv = invoke(addressFromStringValue(market), "liquidateV2", [false, userAddress, suppliedAssetIdStr], [AttachedPayment(getAssetBytes(debtAssetIdStr), amount)])
110- if ((inv == inv))
111- then nil
112- else throw("Strict value is not equal to itself.")
113- }
108+ else if (!(verifyLiquidatorAccess(i.caller)))
109+ then throw("no permission to perform liquidation")
110+ else {
111+ let inv = invoke(addressFromStringValue(market), "liquidateV2", [false, userAddress, suppliedAssetIdStr], [AttachedPayment(getAssetBytes(debtAssetIdStr), amount)])
112+ if ((inv == inv))
113+ then {
114+ let userBorrowedAmount = valueOrElse(getInteger(addressFromStringValue(market), ((userAddress + "_borrowed_") + debtAssetIdStr)), 0)
115+ if ((0 > userBorrowedAmount))
116+ then throw("transaction leads to a negative borrowed amount")
117+ else nil
118+ }
119+ else throw("Strict value is not equal to itself.")
120+ }
114121
115122
116123
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let VERSION = "PLLiq-1.0.1"
4+let VERSION = "PLLiq-1.0.2"
55
66 let Scale8 = 100000000
77
88 let Scale16 = 10000000000000000
99
1010 func getAssetBytes (assetIdStr) = if ((assetIdStr == "WAVES"))
1111 then unit
1212 else fromBase58String(assetIdStr)
1313
1414
1515 func verifyLiquidatorAccess (address) = (indexOf(valueOrElse(getString(this, "setup_liquidators"), ""), toString(address)) != unit)
1616
1717
1818 let MaxShareToLiquidate = valueOrElse(getInteger(this, "setup_maxShareToLiquidate"), 100)
1919
2020 let LiquidationDelay = valueOrElse(getInteger(this, "setup_liquidationDelay"), 10)
2121
2222 let LiquidatorReward = valueOrElse(getInteger(this, "setup_liquidatorReward"), 10)
2323
2424 let BadDebtLiqAllowed = (valueOrElse(getInteger(this, "setup_badDebtLiqAllowed"), 0) > 0)
2525
2626 let OracleAddress = valueOrElse(addressFromString(valueOrElse(getString(this, "setup_address_oracle"), "")), Address(base58'3P8d1E1BLKoD52y3bQJ1bDTd2TD1gpaLn9t'))
2727
28-let markets = valueOrElse(getString(this, "setup_markets"), makeString(["3P4uA5etnZi4AmBabKinq2bMiWU8KcnHZdH", "3PHpuQUPVUoR3AYzFeJzeWJfYLsLTmWssVH"], ","))
28+let markets = valueOrElse(getString(this, "setup_markets"), makeString(["3PHpuQUPVUoR3AYzFeJzeWJfYLsLTmWssVH"], ","))
2929
3030 func getUserBalanceINTERNAL (market,address,minusBorrowed) = {
3131 func tryGetString (key) = match getString(market, key) {
3232 case b: String =>
3333 b
3434 case _ =>
3535 ""
3636 }
3737
3838 func tryGetInteger (key) = match getInteger(market, key) {
3939 case b: Int =>
4040 b
4141 case _ =>
4242 0
4343 }
4444
4545 func getTokenPrice (assetIdStr) = if (if (if ((assetIdStr == "AP4Cb5xLYGH6ZigHreCZHoXpQTWDkPsG2BHqfDUx6taJ"))
4646 then true
4747 else (assetIdStr == "9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi"))
4848 then true
4949 else (assetIdStr == "HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW"))
5050 then $Tuple2(1000000, 1000000)
5151 else {
5252 let price = getIntegerValue(OracleAddress, (assetIdStr + "_twap5B"))
5353 $Tuple2(price, price)
5454 }
5555
5656 func calcAssetScale (assetIdStr) = {
5757 let decimals = if ((assetIdStr == "WAVES"))
5858 then 8
5959 else value(assetInfo(fromBase58String(assetIdStr))).decimals
6060 pow(10, 0, decimals, 0, 0, DOWN)
6161 }
6262
6363 let assets = split(tryGetString("setup_tokens"), ",")
6464 let ltvs = split(tryGetString("setup_ltvs"), ",")
6565 let lts = split(tryGetString("setup_lts"), ",")
6666 func f (accum,next) = if ((next >= size(assets)))
6767 then accum
6868 else {
6969 let userSupplied = tryGetInteger(((address + "_supplied_") + assets[next]))
7070 let userBorrowed = tryGetInteger(((address + "_borrowed_") + assets[next]))
7171 let needTokenAccounting = if (if ((userBorrowed != 0))
7272 then true
7373 else (userSupplied != 0))
7474 then true
7575 else false
7676 if (needTokenAccounting)
7777 then {
7878 let assetScale = calcAssetScale(assets[next])
7979 let assetPrice = getTokenPrice(assets[next])
8080 ((accum + fraction(fraction(userSupplied, tryGetInteger((assets[next] + "_sRate")), Scale16), assetPrice._1, assetScale)) - (if (minusBorrowed)
8181 then fraction(fraction(userBorrowed, tryGetInteger((assets[next] + "_bRate")), Scale16), assetPrice._1, assetScale)
8282 else 0))
8383 }
8484 else accum
8585 }
8686
8787 let result = {
8888 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
8989 let $s = size($l)
9090 let $acc0 = 0
9191 func $f0_1 ($a,$i) = if (($i >= $s))
9292 then $a
9393 else f($a, $l[$i])
9494
9595 func $f0_2 ($a,$i) = if (($i >= $s))
9696 then $a
9797 else throw("List size exceeds 12")
9898
9999 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
100100 }
101101 result
102102 }
103103
104104
105105 @Callable(i)
106106 func proxyLiquidateV2 (market,userAddress,debtAssetIdStr,suppliedAssetIdStr,amount) = if ((indexOf(markets, market) == unit))
107107 then throw("given pool address is not a pool")
108- else {
109- let inv = invoke(addressFromStringValue(market), "liquidateV2", [false, userAddress, suppliedAssetIdStr], [AttachedPayment(getAssetBytes(debtAssetIdStr), amount)])
110- if ((inv == inv))
111- then nil
112- else throw("Strict value is not equal to itself.")
113- }
108+ else if (!(verifyLiquidatorAccess(i.caller)))
109+ then throw("no permission to perform liquidation")
110+ else {
111+ let inv = invoke(addressFromStringValue(market), "liquidateV2", [false, userAddress, suppliedAssetIdStr], [AttachedPayment(getAssetBytes(debtAssetIdStr), amount)])
112+ if ((inv == inv))
113+ then {
114+ let userBorrowedAmount = valueOrElse(getInteger(addressFromStringValue(market), ((userAddress + "_borrowed_") + debtAssetIdStr)), 0)
115+ if ((0 > userBorrowedAmount))
116+ then throw("transaction leads to a negative borrowed amount")
117+ else nil
118+ }
119+ else throw("Strict value is not equal to itself.")
120+ }
114121
115122
116123
117124 @Callable(i)
118125 func proxyLiquidateV3 (market,userAddress,debtAssetIdStr,suppliedAssetIdStr,amount,routeStr) = if ((indexOf(markets, market) == unit))
119126 then throw("given market address is not a market")
120127 else if (!(verifyLiquidatorAccess(i.caller)))
121128 then throw("no permission to perform liquidation")
122129 else {
123130 let marketAddress = addressFromStringValue(market)
124131 let sRate = getIntegerValue(marketAddress, (suppliedAssetIdStr + "_sRate"))
125132 let sAmount = getIntegerValue(marketAddress, ((userAddress + "_supplied_") + suppliedAssetIdStr))
126133 let suppliedAmount = fraction(sAmount, sRate, Scale16)
127134 let lastLiqForMarketKeyStr = (("history_market_" + market) + "_lastLiquidation")
128135 let lastLiquidationKeyStr = (("history_user_" + userAddress) + "_lastLiquidation")
129136 let lastLiquidation = valueOrElse(getInteger(this, lastLiquidationKeyStr), 0)
130137 if ((amount > fraction(MaxShareToLiquidate, suppliedAmount, 10000)))
131138 then throw("should liquidate smaller part per time")
132139 else if (((lastLiquidation + LiquidationDelay) > height))
133140 then throw("cannot liquidate yet")
134141 else {
135142 let inv = invoke(marketAddress, "liquidate", [false, userAddress, amount, suppliedAssetIdStr, debtAssetIdStr, routeStr], nil)
136143 if ((inv == inv))
137144 then {
138145 let userBorrowedAmount = valueOrElse(getInteger(marketAddress, ((userAddress + "_borrowed_") + debtAssetIdStr)), 0)
139146 let userUsdBalance = getUserBalanceINTERNAL(marketAddress, userAddress, true)
140147 if ((0 > userBorrowedAmount))
141148 then throw("transaction leads to a negative borrowed amount")
142149 else if (if (!(BadDebtLiqAllowed))
143150 then (0 >= userUsdBalance)
144151 else false)
145152 then throw("transaction leads to a bad debt")
146153 else {
147154 let liquidatorReward = fraction(amount, LiquidatorReward, 10000)
148155 let statsKeyStr = ((("reward_" + toString(i.caller)) + "_") + suppliedAssetIdStr)
149156 [IntegerEntry(statsKeyStr, (valueOrElse(getInteger(this, statsKeyStr), 0) + liquidatorReward)), IntegerEntry(lastLiquidationKeyStr, height), IntegerEntry(lastLiqForMarketKeyStr, height)]
150157 }
151158 }
152159 else throw("Strict value is not equal to itself.")
153160 }
154161 }
155162
156163
157164
158165 @Callable(i)
159166 func payoutReward (addressStr,assetIdStr) = if ((toString(i.caller) != "3PMcMiMEs6w56NRGacksXtFG5zS7doE9fpL"))
160167 then throw("no access to this method")
161168 else {
162169 let statsKeyStr = ((("reward_" + addressStr) + "_") + assetIdStr)
163170 let rewardAvailable = valueOrElse(getInteger(this, statsKeyStr), 0)
164171 [ScriptTransfer(addressFromStringValue(addressStr), rewardAvailable, getAssetBytes(assetIdStr)), IntegerEntry(statsKeyStr, 0)]
165172 }
166173
167174
168175
169176 @Callable(i)
170177 func updateString (key,val) = if (if ((toString(i.caller) != "3PMcMiMEs6w56NRGacksXtFG5zS7doE9fpL"))
171178 then (toString(i.caller) != "3PHbdpaKzz8EiAngGHaFu2hVuNCdsC67qh3")
172179 else false)
173180 then throw("no access to this method")
174181 else [StringEntry(key, val)]
175182
176183
177184
178185 @Callable(i)
179186 func updateInteger (key,val) = if (if ((toString(i.caller) != "3PMcMiMEs6w56NRGacksXtFG5zS7doE9fpL"))
180187 then (toString(i.caller) != "3PHbdpaKzz8EiAngGHaFu2hVuNCdsC67qh3")
181188 else false)
182189 then throw("no access to this method")
183190 else [IntegerEntry(key, val)]
184191
185192
186193
187194 @Callable(i)
188195 func getUserBalanceREADONLY (debug,marketStr,address) = {
189196 let res = getUserBalanceINTERNAL(addressFromStringValue(marketStr), address, true)
190197 if ((debug == true))
191198 then throw(toString(res))
192199 else $Tuple2(nil, res)
193200 }
194201
195202

github/deemru/w8io/3ef1775 
40.05 ms