tx · 4dKACxKswcTTi43ubzRZasaE23XVHoAeB6YkxmB39UYD

3P4uA5etnZi4AmBabKinq2bMiWU8KcnHZdH:  -0.01800000 Waves

2022.11.01 20:19 [3363700] smart account 3P4uA5etnZi4AmBabKinq2bMiWU8KcnHZdH > SELF 0.00000000 Waves

{ "type": 13, "id": "4dKACxKswcTTi43ubzRZasaE23XVHoAeB6YkxmB39UYD", "fee": 1800000, "feeAssetId": null, "timestamp": 1667323171227, "version": 2, "chainId": 87, "sender": "3P4uA5etnZi4AmBabKinq2bMiWU8KcnHZdH", "senderPublicKey": "8DxbUxhy23djr6kUEE1Jzp7oVJXBsHNaATLRiABpkSde", "proofs": [ "tddjHZh9HBuADBMSHg54D11vB11Ni495vVPUwTon96wH1GzbffoUySq7SAZnLuQzfC1e7N71kCCzhKdihnh4R3P" ], "script": "base64:BgJXCAISBgoECAgICBIECgIICBIAEgQKAggBEgQKAggBEgASCAoGBAgBCAgIEgYKBAQIBAgSAwoBBBIECgIIBBIECgIIBBIDCgEEEgMKAQQSAwoBCBIDCgEEFgAGU2NhbGU4AIDC1y8AB1NjYWxlMTAAgMivoCUAB1NjYWxlMTYJAGgCBQZTY2FsZTgFBlNjYWxlOAALcmVzZXJ2ZUZ1bmQAFAAJZGF5QmxvY2tzAKALAQ10cnlHZXRJbnRlZ2VyAQNrZXkEByRtYXRjaDAJAJoIAgUEdGhpcwUDa2V5AwkAAQIFByRtYXRjaDACA0ludAQBYgUHJG1hdGNoMAUBYgAAAQ10cnlHZXRCb29sZWFuAQNrZXkEByRtYXRjaDAJAJsIAgUEdGhpcwUDa2V5AwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAWIFByRtYXRjaDAFAWIHAQx0cnlHZXRTdHJpbmcBA2tleQQHJG1hdGNoMAkAnQgCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFiBQckbWF0Y2gwBQFiAgABDmdldEFzc2V0U3RyaW5nAQdhc3NldElkBAckbWF0Y2gwBQdhc3NldElkAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWIFByRtYXRjaDAJANgEAQUBYgIFV0FWRVMBDWdldEFzc2V0Qnl0ZXMBCmFzc2V0SWRTdHIDCQAAAgUKYXNzZXRJZFN0cgIFV0FWRVMFBHVuaXQJANkEAQUKYXNzZXRJZFN0cgEKZ2V0QmFsYW5jZQEKYXNzZXRJZFN0cgMJAAACBQphc3NldElkU3RyAgVXQVZFUwgJAO8HAQUEdGhpcwlhdmFpbGFibGUJAPAHAgUEdGhpcwkA2QQBBQphc3NldElkU3RyAQ9nZXRNYXJrZXRBc3NldHMACQC1CQIJAQx0cnlHZXRTdHJpbmcBAgxzZXR1cF90b2tlbnMCASwBDWdldE91dGRhdGVkVXIBCmFzc2V0SWRTdHIEBGRvd24JAGsDCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgIPdG90YWxfc3VwcGxpZWRfBQphc3NldElkU3RyCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgUKYXNzZXRJZFN0cgIGX3NSYXRlBQdTY2FsZTE2AwkAAAIFBGRvd24AAAAACQBrAwUGU2NhbGU4CQBrAwkBDXRyeUdldEludGVnZXIBCQCsAgICD3RvdGFsX2JvcnJvd2VkXwUKYXNzZXRJZFN0cgkBDXRyeUdldEludGVnZXIBCQCsAgIFCmFzc2V0SWRTdHICBl9iUmF0ZQUHU2NhbGUxNgUEZG93bgEMZ2V0UmF0ZUN1cnZlAQphc3NldElkU3RyBAckbWF0Y2gwBQphc3NldElkU3RyAwkAAAICLDM0TjlZY0VFVExXbjkzcVlRNjRFc1AxeDg5dFNydUpVNDRSckVNU1hYRVBKBQckbWF0Y2gwCQCWCgQAgIl6AMDw9QsAgOiSJgCAwtcvAwkAAAICLERHMnhGa1BkRHdLVW9Ca3pHQWhRdExwU0d6ZlhMaUNZUEV6ZUtIMkFkMjRwBQckbWF0Y2gwCQCWCgQAgIl6AMDw9QsAgOiSJgCAwtcvAwkAAAICLEFqc282blRUanB0dTJVSEx4NmhmU1hWdEhGdFJCSkNrS1lkNVNBeWo3emY1BQckbWF0Y2gwCQCWCgQAgIl6AIC0iRMAgOiSJgCAo8NHAwkAAAICLEhFQjhRYXc5eHJXcFdzOHRIc2lBVFlHQldEQnRQMlM3a2NQQUxyTXU0M0FTBQckbWF0Y2gwCQCWCgQAAACA2sQJAIDokiYAgLSJEwMJAAACAgVXQVZFUwUHJG1hdGNoMAkAlgoEAICJegCAh6cOAIDokiYAgOHrFwkAlgoEAAAAgNrECQCA6JImAIDokiYBC2dldEludGVyZXN0AQphc3NldElkU3RyBAJ1cgkBDWdldE91dGRhdGVkVXIBBQphc3NldElkU3RyBAVjdXJ2ZQkBDGdldFJhdGVDdXJ2ZQEFCmFzc2V0SWRTdHIEBHJhdGUJAGQCCAUFY3VydmUCXzEDCQBnAggFBWN1cnZlAl8zBQJ1cgkAawMFAnVyCAUFY3VydmUCXzIIBQVjdXJ2ZQJfMwkAZAIIBQVjdXJ2ZQJfMgkAawMJAGUCBQJ1cggFBWN1cnZlAl8zCQBlAggFBWN1cnZlAl80CAUFY3VydmUCXzIJAGUCAIDC1y8IBQVjdXJ2ZQJfMwkAlgMBCQDMCAIJAGsDBQRyYXRlBQZTY2FsZTgJAGgCBQlkYXlCbG9ja3MA7QIJAMwIAgABBQNuaWwBEHRva2VuUmF0ZXNSZWNhbGMBCmFzc2V0SWRTdHIECGludGVyZXN0CQELZ2V0SW50ZXJlc3QBBQphc3NldElkU3RyBAJ1cgkBDWdldE91dGRhdGVkVXIBBQphc3NldElkU3RyBBBsYXN0UmVjYWxjSGVpZ2h0CQENdHJ5R2V0SW50ZWdlcgECDmxhc3RSYXRlSGVpZ2h0BAlsYXN0QlJhdGUJAJYDAQkAzAgCCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgUKYXNzZXRJZFN0cgIGX2JSYXRlCQDMCAIFB1NjYWxlMTYFA25pbAQIbmV3QlJhdGUJAGQCBQlsYXN0QlJhdGUJAGgCCQBlAgUGaGVpZ2h0BRBsYXN0UmVjYWxjSGVpZ2h0BQhpbnRlcmVzdAQJbGFzdFNSYXRlCQCWAwEJAMwIAgkBDXRyeUdldEludGVnZXIBCQCsAgIFCmFzc2V0SWRTdHICBl9zUmF0ZQkAzAgCBQdTY2FsZTE2BQNuaWwECG5ld1NSYXRlCQBkAgUJbGFzdFNSYXRlCQBpAgkAaAIJAGgCCQBlAgUGaGVpZ2h0BRBsYXN0UmVjYWxjSGVpZ2h0CQBrAwUIaW50ZXJlc3QFAnVyBQZTY2FsZTgJAGUCAGQFC3Jlc2VydmVGdW5kAGQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUKYXNzZXRJZFN0cgIGX3NSYXRlBQhuZXdTUmF0ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQphc3NldElkU3RyAgZfYlJhdGUFCG5ld0JSYXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCAg5sYXN0UmF0ZUhlaWdodAUGaGVpZ2h0BQNuaWwBDWdldEFjdHVhbFJhdGUCCmFzc2V0SWRTdHIIcmF0ZVR5cGUKAQFmAgVhY2N1bQV0b2tlbgQGcmVjYWxjCQEQdG9rZW5SYXRlc1JlY2FsYwEFBXRva2VuCQCUCgIDCQECIT0CBQV0b2tlbgUKYXNzZXRJZFN0cggFBWFjY3VtAl8xAwkAAAIFCHJhdGVUeXBlAgVzUmF0ZQgJAJEDAgUGcmVjYWxjAAAFdmFsdWUICQCRAwIFBnJlY2FsYwABBXZhbHVlCQDOCAIIBQVhY2N1bQJfMgUGcmVjYWxjCgACJGwJAQ9nZXRNYXJrZXRBc3NldHMACgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAAAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEBZgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgEFZ2V0VXIBCmFzc2V0SWRTdHIEBXJhdGVzCQEQdG9rZW5SYXRlc1JlY2FsYwEFCmFzc2V0SWRTdHIEBGRvd24JAGsDCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgIPdG90YWxfc3VwcGxpZWRfBQphc3NldElkU3RyCAkAkQMCBQVyYXRlcwAABXZhbHVlBQdTY2FsZTE2CQBrAwUGU2NhbGU4CQBrAwkBDXRyeUdldEludGVnZXIBCQCsAgICD3RvdGFsX2JvcnJvd2VkXwUKYXNzZXRJZFN0cggJAJEDAgUFcmF0ZXMAAQV2YWx1ZQUHU2NhbGUxNgUEZG93bgELcmF0ZXNSZWNhbGMACgEBZgIFYWNjdW0FdG9rZW4JAM4IAgUFYWNjdW0JARB0b2tlblJhdGVzUmVjYWxjAQUFdG9rZW4KAAIkbAkBD2dldE1hcmtldEFzc2V0cwAKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBAWYCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYBDWdldFRva2VuUHJpY2UBCmFzc2V0SWRTdHIEBGludjEJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQIjM1A1QlR0ZGozMlNkMUR5aDFNZHczM3hRQUFja1NmTWZuS2YCCWdldFRXQVA2MAkAzAgCBQphc3NldElkU3RyCQDMCAIHBQNuaWwFA25pbAMJAAACBQRpbnYxBQRpbnYxBAckbWF0Y2gwBQRpbnYxAwkAAQIFByRtYXRjaDACCihJbnQsIEludCkEAXgFByRtYXRjaDAFAXgJAAIBAhVlcnJvciBvZiBwcmljZSBvcmFjbGUJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDmNhbGNBc3NldFNjYWxlAQphc3NldElkU3RyBAhkZWNpbWFscwMJAAACBQphc3NldElkU3RyAgVXQVZFUwAICAkBBXZhbHVlAQkA7AcBCQDZBAEFCmFzc2V0SWRTdHIIZGVjaW1hbHMJAGwGAAoAAAUIZGVjaW1hbHMAAAAABQRET1dOARJjYWxjVXNlckNvbGxhdGVyYWwBB2FkZHJlc3MEFHVzZXJDb2xsYXRlcmFsSW52b2tlCQD8BwQFBHRoaXMCEWdldFVzZXJDb2xsYXRlcmFsCQDMCAIHCQDMCAIFB2FkZHJlc3MJAMwIAgYJAMwIAgIABQNuaWwFA25pbAMJAAACBRR1c2VyQ29sbGF0ZXJhbEludm9rZQUUdXNlckNvbGxhdGVyYWxJbnZva2UEE3VzZXJDb2xsYXRlcmFsVmFsdWUEByRtYXRjaDAFFHVzZXJDb2xsYXRlcmFsSW52b2tlAwkAAQIFByRtYXRjaDACA0ludAQBeAUHJG1hdGNoMAUBeAkAAgECJGlzc3VlIHdoaWxlIGRvaW5nIGluLWRhcHAgaW52b2NhdGlvbgMJAAACBRN1c2VyQ29sbGF0ZXJhbFZhbHVlBRN1c2VyQ29sbGF0ZXJhbFZhbHVlBRN1c2VyQ29sbGF0ZXJhbFZhbHVlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuDwFpAQdwcmVJbml0BAZ0b2tlbnMEbHR2cwNsdHMJcGVuYWx0aWVzCgEBZgIFYWNjdW0FdG9rZW4JAM4IAgUFYWNjdW0JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUFdG9rZW4CBl9iUmF0ZQUHU2NhbGUxNgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQV0b2tlbgIGX3NSYXRlBQdTY2FsZTE2BQNuaWwDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAgphZG1pbiBvbmx5BAVyYXRlcwoAAiRsCQC1CQIFBnRva2VucwIBLAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEBZgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgkAzggCCQDMCAIJAQtTdHJpbmdFbnRyeQICDHNldHVwX3Rva2VucwUGdG9rZW5zCQDMCAIJAQtTdHJpbmdFbnRyeQICCnNldHVwX2x0dnMFBGx0dnMJAMwIAgkBC1N0cmluZ0VudHJ5AgIJc2V0dXBfbHRzBQNsdHMJAMwIAgkBC1N0cmluZ0VudHJ5AgIPc2V0dXBfcGVuYWx0aWVzBQlwZW5hbHRpZXMJAMwIAgkBDEJvb2xlYW5FbnRyeQICDHNldHVwX2FjdGl2ZQYFA25pbAUFcmF0ZXMBaQEPdXBkYXRlUGFyYW1ldGVyAgNrZXkDdmFsAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIKYWRtaW4gb25seQkAzAgCCQELU3RyaW5nRW50cnkCBQNrZXkFA3ZhbAUDbmlsAWkBBnN1cHBseQADCQEBIQEJAQ10cnlHZXRCb29sZWFuAQIMc2V0dXBfYWN0aXZlCQACAQIRbWFya2V0IGlzIHN0b3BwZWQDAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwABBgkAAAIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AAAJAAIBAhwxIHBheW1lbnQgaGFzIHRvIGJlIGF0dGFjaGVkBAphc3NldElkU3RyCQEOZ2V0QXNzZXRTdHJpbmcBCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQEC2Fzc2V0QW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQLJHQwNjU0NjY2MTMJAQ1nZXRBY3R1YWxSYXRlAgUKYXNzZXRJZFN0cgIFc1JhdGUEBXNSYXRlCAULJHQwNjU0NjY2MTMCXzEEEXJhdGVzUmVjYWxjUmVzdWx0CAULJHQwNjU0NjY2MTMCXzIEBmFtb3VudAkAbgQFC2Fzc2V0QW1vdW50BQdTY2FsZTE2BQVzUmF0ZQUERE9XTgQHYWRkcmVzcwkApQgBCAUBaQZjYWxsZXIDCQAAAgkAswkCCQEMdHJ5R2V0U3RyaW5nAQIMc2V0dXBfdG9rZW5zBQphc3NldElkU3RyBQR1bml0CQACAQIpdGhpcyBhc3NldCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBtYXJrZXQJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIFB2FkZHJlc3MCCl9zdXBwbGllZF8FCmFzc2V0SWRTdHIJAGQCCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICBQdhZGRyZXNzAgpfc3VwcGxpZWRfBQphc3NldElkU3RyBQZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgIPdG90YWxfc3VwcGxpZWRfBQphc3NldElkU3RyCQBkAgkBDXRyeUdldEludGVnZXIBCQCsAgICD3RvdGFsX3N1cHBsaWVkXwUKYXNzZXRJZFN0cgUGYW1vdW50BQNuaWwFEXJhdGVzUmVjYWxjUmVzdWx0AWkBCHdpdGhkcmF3Agphc3NldElkU3RyC2Fzc2V0QW1vdW50BAskdDA3MTg0NzI1MQkBDWdldEFjdHVhbFJhdGUCBQphc3NldElkU3RyAgVzUmF0ZQQFc1JhdGUIBQskdDA3MTg0NzI1MQJfMQQRcmF0ZXNSZWNhbGNSZXN1bHQIBQskdDA3MTg0NzI1MQJfMgQGYW1vdW50CQBuBAULYXNzZXRBbW91bnQFB1NjYWxlMTYFBXNSYXRlBQZIQUxGVVAEB2FkZHJlc3MJAKUIAQgFAWkGY2FsbGVyBA1hc3NldFN1cHBsaWVkCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgIPdG90YWxfc3VwcGxpZWRfBQphc3NldElkU3RyBA1hc3NldEJvcnJvd2VkCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgIPdG90YWxfYm9ycm93ZWRfBQphc3NldElkU3RyBBF1c2VyQXNzZXRTdXBwbGllZAkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgUHYWRkcmVzcwIKX3N1cHBsaWVkXwUKYXNzZXRJZFN0cgQRdXNlckFzc2V0Qm9ycm93ZWQJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgIFB2FkZHJlc3MCCl9ib3Jyb3dlZF8FCmFzc2V0SWRTdHIEEmNvbGxhdGVyYWxWYWx1ZUludgkA/AcEBQR0aGlzAhFnZXRVc2VyQ29sbGF0ZXJhbAkAzAgCBwkAzAgCBQdhZGRyZXNzCQDMCAIGCQDMCAIJAKwCAgkArAICBQphc3NldElkU3RyAgosc3VwcGxpZWQsCQCkAwEJAQEtAQUGYW1vdW50BQNuaWwFA25pbAMJAAACBRJjb2xsYXRlcmFsVmFsdWVJbnYFEmNvbGxhdGVyYWxWYWx1ZUludgQPY29sbGF0ZXJhbFZhbHVlBAckbWF0Y2gwBRJjb2xsYXRlcmFsVmFsdWVJbnYDCQABAgUHJG1hdGNoMAIDSW50BAF4BQckbWF0Y2gwBQF4CQACAQIfY2FuJ3QgZ2V0IHVzZXIgY29sbGF0ZXJhbCB2YWx1ZQMJAQEhAQkBDXRyeUdldEJvb2xlYW4BAgxzZXR1cF9hY3RpdmUJAAIBAhFtYXJrZXQgaXMgc3RvcHBlZAMJAGYCAAAFD2NvbGxhdGVyYWxWYWx1ZQkAAgECMnlvdSBkb250IGhhdmUgZW5vdWdoIGNvbGxhdGVyYWwgZm9yIHRoaXMgb3BlcmF0aW9uAwkAZgIFBmFtb3VudAkAZQIFDWFzc2V0U3VwcGxpZWQFDWFzc2V0Qm9ycm93ZWQJAAIBAip0aGlzIGFtb3VudCBpcyBub3QgYXZhaWxhYmxlIG9uIHRoZSBtYXJrZXQDCQBmAgUGYW1vdW50CQBlAgURdXNlckFzc2V0U3VwcGxpZWQFEXVzZXJBc3NldEJvcnJvd2VkCQACAQIqdGhpcyBhbW91bnQgaXMgbm90IGF2YWlsYWJsZSBmb3IgdGhpcyB1c2VyCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICBQdhZGRyZXNzAgpfc3VwcGxpZWRfBQphc3NldElkU3RyCQBlAgkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgUHYWRkcmVzcwIKX3N1cHBsaWVkXwUKYXNzZXRJZFN0cgUGYW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICD3RvdGFsX3N1cHBsaWVkXwUKYXNzZXRJZFN0cgkAZQIJAQ10cnlHZXRJbnRlZ2VyAQkArAICAg90b3RhbF9zdXBwbGllZF8FCmFzc2V0SWRTdHIFBmFtb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFC2Fzc2V0QW1vdW50CQENZ2V0QXNzZXRCeXRlcwEFCmFzc2V0SWRTdHIFA25pbAURcmF0ZXNSZWNhbGNSZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEGYm9ycm93Agphc3NldElkU3RyC2Fzc2V0QW1vdW50BAdhZGRyZXNzCQClCAEIBQFpBmNhbGxlcgQLJHQwODc0Mzg4MTAJAQ1nZXRBY3R1YWxSYXRlAgUKYXNzZXRJZFN0cgIFYlJhdGUEBWJSYXRlCAULJHQwODc0Mzg4MTACXzEEEXJhdGVzUmVjYWxjUmVzdWx0CAULJHQwODc0Mzg4MTACXzIEBmFtb3VudAkAbgQFC2Fzc2V0QW1vdW50BQdTY2FsZTE2BQViUmF0ZQUHQ0VJTElORwQSY29sbGF0ZXJhbFZhbHVlSW52CQD8BwQFBHRoaXMCEWdldFVzZXJDb2xsYXRlcmFsCQDMCAIHCQDMCAIFB2FkZHJlc3MJAMwIAgYJAMwIAgkArAICCQCsAgIFCmFzc2V0SWRTdHICCixib3Jyb3dlZCwJAKQDAQUGYW1vdW50BQNuaWwFA25pbAMJAAACBRJjb2xsYXRlcmFsVmFsdWVJbnYFEmNvbGxhdGVyYWxWYWx1ZUludgQPY29sbGF0ZXJhbFZhbHVlBAckbWF0Y2gwBRJjb2xsYXRlcmFsVmFsdWVJbnYDCQABAgUHJG1hdGNoMAIDSW50BAF4BQckbWF0Y2gwBQF4CQACAQIfY2FuJ3QgZ2V0IHVzZXIgY29sbGF0ZXJhbCB2YWx1ZQMJAQEhAQkBDXRyeUdldEJvb2xlYW4BAgxzZXR1cF9hY3RpdmUJAAIBAhFtYXJrZXQgaXMgc3RvcHBlZAMJAGYCAAAFD2NvbGxhdGVyYWxWYWx1ZQkAAgECIXlvdSBoYXZlIHRvIHN1cHBseSBtb3JlIHRvIGJvcnJvdwQNYXNzZXRTdXBwbGllZAkBDXRyeUdldEludGVnZXIBCQCsAgICD3RvdGFsX3N1cHBsaWVkXwUKYXNzZXRJZFN0cgQNYXNzZXRCb3Jyb3dlZAkBDXRyeUdldEludGVnZXIBCQCsAgICD3RvdGFsX2JvcnJvd2VkXwUKYXNzZXRJZFN0cgQRdXNlckFzc2V0Qm9ycm93ZWQJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgIFB2FkZHJlc3MCCl9ib3Jyb3dlZF8FCmFzc2V0SWRTdHIDCQBmAgUGYW1vdW50CQBlAgUNYXNzZXRTdXBwbGllZAUNYXNzZXRCb3Jyb3dlZAkAAgECHHRoaXMgYW1vdW50IGlzIG5vdCBhdmFpbGFibGUJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIFB2FkZHJlc3MCCl9ib3Jyb3dlZF8FCmFzc2V0SWRTdHIJAGQCBRF1c2VyQXNzZXRCb3Jyb3dlZAUGYW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICD3RvdGFsX2JvcnJvd2VkXwUKYXNzZXRJZFN0cgkAZAIFDWFzc2V0Qm9ycm93ZWQFBmFtb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFC2Fzc2V0QW1vdW50CQENZ2V0QXNzZXRCeXRlcwEFCmFzc2V0SWRTdHIFA25pbAURcmF0ZXNSZWNhbGNSZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEFcmVwYXkAAwkBASEBCQENdHJ5R2V0Qm9vbGVhbgECDHNldHVwX2FjdGl2ZQkAAgECEW1hcmtldCBpcyBzdG9wcGVkAwMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQYJAAACCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAAACQACAQIcMSBwYXltZW50IGhhcyB0byBiZSBhdHRhY2hlZAQKYXNzZXRJZFN0cgkBDmdldEFzc2V0U3RyaW5nAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBAthc3NldEFtb3VudAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQEDSR0MDEwMjM0MTAzMDEJAQ1nZXRBY3R1YWxSYXRlAgUKYXNzZXRJZFN0cgIFYlJhdGUEBWJSYXRlCAUNJHQwMTAyMzQxMDMwMQJfMQQRcmF0ZXNSZWNhbGNSZXN1bHQIBQ0kdDAxMDIzNDEwMzAxAl8yBAZhbW91bnQJAGsDBQthc3NldEFtb3VudAUHU2NhbGUxNgUFYlJhdGUEB2FkZHJlc3MJAKUIAQgFAWkGY2FsbGVyBA1hc3NldFN1cHBsaWVkCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgIPdG90YWxfc3VwcGxpZWRfBQphc3NldElkU3RyBA1hc3NldEJvcnJvd2VkCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgIPdG90YWxfYm9ycm93ZWRfBQphc3NldElkU3RyBBF1c2VyQXNzZXRCb3Jyb3dlZAkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgUHYWRkcmVzcwIKX2JvcnJvd2VkXwUKYXNzZXRJZFN0cgQKYW1vdW50TGVmdAkAZQIFEXVzZXJBc3NldEJvcnJvd2VkBQZhbW91bnQEC3JlcGF5QW1vdW50AwkAZwIFCmFtb3VudExlZnQAAAUGYW1vdW50BRF1c2VyQXNzZXRCb3Jyb3dlZAMJAAACCQCzCQIJAQx0cnlHZXRTdHJpbmcBAgxzZXR1cF90b2tlbnMFCmFzc2V0SWRTdHIFBHVuaXQJAAIBAil0aGlzIGFzc2V0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIG1hcmtldAkAzggCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICBQdhZGRyZXNzAgpfYm9ycm93ZWRfBQphc3NldElkU3RyCQBlAgURdXNlckFzc2V0Qm9ycm93ZWQFC3JlcGF5QW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICD3RvdGFsX2JvcnJvd2VkXwUKYXNzZXRJZFN0cgkAZQIFDWFzc2V0Qm9ycm93ZWQFC3JlcGF5QW1vdW50BQNuaWwFEXJhdGVzUmVjYWxjUmVzdWx0AwkAZwIFCmFtb3VudExlZnQAAAUDbmlsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkBAS0BBQphbW91bnRMZWZ0CAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFA25pbAFpAQlsaXF1aWRhdGUGBWRlYnVnB2FkZHJlc3MLYXNzZXRBbW91bnQLc0Fzc2V0SWRTdHILYkFzc2V0SWRTdHIIcm91dGVTdHIDCQECIT0CCAUBaQZjYWxsZXIJAQdBZGRyZXNzAQEaAVd3qs7ReFboqZ5eq5Xvv+nhcVh1XjKacYEJAAIBAiV0ZW1wb3JhcmlseSBsaXN0ZWQgZm9yIHdoaXRlbGlzdCBvbmx5AwkBASEBCQENdHJ5R2V0Qm9vbGVhbgECDHNldHVwX2FjdGl2ZQkAAgECEW1hcmtldCBpcyBzdG9wcGVkBA51c2VyQ29sbGF0ZXJhbAkBEmNhbGNVc2VyQ29sbGF0ZXJhbAEFB2FkZHJlc3MDCQAAAgUOdXNlckNvbGxhdGVyYWwFDnVzZXJDb2xsYXRlcmFsBA0kdDAxMTY2NTExNzM0CQENZ2V0QWN0dWFsUmF0ZQIFC3NBc3NldElkU3RyAgVzUmF0ZQQFc1JhdGUIBQ0kdDAxMTY2NTExNzM0Al8xBBJyYXRlc1JlY2FsY1Jlc3VsdDEIBQ0kdDAxMTY2NTExNzM0Al8yBA0kdDAxMTczOTExODA4CQENZ2V0QWN0dWFsUmF0ZQIFC2JBc3NldElkU3RyAgViUmF0ZQQFYlJhdGUIBQ0kdDAxMTczOTExODA4Al8xBBJyYXRlc1JlY2FsY1Jlc3VsdDIIBQ0kdDAxMTczOTExODA4Al8yBAxzQXNzZXRBbW91bnQJAGsDBQthc3NldEFtb3VudAUHU2NhbGUxNgUFc1JhdGUEEGN1cnJlbnRTUG9zaXRpb24JAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgIFB2FkZHJlc3MCCl9zdXBwbGllZF8FC3NBc3NldElkU3RyBBBjdXJyZW50QlBvc2l0aW9uCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICBQdhZGRyZXNzAgpfYm9ycm93ZWRfBQtiQXNzZXRJZFN0cgMJAGYCBQ51c2VyQ29sbGF0ZXJhbAAACQACAQIYdXNlciBjYW4ndCBiZSBsaXF1aWRhdGVkAwkAZgIFDHNBc3NldEFtb3VudAUQY3VycmVudFNQb3NpdGlvbgkAAgECMnBvc2l0aW9uIHRvIGxpcXVpZGF0ZSBpcyBiaWdnZXIgdGhhbiB1c2VyJ3Mgc3VwcGx5BBFhZ2dyZWdhdG9yQWRkcmVzcwkBB0FkZHJlc3MBARoBV50MqsYTUaluy4D3Y33BZHji73JNqAy60wQOYmFsYW5jZTBCZWZvcmUJAQpnZXRCYWxhbmNlAQULc0Fzc2V0SWRTdHIDCQAAAgUOYmFsYW5jZTBCZWZvcmUFDmJhbGFuY2UwQmVmb3JlBA5iYWxhbmNlMUJlZm9yZQkBCmdldEJhbGFuY2UBBQtiQXNzZXRJZFN0cgMJAAACBQ5iYWxhbmNlMUJlZm9yZQUOYmFsYW5jZTFCZWZvcmUEDmV4Y2hhbmdlSW52b2tlCQD8BwQFEWFnZ3JlZ2F0b3JBZGRyZXNzAgRzd2FwCQDMCAIFCHJvdXRlU3RyCQDMCAIAAAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQENZ2V0QXNzZXRCeXRlcwEFC3NBc3NldElkU3RyBQthc3NldEFtb3VudAUDbmlsAwkAAAIFDmV4Y2hhbmdlSW52b2tlBQ5leGNoYW5nZUludm9rZQQKYXNzZXQwU29sZAkAZQIFDmJhbGFuY2UwQmVmb3JlCQEKZ2V0QmFsYW5jZQEFC3NBc3NldElkU3RyAwkAAAIFCmFzc2V0MFNvbGQFCmFzc2V0MFNvbGQEDGFzc2V0MUJvdWdodAkAZQIJAQpnZXRCYWxhbmNlAQULYkFzc2V0SWRTdHIFDmJhbGFuY2UxQmVmb3JlAwkAAAIFDGFzc2V0MUJvdWdodAUMYXNzZXQxQm91Z2h0BAthc3NldDBQcmljZQgJAQ1nZXRUb2tlblByaWNlAQULc0Fzc2V0SWRTdHICXzIEC2Fzc2V0MFNjYWxlCQEOY2FsY0Fzc2V0U2NhbGUBBQtzQXNzZXRJZFN0cgQJYXNzZXQwVXNkCQBrAwUKYXNzZXQwU29sZAULYXNzZXQwUHJpY2UFC2Fzc2V0MFNjYWxlBAthc3NldDFQcmljZQgJAQ1nZXRUb2tlblByaWNlAQULYkFzc2V0SWRTdHICXzEEC2Fzc2V0MVNjYWxlCQEOY2FsY0Fzc2V0U2NhbGUBBQtiQXNzZXRJZFN0cgQJYXNzZXQxVXNkCQBrAwUMYXNzZXQxQm91Z2h0BQthc3NldDFQcmljZQULYXNzZXQxU2NhbGUEB3BlbmFsdHkJAQ1wYXJzZUludFZhbHVlAQkAkQMCCQC1CQIJAQx0cnlHZXRTdHJpbmcBAg9zZXR1cF9wZW5hbHRpZXMCASwJAQV2YWx1ZQEJAM8IAgkBD2dldE1hcmtldEFzc2V0cwAFC2JBc3NldElkU3RyBBFsaXF1aWRhdGlvblByb2ZpdAkAZQIFCWFzc2V0MVVzZAkAawMFCWFzc2V0MFVzZAkAZQIFBlNjYWxlOAUHcGVuYWx0eQUGU2NhbGU4BAxzQXNzZXRDaGFuZ2UJAGsDBQphc3NldDBTb2xkBQdTY2FsZTE2BQVzUmF0ZQQMYkFzc2V0Q2hhbmdlCQBrAwUMYXNzZXQxQm91Z2h0BQdTY2FsZTE2BQViUmF0ZQMJAGYCBQphc3NldDBTb2xkBQthc3NldEFtb3VudAkAAgECI21vcmUgYXNzZXRzIGV4Y2hhbmdlZCB0aGFuIGV4cGVjdGVkAwkAZgIAAAURbGlxdWlkYXRpb25Qcm9maXQJAAIBAi9wcmljZSBpbXBhY3QgaXMgYmlnZ2VyIHRoYW4gbGlxdWlkYXRpb24gcGVuYWx0eQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIFB2FkZHJlc3MCCl9zdXBwbGllZF8FC3NBc3NldElkU3RyCQBlAgUQY3VycmVudFNQb3NpdGlvbgUMc0Fzc2V0Q2hhbmdlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgUHYWRkcmVzcwIKX2JvcnJvd2VkXwULYkFzc2V0SWRTdHIJAGUCBRBjdXJyZW50QlBvc2l0aW9uBQxiQXNzZXRDaGFuZ2UJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgIPdG90YWxfc3VwcGxpZWRfBQtzQXNzZXRJZFN0cgkAZQIJAQ10cnlHZXRJbnRlZ2VyAQkArAICAg90b3RhbF9zdXBwbGllZF8FC3NBc3NldElkU3RyBQxzQXNzZXRDaGFuZ2UJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgIPdG90YWxfYm9ycm93ZWRfBQtiQXNzZXRJZFN0cgkAZQIJAQ10cnlHZXRJbnRlZ2VyAQkArAICAg90b3RhbF9ib3Jyb3dlZF8FC2JBc3NldElkU3RyBQxiQXNzZXRDaGFuZ2UJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBRFsaXF1aWRhdGlvblByb2ZpdAkBDWdldEFzc2V0Qnl0ZXMBBQtiQXNzZXRJZFN0cgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEWdldFVzZXJDb2xsYXRlcmFsBAVkZWJ1ZwdhZGRyZXNzDW1pbnVzQm9ycm93ZWQLYWZ0ZXJDaGFuZ2UEBmFzc2V0cwkBD2dldE1hcmtldEFzc2V0cwAEBGx0dnMJALUJAgkBDHRyeUdldFN0cmluZwECCnNldHVwX2x0dnMCASwEA2x0cwkAtQkCCQEMdHJ5R2V0U3RyaW5nAQIJc2V0dXBfbHRzAgEsBAVyYXRlcwgJAQ1nZXRBY3R1YWxSYXRlAgkAkQMCBQZhc3NldHMAAAIFc1JhdGUCXzIEDWNoYW5nZUhhbmRsZXIJALUJAgULYWZ0ZXJDaGFuZ2UCASwKAQFmAgVhY2N1bQRuZXh0AwkAZwIFBG5leHQJAJADAQUGYXNzZXRzBQVhY2N1bQQIZGVjaW1hbHMDCQAAAgkAkQMCBQZhc3NldHMFBG5leHQCBVdBVkVTAAgICQEFdmFsdWUBCQDsBwEJANkEAQkAkQMCBQZhc3NldHMFBG5leHQIZGVjaW1hbHMECmFzc2V0U2NhbGUJAGwGAAoAAAUIZGVjaW1hbHMAAAAABQRET1dOBAphc3NldFByaWNlCQENZ2V0VG9rZW5QcmljZQEJAJEDAgUGYXNzZXRzBQRuZXh0CQBlAgkAZAIFBWFjY3VtCQBrAwkAawMJAGsDCQBkAgkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgUHYWRkcmVzcwIKX3N1cHBsaWVkXwkAkQMCBQZhc3NldHMFBG5leHQDAwMJAQIhPQIFC2FmdGVyQ2hhbmdlAgAJAAACCQCRAwIFDWNoYW5nZUhhbmRsZXIAAAkAkQMCBQZhc3NldHMFBG5leHQHCQAAAgkAkQMCBQ1jaGFuZ2VIYW5kbGVyAAECCHN1cHBsaWVkBwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDWNoYW5nZUhhbmRsZXIAAgAACAkAkQMCBQVyYXRlcwkAaAIFBG5leHQAAwV2YWx1ZQUHU2NhbGUxNgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBGx0dnMFBG5leHQFBlNjYWxlOAgFCmFzc2V0UHJpY2UCXzEFCmFzc2V0U2NhbGUDBQ1taW51c0JvcnJvd2VkCQBrAwkAawMJAGsDCQBkAgkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgUHYWRkcmVzcwIKX2JvcnJvd2VkXwkAkQMCBQZhc3NldHMFBG5leHQDAwMJAQIhPQIFC2FmdGVyQ2hhbmdlAgAJAAACCQCRAwIFDWNoYW5nZUhhbmRsZXIAAAkAkQMCBQZhc3NldHMFBG5leHQHCQAAAgkAkQMCBQ1jaGFuZ2VIYW5kbGVyAAECCGJvcnJvd2VkBwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFDWNoYW5nZUhhbmRsZXIAAgAACAkAkQMCBQVyYXRlcwkAZAIJAGgCBQRuZXh0AAMAAQV2YWx1ZQUHU2NhbGUxNgUGU2NhbGU4CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDbHRzBQRuZXh0CAUKYXNzZXRQcmljZQJfMgUKYXNzZXRTY2FsZQAABAZyZXN1bHQKAAIkbAkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQUDbmlsCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQFmAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA2CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAwUFZGVidWcJAAIBCQCkAwEFBnJlc3VsdAkAlAoCBQVyYXRlcwUGcmVzdWx0AWkBCWdldFByaWNlcwEFZGVidWcEBmFzc2V0cwkBD2dldE1hcmtldEFzc2V0cwAKAQFmAgVhY2N1bQRuZXh0AwkAZwIFBG5leHQJAJADAQUGYXNzZXRzBQVhY2N1bQQKYXNzZXRQcmljZQkBDWdldFRva2VuUHJpY2UBCQCRAwIFBmFzc2V0cwUEbmV4dAkArAICCQCsAgIJAKwCAgkArAICBQVhY2N1bQkApAMBCAUKYXNzZXRQcmljZQJfMQIBLAkApAMBCAUKYXNzZXRQcmljZQJfMgIBfAQGcmVzdWx0CgACJGwJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUFA25pbAoAAiRzCQCQAwEFAiRsCgAFJGFjYzACAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEBZgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgMFBWRlYnVnCQACAQUGcmVzdWx0CQCUCgIFA25pbAUGcmVzdWx0AWkBGWNhbGN1bGF0ZVV0aWxpemF0aW9uUmF0aW8CCmFzc2V0SWRTdHIFZGVidWcDBQVkZWJ1ZwkAAgEJAKQDAQkBBWdldFVyAQUKYXNzZXRJZFN0cgkAlAoCBQNuaWwJAQVnZXRVcgEFCmFzc2V0SWRTdHIBaQETY2FsY3VsYXRlT3V0ZGF0ZWRVUgIKYXNzZXRJZFN0cgVkZWJ1ZwMFBWRlYnVnCQACAQkApAMBCQENZ2V0T3V0ZGF0ZWRVcgEFCmFzc2V0SWRTdHIJAJQKAgUDbmlsCQENZ2V0T3V0ZGF0ZWRVcgEFCmFzc2V0SWRTdHIBaQETY2FsY3VsYXRlVG9rZW5SYXRlcwEFZGVidWcKAQFmAgVhY2N1bQphc3NldElkU3RyBAVyYXRlcwkBEHRva2VuUmF0ZXNSZWNhbGMBBQphc3NldElkU3RyCQCUCgIJAKwCAgkArAICCQCsAgIJAKwCAggFBWFjY3VtAl8xCQCkAwEICQCRAwIFBXJhdGVzAAEFdmFsdWUCAXwJAKQDAQgJAJEDAgUFcmF0ZXMAAAV2YWx1ZQIBLAkAzggCCAUFYWNjdW0CXzIFBXJhdGVzBAlwYXJhbWV0ZXIKAAIkbAkBD2dldE1hcmtldEFzc2V0cwAKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgICAAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQFmAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA2CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAwUFZGVidWcJAAIBCAUJcGFyYW1ldGVyAl8xCQCUCgIIBQlwYXJhbWV0ZXICXzIIBQlwYXJhbWV0ZXICXzEBaQEXY2FsY3VsYXRlVG9rZW5zSW50ZXJlc3QBBWRlYnVnCgEBZgIFYWNjdW0KYXNzZXRJZFN0cgQEcmF0ZQkAawMJAQtnZXRJbnRlcmVzdAEFCmFzc2V0SWRTdHIFCWRheUJsb2NrcwUGU2NhbGU4CQCsAgIJAKwCAgUFYWNjdW0JAKQDAQUEcmF0ZQIBLAQJcGFyYW1ldGVyCgACJGwJAQ9nZXRNYXJrZXRBc3NldHMACgACJHMJAJADAQUCJGwKAAUkYWNjMAIACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQFmAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA2CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAwUFZGVidWcJAAIBBQlwYXJhbWV0ZXIJAJQKAgUDbmlsBQlwYXJhbWV0ZXIBaQEHcmVTZXR1cAEKYXNzZXRJZFN0cgQLbGFzdFJlc2V0dXAJAQ10cnlHZXRJbnRlZ2VyAQIScmVzZXR1cF9sYXN0VXBkYXRlAwkAZgIFCWRheUJsb2NrcwkAZQIFBmhlaWdodAULbGFzdFJlc2V0dXAJAAIBAiBjYW4gYmUgdXBkYXRlZCBvbmx5IG9uY2UgcGVyIGRheQQDbHRzCQC1CQIJAQx0cnlHZXRTdHJpbmcBAglzZXR1cF9sdHMCASwEBmFzc2V0cwkBD2dldE1hcmtldEFzc2V0cwAEAnVyCQEFZ2V0VXIBBQphc3NldElkU3RyBAZ0ZW1wTFQJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgICBnNldHVwXwUKYXNzZXRJZFN0cgIHX3RlbXBMVAQCbHQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZhc3NldHMJAQV2YWx1ZQEJAM8IAgUGYXNzZXRzBQphc3NldElkU3RyAwkAZgIFAnVyAICV9SoJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICAgZzZXR1cF8FCmFzc2V0SWRTdHICB190ZW1wTFQJAGsDBQZ0ZW1wTFQA900AkE4FA25pbAMDCQBmAgUCbHQFBnRlbXBMVAkAZgIAgJX1KgUCdXIHCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgIGc2V0dXBfBQphc3NldElkU3RyAgdfdGVtcExUCQBrAwUGdGVtcExUAKlOAJBOBQNuaWwFA25pbAFpAQhzaHV0ZG93bgEIc2h1dGRvd24ECXdoaXRlbGlzdAkAzAgCARoBV9fhI1GOfKuIWtXXKJd12Ih104+uIwWm4QkAzAgCARoBV2MNA4Gmf1tU0hy55Cgq86eANPDYtY3VZQkAzAgCARoBV7PVklRJCZoqEPvG+J8QdqvvPw9ypYkVjAkAzAgCARoBV/j6+gImwFGL7Go7RjNJ0hxxsHWL+aTKmgkAzAgCARoBV6Hfrr5FnbmGEdOYYnGJhfRbeUsgh/NHawkAzAgCARoBVzA5HNGkZhg7fn/j2N6i/bhnmP9XTREmnQUDbmlsAwkAAAIJAM8IAgUJd2hpdGVsaXN0CAgFAWkGY2FsbGVyBWJ5dGVzBQR1bml0CQACAQIXdXNlciBub3QgaW4gYSB3aGl0ZWxpc3QJAMwIAgkBDEJvb2xlYW5FbnRyeQICDHNldHVwX2FjdGl2ZQkBASEBBQhzaHV0ZG93bgUDbmlsAQJ0eAEGdmVyaWZ5AAkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleTG6F2E=", "height": 3363700, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 5rrx4aBRqmU2D1DuZFeo3eVmfN1sEi69KHAJcXW5CAUJ Next: FEoSAnFkaQ27emgVFENxgt1PXPufngZegSjj2ruZTtf6 Diff:
OldNewDifferences
155155 func getTokenPrice (assetIdStr) = {
156156 let inv1 = invoke(addressFromStringValue("3P5BTtdj32Sd1Dyh1Mdw33xQAAckSfMfnKf"), "getTWAP60", [assetIdStr, false], nil)
157157 if ((inv1 == inv1))
158- then {
159- let inv2 = invoke(addressFromStringValue("3P8pvmcBi9JeBrnPgWDTaPWrWmGzxiDkpTu"), "getTWAP60", [assetIdStr, false], nil)
160- if ((inv2 == inv2))
161- then {
162- let data1 = match inv1 {
163- case x: (Int, Int) =>
164- x
165- case _ =>
166- throw("error of price oracle")
167- }
168- if ((data1 == data1))
169- then {
170- let data2 = match inv2 {
171- case x: (Int, Int) =>
172- x
173- case _ =>
174- throw("error of price oracle")
175- }
176- if ((data2 == data2))
177- then $Tuple2(min([data1._1, data2._1]), max([data1._2, data2._2]))
178- else throw("Strict value is not equal to itself.")
179- }
180- else throw("Strict value is not equal to itself.")
181- }
182- else throw("Strict value is not equal to itself.")
183- }
158+ then match inv1 {
159+ case x: (Int, Int) =>
160+ x
161+ case _ =>
162+ throw("error of price oracle")
163+ }
184164 else throw("Strict value is not equal to itself.")
185165 }
186166
255235 else {
256236 let assetIdStr = getAssetString(i.payments[0].assetId)
257237 let assetAmount = i.payments[0].amount
258- let $t065496616 = getActualRate(assetIdStr, "sRate")
259- let sRate = $t065496616._1
260- let ratesRecalcResult = $t065496616._2
238+ let $t065466613 = getActualRate(assetIdStr, "sRate")
239+ let sRate = $t065466613._1
240+ let ratesRecalcResult = $t065466613._2
261241 let amount = fraction(assetAmount, Scale16, sRate, DOWN)
262242 let address = toString(i.caller)
263243 if ((indexOf(tryGetString("setup_tokens"), assetIdStr) == unit))
269249
270250 @Callable(i)
271251 func withdraw (assetIdStr,assetAmount) = {
272- let $t071877254 = getActualRate(assetIdStr, "sRate")
273- let sRate = $t071877254._1
274- let ratesRecalcResult = $t071877254._2
252+ let $t071847251 = getActualRate(assetIdStr, "sRate")
253+ let sRate = $t071847251._1
254+ let ratesRecalcResult = $t071847251._2
275255 let amount = fraction(assetAmount, Scale16, sRate, HALFUP)
276256 let address = toString(i.caller)
277257 let assetSupplied = tryGetInteger(("total_supplied_" + assetIdStr))
305285 @Callable(i)
306286 func borrow (assetIdStr,assetAmount) = {
307287 let address = toString(i.caller)
308- let $t087468813 = getActualRate(assetIdStr, "bRate")
309- let bRate = $t087468813._1
310- let ratesRecalcResult = $t087468813._2
288+ let $t087438810 = getActualRate(assetIdStr, "bRate")
289+ let bRate = $t087438810._1
290+ let ratesRecalcResult = $t087438810._2
311291 let amount = fraction(assetAmount, Scale16, bRate, CEILING)
312292 let collateralValueInv = invoke(this, "getUserCollateral", [false, address, true, ((assetIdStr + ",borrowed,") + toString(amount))], nil)
313293 if ((collateralValueInv == collateralValueInv))
346326 else {
347327 let assetIdStr = getAssetString(i.payments[0].assetId)
348328 let assetAmount = i.payments[0].amount
349- let $t01023710304 = getActualRate(assetIdStr, "bRate")
350- let bRate = $t01023710304._1
351- let ratesRecalcResult = $t01023710304._2
329+ let $t01023410301 = getActualRate(assetIdStr, "bRate")
330+ let bRate = $t01023410301._1
331+ let ratesRecalcResult = $t01023410301._2
352332 let amount = fraction(assetAmount, Scale16, bRate)
353333 let address = toString(i.caller)
354334 let assetSupplied = tryGetInteger(("total_supplied_" + assetIdStr))
376356 let userCollateral = calcUserCollateral(address)
377357 if ((userCollateral == userCollateral))
378358 then {
379- let $t01166811737 = getActualRate(sAssetIdStr, "sRate")
380- let sRate = $t01166811737._1
381- let ratesRecalcResult1 = $t01166811737._2
382- let $t01174211811 = getActualRate(bAssetIdStr, "bRate")
383- let bRate = $t01174211811._1
384- let ratesRecalcResult2 = $t01174211811._2
359+ let $t01166511734 = getActualRate(sAssetIdStr, "sRate")
360+ let sRate = $t01166511734._1
361+ let ratesRecalcResult1 = $t01166511734._2
362+ let $t01173911808 = getActualRate(bAssetIdStr, "bRate")
363+ let bRate = $t01173911808._1
364+ let ratesRecalcResult2 = $t01173911808._2
385365 let sAssetAmount = fraction(assetAmount, Scale16, sRate)
386366 let currentSPosition = tryGetInteger(((address + "_supplied_") + sAssetIdStr))
387367 let currentBPosition = tryGetInteger(((address + "_borrowed_") + bAssetIdStr))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let Scale8 = 100000000
55
66 let Scale10 = 10000000000
77
88 let Scale16 = (Scale8 * Scale8)
99
1010 let reserveFund = 20
1111
1212 let dayBlocks = 1440
1313
1414 func tryGetInteger (key) = match getInteger(this, key) {
1515 case b: Int =>
1616 b
1717 case _ =>
1818 0
1919 }
2020
2121
2222 func tryGetBoolean (key) = match getBoolean(this, key) {
2323 case b: Boolean =>
2424 b
2525 case _ =>
2626 false
2727 }
2828
2929
3030 func tryGetString (key) = match getString(this, key) {
3131 case b: String =>
3232 b
3333 case _ =>
3434 ""
3535 }
3636
3737
3838 func getAssetString (assetId) = match assetId {
3939 case b: ByteVector =>
4040 toBase58String(b)
4141 case _ =>
4242 "WAVES"
4343 }
4444
4545
4646 func getAssetBytes (assetIdStr) = if ((assetIdStr == "WAVES"))
4747 then unit
4848 else fromBase58String(assetIdStr)
4949
5050
5151 func getBalance (assetIdStr) = if ((assetIdStr == "WAVES"))
5252 then wavesBalance(this).available
5353 else assetBalance(this, fromBase58String(assetIdStr))
5454
5555
5656 func getMarketAssets () = split(tryGetString("setup_tokens"), ",")
5757
5858
5959 func getOutdatedUr (assetIdStr) = {
6060 let down = fraction(tryGetInteger(("total_supplied_" + assetIdStr)), tryGetInteger((assetIdStr + "_sRate")), Scale16)
6161 if ((down == 0))
6262 then 0
6363 else fraction(Scale8, fraction(tryGetInteger(("total_borrowed_" + assetIdStr)), tryGetInteger((assetIdStr + "_bRate")), Scale16), down)
6464 }
6565
6666
6767 func getRateCurve (assetIdStr) = match assetIdStr {
6868 case _ =>
6969 if (("34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ" == $match0))
7070 then $Tuple4(2000000, 25000000, 80000000, 100000000)
7171 else if (("DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p" == $match0))
7272 then $Tuple4(2000000, 25000000, 80000000, 100000000)
7373 else if (("Ajso6nTTjptu2UHLx6hfSXVtHFtRBJCkKYd5SAyj7zf5" == $match0))
7474 then $Tuple4(2000000, 40000000, 80000000, 150000000)
7575 else if (("HEB8Qaw9xrWpWs8tHsiATYGBWDBtP2S7kcPALrMu43AS" == $match0))
7676 then $Tuple4(0, 20000000, 80000000, 40000000)
7777 else if (("WAVES" == $match0))
7878 then $Tuple4(2000000, 30000000, 80000000, 50000000)
7979 else $Tuple4(0, 20000000, 80000000, 80000000)
8080 }
8181
8282
8383 func getInterest (assetIdStr) = {
8484 let ur = getOutdatedUr(assetIdStr)
8585 let curve = getRateCurve(assetIdStr)
8686 let rate = (curve._1 + (if ((curve._3 >= ur))
8787 then fraction(ur, curve._2, curve._3)
8888 else (curve._2 + fraction((ur - curve._3), (curve._4 - curve._2), (100000000 - curve._3)))))
8989 max([fraction(rate, Scale8, (dayBlocks * 365)), 1])
9090 }
9191
9292
9393 func tokenRatesRecalc (assetIdStr) = {
9494 let interest = getInterest(assetIdStr)
9595 let ur = getOutdatedUr(assetIdStr)
9696 let lastRecalcHeight = tryGetInteger("lastRateHeight")
9797 let lastBRate = max([tryGetInteger((assetIdStr + "_bRate")), Scale16])
9898 let newBRate = (lastBRate + ((height - lastRecalcHeight) * interest))
9999 let lastSRate = max([tryGetInteger((assetIdStr + "_sRate")), Scale16])
100100 let newSRate = (lastSRate + ((((height - lastRecalcHeight) * fraction(interest, ur, Scale8)) * (100 - reserveFund)) / 100))
101101 [IntegerEntry((assetIdStr + "_sRate"), newSRate), IntegerEntry((assetIdStr + "_bRate"), newBRate), IntegerEntry("lastRateHeight", height)]
102102 }
103103
104104
105105 func getActualRate (assetIdStr,rateType) = {
106106 func f (accum,token) = {
107107 let recalc = tokenRatesRecalc(token)
108108 $Tuple2(if ((token != assetIdStr))
109109 then accum._1
110110 else if ((rateType == "sRate"))
111111 then recalc[0].value
112112 else recalc[1].value, (accum._2 ++ recalc))
113113 }
114114
115115 let $l = getMarketAssets()
116116 let $s = size($l)
117117 let $acc0 = $Tuple2(0, nil)
118118 func $f0_1 ($a,$i) = if (($i >= $s))
119119 then $a
120120 else f($a, $l[$i])
121121
122122 func $f0_2 ($a,$i) = if (($i >= $s))
123123 then $a
124124 else throw("List size exceeds 6")
125125
126126 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
127127 }
128128
129129
130130 func getUr (assetIdStr) = {
131131 let rates = tokenRatesRecalc(assetIdStr)
132132 let down = fraction(tryGetInteger(("total_supplied_" + assetIdStr)), rates[0].value, Scale16)
133133 fraction(Scale8, fraction(tryGetInteger(("total_borrowed_" + assetIdStr)), rates[1].value, Scale16), down)
134134 }
135135
136136
137137 func ratesRecalc () = {
138138 func f (accum,token) = (accum ++ tokenRatesRecalc(token))
139139
140140 let $l = getMarketAssets()
141141 let $s = size($l)
142142 let $acc0 = nil
143143 func $f0_1 ($a,$i) = if (($i >= $s))
144144 then $a
145145 else f($a, $l[$i])
146146
147147 func $f0_2 ($a,$i) = if (($i >= $s))
148148 then $a
149149 else throw("List size exceeds 6")
150150
151151 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
152152 }
153153
154154
155155 func getTokenPrice (assetIdStr) = {
156156 let inv1 = invoke(addressFromStringValue("3P5BTtdj32Sd1Dyh1Mdw33xQAAckSfMfnKf"), "getTWAP60", [assetIdStr, false], nil)
157157 if ((inv1 == inv1))
158- then {
159- let inv2 = invoke(addressFromStringValue("3P8pvmcBi9JeBrnPgWDTaPWrWmGzxiDkpTu"), "getTWAP60", [assetIdStr, false], nil)
160- if ((inv2 == inv2))
161- then {
162- let data1 = match inv1 {
163- case x: (Int, Int) =>
164- x
165- case _ =>
166- throw("error of price oracle")
167- }
168- if ((data1 == data1))
169- then {
170- let data2 = match inv2 {
171- case x: (Int, Int) =>
172- x
173- case _ =>
174- throw("error of price oracle")
175- }
176- if ((data2 == data2))
177- then $Tuple2(min([data1._1, data2._1]), max([data1._2, data2._2]))
178- else throw("Strict value is not equal to itself.")
179- }
180- else throw("Strict value is not equal to itself.")
181- }
182- else throw("Strict value is not equal to itself.")
183- }
158+ then match inv1 {
159+ case x: (Int, Int) =>
160+ x
161+ case _ =>
162+ throw("error of price oracle")
163+ }
184164 else throw("Strict value is not equal to itself.")
185165 }
186166
187167
188168 func calcAssetScale (assetIdStr) = {
189169 let decimals = if ((assetIdStr == "WAVES"))
190170 then 8
191171 else value(assetInfo(fromBase58String(assetIdStr))).decimals
192172 pow(10, 0, decimals, 0, 0, DOWN)
193173 }
194174
195175
196176 func calcUserCollateral (address) = {
197177 let userCollateralInvoke = invoke(this, "getUserCollateral", [false, address, true, ""], nil)
198178 if ((userCollateralInvoke == userCollateralInvoke))
199179 then {
200180 let userCollateralValue = match userCollateralInvoke {
201181 case x: Int =>
202182 x
203183 case _ =>
204184 throw("issue while doing in-dapp invocation")
205185 }
206186 if ((userCollateralValue == userCollateralValue))
207187 then userCollateralValue
208188 else throw("Strict value is not equal to itself.")
209189 }
210190 else throw("Strict value is not equal to itself.")
211191 }
212192
213193
214194 @Callable(i)
215195 func preInit (tokens,ltvs,lts,penalties) = {
216196 func f (accum,token) = (accum ++ [IntegerEntry((token + "_bRate"), Scale16), IntegerEntry((token + "_sRate"), Scale16)])
217197
218198 if ((i.caller != this))
219199 then throw("admin only")
220200 else {
221201 let rates = {
222202 let $l = split(tokens, ",")
223203 let $s = size($l)
224204 let $acc0 = nil
225205 func $f0_1 ($a,$i) = if (($i >= $s))
226206 then $a
227207 else f($a, $l[$i])
228208
229209 func $f0_2 ($a,$i) = if (($i >= $s))
230210 then $a
231211 else throw("List size exceeds 6")
232212
233213 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
234214 }
235215 ([StringEntry("setup_tokens", tokens), StringEntry("setup_ltvs", ltvs), StringEntry("setup_lts", lts), StringEntry("setup_penalties", penalties), BooleanEntry("setup_active", true)] ++ rates)
236216 }
237217 }
238218
239219
240220
241221 @Callable(i)
242222 func updateParameter (key,val) = if ((i.caller != this))
243223 then throw("admin only")
244224 else [StringEntry(key, val)]
245225
246226
247227
248228 @Callable(i)
249229 func supply () = if (!(tryGetBoolean("setup_active")))
250230 then throw("market is stopped")
251231 else if (if ((size(i.payments) != 1))
252232 then true
253233 else (i.payments[0].amount == 0))
254234 then throw("1 payment has to be attached")
255235 else {
256236 let assetIdStr = getAssetString(i.payments[0].assetId)
257237 let assetAmount = i.payments[0].amount
258- let $t065496616 = getActualRate(assetIdStr, "sRate")
259- let sRate = $t065496616._1
260- let ratesRecalcResult = $t065496616._2
238+ let $t065466613 = getActualRate(assetIdStr, "sRate")
239+ let sRate = $t065466613._1
240+ let ratesRecalcResult = $t065466613._2
261241 let amount = fraction(assetAmount, Scale16, sRate, DOWN)
262242 let address = toString(i.caller)
263243 if ((indexOf(tryGetString("setup_tokens"), assetIdStr) == unit))
264244 then throw("this asset is not supported by the market")
265245 else ([IntegerEntry(((address + "_supplied_") + assetIdStr), (tryGetInteger(((address + "_supplied_") + assetIdStr)) + amount)), IntegerEntry(("total_supplied_" + assetIdStr), (tryGetInteger(("total_supplied_" + assetIdStr)) + amount))] ++ ratesRecalcResult)
266246 }
267247
268248
269249
270250 @Callable(i)
271251 func withdraw (assetIdStr,assetAmount) = {
272- let $t071877254 = getActualRate(assetIdStr, "sRate")
273- let sRate = $t071877254._1
274- let ratesRecalcResult = $t071877254._2
252+ let $t071847251 = getActualRate(assetIdStr, "sRate")
253+ let sRate = $t071847251._1
254+ let ratesRecalcResult = $t071847251._2
275255 let amount = fraction(assetAmount, Scale16, sRate, HALFUP)
276256 let address = toString(i.caller)
277257 let assetSupplied = tryGetInteger(("total_supplied_" + assetIdStr))
278258 let assetBorrowed = tryGetInteger(("total_borrowed_" + assetIdStr))
279259 let userAssetSupplied = tryGetInteger(((address + "_supplied_") + assetIdStr))
280260 let userAssetBorrowed = tryGetInteger(((address + "_borrowed_") + assetIdStr))
281261 let collateralValueInv = invoke(this, "getUserCollateral", [false, address, true, ((assetIdStr + ",supplied,") + toString(-(amount)))], nil)
282262 if ((collateralValueInv == collateralValueInv))
283263 then {
284264 let collateralValue = match collateralValueInv {
285265 case x: Int =>
286266 x
287267 case _ =>
288268 throw("can't get user collateral value")
289269 }
290270 if (!(tryGetBoolean("setup_active")))
291271 then throw("market is stopped")
292272 else if ((0 > collateralValue))
293273 then throw("you dont have enough collateral for this operation")
294274 else if ((amount > (assetSupplied - assetBorrowed)))
295275 then throw("this amount is not available on the market")
296276 else if ((amount > (userAssetSupplied - userAssetBorrowed)))
297277 then throw("this amount is not available for this user")
298278 else ([IntegerEntry(((address + "_supplied_") + assetIdStr), (tryGetInteger(((address + "_supplied_") + assetIdStr)) - amount)), IntegerEntry(("total_supplied_" + assetIdStr), (tryGetInteger(("total_supplied_" + assetIdStr)) - amount)), ScriptTransfer(i.caller, assetAmount, getAssetBytes(assetIdStr))] ++ ratesRecalcResult)
299279 }
300280 else throw("Strict value is not equal to itself.")
301281 }
302282
303283
304284
305285 @Callable(i)
306286 func borrow (assetIdStr,assetAmount) = {
307287 let address = toString(i.caller)
308- let $t087468813 = getActualRate(assetIdStr, "bRate")
309- let bRate = $t087468813._1
310- let ratesRecalcResult = $t087468813._2
288+ let $t087438810 = getActualRate(assetIdStr, "bRate")
289+ let bRate = $t087438810._1
290+ let ratesRecalcResult = $t087438810._2
311291 let amount = fraction(assetAmount, Scale16, bRate, CEILING)
312292 let collateralValueInv = invoke(this, "getUserCollateral", [false, address, true, ((assetIdStr + ",borrowed,") + toString(amount))], nil)
313293 if ((collateralValueInv == collateralValueInv))
314294 then {
315295 let collateralValue = match collateralValueInv {
316296 case x: Int =>
317297 x
318298 case _ =>
319299 throw("can't get user collateral value")
320300 }
321301 if (!(tryGetBoolean("setup_active")))
322302 then throw("market is stopped")
323303 else if ((0 > collateralValue))
324304 then throw("you have to supply more to borrow")
325305 else {
326306 let assetSupplied = tryGetInteger(("total_supplied_" + assetIdStr))
327307 let assetBorrowed = tryGetInteger(("total_borrowed_" + assetIdStr))
328308 let userAssetBorrowed = tryGetInteger(((address + "_borrowed_") + assetIdStr))
329309 if ((amount > (assetSupplied - assetBorrowed)))
330310 then throw("this amount is not available")
331311 else ([IntegerEntry(((address + "_borrowed_") + assetIdStr), (userAssetBorrowed + amount)), IntegerEntry(("total_borrowed_" + assetIdStr), (assetBorrowed + amount)), ScriptTransfer(i.caller, assetAmount, getAssetBytes(assetIdStr))] ++ ratesRecalcResult)
332312 }
333313 }
334314 else throw("Strict value is not equal to itself.")
335315 }
336316
337317
338318
339319 @Callable(i)
340320 func repay () = if (!(tryGetBoolean("setup_active")))
341321 then throw("market is stopped")
342322 else if (if ((size(i.payments) != 1))
343323 then true
344324 else (i.payments[0].amount == 0))
345325 then throw("1 payment has to be attached")
346326 else {
347327 let assetIdStr = getAssetString(i.payments[0].assetId)
348328 let assetAmount = i.payments[0].amount
349- let $t01023710304 = getActualRate(assetIdStr, "bRate")
350- let bRate = $t01023710304._1
351- let ratesRecalcResult = $t01023710304._2
329+ let $t01023410301 = getActualRate(assetIdStr, "bRate")
330+ let bRate = $t01023410301._1
331+ let ratesRecalcResult = $t01023410301._2
352332 let amount = fraction(assetAmount, Scale16, bRate)
353333 let address = toString(i.caller)
354334 let assetSupplied = tryGetInteger(("total_supplied_" + assetIdStr))
355335 let assetBorrowed = tryGetInteger(("total_borrowed_" + assetIdStr))
356336 let userAssetBorrowed = tryGetInteger(((address + "_borrowed_") + assetIdStr))
357337 let amountLeft = (userAssetBorrowed - amount)
358338 let repayAmount = if ((amountLeft >= 0))
359339 then amount
360340 else userAssetBorrowed
361341 if ((indexOf(tryGetString("setup_tokens"), assetIdStr) == unit))
362342 then throw("this asset is not supported by the market")
363343 else (([IntegerEntry(((address + "_borrowed_") + assetIdStr), (userAssetBorrowed - repayAmount)), IntegerEntry(("total_borrowed_" + assetIdStr), (assetBorrowed - repayAmount))] ++ ratesRecalcResult) ++ (if ((amountLeft >= 0))
364344 then nil
365345 else [ScriptTransfer(i.caller, -(amountLeft), i.payments[0].assetId)]))
366346 }
367347
368348
369349
370350 @Callable(i)
371351 func liquidate (debug,address,assetAmount,sAssetIdStr,bAssetIdStr,routeStr) = if ((i.caller != Address(base58'3PCqdm1mAoQqR46oZotFanmqb5CLUvrKEo2')))
372352 then throw("temporarily listed for whitelist only")
373353 else if (!(tryGetBoolean("setup_active")))
374354 then throw("market is stopped")
375355 else {
376356 let userCollateral = calcUserCollateral(address)
377357 if ((userCollateral == userCollateral))
378358 then {
379- let $t01166811737 = getActualRate(sAssetIdStr, "sRate")
380- let sRate = $t01166811737._1
381- let ratesRecalcResult1 = $t01166811737._2
382- let $t01174211811 = getActualRate(bAssetIdStr, "bRate")
383- let bRate = $t01174211811._1
384- let ratesRecalcResult2 = $t01174211811._2
359+ let $t01166511734 = getActualRate(sAssetIdStr, "sRate")
360+ let sRate = $t01166511734._1
361+ let ratesRecalcResult1 = $t01166511734._2
362+ let $t01173911808 = getActualRate(bAssetIdStr, "bRate")
363+ let bRate = $t01173911808._1
364+ let ratesRecalcResult2 = $t01173911808._2
385365 let sAssetAmount = fraction(assetAmount, Scale16, sRate)
386366 let currentSPosition = tryGetInteger(((address + "_supplied_") + sAssetIdStr))
387367 let currentBPosition = tryGetInteger(((address + "_borrowed_") + bAssetIdStr))
388368 if ((userCollateral > 0))
389369 then throw("user can't be liquidated")
390370 else if ((sAssetAmount > currentSPosition))
391371 then throw("position to liquidate is bigger than user's supply")
392372 else {
393373 let aggregatorAddress = Address(base58'3PGFHzVGT4NTigwCKP1NcwoXkodVZwvBuuU')
394374 let balance0Before = getBalance(sAssetIdStr)
395375 if ((balance0Before == balance0Before))
396376 then {
397377 let balance1Before = getBalance(bAssetIdStr)
398378 if ((balance1Before == balance1Before))
399379 then {
400380 let exchangeInvoke = invoke(aggregatorAddress, "swap", [routeStr, 0], [AttachedPayment(getAssetBytes(sAssetIdStr), assetAmount)])
401381 if ((exchangeInvoke == exchangeInvoke))
402382 then {
403383 let asset0Sold = (balance0Before - getBalance(sAssetIdStr))
404384 if ((asset0Sold == asset0Sold))
405385 then {
406386 let asset1Bought = (getBalance(bAssetIdStr) - balance1Before)
407387 if ((asset1Bought == asset1Bought))
408388 then {
409389 let asset0Price = getTokenPrice(sAssetIdStr)._2
410390 let asset0Scale = calcAssetScale(sAssetIdStr)
411391 let asset0Usd = fraction(asset0Sold, asset0Price, asset0Scale)
412392 let asset1Price = getTokenPrice(bAssetIdStr)._1
413393 let asset1Scale = calcAssetScale(bAssetIdStr)
414394 let asset1Usd = fraction(asset1Bought, asset1Price, asset1Scale)
415395 let penalty = parseIntValue(split(tryGetString("setup_penalties"), ",")[value(indexOf(getMarketAssets(), bAssetIdStr))])
416396 let liquidationProfit = (asset1Usd - fraction(asset0Usd, (Scale8 - penalty), Scale8))
417397 let sAssetChange = fraction(asset0Sold, Scale16, sRate)
418398 let bAssetChange = fraction(asset1Bought, Scale16, bRate)
419399 if ((asset0Sold > assetAmount))
420400 then throw("more assets exchanged than expected")
421401 else if ((0 > liquidationProfit))
422402 then throw("price impact is bigger than liquidation penalty")
423403 else [IntegerEntry(((address + "_supplied_") + sAssetIdStr), (currentSPosition - sAssetChange)), IntegerEntry(((address + "_borrowed_") + bAssetIdStr), (currentBPosition - bAssetChange)), IntegerEntry(("total_supplied_" + sAssetIdStr), (tryGetInteger(("total_supplied_" + sAssetIdStr)) - sAssetChange)), IntegerEntry(("total_borrowed_" + bAssetIdStr), (tryGetInteger(("total_borrowed_" + bAssetIdStr)) - bAssetChange)), ScriptTransfer(i.caller, liquidationProfit, getAssetBytes(bAssetIdStr))]
424404 }
425405 else throw("Strict value is not equal to itself.")
426406 }
427407 else throw("Strict value is not equal to itself.")
428408 }
429409 else throw("Strict value is not equal to itself.")
430410 }
431411 else throw("Strict value is not equal to itself.")
432412 }
433413 else throw("Strict value is not equal to itself.")
434414 }
435415 }
436416 else throw("Strict value is not equal to itself.")
437417 }
438418
439419
440420
441421 @Callable(i)
442422 func getUserCollateral (debug,address,minusBorrowed,afterChange) = {
443423 let assets = getMarketAssets()
444424 let ltvs = split(tryGetString("setup_ltvs"), ",")
445425 let lts = split(tryGetString("setup_lts"), ",")
446426 let rates = getActualRate(assets[0], "sRate")._2
447427 let changeHandler = split(afterChange, ",")
448428 func f (accum,next) = if ((next >= size(assets)))
449429 then accum
450430 else {
451431 let decimals = if ((assets[next] == "WAVES"))
452432 then 8
453433 else value(assetInfo(fromBase58String(assets[next]))).decimals
454434 let assetScale = pow(10, 0, decimals, 0, 0, DOWN)
455435 let assetPrice = getTokenPrice(assets[next])
456436 ((accum + fraction(fraction(fraction((tryGetInteger(((address + "_supplied_") + assets[next])) + (if (if (if ((afterChange != ""))
457437 then (changeHandler[0] == assets[next])
458438 else false)
459439 then (changeHandler[1] == "supplied")
460440 else false)
461441 then parseIntValue(changeHandler[2])
462442 else 0)), rates[(next * 3)].value, Scale16), parseIntValue(ltvs[next]), Scale8), assetPrice._1, assetScale)) - (if (minusBorrowed)
463443 then fraction(fraction(fraction((tryGetInteger(((address + "_borrowed_") + assets[next])) + (if (if (if ((afterChange != ""))
464444 then (changeHandler[0] == assets[next])
465445 else false)
466446 then (changeHandler[1] == "borrowed")
467447 else false)
468448 then parseIntValue(changeHandler[2])
469449 else 0)), rates[((next * 3) + 1)].value, Scale16), Scale8, parseIntValue(lts[next])), assetPrice._2, assetScale)
470450 else 0))
471451 }
472452
473453 let result = {
474454 let $l = [0, 1, 2, 3, 4, 5]
475455 let $s = size($l)
476456 let $acc0 = 0
477457 func $f0_1 ($a,$i) = if (($i >= $s))
478458 then $a
479459 else f($a, $l[$i])
480460
481461 func $f0_2 ($a,$i) = if (($i >= $s))
482462 then $a
483463 else throw("List size exceeds 6")
484464
485465 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
486466 }
487467 if (debug)
488468 then throw(toString(result))
489469 else $Tuple2(rates, result)
490470 }
491471
492472
493473
494474 @Callable(i)
495475 func getPrices (debug) = {
496476 let assets = getMarketAssets()
497477 func f (accum,next) = if ((next >= size(assets)))
498478 then accum
499479 else {
500480 let assetPrice = getTokenPrice(assets[next])
501481 ((((accum + toString(assetPrice._1)) + ",") + toString(assetPrice._2)) + "|")
502482 }
503483
504484 let result = {
505485 let $l = [0, 1, 2, 3, 4, 5]
506486 let $s = size($l)
507487 let $acc0 = ""
508488 func $f0_1 ($a,$i) = if (($i >= $s))
509489 then $a
510490 else f($a, $l[$i])
511491
512492 func $f0_2 ($a,$i) = if (($i >= $s))
513493 then $a
514494 else throw("List size exceeds 6")
515495
516496 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
517497 }
518498 if (debug)
519499 then throw(result)
520500 else $Tuple2(nil, result)
521501 }
522502
523503
524504
525505 @Callable(i)
526506 func calculateUtilizationRatio (assetIdStr,debug) = if (debug)
527507 then throw(toString(getUr(assetIdStr)))
528508 else $Tuple2(nil, getUr(assetIdStr))
529509
530510
531511
532512 @Callable(i)
533513 func calculateOutdatedUR (assetIdStr,debug) = if (debug)
534514 then throw(toString(getOutdatedUr(assetIdStr)))
535515 else $Tuple2(nil, getOutdatedUr(assetIdStr))
536516
537517
538518
539519 @Callable(i)
540520 func calculateTokenRates (debug) = {
541521 func f (accum,assetIdStr) = {
542522 let rates = tokenRatesRecalc(assetIdStr)
543523 $Tuple2(((((accum._1 + toString(rates[1].value)) + "|") + toString(rates[0].value)) + ","), (accum._2 ++ rates))
544524 }
545525
546526 let parameter = {
547527 let $l = getMarketAssets()
548528 let $s = size($l)
549529 let $acc0 = $Tuple2("", nil)
550530 func $f0_1 ($a,$i) = if (($i >= $s))
551531 then $a
552532 else f($a, $l[$i])
553533
554534 func $f0_2 ($a,$i) = if (($i >= $s))
555535 then $a
556536 else throw("List size exceeds 6")
557537
558538 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
559539 }
560540 if (debug)
561541 then throw(parameter._1)
562542 else $Tuple2(parameter._2, parameter._1)
563543 }
564544
565545
566546
567547 @Callable(i)
568548 func calculateTokensInterest (debug) = {
569549 func f (accum,assetIdStr) = {
570550 let rate = fraction(getInterest(assetIdStr), dayBlocks, Scale8)
571551 ((accum + toString(rate)) + ",")
572552 }
573553
574554 let parameter = {
575555 let $l = getMarketAssets()
576556 let $s = size($l)
577557 let $acc0 = ""
578558 func $f0_1 ($a,$i) = if (($i >= $s))
579559 then $a
580560 else f($a, $l[$i])
581561
582562 func $f0_2 ($a,$i) = if (($i >= $s))
583563 then $a
584564 else throw("List size exceeds 6")
585565
586566 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
587567 }
588568 if (debug)
589569 then throw(parameter)
590570 else $Tuple2(nil, parameter)
591571 }
592572
593573
594574
595575 @Callable(i)
596576 func reSetup (assetIdStr) = {
597577 let lastResetup = tryGetInteger("resetup_lastUpdate")
598578 if ((dayBlocks > (height - lastResetup)))
599579 then throw("can be updated only once per day")
600580 else {
601581 let lts = split(tryGetString("setup_lts"), ",")
602582 let assets = getMarketAssets()
603583 let ur = getUr(assetIdStr)
604584 let tempLT = tryGetInteger((("setup_" + assetIdStr) + "_tempLT"))
605585 let lt = parseIntValue(assets[value(indexOf(assets, assetIdStr))])
606586 if ((ur > 90000000))
607587 then [IntegerEntry((("setup_" + assetIdStr) + "_tempLT"), fraction(tempLT, 9975, 10000))]
608588 else if (if ((lt > tempLT))
609589 then (90000000 > ur)
610590 else false)
611591 then [IntegerEntry((("setup_" + assetIdStr) + "_tempLT"), fraction(tempLT, 10025, 10000))]
612592 else nil
613593 }
614594 }
615595
616596
617597
618598 @Callable(i)
619599 func shutdown (shutdown) = {
620600 let whitelist = [base58'3PMcMiMEs6w56NRGacksXtFG5zS7doE9fpL', base58'3PAxdDSmN758L5SHSGRC5apEtQE2aApZotG', base58'3PJKmXoHJvVeQXjSJdhtkUcFDtdiQqMbUTD', base58'3PQdNxynJy5mche2kxMVc5shXWzK8Gstq3o', base58'3PGgoUsQX3a5zGCc4e2nEnDCWAkzJ1jASzv', base58'3P6Ksahs71SiKQgQ4qaZuFAVhqncdi2nvJQ']
621601 if ((indexOf(whitelist, i.caller.bytes) == unit))
622602 then throw("user not in a whitelist")
623603 else [BooleanEntry("setup_active", !(shutdown))]
624604 }
625605
626606
627607 @Verifier(tx)
628608 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
629609

github/deemru/w8io/6500d08 
100.72 ms