tx · 3wpdE6hb1EZF9svnojf6gCH7odbbnFpUTgg2zXAA36PN

3Mw2XJwJVvNjxZzE7j76pwaoN5vcbSzqZJ1:  -0.03900000 Waves

2022.09.22 12:42 [2240175] smart account 3Mw2XJwJVvNjxZzE7j76pwaoN5vcbSzqZJ1 > SELF 0.00000000 Waves

{ "type": 13, "id": "3wpdE6hb1EZF9svnojf6gCH7odbbnFpUTgg2zXAA36PN", "fee": 3900000, "feeAssetId": null, "timestamp": 1663839695924, "version": 2, "chainId": 84, "sender": "3Mw2XJwJVvNjxZzE7j76pwaoN5vcbSzqZJ1", "senderPublicKey": "2vhCaTqToiKk4rmEFSX2QzSECdb5PHWTi5bFMuQNvgXM", "proofs": [ "3ieozmxyvBxM3Xfry1HdegMKoP47tXpfrpA19N332UBbV3tuKKx6qPvkNZmjYYXoRiAzsDrRV13GBVb8BVskPUs2", "2ngkpkzo6ET6XdRg76V8UdaPyFuYcpMTCcsPpwSPTwT9WKvrzVejFWPSvbtJSBkEnf6v3dYvwzZEahFZ2LTygThr" ], "script": "base64:BgJlCAISBAoCEQESBQoDCAEBEgQKAgEEEgQKAhEIEgMKAQESBgoECAgBCBIECgIIARIDCgEREgQKAhEBEgUKAwEICBIECgIIARIFCgMIAQESABIAEgQKAhEEEgQKAgEBEgASABIAEgBUAAlQUkVDSVNJT04AwIQ9AAVNQVhfQQDAhD0ADE1BWF9BX0NIQU5HRQAKAAhERUNJTUFMUwAGAA1NSU5fUkFNUF9USU1FCQBpAgCAowUAPAAHdmVyc2lvbgIFMy4wLjAACGtWZXJzaW9uAgd2ZXJzaW9uAAdrQXNzZXRzAglhc3NldF9pZHMADWtBc3NldEJhbGFuY2UCCF9iYWxhbmNlAAdrQWN0aXZlAgZhY3RpdmUABmtDYXVzZQIOc2h1dGRvd25fY2F1c2UADWtTaGFyZUFzc2V0SWQCDnNoYXJlX2Fzc2V0X2lkABFrU2hhcmVBc3NldFN1cHBseQISc2hhcmVfYXNzZXRfc3VwcGx5AARrRmVlAgpjb21taXNzaW9uABJrREFwcFRocmVzaG9sZENvZWYCEWRBcHBUaHJlc2hvbGRDb2VmAAxrVVNETkFkZHJlc3MCGHN0YWtpbmdfdXNkbm5zYnRfYWRkcmVzcwAKa0Rpc2NvdW50cwIJZGlzY291bnRzAA9rRGlzY291bnRWYWx1ZXMCD2Rpc2NvdW50X3ZhbHVlcwAOa1VzZXJTd29wSW5Hb3YCDF9TV09QX2Ftb3VudAANa0FkbWluUHViS2V5MQILYWRtaW5fcHViXzEADWtBZG1pblB1YktleTICC2FkbWluX3B1Yl8yAA1rQWRtaW5QdWJLZXkzAgthZG1pbl9wdWJfMwASa0FkbWluSW52b2tlUHViS2V5AhBhZG1pbl9pbnZva2VfcHViABBrTW9uZXlCb3hBZGRyZXNzAhFtb25leV9ib3hfYWRkcmVzcwALa0dvdkFkZHJlc3MCEmdvdmVybmFuY2VfYWRkcmVzcwAOa1ZvdGluZ0FkZHJlc3MCDnZvdGluZ19hZGRyZXNzAA9rRmFybWluZ0FkZHJlc3MCD2Zhcm1pbmdfYWRkcmVzcwARa0xQRmFybWluZ0FkZHJlc3MCCmxwX2Zhcm1pbmcABm9yYWNsZQkBB0FkZHJlc3MBARoBVOlFqh6QLzqu8boO5i6akl8amITh82KzCAETZ2V0QmFzZTU4RnJvbU9yYWNsZQEDa2V5BAckbWF0Y2gwCQCdCAIFBm9yYWNsZQUDa2V5AwkAAQIFByRtYXRjaDACBlN0cmluZwQGc3RyaW5nBQckbWF0Y2gwCQDZBAEFBnN0cmluZwQHbm90aGluZwUHJG1hdGNoMAkAAgEJAKwCAgUDa2V5AghpcyBlbXB0eQAMYWRtaW5QdWJLZXkxCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDWtBZG1pblB1YktleTEADGFkbWluUHViS2V5MgkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ1rQWRtaW5QdWJLZXkyAAxhZG1pblB1YktleTMJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUNa0FkbWluUHViS2V5MwARYWRtaW5QdWJLZXlJbnZva2UJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUSa0FkbWluSW52b2tlUHViS2V5AA9tb25leUJveEFkZHJlc3MJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBRBrTW9uZXlCb3hBZGRyZXNzAApnb3ZBZGRyZXNzCQEHQWRkcmVzcwEJARNnZXRCYXNlNThGcm9tT3JhY2xlAQULa0dvdkFkZHJlc3MAEnN0YWtpbmdVU0ROQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDGtVU0ROQWRkcmVzcwANdm90aW5nQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDmtWb3RpbmdBZGRyZXNzAA5mYXJtaW5nQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFD2tGYXJtaW5nQWRkcmVzcwAQbHBGYXJtaW5nQWRkcmVzcwkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFEWtMUEZhcm1pbmdBZGRyZXNzAARVU0ROASBvJKPKqzDcUimY6CxhWu5afyNNwi11u+mdqlTg0tAHwQANc3Rha2luZ0Fzc2V0cwkAzAgCCQDYBAEFBFVTRE4FA25pbAAGYWN0aXZlCQERQGV4dHJOYXRpdmUoMTA1MSkCBQR0aGlzBQdrQWN0aXZlAAxzaGFyZUFzc2V0SWQJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUNa1NoYXJlQXNzZXRJZAALc2hhcmVTdXBwbHkJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFEWtTaGFyZUFzc2V0U3VwcGx5AAlmZWVTY2FsZTYAwIQ9AANmZWUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMFBGtGZWUADWZlZUdvdmVybmFuY2UJAGsDACgFCWZlZVNjYWxlNgBkAAlpbml0aWFsX0EJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMCCWluaXRpYWxfQQAIZnV0dXJlX0EJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMCCGZ1dHVyZV9BAA5pbml0aWFsX0FfdGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzAg5pbml0aWFsX0FfdGltZQAAAA1mdXR1cmVfQV90aW1lCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMCDWZ1dHVyZV9BX3RpbWUAAAAIYXNzZXRJZHMJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwUHa0Fzc2V0cwIBLAAGbkNvaW5zCQCQAwEFCGFzc2V0SWRzAQdzdXNwZW5kAQVjYXVzZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgUHa0FjdGl2ZQcJAMwIAgkBC1N0cmluZ0VudHJ5AgUGa0NhdXNlBQVjYXVzZQUDbmlsAQ10aHJvd0lzQWN0aXZlAAkAAgECFkRBcHAgaXMgYWxyZWFkeSBhY3RpdmUBCGlzQWN0aXZlAAMFBmFjdGl2ZQUEdW5pdAkAAgECH0RBcHAgaXMgaW5hY3RpdmUgYXQgdGhpcyBtb21lbnQBC2lzQWRtaW5DYWxsAQFpAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUMYWRtaW5QdWJLZXkxCQDMCAIFDGFkbWluUHViS2V5MgkAzAgCBQxhZG1pblB1YktleTMFA25pbAgFAWkPY2FsbGVyUHVibGljS2V5BQR1bml0CQACAQIhT25seSBhZG1pbiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAQppc1NlbGZDYWxsAQFpAwkAAAIFBHRoaXMIBQFpBmNhbGxlcgUEdW5pdAkAAgECK09ubHkgY29udHJhY3QgaXRzZWxmIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24ABGJpZzIJALYCAQACAA5ibG9ja1RpbWVzdGFtcAUGaGVpZ2h0AQZhc3NlcnQBAWEDBQFhBwYBFGNhbGN1bGF0ZUZlZURpc2NvdW50AQh1c2VyQWRkcgQEdXNlcgQHJG1hdGNoMAUIdXNlckFkZHIDCQABAgUHJG1hdGNoMAIHQWRkcmVzcwQBdQUHJG1hdGNoMAkApQgBBQF1AwkAAQIFByRtYXRjaDACBlN0cmluZwQBdQUHJG1hdGNoMAUBdQkAAgECGFVua25vdyB0eXBlIG9mIHVzZXIgQWRkcgQKc3dvcEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQpnb3ZBZGRyZXNzCQCsAgIFBHVzZXIFDmtVc2VyU3dvcEluR292AAAEDmRpc2NvdW50VmFsdWVzCQC1CQIJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBm9yYWNsZQUPa0Rpc2NvdW50VmFsdWVzAgEsBAlkaXNjb3VudHMJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUGb3JhY2xlBQprRGlzY291bnRzAgEsAwMJAGcCBQpzd29wQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAAkAZgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwABBQpzd29wQW1vdW50BwkAZQIFCWZlZVNjYWxlNgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWRpc2NvdW50cwAAAwMJAGcCBQpzd29wQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAQkAZgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwACBQpzd29wQW1vdW50BwkAZQIFCWZlZVNjYWxlNgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWRpc2NvdW50cwABAwMJAGcCBQpzd29wQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAgkAZgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwADBQpzd29wQW1vdW50BwkAZQIFCWZlZVNjYWxlNgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWRpc2NvdW50cwACAwMJAGcCBQpzd29wQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUOZGlzY291bnRWYWx1ZXMAAwkAZgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwAEBQpzd29wQW1vdW50BwkAZQIFCWZlZVNjYWxlNgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCWRpc2NvdW50cwADAwkAZwIFCnN3b3BBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ5kaXNjb3VudFZhbHVlcwAECQBlAgUJZmVlU2NhbGU2CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUJZGlzY291bnRzAAQFCWZlZVNjYWxlNgECX0EABAJ0MQUNZnV0dXJlX0FfdGltZQQCQTEFCGZ1dHVyZV9BAwkAZgIFAnQxBQ5ibG9ja1RpbWVzdGFtcAQCQTAFCWluaXRpYWxfQQQCdDAFDmluaXRpYWxfQV90aW1lAwkAZgIFAkExBQJBMAkAZAIFAkEwCQBpAgkAaAIJAGUCBQJBMQUCQTAJAGUCBQ5ibG9ja1RpbWVzdGFtcAUCdDAJAGUCBQJ0MQUCdDAJAGUCBQJBMAkAaQIJAGgCCQBlAgUCQTAFAkExCQBlAgUOYmxvY2tUaW1lc3RhbXAFAnQwCQBlAgUCdDEFAnQwBQJBMQEDX3hwAAoBDWFzc2V0QmFsYW5jZXMCA2FjYwdhc3NldElkCQDNCAIFA2FjYwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFB2Fzc2V0SWQFDWtBc3NldEJhbGFuY2UAAAoAAiRsBQhhc3NldElkcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQENYXNzZXRCYWxhbmNlcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBf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TkFkZHJlc3MJAJQKAgIOdW5sb2NrTmV1dHJpbm8FEnN0YWtpbmdVU0ROQWRkcmVzcwERY2FsY1N0YWtpbmdQYXJhbXMDBXN0YWtlBmFtb3VudAdhc3NldElkAwUFc3Rha2UEDSR0MDEwNjc4MTA3NDQJARhjYWxjU3Rha2luZ0Z1bmNBbmRBZGRyZXMCBQVzdGFrZQUHYXNzZXRJZAQEY2FsbAgFDSR0MDEwNjc4MTA3NDQCXzEEC3N0YWtpbmdBZGRyCAUNJHQwMTA2NzgxMDc0NAJfMgkAlgoEBQRjYWxsBQtzdGFraW5nQWRkcgUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQdhc3NldElkBQZhbW91bnQFA25pbAQNJHQwMTA4MzAxMDg5NgkBGGNhbGNTdGFraW5nRnVuY0FuZEFkZHJlcwIFBXN0YWtlBQdhc3NldElkBARjYWxsCAUNJHQwMTA4MzAxMDg5NgJfMQQLc3Rha2luZ0FkZHIIBQ0kdDAxMDgzMDEwODk2Al8yCQCWCgQFBGNhbGwFC3N0YWtpbmdBZGRyCQDMCAIFBmFtb3VudAkAzAgCCQDYBAEFB2Fzc2V0SWQFA25pbAUDbmlsAQVzdGFrZQIGYW1vdW50DWFzc2V0SWRTdHJpbmcDCQEPY29udGFpbnNFbGVtZW50AgUNc3Rha2luZ0Fzc2V0cwUNYXNzZXRJZFN0cmluZwQNJHQwMTEwODMxMTE4NQkBEWNhbGNTdGFraW5nUGFyYW1zAwYFBmFtb3VudAkA2QQBBQ1hc3NldElkU3RyaW5nBARjYWxsCAUNJHQwMTEwODMxMTE4NQJfMQQEYWRkcggFDSR0MDExMDgzMTExODUCXzIEBnBhcmFtcwgFDSR0MDExMDgzMTExODUCXzMECHBheW1lbnRzCAUNJHQwMTEwODMxMTE4NQJfNAkA/AcEBQRhZGRyBQRjYWxsBQZwYXJhbXMFCHBheW1lbnRzAAABB3Vuc3Rha2UCBmFtb3VudA1hc3NldElkU3RyaW5nAwkBD2NvbnRhaW5zRWxlbWVudAIFDXN0YWtpbmdBc3NldHMFDWFzc2V0SWRTdHJpbmcEDSR0MDExMzcwMTE0NzMJARFjYWxjU3Rha2luZ1BhcmFtcwMHBQZhbW91bnQJANkEAQUNYXNzZXRJZFN0cmluZwQEY2FsbAgFDSR0MDExMzcwMTE0NzMCXzEEBGFkZHIIBQ0kdDAxMTM3MDExNDczAl8yBAZwYXJhbXMIBQ0kdDAxMTM3MDExNDczAl8zBAhwYXltZW50cwgFDSR0MDExMzcwMTE0NzMCXzQJAPwHBAUEYWRkcgUEY2FsbAUGcGFyYW1zBQhwYXltZW50cwAAAQxzdGFrZWRBbW91bnQBB2Fzc2V0SWQEFnN0YWtlZEFtb3VudENhbGN1bGF0ZWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQDYUlkBQckbWF0Y2gwAwkAAAIFA2FJZAUEVVNETgkAmggCBRJzdGFraW5nVVNETkFkZHJlc3MJAKwCAgkArAICCQCsAgICDHJwZF9iYWxhbmNlXwkA2AQBBQNhSWQCAV8JAKUIAQUEdGhpcwAAAwkAAQIFByRtYXRjaDACBFVuaXQAAAkAAgECC01hdGNoIGVycm9yBAckbWF0Y2gwBRZzdGFrZWRBbW91bnRDYWxjdWxhdGVkAwkAAQIFByRtYXRjaDACA0ludAQBaQUHJG1hdGNoMAUBaQAAAQ9jaGVja1N1c3BpY2lvdXMABBBjb250cmFjdEJhbGFuY2VzCQEDX3hwAAoBDGNoZWNrQmFsYW5jZQIDYWNjB2Fzc2V0SWQEDSR0MDEyMDg0MTIxMDkFA2FjYwQKc3VzcGljaW91cwgFDSR0MDEyMDg0MTIxMDkCXzEEAWkIBQ0kdDAxMjA4NDEyMTA5Al8yAwUKc3VzcGljaW91cwkAlAoCBQpzdXNwaWNpb3VzBQFpBAhhQmFsYW5jZQkAZAIJAPAHAgUEdGhpcwkA2QQBBQdhc3NldElkCQEMc3Rha2VkQW1vdW50AQkA2QQBBQdhc3NldElkAwkAZgIJAJEDAgUQY29udHJhY3RCYWxhbmNlcwUBaQUIYUJhbGFuY2UJAJQKAgYFAWkJAJQKAgcJAGQCBQFpAAEKAAIkbAUIYXNzZXRJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIHAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDGNoZWNrQmFsYW5jZQIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8BEXN1c3BlbmRTdXNwaWNpb3VzAQFpCQEHc3VzcGVuZAEJAKwCAgIdU3VzcGljaW91cyBzdGF0ZSB3aXRoIGFzc2V0OiAJAJEDAgUIYXNzZXRJZHMFAWkBDnJldHVyblBheW1lbnRzAgZjYWxsZXIIcGF5bWVudHMKAQ1wYXJzZVBheW1lbnRzAgNhY2MHcGF5bWVudAkAzQgCBQNhY2MJAQ5TY3JpcHRUcmFuc2ZlcgMFBmNhbGxlcggFB3BheW1lbnQGYW1vdW50CAUHcGF5bWVudAdhc3NldElkCgACJGwFCHBheW1lbnRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQ1wYXJzZVBheW1lbnRzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwESY2hlY2tEQXBwVGhyZXNob2xkAQtuZXdCYWxhbmNlcwQRZEFwcFRocmVzaG9sZENvZWYJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzBRJrREFwcFRocmVzaG9sZENvZWYCGE5vIGRBcHBUaHJlc2hvbGRDb2VmIGtleQQOdGhyZXNob2xkU2NhbGUAkE4ECm1heEJhbGFuY2UJAJYDAQULbmV3QmFsYW5jZXMECm1pbkJhbGFuY2UJAJcDAQULbmV3QmFsYW5jZXMEBXJhdGlvCQBrAwUKbWF4QmFsYW5jZQUOdGhyZXNob2xkU2NhbGUFCm1pbkJhbGFuY2UDCQBmAgUFcmF0aW8JAGgCBRFkQXBwVGhyZXNob2xkQ29lZgUOdGhyZXNob2xkU2NhbGUJAAIBAjhOZXcgYmFsYW5jZSBpbiBhc3NldHMgb2YgdGhlIERBcHAgaXMgbGVzcyB0aGFuIHRocmVzaG9sZAcBCmNoZWNrQ29pbnMBCGFzc2V0SWRzBAVjb2lucwkAtQkCBQhhc3NldElkcwIBLAoBCWNoZWNrQ29pbgIFZXJyb3IHYXNzZXRJZAQFYXNzZXQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA2QQBBQdhc3NldElkCQCsAgICEmZyb21CYXNlNThTdHJpbmc6IAUHYXNzZXRJZAQIZGVjaW1hbHMICQETdmFsdWVPckVycm9yTWVzc2FnZQIJAOwHAQUFYXNzZXQJAKwCAgILYXNzZXRJbmZvOiAFB2Fzc2V0SWQIZGVjaW1hbHMDCQECIT0CBQhkZWNpbWFscwUIREVDSU1BTFMJAAIBAg53cm9uZyBkZWNpbWFscwcKAAIkbAUFY29pbnMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBwoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEJY2hlY2tDb2luAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADxQDbXNnAQFEAgJ4cANhbXAEAUQJAQ5nZXRfRF9pbnRlcm5hbAIFAnhwBQNhbXAJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgIBRAUBRAUDbmlsBQFEA21zZwEEaW5pdAMIYXNzZXRJZHMCX0ESX2RBcHBUaHJlc2hvbGRDb2VmAwkBASEBCQCeCAEFBHRoaXMJAAIBAhNBbHJlYWR5IGluaXRpYWxpemVkAwkAZwIAAAUCX0EJAAIBAhRBbXAgbXVzdCBiZSBtdXN0ID4gMAMJAGcCAAAFEl9kQXBwVGhyZXNob2xkQ29lZgkAAgECH2RBcHAgVGhyZXNob2xkIENvZWYgbXVzdCBiZSA+IDAECXNoYXJlTmFtZQILc19NdWx0aV9VU0QEEHNoYXJlRGVzY3JpcHRpb24JAKwCAgJCU2hhcmVUb2tlbiBvZiBTd29wRmkgcHJvdG9jb2wgZm9yIE11bHRpU3RhYmxlIFVTRCBwb29sIGF0IGFkZHJlc3MgCQClCAEFBHRoaXMECmlzc3VlVG9rZW4JAMIIBQUJc2hhcmVOYW1lBRBzaGFyZURlc2NyaXB0aW9uAAAABgYEB3Rva2VuSWQJALgIAQUKaXNzdWVUb2tlbgMJAQpjaGVja0NvaW5zAQUIYXNzZXRJZHMJAQV0aHJvdwAJAMwIAgkBC1N0cmluZ0VudHJ5AgUIa1ZlcnNpb24FB3ZlcnNpb24JAMwIAgkBC1N0cmluZ0VudHJ5AgUHa0Fzc2V0cwUIYXNzZXRJZHMJAMwIAgkBDEludGVnZXJFbnRyeQICCWluaXRpYWxfQQUCX0EJAMwIAgkBDEludGVnZXJFbnRyeQICCGZ1dHVyZV9BBQJfQQkAzAgCCQEMSW50ZWdlckVudHJ5AgUEa0ZlZQkBEUBleHRyTmF0aXZlKDEwNTApAgUGb3JhY2xlAg1iYXNlX2ZlZV9mbGF0CQDMCAIJAQtTdHJpbmdFbnRyeQIFDWtTaGFyZUFzc2V0SWQJANgEAQUHdG9rZW5JZAkAzAgCCQEMSW50ZWdlckVudHJ5AgURa1NoYXJlQXNzZXRTdXBwbHkAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgUSa0RBcHBUaHJlc2hvbGRDb2VmBRJfZEFwcFRocmVzaG9sZENvZWYJAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUGCQDMCAIFCmlzc3VlVG9rZW4FA25pbANtc2cBDGFkZExpcXVpZGl0eQINbWluTWludEFtb3VudAxzdGFrZUZhcm1pbmcJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAEA2FtcAkBAl9BAAQCeHAJAQNfeHAABAJEMAMJAAACBQtzaGFyZVN1cHBseQAAAAAJAQdnZXRETWVtAgUCeHAFA2FtcAQIcGF5bWVudHMIBQNtc2cIcGF5bWVudHMEDHBheW1lbnRzU2l6ZQkAkAMBBQhwYXltZW50cwoBDXZhbGlkUGF5bWVudHMBAW4DCQBmAgUMcGF5bWVudHNTaXplBQZuQ29pbnMJAAIBCQCsAgICEHBheW1lbnRzIHNpemUgPiAJAKQDAQUGbkNvaW5zAwkAZgIAAQUMcGF5bWVudHNTaXplCQACAQIRcGF5bWVudHMgc2l6ZSA8IDEDAwkAAAIFC3NoYXJlU3VwcGx5AAAJAQIhPQIFBm5Db2lucwUMcGF5bWVudHNTaXplBwkAAgECImluaXRpYWwgZGVwb3NpdCByZXF1aXJlcyBhbGwgY29pbnMKAQxwYXltYW50VmFsaWQCA2FjYwdwYXltZW50AwkBD2NvbnRhaW5zRWxlbWVudAIFCGFzc2V0SWRzCQENZ2V0U3RyQXNzZXRJZAEIBQdwYXltZW50B2Fzc2V0SWQGCQACAQIYSW52YWxpZCBhc3NldCBpbiBwYXltZW50CgACJGwFCHBheW1lbnRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAcKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDHBheW1hbnRWYWxpZAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8DCQEBIQEJAQ12YWxpZFBheW1lbnRzAQUMcGF5bWVudHNTaXplCQEFdGhyb3cABApzdXNwaWNpb3VzCQEPY2hlY2tTdXNwaWNpb3VzAAMIBQpzdXNwaWNpb3VzAl8xCQDOCAIJARFzdXNwZW5kU3VzcGljaW91cwEIBQpzdXNwaWNpb3VzAl8yCQEOcmV0dXJuUGF5bWVudHMCCAUDbXNnBmNhbGxlcgUIcGF5bWVudHMKAQ1wYXJzZVBheW1lbnRzAgNhY2MHYXNzZXRJZAQNJHQwMTYxMjUxNjE1NAUDYWNjBAtuZXdCYWxhbmNlcwgFDSR0MDE2MTI1MTYxNTQCXzEEAWkIBQ0kdDAxNjEyNTE2MTU0Al8yBAFqCAUNJHQwMTYxMjUxNjE1NAJfMwMDCQBmAgUMcGF5bWVudHNTaXplBQFqCQAAAgkBDWdldFN0ckFzc2V0SWQBCAkAkQMCBQhwYXltZW50cwUBagdhc3NldElkBQdhc3NldElkBwkAlQoDCQDNCAIFC25ld0JhbGFuY2VzCQBkAgkAkQMCBQJ4cAUBaQgJAJEDAgUIcGF5bWVudHMFAWoGYW1vdW50CQBkAgUBaQABCQBkAgUBagABCQCVCgMJAM0IAgULbmV3QmFsYW5jZXMJAJEDAgUCeHAFAWkJAGQCBQFpAAEFAWoEDSR0MDE2Mzc0MTY0NjAKAAIkbAUIYXNzZXRJZHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCVCgMFA25pbAAAAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDXBhcnNlUGF5bWVudHMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPBAtuZXdCYWxhbmNlcwgFDSR0MDE2Mzc0MTY0NjACXzEEAWsIBQ0kdDAxNjM3NDE2NDYwAl8yBA5wYXJzZWRQYXltZW50cwgFDSR0MDE2Mzc0MTY0NjACXzMDCQBmAgUMcGF5bWVudHNTaXplBQ5wYXJzZWRQYXltZW50cwkAAgECF0luY29yZWN0IHBheW1lbnRzIG9yZGVyAwkBEmNoZWNrREFwcFRocmVzaG9sZAEFC25ld0JhbGFuY2VzCQEFdGhyb3cABAJEMQkBB2dldERNZW0CBQtuZXdCYWxhbmNlcwUDYW1wAwkBBmFzc2VydAEJAGYCBQJEMQUCRDAJAAIBAgdEMSA+IEQwBAtmZWVEaXNjb3VudAkBFGNhbGN1bGF0ZUZlZURpc2NvdW50AQgFA21zZwZjYWxsZXIKARFjYWxjU2NyaXB0QWN0aW9ucwIDYWNjCm5ld0JhbGFuY2UEDSR0MDE2ODYxMTY5MDIFA2FjYwQLaW52QmFsYW5jZXMIBQ0kdDAxNjg2MTE2OTAyAl8xBA1zY3JpcHRBY3Rpb25zCAUNJHQwMTY4NjExNjkwMgJfMgQBaQgFDSR0MDE2ODYxMTY5MDICXzMDCQBmAgULc2hhcmVTdXBwbHkAAAQEX2ZlZQkAaQIJAGgCCQBuBAUDZmVlBQtmZWVEaXNjb3VudAUJZmVlU2NhbGU2BQdDRUlMSU5HBQZuQ29pbnMJAGgCAAQJAGUCBQZuQ29pbnMAAQQEZmVlcwQMaWRlYWxCYWxhbmNlCQBrAwUCRDEJAJEDAgUCeHAFAWkFAkQwBApkaWZmZXJlbmNlAwkAZgIFDGlkZWFsQmFsYW5jZQUKbmV3QmFsYW5jZQkAZQIFDGlkZWFsQmFsYW5jZQUKbmV3QmFsYW5jZQkAZQIFCm5ld0JhbGFuY2UFDGlkZWFsQmFsYW5jZQkAawMFBF9mZWUFCmRpZmZlcmVuY2UFCWZlZVNjYWxlNgQOZ292ZXJuYW5jZUZlZXMJAGsDBQRmZWVzBQ1mZWVHb3Zlcm5hbmNlBQlmZWVTY2FsZTYEDGZpbmFsQmFsYW5jZQkAZQIFCm5ld0JhbGFuY2UFBGZlZXMEEGludmFyaWFudEJhbGFuY2UJAGUCBQpuZXdCYWxhbmNlBQRmZWVzBANwbXQJAGUCBQpuZXdCYWxhbmNlCQCRAwIFAnhwBQFpBAZscEZlZXMJAGUCBQRmZWVzBQ5nb3Zlcm5hbmNlRmVlcwQDaW52AwkAZgIFA3BtdAAACQEFc3Rha2UCCQBlAgUDcG10BQRmZWVzCQCRAwIFCGFzc2V0SWRzBQFpCQEHdW5zdGFrZQIFBGZlZXMJAJEDAgUIYXNzZXRJZHMFAWkDCQAAAgUDaW52BQNpbnYEB2FpcmRyb3ADCQBmAgUGbHBGZWVzAAAJAPwHBAUQbHBGYXJtaW5nQWRkcmVzcwIHYWlyRHJvcAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCCQDZBAEJAJEDAgUIYXNzZXRJZHMFAWkFBmxwRmVlcwUDbmlsAAADCQAAAgUHYWlyZHJvcAUHYWlyZHJvcAkAlQoDCQDNCAIFC2ludkJhbGFuY2VzBRBpbnZhcmlhbnRCYWxhbmNlCQDOCAIFDXNjcmlwdEFjdGlvbnMJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUPbW9uZXlCb3hBZGRyZXNzBQ5nb3Zlcm5hbmNlRmVlcwkA2QQBCQCRAwIFCGFzc2V0SWRzBQFpCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAJEDAgUIYXNzZXRJZHMFAWkFDWtBc3NldEJhbGFuY2UFDGZpbmFsQmFsYW5jZQUDbmlsCQBkAgUBaQABCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBANpbnYJAQVzdGFrZQIFCm5ld0JhbGFuY2UJAJEDAgUIYXNzZXRJZHMFAWkDCQAAAgUDaW52BQNpbnYJAJUKAwkAzQgCBQtpbnZCYWxhbmNlcwUKbmV3QmFsYW5jZQkAzQgCBQ1zY3JpcHRBY3Rpb25zCQEMSW50ZWdlckVudHJ5AgkArAICCQCRAwIFCGFzc2V0SWRzBQFpBQ1rQXNzZXRCYWxhbmNlBQpuZXdCYWxhbmNlCQBkAgUBaQABCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBA0kdDAxODYwNzE4Njk1CgACJGwFC25ld0JhbGFuY2VzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlQoDBQNuaWwFA25pbAAACgEFJGYxXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARFjYWxjU2NyaXB0QWN0aW9ucwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMV8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQUkZjFfMgIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIJAQUkZjFfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8EC2ludkJhbGFuY2VzCAUNJHQwMTg2MDcxODY5NQJfMQQNc2NyaXB0QWN0aW9ucwgFDSR0MDE4NjA3MTg2OTUCXzIEAkQyCQEHZ2V0RE1lbQIFC2ludkJhbGFuY2VzBQNhbXAEC21pbnRfYW1vdW50AwkAAAIFC3NoYXJlU3VwcGx5AAAFAkQxCQBrAwULc2hhcmVTdXBwbHkJAGUCBQJEMgUCRDAFAkQwAwkBBmFzc2VydAEJAGcCBQttaW50X2Ftb3VudAUNbWluTWludEFtb3VudAkAAgECFFNsaXBwYWdlIHNjcmV3ZWQgeW91AwUMc3Rha2VGYXJtaW5nBAJyZQkA/AcEBQR0aGlzAgxyZWlzc3VlU2hhcmUJAMwIAgULbWludF9hbW91bnQFA25pbAUDbmlsAwkAAAIFAnJlBQJyZQQBcwkA/AcEBQ5mYXJtaW5nQWRkcmVzcwIPbG9ja1NoYXJlVG9rZW5zCQDMCAIJAKUIAQUEdGhpcwUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQxzaGFyZUFzc2V0SWQFC21pbnRfYW1vdW50BQNuaWwDCQAAAgUBcwUBcwkAzQgCBQ1zY3JpcHRBY3Rpb25zCQEMSW50ZWdlckVudHJ5AgURa1NoYXJlQXNzZXRTdXBwbHkJAGQCBQtzaGFyZVN1cHBseQULbWludF9hbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAM4IAgUNc2NyaXB0QWN0aW9ucwkAzAgCCQEHUmVpc3N1ZQMFDHNoYXJlQXNzZXRJZAULbWludF9hbW91bnQGCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQNtc2cGY2FsbGVyBQttaW50X2Ftb3VudAUMc2hhcmVBc3NldElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrU2hhcmVBc3NldFN1cHBseQkAZAIFC3NoYXJlU3VwcGx5BQttaW50X2Ftb3VudAUDbmlsA21zZwEOY2FsY01pbnRBbW91bnQCC25ld0JhbGFuY2VzBHVzZXIEA2FtcAkBAl9BAAQCeHAJAQNfeHAABAJEMQkBB2dldERNZW0CBQtuZXdCYWxhbmNlcwUDYW1wAwkAAAIFC3NoYXJlU3VwcGx5AAAJAJQKAgUDbmlsBQJEMQQCRDAJAQdnZXRETWVtAgUCeHAFA2FtcAQLZmVlRGlzY291bnQJARRjYWxjdWxhdGVGZWVEaXNjb3VudAEFBHVzZXIKAQ9jYWxjSW52QmFsYW5jZXMCA2FjYwpuZXdCYWxhbmNlBA0kdDAxOTg4NDE5OTEwBQNhY2MEC2ludkJhbGFuY2VzCAUNJHQwMTk4ODQxOTkxMAJfMQQBaQgFDSR0MDE5ODg0MTk5MTACXzIEBF9mZWUJAGkCCQBoAgkAbgQFA2ZlZQULZmVlRGlzY291bnQFCWZlZVNjYWxlNgUHQ0VJTElORwUGbkNvaW5zCQBoAgAECQBlAgUGbkNvaW5zAAEEBGZlZXMEDGlkZWFsQmFsYW5jZQkAawMFAkQxCQCRAwIFAnhwBQFpBQJEMAQKZGlmZmVyZW5jZQMJAGYCBQxpZGVhbEJhbGFuY2UFCm5ld0JhbGFuY2UJAGUCBQxpZGVhbEJhbGFuY2UFCm5ld0JhbGFuY2UJAGUCBQpuZXdCYWxhbmNlBQxpZGVhbEJhbGFuY2UJAGsDBQRfZmVlBQpkaWZmZXJlbmNlBQlmZWVTY2FsZTYEEGludmFyaWFudEJhbGFuY2UJAGUCBQpuZXdCYWxhbmNlBQRmZWVzCQCUCgIJAM0IAgULaW52QmFsYW5jZXMFEGludmFyaWFudEJhbGFuY2UJAGQCBQFpAAEEDSR0MDIwNTEyMjA1ODIKAAIkbAULbmV3QmFsYW5jZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQ9jYWxjSW52QmFsYW5jZXMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPBAtpbnZCYWxhbmNlcwgFDSR0MDIwNTEyMjA1ODICXzEEAWsIBQ0kdDAyMDUxMjIwNTgyAl8yBAJEMgkBB2dldERNZW0CBQtpbnZCYWxhbmNlcwUDYW1wBAptaW50QW1vdW50CQBrAwULc2hhcmVTdXBwbHkJAGUCBQJEMgUCRDAFAkQwCQCUCgIFA25pbAUKbWludEFtb3VudANtc2cBDHJlaXNzdWVTaGFyZQEGYW1vdW50CQELdmFsdWVPckVsc2UCCQEKaXNTZWxmQ2FsbAEFA21zZwkAzAgCCQEHUmVpc3N1ZQMFDHNoYXJlQXNzZXRJZAUGYW1vdW50BgUDbmlsA21zZwEFZ2V0RHkECWFzc2V0RnJvbQdhc3NldFRvAmR4C3VzZXJBZGRyZXNzBAJ4cAkBA194cAAECWZyb21JbmRleAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFCGFzc2V0SWRzBQlhc3NldEZyb20CEHVua25vd24gdG9rZW4gaW4EB3RvSW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQhhc3NldElkcwUHYXNzZXRUbwIRdW5rbm93biB0b2tlbiBvdXQEAXgJAGQCCQCRAwIFAnhwBQlmcm9tSW5kZXgFAmR4BAF5CQEEZ2V0WQQFCWZyb21JbmRleAUHdG9JbmRleAUBeAUCeHAEAmR5CQBlAgkAZQIJAJEDAgUCeHAFB3RvSW5kZXgFAXkAAQQLZmVlRGlzY291bnQJARRjYWxjdWxhdGVGZWVEaXNjb3VudAEJAQdBZGRyZXNzAQkA2QQBBQt1c2VyQWRkcmVzcwQEX2ZlZQkAawMJAG4EBQNmZWUFC2ZlZURpc2NvdW50BQlmZWVTY2FsZTYFB0NFSUxJTkcFAmR5BQlmZWVTY2FsZTYJAJQKAgUDbmlsCQCUCgIJAGUCBQJkeQUEX2ZlZQUEX2ZlZQNtc2cBCGV4Y2hhbmdlAgh0b2tlbk91dAZtaW5fZHkJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQADCQECIT0CCQCQAwEIBQNtc2cIcGF5bWVudHMAAQkAAgECE3NpemUocGF5bWVudHMpICE9IDEECnN1c3BpY2lvdXMJAQ9jaGVja1N1c3BpY2lvdXMAAwgFCnN1c3BpY2lvdXMCXzEJAM4IAgkBEXN1c3BlbmRTdXNwaWNpb3VzAQgFCnN1c3BpY2lvdXMCXzIJAQ5yZXR1cm5QYXltZW50cwIIBQNtc2cGY2FsbGVyCAUDbXNnCHBheW1lbnRzBAdwYXltZW50CQCRAwIIBQNtc2cIcGF5bWVudHMAAAQHdG9rZW5JbgkBDWdldFN0ckFzc2V0SWQBCAUHcGF5bWVudAdhc3NldElkBAt0b2tlbk91dEI1OAkA2QQBBQh0b2tlbk91dAQCZHgIBQdwYXltZW50BmFtb3VudAQJZnJvbUluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUIYXNzZXRJZHMFB3Rva2VuSW4CEHVua25vd24gdG9rZW4gaW4EB3RvSW5kZXgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQhhc3NldElkcwUIdG9rZW5PdXQCEXVua25vd24gdG9rZW4gb3V0BAJ4cAkBA194cAAEAXgJAGQCCQCRAwIFAnhwBQlmcm9tSW5kZXgFAmR4BAF5CQEEZ2V0WQQFCWZyb21JbmRleAUHdG9JbmRleAUBeAUCeHAEA19keQkAZQIJAGUCCQCRAwIFAnhwBQd0b0luZGV4BQF5AAEEC2ZlZURpc2NvdW50CQEUY2FsY3VsYXRlRmVlRGlzY291bnQBCAUDbXNnDG9yaWdpbkNhbGxlcgQEX2ZlZQkAawMFA19keQkAbgQFA2ZlZQULZmVlRGlzY291bnQFCWZlZVNjYWxlNgUHQ0VJTElORwUJZmVlU2NhbGU2BAJkeQkAZQIFA19keQUEX2ZlZQQOZ292ZXJuYW5jZUZlZXMJAGsDBQRfZmVlBQ1mZWVHb3Zlcm5hbmNlBQlmZWVTY2FsZTYDCQEGYXNzZXJ0AQkAZwIFAmR5BQZtaW5fZHkJAAIBAi5FeGNoYW5nZSByZXN1bHRlZCBpbiBmZXdlciBjb2lucyB0aGFuIGV4cGVjdGVkCgEPbWFrZU5ld0JhbGFuY2VzAgNhY2MMdG9rZW5CYWxhbmNlBA0kdDAyMjYyMzIyNjQ5BQNhY2MEC25ld0JhbGFuY2VzCAUNJHQwMjI2MjMyMjY0OQJfMQQBaQgFDSR0MDIyNjIzMjI2NDkCXzIDCQAAAgUBaQUJZnJvbUluZGV4CQCUCgIJAM0IAgULbmV3QmFsYW5jZXMJAGQCBQx0b2tlbkJhbGFuY2UFAmR4CQBkAgUBaQABAwkAAAIFAWkFB3RvSW5kZXgJAJQKAgkAzQgCBQtuZXdCYWxhbmNlcwkAZQIFDHRva2VuQmFsYW5jZQUDX2R5CQBkAgUBaQABCQCUCgIJAM0IAgULbmV3QmFsYW5jZXMFDHRva2VuQmFsYW5jZQkAZAIFAWkAAQQNJHQwMjI5MDAyMjk2MQoAAiRsBQJ4cAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBD21ha2VOZXdCYWxhbmNlcwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8EC25ld0JhbGFuY2VzCAUNJHQwMjI5MDAyMjk2MQJfMQQBaQgFDSR0MDIyOTAwMjI5NjECXzIDCQESY2hlY2tEQXBwVGhyZXNob2xkAQULbmV3QmFsYW5jZXMJAQV0aHJvdwAEAXMJAQVzdGFrZQIIBQdwYXltZW50BmFtb3VudAkBDWdldFN0ckFzc2V0SWQBCAUHcGF5bWVudAdhc3NldElkAwkAAAIFAXMFAXMEAnVzCQEHdW5zdGFrZQIFA19keQUIdG9rZW5PdXQDCQAAAgUCdXMFAnVzBAZscEZlZXMJAGUCBQRfZmVlBQ5nb3Zlcm5hbmNlRmVlcwQHYWlyZHJvcAMJAGYCBQZscEZlZXMAAAkA/AcEBRBscEZhcm1pbmdBZGRyZXNzAgdhaXJEcm9wBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFC3Rva2VuT3V0QjU4BQZscEZlZXMFA25pbAAAAwkAAAIFB2FpcmRyb3AFB2FpcmRyb3AJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQd0b2tlbkluBQ1rQXNzZXRCYWxhbmNlBQF4CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFCHRva2VuT3V0BQ1rQXNzZXRCYWxhbmNlCQBlAgkAkQMCBQJ4cAUHdG9JbmRleAUDX2R5CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQNtc2cGY2FsbGVyBQJkeQULdG9rZW5PdXRCNTgJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUPbW9uZXlCb3hBZGRyZXNzBQ5nb3Zlcm5hbmNlRmVlcwULdG9rZW5PdXRCNTgFA25pbAkAzAgCBQJkeQkAzAgCBQt0b2tlbk91dEI1OAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuA21zZwEId2l0aGRyYXcBCm1pbkFtb3VudHMJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQADCQECIT0CCQCQAwEIBQNtc2cIcGF5bWVudHMAAQkAAgECE3NpemUocGF5bWVudHMpICE9IDEECXBtdEFtb3VudAgJAJEDAggFA21zZwhwYXltZW50cwAABmFtb3VudAQKcG10QXNzZXRJZAgJAJEDAggFA21zZwhwYXltZW50cwAAB2Fzc2V0SWQDCQECIT0CBQxzaGFyZUFzc2V0SWQFCnBtdEFzc2V0SWQJAAIBAhV1bmtub3duIHBheW1lbnQgdG9rZW4ECnN1c3BpY2lvdXMJAQ9jaGVja1N1c3BpY2lvdXMAAwgFCnN1c3BpY2lvdXMCXzEJAM4IAgkBEXN1c3BlbmRTdXNwaWNpb3VzAQgFCnN1c3BpY2lvdXMCXzIJAQ5yZXR1cm5QYXltZW50cwIIBQNtc2cMb3JpZ2luQ2FsbGVyCAUDbXNnCHBheW1lbnRzCgERY2FsY1NjcmlwdEFjdGlvbnMCA2FjYwdiYWxhbmNlBA0kdDAyNDI1MjI0MjgwBQNhY2MEDXNjcmlwdEFjdGlvbnMIBQ0kdDAyNDI1MjI0MjgwAl8xBAFpCAUNJHQwMjQyNTIyNDI4MAJfMgQHd0Ftb3VudAkAawMFB2JhbGFuY2UFCXBtdEFtb3VudAULc2hhcmVTdXBwbHkDCQEGYXNzZXJ0AQkAZwIFB3dBbW91bnQJAJEDAgUKbWluQW1vdW50cwUBaQkAAgECMFdpdGhkcmF3YWwgcmVzdWx0ZWQgaW4gZmV3ZXIgY29pbnMgdGhhbiBleHBlY3RlZAQCdXMJAQd1bnN0YWtlAgUHd0Ftb3VudAkAkQMCBQhhc3NldElkcwUBaQMJAAACBQJ1cwUCdXMJAJQKAgkAzggCBQ1zY3JpcHRBY3Rpb25zCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAJEDAgUIYXNzZXRJZHMFAWkFDWtBc3NldEJhbGFuY2UJAGUCBQdiYWxhbmNlBQd3QW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQNtc2cMb3JpZ2luQ2FsbGVyBQd3QW1vdW50CQDZBAEJAJEDAgUIYXNzZXRJZHMFAWkFA25pbAkAZAIFAWkAAQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQNJHQwMjQ3NzAyNDgzOAoAAiRsCQEDX3hwAAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEWNhbGNTY3JpcHRBY3Rpb25zAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwQNc2NyaXB0QWN0aW9ucwgFDSR0MDI0NzcwMjQ4MzgCXzEEAWkIBQ0kdDAyNDc3MDI0ODM4Al8yCQDOCAIFDXNjcmlwdEFjdGlvbnMJAMwIAgkBBEJ1cm4CBQxzaGFyZUFzc2V0SWQFCXBtdEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgURa1NoYXJlQXNzZXRTdXBwbHkJAGUCBQtzaGFyZVN1cHBseQUJcG10QW1vdW50BQNuaWwDbXNnARJ3aXRoZHJhd1dpdGhVbmxvY2sCCm1pbkFtb3VudHMMdW5sb2NrQW1vdW50CQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUAAwkAZwIAAAUMdW5sb2NrQW1vdW50CQACAQIeVW5sb2NrIGFtb3VudCBtdXN0IGJlIHBvc2l0aXZlBApzdXNwaWNpb3VzCQEPY2hlY2tTdXNwaWNpb3VzAAMIBQpzdXNwaWNpb3VzAl8xCQDOCAIJARFzdXNwZW5kU3VzcGljaW91cwEIBQpzdXNwaWNpb3VzAl8yCQEOcmV0dXJuUGF5bWVudHMCCAUDbXNnBmNhbGxlcggFA21zZwhwYXltZW50cwQJcG10QW1vdW50AwkAZgIJAJADAQgFA21zZwhwYXltZW50cwAAAwkBAiE9AgkAkAMBCAUDbXNnCHBheW1lbnRzAAEJAAIBAhNzaXplKHBheW1lbnRzKSAhPSAxBApwbXRBc3NldElkCAkAkQMCCAUDbXNnCHBheW1lbnRzAAAHYXNzZXRJZAMJAQIhPQIFDHNoYXJlQXNzZXRJZAUKcG10QXNzZXRJZAkAAgECFXVua25vd24gcGF5bWVudCB0b2tlbggJAJEDAggFA21zZwhwYXltZW50cwAABmFtb3VudAAABAZ1bmxvY2sJAPwHBAUOZmFybWluZ0FkZHJlc3MCE3dpdGhkcmF3U2hhcmVUb2tlbnMJAMwIAgkApQgBBQR0aGlzCQDMCAIFDHVubG9ja0Ftb3VudAUDbmlsBQNuaWwDCQAAAgUGdW5sb2NrBQZ1bmxvY2sEDndpdGhkcmF3QW1vdW50CQBkAgUJcG10QW1vdW50BQx1bmxvY2tBbW91bnQEA2ludgkA/AcEBQR0aGlzAgh3aXRoZHJhdwkAzAgCBQptaW5BbW91bnRzBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFDHNoYXJlQXNzZXRJZAUOd2l0aGRyYXdBbW91bnQFA25pbAMJAAACBQNpbnYFA2ludgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuA21zZwETY2FsY1dpdGhkcmF3T25lQ29pbgMLdG9rZW5BbW91bnQIdG9rZW5PdXQEdXNlcgQBaQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQDPCAIFCGFzc2V0SWRzBQh0b2tlbk91dAIRdW5rbm93biB0b2tlbiBvdXQJAJQKAgUDbmlsCAkBFF9jYWxjV2l0aGRyYXdPbmVDb2luBAkBA194cAAFC3Rva2VuQW1vdW50BQFpCQEHQWRkcmVzcwEJANkEAQUEdXNlcgJfMQNtc2cBD3dpdGhkcmF3T25lQ29pbgIIdG9rZW5PdXQJbWluQW1vdW50CQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUAAwkBAiE9AgkAkAMBCAUDbXNnCHBheW1lbnRzAAEJAAIBAhNzaXplKHBheW1lbnRzKSAhPSAxBApzdXNwaWNpb3VzCQEPY2hlY2tTdXNwaWNpb3VzAAMIBQpzdXNwaWNpb3VzAl8xCQDOCAIJARFzdXNwZW5kU3VzcGljaW91cwEIBQpzdXNwaWNpb3VzAl8yCQEOcmV0dXJuUGF5bWVudHMCCAUDbXNnDG9yaWdpbkNhbGxlcggFA21zZwhwYXltZW50cwQJcG10QW1vdW50CAkAkQMCCAUDbXNnCHBheW1lbnRzAAAGYW1vdW50BApwbXRBc3NldElkCAkAkQMCCAUDbXNnCHBheW1lbnRzAAAHYXNzZXRJZAMJAQIhPQIFCnBtdEFzc2V0SWQFDHNoYXJlQXNzZXRJZAkAAgECDXVua25vd24gdG9rZW4ECG91dEluZGV4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAM8IAgUIYXNzZXRJZHMFCHRva2VuT3V0AhF1bmtub3duIHRva2VuIG91dAQLdG9rZW5PdXRCNTgJANkEAQUIdG9rZW5PdXQEAnhwCQEDX3hwAAQNJHQwMjY4MDIyNjg4NAkBFF9jYWxjV2l0aGRyYXdPbmVDb2luBAUCeHAFCXBtdEFtb3VudAUIb3V0SW5kZXgIBQNtc2cMb3JpZ2luQ2FsbGVyBAJkeQgFDSR0MDI2ODAyMjY4ODQCXzEEBmR5X2ZlZQgFDSR0MDI2ODAyMjY4ODQCXzIDCQEGYXNzZXJ0AQkAZwIFAmR5BQltaW5BbW91bnQJAAIBAhhOb3QgZW5vdWdoIGNvaW5zIHJlbW92ZWQEDmdvdmVybmFuY2VGZWVzCQBrAwUGZHlfZmVlBQ1mZWVHb3Zlcm5hbmNlBQlmZWVTY2FsZTYECmR5X2FuZF9mZWUJAGQCBQJkeQUGZHlfZmVlCgEPbWFrZU5ld0JhbGFuY2VzAgNhY2MMdG9rZW5CYWxhbmNlBA0kdDAyNzE0MjI3MTY4BQNhY2MEC25ld0JhbGFuY2VzCAUNJHQwMjcxNDIyNzE2OAJfMQQBaQgFDSR0MDI3MTQyMjcxNjgCXzIDCQAAAgUBaQUIb3V0SW5kZXgJAJQKAgkAzQgCBQtuZXdCYWxhbmNlcwkAZQIFDHRva2VuQmFsYW5jZQUKZHlfYW5kX2ZlZQkAZAIFAWkAAQkAlAoCCQDNCAIFC25ld0JhbGFuY2VzBQx0b2tlbkJhbGFuY2UJAGQCBQFpAAEEDSR0MDI3MzM1MjczOTYKAAIkbAUCeHAKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQ9tYWtlTmV3QmFsYW5jZXMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPBAtuZXdCYWxhbmNlcwgFDSR0MDI3MzM1MjczOTYCXzEEAXYIBQ0kdDAyNzMzNTI3Mzk2Al8yAwkBEmNoZWNrREFwcFRocmVzaG9sZAEFC25ld0JhbGFuY2VzCQEFdGhyb3cABAJ1cwkBB3Vuc3Rha2UCBQpkeV9hbmRfZmVlBQh0b2tlbk91dAMJAAACBQJ1cwUCdXMEBmxwRmVlcwkAZQIFBmR5X2ZlZQUOZ292ZXJuYW5jZUZlZXMEB2FpcmRyb3ADCQBmAgUGbHBGZWVzAAAJAPwHBAUQbHBGYXJtaW5nQWRkcmVzcwIHYWlyRHJvcAUDbmlsCQDMCAIJAQ9BdHRhY2hlZFBheW1lbnQCBQt0b2tlbk91dEI1OAUGbHBGZWVzBQNuaWwAAAMJAAACBQdhaXJkcm9wBQdhaXJkcm9wCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQNtc2cMb3JpZ2luQ2FsbGVyBQJkeQULdG9rZW5PdXRCNTgJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkAkQMCBQhhc3NldElkcwUIb3V0SW5kZXgFDWtBc3NldEJhbGFuY2UJAGUCCQCRAwIFAnhwBQhvdXRJbmRleAUKZHlfYW5kX2ZlZQkAzAgCCQEEQnVybgIFDHNoYXJlQXNzZXRJZAUJcG10QW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFD21vbmV5Qm94QWRkcmVzcwUOZ292ZXJuYW5jZUZlZXMFC3Rva2VuT3V0QjU4CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrU2hhcmVBc3NldFN1cHBseQkAZQIFC3NoYXJlU3VwcGx5BQlwbXRBbW91bnQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgNtc2cBGXdpdGhkcmF3T25lQ29pbldpdGhVbmxvY2sDCHRva2VuT3V0CW1pbkFtb3VudAx1bmxvY2tBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQADCQBnAgAABQx1bmxvY2tBbW91bnQJAAIBAh5VbmxvY2sgYW1vdW50IG11c3QgYmUgcG9zaXRpdmUECnN1c3BpY2lvdXMJAQ9jaGVja1N1c3BpY2lvdXMAAwgFCnN1c3BpY2lvdXMCXzEJAM4IAgkBEXN1c3BlbmRTdXNwaWNpb3VzAQgFCnN1c3BpY2lvdXMCXzIJAQ5yZXR1cm5QYXltZW50cwIIBQNtc2cGY2FsbGVyCAUDbXNnCHBheW1lbnRzBAlwbXRBbW91bnQDCQBmAgkAkAMBCAUDbXNnCHBheW1lbnRzAAADCQECIT0CCQCQAwEIBQNtc2cIcGF5bWVudHMAAQkAAgECE3NpemUocGF5bWVudHMpICE9IDEECnBtdEFzc2V0SWQICQCRAwIIBQNtc2cIcGF5bWVudHMAAAdhc3NldElkAwkBAiE9AgUMc2hhcmVBc3NldElkBQpwbXRBc3NldElkCQACAQIVdW5rbm93biBwYXltZW50IHRva2VuCAkAkQMCCAUDbXNnCHBheW1lbnRzAAAGYW1vdW50AAAEBnVubG9jawkA/AcEBQ5mYXJtaW5nQWRkcmVzcwITd2l0aGRyYXdTaGFyZVRva2VucwkAzAgCCQClCAEFBHRoaXMJAMwIAgUMdW5sb2NrQW1vdW50BQNuaWwFA25pbAMJAAACBQZ1bmxvY2sFBnVubG9jawQOd2l0aGRyYXdBbW91bnQJAGQCBQlwbXRBbW91bnQFDHVubG9ja0Ftb3VudAQDaW52CQD8BwQFBHRoaXMCD3dpdGhkcmF3T25lQ29pbgkAzAgCBQh0b2tlbk91dAkAzAgCBQltaW5BbW91bnQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUMc2hhcmVBc3NldElkBQ53aXRoZHJhd0Ftb3VudAUDbmlsAwkAAAIFA2ludgUDaW52BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4DbXNnAQFBAAkAlAoCBQNuaWwJAQJfQQADbXNnAQ9nZXRWaXJ0dWFsUHJpY2UABAFECQEFZ2V0X0QCCQEDX3hwAAkBAl9BAAkAlAoCBQNuaWwJAGsDBQFEBQlQUkVDSVNJT04FC3NoYXJlU3VwcGx5A21zZwEPY2FsY1Rva2VuQW1vdW50AgdhbW91bnRzB2RlcG9zaXQEA2FtcAkBAl9BAAQIYmFsYW5jZXMJAQNfeHAABAJEMAkBB2dldERNZW0CBQhiYWxhbmNlcwUDYW1wCgEPY2FsY05ld0JhbGFuY2VzAgNhY2MHYmFsYW5jZQQNJHQwMjk0MTMyOTQzOQUDYWNjBAtuZXdCYWxhbmNlcwgFDSR0MDI5NDEzMjk0MzkCXzEEAWkIBQ0kdDAyOTQxMzI5NDM5Al8yBApuZXdCYWxhbmNlCQBkAgUHYmFsYW5jZQMFB2RlcG9zaXQJAJEDAgUHYW1vdW50cwUBaQkBAS0BCQCRAwIFB2Ftb3VudHMFAWkJAJQKAgkAzQgCBQtuZXdCYWxhbmNlcwUKbmV3QmFsYW5jZQkAZAIFAWkAAQQLbmV3QmFsYW5jZXMICgACJGwFCGJhbGFuY2VzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEPY2FsY05ld0JhbGFuY2VzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxNQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwJfMQQCRDEJAQdnZXRETWVtAgULbmV3QmFsYW5jZXMFA2FtcAQEZGlmZgMFB2RlcG9zaXQJAGUCBQJEMQUCRDAJAGUCBQJEMAUCRDEJAJQKAgUDbmlsCQBrAwUEZGlmZgULc2hhcmVTdXBwbHkFAkQwA21zZwEFcmFtcEECCF9mdXR1cmVBC19mdXR1cmVUaW1lCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQNtc2cDCQEGYXNzZXJ0AQkAZwIFDmJsb2NrVGltZXN0YW1wCQBkAgUOaW5pdGlhbF9BX3RpbWUFDU1JTl9SQU1QX1RJTUUJAAIBAgl0b28gb2Z0ZW4DCQEGYXNzZXJ0AQkAZwIFC19mdXR1cmVUaW1lCQBkAgUOYmxvY2tUaW1lc3RhbXAFDU1JTl9SQU1QX1RJTUUJAAIBAhFpbnN1ZmZpY2llbnQgdGltZQQKX2luaXRpYWxfQQkBAl9BAAMJAQZhc3NlcnQBAwkAZgIFCF9mdXR1cmVBAAAJAGYCBQVNQVhfQQUIX2Z1dHVyZUEHCQACAQIRb3V0IG9mIGJhc2UgcmFuZ2UDCQEGYXNzZXJ0AQMDCQBnAgUIX2Z1dHVyZUEFCl9pbml0aWFsX0EJAGcCCQBoAgUKX2luaXRpYWxfQQUMTUFYX0FfQ0hBTkdFBQhfZnV0dXJlQQcGAwkAZgIFCl9pbml0aWFsX0EFCF9mdXR1cmVBCQBnAgkAaAIFCF9mdXR1cmVBBQxNQVhfQV9DSEFOR0UFCl9pbml0aWFsX0EHCQACAQIMb3V0IG9mIHJhbmdlCQDMCAIJAQxJbnRlZ2VyRW50cnkCAglpbml0aWFsX0EFCl9pbml0aWFsX0EJAMwIAgkBDEludGVnZXJFbnRyeQICCGZ1dHVyZV9BBQhfZnV0dXJlQQkAzAgCCQEMSW50ZWdlckVudHJ5AgIOaW5pdGlhbF9BX3RpbWUFDmJsb2NrVGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCAg1mdXR1cmVfQV90aW1lBQtfZnV0dXJlVGltZQUDbmlsA21zZwEJc3RvcFJhbXBBAAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAkBC3ZhbHVlT3JFbHNlAgkBC2lzQWRtaW5DYWxsAQUDbXNnBAhjdXJyZW50QQkBAl9BAAkAzAgCCQEMSW50ZWdlckVudHJ5AgIJaW5pdGlhbF9BBQhjdXJyZW50QQkAzAgCCQEMSW50ZWdlckVudHJ5AgIIZnV0dXJlX0EFCGN1cnJlbnRBCQDMCAIJAQxJbnRlZ2VyRW50cnkCAg5pbml0aWFsX0FfdGltZQUOYmxvY2tUaW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQICDWZ1dHVyZV9BX3RpbWUFDmJsb2NrVGltZXN0YW1wBQNuaWwDbXNnAQhzaHV0ZG93bgAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFA21zZwMJAQEhAQUGYWN0aXZlCQACAQkArAICAiJEQXBwIGlzIGFscmVhZHkgc3VzcGVuZGVkLiBDYXVzZTogCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFBmtDYXVzZQIadGhlIGNhdXNlIHdhc24ndCBzcGVjaWZpZWQJAQdzdXNwZW5kAQIPUGF1c2VkIGJ5IGFkbWluA21zZwEIYWN0aXZhdGUACQELdmFsdWVPckVsc2UCCQELaXNBZG1pbkNhbGwBBQNtc2cDBQZhY3RpdmUJAQ10aHJvd0lzQWN0aXZlAAkAzAgCCQEMQm9vbGVhbkVudHJ5AgUHa0FjdGl2ZQYJAMwIAgkBC0RlbGV0ZUVudHJ5AQUGa0NhdXNlBQNuaWwDbXNnARl0YWtlSW50b0FjY291bnRFeHRyYUZ1bmRzAAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAMJAQIhPQIIBQNtc2cGY2FsbGVyBQ9tb25leUJveEFkZHJlc3MJAAIBAiZPbmx5IHRoZSB3YWxsZXQgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgQIYmFsYW5jZXMJAQNfeHAACgEOdGFrZUV4dHJhRnVuZHMCA2FjYwdhc3NldElkBA0kdDAzMTc4MTMxNzk5BQNhY2MEA3N1bQgFDSR0MDMxNzgxMzE3OTkCXzEEAWkIBQ0kdDAzMTc4MTMxNzk5Al8yBAh0b2tlbkI1OAkA2QQBBQdhc3NldElkBAhyQmFsYW5jZQkAZAIJAPAHAgUEdGhpcwUIdG9rZW5CNTgJAQxzdGFrZWRBbW91bnQBBQh0b2tlbkI1OAQMZW5yb2xsQW1vdW50CQBlAgUIckJhbGFuY2UJAJEDAgUIYmFsYW5jZXMFAWkDCQBmAgAABQxlbnJvbGxBbW91bnQJAQdzdXNwZW5kAQkArAICAiBFbnJvbGwgYW1vdW50IG5lZ2F0aXZlIGZvciBhc3NldAUHYXNzZXRJZAQHYWlyZHJvcAMJAGYCBQxlbnJvbGxBbW91bnQAAAkA/AcEBRBscEZhcm1pbmdBZGRyZXNzAgdhaXJEcm9wBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFCHRva2VuQjU4BQxlbnJvbGxBbW91bnQFA25pbAAAAwkAAAIFB2FpcmRyb3AFB2FpcmRyb3AJAJQKAgkAZAIFA3N1bQUMZW5yb2xsQW1vdW50CQBkAgUBaQABCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAFrCgACJGwFCGFzc2V0SWRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAAAAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEOdGFrZUV4dHJhRnVuZHMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDE1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPAwkAAAIIBQFrAl8xAAAJAAIBAhBObyBtb25leSB0byB0YWtlBQNuaWwBAnR4AQZ2ZXJpZnkABBNtdWx0aVNpZ25lZEJ5QWRtaW5zBBJhZG1pblB1YktleTFTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQxhZG1pblB1YktleTEAAQAABBJhZG1pblB1YktleTJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQxhZG1pblB1YktleTIAAQAABBJhZG1pblB1YktleTNTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwACBQxhZG1pblB1YktleTMAAQAACQBnAgkAZAIJAGQCBRJhZG1pblB1YktleTFTaWduZWQFEmFkbWluUHViS2V5MlNpZ25lZAUSYWRtaW5QdWJLZXkzU2lnbmVkAAIEByRtYXRjaDAFAnR4AwkAAQIFByRtYXRjaDACF0ludm9rZVNjcmlwdFRyYW5zYWN0aW9uBANpbnYFByRtYXRjaDAEE2NhbGxUYWtlSW50b0FjY291bnQDCQAAAggFA2ludgRkQXBwBQR0aGlzCQAAAggFA2ludghmdW5jdGlvbgIZdGFrZUludG9BY2NvdW50RXh0cmFGdW5kcwcEDXNpZ25lZEJ5QWRtaW4DAwMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDGFkbWluUHViS2V5MQYJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDGFkbWluUHViS2V5MgYJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDGFkbWluUHViS2V5MwYJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFEWFkbWluUHViS2V5SW52b2tlAwMFE2NhbGxUYWtlSW50b0FjY291bnQFDXNpZ25lZEJ5QWRtaW4HBgUTbXVsdGlTaWduZWRCeUFkbWlucwUTbXVsdGlTaWduZWRCeUFkbWluczYulaQ=", "height": 2240175, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: EmBkZJWQDAPAne7aKsUFVS1s3JvCucPrc9CLkNaTUddQ Next: none Diff:
OldNewDifferences
3939
4040 let kUserSwopInGov = "_SWOP_amount"
4141
42-let kFirstHarvest = "first_harvest"
43-
44-let kFirstHarvestHeight = "first_harvest_height"
45-
46-let kShareLimit = "share_limit_on_first_harvest"
47-
48-let kBasePeriod = "base_period"
49-
50-let kPeriodLength = "period_length"
51-
52-let kStartHeight = "start_height"
53-
5442 let kAdminPubKey1 = "admin_pub_1"
5543
5644 let kAdminPubKey2 = "admin_pub_2"
6654 let kVotingAddress = "voting_address"
6755
6856 let kFarmingAddress = "farming_address"
57+
58+let kLPFarmingAddress = "lp_farming"
6959
7060 let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
7161
9585
9686 let farmingAddress = Address(getBase58FromOracle(kFarmingAddress))
9787
98-let capMoneyBoxAddress = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
88+let lpFarmingAddress = Address(getBase58FromOracle(kLPFarmingAddress))
9989
10090 let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
10191
10292 let stakingAssets = [toBase58String(USDN)]
103-
104-let basePeriod = valueOrErrorMessage(getInteger(votingAddress, kBasePeriod), "Empty kBasePeriod")
105-
106-let startHeight = valueOrErrorMessage(getInteger(votingAddress, kStartHeight), "Empty kStartHeight")
107-
108-let periodLength = valueOrErrorMessage(getInteger(votingAddress, kPeriodLength), "Empty kPeriodLength")
109-
110-let firstHarvestEndPeriod = ((basePeriod + ((height - startHeight) / periodLength)) + 3)
11193
11294 let active = getBooleanValue(this, kActive)
11395
164146
165147
166148 func calculateFeeDiscount (userAddr) = {
167- let swopAmount = valueOrElse(getInteger(govAddress, (toString(userAddr) + kUserSwopInGov)), 0)
149+ let user = match userAddr {
150+ case u: Address =>
151+ toString(u)
152+ case u: String =>
153+ u
154+ case _ =>
155+ throw("Unknow type of user Addr")
156+ }
157+ let swopAmount = valueOrElse(getInteger(govAddress, (user + kUserSwopInGov)), 0)
168158 let discountValues = split(getStringValue(oracle, kDiscountValues), ",")
169159 let discounts = split(getStringValue(oracle, kDiscounts), ",")
170160 if (if ((swopAmount >= parseIntValue(discountValues[0])))
289279 else $Tuple2(D, false)
290280 }
291281
292- let $t066756787 = {
282+ let $t061916303 = {
293283 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
294284 let $s = size($l)
295285 let $acc0 = $Tuple2(toBigInt(S), false)
303293
304294 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
305295 }
306- let D = $t066756787._1
307- let finished = $t066756787._2
296+ let D = $t061916303._1
297+ let finished = $t061916303._2
308298 if ((finished == false))
309299 then throw(("get_D() not finished with " + toString(D)))
310300 else toInt(D)
330320 let D = get_D(xp_, amp)
331321 let Ann = (amp * nCoins)
332322 func S_c (acc,i) = {
333- let $t073587375 = acc
334- let S_ = $t073587375._1
335- let c = $t073587375._2
323+ let $t068746891 = acc
324+ let S_ = $t068746891._1
325+ let c = $t068746891._2
336326 let x_ = if ((in == i))
337327 then x
338328 else xp_[i]
343333 else $Tuple2(S_, c)
344334 }
345335
346- let $t075837684 = {
336+ let $t070997200 = {
347337 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
348338 let $s = size($l)
349339 let $acc0 = $Tuple2(0, toBigInt(D))
357347
358348 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
359349 }
360- let S_ = $t075837684._1
361- let c_ = $t075837684._2
350+ let S_ = $t070997200._1
351+ let c_ = $t070997200._2
362352 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
363353 let bD = toBigInt(((S_ + (D / Ann)) - D))
364354 func y_proc (acc,_i) = if ((acc._2 == true))
375365 else $Tuple2(y, false)
376366 }
377367
378- let $t081668283 = {
368+ let $t076827799 = {
379369 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
380370 let $s = size($l)
381371 let $acc0 = $Tuple2(toBigInt(D), false)
389379
390380 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16)
391381 }
392- let y = $t081668283._1
393- let finished = $t081668283._2
382+ let y = $t076827799._1
383+ let finished = $t076827799._2
394384 if ((finished == false))
395385 then throw(("getY() not finished with " + toString(y)))
396386 else toInt(y)
404394 else {
405395 let Ann = (A_ * nCoins)
406396 func S_c (acc,i) = {
407- let $t086628679 = acc
408- let S_ = $t086628679._1
409- let c = $t086628679._2
397+ let $t081788195 = acc
398+ let S_ = $t081788195._1
399+ let c = $t081788195._2
410400 let x_ = if (if ((in != i))
411401 then (nCoins > i)
412402 else false)
419409 else $Tuple2(S_, c)
420410 }
421411
422- let $t088999000 = {
412+ let $t084158516 = {
423413 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
424414 let $s = size($l)
425415 let $acc0 = $Tuple2(0, toBigInt(D))
433423
434424 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
435425 }
436- let S_ = $t088999000._1
437- let c_ = $t088999000._2
426+ let S_ = $t084158516._1
427+ let c_ = $t084158516._2
438428 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
439429 let bD = toBigInt(((S_ + (D / Ann)) - D))
440430 func y_D_proc (acc,i) = if ((acc._2 == true))
451441 else $Tuple2(y, false)
452442 }
453443
454- let $t094839602 = {
444+ let $t089999118 = {
455445 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
456446 let $s = size($l)
457447 let $acc0 = $Tuple2(toBigInt(D), false)
465455
466456 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16)
467457 }
468- let y = $t094839602._1
469- let finished = $t094839602._2
458+ let y = $t089999118._1
459+ let finished = $t089999118._2
470460 if ((finished == false))
471461 then throw(("get_y_D() not finished with " + toString(y)))
472462 else toInt(y)
483473 let new_y = get_y_D(amp, i, xp, D1)
484474 let dy_0 = (xp[i] - new_y)
485475 func xp_reduced_proc (acc,xp_j) = {
486- let $t01024310272 = acc
487- let xp_reduced = $t01024310272._1
488- let index = $t01024310272._2
476+ let $t097599788 = acc
477+ let xp_reduced = $t097599788._1
478+ let index = $t097599788._2
489479 let dx_expected = if ((index == i))
490480 then (fraction(xp_j, D1, D0) - new_y)
491481 else (xp_j - fraction(xp_j, D1, D0))
492482 $Tuple2((xp_reduced :+ (xp_j - fraction(_fee, dx_expected, feeScale6))), (index + 1))
493483 }
494484
495- let $t01053410598 = {
485+ let $t01005010114 = {
496486 let $l = xp
497487 let $s = size($l)
498488 let $acc0 = $Tuple2(nil, 0)
506496
507497 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
508498 }
509- let xp_reduced = $t01053410598._1
510- let index = $t01053410598._2
499+ let xp_reduced = $t01005010114._1
500+ let index = $t01005010114._2
511501 let xp_reduced_i = xp_reduced[i]
512502 let dy = ((xp_reduced_i - get_y_D(amp, i, xp_reduced, D1)) - 1)
513503 $Tuple2(dy, (dy_0 - dy))
531521
532522 func calcStakingParams (stake,amount,assetId) = if (stake)
533523 then {
534- let $t01116211228 = calcStakingFuncAndAddres(stake, assetId)
535- let call = $t01116211228._1
536- let stakingAddr = $t01116211228._2
524+ let $t01067810744 = calcStakingFuncAndAddres(stake, assetId)
525+ let call = $t01067810744._1
526+ let stakingAddr = $t01067810744._2
537527 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
538528 }
539529 else {
540- let $t01131411380 = calcStakingFuncAndAddres(stake, assetId)
541- let call = $t01131411380._1
542- let stakingAddr = $t01131411380._2
530+ let $t01083010896 = calcStakingFuncAndAddres(stake, assetId)
531+ let call = $t01083010896._1
532+ let stakingAddr = $t01083010896._2
543533 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
544534 }
545535
546536
547537 func stake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
548538 then {
549- let $t01156711669 = calcStakingParams(true, amount, fromBase58String(assetIdString))
550- let call = $t01156711669._1
551- let addr = $t01156711669._2
552- let params = $t01156711669._3
553- let payments = $t01156711669._4
539+ let $t01108311185 = calcStakingParams(true, amount, fromBase58String(assetIdString))
540+ let call = $t01108311185._1
541+ let addr = $t01108311185._2
542+ let params = $t01108311185._3
543+ let payments = $t01108311185._4
554544 invoke(addr, call, params, payments)
555545 }
556546 else 0
558548
559549 func unstake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
560550 then {
561- let $t01185411957 = calcStakingParams(false, amount, fromBase58String(assetIdString))
562- let call = $t01185411957._1
563- let addr = $t01185411957._2
564- let params = $t01185411957._3
565- let payments = $t01185411957._4
551+ let $t01137011473 = calcStakingParams(false, amount, fromBase58String(assetIdString))
552+ let call = $t01137011473._1
553+ let addr = $t01137011473._2
554+ let params = $t01137011473._3
555+ let payments = $t01137011473._4
566556 invoke(addr, call, params, payments)
567557 }
568558 else 0
591581 func checkSuspicious () = {
592582 let contractBalances = _xp()
593583 func checkBalance (acc,assetId) = {
594- let $t01256812593 = acc
595- let suspicious = $t01256812593._1
596- let i = $t01256812593._2
584+ let $t01208412109 = acc
585+ let suspicious = $t01208412109._1
586+ let i = $t01208412109._2
597587 if (suspicious)
598588 then $Tuple2(suspicious, i)
599589 else {
686676
687677
688678 @Callable(msg)
689-func init (assetIds,_A,_dAppThresholdCoef,firstHarvest) = if (!(isDataStorageUntouched(this)))
679+func init (assetIds,_A,_dAppThresholdCoef) = if (!(isDataStorageUntouched(this)))
690680 then throw("Already initialized")
691681 else if ((0 >= _A))
692682 then throw("Amp must be must > 0")
699689 let tokenId = calculateAssetId(issueToken)
700690 if (checkCoins(assetIds))
701691 then throw()
702- else {
703- let baseEntry = [StringEntry(kVersion, version), StringEntry(kAssets, assetIds), IntegerEntry("initial_A", _A), IntegerEntry("future_A", _A), IntegerEntry(kFee, getIntegerValue(oracle, "base_fee_flat")), StringEntry(kShareAssetId, toBase58String(tokenId)), IntegerEntry(kShareAssetSupply, 0), IntegerEntry(kDAppThresholdCoef, _dAppThresholdCoef), BooleanEntry(kActive, true), issueToken]
704- if (firstHarvest)
705- then (baseEntry ++ [BooleanEntry(kFirstHarvest, firstHarvest), IntegerEntry(kFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
706- else baseEntry
707- }
692+ else [StringEntry(kVersion, version), StringEntry(kAssets, assetIds), IntegerEntry("initial_A", _A), IntegerEntry("future_A", _A), IntegerEntry(kFee, getIntegerValue(oracle, "base_fee_flat")), StringEntry(kShareAssetId, toBase58String(tokenId)), IntegerEntry(kShareAssetSupply, 0), IntegerEntry(kDAppThresholdCoef, _dAppThresholdCoef), BooleanEntry(kActive, true), issueToken]
708693 }
709694
710695
753738 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, payments))
754739 else {
755740 func parsePayments (acc,assetId) = {
756- let $t01690116930 = acc
757- let newBalances = $t01690116930._1
758- let i = $t01690116930._2
759- let j = $t01690116930._3
741+ let $t01612516154 = acc
742+ let newBalances = $t01612516154._1
743+ let i = $t01612516154._2
744+ let j = $t01612516154._3
760745 if (if ((paymentsSize > j))
761746 then (getStrAssetId(payments[j].assetId) == assetId)
762747 else false)
764749 else $Tuple3((newBalances :+ xp[i]), (i + 1), j)
765750 }
766751
767- let $t01715017236 = {
752+ let $t01637416460 = {
768753 let $l = assetIds
769754 let $s = size($l)
770755 let $acc0 = $Tuple3(nil, 0, 0)
778763
779764 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
780765 }
781- let newBalances = $t01715017236._1
782- let k = $t01715017236._2
783- let parsedPayments = $t01715017236._3
766+ let newBalances = $t01637416460._1
767+ let k = $t01637416460._2
768+ let parsedPayments = $t01637416460._3
784769 if ((paymentsSize > parsedPayments))
785770 then throw("Incorect payments order")
786771 else if (checkDAppThreshold(newBalances))
792777 else {
793778 let feeDiscount = calculateFeeDiscount(msg.caller)
794779 func calcScriptActions (acc,newBalance) = {
795- let $t01763717678 = acc
796- let invBalances = $t01763717678._1
797- let scriptActions = $t01763717678._2
798- let i = $t01763717678._3
780+ let $t01686116902 = acc
781+ let invBalances = $t01686116902._1
782+ let scriptActions = $t01686116902._2
783+ let i = $t01686116902._3
799784 if ((shareSupply > 0))
800785 then {
801786 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
810795 let finalBalance = (newBalance - fees)
811796 let invariantBalance = (newBalance - fees)
812797 let pmt = (newBalance - xp[i])
798+ let lpFees = (fees - governanceFees)
813799 let inv = if ((pmt > 0))
814800 then stake((pmt - fees), assetIds[i])
815801 else unstake(fees, assetIds[i])
816802 if ((inv == inv))
817- then $Tuple3((invBalances :+ invariantBalance), (scriptActions ++ [ScriptTransfer(capMoneyBoxAddress, (fees - governanceFees), fromBase58String(assetIds[i])), ScriptTransfer(moneyBoxAddress, governanceFees, fromBase58String(assetIds[i])), IntegerEntry((assetIds[i] + kAssetBalance), finalBalance)]), (i + 1))
803+ then {
804+ let airdrop = if ((lpFees > 0))
805+ then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(fromBase58String(assetIds[i]), lpFees)])
806+ else 0
807+ if ((airdrop == airdrop))
808+ then $Tuple3((invBalances :+ invariantBalance), (scriptActions ++ [ScriptTransfer(moneyBoxAddress, governanceFees, fromBase58String(assetIds[i])), IntegerEntry((assetIds[i] + kAssetBalance), finalBalance)]), (i + 1))
809+ else throw("Strict value is not equal to itself.")
810+ }
818811 else throw("Strict value is not equal to itself.")
819812 }
820813 else {
825818 }
826819 }
827820
828- let $t01922619314 = {
821+ let $t01860718695 = {
829822 let $l = newBalances
830823 let $s = size($l)
831824 let $acc0 = $Tuple3(nil, nil, 0)
839832
840833 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
841834 }
842- let invBalances = $t01922619314._1
843- let scriptActions = $t01922619314._2
835+ let invBalances = $t01860718695._1
836+ let scriptActions = $t01860718695._2
844837 let D2 = getDMem(invBalances, amp)
845838 let mint_amount = if ((shareSupply == 0))
846839 then D1
865858 }
866859 }
867860 })
861+
862+
863+
864+@Callable(msg)
865+func calcMintAmount (newBalances,user) = {
866+ let amp = _A()
867+ let xp = _xp()
868+ let D1 = getDMem(newBalances, amp)
869+ if ((shareSupply == 0))
870+ then $Tuple2(nil, D1)
871+ else {
872+ let D0 = getDMem(xp, amp)
873+ let feeDiscount = calculateFeeDiscount(user)
874+ func calcInvBalances (acc,newBalance) = {
875+ let $t01988419910 = acc
876+ let invBalances = $t01988419910._1
877+ let i = $t01988419910._2
878+ let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
879+ let fees = {
880+ let idealBalance = fraction(D1, xp[i], D0)
881+ let difference = if ((idealBalance > newBalance))
882+ then (idealBalance - newBalance)
883+ else (newBalance - idealBalance)
884+ fraction(_fee, difference, feeScale6)
885+ }
886+ let invariantBalance = (newBalance - fees)
887+ $Tuple2((invBalances :+ invariantBalance), (i + 1))
888+ }
889+
890+ let $t02051220582 = {
891+ let $l = newBalances
892+ let $s = size($l)
893+ let $acc0 = $Tuple2(nil, 0)
894+ func $f0_1 ($a,$i) = if (($i >= $s))
895+ then $a
896+ else calcInvBalances($a, $l[$i])
897+
898+ func $f0_2 ($a,$i) = if (($i >= $s))
899+ then $a
900+ else throw("List size exceeds 15")
901+
902+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
903+ }
904+ let invBalances = $t02051220582._1
905+ let k = $t02051220582._2
906+ let D2 = getDMem(invBalances, amp)
907+ let mintAmount = fraction(shareSupply, (D2 - D0), D0)
908+ $Tuple2(nil, mintAmount)
909+ }
910+ }
868911
869912
870913
906949 let x = (xp[fromIndex] + dx)
907950 let y = getY(fromIndex, toIndex, x, xp)
908951 let _dy = ((xp[toIndex] - y) - 1)
909- let feeDiscount = calculateFeeDiscount(msg.caller)
952+ let feeDiscount = calculateFeeDiscount(msg.originCaller)
910953 let _fee = fraction(_dy, fraction(fee, feeDiscount, feeScale6, CEILING), feeScale6)
911954 let dy = (_dy - _fee)
912955 let governanceFees = fraction(_fee, feeGovernance, feeScale6)
914957 then throw("Exchange resulted in fewer coins than expected")
915958 else {
916959 func makeNewBalances (acc,tokenBalance) = {
917- let $t02202622052 = acc
918- let newBalances = $t02202622052._1
919- let i = $t02202622052._2
960+ let $t02262322649 = acc
961+ let newBalances = $t02262322649._1
962+ let i = $t02262322649._2
920963 if ((i == fromIndex))
921964 then $Tuple2((newBalances :+ (tokenBalance + dx)), (i + 1))
922965 else if ((i == toIndex))
924967 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
925968 }
926969
927- let $t02230322364 = {
970+ let $t02290022961 = {
928971 let $l = xp
929972 let $s = size($l)
930973 let $acc0 = $Tuple2(nil, 0)
938981
939982 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
940983 }
941- let newBalances = $t02230322364._1
942- let i = $t02230322364._2
984+ let newBalances = $t02290022961._1
985+ let i = $t02290022961._2
943986 if (checkDAppThreshold(newBalances))
944987 then throw()
945988 else {
948991 then {
949992 let us = unstake(_dy, tokenOut)
950993 if ((us == us))
951- then $Tuple2([IntegerEntry((tokenIn + kAssetBalance), x), IntegerEntry((tokenOut + kAssetBalance), (xp[toIndex] - _dy)), ScriptTransfer(msg.caller, dy, tokenOutB58), ScriptTransfer(moneyBoxAddress, governanceFees, tokenOutB58), ScriptTransfer(capMoneyBoxAddress, (_fee - governanceFees), tokenOutB58)], [dy, tokenOutB58])
994+ then {
995+ let lpFees = (_fee - governanceFees)
996+ let airdrop = if ((lpFees > 0))
997+ then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(tokenOutB58, lpFees)])
998+ else 0
999+ if ((airdrop == airdrop))
1000+ then $Tuple2([IntegerEntry((tokenIn + kAssetBalance), x), IntegerEntry((tokenOut + kAssetBalance), (xp[toIndex] - _dy)), ScriptTransfer(msg.caller, dy, tokenOutB58), ScriptTransfer(moneyBoxAddress, governanceFees, tokenOutB58)], [dy, tokenOutB58])
1001+ else throw("Strict value is not equal to itself.")
1002+ }
9521003 else throw("Strict value is not equal to itself.")
9531004 }
9541005 else throw("Strict value is not equal to itself.")
9731024 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.originCaller, msg.payments))
9741025 else {
9751026 func calcScriptActions (acc,balance) = {
976- let $t02350523533 = acc
977- let scriptActions = $t02350523533._1
978- let i = $t02350523533._2
1027+ let $t02425224280 = acc
1028+ let scriptActions = $t02425224280._1
1029+ let i = $t02425224280._2
9791030 let wAmount = fraction(balance, pmtAmount, shareSupply)
9801031 if (assert((wAmount >= minAmounts[i])))
9811032 then throw("Withdrawal resulted in fewer coins than expected")
9871038 }
9881039 }
9891040
990- let $t02402324091 = {
1041+ let $t02477024838 = {
9911042 let $l = _xp()
9921043 let $s = size($l)
9931044 let $acc0 = $Tuple2(nil, 0)
10011052
10021053 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
10031054 }
1004- let scriptActions = $t02402324091._1
1005- let i = $t02402324091._2
1055+ let scriptActions = $t02477024838._1
1056+ let i = $t02477024838._2
10061057 (scriptActions ++ [Burn(shareAssetId, pmtAmount), IntegerEntry(kShareAssetSupply, (shareSupply - pmtAmount))])
10071058 }
10081059 }
10651116 then throw("unknown token")
10661117 else {
10671118 let outIndex = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
1119+ let tokenOutB58 = fromBase58String(tokenOut)
10681120 let xp = _xp()
1069- let $t02600526087 = _calcWithdrawOneCoin(xp, pmtAmount, outIndex, msg.originCaller)
1070- let dy = $t02600526087._1
1071- let dy_fee = $t02600526087._2
1121+ let $t02680226884 = _calcWithdrawOneCoin(xp, pmtAmount, outIndex, msg.originCaller)
1122+ let dy = $t02680226884._1
1123+ let dy_fee = $t02680226884._2
10721124 if (assert((dy >= minAmount)))
10731125 then throw("Not enough coins removed")
10741126 else {
10751127 let governanceFees = fraction(dy_fee, feeGovernance, feeScale6)
10761128 let dy_and_fee = (dy + dy_fee)
10771129 func makeNewBalances (acc,tokenBalance) = {
1078- let $t02634526371 = acc
1079- let newBalances = $t02634526371._1
1080- let i = $t02634526371._2
1130+ let $t02714227168 = acc
1131+ let newBalances = $t02714227168._1
1132+ let i = $t02714227168._2
10811133 if ((i == outIndex))
10821134 then $Tuple2((newBalances :+ (tokenBalance - dy_and_fee)), (i + 1))
10831135 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
10841136 }
10851137
1086- let $t02653826599 = {
1138+ let $t02733527396 = {
10871139 let $l = xp
10881140 let $s = size($l)
10891141 let $acc0 = $Tuple2(nil, 0)
10971149
10981150 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
10991151 }
1100- let newBalances = $t02653826599._1
1101- let v = $t02653826599._2
1152+ let newBalances = $t02733527396._1
1153+ let v = $t02733527396._2
11021154 if (checkDAppThreshold(newBalances))
11031155 then throw()
11041156 else {
11051157 let us = unstake(dy_and_fee, tokenOut)
11061158 if ((us == us))
1107- then [ScriptTransfer(msg.originCaller, dy, fromBase58String(tokenOut)), IntegerEntry((assetIds[outIndex] + kAssetBalance), (xp[outIndex] - dy_and_fee)), Burn(shareAssetId, pmtAmount), ScriptTransfer(moneyBoxAddress, governanceFees, fromBase58String(tokenOut)), ScriptTransfer(capMoneyBoxAddress, (dy_fee - governanceFees), fromBase58String(tokenOut)), IntegerEntry(kShareAssetSupply, (shareSupply - pmtAmount))]
1159+ then {
1160+ let lpFees = (dy_fee - governanceFees)
1161+ let airdrop = if ((lpFees > 0))
1162+ then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(tokenOutB58, lpFees)])
1163+ else 0
1164+ if ((airdrop == airdrop))
1165+ then [ScriptTransfer(msg.originCaller, dy, tokenOutB58), IntegerEntry((assetIds[outIndex] + kAssetBalance), (xp[outIndex] - dy_and_fee)), Burn(shareAssetId, pmtAmount), ScriptTransfer(moneyBoxAddress, governanceFees, tokenOutB58), IntegerEntry(kShareAssetSupply, (shareSupply - pmtAmount))]
1166+ else throw("Strict value is not equal to itself.")
1167+ }
11081168 else throw("Strict value is not equal to itself.")
11091169 }
11101170 }
11661226 let balances = _xp()
11671227 let D0 = getDMem(balances, amp)
11681228 func calcNewBalances (acc,balance) = {
1169- let $t02852328549 = acc
1170- let newBalances = $t02852328549._1
1171- let i = $t02852328549._2
1229+ let $t02941329439 = acc
1230+ let newBalances = $t02941329439._1
1231+ let i = $t02941329439._2
11721232 let newBalance = (balance + (if (deposit)
11731233 then amounts[i]
11741234 else -(amounts[i])))
12431303
12441304
12451305 @Callable(msg)
1246-func keepLimitForFirstHarvest (shareLimit) = valueOrElse(isActive(), valueOrElse(isAdminCall(msg), [IntegerEntry(kShareLimit, shareLimit)]))
1306+func takeIntoAccountExtraFunds () = valueOrElse(isActive(), if ((msg.caller != moneyBoxAddress))
1307+ then throw("Only the wallet can call this function")
1308+ else {
1309+ let balances = _xp()
1310+ func takeExtraFunds (acc,assetId) = {
1311+ let $t03178131799 = acc
1312+ let sum = $t03178131799._1
1313+ let i = $t03178131799._2
1314+ let tokenB58 = fromBase58String(assetId)
1315+ let rBalance = (assetBalance(this, tokenB58) + stakedAmount(tokenB58))
1316+ let enrollAmount = (rBalance - balances[i])
1317+ if ((0 > enrollAmount))
1318+ then suspend(("Enroll amount negative for asset" + assetId))
1319+ else {
1320+ let airdrop = if ((enrollAmount > 0))
1321+ then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(tokenB58, enrollAmount)])
1322+ else 0
1323+ if ((airdrop == airdrop))
1324+ then $Tuple2((sum + enrollAmount), (i + 1))
1325+ else throw("Strict value is not equal to itself.")
1326+ }
1327+ }
1328+
1329+ let k = {
1330+ let $l = assetIds
1331+ let $s = size($l)
1332+ let $acc0 = $Tuple2(0, 0)
1333+ func $f0_1 ($a,$i) = if (($i >= $s))
1334+ then $a
1335+ else takeExtraFunds($a, $l[$i])
1336+
1337+ func $f0_2 ($a,$i) = if (($i >= $s))
1338+ then $a
1339+ else throw("List size exceeds 15")
1340+
1341+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
1342+ }
1343+ if ((k._1 == 0))
1344+ then throw("No money to take")
1345+ else nil
1346+ })
12471347
12481348
12491349 @Verifier(tx)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let PRECISION = 1000000
55
66 let MAX_A = 1000000
77
88 let MAX_A_CHANGE = 10
99
1010 let DECIMALS = 6
1111
1212 let MIN_RAMP_TIME = (86400 / 60)
1313
1414 let version = "3.0.0"
1515
1616 let kVersion = "version"
1717
1818 let kAssets = "asset_ids"
1919
2020 let kAssetBalance = "_balance"
2121
2222 let kActive = "active"
2323
2424 let kCause = "shutdown_cause"
2525
2626 let kShareAssetId = "share_asset_id"
2727
2828 let kShareAssetSupply = "share_asset_supply"
2929
3030 let kFee = "commission"
3131
3232 let kDAppThresholdCoef = "dAppThresholdCoef"
3333
3434 let kUSDNAddress = "staking_usdnnsbt_address"
3535
3636 let kDiscounts = "discounts"
3737
3838 let kDiscountValues = "discount_values"
3939
4040 let kUserSwopInGov = "_SWOP_amount"
4141
42-let kFirstHarvest = "first_harvest"
43-
44-let kFirstHarvestHeight = "first_harvest_height"
45-
46-let kShareLimit = "share_limit_on_first_harvest"
47-
48-let kBasePeriod = "base_period"
49-
50-let kPeriodLength = "period_length"
51-
52-let kStartHeight = "start_height"
53-
5442 let kAdminPubKey1 = "admin_pub_1"
5543
5644 let kAdminPubKey2 = "admin_pub_2"
5745
5846 let kAdminPubKey3 = "admin_pub_3"
5947
6048 let kAdminInvokePubKey = "admin_invoke_pub"
6149
6250 let kMoneyBoxAddress = "money_box_address"
6351
6452 let kGovAddress = "governance_address"
6553
6654 let kVotingAddress = "voting_address"
6755
6856 let kFarmingAddress = "farming_address"
57+
58+let kLPFarmingAddress = "lp_farming"
6959
7060 let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
7161
7262 func getBase58FromOracle (key) = match getString(oracle, key) {
7363 case string: String =>
7464 fromBase58String(string)
7565 case nothing =>
7666 throw((key + "is empty"))
7767 }
7868
7969
8070 let adminPubKey1 = getBase58FromOracle(kAdminPubKey1)
8171
8272 let adminPubKey2 = getBase58FromOracle(kAdminPubKey2)
8373
8474 let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
8575
8676 let adminPubKeyInvoke = getBase58FromOracle(kAdminInvokePubKey)
8777
8878 let moneyBoxAddress = Address(getBase58FromOracle(kMoneyBoxAddress))
8979
9080 let govAddress = Address(getBase58FromOracle(kGovAddress))
9181
9282 let stakingUSDNAddress = Address(getBase58FromOracle(kUSDNAddress))
9383
9484 let votingAddress = Address(getBase58FromOracle(kVotingAddress))
9585
9686 let farmingAddress = Address(getBase58FromOracle(kFarmingAddress))
9787
98-let capMoneyBoxAddress = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
88+let lpFarmingAddress = Address(getBase58FromOracle(kLPFarmingAddress))
9989
10090 let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
10191
10292 let stakingAssets = [toBase58String(USDN)]
103-
104-let basePeriod = valueOrErrorMessage(getInteger(votingAddress, kBasePeriod), "Empty kBasePeriod")
105-
106-let startHeight = valueOrErrorMessage(getInteger(votingAddress, kStartHeight), "Empty kStartHeight")
107-
108-let periodLength = valueOrErrorMessage(getInteger(votingAddress, kPeriodLength), "Empty kPeriodLength")
109-
110-let firstHarvestEndPeriod = ((basePeriod + ((height - startHeight) / periodLength)) + 3)
11193
11294 let active = getBooleanValue(this, kActive)
11395
11496 let shareAssetId = fromBase58String(getStringValue(this, kShareAssetId))
11597
11698 let shareSupply = getIntegerValue(this, kShareAssetSupply)
11799
118100 let feeScale6 = 1000000
119101
120102 let fee = getIntegerValue(this, kFee)
121103
122104 let feeGovernance = fraction(40, feeScale6, 100)
123105
124106 let initial_A = getIntegerValue(this, "initial_A")
125107
126108 let future_A = getIntegerValue(this, "future_A")
127109
128110 let initial_A_time = valueOrElse(getInteger(this, "initial_A_time"), 0)
129111
130112 let future_A_time = valueOrElse(getInteger(this, "future_A_time"), 0)
131113
132114 let assetIds = split(getStringValue(this, kAssets), ",")
133115
134116 let nCoins = size(assetIds)
135117
136118 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
137119
138120
139121 func throwIsActive () = throw("DApp is already active")
140122
141123
142124 func isActive () = if (active)
143125 then unit
144126 else throw("DApp is inactive at this moment")
145127
146128
147129 func isAdminCall (i) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
148130 then unit
149131 else throw("Only admin can call this function")
150132
151133
152134 func isSelfCall (i) = if ((this == i.caller))
153135 then unit
154136 else throw("Only contract itself can call this function")
155137
156138
157139 let big2 = toBigInt(2)
158140
159141 let blockTimestamp = height
160142
161143 func assert (a) = if (a)
162144 then false
163145 else true
164146
165147
166148 func calculateFeeDiscount (userAddr) = {
167- let swopAmount = valueOrElse(getInteger(govAddress, (toString(userAddr) + kUserSwopInGov)), 0)
149+ let user = match userAddr {
150+ case u: Address =>
151+ toString(u)
152+ case u: String =>
153+ u
154+ case _ =>
155+ throw("Unknow type of user Addr")
156+ }
157+ let swopAmount = valueOrElse(getInteger(govAddress, (user + kUserSwopInGov)), 0)
168158 let discountValues = split(getStringValue(oracle, kDiscountValues), ",")
169159 let discounts = split(getStringValue(oracle, kDiscounts), ",")
170160 if (if ((swopAmount >= parseIntValue(discountValues[0])))
171161 then (parseIntValue(discountValues[1]) > swopAmount)
172162 else false)
173163 then (feeScale6 - parseIntValue(discounts[0]))
174164 else if (if ((swopAmount >= parseIntValue(discountValues[1])))
175165 then (parseIntValue(discountValues[2]) > swopAmount)
176166 else false)
177167 then (feeScale6 - parseIntValue(discounts[1]))
178168 else if (if ((swopAmount >= parseIntValue(discountValues[2])))
179169 then (parseIntValue(discountValues[3]) > swopAmount)
180170 else false)
181171 then (feeScale6 - parseIntValue(discounts[2]))
182172 else if (if ((swopAmount >= parseIntValue(discountValues[3])))
183173 then (parseIntValue(discountValues[4]) > swopAmount)
184174 else false)
185175 then (feeScale6 - parseIntValue(discounts[3]))
186176 else if ((swopAmount >= parseIntValue(discountValues[4])))
187177 then (feeScale6 - parseIntValue(discounts[4]))
188178 else feeScale6
189179 }
190180
191181
192182 func _A () = {
193183 let t1 = future_A_time
194184 let A1 = future_A
195185 if ((t1 > blockTimestamp))
196186 then {
197187 let A0 = initial_A
198188 let t0 = initial_A_time
199189 if ((A1 > A0))
200190 then (A0 + (((A1 - A0) * (blockTimestamp - t0)) / (t1 - t0)))
201191 else (A0 - (((A0 - A1) * (blockTimestamp - t0)) / (t1 - t0)))
202192 }
203193 else A1
204194 }
205195
206196
207197 func _xp () = {
208198 func assetBalances (acc,assetId) = (acc :+ valueOrElse(getInteger(this, (assetId + kAssetBalance)), 0))
209199
210200 let $l = assetIds
211201 let $s = size($l)
212202 let $acc0 = nil
213203 func $f0_1 ($a,$i) = if (($i >= $s))
214204 then $a
215205 else assetBalances($a, $l[$i])
216206
217207 func $f0_2 ($a,$i) = if (($i >= $s))
218208 then $a
219209 else throw("List size exceeds 15")
220210
221211 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
222212 }
223213
224214
225215 func _xp_mem (xp) = xp
226216
227217
228218 func sumList (acc,element) = (acc + element)
229219
230220
231221 func get_D (xp,amp) = {
232222 let @ = invoke(this, "D", [xp, amp], nil)
233223 if ($isInstanceOf(@, "Int"))
234224 then @
235225 else throw(($getType(invoke(this, "D", [xp, amp], nil)) + " couldn't be cast to Int"))
236226 }
237227
238228
239229 func get_D_internal (xp,amp) = {
240230 let S = {
241231 let $l = xp
242232 let $s = size($l)
243233 let $acc0 = 0
244234 func $f0_1 ($a,$i) = if (($i >= $s))
245235 then $a
246236 else sumList($a, $l[$i])
247237
248238 func $f0_2 ($a,$i) = if (($i >= $s))
249239 then $a
250240 else throw("List size exceeds 15")
251241
252242 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
253243 }
254244 if ((S == 0))
255245 then 0
256246 else {
257247 let Ann = (amp * nCoins)
258248 let AnnS = (toBigInt(Ann) * toBigInt(S))
259249 let Ann1 = toBigInt((Ann - 1))
260250 func Dproc (acc,i) = if ((acc._2 == true))
261251 then acc
262252 else {
263253 let Dprev = acc._1
264254 func D_PProc (D_P,i) = if ((nCoins > i))
265255 then ((D_P * Dprev) / (toBigInt(xp[i]) * toBigInt(nCoins)))
266256 else D_P
267257
268258 let D_P = {
269259 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
270260 let $s = size($l)
271261 let $acc0 = Dprev
272262 func $f1_1 ($a,$i) = if (($i >= $s))
273263 then $a
274264 else D_PProc($a, $l[$i])
275265
276266 func $f1_2 ($a,$i) = if (($i >= $s))
277267 then $a
278268 else throw("List size exceeds 15")
279269
280270 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
281271 }
282272 let D = fraction((AnnS + (toBigInt(nCoins) * D_P)), Dprev, ((Ann1 * Dprev) + (toBigInt((nCoins + 1)) * D_P)))
283273 if ((D > Dprev))
284274 then if ((1 >= toInt((D - Dprev))))
285275 then $Tuple2(D, true)
286276 else $Tuple2(D, false)
287277 else if ((1 >= toInt((Dprev - D))))
288278 then $Tuple2(D, true)
289279 else $Tuple2(D, false)
290280 }
291281
292- let $t066756787 = {
282+ let $t061916303 = {
293283 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
294284 let $s = size($l)
295285 let $acc0 = $Tuple2(toBigInt(S), false)
296286 func $f1_1 ($a,$i) = if (($i >= $s))
297287 then $a
298288 else Dproc($a, $l[$i])
299289
300290 func $f1_2 ($a,$i) = if (($i >= $s))
301291 then $a
302292 else throw("List size exceeds 15")
303293
304294 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
305295 }
306- let D = $t066756787._1
307- let finished = $t066756787._2
296+ let D = $t061916303._1
297+ let finished = $t061916303._2
308298 if ((finished == false))
309299 then throw(("get_D() not finished with " + toString(D)))
310300 else toInt(D)
311301 }
312302 }
313303
314304
315305 func getDMem (xp,amp) = get_D(_xp_mem(xp), amp)
316306
317307
318308 func getY (in,out,x,xp_) = if (assert((in != out)))
319309 then throw("same coin")
320310 else if (assert(if ((out >= 0))
321311 then (in >= 0)
322312 else false))
323313 then throw("below zero")
324314 else if (assert(if ((nCoins > out))
325315 then (nCoins > in)
326316 else false))
327317 then throw("above N_COINS")
328318 else {
329319 let amp = _A()
330320 let D = get_D(xp_, amp)
331321 let Ann = (amp * nCoins)
332322 func S_c (acc,i) = {
333- let $t073587375 = acc
334- let S_ = $t073587375._1
335- let c = $t073587375._2
323+ let $t068746891 = acc
324+ let S_ = $t068746891._1
325+ let c = $t068746891._2
336326 let x_ = if ((in == i))
337327 then x
338328 else xp_[i]
339329 if (if ((i != out))
340330 then (nCoins > i)
341331 else false)
342332 then $Tuple2((S_ + x_), fraction(c, toBigInt(D), toBigInt((x_ * nCoins))))
343333 else $Tuple2(S_, c)
344334 }
345335
346- let $t075837684 = {
336+ let $t070997200 = {
347337 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
348338 let $s = size($l)
349339 let $acc0 = $Tuple2(0, toBigInt(D))
350340 func $f0_1 ($a,$i) = if (($i >= $s))
351341 then $a
352342 else S_c($a, $l[$i])
353343
354344 func $f0_2 ($a,$i) = if (($i >= $s))
355345 then $a
356346 else throw("List size exceeds 15")
357347
358348 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
359349 }
360- let S_ = $t075837684._1
361- let c_ = $t075837684._2
350+ let S_ = $t070997200._1
351+ let c_ = $t070997200._2
362352 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
363353 let bD = toBigInt(((S_ + (D / Ann)) - D))
364354 func y_proc (acc,_i) = if ((acc._2 == true))
365355 then acc
366356 else {
367357 let y_prev = acc._1
368358 let y = (((y_prev * y_prev) + c) / ((big2 * y_prev) + bD))
369359 if ((y > y_prev))
370360 then if ((1 >= toInt((y - y_prev))))
371361 then $Tuple2(y, true)
372362 else $Tuple2(y, false)
373363 else if ((1 >= toInt((y_prev - y))))
374364 then $Tuple2(y, true)
375365 else $Tuple2(y, false)
376366 }
377367
378- let $t081668283 = {
368+ let $t076827799 = {
379369 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
380370 let $s = size($l)
381371 let $acc0 = $Tuple2(toBigInt(D), false)
382372 func $f1_1 ($a,$i) = if (($i >= $s))
383373 then $a
384374 else y_proc($a, $l[$i])
385375
386376 func $f1_2 ($a,$i) = if (($i >= $s))
387377 then $a
388378 else throw("List size exceeds 16")
389379
390380 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16)
391381 }
392- let y = $t081668283._1
393- let finished = $t081668283._2
382+ let y = $t076827799._1
383+ let finished = $t076827799._2
394384 if ((finished == false))
395385 then throw(("getY() not finished with " + toString(y)))
396386 else toInt(y)
397387 }
398388
399389
400390 func get_y_D (A_,in,xp,D) = if (assert((in >= 0)))
401391 then throw("i below zero")
402392 else if (assert((nCoins > in)))
403393 then throw("i above N_COINS")
404394 else {
405395 let Ann = (A_ * nCoins)
406396 func S_c (acc,i) = {
407- let $t086628679 = acc
408- let S_ = $t086628679._1
409- let c = $t086628679._2
397+ let $t081788195 = acc
398+ let S_ = $t081788195._1
399+ let c = $t081788195._2
410400 let x_ = if (if ((in != i))
411401 then (nCoins > i)
412402 else false)
413403 then xp[i]
414404 else 0
415405 if (if ((nCoins > i))
416406 then (in != i)
417407 else false)
418408 then $Tuple2((S_ + x_), fraction(c, toBigInt(D), toBigInt((x_ * nCoins))))
419409 else $Tuple2(S_, c)
420410 }
421411
422- let $t088999000 = {
412+ let $t084158516 = {
423413 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
424414 let $s = size($l)
425415 let $acc0 = $Tuple2(0, toBigInt(D))
426416 func $f0_1 ($a,$i) = if (($i >= $s))
427417 then $a
428418 else S_c($a, $l[$i])
429419
430420 func $f0_2 ($a,$i) = if (($i >= $s))
431421 then $a
432422 else throw("List size exceeds 15")
433423
434424 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
435425 }
436- let S_ = $t088999000._1
437- let c_ = $t088999000._2
426+ let S_ = $t084158516._1
427+ let c_ = $t084158516._2
438428 let c = fraction(c_, toBigInt(D), toBigInt((Ann * nCoins)))
439429 let bD = toBigInt(((S_ + (D / Ann)) - D))
440430 func y_D_proc (acc,i) = if ((acc._2 == true))
441431 then acc
442432 else {
443433 let y_prev = acc._1
444434 let y = (((y_prev * y_prev) + c) / ((big2 * y_prev) + bD))
445435 if ((y > y_prev))
446436 then if ((1 >= toInt((y - y_prev))))
447437 then $Tuple2(y, true)
448438 else $Tuple2(y, false)
449439 else if ((1 >= toInt((y_prev - y))))
450440 then $Tuple2(y, true)
451441 else $Tuple2(y, false)
452442 }
453443
454- let $t094839602 = {
444+ let $t089999118 = {
455445 let $l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
456446 let $s = size($l)
457447 let $acc0 = $Tuple2(toBigInt(D), false)
458448 func $f1_1 ($a,$i) = if (($i >= $s))
459449 then $a
460450 else y_D_proc($a, $l[$i])
461451
462452 func $f1_2 ($a,$i) = if (($i >= $s))
463453 then $a
464454 else throw("List size exceeds 16")
465455
466456 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16)
467457 }
468- let y = $t094839602._1
469- let finished = $t094839602._2
458+ let y = $t089999118._1
459+ let finished = $t089999118._2
470460 if ((finished == false))
471461 then throw(("get_y_D() not finished with " + toString(y)))
472462 else toInt(y)
473463 }
474464
475465
476466 func _calcWithdrawOneCoin (xp,_token_amount,i,caller) = {
477467 let feeDiscount = calculateFeeDiscount(caller)
478468 let amp = _A()
479469 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
480470 let total_supply = shareSupply
481471 let D0 = get_D(xp, amp)
482472 let D1 = (D0 - fraction(_token_amount, D0, total_supply))
483473 let new_y = get_y_D(amp, i, xp, D1)
484474 let dy_0 = (xp[i] - new_y)
485475 func xp_reduced_proc (acc,xp_j) = {
486- let $t01024310272 = acc
487- let xp_reduced = $t01024310272._1
488- let index = $t01024310272._2
476+ let $t097599788 = acc
477+ let xp_reduced = $t097599788._1
478+ let index = $t097599788._2
489479 let dx_expected = if ((index == i))
490480 then (fraction(xp_j, D1, D0) - new_y)
491481 else (xp_j - fraction(xp_j, D1, D0))
492482 $Tuple2((xp_reduced :+ (xp_j - fraction(_fee, dx_expected, feeScale6))), (index + 1))
493483 }
494484
495- let $t01053410598 = {
485+ let $t01005010114 = {
496486 let $l = xp
497487 let $s = size($l)
498488 let $acc0 = $Tuple2(nil, 0)
499489 func $f0_1 ($a,$i) = if (($i >= $s))
500490 then $a
501491 else xp_reduced_proc($a, $l[$i])
502492
503493 func $f0_2 ($a,$i) = if (($i >= $s))
504494 then $a
505495 else throw("List size exceeds 15")
506496
507497 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
508498 }
509- let xp_reduced = $t01053410598._1
510- let index = $t01053410598._2
499+ let xp_reduced = $t01005010114._1
500+ let index = $t01005010114._2
511501 let xp_reduced_i = xp_reduced[i]
512502 let dy = ((xp_reduced_i - get_y_D(amp, i, xp_reduced, D1)) - 1)
513503 $Tuple2(dy, (dy_0 - dy))
514504 }
515505
516506
517507 func getStrAssetId (assetId) = match assetId {
518508 case id: ByteVector =>
519509 toBase58String(id)
520510 case waves: Unit =>
521511 "WAVES"
522512 case _ =>
523513 throw("Match error")
524514 }
525515
526516
527517 func calcStakingFuncAndAddres (stake,assetId) = if (stake)
528518 then $Tuple2("lockNeutrino", stakingUSDNAddress)
529519 else $Tuple2("unlockNeutrino", stakingUSDNAddress)
530520
531521
532522 func calcStakingParams (stake,amount,assetId) = if (stake)
533523 then {
534- let $t01116211228 = calcStakingFuncAndAddres(stake, assetId)
535- let call = $t01116211228._1
536- let stakingAddr = $t01116211228._2
524+ let $t01067810744 = calcStakingFuncAndAddres(stake, assetId)
525+ let call = $t01067810744._1
526+ let stakingAddr = $t01067810744._2
537527 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
538528 }
539529 else {
540- let $t01131411380 = calcStakingFuncAndAddres(stake, assetId)
541- let call = $t01131411380._1
542- let stakingAddr = $t01131411380._2
530+ let $t01083010896 = calcStakingFuncAndAddres(stake, assetId)
531+ let call = $t01083010896._1
532+ let stakingAddr = $t01083010896._2
543533 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
544534 }
545535
546536
547537 func stake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
548538 then {
549- let $t01156711669 = calcStakingParams(true, amount, fromBase58String(assetIdString))
550- let call = $t01156711669._1
551- let addr = $t01156711669._2
552- let params = $t01156711669._3
553- let payments = $t01156711669._4
539+ let $t01108311185 = calcStakingParams(true, amount, fromBase58String(assetIdString))
540+ let call = $t01108311185._1
541+ let addr = $t01108311185._2
542+ let params = $t01108311185._3
543+ let payments = $t01108311185._4
554544 invoke(addr, call, params, payments)
555545 }
556546 else 0
557547
558548
559549 func unstake (amount,assetIdString) = if (containsElement(stakingAssets, assetIdString))
560550 then {
561- let $t01185411957 = calcStakingParams(false, amount, fromBase58String(assetIdString))
562- let call = $t01185411957._1
563- let addr = $t01185411957._2
564- let params = $t01185411957._3
565- let payments = $t01185411957._4
551+ let $t01137011473 = calcStakingParams(false, amount, fromBase58String(assetIdString))
552+ let call = $t01137011473._1
553+ let addr = $t01137011473._2
554+ let params = $t01137011473._3
555+ let payments = $t01137011473._4
566556 invoke(addr, call, params, payments)
567557 }
568558 else 0
569559
570560
571561 func stakedAmount (assetId) = {
572562 let stakedAmountCalculated = match assetId {
573563 case aId: ByteVector =>
574564 if ((aId == USDN))
575565 then getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
576566 else 0
577567 case _: Unit =>
578568 0
579569 case _ =>
580570 throw("Match error")
581571 }
582572 match stakedAmountCalculated {
583573 case i: Int =>
584574 i
585575 case _ =>
586576 0
587577 }
588578 }
589579
590580
591581 func checkSuspicious () = {
592582 let contractBalances = _xp()
593583 func checkBalance (acc,assetId) = {
594- let $t01256812593 = acc
595- let suspicious = $t01256812593._1
596- let i = $t01256812593._2
584+ let $t01208412109 = acc
585+ let suspicious = $t01208412109._1
586+ let i = $t01208412109._2
597587 if (suspicious)
598588 then $Tuple2(suspicious, i)
599589 else {
600590 let aBalance = (assetBalance(this, fromBase58String(assetId)) + stakedAmount(fromBase58String(assetId)))
601591 if ((contractBalances[i] > aBalance))
602592 then $Tuple2(true, i)
603593 else $Tuple2(false, (i + 1))
604594 }
605595 }
606596
607597 let $l = assetIds
608598 let $s = size($l)
609599 let $acc0 = $Tuple2(false, 0)
610600 func $f0_1 ($a,$i) = if (($i >= $s))
611601 then $a
612602 else checkBalance($a, $l[$i])
613603
614604 func $f0_2 ($a,$i) = if (($i >= $s))
615605 then $a
616606 else throw("List size exceeds 15")
617607
618608 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
619609 }
620610
621611
622612 func suspendSuspicious (i) = suspend(("Suspicious state with asset: " + assetIds[i]))
623613
624614
625615 func returnPayments (caller,payments) = {
626616 func parsePayments (acc,payment) = (acc :+ ScriptTransfer(caller, payment.amount, payment.assetId))
627617
628618 let $l = payments
629619 let $s = size($l)
630620 let $acc0 = nil
631621 func $f0_1 ($a,$i) = if (($i >= $s))
632622 then $a
633623 else parsePayments($a, $l[$i])
634624
635625 func $f0_2 ($a,$i) = if (($i >= $s))
636626 then $a
637627 else throw("List size exceeds 15")
638628
639629 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
640630 }
641631
642632
643633 func checkDAppThreshold (newBalances) = {
644634 let dAppThresholdCoef = valueOrErrorMessage(getInteger(this, kDAppThresholdCoef), "No dAppThresholdCoef key")
645635 let thresholdScale = 10000
646636 let maxBalance = max(newBalances)
647637 let minBalance = min(newBalances)
648638 let ratio = fraction(maxBalance, thresholdScale, minBalance)
649639 if ((ratio > (dAppThresholdCoef * thresholdScale)))
650640 then throw("New balance in assets of the DApp is less than threshold")
651641 else false
652642 }
653643
654644
655645 func checkCoins (assetIds) = {
656646 let coins = split(assetIds, ",")
657647 func checkCoin (error,assetId) = {
658648 let asset = valueOrErrorMessage(fromBase58String(assetId), ("fromBase58String: " + assetId))
659649 let decimals = valueOrErrorMessage(assetInfo(asset), ("assetInfo: " + assetId)).decimals
660650 if ((decimals != DECIMALS))
661651 then throw("wrong decimals")
662652 else false
663653 }
664654
665655 let $l = coins
666656 let $s = size($l)
667657 let $acc0 = false
668658 func $f0_1 ($a,$i) = if (($i >= $s))
669659 then $a
670660 else checkCoin($a, $l[$i])
671661
672662 func $f0_2 ($a,$i) = if (($i >= $s))
673663 then $a
674664 else throw("List size exceeds 15")
675665
676666 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
677667 }
678668
679669
680670 @Callable(msg)
681671 func D (xp,amp) = {
682672 let D = get_D_internal(xp, amp)
683673 $Tuple2([IntegerEntry("D", D)], D)
684674 }
685675
686676
687677
688678 @Callable(msg)
689-func init (assetIds,_A,_dAppThresholdCoef,firstHarvest) = if (!(isDataStorageUntouched(this)))
679+func init (assetIds,_A,_dAppThresholdCoef) = if (!(isDataStorageUntouched(this)))
690680 then throw("Already initialized")
691681 else if ((0 >= _A))
692682 then throw("Amp must be must > 0")
693683 else if ((0 >= _dAppThresholdCoef))
694684 then throw("dApp Threshold Coef must be > 0")
695685 else {
696686 let shareName = "s_Multi_USD"
697687 let shareDescription = ("ShareToken of SwopFi protocol for MultiStable USD pool at address " + toString(this))
698688 let issueToken = Issue(shareName, shareDescription, 0, 6, true)
699689 let tokenId = calculateAssetId(issueToken)
700690 if (checkCoins(assetIds))
701691 then throw()
702- else {
703- let baseEntry = [StringEntry(kVersion, version), StringEntry(kAssets, assetIds), IntegerEntry("initial_A", _A), IntegerEntry("future_A", _A), IntegerEntry(kFee, getIntegerValue(oracle, "base_fee_flat")), StringEntry(kShareAssetId, toBase58String(tokenId)), IntegerEntry(kShareAssetSupply, 0), IntegerEntry(kDAppThresholdCoef, _dAppThresholdCoef), BooleanEntry(kActive, true), issueToken]
704- if (firstHarvest)
705- then (baseEntry ++ [BooleanEntry(kFirstHarvest, firstHarvest), IntegerEntry(kFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
706- else baseEntry
707- }
692+ else [StringEntry(kVersion, version), StringEntry(kAssets, assetIds), IntegerEntry("initial_A", _A), IntegerEntry("future_A", _A), IntegerEntry(kFee, getIntegerValue(oracle, "base_fee_flat")), StringEntry(kShareAssetId, toBase58String(tokenId)), IntegerEntry(kShareAssetSupply, 0), IntegerEntry(kDAppThresholdCoef, _dAppThresholdCoef), BooleanEntry(kActive, true), issueToken]
708693 }
709694
710695
711696
712697 @Callable(msg)
713698 func addLiquidity (minMintAmount,stakeFarming) = valueOrElse(isActive(), {
714699 let amp = _A()
715700 let xp = _xp()
716701 let D0 = if ((shareSupply == 0))
717702 then 0
718703 else getDMem(xp, amp)
719704 let payments = msg.payments
720705 let paymentsSize = size(payments)
721706 func validPayments (n) = if ((paymentsSize > nCoins))
722707 then throw(("payments size > " + toString(nCoins)))
723708 else if ((1 > paymentsSize))
724709 then throw("payments size < 1")
725710 else if (if ((shareSupply == 0))
726711 then (nCoins != paymentsSize)
727712 else false)
728713 then throw("initial deposit requires all coins")
729714 else {
730715 func paymantValid (acc,payment) = if (containsElement(assetIds, getStrAssetId(payment.assetId)))
731716 then true
732717 else throw("Invalid asset in payment")
733718
734719 let $l = payments
735720 let $s = size($l)
736721 let $acc0 = false
737722 func $f0_1 ($a,$i) = if (($i >= $s))
738723 then $a
739724 else paymantValid($a, $l[$i])
740725
741726 func $f0_2 ($a,$i) = if (($i >= $s))
742727 then $a
743728 else throw("List size exceeds 15")
744729
745730 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
746731 }
747732
748733 if (!(validPayments(paymentsSize)))
749734 then throw()
750735 else {
751736 let suspicious = checkSuspicious()
752737 if (suspicious._1)
753738 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, payments))
754739 else {
755740 func parsePayments (acc,assetId) = {
756- let $t01690116930 = acc
757- let newBalances = $t01690116930._1
758- let i = $t01690116930._2
759- let j = $t01690116930._3
741+ let $t01612516154 = acc
742+ let newBalances = $t01612516154._1
743+ let i = $t01612516154._2
744+ let j = $t01612516154._3
760745 if (if ((paymentsSize > j))
761746 then (getStrAssetId(payments[j].assetId) == assetId)
762747 else false)
763748 then $Tuple3((newBalances :+ (xp[i] + payments[j].amount)), (i + 1), (j + 1))
764749 else $Tuple3((newBalances :+ xp[i]), (i + 1), j)
765750 }
766751
767- let $t01715017236 = {
752+ let $t01637416460 = {
768753 let $l = assetIds
769754 let $s = size($l)
770755 let $acc0 = $Tuple3(nil, 0, 0)
771756 func $f0_1 ($a,$i) = if (($i >= $s))
772757 then $a
773758 else parsePayments($a, $l[$i])
774759
775760 func $f0_2 ($a,$i) = if (($i >= $s))
776761 then $a
777762 else throw("List size exceeds 15")
778763
779764 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
780765 }
781- let newBalances = $t01715017236._1
782- let k = $t01715017236._2
783- let parsedPayments = $t01715017236._3
766+ let newBalances = $t01637416460._1
767+ let k = $t01637416460._2
768+ let parsedPayments = $t01637416460._3
784769 if ((paymentsSize > parsedPayments))
785770 then throw("Incorect payments order")
786771 else if (checkDAppThreshold(newBalances))
787772 then throw()
788773 else {
789774 let D1 = getDMem(newBalances, amp)
790775 if (assert((D1 > D0)))
791776 then throw("D1 > D0")
792777 else {
793778 let feeDiscount = calculateFeeDiscount(msg.caller)
794779 func calcScriptActions (acc,newBalance) = {
795- let $t01763717678 = acc
796- let invBalances = $t01763717678._1
797- let scriptActions = $t01763717678._2
798- let i = $t01763717678._3
780+ let $t01686116902 = acc
781+ let invBalances = $t01686116902._1
782+ let scriptActions = $t01686116902._2
783+ let i = $t01686116902._3
799784 if ((shareSupply > 0))
800785 then {
801786 let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
802787 let fees = {
803788 let idealBalance = fraction(D1, xp[i], D0)
804789 let difference = if ((idealBalance > newBalance))
805790 then (idealBalance - newBalance)
806791 else (newBalance - idealBalance)
807792 fraction(_fee, difference, feeScale6)
808793 }
809794 let governanceFees = fraction(fees, feeGovernance, feeScale6)
810795 let finalBalance = (newBalance - fees)
811796 let invariantBalance = (newBalance - fees)
812797 let pmt = (newBalance - xp[i])
798+ let lpFees = (fees - governanceFees)
813799 let inv = if ((pmt > 0))
814800 then stake((pmt - fees), assetIds[i])
815801 else unstake(fees, assetIds[i])
816802 if ((inv == inv))
817- then $Tuple3((invBalances :+ invariantBalance), (scriptActions ++ [ScriptTransfer(capMoneyBoxAddress, (fees - governanceFees), fromBase58String(assetIds[i])), ScriptTransfer(moneyBoxAddress, governanceFees, fromBase58String(assetIds[i])), IntegerEntry((assetIds[i] + kAssetBalance), finalBalance)]), (i + 1))
803+ then {
804+ let airdrop = if ((lpFees > 0))
805+ then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(fromBase58String(assetIds[i]), lpFees)])
806+ else 0
807+ if ((airdrop == airdrop))
808+ then $Tuple3((invBalances :+ invariantBalance), (scriptActions ++ [ScriptTransfer(moneyBoxAddress, governanceFees, fromBase58String(assetIds[i])), IntegerEntry((assetIds[i] + kAssetBalance), finalBalance)]), (i + 1))
809+ else throw("Strict value is not equal to itself.")
810+ }
818811 else throw("Strict value is not equal to itself.")
819812 }
820813 else {
821814 let inv = stake(newBalance, assetIds[i])
822815 if ((inv == inv))
823816 then $Tuple3((invBalances :+ newBalance), (scriptActions :+ IntegerEntry((assetIds[i] + kAssetBalance), newBalance)), (i + 1))
824817 else throw("Strict value is not equal to itself.")
825818 }
826819 }
827820
828- let $t01922619314 = {
821+ let $t01860718695 = {
829822 let $l = newBalances
830823 let $s = size($l)
831824 let $acc0 = $Tuple3(nil, nil, 0)
832825 func $f1_1 ($a,$i) = if (($i >= $s))
833826 then $a
834827 else calcScriptActions($a, $l[$i])
835828
836829 func $f1_2 ($a,$i) = if (($i >= $s))
837830 then $a
838831 else throw("List size exceeds 15")
839832
840833 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
841834 }
842- let invBalances = $t01922619314._1
843- let scriptActions = $t01922619314._2
835+ let invBalances = $t01860718695._1
836+ let scriptActions = $t01860718695._2
844837 let D2 = getDMem(invBalances, amp)
845838 let mint_amount = if ((shareSupply == 0))
846839 then D1
847840 else fraction(shareSupply, (D2 - D0), D0)
848841 if (assert((mint_amount >= minMintAmount)))
849842 then throw("Slippage screwed you")
850843 else if (stakeFarming)
851844 then {
852845 let re = invoke(this, "reissueShare", [mint_amount], nil)
853846 if ((re == re))
854847 then {
855848 let s = invoke(farmingAddress, "lockShareTokens", [toString(this)], [AttachedPayment(shareAssetId, mint_amount)])
856849 if ((s == s))
857850 then (scriptActions :+ IntegerEntry(kShareAssetSupply, (shareSupply + mint_amount)))
858851 else throw("Strict value is not equal to itself.")
859852 }
860853 else throw("Strict value is not equal to itself.")
861854 }
862855 else (scriptActions ++ [Reissue(shareAssetId, mint_amount, true), ScriptTransfer(msg.caller, mint_amount, shareAssetId), IntegerEntry(kShareAssetSupply, (shareSupply + mint_amount))])
863856 }
864857 }
865858 }
866859 }
867860 })
861+
862+
863+
864+@Callable(msg)
865+func calcMintAmount (newBalances,user) = {
866+ let amp = _A()
867+ let xp = _xp()
868+ let D1 = getDMem(newBalances, amp)
869+ if ((shareSupply == 0))
870+ then $Tuple2(nil, D1)
871+ else {
872+ let D0 = getDMem(xp, amp)
873+ let feeDiscount = calculateFeeDiscount(user)
874+ func calcInvBalances (acc,newBalance) = {
875+ let $t01988419910 = acc
876+ let invBalances = $t01988419910._1
877+ let i = $t01988419910._2
878+ let _fee = ((fraction(fee, feeDiscount, feeScale6, CEILING) * nCoins) / (4 * (nCoins - 1)))
879+ let fees = {
880+ let idealBalance = fraction(D1, xp[i], D0)
881+ let difference = if ((idealBalance > newBalance))
882+ then (idealBalance - newBalance)
883+ else (newBalance - idealBalance)
884+ fraction(_fee, difference, feeScale6)
885+ }
886+ let invariantBalance = (newBalance - fees)
887+ $Tuple2((invBalances :+ invariantBalance), (i + 1))
888+ }
889+
890+ let $t02051220582 = {
891+ let $l = newBalances
892+ let $s = size($l)
893+ let $acc0 = $Tuple2(nil, 0)
894+ func $f0_1 ($a,$i) = if (($i >= $s))
895+ then $a
896+ else calcInvBalances($a, $l[$i])
897+
898+ func $f0_2 ($a,$i) = if (($i >= $s))
899+ then $a
900+ else throw("List size exceeds 15")
901+
902+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
903+ }
904+ let invBalances = $t02051220582._1
905+ let k = $t02051220582._2
906+ let D2 = getDMem(invBalances, amp)
907+ let mintAmount = fraction(shareSupply, (D2 - D0), D0)
908+ $Tuple2(nil, mintAmount)
909+ }
910+ }
868911
869912
870913
871914 @Callable(msg)
872915 func reissueShare (amount) = valueOrElse(isSelfCall(msg), [Reissue(shareAssetId, amount, true)])
873916
874917
875918
876919 @Callable(msg)
877920 func getDy (assetFrom,assetTo,dx,userAddress) = {
878921 let xp = _xp()
879922 let fromIndex = valueOrErrorMessage(indexOf(assetIds, assetFrom), "unknown token in")
880923 let toIndex = valueOrErrorMessage(indexOf(assetIds, assetTo), "unknown token out")
881924 let x = (xp[fromIndex] + dx)
882925 let y = getY(fromIndex, toIndex, x, xp)
883926 let dy = ((xp[toIndex] - y) - 1)
884927 let feeDiscount = calculateFeeDiscount(Address(fromBase58String(userAddress)))
885928 let _fee = fraction(fraction(fee, feeDiscount, feeScale6, CEILING), dy, feeScale6)
886929 $Tuple2(nil, $Tuple2((dy - _fee), _fee))
887930 }
888931
889932
890933
891934 @Callable(msg)
892935 func exchange (tokenOut,min_dy) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
893936 then throw("size(payments) != 1")
894937 else {
895938 let suspicious = checkSuspicious()
896939 if (suspicious._1)
897940 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, msg.payments))
898941 else {
899942 let payment = msg.payments[0]
900943 let tokenIn = getStrAssetId(payment.assetId)
901944 let tokenOutB58 = fromBase58String(tokenOut)
902945 let dx = payment.amount
903946 let fromIndex = valueOrErrorMessage(indexOf(assetIds, tokenIn), "unknown token in")
904947 let toIndex = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
905948 let xp = _xp()
906949 let x = (xp[fromIndex] + dx)
907950 let y = getY(fromIndex, toIndex, x, xp)
908951 let _dy = ((xp[toIndex] - y) - 1)
909- let feeDiscount = calculateFeeDiscount(msg.caller)
952+ let feeDiscount = calculateFeeDiscount(msg.originCaller)
910953 let _fee = fraction(_dy, fraction(fee, feeDiscount, feeScale6, CEILING), feeScale6)
911954 let dy = (_dy - _fee)
912955 let governanceFees = fraction(_fee, feeGovernance, feeScale6)
913956 if (assert((dy >= min_dy)))
914957 then throw("Exchange resulted in fewer coins than expected")
915958 else {
916959 func makeNewBalances (acc,tokenBalance) = {
917- let $t02202622052 = acc
918- let newBalances = $t02202622052._1
919- let i = $t02202622052._2
960+ let $t02262322649 = acc
961+ let newBalances = $t02262322649._1
962+ let i = $t02262322649._2
920963 if ((i == fromIndex))
921964 then $Tuple2((newBalances :+ (tokenBalance + dx)), (i + 1))
922965 else if ((i == toIndex))
923966 then $Tuple2((newBalances :+ (tokenBalance - _dy)), (i + 1))
924967 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
925968 }
926969
927- let $t02230322364 = {
970+ let $t02290022961 = {
928971 let $l = xp
929972 let $s = size($l)
930973 let $acc0 = $Tuple2(nil, 0)
931974 func $f0_1 ($a,$i) = if (($i >= $s))
932975 then $a
933976 else makeNewBalances($a, $l[$i])
934977
935978 func $f0_2 ($a,$i) = if (($i >= $s))
936979 then $a
937980 else throw("List size exceeds 15")
938981
939982 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
940983 }
941- let newBalances = $t02230322364._1
942- let i = $t02230322364._2
984+ let newBalances = $t02290022961._1
985+ let i = $t02290022961._2
943986 if (checkDAppThreshold(newBalances))
944987 then throw()
945988 else {
946989 let s = stake(payment.amount, getStrAssetId(payment.assetId))
947990 if ((s == s))
948991 then {
949992 let us = unstake(_dy, tokenOut)
950993 if ((us == us))
951- then $Tuple2([IntegerEntry((tokenIn + kAssetBalance), x), IntegerEntry((tokenOut + kAssetBalance), (xp[toIndex] - _dy)), ScriptTransfer(msg.caller, dy, tokenOutB58), ScriptTransfer(moneyBoxAddress, governanceFees, tokenOutB58), ScriptTransfer(capMoneyBoxAddress, (_fee - governanceFees), tokenOutB58)], [dy, tokenOutB58])
994+ then {
995+ let lpFees = (_fee - governanceFees)
996+ let airdrop = if ((lpFees > 0))
997+ then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(tokenOutB58, lpFees)])
998+ else 0
999+ if ((airdrop == airdrop))
1000+ then $Tuple2([IntegerEntry((tokenIn + kAssetBalance), x), IntegerEntry((tokenOut + kAssetBalance), (xp[toIndex] - _dy)), ScriptTransfer(msg.caller, dy, tokenOutB58), ScriptTransfer(moneyBoxAddress, governanceFees, tokenOutB58)], [dy, tokenOutB58])
1001+ else throw("Strict value is not equal to itself.")
1002+ }
9521003 else throw("Strict value is not equal to itself.")
9531004 }
9541005 else throw("Strict value is not equal to itself.")
9551006 }
9561007 }
9571008 }
9581009 })
9591010
9601011
9611012
9621013 @Callable(msg)
9631014 func withdraw (minAmounts) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
9641015 then throw("size(payments) != 1")
9651016 else {
9661017 let pmtAmount = msg.payments[0].amount
9671018 let pmtAssetId = msg.payments[0].assetId
9681019 if ((shareAssetId != pmtAssetId))
9691020 then throw("unknown payment token")
9701021 else {
9711022 let suspicious = checkSuspicious()
9721023 if (suspicious._1)
9731024 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.originCaller, msg.payments))
9741025 else {
9751026 func calcScriptActions (acc,balance) = {
976- let $t02350523533 = acc
977- let scriptActions = $t02350523533._1
978- let i = $t02350523533._2
1027+ let $t02425224280 = acc
1028+ let scriptActions = $t02425224280._1
1029+ let i = $t02425224280._2
9791030 let wAmount = fraction(balance, pmtAmount, shareSupply)
9801031 if (assert((wAmount >= minAmounts[i])))
9811032 then throw("Withdrawal resulted in fewer coins than expected")
9821033 else {
9831034 let us = unstake(wAmount, assetIds[i])
9841035 if ((us == us))
9851036 then $Tuple2((scriptActions ++ [IntegerEntry((assetIds[i] + kAssetBalance), (balance - wAmount)), ScriptTransfer(msg.originCaller, wAmount, fromBase58String(assetIds[i]))]), (i + 1))
9861037 else throw("Strict value is not equal to itself.")
9871038 }
9881039 }
9891040
990- let $t02402324091 = {
1041+ let $t02477024838 = {
9911042 let $l = _xp()
9921043 let $s = size($l)
9931044 let $acc0 = $Tuple2(nil, 0)
9941045 func $f0_1 ($a,$i) = if (($i >= $s))
9951046 then $a
9961047 else calcScriptActions($a, $l[$i])
9971048
9981049 func $f0_2 ($a,$i) = if (($i >= $s))
9991050 then $a
10001051 else throw("List size exceeds 15")
10011052
10021053 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
10031054 }
1004- let scriptActions = $t02402324091._1
1005- let i = $t02402324091._2
1055+ let scriptActions = $t02477024838._1
1056+ let i = $t02477024838._2
10061057 (scriptActions ++ [Burn(shareAssetId, pmtAmount), IntegerEntry(kShareAssetSupply, (shareSupply - pmtAmount))])
10071058 }
10081059 }
10091060 })
10101061
10111062
10121063
10131064 @Callable(msg)
10141065 func withdrawWithUnlock (minAmounts,unlockAmount) = valueOrElse(isActive(), if ((0 >= unlockAmount))
10151066 then throw("Unlock amount must be positive")
10161067 else {
10171068 let suspicious = checkSuspicious()
10181069 if (suspicious._1)
10191070 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, msg.payments))
10201071 else {
10211072 let pmtAmount = if ((size(msg.payments) > 0))
10221073 then if ((size(msg.payments) != 1))
10231074 then throw("size(payments) != 1")
10241075 else {
10251076 let pmtAssetId = msg.payments[0].assetId
10261077 if ((shareAssetId != pmtAssetId))
10271078 then throw("unknown payment token")
10281079 else msg.payments[0].amount
10291080 }
10301081 else 0
10311082 let unlock = invoke(farmingAddress, "withdrawShareTokens", [toString(this), unlockAmount], nil)
10321083 if ((unlock == unlock))
10331084 then {
10341085 let withdrawAmount = (pmtAmount + unlockAmount)
10351086 let inv = invoke(this, "withdraw", [minAmounts], [AttachedPayment(shareAssetId, withdrawAmount)])
10361087 if ((inv == inv))
10371088 then nil
10381089 else throw("Strict value is not equal to itself.")
10391090 }
10401091 else throw("Strict value is not equal to itself.")
10411092 }
10421093 })
10431094
10441095
10451096
10461097 @Callable(msg)
10471098 func calcWithdrawOneCoin (tokenAmount,tokenOut,user) = {
10481099 let i = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
10491100 $Tuple2(nil, _calcWithdrawOneCoin(_xp(), tokenAmount, i, Address(fromBase58String(user)))._1)
10501101 }
10511102
10521103
10531104
10541105 @Callable(msg)
10551106 func withdrawOneCoin (tokenOut,minAmount) = valueOrElse(isActive(), if ((size(msg.payments) != 1))
10561107 then throw("size(payments) != 1")
10571108 else {
10581109 let suspicious = checkSuspicious()
10591110 if (suspicious._1)
10601111 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.originCaller, msg.payments))
10611112 else {
10621113 let pmtAmount = msg.payments[0].amount
10631114 let pmtAssetId = msg.payments[0].assetId
10641115 if ((pmtAssetId != shareAssetId))
10651116 then throw("unknown token")
10661117 else {
10671118 let outIndex = valueOrErrorMessage(indexOf(assetIds, tokenOut), "unknown token out")
1119+ let tokenOutB58 = fromBase58String(tokenOut)
10681120 let xp = _xp()
1069- let $t02600526087 = _calcWithdrawOneCoin(xp, pmtAmount, outIndex, msg.originCaller)
1070- let dy = $t02600526087._1
1071- let dy_fee = $t02600526087._2
1121+ let $t02680226884 = _calcWithdrawOneCoin(xp, pmtAmount, outIndex, msg.originCaller)
1122+ let dy = $t02680226884._1
1123+ let dy_fee = $t02680226884._2
10721124 if (assert((dy >= minAmount)))
10731125 then throw("Not enough coins removed")
10741126 else {
10751127 let governanceFees = fraction(dy_fee, feeGovernance, feeScale6)
10761128 let dy_and_fee = (dy + dy_fee)
10771129 func makeNewBalances (acc,tokenBalance) = {
1078- let $t02634526371 = acc
1079- let newBalances = $t02634526371._1
1080- let i = $t02634526371._2
1130+ let $t02714227168 = acc
1131+ let newBalances = $t02714227168._1
1132+ let i = $t02714227168._2
10811133 if ((i == outIndex))
10821134 then $Tuple2((newBalances :+ (tokenBalance - dy_and_fee)), (i + 1))
10831135 else $Tuple2((newBalances :+ tokenBalance), (i + 1))
10841136 }
10851137
1086- let $t02653826599 = {
1138+ let $t02733527396 = {
10871139 let $l = xp
10881140 let $s = size($l)
10891141 let $acc0 = $Tuple2(nil, 0)
10901142 func $f0_1 ($a,$i) = if (($i >= $s))
10911143 then $a
10921144 else makeNewBalances($a, $l[$i])
10931145
10941146 func $f0_2 ($a,$i) = if (($i >= $s))
10951147 then $a
10961148 else throw("List size exceeds 15")
10971149
10981150 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
10991151 }
1100- let newBalances = $t02653826599._1
1101- let v = $t02653826599._2
1152+ let newBalances = $t02733527396._1
1153+ let v = $t02733527396._2
11021154 if (checkDAppThreshold(newBalances))
11031155 then throw()
11041156 else {
11051157 let us = unstake(dy_and_fee, tokenOut)
11061158 if ((us == us))
1107- then [ScriptTransfer(msg.originCaller, dy, fromBase58String(tokenOut)), IntegerEntry((assetIds[outIndex] + kAssetBalance), (xp[outIndex] - dy_and_fee)), Burn(shareAssetId, pmtAmount), ScriptTransfer(moneyBoxAddress, governanceFees, fromBase58String(tokenOut)), ScriptTransfer(capMoneyBoxAddress, (dy_fee - governanceFees), fromBase58String(tokenOut)), IntegerEntry(kShareAssetSupply, (shareSupply - pmtAmount))]
1159+ then {
1160+ let lpFees = (dy_fee - governanceFees)
1161+ let airdrop = if ((lpFees > 0))
1162+ then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(tokenOutB58, lpFees)])
1163+ else 0
1164+ if ((airdrop == airdrop))
1165+ then [ScriptTransfer(msg.originCaller, dy, tokenOutB58), IntegerEntry((assetIds[outIndex] + kAssetBalance), (xp[outIndex] - dy_and_fee)), Burn(shareAssetId, pmtAmount), ScriptTransfer(moneyBoxAddress, governanceFees, tokenOutB58), IntegerEntry(kShareAssetSupply, (shareSupply - pmtAmount))]
1166+ else throw("Strict value is not equal to itself.")
1167+ }
11081168 else throw("Strict value is not equal to itself.")
11091169 }
11101170 }
11111171 }
11121172 }
11131173 })
11141174
11151175
11161176
11171177 @Callable(msg)
11181178 func withdrawOneCoinWithUnlock (tokenOut,minAmount,unlockAmount) = valueOrElse(isActive(), if ((0 >= unlockAmount))
11191179 then throw("Unlock amount must be positive")
11201180 else {
11211181 let suspicious = checkSuspicious()
11221182 if (suspicious._1)
11231183 then (suspendSuspicious(suspicious._2) ++ returnPayments(msg.caller, msg.payments))
11241184 else {
11251185 let pmtAmount = if ((size(msg.payments) > 0))
11261186 then if ((size(msg.payments) != 1))
11271187 then throw("size(payments) != 1")
11281188 else {
11291189 let pmtAssetId = msg.payments[0].assetId
11301190 if ((shareAssetId != pmtAssetId))
11311191 then throw("unknown payment token")
11321192 else msg.payments[0].amount
11331193 }
11341194 else 0
11351195 let unlock = invoke(farmingAddress, "withdrawShareTokens", [toString(this), unlockAmount], nil)
11361196 if ((unlock == unlock))
11371197 then {
11381198 let withdrawAmount = (pmtAmount + unlockAmount)
11391199 let inv = invoke(this, "withdrawOneCoin", [tokenOut, minAmount], [AttachedPayment(shareAssetId, withdrawAmount)])
11401200 if ((inv == inv))
11411201 then nil
11421202 else throw("Strict value is not equal to itself.")
11431203 }
11441204 else throw("Strict value is not equal to itself.")
11451205 }
11461206 })
11471207
11481208
11491209
11501210 @Callable(msg)
11511211 func A () = $Tuple2(nil, _A())
11521212
11531213
11541214
11551215 @Callable(msg)
11561216 func getVirtualPrice () = {
11571217 let D = get_D(_xp(), _A())
11581218 $Tuple2(nil, fraction(D, PRECISION, shareSupply))
11591219 }
11601220
11611221
11621222
11631223 @Callable(msg)
11641224 func calcTokenAmount (amounts,deposit) = {
11651225 let amp = _A()
11661226 let balances = _xp()
11671227 let D0 = getDMem(balances, amp)
11681228 func calcNewBalances (acc,balance) = {
1169- let $t02852328549 = acc
1170- let newBalances = $t02852328549._1
1171- let i = $t02852328549._2
1229+ let $t02941329439 = acc
1230+ let newBalances = $t02941329439._1
1231+ let i = $t02941329439._2
11721232 let newBalance = (balance + (if (deposit)
11731233 then amounts[i]
11741234 else -(amounts[i])))
11751235 $Tuple2((newBalances :+ newBalance), (i + 1))
11761236 }
11771237
11781238 let newBalances = ( let $l = balances
11791239 let $s = size($l)
11801240 let $acc0 = $Tuple2(nil, 0)
11811241 func $f0_1 ($a,$i) = if (($i >= $s))
11821242 then $a
11831243 else calcNewBalances($a, $l[$i])
11841244
11851245 func $f0_2 ($a,$i) = if (($i >= $s))
11861246 then $a
11871247 else throw("List size exceeds 15")
11881248
11891249 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15))._1
11901250 let D1 = getDMem(newBalances, amp)
11911251 let diff = if (deposit)
11921252 then (D1 - D0)
11931253 else (D0 - D1)
11941254 $Tuple2(nil, fraction(diff, shareSupply, D0))
11951255 }
11961256
11971257
11981258
11991259 @Callable(msg)
12001260 func rampA (_futureA,_futureTime) = valueOrElse(isActive(), valueOrElse(isAdminCall(msg), if (assert((blockTimestamp >= (initial_A_time + MIN_RAMP_TIME))))
12011261 then throw("too often")
12021262 else if (assert((_futureTime >= (blockTimestamp + MIN_RAMP_TIME))))
12031263 then throw("insufficient time")
12041264 else {
12051265 let _initial_A = _A()
12061266 if (assert(if ((_futureA > 0))
12071267 then (MAX_A > _futureA)
12081268 else false))
12091269 then throw("out of base range")
12101270 else if (assert(if (if ((_futureA >= _initial_A))
12111271 then ((_initial_A * MAX_A_CHANGE) >= _futureA)
12121272 else false)
12131273 then true
12141274 else if ((_initial_A > _futureA))
12151275 then ((_futureA * MAX_A_CHANGE) >= _initial_A)
12161276 else false))
12171277 then throw("out of range")
12181278 else [IntegerEntry("initial_A", _initial_A), IntegerEntry("future_A", _futureA), IntegerEntry("initial_A_time", blockTimestamp), IntegerEntry("future_A_time", _futureTime)]
12191279 }))
12201280
12211281
12221282
12231283 @Callable(msg)
12241284 func stopRampA () = valueOrElse(isActive(), valueOrElse(isAdminCall(msg), {
12251285 let currentA = _A()
12261286 [IntegerEntry("initial_A", currentA), IntegerEntry("future_A", currentA), IntegerEntry("initial_A_time", blockTimestamp), IntegerEntry("future_A_time", blockTimestamp)]
12271287 }))
12281288
12291289
12301290
12311291 @Callable(msg)
12321292 func shutdown () = valueOrElse(isAdminCall(msg), if (!(active))
12331293 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
12341294 else suspend("Paused by admin"))
12351295
12361296
12371297
12381298 @Callable(msg)
12391299 func activate () = valueOrElse(isAdminCall(msg), if (active)
12401300 then throwIsActive()
12411301 else [BooleanEntry(kActive, true), DeleteEntry(kCause)])
12421302
12431303
12441304
12451305 @Callable(msg)
1246-func keepLimitForFirstHarvest (shareLimit) = valueOrElse(isActive(), valueOrElse(isAdminCall(msg), [IntegerEntry(kShareLimit, shareLimit)]))
1306+func takeIntoAccountExtraFunds () = valueOrElse(isActive(), if ((msg.caller != moneyBoxAddress))
1307+ then throw("Only the wallet can call this function")
1308+ else {
1309+ let balances = _xp()
1310+ func takeExtraFunds (acc,assetId) = {
1311+ let $t03178131799 = acc
1312+ let sum = $t03178131799._1
1313+ let i = $t03178131799._2
1314+ let tokenB58 = fromBase58String(assetId)
1315+ let rBalance = (assetBalance(this, tokenB58) + stakedAmount(tokenB58))
1316+ let enrollAmount = (rBalance - balances[i])
1317+ if ((0 > enrollAmount))
1318+ then suspend(("Enroll amount negative for asset" + assetId))
1319+ else {
1320+ let airdrop = if ((enrollAmount > 0))
1321+ then invoke(lpFarmingAddress, "airDrop", nil, [AttachedPayment(tokenB58, enrollAmount)])
1322+ else 0
1323+ if ((airdrop == airdrop))
1324+ then $Tuple2((sum + enrollAmount), (i + 1))
1325+ else throw("Strict value is not equal to itself.")
1326+ }
1327+ }
1328+
1329+ let k = {
1330+ let $l = assetIds
1331+ let $s = size($l)
1332+ let $acc0 = $Tuple2(0, 0)
1333+ func $f0_1 ($a,$i) = if (($i >= $s))
1334+ then $a
1335+ else takeExtraFunds($a, $l[$i])
1336+
1337+ func $f0_2 ($a,$i) = if (($i >= $s))
1338+ then $a
1339+ else throw("List size exceeds 15")
1340+
1341+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
1342+ }
1343+ if ((k._1 == 0))
1344+ then throw("No money to take")
1345+ else nil
1346+ })
12471347
12481348
12491349 @Verifier(tx)
12501350 func verify () = {
12511351 let multiSignedByAdmins = {
12521352 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
12531353 then 1
12541354 else 0
12551355 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
12561356 then 1
12571357 else 0
12581358 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
12591359 then 1
12601360 else 0
12611361 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
12621362 }
12631363 match tx {
12641364 case inv: InvokeScriptTransaction =>
12651365 let callTakeIntoAccount = if ((inv.dApp == this))
12661366 then (inv.function == "takeIntoAccountExtraFunds")
12671367 else false
12681368 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
12691369 then true
12701370 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
12711371 then true
12721372 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
12731373 then true
12741374 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyInvoke)
12751375 if (if (callTakeIntoAccount)
12761376 then signedByAdmin
12771377 else false)
12781378 then true
12791379 else multiSignedByAdmins
12801380 case _ =>
12811381 multiSignedByAdmins
12821382 }
12831383 }
12841384

github/deemru/w8io/873ac7e 
197.67 ms