tx · GXeptUFu1Z2v2tiQG2CLhDiLhBuNaMHpozfgmTtBhqUk

3PAd9Aqg3cQSzu26MFYWQYcjSXPVCJtuf5V:  -0.03800000 Waves

2024.02.21 11:00 [4051519] smart account 3PAd9Aqg3cQSzu26MFYWQYcjSXPVCJtuf5V > SELF 0.00000000 Waves

{ "type": 13, "id": "GXeptUFu1Z2v2tiQG2CLhDiLhBuNaMHpozfgmTtBhqUk", "fee": 3800000, "feeAssetId": null, "timestamp": 1708502233911, "version": 2, "chainId": 87, "sender": "3PAd9Aqg3cQSzu26MFYWQYcjSXPVCJtuf5V", "senderPublicKey": "Ajf56x532JLzVoourPv9FW75kYsvScNxztPnt1enhNkS", "proofs": [ "4rQNNzQHYcUS1KJTKpLfetwjQVdV3hWMfA25Eo6HihpihCJsK78AAWYfJg8HRZhCjof3u71bdtBg8LGeSRSvyZLB" ], "script": "base64:BgKFAQgCEgkKBwgICAEICAgSABIECgIIARIECgIICBIAEgYKBAgICAgSBgoECAgICBIDCgEIEgQKAggIEgQKAggIEgMKAQQSAwoBBBIHCgUECAgIARIGCgQECAQIEggKBgQICAgECBIFCgMECAgSAwoBBBIECgIIBBIECgIIBBIDCgEEEgMKAQQjAAdrQXhseUxwAgdfYXhseUxQAAtheGx5QWRkcmVzcwkBB0FkZHJlc3MBARoBV8/Idd4LdvyJm/d7rwlIRGcJKlBHPw9CLQASYXhseUZhcm1pbmdBZGRyZXNzCQEHQWRkcmVzcwEBGgFXDQFZljUUcJnmXN0+OyddE1iluc01XeXCABJyZXNlcnZlRnVuZEFkZHJlc3MJAQdBZGRyZXNzAQEaAVce4ftAMWuB5uxLVhsFLFGhk27fCbE80sEAC3Jlc2VydmVGdW5kABQAEWFnZ3JlZ2F0b3JBZGRyZXNzCQEHQWRkcmVzcwEBGgFXnQyqxhNRqW7LgPdjfcFkeOLvck2oDLrTABFzaHV0ZG93bldoaXRlbGlzdAkAzAgCARoBV9fhI1GOfKuIWtXXKJd12Ih104+uIwWm4QkAzAgCARoBV2MNA4Gmf1tU0hy55Cgq86eANPDYtY3VZQkAzAgCARoBV7PVklRJCZoqEPvG+J8QdqvvPw9ypYkVjAkAzAgCARoBV/j6+gImwFGL7Go7RjNJ0hxxsHWL+aTKmgkAzAgCARoBV6vdqiLzmLkfRdgs1Kfq+RJir4k2alA7cgkAzAgCARoBVzA5HNGkZhg7fn/j2N6i/bhnmP9XTREmnQUDbmlsARZ2ZXJpZnlMaXF1aWRhdG9yUmlnaHRzAQdhZGRyZXNzCQEBIQEDAwMJAQIhPQIFB2FkZHJlc3MJAQdBZGRyZXNzAQEaAVeSeT23spbzYUQF9BURtBNTlIXBLbXH97MJAQIhPQIFB2FkZHJlc3MJAQdBZGRyZXNzAQEaAVd3qs7ReFboqZ5eq5Xvv+nhcVh1XjKacYEHCQECIT0CBQdhZGRyZXNzCQEHQWRkcmVzcwEBGgFX1+EjUY58q4ha1dcol3XYiHXTj64jBabhBwkBAiE9AgUHYWRkcmVzcwkBB0FkZHJlc3MBARoBV6vdqiLzmLkfRdgs1Kfq+RJir4k2alA7cgcBFHZlcmlmeVNlbnRpbmVsUmlnaHRzAQdhZGRyZXNzCQEBIQEDCQECIT0CBQdhZGRyZXNzBRJyZXNlcnZlRnVuZEFkZHJlc3MJAQIhPQIFB2FkZHJlc3MFC2F4bHlBZGRyZXNzBwEMZ2V0UmF0ZUN1cnZlAQphc3NldElkU3RyBAckbWF0Y2gwBQphc3NldElkU3RyAwkAAAICLDl3YzNMWE5BNFRFQnNYeUt0b0xFOW1yYkREN1dNSFh2WHJDalp2YWJMQXNpBQckbWF0Y2gwCQCWCgQAgIl6AMDw9QsAgOiSJgCAwtcvAwkAAAICLEhHZ2FiVHFVUzhXdFZGVUp6Zm1yVERNZ0VjY0p1WkxCUGhGZ1FGeHZuc29XBQckbWF0Y2gwCQCWCgQAgIl6AMDw9QsAgOiSJgCAwtcvAwkAAAICLDM0TjlZY0VFVExXbjkzcVlRNjRFc1AxeDg5dFNydUpVNDRSckVNU1hYRVBKBQckbWF0Y2gwCQCWCgQAgIl6AMDw9QsAgOiSJgCAwtcvAwkAAAICLDZYdEhqcFhiczlSUkpQMlNyOUdVeVZxekFDY2J5OVRrVGhIWG5qVkM1Q0RKBQckbWF0Y2gwCQCWCgQAgIl6AMDw9QsAgOiSJgCAwtcvAwkAAAICLERHMnhGa1BkRHdLVW9Ca3pHQWhRdExwU0d6ZlhMaUNZUEV6ZUtIMkFkMjRwBQckbWF0Y2gwCQCWCgQAgIl6AMDw9QsAgOiSJgCAwtcvAwkAAAICLEFqc282blRUanB0dTJVSEx4NmhmU1hWdEhGdFJCSkNrS1lkNVNBeWo3emY1BQckbWF0Y2gwCQCWCgQAgIl6AIC0iRMAgOiSJgCAo8NHAwkAAAICLEhFQjhRYXc5eHJXcFdzOHRIc2lBVFlHQldEQnRQMlM3a2NQQUxyTXU0M0FTBQckbWF0Y2gwCQCWCgQAAACA2sQJAIDokiYAgLSJEwMJAAACAgVXQVZFUwUHJG1hdGNoMAkAlgoEAICJegCAh6cOAIDokiYAgOHrFwMJAAACAixBdHF2NTlFWXpqRkd1aXRLVm5NUms2SDhGdWtqb1Yza3RQb3JiRXlzMjVvbgUHJG1hdGNoMAkAlgoEAAAAgNrECQCA6JImAIC0iRMDCQAAAgIsRFNiYmhMc1NUZURnNUxzaXVmazJBbmVoM0RqVnFKdVByMk05dVUxZ3d5NXAFByRtYXRjaDAJAJYKBAAAAIDaxAkAgOiSJgCAwtcvAwkAAAICLDh0NERQV1R3UHpwYXRIQTlBa1R4V0FCNDdUSG5ZekJzRG5vWTdmUXFiRzkxBQckbWF0Y2gwCQCWCgQAAACAh6cOAIDokiYAgLSJEwMJAAACAixBdDhENk5GRnBoZUNidktWbmpWb2VMTDg0RW84TlpuNm92TWFueGZMYUZXTAUHJG1hdGNoMAkAlgoEAAAAwPD1CwCA6JImAIC0iRMDCQAAAgIsOExRVzhmN1A1ZDVQWk03R3RaRUJnYXFSUEdTelMzRGZQdWlYclVSSjRBSlMFByRtYXRjaDAJAJYKBACAiXoAgIenDgCA6JImAIDh6xcDCQAAAgIsNDc0alRlWXgycjJWYTM1Nzk0dENTY0FYV0pHOWhVMkhjZ3h6TW93YVpVbnUFByRtYXRjaDAJAJYKBACAiXoAgIenDgCA6JImAIDh6xcDCQAAAgIsNVVZQlBwcTRXb1U1bjRNd3BGa2dKblczRnE0QjF1M3VrcEszM2lrNFFlclIFByRtYXRjaDAJAJYKBACAiXoAgIenDgCA6JImAIDh6xcDCQAAAgIsMnRoc0FDdUhtekRNdU5lelBNMzJ3ZzlhM0J3VXpCV0RlU0tha2d6M2N3MjEFByRtYXRjaDAJAJYKBACAiXoAgLSJEwCA6JImAIDC1y8DCQAAAgIrWWlOYm9mRnpDMTdqRUhIQ013clJjcHk5TXJyamFiTU1MWnhnOGc1eG1mNwUHJG1hdGNoMAkAlgoEAICJegCAh6cOAIDokiYAgOiSJgkAlgoEAAAAgNrECQCA6JImAIDokiYABlNjYWxlOACAwtcvAAdTY2FsZTEwAIDIr6AlAAdTY2FsZTE2CQBoAgUGU2NhbGU4BQZTY2FsZTgACWRheUJsb2NrcwCgCwEKbGlJbnRUb1N0cgECbGkKAQFmAgVhY2N1bQRuZXh0CQCsAgIJAKwCAgUFYWNjdW0JAKQDAQUEbmV4dAIBLAoAAiRsBQJsaQoAAiRzCQCQAwEFAiRsCgAFJGFjYzACAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEBZgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIVTGlzdCBzaXplIGV4Y2VlZHMgMTAwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ADoAOwA8AD0APgA/AEAAQQBCAEMARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgBXAFgAWQBaAFsAXABdAF4AXwBgAGEAYgBjAGQBDXRyeUdldEludGVnZXIBA2tleQQHJG1hdGNoMAkAmggCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIDSW50BAFiBQckbWF0Y2gwBQFiAAABDXRyeUdldEJvb2xlYW4BA2tleQQHJG1hdGNoMAkAmwgCBQR0aGlzBQNrZXkDCQABAgUHJG1hdGNoMAIHQm9vbGVhbgQBYgUHJG1hdGNoMAUBYgcBDHRyeUdldFN0cmluZwEDa2V5BAckbWF0Y2gwCQCdCAIFBHRoaXMFA2tleQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWIFByRtYXRjaDAFAWICAAEMdHJ5R2V0QmluYXJ5AQNrZXkEByRtYXRjaDAJAJwIAgUEdGhpcwUDa2V5AwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWIFByRtYXRjaDAFAWIBAAEOZ2V0QXNzZXRTdHJpbmcBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYgUHJG1hdGNoMAkA2AQBBQFiAgVXQVZFUwENZ2V0QXNzZXRCeXRlcwEKYXNzZXRJZFN0cgMJAAACBQphc3NldElkU3RyAgVXQVZFUwUEdW5pdAkA2QQBBQphc3NldElkU3RyAQpnZXRCYWxhbmNlAQphc3NldElkU3RyAwkAAAIFCmFzc2V0SWRTdHICBVdBVkVTCAkA7wcBBQR0aGlzCWF2YWlsYWJsZQkA8AcCBQR0aGlzCQDZBAEFCmFzc2V0SWRTdHIBD2dldE1hcmtldEFzc2V0cwAJALUJAgkBDHRyeUdldFN0cmluZwECDHNldHVwX3Rva2VucwIBLAESZ2V0QXNzZXRzTWF4U3VwcGx5AAQBcwkBDHRyeUdldFN0cmluZwECD3NldHVwX21heHN1cHBseQMJAAACBQFzAgAJAMwIAgD///////////8BCQDMCAIA////////////AQkAzAgCAP///////////wEJAMwIAgD///////////8BCQDMCAIA////////////AQkAzAgCAP///////////wEJAMwIAgD///////////8BBQNuaWwJALUJAgUBcwIBLAENZ2V0T3V0ZGF0ZWRVcgEKYXNzZXRJZFN0cgQEZG93bgkAawMJAQ10cnlHZXRJbnRlZ2VyAQkArAICAg90b3RhbF9zdXBwbGllZF8FCmFzc2V0SWRTdHIJAQ10cnlHZXRJbnRlZ2VyAQkArAICBQphc3NldElkU3RyAgZfc1JhdGUFB1NjYWxlMTYDCQAAAgUEZG93bgAAAAAJAGsDBQZTY2FsZTgJAGsDCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgIPdG90YWxfYm9ycm93ZWRfBQphc3NldElkU3RyCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgUKYXNzZXRJZFN0cgIGX2JSYXRlBQdTY2FsZTE2BQRkb3duAQtnZXRJbnRlcmVzdAEKYXNzZXRJZFN0cgQCdXIJAQ1nZXRPdXRkYXRlZFVyAQUKYXNzZXRJZFN0cgQFY3VydmUJAQxnZXRSYXRlQ3VydmUBBQphc3NldElkU3RyBARyYXRlCQBkAggFBWN1cnZlAl8xAwkAZwIIBQVjdXJ2ZQJfMwUCdXIJAGsDBQJ1cggFBWN1cnZlAl8yCAUFY3VydmUCXzMJAGQCCAUFY3VydmUCXzIJAGsDCQBlAgUCdXIIBQVjdXJ2ZQJfMwgFBWN1cnZlAl80CQBlAgCAwtcvCAUFY3VydmUCXzMJAJYDAQkAzAgCCQBrAwUEcmF0ZQUGU2NhbGU4CQBoAgUJZGF5QmxvY2tzAO0CCQDMCAIAAQUDbmlsARB0b2tlblJhdGVzUmVjYWxjAQphc3NldElkU3RyAwkBDXRyeUdldEJvb2xlYW4BCQCsAgIFCmFzc2V0SWRTdHIFB2tBeGx5THAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUKYXNzZXRJZFN0cgIGX3NSYXRlBQdTY2FsZTE2CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCmFzc2V0SWRTdHICBl9iUmF0ZQUHU2NhbGUxNgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQphc3NldElkU3RyAg9fbGFzdFJhdGVIZWlnaHQFBmhlaWdodAUDbmlsBAhpbnRlcmVzdAkBC2dldEludGVyZXN0AQUKYXNzZXRJZFN0cgQCdXIJAQ1nZXRPdXRkYXRlZFVyAQUKYXNzZXRJZFN0cgQQbGFzdFJlY2FsY0hlaWdodAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFCmFzc2V0SWRTdHICD19sYXN0UmF0ZUhlaWdodAkBDXRyeUdldEludGVnZXIBAg5sYXN0UmF0ZUhlaWdodAQJbGFzdEJSYXRlCQCWAwEJAMwIAgkBDXRyeUdldEludGVnZXIBCQCsAgIFCmFzc2V0SWRTdHICBl9iUmF0ZQkAzAgCBQdTY2FsZTE2BQNuaWwECG5ld0JSYXRlCQBkAgUJbGFzdEJSYXRlCQBoAgkAZQIFBmhlaWdodAUQbGFzdFJlY2FsY0hlaWdodAUIaW50ZXJlc3QECWxhc3RTUmF0ZQkAlgMBCQDMCAIJAQ10cnlHZXRJbnRlZ2VyAQkArAICBQphc3NldElkU3RyAgZfc1JhdGUJAMwIAgUHU2NhbGUxNgUDbmlsBAhuZXdTUmF0ZQkAZAIFCWxhc3RTUmF0ZQkAaQIJAGgCCQBoAgkAZQIFBmhlaWdodAUQbGFzdFJlY2FsY0hlaWdodAkAawMFCGludGVyZXN0BQJ1cgUGU2NhbGU4CQBlAgBkBQtyZXNlcnZlRnVuZABkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCmFzc2V0SWRTdHICBl9zUmF0ZQUIbmV3U1JhdGUJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUKYXNzZXRJZFN0cgIGX2JSYXRlBQhuZXdCUmF0ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQphc3NldElkU3RyAg9fbGFzdFJhdGVIZWlnaHQFBmhlaWdodAUDbmlsAQ1nZXRBY3R1YWxSYXRlAgphc3NldElkU3RyCHJhdGVUeXBlCgEBZgIFYWNjdW0FdG9rZW4EBnJlY2FsYwkBEHRva2VuUmF0ZXNSZWNhbGMBBQV0b2tlbgkA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AJEDAgUFcmF0ZXMAAQV2YWx1ZQUHU2NhbGUxNgUEZG93bgEVZ2V0VG9rZW5QcmljZVdpdGhSaXNrAgphc3NldElkU3RyDHJpc2tBdmVyc2l0eQMDCQAAAgUKYXNzZXRJZFN0cgIsOXdjM0xYTkE0VEVCc1h5S3RvTEU5bXJiREQ3V01IWHZYckNqWnZhYkxBc2kGCQAAAgUKYXNzZXRJZFN0cgIsSEdnYWJUcVVTOFd0VkZVSnpmbXJURE1nRWNjSnVaTEJQaEZnUUZ4dm5zb1cJAJQKAgDAhD0AwIQ9BAVwcmljZQkBEUBleHRyTmF0aXZlKDEwNTApAgkBB0FkZHJlc3MBARoBV0lm0MvzivVXeq38IW9xxVuJiCvQgbOxfwkArAICBQphc3NldElkU3RyAgdfdHdhcDVCBAlyaXNrTGV2ZWwJARFAZXh0ck5hdGl2ZSgxMDUwKQIJAQdBZGRyZXNzAQEaAVdJZtDL84r1V3qt/CFvccVbiYgr0IGzsX8JAKwCAgUKYXNzZXRJZFN0cgIKX3Jpc2tMZXZlbAMJAQ10cnlHZXRCb29sZWFuAQkArAICBQphc3NldElkU3RyBQdrQXhseUxwBAFwCgABQAkA/QcEBQtheGx5QWRkcmVzcwIaZ2V0U2hhcmVBc3NldFByaWNlUkVBRE9OTFkJAMwIAgUKYXNzZXRJZFN0cgUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AwkAAAIFAXAFAXAJAJQKAgUBcAUBcAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgMJAGcCBQxyaXNrQXZlcnNpdHkFCXJpc2tMZXZlbAkAlAoCBQVwcmljZQUFcHJpY2UJAAIBCQCsAgIJAKwCAgIbb3JhY2xlIHByaWNlcyBkb24ndCBtYXRjaDogCQCkAwEFBXByaWNlAiMgaXMgdGhlIHByaWNlLCBidXQgcmlzayBpcyB0b28gaGlnaAENZ2V0VG9rZW5QcmljZQEKYXNzZXRJZFN0cgkBFWdldFRva2VuUHJpY2VXaXRoUmlzawIFCmFzc2V0SWRTdHIAAQEOY2FsY0Fzc2V0U2NhbGUBCmFzc2V0SWRTdHIECGRlY2ltYWxzAwkAAAIFCmFzc2V0SWRTdHICBVdBVkVTAAgICQEFdmFsdWUBCQDsBwEJANkEAQUKYXNzZXRJZFN0cghkZWNpbWFscwkAbAYACgAABQhkZWNpbWFscwAAAAAFBERPV04BDnN1cHBseUludGVybmFsAwphc3NldElkU3RyC2Fzc2V0QW1vdW50B2FkZHJlc3MDCQEBIQEJAQ10cnlHZXRCb29sZWFuAQIMc2V0dXBfYWN0aXZlCQACAQIRbWFya2V0IGlzIHN0b3BwZWQECyR0MDg1Mzc4NjEyCQEVZ2V0QWN0dWFsUmF0ZU9uZVRva2VuAgUKYXNzZXRJZFN0cgIFc1JhdGUEBXNSYXRlCAULJHQwODUzNzg2MTICXzEEEXJhdGVzUmVjYWxjUmVzdWx0CAULJHQwODUzNzg2MTICXzIEBmFtb3VudAkAbgQFC2Fzc2V0QW1vdW50BQdTY2FsZTE2BQVzUmF0ZQUERE9XTgQJbWF4U3VwcGx5BAckbWF0Y2gwCQCiCAEJAKwCAgIQc2V0dXBfbWF4U3VwcGx5XwUKYXNzZXRJZFN0cgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXgFByRtYXRjaDAJAQ1wYXJzZUludFZhbHVlAQUBeAAABAphc3NldFByaWNlCQENZ2V0VG9rZW5QcmljZQEFCmFzc2V0SWRTdHIEEG5ld1RvdGFsU3VwcGxpZWQJAGQCCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICBQdhZGRyZXNzAgpfc3VwcGxpZWRfBQphc3NldElkU3RyBQZhbW91bnQEBHJhdGUFBXNSYXRlBAphc3NldFNjYWxlCQEOY2FsY0Fzc2V0U2NhbGUBBQphc3NldElkU3RyBBNuZXdUb3RhbFN1cHBsaWVkVXNkCQBrAwkAawMFEG5ld1RvdGFsU3VwcGxpZWQFBHJhdGUFB1NjYWxlMTYIBQphc3NldFByaWNlAl8xBQphc3NldFNjYWxlAwkAAAIJALMJAgkBDHRyeUdldFN0cmluZwECDHNldHVwX3Rva2VucwUKYXNzZXRJZFN0cgUEdW5pdAkAAgECKXRoaXMgYXNzZXQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgbWFya2V0AwMJAQIhPQIFCW1heFN1cHBseQAACQBmAgUTbmV3VG90YWxTdXBwbGllZFVzZAUJbWF4U3VwcGx5BwkAAgECM21heCB0b3RhbCBzdXBwbHkgZm9yIHRoaXMgdG9rZW4gcmVhY2hlZCBpbiB0aGUgcG9vbAQIYXNzZXROdW0JAQV2YWx1ZQEJAM8IAgkBD2dldE1hcmtldEFzc2V0cwAFCmFzc2V0SWRTdHIJAJQKAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgUHYWRkcmVzcwIKX3N1cHBsaWVkXwUKYXNzZXRJZFN0cgUQbmV3VG90YWxTdXBwbGllZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAg90b3RhbF9zdXBwbGllZF8FCmFzc2V0SWRTdHIJAGQCCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgIPdG90YWxfc3VwcGxpZWRfBQphc3NldElkU3RyBQZhbW91bnQFA25pbAkAzAgCCQCRAwIFEXJhdGVzUmVjYWxjUmVzdWx0AAAJAMwIAgkAkQMCBRFyYXRlc1JlY2FsY1Jlc3VsdAABCQDMCAIJAJEDAgURcmF0ZXNSZWNhbGNSZXN1bHQAAgUDbmlsCQCUCgIFC2Fzc2V0QW1vdW50BRNuZXdUb3RhbFN1cHBsaWVkVXNkAQ5ib3Jyb3dJbnRlcm5hbAMKYXNzZXRJZFN0cgthc3NldEFtb3VudAdhZGRyZXNzBAskdDA5OTIwOTk5NQkBFWdldEFjdHVhbFJhdGVPbmVUb2tlbgIFCmFzc2V0SWRTdHICBWJSYXRlBAViUmF0ZQgFCyR0MDk5MjA5OTk1Al8xBBFyYXRlc1JlY2FsY1Jlc3VsdAgFCyR0MDk5MjA5OTk1Al8yBAZhbW91bnQJAG4EBQthc3NldEFtb3VudAUHU2NhbGUxNgUFYlJhdGUFB0NFSUxJTkcDCQEBIQEJAQ10cnlHZXRCb29sZWFuAQIMc2V0dXBfYWN0aXZlCQACAQIRbWFya2V0IGlzIHN0b3BwZWQDCQENdHJ5R2V0Qm9vbGVhbgEJAKwCAgUKYXNzZXRJZFN0cgUHa0F4bHlMcAkAAgECHXRoaXMgdG9rZW4gY2Fubm90IGJlIGJvcnJvd2VkBA1hc3NldFN1cHBsaWVkCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgIPdG90YWxfc3VwcGxpZWRfBQphc3NldElkU3RyBA1hc3NldEJvcnJvd2VkCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgIPdG90YWxfYm9ycm93ZWRfBQphc3NldElkU3RyBBF1c2VyQXNzZXRCb3Jyb3dlZAkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgUHYWRkcmVzcwIKX2JvcnJvd2VkXwUKYXNzZXRJZFN0cgQKYXNzZXRTY2FsZQkBDmNhbGNBc3NldFNjYWxlAQUKYXNzZXRJZFN0cgQKYXNzZXRQcmljZQkBDWdldFRva2VuUHJpY2UBBQphc3NldElkU3RyBA5hc3NldEFtb3VudFVzZAkAawMFBmFtb3VudAgFCmFzc2V0UHJpY2UCXzEFCmFzc2V0U2NhbGUDCQBmAgUGYW1vdW50CQBlAgUNYXNzZXRTdXBwbGllZAUNYXNzZXRCb3Jyb3dlZAkAAgECHHRoaXMgYW1vdW50IGlzIG5vdCBhdmFpbGFibGUECGFzc2V0TnVtCQEFdmFsdWUBCQDPCAIJAQ9nZXRNYXJrZXRBc3NldHMABQphc3NldElkU3RyCQCUCgIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIFB2FkZHJlc3MCCl9ib3Jyb3dlZF8FCmFzc2V0SWRTdHIJAGQCBRF1c2VyQXNzZXRCb3Jyb3dlZAUGYW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICD3RvdGFsX2JvcnJvd2VkXwUKYXNzZXRJZFN0cgkAZAIFDWFzc2V0Qm9ycm93ZWQFBmFtb3VudAUDbmlsCQDMCAIJAJEDAgURcmF0ZXNSZWNhbGNSZXN1bHQAAAkAzAgCCQCRAwIFEXJhdGVzUmVjYWxjUmVzdWx0AAEJAMwIAgkAkQMCBRFyYXRlc1JlY2FsY1Jlc3VsdAACBQNuaWwJAJQKAgULYXNzZXRBbW91bnQFDmFzc2V0QW1vdW50VXNkFQFpAQ1mbGFzaFBvc2l0aW9uBwR1c2VyC3NBc3NldElkU3RyC2JBc3NldElkU3RyB2JBbW91bnQPY2FsbGJhY2tBZGRyZXNzEGNhbGxiYWNrRnVuY3Rpb24MY2FsbGJhY2tBcmdzAwkBAiE9AggFAWkGY2FsbGVyBQtheGx5QWRkcmVzcwkAAgECIGF2YWlsYWJsZSBvbmx5IGZvciBBeGx5IHByb3RvY29sBAlib3Jyb3dSZXMJAQ5ib3Jyb3dJbnRlcm5hbAMFC2JBc3NldElkU3RyBQdiQW1vdW50BQR1c2VyBAhiQXNzZXRJZAkBDWdldEFzc2V0Qnl0ZXMBBQtiQXNzZXRJZFN0cgQIY2FsbGJhY2sJAP0HBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUPY2FsbGJhY2tBZGRyZXNzBRBjYWxsYmFja0Z1bmN0aW9uCQC1CQIFDGNhbGxiYWNrQXJncwIBLAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUIYkFzc2V0SWQFB2JBbW91bnQFA25pbAMJAAACBQhjYWxsYmFjawUIY2FsbGJhY2sEB3NBbW91bnQKAAFABQhjYWxsYmFjawMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgUHc0Ftb3VudAUHc0Ftb3VudAQJc3VwcGx5UmVzCQEOc3VwcGx5SW50ZXJuYWwDBQtzQXNzZXRJZFN0cgUHc0Ftb3VudAUEdXNlcgMJAGYCCAgFCWJvcnJvd1JlcwJfMgJfMggIBQlzdXBwbHlSZXMCXzICXzIJAAIBAh5ub3QgZW5vdWdoIGNvbGxhdGVyYWwgcHJvdmlkZWQJAM4IAggFCWJvcnJvd1JlcwJfMQgFCXN1cHBseVJlcwJfMQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQZzdXBwbHkAAwMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQYJAAACCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAAACQACAQIcMSBwYXltZW50IGhhcyB0byBiZSBhdHRhY2hlZAQKYXNzZXRJZFN0cgkBDmdldEFzc2V0U3RyaW5nAQgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBAthc3NldEFtb3VudAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQDCQENdHJ5R2V0Qm9vbGVhbgEJAKwCAgUKYXNzZXRJZFN0cgUHa0F4bHlMcAkAAgECE1lvdSBjYW4ndCBzdXBwbHkgbHAECmF4bHlOb3RpZnkJAPwHBAUSYXhseUZhcm1pbmdBZGRyZXNzAgpsZW5kQWN0aW9uCQDMCAIJAKUIAQgFAWkGY2FsbGVyCQDMCAIFCmFzc2V0SWRTdHIFA25pbAUDbmlsAwkAAAIFCmF4bHlOb3RpZnkFCmF4bHlOb3RpZnkJAQ5zdXBwbHlJbnRlcm5hbAMFCmFzc2V0SWRTdHIFC2Fzc2V0QW1vdW50CQClCAEIBQFpBmNhbGxlcgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQh3aXRoZHJhdwIKYXNzZXRJZFN0cgthc3NldEFtb3VudAQNJHQwMTI2MDQxMjY3OQkBFWdldEFjdHVhbFJhdGVPbmVUb2tlbgIFCmFzc2V0SWRTdHICBXNSYXRlBAVzUmF0ZQgFDSR0MDEyNjA0MTI2NzkCXzEEEXJhdGVzUmVjYWxjUmVzdWx0CAUNJHQwMTI2MDQxMjY3OQJfMgQGYW1vdW50CQBuBAULYXNzZXRBbW91bnQFB1NjYWxlMTYFBXNSYXRlBQdDRUlMSU5HBAdhZGRyZXNzCQClCAEIBQFpBmNhbGxlcgQNYXNzZXRTdXBwbGllZAkBDXRyeUdldEludGVnZXIBCQCsAgICD3RvdGFsX3N1cHBsaWVkXwUKYXNzZXRJZFN0cgQNYXNzZXRCb3Jyb3dlZAkBDXRyeUdldEludGVnZXIBCQCsAgICD3RvdGFsX2JvcnJvd2VkXwUKYXNzZXRJZFN0cgQRdXNlckFzc2V0U3VwcGxpZWQJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgIFB2FkZHJlc3MCCl9zdXBwbGllZF8FCmFzc2V0SWRTdHIECmF4bHlOb3RpZnkJAPwHBAUSYXhseUZhcm1pbmdBZGRyZXNzAgpsZW5kQWN0aW9uCQDMCAIJAKUIAQgFAWkGY2FsbGVyCQDMCAIFCmFzc2V0SWRTdHIFA25pbAUDbmlsAwkAAAIFCmF4bHlOb3RpZnkFCmF4bHlOb3RpZnkEEmNvbGxhdGVyYWxWYWx1ZUludgkA/AcEBQR0aGlzAhNnZXRVc2VyQ29sbGF0ZXJhbFYyCQDMCAIHCQDMCAIFB2FkZHJlc3MJAMwIAgUKYXNzZXRJZFN0cgkAzAgCAgAJAMwIAgcJAMwIAgkArAICAglzdXBwbGllZCwJAKQDAQkBAS0BBQZhbW91bnQFA25pbAUDbmlsAwkAAAIFEmNvbGxhdGVyYWxWYWx1ZUludgUSY29sbGF0ZXJhbFZhbHVlSW52BA9jb2xsYXRlcmFsVmFsdWUEByRtYXRjaDAFEmNvbGxhdGVyYWxWYWx1ZUludgMJAAECBQckbWF0Y2gwAgNJbnQEAXgFByRtYXRjaDAFAXgJAAIBAh9jYW4ndCBnZXQgdXNlciBjb2xsYXRlcmFsIHZhbHVlAwkBASEBCQENdHJ5R2V0Qm9vbGVhbgECDHNldHVwX2FjdGl2ZQkAAgECEW1hcmtldCBpcyBzdG9wcGVkAwkAZgIAAAUPY29sbGF0ZXJhbFZhbHVlCQACAQIyeW91IGRvbnQgaGF2ZSBlbm91Z2ggY29sbGF0ZXJhbCBmb3IgdGhpcyBvcGVyYXRpb24DCQBmAgUGYW1vdW50CQBlAgUNYXNzZXRTdXBwbGllZAUNYXNzZXRCb3Jyb3dlZAkAAgECKnRoaXMgYW1vdW50IGlzIG5vdCBhdmFpbGFibGUgb24gdGhlIG1hcmtldAMJAGYCBQZhbW91bnQFEXVzZXJBc3NldFN1cHBsaWVkCQACAQIqdGhpcyBhbW91bnQgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGUgbWFya2V0CQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICBQdhZGRyZXNzAgpfc3VwcGxpZWRfBQphc3NldElkU3RyCQBlAgkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgUHYWRkcmVzcwIKX3N1cHBsaWVkXwUKYXNzZXRJZFN0cgUGYW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICD3RvdGFsX3N1cHBsaWVkXwUKYXNzZXRJZFN0cgkAZQIJAQ10cnlHZXRJbnRlZ2VyAQkArAICAg90b3RhbF9zdXBwbGllZF8FCmFzc2V0SWRTdHIFBmFtb3VudAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFC2Fzc2V0QW1vdW50CQENZ2V0QXNzZXRCeXRlcwEFCmFzc2V0SWRTdHIFA25pbAURcmF0ZXNSZWNhbGNSZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIcmVwYXlGb3ICB2FkZHJlc3MEbHBJZAMJAQEhAQkBDXRyeUdldEJvb2xlYW4BAgxzZXR1cF9hY3RpdmUJAAIBAhFtYXJrZXQgaXMgc3RvcHBlZAMJAQEhAQkBFHZlcmlmeVNlbnRpbmVsUmlnaHRzAQgFAWkGY2FsbGVyCQACAQIcYXZhaWxhYmxlIG9ubHkgZm9yIHdoaXRlbGlzdAMJAAACBQdhZGRyZXNzAgZnbG9iYWwJAAIBAiB5b3UgY2FuJ3QgcmVwYXkgZm9yIGV2ZXJ5b25lIDpfKQMDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEGCQAAAggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQAAAkAAgECHDEgcGF5bWVudCBoYXMgdG8gYmUgYXR0YWNoZWQDCQEBIQEJAQ10cnlHZXRCb29sZWFuAQkArAICBQRscElkBQdrQXhseUxwCQACAQILV3JvbmcgbHAgaWQECmFzc2V0SWRTdHIJAQ5nZXRBc3NldFN0cmluZwEICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQLYXNzZXRBbW91bnQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BA0kdDAxNDcxOTE0Nzk0CQEVZ2V0QWN0dWFsUmF0ZU9uZVRva2VuAgUKYXNzZXRJZFN0cgIFYlJhdGUEBWJSYXRlCAUNJHQwMTQ3MTkxNDc5NAJfMQQRcmF0ZXNSZWNhbGNSZXN1bHQIBQ0kdDAxNDcxOTE0Nzk0Al8yBAZhbW91bnQJAG4EBQthc3NldEFtb3VudAUHU2NhbGUxNgUFYlJhdGUFB0NFSUxJTkcEDWFzc2V0U3VwcGxpZWQJAQ10cnlHZXRJbnRlZ2VyAQkArAICAg90b3RhbF9zdXBwbGllZF8FCmFzc2V0SWRTdHIEDWFzc2V0Qm9ycm93ZWQJAQ10cnlHZXRJbnRlZ2VyAQkArAICAg90b3RhbF9ib3Jyb3dlZF8FCmFzc2V0SWRTdHIEEXVzZXJBc3NldEJvcnJvd2VkCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICBQdhZGRyZXNzAgpfYm9ycm93ZWRfBQphc3NldElkU3RyBAphbW91bnRMZWZ0CQBlAgURdXNlckFzc2V0Qm9ycm93ZWQFBmFtb3VudAQLcmVwYXlBbW91bnQDCQBnAgUKYW1vdW50TGVmdAAABQZhbW91bnQFEXVzZXJBc3NldEJvcnJvd2VkBBFleHRyYUFtb3VudFJlc3VsdAMJAGcCBQphbW91bnRMZWZ0AAAFA25pbAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAQEtAQUKYW1vdW50TGVmdAgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQNuaWwEDndpdGhkcmF3UmVzdWx0AwkAAAIIBQFpBmNhbGxlcgULYXhseUFkZHJlc3MEDHVzZXJTdXBwbGllZAkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgUHYWRkcmVzcwIKX3N1cHBsaWVkXwUEbHBJZAMJAGYCBQx1c2VyU3VwcGxpZWQAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIFB2FkZHJlc3MCCl9zdXBwbGllZF8FBGxwSWQAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAg90b3RhbF9zdXBwbGllZF8FBGxwSWQJAGUCCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgIPdG90YWxfc3VwcGxpZWRfBQRscElkBQx1c2VyU3VwcGxpZWQFA25pbAUDbmlsBQNuaWwDCQAAAgkAswkCCQEMdHJ5R2V0U3RyaW5nAQIMc2V0dXBfdG9rZW5zBQphc3NldElkU3RyBQR1bml0CQACAQIpdGhpcyBhc3NldCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBtYXJrZXQJAM4IAgkAzggCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICBQdhZGRyZXNzAgpfYm9ycm93ZWRfBQphc3NldElkU3RyCQBlAgURdXNlckFzc2V0Qm9ycm93ZWQFC3JlcGF5QW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICD3RvdGFsX2JvcnJvd2VkXwUKYXNzZXRJZFN0cgkAZQIFDWFzc2V0Qm9ycm93ZWQFC3JlcGF5QW1vdW50BQNuaWwFEXJhdGVzUmVjYWxjUmVzdWx0BRFleHRyYUFtb3VudFJlc3VsdAUOd2l0aGRyYXdSZXN1bHQBaQETYWRkSW50ZXJlc3RFWFRFUk5BTAAEBmFtb3VudAkAawMICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50AFAAZAQHYXNzZXRJZAgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBAphc3NldElkU3RyCQEOZ2V0QXNzZXRTdHJpbmcBBQdhc3NldElkBAZlYXJuZWQJAQ10cnlHZXRJbnRlZ2VyAQkArAICAhVhdXRvc3Rha2VfbGFzdEVhcm5lZF8FCmFzc2V0SWRTdHIECmxhc3RIZWlnaHQJAQ10cnlHZXRJbnRlZ2VyAQkArAICAhRhdXRvc3Rha2VfbGFzdEJsb2NrXwUKYXNzZXRJZFN0cgQMc3RhdGVDaGFuZ2VzAwMJAAACBQpsYXN0SGVpZ2h0BQZoZWlnaHQGCQAAAgUGYW1vdW50AAAFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhhhdXRvc3Rha2VfcHJlTGFzdEVhcm5lZF8FCmFzc2V0SWRTdHIFBmVhcm5lZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhdhdXRvc3Rha2VfcHJlTGFzdEJsb2NrXwUKYXNzZXRJZFN0cgUKbGFzdEhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhVhdXRvc3Rha2VfbGFzdEVhcm5lZF8FCmFzc2V0SWRTdHIJAGQCBQZlYXJuZWQFBmFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhRhdXRvc3Rha2VfbGFzdEJsb2NrXwUKYXNzZXRJZFN0cgUGaGVpZ2h0BQNuaWwJAM4IAgUMc3RhdGVDaGFuZ2VzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCmFzc2V0SWRTdHICBl9zUmF0ZQkAZAIJAQ10cnlHZXRJbnRlZ2VyAQkArAICBQphc3NldElkU3RyAgZfc1JhdGUJAGsDBQdTY2FsZTE2BQZhbW91bnQJAQ10cnlHZXRJbnRlZ2VyAQkArAICAg90b3RhbF9zdXBwbGllZF8FCmFzc2V0SWRTdHIFA25pbAFpAQdwcmVJbml0BAZ0b2tlbnMEbHR2cwNsdHMJcGVuYWx0aWVzCgEBZgIFYWNjdW0FdG9rZW4JAM4IAgUFYWNjdW0JAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUFdG9rZW4CBl9iUmF0ZQUHU2NhbGUxNgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQV0b2tlbgIGX3NSYXRlBQdTY2FsZTE2BQNuaWwDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAgphZG1pbiBvbmx5BAVyYXRlcwoAAiRsCQC1CQIFBnRva2VucwIBLAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEBZgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTIJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwJAM4IAgkAzAgCCQELU3RyaW5nRW50cnkCAgxzZXR1cF90b2tlbnMFBnRva2VucwkAzAgCCQELU3RyaW5nRW50cnkCAgpzZXR1cF9sdHZzBQRsdHZzCQDMCAIJAQtTdHJpbmdFbnRyeQICCXNldHVwX2x0cwUDbHRzCQDMCAIJAQtTdHJpbmdFbnRyeQICD3NldHVwX3BlbmFsdGllcwUJcGVuYWx0aWVzCQDMCAIJAQxCb29sZWFuRW50cnkCAgxzZXR1cF9hY3RpdmUGBQNuaWwFBXJhdGVzAWkBDGluaXROZXdUb2tlbgQFdG9rZW4DbHR2Amx0B3BlbmFsdHkDAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQECIT0CCAUBaQZjYWxsZXIJAQdBZGRyZXNzAQEaAVcUeViFwPoaZ+cUNI0M98TwbUXt9hz5PUEHCQACAQIKYWRtaW4gb25seQkAzAgCCQELU3RyaW5nRW50cnkCAgxzZXR1cF90b2tlbnMJAKwCAgkArAICCQEMdHJ5R2V0U3RyaW5nAQIMc2V0dXBfdG9rZW5zAgEsBQV0b2tlbgkAzAgCCQELU3RyaW5nRW50cnkCAgpzZXR1cF9sdHZzCQCsAgIJAKwCAgkBDHRyeUdldFN0cmluZwECCnNldHVwX2x0dnMCASwFA2x0dgkAzAgCCQELU3RyaW5nRW50cnkCAglzZXR1cF9sdHMJAKwCAgkArAICCQEMdHJ5R2V0U3RyaW5nAQIJc2V0dXBfbHRzAgEsBQJsdAkAzAgCCQELU3RyaW5nRW50cnkCAg9zZXR1cF9wZW5hbHRpZXMJAKwCAgkArAICCQEMdHJ5R2V0U3RyaW5nAQIPc2V0dXBfcGVuYWx0aWVzAgEsBQdwZW5hbHR5CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBXRva2VuAgZfYlJhdGUFB1NjYWxlMTYJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUFdG9rZW4CBl9zUmF0ZQUHU2NhbGUxNgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQV0b2tlbgIPX2xhc3RSYXRlSGVpZ2h0BQZoZWlnaHQFA25pbAFpAQ5pbml0TmV3TFBUb2tlbgEFdG9rZW4DAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQECIT0CCAUBaQZjYWxsZXIJAQdBZGRyZXNzAQEaAVcUeViFwPoaZ+cUNI0M98TwbUXt9hz5PUEHCQACAQIKYWRtaW4gb25seQkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICBQV0b2tlbgIHX2F4bHlMcAYFA25pbAFpAQ91cGRhdGVQYXJhbWV0ZXICA2tleQN2YWwDAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQECIT0CCAUBaQZjYWxsZXIJAQdBZGRyZXNzAQEaAVcUeViFwPoaZ+cUNI0M98TwbUXt9hz5PUEHCQACAQIKYWRtaW4gb25seQkAzAgCCQEMSW50ZWdlckVudHJ5AgUDa2V5CQENcGFyc2VJbnRWYWx1ZQEFA3ZhbAUDbmlsAWkBDHVwZGF0ZVN0cmluZwIDa2V5A3ZhbAMDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAQIhPQIIBQFpBmNhbGxlcgkBB0FkZHJlc3MBARoBVxR5WIXA+hpn5xQ0jQz3xPBtRe32HPk9QQcJAAIBAgphZG1pbiBvbmx5CQDMCAIJAQtTdHJpbmdFbnRyeQIFA2tleQUDdmFsBQNuaWwBaQESY2xhaW1Ub1Jlc2VydmVGdW5kAQVkZWJ1ZwQGYXNzZXRzCQEPZ2V0TWFya2V0QXNzZXRzAAQFcmF0ZXMICQENZ2V0QWN0dWFsUmF0ZQIJAJEDAgUGYXNzZXRzAAACBXNSYXRlAl8yCgEBZgIBYQphc3NldElkU3RyBA0kdDAxOTI3MzE5MzIzBQFhBAVhY2N1bQgFDSR0MDE5MjczMTkzMjMCXzEEAW4IBQ0kdDAxOTI3MzE5MzIzAl8yBA9hdXRvc3Rha2VBbW91bnQJAQx0cnlHZXRTdHJpbmcBCQCsAgICEWF1dG9zdGFrZV9hbW91bnRfBQphc3NldElkU3RyBAZhbW91bnQJAGUCCQBkAgkAZAIJAGQCCQEKZ2V0QmFsYW5jZQEFCmFzc2V0SWRTdHIJAQ10cnlHZXRJbnRlZ2VyAQkArAICAhFhdXRvc3Rha2VfYW1vdW50XwUKYXNzZXRJZFN0cgMJAQIhPQIFD2F1dG9zdGFrZUFtb3VudAIACQENcGFyc2VJbnRWYWx1ZQEFD2F1dG9zdGFrZUFtb3VudAAACQBrAwkBDXRyeUdldEludGVnZXIBCQCsAgICD3RvdGFsX2JvcnJvd2VkXwUKYXNzZXRJZFN0cggJAJEDAgUFcmF0ZXMJAGQCCQBoAgUBbgADAAEFdmFsdWUFB1NjYWxlMTYJAGsDCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgIPdG90YWxfc3VwcGxpZWRfBQphc3NldElkU3RyCAkAkQMCBQVyYXRlcwkAaAIFAW4AAwV2YWx1ZQUHU2NhbGUxNgQDaW52AwkAZgIJAQ10cnlHZXRJbnRlZ2VyAQkArAICAhFhdXRvc3Rha2VfYW1vdW50XwUKYXNzZXRJZFN0cgAACQD8BwQFBHRoaXMCDHVuc3Rha2VUb2tlbgkAzAgCBQphc3NldElkU3RyCQDMCAIJAJYDAQkAzAgCBQZhbW91bnQJAMwIAgAABQNuaWwFA25pbAUDbmlsAAADCQAAAgUDaW52BQNpbnYJAJQKAgkAzggCBQVhY2N1bQkAzAgCBQZhbW91bnQFA25p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ZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAOgA7ADwAPQA+AD8AQABBAEIAQwBEAEUARgBHAEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWABZAFoAWwBcAF0AXgBfAGAAYQBiAGMAZAUJcGFyYW1ldGVyAl8xAWkBCHNodXRkb3duAQhzaHV0ZG93bgMJAAACCQDPCAIFEXNodXRkb3duV2hpdGVsaXN0CAgFAWkGY2FsbGVyBWJ5dGVzBQR1bml0CQACAQIXdXNlciBub3QgaW4gYSB3aGl0ZWxpc3QJAMwIAgkBDEJvb2xlYW5FbnRyeQICDHNldHVwX2FjdGl2ZQkBASEBBQhzaHV0ZG93bgUDbmlsAWkBC2xpcXVpZGF0ZVYyBQVkZWJ1ZwdhZGRyZXNzC3NBc3NldElkU3RyC2JBc3NldElkU3RyEGxpcXVpZGF0ZVBlcmNlbnQDCQEBIQEJARZ2ZXJpZnlMaXF1aWRhdG9yUmlnaHRzAQgFAWkGY2FsbGVyCQACAQIcYXZhaWxhYmxlIGZvciB3aGl0ZWxpc3Qgb25seQMJAQEhAQkBDXRyeUdldEJvb2xlYW4BAgxzZXR1cF9hY3RpdmUJAAIBAhFtYXJrZXQgaXMgc3RvcHBlZAQSY29sbGF0ZXJhbFZhbHVlSW52CQD8BwQFBHRoaXMCE2dldFVzZXJDb2xsYXRlcmFsVjIJAMwIAgcJAMwIAgUHYWRkcmVzcwkAzAgCBQtzQXNzZXRJZFN0cgkAzAgCBQtiQXNzZXRJZFN0cgkAzAgCBgkAzAgCAgAFA25pbAUDbmlsAwkAAAIFEmNvbGxhdGVyYWxWYWx1ZUludgUSY29sbGF0ZXJhbFZhbHVlSW52BA51c2VyQ29sbGF0ZXJhbAQHJG1hdGNoMAUSY29sbGF0ZXJhbFZhbHVlSW52AwkAAQIFByRtYXRjaDACA0ludAQBeAUHJG1hdGNoMAUBeAkAAgECH2Nhbid0IGdldCB1c2VyIGNvbGxhdGVyYWwgdmFsdWUEEGN1cnJlbnRTUG9zaXRpb24JAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgIFB2FkZHJlc3MCCl9zdXBwbGllZF8FC3NBc3NldElkU3RyBBBjdXJyZW50QlBvc2l0aW9uCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgkArAICBQdhZGRyZXNzAgpfYm9ycm93ZWRfBQtiQXNzZXRJZFN0cgMJAQEhAQkBDXRyeUdldEJvb2xlYW4BCQCsAgIFC3NBc3NldElkU3RyBQdrQXhseUxwCQACAQIOd3JvbmcgbHAgYXNzZXQDCQBnAgAABRBjdXJyZW50QlBvc2l0aW9uCQACAQIgdXNlciBoYXMgbm8gYm9ycm93IGluIHRoaXMgdG9rZW4DAwkAZgIFDnVzZXJDb2xsYXRlcmFsAAAGCQAAAgUQY3VycmVudEJQb3NpdGlvbgAACQACAQIYdXNlciBjYW4ndCBiZSBsaXF1aWRhdGVkBAhiQXNzZXRJZAkBDWdldEFzc2V0Qnl0ZXMBBQtiQXNzZXRJZFN0cgQMbWFya2V0QXNzZXRzCQEPZ2V0TWFya2V0QXNzZXRzAAQJYXNzZXQxTnVtCQEFdmFsdWUBCQDPCAIFDG1hcmtldEFzc2V0cwULYkFzc2V0SWRTdHIECWFzc2V0ME51bQkBBXZhbHVlAQkAzwgCBQxtYXJrZXRBc3NldHMFC3NBc3NldElkU3RyBAdwZW5hbHR5CQENcGFyc2VJbnRWYWx1ZQEJAQV2YWx1ZQEJAJEDAgkAtQkCCQEMdHJ5R2V0U3RyaW5nAQIPc2V0dXBfcGVuYWx0aWVzAgEsBQlhc3NldDFOdW0EDSR0MDIxODkxMjE5NjEJARVnZXRBY3R1YWxSYXRlT25lVG9rZW4CBQtiQXNzZXRJZFN0cgIFYlJhdGUEBWJSYXRlCAUNJHQwMjE4OTEyMTk2MQJfMQQLcmF0ZXNSZXN1bHQIBQ0kdDAyMTg5MTIxOTYxAl8yBAdiQW1vdW50CQBrAwUQY3VycmVudEJQb3NpdGlvbgUFYlJhdGUFB1NjYWxlMTYEB2xBbW91bnQJAGsDBQdiQW1vdW50BRBsaXF1aWRhdGVQZXJjZW50AGQEEmxBbW91bnRXaXRoUGVuYWx0eQkAawMFB2xBbW91bnQJAGQCBQZTY2FsZTgFB3BlbmFsdHkFBlNjYWxlOAQIbGJBbW91bnQJAGsDBQdsQW1vdW50BQdTY2FsZTE2BQViUmF0ZQQFcG9zSWQJAJEDAgkAtQkCBQdhZGRyZXNzAgFfAAEECWFkZHJlc3NJZAkAkQMCCQC1CQIFB2FkZHJlc3MCAV8AAAQJc0Ftb3VudExwCgABQAkA/QcEBQtheGx5QWRkcmVzcwIJbGlxdWlkYXRlCQDMCAIFCWFkZHJlc3NJZAkAzAgCBQVwb3NJZAkAzAgCBRJsQW1vdW50V2l0aFBlbmFsdHkFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQlzQW1vdW50THAFCXNBbW91bnRMcAQHc0Ftb3VudAkAawMFCXNBbW91bnRMcAUHU2NhbGUxNggJAJEDAgULcmF0ZXNSZXN1bHQAAQV2YWx1ZQMFBWRlYnVnCQACAQIVbGlxdWlkYXRpb24gd2lsbCBwYXNzCQDOCAIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyCQBlAgUSbEFtb3VudFdpdGhQZW5hbHR5BQdsQW1vdW50BQhiQXNzZXRJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIFB2FkZHJlc3MCCl9zdXBwbGllZF8FC3NBc3NldElkU3RyCQBlAgUQY3VycmVudFNQb3NpdGlvbgUHc0Ftb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIFB2FkZHJlc3MCCl9ib3Jyb3dlZF8FC2JBc3NldElkU3RyCQBlAgUQY3VycmVudEJQb3NpdGlvbgUIbGJBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgIPdG90YWxfc3VwcGxpZWRfBQtzQXNzZXRJZFN0cgkAZQIJAQ10cnlHZXRJbnRlZ2VyAQkArAICAg90b3RhbF9zdXBwbGllZF8FC3NBc3NldElkU3RyBQdzQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICD3RvdGFsX2JvcnJvd2VkXwULYkFzc2V0SWRTdHIJAGUCCQENdHJ5R2V0SW50ZWdlcgEJAKwCAgIPdG90YWxfYm9ycm93ZWRfBQtiQXNzZXRJZFN0cgUIbGJBbW91bnQFA25pbAULcmF0ZXNSZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQERZ2V0VXNlckNvbGxhdGVyYWwEBWRlYnVnB2FkZHJlc3MNbWludXNCb3Jyb3dlZAthZnRlckNoYW5nZQQGYXNzZXRzCQEPZ2V0TWFya2V0QXNzZXRzAAQEbHR2cwkAtQkCCQEMdHJ5R2V0U3RyaW5nAQIKc2V0dXBfbHR2cwIBLAQDbHRzCQC1CQIJAQx0cnlHZXRTdHJpbmcBAglzZXR1cF9sdHMCASwEBXJhdGVzCAkBDWdldEFjdHVhbFJhdGUCCQCRAwIFBmFzc2V0cwAAAgVzUmF0ZQJfMgQNY2hhbmdlSGFuZGxlcgkAtQkCBQthZnRlckNoYW5nZQIBLAoBAWYCBWFjY3VtBG5leHQDCQBnAgUEbmV4dAkAkAMBBQZhc3NldHMFBWFjY3VtBAx1c2VyU3VwcGxpZWQJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgIFB2FkZHJlc3MCCl9zdXBwbGllZF8JAJEDAgUGYXNzZXRzBQRuZXh0BAx1c2VyQm9ycm93ZWQJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgIFB2FkZHJlc3MCCl9ib3Jyb3dlZF8JAJEDAgUGYXNzZXRzBQRuZXh0BBNuZWVkVG9rZW5BY2NvdW50aW5nAwkAAAIFC2FmdGVyQ2hhbmdlAgADAwkBAiE9AgUMdXNlckJvcnJvd2VkAAAGCQECIT0CBQx1c2VyU3VwcGxpZWQAAAYHBgMFE25lZWRUb2tlbkFjY291bnRpbmcECmFzc2V0U2NhbGUJAQ5jYWxjQXNzZXRTY2FsZQEJAJEDAgUGYXNzZXRzBQRuZXh0BAphc3NldFByaWNlCQENZ2V0VG9rZW5QcmljZQEJAJEDAgUGYXNzZXRzBQRuZXh0CQBlAgkAZAIFBWFjY3VtCQBrAwkAawMJAGsDCQBkAgUMdXNlclN1cHBsaWVkAwMDCQECIT0CBQthZnRlckNoYW5nZQIACQAAAgkAkQMCBQ1jaGFuZ2VIYW5kbGVyAAAJAJEDAgUGYXNzZXRzBQRuZXh0BwkAAAIJAJEDAgUNY2hhbmdlSGFuZGxlcgABAghzdXBwbGllZAcJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ1jaGFuZ2VIYW5kbGVyAAIAAAgJAJEDAgUFcmF0ZXMJAGgCBQRuZXh0AAMFdmFsdWUFB1NjYWxlMTYJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQRsdHZzBQRuZXh0BQZTY2FsZTgIBQphc3NldFByaWNlAl8xBQphc3NldFNjYWxlAwUNbWludXNCb3Jyb3dlZAkAawMJAGsDCQBrAwkAZAIFDHVzZXJCb3Jyb3dlZAMDAwkBAiE9AgULYWZ0ZXJDaGFuZ2UCAAkAAAIJAJEDAgUNY2hhbmdlSGFuZGxlcgAACQCRAwIFBmFzc2V0cwUEbmV4dAcJAAACCQCRAwIFDWNoYW5nZUhhbmRsZXIAAQIIYm9ycm93ZWQHCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUNY2hhbmdlSGFuZGxlcgACAAAICQCRAwIFBXJhdGVzCQBkAgkAaAIFBG5leHQAAwABBXZhbHVlBQdTY2FsZTE2BQZTY2FsZTgJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQNsdHMFBG5leHQIBQphc3NldFByaWNlAl8yBQphc3NldFNjYWxlAAAFBWFjY3VtBAZyZXN1bHQKAAIkbAkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQkAzAgCAAYJAMwIAgAHCQDMCAIACAkAzAgCAAkJAMwIAgAKCQDMCAIACwUDbmlsCgACJHMJAJADAQUCJGwKAAUkYWNjMAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQFmAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAMFBWRlYnVnCQACAQkApAMBBQZyZXN1bHQJAJQKAgUDbmlsBQZyZXN1bHQBaQETZ2V0VXNlckNvbGxhdGVyYWxWMgYFZGVidWcHYWRkcmVzcwhzQXNzZXRJZAhiQXNzZXRJZA1taW51c0JvcnJvd2VkC2FmdGVyQ2hhbmdlBAZhc3NldHMJAQ9nZXRNYXJrZXRBc3NldHMABAZzSW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQZhc3NldHMFCHNBc3NldElkAg5Xcm9uZyBzQXNzZXRJZAQEbHR2cwkAtQkCCQEMdHJ5R2V0U3RyaW5nAQIKc2V0dXBfbHR2cwIBLAQDbHRzCQC1CQIJAQx0cnlHZXRTdHJpbmcBAglzZXR1cF9sdHMCASwECnNBc3NldFJhdGUJARVnZXRBY3R1YWxSYXRlT25lVG9rZW4CBQhzQXNzZXRJZAIFc1JhdGUEDWNoYW5nZUhhbmRsZXIJALUJAgULYWZ0ZXJDaGFuZ2UCASwEDHVzZXJTdXBwbGllZAkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgUHYWRkcmVzcwIKX3N1cHBsaWVkXwUIc0Fzc2V0SWQEDHVzZXJCb3Jyb3dlZAkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgUHYWRkcmVzcwIKX2JvcnJvd2VkXwUIYkFzc2V0SWQEDnN1cHBsaWVkQ2hhbmdlAwMJAQIhPQIFC2FmdGVyQ2hhbmdlAgAJAAACCQCRAwIFDWNoYW5nZUhhbmRsZXIAAAIIc3VwcGxpZWQHCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUNY2hhbmdlSGFuZGxlcgABAAAEC3NBc3NldFNjYWxlCQEOY2FsY0Fzc2V0U2NhbGUBBQhzQXNzZXRJZAQLc0Fzc2V0UHJpY2UJAQ1nZXRUb2tlblByaWNlAQUIc0Fzc2V0SWQEBnJlc3VsdAkAZQIJAGsDCQBrAwkAawMJAGQCBQx1c2VyU3VwcGxpZWQFDnN1cHBsaWVkQ2hhbmdlCAUKc0Fzc2V0UmF0ZQJfMQUHU2NhbGUxNgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBGx0dnMFBnNJbmRleAUGU2NhbGU4CAULc0Fzc2V0UHJpY2UCXzEFC3NBc3NldFNjYWxlAwUNbWludXNCb3Jyb3dlZAQGYkluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUGYXNzZXRzBQhiQXNzZXRJZAIOV3JvbmcgYkFzc2V0SWQECmJBc3NldFJhdGUJARVnZXRBY3R1YWxSYXRlT25lVG9rZW4CBQhiQXNzZXRJZAIFYlJhdGUEDmJvcnJvd2VkQ2hhbmdlAwMJAQIhPQIFC2FmdGVyQ2hhbmdlAgAJAAACCQCRAwIFDWNoYW5nZUhhbmRsZXIAAAIIYm9ycm93ZWQHCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUNY2hhbmdlSGFuZGxlcgABAAAEC2JBc3NldFNjYWxlCQEOY2FsY0Fzc2V0U2NhbGUBBQhiQXNzZXRJZAQLYkFzc2V0UHJpY2UJAQ1nZXRUb2tlblByaWNlAQUIYkFzc2V0SWQJAGsDCQBrAwkAawMJAGQCBQx1c2VyQm9ycm93ZWQFDmJvcnJvd2VkQ2hhbmdlCAUKYkFzc2V0UmF0ZQJfMQUHU2NhbGUxNgUGU2NhbGU4CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUDbHRzBQZiSW5kZXgIBQtiQXNzZXRQcmljZQJfMgULYkFzc2V0U2NhbGUAAAMFBWRlYnVnCQACAQkApAMBBQZyZXN1bHQJAJQKAgUDbmlsBQZyZXN1bHQBaQEMZ2V0QXNzZXREZWJ0AwVkZWJ1ZwdhZGRyZXNzCmFzc2V0SWRTdHIEDHVzZXJCb3Jyb3dlZAkBDXRyeUdldEludGVnZXIBCQCsAgIJAKwCAgUHYWRkcmVzcwIKX2JvcnJvd2VkXwUKYXNzZXRJZFN0cgQKYXNzZXRTY2FsZQkBDmNhbGNBc3NldFNjYWxlAQUKYXNzZXRJZFN0cgQEcmF0ZQgJARVnZXRBY3R1YWxSYXRlT25lVG9rZW4CBQphc3NldElkU3RyAgViUmF0ZQJfMQQGcmVzdWx0CQBrAwUMdXNlckJvcnJvd2VkBQRyYXRlBQdTY2FsZTE2AwUFZGVidWcJAAIBCQCkAwEFBnJlc3VsdAkAlAoCBQNuaWwFBnJlc3VsdAFpAQlnZXRQcmljZXMBBWRlYnVnBAZhc3NldHMJAQ9nZXRNYXJrZXRBc3NldHMACgEBZgIFYWNjdW0KYXNzZXRJZFN0cgQKYXNzZXRQcmljZQkBFWdldFRva2VuUHJpY2VXaXRoUmlzawIFCmFz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BSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBAAEEAQgBDAEQARQBGAEcASABJAEoASwBMAE0ATgBPAFAAUQBSAFMAVABVAFYAVwBYAFkAWgBbAFwAXQBeAF8AYABhAGIAYwBkAwUFZGVidWcJAAIBBQlwYXJhbWV0ZXIJAJQKAgUDbmlsBQlwYXJhbWV0ZXIBAnR4AQZ2ZXJpZnkAAwMDAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAEg/XXg3oez6DuanjNsQ3pWRVALIo9nVy/USV6BgJV9XQEGCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAAASCQpp9/Me/Ta3E4MktVjg3Z8DeDRSAIRX8xeT7HVuKEewYJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAABIKtvFry/bTtkfOGq1hidoH1VvCftr7DwxV9WUchHp74PBgkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAEgsqjd/2RuCiE8iQa/ePj4wRFXp96pg+zd+fUDwp6q02UDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABASAptySGTmbKD+EhOKgxR3AX8vMsoOhmHOMDi6IUwkAuOwYJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEBIIPvcoztDFRvh/+rabZ7oQ4UQnF2/9sodDexlJRAcugNB9HO5JY=", "height": 4051519, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3P1kaoW1vZHheFai94Xa5CfRaQe3iAFRFpw443svSAqE Next: 2BUa59N1xymvWugFTNK63gGktUHJTXA2R8eyakw4THF9 Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let a = Address(base58'3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW')
4+let a = "_axlyLP"
55
6-let b = ["7KZbJrVopwJhkdwbe1eFDBbex4dkY63MxjTNjqXtrzj1", "Btw3G1j4wQgdp49PTxaFkNvn75dQtqGDM7ejQppHnWC1", "BiSzFe8nSL78oZaebfoin5vBZ5Pze6d7kaeijLqr5xZe", "F2AKkA513k5yHEJkLsU6vWxCYYk811GpjLhwEv2WGwZ9", "4CQ5CPGLXLbWBUs2JBjKUaRqF49CmKHkwzvPgSvQpAQV", "6iMB6LKSrgv9waEvEnN6Ydyx7dfxPnGcTw8318WVm5bR"]
6+let b = Address(base58'3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW')
77
88 let c = Address(base58'3P37f8Y3rNpKzSkHNVZMAStXdpmNBgftHN9')
99
2525
2626
2727 func j (i) = !(if ((i != d))
28- then (i != a)
28+ then (i != b)
2929 else false)
3030
3131
8989
9090 func C (A,B) = if ((B >= x))
9191 then A
92- else throw("List size exceeds 12")
92+ else throw("List size exceeds 100")
9393
94- C(z(z(z(z(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
94+ C(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
9595 }
9696
9797
189189 }
190190
191191
192-func W (l) = if ((indexOf(b, l) != unit))
193- then [IntegerEntry((l + "_sRate"), p), IntegerEntry((l + "_bRate"), p), IntegerEntry("lastRateHeight", height)]
192+func W (l) = if (G((l + a)))
193+ then [IntegerEntry((l + "_sRate"), p), IntegerEntry((l + "_bRate"), p), IntegerEntry((l + "_lastRateHeight"), height)]
194194 else {
195195 let X = S(l)
196196 let T = Q(l)
197- let Y = D("lastRateHeight")
197+ let Y = valueOrElse(getInteger(this, (l + "_lastRateHeight")), D("lastRateHeight"))
198198 let Z = max([D((l + "_bRate")), p])
199199 let aa = (Z + ((height - Y) * X))
200200 let ab = max([D((l + "_sRate")), p])
201201 let ac = (ab + ((((height - Y) * fraction(X, T, n)) * (100 - e)) / 100))
202-[IntegerEntry((l + "_sRate"), ac), IntegerEntry((l + "_bRate"), aa), IntegerEntry("lastRateHeight", height)]
202+[IntegerEntry((l + "_sRate"), ac), IntegerEntry((l + "_bRate"), aa), IntegerEntry((l + "_lastRateHeight"), height)]
203203 }
204204
205205
222222
223223 func C (A,B) = if ((B >= x))
224224 then A
225- else throw("List size exceeds 12")
225+ else throw("List size exceeds 100")
226226
227- C(z(z(z(z(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
227+ C(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
228228 }
229229
230230
231-func ah (l) = {
232- let ai = W(l)
233- let R = fraction(D(("total_supplied_" + l)), ai[0].value, p)
234- fraction(n, fraction(D(("total_borrowed_" + l)), ai[1].value, p), R)
231+func ah (l,ae) = {
232+ let ag = W(l)
233+ $Tuple2(if ((ae == "sRate"))
234+ then ag[0].value
235+ else ag[1].value, ag)
235236 }
236237
237238
238-func aj () = {
239- func t (u,af) = (u ++ W(af))
240-
241- let w = N()
242- let x = size(w)
243- let y = nil
244- func z (A,B) = if ((B >= x))
245- then A
246- else t(A, w[B])
247-
248- func C (A,B) = if ((B >= x))
249- then A
250- else throw("List size exceeds 12")
251-
252- C(z(z(z(z(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
239+func ai (l) = {
240+ let aj = W(l)
241+ let R = fraction(D(("total_supplied_" + l)), aj[0].value, p)
242+ fraction(n, fraction(D(("total_borrowed_" + l)), aj[1].value, p), R)
253243 }
254244
255245
260250 else {
261251 let am = getIntegerValue(Address(base58'3P8d1E1BLKoD52y3bQJ1bDTd2TD1gpaLn9t'), (l + "_twap5B"))
262252 let an = getIntegerValue(Address(base58'3P8d1E1BLKoD52y3bQJ1bDTd2TD1gpaLn9t'), (l + "_riskLevel"))
263- if ((indexOf(b, l) != unit))
253+ if (G((l + a)))
264254 then {
265255 let ao = {
266- let ap = reentrantInvoke(a, "getShareAssetPriceREADONLY", [l], nil)
256+ let ap = reentrantInvoke(b, "getShareAssetPriceREADONLY", [l], nil)
267257 if ($isInstanceOf(ap, "Int"))
268258 then ap
269259 else throw(($getType(ap) + " couldn't be cast to Int"))
289279 }
290280
291281
292-func at (i) = {
293- let au = invoke(this, "getUserCollateral", [false, i, true, ""], nil)
294- if ((au == au))
295- then {
296- let av = {
297- let m = au
298- if ($isInstanceOf(m, "Int"))
299- then {
300- let aw = m
301- aw
282+func at (l,au,i) = if (!(G("setup_active")))
283+ then throw("market is stopped")
284+ else {
285+ let av = ah(l, "sRate")
286+ let aw = av._1
287+ let ax = av._2
288+ let ay = fraction(au, p, aw, DOWN)
289+ let az = {
290+ let m = getString(("setup_maxSupply_" + l))
291+ if ($isInstanceOf(m, "String"))
292+ then {
293+ let aA = m
294+ parseIntValue(aA)
295+ }
296+ else 0
297+ }
298+ let aB = aq(l)
299+ let aC = (D(((i + "_supplied_") + l)) + ay)
300+ let V = aw
301+ let aD = ar(l)
302+ let aE = fraction(fraction(aC, V, p), aB._1, aD)
303+ if ((indexOf(H("setup_tokens"), l) == unit))
304+ then throw("this asset is not supported by the market")
305+ else if (if ((az != 0))
306+ then (aE > az)
307+ else false)
308+ then throw("max total supply for this token reached in the pool")
309+ else {
310+ let aF = value(indexOf(N(), l))
311+ $Tuple2(([IntegerEntry(((i + "_supplied_") + l), aC), IntegerEntry(("total_supplied_" + l), (D(("total_supplied_" + l)) + ay))] ++ [ax[0], ax[1], ax[2]]), $Tuple2(au, aE))
312+ }
313+ }
314+
315+
316+func aG (l,au,i) = {
317+ let aH = ah(l, "bRate")
318+ let aI = aH._1
319+ let ax = aH._2
320+ let ay = fraction(au, p, aI, CEILING)
321+ if (!(G("setup_active")))
322+ then throw("market is stopped")
323+ else if (G((l + a)))
324+ then throw("this token cannot be borrowed")
325+ else {
326+ let aJ = D(("total_supplied_" + l))
327+ let aK = D(("total_borrowed_" + l))
328+ let aL = D(((i + "_borrowed_") + l))
329+ let aD = ar(l)
330+ let aB = aq(l)
331+ let aM = fraction(ay, aB._1, aD)
332+ if ((ay > (aJ - aK)))
333+ then throw("this amount is not available")
334+ else {
335+ let aF = value(indexOf(N(), l))
336+ $Tuple2(([IntegerEntry(((i + "_borrowed_") + l), (aL + ay)), IntegerEntry(("total_borrowed_" + l), (aK + ay))] ++ [ax[0], ax[1], ax[2]]), $Tuple2(au, aM))
302337 }
303- else throw("issue while doing in-dapp invocation")
304338 }
305- if ((av == av))
306- then av
307- else throw("Strict value is not equal to itself.")
308- }
309- else throw("Strict value is not equal to itself.")
310339 }
311340
312341
313-func ax (l,ay,i) = if (!(G("setup_active")))
314- then throw("market is stopped")
315- else {
316- let az = ad(l, "sRate")
317- let aA = az._1
318- let aB = az._2
319- let aC = fraction(ay, p, aA, DOWN)
320- let aD = {
321- let m = getString(("setup_maxSupply_" + l))
322- if ($isInstanceOf(m, "String"))
323- then {
324- let aw = m
325- parseIntValue(aw)
326- }
327- else 0
328- }
329- let aE = aq(l)
330- let aF = (D(((i + "_supplied_") + l)) + aC)
331- let V = ad(l, "sRate")._1
332- let aG = ar(l)
333- let aH = fraction(fraction(aF, V, p), aE._1, aG)
334- if ((indexOf(H("setup_tokens"), l) == unit))
335- then throw("this asset is not supported by the market")
336- else if (if ((aD != 0))
337- then (aH > aD)
338- else false)
339- then throw("max total supply for this token reached in the pool")
340- else $Tuple2(([IntegerEntry(((i + "_supplied_") + l), aF), IntegerEntry(("total_supplied_" + l), (D(("total_supplied_" + l)) + aC))] ++ aB), ay)
341- }
342-
343-
344-func aI (l,ay,i,aJ) = {
345- let aK = ad(l, "bRate")
346- let aL = aK._1
347- let aB = aK._2
348- let aC = fraction(ay, p, aL, CEILING)
349- let aM = invoke(this, "getUserCollateral", [false, i, true, ((l + ",borrowed,") + toString(aC))], nil)
350- if ((aM == aM))
351- then {
352- let aN = {
353- let m = aM
354- if ($isInstanceOf(m, "Int"))
355- then {
356- let aw = m
357- aw
358- }
359- else throw("can't get user collateral value")
360- }
361- if (!(G("setup_active")))
362- then throw("market is stopped")
363- else if ((indexOf(b, l) != unit))
364- then throw("this token cannot be borrowed")
365- else if (if (!(aJ))
366- then (0 > aN)
367- else false)
368- then throw("you have to supply more to borrow")
369- else {
370- let aO = D(("total_supplied_" + l))
371- let aP = D(("total_borrowed_" + l))
372- let aQ = D(((i + "_borrowed_") + l))
373- if ((aC > (aO - aP)))
374- then throw("this amount is not available")
375- else $Tuple2(([IntegerEntry(((i + "_borrowed_") + l), (aQ + aC)), IntegerEntry(("total_borrowed_" + l), (aP + aC))] ++ [IntegerEntry((l + "_bRate"), aL)]), ay)
376- }
377- }
378- else throw("Strict value is not equal to itself.")
379- }
380-
381-
382-@Callable(aR)
383-func flashPosition (aS,aT,aU,aV,aW,aX,aY) = if ((aR.caller != a))
342+@Callable(aN)
343+func flashPosition (aO,aP,aQ,aR,aS,aT,aU) = if ((aN.caller != b))
384344 then throw("available only for Axly protocol")
385345 else {
386- let aZ = aI(aU, aV, aS, true)
387- let ba = L(aU)
388- let bb = reentrantInvoke(addressFromStringValue(aW), aX, split(aY, ","), [AttachedPayment(ba, aV)])
389- if ((bb == bb))
346+ let aV = aG(aQ, aR, aO)
347+ let aW = L(aQ)
348+ let aX = reentrantInvoke(addressFromStringValue(aS), aT, split(aU, ","), [AttachedPayment(aW, aR)])
349+ if ((aX == aX))
390350 then {
391- let bc = {
392- let ap = bb
351+ let aY = {
352+ let ap = aX
393353 if ($isInstanceOf(ap, "Int"))
394354 then ap
395355 else throw(($getType(ap) + " couldn't be cast to Int"))
396356 }
397- if ((bc == bc))
357+ if ((aY == aY))
398358 then {
399- let bd = ax(aT, bc, aS)
400- let aN = {
401- let ap = invoke(this, "getUserCollateral", [false, aS, true, ((aT + ",supplied,") + toString(bc))], nil)
402- if ($isInstanceOf(ap, "Int"))
403- then ap
404- else throw(($getType(ap) + " couldn't be cast to Int"))
405- }
406- if ((aN == aN))
407- then {
408- let be = {
409- let ap = invoke(this, "getUserCollateral", [false, aS, true, ((aU + ",borrowed,") + toString(aV))], nil)
410- if ($isInstanceOf(ap, "Int"))
411- then ap
412- else throw(($getType(ap) + " couldn't be cast to Int"))
413- }
414- if ((be == be))
415- then if ((be > aN))
416- then throw("not enough collateral provided")
417- else (aZ._1 ++ bd._1)
418- else throw("Strict value is not equal to itself.")
419- }
420- else throw("Strict value is not equal to itself.")
359+ let aZ = at(aP, aY, aO)
360+ if ((aV._2._2 > aZ._2._2))
361+ then throw("not enough collateral provided")
362+ else (aV._1 ++ aZ._1)
421363 }
422364 else throw("Strict value is not equal to itself.")
423365 }
426368
427369
428370
429-@Callable(aR)
430-func supply () = if (if ((size(aR.payments) != 1))
371+@Callable(aN)
372+func supply () = if (if ((size(aN.payments) != 1))
431373 then true
432- else (aR.payments[0].amount == 0))
374+ else (aN.payments[0].amount == 0))
433375 then throw("1 payment has to be attached")
434376 else {
435- let l = J(aR.payments[0].assetId)
436- let ay = aR.payments[0].amount
437- let bf = invoke(c, "lendAction", [toString(aR.caller), l], nil)
438- if ((bf == bf))
439- then ax(l, ay, toString(aR.caller))
440- else throw("Strict value is not equal to itself.")
377+ let l = J(aN.payments[0].assetId)
378+ let au = aN.payments[0].amount
379+ if (G((l + a)))
380+ then throw("You can't supply lp")
381+ else {
382+ let ba = invoke(c, "lendAction", [toString(aN.caller), l], nil)
383+ if ((ba == ba))
384+ then at(l, au, toString(aN.caller))
385+ else throw("Strict value is not equal to itself.")
386+ }
441387 }
442388
443389
444390
445-@Callable(aR)
446-func withdraw (l,ay) = {
447- let bg = ad(l, "sRate")
448- let aA = bg._1
449- let aB = bg._2
450- let aC = fraction(ay, p, aA, CEILING)
451- let i = toString(aR.caller)
452- let aO = D(("total_supplied_" + l))
453- let aP = D(("total_borrowed_" + l))
454- let bh = D(((i + "_supplied_") + l))
455- let aQ = D(((i + "_borrowed_") + l))
456- let bf = invoke(c, "lendAction", [toString(aR.caller), l], nil)
457- if ((bf == bf))
391+@Callable(aN)
392+func withdraw (l,au) = {
393+ let bb = ah(l, "sRate")
394+ let aw = bb._1
395+ let ax = bb._2
396+ let ay = fraction(au, p, aw, CEILING)
397+ let i = toString(aN.caller)
398+ let aJ = D(("total_supplied_" + l))
399+ let aK = D(("total_borrowed_" + l))
400+ let bc = D(((i + "_supplied_") + l))
401+ let ba = invoke(c, "lendAction", [toString(aN.caller), l], nil)
402+ if ((ba == ba))
458403 then {
459- let aM = invoke(this, "getUserCollateral", [false, i, true, ((l + ",supplied,") + toString(-(aC)))], nil)
460- if ((aM == aM))
404+ let bd = invoke(this, "getUserCollateralV2", [false, i, l, "", false, ("supplied," + toString(-(ay)))], nil)
405+ if ((bd == bd))
461406 then {
462- let aN = {
463- let m = aM
407+ let be = {
408+ let m = bd
464409 if ($isInstanceOf(m, "Int"))
465410 then {
466- let aw = m
467- aw
411+ let aA = m
412+ aA
468413 }
469414 else throw("can't get user collateral value")
470415 }
471416 if (!(G("setup_active")))
472417 then throw("market is stopped")
473- else if ((0 > aN))
418+ else if ((0 > be))
474419 then throw("you dont have enough collateral for this operation")
475- else if ((aC > (aO - aP)))
420+ else if ((ay > (aJ - aK)))
476421 then throw("this amount is not available on the market")
477- else if ((aC > (bh - aQ)))
478- then throw("this amount is not available for this user")
479- else ([IntegerEntry(((i + "_supplied_") + l), (D(((i + "_supplied_") + l)) - aC)), IntegerEntry(("total_supplied_" + l), (D(("total_supplied_" + l)) - aC)), ScriptTransfer(aR.caller, ay, L(l))] ++ aB)
422+ else if ((ay > bc))
423+ then throw("this amount is not available on the market")
424+ else ([IntegerEntry(((i + "_supplied_") + l), (D(((i + "_supplied_") + l)) - ay)), IntegerEntry(("total_supplied_" + l), (D(("total_supplied_" + l)) - ay)), ScriptTransfer(aN.caller, au, L(l))] ++ ax)
480425 }
481426 else throw("Strict value is not equal to itself.")
482427 }
485430
486431
487432
488-@Callable(aR)
489-func repay () = if (!(G("setup_active")))
433+@Callable(aN)
434+func repayFor (i,bf) = if (!(G("setup_active")))
490435 then throw("market is stopped")
491- else if (if ((size(aR.payments) != 1))
492- then true
493- else (aR.payments[0].amount == 0))
494- then throw("1 payment has to be attached")
495- else {
496- let l = J(aR.payments[0].assetId)
497- let ay = aR.payments[0].amount
498- let bi = ad(l, "bRate")
499- let aL = bi._1
500- let aB = bi._2
501- let aC = fraction(ay, p, aL, CEILING)
502- let i = toString(aR.caller)
503- let aO = D(("total_supplied_" + l))
504- let aP = D(("total_borrowed_" + l))
505- let aQ = D(((i + "_borrowed_") + l))
506- let bj = (aQ - aC)
507- let bk = if ((bj >= 0))
508- then aC
509- else aQ
510- if ((indexOf(H("setup_tokens"), l) == unit))
511- then throw("this asset is not supported by the market")
512- else (([IntegerEntry(((i + "_borrowed_") + l), (aQ - bk)), IntegerEntry(("total_borrowed_" + l), (aP - bk))] ++ aB) ++ (if ((bj >= 0))
513- then nil
514- else [ScriptTransfer(aR.caller, -(bj), aR.payments[0].assetId)]))
515- }
436+ else if (!(j(aN.caller)))
437+ then throw("available only for whitelist")
438+ else if ((i == "global"))
439+ then throw("you can't repay for everyone :_)")
440+ else if (if ((size(aN.payments) != 1))
441+ then true
442+ else (aN.payments[0].amount == 0))
443+ then throw("1 payment has to be attached")
444+ else if (!(G((bf + a))))
445+ then throw("Wrong lp id")
446+ else {
447+ let l = J(aN.payments[0].assetId)
448+ let au = aN.payments[0].amount
449+ let bg = ah(l, "bRate")
450+ let aI = bg._1
451+ let ax = bg._2
452+ let ay = fraction(au, p, aI, CEILING)
453+ let aJ = D(("total_supplied_" + l))
454+ let aK = D(("total_borrowed_" + l))
455+ let aL = D(((i + "_borrowed_") + l))
456+ let bh = (aL - ay)
457+ let bi = if ((bh >= 0))
458+ then ay
459+ else aL
460+ let bj = if ((bh >= 0))
461+ then nil
462+ else [ScriptTransfer(aN.caller, -(bh), aN.payments[0].assetId)]
463+ let bk = if ((aN.caller == b))
464+ then {
465+ let bl = D(((i + "_supplied_") + bf))
466+ if ((bl > 0))
467+ then [IntegerEntry(((i + "_supplied_") + bf), 0), IntegerEntry(("total_supplied_" + bf), (D(("total_supplied_" + bf)) - bl))]
468+ else nil
469+ }
470+ else nil
471+ if ((indexOf(H("setup_tokens"), l) == unit))
472+ then throw("this asset is not supported by the market")
473+ else ((([IntegerEntry(((i + "_borrowed_") + l), (aL - bi)), IntegerEntry(("total_borrowed_" + l), (aK - bi))] ++ ax) ++ bj) ++ bk)
474+ }
516475
517476
518477
519-@Callable(aR)
520-func repayFor (i) = if (!(G("setup_active")))
521- then throw("market is stopped")
522- else if (!(j(aR.caller)))
523- then throw("available only for whitelist")
524- else if ((i == "global"))
525- then throw("you can't repay for everyone :_)")
526- else if (if ((size(aR.payments) != 1))
527- then true
528- else (aR.payments[0].amount == 0))
529- then throw("1 payment has to be attached")
530- else {
531- let l = J(aR.payments[0].assetId)
532- let ay = aR.payments[0].amount
533- let bl = ad(l, "bRate")
534- let aL = bl._1
535- let aB = bl._2
536- let aC = fraction(ay, p, aL, CEILING)
537- let aO = D(("total_supplied_" + l))
538- let aP = D(("total_borrowed_" + l))
539- let aQ = D(((i + "_borrowed_") + l))
540- let bj = (aQ - aC)
541- let bk = if ((bj >= 0))
542- then aC
543- else aQ
544- let bm = if ((bj >= 0))
545- then nil
546- else [ScriptTransfer(aR.caller, -(bj), aR.payments[0].assetId)]
547- let bn = if ((aR.caller == a))
548- then {
549- func bo (u,l) = {
550- let bp = D(((i + "_borrowed_") + l))
551- if ((bp > 0))
552- then (u ++ [IntegerEntry(((i + "_supplied_") + l), 0), IntegerEntry(("total_supplied_" + l), (D(("total_supplied_" + l)) - bp))])
553- else u
554- }
555-
556- let w = b
557- let x = size(w)
558- let y = nil
559- func z (A,B) = if ((B >= x))
560- then A
561- else bo(A, w[B])
562-
563- func C (A,B) = if ((B >= x))
564- then A
565- else throw("List size exceeds 8")
566-
567- C(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8)
568- }
569- else nil
570- if ((indexOf(H("setup_tokens"), l) == unit))
571- then throw("this asset is not supported by the market")
572- else ((([IntegerEntry(((i + "_borrowed_") + l), (aQ - bk)), IntegerEntry(("total_borrowed_" + l), (aP - bk))] ++ aB) ++ bm) ++ bn)
573- }
574-
575-
576-
577-@Callable(aR)
478+@Callable(aN)
578479 func addInterestEXTERNAL () = {
579- let aC = fraction(aR.payments[0].amount, 80, 100)
580- let K = aR.payments[0].assetId
480+ let ay = fraction(aN.payments[0].amount, 80, 100)
481+ let K = aN.payments[0].assetId
581482 let l = J(K)
582- let bq = D(("autostake_lastEarned_" + l))
583- let br = D(("autostake_lastBlock_" + l))
584- let bs = if (if ((br == height))
483+ let bm = D(("autostake_lastEarned_" + l))
484+ let bn = D(("autostake_lastBlock_" + l))
485+ let bo = if (if ((bn == height))
585486 then true
586- else (aC == 0))
487+ else (ay == 0))
587488 then nil
588- else [IntegerEntry(("autostake_preLastEarned_" + l), bq), IntegerEntry(("autostake_preLastBlock_" + l), br), IntegerEntry(("autostake_lastEarned_" + l), (bq + aC)), IntegerEntry(("autostake_lastBlock_" + l), height)]
589- (bs ++ [IntegerEntry((l + "_sRate"), (D((l + "_sRate")) + fraction(p, aC, D(("total_supplied_" + l)))))])
489+ else [IntegerEntry(("autostake_preLastEarned_" + l), bm), IntegerEntry(("autostake_preLastBlock_" + l), bn), IntegerEntry(("autostake_lastEarned_" + l), (bm + ay)), IntegerEntry(("autostake_lastBlock_" + l), height)]
490+ (bo ++ [IntegerEntry((l + "_sRate"), (D((l + "_sRate")) + fraction(p, ay, D(("total_supplied_" + l)))))])
590491 }
591492
592493
593494
594-@Callable(aR)
595-func preInit (bt,bu,bv,bw) = {
495+@Callable(aN)
496+func preInit (bp,bq,br,bs) = {
596497 func t (u,af) = (u ++ [IntegerEntry((af + "_bRate"), p), IntegerEntry((af + "_sRate"), p)])
597498
598- if ((aR.caller != this))
499+ if ((aN.caller != this))
599500 then throw("admin only")
600501 else {
601- let ai = {
602- let w = split(bt, ",")
502+ let aj = {
503+ let w = split(bp, ",")
603504 let x = size(w)
604505 let y = nil
605506 func z (A,B) = if ((B >= x))
612513
613514 C(z(z(z(z(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
614515 }
615- ([StringEntry("setup_tokens", bt), StringEntry("setup_ltvs", bu), StringEntry("setup_lts", bv), StringEntry("setup_penalties", bw), BooleanEntry("setup_active", true)] ++ ai)
516+ ([StringEntry("setup_tokens", bp), StringEntry("setup_ltvs", bq), StringEntry("setup_lts", br), StringEntry("setup_penalties", bs), BooleanEntry("setup_active", true)] ++ aj)
616517 }
617518 }
618519
619520
620521
621-@Callable(aR)
622-func initNewToken (af,bx,by,bz) = if (if ((aR.caller != this))
623- then (aR.caller != Address(base58'3P3o9cLTV2u9N4nYNKRYL6gy6cUEU9DwXW8'))
522+@Callable(aN)
523+func initNewToken (af,bt,bu,bv) = if (if ((aN.caller != this))
524+ then (aN.caller != Address(base58'3P3o9cLTV2u9N4nYNKRYL6gy6cUEU9DwXW8'))
624525 else false)
625526 then throw("admin only")
626- else [StringEntry("setup_tokens", ((H("setup_tokens") + ",") + af)), StringEntry("setup_ltvs", ((H("setup_ltvs") + ",") + bx)), StringEntry("setup_lts", ((H("setup_lts") + ",") + by)), StringEntry("setup_penalties", ((H("setup_penalties") + ",") + bz)), IntegerEntry((af + "_bRate"), p), IntegerEntry((af + "_sRate"), p)]
527+ else [StringEntry("setup_tokens", ((H("setup_tokens") + ",") + af)), StringEntry("setup_ltvs", ((H("setup_ltvs") + ",") + bt)), StringEntry("setup_lts", ((H("setup_lts") + ",") + bu)), StringEntry("setup_penalties", ((H("setup_penalties") + ",") + bv)), IntegerEntry((af + "_bRate"), p), IntegerEntry((af + "_sRate"), p), IntegerEntry((af + "_lastRateHeight"), height)]
627528
628529
629530
630-@Callable(aR)
631-func updateParameter (E,bA) = if (if ((aR.caller != this))
632- then (aR.caller != Address(base58'3P3o9cLTV2u9N4nYNKRYL6gy6cUEU9DwXW8'))
531+@Callable(aN)
532+func initNewLPToken (af) = if (if ((aN.caller != this))
533+ then (aN.caller != Address(base58'3P3o9cLTV2u9N4nYNKRYL6gy6cUEU9DwXW8'))
633534 else false)
634535 then throw("admin only")
635- else [IntegerEntry(E, parseIntValue(bA))]
536+ else [BooleanEntry((af + "_axlyLp"), true)]
636537
637538
638539
639-@Callable(aR)
640-func updateString (E,bA) = if (if ((aR.caller != this))
641- then (aR.caller != Address(base58'3P3o9cLTV2u9N4nYNKRYL6gy6cUEU9DwXW8'))
540+@Callable(aN)
541+func updateParameter (E,bw) = if (if ((aN.caller != this))
542+ then (aN.caller != Address(base58'3P3o9cLTV2u9N4nYNKRYL6gy6cUEU9DwXW8'))
642543 else false)
643544 then throw("admin only")
644- else [StringEntry(E, bA)]
545+ else [IntegerEntry(E, parseIntValue(bw))]
645546
646547
647548
648-@Callable(aR)
649-func claimToReserveFund (bB) = {
650- let bC = N()
651- let ai = ad(bC[0], "sRate")._2
652- let s = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
653- func t (u,bD) = if ((bD >= size(bC)))
654- then u
655- else {
656- let l = bC[bD]
657- let bE = H(("autostake_amount_" + l))
658- let aC = ((((M(l) + D(("autostake_amount_" + l))) + (if ((bE != ""))
659- then parseIntValue(bE)
660- else 0)) + fraction(D(("total_borrowed_" + l)), ai[((bD * 3) + 1)].value, p)) - fraction(D(("total_supplied_" + l)), ai[(bD * 3)].value, p))
661- let bF = if ((D(("autostake_amount_" + l)) > 0))
662- then invoke(this, "unstakeToken", [l, max([aC, 0])], nil)
663- else 0
664- if ((bF == bF))
665- then (u ++ [aC])
666- else throw("Strict value is not equal to itself.")
667- }
549+@Callable(aN)
550+func updateString (E,bw) = if (if ((aN.caller != this))
551+ then (aN.caller != Address(base58'3P3o9cLTV2u9N4nYNKRYL6gy6cUEU9DwXW8'))
552+ else false)
553+ then throw("admin only")
554+ else [StringEntry(E, bw)]
668555
669- let bG = {
670- let w = s
671- let x = size(w)
672- let y = nil
673- func z (A,B) = if ((B >= x))
674- then A
675- else t(A, w[B])
676556
677- func C (A,B) = if ((B >= x))
678- then A
679- else throw("List size exceeds 12")
680557
681- C(z(z(z(z(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
558+@Callable(aN)
559+func claimToReserveFund (bx) = {
560+ let by = N()
561+ let aj = ad(by[0], "sRate")._2
562+ func t (bz,l) = {
563+ let bA = bz
564+ let u = bA._1
565+ let bB = bA._2
566+ let bC = H(("autostake_amount_" + l))
567+ let ay = ((((M(l) + D(("autostake_amount_" + l))) + (if ((bC != ""))
568+ then parseIntValue(bC)
569+ else 0)) + fraction(D(("total_borrowed_" + l)), aj[((bB * 3) + 1)].value, p)) - fraction(D(("total_supplied_" + l)), aj[(bB * 3)].value, p))
570+ let bD = if ((D(("autostake_amount_" + l)) > 0))
571+ then invoke(this, "unstakeToken", [l, max([ay, 0])], nil)
572+ else 0
573+ if ((bD == bD))
574+ then $Tuple2((u ++ [ay]), (bB + 1))
575+ else throw("Strict value is not equal to itself.")
682576 }
683- func bH (u,bD) = if ((bD >= size(bC)))
684- then u
685- else {
686- let l = bC[bD]
687- (u ++ [ScriptTransfer(d, max([bG[bD], 0]), L(l))])
688- }
689577
690- if (bB)
691- then throw(r(bG))
578+ let bE = ( let w = by
579+ let x = size(w)
580+ let y = $Tuple2(nil, 0)
581+ func z (A,B) = if ((B >= x))
582+ then A
583+ else t(A, w[B])
584+
585+ func C (A,B) = if ((B >= x))
586+ then A
587+ else throw("List size exceeds 100")
588+
589+ C(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100))._1
590+ func bF (bz,l) = {
591+ let bG = bz
592+ let u = bG._1
593+ let bB = bG._2
594+ $Tuple2((u ++ [ScriptTransfer(d, max([bE[bB], 0]), L(l))]), (bB + 1))
595+ }
596+
597+ if (bx)
598+ then throw(r(bE))
692599 else $Tuple2({
693- let w = s
600+ let w = by
694601 let x = size(w)
695- let y = nil
602+ let y = $Tuple2(nil, 0)
603+ func bH (A,B) = if ((B >= x))
604+ then A
605+ else bF(A, w[B])
606+
696607 func bI (A,B) = if ((B >= x))
697608 then A
698- else bH(A, w[B])
609+ else throw("List size exceeds 100")
699610
700- func bJ (A,B) = if ((B >= x))
701- then A
702- else throw("List size exceeds 12")
703-
704- bJ(bI(bI(bI(bI(bI(bI(bI(bI(bI(bI(bI(bI(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
705- }, bG)
611+ bI(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
612+ }, bE)._1
706613 }
707614
708615
709616
710-@Callable(aR)
711-func shutdown (bK) = if ((indexOf(g, aR.caller.bytes) == unit))
617+@Callable(aN)
618+func shutdown (bJ) = if ((indexOf(g, aN.caller.bytes) == unit))
712619 then throw("user not in a whitelist")
713- else [BooleanEntry("setup_active", !(bK))]
620+ else [BooleanEntry("setup_active", !(bJ))]
714621
715622
716623
717-@Callable(aR)
718-func liquidate (bB,i,ay,aT,aU,bL) = if (!(h(aR.caller)))
624+@Callable(aN)
625+func liquidateV2 (bx,i,aP,aQ,bK) = if (!(h(aN.caller)))
719626 then throw("available for whitelist only")
720627 else if (!(G("setup_active")))
721628 then throw("market is stopped")
722629 else {
723- let bM = at(i)
724- if ((bM == bM))
630+ let bd = invoke(this, "getUserCollateralV2", [false, i, aP, aQ, true, ""], nil)
631+ if ((bd == bd))
725632 then {
726- let bN = ad(aT, "sRate")
727- let aA = bN._1
728- let bO = bN._2
729- let bP = ad(aU, "bRate")
730- let aL = bP._1
731- let bQ = bP._2
732- let bR = fraction(ay, p, aA)
733- let bS = D(((i + "_supplied_") + aT))
734- let bT = D(((i + "_borrowed_") + aU))
735- let bU = if ((bT > 0))
736- then bT
737- else throw("user has no borrow in this token")
738- if ((bM > 0))
739- then throw("user can't be liquidated")
740- else if ((bR > bS))
741- then throw("position to liquidate is bigger than user's supply")
742- else {
743- let bF = if ((indexOf(b, aT) != unit))
744- then {
745- let bV = split(i, "_")[1]
746- let bW = split(i, "_")[0]
747- reentrantInvoke(a, "liquidate", [bW, bV, bR], nil)
748- }
749- else nil
750- if ((bF == bF))
751- then {
752- let bX = M(aT)
753- if ((bX == bX))
754- then {
755- let bY = M(aU)
756- if ((bY == bY))
757- then {
758- let bZ = invoke(f, "swap", [bL, 0], [AttachedPayment(L(aT), ay)])
759- if ((bZ == bZ))
760- then {
761- let ca = (bX - M(aT))
762- if ((ca == ca))
763- then {
764- let cb = (M(aU) - bY)
765- if ((cb == cb))
766- then {
767- let cc = aq(aT)._1
768- let cd = ar(aT)
769- let ce = fraction(ca, cc, cd)
770- let cf = aq(aU)._2
771- let cg = ar(aU)
772- let ch = fraction(cb, cf, cg)
773- let bz = parseIntValue(split(H("setup_penalties"), ",")[value(indexOf(N(), aU))])
774- let ci = (ch - fraction(ce, (n - bz), n))
775- let cj = fraction(ca, p, aA)
776- let ck = fraction(fraction(cb, p, aL), (n - fraction(ci, n, ch)), n)
777- if ((ca > ay))
778- then throw("more assets exchanged than expected")
779- else if ((0 > ci))
780- then throw("price impact is bigger than liquidation penalty")
781- else [IntegerEntry(((i + "_supplied_") + aT), (bS - cj)), IntegerEntry(((i + "_borrowed_") + aU), (bU - ck)), IntegerEntry(("total_supplied_" + aT), (D(("total_supplied_" + aT)) - cj)), IntegerEntry(("total_borrowed_" + aU), (D(("total_borrowed_" + aU)) - ck))]
782- }
783- else throw("Strict value is not equal to itself.")
784- }
785- else throw("Strict value is not equal to itself.")
786- }
787- else throw("Strict value is not equal to itself.")
788- }
789- else throw("Strict value is not equal to itself.")
790- }
791- else throw("Strict value is not equal to itself.")
792- }
793- else throw("Strict value is not equal to itself.")
633+ let bL = {
634+ let m = bd
635+ if ($isInstanceOf(m, "Int"))
636+ then {
637+ let aA = m
638+ aA
794639 }
795- }
796- else throw("Strict value is not equal to itself.")
797- }
798-
799-
800-
801-@Callable(aR)
802-func liquidateV2 (bB,i,aT,aU,cl) = if (!(h(aR.caller)))
803- then throw("available for whitelist only")
804- else if (!(G("setup_active")))
805- then throw("market is stopped")
806- else {
807- let bM = at(i)
808- if ((bM == bM))
809- then {
810- let bS = D(((i + "_supplied_") + aT))
811- let bU = D(((i + "_borrowed_") + aU))
812- if ((indexOf(b, aT) == unit))
640+ else throw("can't get user collateral value")
641+ }
642+ let bM = D(((i + "_supplied_") + aP))
643+ let bN = D(((i + "_borrowed_") + aQ))
644+ if (!(G((aP + a))))
813645 then throw("wrong lp asset")
814- else if ((0 >= bU))
646+ else if ((0 >= bN))
815647 then throw("user has no borrow in this token")
816- else if (if ((bM > 0))
648+ else if (if ((bL > 0))
817649 then true
818- else (bU == 0))
650+ else (bN == 0))
819651 then throw("user can't be liquidated")
820652 else {
821- let ba = L(aU)
822- let cm = N()
823- let cn = value(indexOf(cm, aU))
824- let co = value(indexOf(cm, aT))
825- let bz = parseIntValue(value(split(H("setup_penalties"), ",")[cn]))
826- let cp = ad(aU, "bRate")
827- let aL = cp._1
828- let bO = cp._2
829- let aV = fraction(bU, aL, p)
830- let cq = fraction(aV, cl, 100)
831- let cr = fraction(cq, (n + bz), n)
832- let cs = fraction(cq, p, aL)
833- let bV = split(i, "_")[1]
834- let bW = split(i, "_")[0]
835- let ct = {
836- let ap = reentrantInvoke(a, "liquidate", [bW, bV, cr], nil)
653+ let aW = L(aQ)
654+ let bO = N()
655+ let bP = value(indexOf(bO, aQ))
656+ let bQ = value(indexOf(bO, aP))
657+ let bv = parseIntValue(value(split(H("setup_penalties"), ",")[bP]))
658+ let bR = ah(aQ, "bRate")
659+ let aI = bR._1
660+ let bS = bR._2
661+ let aR = fraction(bN, aI, p)
662+ let bT = fraction(aR, bK, 100)
663+ let bU = fraction(bT, (n + bv), n)
664+ let bV = fraction(bT, p, aI)
665+ let bW = split(i, "_")[1]
666+ let bX = split(i, "_")[0]
667+ let bY = {
668+ let ap = reentrantInvoke(b, "liquidate", [bX, bW, bU], nil)
837669 if ($isInstanceOf(ap, "Int"))
838670 then ap
839671 else throw(($getType(ap) + " couldn't be cast to Int"))
840672 }
841- if ((ct == ct))
673+ if ((bY == bY))
842674 then {
843- let bc = fraction(ct, p, bO[((co * 3) + 1)].value)
844- if (bB)
675+ let aY = fraction(bY, p, bS[1].value)
676+ if (bx)
845677 then throw("liquidation will pass")
846- else ([ScriptTransfer(aR.caller, (cr - cq), ba), IntegerEntry(((i + "_supplied_") + aT), (bS - bc)), IntegerEntry(((i + "_borrowed_") + aU), (bU - cs)), IntegerEntry(("total_supplied_" + aT), (D(("total_supplied_" + aT)) - bc)), IntegerEntry(("total_borrowed_" + aU), (D(("total_borrowed_" + aU)) - cs))] ++ bO)
678+ else ([ScriptTransfer(aN.caller, (bU - bT), aW), IntegerEntry(((i + "_supplied_") + aP), (bM - aY)), IntegerEntry(((i + "_borrowed_") + aQ), (bN - bV)), IntegerEntry(("total_supplied_" + aP), (D(("total_supplied_" + aP)) - aY)), IntegerEntry(("total_borrowed_" + aQ), (D(("total_borrowed_" + aQ)) - bV))] ++ bS)
847679 }
848680 else throw("Strict value is not equal to itself.")
849681 }
853685
854686
855687
856-@Callable(aR)
857-func getUserCollateral (bB,i,cu,cv) = {
858- let bC = N()
859- let bu = split(H("setup_ltvs"), ",")
860- let bv = split(H("setup_lts"), ",")
861- let ai = ad(bC[0], "sRate")._2
862- let cw = split(cv, ",")
863- func t (u,v) = if ((v >= size(bC)))
688+@Callable(aN)
689+func getUserCollateral (bx,i,bZ,ca) = {
690+ let by = N()
691+ let bq = split(H("setup_ltvs"), ",")
692+ let br = split(H("setup_lts"), ",")
693+ let aj = ad(by[0], "sRate")._2
694+ let cb = split(ca, ",")
695+ func t (u,v) = if ((v >= size(by)))
864696 then u
865697 else {
866- let bp = D(((i + "_supplied_") + bC[v]))
867- let cx = D(((i + "_borrowed_") + bC[v]))
868- let cy = if ((cv == ""))
869- then if (if ((cx != 0))
698+ let bl = D(((i + "_supplied_") + by[v]))
699+ let cc = D(((i + "_borrowed_") + by[v]))
700+ let cd = if ((ca == ""))
701+ then if (if ((cc != 0))
870702 then true
871- else (bp != 0))
703+ else (bl != 0))
872704 then true
873705 else false
874706 else true
875- if (cy)
707+ if (cd)
876708 then {
877- let aG = ar(bC[v])
878- let aE = aq(bC[v])
879- ((u + fraction(fraction(fraction((bp + (if (if (if ((cv != ""))
880- then (cw[0] == bC[v])
709+ let aD = ar(by[v])
710+ let aB = aq(by[v])
711+ ((u + fraction(fraction(fraction((bl + (if (if (if ((ca != ""))
712+ then (cb[0] == by[v])
881713 else false)
882- then (cw[1] == "supplied")
714+ then (cb[1] == "supplied")
883715 else false)
884- then parseIntValue(cw[2])
885- else 0)), ai[(v * 3)].value, p), parseIntValue(bu[v]), n), aE._1, aG)) - (if (cu)
886- then fraction(fraction(fraction((cx + (if (if (if ((cv != ""))
887- then (cw[0] == bC[v])
716+ then parseIntValue(cb[2])
717+ else 0)), aj[(v * 3)].value, p), parseIntValue(bq[v]), n), aB._1, aD)) - (if (bZ)
718+ then fraction(fraction(fraction((cc + (if (if (if ((ca != ""))
719+ then (cb[0] == by[v])
888720 else false)
889- then (cw[1] == "borrowed")
721+ then (cb[1] == "borrowed")
890722 else false)
891- then parseIntValue(cw[2])
892- else 0)), ai[((v * 3) + 1)].value, p), n, parseIntValue(bv[v])), aE._2, aG)
723+ then parseIntValue(cb[2])
724+ else 0)), aj[((v * 3) + 1)].value, p), n, parseIntValue(br[v])), aB._2, aD)
893725 else 0))
894726 }
895727 else u
896728 }
897729
898- let cz = {
730+ let ce = {
899731 let w = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
900732 let x = size(w)
901733 let y = 0
909741
910742 C(z(z(z(z(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
911743 }
912- if (bB)
913- then throw(toString(cz))
914- else $Tuple2(nil, cz)
744+ if (bx)
745+ then throw(toString(ce))
746+ else $Tuple2(nil, ce)
915747 }
916748
917749
918750
919-@Callable(aR)
920-func getAssetDebt (bB,i,l) = {
921- let cx = D(((i + "_borrowed_") + l))
922- let aG = ar(l)
923- let V = ad(l, "bRate")._1
924- let cz = fraction(cx, V, p)
925- if (bB)
926- then throw(toString(cz))
927- else $Tuple2(nil, cz)
751+@Callable(aN)
752+func getUserCollateralV2 (bx,i,cf,aW,bZ,ca) = {
753+ let by = N()
754+ let cg = valueOrErrorMessage(indexOf(by, cf), "Wrong sAssetId")
755+ let bq = split(H("setup_ltvs"), ",")
756+ let br = split(H("setup_lts"), ",")
757+ let ch = ah(cf, "sRate")
758+ let cb = split(ca, ",")
759+ let bl = D(((i + "_supplied_") + cf))
760+ let cc = D(((i + "_borrowed_") + aW))
761+ let ci = if (if ((ca != ""))
762+ then (cb[0] == "supplied")
763+ else false)
764+ then parseIntValue(cb[1])
765+ else 0
766+ let cj = ar(cf)
767+ let ck = aq(cf)
768+ let ce = (fraction(fraction(fraction((bl + ci), ch._1, p), parseIntValue(bq[cg]), n), ck._1, cj) - (if (bZ)
769+ then {
770+ let cl = valueOrErrorMessage(indexOf(by, aW), "Wrong bAssetId")
771+ let cm = ah(aW, "bRate")
772+ let cn = if (if ((ca != ""))
773+ then (cb[0] == "borrowed")
774+ else false)
775+ then parseIntValue(cb[1])
776+ else 0
777+ let co = ar(aW)
778+ let cp = aq(aW)
779+ fraction(fraction(fraction((cc + cn), cm._1, p), n, parseIntValue(br[cl])), cp._2, co)
780+ }
781+ else 0))
782+ if (bx)
783+ then throw(toString(ce))
784+ else $Tuple2(nil, ce)
928785 }
929786
930787
931788
932-@Callable(aR)
933-func getPrices (bB) = {
934- let bC = N()
935- func t (u,v) = if ((v >= size(bC)))
936- then u
937- else {
938- let aE = ak(bC[v], 3)
939- ((((u + toString(aE._1)) + ",") + toString(aE._2)) + "|")
940- }
789+@Callable(aN)
790+func getAssetDebt (bx,i,l) = {
791+ let cc = D(((i + "_borrowed_") + l))
792+ let aD = ar(l)
793+ let V = ah(l, "bRate")._1
794+ let ce = fraction(cc, V, p)
795+ if (bx)
796+ then throw(toString(ce))
797+ else $Tuple2(nil, ce)
798+ }
941799
942- let cz = {
943- let w = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
800+
801+
802+@Callable(aN)
803+func getPrices (bx) = {
804+ let by = N()
805+ func t (u,l) = {
806+ let aB = ak(l, 3)
807+ ((((u + toString(aB._1)) + ",") + toString(aB._2)) + "|")
808+ }
809+
810+ let ce = {
811+ let w = by
944812 let x = size(w)
945813 let y = ""
946814 func z (A,B) = if ((B >= x))
949817
950818 func C (A,B) = if ((B >= x))
951819 then A
952- else throw("List size exceeds 12")
820+ else throw("List size exceeds 100")
953821
954- C(z(z(z(z(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
822+ C(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
955823 }
956- if (bB)
957- then throw(cz)
958- else $Tuple2(nil, cz)
824+ if (bx)
825+ then throw(ce)
826+ else $Tuple2(nil, ce)
959827 }
960828
961829
962830
963-@Callable(aR)
964-func calculateUtilizationRatio (l,bB) = if (bB)
965- then throw(toString(ah(l)))
966- else $Tuple2(nil, ah(l))
831+@Callable(aN)
832+func calculateUtilizationRatio (l,bx) = if (bx)
833+ then throw(toString(ai(l)))
834+ else $Tuple2(nil, ai(l))
967835
968836
969837
970-@Callable(aR)
971-func calculateOutdatedUR (l,bB) = if (bB)
838+@Callable(aN)
839+func calculateOutdatedUR (l,bx) = if (bx)
972840 then throw(toString(Q(l)))
973841 else $Tuple2(nil, Q(l))
974842
975843
976844
977-@Callable(aR)
978-func calculateTokenRates (bB) = {
845+@Callable(aN)
846+func calculateTokenRates (bx) = {
979847 func t (u,l) = {
980- let ai = W(l)
981- $Tuple2(((((u._1 + toString(ai[1].value)) + "|") + toString(ai[0].value)) + ","), (u._2 ++ ai))
848+ let aj = W(l)
849+ $Tuple2(((((u._1 + toString(aj[1].value)) + "|") + toString(aj[0].value)) + ","), (u._2 ++ aj))
982850 }
983851
984- let bG = {
852+ let bE = {
985853 let w = N()
986854 let x = size(w)
987855 let y = $Tuple2("", nil)
991859
992860 func C (A,B) = if ((B >= x))
993861 then A
994- else throw("List size exceeds 12")
862+ else throw("List size exceeds 100")
995863
996- C(z(z(z(z(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
864+ C(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
997865 }
998- if (bB)
999- then throw(bG._1)
1000- else $Tuple2(bG._2, bG._1)
866+ if (bx)
867+ then throw(bE._1)
868+ else $Tuple2(bE._2, bE._1)
1001869 }
1002870
1003871
1004872
1005-@Callable(aR)
1006-func calculateTokensInterest (bB) = {
873+@Callable(aN)
874+func calculateTokensInterest (bx) = {
1007875 func t (u,l) = {
1008876 let V = fraction(S(l), q, n)
1009877 ((u + toString(V)) + ",")
1010878 }
1011879
1012- let bG = {
880+ let bE = {
1013881 let w = N()
1014882 let x = size(w)
1015883 let y = ""
1019887
1020888 func C (A,B) = if ((B >= x))
1021889 then A
1022- else throw("List size exceeds 12")
890+ else throw("List size exceeds 100")
1023891
1024- C(z(z(z(z(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
892+ C(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
1025893 }
1026- if (bB)
1027- then throw(bG)
1028- else $Tuple2(nil, bG)
894+ if (bx)
895+ then throw(bE)
896+ else $Tuple2(nil, bE)
1029897 }
1030898
1031899
1032-@Verifier(cA)
1033-func cB () = if (if (if (sigVerify(cA.bodyBytes, cA.proofs[0], base58'J4QQBsh6FGgZbijQPMDZ7GtNALx2N15K3eHvGhjq43Lt'))
900+@Verifier(cq)
901+func cr () = if (if (if (if (sigVerify(cq.bodyBytes, cq.proofs[0], base58'J4QQBsh6FGgZbijQPMDZ7GtNALx2N15K3eHvGhjq43Lt'))
1034902 then true
1035- else sigVerify(cA.bodyBytes, cA.proofs[0], base58'Ajf56x532JLzVoourPv9FW75kYsvScNxztPnt1enhNkS'))
903+ else sigVerify(cq.bodyBytes, cq.proofs[0], base58'Ajf56x532JLzVoourPv9FW75kYsvScNxztPnt1enhNkS'))
1036904 then true
1037- else if (sigVerify(cA.bodyBytes, cA.proofs[0], base58'CYCxuKusNeomQkH9wbcEd4rRP1mDYMc7bw8pr82Agi4N'))
1038- then sigVerify(cA.bodyBytes, cA.proofs[0], base58'3oqguA2LUTZFFjJCJ62UybbXFTLwv88tSJ3oMrNSGhiA')
1039- else false)
905+ else sigVerify(cq.bodyBytes, cq.proofs[0], base58'CYCxuKusNeomQkH9wbcEd4rRP1mDYMc7bw8pr82Agi4N'))
1040906 then true
1041- else sigVerify(cA.bodyBytes, cA.proofs[0], base58'9t2BGHP6EddYu5xvArqDkhHPGbf8ZiYUaWgFcEPtRZhE')
907+ else sigVerify(cq.bodyBytes, cq.proofs[0], base58'D2QvCRmindBLJfAb2GWftPgjkLUZFsoCiYxJFDisaKqN'))
908+ then if (sigVerify(cq.bodyBytes, cq.proofs[1], base58'3oqguA2LUTZFFjJCJ62UybbXFTLwv88tSJ3oMrNSGhiA'))
909+ then true
910+ else sigVerify(cq.bodyBytes, cq.proofs[1], base58'9t2BGHP6EddYu5xvArqDkhHPGbf8ZiYUaWgFcEPtRZhE')
911+ else false
1042912
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let a = Address(base58'3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW')
4+let a = "_axlyLP"
55
6-let b = ["7KZbJrVopwJhkdwbe1eFDBbex4dkY63MxjTNjqXtrzj1", "Btw3G1j4wQgdp49PTxaFkNvn75dQtqGDM7ejQppHnWC1", "BiSzFe8nSL78oZaebfoin5vBZ5Pze6d7kaeijLqr5xZe", "F2AKkA513k5yHEJkLsU6vWxCYYk811GpjLhwEv2WGwZ9", "4CQ5CPGLXLbWBUs2JBjKUaRqF49CmKHkwzvPgSvQpAQV", "6iMB6LKSrgv9waEvEnN6Ydyx7dfxPnGcTw8318WVm5bR"]
6+let b = Address(base58'3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW')
77
88 let c = Address(base58'3P37f8Y3rNpKzSkHNVZMAStXdpmNBgftHN9')
99
1010 let d = Address(base58'3P4kBiU4wr2yV1S5gMfu3MdkVvy7kxXHsKe')
1111
1212 let e = 20
1313
1414 let f = Address(base58'3PGFHzVGT4NTigwCKP1NcwoXkodVZwvBuuU')
1515
1616 let g = [base58'3PMcMiMEs6w56NRGacksXtFG5zS7doE9fpL', base58'3PAxdDSmN758L5SHSGRC5apEtQE2aApZotG', base58'3PJKmXoHJvVeQXjSJdhtkUcFDtdiQqMbUTD', base58'3PQdNxynJy5mche2kxMVc5shXWzK8Gstq3o', base58'3PHbdpaKzz8EiAngGHaFu2hVuNCdsC67qh3', base58'3P6Ksahs71SiKQgQ4qaZuFAVhqncdi2nvJQ']
1717
1818 func h (i) = !(if (if (if ((i != Address(base58'3PFHNdEPu71QwBAnc2HZPcrbxoseNfUvHEA')))
1919 then (i != Address(base58'3PCqdm1mAoQqR46oZotFanmqb5CLUvrKEo2'))
2020 else false)
2121 then (i != Address(base58'3PMcMiMEs6w56NRGacksXtFG5zS7doE9fpL'))
2222 else false)
2323 then (i != Address(base58'3PHbdpaKzz8EiAngGHaFu2hVuNCdsC67qh3'))
2424 else false)
2525
2626
2727 func j (i) = !(if ((i != d))
28- then (i != a)
28+ then (i != b)
2929 else false)
3030
3131
3232 func k (l) = {
3333 let m = l
3434 if (("9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi" == m))
3535 then $Tuple4(2000000, 25000000, 80000000, 100000000)
3636 else if (("HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW" == m))
3737 then $Tuple4(2000000, 25000000, 80000000, 100000000)
3838 else if (("34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ" == m))
3939 then $Tuple4(2000000, 25000000, 80000000, 100000000)
4040 else if (("6XtHjpXbs9RRJP2Sr9GUyVqzACcby9TkThHXnjVC5CDJ" == m))
4141 then $Tuple4(2000000, 25000000, 80000000, 100000000)
4242 else if (("DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p" == m))
4343 then $Tuple4(2000000, 25000000, 80000000, 100000000)
4444 else if (("Ajso6nTTjptu2UHLx6hfSXVtHFtRBJCkKYd5SAyj7zf5" == m))
4545 then $Tuple4(2000000, 40000000, 80000000, 150000000)
4646 else if (("HEB8Qaw9xrWpWs8tHsiATYGBWDBtP2S7kcPALrMu43AS" == m))
4747 then $Tuple4(0, 20000000, 80000000, 40000000)
4848 else if (("WAVES" == m))
4949 then $Tuple4(2000000, 30000000, 80000000, 50000000)
5050 else if (("Atqv59EYzjFGuitKVnMRk6H8FukjoV3ktPorbEys25on" == m))
5151 then $Tuple4(0, 20000000, 80000000, 40000000)
5252 else if (("DSbbhLsSTeDg5Lsiufk2Aneh3DjVqJuPr2M9uU1gwy5p" == m))
5353 then $Tuple4(0, 20000000, 80000000, 100000000)
5454 else if (("8t4DPWTwPzpatHA9AkTxWAB47THnYzBsDnoY7fQqbG91" == m))
5555 then $Tuple4(0, 30000000, 80000000, 40000000)
5656 else if (("At8D6NFFpheCbvKVnjVoeLL84Eo8NZn6ovManxfLaFWL" == m))
5757 then $Tuple4(0, 25000000, 80000000, 40000000)
5858 else if (("8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS" == m))
5959 then $Tuple4(2000000, 30000000, 80000000, 50000000)
6060 else if (("474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu" == m))
6161 then $Tuple4(2000000, 30000000, 80000000, 50000000)
6262 else if (("5UYBPpq4WoU5n4MwpFkgJnW3Fq4B1u3ukpK33ik4QerR" == m))
6363 then $Tuple4(2000000, 30000000, 80000000, 50000000)
6464 else if (("2thsACuHmzDMuNezPM32wg9a3BwUzBWDeSKakgz3cw21" == m))
6565 then $Tuple4(2000000, 40000000, 80000000, 100000000)
6666 else if (("YiNbofFzC17jEHHCMwrRcpy9MrrjabMMLZxg8g5xmf7" == m))
6767 then $Tuple4(2000000, 30000000, 80000000, 80000000)
6868 else $Tuple4(0, 20000000, 80000000, 80000000)
6969 }
7070
7171
7272 let n = 100000000
7373
7474 let o = 10000000000
7575
7676 let p = (n * n)
7777
7878 let q = 1440
7979
8080 func r (s) = {
8181 func t (u,v) = ((u + toString(v)) + ",")
8282
8383 let w = s
8484 let x = size(w)
8585 let y = ""
8686 func z (A,B) = if ((B >= x))
8787 then A
8888 else t(A, w[B])
8989
9090 func C (A,B) = if ((B >= x))
9191 then A
92- else throw("List size exceeds 12")
92+ else throw("List size exceeds 100")
9393
94- C(z(z(z(z(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
94+ C(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
9595 }
9696
9797
9898 func D (E) = {
9999 let m = getInteger(this, E)
100100 if ($isInstanceOf(m, "Int"))
101101 then {
102102 let F = m
103103 F
104104 }
105105 else 0
106106 }
107107
108108
109109 func G (E) = {
110110 let m = getBoolean(this, E)
111111 if ($isInstanceOf(m, "Boolean"))
112112 then {
113113 let F = m
114114 F
115115 }
116116 else false
117117 }
118118
119119
120120 func H (E) = {
121121 let m = getString(this, E)
122122 if ($isInstanceOf(m, "String"))
123123 then {
124124 let F = m
125125 F
126126 }
127127 else ""
128128 }
129129
130130
131131 func I (E) = {
132132 let m = getBinary(this, E)
133133 if ($isInstanceOf(m, "ByteVector"))
134134 then {
135135 let F = m
136136 F
137137 }
138138 else base58''
139139 }
140140
141141
142142 func J (K) = {
143143 let m = K
144144 if ($isInstanceOf(m, "ByteVector"))
145145 then {
146146 let F = m
147147 toBase58String(F)
148148 }
149149 else "WAVES"
150150 }
151151
152152
153153 func L (l) = if ((l == "WAVES"))
154154 then unit
155155 else fromBase58String(l)
156156
157157
158158 func M (l) = if ((l == "WAVES"))
159159 then wavesBalance(this).available
160160 else assetBalance(this, fromBase58String(l))
161161
162162
163163 func N () = split(H("setup_tokens"), ",")
164164
165165
166166 func O () = {
167167 let P = H("setup_maxsupply")
168168 if ((P == ""))
169169 then [-1, -1, -1, -1, -1, -1, -1]
170170 else split(P, ",")
171171 }
172172
173173
174174 func Q (l) = {
175175 let R = fraction(D(("total_supplied_" + l)), D((l + "_sRate")), p)
176176 if ((R == 0))
177177 then 0
178178 else fraction(n, fraction(D(("total_borrowed_" + l)), D((l + "_bRate")), p), R)
179179 }
180180
181181
182182 func S (l) = {
183183 let T = Q(l)
184184 let U = k(l)
185185 let V = (U._1 + (if ((U._3 >= T))
186186 then fraction(T, U._2, U._3)
187187 else (U._2 + fraction((T - U._3), U._4, (100000000 - U._3)))))
188188 max([fraction(V, n, (q * 365)), 1])
189189 }
190190
191191
192-func W (l) = if ((indexOf(b, l) != unit))
193- then [IntegerEntry((l + "_sRate"), p), IntegerEntry((l + "_bRate"), p), IntegerEntry("lastRateHeight", height)]
192+func W (l) = if (G((l + a)))
193+ then [IntegerEntry((l + "_sRate"), p), IntegerEntry((l + "_bRate"), p), IntegerEntry((l + "_lastRateHeight"), height)]
194194 else {
195195 let X = S(l)
196196 let T = Q(l)
197- let Y = D("lastRateHeight")
197+ let Y = valueOrElse(getInteger(this, (l + "_lastRateHeight")), D("lastRateHeight"))
198198 let Z = max([D((l + "_bRate")), p])
199199 let aa = (Z + ((height - Y) * X))
200200 let ab = max([D((l + "_sRate")), p])
201201 let ac = (ab + ((((height - Y) * fraction(X, T, n)) * (100 - e)) / 100))
202-[IntegerEntry((l + "_sRate"), ac), IntegerEntry((l + "_bRate"), aa), IntegerEntry("lastRateHeight", height)]
202+[IntegerEntry((l + "_sRate"), ac), IntegerEntry((l + "_bRate"), aa), IntegerEntry((l + "_lastRateHeight"), height)]
203203 }
204204
205205
206206 func ad (l,ae) = {
207207 func t (u,af) = {
208208 let ag = W(af)
209209 $Tuple2(if ((af != l))
210210 then u._1
211211 else if ((ae == "sRate"))
212212 then ag[0].value
213213 else ag[1].value, (u._2 ++ ag))
214214 }
215215
216216 let w = N()
217217 let x = size(w)
218218 let y = $Tuple2(0, nil)
219219 func z (A,B) = if ((B >= x))
220220 then A
221221 else t(A, w[B])
222222
223223 func C (A,B) = if ((B >= x))
224224 then A
225- else throw("List size exceeds 12")
225+ else throw("List size exceeds 100")
226226
227- C(z(z(z(z(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
227+ C(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
228228 }
229229
230230
231-func ah (l) = {
232- let ai = W(l)
233- let R = fraction(D(("total_supplied_" + l)), ai[0].value, p)
234- fraction(n, fraction(D(("total_borrowed_" + l)), ai[1].value, p), R)
231+func ah (l,ae) = {
232+ let ag = W(l)
233+ $Tuple2(if ((ae == "sRate"))
234+ then ag[0].value
235+ else ag[1].value, ag)
235236 }
236237
237238
238-func aj () = {
239- func t (u,af) = (u ++ W(af))
240-
241- let w = N()
242- let x = size(w)
243- let y = nil
244- func z (A,B) = if ((B >= x))
245- then A
246- else t(A, w[B])
247-
248- func C (A,B) = if ((B >= x))
249- then A
250- else throw("List size exceeds 12")
251-
252- C(z(z(z(z(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
239+func ai (l) = {
240+ let aj = W(l)
241+ let R = fraction(D(("total_supplied_" + l)), aj[0].value, p)
242+ fraction(n, fraction(D(("total_borrowed_" + l)), aj[1].value, p), R)
253243 }
254244
255245
256246 func ak (l,al) = if (if ((l == "9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi"))
257247 then true
258248 else (l == "HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW"))
259249 then $Tuple2(1000000, 1000000)
260250 else {
261251 let am = getIntegerValue(Address(base58'3P8d1E1BLKoD52y3bQJ1bDTd2TD1gpaLn9t'), (l + "_twap5B"))
262252 let an = getIntegerValue(Address(base58'3P8d1E1BLKoD52y3bQJ1bDTd2TD1gpaLn9t'), (l + "_riskLevel"))
263- if ((indexOf(b, l) != unit))
253+ if (G((l + a)))
264254 then {
265255 let ao = {
266- let ap = reentrantInvoke(a, "getShareAssetPriceREADONLY", [l], nil)
256+ let ap = reentrantInvoke(b, "getShareAssetPriceREADONLY", [l], nil)
267257 if ($isInstanceOf(ap, "Int"))
268258 then ap
269259 else throw(($getType(ap) + " couldn't be cast to Int"))
270260 }
271261 if ((ao == ao))
272262 then $Tuple2(ao, ao)
273263 else throw("Strict value is not equal to itself.")
274264 }
275265 else if ((al >= an))
276266 then $Tuple2(am, am)
277267 else throw((("oracle prices don't match: " + toString(am)) + " is the price, but risk is too high"))
278268 }
279269
280270
281271 func aq (l) = ak(l, 1)
282272
283273
284274 func ar (l) = {
285275 let as = if ((l == "WAVES"))
286276 then 8
287277 else value(assetInfo(fromBase58String(l))).decimals
288278 pow(10, 0, as, 0, 0, DOWN)
289279 }
290280
291281
292-func at (i) = {
293- let au = invoke(this, "getUserCollateral", [false, i, true, ""], nil)
294- if ((au == au))
295- then {
296- let av = {
297- let m = au
298- if ($isInstanceOf(m, "Int"))
299- then {
300- let aw = m
301- aw
282+func at (l,au,i) = if (!(G("setup_active")))
283+ then throw("market is stopped")
284+ else {
285+ let av = ah(l, "sRate")
286+ let aw = av._1
287+ let ax = av._2
288+ let ay = fraction(au, p, aw, DOWN)
289+ let az = {
290+ let m = getString(("setup_maxSupply_" + l))
291+ if ($isInstanceOf(m, "String"))
292+ then {
293+ let aA = m
294+ parseIntValue(aA)
295+ }
296+ else 0
297+ }
298+ let aB = aq(l)
299+ let aC = (D(((i + "_supplied_") + l)) + ay)
300+ let V = aw
301+ let aD = ar(l)
302+ let aE = fraction(fraction(aC, V, p), aB._1, aD)
303+ if ((indexOf(H("setup_tokens"), l) == unit))
304+ then throw("this asset is not supported by the market")
305+ else if (if ((az != 0))
306+ then (aE > az)
307+ else false)
308+ then throw("max total supply for this token reached in the pool")
309+ else {
310+ let aF = value(indexOf(N(), l))
311+ $Tuple2(([IntegerEntry(((i + "_supplied_") + l), aC), IntegerEntry(("total_supplied_" + l), (D(("total_supplied_" + l)) + ay))] ++ [ax[0], ax[1], ax[2]]), $Tuple2(au, aE))
312+ }
313+ }
314+
315+
316+func aG (l,au,i) = {
317+ let aH = ah(l, "bRate")
318+ let aI = aH._1
319+ let ax = aH._2
320+ let ay = fraction(au, p, aI, CEILING)
321+ if (!(G("setup_active")))
322+ then throw("market is stopped")
323+ else if (G((l + a)))
324+ then throw("this token cannot be borrowed")
325+ else {
326+ let aJ = D(("total_supplied_" + l))
327+ let aK = D(("total_borrowed_" + l))
328+ let aL = D(((i + "_borrowed_") + l))
329+ let aD = ar(l)
330+ let aB = aq(l)
331+ let aM = fraction(ay, aB._1, aD)
332+ if ((ay > (aJ - aK)))
333+ then throw("this amount is not available")
334+ else {
335+ let aF = value(indexOf(N(), l))
336+ $Tuple2(([IntegerEntry(((i + "_borrowed_") + l), (aL + ay)), IntegerEntry(("total_borrowed_" + l), (aK + ay))] ++ [ax[0], ax[1], ax[2]]), $Tuple2(au, aM))
302337 }
303- else throw("issue while doing in-dapp invocation")
304338 }
305- if ((av == av))
306- then av
307- else throw("Strict value is not equal to itself.")
308- }
309- else throw("Strict value is not equal to itself.")
310339 }
311340
312341
313-func ax (l,ay,i) = if (!(G("setup_active")))
314- then throw("market is stopped")
315- else {
316- let az = ad(l, "sRate")
317- let aA = az._1
318- let aB = az._2
319- let aC = fraction(ay, p, aA, DOWN)
320- let aD = {
321- let m = getString(("setup_maxSupply_" + l))
322- if ($isInstanceOf(m, "String"))
323- then {
324- let aw = m
325- parseIntValue(aw)
326- }
327- else 0
328- }
329- let aE = aq(l)
330- let aF = (D(((i + "_supplied_") + l)) + aC)
331- let V = ad(l, "sRate")._1
332- let aG = ar(l)
333- let aH = fraction(fraction(aF, V, p), aE._1, aG)
334- if ((indexOf(H("setup_tokens"), l) == unit))
335- then throw("this asset is not supported by the market")
336- else if (if ((aD != 0))
337- then (aH > aD)
338- else false)
339- then throw("max total supply for this token reached in the pool")
340- else $Tuple2(([IntegerEntry(((i + "_supplied_") + l), aF), IntegerEntry(("total_supplied_" + l), (D(("total_supplied_" + l)) + aC))] ++ aB), ay)
341- }
342-
343-
344-func aI (l,ay,i,aJ) = {
345- let aK = ad(l, "bRate")
346- let aL = aK._1
347- let aB = aK._2
348- let aC = fraction(ay, p, aL, CEILING)
349- let aM = invoke(this, "getUserCollateral", [false, i, true, ((l + ",borrowed,") + toString(aC))], nil)
350- if ((aM == aM))
351- then {
352- let aN = {
353- let m = aM
354- if ($isInstanceOf(m, "Int"))
355- then {
356- let aw = m
357- aw
358- }
359- else throw("can't get user collateral value")
360- }
361- if (!(G("setup_active")))
362- then throw("market is stopped")
363- else if ((indexOf(b, l) != unit))
364- then throw("this token cannot be borrowed")
365- else if (if (!(aJ))
366- then (0 > aN)
367- else false)
368- then throw("you have to supply more to borrow")
369- else {
370- let aO = D(("total_supplied_" + l))
371- let aP = D(("total_borrowed_" + l))
372- let aQ = D(((i + "_borrowed_") + l))
373- if ((aC > (aO - aP)))
374- then throw("this amount is not available")
375- else $Tuple2(([IntegerEntry(((i + "_borrowed_") + l), (aQ + aC)), IntegerEntry(("total_borrowed_" + l), (aP + aC))] ++ [IntegerEntry((l + "_bRate"), aL)]), ay)
376- }
377- }
378- else throw("Strict value is not equal to itself.")
379- }
380-
381-
382-@Callable(aR)
383-func flashPosition (aS,aT,aU,aV,aW,aX,aY) = if ((aR.caller != a))
342+@Callable(aN)
343+func flashPosition (aO,aP,aQ,aR,aS,aT,aU) = if ((aN.caller != b))
384344 then throw("available only for Axly protocol")
385345 else {
386- let aZ = aI(aU, aV, aS, true)
387- let ba = L(aU)
388- let bb = reentrantInvoke(addressFromStringValue(aW), aX, split(aY, ","), [AttachedPayment(ba, aV)])
389- if ((bb == bb))
346+ let aV = aG(aQ, aR, aO)
347+ let aW = L(aQ)
348+ let aX = reentrantInvoke(addressFromStringValue(aS), aT, split(aU, ","), [AttachedPayment(aW, aR)])
349+ if ((aX == aX))
390350 then {
391- let bc = {
392- let ap = bb
351+ let aY = {
352+ let ap = aX
393353 if ($isInstanceOf(ap, "Int"))
394354 then ap
395355 else throw(($getType(ap) + " couldn't be cast to Int"))
396356 }
397- if ((bc == bc))
357+ if ((aY == aY))
398358 then {
399- let bd = ax(aT, bc, aS)
400- let aN = {
401- let ap = invoke(this, "getUserCollateral", [false, aS, true, ((aT + ",supplied,") + toString(bc))], nil)
402- if ($isInstanceOf(ap, "Int"))
403- then ap
404- else throw(($getType(ap) + " couldn't be cast to Int"))
405- }
406- if ((aN == aN))
407- then {
408- let be = {
409- let ap = invoke(this, "getUserCollateral", [false, aS, true, ((aU + ",borrowed,") + toString(aV))], nil)
410- if ($isInstanceOf(ap, "Int"))
411- then ap
412- else throw(($getType(ap) + " couldn't be cast to Int"))
413- }
414- if ((be == be))
415- then if ((be > aN))
416- then throw("not enough collateral provided")
417- else (aZ._1 ++ bd._1)
418- else throw("Strict value is not equal to itself.")
419- }
420- else throw("Strict value is not equal to itself.")
359+ let aZ = at(aP, aY, aO)
360+ if ((aV._2._2 > aZ._2._2))
361+ then throw("not enough collateral provided")
362+ else (aV._1 ++ aZ._1)
421363 }
422364 else throw("Strict value is not equal to itself.")
423365 }
424366 else throw("Strict value is not equal to itself.")
425367 }
426368
427369
428370
429-@Callable(aR)
430-func supply () = if (if ((size(aR.payments) != 1))
371+@Callable(aN)
372+func supply () = if (if ((size(aN.payments) != 1))
431373 then true
432- else (aR.payments[0].amount == 0))
374+ else (aN.payments[0].amount == 0))
433375 then throw("1 payment has to be attached")
434376 else {
435- let l = J(aR.payments[0].assetId)
436- let ay = aR.payments[0].amount
437- let bf = invoke(c, "lendAction", [toString(aR.caller), l], nil)
438- if ((bf == bf))
439- then ax(l, ay, toString(aR.caller))
440- else throw("Strict value is not equal to itself.")
377+ let l = J(aN.payments[0].assetId)
378+ let au = aN.payments[0].amount
379+ if (G((l + a)))
380+ then throw("You can't supply lp")
381+ else {
382+ let ba = invoke(c, "lendAction", [toString(aN.caller), l], nil)
383+ if ((ba == ba))
384+ then at(l, au, toString(aN.caller))
385+ else throw("Strict value is not equal to itself.")
386+ }
441387 }
442388
443389
444390
445-@Callable(aR)
446-func withdraw (l,ay) = {
447- let bg = ad(l, "sRate")
448- let aA = bg._1
449- let aB = bg._2
450- let aC = fraction(ay, p, aA, CEILING)
451- let i = toString(aR.caller)
452- let aO = D(("total_supplied_" + l))
453- let aP = D(("total_borrowed_" + l))
454- let bh = D(((i + "_supplied_") + l))
455- let aQ = D(((i + "_borrowed_") + l))
456- let bf = invoke(c, "lendAction", [toString(aR.caller), l], nil)
457- if ((bf == bf))
391+@Callable(aN)
392+func withdraw (l,au) = {
393+ let bb = ah(l, "sRate")
394+ let aw = bb._1
395+ let ax = bb._2
396+ let ay = fraction(au, p, aw, CEILING)
397+ let i = toString(aN.caller)
398+ let aJ = D(("total_supplied_" + l))
399+ let aK = D(("total_borrowed_" + l))
400+ let bc = D(((i + "_supplied_") + l))
401+ let ba = invoke(c, "lendAction", [toString(aN.caller), l], nil)
402+ if ((ba == ba))
458403 then {
459- let aM = invoke(this, "getUserCollateral", [false, i, true, ((l + ",supplied,") + toString(-(aC)))], nil)
460- if ((aM == aM))
404+ let bd = invoke(this, "getUserCollateralV2", [false, i, l, "", false, ("supplied," + toString(-(ay)))], nil)
405+ if ((bd == bd))
461406 then {
462- let aN = {
463- let m = aM
407+ let be = {
408+ let m = bd
464409 if ($isInstanceOf(m, "Int"))
465410 then {
466- let aw = m
467- aw
411+ let aA = m
412+ aA
468413 }
469414 else throw("can't get user collateral value")
470415 }
471416 if (!(G("setup_active")))
472417 then throw("market is stopped")
473- else if ((0 > aN))
418+ else if ((0 > be))
474419 then throw("you dont have enough collateral for this operation")
475- else if ((aC > (aO - aP)))
420+ else if ((ay > (aJ - aK)))
476421 then throw("this amount is not available on the market")
477- else if ((aC > (bh - aQ)))
478- then throw("this amount is not available for this user")
479- else ([IntegerEntry(((i + "_supplied_") + l), (D(((i + "_supplied_") + l)) - aC)), IntegerEntry(("total_supplied_" + l), (D(("total_supplied_" + l)) - aC)), ScriptTransfer(aR.caller, ay, L(l))] ++ aB)
422+ else if ((ay > bc))
423+ then throw("this amount is not available on the market")
424+ else ([IntegerEntry(((i + "_supplied_") + l), (D(((i + "_supplied_") + l)) - ay)), IntegerEntry(("total_supplied_" + l), (D(("total_supplied_" + l)) - ay)), ScriptTransfer(aN.caller, au, L(l))] ++ ax)
480425 }
481426 else throw("Strict value is not equal to itself.")
482427 }
483428 else throw("Strict value is not equal to itself.")
484429 }
485430
486431
487432
488-@Callable(aR)
489-func repay () = if (!(G("setup_active")))
433+@Callable(aN)
434+func repayFor (i,bf) = if (!(G("setup_active")))
490435 then throw("market is stopped")
491- else if (if ((size(aR.payments) != 1))
492- then true
493- else (aR.payments[0].amount == 0))
494- then throw("1 payment has to be attached")
495- else {
496- let l = J(aR.payments[0].assetId)
497- let ay = aR.payments[0].amount
498- let bi = ad(l, "bRate")
499- let aL = bi._1
500- let aB = bi._2
501- let aC = fraction(ay, p, aL, CEILING)
502- let i = toString(aR.caller)
503- let aO = D(("total_supplied_" + l))
504- let aP = D(("total_borrowed_" + l))
505- let aQ = D(((i + "_borrowed_") + l))
506- let bj = (aQ - aC)
507- let bk = if ((bj >= 0))
508- then aC
509- else aQ
510- if ((indexOf(H("setup_tokens"), l) == unit))
511- then throw("this asset is not supported by the market")
512- else (([IntegerEntry(((i + "_borrowed_") + l), (aQ - bk)), IntegerEntry(("total_borrowed_" + l), (aP - bk))] ++ aB) ++ (if ((bj >= 0))
513- then nil
514- else [ScriptTransfer(aR.caller, -(bj), aR.payments[0].assetId)]))
515- }
436+ else if (!(j(aN.caller)))
437+ then throw("available only for whitelist")
438+ else if ((i == "global"))
439+ then throw("you can't repay for everyone :_)")
440+ else if (if ((size(aN.payments) != 1))
441+ then true
442+ else (aN.payments[0].amount == 0))
443+ then throw("1 payment has to be attached")
444+ else if (!(G((bf + a))))
445+ then throw("Wrong lp id")
446+ else {
447+ let l = J(aN.payments[0].assetId)
448+ let au = aN.payments[0].amount
449+ let bg = ah(l, "bRate")
450+ let aI = bg._1
451+ let ax = bg._2
452+ let ay = fraction(au, p, aI, CEILING)
453+ let aJ = D(("total_supplied_" + l))
454+ let aK = D(("total_borrowed_" + l))
455+ let aL = D(((i + "_borrowed_") + l))
456+ let bh = (aL - ay)
457+ let bi = if ((bh >= 0))
458+ then ay
459+ else aL
460+ let bj = if ((bh >= 0))
461+ then nil
462+ else [ScriptTransfer(aN.caller, -(bh), aN.payments[0].assetId)]
463+ let bk = if ((aN.caller == b))
464+ then {
465+ let bl = D(((i + "_supplied_") + bf))
466+ if ((bl > 0))
467+ then [IntegerEntry(((i + "_supplied_") + bf), 0), IntegerEntry(("total_supplied_" + bf), (D(("total_supplied_" + bf)) - bl))]
468+ else nil
469+ }
470+ else nil
471+ if ((indexOf(H("setup_tokens"), l) == unit))
472+ then throw("this asset is not supported by the market")
473+ else ((([IntegerEntry(((i + "_borrowed_") + l), (aL - bi)), IntegerEntry(("total_borrowed_" + l), (aK - bi))] ++ ax) ++ bj) ++ bk)
474+ }
516475
517476
518477
519-@Callable(aR)
520-func repayFor (i) = if (!(G("setup_active")))
521- then throw("market is stopped")
522- else if (!(j(aR.caller)))
523- then throw("available only for whitelist")
524- else if ((i == "global"))
525- then throw("you can't repay for everyone :_)")
526- else if (if ((size(aR.payments) != 1))
527- then true
528- else (aR.payments[0].amount == 0))
529- then throw("1 payment has to be attached")
530- else {
531- let l = J(aR.payments[0].assetId)
532- let ay = aR.payments[0].amount
533- let bl = ad(l, "bRate")
534- let aL = bl._1
535- let aB = bl._2
536- let aC = fraction(ay, p, aL, CEILING)
537- let aO = D(("total_supplied_" + l))
538- let aP = D(("total_borrowed_" + l))
539- let aQ = D(((i + "_borrowed_") + l))
540- let bj = (aQ - aC)
541- let bk = if ((bj >= 0))
542- then aC
543- else aQ
544- let bm = if ((bj >= 0))
545- then nil
546- else [ScriptTransfer(aR.caller, -(bj), aR.payments[0].assetId)]
547- let bn = if ((aR.caller == a))
548- then {
549- func bo (u,l) = {
550- let bp = D(((i + "_borrowed_") + l))
551- if ((bp > 0))
552- then (u ++ [IntegerEntry(((i + "_supplied_") + l), 0), IntegerEntry(("total_supplied_" + l), (D(("total_supplied_" + l)) - bp))])
553- else u
554- }
555-
556- let w = b
557- let x = size(w)
558- let y = nil
559- func z (A,B) = if ((B >= x))
560- then A
561- else bo(A, w[B])
562-
563- func C (A,B) = if ((B >= x))
564- then A
565- else throw("List size exceeds 8")
566-
567- C(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8)
568- }
569- else nil
570- if ((indexOf(H("setup_tokens"), l) == unit))
571- then throw("this asset is not supported by the market")
572- else ((([IntegerEntry(((i + "_borrowed_") + l), (aQ - bk)), IntegerEntry(("total_borrowed_" + l), (aP - bk))] ++ aB) ++ bm) ++ bn)
573- }
574-
575-
576-
577-@Callable(aR)
478+@Callable(aN)
578479 func addInterestEXTERNAL () = {
579- let aC = fraction(aR.payments[0].amount, 80, 100)
580- let K = aR.payments[0].assetId
480+ let ay = fraction(aN.payments[0].amount, 80, 100)
481+ let K = aN.payments[0].assetId
581482 let l = J(K)
582- let bq = D(("autostake_lastEarned_" + l))
583- let br = D(("autostake_lastBlock_" + l))
584- let bs = if (if ((br == height))
483+ let bm = D(("autostake_lastEarned_" + l))
484+ let bn = D(("autostake_lastBlock_" + l))
485+ let bo = if (if ((bn == height))
585486 then true
586- else (aC == 0))
487+ else (ay == 0))
587488 then nil
588- else [IntegerEntry(("autostake_preLastEarned_" + l), bq), IntegerEntry(("autostake_preLastBlock_" + l), br), IntegerEntry(("autostake_lastEarned_" + l), (bq + aC)), IntegerEntry(("autostake_lastBlock_" + l), height)]
589- (bs ++ [IntegerEntry((l + "_sRate"), (D((l + "_sRate")) + fraction(p, aC, D(("total_supplied_" + l)))))])
489+ else [IntegerEntry(("autostake_preLastEarned_" + l), bm), IntegerEntry(("autostake_preLastBlock_" + l), bn), IntegerEntry(("autostake_lastEarned_" + l), (bm + ay)), IntegerEntry(("autostake_lastBlock_" + l), height)]
490+ (bo ++ [IntegerEntry((l + "_sRate"), (D((l + "_sRate")) + fraction(p, ay, D(("total_supplied_" + l)))))])
590491 }
591492
592493
593494
594-@Callable(aR)
595-func preInit (bt,bu,bv,bw) = {
495+@Callable(aN)
496+func preInit (bp,bq,br,bs) = {
596497 func t (u,af) = (u ++ [IntegerEntry((af + "_bRate"), p), IntegerEntry((af + "_sRate"), p)])
597498
598- if ((aR.caller != this))
499+ if ((aN.caller != this))
599500 then throw("admin only")
600501 else {
601- let ai = {
602- let w = split(bt, ",")
502+ let aj = {
503+ let w = split(bp, ",")
603504 let x = size(w)
604505 let y = nil
605506 func z (A,B) = if ((B >= x))
606507 then A
607508 else t(A, w[B])
608509
609510 func C (A,B) = if ((B >= x))
610511 then A
611512 else throw("List size exceeds 12")
612513
613514 C(z(z(z(z(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
614515 }
615- ([StringEntry("setup_tokens", bt), StringEntry("setup_ltvs", bu), StringEntry("setup_lts", bv), StringEntry("setup_penalties", bw), BooleanEntry("setup_active", true)] ++ ai)
516+ ([StringEntry("setup_tokens", bp), StringEntry("setup_ltvs", bq), StringEntry("setup_lts", br), StringEntry("setup_penalties", bs), BooleanEntry("setup_active", true)] ++ aj)
616517 }
617518 }
618519
619520
620521
621-@Callable(aR)
622-func initNewToken (af,bx,by,bz) = if (if ((aR.caller != this))
623- then (aR.caller != Address(base58'3P3o9cLTV2u9N4nYNKRYL6gy6cUEU9DwXW8'))
522+@Callable(aN)
523+func initNewToken (af,bt,bu,bv) = if (if ((aN.caller != this))
524+ then (aN.caller != Address(base58'3P3o9cLTV2u9N4nYNKRYL6gy6cUEU9DwXW8'))
624525 else false)
625526 then throw("admin only")
626- else [StringEntry("setup_tokens", ((H("setup_tokens") + ",") + af)), StringEntry("setup_ltvs", ((H("setup_ltvs") + ",") + bx)), StringEntry("setup_lts", ((H("setup_lts") + ",") + by)), StringEntry("setup_penalties", ((H("setup_penalties") + ",") + bz)), IntegerEntry((af + "_bRate"), p), IntegerEntry((af + "_sRate"), p)]
527+ else [StringEntry("setup_tokens", ((H("setup_tokens") + ",") + af)), StringEntry("setup_ltvs", ((H("setup_ltvs") + ",") + bt)), StringEntry("setup_lts", ((H("setup_lts") + ",") + bu)), StringEntry("setup_penalties", ((H("setup_penalties") + ",") + bv)), IntegerEntry((af + "_bRate"), p), IntegerEntry((af + "_sRate"), p), IntegerEntry((af + "_lastRateHeight"), height)]
627528
628529
629530
630-@Callable(aR)
631-func updateParameter (E,bA) = if (if ((aR.caller != this))
632- then (aR.caller != Address(base58'3P3o9cLTV2u9N4nYNKRYL6gy6cUEU9DwXW8'))
531+@Callable(aN)
532+func initNewLPToken (af) = if (if ((aN.caller != this))
533+ then (aN.caller != Address(base58'3P3o9cLTV2u9N4nYNKRYL6gy6cUEU9DwXW8'))
633534 else false)
634535 then throw("admin only")
635- else [IntegerEntry(E, parseIntValue(bA))]
536+ else [BooleanEntry((af + "_axlyLp"), true)]
636537
637538
638539
639-@Callable(aR)
640-func updateString (E,bA) = if (if ((aR.caller != this))
641- then (aR.caller != Address(base58'3P3o9cLTV2u9N4nYNKRYL6gy6cUEU9DwXW8'))
540+@Callable(aN)
541+func updateParameter (E,bw) = if (if ((aN.caller != this))
542+ then (aN.caller != Address(base58'3P3o9cLTV2u9N4nYNKRYL6gy6cUEU9DwXW8'))
642543 else false)
643544 then throw("admin only")
644- else [StringEntry(E, bA)]
545+ else [IntegerEntry(E, parseIntValue(bw))]
645546
646547
647548
648-@Callable(aR)
649-func claimToReserveFund (bB) = {
650- let bC = N()
651- let ai = ad(bC[0], "sRate")._2
652- let s = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
653- func t (u,bD) = if ((bD >= size(bC)))
654- then u
655- else {
656- let l = bC[bD]
657- let bE = H(("autostake_amount_" + l))
658- let aC = ((((M(l) + D(("autostake_amount_" + l))) + (if ((bE != ""))
659- then parseIntValue(bE)
660- else 0)) + fraction(D(("total_borrowed_" + l)), ai[((bD * 3) + 1)].value, p)) - fraction(D(("total_supplied_" + l)), ai[(bD * 3)].value, p))
661- let bF = if ((D(("autostake_amount_" + l)) > 0))
662- then invoke(this, "unstakeToken", [l, max([aC, 0])], nil)
663- else 0
664- if ((bF == bF))
665- then (u ++ [aC])
666- else throw("Strict value is not equal to itself.")
667- }
549+@Callable(aN)
550+func updateString (E,bw) = if (if ((aN.caller != this))
551+ then (aN.caller != Address(base58'3P3o9cLTV2u9N4nYNKRYL6gy6cUEU9DwXW8'))
552+ else false)
553+ then throw("admin only")
554+ else [StringEntry(E, bw)]
668555
669- let bG = {
670- let w = s
671- let x = size(w)
672- let y = nil
673- func z (A,B) = if ((B >= x))
674- then A
675- else t(A, w[B])
676556
677- func C (A,B) = if ((B >= x))
678- then A
679- else throw("List size exceeds 12")
680557
681- C(z(z(z(z(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
558+@Callable(aN)
559+func claimToReserveFund (bx) = {
560+ let by = N()
561+ let aj = ad(by[0], "sRate")._2
562+ func t (bz,l) = {
563+ let bA = bz
564+ let u = bA._1
565+ let bB = bA._2
566+ let bC = H(("autostake_amount_" + l))
567+ let ay = ((((M(l) + D(("autostake_amount_" + l))) + (if ((bC != ""))
568+ then parseIntValue(bC)
569+ else 0)) + fraction(D(("total_borrowed_" + l)), aj[((bB * 3) + 1)].value, p)) - fraction(D(("total_supplied_" + l)), aj[(bB * 3)].value, p))
570+ let bD = if ((D(("autostake_amount_" + l)) > 0))
571+ then invoke(this, "unstakeToken", [l, max([ay, 0])], nil)
572+ else 0
573+ if ((bD == bD))
574+ then $Tuple2((u ++ [ay]), (bB + 1))
575+ else throw("Strict value is not equal to itself.")
682576 }
683- func bH (u,bD) = if ((bD >= size(bC)))
684- then u
685- else {
686- let l = bC[bD]
687- (u ++ [ScriptTransfer(d, max([bG[bD], 0]), L(l))])
688- }
689577
690- if (bB)
691- then throw(r(bG))
578+ let bE = ( let w = by
579+ let x = size(w)
580+ let y = $Tuple2(nil, 0)
581+ func z (A,B) = if ((B >= x))
582+ then A
583+ else t(A, w[B])
584+
585+ func C (A,B) = if ((B >= x))
586+ then A
587+ else throw("List size exceeds 100")
588+
589+ C(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100))._1
590+ func bF (bz,l) = {
591+ let bG = bz
592+ let u = bG._1
593+ let bB = bG._2
594+ $Tuple2((u ++ [ScriptTransfer(d, max([bE[bB], 0]), L(l))]), (bB + 1))
595+ }
596+
597+ if (bx)
598+ then throw(r(bE))
692599 else $Tuple2({
693- let w = s
600+ let w = by
694601 let x = size(w)
695- let y = nil
602+ let y = $Tuple2(nil, 0)
603+ func bH (A,B) = if ((B >= x))
604+ then A
605+ else bF(A, w[B])
606+
696607 func bI (A,B) = if ((B >= x))
697608 then A
698- else bH(A, w[B])
609+ else throw("List size exceeds 100")
699610
700- func bJ (A,B) = if ((B >= x))
701- then A
702- else throw("List size exceeds 12")
703-
704- bJ(bI(bI(bI(bI(bI(bI(bI(bI(bI(bI(bI(bI(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
705- }, bG)
611+ bI(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(bH(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
612+ }, bE)._1
706613 }
707614
708615
709616
710-@Callable(aR)
711-func shutdown (bK) = if ((indexOf(g, aR.caller.bytes) == unit))
617+@Callable(aN)
618+func shutdown (bJ) = if ((indexOf(g, aN.caller.bytes) == unit))
712619 then throw("user not in a whitelist")
713- else [BooleanEntry("setup_active", !(bK))]
620+ else [BooleanEntry("setup_active", !(bJ))]
714621
715622
716623
717-@Callable(aR)
718-func liquidate (bB,i,ay,aT,aU,bL) = if (!(h(aR.caller)))
624+@Callable(aN)
625+func liquidateV2 (bx,i,aP,aQ,bK) = if (!(h(aN.caller)))
719626 then throw("available for whitelist only")
720627 else if (!(G("setup_active")))
721628 then throw("market is stopped")
722629 else {
723- let bM = at(i)
724- if ((bM == bM))
630+ let bd = invoke(this, "getUserCollateralV2", [false, i, aP, aQ, true, ""], nil)
631+ if ((bd == bd))
725632 then {
726- let bN = ad(aT, "sRate")
727- let aA = bN._1
728- let bO = bN._2
729- let bP = ad(aU, "bRate")
730- let aL = bP._1
731- let bQ = bP._2
732- let bR = fraction(ay, p, aA)
733- let bS = D(((i + "_supplied_") + aT))
734- let bT = D(((i + "_borrowed_") + aU))
735- let bU = if ((bT > 0))
736- then bT
737- else throw("user has no borrow in this token")
738- if ((bM > 0))
739- then throw("user can't be liquidated")
740- else if ((bR > bS))
741- then throw("position to liquidate is bigger than user's supply")
742- else {
743- let bF = if ((indexOf(b, aT) != unit))
744- then {
745- let bV = split(i, "_")[1]
746- let bW = split(i, "_")[0]
747- reentrantInvoke(a, "liquidate", [bW, bV, bR], nil)
748- }
749- else nil
750- if ((bF == bF))
751- then {
752- let bX = M(aT)
753- if ((bX == bX))
754- then {
755- let bY = M(aU)
756- if ((bY == bY))
757- then {
758- let bZ = invoke(f, "swap", [bL, 0], [AttachedPayment(L(aT), ay)])
759- if ((bZ == bZ))
760- then {
761- let ca = (bX - M(aT))
762- if ((ca == ca))
763- then {
764- let cb = (M(aU) - bY)
765- if ((cb == cb))
766- then {
767- let cc = aq(aT)._1
768- let cd = ar(aT)
769- let ce = fraction(ca, cc, cd)
770- let cf = aq(aU)._2
771- let cg = ar(aU)
772- let ch = fraction(cb, cf, cg)
773- let bz = parseIntValue(split(H("setup_penalties"), ",")[value(indexOf(N(), aU))])
774- let ci = (ch - fraction(ce, (n - bz), n))
775- let cj = fraction(ca, p, aA)
776- let ck = fraction(fraction(cb, p, aL), (n - fraction(ci, n, ch)), n)
777- if ((ca > ay))
778- then throw("more assets exchanged than expected")
779- else if ((0 > ci))
780- then throw("price impact is bigger than liquidation penalty")
781- else [IntegerEntry(((i + "_supplied_") + aT), (bS - cj)), IntegerEntry(((i + "_borrowed_") + aU), (bU - ck)), IntegerEntry(("total_supplied_" + aT), (D(("total_supplied_" + aT)) - cj)), IntegerEntry(("total_borrowed_" + aU), (D(("total_borrowed_" + aU)) - ck))]
782- }
783- else throw("Strict value is not equal to itself.")
784- }
785- else throw("Strict value is not equal to itself.")
786- }
787- else throw("Strict value is not equal to itself.")
788- }
789- else throw("Strict value is not equal to itself.")
790- }
791- else throw("Strict value is not equal to itself.")
792- }
793- else throw("Strict value is not equal to itself.")
633+ let bL = {
634+ let m = bd
635+ if ($isInstanceOf(m, "Int"))
636+ then {
637+ let aA = m
638+ aA
794639 }
795- }
796- else throw("Strict value is not equal to itself.")
797- }
798-
799-
800-
801-@Callable(aR)
802-func liquidateV2 (bB,i,aT,aU,cl) = if (!(h(aR.caller)))
803- then throw("available for whitelist only")
804- else if (!(G("setup_active")))
805- then throw("market is stopped")
806- else {
807- let bM = at(i)
808- if ((bM == bM))
809- then {
810- let bS = D(((i + "_supplied_") + aT))
811- let bU = D(((i + "_borrowed_") + aU))
812- if ((indexOf(b, aT) == unit))
640+ else throw("can't get user collateral value")
641+ }
642+ let bM = D(((i + "_supplied_") + aP))
643+ let bN = D(((i + "_borrowed_") + aQ))
644+ if (!(G((aP + a))))
813645 then throw("wrong lp asset")
814- else if ((0 >= bU))
646+ else if ((0 >= bN))
815647 then throw("user has no borrow in this token")
816- else if (if ((bM > 0))
648+ else if (if ((bL > 0))
817649 then true
818- else (bU == 0))
650+ else (bN == 0))
819651 then throw("user can't be liquidated")
820652 else {
821- let ba = L(aU)
822- let cm = N()
823- let cn = value(indexOf(cm, aU))
824- let co = value(indexOf(cm, aT))
825- let bz = parseIntValue(value(split(H("setup_penalties"), ",")[cn]))
826- let cp = ad(aU, "bRate")
827- let aL = cp._1
828- let bO = cp._2
829- let aV = fraction(bU, aL, p)
830- let cq = fraction(aV, cl, 100)
831- let cr = fraction(cq, (n + bz), n)
832- let cs = fraction(cq, p, aL)
833- let bV = split(i, "_")[1]
834- let bW = split(i, "_")[0]
835- let ct = {
836- let ap = reentrantInvoke(a, "liquidate", [bW, bV, cr], nil)
653+ let aW = L(aQ)
654+ let bO = N()
655+ let bP = value(indexOf(bO, aQ))
656+ let bQ = value(indexOf(bO, aP))
657+ let bv = parseIntValue(value(split(H("setup_penalties"), ",")[bP]))
658+ let bR = ah(aQ, "bRate")
659+ let aI = bR._1
660+ let bS = bR._2
661+ let aR = fraction(bN, aI, p)
662+ let bT = fraction(aR, bK, 100)
663+ let bU = fraction(bT, (n + bv), n)
664+ let bV = fraction(bT, p, aI)
665+ let bW = split(i, "_")[1]
666+ let bX = split(i, "_")[0]
667+ let bY = {
668+ let ap = reentrantInvoke(b, "liquidate", [bX, bW, bU], nil)
837669 if ($isInstanceOf(ap, "Int"))
838670 then ap
839671 else throw(($getType(ap) + " couldn't be cast to Int"))
840672 }
841- if ((ct == ct))
673+ if ((bY == bY))
842674 then {
843- let bc = fraction(ct, p, bO[((co * 3) + 1)].value)
844- if (bB)
675+ let aY = fraction(bY, p, bS[1].value)
676+ if (bx)
845677 then throw("liquidation will pass")
846- else ([ScriptTransfer(aR.caller, (cr - cq), ba), IntegerEntry(((i + "_supplied_") + aT), (bS - bc)), IntegerEntry(((i + "_borrowed_") + aU), (bU - cs)), IntegerEntry(("total_supplied_" + aT), (D(("total_supplied_" + aT)) - bc)), IntegerEntry(("total_borrowed_" + aU), (D(("total_borrowed_" + aU)) - cs))] ++ bO)
678+ else ([ScriptTransfer(aN.caller, (bU - bT), aW), IntegerEntry(((i + "_supplied_") + aP), (bM - aY)), IntegerEntry(((i + "_borrowed_") + aQ), (bN - bV)), IntegerEntry(("total_supplied_" + aP), (D(("total_supplied_" + aP)) - aY)), IntegerEntry(("total_borrowed_" + aQ), (D(("total_borrowed_" + aQ)) - bV))] ++ bS)
847679 }
848680 else throw("Strict value is not equal to itself.")
849681 }
850682 }
851683 else throw("Strict value is not equal to itself.")
852684 }
853685
854686
855687
856-@Callable(aR)
857-func getUserCollateral (bB,i,cu,cv) = {
858- let bC = N()
859- let bu = split(H("setup_ltvs"), ",")
860- let bv = split(H("setup_lts"), ",")
861- let ai = ad(bC[0], "sRate")._2
862- let cw = split(cv, ",")
863- func t (u,v) = if ((v >= size(bC)))
688+@Callable(aN)
689+func getUserCollateral (bx,i,bZ,ca) = {
690+ let by = N()
691+ let bq = split(H("setup_ltvs"), ",")
692+ let br = split(H("setup_lts"), ",")
693+ let aj = ad(by[0], "sRate")._2
694+ let cb = split(ca, ",")
695+ func t (u,v) = if ((v >= size(by)))
864696 then u
865697 else {
866- let bp = D(((i + "_supplied_") + bC[v]))
867- let cx = D(((i + "_borrowed_") + bC[v]))
868- let cy = if ((cv == ""))
869- then if (if ((cx != 0))
698+ let bl = D(((i + "_supplied_") + by[v]))
699+ let cc = D(((i + "_borrowed_") + by[v]))
700+ let cd = if ((ca == ""))
701+ then if (if ((cc != 0))
870702 then true
871- else (bp != 0))
703+ else (bl != 0))
872704 then true
873705 else false
874706 else true
875- if (cy)
707+ if (cd)
876708 then {
877- let aG = ar(bC[v])
878- let aE = aq(bC[v])
879- ((u + fraction(fraction(fraction((bp + (if (if (if ((cv != ""))
880- then (cw[0] == bC[v])
709+ let aD = ar(by[v])
710+ let aB = aq(by[v])
711+ ((u + fraction(fraction(fraction((bl + (if (if (if ((ca != ""))
712+ then (cb[0] == by[v])
881713 else false)
882- then (cw[1] == "supplied")
714+ then (cb[1] == "supplied")
883715 else false)
884- then parseIntValue(cw[2])
885- else 0)), ai[(v * 3)].value, p), parseIntValue(bu[v]), n), aE._1, aG)) - (if (cu)
886- then fraction(fraction(fraction((cx + (if (if (if ((cv != ""))
887- then (cw[0] == bC[v])
716+ then parseIntValue(cb[2])
717+ else 0)), aj[(v * 3)].value, p), parseIntValue(bq[v]), n), aB._1, aD)) - (if (bZ)
718+ then fraction(fraction(fraction((cc + (if (if (if ((ca != ""))
719+ then (cb[0] == by[v])
888720 else false)
889- then (cw[1] == "borrowed")
721+ then (cb[1] == "borrowed")
890722 else false)
891- then parseIntValue(cw[2])
892- else 0)), ai[((v * 3) + 1)].value, p), n, parseIntValue(bv[v])), aE._2, aG)
723+ then parseIntValue(cb[2])
724+ else 0)), aj[((v * 3) + 1)].value, p), n, parseIntValue(br[v])), aB._2, aD)
893725 else 0))
894726 }
895727 else u
896728 }
897729
898- let cz = {
730+ let ce = {
899731 let w = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
900732 let x = size(w)
901733 let y = 0
902734 func z (A,B) = if ((B >= x))
903735 then A
904736 else t(A, w[B])
905737
906738 func C (A,B) = if ((B >= x))
907739 then A
908740 else throw("List size exceeds 12")
909741
910742 C(z(z(z(z(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
911743 }
912- if (bB)
913- then throw(toString(cz))
914- else $Tuple2(nil, cz)
744+ if (bx)
745+ then throw(toString(ce))
746+ else $Tuple2(nil, ce)
915747 }
916748
917749
918750
919-@Callable(aR)
920-func getAssetDebt (bB,i,l) = {
921- let cx = D(((i + "_borrowed_") + l))
922- let aG = ar(l)
923- let V = ad(l, "bRate")._1
924- let cz = fraction(cx, V, p)
925- if (bB)
926- then throw(toString(cz))
927- else $Tuple2(nil, cz)
751+@Callable(aN)
752+func getUserCollateralV2 (bx,i,cf,aW,bZ,ca) = {
753+ let by = N()
754+ let cg = valueOrErrorMessage(indexOf(by, cf), "Wrong sAssetId")
755+ let bq = split(H("setup_ltvs"), ",")
756+ let br = split(H("setup_lts"), ",")
757+ let ch = ah(cf, "sRate")
758+ let cb = split(ca, ",")
759+ let bl = D(((i + "_supplied_") + cf))
760+ let cc = D(((i + "_borrowed_") + aW))
761+ let ci = if (if ((ca != ""))
762+ then (cb[0] == "supplied")
763+ else false)
764+ then parseIntValue(cb[1])
765+ else 0
766+ let cj = ar(cf)
767+ let ck = aq(cf)
768+ let ce = (fraction(fraction(fraction((bl + ci), ch._1, p), parseIntValue(bq[cg]), n), ck._1, cj) - (if (bZ)
769+ then {
770+ let cl = valueOrErrorMessage(indexOf(by, aW), "Wrong bAssetId")
771+ let cm = ah(aW, "bRate")
772+ let cn = if (if ((ca != ""))
773+ then (cb[0] == "borrowed")
774+ else false)
775+ then parseIntValue(cb[1])
776+ else 0
777+ let co = ar(aW)
778+ let cp = aq(aW)
779+ fraction(fraction(fraction((cc + cn), cm._1, p), n, parseIntValue(br[cl])), cp._2, co)
780+ }
781+ else 0))
782+ if (bx)
783+ then throw(toString(ce))
784+ else $Tuple2(nil, ce)
928785 }
929786
930787
931788
932-@Callable(aR)
933-func getPrices (bB) = {
934- let bC = N()
935- func t (u,v) = if ((v >= size(bC)))
936- then u
937- else {
938- let aE = ak(bC[v], 3)
939- ((((u + toString(aE._1)) + ",") + toString(aE._2)) + "|")
940- }
789+@Callable(aN)
790+func getAssetDebt (bx,i,l) = {
791+ let cc = D(((i + "_borrowed_") + l))
792+ let aD = ar(l)
793+ let V = ah(l, "bRate")._1
794+ let ce = fraction(cc, V, p)
795+ if (bx)
796+ then throw(toString(ce))
797+ else $Tuple2(nil, ce)
798+ }
941799
942- let cz = {
943- let w = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
800+
801+
802+@Callable(aN)
803+func getPrices (bx) = {
804+ let by = N()
805+ func t (u,l) = {
806+ let aB = ak(l, 3)
807+ ((((u + toString(aB._1)) + ",") + toString(aB._2)) + "|")
808+ }
809+
810+ let ce = {
811+ let w = by
944812 let x = size(w)
945813 let y = ""
946814 func z (A,B) = if ((B >= x))
947815 then A
948816 else t(A, w[B])
949817
950818 func C (A,B) = if ((B >= x))
951819 then A
952- else throw("List size exceeds 12")
820+ else throw("List size exceeds 100")
953821
954- C(z(z(z(z(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
822+ C(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
955823 }
956- if (bB)
957- then throw(cz)
958- else $Tuple2(nil, cz)
824+ if (bx)
825+ then throw(ce)
826+ else $Tuple2(nil, ce)
959827 }
960828
961829
962830
963-@Callable(aR)
964-func calculateUtilizationRatio (l,bB) = if (bB)
965- then throw(toString(ah(l)))
966- else $Tuple2(nil, ah(l))
831+@Callable(aN)
832+func calculateUtilizationRatio (l,bx) = if (bx)
833+ then throw(toString(ai(l)))
834+ else $Tuple2(nil, ai(l))
967835
968836
969837
970-@Callable(aR)
971-func calculateOutdatedUR (l,bB) = if (bB)
838+@Callable(aN)
839+func calculateOutdatedUR (l,bx) = if (bx)
972840 then throw(toString(Q(l)))
973841 else $Tuple2(nil, Q(l))
974842
975843
976844
977-@Callable(aR)
978-func calculateTokenRates (bB) = {
845+@Callable(aN)
846+func calculateTokenRates (bx) = {
979847 func t (u,l) = {
980- let ai = W(l)
981- $Tuple2(((((u._1 + toString(ai[1].value)) + "|") + toString(ai[0].value)) + ","), (u._2 ++ ai))
848+ let aj = W(l)
849+ $Tuple2(((((u._1 + toString(aj[1].value)) + "|") + toString(aj[0].value)) + ","), (u._2 ++ aj))
982850 }
983851
984- let bG = {
852+ let bE = {
985853 let w = N()
986854 let x = size(w)
987855 let y = $Tuple2("", nil)
988856 func z (A,B) = if ((B >= x))
989857 then A
990858 else t(A, w[B])
991859
992860 func C (A,B) = if ((B >= x))
993861 then A
994- else throw("List size exceeds 12")
862+ else throw("List size exceeds 100")
995863
996- C(z(z(z(z(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
864+ C(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
997865 }
998- if (bB)
999- then throw(bG._1)
1000- else $Tuple2(bG._2, bG._1)
866+ if (bx)
867+ then throw(bE._1)
868+ else $Tuple2(bE._2, bE._1)
1001869 }
1002870
1003871
1004872
1005-@Callable(aR)
1006-func calculateTokensInterest (bB) = {
873+@Callable(aN)
874+func calculateTokensInterest (bx) = {
1007875 func t (u,l) = {
1008876 let V = fraction(S(l), q, n)
1009877 ((u + toString(V)) + ",")
1010878 }
1011879
1012- let bG = {
880+ let bE = {
1013881 let w = N()
1014882 let x = size(w)
1015883 let y = ""
1016884 func z (A,B) = if ((B >= x))
1017885 then A
1018886 else t(A, w[B])
1019887
1020888 func C (A,B) = if ((B >= x))
1021889 then A
1022- else throw("List size exceeds 12")
890+ else throw("List size exceeds 100")
1023891
1024- C(z(z(z(z(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12)
892+ C(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(z(y, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
1025893 }
1026- if (bB)
1027- then throw(bG)
1028- else $Tuple2(nil, bG)
894+ if (bx)
895+ then throw(bE)
896+ else $Tuple2(nil, bE)
1029897 }
1030898
1031899
1032-@Verifier(cA)
1033-func cB () = if (if (if (sigVerify(cA.bodyBytes, cA.proofs[0], base58'J4QQBsh6FGgZbijQPMDZ7GtNALx2N15K3eHvGhjq43Lt'))
900+@Verifier(cq)
901+func cr () = if (if (if (if (sigVerify(cq.bodyBytes, cq.proofs[0], base58'J4QQBsh6FGgZbijQPMDZ7GtNALx2N15K3eHvGhjq43Lt'))
1034902 then true
1035- else sigVerify(cA.bodyBytes, cA.proofs[0], base58'Ajf56x532JLzVoourPv9FW75kYsvScNxztPnt1enhNkS'))
903+ else sigVerify(cq.bodyBytes, cq.proofs[0], base58'Ajf56x532JLzVoourPv9FW75kYsvScNxztPnt1enhNkS'))
1036904 then true
1037- else if (sigVerify(cA.bodyBytes, cA.proofs[0], base58'CYCxuKusNeomQkH9wbcEd4rRP1mDYMc7bw8pr82Agi4N'))
1038- then sigVerify(cA.bodyBytes, cA.proofs[0], base58'3oqguA2LUTZFFjJCJ62UybbXFTLwv88tSJ3oMrNSGhiA')
1039- else false)
905+ else sigVerify(cq.bodyBytes, cq.proofs[0], base58'CYCxuKusNeomQkH9wbcEd4rRP1mDYMc7bw8pr82Agi4N'))
1040906 then true
1041- else sigVerify(cA.bodyBytes, cA.proofs[0], base58'9t2BGHP6EddYu5xvArqDkhHPGbf8ZiYUaWgFcEPtRZhE')
907+ else sigVerify(cq.bodyBytes, cq.proofs[0], base58'D2QvCRmindBLJfAb2GWftPgjkLUZFsoCiYxJFDisaKqN'))
908+ then if (sigVerify(cq.bodyBytes, cq.proofs[1], base58'3oqguA2LUTZFFjJCJ62UybbXFTLwv88tSJ3oMrNSGhiA'))
909+ then true
910+ else sigVerify(cq.bodyBytes, cq.proofs[1], base58'9t2BGHP6EddYu5xvArqDkhHPGbf8ZiYUaWgFcEPtRZhE')
911+ else false
1042912

github/deemru/w8io/873ac7e 
207.58 ms