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:
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | - | let a = | |
4 | + | let a = "_axlyLP" | |
5 | 5 | ||
6 | - | let b = | |
6 | + | let b = Address(base58'3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW') | |
7 | 7 | ||
8 | 8 | let c = Address(base58'3P37f8Y3rNpKzSkHNVZMAStXdpmNBgftHN9') | |
9 | 9 | ||
25 | 25 | ||
26 | 26 | ||
27 | 27 | func j (i) = !(if ((i != d)) | |
28 | - | then (i != | |
28 | + | then (i != b) | |
29 | 29 | else false) | |
30 | 30 | ||
31 | 31 | ||
89 | 89 | ||
90 | 90 | func C (A,B) = if ((B >= x)) | |
91 | 91 | then A | |
92 | - | else throw("List size exceeds | |
92 | + | else throw("List size exceeds 100") | |
93 | 93 | ||
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) | |
95 | 95 | } | |
96 | 96 | ||
97 | 97 | ||
189 | 189 | } | |
190 | 190 | ||
191 | 191 | ||
192 | - | func W (l) = if (( | |
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)] | |
194 | 194 | else { | |
195 | 195 | let X = S(l) | |
196 | 196 | let T = Q(l) | |
197 | - | let Y = D("lastRateHeight") | |
197 | + | let Y = valueOrElse(getInteger(this, (l + "_lastRateHeight")), D("lastRateHeight")) | |
198 | 198 | let Z = max([D((l + "_bRate")), p]) | |
199 | 199 | let aa = (Z + ((height - Y) * X)) | |
200 | 200 | let ab = max([D((l + "_sRate")), p]) | |
201 | 201 | 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)] | |
203 | 203 | } | |
204 | 204 | ||
205 | 205 | ||
222 | 222 | ||
223 | 223 | func C (A,B) = if ((B >= x)) | |
224 | 224 | then A | |
225 | - | else throw("List size exceeds | |
225 | + | else throw("List size exceeds 100") | |
226 | 226 | ||
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) | |
228 | 228 | } | |
229 | 229 | ||
230 | 230 | ||
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) | |
235 | 236 | } | |
236 | 237 | ||
237 | 238 | ||
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) | |
253 | 243 | } | |
254 | 244 | ||
255 | 245 | ||
260 | 250 | else { | |
261 | 251 | let am = getIntegerValue(Address(base58'3P8d1E1BLKoD52y3bQJ1bDTd2TD1gpaLn9t'), (l + "_twap5B")) | |
262 | 252 | let an = getIntegerValue(Address(base58'3P8d1E1BLKoD52y3bQJ1bDTd2TD1gpaLn9t'), (l + "_riskLevel")) | |
263 | - | if (( | |
253 | + | if (G((l + a))) | |
264 | 254 | then { | |
265 | 255 | let ao = { | |
266 | - | let ap = reentrantInvoke( | |
256 | + | let ap = reentrantInvoke(b, "getShareAssetPriceREADONLY", [l], nil) | |
267 | 257 | if ($isInstanceOf(ap, "Int")) | |
268 | 258 | then ap | |
269 | 259 | else throw(($getType(ap) + " couldn't be cast to Int")) | |
289 | 279 | } | |
290 | 280 | ||
291 | 281 | ||
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)) | |
302 | 337 | } | |
303 | - | else throw("issue while doing in-dapp invocation") | |
304 | 338 | } | |
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.") | |
310 | 339 | } | |
311 | 340 | ||
312 | 341 | ||
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)) | |
384 | 344 | then throw("available only for Axly protocol") | |
385 | 345 | else { | |
386 | - | let | |
387 | - | let | |
388 | - | let | |
389 | - | if (( | |
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)) | |
390 | 350 | then { | |
391 | - | let | |
392 | - | let ap = | |
351 | + | let aY = { | |
352 | + | let ap = aX | |
393 | 353 | if ($isInstanceOf(ap, "Int")) | |
394 | 354 | then ap | |
395 | 355 | else throw(($getType(ap) + " couldn't be cast to Int")) | |
396 | 356 | } | |
397 | - | if (( | |
357 | + | if ((aY == aY)) | |
398 | 358 | 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) | |
421 | 363 | } | |
422 | 364 | else throw("Strict value is not equal to itself.") | |
423 | 365 | } | |
426 | 368 | ||
427 | 369 | ||
428 | 370 | ||
429 | - | @Callable( | |
430 | - | func supply () = if (if ((size( | |
371 | + | @Callable(aN) | |
372 | + | func supply () = if (if ((size(aN.payments) != 1)) | |
431 | 373 | then true | |
432 | - | else ( | |
374 | + | else (aN.payments[0].amount == 0)) | |
433 | 375 | then throw("1 payment has to be attached") | |
434 | 376 | 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 | + | } | |
441 | 387 | } | |
442 | 388 | ||
443 | 389 | ||
444 | 390 | ||
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)) | |
458 | 403 | then { | |
459 | - | let | |
460 | - | if (( | |
404 | + | let bd = invoke(this, "getUserCollateralV2", [false, i, l, "", false, ("supplied," + toString(-(ay)))], nil) | |
405 | + | if ((bd == bd)) | |
461 | 406 | then { | |
462 | - | let | |
463 | - | let m = | |
407 | + | let be = { | |
408 | + | let m = bd | |
464 | 409 | if ($isInstanceOf(m, "Int")) | |
465 | 410 | then { | |
466 | - | let | |
467 | - | | |
411 | + | let aA = m | |
412 | + | aA | |
468 | 413 | } | |
469 | 414 | else throw("can't get user collateral value") | |
470 | 415 | } | |
471 | 416 | if (!(G("setup_active"))) | |
472 | 417 | then throw("market is stopped") | |
473 | - | else if ((0 > | |
418 | + | else if ((0 > be)) | |
474 | 419 | then throw("you dont have enough collateral for this operation") | |
475 | - | else if (( | |
420 | + | else if ((ay > (aJ - aK))) | |
476 | 421 | then throw("this amount is not available on the market") | |
477 | - | else if (( | |
478 | - | then throw("this amount is not available | |
479 | - | else ([IntegerEntry(((i + "_supplied_") + l), (D(((i + "_supplied_") + l)) - | |
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) | |
480 | 425 | } | |
481 | 426 | else throw("Strict value is not equal to itself.") | |
482 | 427 | } | |
485 | 430 | ||
486 | 431 | ||
487 | 432 | ||
488 | - | @Callable( | |
489 | - | func | |
433 | + | @Callable(aN) | |
434 | + | func repayFor (i,bf) = if (!(G("setup_active"))) | |
490 | 435 | 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 | + | } | |
516 | 475 | ||
517 | 476 | ||
518 | 477 | ||
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) | |
578 | 479 | func addInterestEXTERNAL () = { | |
579 | - | let | |
580 | - | let K = | |
480 | + | let ay = fraction(aN.payments[0].amount, 80, 100) | |
481 | + | let K = aN.payments[0].assetId | |
581 | 482 | let l = J(K) | |
582 | - | let | |
583 | - | let | |
584 | - | let | |
483 | + | let bm = D(("autostake_lastEarned_" + l)) | |
484 | + | let bn = D(("autostake_lastBlock_" + l)) | |
485 | + | let bo = if (if ((bn == height)) | |
585 | 486 | then true | |
586 | - | else ( | |
487 | + | else (ay == 0)) | |
587 | 488 | then nil | |
588 | - | else [IntegerEntry(("autostake_preLastEarned_" + l), | |
589 | - | ( | |
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)))))]) | |
590 | 491 | } | |
591 | 492 | ||
592 | 493 | ||
593 | 494 | ||
594 | - | @Callable( | |
595 | - | func preInit ( | |
495 | + | @Callable(aN) | |
496 | + | func preInit (bp,bq,br,bs) = { | |
596 | 497 | func t (u,af) = (u ++ [IntegerEntry((af + "_bRate"), p), IntegerEntry((af + "_sRate"), p)]) | |
597 | 498 | ||
598 | - | if (( | |
499 | + | if ((aN.caller != this)) | |
599 | 500 | then throw("admin only") | |
600 | 501 | else { | |
601 | - | let | |
602 | - | let w = split( | |
502 | + | let aj = { | |
503 | + | let w = split(bp, ",") | |
603 | 504 | let x = size(w) | |
604 | 505 | let y = nil | |
605 | 506 | func z (A,B) = if ((B >= x)) | |
612 | 513 | ||
613 | 514 | 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) | |
614 | 515 | } | |
615 | - | ([StringEntry("setup_tokens", | |
516 | + | ([StringEntry("setup_tokens", bp), StringEntry("setup_ltvs", bq), StringEntry("setup_lts", br), StringEntry("setup_penalties", bs), BooleanEntry("setup_active", true)] ++ aj) | |
616 | 517 | } | |
617 | 518 | } | |
618 | 519 | ||
619 | 520 | ||
620 | 521 | ||
621 | - | @Callable( | |
622 | - | func initNewToken (af, | |
623 | - | then ( | |
522 | + | @Callable(aN) | |
523 | + | func initNewToken (af,bt,bu,bv) = if (if ((aN.caller != this)) | |
524 | + | then (aN.caller != Address(base58'3P3o9cLTV2u9N4nYNKRYL6gy6cUEU9DwXW8')) | |
624 | 525 | else false) | |
625 | 526 | then throw("admin only") | |
626 | - | else [StringEntry("setup_tokens", ((H("setup_tokens") + ",") + af)), StringEntry("setup_ltvs", ((H("setup_ltvs") + ",") + | |
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)] | |
627 | 528 | ||
628 | 529 | ||
629 | 530 | ||
630 | - | @Callable( | |
631 | - | func | |
632 | - | then ( | |
531 | + | @Callable(aN) | |
532 | + | func initNewLPToken (af) = if (if ((aN.caller != this)) | |
533 | + | then (aN.caller != Address(base58'3P3o9cLTV2u9N4nYNKRYL6gy6cUEU9DwXW8')) | |
633 | 534 | else false) | |
634 | 535 | then throw("admin only") | |
635 | - | else [ | |
536 | + | else [BooleanEntry((af + "_axlyLp"), true)] | |
636 | 537 | ||
637 | 538 | ||
638 | 539 | ||
639 | - | @Callable( | |
640 | - | func | |
641 | - | then ( | |
540 | + | @Callable(aN) | |
541 | + | func updateParameter (E,bw) = if (if ((aN.caller != this)) | |
542 | + | then (aN.caller != Address(base58'3P3o9cLTV2u9N4nYNKRYL6gy6cUEU9DwXW8')) | |
642 | 543 | else false) | |
643 | 544 | then throw("admin only") | |
644 | - | else [ | |
545 | + | else [IntegerEntry(E, parseIntValue(bw))] | |
645 | 546 | ||
646 | 547 | ||
647 | 548 | ||
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)] | |
668 | 555 | ||
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]) | |
676 | 556 | ||
677 | - | func C (A,B) = if ((B >= x)) | |
678 | - | then A | |
679 | - | else throw("List size exceeds 12") | |
680 | 557 | ||
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.") | |
682 | 576 | } | |
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 | - | } | |
689 | 577 | ||
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)) | |
692 | 599 | else $Tuple2({ | |
693 | - | let w = | |
600 | + | let w = by | |
694 | 601 | 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 | + | ||
696 | 607 | func bI (A,B) = if ((B >= x)) | |
697 | 608 | then A | |
698 | - | else | |
609 | + | else throw("List size exceeds 100") | |
699 | 610 | ||
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 | |
706 | 613 | } | |
707 | 614 | ||
708 | 615 | ||
709 | 616 | ||
710 | - | @Callable( | |
711 | - | func shutdown ( | |
617 | + | @Callable(aN) | |
618 | + | func shutdown (bJ) = if ((indexOf(g, aN.caller.bytes) == unit)) | |
712 | 619 | then throw("user not in a whitelist") | |
713 | - | else [BooleanEntry("setup_active", !( | |
620 | + | else [BooleanEntry("setup_active", !(bJ))] | |
714 | 621 | ||
715 | 622 | ||
716 | 623 | ||
717 | - | @Callable( | |
718 | - | func | |
624 | + | @Callable(aN) | |
625 | + | func liquidateV2 (bx,i,aP,aQ,bK) = if (!(h(aN.caller))) | |
719 | 626 | then throw("available for whitelist only") | |
720 | 627 | else if (!(G("setup_active"))) | |
721 | 628 | then throw("market is stopped") | |
722 | 629 | else { | |
723 | - | let | |
724 | - | if (( | |
630 | + | let bd = invoke(this, "getUserCollateralV2", [false, i, aP, aQ, true, ""], nil) | |
631 | + | if ((bd == bd)) | |
725 | 632 | 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 | |
794 | 639 | } | |
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)))) | |
813 | 645 | then throw("wrong lp asset") | |
814 | - | else if ((0 >= | |
646 | + | else if ((0 >= bN)) | |
815 | 647 | then throw("user has no borrow in this token") | |
816 | - | else if (if (( | |
648 | + | else if (if ((bL > 0)) | |
817 | 649 | then true | |
818 | - | else ( | |
650 | + | else (bN == 0)) | |
819 | 651 | then throw("user can't be liquidated") | |
820 | 652 | else { | |
821 | - | let | |
822 | - | let | |
823 | - | let | |
824 | - | let | |
825 | - | let | |
826 | - | let | |
827 | - | let | |
828 | - | let | |
829 | - | let | |
830 | - | let | |
831 | - | let | |
832 | - | let | |
833 | - | let | |
834 | - | let | |
835 | - | let | |
836 | - | let ap = reentrantInvoke( | |
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) | |
837 | 669 | if ($isInstanceOf(ap, "Int")) | |
838 | 670 | then ap | |
839 | 671 | else throw(($getType(ap) + " couldn't be cast to Int")) | |
840 | 672 | } | |
841 | - | if (( | |
673 | + | if ((bY == bY)) | |
842 | 674 | then { | |
843 | - | let | |
844 | - | if ( | |
675 | + | let aY = fraction(bY, p, bS[1].value) | |
676 | + | if (bx) | |
845 | 677 | then throw("liquidation will pass") | |
846 | - | else ([ScriptTransfer( | |
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) | |
847 | 679 | } | |
848 | 680 | else throw("Strict value is not equal to itself.") | |
849 | 681 | } | |
853 | 685 | ||
854 | 686 | ||
855 | 687 | ||
856 | - | @Callable( | |
857 | - | func getUserCollateral ( | |
858 | - | let | |
859 | - | let | |
860 | - | let | |
861 | - | let | |
862 | - | let | |
863 | - | func t (u,v) = if ((v >= size( | |
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))) | |
864 | 696 | then u | |
865 | 697 | else { | |
866 | - | let | |
867 | - | let | |
868 | - | let | |
869 | - | then if (if (( | |
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)) | |
870 | 702 | then true | |
871 | - | else ( | |
703 | + | else (bl != 0)) | |
872 | 704 | then true | |
873 | 705 | else false | |
874 | 706 | else true | |
875 | - | if ( | |
707 | + | if (cd) | |
876 | 708 | then { | |
877 | - | let | |
878 | - | let | |
879 | - | ((u + fraction(fraction(fraction(( | |
880 | - | then ( | |
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]) | |
881 | 713 | else false) | |
882 | - | then ( | |
714 | + | then (cb[1] == "supplied") | |
883 | 715 | else false) | |
884 | - | then parseIntValue( | |
885 | - | else 0)), | |
886 | - | then fraction(fraction(fraction(( | |
887 | - | then ( | |
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]) | |
888 | 720 | else false) | |
889 | - | then ( | |
721 | + | then (cb[1] == "borrowed") | |
890 | 722 | else false) | |
891 | - | then parseIntValue( | |
892 | - | else 0)), | |
723 | + | then parseIntValue(cb[2]) | |
724 | + | else 0)), aj[((v * 3) + 1)].value, p), n, parseIntValue(br[v])), aB._2, aD) | |
893 | 725 | else 0)) | |
894 | 726 | } | |
895 | 727 | else u | |
896 | 728 | } | |
897 | 729 | ||
898 | - | let | |
730 | + | let ce = { | |
899 | 731 | let w = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] | |
900 | 732 | let x = size(w) | |
901 | 733 | let y = 0 | |
909 | 741 | ||
910 | 742 | 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) | |
911 | 743 | } | |
912 | - | if ( | |
913 | - | then throw(toString( | |
914 | - | else $Tuple2(nil, | |
744 | + | if (bx) | |
745 | + | then throw(toString(ce)) | |
746 | + | else $Tuple2(nil, ce) | |
915 | 747 | } | |
916 | 748 | ||
917 | 749 | ||
918 | 750 | ||
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) | |
928 | 785 | } | |
929 | 786 | ||
930 | 787 | ||
931 | 788 | ||
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 | + | } | |
941 | 799 | ||
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 | |
944 | 812 | let x = size(w) | |
945 | 813 | let y = "" | |
946 | 814 | func z (A,B) = if ((B >= x)) | |
949 | 817 | ||
950 | 818 | func C (A,B) = if ((B >= x)) | |
951 | 819 | then A | |
952 | - | else throw("List size exceeds | |
820 | + | else throw("List size exceeds 100") | |
953 | 821 | ||
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) | |
955 | 823 | } | |
956 | - | if ( | |
957 | - | then throw( | |
958 | - | else $Tuple2(nil, | |
824 | + | if (bx) | |
825 | + | then throw(ce) | |
826 | + | else $Tuple2(nil, ce) | |
959 | 827 | } | |
960 | 828 | ||
961 | 829 | ||
962 | 830 | ||
963 | - | @Callable( | |
964 | - | func calculateUtilizationRatio (l, | |
965 | - | then throw(toString( | |
966 | - | else $Tuple2(nil, | |
831 | + | @Callable(aN) | |
832 | + | func calculateUtilizationRatio (l,bx) = if (bx) | |
833 | + | then throw(toString(ai(l))) | |
834 | + | else $Tuple2(nil, ai(l)) | |
967 | 835 | ||
968 | 836 | ||
969 | 837 | ||
970 | - | @Callable( | |
971 | - | func calculateOutdatedUR (l, | |
838 | + | @Callable(aN) | |
839 | + | func calculateOutdatedUR (l,bx) = if (bx) | |
972 | 840 | then throw(toString(Q(l))) | |
973 | 841 | else $Tuple2(nil, Q(l)) | |
974 | 842 | ||
975 | 843 | ||
976 | 844 | ||
977 | - | @Callable( | |
978 | - | func calculateTokenRates ( | |
845 | + | @Callable(aN) | |
846 | + | func calculateTokenRates (bx) = { | |
979 | 847 | func t (u,l) = { | |
980 | - | let | |
981 | - | $Tuple2(((((u._1 + toString( | |
848 | + | let aj = W(l) | |
849 | + | $Tuple2(((((u._1 + toString(aj[1].value)) + "|") + toString(aj[0].value)) + ","), (u._2 ++ aj)) | |
982 | 850 | } | |
983 | 851 | ||
984 | - | let | |
852 | + | let bE = { | |
985 | 853 | let w = N() | |
986 | 854 | let x = size(w) | |
987 | 855 | let y = $Tuple2("", nil) | |
991 | 859 | ||
992 | 860 | func C (A,B) = if ((B >= x)) | |
993 | 861 | then A | |
994 | - | else throw("List size exceeds | |
862 | + | else throw("List size exceeds 100") | |
995 | 863 | ||
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) | |
997 | 865 | } | |
998 | - | if ( | |
999 | - | then throw( | |
1000 | - | else $Tuple2( | |
866 | + | if (bx) | |
867 | + | then throw(bE._1) | |
868 | + | else $Tuple2(bE._2, bE._1) | |
1001 | 869 | } | |
1002 | 870 | ||
1003 | 871 | ||
1004 | 872 | ||
1005 | - | @Callable( | |
1006 | - | func calculateTokensInterest ( | |
873 | + | @Callable(aN) | |
874 | + | func calculateTokensInterest (bx) = { | |
1007 | 875 | func t (u,l) = { | |
1008 | 876 | let V = fraction(S(l), q, n) | |
1009 | 877 | ((u + toString(V)) + ",") | |
1010 | 878 | } | |
1011 | 879 | ||
1012 | - | let | |
880 | + | let bE = { | |
1013 | 881 | let w = N() | |
1014 | 882 | let x = size(w) | |
1015 | 883 | let y = "" | |
1019 | 887 | ||
1020 | 888 | func C (A,B) = if ((B >= x)) | |
1021 | 889 | then A | |
1022 | - | else throw("List size exceeds | |
890 | + | else throw("List size exceeds 100") | |
1023 | 891 | ||
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) | |
1025 | 893 | } | |
1026 | - | if ( | |
1027 | - | then throw( | |
1028 | - | else $Tuple2(nil, | |
894 | + | if (bx) | |
895 | + | then throw(bE) | |
896 | + | else $Tuple2(nil, bE) | |
1029 | 897 | } | |
1030 | 898 | ||
1031 | 899 | ||
1032 | - | @Verifier( | |
1033 | - | func | |
900 | + | @Verifier(cq) | |
901 | + | func cr () = if (if (if (if (sigVerify(cq.bodyBytes, cq.proofs[0], base58'J4QQBsh6FGgZbijQPMDZ7GtNALx2N15K3eHvGhjq43Lt')) | |
1034 | 902 | then true | |
1035 | - | else sigVerify( | |
903 | + | else sigVerify(cq.bodyBytes, cq.proofs[0], base58'Ajf56x532JLzVoourPv9FW75kYsvScNxztPnt1enhNkS')) | |
1036 | 904 | 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')) | |
1040 | 906 | 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 | |
1042 | 912 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | - | let a = | |
4 | + | let a = "_axlyLP" | |
5 | 5 | ||
6 | - | let b = | |
6 | + | let b = Address(base58'3PLsYkBw7taejV1J3qWPCN2yeyVRu31d5HW') | |
7 | 7 | ||
8 | 8 | let c = Address(base58'3P37f8Y3rNpKzSkHNVZMAStXdpmNBgftHN9') | |
9 | 9 | ||
10 | 10 | let d = Address(base58'3P4kBiU4wr2yV1S5gMfu3MdkVvy7kxXHsKe') | |
11 | 11 | ||
12 | 12 | let e = 20 | |
13 | 13 | ||
14 | 14 | let f = Address(base58'3PGFHzVGT4NTigwCKP1NcwoXkodVZwvBuuU') | |
15 | 15 | ||
16 | 16 | let g = [base58'3PMcMiMEs6w56NRGacksXtFG5zS7doE9fpL', base58'3PAxdDSmN758L5SHSGRC5apEtQE2aApZotG', base58'3PJKmXoHJvVeQXjSJdhtkUcFDtdiQqMbUTD', base58'3PQdNxynJy5mche2kxMVc5shXWzK8Gstq3o', base58'3PHbdpaKzz8EiAngGHaFu2hVuNCdsC67qh3', base58'3P6Ksahs71SiKQgQ4qaZuFAVhqncdi2nvJQ'] | |
17 | 17 | ||
18 | 18 | func h (i) = !(if (if (if ((i != Address(base58'3PFHNdEPu71QwBAnc2HZPcrbxoseNfUvHEA'))) | |
19 | 19 | then (i != Address(base58'3PCqdm1mAoQqR46oZotFanmqb5CLUvrKEo2')) | |
20 | 20 | else false) | |
21 | 21 | then (i != Address(base58'3PMcMiMEs6w56NRGacksXtFG5zS7doE9fpL')) | |
22 | 22 | else false) | |
23 | 23 | then (i != Address(base58'3PHbdpaKzz8EiAngGHaFu2hVuNCdsC67qh3')) | |
24 | 24 | else false) | |
25 | 25 | ||
26 | 26 | ||
27 | 27 | func j (i) = !(if ((i != d)) | |
28 | - | then (i != | |
28 | + | then (i != b) | |
29 | 29 | else false) | |
30 | 30 | ||
31 | 31 | ||
32 | 32 | func k (l) = { | |
33 | 33 | let m = l | |
34 | 34 | if (("9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi" == m)) | |
35 | 35 | then $Tuple4(2000000, 25000000, 80000000, 100000000) | |
36 | 36 | else if (("HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW" == m)) | |
37 | 37 | then $Tuple4(2000000, 25000000, 80000000, 100000000) | |
38 | 38 | else if (("34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ" == m)) | |
39 | 39 | then $Tuple4(2000000, 25000000, 80000000, 100000000) | |
40 | 40 | else if (("6XtHjpXbs9RRJP2Sr9GUyVqzACcby9TkThHXnjVC5CDJ" == m)) | |
41 | 41 | then $Tuple4(2000000, 25000000, 80000000, 100000000) | |
42 | 42 | else if (("DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p" == m)) | |
43 | 43 | then $Tuple4(2000000, 25000000, 80000000, 100000000) | |
44 | 44 | else if (("Ajso6nTTjptu2UHLx6hfSXVtHFtRBJCkKYd5SAyj7zf5" == m)) | |
45 | 45 | then $Tuple4(2000000, 40000000, 80000000, 150000000) | |
46 | 46 | else if (("HEB8Qaw9xrWpWs8tHsiATYGBWDBtP2S7kcPALrMu43AS" == m)) | |
47 | 47 | then $Tuple4(0, 20000000, 80000000, 40000000) | |
48 | 48 | else if (("WAVES" == m)) | |
49 | 49 | then $Tuple4(2000000, 30000000, 80000000, 50000000) | |
50 | 50 | else if (("Atqv59EYzjFGuitKVnMRk6H8FukjoV3ktPorbEys25on" == m)) | |
51 | 51 | then $Tuple4(0, 20000000, 80000000, 40000000) | |
52 | 52 | else if (("DSbbhLsSTeDg5Lsiufk2Aneh3DjVqJuPr2M9uU1gwy5p" == m)) | |
53 | 53 | then $Tuple4(0, 20000000, 80000000, 100000000) | |
54 | 54 | else if (("8t4DPWTwPzpatHA9AkTxWAB47THnYzBsDnoY7fQqbG91" == m)) | |
55 | 55 | then $Tuple4(0, 30000000, 80000000, 40000000) | |
56 | 56 | else if (("At8D6NFFpheCbvKVnjVoeLL84Eo8NZn6ovManxfLaFWL" == m)) | |
57 | 57 | then $Tuple4(0, 25000000, 80000000, 40000000) | |
58 | 58 | else if (("8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS" == m)) | |
59 | 59 | then $Tuple4(2000000, 30000000, 80000000, 50000000) | |
60 | 60 | else if (("474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu" == m)) | |
61 | 61 | then $Tuple4(2000000, 30000000, 80000000, 50000000) | |
62 | 62 | else if (("5UYBPpq4WoU5n4MwpFkgJnW3Fq4B1u3ukpK33ik4QerR" == m)) | |
63 | 63 | then $Tuple4(2000000, 30000000, 80000000, 50000000) | |
64 | 64 | else if (("2thsACuHmzDMuNezPM32wg9a3BwUzBWDeSKakgz3cw21" == m)) | |
65 | 65 | then $Tuple4(2000000, 40000000, 80000000, 100000000) | |
66 | 66 | else if (("YiNbofFzC17jEHHCMwrRcpy9MrrjabMMLZxg8g5xmf7" == m)) | |
67 | 67 | then $Tuple4(2000000, 30000000, 80000000, 80000000) | |
68 | 68 | else $Tuple4(0, 20000000, 80000000, 80000000) | |
69 | 69 | } | |
70 | 70 | ||
71 | 71 | ||
72 | 72 | let n = 100000000 | |
73 | 73 | ||
74 | 74 | let o = 10000000000 | |
75 | 75 | ||
76 | 76 | let p = (n * n) | |
77 | 77 | ||
78 | 78 | let q = 1440 | |
79 | 79 | ||
80 | 80 | func r (s) = { | |
81 | 81 | func t (u,v) = ((u + toString(v)) + ",") | |
82 | 82 | ||
83 | 83 | let w = s | |
84 | 84 | let x = size(w) | |
85 | 85 | let y = "" | |
86 | 86 | func z (A,B) = if ((B >= x)) | |
87 | 87 | then A | |
88 | 88 | else t(A, w[B]) | |
89 | 89 | ||
90 | 90 | func C (A,B) = if ((B >= x)) | |
91 | 91 | then A | |
92 | - | else throw("List size exceeds | |
92 | + | else throw("List size exceeds 100") | |
93 | 93 | ||
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) | |
95 | 95 | } | |
96 | 96 | ||
97 | 97 | ||
98 | 98 | func D (E) = { | |
99 | 99 | let m = getInteger(this, E) | |
100 | 100 | if ($isInstanceOf(m, "Int")) | |
101 | 101 | then { | |
102 | 102 | let F = m | |
103 | 103 | F | |
104 | 104 | } | |
105 | 105 | else 0 | |
106 | 106 | } | |
107 | 107 | ||
108 | 108 | ||
109 | 109 | func G (E) = { | |
110 | 110 | let m = getBoolean(this, E) | |
111 | 111 | if ($isInstanceOf(m, "Boolean")) | |
112 | 112 | then { | |
113 | 113 | let F = m | |
114 | 114 | F | |
115 | 115 | } | |
116 | 116 | else false | |
117 | 117 | } | |
118 | 118 | ||
119 | 119 | ||
120 | 120 | func H (E) = { | |
121 | 121 | let m = getString(this, E) | |
122 | 122 | if ($isInstanceOf(m, "String")) | |
123 | 123 | then { | |
124 | 124 | let F = m | |
125 | 125 | F | |
126 | 126 | } | |
127 | 127 | else "" | |
128 | 128 | } | |
129 | 129 | ||
130 | 130 | ||
131 | 131 | func I (E) = { | |
132 | 132 | let m = getBinary(this, E) | |
133 | 133 | if ($isInstanceOf(m, "ByteVector")) | |
134 | 134 | then { | |
135 | 135 | let F = m | |
136 | 136 | F | |
137 | 137 | } | |
138 | 138 | else base58'' | |
139 | 139 | } | |
140 | 140 | ||
141 | 141 | ||
142 | 142 | func J (K) = { | |
143 | 143 | let m = K | |
144 | 144 | if ($isInstanceOf(m, "ByteVector")) | |
145 | 145 | then { | |
146 | 146 | let F = m | |
147 | 147 | toBase58String(F) | |
148 | 148 | } | |
149 | 149 | else "WAVES" | |
150 | 150 | } | |
151 | 151 | ||
152 | 152 | ||
153 | 153 | func L (l) = if ((l == "WAVES")) | |
154 | 154 | then unit | |
155 | 155 | else fromBase58String(l) | |
156 | 156 | ||
157 | 157 | ||
158 | 158 | func M (l) = if ((l == "WAVES")) | |
159 | 159 | then wavesBalance(this).available | |
160 | 160 | else assetBalance(this, fromBase58String(l)) | |
161 | 161 | ||
162 | 162 | ||
163 | 163 | func N () = split(H("setup_tokens"), ",") | |
164 | 164 | ||
165 | 165 | ||
166 | 166 | func O () = { | |
167 | 167 | let P = H("setup_maxsupply") | |
168 | 168 | if ((P == "")) | |
169 | 169 | then [-1, -1, -1, -1, -1, -1, -1] | |
170 | 170 | else split(P, ",") | |
171 | 171 | } | |
172 | 172 | ||
173 | 173 | ||
174 | 174 | func Q (l) = { | |
175 | 175 | let R = fraction(D(("total_supplied_" + l)), D((l + "_sRate")), p) | |
176 | 176 | if ((R == 0)) | |
177 | 177 | then 0 | |
178 | 178 | else fraction(n, fraction(D(("total_borrowed_" + l)), D((l + "_bRate")), p), R) | |
179 | 179 | } | |
180 | 180 | ||
181 | 181 | ||
182 | 182 | func S (l) = { | |
183 | 183 | let T = Q(l) | |
184 | 184 | let U = k(l) | |
185 | 185 | let V = (U._1 + (if ((U._3 >= T)) | |
186 | 186 | then fraction(T, U._2, U._3) | |
187 | 187 | else (U._2 + fraction((T - U._3), U._4, (100000000 - U._3))))) | |
188 | 188 | max([fraction(V, n, (q * 365)), 1]) | |
189 | 189 | } | |
190 | 190 | ||
191 | 191 | ||
192 | - | func W (l) = if (( | |
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)] | |
194 | 194 | else { | |
195 | 195 | let X = S(l) | |
196 | 196 | let T = Q(l) | |
197 | - | let Y = D("lastRateHeight") | |
197 | + | let Y = valueOrElse(getInteger(this, (l + "_lastRateHeight")), D("lastRateHeight")) | |
198 | 198 | let Z = max([D((l + "_bRate")), p]) | |
199 | 199 | let aa = (Z + ((height - Y) * X)) | |
200 | 200 | let ab = max([D((l + "_sRate")), p]) | |
201 | 201 | 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)] | |
203 | 203 | } | |
204 | 204 | ||
205 | 205 | ||
206 | 206 | func ad (l,ae) = { | |
207 | 207 | func t (u,af) = { | |
208 | 208 | let ag = W(af) | |
209 | 209 | $Tuple2(if ((af != l)) | |
210 | 210 | then u._1 | |
211 | 211 | else if ((ae == "sRate")) | |
212 | 212 | then ag[0].value | |
213 | 213 | else ag[1].value, (u._2 ++ ag)) | |
214 | 214 | } | |
215 | 215 | ||
216 | 216 | let w = N() | |
217 | 217 | let x = size(w) | |
218 | 218 | let y = $Tuple2(0, nil) | |
219 | 219 | func z (A,B) = if ((B >= x)) | |
220 | 220 | then A | |
221 | 221 | else t(A, w[B]) | |
222 | 222 | ||
223 | 223 | func C (A,B) = if ((B >= x)) | |
224 | 224 | then A | |
225 | - | else throw("List size exceeds | |
225 | + | else throw("List size exceeds 100") | |
226 | 226 | ||
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) | |
228 | 228 | } | |
229 | 229 | ||
230 | 230 | ||
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) | |
235 | 236 | } | |
236 | 237 | ||
237 | 238 | ||
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) | |
253 | 243 | } | |
254 | 244 | ||
255 | 245 | ||
256 | 246 | func ak (l,al) = if (if ((l == "9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi")) | |
257 | 247 | then true | |
258 | 248 | else (l == "HGgabTqUS8WtVFUJzfmrTDMgEccJuZLBPhFgQFxvnsoW")) | |
259 | 249 | then $Tuple2(1000000, 1000000) | |
260 | 250 | else { | |
261 | 251 | let am = getIntegerValue(Address(base58'3P8d1E1BLKoD52y3bQJ1bDTd2TD1gpaLn9t'), (l + "_twap5B")) | |
262 | 252 | let an = getIntegerValue(Address(base58'3P8d1E1BLKoD52y3bQJ1bDTd2TD1gpaLn9t'), (l + "_riskLevel")) | |
263 | - | if (( | |
253 | + | if (G((l + a))) | |
264 | 254 | then { | |
265 | 255 | let ao = { | |
266 | - | let ap = reentrantInvoke( | |
256 | + | let ap = reentrantInvoke(b, "getShareAssetPriceREADONLY", [l], nil) | |
267 | 257 | if ($isInstanceOf(ap, "Int")) | |
268 | 258 | then ap | |
269 | 259 | else throw(($getType(ap) + " couldn't be cast to Int")) | |
270 | 260 | } | |
271 | 261 | if ((ao == ao)) | |
272 | 262 | then $Tuple2(ao, ao) | |
273 | 263 | else throw("Strict value is not equal to itself.") | |
274 | 264 | } | |
275 | 265 | else if ((al >= an)) | |
276 | 266 | then $Tuple2(am, am) | |
277 | 267 | else throw((("oracle prices don't match: " + toString(am)) + " is the price, but risk is too high")) | |
278 | 268 | } | |
279 | 269 | ||
280 | 270 | ||
281 | 271 | func aq (l) = ak(l, 1) | |
282 | 272 | ||
283 | 273 | ||
284 | 274 | func ar (l) = { | |
285 | 275 | let as = if ((l == "WAVES")) | |
286 | 276 | then 8 | |
287 | 277 | else value(assetInfo(fromBase58String(l))).decimals | |
288 | 278 | pow(10, 0, as, 0, 0, DOWN) | |
289 | 279 | } | |
290 | 280 | ||
291 | 281 | ||
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)) | |
302 | 337 | } | |
303 | - | else throw("issue while doing in-dapp invocation") | |
304 | 338 | } | |
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.") | |
310 | 339 | } | |
311 | 340 | ||
312 | 341 | ||
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)) | |
384 | 344 | then throw("available only for Axly protocol") | |
385 | 345 | else { | |
386 | - | let | |
387 | - | let | |
388 | - | let | |
389 | - | if (( | |
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)) | |
390 | 350 | then { | |
391 | - | let | |
392 | - | let ap = | |
351 | + | let aY = { | |
352 | + | let ap = aX | |
393 | 353 | if ($isInstanceOf(ap, "Int")) | |
394 | 354 | then ap | |
395 | 355 | else throw(($getType(ap) + " couldn't be cast to Int")) | |
396 | 356 | } | |
397 | - | if (( | |
357 | + | if ((aY == aY)) | |
398 | 358 | 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) | |
421 | 363 | } | |
422 | 364 | else throw("Strict value is not equal to itself.") | |
423 | 365 | } | |
424 | 366 | else throw("Strict value is not equal to itself.") | |
425 | 367 | } | |
426 | 368 | ||
427 | 369 | ||
428 | 370 | ||
429 | - | @Callable( | |
430 | - | func supply () = if (if ((size( | |
371 | + | @Callable(aN) | |
372 | + | func supply () = if (if ((size(aN.payments) != 1)) | |
431 | 373 | then true | |
432 | - | else ( | |
374 | + | else (aN.payments[0].amount == 0)) | |
433 | 375 | then throw("1 payment has to be attached") | |
434 | 376 | 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 | + | } | |
441 | 387 | } | |
442 | 388 | ||
443 | 389 | ||
444 | 390 | ||
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)) | |
458 | 403 | then { | |
459 | - | let | |
460 | - | if (( | |
404 | + | let bd = invoke(this, "getUserCollateralV2", [false, i, l, "", false, ("supplied," + toString(-(ay)))], nil) | |
405 | + | if ((bd == bd)) | |
461 | 406 | then { | |
462 | - | let | |
463 | - | let m = | |
407 | + | let be = { | |
408 | + | let m = bd | |
464 | 409 | if ($isInstanceOf(m, "Int")) | |
465 | 410 | then { | |
466 | - | let | |
467 | - | | |
411 | + | let aA = m | |
412 | + | aA | |
468 | 413 | } | |
469 | 414 | else throw("can't get user collateral value") | |
470 | 415 | } | |
471 | 416 | if (!(G("setup_active"))) | |
472 | 417 | then throw("market is stopped") | |
473 | - | else if ((0 > | |
418 | + | else if ((0 > be)) | |
474 | 419 | then throw("you dont have enough collateral for this operation") | |
475 | - | else if (( | |
420 | + | else if ((ay > (aJ - aK))) | |
476 | 421 | then throw("this amount is not available on the market") | |
477 | - | else if (( | |
478 | - | then throw("this amount is not available | |
479 | - | else ([IntegerEntry(((i + "_supplied_") + l), (D(((i + "_supplied_") + l)) - | |
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) | |
480 | 425 | } | |
481 | 426 | else throw("Strict value is not equal to itself.") | |
482 | 427 | } | |
483 | 428 | else throw("Strict value is not equal to itself.") | |
484 | 429 | } | |
485 | 430 | ||
486 | 431 | ||
487 | 432 | ||
488 | - | @Callable( | |
489 | - | func | |
433 | + | @Callable(aN) | |
434 | + | func repayFor (i,bf) = if (!(G("setup_active"))) | |
490 | 435 | 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 | + | } | |
516 | 475 | ||
517 | 476 | ||
518 | 477 | ||
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) | |
578 | 479 | func addInterestEXTERNAL () = { | |
579 | - | let | |
580 | - | let K = | |
480 | + | let ay = fraction(aN.payments[0].amount, 80, 100) | |
481 | + | let K = aN.payments[0].assetId | |
581 | 482 | let l = J(K) | |
582 | - | let | |
583 | - | let | |
584 | - | let | |
483 | + | let bm = D(("autostake_lastEarned_" + l)) | |
484 | + | let bn = D(("autostake_lastBlock_" + l)) | |
485 | + | let bo = if (if ((bn == height)) | |
585 | 486 | then true | |
586 | - | else ( | |
487 | + | else (ay == 0)) | |
587 | 488 | then nil | |
588 | - | else [IntegerEntry(("autostake_preLastEarned_" + l), | |
589 | - | ( | |
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)))))]) | |
590 | 491 | } | |
591 | 492 | ||
592 | 493 | ||
593 | 494 | ||
594 | - | @Callable( | |
595 | - | func preInit ( | |
495 | + | @Callable(aN) | |
496 | + | func preInit (bp,bq,br,bs) = { | |
596 | 497 | func t (u,af) = (u ++ [IntegerEntry((af + "_bRate"), p), IntegerEntry((af + "_sRate"), p)]) | |
597 | 498 | ||
598 | - | if (( | |
499 | + | if ((aN.caller != this)) | |
599 | 500 | then throw("admin only") | |
600 | 501 | else { | |
601 | - | let | |
602 | - | let w = split( | |
502 | + | let aj = { | |
503 | + | let w = split(bp, ",") | |
603 | 504 | let x = size(w) | |
604 | 505 | let y = nil | |
605 | 506 | func z (A,B) = if ((B >= x)) | |
606 | 507 | then A | |
607 | 508 | else t(A, w[B]) | |
608 | 509 | ||
609 | 510 | func C (A,B) = if ((B >= x)) | |
610 | 511 | then A | |
611 | 512 | else throw("List size exceeds 12") | |
612 | 513 | ||
613 | 514 | 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) | |
614 | 515 | } | |
615 | - | ([StringEntry("setup_tokens", | |
516 | + | ([StringEntry("setup_tokens", bp), StringEntry("setup_ltvs", bq), StringEntry("setup_lts", br), StringEntry("setup_penalties", bs), BooleanEntry("setup_active", true)] ++ aj) | |
616 | 517 | } | |
617 | 518 | } | |
618 | 519 | ||
619 | 520 | ||
620 | 521 | ||
621 | - | @Callable( | |
622 | - | func initNewToken (af, | |
623 | - | then ( | |
522 | + | @Callable(aN) | |
523 | + | func initNewToken (af,bt,bu,bv) = if (if ((aN.caller != this)) | |
524 | + | then (aN.caller != Address(base58'3P3o9cLTV2u9N4nYNKRYL6gy6cUEU9DwXW8')) | |
624 | 525 | else false) | |
625 | 526 | then throw("admin only") | |
626 | - | else [StringEntry("setup_tokens", ((H("setup_tokens") + ",") + af)), StringEntry("setup_ltvs", ((H("setup_ltvs") + ",") + | |
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)] | |
627 | 528 | ||
628 | 529 | ||
629 | 530 | ||
630 | - | @Callable( | |
631 | - | func | |
632 | - | then ( | |
531 | + | @Callable(aN) | |
532 | + | func initNewLPToken (af) = if (if ((aN.caller != this)) | |
533 | + | then (aN.caller != Address(base58'3P3o9cLTV2u9N4nYNKRYL6gy6cUEU9DwXW8')) | |
633 | 534 | else false) | |
634 | 535 | then throw("admin only") | |
635 | - | else [ | |
536 | + | else [BooleanEntry((af + "_axlyLp"), true)] | |
636 | 537 | ||
637 | 538 | ||
638 | 539 | ||
639 | - | @Callable( | |
640 | - | func | |
641 | - | then ( | |
540 | + | @Callable(aN) | |
541 | + | func updateParameter (E,bw) = if (if ((aN.caller != this)) | |
542 | + | then (aN.caller != Address(base58'3P3o9cLTV2u9N4nYNKRYL6gy6cUEU9DwXW8')) | |
642 | 543 | else false) | |
643 | 544 | then throw("admin only") | |
644 | - | else [ | |
545 | + | else [IntegerEntry(E, parseIntValue(bw))] | |
645 | 546 | ||
646 | 547 | ||
647 | 548 | ||
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)] | |
668 | 555 | ||
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]) | |
676 | 556 | ||
677 | - | func C (A,B) = if ((B >= x)) | |
678 | - | then A | |
679 | - | else throw("List size exceeds 12") | |
680 | 557 | ||
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.") | |
682 | 576 | } | |
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 | - | } | |
689 | 577 | ||
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)) | |
692 | 599 | else $Tuple2({ | |
693 | - | let w = | |
600 | + | let w = by | |
694 | 601 | 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 | + | ||
696 | 607 | func bI (A,B) = if ((B >= x)) | |
697 | 608 | then A | |
698 | - | else | |
609 | + | else throw("List size exceeds 100") | |
699 | 610 | ||
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 | |
706 | 613 | } | |
707 | 614 | ||
708 | 615 | ||
709 | 616 | ||
710 | - | @Callable( | |
711 | - | func shutdown ( | |
617 | + | @Callable(aN) | |
618 | + | func shutdown (bJ) = if ((indexOf(g, aN.caller.bytes) == unit)) | |
712 | 619 | then throw("user not in a whitelist") | |
713 | - | else [BooleanEntry("setup_active", !( | |
620 | + | else [BooleanEntry("setup_active", !(bJ))] | |
714 | 621 | ||
715 | 622 | ||
716 | 623 | ||
717 | - | @Callable( | |
718 | - | func | |
624 | + | @Callable(aN) | |
625 | + | func liquidateV2 (bx,i,aP,aQ,bK) = if (!(h(aN.caller))) | |
719 | 626 | then throw("available for whitelist only") | |
720 | 627 | else if (!(G("setup_active"))) | |
721 | 628 | then throw("market is stopped") | |
722 | 629 | else { | |
723 | - | let | |
724 | - | if (( | |
630 | + | let bd = invoke(this, "getUserCollateralV2", [false, i, aP, aQ, true, ""], nil) | |
631 | + | if ((bd == bd)) | |
725 | 632 | 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 | |
794 | 639 | } | |
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)))) | |
813 | 645 | then throw("wrong lp asset") | |
814 | - | else if ((0 >= | |
646 | + | else if ((0 >= bN)) | |
815 | 647 | then throw("user has no borrow in this token") | |
816 | - | else if (if (( | |
648 | + | else if (if ((bL > 0)) | |
817 | 649 | then true | |
818 | - | else ( | |
650 | + | else (bN == 0)) | |
819 | 651 | then throw("user can't be liquidated") | |
820 | 652 | else { | |
821 | - | let | |
822 | - | let | |
823 | - | let | |
824 | - | let | |
825 | - | let | |
826 | - | let | |
827 | - | let | |
828 | - | let | |
829 | - | let | |
830 | - | let | |
831 | - | let | |
832 | - | let | |
833 | - | let | |
834 | - | let | |
835 | - | let | |
836 | - | let ap = reentrantInvoke( | |
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) | |
837 | 669 | if ($isInstanceOf(ap, "Int")) | |
838 | 670 | then ap | |
839 | 671 | else throw(($getType(ap) + " couldn't be cast to Int")) | |
840 | 672 | } | |
841 | - | if (( | |
673 | + | if ((bY == bY)) | |
842 | 674 | then { | |
843 | - | let | |
844 | - | if ( | |
675 | + | let aY = fraction(bY, p, bS[1].value) | |
676 | + | if (bx) | |
845 | 677 | then throw("liquidation will pass") | |
846 | - | else ([ScriptTransfer( | |
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) | |
847 | 679 | } | |
848 | 680 | else throw("Strict value is not equal to itself.") | |
849 | 681 | } | |
850 | 682 | } | |
851 | 683 | else throw("Strict value is not equal to itself.") | |
852 | 684 | } | |
853 | 685 | ||
854 | 686 | ||
855 | 687 | ||
856 | - | @Callable( | |
857 | - | func getUserCollateral ( | |
858 | - | let | |
859 | - | let | |
860 | - | let | |
861 | - | let | |
862 | - | let | |
863 | - | func t (u,v) = if ((v >= size( | |
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))) | |
864 | 696 | then u | |
865 | 697 | else { | |
866 | - | let | |
867 | - | let | |
868 | - | let | |
869 | - | then if (if (( | |
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)) | |
870 | 702 | then true | |
871 | - | else ( | |
703 | + | else (bl != 0)) | |
872 | 704 | then true | |
873 | 705 | else false | |
874 | 706 | else true | |
875 | - | if ( | |
707 | + | if (cd) | |
876 | 708 | then { | |
877 | - | let | |
878 | - | let | |
879 | - | ((u + fraction(fraction(fraction(( | |
880 | - | then ( | |
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]) | |
881 | 713 | else false) | |
882 | - | then ( | |
714 | + | then (cb[1] == "supplied") | |
883 | 715 | else false) | |
884 | - | then parseIntValue( | |
885 | - | else 0)), | |
886 | - | then fraction(fraction(fraction(( | |
887 | - | then ( | |
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]) | |
888 | 720 | else false) | |
889 | - | then ( | |
721 | + | then (cb[1] == "borrowed") | |
890 | 722 | else false) | |
891 | - | then parseIntValue( | |
892 | - | else 0)), | |
723 | + | then parseIntValue(cb[2]) | |
724 | + | else 0)), aj[((v * 3) + 1)].value, p), n, parseIntValue(br[v])), aB._2, aD) | |
893 | 725 | else 0)) | |
894 | 726 | } | |
895 | 727 | else u | |
896 | 728 | } | |
897 | 729 | ||
898 | - | let | |
730 | + | let ce = { | |
899 | 731 | let w = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] | |
900 | 732 | let x = size(w) | |
901 | 733 | let y = 0 | |
902 | 734 | func z (A,B) = if ((B >= x)) | |
903 | 735 | then A | |
904 | 736 | else t(A, w[B]) | |
905 | 737 | ||
906 | 738 | func C (A,B) = if ((B >= x)) | |
907 | 739 | then A | |
908 | 740 | else throw("List size exceeds 12") | |
909 | 741 | ||
910 | 742 | 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) | |
911 | 743 | } | |
912 | - | if ( | |
913 | - | then throw(toString( | |
914 | - | else $Tuple2(nil, | |
744 | + | if (bx) | |
745 | + | then throw(toString(ce)) | |
746 | + | else $Tuple2(nil, ce) | |
915 | 747 | } | |
916 | 748 | ||
917 | 749 | ||
918 | 750 | ||
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) | |
928 | 785 | } | |
929 | 786 | ||
930 | 787 | ||
931 | 788 | ||
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 | + | } | |
941 | 799 | ||
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 | |
944 | 812 | let x = size(w) | |
945 | 813 | let y = "" | |
946 | 814 | func z (A,B) = if ((B >= x)) | |
947 | 815 | then A | |
948 | 816 | else t(A, w[B]) | |
949 | 817 | ||
950 | 818 | func C (A,B) = if ((B >= x)) | |
951 | 819 | then A | |
952 | - | else throw("List size exceeds | |
820 | + | else throw("List size exceeds 100") | |
953 | 821 | ||
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) | |
955 | 823 | } | |
956 | - | if ( | |
957 | - | then throw( | |
958 | - | else $Tuple2(nil, | |
824 | + | if (bx) | |
825 | + | then throw(ce) | |
826 | + | else $Tuple2(nil, ce) | |
959 | 827 | } | |
960 | 828 | ||
961 | 829 | ||
962 | 830 | ||
963 | - | @Callable( | |
964 | - | func calculateUtilizationRatio (l, | |
965 | - | then throw(toString( | |
966 | - | else $Tuple2(nil, | |
831 | + | @Callable(aN) | |
832 | + | func calculateUtilizationRatio (l,bx) = if (bx) | |
833 | + | then throw(toString(ai(l))) | |
834 | + | else $Tuple2(nil, ai(l)) | |
967 | 835 | ||
968 | 836 | ||
969 | 837 | ||
970 | - | @Callable( | |
971 | - | func calculateOutdatedUR (l, | |
838 | + | @Callable(aN) | |
839 | + | func calculateOutdatedUR (l,bx) = if (bx) | |
972 | 840 | then throw(toString(Q(l))) | |
973 | 841 | else $Tuple2(nil, Q(l)) | |
974 | 842 | ||
975 | 843 | ||
976 | 844 | ||
977 | - | @Callable( | |
978 | - | func calculateTokenRates ( | |
845 | + | @Callable(aN) | |
846 | + | func calculateTokenRates (bx) = { | |
979 | 847 | func t (u,l) = { | |
980 | - | let | |
981 | - | $Tuple2(((((u._1 + toString( | |
848 | + | let aj = W(l) | |
849 | + | $Tuple2(((((u._1 + toString(aj[1].value)) + "|") + toString(aj[0].value)) + ","), (u._2 ++ aj)) | |
982 | 850 | } | |
983 | 851 | ||
984 | - | let | |
852 | + | let bE = { | |
985 | 853 | let w = N() | |
986 | 854 | let x = size(w) | |
987 | 855 | let y = $Tuple2("", nil) | |
988 | 856 | func z (A,B) = if ((B >= x)) | |
989 | 857 | then A | |
990 | 858 | else t(A, w[B]) | |
991 | 859 | ||
992 | 860 | func C (A,B) = if ((B >= x)) | |
993 | 861 | then A | |
994 | - | else throw("List size exceeds | |
862 | + | else throw("List size exceeds 100") | |
995 | 863 | ||
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) | |
997 | 865 | } | |
998 | - | if ( | |
999 | - | then throw( | |
1000 | - | else $Tuple2( | |
866 | + | if (bx) | |
867 | + | then throw(bE._1) | |
868 | + | else $Tuple2(bE._2, bE._1) | |
1001 | 869 | } | |
1002 | 870 | ||
1003 | 871 | ||
1004 | 872 | ||
1005 | - | @Callable( | |
1006 | - | func calculateTokensInterest ( | |
873 | + | @Callable(aN) | |
874 | + | func calculateTokensInterest (bx) = { | |
1007 | 875 | func t (u,l) = { | |
1008 | 876 | let V = fraction(S(l), q, n) | |
1009 | 877 | ((u + toString(V)) + ",") | |
1010 | 878 | } | |
1011 | 879 | ||
1012 | - | let | |
880 | + | let bE = { | |
1013 | 881 | let w = N() | |
1014 | 882 | let x = size(w) | |
1015 | 883 | let y = "" | |
1016 | 884 | func z (A,B) = if ((B >= x)) | |
1017 | 885 | then A | |
1018 | 886 | else t(A, w[B]) | |
1019 | 887 | ||
1020 | 888 | func C (A,B) = if ((B >= x)) | |
1021 | 889 | then A | |
1022 | - | else throw("List size exceeds | |
890 | + | else throw("List size exceeds 100") | |
1023 | 891 | ||
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) | |
1025 | 893 | } | |
1026 | - | if ( | |
1027 | - | then throw( | |
1028 | - | else $Tuple2(nil, | |
894 | + | if (bx) | |
895 | + | then throw(bE) | |
896 | + | else $Tuple2(nil, bE) | |
1029 | 897 | } | |
1030 | 898 | ||
1031 | 899 | ||
1032 | - | @Verifier( | |
1033 | - | func | |
900 | + | @Verifier(cq) | |
901 | + | func cr () = if (if (if (if (sigVerify(cq.bodyBytes, cq.proofs[0], base58'J4QQBsh6FGgZbijQPMDZ7GtNALx2N15K3eHvGhjq43Lt')) | |
1034 | 902 | then true | |
1035 | - | else sigVerify( | |
903 | + | else sigVerify(cq.bodyBytes, cq.proofs[0], base58'Ajf56x532JLzVoourPv9FW75kYsvScNxztPnt1enhNkS')) | |
1036 | 904 | 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')) | |
1040 | 906 | 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 | |
1042 | 912 |
github/deemru/w8io/873ac7e 207.58 ms ◑